Свяжите, запустите, разверните: рабочие процессы ИИ в Gradio
gr.Workflow, встроенный непосредственно в Gradio, превращает конвейер в интерфейс. Вы описываете свои шаги как граф типизированных узлов, а Gradio предоставляет холст с поддержкой перетаскивания, где каждый узел можно запустить и увидеть каждый промежуточный результат. Этот же граф также является REST API и развёртыванием в Hugging Face Spaces одной командой.
Лучший способ понять идею — увидеть несколько рабочих процессов в действии. Каждое представленное ниже приложение — это работающий Space на Hugging Face, который можно открыть, запустить и дублировать.
Редактирование изображения
Загрузите изображение, введите запрос на редактирование («превратить его в снежный зимний пейзаж», «добавить солнцезащитные очки», «сделать машину красной») и получите отредактированную фотографию. Всё приложение представляет собой один узел, вызывающий Qwen-Image-Edit через провайдеров инференса Hugging Face.
👉 Попробовать конвейер редактирования изображений
Объединяйте настоящие модели в медиастудию
Один граф, три конвейера. Начните с запроса и сгенерируйте изображение с помощью FLUX, затем передайте его в Gradio Space для удаления фона, чтобы превратить его в стикер. Тема превращается в голосовое сопровождение через Gradio Space для синтеза речи, а та же тема становится запоминающимся названием эпизода благодаря вызову LLM.
Это один холст, два вызова моделей через провайдеров инференса Hugging Face и два вызова Gradio Spaces.
Поскольку это рабочий процесс, каждый из трёх результатов также получает собственную конечную точку REST: /sticker, /voiceover и /episode_title. Вы можете вызывать любую из них напрямую из кода, не открывая интерфейс. Рабочий пример см. в разделе «Вызов из кода» ниже.
Параллельная генерация изображений с разветвлением
Введите одну идею, и она одновременно превратится в набор сгенерированных иллюстраций: базовое изображение от FLUX, две версии этого изображения, переосмысленные ИИ (мягкая акварельная версия и неоновая киберпанк-версия), а также название галереи, написанное LLM.
Каждое изображение генерируется непосредственно из запроса узлом модели с использованием провайдеров инференса, а название создаётся узлом fn, который вызывает LLM. Это паттерн разветвления в действии: одна идея может одновременно поступать на несколько операторов, которые генерируют результаты параллельно.
👉 Попробовать Generative Art Lab
Профилирование датасета Hugging Face
Введите идентификатор датасета Hugging Face, например stanfordnlp/imdb или mteb/tweet_sentiment_extraction, и один входной сигнал разветвится на четыре узла-оператора, которые в реальном времени анализируют датасет с помощью API Datasets Server.
Вы получите обзорную карточку, предварительный просмотр первых строк, статистику по столбцам и график распределения — всё вычисляется независимо и параллельно. Такова сила рабочих процессов!
Запуск собственной модели на GPU
До сих пор каждый узел обращался к Hugging Face. Но узел fn — это обычный Python, а значит, он также может запускать модель внутри Space на GPU.
Добавьте декоратор @spaces.GPU к связанной функции, и при запуске узла ZeroGPU выделит GPU для этого вызова, запустит модель и освободит его. Нам не всегда нужно полагаться на провайдеров инференса или существующие Gradio Spaces.
Посмотрите эту демонстрацию, которая анимирует неподвижное изображение с помощью Lightricks/LTX-Video, загруженной через Diffusers и полностью работающей в одном узле. gr.Workflow не нужно знать ничего о вашей конфигурации GPU. Он просто вызывает связанную функцию.
👉 Попробовать ZeroGPU Animator
Как это работает вкратце
Каждый рабочий процесс представляет собой граф с тремя видами узлов: ссылки (ваши входные данные), операторы (шаги, выполняющие работу) и объекты (ваши выходные данные). Оператором может быть ваша собственная функция Python, модель в провайдерах инференса Hugging Face, другой Gradio Space или строка из датасета Hub. Соедините их, перетаскивая связи между типизированными портами, нажмите Run и наблюдайте, как каждый результат появляется на своём месте.
Вызов из кода
Каждый созданный вами рабочий процесс также является API, без каких-либо дополнительных действий. Каждый выходной результат становится конечной точкой REST, названной в соответствии с её меткой, и вы можете вызывать её из Python с помощью клиента Gradio. Вот рабочий пример без токена для демонстрационного Space с несколькими конечными точками — без каких-либо изменений:
from gradio_client import Client
client = Client("ysharma/gr-workflow-multi-endpoint-API")
print(client.predict("hello there friend", api_name="/word_count"))
print(client.predict(20, api_name="/fahrenheit"))
Конечные точки, вызывающие модель или Space, работают с токеном Hugging Face, поэтому передайте его при создании клиента:
from gradio_client import Client, handle_file
client = Client("ysharma/gr-workflow-image-editor", token="hf_...")
edited = client.predict(
handle_file("dog.jpg"),
"turn it into a snowy winter scene",
api_name="/edited_image",
)
Предпочитаете обычный HTTP? До каждой конечной точки также можно добраться с помощью curl:
curl -s https://ysharma-gr-workflow-multi-endpoint-API.hf.space/gradio_api/call/word_count \
-H "Content-Type: application/json" -d '{"data": ["hello there friend"]}'
Создайте собственный рабочий процесс
Самый быстрый способ начать — открыть любой из представленных выше демо-примеров, нажать Duplicate и начать перестраивать связи. В Python это выглядит настолько просто:
import gradio as gr
def your_function(text: str) -> str:
pass
gr.Workflow(bind=[your_function]).launch()
Полное руководство, виды операторов, схему JSON и готовые паттерны см. в официальном руководстве по gr.Workflow в документации Gradio.
С помощью gr.Workflow можно даже создать нечто столь же сложное, как AUTOMATIC1111. Следите за нашей следующей публикацией, где мы пошагово разберём процесс создания такого приложения. А пока — небольшой предварительный просмотр 😉👇
Модели, упомянутые в этой статье 4
Spaces, упомянутые в этой статье 6
Сообщество
· Зарегистрируйтесь или войдите, чтобы оставить комментарий
Модели, упомянутые в этой статье 4
Spaces, упомянутые в этой статье 6
Переведено автоматически с английского. Оригинал статьи — по ссылке ниже.