【多模态大模型教程】在自定义数据上使用Qwen-VL多模态大模型的微调与部署指南

Qwen-VL 是阿里云研发的大规模视觉语言模型(Large Vision Language Model, LVLM)。Qwen-VL 可以以图像、文本、检测框作为输入,并以文本和检测框作为输出。

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

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

  • 多语言对话模型:天然支持英文、中文等多语言对话,端到端支持图片里中英双语的长文本识别;

  • 多图交错对话:支持多图输入和比较,指定图片问答,多图文学创作等;

  • 开放域目标定位:通过中文开放域语言表达进行检测框标注;

  • 细粒度识别和理解:448分辨率可以提升细粒度的文字识别、文档问答和检测框标注。

2. 硬件配置及部署要求

微调训练的显存占用及速度如下(BS=1),可根据显存大小调整Sequence Length参数

MethodSpeed (512 Sequence Length)Mermory (512 Sequence Length)
LoRA (Base)2.4s/it37.3GB
LoRA (Chat)2.3s/it23.6GB
Q-LoRA4.5s/it17.2GB

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

QuantizationSpeed (2048 tokens)Mermory (2048 tokens)
BF1628.8722.60GB
Int437.7911.82GB
  • A100、H100、RTX3060、RTX3070等显卡建议启用bf16精度以节省显存

  • V100、P100、T4等显卡建议启用fp16精度以节省显存

  • 使用CPU进行推理,需要约32GB内存,默认GPU进行推理,需要约24GB显存

软件环境配置

$ curl -O https://repo.anaconda.com/archive/Anaconda3-2019.03-Linux-x86_64.sh   // 从官网下载安装脚本  
$ bash Anaconda3-2019.03-Linux-x86_64.sh           // 阅读协议确认安装,安装完成后再输入yes以便不需要手动将Anaconda添加到PATH  
$ 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及以上

3. 快速使用及模型下载地址

利用 ModelScope 和 Transformers 快速使用 Qwen-VL 和 Qwen-VL-Chat。

安装相关的依赖库

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

2. 各模型文件的下载

建议先从 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)

也可手动下载,下载地址如下:

  • HuggingFace的全精度版本:https://huggingface.co/Qwen/Qwen-VL-Chat

  • HuggingFace的INT4量化版本:https://huggingface.co/Qwen/Qwen-VL-Chat-Int4

  • ModelScope的全精度版本:https://modelscope.cn/models/qwen/Qwen-VL-Chat

3. Qwen-VL-chat 推理使用

第一种通过网页端Web UI使用:

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

第二种通过代码使用:

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>

4. 自定义数据微调

提供了finetune.py这个脚本供用户实现在自己的数据上进行微调的功能,以接入下游任务。此外还提供了shell脚本减少用户的工作量。这个脚本支持 DeepSpeed 和 FSDP 。

4.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": "第一张图片是重庆的城市天际线,第二张图片是北京的天际线。"  
      }  
    ]  
  }  
]

对数据格式的解释:

  • 为针对多样的VL任务,增加了一下的特殊tokens: <img> </img> <ref> </ref> <box> </box>.

  • 对于带图像输入的内容可表示为 Picture id: <img>img_path</img>\n{your prompt},其中id表示对话中的第几张图片。"img_path"可以是本地的图片或网络地址。

  • 对话中的检测框可以表示为<box>(x1,y1),(x2,y2)</box>,其中 (x1, y1)(x2, y2)分别对应左上角和右下角的坐标,并且被归一化到[0, 1000)的范围内. 检测框对应的文本描述也可以通过<ref>text_caption</ref>表示。

4.2 对模型进行LoRA微调

微调脚本能够帮你实现:

  • 全参数微调,不支持单卡训练,且需确认机器是否支持bf16 sh finetune/finetune_ds.sh

  • LoRA

  • Q-LoRA

1. LoRA微调

使用官方项目里提供的微调脚本进行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

注意事项:

  • 需要修改脚本中的MODEL、DATA参数,将其换成实际的模型和数据地址

  • 需要修改脚本里的model_max_length参数,默认是2048,这需要27.3GB的显存

2. Q-LoRA微调,仅支持fp16

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

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

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_seriali)

觉得文章有用有价值,关注码科,一起追随AI新进展,记得右下角点个在看呀!

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

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

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

相关文章

工业物联网关为智能制造业提供哪些支撑?天拓四方

随着科技的飞速发展&#xff0c;智能制造业已成为工业领域的转型方向。在这一转变中&#xff0c;工业物联网关发挥着至关重要的作用。作为连接物理世界与数字世界的桥梁&#xff0c;工业物联网关不仅实现了设备与设备、设备与云平台之间的互联互通&#xff0c;更通过实时数据采…

Spring AOP 基于注解实现用户权限校验

主要注解 interface&#xff1a;继承了 Annotation 接口的自定义注解&#xff0c;定义注释类型。 Target&#xff1a;表示这个注解可以应用的地方&#xff0c;此处做权限校验是用在方法上的&#xff0c;所以此处的值为 Target(ElementType.METHOD) …

【docker 如何自定义镜像】

查看容器列表 首先是查看容器&#xff1a;在命令台中键入 docker ps -a 命令&#xff0c;得到如下界面。 从容器创建一个新镜像 接着&#xff0c;dockers commit 容器名 要保存成的镜像名&#xff1a;版本名&#xff08;若没有 &#xff1a;版本名 则直接默认为latest&#x…

【CVPR2021】LoFTR:基于Transformers的无探测器的局部特征匹配方法

LoFTR&#xff1a;基于Transformers的局部检测器 0. 摘要 我们提出了一种新的局部图像特征匹配方法。我们建议先在粗略级别建立像素级密集匹配&#xff0c;然后再在精细级别细化良好匹配&#xff0c;而不是按顺序进行图像特征检测、描述和匹配。与使用成本体积搜索对应关系的密…

动手学深度学习(Pytorch版)代码实践 -深度学习基础-11暂退法Dropout

11暂退法Dropout #Dropout 是一种正则化技术&#xff0c;主要用于防止过拟合&#xff0c; #通过在训练过程中随机丢弃神经元来提高模型的泛化能力。 import torch from torch import nn from d2l import torch as d2l import liliPytorch as lpdef dropout_layer(X, dropout):…

安全宣传咨询日活动向媒体投稿记住这个投稿好方法

在信息爆炸的时代,作为单位的信息宣传员,我肩负着将每一次重要活动,特别是像“安全宣传咨询日”这样的公益活动,有效传达给公众的重任。这份工作看似简单,实则充满了挑战,尤其是在我初涉此领域时,那段曲折而又难忘的投稿经历,至今记忆犹新。 初探投稿之海,遭遇重重困难 起初,我…

这些数据可被Modbus采集,你还不知道???

为什么要用Modbus采集模块 Modbus采集模块之所以被广泛使用&#xff0c;是因为它提供了标准化的通信协议&#xff0c;确保了不同设备间的兼容性。它支持多种通信方式&#xff0c;易于实现&#xff0c;并且能够适应不同的网络环境。Modbus模块能够收集和传输各种工业数据&#x…

【产品经理】订单处理6-审单方案

电商系统中订单管理员会对特殊类型的订单进行审核&#xff0c;普通订单则自动审核&#xff0c;本节讲述自动审单方案、手动审单以及加急审单。 一、自动审单 自动审单方案可按照方案形式制定&#xff0c;可一次性制定多套审单方案。 1. 审单通过条件有 执行店铺&#xff…

大模型的分类:探索多样化的人工智能模型

随着人工智能技术的飞速发展&#xff0c;大型预训练模型&#xff08;以下简称“大模型”&#xff09;已经在自然语言处理、计算机视觉、语音识别等多个领域取得了显著的成果。这些模型通过在海量数据上进行预训练&#xff0c;能够捕捉到丰富的特征信息&#xff0c;为各种下游任…

Linux操作系统学习:day03

内容来自&#xff1a;Linux介绍 视频推荐&#xff1a;[Linux基础入门教程-linux命令-vim-gcc/g -动态库/静态库 -makefile-gdb调试]( 目录 day0317、创建删除目录创建目录删除目录 18、文件的拷贝19、mv 命令20、查看文件内容的相关命令21、给文件创建软连接或硬链接 day03 …

MFC绘制哆啦A梦

OnPaint绘制代码 CPaintDC dc(this); // 用于绘画的设备上下文CRect rc;GetWindowRect(rc);int cxClient rc.Width();int cyClient rc.Height();// 辅助线HPEN hPen CreatePen(PS_DOT, 1, RGB(192, 192, 192));HPEN hOldPen (HPEN)SelectObject(dc, hPen);MoveToEx(dc, cxC…

使用Vue中的<TransitionGroup/>进入动画不生效不显示问题

Vue中有两个过渡动画组件分别是&#xff1a;<TransitionGroup/> <TransitionGroup/>进入动画不生效不显示问题 &#xff0c;在渲染列表上加上v-if&#xff0c;看代码&#xff0c;让他每次渲染都重新渲染 加上v-if即可 <template> <TransitionGroup nam…

Perforce静态代码分析专家解读MISRA C++:2023®新标准:如何安全、高效地使用基于范围的for循环,防范未定义行为

MISRA C&#xff1a;2023——MISRA C 标准的下一个版本来了&#xff01;为了帮助您了解 MISRA C&#xff1a;2023相比于之前版本的变化&#xff0c;我们将继续为您带来Perforce首席技术支持工程师Frank van den Beuken博士的博客系列&#xff0c;本期为第三篇。 在前两篇系列文…

和服务器建立联系——6.10山大软院项目实训1

下面介绍我如何在自己的项目中&#xff0c;根据aigc组的接口&#xff08;如下图&#xff09;&#xff0c;在Unity中和服务器建立联系并发出接受请求的&#xff1a; 这是一个通过HTTP POST方法调用的接口&#xff0c;需要发送JSON格式的数据。在Unity中实现这样的功能&#xff0…

文字炫酷祝福 含魔法代码

效果下图&#xff1a;&#xff08;可自定义显示内容&#xff09; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initi…

SpringBoot + Maven 项目的创建

文章目录 1、Maven2、SpringBoot3、二者之间的联系4、项目的创建 在创建项目之前&#xff0c;肯定要知道他们之间的区别 1、Maven maven是一个跨平台的项目管理工具。它是Apache的一个开源项目&#xff0c;主要服务于基于Java平台的项目构建、依赖管理和项目信息管理。 比如说…

QT day04

一、思维导图 二、登录界面优化 代码&#xff1a; 界面&#xff1a; *{background-color: rgb(255, 255, 255); }QFrame#frame{border-image: url(:/Logo/shanChuan.jpg);border-radius:15px; }#frame_2{background-color: rgba(110, 110, 110, 120);border-radius:15px; }Q…

线代的学习(矩阵)

1.矩阵的乘法 矩阵实现满足&#xff1a;内标相等 矩阵相乘之后的结果&#xff1a;前行后列 需要注意&#xff1a;1.矩阵的乘法不具有交换律&#xff1a;AB!BA 2.矩阵的乘法满足分配律&#xff1a;A(BC) AB AC 抽象逆矩阵求逆矩阵 方法1.凑定义法、 方法2.长除法 数字型矩阵…

一文弄懂 Python os.walk(),轻松搞定文件处理和目录遍历

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ Python os 模块的 walk() 方法以自顶向下或自底向上的方式遍历指定的目录树&#xff0c;从而显示目录树中的文件名。对于目录树中的每个目录&#xff0c;os.walk() 方法都会产生一个包含目录路径、当前…

vue3第四十节(pinia的用法注意事项解构store)

pinia 主要包括以下五部分&#xff0c;经常用到的是 store、state、getters、actions 以下使用说明&#xff0c;注意事项&#xff0c;仅限于 vue3 setup 语法糖中使用&#xff0c;若使用选项式 API 请直接查看官方文档&#xff1a; 一、前言&#xff1a; pinia 是为了探索 vu…