Gradio gr.Workflow: 視覚的なAIパイプラインのオーケストレーション
Hugging Faceは、AIパイプラインを隠れたPythonスクリプトから視覚的でインタラクティブなインターフェースへと変貌させる、Gradioに統合された新機能gr.Workflowを導入しました。パイプラインを型付きノードのグラフとして表現することで、gr.Workflowは開発者が中間結果をリアルタイムで確認し、グラフ全体をユーザーインターフェースとREST APIエンドポイントのセットの両方としてデプロイすることを可能にします。
Visual Pipeline Orchestration with gr.Workflow
gr.Workflowは、AIパイプラインをインターフェースそのものとして扱います。複数のPythonステップを通じたデータフローを追跡するためにprintデバッグに頼る代わりに、開発者はパイプラインを、すべてのノードが実行可能で、すべての中間結果がドラッグ&ドロップのキャンバス上で可視化されるグラフとして記述できます。
Core Architecture
A workflowは、3つの主要なノードタイプで構成されています:
- References: これらはworkflowの入力として機能します。
- Operators: これらは作業を実行する機能的なステップです。Operatorは、カスタムPython関数、Hugging Face Inference Providers経由でホストされたモデル、別のGradio Space、またはHubのデータセットの行である可能性があります。
- Subjects: これらはworkflowの出力としてとして機能します。
これらのノードは型付きポートを介して接続されており、グラフ内を移動する際のデータの一貫性を保証します。
Key Capabilities and Patterns
gr.Workflowは、並列実行やハイブリッドインフラストラクチャのデプロイを含む、いくつかの複雑なAIオーケストレーションパターンをサポートしています。
Parallel Execution (Fan-out)
「fan-out」パターンは、単一の入力が複数のoperatorノードに同時に供給されることを可能にします。例えば、単一のプロンプトが複数の並列プロセスをトリガーできます:FLUXを介したベース画像の生成、その画像の2つの異なるスタイルの再構築、およびLLMを使用したギャラリータイトルの生成、これらすべてが並列で行われます。
Hybrid Infrastructure
Workflowsは、単一のグラフ内で異なる計算リソースを組み合わせて使用できます:
- Inference Providers: ノードはHugging Face Inference Providersを介して外部モデルを呼び出すことができます。
- External Spaces: ノードは既存の他のGradio Spacesを呼び出すことができます。
- Local GPU Execution:
@spaces.GPUでバインドされた関数をデコレートすることで、開発者はZeroGPUを使用してSpace内でモデルを直接実行できます。これは、特定の呼び出しに対してGPUリソースを動的に割り当て、解放します。
Automatic API Generation
すべてのgr.Workflowは自動的にAPIに変換されます。グラフ内の各出力(subject)には、そのラベル名で命名されたRESTエンドポイントが割り当てられ、UIを使用せずにコード経由でパイプラインをトリガーすることが可能になります。
Programmatic Access
開発者は、gradio_client Pythonライブラリまたはcurlを介したプレーンなHTTPリクエストを使用して、これらのエンドポイントとやり取りできます。例えば、/word_countエンドポイントを持つworkflowは、次のように呼び出すことができます:
from gradio_client import Client
client = Client("ysharma/gr-workflow-multi-endpoint-API")
print(client.predict("hello there friend", api_name="/word_count"))
Implementation and Deployment
Workflowのデプロイは、Hugging Face Spacesへのワンコマンドプロセスとして設計されています。Pythonでの最もシンプルな実装は、わずか数行のコードで済みます:
import gradio as gr
def your_function(text: str) -> str:
pass
gr.Workflow(bind=[your_function]).launch()
Sources
関連
- Dispatch
- Dispatch
- Dispatch
- Dispatch
- Dispatch