开源模型应用落地-Qwen2-VL-7B-Instruct-vLLM-OpenAI API Client调用

一、前言

    学习Qwen2-VL ,为我们打开了一扇通往先进人工智能技术的大门。让我们能够深入了解当今最前沿的视觉语言模型的工作原理和强大能力。这不仅拓宽了我们的知识视野,更让我们站在科技发展的潮头,紧跟时代的步伐。

    Qwen2-VL 具有卓越的图像和视频理解能力,以及多语言支持等特性。学习它可以提升我们处理复杂视觉信息的能力,无论是在学术研究中分析图像数据、解读视频内容,还是在实际工作中进行文档处理、解决现实问题,都能为我们提供有力的工具和方法。

    随着人工智能技术的不断发展,掌握 Qwen2-VL 这样的先进模型将为我们的职业发展增添强大的竞争力。在各个领域,对具备人工智能知识和技能的人才需求日益增长,学习 Qwen2-VL可以让我们在这个快速发展的领域中脱颖而出,为未来的职业道路奠定坚实的基础。

    本篇将介绍如何使用OpenAI API接入方式调用Qwen2-VL-7B-Instruct模型进行推理。通过学习OpenAI API接入方式,可以高效与现有系统或服务集成,减少开发和维护的复杂性。


二、术语

2.1. Qwen2-VL

    是基于 Qwen2 打造的新一代视觉语言模型,具有读懂不同分辨率和长宽比图片、理解长视频、可作为手机和机器人的视觉智能体、多语言支持等特点。目前开源了 Qwen2-VL-2B 和 Qwen2-VL-7B,并发布了Qwen2-VL-72B的API。该模型在视觉能力评估的多个方面表现优异,能进行更细节的识别理解、视觉推理、视频理解与实时聊天等。其架构延续了 ViT 加 Qwen2 的串联结构,并进行了对原生动态分辨率和多模态旋转位置嵌入的升级。

应用场景:

  1. 图像理解与识别:识别植物、地标等,理解场景中多个对象间的关系,识别手写文字及图像中的多种语言。
  2. 文档解析:能够解析包含密集公式的文档,理解文档中的内容。
  3. 多语言文本识别:转录图中多种语言的内容,并识别其语言类型。
  4. 解决现实世界问题:通过分析图片解决问题,解读复杂数学问题,从真实世界图像和图表中提取信息,执行指令。
  5. 视频内容分析:总结视频要点、即时回答相关问题,并维持连贯对话,帮助用户从视频中获取有价值的信息。
  6. 视觉代理:利用视觉能力完成自动化的工具调用和交互,例如实时数据检索。
  7. 与环境交互:像人一样与环境进行视觉交互,不仅作为观察者,还能作为执行者。

模型结构

  • Qwen2-VL 的一项关键架构改进是实现了动态分辨率支持(Naive Dynamic Resolution support)。与上一代模型Qwen-VL不同,Qwen2-VL 可以处理任意分辨率的图像,而无需将其分割成块,从而确保模型输入与图像固有信息之间的一致性。这种方法更接近地模仿人类的视觉感知,使模型能够处理任何清晰度或大小的图像。

image.png

  • 另一个关键的架构增强是Multimodal Rotary Position Embedding (M-ROPE) 的创新。通过将original rotary embedding分解为代表时间和空间(高度和宽度)信息的三个部分,M-ROPE 使 LLM 能够同时捕获和集成 1D 文本、2D视觉和 3D 视频位置信息。这使 LLM 能够充当强大的多模态处理器和推理器。

image.png

2.2. OpenAI API Client

    遵循 OpenAI API 的接口规范,让开发者可以使用OpenAI API相同的方式和方法来调用这些服务,从而利用它们的模型功能。


三、前置条件

3.1. 模型部署

选择以下任意一种方式部署Qwen2-VL-7B-Instruct模型

(一) 代码:

开源模型应用落地-qwen模型小试-调用Qwen2-VL-7B-Instruct-更清晰地看世界-集成vLLM(二)

(二) 命令:

开源模型应用落地-qwen模型小试-调用Qwen2-VL-7B-Instruct-更清晰地看世界-集成vLLM(三)

(三) Docker:

开源模型应用落地-qwen模型小试-调用Qwen2-VL-7B-Instruct-更清晰地看世界-vLLM+Docker(七)

启动成功:

INFO 10-23 11:08:50 model_runner.py:1060] Starting to load model /data/model/qwen2-vl-7b-instruct...
INFO 10-23 11:08:51 selector.py:224] Cannot use FlashAttention-2 backend for Volta and Turing GPUs.
INFO 10-23 11:08:51 selector.py:115] Using XFormers backend.
Loading safetensors checkpoint shards:   0% Completed | 0/5 [00:00<?, ?it/s]
Loading safetensors checkpoint shards:  20% Completed | 1/5 [00:26<01:46, 26.51s/it]
Loading safetensors checkpoint shards:  40% Completed | 2/5 [00:52<01:19, 26.40s/it]
Loading safetensors checkpoint shards:  60% Completed | 3/5 [01:19<00:52, 26.37s/it]
Loading safetensors checkpoint shards:  80% Completed | 4/5 [01:45<00:26, 26.35s/it]
Loading safetensors checkpoint shards: 100% Completed | 5/5 [01:53<00:00, 19.59s/it]
Loading safetensors checkpoint shards: 100% Completed | 5/5 [01:53<00:00, 22.62s/it]

INFO 10-23 11:10:44 model_runner.py:1071] Loading model weights took 15.5083 GB
INFO 10-23 11:10:49 gpu_executor.py:122] # GPU blocks: 12154, # CPU blocks: 18724
INFO 10-23 11:10:49 gpu_executor.py:126] Maximum concurrency for 8192 tokens per request: 23.74x
INFO 10-23 11:11:05 api_server.py:232] vLLM to use /tmp/tmpdrdffmm5 as PROMETHEUS_MULTIPROC_DIR
WARNING 10-23 11:11:05 serving_embedding.py:199] embedding_mode is False. Embedding API will not work.
INFO 10-23 11:11:05 launcher.py:19] Available routes are:
INFO 10-23 11:11:05 launcher.py:27] Route: /openapi.json, Methods: GET, HEAD
INFO 10-23 11:11:05 launcher.py:27] Route: /docs, Methods: GET, HEAD
INFO 10-23 11:11:05 launcher.py:27] Route: /docs/oauth2-redirect, Methods: GET, HEAD
INFO 10-23 11:11:05 launcher.py:27] Route: /redoc, Methods: GET, HEAD
INFO 10-23 11:11:05 launcher.py:27] Route: /health, Methods: GET
INFO 10-23 11:11:05 launcher.py:27] Route: /tokenize, Methods: POST
INFO 10-23 11:11:05 launcher.py:27] Route: /detokenize, Methods: POST
INFO 10-23 11:11:05 launcher.py:27] Route: /v1/models, Methods: GET
INFO 10-23 11:11:05 launcher.py:27] Route: /version, Methods: GET
INFO 10-23 11:11:05 launcher.py:27] Route: /v1/chat/completions, Methods: POST
INFO 10-23 11:11:05 launcher.py:27] Route: /v1/completions, Methods: POST
INFO 10-23 11:11:05 launcher.py:27] Route: /v1/embeddings, Methods: POST
INFO:     Started server process [3232280]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
INFO:     Uvicorn running on socket ('0.0.0.0', 9000) (Press CTRL+C to quit)
INFO 10-23 11:11:15 metrics.py:345] Avg prompt throughput: 0.0 tokens/s, Avg generation throughput: 0.0 tokens/s, Running: 0 reqs, Swapped: 0 reqs, Pending: 0 reqs, GPU KV cache usage: 0.0%, CPU KV cache usage: 0.0%.

四、技术实现

4.1. 单张图片推理

 

# -*- coding: utf-8 -*-
import base64
import requests
from openai import OpenAI

openai_api_key = "EMPTY"
openai_api_base = "http://localhost:9000/v1"

client = OpenAI(
    api_key=openai_api_key,
    base_url=openai_api_base,
)

models = client.models.list()
model = models.data[0].id


def encode_base64_content_from_url(content_url: str) -> str:
    with requests.get(content_url) as response:
        response.raise_for_status()
        result = base64.b64encode(response.content).decode('utf-8')

    return result

def encode_base64_content_from_local(content_path: str) -> str:
    with open(content_path, "rb") as image_file:
        # 将图像文件读取为二进制
        encoded_string = base64.b64encode(image_file.read())
        # 将字节数据解码为字符串形式
        return encoded_string.decode('utf-8')


def single_image_test(messages) -> None:
    chat_completion_from_url = client.chat.completions.create(
        messages=messages,
        model=model,
        temperature=0.1,
        max_tokens=1024,
        stream=False
    )

    result = chat_completion_from_url.choices[0].message.content
    return result


if __name__ == "__main__":
    image_url = '/data/test/duck.jpg'
    image_base64 = encode_base64_content_from_local(image_url)

    messages=[{
            "role": "user",
            "content": [
                {
                    "type": "text",
                    "text": "What's in this image?"
                },
                {
                    "type": "image_url",
                    "image_url": {
                        "url": f"data:image/jpeg;base64,{image_base64}"
                    },
                },
            ],
        }]
    

    result = single_image_test(messages)
    print("output:", result)

   

4.2. 多张图片推理

# -*- coding: utf-8 -*-
import base64
import requests
from openai import OpenAI

openai_api_key = "EMPTY"
openai_api_base = "http://localhost:9000/v1"

client = OpenAI(
    api_key=openai_api_key,
    base_url=openai_api_base,
)

models = client.models.list()
model = models.data[0].id


def encode_base64_content_from_url(content_url: str) -> str:
    with requests.get(content_url) as response:
        response.raise_for_status()
        result = base64.b64encode(response.content).decode('utf-8')

    return result

def encode_base64_content_from_local(content_path: str) -> str:
    with open(content_path, "rb") as image_file:
        # 将图像文件读取为二进制
        encoded_string = base64.b64encode(image_file.read())
        # 将字节数据解码为字符串形式
        return encoded_string.decode('utf-8')


def multi_image_test(messages) -> None:

    output = client.chat.completions.create(
        messages=messages,
        model=model,
        temperature=0,
        max_tokens=1024,
    )

    result = output.choices[0].message.content
    return result


if __name__ == "__main__":

    image_paths = [
        "https://upload.wikimedia.org/wikipedia/commons/d/da/2015_Kaczka_krzy%C5%BCowka_w_wodzie_%28samiec%29.jpg",
        "https://upload.wikimedia.org/wikipedia/commons/7/77/002_The_lion_king_Snyggve_in_the_Serengeti_National_Park_Photo_by_Giles_Laurent.jpg"
    ]

    messages = [{
        "type": "text",
        "text": "这些图像中的动物是什么?"
    }]
    for image_path in image_paths:
        obj = {
            "type": "image_url",
            "image_url": {
                "url": image_path
            },
        }
        messages.append(obj)


    result = multi_image_test(messages)
    print("output:", result)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/902112.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++——string的模拟实现(上)

目录 引言 成员变量 1.基本框架 成员函数 1.构造函数和析构函数 2.拷贝构造函数 3.容量操作函数 3.1 有效长度和容量大小 3.2 容量操作 3.3 访问操作 (1)operator[]函数 (2)iterator迭代器 3.4 修改操作 (1)push_back()和append() (2)operator函数 引言 在 C—…

直播系统源码技术搭建部署流程及配置步骤

系统环境要求 PHP版本&#xff1a;5.6、7.3 Mysql版本&#xff1a;5.6&#xff0c;5.7需要关闭严格模式 Nginx&#xff1a;任何版本 Redis&#xff1a;需要给所有PHP版本安装Redis扩展&#xff0c;不需要设置Redis密码 最好使用面板安装&#xff1a;宝塔面板 - 简单好用的…

深度学习中的迁移学习:优化训练流程与提高模型性能的策略,预训练模型、微调 (Fine-tuning)、特征提取

1024程序员节 | 征文 深度学习中的迁移学习&#xff1a;优化训练流程与提高模型性能的策略 目录 &#x1f3d7;️ 预训练模型&#xff1a;减少训练时间并提高准确性&#x1f504; 微调 (Fine-tuning)&#xff1a;适应新任务的有效方法&#x1f9e9; 特征提取&#xff1a;快速…

AAPL: Adding Attributes to Prompt Learning for Vision-Language Models

文章汇总 当前的问题 1.元标记未能捕获分类的关键语义特征 如下图(a)所示&#xff0c; π \pi π在类聚类方面没有显示出很大的差异&#xff0c;这表明元标记 π \pi π未能捕获分类的关键语义特征。我们进行简单的数据增强后&#xff0c;如图(b)所示&#xff0c;效果也是如…

资讯 | 财富通科技政务协同办公管理软件通过麒麟软件适配认证

2024年9月25日&#xff0c;财富通科技研发的政务协同办公管理软件成功通过中国国产操作系统麒麟软件的适配认证。本次认证是继公司区块链产品“基于区块链的企业及人员资质数字证书服务平台”认证以后得第二次认证。这一成就标志着财富通科技在推动国产软件生态建设方面迈出了坚…

【MySQL基础】数据的增删改查(CRUD)

文章目录 一、 插入数据1. 单条数据插入2. 批量插入数据3. 插入默认值4. 部分字段插入5. 总结 二、更新数据1. 基本的UPDATE语法2. 带多个字段的更新3. 批量条件更新4. 小心条件为空的更新教训 5. 一个实际例子&#xff1a;换专业的情况6. 总结 三、删除数据1. 删除特定数据&am…

基于SSM+微信小程序的社区垃圾回收管理系统(垃圾1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于ssm微信小程序的社区垃圾回收管理系统&#xff0c;有管理员&#xff0c;回收员&#xff0c;用户三个角色。 1、管理员功能有个人中心&#xff0c;用户管理&#xff0c;回收员管理&am…

java游戏第六天——总结

开始 我们先在这里创建五个java文件&#xff0c;后面创建一个文件夹存储图片&#xff0c;我就按照这几个文件作用展开描述 bg.java package common; import common.game_pic;import java.awt.Color; import java.awt.Graphics; public class bg {public void paintself(Graph…

Python数据分析——Numpy

纯个人python的一个小回忆笔记&#xff0c;当时假期花两天学的python&#xff0c;确实时隔几个月快忘光了&#xff0c;为了应付作业才回忆起来&#xff0c;不涉及太多基础&#xff0c;适用于有一定编程基础的参考回忆。 这一篇笔记来源于下面哔哩哔哩up主的视频&#xff1a; 一…

Python + 查看个人下载次数小工具 - 记录

目录 前言 一、演示 二、流程简述 1.CSDN网站自动登入 2.登入查询接口网站获取网页数据 3.处理HTML数据 4.完整业务执行程序 三、主程序 四、UI程序 前言 为了方便查看个人资源下载的数据&#xff0c;通过selenium控制浏览器 HTML网页源代码数据获取 数据分析 三个…

服务器虚拟化全面教程:从入门到实践

服务器虚拟化全面教程&#xff1a;从入门到实践 引言 在现代 IT 基础设施中&#xff0c;服务器虚拟化已成为一种不可或缺的技术。它不仅能够提高资源利用率&#xff0c;还能降低硬件成本&#xff0c;优化管理流程。本文将深入探讨服务器虚拟化的概念、技术、应用场景及其实现…

【ECMAScript标准】深入理解ES2023的新特性与应用

&#x1f9d1;‍&#x1f4bc; 一名茫茫大海中沉浮的小小程序员&#x1f36c; &#x1f449; 你的一键四连 (关注 点赞收藏评论)是我更新的最大动力❤️&#xff01; &#x1f4d1; 目录 &#x1f53d; 前言1️⃣ ECMAScript的演变与重要性2️⃣ ES2023的主要新特性概述3️⃣ 记…

[Ansible实践笔记]自动化运维工具Ansible(一):初探ansibleansible的点对点模式

文章目录 Ansible介绍核心组件任务执行方式 实验前的准备更新拓展安装包仓库在ansible主机上配置ip与主机名的对应关系生成密钥对将公钥发送到被管理端&#xff0c;实现免密登录测试一下是否实现免密登录 常用工具ansibleansible—docansible—playbook 主要配置文件 Ansible 模…

安装Maven配置以及构建Maven项目(2023idea)

一、下载Maven绿色软件 地址&#xff1a;http://maven.apache.org/download.cgi 尽量不要选择最高版本的安装&#xff0c;高版本意味着高风险的不兼容问题&#xff0c;选择低版本后续问题就少。你也可以选择尝试。 压缩后&#xff1a; 打开后&#xff1a; 在该目录下新建mvn-…

【算法练习】最小生成树

题意&#xff1a;【模板】最小生成树 方法1&#xff1a;Prim算法(稠密边用优&#xff09; #include <bits/stdc.h> using namespace std; int n,m,u,v,d,ans; bool f[5001]; vector<pair<int,int>> a[5001];//用结构体和重载比直接定义小根堆似乎还快一点点…

局部变量和全局变量(Python)

引入例子拆解 源码 class A:def __init__(self):self.test 0def add(c, k):c.test c.test 1k k 1def main():Count A()k 0for i in range(0, 25):add(Count, k)print("Count.test", Count.test)print("k", k)main() 运行结果如下图 代码解析 这…

使用语音模块的开发智能家居产品(使用雷龙LSYT201B 语音模块)

在这篇博客中&#xff0c;我们将探讨如何使用 LSYT201B 语音模块 进行智能设备的语音交互开发。通过这个模块&#xff0c;我们可以实现智能设备的语音识别和控制功能&#xff0c;为用户带来更为便捷和现代的交互体验。 1. 语音模块介绍 LSYT201B 是一个基于“芯片算法”的语音…

GS-SLAM Dense Visual SLAM with 3D Gaussian Splatt 论文阅读

项目主页 2024 CVPR (highlight) https://gs-slam.github.io/ 摘要 本文提出了一种基于3D Gaussian Splatting方法的视觉同步定位与地图构建方法。 与最近采用神经隐式表达的SLAM方法相比&#xff0c;本文的方法利用实时可微分泼溅渲染管道&#xff0c;显著加速了地图优化和…

一天工作量压缩成半天!5个ChatGPT高效工作法则!

在信息爆炸的时代&#xff0c;高效的生活方式成为了许多人的追求。如何利用科技手段提升效率&#xff0c;成为了一个热门话题。ChatGPT&#xff0c;作为一款强大的语言模型&#xff0c;为我们提供了全新的解决方案。本文将深入探讨如何利用 ChatGPT 改变你的生活&#xff0c;助…

【SSM详细教程】-13-SpringMVC详解

精品专题&#xff1a; 01.《C语言从不挂科到高绩点》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12753294.html?spm1001.2014.3001.5482 02. 《SpringBoot详细教程》课程详细笔记 https://blog.csdn.net/yueyehuguang/category_12789841.html?spm1001.20…