AI多模態教程:Qwen-VL多模態大模型實踐指南

一、模型介紹

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 系列模型的特點包括:

  1. 多語言對話模型:天然支持英文、中文等多語言對話,端到端支持圖片里中英雙語的長文本識別;
  2. 多圖交錯對話:支持多圖輸入和比較,指定圖片問答,多圖文學創作等;
  3. 開放域目標定位:通過中文開放域語言表達進行檢測框標注;
  4. 細粒度識別和理解: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腳本的功能和特點:

  1. 微調功能:finetune.py腳本允許用戶在自己的數據集上對預訓練模型進行微調。微調是一種常見的做法,通過在特定任務上調整預訓練模型的參數,可以提高模型在該任務上的性能。
  2. 易于接入下游任務:腳本設計為模塊化,使得用戶可以輕松地將微調后的模型集成到各種下游任務中,如文本分類、情感分析、問答系統等。
  3. 支持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": "第一張圖片是重慶的城市天際線,第二張圖片是北京的天際線。"}]}
]

格式解釋:

  1. 為針對多樣的VL任務,增加了一下的特殊tokens: <img> </img> <ref> </ref> <box> </box>.
  2. 對于帶圖像輸入的內容可表示為 Picture id: <img>img_path</img>\n{your prompt},其中id表示對話中的第幾張圖片。"img_path"可以是本地的圖片或網絡地址。
  3. 對話中的檢測框可以表示為<box>(x1,y1),(x2,y2)</box>,其中 (x1, y1) 和(x2, y2)分別對應左上角和右下角的坐標,并且被歸一化到[0, 1000)的范圍內. 檢測框對應的文本描述也可以通過<ref>text_caption</ref>表示。
  4. 準備好數據后,你可以使用我們提供的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

注意事項:

  1. 需要修改腳本中的MODEL、DATA參數,將其換成實際的模型和數據地址
  2. 需要修改腳本里的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】,備注不同方向邀請入群!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/40885.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40885.shtml
英文地址,請注明出處:http://en.pswp.cn/web/40885.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

代碼隨想錄Day69(圖論Part05)

并查集 // 1.初始化 int fa[MAXN]; void init(int n) {for (int i1;i<n;i)fa[i]i; }// 2.查詢 找到的祖先直接返回&#xff0c;未進行路徑壓縮 int.find(int i){if(fa[i] i)return i;// 遞歸出口&#xff0c;當到達了祖先位置&#xff0c;就返回祖先elsereturn find(fa[i])…

py基礎語法簡述

py基礎&#xff0c;常用sdk 一些要點 python中是沒有常量的關鍵字的&#xff0c;只是我們常常約定使用大寫字符組合的變量名表示常量&#xff0c;也有“不要對其進行賦值”的提醒操作 PI 3.14python3中有六個標準的數據類型&#xff1a; Number(數字)、String(字符串)、Boo…

基于Python爬蟲的城市二手房數據分析可視化

基于Python爬蟲的城市二手房數據分析可視化 一、前言二、數據采集(爬蟲,附完整代碼)三、數據可視化(附完整代碼)3.1 房源面積-總價散點圖3.2 各行政區均價3.3 均價最高的10個小區3.4 均價最高的10個地段3.5 戶型分布3.6 詞云圖四、如何更換城市一、前言 二手房具有價格普…

CSS position屬性之relative和absolute

目錄 1 參考文章2 五個屬性值3 position:static4 position:relative&#xff08;相對&#xff09;5 position:absolute&#xff08;絕對&#xff09; 1 參考文章 https://blog.csdn.net/lalala_dxf/article/details/123566909 https://blog.csdn.net/WangMinGirl/article/deta…

最靈活且易用的C++開源串口通信調試軟件

這款C開源串口調試軟件&#xff0c;集成了豐富的功能&#xff0c;為用戶提供高效、便捷的串口通信調試體驗。以下是其核心功能亮點&#xff1a; 基礎功能&#xff1a; 數據交互自如&#xff1a;支持串口數據的輕松讀取與發送&#xff0c;讓數據交換變得簡單直接。 靈活配置參…

基于順序表的通訊錄實現

一、前言 基于已經學過的順序表&#xff0c;可以實現一個簡單的通訊錄。 二、通訊錄相關頭文件 //Contact.h #pragma once#define NAME_MAX 20 #define TEL_MAX 20 #define ADDR_MAX 20 #define GENDER_MAX 20typedef struct PersonInfo {char name[NAME_MAX];char gender[G…

Python的招聘數據分析與可視化管理系統-計算機畢業設計源碼55218

摘要 隨著互聯網的迅速發展&#xff0c;招聘數據在規模和復雜性上呈現爆炸式增長&#xff0c;對數據的深入分析和有效可視化成為招聘決策和招聘管理的重要手段。本論文旨在構建一個基于Python的招聘數據分析與可視化管理系統。 該平臺以主流招聘平臺為數據源&#xff0c;利用Py…

MSPM0G3507——解決printf重定向在其他位置不能用的問題(printf重定向的補充)

除了之前發的文章的printf重定向的代碼之外&#xff0c;還要加上這樣一段代碼即可 int puts(const char *_ptr) {int count fputs(_ptr,stdout);count fputs("\n",stdout);return count;} 完整的重定向&#xff1a; int fputc(int c, FILE* stream) {DL_UART_Main_…

昇思25天學習打卡營第2天|MindSpore快速入門

打卡 目錄 打卡 快速入門案例&#xff1a;minist圖像數據識別任務 案例任務說明 流程 1 加載并處理數據集 2 模型網絡構建與定義 3 模型約束定義 4 模型訓練 5 模型保存 6 模型推理 相關參考文檔入門理解 MindSpore數據處理引擎 模型網絡參數初始化 模型優化器 …

一個字符串的全部子序列和全排列

在計算機科學中&#xff0c;字符串的子序列和全排列是兩個重要的概念。 1. 子序列 子序列是從一個序列中刪除一些&#xff08;或不刪除&#xff09;元素而不改變剩余元素的順序形成的新序列。 例如&#xff0c;字符串 “abc” 的子序列包括&#xff1a; “”&#xff08;空…

如何選擇TikTok菲律賓直播網絡?

為了滿足用戶對于實時互動的需求&#xff0c;TikTok推出了直播功能&#xff0c;讓用戶能夠與粉絲即時交流。本文將探討如何選擇適合的TikTok菲律賓直播網絡&#xff0c;并分析OgLive是否是值得信賴的選擇。 TikTok菲律賓直播網絡面臨的挑戰 作為全球領先的短視頻平臺&#xff…

Python + OpenCV 開啟圖片、寫入儲存圖片

這篇教學會介紹OpenCV 里imread()、imshow()、waitKey() 方法&#xff0c;透過這些方法&#xff0c;在電腦中使用不同的色彩模式開啟圖片并顯示圖片。 imread() 開啟圖片 使用imread() 方法&#xff0c;可以開啟圖片&#xff0c;imread() 有兩個參數&#xff0c;第一個參數為檔…

Google Play上架:惡意軟件、移動垃圾軟件和行為透明度詳細解析和解決辦法 (一)

近期整理了許多開發者的拒審郵件和內容,也發現了許多問題,今天來說一下關于惡意軟件這類拒審的問題。 目標郵件如下: 首先說一下各位小伙伴留言私信的一個方法,提供你的拒審郵件和時間,盡可能的詳細,這樣會幫助我們的團隊了解你們的問題,去幫助小伙伴么解決問題。由于前…

在 .NET 8 Web API 中實現彈性

在現代 Web 開發中&#xff0c;構建彈性 API 對于確保可靠性和性能至關重要。本文將指導您使用 Microsoft.Extensions.Http.Resilience 庫在 .NET 8 Web API 中實現彈性。我們將介紹如何設置重試策略和超時&#xff0c;以使您的 API 更能抵御瞬時故障。 步驟 1.創建一個新的 .…

集成學習(一)Bagging

前邊學習了&#xff1a;十大集成學習模型&#xff08;簡單版&#xff09;-CSDN博客 Bagging又稱為“裝袋法”&#xff0c;它是所有集成學習方法當中最為著名、最為簡單、也最為有效的操作之一。 在Bagging集成當中&#xff0c;我們并行建立多個弱評估器&#xff08;通常是決策…

排序——數據結構與算法 總結8

目錄 8.1 排序相關概念 8.2 插入排序 8.2.1 直接插入排序&#xff1a; 8.2.2 折半插入排序&#xff1a; 8.2.3 希爾排序&#xff1a; 8.3 交換排序 8.3.1 冒泡排序&#xff1a; 8.3.2 快速排序&#xff1a; 8.4 選擇排序 8.4.1 簡單選擇排序 8.4.2 堆排序 8.5 歸并…

磁盤就是一個超大的Byte數組,操作系統是如何管理的?

磁盤在操作系統的維度看&#xff0c;就是一個“超大的Byte數組”。 那么操作系統是如何對這塊“超大的Byte數組”做管理的呢&#xff1f; 我們知道在邏輯上&#xff0c;上帝說是用“文件”的概念來進行管理的。于是&#xff0c;便有了“文件系統”。那么&#xff0c;文件系統…

當前國內可用的docker加速器搜集 —— 筑夢之路

可用鏡像加速器 以下地址搜集自網絡&#xff0c;僅供參考&#xff0c;請自行驗證。 1、https://docker.m.daocloud.io2、https://dockerpull.com3、https://atomhub.openatom.cn4、https://docker.1panel.live5、https://dockerhub.jobcher.com6、https://hub.rat.dev7、http…

最新版情侶飛行棋dofm,已解鎖高階私密模式,單身狗務必繞道!(附深夜學習資源)

今天阿星要跟大家聊一款讓阿星這個大老爺們兒面紅耳赤的神奇游戲——情侶飛行棋。它的神奇之處就在于專為情侶設計&#xff0c;能讓情侶之間感情迅速升溫&#xff0c;但單身狗們請自覺繞道&#xff0c;不然后果自負哦&#xff01; 打開游戲&#xff0c;界面清新&#xff0c;操…

HTML5使用<progress>進度條、<meter>刻度條

1、<progress>進度條 定義進度信息使用的是 progress 標簽。它表示一個任務的完成進度&#xff0c;這個進度可以是不確定的&#xff0c;只是表示進度正在進行&#xff0c;但是不清楚還有多少工作量沒有完成&#xff0c;也可以用0到某個最大數字&#xff08;如&#xff1…