Gradio 月活用户达到 100 万啦!

阅读更多
Gradio logo
  1. 使用 Blocks 构建
  2. 像函数一样使用 Blocks

像函数一样使用 Gradio Blocks

前提条件:本指南基于 Blocks 介绍。请务必先阅读该指南

简介

您是否知道,除了作为一个全栈机器学习演示,Gradio Blocks 应用也是一个普通的 python 函数!?

这意味着,如果您有一个名为 demo 的 gradio Blocks(或 Interface)应用,您可以像使用任何 python 函数一样使用 demo

因此,执行类似 output = demo("Hello", "friend") 的操作将在输入 “Hello” 和 “friend” 上运行 demo 中定义的第一个事件,并将其存储在变量 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 Spaces 的 gradio/english_translator 上。

您也可以在下面看到演示

现在,假设您有一个生成英文文本的应用,但您还想额外生成德文文本。

您可以选择

  1. 复制我的英德翻译的源代码,并将其粘贴到您的应用中。

  2. 在您的应用中加载我的英德翻译,并将其视为普通的 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_indexapi_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。

结束语

我们展示了如何像使用常规 python 函数一样对待 Blocks 应用,帮助您在不同的应用之间组合功能。任何 Blocks 应用都可以像函数一样对待,但一个强大的模式是在将托管在 Hugging Face Spaces 上的应用 load 之后,再在您自己的应用中像函数一样对待它。您还可以加载托管在 Hugging Face Model Hub 上的模型 - 有关示例,请参阅使用 Hugging Face 集成指南。

祝您构建愉快! ⚒️