返回 文章 build CMS 文章

Gradio 推出 gr.Workflow:可视化搭建 AI 工作流并一键部署为 API

用 Gradio 的 gr.Workflow 在画布上拖拽搭建 AI 流水线,并自动获得可调用的 REST API。

Gradiogr.WorkflowAI工作流Hugging Face
成长分 / 100 72 综合收获、行动、留存与影响

Gradio 推出 gr.Workflow:可视化搭建 AI 工作流并一键部署为 API
为什么值得读了解 Gradio 新推出的 gr.Workflow 如何将复杂 AI 流水线可视化,降低开发门槛。

学习如何将工作流自动暴露为 REST 端点,无需额外工作即可从代码调用。

关键洞察
  1. gr.Workflow 直接内置于 Gradio,工作流是一个图,包含引用(输入)、算子(执行步骤)和主体(输出)三种节点。
  2. 算子可以是 Python 函数、Hugging Face 推理提供程序上的模型、另一个 Gradio Space 或 Hub 数据集中的一行。
  3. 每个工作流同时也是一个 API,每个输出都会变成以其标签命名的 REST 端点,可用 Gradio 客户端或 curl 调用。
转成行动

深入阅读

正文与原文对照

原文保真覆盖:全文原文字符:6361

大多数有意思的 AI 应用都是流水线。你生成一张图片,然后按需抠掉背景,或者把它编辑成别的样子。你写一段脚本,然后为它生成配音,或者在保持脚本不变的情况下更换声音。我们通常用 Python 把这些步骤串起来,而一旦哪里看起来不对劲,就得回头靠 print 调试,找出是哪一步产生了奇怪的值。

内置于 Gradio 的 gr.Workflow 让流水线本身成为界面。你把各个步骤描述成由带类型节点组成的图,Gradio 则提供一块可拖拽的画布,其中每个节点都可运行,每个中间结果都清晰可见。同一张图同时也是一个 REST API,并且可以一条命令部署到 Hugging Face Spaces。

理解这个理念的最好办法,是看几个实际的工作流。下面的每个应用都是一个线上的 Huggingface Space,你可以打开、运行并复制。

编辑图片

▶ https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/blog/gradio-workflow-guide/Image edit workflow - sample2.mp4

上传一张图片,输入一条编辑指令(“把它变成雪景冬日场景”“加上太阳镜”“把车变成红色”),即可得到编辑后的照片。整个应用就是一个节点,调用 Hugging Face Inference Providers 上的 Qwen-Image-Edit。

👉 试用图片编辑器流水线

把真实模型串成媒体工作室

▶ https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/blog/gradio-workflow-guide/App 04.mp4

一张图,三条流水线。从一个提示词出发,用 FLUX 生成图片,再把它交给一个抠图 Gradio Space,变成贴纸。一个主题通过文本转语音 Gradio Space 变成旁白,同一个主题又通过一次 LLM 调用变成一个吸引人的剧集标题。

这就是一块画布、两次经由 Hugging Face Inference Providers 的模型调用,以及两次对 Gradio Space 的调用。

由于这是一个工作流,三个输出也各自拥有自己的 REST 端点:/sticker、/voiceover 和 /episode_title。你可以直接在代码中调用其中任何一个,无需打开界面。可运行的示例见下文的从代码中调用。

👉 试用 AI 媒体工作室

并行扇出的图像生成

▶ https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/blog/gradio-workflow-guide/fan-out-generation-sample1.mp4

输入一个想法,它就会同时变成一组生成的艺术作品:一张由 FLUX 生成的基础图片,两个对该图片的 AI 重新演绎(柔和的水彩版本和霓虹赛博朋克风格版本),以及一个由 LLM 撰写的画廊标题。

每张图片都由一个使用 Inference Providers 的模型节点直接根据提示词生成,而标题则来自一个调用 LLM 的 fn 节点。这就是扇出模式的实际应用:一个想法可以同时输入多个算子,全部并行生成。

👉 试用生成艺术实验室

分析 Hugging Face 数据集

▶ https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/blog/gradio-workflow-guide/data-detective-sample1.mp4

输入一个 Hugging Face 数据集 ID,例如 stanfordnlp/imdb 或 mteb/tweet_sentiment_extraction,这个单一输入会扇出到四个算子节点,它们使用 Datasets Server API 实时分析该数据集。

你会得到一张概览卡片、前几行数据的预览、各列的统计信息以及一张分布图,全部独立并行地计算完成。这就是工作流的威力!

👉 试用 Data Detective

运行你自己的 GPU 模型

▶ https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/blog/gradio-workflow-guide/zerogpu-animate-sample1.mp4

到目前为止,每个节点都要调用 Hugging Face。但 fn 节点其实就是 Python,这意味着它也可以在 Space 内部的 GPU 上运行模型。

用 @spaces.GPU 装饰所绑定的函数,当节点运行时,ZeroGPU 会为该次调用分配一块 GPU,运行模型,然后释放它。我们不必总是依赖 Inference Providers 或现有的 Gradio Space。

看看这个演示:它使用通过 Diffusers 加载的 Lightricks/LTX-Video 让静态图片动起来,全程只通过一个节点运行。gr.Workflow 不需要了解你的 GPU 配置,它只是调用所绑定的函数。

👉 试用 ZeroGPU Animator

工作原理简述

每个工作流都是一张包含三类节点的图:引用(references)(你的输入)、算子(operators)(执行工作的步骤)和主体(subjects)(你的输出)。算子可以是你自己的 Python 函数、Hugging Face Inference Providers 上的模型、另一个 Gradio Space,或者 Hub 数据集中的一行。你通过在带类型的端口之间拖拽来连接它们,点击运行,然后看着每个结果就地显示出来。

从代码中调用

你构建的每个工作流同时也是一个 API,无需额外工作。每个输出都会成为以其标签命名的 REST 端点,你可以用 Gradio 客户端从 Python 调用它。下面是针对多端点演示 Space 的一个实际可用、无需 token 的示例,原样如下:

from gradio_client import Client

client = Client("ysharma/gr-workflow-multi-endpoint-API")

print(client.predict("hello there friend", api_name="/word_count"))  # -> 3
print(client.predict(20, api_name="/fahrenheit"))                    # -> 68.0

调用模型或 Space 的端点需要在 Hugging Face token 下运行,因此创建客户端时请传入一个:

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 schema 和可复用的模式,请参阅 Gradio 文档中的官方 gr.Workflow 指南。

你甚至可以用 gr.Workflow 构建像 AUTOMATIC1111 这样复杂的东西。请留意我们的下一篇文章,我们将逐步演示如何构建它。这里先抢先看一眼 😉👇

▶ https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/blog/gradio-workflow-guide/workflow1111-sample2.mp4