Gradio入门,并搭个鸡兔同笼问题小应用,附源码(MindOpt)

应用链接: https://979427749bc9ceec34.gradio.live 是公开访问链接,3天有效。在modelscope中的创空间怎么长期发布我还在研究。后面补上。
应用图如下,源代码见正文。
在这里插入图片描述

知道Gradio

AI大模型快速生成应用的工具,
在Huggingface 的Space空间方式有Gradio和Streamlit:
在这里插入图片描述

在国内的AI模型开源社区 ModelScope 的创空间 有Gradio和Streamlit。
在这里插入图片描述

他们都可以搭建一个快速的应用,比如Gradio搭的ChatGPT式的问答(这半年多特别流程的大模型应用):
在这里插入图片描述
图:modelscope创空间的通义千问 Chat Bot (2023年08月10日)

然后搜了些材料,发现

GradioStreamlit
网址https://www.gradio.apphttps://streamlit.io
上手难度简单简单,比左边难一点,因为丰富
组件丰富度
扩展性
Jupyter Notebook 内支持

Streamlit可以支持封装自己的前端组件组合用。 不过看小白们都爱Gradio,作为码代码少的人士,喜欢Notebook,我选择了Gradio去做demo。

了解Gradio

了解一个开发者软件怎么用,最快速的就是翻它的文档,别人写的容易有偏。

官方例子跑一跑,然后看几个别人的代码跑一跑,然后自己编一个需求跑一跑。

官方文档:https://www.gradio.app/guides/quickstart 的截图如下

在这里插入图片描述

运行环境

运行环境:在国内各大开发者平台的厂商都提供了”薅羊毛“的机会,比如在ModelScope就链接了阿里云的PAI-DSW,会有一个Jupyter Notebook环境。 薅它,香:

在这里插入图片描述
打开后是这样的Notebook,可以搞自己的开发,还可以git与创空间的git仓库连上:
(这个图内是我编的文件,后文分享)
在这里插入图片描述

一个鸡兔同笼的例子,用了达摩院的MindOpt优化求解器

运行之前,先安装两个库,gradio和mindoptpy,在Jupyter的Terminal里面运行。
安装达摩院的MindOpt优化求解器是用来解方程,也可以去他们的官网捞复杂案例来学习:https://opt.aliyun.com/#/platform/case

pip install gradio
pip install mindoptpy

然后建立一个 .ipynb的文件,选择Python 3内核。
然后运行如下程序后,设置最后一行生成公开访问连接后,会得到:

Running on local URL:  http://127.0.0.1:7932
Running on public URL: https://979427749bc9ceec34.gradio.liveThis share link expires in 72 hours. For free permanent hosting and GPU upgrades, run `gradio deploy` from Terminal to deploy to Spaces (https://huggingface.co/spaces)

其中,https://979427749bc9ceec34.gradio.live 是公开访问链接,3天有效。需要部署后才能长期有效。 modelscope的创空间发布后也能长期有效,我还在研究怎么发布。

电脑端打开是根据我的浏览器的主题来的,这样的:在这里插入图片描述

完整代码

import gradio as gr
from mindoptpy import *def solverCalc(touNum0 = 35, zuNum0 = 94):touNum = int(touNum0)zuNum = int(zuNum0)MDO_INFINITY = MdoModel.get_infinity()tuziNum = -1jiNum = -1# 声明参数# Step 1. Create a model and change the parameters.model = MdoModel()try:# Add variables.var = {}var["tuziNum"] = model.add_var(0, MDO_INFINITY, 0, None, "tuziNum", True)var["jiNum"] = model.add_var(0, MDO_INFINITY, 0, None, "jiNum", True)        # Add constraints.# 头的数目cons = {}cons["touNum"] = model.add_cons(touNum, touNum,  var["tuziNum"] + var["jiNum"], "touNum")cons["zuNum"] = model.add_cons(zuNum, zuNum,  4 * var["tuziNum"] + 2 * var["jiNum"], "touNum")# Step 3. Solve the problem and populate the result.model.solve_prob()model.display_results()time.sleep(1) #for printstatus_code, status_msg = model.get_status()if status_msg == "OPTIMAL":           tuziNum = int(var["tuziNum"].get_real_attr("PrimalSoln"))jiNum = int(var["jiNum"].get_real_attr("PrimalSoln"))if 0:print("----\n")print("The solver terminated with an OPTIMAL status (code {0}).".format(status_code))print("原始解是:")for var_name,var_val in var.items():primal_soln = var_val.get_real_attr("PrimalSoln")print(var_name,"   :   " ,primal_soln)print("对偶解是:")for cons_name,cons_val in cons.items():dual_soln = cons_val.get_real_attr("DualSoln")print(cons_name,"   :   " ,dual_soln)                else:#print("Optimizer terminated with a(n) {0} status (code {1}).".format(status_msg, status_code))tuziNum = "输入问题错误"jiNum = "输入问题错误"except MdoError as e:print("Received Mindopt exception.")print(" - Code          : {}".format(e.code))print(" - Reason        : {}".format(e.message))except Exception as e:print("Received exception.")print(" - Reason        : {}".format(e))finally:# Step 4. Free the model.model.free_mdl()return [tuziNum,jiNum]def puzzleGen(tuziNum0,jiNum0):tuziNum = int(tuziNum0)jiNum = int(jiNum0)touNum = tuziNum + jiNumzuNUm = 4*tuziNum + 2* jiNumreturn [touNum, zuNUm]with gr.Blocks() as run:gr.Markdown("# 用阿里达摩院MindOpt来做小应用")# 第1个功能gr.Markdown("\n---\n")gr.Markdown("## 鸡兔同笼问题**计算器**")gr.Markdown("请修改【头】和【脚】和的数量:")with gr.Row():inp = [gr.Textbox(label="上有多少头?如35"),gr.Textbox(label="下有多少脚?如94")]gr.Markdown("MindOpt计算结果:")with gr.Row():out = [gr.Textbox(label="兔子数量"),gr.Textbox(label="鸡数量")]btn = gr.Button(value="计算",variant='primary')btn.click(fn=solverCalc, inputs=inp, outputs=out)# 第二个功能gr.Markdown("## 鸡兔同笼问题**生成器**")gr.Markdown("请修改【兔】和【鸡】和的数量:")with gr.Row():inp2 = [gr.Textbox(label="兔子多少只?如12"),gr.Textbox(label="鸡有多少只?如23")]gr.Markdown("生成问题:") with gr.Row():out2 = [gr.Textbox(label="头数量"),gr.Textbox(label="脚数量")]btn2 = gr.Button(value="生成问题",variant='primary')btn2.click(fn=puzzleGen, inputs=inp2, outputs=out2)run.launch()#share=True)  # share=True的时候生成公开可访问的连接,3天有效,调试的时候注释掉就行。

代码分块讲解

功能函数:

def puzzleGen(tuziNum0,jiNum0):
def solverCalc(touNum0 = 35, zuNum0 = 94):

这是两个我做的功能,用来接收收到的信息,然后处理返回对应的信息。 这里注意计算的时候是数值,实际传过来的可能是字符,还没有搞清楚,有些gradio的参数设置了后,返回的内容会导致string无法转数字,计算不了。

其中puzzleGen()是鸡兔的头和脚的计算,很简单的计算逻辑

    touNum = tuziNum + jiNumzuNUm = 4*tuziNum + 2* jiNum

另一个solverCalc()是根据头和脚的计算鸡和兔。设置兔和鸡数量是整数变量 tuNum、jiNum,然后列一个简单的方程:
目标:0 #不设优化目标
约束: touNum = tuziNum + jiNum
zuNUm = 4tuziNum + 2 jiNum

然后根据MindOpt的Python库的用法mindoptpy来写程序。注意,有可能会有输入问题是错误的情况(求解器领域叫”不可解“),此时需要做异常处理。

Gradio 引用

下面是一个设置界面的参考,完整代码搞了两个,这里方便讲解:

with gr.Blocks() as run:gr.Markdown("# 用阿里达摩院MindOpt来做小应用")# 第1个功能gr.Markdown("\n---\n")gr.Markdown("## 鸡兔同笼问题**计算器**")gr.Markdown("请修改【头】和【脚】和的数量:")with gr.Row():inp = [gr.Textbox(label="上有多少头?如35"),gr.Textbox(label="下有多少脚?如94")]gr.Markdown("MindOpt计算结果:")with gr.Row():out = [gr.Textbox(label="兔子数量"),gr.Textbox(label="鸡数量")]btn = gr.Button(value="计算",variant='primary')btn.click(fn=solverCalc, inputs=inp, outputs=out)run.launch()#share=True)  # share=True的时候生成公开可访问的连接,3天有效,调试的时候注释掉就行。

其中 gr.Blocks() 相当于一个块,把要的东西塞进去。 gradio有很多组件,可以运行 help(gr.components) 来查询用法。

  • 这里前面是Markdown语法添加了些文字。
  • gr.Row()是一行塞的东西,这里面塞了俩个text文字填写框。
  • gr.Button() 是摁键组件。
  • 然后.click是执行任务。
  • 最后一个是run这个应用launch起来。注意里面也有参数设置,调试的时候本地调试就行。

然后根据Notebook的运行调试就有运行效果啦,可以在Notebook里面点点点测试,也可以用生成的浏览器链接打开测试。公开的链接,还可以在手机上打开:
比如:

1.正确的问题解答示例2. 问题错误的示例:
在这里插入图片描述在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/61139.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

week3

题解: 前序遍历性质: 节点按照 [ 根节点 | 左子树 | 右子树 ] 排序。 中序遍历性质: 节点按照 [ 左子树 | 根节点 | 右子树 ] 排序。 通过以上三步,可确定 三个节点 :1.树的根节点、2.左子树根节点、3.右子树根节点。 之后进行…

通讯协议035——全网独有的OPC HDA知识一之聚合(四)平均值

本文简单介绍OPC HDA规范的基本概念,更多通信资源请登录网信智汇(wangxinzhihui.com)。 本节旨在详细说明HDA聚合的要求和性能。其目的是使HDA聚合标准化,以便HDA客户端能够可靠地预测聚合计算的结果并理解其含义。如果用户需要聚合中的自定义功能&…

五、web应用程序技术——web功能

文章目录 一、服务器端功能1.1 SQL1.2 XML1.3 web服务 二、客户端功能2.1 HTML2.2 超链接2.3 表单2.4 CSS2.5 JavaScript2.6 文档对象模型2.7 Ajax2.8 JSON2.9 同源策略2.10浏览器拓展技术 一、服务器端功能 早期的web站点由各种静态资源组成,如HTML页面与图片。当用…

【Linux】线程的概念以及与进程的区别

目录 背景知识 什么是线程? 进程和线程的区别 线程的优缺点 背景知识 在了解线程前,我们要首先知道,OS是可以做到让进程进行细粒度划分的! 比如我们所说的进程地址空间中的堆区,它在进程PCB中的mm_structz中有一个start和…

62.不同路径

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? 动态规…

分页查询从接口到实现,统一对日期类型进行格式化处理

编写Service实现类编写Mapper的sql&#xff0c;但复杂的sql语句需要写到mapper对应的xml文件中日期类型格式化处理 /*** 扩展springmvc框架的消息转换器* param converters*/Overrideprotected void extendMessageConverters(List<HttpMessageConverter<?>> conve…

【深度学习注意力机制系列】—— SENet注意力机制(附pytorch实现)

深度学习中的注意力机制&#xff08;Attention Mechanism&#xff09;是一种模仿人类视觉和认知系统的方法&#xff0c;它允许神经网络在处理输入数据时集中注意力于相关的部分。通过引入注意力机制&#xff0c;神经网络能够自动地学习并选择性地关注输入中的重要信息&#xff…

JAVA基础之放弃使用Random

随机是日常生活中经常遇到的非常有趣的东西&#xff0c;比如说抛硬币&#xff0c;他的不可预知性总是让我们特别着迷&#xff0c;在拿不定主意时&#xff0c;有些人就喜欢用抛硬币的方式来帮助我们做决定。体育领域也喜欢用喜欢用抛硬币的方式来猜先。随机数功能是Java非常非常…

跳跃游戏 II——力扣45

文章目录 题目描述解法一 贪心题目描述 解法一 贪心 int jump(vector<int>& nums){in

Python-OpenCV中的图像处理-图像平滑

Python-OpenCV中的图像处理-图像平滑 图像平滑平均滤波高斯模糊中值模糊双边滤波 图像平滑 使用低通滤波器可以达到图像模糊的目的。这对与去除噪音很有帮助。其实就是去除图像中的高频成分&#xff08;比如&#xff1a;噪音&#xff0c;边界&#xff09;。所以边界也会被模糊…

Annotorious.js 入门教程:图片注释工具

theme: smartblue 本文简介 【今天我必须发一个封面&#xff01;放文末&#xff01;】 最近有工友问我前端怎么给图片做标注。使用 Fabric.js 或者 Konva.js 等库确实可以实现&#xff0c;但多少觉得有点大炮打蚊的感觉&#xff0c;好奇有没有专门做图片标注的工具呢&#xff1…

AI量化模型预测挑战赛 第二次学习笔记

有关竞赛信息以及基础baseline代码解读请看我的上一篇文章 AI量化模型预测——baseline学习笔记_寂ღ᭄秋࿐的博客-CSDN博客 在经过baseline进行详细的分析之后&#xff0c;接下来的方向肯定是奔着提分去的&#xff0c;下面我就从五个方面进行一一列出提分思路 提取更多的特征…