AI多模态教程:Qwen-VL多模态大模型实践指南

news2025/2/25 3:25:38

一、模型介绍

Qwen-VL,由阿里云研发的大规模视觉语言模型(Large Vision Language Model, LVLM),代表了人工智能领域的一个重大突破。该模型具有处理和关联图像、文本、检测框等多种类型数据的能力,其输出形式同样多样,包括文本和检测框。这种多功能性使得Qwen-VL在众多应用场景中展现出巨大的潜力。

Qwen-VL的核心能力在于其强大的视觉理解和语言生成能力。通过深度学习技术,该模型能够识别和理解图像中的内容,包括物体、场景和活动。同时,它还能生成描述性的文本,对图像中的信息进行解释和总结。这种跨模态的理解和生成能力,使得Qwen-VL在图像描述、视觉问答、图像编辑等任务中表现出色。

此外,Qwen-VL还具备检测框作为输入和输出的能力。这意味着它不仅能识别图像中的物体,还能精确定位它们的位置。在输出方面,Qwen-VL可以生成包含物体位置信息的检测框,这对于需要进行物体识别和定位的应用场景尤为重要。

Qwen-VL-Chat = 大语言模型(Qwen-7B) + 视觉图片特征编码器(Openclip ViT-bigG) + 位置感知视觉语言适配器(可训练Adapter)+ 1.5B的图文数据 + 多轮训练 + 对齐机制(Chat)

Qwen-VL 系列模型的特点包括:

  1. 多语言对话模型:天然支持英文、中文等多语言对话,端到端支持图片里中英双语的长文本识别;
  2. 多图交错对话:支持多图输入和比较,指定图片问答,多图文学创作等;
  3. 开放域目标定位:通过中文开放域语言表达进行检测框标注;
  4. 细粒度识别和理解:448分辨率可以提升细粒度的文字识别、文档问答和检测框标注。

二、硬件配置

微调训练,作为一种机器学习技术,通常用于调整和优化预训练模型,以适应特定任务或数据集。在微调训练过程中,显存占用和速度是两个关键的性能指标,它们直接影响到训练的效率和可行性。

显存占用主要受批量大小(Batch Size, BS)和序列长度(Sequence Length)的影响。批量大小决定了每次训练中处理的数据量,而序列长度则影响了模型处理每个数据点时的复杂度。当批量大小为1时,意味着每次训练只处理一个数据点,这在显存有限的情况下是一种常见的选择,因为它可以显著降低显存需求。

推理阶段的显存占用及速度如下:

在使用不同的显卡进行深度学习模型训练或推理时,选择合适的数值精度是一个重要的优化策略。不同的数值精度不仅影响模型的性能和准确性,还会直接影响显存的使用效率。

对于A100、H100、RTX3060、RTX3070等高性能显卡,建议启用bf16(Brain Floating Point)精度。bf16是一种16位浮点格式,它在保持较高精度的同时,相比传统的32位浮点数(fp32)可以显著节省显存。bf16精度特别适合用于深度学习模型,因为它在保持大部分精度的同时,减少了模型的大小,从而降低了显存占用。这对于训练大型模型或处理大量数据尤为重要。

而对于V100、P100、T4等较旧的显卡,由于它们可能不支持bf16精度,建议启用fp16(16位浮点)精度。fp16精度同样可以显著减少显存使用,虽然它的数值范围比bf16小,但在许多情况下仍然可以保持模型的性能。

当使用CPU进行推理时,由于CPU的内存管理方式与GPU不同,通常需要更多的内存来存储和处理数据。因此,建议至少有32GB的内存来确保推理过程的顺利进行。相比之下,使用GPU进行推理时,由于GPU的显存管理更为高效,通常需要约24GB的显存即可满足需求。

三、环境安装

Python虚拟环境:

https://repo.anaconda.com/archive/Anaconda3-2019.03-Linux-x86_64.sh   // 从官网下载安装脚本
$ bash Anaconda3-2019.03-Linux-x86_64.sh           // 阅读协议确认安装,安装完成后再输入yes以便不需
$ conda create -n qwen_vl python=3.10            // 安装虚拟环境, python 3.10及以上版本
$ conda activate qwen_vl                         // 激活虚拟环境
$ conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=11.8 -c pytorch -c nvidia // pytorch 2.0及以上版本, 建议使用CUDA 11.4及以上

依赖包:

git clone https://github.com/QwenLM/Qwen-VL.git
cd Qwen-VL/
pip3 install -r requirements.txt
pip3 install -r requirements_openai_api.txt
pip3 install -r requirements_web_demo.txt
pip3 install deepspeed
pip3 install peft
pip3 install optimum
pip3 install auto-gptq
pip3 install modelscope -U

建议先从 ModelScope 下载模型及代码至本地,再从本地加载模型:

from modelscope import snapshot_download
from transformers import AutoModelForCausalLM, AutoTokenizer

# 其中版本v1.1.0支持INT4、INT8的在线量化,其余版本不支持
model_id = 'qwen/Qwen-VL-Chat'

revision = 'v1.0.0' 

# 下载模型到指定目录
local_dir = "/root/autodl-tmp/Qwen-VL-Chat"

snapshot_download(repo_id=model_id, revision=revision, local_dir=local_dir)

四、快速使用

Qwen-VL-chat :

① 代码调用方式

from transformers import AutoModelForCausalLM, AutoTokenizer
from transformers.generation import GenerationConfig
import torch
torch.manual_seed(1234)

# 请注意:根据显存选择配置,分词器默认行为已更改为默认关闭特殊token攻击防护。
tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen-VL-Chat", trust_remote_code=True)

model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen-VL-Chat", device_map="auto", trust_remote_code=True, bf16=True, fp16=Flase).eval()

# 第一轮对话
query = tokenizer.from_list_format([
    {'image': 'https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg'}, # Either a local path or an url
    {'text': '这是什么?'},
])
response, history = model.chat(tokenizer, query=query, history=None)
print(response)
# 图中是一名女子在沙滩上和狗玩耍,旁边是一只拉布拉多犬,它们处于沙滩上。

# 第二轮对话
response, history = model.chat(tokenizer, '框出图中击掌的位置', history=history)
print(response)
# <ref>击掌</ref><box>(536,509),(588,602)</box>

② WebUI调用方式

# 启动命令,局域网访问
python web_demo_mm.py --server-name 0.0.0.0

、自定义数据集微调

提供finetune.py脚本和shell脚本的目的是为了简化用户在自有数据上微调预训练模型的过程,同时支持DeepSpeed和FSDP(Fully Sharded Data Parallel)两种优化技术,以提高训练效率和可扩展性。

finetune.py脚本的功能和特点:

  1. 微调功能:finetune.py脚本允许用户在自己的数据集上对预训练模型进行微调。微调是一种常见的做法,通过在特定任务上调整预训练模型的参数,可以提高模型在该任务上的性能。
  2. 易于接入下游任务:脚本设计为模块化,使得用户可以轻松地将微调后的模型集成到各种下游任务中,如文本分类、情感分析、问答系统等。
  3. 支持DeepSpeed和FSDP:DeepSpeed和FSDP是两种先进的优化技术,用于加速大型模型的训练。DeepSpeed提供了一系列优化策略,如模型并行、管道并行和ZeRO优化器等。FSDP则是一种数据并行策略,通过完全分片来减少每个GPU上的显存占用。这些技术的支持使得finetune.py脚本能够处理更大的模型和数据集。

(1) 自定义数据集准备:

需要将所有样本数据放到一个列表中并存入JSON文件中。每个样本对应一个字典,包含id和conversation,其中后者为一个列表。示例如下所示:

[
  {
    "id": "identity_0",
    "conversations": [
      {
        "from": "user",
        "value": "你好"
      },
      {
        "from": "assistant",
        "value": "我是Qwen-VL,一个支持视觉输入的大模型。"
      }
    ]
  },
  {
    "id": "identity_1",
    "conversations": [
      {
        "from": "user",
        "value": "Picture 1: <img>https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg</img>\n图中的狗是什么品种?"
      },
      {
        "from": "assistant",
        "value": "图中是一只拉布拉多犬。"
      },
      {
        "from": "user",
        "value": "框出图中的格子衬衫"
      },
      {
        "from": "assistant",
        "value": "<ref>格子衬衫</ref><box>(588,499),(725,789)</box>"
      }
    ]
  },
  { 
    "id": "identity_2",
    "conversations": [
      {
        "from": "user",
        "value": "Picture 1: <img>assets/mm_tutorial/Chongqing.jpeg</img>\nPicture 2: <img>assets/mm_tutorial/Beijing.jpeg</img>\n图中都是哪"
      },
      {
        "from": "assistant",
        "value": "第一张图片是重庆的城市天际线,第二张图片是北京的天际线。"
      }
    ]
  }
]

格式解释:

  1. 为针对多样的VL任务,增加了一下的特殊tokens: <img> </img> <ref> </ref> <box> </box>.
  2. 对于带图像输入的内容可表示为 Picture id: <img>img_path</img>\n{your prompt},其中id表示对话中的第几张图片。"img_path"可以是本地的图片或网络地址。
  3. 对话中的检测框可以表示为<box>(x1,y1),(x2,y2)</box>,其中 (x1, y1) 和(x2, y2)分别对应左上角和右下角的坐标,并且被归一化到[0, 1000)的范围内. 检测框对应的文本描述也可以通过<ref>text_caption</ref>表示。
  4. 准备好数据后,你可以使用我们提供的shell脚本实现微调。注意,你需要在脚本中指定你的数据的路径。

(2) 模型微调方式

Qwen-VL支持以下微调方式:全参数微调、LoRA、Q-LoRA

① 全参数微调

默认下全参数微调在训练过程中更新LLM所有参数。实验中,在微调阶段不更新ViT的参数会取得更好的表现。全参数微调,不支持单卡训练,且需确认机器是否支持bf16。运行下面脚本开始训练:

# 分布式训练。由于显存限制将导致单卡训练失败,我们不提供单卡训练脚本。
sh finetune/finetune_ds.sh

② LoRA微调

与全参数微调不同,LoRA (论文) 只更新adapter层的参数而无需更新原有语言模型的参数。这种方法允许用户用更低的显存开销来训练模型,也意味着更小的计算开销。

使用官方项目里提供的微调脚本进行LoRA微调测试,模型采用HuggingFace下载的那个全精度模型,数据采用上面的示例数据,建议模型路径使用绝对路径,如果你想节省显存占用,可以考虑使用chat模型进行LoRA微调,显存占用将大幅度降低。

# 单卡训练
sh finetune/finetune_lora_single_gpu.sh
# 分布式训练
sh finetune/finetune_lora_ds.sh

#!/bin/bash

export CUDA_DEVICE_MAX_CONNECTIONS=1
DIR=`pwd`

MODEL="/root/autodl-tmp/Qwen-VL-Chat"
DATA="/root/autodl-tmp/data.json"

export CUDA_VISIBLE_DEVICES=0

python3 finetune.py \
    --model_name_or_path $MODEL \
    --data_path $DATA \
    --bf16 True \
    --fix_vit True \
    --output_dir output_qwen \
    --num_train_epochs 5 \
    --per_device_train_batch_size 1 \
    --per_device_eval_batch_size 1 \
    --gradient_accumulation_steps 8 \
    --evaluation_strategy "no" \
    --save_strategy "steps" \
    --save_steps 1000 \
    --save_total_limit 10 \
    --learning_rate 1e-5 \
    --weight_decay 0.1 \
    --adam_beta2 0.95 \
    --warmup_ratio 0.01 \
    --lr_scheduler_type "cosine" \
    --logging_steps 1 \
    --report_to "none" \
    --model_max_length 600 \
    --lazy_preprocess True \
    --gradient_checkpointing \
    --use_lora

注意事项:

  1. 需要修改脚本中的MODEL、DATA参数,将其换成实际的模型和数据地址
  2. 需要修改脚本里的model_max_length参数,默认是2048,这需要27.3GB的显存

③ Q-LoRA微调

如果你依然遇到显存不足的问题,可以考虑使用Q-LoRA (论文)。该方法使用4比特量化模型以及paged attention等技术实现更小的显存开销,仅支持fp16。运行Q-LoRA你只需运行如下脚本:

# 单卡训练
sh finetune/finetune_qlora_single_gpu.sh
# 分布式训练
sh finetune/finetune_qlora_ds.sh

建议使用官方提供的Int4量化模型进行训练,即Qwen-VL-Chat-Int4。不要使用非量化模型!与全参数微调以及LoRA不同,Q-LoRA仅支持fp16。

(3) 模型合并

与全参数微调不同,LoRA和Q-LoRA的训练只需存储adapter部分的参数。因此需要先合并并存储模型(LoRA支持合并,Q-LoRA不支持),再用常规方式读取你的新模型:

from peft import AutoPeftModelForCausalLM

model = AutoPeftModelForCausalLM.from_pretrained(
    path_to_adapter, # path to the output directory
    device_map="auto",
    trust_remote_code=True
).eval()

merged_model = model.merge_and_unload()
# max_shard_size and safe serialization are not necessary. 
# They respectively work for sharding checkpoint and save the model to safetensors
merged_model.save_pretrained(new_model_directory, max_shard_size="2048MB", safe_serialization=True)

 推荐阅读:

《AIGCmagic星球》,五大AIGC方向正式上线!让我们在AIGC时代携手同行!限量活动
《三年面试五年模拟》版本更新白皮书,迎接AIGC时代
AIGC |「多模态模型」系列之OneChart:端到端图表理解信息提取模型
AI多模态模型架构之模态编码器:图像编码、音频编码、视频编码
AI多模态模型架构之输入投影器:LP、MLP和Cross-Attention

AI多模态模型架构之LLM主干(1):ChatGLM系列

AI多模态模型架构之LLM主干(2):Qwen系列

AI多模态教程:从0到1搭建VisualGLM图文大模型案例

智谱推出创新AI模型GLM-4-9B:国家队开源生态的新里程碑

技术交流:

加入「AIGCmagic社区」群聊,一起交流讨论,涉及 「AI视频、AI绘画、Sora技术拆解、数字人、多模态、大模型、传统深度学习、自动驾驶」等多个不同方向,可私信或添加微信号:【lzz9527288】,备注不同方向邀请入群!!

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

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

相关文章

进程控制-fork函数

一个进程&#xff0c;包括代码、数据和分配给进程的资源。 fork &#xff08;&#xff09;函数通过系统调用创建一个与原来进程几乎完全相同的进程&#xff0c;也就是两个进程可以做完全相同的事&#xff0c;但如果初始参数或者传入的变量不同&#xff0c;两个进程也可以做不同…

3101.力扣每日一题7/6 Java(接近100%解法)

博客主页&#xff1a;音符犹如代码系列专栏&#xff1a;算法练习关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 目录 思路 解题方法 时间复杂度 空间复杂度 Code 思路 主要是基于对…

WPF中Background=“{x:Null}“ 和 Transparent

WPF中关于背景透明和背景无 此时&#xff0c;我代码中是写的有有个控件&#xff0c;一个Border &#xff0c;一个TextBox &#xff0c;范围都是全屏这么大&#xff0c;可以输入TextBox 因为&#xff0c;当border没有设置背景的时候&#xff0c;实际上是&#xff1a; <Borde…

连锁门店如何快速联网

随着新零售业态的发展&#xff0c;连锁门店的运营模式逐渐转为数字化运营&#xff0c;新增了诸如收银PoS、扫码枪、摄像头等数字化终端。这些数字化的业务应用都需要依托稳定可靠的网络才能正常运转&#xff0c;在这样的背景下&#xff0c;连锁门店对网络连接的需求显得尤为关键…

【HICE】转发服务器实验

1.在本地主机上操作 2.在客户端操作设置主机的IP地址为dns 3.测试,客户机是否能ping通

机器学习——无监督学习(k-means算法)

1、K-Means聚类算法 K表示超参数个数&#xff0c;如分成几个类别&#xff0c;K值就取多少。若无需求&#xff0c;可使用网格搜索找到最佳的K。 步骤&#xff1a; 1、随机设置K个特征空间内的点作为初始聚类中心&#xff1b; 2、对于其他每个点计算到K个中心的距离&#xff0c;…

【云计算】公有云、私有云、混合云、社区云、多云

公有云、私有云、混合云、社区云、多云 1.云计算的形态1.1 公有云1.2 私有云1.3 混合云1.4 社区云1.5 多云1.5.1 多云和混合云之间的关系1.5.2 多云的用途1.5.3 影子 IT 和多云1.5.4 优缺点 2.不同云形态的对比 1.云计算的形态 张三⾃⼰在家做饭吃&#xff0c;这是 私有云&…

免费去马赛克软件,亲测支持视频和图片,这AI功能逆天了!

有小伙伴私信问阿星有什么去除马赛克的免费软件&#xff0c;求推荐好用的去马赛克软件。 市面上去马赛克的软件多如牛毛&#xff0c;但真正好用的真不多&#xff0c;而免费的是更少。今天阿星就分享一款 AI智能去马赛克软件&#xff0c;免费使用。软件支持去除图片和视频的马赛…

【web前端HTML+CSS+JS】--- HTML学习笔记01

学习链接&#xff1a;黑马程序员pink老师前端入门教程&#xff0c;零基础必看的h5(html5)css3移动端前端视频教程_哔哩哔哩_bilibili 学习文档&#xff1a; Web 开发技术 | MDN (mozilla.org) 一、前后端工作流程 WEB模型&#xff1a;前端用于采集和展示信息&#xff0c;中…

Windows上Docker的安装与初体验

Docker Desktop下载地址 国内下载地址 一、基本使用 1. 运行官方体验镜像 docker run -d -p 80:80 docker/getting-started执行成功 停止体验服务 docker stop docker/getting-started删除体验镜像 docker rmi docker/getting-started2. 修改docker镜像的存储位置 3. …

【扩散模型】LCM LoRA:一个通用的Stable Diffusion加速模块

潜在一致性模型&#xff1a;[2310.04378] Latent Consistency Models: Synthesizing High-Resolution Images with Few-Step Inference (arxiv.org) 原文&#xff1a;Paper page - Latent Consistency Models: Synthesizing High-Resolution Images with Few-Step Inference (…

IDEA安装IDE Eval Reset插件,30天自动续期,无限激活

第一步&#xff1a; 下载idea 注意&#xff1a;版本要是2021.2.2以下 第二步&#xff1a;快捷键CtrlAlts打开设置 第三步&#xff1a;打开下图中蓝色按钮 第四步&#xff1a;点击弹窗的 “” &#xff0c;并输入 plugins.zhile.io 点击 “ok” 第五步&#xff1a;搜索IDE Ea…

强化学习编程实战-1-一个及其简单的强化学习实例(多臂赌博机)

1.1 多臂赌博机 一台拥有K个臂的机器&#xff0c;玩家每次可以摇动K个臂中的一个&#xff0c;摇动后&#xff0c;会吐出数量不等的金币&#xff0c;吐出金币的数量服从一定的概率分布&#xff0c;而且不同臂的概率分布不同。 多臂赌博机的问题是&#xff1a;假设玩家共有N次摇地…

2024上半年网络工程师考试《应用技术》试题二

试题二(20分) 阅读以下说明,回答问题,将解答填入对应的解答栏内。 某单位网络拓扑如下图所示.SW1、SW2为核心层交换机&#xff0c;PC网关配置在核心层&#xff0c;SW3-SW4为接入层交换机,行政部PC划为vlan10,销售部PC划为vlan20。 【问题1】(4分) 要求实现骨干链路冗余&…

golang线程池ants-实现架构

1、总体架构 ants协程池&#xff0c;在使用上有多种方式(使用方式参考这篇文章&#xff1a;golang线程池ants-四种使用方法)&#xff0c;但是在实现的核心就一个&#xff0c;如下架构图&#xff1a; 总的来说&#xff0c;就是三个数据结构&#xff1a; Pool、WorkerStack、goW…

Matplotlib Artist Axes

在简介里介绍了很多了&#xff0c;这里补充一点 Axes包含一个属性patch&#xff0c;是Axes对应的方框&#xff0c;可以用来设置Axes的相关属性 ax fig.add_subplot() rect ax.patch # a Rectangle instance rect.set_facecolor(green) Axes有以下方法 Axes helper metho…

五、保存数据到Excel、sqlite(爬虫及数据可视化)

五、保存数据到Excel、sqlite&#xff08;爬虫及数据可视化&#xff09; 1&#xff0c;保存数据到excel1.1 保存九九乘法表到excel&#xff08;1&#xff09;代码testXwlt.py&#xff08;2&#xff09;excel保存结果 1.2 爬取电影详情并保存到excel&#xff08;1&#xff09;代…

Java之网络面试经典题(一)

目录 ​编辑 一.Session和cookie Cookie Session 二.HTTP和HTTPS的区别 三.浅谈HTTPS为什么是安全的&#xff1f; 四.TCP和UDP 五.GET和Post的区别 六.forward 和 redirect 的区别&#xff1f; 本专栏全是博主自己收集的面试题&#xff0c;仅可参考&#xff0c;不能相…

数字信号处理及MATLAB仿真(3)——采样与量化

今天写主要来编的程序就是咱们AD变换的两个步骤。一个是采样&#xff0c;还有一个是量化。大家可以先看看&#xff0c;这一过程当中的信号是如何变化的。信号的变换图如下。 先说说采样&#xff0c;采样是将连续时间信号转换为离散时间信号的过程。在采样过程中&#xff0c;连续…

工作两年后,我如何看待设计模式

在软件工程中&#xff0c;设计模式是经过反复验证的最佳实践&#xff0c;用于解决在软件设计中经常遇到的一类问题。它们为开发者提供了一种通用的解决方案和语言&#xff0c;使得复杂的编程问题得以简化&#xff0c;代码结构更加清晰&#xff0c;可维护性大大提高。简而言之&a…