python系列&deep_study系列:Gradio中文教程(十三)Using Gradio Blocks Like Functions
Gradio中文教程(十三)Using Gradio Blocks Like Functions
Gradio中文教程(十三)Using Gradio Blocks Like Functions
使用Gradio Blocks作为函数
先决条件:本指南建立在Blocks介绍
之上。请确保首先阅读该指南。
介绍
您是否知道,除了是一个全栈机器学习演示之外,Gradio Blocks应用
还是一个普通的Python函数
!?
这意味着,如果您有一个名为demo
的gradio Blocks
(或Interface
)应用,您可以将demo
用作任何Python函数
。
所以,像output = demo("Hello", "friend")
这样的操作将运行在demo
中定义的第一个事件,对输入"Hello"
和"friend"
进行处理,并将结果存储在变量output
中。
如果我让您感到困倦 ,请耐心等待!通过将应用用作函数,您可以无缝地组合Gradio应用。
接下来的部分将展示如何做到这一点。
将Blocks视为函数
假设我们有一个将英文文本翻译成德文文本的演示。
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空间
中托管了它,地址是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空间
中的函数是基于零的索引,所以由于西班牙文翻译器将是我的空间中的第二个函数,您将使用索引1。
结束语
我们展示了如何将Blocks应用
视为普通Python函
数,这有助于您在不同的应用之间组合功能。任何Blocks应用
都可以被视为一个函数,但一个强大的模式是在您自己的应用中将其视为函数之前,先在Hugging Face Spaces
上加载一个应用。您还可以加载托管在Hugging Face Model Hub
上的模型 - 请参阅使用Hugging Face
集成的指南中的示例。
祝您构建愉快!⚒️