写点什么

Gradio 入门到进阶全网最详细教程 [二]:快速搭建 AI 算法可视化部署演示 (侧重参数详解和案例实践)

作者:汀丶
  • 2023-04-26
    浙江
  • 本文字数:5701 字

    阅读完需:约 19 分钟

Gradio入门到进阶全网最详细教程[二]:快速搭建AI算法可视化部署演示(侧重参数详解和案例实践)

Gradio 入门到进阶全网最详细教程[二]:快速搭建 AI 算法可视化部署演示(侧重参数详解和案例实践)


相关文章:Gradio入门到进阶全网最详细教程[一]:快速搭建AI算法可视化部署演示(侧重项目搭建和案例分享)


在教程一中主要侧重讲解 gradio 的基础模块搭建以及 demo 展示,本篇文章则会侧重实际任务的搭建。

1.经典案例简单的 RGB 转灰度

保持一贯作风简单展示一下如何使用


import gradio as grimport cv2

def to_black(image): output = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) return output
interface = gr.Interface(fn=to_black, inputs="image", outputs="image")
interface.launch()
复制代码


gradio 的核心是它的 gr.Interface 函数,用来构建可视化界面。


  • fn:放你用来处理的函数

  • inputs:写你的输入类型,这里输入的是图像,所以是"image"

  • outputs:写你的输出类型,这里输出的是图像,所以是"image"


最后我们用 interface.lauch()把页面一发布,一个本地静态交互页面就完成了!在浏览器输入http://127.0.0.1:7860/,查收你的页面:



  • 上传一张图片,点击「SUBMIT」



对于任何图像处理类的 ML 代码来说,只要定义好一个图像输入>>模型推理>>返回图片的函数(逻辑和 RGB 转灰度图本质上没区别),放到 fn 中即可。

1.1 增加 example

可以在页面下方添加供用户选择的测试样例。


在 gr.Interface 里的 examples 中放入图片路径,格式为[[路径 1],[路径 2],...]。


import gradio as grimport cv2
def to_black(image): output = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) return output
interface = gr.Interface(fn=to_black, inputs="image", outputs="image", examples=[["gradio/test.png"]])interface.launch()
复制代码


增加 example 不仅能让你的 UI 界面更美观,逻辑更完善,也有一些其他意义:比如做了一个图像去噪算法,但是用户手头并没有躁点照片,example 能让他更快的体验到效果



  • 创建一个外部访问链接

  • 创建外部访问链接非常简单,只需要 launch(share=True)即可,在打印信息中会看到你的外部访问链接。

  • 需要注意:免费用户的链接可以使用 24 小时,想要长期的话需要在 gradio 官方购买云服务。

2. 文本分类

在 Gradio 中搭建一个实用的自然语言处理应用最少只需要三行代码!让我们三行代码来搭建一个文本分类模型的演示系统,这里使用的模型是 uer/roberta-base-finetuned-dianping-chinese,代码如下


#导入gradioimport gradio as gr#导入transformers相关包from transformers import *#通过Interface加载pipeline并启动服务gr.Interface.from_pipeline(pipeline("text-classification", model="uer/roberta-base-finetuned-dianping-chinese")).launch()
复制代码


过程中需要加载一个 400MB 的模型。


直接运行即可,运行后,服务默认会启动在本地的 7860 端口,打开链接即可。



可以在左侧输入待分类文本,而后点击 submit 按钮,右侧便会展示出预测的标签及概率,如下图所示


3. 阅读理解

#导入gradioimport gradio as gr#导入transformers相关包from transformers import *#通过Interface加载pipeline并启动服务gr.Interface.from_pipeline(pipeline("question-answering", model="uer/roberta-base-finetuned-dianping-chinese")).launch()
复制代码


再次打开,可以看到界面中除了几个按钮外的内容全部进行了更新,变成了阅读理解相关的内容,输入部分包括了 context 和 question 两部分,输出也变成了 answer 和 score 两部分。



效果上不佳可以考虑重新加载以及微调模型

3.1 完善页面

尽管我们快速的启动了一个 demo,但是页面整体还是较为简陋的,除了标题和实际的调用部分,缺少一些其他内容,我们可以通过配置几个简单的参数,将页面进行完善,还是以阅读理解任务为例,代码如下:


import gradio as grfrom transformers import *
#标题title = "抽取式问答"#标题下的描述,支持md格式description = "输入上下文与问题后,点击submit按钮,可从上下文中抽取出答案,赶快试试吧!"#输入样例examples = [ ["普希金从那里学习人民的语言,吸取了许多有益的养料,这一切对普希金后来的创作产生了很大的影响。这两年里,普希金创作了不少优秀的作品,如《囚徒》、《致大海》、《致凯恩》和《假如生活欺骗了你》等几十首抒情诗,叙事诗《努林伯爵》,历史剧《鲍里斯·戈都诺夫》,以及《叶甫盖尼·奥涅金》前六章。", "著名诗歌《假如生活欺骗了你》的作者是"], ["普希金从那里学习人民的语言,吸取了许多有益的养料,这一切对普希金后来的创作产生了很大的影响。这两年里,普希金创作了不少优秀的作品,如《囚徒》、《致大海》、《致凯恩》和《假如生活欺骗了你》等几十首抒情诗,叙事诗《努林伯爵》,历史剧《鲍里斯·戈都诺夫》,以及《叶甫盖尼·奥涅金》前六章。", "普希金创作的叙事诗叫什么"] ]#页面最后的信息,可以选择引用文章,支持md格式article = "感兴趣的小伙伴可以阅读[gradio专栏](https://blog.csdn.net/sinat_39620217/category_12298724.html?spm=1001.2014.3001.5482)"
gr.Interface.from_pipeline( pipeline("question-answering", model="uer/roberta-base-chinese-extractive-qa"), title=title, description=description, examples=examples, article=article).launch()
复制代码


  • 运行上述代码,将看到如下页面,这里的 example 是可以点击的,点击后将自动填充至 context 和 question 中

  • 由于 description 和 article 字段支持 md 语法,因此我们可以根据需求,自行的去丰富完善各部分内容


4.Interface 使用详解

前面的内容中构建演示系统都是基于 pipeline 的,各个部分的模块都是定义好的,快速启动的同时,在灵活性上有所欠缺。


简单的说,就需要两步:


  • 第一步,定义执行函数;

  • 第二步,绑定执行函数并指定输入输出组件。


假设还是阅读理解任务,但是我们这次不适用基于 pipeline 的加载方式,而是自定义实现,要求输入包含 context、question,输出包含 answer 和 score,但是这里的 answer 要求要把问题拼接上,如前面的示例,answer 为普希金,这里的答案要变为:著名诗歌《假如生活欺骗了你》的作者是:普希金 ,针对这一需求,我们看下要如何实现。


  • 首先,定义执行函数。该函数输入包括 context 和 question 两部分,输出包括 answer 和 score,本质上还是调用 pipeline 进行推理,但是在答案生成时我们做了额外的拼接处理。


qa = pipeline("question-answering", model="uer/roberta-base-chinese-extractive-qa")def custom_predict(context, question):    answer_result = qa(context=context, question=question)    answer = question + ": " + answer_result["answer"]    score = answer_result["score"]    return answer, score
复制代码


  • 接下来,在 Interface 中绑定执行函数并指定输入输出组件,fn 字段绑定执行函数;inputs 字段指定输入组件,这里是 context 和 question 两个文本输入,因此 inputs 字段的值为["text", "text"]数组(这里的 text 表示输入组件为 TextBox,text 只是一种便捷的指定方式);outputs 字段指定输出组件,answer 是文本输出,score 可以用标签输出,这里采取了和 inputs 字段不一样的创建方式,我们直接创建了对应的组件,这种方式的使用优势在于可以对组件进行更精细的配置,例如这里我们便分别指定了两个输出模块的 label 。


gr.Interface(fn=custom_predict, inputs=["text", "text"], outputs=[gr.Textbox(label="answer"), gr.Label(label="score")],              title=title, description=description, examples=examples, article=article).launch()
复制代码


注意点:


  1. 输入输出要与函数的输入输出个数一致

  2. outputs 字段,推荐使用创建的方式,否则页面显示的标签都是 output*,不够清晰


完整代码:


import gradio as grfrom transformers import *
#标题title = "抽取式问答"#题下的描述,支持md格式description = "输入上下文与问题后,点击submit按钮,可从上下文中抽取出答案,赶快试试吧!"#输入样例examples = [ ["普希金从那里学习人民的语言,吸取了许多有益的养料,这一切对普希金后来的创作产生了很大的影响。这两年里,普希金创作了不少优秀的作品,如《囚徒》、《致大海》、《致凯恩》和《假如生活欺骗了你》等几十首抒情诗,叙事诗《努林伯爵》,历史剧《鲍里斯·戈都诺夫》,以及《叶甫盖尼·奥涅金》前六章。", "著名诗歌《假如生活欺骗了你》的作者是"], ["普希金从那里学习人民的语言,吸取了许多有益的养料,这一切对普希金后来的创作产生了很大的影响。这两年里,普希金创作了不少优秀的作品,如《囚徒》、《致大海》、《致凯恩》和《假如生活欺骗了你》等几十首抒情诗,叙事诗《努林伯爵》,历史剧《鲍里斯·戈都诺夫》,以及《叶甫盖尼·奥涅金》前六章。", "普希金创作的叙事诗叫什么"] ]#页面最后的信息,可以选择引用文章,支持md格式
article = "感兴趣的小伙伴可以阅读[gradio专栏](https://blog.csdn.net/sinat_39620217/category_12298724.html?spm=1001.2014.3001.5482)"
qa = pipeline("question-answering", model="uer/roberta-base-chinese-extractive-qa")
def custom_predict(context, question): answer_result = qa(context=context, question=question) answer = question + ": " + answer_result["answer"] score = answer_result["score"] return answer, score
gr.Interface(fn=custom_predict, inputs=["text", "text"], outputs=[gr.Textbox(label="answer"), gr.Label(label="score")], title=title, description=description, examples=examples, article=article).launch()
复制代码



可以看到,其他的部分与我们使用 pipeline 创建的方式都一致,只是在 answer 部分有了变化。通过这种方式,我们可以创建出更加复杂的包含任意输入、输出的系统。

5.Blocks 使用详解

事实上,Interface 是一个更加高级的组件,虽然它已经支持了了一定的自定义内容,但是灵活性还是略差一些,如果有注意的话,可以回到上文看下,所有的组件都是被划分为了左右两部分,左侧输入,右侧输出。使用 Interface 就要接受这样的默认设定,那么假设你现在就想做成上下结构,上面输入,下面输出,那么,我们就需要用到 Block。


Blocks 是比 Interface 更加底层一些的模块,支持一些简单的自定义排版,那么下面就让我们来重构一下上面组件排列。整体是上下结构,从上到下,依次是 context 输入、question 输入,clear 按钮和 submit 按钮(在一横排),answer 输出,score 输出,其余如 title、examples 等内容不变,代码如下


import gradio as grfrom transformers import *
title = "抽取式问答"
description = "输入上下文与问题后,点击submit按钮,可从上下文中抽取出答案,赶快试试吧!"
examples = [ ["普希金从那里学习人民的语言,吸取了许多有益的养料,这一切对普希金后来的创作产生了很大的影响。这两年里,普希金创作了不少优秀的作品,如《囚徒》、《致大海》、《致凯恩》和《假如生活欺骗了你》等几十首抒情诗,叙事诗《努林伯爵》,历史剧《鲍里斯·戈都诺夫》,以及《叶甫盖尼·奥涅金》前六章。", "著名诗歌《假如生活欺骗了你》的作者是"], ["普希金从那里学习人民的语言,吸取了许多有益的养料,这一切对普希金后来的创作产生了很大的影响。这两年里,普希金创作了不少优秀的作品,如《囚徒》、《致大海》、《致凯恩》和《假如生活欺骗了你》等几十首抒情诗,叙事诗《努林伯爵》,历史剧《鲍里斯·戈都诺夫》,以及《叶甫盖尼·奥涅金》前六章。", "普希金创作的叙事诗叫什么"] ]
article = "感兴趣的小伙伴可以阅读[Transformers实用指南](https://zhuanlan.zhihu.com/p/548336726)"

#预测函数qa = pipeline("question-answering", model="uer/roberta-base-chinese-extractive-qa")def custom_predict(context, question): answer_result = qa(context=context, question=question) answer = question + ": " + answer_result["answer"] score = answer_result["score"] return answer, score
#清除输入输出def clear_input(): return "", "", "", ""
#构建Blocks上下文with gr.Blocks() as demo: gr.Markdown("# 抽取式问答") gr.Markdown("输入上下文与问题后,点击submit按钮,可从上下文中抽取出答案,赶快试试吧!") with gr.Column(): # 列排列 context = gr.Textbox(label="context") question = gr.Textbox(label="question") with gr.Row(): # 行排列 clear = gr.Button("clear") submit = gr.Button("submit") with gr.Column(): # 列排列 answer = gr.Textbox(label="answer") score = gr.Label(label="score") #绑定submit点击函数 submit.click(fn=custom_predict, inputs=[context, question], outputs=[answer, score]) # 绑定clear点击函数 clear.click(fn=clear_input, inputs=[], outputs=[context, question, answer, score]) gr.Examples(examples, inputs=[context, question]) gr.Markdown("感兴趣的小伙伴可以阅读[Transformers实用指南](https://zhuanlan.zhihu.com/p/548336726)")
demo.launch()
复制代码



当我们的服务启动起来后,还是在本地的,虽然访问是能访问了,但是还是会受到网络的限制。Gradio 提供了一种非常方便的方式,可以使得本地的服务在任何地方都可以调用。代码上,我们只需要在 launch 方法调用时,指定 share 参数值为 True。服务除了有一个本地地址,还有一个公网的地址https://11886.gradio.app,虽然时间只有72小时


demo.launch(inbrowser=True, inline=False, validate=False, share=True)
复制代码


  • inbrowser - 模型是否应在新的浏览器窗口中启动。

  • inline - 模型是否应该嵌入在交互式 python 环境中(如 jupyter notebooks 或 colab notebooks)。

  • validate - gradio 是否应该在启动之前尝试验证接口模型兼容性。

  • share - 是否应创建共享模型的公共链接。用于处理。



参考链接:


Gradio官方仓库


基于Gradio可视化部署机器学习应用


gradio官方文档


发布于: 2023-04-26阅读数: 3
用户头像

汀丶

关注

本博客将不定期更新关于NLP等领域相关知识 2022-01-06 加入

本博客将不定期更新关于机器学习、强化学习、数据挖掘以及NLP等领域相关知识,以及分享自己学习到的知识技能,感谢大家关注!

评论

发布
暂无评论
Gradio入门到进阶全网最详细教程[二]:快速搭建AI算法可视化部署演示(侧重参数详解和案例实践)_人工智能_汀丶_InfoQ写作社区