Дообучить модель классификации текста
Дообучение моделей по методу 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
-
Получите данные для аутентификации в API, как описано в разделе Аутентификация в API Yandex Foundation Models.
-
Установите gRPCurl
. -
Чтобы воспользоваться примерами, установите cURL
. -
(Опционально) Установите утилиту jq
для потоковой обработки JSON-файлов. -
Получите IAM-токен для аутентификации в API.
Примечание
У IAM-токена короткое время жизни — не более 12 часов.
Загрузите датасет
В зависимости от типа классификации, для которого будет использоваться дообученная модель, подготовьте данные для дообучения модели в формате JSON Lines
В этом примере дообучение запускается с использованием только обучающего датасета.
Создайте датасет для дообучения:
-
В консоли управления
выберите каталог, на который у вашего аккаунта есть ролиai.playground.user
иai.datasets.editor
или выше. -
В списке сервисов выберите Foundation Models.
-
На панели слева нажмите
Датасеты. -
Нажмите Создать датасет.
-
Введите имя и описания датасета. Требования к имени:
- длина — от 2 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
-
В поле Тип выберите тип классификации: Классификация c несколькими метками или Многоклассовая классификация.
-
Добавьте или удалите метки датасета. Они позволяют разделить и сгруппировать ресурсы на логические группы.
-
Нажмите Выбрать файл или перетащите созданный ранее JSON-файл в зону загрузки.
-
Нажмите Создать датасет.
-
Создайте файл
dataset-create.py
и добавьте в него код:#!/usr/bin/env python3 from __future__ import annotations import pathlib from yandex_cloud_ml_sdk import YCloudML from yandex_cloud_ml_sdk.auth import YandexCloudCLIAuth def main() -> None: sdk = YCloudML( folder_id="<идентификатор_каталога>", auth="<API-ключ>", ) # Так можно посмотреть список всех загруженных датасетов for dataset in sdk.datasets.list(): print(f"List of existing datasets {dataset=}") # Так можно удалить все ранее загруженные датасеты for dataset in sdk.datasets.list(): dataset.delete() # Создаем датасет для дообучения базовой модели YandexGPT Lite dataset_draft = sdk.datasets.draft_from_path( task_type="<тип_классификации>", path="<путь_к_файлу>", upload_format="jsonlines", name="multiclass", ) # Дождемся окончания загрузки данных и создания датасета operation = dataset_draft.upload_deferred() tuning_dataset = operation.wait() print(f"new {tuning_dataset=}") if __name__ == "__main__": main()
Где:
-
<идентификатор_каталога>
— идентификатор каталога, в котором создан сервисный аккаунт. -
<API-ключ>
— API-ключ сервисного аккаунта, полученный ранее и необходимый для аутентификации в API.В примерах используется аутентификация с помощью API-ключа. Yandex Cloud ML SDK также поддерживает аутентификацию с помощью IAM-токена и OAuth-токена. Подробнее см. в разделе Аутентификация в Yandex Cloud ML SDK.
-
<тип_классификации>
— тип классификации, для которой с помощью создаваемого датасета будет дообучаться модель. Возможные значения:TextClassificationMultilabel
— бинарная классификация или классификация с несколькими метками.TextClassificationMulticlass
— многоклассовая классификация.
-
<путь_к_файлу>
— путь к файлу, содержащему заранее подготовленные примеры для дообучения модели.
-
-
Выполните созданный файл:
python3 dataset-create.py
Результат:
new tuning_dataset=Dataset(id='fds6vl5ttl0n********', folder_id='b1gt6g8ht345********', name='YandexGPT Lite tuning', description=None, metadata=None, created_by='ajegtlf2q28a********', created_at=datetime. datetime(2025, 3, 13, 8, 12, 43), updated_at=datetime.datetime(2025, 3, 13, 8, 13, 17), labels=None, allow_data_logging=False, status=<DatasetStatus.READY: 3>, task_type='TextClassificationMulticlass', rows=4, size_bytes=5679, validation_errors=())
Сохраните идентификатор созданного датасета (значение поля
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
. Значит, валидация загруженного датасета прошла успешно.
Запустите дообучение
-
В консоли управления
выберите каталог, на который у вашего аккаунта есть ролиai.playground.user
,ai.datasets.user
иai.models.editor
или выше. -
В списке сервисов выберите Foundation Models.
-
На панели слева нажмите
Дообучение моделей. -
Нажмите Дообучить модель.
-
Введите имя и описания датасета. Требования к имени:
- длина — от 2 до 63 символов;
- может содержать строчные буквы латинского алфавита, цифры и дефисы;
- первый символ — буква, последний — не дефис.
-
В поле Задача выберите Классификация.
-
Выберите Тип классификации: Многоклассовая или C несколькими метками.
-
(Опционально) Добавьте или удалите метки дообучения. Они позволяют разделить и сгруппировать ресурсы на логические группы.
-
В поле Модель выберите нужную модель.
-
В поле Датасет нажмите Добавить.
-
В открывшемся окне перейдите на вкладку Выбрать из существующих и выберите созданный ранее датасет.
-
Нажмите Дополнительные параметры, чтобы провести тонкую настройку дообучения.
-
Нажмите Начать дообучение.
-
Создайте файл
start-tuning.py
и добавьте в него код:#!/usr/bin/env python3 from __future__ import annotations import pathlib import uuid from yandex_cloud_ml_sdk import YCloudML 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}") # Можно обратиться к дообученной модели с помощью метода run() classification_result = tuned_model.run("Ничего себе!") print(f"{classification_result=}") # А можно сохранить URI дообученной модели # И вызывать дообученную модель по URI tuned_uri = tuned_model.uri model = sdk.models.text_classifiers(tuned_uri) classification_result = model.run("Круто!") 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@tamrqj184r59v********, config=TextClassifiersModelConfig(task_description=None, labels=None, samples=None)) classification_result=TextClassifiersModelResult(predictions=(TextClassificationLabel(label='гнев', confidence=0.0026986361481249332), TextClassificationLabel(label='грусть', confidence=0. 0013768149074167013), TextClassificationLabel(label='радость', confidence=0.00017048732843250036), TextClassificationLabel(label='страх', confidence=0.9950377345085144), TextClassificationLabel (label='удивление', confidence=0.0007163778645917773)), model_version='') classification_result=TextClassifiersModelResult(predictions=(TextClassificationLabel(label='гнев', confidence=0.00042847482836805284), TextClassificationLabel(label='грусть', confidence=1. 9441255062702112e-05), TextClassificationLabel(label='радость', confidence=2.6669084718378144e-07), TextClassificationLabel(label='страх', confidence=0.999543309211731), TextClassificationLabel (label='удивление', confidence=8.627005627204198e-06)), model_version='')
Дообучение модели может занять до 1 суток в зависимости от объема датасета и степени загрузки системы.
Используйте полученный URI дообученной модели (значение поля
uri
) при обращении к ней. -
Метрики дообучения доступны в формате TensorBoard. Загруженный файл можно открыть, например, в проекте Yandex DataSphere
:metrics_url = new_model.get_metrics_url() download_tensorboard(metrics_url)
-
Запустите дообучение:
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
) при обращении к ней. -
Метрики дообучения доступны в формате TensorBoard. Получите ссылку, чтобы загрузить файл:
grpcurl \ -H "Authorization: Bearer <IAM-токен>" \ -d '{"task_id": "<идентификатор_задания>"}' \ llm.api.cloud.yandex.net:443 yandex.cloud.ai.tuning.v1.TuningService/GetMetricsUrl
Загруженный файл можно открыть, например, в проекте Yandex DataSphere
.
Обращение к дообученному классификатору
После завершения операции дообучения сохраните URI дообученной модели вида cls://<URI_базовой_модели>/<версия>@<суффикс_дообучения>
. Используйте его, чтобы отправлять синхронные запросы к дообученному классификатору.
См. также
- Дообучение моделей в DataSphere
- Больше примеров доступно в репозитории на GitHub
.