1. 其他教程
  2. 使用重载模式更快开发

使用 Reload Mode 和 Vibe Mode 加快开发速度

先决条件:本指南要求您了解 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 来关闭并重新运行您的应用。

不必这样做,您可以通过更改一个词来在 **重载模式** 下运行代码:将 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() 中设置 authshow_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 本身做出贡献,这会很有用 ✅

控制重载 🎛️

默认情况下,重载模式会在每次更改时重新运行整个脚本。但在某些情况下,这可能不理想。例如,加载机器学习模型可能只需要执行一次以节省时间。还有一些使用 C 或 Rust 扩展的 Python 库在重载时会抛出错误,例如 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: {d["label"]: d["score"] for d in pipe(s)}, gr.Textbox(), gr.Label())

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

Vibe Mode

您还可以启用 Gradio 的 **Vibe Mode**,它提供了一个可在浏览器中使用的聊天界面,可用于使用自然语言编写或编辑您的 Gradio 应用。要启用此功能,只需使用 Gradio 的 --vibe 标志,例如 gradio --vibe app.py

Vibe Mode 允许您使用自然语言描述命令,并由 LLM 编写或编辑您的 Gradio 应用中的代码。LLM 由 Hugging Face 的推理提供商提供支持,因此您必须在本地登录 Hugging Face 才能使用此功能。

注意:启用 Vibe Mode 时,任何可以访问 Gradio 端点的人都可以修改文件并在主机上运行任意代码。仅用于本地开发。

Jupyter Notebook Magic 🔮

如果您使用 Jupyter Notebook(或 Colab Notebook 等)来开发代码,该怎么办?我们也为您准备了!

我们开发了一个 **魔术命令**,可以为您创建并运行一个 Blocks 应用。要使用它,请在 Notebook 的顶部加载 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 notebooks 中也同样有效!这是一个 Colab Notebook,您可以在其中看到 Blocks 魔术命令的实际应用。尝试进行一些更改并重新运行包含 Gradio 代码的单元格!

在 Colab 中,您可能需要使用 %%blocks --share 才能在单元格中显示应用。

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


下一步

现在您知道如何快速使用 Gradio 进行开发了,开始构建您自己的吧!

如果您正在寻找灵感,不妨探索一下其他人用 Gradio 构建的应用,浏览公开的 Hugging Face Spaces 🤗

gradio