Gradio 月活跃用户突破 100 万!

阅读更多
Gradio logo
  1. 其他教程
  2. 使用重新加载模式更快地开发

使用自动重新加载更快地开发

先决条件:本指南要求您了解 Blocks。请务必先阅读 Blocks 指南

本指南涵盖自动重新加载、在 Python IDE 中重新加载以及将 gradio 与 Jupyter Notebooks 结合使用。

为什么自动重新加载?

当您构建 Gradio 演示时,特别是使用 Blocks 构建时,您可能会发现不断重新运行代码来测试更改很麻烦。

为了使编写代码更快更方便,我们让在 Python IDE (如 VS Code、Sublime Text、PyCharm 等)中开发或通常从终端运行 Python 代码时,可以更轻松地“重新加载”您的 Gradio 应用。我们还开发了一个类似的“魔术命令”,如果您使用 Jupyter Notebooks (或任何类似的 Colab 环境),可以让您更快地重新运行单元格。

这篇简短的指南将涵盖这两种方法,因此无论您如何编写 Python,您都将学会如何更快地构建 Gradio 应用。

Python IDE 重新加载 🔥

如果您正在使用 Python IDE 构建 Gradio Blocks,您的代码文件(我们将其命名为 run.py)可能如下所示

import gradio as gr

with gr.Blocks() as demo:
    gr.Markdown("# Greetings from Gradio!")
    inp = gr.Textbox(placeholder="What is your name?")
    out = gr.Textbox()

    inp.change(fn=lambda x: f"Welcome, {x}!",
               inputs=inp,
               outputs=out)

if __name__ == "__main__":
    demo.launch()

问题是,每当您想要更改布局、事件或组件时,都必须关闭并通过编写 python run.py 重新运行您的应用。

为了避免这种情况,您可以通过更改 1 个单词:将 python 更改为 gradio,在重新加载模式下运行您的代码

在终端中,运行 gradio run.py。就这么简单!

现在,您会看到类似以下内容

Watching: '/Users/freddy/sources/gradio/gradio', '/Users/freddy/sources/gradio/demo/'

Running on local URL:  http://127.0.0.1:7860

这里重要的部分是显示 Watching... 的行。这里发生的事情是 Gradio 将观察 run.py 文件所在的目录,如果文件发生更改,它将自动为您重新运行该文件。因此您可以专注于编写代码,您的 Gradio 演示将自动刷新 🥳

提示: `gradio` 命令无法检测到传递给 `launch()` 方法的参数,因为 `launch()` 方法永远不会在重新加载模式下调用。例如,在 `launch()` 中设置 `auth` 或 `show_error` 将不会反映在应用中。

使用重新加载模式时,有一件重要的事情要记住:Gradio 专门在您的代码中查找名为 demo 的 Gradio Blocks/Interface 演示。如果您已将演示命名为其他名称,则需要在代码中将演示的名称作为第二个参数传入。因此,如果您的 run.py 文件如下所示

import gradio as gr

with gr.Blocks() as my_demo:
    gr.Markdown("# Greetings from Gradio!")
    inp = gr.Textbox(placeholder="What is your name?")
    out = gr.Textbox()

    inp.change(fn=lambda x: f"Welcome, {x}!",
               inputs=inp,
               outputs=out)

if __name__ == "__main__":
    my_demo.launch()

那么您将像这样在重新加载模式下启动它:gradio run.py --demo-name=my_demo

默认情况下,Gradio 对脚本使用 UTF-8 编码。 对于重新加载模式,如果您使用 UTF-8 以外的编码格式(例如 cp1252),请确保您已执行以下操作

  1. 配置 python 脚本的编码声明,例如:# -*- coding: cp1252 -*-
  2. 确认您的代码编辑器已识别出该编码格式。
  3. 像这样运行:gradio run.py --encoding cp1252

🔥 如果您的应用程序接受命令行参数,您也可以传入它们。这是一个例子

import gradio as gr
import argparse

parser = argparse.ArgumentParser()
parser.add_argument("--name", type=str, default="User")
args, unknown = parser.parse_known_args()

with gr.Blocks() as demo:
    gr.Markdown(f"# Greetings {args.name}!")
    inp = gr.Textbox()
    out = gr.Textbox()

    inp.change(fn=lambda x: x, inputs=inp, outputs=out)

if __name__ == "__main__":
    demo.launch()

您可以像这样运行它:gradio run.py --name Gretel

顺便提一下,如果您更改 run.py 源代码或 Gradio 源代码,则会发生自动重新加载。这意味着如果您决定为 Gradio 本身做出贡献 ✅,这将非常有用。

控制重新加载 🎛️

默认情况下,重新加载模式将为您所做的每次更改重新运行整个脚本。但在某些情况下,这是不可取的。例如,加载机器学习模型可能应该只发生一次以节省时间。还有一些 Python 库使用 C 或 Rust 扩展,当它们被重新加载时会抛出错误,例如 numpytiktoken

在这些情况下,您可以将您不希望重新运行的代码放在 if gr.NO_RELOAD: 代码块中。以下是如何使用它仅在开发过程中加载一次 transformers 模型的示例。

提示: `gr.NO_RELOAD` 的值为 `True`。因此,当您完成开发并想要在生产环境中运行时,您不必更改脚本。只需使用 `python` 而不是 `gradio` 运行文件。

import gradio as gr

if gr.NO_RELOAD:
	from transformers import pipeline
	pipe = pipeline("text-classification", model="cardiffnlp/twitter-roberta-base-sentiment-latest")

demo = gr.Interface(lambda s: pipe(s), gr.Textbox(), gr.Label())

if __name__ == "__main__":
    demo.launch()

Jupyter Notebook 魔术 🔮

如果您使用 Jupyter Notebooks(或 Colab Notebooks 等)开发代码怎么办?我们也为您准备了一些东西!

我们开发了一个 魔术命令,它将为您创建和运行 Blocks 演示。要使用此命令,请在笔记本顶部加载 gradio 扩展

%load_ext gradio

接着,在您正在开发的 Gradio 演示的单元格中,只需在顶部写入魔法命令 %%blocks,然后像往常一样编写布局和组件。

%%blocks

import gradio as gr

with gr.Blocks() as demo:
    gr.Markdown(f"# Greetings {args.name}!")
    inp = gr.Textbox()
    out = gr.Textbox()

    inp.change(fn=lambda x: x, inputs=inp, outputs=out)

请注意

  • 您无需启动演示 —— Gradio 会自动为您完成!

  • 每次您重新运行单元格时,Gradio 都会在同一端口并使用相同的底层 Web 服务器重新渲染您的应用程序。这意味着您会看到更改的速度快得多,比您正常重新运行单元格要快得多。

这是它在 Jupyter Notebook 中的样子

🪄 这在 Colab Notebook 中也适用! 这是一个 Colab Notebook,您可以在其中看到 Blocks 魔法的实际效果。 尝试进行一些更改并重新运行包含 Gradio 代码的单元格!

提示: 您可能需要在 Colab 中使用 %%blocks --share 才能使演示出现在单元格中。

Notebook Magic 现在是作者构建 Gradio 演示的首选方式。无论您如何编写 Python 代码,我们都希望这两种方法中的任何一种都能为您提供更好的 Gradio 开发体验。


下一步

既然您已经了解如何使用 Gradio 快速开发,就开始构建您自己的应用吧!

如果您正在寻找灵感,请尝试浏览其他人使用 Gradio 构建的演示,浏览公共 Hugging Face Spaces 🤗