【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螺纹连接快换接头。这些创新产品旨在满足电子冷却、电池制造、信息技术、能源管理、工程机械和运输等行业复杂的热管理需求。…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
Java + Spring Boot + Mybatis 实现批量插入
在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法:使用 MyBatis 的 <foreach> 标签和批处理模式(ExecutorType.BATCH)。 方法一:使用 XML 的 <foreach> 标签ÿ…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
DiscuzX3.5发帖json api
参考文章:PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下,适配我自己的需求 有一个站点存在多个采集站,我想通过主站拿标题,采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...
OPENCV图形计算面积、弧长API讲解(1)
一.OPENCV图形面积、弧长计算的API介绍 之前我们已经把图形轮廓的检测、画框等功能讲解了一遍。那今天我们主要结合轮廓检测的API去计算图形的面积,这些面积可以是矩形、圆形等等。图形面积计算和弧长计算常用于车辆识别、桥梁识别等重要功能,常用的API…...
