Создать дообучение в Foundation Models
Дообучение моделей по методу LoRA находится на стадии Preview и предоставляется по запросу. Вы можете заполнить заявку в консоли управления
Этот пример показывает, как дообучить модель YandexGPT Lite по методу LoRA в Foundation Models.
Перед началом работы
Чтобы воспользоваться примерами:
-
Получите и сохраните API-ключ сервисного аккаунта.
В примерах используется аутентификация с помощью API-ключа. Yandex Cloud ML SDK также поддерживает аутентификацию с помощью IAM-токена и OAuth-токена. Подробнее см. в разделе Аутентификация в Yandex Cloud ML SDK.
-
С помощью менеджера пакетов pip
установите бета-версию библиотеки ML SDK:
pip install yandex-cloud-ml-sdk --upgrade --pre
-
Получите данные для аутентификации в API, как описано в разделе Аутентификация в API Yandex Foundation Models.
-
Установите gRPCurl
. -
Чтобы воспользоваться примерами, установите cURL
. -
(Опционально) Установите утилиту jq
для потоковой обработки JSON-файлов. -
Получите IAM-токен для аутентификации в API.
Примечание
У IAM-токена короткое время жизни — не более 12 часов.
Загрузите датасет
Подготовьте данные для дообучения модели в формате JSON Lines
В этом примере дообучение запускается с использованием только обучающего датасета.
Создайте датасет для дообучения:
-
Создайте файл
dataset-create.py
и добавьте в него код:#!/usr/bin/env python3 from __future__ import annotations import asyncio import pathlib from yandex_cloud_ml_sdk import AsyncYCloudML from yandex_cloud_ml_sdk.auth import YandexCloudCLIAuth def local_path(path: str) -> pathlib.Path: return pathlib.Path(__file__).parent / path async def main(): sdk = AsyncYCloudML( folder_id="<идентификатор_каталога>", auth="<API-ключ>", ) # Создаем датасет для дообучения базовой модели YandexGPT Lite dataset_draft = sdk.datasets.from_path_deferred( task_type="TextToTextGeneration", path="<путь_к_файлу>", upload_format="jsonlines", name="YandexGPT tuning", ) # Дождемся окончания загрузки данных и создания датасета operation = await dataset_draft.upload() dataset = await operation print(f"new {dataset=}") if __name__ == "__main__": asyncio.run(main())
Где:
-
<идентификатор_каталога>
— идентификатор каталога, в котором создан сервисный аккаунт. -
<API-ключ>
— API-ключ сервисного аккаунта, полученный ранее и необходимый для аутентификации в API.В примерах используется аутентификация с помощью API-ключа. Yandex Cloud ML SDK также поддерживает аутентификацию с помощью IAM-токена и OAuth-токена. Подробнее см. в разделе Аутентификация в Yandex Cloud ML SDK.
-
<путь_к_файлу>
— путь к файлу, содержащему заранее подготовленные примеры для дообучения модели.
-
-
Выполните созданный файл:
python3 dataset-create.py
-
Создайте объект датасет:
grpcurl \ -H "Authorization: Bearer $<IAM-токен>" \ -d @ \ llm.api.cloud.yandex.net:443 yandex.cloud.ai.dataset.v1.DatasetService/Create <<EOM { "folder_id": "<идентификатор_каталога>", "name": "My awesome dataset", "task_type": "TextToTextGeneration", "upload_format": "jsonlines" } EOM
-
Получите ссылку, по которой вы сможете загрузить данные в датасет. В поле
size_bytes
укажите размер файла с данными для дообучения в байтах. Размер датасета в примере 10 КБ:grpcurl \ -H "Authorization: Bearer $<IAM-токен>" \ -d '{"dataset_id": "<идентификатор_датасета>", "size_bytes": 10240}' \ llm.api.cloud.yandex.net:443 yandex.cloud.ai.dataset.v1.DatasetService/GetUploadDraftUrl | jq
В ответ вернется ссылка на созданный шаблон датасета.
Совет
Если вы не использовали утилиту jq, в полученной ссылке замените все последовательности символов
\u0026
на&
, чтобы использовать ее для загрузки датасета. -
Загрузите данные:
curl --request PUT --upload-file <путь_к_файлу> "<ссылка>"
-
После окончания загрузки данных запустите валидацию датасета:
grpcurl \ -H "Authorization: Bearer $<IAM-токен>" \ -d '{"dataset_id": "<идентификатор_датасета>"}' \ llm.api.cloud.yandex.net:443 yandex.cloud.ai.dataset.v1.DatasetService/Validate
В ответ вернется объект, содержащий идентификатор операции валидации.
-
Валидация датасета может занять некоторое время. Чтобы узнать статус операции и, при наличии, получить отчет о возникших ошибках, отправьте запрос, содержащий идентификатор из предыдущего шага:
grpcurl \ -H "Authorization: Bearer $<IAM-токен>" \ -d '{"operation_id": "ftnq****************"}' \ llm.api.cloud.yandex.net:443 yandex.cloud.operation.OperationService/Get
Запустите дообучение
-
Создайте файл
start-tuning.py
и добавьте в него код:#!/usr/bin/env python3 from __future__ import annotations import pathlib import uuid from yandex_cloud_ml_sdk import YCloudML def local_path(path: str) -> pathlib.Path: return pathlib.Path(__file__).parent / path def main(): sdk = YCloudML( folder_id="<идентификатор_каталога>", auth="<API-ключ>", ) # Посмотрим список датасетов, прошедших валидацию for dataset in sdk.datasets.list(status="READY", name_pattern="completions"): print(f"List of existing datasets {dataset=}") # Зададим датасет для обучения и базовую модель train_dataset = sdk.datasets.get("<идентификатор_датасета>") base_model = sdk.models.completions("yandexgpt-lite") # Определяем минимальные параметры # Используйте base_model.tune_deferred(), чтобы контролировать больше параметров tuned_model = base_model.tune(train_dataset, name=str(uuid.uuid4())) print(f"Resulting {tuned_model}") # Запускаем дообучение completion_result = tuned_model.run("hey!") print(f"{completion_result=}") # Сохраним URI дообученной модели tuned_uri = tuned_model.uri model = sdk.models.completions(tuned_uri) completion_result = model.run("hey!") print(f"{completion_result=}") if __name__ == "__main__": main()
-
Выполните созданный файл:
python3 start-tuning.py
-
Запустите дообучение:
grpcurl \ -H "Authorization: Bearer $<IAM-токен>" \ -d @ \ llm.api.cloud.yandex.net:443 yandex.cloud.ai.tuning.v1.TuningService/Tune <<EOM { "base_model_uri": "gpt://<идентификатор_каталога>/yandexgpt-lite/latest", "train_datasets": [{"dataset_id": "<идентификатор_датасета>", "weight": 1.0}], "name": "my first model", "text_to_text_completion": {} } EOM
В ответе сервис вернет объект Operation:
{"id":"f**********","description":"","createdAt":null,"createdBy":"","modifiedAt":null,"done":false,"metadata":null}
Сохраните идентификатор (
id
) операции, полученный в ответе. -
Дообучение модели может занять до 1 суток в зависимости от объема датасета и загрузки системы. Чтобы проверить готовность дообучения, запросите статус операции:
grpcurl \ -H "Authorization: Bearer $<IAM-токен>" \ -d '{"operation_id": "ftnq****************"}' \ llm.api.cloud.yandex.net:443 yandex.cloud.operation.OperationService/Get
Если дообучение завершилось, объект Operation будет содержать идентификатор дообученной модели в поле `targetModelUri:
{ "id": "ftnq****************", "createdAt": "2024-12-04T10:56:08Z", "modifiedAt": "2024-12-04T11:14:25Z", "done": true, "metadata": { "@type": "type.googleapis.com/yandex.cloud.ai.tuning.v1.TuningMetadata", "status": "COMPLETED", "tuningTaskId": "ftn7****************" }, "response": { "@type": "type.googleapis.com/yandex.cloud.ai.tuning.v1.TuningResponse", "status": "COMPLETED", "targetModelUri": "<modelUri_дообученной_модели>", "tuningTaskId": "ftn7****************" } }
Используйте идентификатор дообученной модели в качестве modelURI
, чтобы отправлять запросы в дообученную модель.
См. также
Больше примеров доступно в репозитории на GitHub