Тонкая настройка LLM с использованием Workbench
Содержание
ВведениеОбласть примененияПодготовкаШаги тонкой настройки LLMСоздание экземпляра Notebook/VSCodeПодготовка моделиПодготовка места вывода моделиПодготовка набора данныхФормат набора данных HuggingfaceФормат LLaMA-FactoryПодготовка runtime-образаСоздание задачи VolcanoJob для тонкой настройкиПримечание по использованию PVC на основе NFSУправление задачейОтслеживание экспериментовЗапуск сервиса вывода с использованием тонко настроенной моделиЗапуск на GPU не-NvidiaПодготовкаПроверка оригинального решения поставщика (опционально)Конвертация решения поставщика для запуска как Kubernetes Job/Deployment (опционально)Модификация решения поставщика для запуска как volcano jobОтслеживание экспериментовИтогВведение
Тонкая настройка и обучение моделей часто требуют адаптации к различным структурам моделей, аппаратным устройствам и соответствующим методам параллельного обучения. Alauda AI Workbench предоставляет комплексный подход — от разработки модели до подачи, управления задачами обучения и отслеживания экспериментов, помогая инженерам по моделям и алгоритмам быстро адаптироваться и завершить весь процесс тонкой настройки и обучения модели.
В данном решении приведён пример тонкой настройки модели Qwen3-0.6B с использованием LLaMA-Factory.
Alauda AI Workbench создаёт контейнерную среду Notebook/VSCode (CodeServer) для разработки и отладки в пространстве имён пользователя. В пространстве имён можно создавать несколько экземпляров Notebook/VSCode для сохранения окружений разных пользователей и задач разработки. Ноутбуки могут запрашивать только CPU-ресурсы для разработки и подачи задач в кластер, используя GPU-ресурсы кластера для выполнения задач. Также можно запрашивать GPU-ресурсы для Notebook, что позволяет выполнять задачи, такие как обучение и тонкая настройка, непосредственно в Notebook, независимо от того, требует ли модель распределённого обучения.
Кроме того, вы можете использовать встроенный в платформу MLFlow для записи различных метрик каждой сессии тонкой настройки модели, что облегчает сравнение нескольких экспериментов и выбор итоговой модели.
Для подачи задач в кластер из Notebook мы используем VolcanoJob — Kubernetes-native менеджер ресурсов. Планировщик Volcano поддерживает очереди, приоритеты и различные политики планирования, что способствует более эффективному планированию задач в кластере и повышению использования ресурсов.
В этом решении используется LLaMA-Factory для запуска задач тонкой настройки и обучения. Однако для более масштабных сценариев тонкой настройки и обучения моделей, требующих параллельных методов, таких как Tensor Parallelism, Context Parallelism и Expert Parallelism для обучения больших моделей, может потребоваться использовать другие инструменты, создавать собственные runtime-образы для тонкой настройки и модифицировать скрипт запуска задачи для адаптации к различным инструментам и моделям. Для более подробного использования и настройки параметров LLaMA-Factory смотрите: https://llamafactory.readthedocs.io/en/latest/index.html
Область применения
- Решение применимо для Alauda AI версии 1.3 и выше.
- Тонкая настройка и обучение моделей LLM. Для обучения других типов моделей (например, YOLOv5) потребуется использовать другие образы, скрипты запуска, наборы данных и т.д.
- Решение применимо для сценариев с CPU x86/64 и GPU NVIDIA.
- Для сценариев с NPU требуется построить подходящий runtime-образ на основе данного решения для совместимости.
Подготовка
- Сначала необходимо развернуть плагин "Alauda AI Workbench" для включения поддержки Workbench (или развернуть плагин Kubeflow Base для использования Notebook с Kubeflow).
- Установить плагин
MLFlowдля отслеживания экспериментов.
Шаги тонкой настройки LLM
Создание экземпляра Notebook/VSCode
Перейдите в Alauda AI - Workbench (или Advanced - Kubeflow - Notebook), затем создайте новый Notebook или используйте существующий. Рекомендуется, чтобы Notebook использовал только CPU-ресурсы. При подаче задачи в кластер из Notebook будут запрошены GPU-ресурсы кластера для повышения эффективности использования ресурсов.
Подробные шаги создания экземпляра Notebook/VSCode смотрите в разделе Creating a Workbench.
Подготовка модели
Скачайте модель Qwen/Qwen3-0.6B с Huggingface или других сайтов с открытыми моделями. Затем загрузите модель в репозиторий моделей.
Подробные шаги загрузки файлов модели в репозиторий смотрите в Upload Models Using Notebook.
Подготовка места вывода модели
Создайте пустую модель в репозитории моделей для хранения выходной модели. При настройке места вывода тонкой настройки укажите URL Git-репозитория модели.
Подготовка набора данных
Скачайте и загрузите пример набора данных identity в репозиторий наборов данных. Этот набор используется для тонкой настройки LLM, чтобы отвечать на вопросы пользователя, например, "Кто ты?"
- Сначала создайте пустой репозиторий набора данных в разделе "Datasets" - "Dataset Repository".
- Загрузите zip-файл в Notebook, распакуйте его, затем перейдите в каталог набора данных. Используйте git lfs для отправки набора данных в Git URL репозитория набора данных. Шаги аналогичны загрузке модели.
- После завершения отправки обновите страницу набора данных — в вкладке "File Management" вы увидите успешно загруженный файл.
Примечание: Формат набора данных должен корректно распознаваться фреймворком тонкой настройки для использования в последующих задачах. Ниже приведены два распространённых формата наборов данных для тонкой настройки LLM:
Формат набора данных Huggingface
Вы можете использовать следующий код для проверки, корректно ли загружается формат каталога набора данных с помощью datasets:
Формат LLaMA-Factory
Если вы используете инструмент LLaMA-Factory из примеров для обучения, формат набора данных должен соответствовать формату LLaMA-Factory. Справка: data_preparation
Подготовка runtime-образа
Используйте следующий Containerfile для сборки runtime-образа для обучения или используйте предсобранный образ: alaudadockerhub/fine_tune_with_llamafactory:v0.1.1. Если вы хотите использовать другой фреймворк обучения, например YOLOv5, возможно, потребуется кастомизировать образ и установить необходимые зависимости.
После сборки образа загрузите его в реестр образов кластера платформы Alauda AI и настройте в последующих задачах.
Примечание: В образе должна быть доступна команда
git lfsдля скачивания и загрузки файлов модели и набора данных.
Containerfile
Создание задачи VolcanoJob для тонкой настройки
В Notebook создайте YAML-файл для подачи задачи. Пример приведён ниже:
VolcanoJob YAML файл
В приведённом YAML-файле перед подачей задачи измените следующие настройки.
- Образ: содержит зависимости, необходимые для выполнения задачи.
- Переменные окружения: адреса исходной модели, набора данных и выходной модели для задачи:
BASE_MODEL_URL: измените на Git URL подготовленной модели.DATASET_URL: измените на Git URL подготовленного набора данныхidentity-alauda.OUTPUT_MODEL_URL: создайте пустую модель в репозитории моделей для хранения выходной модели и укажите Git URL этой модели.
- Требуемые ресурсы для задачи, включая:
- PVC кэша модели (опционально): PVC для хранения базовой модели (при запуске задач предварительного обучения можно пропустить скачивание базовой модели) и набора данных. Необходимо вручную создать и указать PVC в YAML-файле выше. Используйте этот "model cache PVC" для ускорения нескольких экспериментов тонкой настройки на разных моделях.
- PVC рабочего пространства (обязательно): PVC и рабочий каталог, где выполняется задача. Здесь будут храниться контрольные точки и выходные файлы модели. В приведённом примере используется временный PVC, который удаляется после завершения задачи, так как выходная модель уже загружена в репозиторий моделей.
- Разделяемая память: для многогруппового/распределённого обучения рекомендуется выделять не менее 4 Gi разделяемой памяти.
- CPU, память и GPU ресурсы, необходимые для задачи (на основе плагина GPU-устройств, развернутого в кластере).
- Скрипт выполнения задачи:
- Пример скрипта включает кэширование модели из репозитория в PVC, кэширование обучающего набора данных в PVC и отправку модели в новый репозиторий после тонкой настройки. Вы можете кастомизировать скрипт под свои задачи.
- Пример использует
LLaMA-Factoryдля запуска задачи тонкой настройки, который подходит для большинства сценариев обучения LLM. - Гиперпараметры: в примере гиперпараметры определены непосредственно в скрипте запуска. Можно также использовать переменные окружения для чтения гиперпараметров, которые могут часто изменяться, что облегчает многократный запуск и настройку.
Примечание по использованию PVC на основе NFS
При использовании NFS в качестве PVC рабочего пространства или кэша модели необходимо выполнить следующие действия, чтобы обеспечить корректные права файловой системы на смонтированном NFS томе:
-
На всех узлах K8s, которые могут использовать NFS PVC, должен быть установлен пакет
nfs-utils, например,yum install -y nfs-utils. -
При создании класса хранилища NFS добавьте параметр
mountPermissions: "0757", например:
После выполнения вышеуказанных настроек откройте терминал в Notebook и выполните: kubectl create -f vcjob_sft.yaml для подачи VolcanoJob в кластер.
Управление задачей
В терминале Notebook:
- Выполните
kubectl get vcjobдля просмотра списка задач, затемkubectl get vcjob <имя задачи>для просмотра статуса задачиVolcanoJob. - Выполните
kubectl get podдля просмотра статуса pod, иkubectl logs <имя pod>для просмотра логов задачи. Для распределённых задач может быть несколько pod. - Если pod не создаётся, выполните
kubectl describe vcjob <имя задачи>илиkubectl get podgroupsдля просмотра podgroup Volcano. Также можно проверить логи планировщикаVolcano, чтобы определить, связана ли проблема с нехваткой ресурсов, невозможностью монтирования PVC или другими вопросами планирования. - После успешного выполнения задачи тонко настроенная модель автоматически отправляется в репозиторий моделей. Обратите внимание, что задача автоматически создаёт ветку репозитория для отправки на основе времени. При использовании выходной модели обязательно выбирайте правильную версию.
Для удаления задачи выполните kubectl delete vcjob <имя задачи>.
Отслеживание экспериментов
В приведённом примере задачи тонкой настройки мы используем LLaMA-Factory для запуска задачи и устанавливаем report_to: mlflow в конфигурации задачи. Это автоматически выводит метрики обучения на сервер mlflow. После запуска задачи вы можете найти записи отслеживания экспериментов в разделе Alauda AI - Advanced - MLFlow и сравнить несколько запусков. Например, можно сравнить потери (loss) нескольких экспериментов.
Запуск сервиса вывода с использованием тонко настроенной модели
После завершения задачи тонкой настройки модель автоматически отправляется в репозиторий моделей. Вы можете использовать тонко настроенную модель для запуска сервиса вывода и доступа к нему.
Примечание: В приведённом примере используется метод тонкой настройки LoRA. Перед загрузкой модели адаптер LoRA был объединён с исходной моделью. Это позволяет напрямую публиковать выходную модель в сервис вывода. Запуск сервиса вывода с использованием базовой модели и адаптеров НЕ поддерживается в текущей версии.
Шаги:
- Перейдите в Alauda AI - Model Repository, найдите тонко настроенную выходную модель, перейдите в Model Info - File Management - Edit Metadata, выберите "Task Type": "Text Classification" и "Framework": "Transformers".
- Нажмите кнопку Publish Inference API, затем выберите Custom Publishing.
- На странице публикации сервиса вывода выберите runtime вывода vLLM (выберите vLLM с версией CUDA, поддерживаемой GPU-узлами кластера), заполните настройки хранилища, ресурсов, GPU и нажмите Publish.
- Дождитесь полного запуска сервиса вывода, затем нажмите кнопку Experience в правом верхнем углу для начала общения с моделью. (Примечание: модели с конфигурацией
chat_templateимеют только возможности чата.)
Запуск на GPU не-Nvidia
При использовании среды с GPU не-Nvidia (например, NPU, Intel Gaudi, AMD и др.) вы можете следовать общим шагам ниже для тонкой настройки моделей, запуска задач обучения и их управления в AML Notebook.
Примечание: Следующие шаги также применимы для предобучения LLM и традиционных ML-сценариев. Это общие шаги по адаптации решения поставщика для запуска на Alauda AI с использованием Notebook и VolcanoJob.
Подготовка
- Предварительно: драйвер GPU поставщика и плагин устройства Kubernetes должны быть развернуты в кластере. Устройства должны быть доступны внутри pod, созданного Kubernetes.
Примечание: необходимо знать имя ресурса GPU поставщика и общее количество устройств в кластере для удобства подачи задач.
Например, для Huawei NPU можно запросить карту NPU с помощью:
huawei.com/Ascend910:1. - Получите документацию и материалы решения поставщика для тонкой настройки на GPU данного поставщика. Обычно это включает:
- Документацию и шаги решения. Это может быть выполнено на Kubernetes или в контейнере с помощью
nerdctl run. - Образ для запуска тонкой настройки. Например, поставщик предоставляет решение тонкой настройки с использованием
LLaMA-Factoryи соответствующий образLLaMA-Factory(который может быть включён в образ). - Модель для тонкой настройки. Обычно устройства поставщика поддерживают ряд моделей. Используйте поддерживаемые модели или модели из решения поставщика.
- Данные для обучения. Используйте пример данных из документации решения поставщика или создайте собственный набор данных в том же формате.
- Команда запуска задачи и параметры. Например, решение тонкой настройки на базе
LLaMA-Factoryиспользует командуllamafactory-cliдля запуска задачи и настройки параметров, включая гиперпараметры задачи, в YAML-файле.
Проверка оригинального решения поставщика (опционально)
Для гарантии корректного выполнения решения поставщика и уменьшения последующих проблем с отладкой можно сначала полностью запустить решение согласно документации поставщика и убедиться, что оно работает корректно.
Этот шаг можно пропустить. Однако при возникновении проблем с выполнением задачи позже можно вернуться к этому шагу для проверки исходного решения.
Конвертация решения поставщика для запуска как Kubernetes Job/Deployment (опционально)
Если решение поставщика уже работает как Kubernetes job/deployment/pod, этот шаг можно пропустить.
Если решение поставщика использует метод запуска контейнера, например nerdctl run, можно сначала использовать простой Kubernetes job для проверки корректности работы решения в Kubernetes-среде с развернутым плагином устройства поставщика.
Примечание: Этот шаг позволяет исключить проблемы с невозможностью планирования GPU-устройств поставщика в volcano job, поэтому его можно проверить отдельно.
Пример:
Модификация решения поставщика для запуска как volcano job
Смотрите пример определения YAML ниже.
VolcanoJob YAML файл
Отслеживание экспериментов
Некоторые фреймворки тонкой настройки/обучения автоматически записывают прогресс эксперимента в различные сервисы отслеживания экспериментов. Например, фреймворки LLaMA-Factory и Transformers могут настраиваться на запись прогресса в сервисы, такие как mlflow и wandb. В зависимости от вашей инфраструктуры можно настроить следующие переменные окружения:
MLFLOW_TRACKING_URI: URL сервера отслеживания mlflow.MLFLOW_EXPERIMENT_NAME: имя эксперимента, обычно используется имя пространства имён. Это позволяет группировать задачи.
Фреймворк также указывает место записи. Например, LLaMA-Factory требует указания report_to: mlflow в YAML-файле конфигурации параметров задачи.
После запуска задачи обучения вы можете найти соответствующую задачу в интерфейсе Alauda AI - "Advanced" - MLFlow и просмотреть графики каждой записанной метрики в разделе "Metrics" или параметры конфигурации каждого запуска. Также можно сравнивать несколько экспериментов.
Итог
Используя среду разработки Alauda AI Notebook, вы можете быстро подавать задачи тонкой настройки и обучения в кластер с помощью YAML и командной строки, а также управлять статусом выполнения этих задач. Такой подход позволяет быстро разрабатывать и настраивать шаги тонкой настройки и обучения моделей, обеспечивая выполнение операций, таких как LLM SFT, согласование предпочтений, традиционное обучение моделей и сравнение нескольких экспериментов.