多模態(tài)理解模型是讓AI像人類一樣,通過整合多維度信息(如視覺、語言、聽覺等),理解數(shù)據(jù)背后的語義、情感、邏輯或場(chǎng)景,從而完成推理、決策等任務(wù)。
當(dāng)前已經(jīng)進(jìn)入多模態(tài)理解大模型發(fā)展的快車道,2025年2月,最新一代的多模態(tài)理解模型Qwen2.5VL開源發(fā)布,其在多個(gè)基準(zhǔn)測(cè)試中取得了SOTA效果,更是直接登頂司南(OpenCompass)排行榜,甚至超越國(guó)內(nèi)外知名的GPT-4o和Gemini-2.0等閉源模型。
MindSpeed MM開發(fā)團(tuán)隊(duì)快速對(duì)Qwen2.5VL模型全系列尺寸進(jìn)行適配,并將其正式開源在MindSpeed MM倉庫,同時(shí)支持視圖理解全參微調(diào)訓(xùn)練、Lora微調(diào)訓(xùn)練、在線推理和評(píng)測(cè)。
MindSpeed MM基于MindSpeed Core的多維并行能力實(shí)現(xiàn)對(duì)多模態(tài)模型的極致性能優(yōu)化,更親和昇騰硬件,致力成為昇騰開發(fā)者大集群、大參數(shù)場(chǎng)景多模態(tài)訓(xùn)練的首選,為開發(fā)者提供高效易用的開發(fā)體驗(yàn)。
基于MindSpeed MM的Qwen2.5VL視圖理解生成體驗(yàn)
新一代的多模態(tài)理解模型Qwen2.5VL有強(qiáng)大的視圖理解能力,讓我們快速體驗(yàn)一下。
基于MindSpeed MM的Qwen2.5VL訓(xùn)練優(yōu)化特性
多模態(tài)理解模型主要處理如文本、圖像、音頻、視頻、傳感器信號(hào)等模態(tài)數(shù)據(jù),不同模態(tài)數(shù)據(jù)存在結(jié)構(gòu)差異、特征表示異質(zhì)性、融合策略多樣性、訓(xùn)練機(jī)制復(fù)雜性等特點(diǎn),Qwen2.5VL訓(xùn)練的性能瓶頸主要是負(fù)載不均衡問題。MindSpeed MM在使用融合算子、分布式優(yōu)化器及流水調(diào)度優(yōu)化等常用特性的基礎(chǔ)上,支持多模態(tài)異構(gòu)流水線并行、動(dòng)態(tài)流水線并行、數(shù)據(jù)分桶負(fù)載均衡等優(yōu)化加速特性,實(shí)現(xiàn)訓(xùn)練性能極致優(yōu)化。
01多模態(tài)異構(gòu)流水線并行,支持大規(guī)模數(shù)據(jù)的復(fù)雜多模態(tài)訓(xùn)練,實(shí)現(xiàn)負(fù)載均衡
Qwen2.5VL模型包括視覺模塊、連接層以及語言模塊,其中視覺模塊的激活值比較大,當(dāng)視覺模塊放開訓(xùn)練或視圖數(shù)據(jù)規(guī)模較大時(shí),會(huì)導(dǎo)致顯存占用過大甚至OOM,同時(shí)影響多卡之間的負(fù)載均衡。MindSpeed MM創(chuàng)新性地實(shí)現(xiàn)了異構(gòu)流水線并行特性,支持各種模態(tài)模塊的快速流水線并行適配,支撐實(shí)現(xiàn)更復(fù)雜場(chǎng)景和更大數(shù)據(jù)規(guī)模的訓(xùn)練微調(diào),同時(shí)也緩解了負(fù)載不均衡的問題。
使用方式:在examples/qwen2.5vl/model_*b.json中配置vision_encoder和text_decoder中的pipeline_num_layers字段參數(shù)
02流水線并行動(dòng)態(tài)shape通信支持,實(shí)現(xiàn)訓(xùn)練效率和資源利用率雙提升
多模態(tài)場(chǎng)景中,batch內(nèi)樣本長(zhǎng)度要保持一致,需將所有輸入樣本都擴(kuò)展到統(tǒng)一的序列長(zhǎng)度,而不同樣本的序列長(zhǎng)度差異較大,對(duì)于短序列的數(shù)據(jù)樣本會(huì)產(chǎn)生大量冗余計(jì)算、增加顯存占用和通信耗時(shí)。MindSpeed MM通過使用MindSpeed Core的動(dòng)態(tài)shape流水線并行特性,減少過度擴(kuò)展現(xiàn)象,有效降低冗余計(jì)算量,實(shí)現(xiàn)訓(xùn)練效率與計(jì)算資源利用率雙提升,數(shù)據(jù)集序列長(zhǎng)度差異越大,收益越大。
使用方式:在examples/qwen2.5vl/finetune_qwen2_5_vl_*b.sh的GPT_ARGS中加入--variable-seq-lengths參數(shù)。
03數(shù)據(jù)分桶負(fù)載優(yōu)化,實(shí)現(xiàn)多卡數(shù)據(jù)計(jì)算均衡,訓(xùn)練效率提升10%+
多模態(tài)理解場(chǎng)景由于視圖數(shù)據(jù)的規(guī)模不一致,不同輸入數(shù)據(jù)長(zhǎng)度差異很大,因此會(huì)導(dǎo)致大集群訓(xùn)練微調(diào)過程中,不同卡之間的計(jì)算耗時(shí)差異大,出現(xiàn)卡間負(fù)載不均衡問題。MindSpeed MM中通過實(shí)現(xiàn)全局?jǐn)?shù)據(jù)分桶重排,將不同序列長(zhǎng)度的數(shù)據(jù)重新進(jìn)行劃分,從而實(shí)現(xiàn)卡間的數(shù)據(jù)大小基本相同,保證訓(xùn)練數(shù)據(jù)多樣性的同時(shí)訓(xùn)練效率提升10%+。
數(shù)據(jù)分桶負(fù)載:將數(shù)據(jù)按token數(shù)量
分配到不同的桶,訓(xùn)練時(shí)按桶取數(shù)據(jù)
使用方式:在examples/qwen2.5vl/data_*b.json中,修改dataloader_param下的sampler_type為"BucketBatchSampler"
快速上手,基于MindSpeed MM玩轉(zhuǎn)Qwen2.5VL
環(huán)境安裝
模型開發(fā)時(shí)推薦使用配套的環(huán)境版本,詳見倉庫中的”環(huán)境安裝”
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
環(huán)境搭建:
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,注意要選擇對(duì)應(yīng)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 .
權(quán)重下載及轉(zhuǎn)換
Qwen2.5VL權(quán)重下載:
模型 | 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 |
權(quán)重轉(zhuǎn)換:
MindSpeed MM修改了部分原始網(wǎng)絡(luò)的結(jié)構(gòu)名稱,使用mm-convert工具對(duì)原始預(yù)訓(xùn)練權(quán)重進(jìn)行轉(zhuǎn)換。該工具實(shí)現(xiàn)了huggingface權(quán)重和MindSpeed MM權(quán)重的互相轉(zhuǎn)換以及PP(Pipeline Parallel)權(quán)重的重切分。
# 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:轉(zhuǎn)換后保存目錄
# hf_dir: huggingface權(quán)重目錄
# llm_pp_layers: llm在每個(gè)卡上切分的層數(shù),注意要和model.json中配置的pipeline_num_layers一致
# vit_pp_layers: vit在每個(gè)卡上切分的層數(shù),注意要和model.json中配置的pipeline_num_layers一致
# tp_size: tp并行數(shù)量,注意要和微調(diào)啟動(dòng)腳本中的配置一致
如果需要用轉(zhuǎn)換后模型訓(xùn)練的話,同步修改
examples/qwen2.5vl/finetune_qwen2_5_vl_7b.sh中的LOAD_PATH參數(shù),該路徑為轉(zhuǎn)換后或者切分后的權(quán)重,注意與原始權(quán)重ckpt/hf_path/Qwen2.5-VL-7B-Instruct進(jìn)行區(qū)分。
LOAD_PATH="ckpt/mm_path/Qwen2.5-VL-7B-Instruct"
【數(shù)據(jù)集準(zhǔn)備及處理】
數(shù)據(jù)集下載(以coco2017數(shù)據(jù)集為例):
(1)用戶需要自行下載COCO2017數(shù)據(jù)集,并解壓到項(xiàng)目目錄下的./data/COCO2017文件夾中
下載鏈接:https://gitee.com/link?target=https%3A%2F%2Fcocodataset.org%2F%23download
(2)獲取圖片數(shù)據(jù)集的描述文件(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,運(yùn)行數(shù)據(jù)轉(zhuǎn)換腳本python examples/qwen2vl/llava_instruct_2_mllm_demo_format.py;
$playground
├── data
├── COCO2017
├── train2017
├── llava_instruct_150k.json
├── mllm_format_llava_instruct_data.json
...
當(dāng)前支持讀取多個(gè)以,(注意不要加空格)分隔的數(shù)據(jù)集,配置方式為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"
同時(shí)注意data.json中dataset_param->basic_parameters->max_samples的配置,會(huì)限制數(shù)據(jù)只讀max_samples條,這樣可以快速驗(yàn)證功能。如果正式訓(xùn)練時(shí),可以把該參數(shù)去掉則讀取全部的數(shù)據(jù)。
純文本或有圖無圖混合訓(xùn)練數(shù)據(jù)(以LLaVA-Instruct-150K為例):
現(xiàn)在本框架已經(jīng)支持純文本/混合數(shù)據(jù)(有圖像和無圖像數(shù)據(jù)混合訓(xùn)練)。在數(shù)據(jù)構(gòu)造時(shí),對(duì)于包含圖片的數(shù)據(jù),需要保留image這個(gè)鍵值。
{
"id": your_id,
"image": your_image_path,
"conversations": [
{"from":"human","value": your_query},
{"from":"gpt","value": your_response},
],
}
在數(shù)據(jù)構(gòu)造時(shí),對(duì)于純文本數(shù)據(jù),可以去除image這個(gè)鍵值。
{
"id": your_id,
"conversations": [
{"from":"human","value": your_query},
{"from":"gpt","value": your_response},
],
}
【微調(diào)】
1. 準(zhǔn)備工作
配置腳本前需要完成前置準(zhǔn)備工作,包括:環(huán)境安裝、權(quán)重下載及轉(zhuǎn)換、數(shù)據(jù)集準(zhǔn)備及處理,詳情可查看對(duì)應(yīng)章節(jié)。
2. 配置參數(shù)
數(shù)據(jù)目錄配置:
根據(jù)實(shí)際情況修改data.json中的數(shù)據(jù)集路徑,包括model_name_or_path、dataset_dir、dataset等字段。
以Qwen2.5VL-7B為例,data.json進(jìn)行以下修改,注意model_name_or_path的權(quán)重路徑為轉(zhuǎn)換前的權(quán)重路徑。
注意cache_dir在多機(jī)上不要配置同一個(gè)掛載目錄避免寫入同一個(gè)文件導(dǎo)致沖突。
{
"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",
...
},
...
},
...
}
}
模型保存加載及日志信息配置:
根據(jù)實(shí)際情況配置examples/qwen2.5vl/finetune_qwen2_5_vl_7b.sh的參數(shù),包括加載、保存路徑以及保存間隔--save-interval(注意:分布式優(yōu)化器保存文件較大耗時(shí)較長(zhǎng),請(qǐng)謹(jǐn)慎設(shè)置保存間隔)
...
#加載路徑
LOAD_PATH="ckpt/mm_path/Qwen2.5-VL-7B-Instruct"
#保存路徑
SAVE_PATH="save_dir"
...
GPT_ARGS="
...
--no-load-optim #不加載優(yōu)化器狀態(tài),若需加載請(qǐng)移除
--no-load-rng #不加載隨機(jī)數(shù)狀態(tài),若需加載請(qǐng)移除
--no-save-optim #不保存優(yōu)化器狀態(tài),若需保存請(qǐng)移除
--no-save-rng #不保存隨機(jī)數(shù)狀態(tài),若需保存請(qǐng)移除
...
"
...
OUTPUT_ARGS="
--log-interval 1 #日志間隔
--save-interval 5000 #保存間隔
...
--log-tps #增加此參數(shù)可使能在訓(xùn)練中打印每步語言模塊的平均序列長(zhǎng)度,并在訓(xùn)練結(jié)束后計(jì)算每秒吞吐tokens量。
"
若需要加載指定迭代次數(shù)的權(quán)重、優(yōu)化器等狀態(tài),需將加載路徑LOAD_PATH設(shè)置為保存文件夾路徑LOAD_PATH="save_dir",并修改latest_checkpointed_iteration.txt文件內(nèi)容為指定迭代次數(shù) (此功能coming soon)
$save_dir
├── latest_checkpointed_iteration.txt
├── ...
單機(jī)運(yùn)行配置:
配置examples/qwen2.5vl/finetune_qwen2_5_vl_7b.sh參數(shù)如下
#根據(jù)實(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))
注意,當(dāng)開啟PP時(shí),model.json中配置的vision_encoder和text_decoder的pipeline_num_layer參數(shù)控制了各自的PP切分策略。對(duì)于流水線并行,要先處理vision_encoder再處理text_decoder。 比如7b默認(rèn)的值[32,0,0,0]、[1,10,10,7],其含義為PP域內(nèi)第一張卡先放32層vision_encoder再放1層text_decoder、第二張卡放text_decoder接著的10層、第三張卡放text_decoder接著的10層、第四張卡放text_decoder接著的7層,vision_encoder沒有放完時(shí)不能先放text_decoder(比如[30,2,0,0]、[1,10,10,7]的配置是錯(cuò)的)。
同時(shí)注意,如果某張卡上的參數(shù)全部?jī)鼋Y(jié)時(shí)會(huì)導(dǎo)致沒有梯度(比如vision_encoder凍結(jié)時(shí)PP配置[30,2,0,0]、[0,11,10,7]),需要在finetune_qwen2_5_vl_7b.sh中GPT_ARGS參數(shù)中增加--enable-dummy-optimizer,
3. 啟動(dòng)微調(diào)
以Qwen2.5VL-7B為例,啟動(dòng)微調(diào)訓(xùn)練任務(wù)。
bash examples/qwen2.5vl/finetune_qwen2_5_vl_7b.sh
【性能實(shí)測(cè):昇騰硬件加速提升性能】
備注:Samples per Second 為 (SPS)
模型尺寸 | 任務(wù)類型 | 訓(xùn)練規(guī)模(A2) | 混精類型 | 性能 |
3B | 微調(diào) | 單機(jī)8卡 | bf16 | 23.771(SPS) |
7B | 微調(diào) | 單機(jī)8卡 | bf16 | 14.204(SPS) |
32B | 微調(diào) | 雙機(jī)16卡 | bf16 | 6.755(SPS) |
72B | 微調(diào) | 4機(jī)32卡 | bf16 | 4.669(SPS) |
【更多參數(shù)見MindSpeed MM倉庫】
準(zhǔn)備工作和參數(shù)說明見MindSpeed MM開源代碼倉鏈接:
https://gitee.com/ascend/MindSpeed-MM/tree/master/examples/qwen2.5vl
結(jié)語
MindSpeed MM是面向大規(guī)模分布式訓(xùn)練的昇騰多模態(tài)大模型套件,同時(shí)支持多模態(tài)生成及多模態(tài)理解,旨在為華為昇騰芯片提供端到端的多模態(tài)訓(xùn)練解決方案, 包含預(yù)置業(yè)界主流模型,數(shù)據(jù)工程,分布式訓(xùn)練及加速,預(yù)訓(xùn)練、微調(diào)、在線推理任務(wù)等特性。
MindSpeed MM即將上線更加豐富的支持Qwen2.5VL模型的特性,敬請(qǐng)期待。
-
AI
+關(guān)注
關(guān)注
88文章
34781瀏覽量
277153 -
開源
+關(guān)注
關(guān)注
3文章
3645瀏覽量
43675 -
模型
+關(guān)注
關(guān)注
1文章
3504瀏覽量
50209 -
Mindspeed
+關(guān)注
關(guān)注
1文章
15瀏覽量
9248
原文標(biāo)題:多模態(tài)理解SOTA模型開箱即用,MindSpeed MM支持Qwen2.5-VL最佳實(shí)踐
文章出處:【微信號(hào):OSC開源社區(qū),微信公眾號(hào):OSC開源社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
一文理解多模態(tài)大語言模型——上

愛芯通元NPU適配Qwen2.5-VL-3B視覺多模態(tài)大模型

阿里云開源視覺語言大模型Qwen-VL ,支持圖文雙模態(tài)輸入

蘋果發(fā)布300億參數(shù)MM1多模態(tài)大模型
商湯科技推出SenseFoundry-VL方舟多模態(tài)新智平臺(tái)

基于Qwen-Agent與OpenVINO構(gòu)建本地AI智能體

通義千問發(fā)布第二代視覺語言模型Qwen2-VL
號(hào)稱全球最強(qiáng)開源模型 ——Qwen2.5 系列震撼來襲!PerfXCloud同步上線,快來體驗(yàn)!

蘋果發(fā)布300億參數(shù)多模態(tài)AI大模型MM1.5
利用OpenVINO部署Qwen2多模態(tài)模型
PerfXCloud重磅升級(jí) 阿里開源最強(qiáng)視覺語言模型Qwen2-VL-7B強(qiáng)勢(shì)上線!

阿里云開源Qwen2.5-Coder代碼模型系列
阿里云通義Qwen2.5-Max模型全新升級(jí)
利用英特爾OpenVINO在本地運(yùn)行Qwen2.5-VL系列模型

評(píng)論