1. 使用积木构建
  2. 像使用函数一样使用块

像使用函数一样使用Gradio Blocks

前提条件: 本指南基于区块介绍。请确保先阅读该指南

介绍

你知道吗,除了是一个全栈机器学习演示外,Gradio Blocks 应用也是一个普通的 Python 函数!?

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

所以像output = demo("Hello", "friend")这样的操作将会在输入"Hello"和"friend"上运行demo中定义的第一个事件,并将其存储在变量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空间上托管了它,地址是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。

结束语

我们展示了如何将Blocks应用视为常规Python应用,以帮助您在不同应用之间组合功能。 任何Blocks应用都可以被视为一个函数,但一个强大的模式是在将其视为自己应用中的函数之前,load托管在Hugging Face Spaces上的应用。 您还可以加载托管在Hugging Face Model Hub上的模型 - 请参阅使用Hugging Face集成指南以获取示例。

快乐构建! ⚒️