一、模型介紹
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 系列模型的特點包括:
- 多語言對話模型:天然支持英文、中文等多語言對話,端到端支持圖片里中英雙語的長文本識別;
- 多圖交錯對話:支持多圖輸入和比較,指定圖片問答,多圖文學創作等;
- 開放域目標定位:通過中文開放域語言表達進行檢測框標注;
- 細粒度識別和理解: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腳本的功能和特點:
- 微調功能:finetune.py腳本允許用戶在自己的數據集上對預訓練模型進行微調。微調是一種常見的做法,通過在特定任務上調整預訓練模型的參數,可以提高模型在該任務上的性能。
- 易于接入下游任務:腳本設計為模塊化,使得用戶可以輕松地將微調后的模型集成到各種下游任務中,如文本分類、情感分析、問答系統等。
- 支持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": "第一張圖片是重慶的城市天際線,第二張圖片是北京的天際線。"}]}
]
格式解釋:
- 為針對多樣的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>表示。
- 準備好數據后,你可以使用我們提供的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/bashexport CUDA_DEVICE_MAX_CONNECTIONS=1
DIR=`pwd`MODEL="/root/autodl-tmp/Qwen-VL-Chat"
DATA="/root/autodl-tmp/data.json"export CUDA_VISIBLE_DEVICES=0python3 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的顯存
③ 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 AutoPeftModelForCausalLMmodel = AutoPeftModelForCausalLM.from_pretrained(path_to_adapter, # path to the output directorydevice_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】,備注不同方向邀請入群!!