Перейти к основному содержимому

Fine-tuning

Платформа Compressa позволяется дообучить LLM модель быстро и эффективно с помощью LoRA/QLoRA адаптеров или с помощью PFT. Дообучение позволяет улучшить качество ответов на конкретной бизнес-задаче, сфокусировать на определенной теме или задать формат/стиль ответов.

Важно! Дообучение модели доступно только в on-premise версии платформы, запущенной на ваших серверах.

Прежде чем переходить к дообучению, рекомендуется провести эксперименты с выбором оптимальной модели и промптингом.

Дообучение основано на фреймворке Axolotl, для мониторинга используется AIM.

Ограничения:

  • FlashAttention недоступен в движке тонкой настройки
  • Датасеты должны быть в формате jsonl
  • 3 типа задач FT:
    • LORA / QLORA
    • PEFT
    • DPO с LORA / QLORA
  • 3 типа датасетов:
    • alpaca — {"instruction": "", "input": "", "output": ""}
    • chat_template — {"messages": [{"role": "user", "content": "content"}, {"role": "assistant", "content": "content"}]}
    • dpo_chat_template — {"instruction": "instruction", "input": "", "output": "chosen", "messages": [{"role": "user", "content": "content"}, {"role": "assistant", "content": "content"}], "closen": {"role": "assistant", "content": "content"}, "rejected": {"role": "assistant", "content": "content"}}
  • Только inference-движок vLLM для адаптеров

Подготовка

Установите DISABLE_AUTODEPLOY=TRUE в docker-compose.yaml или прервите развернутую модель после старта пода с помощью curl -X POST http://localhost:5100/v1/deploy/interrupt

Выполните

cd deploy/pod
set -a
source .env
set +a
docker compose up compressa-pod compressa-client-finetune aim-ui, aim-server -d

Чат-UI будет доступен в браузере по адресу http://localhost:8501/chat

UI для файн тюнинга будет доступен по адресу http://localhost:8501/finetune

aim-UI доступен по адресу http://localhost:43800/aim-ui

Подготовьте датасеты для дообучения.

Вы можете использовать свои собственные датасеты, загрузив их с помощью POST-запроса на http://localhost:5100/v1/datasets/upload/, пример есть в packages/pod/scripts/exampes_finetune. Или вы можете загрузить датасеты с HuggingFace с помощью POST-запроса на http://localhost:5100/v1/datasets/add/?name=%HF_REPO_ID%

После загрузки или добавления ваши датасеты будут находиться в папке хоста DATASET_PATH и могут быть просмотрены с помощью GET-запроса на http://localhost:5100/v1/datasets

Fine Tuning

Кастомный конфиг

Вы можете использовать свой собственный .yaml файл конфига (рекомендуется, особенно для обучения PFT с разморозкой параметров, так как имена слоёв отличаются у разных моделей). Примеры доступны в Axolotl examples

  • Выберите датасет из http://localhost:5100/v1/datasets
  • Выберите модель из http://localhost:5100/v1/finetune/models
  • Важно: доступны будут только модели с task=llm!
  • Отредактируйте base_model и dataset.path в вашем конфиге
  • Запустите процесс обучения:
import requests
url = "http://localhost:5100/v1/finetune/custom"
headers = {
"Authorization": "Bearer test",
}
response = requests.post(url, headers=headers, files={"config_file": open("cfg.yaml", "rb")})
print(response.json())

Вы можете проверить статус или прервать процесс через эндпоинты status и interrupt

Визуализация процесса доступна в Aim-UI http://localhost:43800/aim-ui

Адаптеры или веса дообученной модели будут доступны в отдельной папке (не затрагивает базовую модель): base_model_path_finetuned_YYYYMMDD_job_id[:8]"

Стандартный конфиг

  • Можно использовать один из включённых шаблонов конфигов
  • Выберите датасет из http://localhost:5100/v1/datasets
  • Выберите модель из http://localhost:5100/v1/finetune/models
  • Важно: доступны будут только модели с task=llm! Запустите процесс файнтюнинга:
import requests
url_finetune = "http://localhost:5100/v1/finetune/"
headers_finetune = {
"Authorization": "Bearer test",
"Content-Type": "application/json"
}

data = {
"name": "test_ft",
"model_id": "Qwen/Qwen2.5-0.5B-Instruct",
"dataset_name": "glayout_chatml.jsonl",
"training_task": "qlora",
"num_train_epochs": 10,
"learning_rate": 5e-5,
"batch_size": 2,
"lora_r": 8,
"lora_alpha": 16,
"lora_dropout": 0.05,
"quantization": "int4",
"launcher": "accelerate",
}
response = requests.post(url_finetune, headers=headers_finetune, json=data)
if response.status_code == 200:
print(f"Finetune started successfully: {response.json()}")
else:
print(f"Failed to start finetune: {response.status_code} {response.text}")

Вы можете проверить статус или прервать процесс через эндпоинты status и interrupt

Визуализация процесса доступна в Aim-UI http://localhost:43800/aim-ui

Адаптеры или веса дообученной модели будут доступны в отдельной папке (не затрагивает базовую модель): base_model_path_finetuned_YYYYMMDD_job_id[:8]"

Настоятельно рекомендуется перезапустить Pod после файнтюнинга перед merge весов или запуском нового эксперимента, чтобы избежать коллизий состояния Pod.

Запуск дообученной модели

Запуск базовой модели с адаптерами

Отредактируйте deploy_config.json:

{
"model_id": "Qwen/Qwen2.5-0.5B-Instruct",
"served_model_name": "Compressa-LLM",
"dtype": "auto",
"backend": "llm",
"task": "llm",
"adapter_ids": ["Qwen/Qwen2.5-0.5B-Instruct_finetuned_261fbfb6-22fe-4897-9f68-a28c723b072e"]
}

Запустите Pod

Merge базовой модели и адаптера

  • Перезапустите pod.
  • Выберите имя дообученной модели и номер чекпойнта (если None — будет использован последний чекпойнт).
  • При необходимости посмотрите файл compressa-config.json в папке модели.
import requests
url = "http://localhost:5100/v1/finetune/merge"
headers = {
"Authorization": "Bearer test",
"Content-Type": "application/json"
}
response = requests.post(url, headers=headers,
json={
"model_id": "Qwen/Qwen2.5-0.5B-Instruct",
"lora_model_dir": "Qwen_Qwen2.5-0.5B-Instruct_finetuned_20251020_26e93c7c",
"checkpoint": None,
})
print(response.json())

Нет эндпоинтов для проверки статуса и прерывания merge job, вы можете проверить статус по job_id:

curl http://localhost:5100/v1/jobs/{job_id}/status/

Слитыe веса будут доступны в отдельной папке (не затрагивает базовую модель): base_model_path_merged_finetuned_YYYYMMDD_job_id[:8]_checkpoint" Проверьте model_id модели с помощью GET-запроса на http://localhost:5100/v1/models и отредактируйте deploy_config.json, чтобы запустить pod с моделью после merge.

{
"model_id": "Qwen/Qwen2.5-0.5B-Instruct_merged_415a70b8",
"served_model_name": "Compressa-LLM",
"dtype": "auto",
"backend": "llm",
"task": "llm"
}

Загрузка датасетов, файнтюнинг, мониторинг и merge доступны также через UI по адресу http://localhost:8501/finetune

Parameters

Running

AIM

Описание REST API

Управление датасетами

GET /v1/datasets/

Получить список доступных датасетов.

Пример запроса:

curl -X 'GET' \
'http://localhost:5100/v1/datasets/' \
-H 'accept: application/json'

Пример ответа:

[
{
"id": "01be6d68-f790-434b-aa6d-5bd492aef202",
"name": "train.jsonl",
"path": "01be6d68-f790-434b-aa6d-5bd492aef202/metadata.json",
"description": null
},
{
"id": "077adb68-2b0e-481b-bd13-e8807adf625f",
"name": "train.jsonl",
"path": "077adb68-2b0e-481b-bd13-e8807adf625f/metadata.json",
"description": "My dataset 2"
}
]

POST /v1/datasets/upload/

Загрузить новый датасет (только ‘jsonl’ формат).

Параметры:

  • query: description - dataset description

Тело запроса:

  • multipart/form-data: file

Пример запроса:

curl -X 'POST' \
'http://localhost:5100/v1/datasets/upload/?description=My%20Description' \
-H 'accept: application/json' \
-H 'Content-Type: multipart/form-data' \
-F 'file=@train.jsonl'

Пример ответа:

{
"id": "string",
"name": "string",
"path": "string",
"description": "string"
}

POST /v1/datasets/add/

Скачать новый датасет с HuggingFace.

Пример запроса:

curl -X 'POST' \
'http://localhost:5100/v1/datasets/add/?name=REPO_ID' \
-H 'accept: application/json' \

Пример ответа:

{
"id": "string",
"name": "string",
"path": "string",
"description": "string"
}

GET /v1/datasets/{dataset_id}/

Загрузить конкретный датасет по id dataset_id

Параметры:

  • path: dataset_id

Пример запроса:

curl -X 'GET' \
'http://localhost:5100/v1/datasets/01be6d68-f790-434b-aa6d-5bd492aef202/' \
-H 'accept: application/json'

Пример ответа:

  • file

Дообучение модели

GET /v1/finetune/models/

Получить список моделей, доступных для дообучения

Пример запроса:

curl -X 'GET' \
'http://localhost:5100/v1/finetune/models/' \
-H 'accept: application/json'

Пример ответа:

[
{
"model_id": "TheBloke/mixtral-8x7b-v0.1-AWQ",
"adapter": false,
"base_model_id": null
},
{
"model_id": "NeuralNovel/Mistral-7B-Instruct-v0.2-Neural-Story",
"adapter": false,
"base_model_id": null
}
]

POST /v1/finetune/

Запустить дообучение модели на датасете

Примеры см. выше.

GET /v1/finetune/status

Получить статус текущего процесса дообучения

Пример запроса:

curl -X 'GET' \
'http://localhost:5100/v1/finetune/status/' \
-H 'accept: application/json'

Пример ответа:

{
"id": "46c155b4-17fe-4226-9412-a77edfadc7e7",
"name": "My Adapter Training",
"model_id": "NousResearch/Llama-2-7b-chat-hf",
"dataset_id": "01be6d68-f790-434b-aa6d-5bd492aef202",
"job": {
"id": "74280be7-4723-475d-89ae-346e9017990e",
"name": "FT_NousResearch/Llama-2-7b-chat-hf_01be6d68-f790-434b-aa6d-5bd492aef202",
"status": "RUNNING",
"started_at": "2024-03-21T10:40:40.928442"
}
}

POST /v1/finetune/interrupt/

Прервать процесс дообучения

Пример запрос:

curl -X 'POST' \
'http://localhost:5100/v1/finetune/interrupt/' \
-H 'accept: application/json' \
-d ''

Пример ответа:

{
"id": "74280be7-4723-475d-89ae-346e9017990e",
"name": "FT_NousResearch/Llama-2-7b-chat-hf_01be6d68-f790-434b-aa6d-5bd492aef202",
"status": "RUNNING",
"started_at": "2024-03-21T10:40:40.928442"
}

POST /v1/finetune/merge

Выполнить Merge базовой модели и LORA адаптера.

Пример см. выше.