Дообучить модель генерации текста

Примечание

Функциональность находится на стадии Preview.

Этот пример показывает, как дообучить модель YandexGPT Lite по методу LoRA в AI Studio. Ссылки на другие примеры доступны в разделе См. также.

Перед началом работы

Чтобы воспользоваться примерами:

  1. Создайте сервисный аккаунт и назначьте ему роль ai.editor.

  2. Получите и сохраните API-ключ сервисного аккаунта с заданной областью действия yc.ai.foundationModels.execute.

    В примерах используется аутентификация с помощью API-ключа. Yandex AI Studio SDK также поддерживает аутентификацию с помощью IAM-токена и OAuth-токена. Подробнее см. в разделе Аутентификация в Yandex AI Studio SDK.

  3. С помощью менеджера пакетов pip установите библиотеку AI SDK:

    pip install yandex-ai-studio-sdk
            
  1. Получите данные для аутентификации в API, как описано в разделе Аутентификация в API Yandex AI Studio.

  2. Чтобы воспользоваться примерами, установите cURL.

  3. Установите gRPCurl.

  4. (Опционально) Установите утилиту jq для потоковой обработки JSON-файлов.

  5. Получите IAM-токен для аутентификации в API.

    Аккаунту, для которого вы получаете IAM-токен, должна быть назначена роль ai.editor или выше.

    Примечание

    У IAM-токена короткое время жизни — не более 12 часов.

Загрузите датасет

Подготовьте данные для дообучения модели в формате JSON Lines в кодировке UTF-8. Если вы хотите разбить данные на два датасета для обучения и валидации, повторите следующие шаги для каждого датасета. Используйте полученные в результате загрузки идентификаторы при запуске дообучения.

В этом примере дообучение запускается с использованием только обучающего датасета.

Создайте датасет для дообучения:

  1. Создайте файл dataset-create.py и добавьте в него код:

    #!/usr/bin/env python3
            
            from __future__ import annotations
            
            import os
            import pathlib
            
            from yandex_ai_studio_sdk import AIStudio
            from yandex_ai_studio_sdk.exceptions import DatasetValidationError
            
            YANDEX_API_KEY = os.environ["YANDEX_API_KEY"]
            YANDEX_FOLDER_ID = os.environ["YANDEX_FOLDER_ID"]
            YANDEX_DATASET_FILE = os.environ["YANDEX_DATASET_FILE"]
            
            
            def main() -> None:
            
                sdk = AIStudio(
                    folder_id=YANDEX_FOLDER_ID,
                    auth=YANDEX_API_KEY,
                )
            
                # Так можно посмотреть список всех ранее загруженных датасетов
                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="TextToTextGeneration",
                    path=YANDEX_DATASET_FILE,
                    upload_format="jsonlines",
                    name="YandexGPT Lite tuning",
                )
            
                # Дождемся окончания загрузки данных и создания датасета
                operation = dataset_draft.upload_deferred()
                tuning_dataset = operation.wait()
                print(f"new {tuning_dataset=}")
            
            if __name__ == "__main__":
                main()
            

    Где:

  2. Выполните созданный файл:

    python3 dataset-create.py
            

    Результат:

    new tuning_dataset=Dataset(id='fdsv21bmp09v********', folder_id='b1gt6g8ht345********', name=
            'YandexGPT Lite tuning', description=None, metadata=None, created_by='ajegtlf2q28a********', 
            created_at=datetime.datetime(2025, 3, 12, 19, 31, 44), updated_at=datetime.datetime(2025, 3, 
            12, 19, 32, 20), labels=None, allow_data_logging=False, status=<DatasetStatus.READY: 3>, 
            task_type='TextToTextGeneration', rows=3, size_bytes=3514, validation_errors=())
            

    Сохраните идентификатор созданного датасета (значение поля id) — он понадобится при дообучении модели.

  1. Создайте датасет:

    grpcurl \
              -H "Authorization: Bearer <IAM-токен>" \
              -d @ \
              ai.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
            

    Где:

    Результат:

    {
              "datasetId": "fdso08c1u1cq********",
              "dataset": {
                "datasetId": "fdso08c1u1cq********",
                "folderId": "b1gt6g8ht345********",
                "name": "My awesome dataset",
                "status": "DRAFT",
                "taskType": "TextToTextGeneration",
                "createdAt": "2025-01-20T10:36:50Z",
                "updatedAt": "2025-01-20T10:36:50Z",
                "createdById": "ajeg2b2et02f********",
                "createdBy": "ajeg2b2et02f********"
              }
            }
            

    Сохраните идентификатор созданного датасета (значение поля datasetId) — он понадобится при загрузке данных в датасет.

  2. Получите ссылку, по которой вы сможете загрузить данные в датасет:

    grpcurl \
              -H "Authorization: Api-Key <API-ключ>" \
              -d '{"dataset_id": "<идентификатор_датасета>", "size_bytes": <размер_датасета>}' \
              ai.api.cloud.yandex.net:443 yandex.cloud.ai.dataset.v1.DatasetService/GetUploadDraftUrl | jq
            

    Где:

    • <API-ключ>API-ключ для работы в AI Studio.
    • <идентификатор_датасета> — идентификатор датасета, сохраненный на предыдущем шаге.
    • <размер_датасета> — размер в байтах файла с данными для дообучения. В терминале получить размер файла можно с помощью команды 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%2Fru-central1%2Fs3%2Faws4_request&X-Amz-Signature=611d7951994ae939acf4d32cc0c154c738d02adb2a04707a704f34ca********"
            }
            

    Поле uploadUrl ответа содержит ссылку, по которой вы сможете загрузить ваши данные в датасет.

    Совет

    Если вы не использовали утилиту jq, в полученной ссылке замените все последовательности символов \u0026 на &, чтобы использовать ее для загрузки датасета.

  3. Загрузите данные, указав полученную на предыдущем шаге ссылку и путь к файлу с данными для дообучения:

    curl \
              --request PUT \
              --upload-file <путь_к_файлу> \
              "<ссылка>"
            

    Где:

    • <путь_к_файлу> — путь к файлу с данными для дообучения.
    • <ссылка> — значение поля uploadUrl из ответа на предыдущем шаге.
  4. После окончания загрузки данных запустите валидацию датасета:

    grpcurl \
              -H "Authorization: Api-Key <API-ключ>" \
              -d '{"dataset_id": "<идентификатор_датасета>"}' \
              ai.api.cloud.yandex.net:443 yandex.cloud.ai.dataset.v1.DatasetService/Validate
            

    Где:

    • <API-ключ>API-ключ для работы в AI Studio.
    • <идентификатор_датасета> — идентификатор датасета, сохраненный ранее.

    Результат:

    {
              "id": "fdso01v2jdd4********",
              "createdAt": "2025-01-20T11:03:48Z",
              "modifiedAt": "2025-01-20T11:03:48Z"
            }
            

    Сохраните идентификатор операции валидации (поле id) — он понадобится на следующем шаге.

  5. Валидация датасета может занять некоторое время. Чтобы узнать статус операции и, при наличии, получить отчет о возникших ошибках, отправьте запрос:

    grpcurl \
              -H "Authorization: Api-Key <API-ключ>" \
              -d '{"operation_id": "<идентификатор_операции_валидации>"}' \
              ai.api.cloud.yandex.net:443 yandex.cloud.operation.OperationService/Get
            

    Где:

    • <API-ключ>API-ключ для работы в AI Studio.
    • <идентификатор_операции_валидации> — идентификатор операции валидации (значение поля id из ответа на предыдущем шаге).

    Результат:

    {
              "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
              }
            }
            

    Значение поля isValidtrue. Значит, валидация загруженного датасета прошла успешно.

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

  1. Создайте файл start-tuning.py и добавьте в него код:

    #!/usr/bin/env python3
            
            from __future__ import annotations
            import pathlib
            import uuid
            from yandex_ai_studio_sdk import AIStudio
            
            
            def main():
                sdk = AIStudio(
                    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")
            
                # Запускаем дообучение
                # Дообучение может длиться до нескольких часов
                tuned_model = base_model.tune(
                    train_dataset, name=str(uuid.uuid4()), n_samples=10000
                )
                print(f"Resulting {tuned_model}")
            
                # Можно обратиться к дообученной модели с помощью метода run()
                completion_result = tuned_model.run("Привет!")
                print(f"{completion_result=}")
            
                # А можно сохранить URI дообученной модели
                # И вызывать дообученную модель по URI
                tuned_uri = tuned_model.uri
                model = sdk.models.completions(tuned_uri)
                completion_result = model.run("Как дела?")
                print(f"{completion_result=}")
            
            
            if __name__ == "__main__":
                main()
            

    Где:

  2. Выполните созданный файл:

    python3 start-tuning.py
            

    Результат:

    Resulting GPTModel(uri=gpt://b1gt6g8ht345********/yandexgpt-lite/latest@tamrmgia22979********, 
            config=GPTModelConfig(temperature=None, max_tokens=None, reasoning_mode=None, response_format=None))
            completion_result=GPTModelResult(alternatives=(Alternative(role='assistant', text='Привет! Как дела?', 
            status=<AlternativeStatus.FINAL: 3>),), usage=Usage(input_text_tokens=12, completion_tokens=5, 
            total_tokens=17), model_version='23.10.2024')
            completion_result=GPTModelResult(alternatives=(Alternative(role='assistant', text='Здравствуйте! У меня 
            все хорошо, спасибо. Как ваши дела?', status=<AlternativeStatus.FINAL: 3>),), usage=Usage
            (input_text_tokens=13, completion_tokens=13, total_tokens=26), model_version='23.10.2024')
            

    Дообучение модели может занять до 1 суток в зависимости от объема датасета и загрузки системы.

    Используйте полученный URI дообученной модели (значение поля uri) при обращении к ней.

  3. Метрики дообучения доступны в формате TensorBoard. Загруженный файл можно открыть, например, в проекте Yandex DataSphere:

    metrics_url = new_model.get_metrics_url()
            download_tensorboard(metrics_url)
            
  1. Запустите дообучение:

    grpcurl \
              -H "Authorization: Bearer <IAM-токен>" \
              -d @ \
              ai.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
            

    Где:

    Результат:

    {
              "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) операции, полученный в ответе.

  2. Дообучение модели может занять до 1 суток в зависимости от объема датасета и степени загрузки системы. Чтобы проверить готовность дообучения, запросите статус операции:

    grpcurl \
              -H "Authorization: Bearer <IAM-токен>" \
              -d '{"operation_id": "<идентификатор_операции>"}' \
              operation.api.cloud.yandex.net:443 yandex.cloud.operation.OperationService/Get
            

    Где:

    • <IAM-токен>IAM-токен сервисного аккаунта, полученный перед началом работы.
    • <идентификатор_операции> — идентификатор операции дообучения модели, полученный на предыдущем шаге.

    Если дообучение завершилось, объект Operation будет содержать URI дообученной модели в поле targetModelUri:

    {
              "id": "ftnlljf53kil********",
              "createdAt": "2025-01-20T11:17:33Z",
              "modifiedAt": "2025-01-20T11:25:40Z",
              "done": true,
              "metadata": {
                "@type": "type.googleapis.com/yandex.cloud.ai.tuning.v1.TuningMetadata",
                "status": "COMPLETED",
                "tuningTaskId": "ftnlljf53kil********"
              },
              "response": {
                "@type": "type.googleapis.com/yandex.cloud.ai.tuning.v1.TuningResponse",
                "status": "COMPLETED",
                "targetModelUri": "gpt://b1gt6g8ht345********/yandexgpt-lite/latest@tamr2nc6pev5e********",
                "tuningTaskId": "ftnlljf53kil********"
              }
            }
            

    Используйте полученный URI дообученной модели (значение поля targetModelUri) при обращении к ней.

  3. Метрики дообучения доступны в формате TensorBoard. Получите ссылку, чтобы загрузить файл:

    grpcurl \
              -H "Authorization: Bearer <IAM-токен>" \
              -d '{"task_id": "<идентификатор_задания>"}' \
              ai.api.cloud.yandex.net:443 yandex.cloud.ai.tuning.v1.TuningService/GetMetricsUrl
            

    Загруженный файл можно открыть, например, в проекте Yandex DataSphere.

Обращение к дообученной модели

После завершения операции дообучения сохраните URI дообученной модели вида gpt://<URI_базовой_модели>/<версия>@<суффикс_дообучения>. Используйте его, чтобы отправлять синхронные и асинхронные запросы на основе дообученной модели.

См. также