先决条件:本指南建立在 Blocks 简介的基础上。请确保首先阅读该指南。
您知道除了作为一个全栈机器学习演示之外,Gradio Blocks 应用程序也是一个普通的 python 函数吗!?
这意味着如果您有一个名为 demo 的 Gradio Blocks(或 Interface)应用程序,您可以像使用任何 python 函数一样使用 demo。
因此,执行类似 output = demo("Hello", "friend") 的操作将运行 demo 中定义的第一个事件,输入为“Hello”和“friend”,并将结果存储在变量 output 中。
如果您感到困倦 🥱,请耐心等待!通过像函数一样使用应用程序,您可以无缝地组合 Gradio 应用程序。下一节将展示如何操作。
假设我们有以下将英文文本翻译成德文文本的演示。
import gradio as gr
from transformers import pipeline
pipe = pipeline("translation", model="t5-base")
def translate(text):
return pipe(text)[0]["translation_text"]
with gr.Blocks() as demo:
with gr.Row():
with gr.Column():
english = gr.Textbox(label="English text")
translate_btn = gr.Button(value="Translate")
with gr.Column():
german = gr.Textbox(label="German Text")
translate_btn.click(translate, inputs=english, outputs=german, api_name="translate-to-german")
examples = gr.Examples(examples=["I went to the supermarket yesterday.", "Helen is a good swimmer."],
inputs=[english])
demo.launch()
我已经将其托管在 Hugging Face Spaces 上:gradio/english_translator。
您也可以在下面看到演示
现在,假设您有一个生成英文文本的应用程序,但您还想生成德文文本。
您可以选择:
复制我的英德翻译的源代码并将其粘贴到您的应用程序中。
将我的英德翻译加载到您的应用程序中,并将其视为一个普通的 python 函数。
选项 1 在技术上总是可行,但它通常会引入不必要的复杂性。
选项 2 允许您借用所需功能,而无需将我们的应用程序紧密耦合在一起。
您所要做的就是在源文件中调用 Blocks.load 类方法。之后,您可以像使用普通 python 函数一样使用我的翻译应用程序!
以下代码片段和演示展示了如何使用 Blocks.load。
请注意,变量 english_translator 是我的英德应用程序,但在 generate_text 中像普通函数一样使用。
import gradio as gr
from transformers import pipeline
english_translator = gr.load(name="spaces/gradio/english_translator")
english_generator = pipeline("text-generation", model="distilgpt2")
def generate_text(text):
english_text = english_generator(text)[0]["generated_text"]
german_text = english_translator(english_text)
return english_text, german_text
with gr.Blocks() as demo:
with gr.Row():
with gr.Column():
seed = gr.Text(label="Input Phrase")
with gr.Column():
english = gr.Text(label="Generated English Text")
german = gr.Text(label="Generated German Text")
btn = gr.Button("Generate")
btn.click(generate_text, inputs=[seed], outputs=[english, german])
gr.Examples(["My name is Clara and I am"], inputs=[seed])
demo.launch()
如果您加载的应用程序定义了多个函数,您可以使用 fn_index 和 api_name 参数指定要使用的函数。
在我们的英德演示代码中,您会看到以下行
translate_btn.click(translate, inputs=english, outputs=german, api_name="translate-to-german")api_name 为此函数在我们的应用程序中提供了一个唯一的名称。您可以使用此名称告诉 gradio 您要使用上游空间中的哪个函数
english_generator(text, api_name="translate-to-german")[0]["generated_text"]您也可以使用 fn_index 参数。假设我的应用程序还定义了一个英西翻译函数。为了在我们的文本生成应用程序中使用它,我们将使用以下代码
english_generator(text, fn_index=1)[0]["generated_text"]gradio space 中的函数是从零开始索引的,因此由于西班牙语翻译器是我的 space 中的第二个函数,您将使用索引 1。
我们展示了如何将 Blocks 应用程序视为常规 python 函数来帮助您跨不同应用程序组合功能。任何 Blocks 应用程序都可以被视为一个函数,但一个强大的模式是在将托管在 Hugging Face Spaces 上的应用程序视为自己应用程序中的函数之前对其进行 load。您还可以加载托管在 Hugging Face Model Hub 上的模型 - 请参阅使用 Hugging Face 集成指南以获取示例。
祝您构建愉快! ⚒️