基于MindSpeed MM玩转Qwen2.5VL多模态理解模型

描述

多模态理解模型是让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 -n test python=3.10

 


 

conda activate test

 


 

 


 

# 安装 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

 


 

# 建议从原仓编译安装

 


 

 


 

# 安装加速库

 


 

git clone https://gitee.com/ascend/MindSpeed.git

 


 

cd MindSpeed

 


 

# 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指定版本

 


 

git clone https://github.com/huggingface/transformers.git

 


 

cd transformers

 


 

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模型的特性,敬请期待。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分