Gradio 快速开始指南用几行 Python 为机器学习模型构建并共享 Web 演示【免费下载链接】gradioBuild and share delightful machine learning apps, all in Python. Star to support our work!项目地址: https://gitcode.com/GitHub_Trending/gr/gradioGradio 是一个开源的 Python 库让你仅凭 Python 代码就能把一个机器学习模型、API 或任意 Python 函数包装成交互式 Web 演示并一键把演示分享给浏览器里的任何人——全程无需编写 JavaScript、CSS也不需要自己搭建 Web 服务器。本文以当前仓库中的中文快速开始指南为主体结合仓库内真实的demo/示例与源码带你走通从安装、写出第一个Interface、定制组件、处理多输入多输出、处理图像数据到切换Blocks构建复杂布局的完整路径。完成本文后你将能够使用pip install gradio完成环境搭建用约 10 行代码让一个 Python 函数变成可在浏览器中交互的演示用组件属性定制界面让函数接收/返回多种类型数据以及用gr.Blocks自定义布局与数据流并用launch(shareTrue)在几秒内生成公网分享链接。说明文中的示例代码均直接取自仓库中可独立运行的演示脚本位于demo/目录可复制后在本机原样运行验证。Gradio 是做什么的把机器学习模型、API 或数据科学处理流程分享给他人的最直接方式之一是创建一个交互式应用程序让用户或同事在自己的浏览器中亲手尝试演示。Gradio 允许你用 Python 构建并共享这类演示通常只需要几行代码。这样的应用形态覆盖了很广的场景从简单的文本函数到音乐生成器、税款计算器再到预训练机器学习模型的预测函数都可以成为被包装的对象。在仓库的demo/目录下可以看到大量对应真实场景的示例例如agent_chatbot聊天机器人、stable-diffusion文生图、asr语音识别、image_segmentation图像分割等它们都建立在本文将要介绍的Interface或Blocks之上。环境准备与安装先决条件按照当前指南的描述Gradio 需要Python 3.10 或更高版本没有其他必须的依赖。推荐的安装方式是通过随 Python 自带的pip在终端中执行pip install gradio仓库根目录下的pyproject.toml与requirements.txt分别定义了 Python 包构建元数据与核心依赖清单如需从源码开发或构建可进一步查阅这两个文件。日常使用直接pip install即可。第一个应用Hello, World通过一个简单的 Hello, World 示例跑通 Gradio只需要三步第 1 步安装pip install gradio第 2 步编写代码将下面的代码保存为 Python 脚本或在 Jupyter Notebook乃至 Google Colab中逐格运行。这段代码与仓库中的 demo/hello_world/run.py 完全一致import gradio as gr def greet(name): return Hello name ! demo gr.Interface(fngreet, inputstextbox, outputstextbox, api_namepredict) if __name__ __main__: demo.launch()注意我们把导入名从gradio缩短为gr这是 Gradio 社区广泛采用的约定遵循它可以让任何阅读或协作你代码的人更容易理解。第 3 步运行并查看结果在Jupyter Notebook中运行时演示界面会自动内嵌显示在单元格下方如果作为Python 脚本运行程序会在默认浏览器中弹出页面地址为http://localhost:7860。下图为该示例运行时的界面左侧为Name文本输入框与Clear/Submit按钮右侧为Output结果框附处理耗时、Flag与Screenshot辅助按钮在文本框中输入任意名字并点击Submit即可在右侧得到问候结果。这个界面上默认出现的Flag、Screenshot、Clear等按钮由 Gradio 自动生成无需任何额外代码。关于api_namepredict演示脚本为接口指定了api_name这相当于为该调用点起了一个稳定标识后续可用gradio_client等客户端以编程方式调用同一应用时引用它。本地开发进阶热重载reload模式在本地把代码作为 Python 脚本开发时更推荐用 Gradio CLI 以重载模式启动应用——每次保存文件应用会自动重载带来无缝且快速的开发体验gradio app.py注意直接执行python app.py也可以运行但它不会提供自动重载机制。重载模式对调试 UI 布局和函数逻辑非常省事改完即所见即所得。认识gr.Interface包装任意 Python 函数你会注意到上面的演示创建了gr.Interface。Interface类可以把任意 Python 函数与用户界面配对——函数可以是一段简单文本处理逻辑也可以是音乐生成器、税款计算器或预训练模型的预测函数。Interface的核心在于用三个必需参数完成初始化类定义位于仓库的 gradio/interface.py参数作用取值示例fn要被 UI 包裹的函数greet、模型的.predict等任意可调用对象inputs用于输入的组件text、image、audio或对应组件类outputs用于输出的组件text、image、label或对应组件类关于inputs/outputs有两个非常实用的灵活性传字符串快捷方式或组件实例均可如textbox与gr.Textbox()等价字符串更简短组件类则支持传入更多自定义参数见下一节。传单个组件或组件列表当函数只有一个参数、只返回一个值时传单个组件即可函数接受多个参数或返回多个值时就传一个与函数参数/返回值顺序一一对应的列表。Gradio 内置了面向机器学习场景的丰富组件实现集中在仓库的 gradio/components 目录常见的包括字符串快捷方式等价组件类典型用途text/textboxgr.Textbox文本输入输出imagegr.Image图像输入输出audiogr.Audio音频输入输出videogr.Video视频输入输出dataframegr.Dataframe表格数据labelgr.Label分类/预测标签结果slidergr.Slider数值滑杆checkboxgr.Checkbox布尔勾选numbergr.Number数值输入输出用组件属性定制界面前一节我们看到了一些简单的Textbox。如果想改变 UI 组件的外观或行为例如让输入框更大、带占位文本、配合滑块就需要使用组件类而非字符串快捷方式通过组件属性获得更精细的控制。下面的例子与 demo/hello_world_2/run.py 一致演示了组件属性的自定义函数接收名字和一个“热情程度”整数Slider通过value/minimum/maximum/step控制默认值、范围与步长输出Textbox通过label/lines自定义标签与行高import gradio as gr def greet(name, intensity): return Hello, name ! * intensity demo gr.Interface( fngreet, inputs[text, gr.Slider(value2, minimum1, maximum10, step1)], outputs[gr.Textbox(labelgreeting, lines3)], api_namepredict ) if __name__ __main__: demo.launch()这里的inputs混合了字符串快捷方式text与带参数的组件类gr.Slider(...)outputs使用带label与lines参数的gr.Textbox。可以看到凡是需要细粒度定制就替换成组件实例并传入属性即可。多个输入和输出组件真实函数往往不止一个输入输出。下面这个例子定义了接受字符串、布尔值、数字三个参数、返回字符串与数字两个值的函数代码与 demo/hello_world_3/run.py 一致import gradio as gr def greet(name, is_morning, temperature): salutation Good morning if is_morning else Good evening greeting f{salutation} {name}. It is {temperature} degrees today celsius (temperature - 32) * 5 / 9 return greeting, round(celsius, 2) demo gr.Interface( fngreet, inputs[text, checkbox, gr.Slider(0, 100)], outputs[text, number], api_namepredict ) if __name__ __main__: demo.launch()要点就一句话把组件包装成列表。inputs列表中的每个组件按顺序对应函数的一个参数第一个文本框 →name复选框 →is_morning滑块 →temperatureoutputs列表中的每个组件按顺序对应函数返回的一个值第一个文本 →greeting数字框 → 摄氏温度结果。这种“列表即顺序映射”的设计让Interface包装多参函数既直观又无额外样板代码。图像示例当输入输出是图片Gradio 支持大量组件类型例如Image、DataFrame、Video、Label。下面用一个图像到图像sepia 怀旧滤镜的函数感受这些组件代码与 demo/sepia_filter/run.py 一致import numpy as np import gradio as gr def sepia(input_img): sepia_filter np.array([ [0.393, 0.769, 0.189], [0.349, 0.686, 0.168], [0.272, 0.534, 0.131] ]) sepia_img input_img.dot(sepia_filter.T) sepia_img / sepia_img.max() return sepia_img demo gr.Interface(sepia, gr.Image(), image, api_namepredict) if __name__ __main__: demo.launch()在这个示例中值得注意两点NumPy 数组约定以Image组件作为输入时你的函数收到的是一个形状为高度宽度3的 NumPy 数组最后一个维度表示 RGB 三个通道返回图像时同样返回 NumPy 数组即可。type关键字组件可以通过type参数切换传给函数的数据类型。例如希望函数直接接收图像文件路径而非 NumPy 数组时输入Image组件可写成gr.Image(typefilepath)此外Image输入组件自带一个编辑按钮 允许用户在提交前对图像做裁剪与缩放。借助这种交互式预处理往往能更容易暴露机器学习模型在图像处理上的偏见或隐藏缺陷——例如模型对小区域、裁剪构图等输入是否仍然稳健。把演示分享给其他人launch(shareTrue)一个漂亮的演示如果无法分享出去价值会大打折扣。Gradio 通过launch()的参数让你免去服务器托管烦恼——把最后一行改为import gradio as gr def greet(name): return Hello name ! demo gr.Interface(fngreet, inputstextbox, outputstextbox) demo.launch(shareTrue) # 只需多传一个参数即可分享运行后几秒钟内会为演示生成一个类似https://a23dsf231adb.gradio.live的公网可访问 URL。任何地方的访问者都能从自己的浏览器试用该演示而模型与所有计算仍然运行在你本地机器上。从源码看launch()是Interface与Blocks统一使用的启动入口定义在 gradio/blocks.py。其文档字符串说明share参数用于创建公网分享链接会建立一条 SSH 隧道使 UI 可从任何地方访问默认值为False但在 Google Colab 等无法访问 localhost 的环境中除外——这种环境下设置shareFalse不受支持。除share外launch()还支持server_name/server_port绑定地址与端口、inbrowser是否自动打开浏览器、auth用户名密码或回调鉴权、debug、ssl_keyfile/ssl_certfileHTTPS等常用参数完整签名可阅读上述源码。Blocks更灵活、更可控的低层 APIGradio 提供两个类来构建应用它们解决不同粒度的需求Interface创建演示的高层抽象前面几节都在使用它。传入fn、inputs、outputs三要素即可快速成型适合大多数演示与分享场景。Blocks用于以更灵活的布局与数据流设计 Web 应用的低层 API。Blocks允许你实现这些能力——控制组件在页面上的出现位置、处理多条数据流、支持把某个输出继续作为另一个函数的输入复杂交互以及基于用户交互更新组件的属性与可见性——而这一切仍然全部用 Python 完成。如果应用需要这样的可定制性请选用Blocks。Blocks的 API 形态与Interface明显不同接下来用两个示例说明。Hello, Blocks事件驱动入门最简单的Blocks示例与 demo/hello_blocks/run.py 一致import gradio as gr def greet(name): return Hello name ! with gr.Blocks() as demo: name gr.Textbox(labelName) output gr.Textbox(labelOutput Box) greet_btn gr.Button(Greet) greet_btn.click(fngreet, inputsname, outputsoutput, api_namegreet) if __name__ __main__: demo.launch()需要记住的要点Blocks通过with子句创建在with gr.Blocks() as demo:作用域内创建的任何组件都会自动加入应用未显式布局时组件按创建顺序从上到下垂直排列在页面中自定义布局稍后展开这里创建了一个Button然后在其上挂载了click事件监听器。事件 API 与Interface的思想一脉相承click方法同样接受一个 Python 函数、一组输入组件和一组输出组件。一个更复杂的 Blocks 应用下面这个应用与 demo/blocks_flipper/run.py 一致展示了Blocks能做的更多事情——Markdown说明文本、Tab页签、Row行布局、可折叠的Accordion以及同一页面上的多条数据流import numpy as np import gradio as gr def flip_text(x): return x[::-1] def flip_image(x): return np.fliplr(x) with gr.Blocks() as demo: gr.Markdown(Flip text or image files using this demo.) with gr.Tab(Flip Text): text_input gr.Textbox() text_output gr.Textbox() text_button gr.Button(Flip) with gr.Tab(Flip Image): with gr.Row(): image_input gr.Image() image_output gr.Image() image_button gr.Button(Flip) with gr.Accordion(Open for More!, openFalse): gr.Markdown(Look at me...) temp_slider gr.Slider( 0, 1, value0.1, step0.1, interactiveTrue, labelSlide me, ) text_button.click(flip_text, inputstext_input, outputstext_output) image_button.click(flip_image, inputsimage_input, outputsimage_output) if __name__ __main__: demo.launch()从这段代码可以体会到Blocks的布局与数据流组织方式布局控制gr.Tab创建页签gr.Row把两个组件并排放入同一行gr.Accordion(..., openFalse)生成默认折叠的扩展区域——布局信息以嵌套with的结构化方式表达直观且可控多条数据流并存文本翻转与图像翻转各自拥有独立的输入、按钮与输出互不干扰共处同一应用事件按需绑定两个Button各自通过.click(fn, inputs, outputs)绑定处理函数inputs/outputs可以只关联到应用中的部分组件数据流向完全由你决定。上述Tab、Row、Button、Textbox、Slider等布局与组件类都位于仓库的 gradio/layouts 与 gradio/components 目录所有交互均以 Python API 驱动前端由框架自动渲染。小结与下一步到这里你已经掌握了 Gradio 的基础用法安装、用gr.Interface快速包装任意 Python 函数、通过组件属性与列表式inputs/outputs支持多输入多输出、用Image等组件处理图像数据并通过type控制数据类型、用launch(shareTrue)一键分享以及切换到gr.Blocks自定义布局与事件流。仓库 demo 目录下的数百个示例hello_world_4、calculator_blocks、chatbot_*、各类*_component等都可在本地直接运行是继续演练的最好素材。后续可以沿着中文指南目录 guides/cn 继续深入进阶学习Interface类更多参数examples、title、theme等、Blocks的事件监听与布局系统以及gr.ChatInterface在 gradio/chat_interface.py等面向聊天机器人的高层封装。若需要以编程方式调用已部署的 Gradio 应用还可查阅仓库中的 client/pythongradio_client与 client/jsgradio/client客户端实现。恭喜你现在已经熟悉了 Gradio 的基础 从写下一行gr.Interface到把模型演示分享给全世界全部只需 Python。【免费下载链接】gradioBuild and share delightful machine learning apps, all in Python. Star to support our work!项目地址: https://gitcode.com/GitHub_Trending/gr/gradio创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考