当前位置: 首页 > news >正文

【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团队开源的多模态大模型&#xff0c;看新闻介绍效果不错&#xff0c;在多个场景的测试下都能达到SOTA&#xff0c;其中的Ovis1.6-Gemma2-9B在30B参数以下的模型中取得了综合排名第一&#xff0c;赶超MiniCPM-V-2.6等行业优秀大模型。所以我也部署一个…...

C语言结构体位定义(位段)的实际作用深入分析

1、结构体位段格式 struct struct_name {type [member_name] : width; };一般定义结构体&#xff0c;成员都是int、char等类型&#xff0c;占用的空间大小是固定的在成员名称后用冒号来指定位宽&#xff0c;可以指定每个成员所占用空间&#xff0c;并且也不用受结构体成员起始…...

儿童影楼管理系统:基于SSM的创新设计与功能实现

3.1系统的需求分析 需求分析阶段是设计系统功能模块的总方向&#xff0c;可以这样来说&#xff0c;系统的整个的开发流程以及设计进度&#xff0c;基本上都是以需求分析为基本依据的[10]。需求分析阶段可以确定系统的基本功能设计&#xff0c;以及在最后的系统验收阶段&#xf…...

青蛇人工智能学家

青蛇人工智能学家 青蛇&#xff0c;是蓝星上&#xff0c;最出名的人工智能学家。 在蓝星上&#xff0c;大家都知道&#xff0c;青蛇人工智能学家&#xff0c;最大的爱好&#xff0c;是美食。 青蛇人工智能学家&#xff0c;对自己的食物&#xff0c;非常在意&#xff0c;对自己的…...

uniapp+vue 前端防多次点击表单,防误触多次请求方法。

最近项目需求写了个uniappvue前端H5,有个页面提交表单的时候发现会有用户乱点导致数据库多条重复脏数据。故需要优化&#xff0c;多次点击表单只请求一次。 思路: 直接调用uni.showToast&#xff0c;点完按钮跳一个提交成功的提示。然后把防触摸穿透mask设置成true就行&#…...

【ES6复习笔记】rest参数(7)

什么是 rest 参数&#xff1f; rest 参数是 ES6 引入的一个特性&#xff0c;它允许我们将一个不定数量的参数表示为一个数组。使用 rest 参数可以更方便地处理函数的参数&#xff0c;尤其是在参数数量不确定的情况下。 如何使用 rest 参数&#xff1f; 在函数定义中&#xf…...

Hive SQL 窗口函数 `ROW_NUMBER() ` 案例分析

一文彻底搞懂 ROW_NUMBER() 和 PARTITION BY 1. 引言 在处理大规模数据集时&#xff0c;Hive SQL 提供了强大的窗口函数&#xff08;Window Function&#xff09;&#xff0c;如 ROW_NUMBER()&#xff0c;用于为结果集中的每一行分配唯一的行号。当与 PARTITION BY 和 ORDER …...

前端mock数据 —— 使用Apifox mock页面所需数据

前端mock数据 —— 使用Apifox 一、使用教程二、本地请求Apifox所mock的接口 一、使用教程 在首页进行新建项目&#xff1a; 新建项目名称&#xff1a; 新建接口&#xff1a; 创建json&#xff1a; 请求方法&#xff1a; GET。URL&#xff1a; api/basis。响应类型&#xf…...

车载U盘制作教程:轻松享受个性化音乐

车载U盘播放音乐相较于蓝牙播放具有一些明显的优势&#xff0c;这些优势主要体现在音质、稳定性、音乐管理以及兼容性等方面。以下是车载U盘播放音乐的一些优势&#xff1a; 音质更佳&#xff1a;车载U盘播放音乐时&#xff0c;音乐文件是直接被解码并播放的&#xff0c;这意味…...

springboot 3 websocket react 系统提示,选手实时数据更新监控

构建一个基于 Spring Boot 3 和 WebSocket 的实时数据监控系统&#xff0c;并在前端使用 React&#xff0c;可以实现选手实时数据的更新和展示功能。以下是该系统的核心设计和实现思路&#xff1a; 1. 系统架构 后端 (Spring Boot 3): 提供 WebSocket 服务端&#xff0c;处理…...

现代图形API综合比较:Vulkan DirectX Metal WebGPU

Vulkan、DirectX、Metal 和 WebGPU 等低级图形 API 正在融合为类似于当前 GPU 构建方式的模型。 图形处理单元 (GPU) 是异步计算单元&#xff0c;可以处理大量数据&#xff0c;例如复杂的网格几何形状、图像纹理、输出帧缓冲区、变换矩阵或你想要计算的任何数据。 NSDT工具推荐…...

【Hot100刷题计划】Day04 栈专题 1~3天回顾(持续更新)

LeetCode Hot 100 是最常被考察的题目集合&#xff0c;涵盖了面试中常见的算法和数据结构问题。刷 Hot100可以让你在有限的时间内集中精力解决最常考的问题。鼓励大家不仅要写出代码&#xff0c;最好理解问题的本质、优化解法和复杂度分析。遇到问题要多交流多求问多分享&#…...

用VBA将word文档处理成支持弹出式注释的epub文档可用的html内容

有一种epub文件&#xff0c;其中的注释以弹窗形式显示&#xff0c;如下图&#xff1a; 点击注释引用后&#xff0c;对应的注释内容会弹出在页面中显示&#xff0c;再次点击弹窗外的任意位置该弹窗即关闭&#xff0c;关闭后点击任意注释引用&#xff0c;对应的注释内容会弹窗显示…...

舵机原理介绍 简洁讲解面向实战 非阻塞式驱动代码, 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 中&#xff0c;DBMS_HCHECK 包允许我们检查数据库中已知的数据字典问题。 几年前&#xff0c;Oracle 发布了 hcheck.sql 脚本&#xff08;文档 ID 136697.1&#xff09;来检查数据库中已知的数据字典问题。 DBMS_HCHECK 包意味着我们不再需要下载 hcheck.sql…...

如何利用AWS监听存储桶并上传到tg bot

业务描述&#xff1a; 需要监听aws的存储中的最新消息&#xff0c;发送新的消息推送到指定tg的频道。 主要流程&#xff1a; 1.上传消息到s3存储桶&#xff08;不做具体描述&#xff09; 2.通过aws的lambda监听s3存储桶的最新消息&#xff08;txt文件&#xff09; 3.将txt文件…...

STM32 SPI读取SD卡

七个响应类型&#xff1a; R1 Response (Normal Response): R1响应是最基本的响应&#xff0c;包含一个字节的状态位&#xff0c;用于指示命令是否成功执行。常用。最高位为0。最低位为1表示是空闲状态。其他位是各种错误提示。 R1b Response (Normal with Busy): 类似于R1&a…...

TANGO与LabVIEW控制系统集成

TANGO 是一个开源的设备控制和数据采集框架&#xff0c;主要用于管理实验室设备、自动化系统和工业设备。它为不同类型的硬件提供统一的控制接口&#xff0c;并支持设备之间的通信&#xff0c;广泛应用于粒子加速器、同步辐射光源、实验室自动化和工业控制等领域。 1. TANGO的核…...

eth_type_trans 函数

eth_type_trans 是 Linux 内核网络子系统中的一个函数,它主要用于确定接收到的以太网数据包(Ethernet frame)的协议类型,并设置相应的 sk_buff 结构体的协议字段。以下是关于 eth_type_trans 的详细解释: 功能 eth_type_trans 函数的主要功能是根据以太网数据包的目的 M…...

派克汉尼汾推出新的快换接头产品系列,扩展热管理解决方案

近期&#xff0c;运动与控制技术领域的先行者——派克汉尼汾宣布推出四个具有开创性的热管理解决方案——NSAC、NSEC和NSIC系列盲插式快换接头以及NSSC螺纹连接快换接头。这些创新产品旨在满足电子冷却、电池制造、信息技术、能源管理、工程机械和运输等行业复杂的热管理需求。…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

Python 包管理器 uv 介绍

Python 包管理器 uv 全面介绍 uv 是由 Astral&#xff08;热门工具 Ruff 的开发者&#xff09;推出的下一代高性能 Python 包管理器和构建工具&#xff0c;用 Rust 编写。它旨在解决传统工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶颈&#xff0c;同时…...

通过MicroSip配置自己的freeswitch服务器进行调试记录

之前用docker安装的freeswitch的&#xff0c;启动是正常的&#xff0c; 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

Java数组Arrays操作全攻略

Arrays类的概述 Java中的Arrays类位于java.util包中&#xff0c;提供了一系列静态方法用于操作数组&#xff08;如排序、搜索、填充、比较等&#xff09;。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序&#xff08;sort&#xff09; 对数组进行升序…...