多模态理解模型是让AI像人类一样,通过整合多维度信息(如视觉、语言、听觉等),理解数据背后的语义、情感、逻辑或场景,从而完成推理、决策等任务。
当前已经进入多模态理解大模型发展的快车道,2025年2月,最新一代的多模态理解模型Qwen2.5VL开源发布,其在多个基准测试中取得了SOTA效果,更是直接登顶司南(OpenCompass)排行榜,甚至超越国内外知名的GPT-4o和Gemini-2.0等闭源模型。
MindSpeed MM开发团队快速对Qwen2.5VL模型全系列尺寸进行适配,并将其正式开源在MindSpeed MM仓库,同时支持视图理解全参微调训练、Lora微调训练、在线推理和评测。
MindSpeed MM基于MindSpeed Core的多维并行能力实现对多模态模型的极致性能优化,更亲和昇腾硬件,致力成为昇腾开发者大集群、大参数场景多模态训练的首选,为开发者提供高效易用的开发体验。
基于MindSpeed MM的Qwen2.5VL视图理解生成体验
新一代的多模态理解模型Qwen2.5VL有强大的视图理解能力,让我们快速体验一下。
基于MindSpeed MM的Qwen2.5VL训练优化特性
多模态理解模型主要处理如文本、图像、音频、视频、传感器信号等模态数据,不同模态数据存在结构差异、特征表示异质性、融合策略多样性、训练机制复杂性等特点,Qwen2.5VL训练的性能瓶颈主要是负载不均衡问题。MindSpeed MM在使用融合算子、分布式优化器及流水调度优化等常用特性的基础上,支持多模态异构流水线并行、动态流水线并行、数据分桶负载均衡等优化加速特性,实现训练性能极致优化。
01多模态异构流水线并行,支持大规模数据的复杂多模态训练,实现负载均衡
Qwen2.5VL模型包括视觉模块、连接层以及语言模块,其中视觉模块的激活值比较大,当视觉模块放开训练或视图数据规模较大时,会导致显存占用过大甚至OOM,同时影响多卡之间的负载均衡。MindSpeed MM创新性地实现了异构流水线并行特性,支持各种模态模块的快速流水线并行适配,支撑实现更复杂场景和更大数据规模的训练微调,同时也缓解了负载不均衡的问题。
使用方式:在examples/qwen2.5vl/model_*b.json中配置vision_encoder和text_decoder中的pipeline_num_layers字段参数
02流水线并行动态shape通信支持,实现训练效率和资源利用率双提升
多模态场景中,batch内样本长度要保持一致,需将所有输入样本都扩展到统一的序列长度,而不同样本的序列长度差异较大,对于短序列的数据样本会产生大量冗余计算、增加显存占用和通信耗时。MindSpeed MM通过使用MindSpeed Core的动态shape流水线并行特性,减少过度扩展现象,有效降低冗余计算量,实现训练效率与计算资源利用率双提升,数据集序列长度差异越大,收益越大。
使用方式:在examples/qwen2.5vl/finetune_qwen2_5_vl_*b.sh的GPT_ARGS中加入--variable-seq-lengths参数。
03数据分桶负载优化,实现多卡数据计算均衡,训练效率提升10%+
多模态理解场景由于视图数据的规模不一致,不同输入数据长度差异很大,因此会导致大集群训练微调过程中,不同卡之间的计算耗时差异大,出现卡间负载不均衡问题。MindSpeed MM中通过实现全局数据分桶重排,将不同序列长度的数据重新进行划分,从而实现卡间的数据大小基本相同,保证训练数据多样性的同时训练效率提升10%+。
数据分桶负载:将数据按token数量
分配到不同的桶,训练时按桶取数据
使用方式:在examples/qwen2.5vl/data_*b.json中,修改dataloader_param下的sampler_type为"BucketBatchSampler"
快速上手,基于MindSpeed MM玩转Qwen2.5VL
环境安装
模型开发时推荐使用配套的环境版本,详见仓库中的”环境安装”
https://gitee.com/ascend/MindSpeed-MM/blob/master/examples/qwen2.5vl/README.md
仓库拉取:
git clone https://gitee.com/ascend/MindSpeed-MM.git
git clone https://github.com/NVIDIA/Megatron-LM.git
cd Megatron-LM
git checkout core_r0.8.0
cp -r megatron ../MindSpeed-MM/
cd ..
cd MindSpeed-MM
mkdir logs
mkdir data
mkdir ckpt
环境搭建:
torch npu 与 CANN包参考链接:安装包参考链接
https://gitee.com/link?target=https%3A%2F%2Fsupport.huawei.com%2Fenterprise%2Fzh%2Fascend-computing%2Fcann-pid-251168373%2Fsoftware
# python3.10
conda create -ntestpython=3.10
conda activatetest
#安装torch和torch_npu,注意要选择对应python版本、x86或arm的torch、torch_npu及apex包
#下载路径参考https://www.hiascend.com/document/detail/zh/Pytorch/60RC3/configandinstg/instg/insg_0001.html
pip install torch-2.1.0-cp310-cp310m-manylinux2014_aarch64.whl
pip install torch_npu-2.1.0*-cp310-cp310m-linux_aarch64.whl
# apex for Ascend参考https://gitee.com/ascend/apex
#建议从原仓编译安装
#安装加速库
gitclonehttps://gitee.com/ascend/MindSpeed.git
cdMindSpeed
# checkout commit from MindSpeed core_r0.8.0
git checkout 3f09d6736571cf1e30f8ac97de77982d0ab32cc5
pip install -r requirements.txt
pip3 install -e .
cd..
#替换MindSpeed中的文件
cp examples/qwen2vl/dot_product_attention.py MindSpeed/mindspeed/core/transformer/dot_product_attention.py
#安装其余依赖库
pip install -e .
#安装transformers指定版本
gitclonehttps://github.com/huggingface/transformers.git
cdtransformers
git checkout fa56dcc2a
pip install -e .
权重下载及转换
Qwen2.5VL权重下载:
模型 | Huggingface下载链接 |
3B | https://huggingface.co/Qwen/Qwen2.5-VL-3B-Instruct/tree/main |
7B | https://huggingface.co/Qwen/Qwen2.5-VL-7B-Instruct/tree/main |
32B | https://huggingface.co/Qwen/Qwen2.5-VL-32B-Instruct/tree/main |
72B | https://huggingface.co/Qwen/Qwen2.5-VL-72B-Instruct/tree/main |
权重转换:
MindSpeed MM修改了部分原始网络的结构名称,使用mm-convert工具对原始预训练权重进行转换。该工具实现了huggingface权重和MindSpeed MM权重的互相转换以及PP(Pipeline Parallel)权重的重切分。
# 3b
mm-convert Qwen2_5_VLConverter hf_to_mm
--cfg.mm_dir"ckpt/mm_path/Qwen2.5-VL-3B-Instruct"
--cfg.hf_config.hf_dir"ckpt/hf_path/Qwen2.5-VL-3B-Instruct"
--cfg.parallel_config.llm_pp_layers [36]
--cfg.parallel_config.vit_pp_layers [32]
--cfg.parallel_config.tp_size 1
# 7b
mm-convert Qwen2_5_VLConverter hf_to_mm
--cfg.mm_dir"ckpt/mm_path/Qwen2.5-VL-7B-Instruct"
--cfg.hf_config.hf_dir"ckpt/hf_path/Qwen2.5-VL-7B-Instruct"
--cfg.parallel_config.llm_pp_layers [1,10,10,7]
--cfg.parallel_config.vit_pp_layers [32,0,0,0]
--cfg.parallel_config.tp_size 1
# 32b
mm-convert Qwen2_5_VLConverter hf_to_mm
--cfg.mm_dir "ckpt/mm_path/Qwen2.5-VL-32B-Instruct"
--cfg.hf_config.hf_dir "ckpt/hf_path/Qwen2.5-VL-32B-Instruct"
--cfg.parallel_config.llm_pp_layers [4,9,9,9,9,9,9,6]
--cfg.parallel_config.vit_pp_layers [32,0,0,0,0,0,0,0]
--cfg.parallel_config.tp_size 2
# 72b
mm-convert Qwen2_5_VLConverter hf_to_mm
--cfg.mm_dir"ckpt/mm_path/Qwen2.5-VL-72B-Instruct"
--cfg.hf_config.hf_dir"ckpt/hf_path/Qwen2.5-VL-72B-Instruct"
--cfg.parallel_config.llm_pp_layers [14,23,23,20]
--cfg.parallel_config.vit_pp_layers [32,0,0,0]
--cfg.parallel_config.tp_size 8
#其中:
# mm_dir:转换后保存目录
# hf_dir: huggingface权重目录
# llm_pp_layers: llm在每个卡上切分的层数,注意要和model.json中配置的pipeline_num_layers一致
# vit_pp_layers: vit在每个卡上切分的层数,注意要和model.json中配置的pipeline_num_layers一致
# tp_size: tp并行数量,注意要和微调启动脚本中的配置一致
如果需要用转换后模型训练的话,同步修改
examples/qwen2.5vl/finetune_qwen2_5_vl_7b.sh中的LOAD_PATH参数,该路径为转换后或者切分后的权重,注意与原始权重ckpt/hf_path/Qwen2.5-VL-7B-Instruct进行区分。
LOAD_PATH="ckpt/mm_path/Qwen2.5-VL-7B-Instruct"
【数据集准备及处理】
数据集下载(以coco2017数据集为例):
(1)用户需要自行下载COCO2017数据集,并解压到项目目录下的./data/COCO2017文件夹中
下载链接:https://gitee.com/link?target=https%3A%2F%2Fcocodataset.org%2F%23download
(2)获取图片数据集的描述文件(LLaVA-Instruct-150K),下载至./data/路径下;
https://gitee.com/link?target=https%3A%2F%2Fhuggingface.co%2Fdatasets%2Fliuhaotian%2FLLaVA-Instruct-150K%2Ftree%2Fmain
(3)在./data路径下新建文件mllm_format_llava_instruct_data.json,运行数据转换脚本python examples/qwen2vl/llava_instruct_2_mllm_demo_format.py;
$playground
├── data
├── COCO2017
├── train2017
├── llava_instruct_150k.json
├── mllm_format_llava_instruct_data.json
...
当前支持读取多个以,(注意不要加空格)分隔的数据集,配置方式为data.json中 dataset_param->basic_parameters->dataset 从"./data/mllm_format_llava_instruct_data.json"修改为"./data/mllm_format_llava_instruct_data.json,./data/mllm_format_llava_instruct_data2.json"
同时注意data.json中dataset_param->basic_parameters->max_samples的配置,会限制数据只读max_samples条,这样可以快速验证功能。如果正式训练时,可以把该参数去掉则读取全部的数据。
纯文本或有图无图混合训练数据(以LLaVA-Instruct-150K为例):
现在本框架已经支持纯文本/混合数据(有图像和无图像数据混合训练)。在数据构造时,对于包含图片的数据,需要保留image这个键值。
{
"id": your_id,
"image": your_image_path,
"conversations": [
{"from":"human","value": your_query},
{"from":"gpt","value": your_response},
],
}
在数据构造时,对于纯文本数据,可以去除image这个键值。
{
"id": your_id,
"conversations": [
{"from":"human","value": your_query},
{"from":"gpt","value": your_response},
],
}
【微调】
1. 准备工作
配置脚本前需要完成前置准备工作,包括:环境安装、权重下载及转换、数据集准备及处理,详情可查看对应章节。
2. 配置参数
数据目录配置:
根据实际情况修改data.json中的数据集路径,包括model_name_or_path、dataset_dir、dataset等字段。
以Qwen2.5VL-7B为例,data.json进行以下修改,注意model_name_or_path的权重路径为转换前的权重路径。
注意cache_dir在多机上不要配置同一个挂载目录避免写入同一个文件导致冲突。
{
"dataset_param": {
"dataset_type": "huggingface",
"preprocess_parameters": {
"model_name_or_path": "./ckpt/hf_path/Qwen2.5-VL-7B-Instruct",
...
},
"basic_parameters": {
...
"dataset_dir": "./data",
"dataset": "./data/mllm_format_llava_instruct_data.json",
"cache_dir": "./data/cache_dir",
...
},
...
},
...
}
}
模型保存加载及日志信息配置:
根据实际情况配置examples/qwen2.5vl/finetune_qwen2_5_vl_7b.sh的参数,包括加载、保存路径以及保存间隔--save-interval(注意:分布式优化器保存文件较大耗时较长,请谨慎设置保存间隔)
...
#加载路径
LOAD_PATH="ckpt/mm_path/Qwen2.5-VL-7B-Instruct"
#保存路径
SAVE_PATH="save_dir"
...
GPT_ARGS="
...
--no-load-optim #不加载优化器状态,若需加载请移除
--no-load-rng #不加载随机数状态,若需加载请移除
--no-save-optim #不保存优化器状态,若需保存请移除
--no-save-rng #不保存随机数状态,若需保存请移除
...
"
...
OUTPUT_ARGS="
--log-interval 1 #日志间隔
--save-interval 5000 #保存间隔
...
--log-tps #增加此参数可使能在训练中打印每步语言模块的平均序列长度,并在训练结束后计算每秒吞吐tokens量。
"
若需要加载指定迭代次数的权重、优化器等状态,需将加载路径LOAD_PATH设置为保存文件夹路径LOAD_PATH="save_dir",并修改latest_checkpointed_iteration.txt文件内容为指定迭代次数 (此功能coming soon)
$save_dir
├── latest_checkpointed_iteration.txt
├── ...
单机运行配置:
配置examples/qwen2.5vl/finetune_qwen2_5_vl_7b.sh参数如下
#根据实际情况修改 ascend-toolkit 路径
source /usr/local/Ascend/ascend-toolkit/set_env.sh
NPUS_PER_NODE=8
MASTER_ADDR=locahost
MASTER_PORT=29501
NNODES=1
NODE_RANK=0
WORLD_SIZE=$(($NPUS_PER_NODE * $NNODES))
注意,当开启PP时,model.json中配置的vision_encoder和text_decoder的pipeline_num_layer参数控制了各自的PP切分策略。对于流水线并行,要先处理vision_encoder再处理text_decoder。 比如7b默认的值[32,0,0,0]、[1,10,10,7],其含义为PP域内第一张卡先放32层vision_encoder再放1层text_decoder、第二张卡放text_decoder接着的10层、第三张卡放text_decoder接着的10层、第四张卡放text_decoder接着的7层,vision_encoder没有放完时不能先放text_decoder(比如[30,2,0,0]、[1,10,10,7]的配置是错的)。
同时注意,如果某张卡上的参数全部冻结时会导致没有梯度(比如vision_encoder冻结时PP配置[30,2,0,0]、[0,11,10,7]),需要在finetune_qwen2_5_vl_7b.sh中GPT_ARGS参数中增加--enable-dummy-optimizer,
3. 启动微调
以Qwen2.5VL-7B为例,启动微调训练任务。
bash examples/qwen2.5vl/finetune_qwen2_5_vl_7b.sh
【性能实测:昇腾硬件加速提升性能】
备注:Samples per Second 为 (SPS)
模型尺寸 | 任务类型 | 训练规模(A2) | 混精类型 | 性能 |
3B | 微调 | 单机8卡 | bf16 | 23.771(SPS) |
7B | 微调 | 单机8卡 | bf16 | 14.204(SPS) |
32B | 微调 | 双机16卡 | bf16 | 6.755(SPS) |
72B | 微调 | 4机32卡 | bf16 | 4.669(SPS) |
【更多参数见MindSpeed MM仓库】
准备工作和参数说明见MindSpeed MM开源代码仓链接:
https://gitee.com/ascend/MindSpeed-MM/tree/master/examples/qwen2.5vl
结语
MindSpeed MM是面向大规模分布式训练的昇腾多模态大模型套件,同时支持多模态生成及多模态理解,旨在为华为昇腾芯片提供端到端的多模态训练解决方案, 包含预置业界主流模型,数据工程,分布式训练及加速,预训练、微调、在线推理任务等特性。
MindSpeed MM即将上线更加丰富的支持Qwen2.5VL模型的特性,敬请期待。
-
AI
+关注
关注
88文章
35476浏览量
281235 -
开源
+关注
关注
3文章
3754浏览量
43968 -
模型
+关注
关注
1文章
3531浏览量
50566 -
Mindspeed
+关注
关注
1文章
15浏览量
9266
原文标题:多模态理解SOTA模型开箱即用,MindSpeed MM支持Qwen2.5-VL最佳实践
文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
一文理解多模态大语言模型——上

爱芯通元NPU适配Qwen2.5-VL-3B视觉多模态大模型

苹果发布300亿参数MM1多模态大模型
商汤科技推出SenseFoundry-VL方舟多模态新智平台

通义千问发布第二代视觉语言模型Qwen2-VL
号称全球最强开源模型 ——Qwen2.5 系列震撼来袭!PerfXCloud同步上线,快来体验!

利用OpenVINO部署Qwen2多模态模型
PerfXCloud重磅升级 阿里开源最强视觉语言模型Qwen2-VL-7B强势上线!

阿里云开源Qwen2.5-Coder代码模型系列
阿里云通义Qwen2.5-Max模型全新升级
利用英特尔OpenVINO在本地运行Qwen2.5-VL系列模型

评论