Создать дообучение модели классификатора в Foundation Models
Дообучение моделей по методу LoRA находится на стадии Preview и предоставляется по запросу. Вы можете заполнить заявку в консоли управления
Если стандартных моделей классификаторов вам недостаточно, вы можете дообучить модель классификатора на базе YandexGPT Lite, чтобы она точнее классифицировала ваши запросы.
Перед началом работы
Чтобы воспользоваться примерами:
-
Получите и сохраните 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="<тип_классификации>", path="<путь_к_файлу>", upload_format="jsonlines", name="multiclass", ) # Дождемся окончания загрузки данных и создания датасета 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.
-
<тип_классификации>
— тип классификации, для которой с помощью создаваемого датасета будет дообучаться модель. Возможные значения:TextClassificationMultilabel
— бинарная классификация или классификация с несколькими метками.TextClassificationMulticlass
— многоклассовая классификация.
-
<путь_к_файлу>
— путь к файлу, содержащему заранее подготовленные примеры для дообучения модели.
-
-
Выполните созданный файл:
python3 dataset-create.py
Результат:
new dataset=AsyncDataset(id='fds7a7ieb0dh********', folder_id='b1gt6g8ht345********', name='YandexGPT tuning', description=None, metadata=None, created_by='ajegtlf2q28a********', created_at=datetime.datetime(2025, 1, 20, 16, 19, 33), updated_at=datetime.datetime(2025, 1, 20, 16, 20, 19), labels=None, status=<DatasetStatus.READY: 3>, task_type='<тип_классификации>', rows=0, size_bytes=5679)
Сохраните идентификатор созданного датасета (значение поля
id
) — он понадобится при дообучении модели.
-
Создайте датасет:
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": "<тип_классификации>", "upload_format": "jsonlines" } EOM
Где:
-
<IAM-токен>
— IAM-токен сервисного аккаунта, полученный перед началом работы. -
<идентификатор_каталога>
— идентификатор каталога, в котором создается датасет. -
<тип_классификации>
— тип классификации, для которой с помощью создаваемого датасета будет дообучаться модель. Возможные значения:TextClassificationMultilabel
— бинарная классификация или классификация с несколькими метками.TextClassificationMulticlass
— многоклассовая классификация.
Результат:
{ "datasetId": "fds8hd01tset********", "dataset": { "datasetId": "fds8hd01tset********", "folderId": "b1gt6g8ht345********", "name": "My awesome dataset", "status": "DRAFT", "taskType": "<указанный_в_запросе_тип_задачи>", "createdAt": "2025-01-20T14:51:34Z", "updatedAt": "2025-01-20T14:51:34Z", "createdById": "ajeg2b2et02f********", "createdBy": "ajeg2b2et02f********" } }
Сохраните идентификатор созданного датасета (значение поля
datasetId
) он понадобится при загрузке данных в датасет. -
-
Получите ссылку, по которой вы сможете загрузить данные в датасет:
grpcurl \ -H "Authorization: Bearer <IAM-токен>" \ -d '{"dataset_id": "<идентификатор_датасета>", "size_bytes": <размер_датасета>}' \ llm.api.cloud.yandex.net:443 yandex.cloud.ai.dataset.v1.DatasetService/GetUploadDraftUrl | jq
Где:
<IAM-токен>
— IAM-токен сервисного аккаунта, полученный перед началом работы.<идентификатор_датасета>
— идентификатор датасета, сохраненный на предыдущем шаге.<размер_датасета>
— размер в байтах файла с данными для дообучения. В терминале получить размер файла можно с помощью командыls -l <путь_к_файлу>
.
Результат:
{ "datasetId": "fdso08c1u1cq********", "uploadUrl": "https://storage.yandexcloud.net/ai-fomo-drafts-prod/b1gt6g8ht345********/fdso08c1u1cq********?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20250120T105352Z&X-Amz-SignedHeaders=content-length%3Bhost&X-Amz-Expires=86400&X-Amz-Credential=YCAJE_WuJJ9D1r6huCoc8I3yO%2F20250120%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=611d7951994ae939acf4d32cc0c154c738d02adb2a04707a704f34ca********" }
Поле
uploadUrl
ответа содержит ссылку, по которой вы сможете загрузить ваши данные в датасет.Совет
Если вы не использовали утилиту 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
Где:
<IAM-токен>
— IAM-токен сервисного аккаунта, полученный перед началом работы.<идентификатор_датасета>
— идентификатор датасета, сохраненный ранее.
Результат:
{ "id": "fdso01v2jdd4********", "createdAt": "2025-01-20T11:03:48Z", "modifiedAt": "2025-01-20T11:03:48Z" }
Сохраните идентификатор операции валидации (поле
id
) — он понадобится на следующем шаге. -
Валидация датасета может занять некоторое время. Чтобы узнать статус операции и, при наличии, получить отчет о возникших ошибках, отправьте запрос:
grpcurl \ -H "Authorization: Bearer <IAM-токен>" \ -d '{"operation_id": "<идентификатор_операции_валидации>"}' \ llm.api.cloud.yandex.net:443 yandex.cloud.operation.OperationService/Get
Где:
<IAM-токен>
— IAM-токен сервисного аккаунта, полученный перед началом работы.<идентификатор_операции_валидации>
— идентификатор операции валидации, сохраненный на предыдущем шаге.
Результат:
{ "id": "fdso01v2jdd4********", "createdAt": "2025-01-20T11:03:48Z", "modifiedAt": "2025-01-20T11:04:46Z", "done": true, "response": { "@type": "type.googleapis.com/yandex.cloud.ai.dataset.v1.ValidateDatasetResponse", "datasetId": "fdso08c1u1cq********", "isValid": true } }
Значение поля
isValid
—true
. Значит, валидация загруженного датасета прошла успешно.
Запустите дообучение
-
Создайте файл
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="multiclass"): print(f"List of existing datasets {dataset=}") # Зададим датасет для обучения и базовую модель train_dataset = sdk.datasets.get("<идентификатор_датасета>") base_model = sdk.models.text_classifiers("yandexgpt-lite") # Определяем минимальные параметры # Используйте base_model.tune_deferred(), чтобы контролировать больше параметров tuned_model = base_model.tune( train_dataset, name=str(uuid.uuid4()), classification_type="<тип_классификации>" ) print(f"Resulting {tuned_model}") # Запускаем дообучение classification_result = tuned_model.run("hey!") print(f"{classification_result=}") # Сохраним URI дообученной модели tuned_uri = tuned_model.uri model = sdk.models.text_classifiers(tuned_uri) classification_result = model.run("hey!") print(f"{classification_result=}") if __name__ == "__main__": main()
Где:
-
<идентификатор_каталога>
— идентификатор каталога, в котором создан сервисный аккаунт. -
<API-ключ>
— API-ключ сервисного аккаунта, полученный ранее и необходимый для аутентификации в API.В примерах используется аутентификация с помощью API-ключа. Yandex Cloud ML SDK также поддерживает аутентификацию с помощью IAM-токена и OAuth-токена. Подробнее см. в разделе Аутентификация в Yandex Cloud ML SDK.
-
<идентификатор_датасета>
— сохраненный на предыдущем шаге идентификатор созданного датасета. -
<тип_классификации>
— тип классификации, для которой будет дообучаться модель. Возможные значения:binary
— бинарная классификация.multilabel
— классификация с несколькими метками.multiclass
— многоклассовая классификация.
-
-
Выполните созданный файл:
python3 start-tuning.py
Результат:
Resulting TextClassifiersModel(uri=cls://b1gt6g8ht345********/yandexgpt-lite/latest@tamrjs1t1368c********, config=TextClassifiersModelConfig(task_description=None, labels=None, samples=None)) classification_result=TextClassifiersModelResult(predictions=(TextClassificationLabel(label='гнев', confidence=0.5534219145774841), TextClassificationLabel(label='грусть', confidence=0.00046947275404818356), TextClassificationLabel(label='радость', confidence=0.12941128015518188), TextClassificationLabel(label='страх', confidence=0.3008902668952942), TextClassificationLabel(label='удивление', confidence=0.015807058662176132)), model_version='') classification_result=TextClassifiersModelResult(predictions=(TextClassificationLabel(label='гнев', confidence=0.5534219145774841), TextClassificationLabel(label='грусть', confidence=0.00046947275404818356), TextClassificationLabel(label='радость', confidence=0.12941128015518188), TextClassificationLabel(label='страх', confidence=0.3008902668952942), TextClassificationLabel(label='удивление', confidence=0.015807058662176132)), model_version='')
Дообучение модели может занять до 1 суток в зависимости от объема датасета и степени загрузки системы.
Используйте полученный URI дообученной модели (значение поля uri
) при обращении к ней.
-
Запустите дообучение:
grpcurl \ -H "Authorization: Bearer <IAM-токен>" \ -d @ \ llm.api.cloud.yandex.net:443 yandex.cloud.ai.tuning.v1.TuningService/Tune <<EOM { "base_model_uri": "cls://<идентификатор_каталога>/yandexgpt-lite/latest", "train_datasets": [{"dataset_id": "<идентификатор_датасета>", "weight": 1.0}], "name": "my first model", "<тип_классификации>": {} } EOM
Где:
-
<IAM-токен>
— IAM-токен сервисного аккаунта, полученный перед началом работы. -
<идентификатор_каталога>
— идентификатор каталога, в котором дообучается модель. -
<идентификатор_датасета>
— идентификатор датасета, сохраненный ранее. -
<тип_классификации>
— тип классификации, для которой будет дообучаться модель. Возможные значения:text_classification_multilabel
— бинарная классификация или классификация с несколькими метками.text_classification_multiclass
— многоклассовая классификация.
Результат:
{ "id": "ftnlljf53kil********", "createdAt": "2025-01-20T11:17:33Z", "modifiedAt": "2025-01-20T11:17:33Z", "metadata": { "@type": "type.googleapis.com/yandex.cloud.ai.tuning.v1.TuningMetadata" } }
В ответе сервис вернет объект Operation. Сохраните идентификатор (
id
) операции, полученный в ответе. -
-
Дообучение модели может занять до 1 суток в зависимости от объема датасета и степени загрузки системы. Чтобы проверить готовность дообучения, запросите статус операции:
grpcurl \ -H "Authorization: Bearer <IAM-токен>" \ -d '{"operation_id": "<идентификатор_операции>"}' \ llm.api.cloud.yandex.net:443 yandex.cloud.operation.OperationService/Get
Где:
<IAM-токен>
— IAM-токен сервисного аккаунта, полученный перед началом работы.<идентификатор_операции>
— идентификатор операции дообучения модели, полученный на предыдущем шаге.
Если дообучение завершилось, объект Operation будет содержать URI дообученной модели в поле
targetModelUri
:{ "id": "ftnc7at9r66t********", "createdAt": "2025-01-20T15:41:06Z", "modifiedAt": "2025-01-20T15:46:10Z", "done": true, "metadata": { "@type": "type.googleapis.com/yandex.cloud.ai.tuning.v1.TuningMetadata", "status": "COMPLETED", "tuningTaskId": "ftnc7at9r66t********" }, "response": { "@type": "type.googleapis.com/yandex.cloud.ai.tuning.v1.TuningResponse", "status": "COMPLETED", "targetModelUri": "cls://b1gt6g8ht345********/yandexgpt-lite/latest@tamr8gqhetveg********", "tuningTaskId": "ftnc7at9r66t********" } }
Используйте полученный URI дообученной модели (значение поля targetModelUri
) при обращении к ней.
См. также
Больше примеров доступно в репозитории на GitHub