Gradio入门,并搭个鸡兔同笼问题小应用,附源码(MindOpt)
应用链接: https://979427749bc9ceec34.gradio.live 是公开访问链接,3天有效。 在modelscope中的创空间发布长期有效:https://modelscope.cn/studios/wuyoy520v01/MindOpt_Chicken-with-rabbit-cage/summary。
应用图如下,源代码见正文。
知道Gradio
AI大模型快速生成应用的工具,
在Huggingface 的Space空间方式有Gradio和Streamlit:
在国内的AI模型开源社区 ModelScope 的创空间 有Gradio和Streamlit。
他们都可以搭建一个快速的应用,比如Gradio搭的ChatGPT式的问答(这半年多特别流程的大模型应用):
图:modelscope创空间的通义千问 Chat Bot (2023年08月10日)
然后搜了些材料,发现
Gradio | Streamlit | |
---|---|---|
网址 | https://www.gradio.app | https://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
或者,Python代码里
import os
os.system('pip install gradio')
os.system('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的创空间发布后也能长期有效:https://modelscope.cn/studios/wuyoy520v01/MindOpt_Chicken-with-rabbit-cage/summary。
电脑端打开是根据我的浏览器的主题来的,这样的:
完整代码
# 安装依赖import os
os.system('pip install gradio')
os.system('pip install mindoptpy')# 鸡兔同笼问题# 鸡兔同笼问题import gradio as grfrom 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"))else: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来做有趣的小应用")gr.Markdown("MindOpt是求解大规模优化问题、方程组的专业工具,各行业可用,企业降本增效好工具。国内站:[https://opt.aliyun.com](https://opt.aliyun.com) 国际站:[https://opt.alibabacloud.com](https://opt.alibabacloud.com)")# 第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("\n---\n") # 第二个功能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. 问题错误的示例: |
---|---|
![]() | ![]() |
相关文章:

Gradio入门,并搭个鸡兔同笼问题小应用,附源码(MindOpt)
应用链接: https://979427749bc9ceec34.gradio.live 是公开访问链接,3天有效。 在modelscope中的创空间发布长期有效:https://modelscope.cn/studios/wuyoy520v01/MindOpt_Chicken-with-rabbit-cage/summary。 应用图如下,源代码见正文。 知…...
redis核心知识点简略笔记
value数据类型 string 二进制安全 list 有序、可重复 set 无序、不重复 hash field-value的map sorted set 不重复、通过double类型score分数排序 场景 string 计数器缓存分布式锁访问频率控制分布式session hash 购物车等对象属性灵活修改 list 定时排行榜 set 收藏 sorte…...

消息中间件 —— 初识Kafka
文章目录 1、Kafka简介1.1、消息队列1.1.1、为什么要有消息队列?1.1.2、消息队列1.1.3、消息队列的分类1.1.4、p2p 和 发布订阅MQ的比较1.1.5、消息系统的使用场景1.1.6、常见的消息系统 1.2、Kafka简介1.2.1、简介1.2.2、设计目标1.2.3、kafka核心的概念 2、Kafka的…...

Ceph集群安装部署
Ceph集群安装部署 目录 Ceph集群安装部署 1、环境准备 1.1 环境简介1.2 配置hosts解析(所有节点)1.3 配置时间同步2、安装docker(所有节点)3、配置镜像 3.1 下载ceph镜像(所有节点执行)3.2 搭建制作本地仓库(ceph-01节点执行)3.3 配置私有仓库(所有节点执行)3.4 为 Docker 镜像…...
PXC基于docker搭建mysql集群全过程
之前用mysql自带的bin-log复制,总是因为各种冲突,同步就阻塞掉了,一旦阻塞掉了,不主动发现,同步就终止了。还需要想办法手动去处理。所以考虑重新搭建集群。发现PXC方案不错,可以上两台,对服务器…...

项目知识点记录
1.使用druid连接池 使用properties配置文件: driverClassName com.mysql.cj.jdbc.Driver url jdbc:mysql://localhost:3306/book?useSSLtrue&setUnicodetrue&charsetEncodingUTF-8&serverTimezoneGMT%2B8 username root password 123456 #初始化链接数…...
【HDFS】ListenableFuture在HDFS中的应用
本文主要介绍以下内容: ListenableFuture提供的功能和基本使用方法;AsyncLogger、IPCLoggerChannel(它是AsyncLogger的子类)QuorumCall类一、ListenableFuture的基本使用 ListenableFuture 是 Guava 库中提供的一个接口,它扩展了 JDK 中的 Future 接口,并添加了异步任务…...

Databend 开源周报第 105 期
Databend 是一款现代云数仓。专为弹性和高效设计,为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务:https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展,遇到更贴近你心意的 Databend 。 Databend 轻量级…...

ArcGISPro随机森林自动化调参分类预测模型展示
更改ArcGISPro的python环境变量请参考文章 ArcGISPro中如何使用机器学习脚本_Z_W_H_的博客-CSDN博客 脚本文件如下 点击运行 结果展示 负类预测概率 正类预测概率 二值化概率 文件夹(模型验证结果) 数据集数据库 ROC曲线 由于个人数据量太少所以…...

科技资讯|苹果手机版Vision Pro头显专利曝光,内嵌苹果手机使用
根据美国商标和专利局(USPTO)公示的清单,苹果公司近日获得了一项头显相关的技术专利,展示了一款亲民款 Vision Pro 头显,可以将 iPhone 放置在头显内部充当屏幕。 根据patentlyapple 媒体报道,这是苹果公司…...
Linux服务器映射到本地磁盘
内容来自网友博客。 把linux服务器上的文件夹映射到本地作为一个磁盘来访问,步骤如下 一. samba的安装: sudo apt-get install samba // (sudo get temp root auth) sudo apt-get install smbfs //旧版本 sudo apt-get install cifs-utils //新版本 上…...

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群
前言 Amazon ElastiCache for Redis 是速度超快的内存数据存储,能够提供亚毫秒级延迟来支持 实时应用程序。适用于 Redis 的 ElastiCache 基于开源 Redis 构建,可与 Redis API 兼容,能够与 Redis 客户端配合工作,并使用开放的 Re…...

元宇宙核能发电VR模拟仿真实训教学为建设新型电力系统提供重要支撑
随着“碳达峰、碳中和”目标与建设新型能源体系的提出,在元宇宙环境下建设电力系统是未来发展的趋势。以物联网、区块链、数字孪生、混合现实等技术为主要代表的元宇宙技术体系及其在电力和能源系统中的应用,将会促进智能电网的发展,为建设新…...

我的Python教程:使用Pyecharts画柱状图
Pyecharts是一个用于生成 Echarts 图表的 Python 库。Echarts 是一个基于 JavaScript 的数据可视化库,提供了丰富的图表类型和交互功能。通过 Pyecharts,你可以使用 Python 代码生成各种类型的 Echarts 图表,例如折线图、柱状图、饼图、散点图…...

应用冷启bindservice耗时
背景:sdk初始化的时候耗时过长,而sdk,init方法中只有一个bindservice及一些变量的初始化,却好事100ms 查看trace发现binderservice耗时只占init耗时的一小部分,但是init逻辑并没有其他代码。 这里servicebind返回快的另一原因是se…...
资金情况:每周一次投资和消费总结
以下是每周一次投资和消费总结的最佳方法: 撰写一份清单:在整个星期中记录你的投资和消费行为,包括花费、支出和收入。 分类整理:将你的花费和支出分成不同的类别,例如餐饮、购物、交通等等。这将帮助你更好地了解你的…...
(杭电多校)2023“钉耙编程”中国大学生算法设计超级联赛(7)
1002 Random Nim Game 只有3种情况,要么必赢,要么必输,要么从宏观角度考虑,随机的话,赢的概率就是1/2(就像抛硬币一样,随着抛的次数越来越多,正反面的概率将越来越接近1) 当只要有一堆石头数量不是1,那么就是必赢或必输,赢的概率就是1/2 当每堆石头数量都为1时,当堆数为奇数…...

力扣:61. 旋转链表(Python3)
题目: 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 来源:力扣(LeetCode) 链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 示例&…...
笙默考试管理系统-MyExamTest----codemirror(1)
笙默考试管理系统-MyExamTest----codemirror(1) 目录 笙默考试管理系统-MyExamTest----codemirror(1) 一、 笙默考试管理系统-MyExamTest----codemirror 二、 笙默考试管理系统-MyExamTest----codemirror 三、 笙默考试管…...
【资料分享】全志科技T507工业核心板硬件说明书(二)
目 录 2引脚说明 2.1引脚排列 2.2引脚定义 2.3内部引脚使用说明 2.4引脚上下拉、串联说明 2.5功能引脚信号走线长度与阻抗说明 本文档为创龙科技SOM-TLT507工业...
Vim 调用外部命令学习笔记
Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
【前端异常】JavaScript错误处理:分析 Uncaught (in promise) error
在前端开发中,JavaScript 异常是不可避免的。随着现代前端应用越来越多地使用异步操作(如 Promise、async/await 等),开发者常常会遇到 Uncaught (in promise) error 错误。这个错误是由于未正确处理 Promise 的拒绝(r…...

sshd代码修改banner
sshd服务连接之后会收到字符串: SSH-2.0-OpenSSH_9.5 容易被hacker识别此服务为sshd服务。 是否可以通过修改此banner达到让人无法识别此服务的目的呢? 不能。因为这是写的SSH的协议中的。 也就是协议规定了banner必须这么写。 SSH- 开头,…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...

【51单片机】4. 模块化编程与LCD1602Debug
1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...