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

news2024/11/24 19:42:37

应用链接: 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.live

This 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 = -1
    jiNum = -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 print

        status_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 + jiNum
    zuNUm = 4*tuziNum + 2* jiNum
    return [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 + jiNum
    zuNUm = 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.coloradmin.cn/o/861236.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用 Docker 部署 canal 服务实现MySQL和ES实时同步

参考 ClientAdapter: Canal的Adapter配置项目 Sync ES:Canal的Adapter中ES同步的配置项 使用 Docker 部署 canal 服务 docker canal-server canal-adapter mysql Canal(基于Docker同步mysql数据到elasticsearch) Canal部署过程中的错误 0. 环…

dns的负载分配是什么

DNS 负载分配是使用 DNS 系统对传入的网络流量进行分配的一种技术。这可以是基于多种策略来分配的,从简单的轮询到更复杂的基于地理位置或服务器健康状况的分配。下面是 DNS 负载分配的几种常见形式: 轮询(Round Robin)&#xff1…

【LeetCode】102. 二叉树的层序遍历、107. 二叉树的层序遍历 II

作者:小卢 专栏:《Leetcode》 喜欢的话:世间因为少年的挺身而出,而更加瑰丽。 ——《人民日报》 102. 二叉树的层序遍历 102. 二叉树的层序遍历 给你二叉树的根节点 root ,返回其节…

详解双向带头循环链表

今天给大家分享的数据结构中的链表的双向带头循环链表结构!听到这个链表大家可能心中一颤,其实他就是个纸老虎,看着比较难搞,实际上非常简单易懂,创建该结构链表的大佬可谓是真的牛,因为该结构比起单链表要…

Java课题笔记~ HTTP协议(请求和响应)

Servlet最主要的作用就是处理客户端请求,并向客户端做出响应。为此,针对Servlet的每次请求,Web服务器在调用service()方法之前,都会创建两个对象 分别是HttpServletRequest和HttpServletResponse。 其中HttpServletRequest用于封…

8.10论文阅读

文章目录 The multimodal MRI brain tumor segmentation based on AD-Net摘要本文方法损失函数 实验结果 max-vit - unet:多轴注意力医学图像分割摘要本文方法实验结果 The multimodal MRI brain tumor segmentation based on AD-Net 摘要 基于磁共振成像(MRI)的多模态胶质瘤…

SpringBoot笔记:SpringBoot 集成 Dataway 多数据源配置(二)

文章目录 前言核心代码和配置yml 配置注入多数据源常用Spi实现swagger 配置自定义 Udf指定数据源进行查询 前言 之前简单介绍了一下 Dataway 使用,本文继续介绍一下它的多数据源配置和使用。 核心代码和配置 yml 配置 # springboot多环境配置 #端口,…

SpringBoot中间件使用之EventBus、Metric、CommandLineRunner

1、EventBus 使用EventBus 事件总线的方式可以实现消息的发布/订阅功能,EventBus是一个轻量级的消息服务组件,适用于Android和Java。 // 1.注册事件通过 EventBus.getDefault().register(); // 2.发布事件 EventBus.getDefault().post(“事件内容”); …

【HarmonyOS】Java如何引用外部jar包

【关键字】 Java、引用jar包​ 【写在前面】 使用API6和API7开发HarmonyOS应用时,因为应用中只能引用SDK中开放的功能接口,但是部分jdk自带的接口功能在SDK中并未封装,要想在工程中使用jdk开放的接口功能,需要将jdk中的jar包通过…

【华秋干货铺】电源PCB设计汇总

在《PCB设计丨电源设计的重要性》一文中,已经介绍了电源设计的总体要求,以及不同电路的相关布局布线等知识点,那么本篇内容,小编将以RK3588为例,为大家详细介绍其他支线电源的PCB设计。 电源PCB设计 VDD_CPU_BIG0/1 …

uniapp 格式化时间刚刚,几分钟前,几小时前,几天前…

效果如图: 根目录下新建utils文件夹,文件夹下新增js文件,文件内容: export const filters {dateTimeSub(data) {if (data undefined) {return;}// 传进来的data必须是日期格式,不能是时间戳//将字符串转换成时间格式…

63、64、65、66项目实战

erp项目启动: nohup java -jar lemon_erp.jar & 或 java -jar lemon_erp.jar 把node_exporter监控收集器启动: nohup ./node_exporter & 监控机器上: 启动 grafana 和 prometheus 启动grafana: systemctl restart grafana…

机器学习实战2-决策树算法

文章目录 决策树算法核心是要解决两个的关键问题sklearn中的决策树模型sklearn建模步骤分类树Criterionrandom_state && splitter剪枝参数max_depthmin_samples_leaf&&min_samples_splitmax_features&&min_impurity_decrease确认最优剪枝参数目标权重参…

谈谈Spring与字节码生成技术

Java程序员几乎都了解Spring。 它的IoC(依赖反转)和AOP(面向切面编程)功能非常强大、易用。而它背后的字节码生成技术(在运行时,根据需要修改和生成Java字节码的技术)就是一项重要的支撑技术。 …

spring之AOP简单介绍

1.AOP的概念 AOP,Aspect Oriented Programming,面向切面编程,是对面向对象编程OOP的升华。OOP是纵向对一个 事物的抽象,一个对象包括静态的属性信息,包括动态的方法信息等。而AOP是横向的对不同事物的抽象,…

云原生之深入解析Redis的原理分析与环境部署

一、Redis 简介 ① 什么是 Redis ? REmote DIctionary Server(Redis)是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可…

Linux —— 基础I/O(一)

目录 一,背景介绍 二,系统接口函数 open 打开或创建文件 close 关闭文件 read 读取文件 write 写入文件 三,文件描述符 结构体指针files 结构体指针files指向的表files_struct 文件结构体 一,背景介绍 狭义的文件存放在…

爆肝整理,接口测试-Fiddler对Jmeter请求抓包(详细实战)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 使用Fiddler结合J…

编写html页面让谷歌浏览器不弹出“翻译此页”的问题

文章目录 1.问题2.解决总结 1.问题 2.解决 如下图,将html的lang由en改为zh-CN(注意大小写) 总结 将html的lang由en改为zh-CN

基于PyTorch的图像识别

前言 图像识别是计算机视觉领域的一个重要方向,具有广泛的应用场景,如医学影像诊断、智能驾驶、安防监控等。在本项目中,我们将使用PyTorch来开发一个基于卷积神经网络的图像识别模型,用来识别图像中的物体。下面是要识别的四种物…