Сгенерировать изображение с помощью YandexART
С помощью нейросети YandexART вы можете генерировать изображения в асинхронном режиме. В ответ на асинхронный запрос модель вернет объект Operation, содержащий идентификатор операции, по которому можно отследить ее выполнение и получить результат после того, как генерация завершится. Генерация результата в асинхронном режиме может занимать от пары минут до нескольких часов.
Перед началом работы
Чтобы воспользоваться примерами:
-
Создайте сервисный аккаунт и назначьте ему роль
ai.imageGeneration.user
.Также назначьте сервисному аккаунту роль
ai.languageModels.user
— в примере дополнительно используется модель YandexGPT API для генерации промта для YandexART. -
Получите и сохраните 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.
Чтобы использовать API YandexART, назначьте роль
ai.imageGeneration.user
пользователю или сервисному аккаунту, от имени которого вы будете аутентифицироваться. -
Установите утилиты:
Сгенерируйте изображение
Примечание
Чтобы повышать качество генерируемых ответов, YandexART логирует промты пользователей. Не передавайте в запросах чувствительную информацию и персональные данные.
В данный код входят четыре независимые друг от друга примера, иллюстрирующие различные варианты использования интерфейса SDK:
- Пример 1: простой запрос, состоящий из одного текстового описания.
- Пример 2: запрос, состоящий из двух текстовых описаний, с сохранением результата в файл
./image.jpeg
. - Пример 3: запрос, состоящий из двух текстовых описаний с указанием веса.
- Пример 4: сочетание запроса к модели YandexGPT API (для генерации расширенного промта) и запроса к модели YandexART (для генерации изображения по этому промту).
Код в примере не возвращает объект Operation, а дожидается выполнения моделями запросов и сохраняет результат в переменную result
.
-
Создайте файл
generate-image.py
и добавьте в него следующий код:#!/usr/bin/env python3 from __future__ import annotations import pathlib from yandex_cloud_ml_sdk import YCloudML message1 = "a red cat" message2 = "Miyazaki style" def main(): sdk = YCloudML( folder_id="<идентификатор_каталога>", auth="<API-ключ>", ) model = sdk.models.image_generation("yandex-art") # configuring model for all of future runs model = model.configure(width_ratio=1, height_ratio=2, seed=50) # Sample 1: simple run operation = model.run_deferred(message1) result = operation.wait() print(result) # Sample 2: run with several messages, saving the result to file path = pathlib.Path("./image.jpeg") try: operation = model.run_deferred([message1, message2]) result = operation.wait() path.write_bytes(result.image_bytes) finally: path.unlink(missing_ok=True) # Sample 3: run with several messages specifying weight operation = model.run_deferred([{"text": message1, "weight": 5}, message2]) result = operation.wait() print(result) # Sample 4: example of combining YandexGPT API and YandexART models gpt = sdk.models.completions("yandexgpt") messages = gpt.run( [ "you need to create a prompt for a yandexart model", "of " + message1 + "in" + message2, ] ) print(messages) operation = model.run_deferred(messages) result = operation.wait() print(result) if __name__ == "__main__": main()
Где:
Примечание
В качестве входных данных для запроса Yandex Cloud ML SDK может принимать строку, словарь, объект класса
TextMessage
или массив, содержащий любое сочетание указанных типов данных. Подробнее см. в разделе Использование Yandex Cloud ML SDK.message1
— основная часть запроса на генерацию изображения.message2
— уточняющая часть запроса на генерацию изображения.
-
<идентификатор_каталога>
— идентификатор каталога, в котором создан сервисный аккаунт. -
<API-ключ>
— API-ключ сервисного аккаунта, полученный ранее и необходимый для аутентификации в API.В примерах используется аутентификация с помощью API-ключа. Yandex Cloud ML SDK также поддерживает аутентификацию с помощью IAM-токена и OAuth-токена. Подробнее см. в разделе Аутентификация в Yandex Cloud ML SDK.
-
Выполните созданный файл:
python3 generate-image.py
Результат выполнения:
ImageGenerationModelResult(model_version='', image_bytes=<889288 bytes>) ImageGenerationModelResult(model_version='', image_bytes=<1062632 bytes>) GPTModelResult(alternatives=(Alternative(role='assistant', text='Вот пример того, как может выглядеть запрос для модели YandexART:\n\n«Создай изображение красной кошки в стиле аниме Хаяо Миядзаки. Фон должен быть выполнен в мягких пастельных тонах с добавлением деталей, которые подчёркивают атмосферу волшебства и уюта».\n\n*Обратите внимание, что это лишь пример запроса, и вы можете адаптировать его под свои нужды.*', status=<AlternativeStatus.FINAL: 3>),), usage=Usage(input_text_tokens=31, completion_tokens=76, total_tokens=107), model_version='07.03.2024') ImageGenerationModelResult(model_version='', image_bytes=<1180073 bytes>)
Пример ниже разработан для выполнения в операционных системах MacOS и Linux. Чтобы выполнить его в системе Windows, ознакомьтесь с особенностями работы с Bash в Microsoft Windows.
-
Создайте файл с телом запроса (например,
prompt.json
):{ "modelUri": "art://<идентификатор_каталога>/yandex-art/latest", "generationOptions": { "seed": "1863", "aspectRatio": { "widthRatio": "2", "heightRatio": "1" } }, "messages": [ { "weight": "1", "text": "узор из цветных пастельных суккулентов разных сортов, hd full wallpaper, четкий фокус, множество сложных деталей, глубина кадра, вид сверху" } ] }
Где:
modelUri
— идентификатор модели YandexART, содержащий идентификатор каталога Yandex Cloud.seed
— зерно генерации.text
— текстовое описание изображения, на основе которого будет происходить генерация.weight
— вес текстового описания. Если в запросе присутствует больше одного описания, влияние каждого описания будет рассчитываться на основе веса, при этом сумма всех весов будет равна 1.aspectRatio
— (опционально) соотношение сторон генерируемого изображения:widthRatio
— ширина (по умолчанию 1).heightRatio
— высота (по умолчанию 1).
-
Отправьте запрос нейросети с помощью метода ImageGenerationAsync.generate, выполнив команду:
curl \ --request POST \ --header "Authorization: Bearer <значение_IAM-токена>" \ --data "@prompt.json" \ "https://llm.api.cloud.yandex.net/foundationModels/v1/imageGenerationAsync"
Где:
<значение_IAM-токена>
— IAM-токен вашего аккаунта.prompt.json
— файл в формате JSON, содержащий параметры запроса.
В ответе сервис вернет объект Operation:
{"id":"fbveu1sntj**********","description":"","createdAt":null,"createdBy":"","modifiedAt":null,"done":false,"metadata":null}
Сохраните идентификатор (
id
) операции, полученный в ответе. -
Генерация изображения может занять от нескольких секунд до нескольких часов. Подождите некоторое время и отправьте запрос по адресу:
https://llm.api.cloud.yandex.net:443/operations/<идентификатор_операции>
, чтобы получить результат генерации. Если изображение готово, результат вернется в кодировке Base64 и будет записан в файлimage.jpeg
.curl --request GET --header "Authorization: Bearer <значение_IAM-токена>" https://llm.api.cloud.yandex.net:443/operations/<идентификатор_операции> | jq -r '.response | .image' | base64 -d > image.jpeg
Где:
<значение_IAM-токена>
— IAM-токен, полученный перед началом работы.<идентификатор_операции>
— значение поляid
, полученное в ответе на запрос генерации.
См. также
- Обзор YandexART
- Примеры работы с ML SDK на GitHub