【Ovis】Ovis1.6的本地部署及推理
Ovis简介
Ovis是阿里国际AI团队开源的多模态大模型,看新闻介绍效果不错,在多个场景的测试下都能达到SOTA,其中的Ovis1.6-Gemma2-9B在30B参数以下的模型中取得了综合排名第一,赶超MiniCPM-V-2.6等行业优秀大模型。所以我也部署一个看看效果,是否能够帮我提升工作效率。
Ovis 1.6 Gemma2-9B 适用于多种场景,包括但不限于:
- 数学推理问答: 能够准确回答数学问题。
- 物体识别: 识别花的品种等物体。
- 文本提取: 支持多种语言的文本提取。
- 复杂任务决策: 例如识别手写字体和复杂的数学公式。
- 图像描述生成: 通过对图片的识别处理能够给出菜谱。
- 视觉问答: 在图像理解任务上表现出色。
使用环境
操作系统: Ubuntu22.04
部署步骤
PIP库安装
1.克隆 Ovis 项目。如果 git clone 失败,可以直接下载 .ZIP 压缩包 Ovis项目地址
git clone git@github.com:AIDC-AI/Ovis.git
2.创建环境,安装依赖。
conda create -n ovis python=3.10 -y
conda activate ovis
cd Ovis
pip install -r requirements.txt
pip install -e .
报错批注:
在执行 pip install -r requirements.txt 时我遇到了下面的报错。


解决方法为,先执行下面的代码,再执行 pip install -r requirements.txt,实践可解决问题。
pip install setuptools_scm
模型下载
项目提供如图所示的三种参数大小的模型。我这里选择使用9B大小的 Ovis1.6-Gemma2-9B。(9B适合个人本地部署使用,根据自己的情况选择) 更多链接见项目

1.考虑的下载速度和稳定性,我这里使用 HuggingFace-Mirror 进行模型的下载。
git clone https://hf-mirror.com/AIDC-AI/Ovis1.6-Gemma2-9B
模型推理
该项目提供了两种推理方式,对应的程序都位于 /ovis/serve 目录中。
1.使用 runner.py 进行模型推理,需修改 runner.py 代码内容后,运行即可得到推理结果。
# 修改 runner.py 的这部分代码来实现推理
# 修改:
# - <model_path>
# - <image_path>
# - <prompt>if __name__ == '__main__':runner_args = RunnerArguments(model_path='<model_path>')runner = OvisRunner(runner_args)image = Image.open('<image_path>')text = '<prompt>'response = runner.run([image, text])print(response['output'])
修改内容后,执行代码的效果如下。

上传的图片如下:

2.运行 server.py, 基于 Gradio 界面进行推理。
python ovis/serve/server.py --model_path MODEL_PATH --port PORT
执行命令后会产生下面的界面。

server.py 的完整代码如下(我加上了中文注释)
import argparse
import os.pathimport gradio as gr
from gradio.components import Textbox, Image
from ovis.serve.runner import RunnerArguments, OvisRunnerclass Server:"""Server 类用于封装 OvisRunner 实例,并提供一个可调用接口来处理图像和文本输入。它会接收来自 Gradio 界面的请求,将这些请求传递给 OvisRunner 进行推理,并返回结果。"""def __init__(self, runner: OvisRunner):"""初始化 Server 类实例时,传入一个已经配置好的 OvisRunner 实例。:param runner: 已经初始化并准备就绪的 OvisRunner 实例。"""self.runner = runnerdef __call__(self, image, text):"""当 Server 实例被像函数一样调用时,此方法会被执行。接收图像和文本作为输入参数,调用 runner.run 方法执行模型推理,并返回模型输出的结果。:param image: 用户上传的 PIL 图像对象。:param text: 用户输入的文本字符串。:return: 模型推理得到的结果字符串。"""response = self.runner.run([image, text]) # 执行模型推理output = response["output"] # 获取推理结果中的 "output" 字段return outputif __name__ == '__main__':parser = argparse.ArgumentParser(description='启动 Ovis 模型的服务端')# 添加命令行参数解析器选项parser.add_argument('--model_path', type=str, required=True,help='指定 Ovis 模型文件或目录的路径。')parser.add_argument('--flagging_dir', type=str, default=os.path.expanduser('~/ovis-flagged'),help='设置保存用户提交数据副本(标记)的目录,默认为 ~/ovis-flagged。')parser.add_argument('--max_partition', type=int, default=9,help='设置模型的最大分区数,这可能与模型分片有关,默认为 9。')parser.add_argument('--port', type=int, required=True,help='指定服务监听的端口号。')args = parser.parse_args() # 解析命令行参数# 确保标记目录存在,如果不存在则创建它os.makedirs(args.flagging_dir, exist_ok=True)# 创建 RunnerArguments 对象,用于配置 OvisRunnerrunner_args = RunnerArguments(model_path=args.model_path,max_partition=args.max_partition)# 使用 OvisRunner 和 Server 包装函数来创建 Gradio 应用程序界面demo = gr.Interface(fn=Server(OvisRunner(runner_args)), # 函数:接收图像和文本,返回模型输出inputs=[Image(type='pil', label='图片'), # 输入组件1:用于上传图片Textbox(placeholder='在这里输入文本...', label='提示')], # 输入组件2:用于输入文本outputs=gr.Markdown(), # 输出组件:以 Markdown 格式显示模型输出title=args.model_path.split('/')[-1], # 应用标题:通常是模型路径的最后一部分flagging_dir=args.flagging_dir # 标记目录:保存用户提交的数据副本)# 启动 Gradio 应用程序,监听指定端口demo.launch(server_port=args.port)
推理实测
注: 这里测评的是 Ovis 1.6 Gemma2-9B ,没有大规模的严谨测试,仅从使用角度上纯主观分享感受。
虽然我们可以看到各种说该模型的效果很强的帖子,但是实测下来存在几个问题.
1.显存占用,我使用的设备为24G显存,可以正常执行纯文本任务。在输入图片时,正常大小的图片都会导致炸显存 (只测试到 400*400及以上)。使用时需要考虑设备的显存大小。
2.文本提取,文本提取功能效果一般,效果如下所示。当图中有干扰的图像时不是很准确。


相关文章:
【Ovis】Ovis1.6的本地部署及推理
Ovis简介 Ovis是阿里国际AI团队开源的多模态大模型,看新闻介绍效果不错,在多个场景的测试下都能达到SOTA,其中的Ovis1.6-Gemma2-9B在30B参数以下的模型中取得了综合排名第一,赶超MiniCPM-V-2.6等行业优秀大模型。所以我也部署一个…...
C语言结构体位定义(位段)的实际作用深入分析
1、结构体位段格式 struct struct_name {type [member_name] : width; };一般定义结构体,成员都是int、char等类型,占用的空间大小是固定的在成员名称后用冒号来指定位宽,可以指定每个成员所占用空间,并且也不用受结构体成员起始…...
儿童影楼管理系统:基于SSM的创新设计与功能实现
3.1系统的需求分析 需求分析阶段是设计系统功能模块的总方向,可以这样来说,系统的整个的开发流程以及设计进度,基本上都是以需求分析为基本依据的[10]。需求分析阶段可以确定系统的基本功能设计,以及在最后的系统验收阶段…...
青蛇人工智能学家
青蛇人工智能学家 青蛇,是蓝星上,最出名的人工智能学家。 在蓝星上,大家都知道,青蛇人工智能学家,最大的爱好,是美食。 青蛇人工智能学家,对自己的食物,非常在意,对自己的…...
uniapp+vue 前端防多次点击表单,防误触多次请求方法。
最近项目需求写了个uniappvue前端H5,有个页面提交表单的时候发现会有用户乱点导致数据库多条重复脏数据。故需要优化,多次点击表单只请求一次。 思路: 直接调用uni.showToast,点完按钮跳一个提交成功的提示。然后把防触摸穿透mask设置成true就行&#…...
【ES6复习笔记】rest参数(7)
什么是 rest 参数? rest 参数是 ES6 引入的一个特性,它允许我们将一个不定数量的参数表示为一个数组。使用 rest 参数可以更方便地处理函数的参数,尤其是在参数数量不确定的情况下。 如何使用 rest 参数? 在函数定义中…...
Hive SQL 窗口函数 `ROW_NUMBER() ` 案例分析
一文彻底搞懂 ROW_NUMBER() 和 PARTITION BY 1. 引言 在处理大规模数据集时,Hive SQL 提供了强大的窗口函数(Window Function),如 ROW_NUMBER(),用于为结果集中的每一行分配唯一的行号。当与 PARTITION BY 和 ORDER …...
前端mock数据 —— 使用Apifox mock页面所需数据
前端mock数据 —— 使用Apifox 一、使用教程二、本地请求Apifox所mock的接口 一、使用教程 在首页进行新建项目: 新建项目名称: 新建接口: 创建json: 请求方法: GET。URL: api/basis。响应类型…...
车载U盘制作教程:轻松享受个性化音乐
车载U盘播放音乐相较于蓝牙播放具有一些明显的优势,这些优势主要体现在音质、稳定性、音乐管理以及兼容性等方面。以下是车载U盘播放音乐的一些优势: 音质更佳:车载U盘播放音乐时,音乐文件是直接被解码并播放的,这意味…...
springboot 3 websocket react 系统提示,选手实时数据更新监控
构建一个基于 Spring Boot 3 和 WebSocket 的实时数据监控系统,并在前端使用 React,可以实现选手实时数据的更新和展示功能。以下是该系统的核心设计和实现思路: 1. 系统架构 后端 (Spring Boot 3): 提供 WebSocket 服务端,处理…...
现代图形API综合比较:Vulkan DirectX Metal WebGPU
Vulkan、DirectX、Metal 和 WebGPU 等低级图形 API 正在融合为类似于当前 GPU 构建方式的模型。 图形处理单元 (GPU) 是异步计算单元,可以处理大量数据,例如复杂的网格几何形状、图像纹理、输出帧缓冲区、变换矩阵或你想要计算的任何数据。 NSDT工具推荐…...
【Hot100刷题计划】Day04 栈专题 1~3天回顾(持续更新)
LeetCode Hot 100 是最常被考察的题目集合,涵盖了面试中常见的算法和数据结构问题。刷 Hot100可以让你在有限的时间内集中精力解决最常考的问题。鼓励大家不仅要写出代码,最好理解问题的本质、优化解法和复杂度分析。遇到问题要多交流多求问多分享&#…...
用VBA将word文档处理成支持弹出式注释的epub文档可用的html内容
有一种epub文件,其中的注释以弹窗形式显示,如下图: 点击注释引用后,对应的注释内容会弹出在页面中显示,再次点击弹窗外的任意位置该弹窗即关闭,关闭后点击任意注释引用,对应的注释内容会弹窗显示…...
舵机原理介绍 简洁讲解面向实战 非阻塞式驱动代码, arduino
目录 1.舵机简介 2.舵机转动角度的PWM条件(以180度的SG90舵机为例) 2.1 控制关系 2.2arduino产生PWM 3.0 附代码 循环0度到180度开关舵机(非阻塞版本) 4.0 Servo.h 舵机代码 1.舵机简介 舵机也叫伺服电机,是控制输入PWM信号来精确控制转动角度.所以想要驱动舵机就是让ard…...
Oracle Database 23ai 中的DBMS_HCHECK
在 Oracle 23ai 中,DBMS_HCHECK 包允许我们检查数据库中已知的数据字典问题。 几年前,Oracle 发布了 hcheck.sql 脚本(文档 ID 136697.1)来检查数据库中已知的数据字典问题。 DBMS_HCHECK 包意味着我们不再需要下载 hcheck.sql…...
如何利用AWS监听存储桶并上传到tg bot
业务描述: 需要监听aws的存储中的最新消息,发送新的消息推送到指定tg的频道。 主要流程: 1.上传消息到s3存储桶(不做具体描述) 2.通过aws的lambda监听s3存储桶的最新消息(txt文件) 3.将txt文件…...
STM32 SPI读取SD卡
七个响应类型: R1 Response (Normal Response): R1响应是最基本的响应,包含一个字节的状态位,用于指示命令是否成功执行。常用。最高位为0。最低位为1表示是空闲状态。其他位是各种错误提示。 R1b Response (Normal with Busy): 类似于R1&a…...
TANGO与LabVIEW控制系统集成
TANGO 是一个开源的设备控制和数据采集框架,主要用于管理实验室设备、自动化系统和工业设备。它为不同类型的硬件提供统一的控制接口,并支持设备之间的通信,广泛应用于粒子加速器、同步辐射光源、实验室自动化和工业控制等领域。 1. TANGO的核…...
eth_type_trans 函数
eth_type_trans 是 Linux 内核网络子系统中的一个函数,它主要用于确定接收到的以太网数据包(Ethernet frame)的协议类型,并设置相应的 sk_buff 结构体的协议字段。以下是关于 eth_type_trans 的详细解释: 功能 eth_type_trans 函数的主要功能是根据以太网数据包的目的 M…...
派克汉尼汾推出新的快换接头产品系列,扩展热管理解决方案
近期,运动与控制技术领域的先行者——派克汉尼汾宣布推出四个具有开创性的热管理解决方案——NSAC、NSEC和NSIC系列盲插式快换接头以及NSSC螺纹连接快换接头。这些创新产品旨在满足电子冷却、电池制造、信息技术、能源管理、工程机械和运输等行业复杂的热管理需求。…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
STM32F4基本定时器使用和原理详解
STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...
五年级数学知识边界总结思考-下册
目录 一、背景二、过程1.观察物体小学五年级下册“观察物体”知识点详解:由来、作用与意义**一、知识点核心内容****二、知识点的由来:从生活实践到数学抽象****三、知识的作用:解决实际问题的工具****四、学习的意义:培养核心素养…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...
