大模型學(xué)習(xí)路線:從原理到微調(diào)部署)
1. 先說清楚多模態(tài)大模型到底在解決什么問題這幾年做大模型相關(guān)的工作單聊語言模型LLM的人還很多但真正讓我覺得天花板遠(yuǎn)沒到的方向其實(shí)就是多模態(tài)大模型。你去看熱搜詞、招聘需求、開源社區(qū)的熱度幾乎都在往“視覺語言”“視頻語言”“語音語言”這種組合方向走。所謂多模態(tài)大模型簡單說就是讓模型不再只吃文字而是能同時(shí)理解圖片、音頻、視頻和文字并且在理解之后還能按照人的指令完成推理、回答、生成內(nèi)容。我在剛開始接觸這個(gè)方向時(shí)也踩過坑以為多模態(tài)就是把圖像識(shí)別模型和文本模型拼在一起用的時(shí)候先跑一遍圖像識(shí)別再把結(jié)果扔給語言模型去生成文字。后來真正做了才發(fā)現(xiàn)這種“流水線式”方案和真正的多模態(tài)大模型之間差距非常大。真正意義上的多模態(tài)模型是在模型內(nèi)部把不同模態(tài)的特征對(duì)齊到同一個(gè)語義空間里讓模型能夠跨模態(tài)進(jìn)行推理而不是簡單地在外部做拼接。這篇文章我打算按我自己的學(xué)習(xí)路線來寫核心圍繞多模態(tài)模型的概念、架構(gòu)、數(shù)據(jù)準(zhǔn)備、微調(diào)實(shí)操、評(píng)估和部署幾個(gè)環(huán)節(jié)展開。不管你是剛?cè)腴T大模型還是已經(jīng)做過一些單模態(tài)的NLP或CV項(xiàng)目想轉(zhuǎn)向多模態(tài)方向這都是一條可以照著走的路線。2. 多模態(tài)大模型的基礎(chǔ)認(rèn)知先搞懂這幾個(gè)關(guān)鍵名詞2.1 特征對(duì)齊到底是什么意思多模態(tài)模型最核心的動(dòng)作是把來自不同模態(tài)的輸入轉(zhuǎn)換成向量然后在同一個(gè)向量空間里做對(duì)齊。什么是“對(duì)齊”你可以理解成把中文的“蘋果”、英文的“apple”、一張紅蘋果的圖片映射到同一個(gè)向量空間里距離比較近的位置。這樣當(dāng)模型看到圖片里的蘋果時(shí)它知道這個(gè)視覺特征和文字描述里的蘋果是一回事。這個(gè)想法其實(shí)不是大模型時(shí)代才有的。早期有跨模態(tài)檢索相關(guān)的思路后來CLIP這類模型真正把“圖文對(duì)比學(xué)習(xí)”做成了范式。CLIP的做法是用大量的圖片和文字配對(duì)數(shù)據(jù)訓(xùn)練一個(gè)圖像編碼器和一個(gè)文本編碼器讓配對(duì)樣本的特征向量盡量接近不配對(duì)樣本的距離盡量拉遠(yuǎn)。很多后來出現(xiàn)的多模態(tài)大模型視覺編碼器部分依然沿用CLIP的訓(xùn)練思路或者在CLIP的基礎(chǔ)上做繼續(xù)訓(xùn)練。2.2 從“編碼器-解碼器”到“大語言模型底座”多模態(tài)模型演進(jìn)到現(xiàn)在大致出現(xiàn)了幾種典型結(jié)構(gòu)。第一種是以Florence為代表視覺編碼器和文本編碼器并行輸出時(shí)通過一個(gè)共同的接口來完成跨模態(tài)理解。第二種是以LLaVA為代表的架構(gòu)把視覺編碼器接到一個(gè)大語言模型上中間加一個(gè)可訓(xùn)練的投影層讓視覺特征變成語言模型能理解的向量序列。第三種是以Qwen-VL、InternVL為代表的大一統(tǒng)模型架構(gòu)上通常也是視覺編碼器連接器LLM但在訓(xùn)練策略和數(shù)據(jù)規(guī)模上做了很多優(yōu)化。從我個(gè)人學(xué)習(xí)經(jīng)驗(yàn)來看如今主流的多模態(tài)大模型基本都是“視覺編碼器連接器語言模型底座”這種三段式結(jié)構(gòu)。理解了這個(gè)結(jié)構(gòu)后面看任何模型的代碼和論文都會(huì)輕松很多。語言模型底座負(fù)責(zé)推理和生成視覺編碼器負(fù)責(zé)提取視覺特征連接器負(fù)責(zé)把視覺特征“翻譯”成語言模型能讀懂的形式。2.3 多模態(tài)大模型和傳統(tǒng)視覺模型的本質(zhì)區(qū)別傳統(tǒng)視覺模型做圖像分類、目標(biāo)檢測(cè)輸出的是類別標(biāo)簽或檢測(cè)框能力邊界相對(duì)固定。多模態(tài)大模型則不同它把視覺理解能力和自然語言的開放式生成能力結(jié)合在一起。你給它一張圖它不只會(huì)告訴你圖里有什么還能根據(jù)你的問題做推理。比如你問“這張圖里的人是在室內(nèi)還是室外”它能結(jié)合人物周圍的環(huán)境、光線、物體做綜合判斷。這種能力的背后是模型在大規(guī)模圖文數(shù)據(jù)上訓(xùn)練出來的跨模態(tài)語義理解能力。所以如果有人問我多模態(tài)大模型學(xué)起來到底難在哪我的回答是難點(diǎn)不在某一個(gè)單獨(dú)的模型結(jié)構(gòu)而在于你要同時(shí)理解視覺特征提取、序列建模、指令微調(diào)、數(shù)據(jù)配比、分布式訓(xùn)練等多方面的知識(shí)。這也是為什么需要一條比較系統(tǒng)的學(xué)習(xí)路線。3. 學(xué)習(xí)路線的整體拆解別一上來就掉進(jìn)源碼里3.1 前置基礎(chǔ)清單多模態(tài)大模型不是零基礎(chǔ)就能直接上手的方向。我建議在動(dòng)手之前先把下面這些基礎(chǔ)打牢Python編程基礎(chǔ)尤其是PyTorch的使用。不用精通到能手寫反向傳播但至少要能看懂模型定義、數(shù)據(jù)加載、訓(xùn)練循環(huán)。Transformer結(jié)構(gòu)的基本原理。至少要知道自注意力機(jī)制是怎么工作的詞嵌入是怎么映射的位置編碼為什么需要。預(yù)訓(xùn)練和微調(diào)的基本概念。比如什么是指令微調(diào)SFT什么是凍結(jié)參數(shù)什么是低秩適配LoRA?;A(chǔ)的圖像處理方法。不用會(huì)做復(fù)雜的圖像處理算法但至少要了解圖像在計(jì)算機(jī)里是怎么表達(dá)成數(shù)字張量的RGB通道、分辨率、歸一化這些概念要清楚。可能有人覺得Transformer都學(xué)完了還看多模態(tài)干嘛其實(shí)多模態(tài)領(lǐng)域有一個(gè)額外門檻數(shù)據(jù)。單模態(tài)NLP的數(shù)據(jù)是一段文本單模態(tài)CV的數(shù)據(jù)是一張圖加一個(gè)標(biāo)簽多模態(tài)的數(shù)據(jù)是圖文對(duì)、視頻文本對(duì)、指令數(shù)據(jù)數(shù)據(jù)的規(guī)模和質(zhì)量直接決定模型效果而且處理起來比單模態(tài)復(fù)雜得多。3.2 我的學(xué)習(xí)階段劃分我把多模態(tài)大模型的學(xué)習(xí)過程分成四個(gè)階段第一階段是看懂。找?guī)灼?jīng)典論文精讀包括CLIP、BLIP-2、LLaVA、Qwen-VL搞清楚每個(gè)模型在結(jié)構(gòu)上做了什么、訓(xùn)練數(shù)據(jù)長什么樣、評(píng)測(cè)結(jié)果如何。這個(gè)階段不用追求看懂所有公式重點(diǎn)是建立對(duì)模型架構(gòu)的直觀認(rèn)知。第二階段是跑通。找開源模型和代碼把推理跑通。隨便拿一張圖片讓模型輸出一段描述再試幾個(gè)問答感受一下多模態(tài)模型的能力邊界。這是建立信心的關(guān)鍵一步也讓你之后看源碼時(shí)有個(gè)整體印象。第三階段是改。把LLaVA或Qwen-VL這類模型拿來做微調(diào)換自己的數(shù)據(jù)改改超參數(shù)觀察模型行為的變化。這個(gè)階段會(huì)真刀真槍地碰代碼、看日志、調(diào)bug也是收獲最大的階段。第四階段是評(píng)估和部署。用公開評(píng)測(cè)集測(cè)模型效果然后把模型部署成服務(wù)測(cè)試推理速度、并發(fā)能力思考如何在資源受限的情況下優(yōu)化。這條路線走下來大概需要兩到三個(gè)月前提是你每天能保證兩三小時(shí)的學(xué)習(xí)時(shí)間。如果全職學(xué)節(jié)奏可以快一個(gè)月左右。3.3 學(xué)習(xí)資料怎么選關(guān)于資料我的建議是優(yōu)先看三樣?xùn)|西原版論文、官方代碼、實(shí)驗(yàn)報(bào)告。很多人喜歡先看博客或視頻課程但博客的問題是經(jīng)過二次加工容易丟掉關(guān)鍵細(xì)節(jié)。尤其多模態(tài)領(lǐng)域發(fā)展極快一個(gè)模型出來沒幾個(gè)月就有新版本過時(shí)的博客反而會(huì)誤導(dǎo)你。看論文時(shí)我有個(gè)習(xí)慣先看圖和表格再讀方法部分最后才看相關(guān)工作。圖和表格能在幾分鐘內(nèi)給你一個(gè)模型的核心思路??创a時(shí)不要從頭到尾一行行讀而是先看模型定義部分找到視覺編碼器、連接器、語言模型這三個(gè)結(jié)構(gòu)分別在哪里再去看數(shù)據(jù)加載部分搞清楚輸入數(shù)據(jù)是怎么被預(yù)處理和拼裝的。4. 核心模塊深度解析視覺編碼器、連接器與語言模型底座4.1 視覺編碼器怎么選多模態(tài)大模型里視覺編碼器負(fù)責(zé)把圖像轉(zhuǎn)換成特征序列。目前主流的選擇有CLIP的ViT系列、SigLIP、InternViT等。選擇視覺編碼器時(shí)要關(guān)注幾個(gè)指標(biāo)輸入分辨率支持、參數(shù)量大小、特征維度以及在圖文對(duì)齊任務(wù)上的表現(xiàn)。以LLaVA為例早期版本用的是CLIP ViT-L/14把224x224的圖像切分成14x14的patch每個(gè)patch映射成一個(gè)特征向量最后得到256個(gè)視覺token輸入給語言模型。后來很多模型為了提高細(xì)粒度理解能力會(huì)把輸入分辨率提到336或448甚至更高。分辨率越高視覺token數(shù)量就越多計(jì)算開銷也越大。這是一個(gè)需要在實(shí)際應(yīng)用里權(quán)衡的問題。還有一個(gè)細(xì)節(jié)值得注意很多多模態(tài)模型會(huì)對(duì)視覺編碼器做階段性凍結(jié)。訓(xùn)練初期凍結(jié)視覺編碼器只訓(xùn)練連接器和語言模型后期再解凍部分層做聯(lián)合微調(diào)。這樣做一方面是為了避免災(zāi)難性遺忘另一方面是視覺編碼器已經(jīng)在海量圖文對(duì)上預(yù)訓(xùn)練過直接微調(diào)很容易把學(xué)好的特征搞壞。4.2 連接器的設(shè)計(jì)差異連接器是把視覺特征轉(zhuǎn)化為語言模型輸入的關(guān)鍵模塊。你不要小看這個(gè)模塊不同模型的設(shè)計(jì)差異很大效果也差很多。最簡單的連接器就是一個(gè)線性投影層把視覺特征的維度映射到語言模型的嵌入維度。LLaVA早期用的就是這種方案實(shí)現(xiàn)簡單效果也不錯(cuò)。復(fù)雜一點(diǎn)的是BLIP-2提出的Q-Former它用一組可學(xué)習(xí)的query向量去“查詢”視覺特征得到若干和文本語義更對(duì)齊的向量再輸入給語言模型。Q-Former的優(yōu)點(diǎn)是能用更少的視覺token表達(dá)更多的語義信息缺點(diǎn)是結(jié)構(gòu)復(fù)雜訓(xùn)練時(shí)要多一個(gè)階段。我自己在實(shí)踐里對(duì)比過線性投影層在數(shù)據(jù)充足的情況下并不比Q-Former差太多甚至訓(xùn)練更穩(wěn)定。所以在自己的項(xiàng)目里不要盲目追復(fù)雜結(jié)構(gòu)先跑通簡單的再根據(jù)效果決定要不要升級(jí)。4.3 語言模型底座的選擇邏輯語言模型底座決定了多模態(tài)模型的推理上限。同樣是看圖問答底座是2B還是14B效果差距非常明顯。底座參數(shù)越多常識(shí)推理能力和指令跟隨能力越強(qiáng)但對(duì)顯存和算力的要求也越高。做學(xué)習(xí)路線時(shí)我建議先用7B或8B左右的底座比如Qwen2.5-7B、InternLM2.5-7B這個(gè)規(guī)模在24G顯存上能做LoRA微調(diào)推理時(shí)甚至可以在16G顯存上跑。等你把流程跑通再考慮更大的底座。千萬不要一上來就試72B的模型那樣大概率卡在環(huán)境配置上。語言模型底座還決定了模型的輸出風(fēng)格和指令遵循能力。同一個(gè)視覺編碼器、同一份數(shù)據(jù)換不同的底座效果差異會(huì)非常明顯。所以做微調(diào)時(shí)如果效果不好不要只想著調(diào)數(shù)據(jù)換底座也是一種常見操作。5. 動(dòng)手實(shí)踐多模態(tài)微調(diào)的全流程5.1 準(zhǔn)備訓(xùn)練數(shù)據(jù)多模態(tài)模型的訓(xùn)練數(shù)據(jù)大體分兩類一類是圖文對(duì)數(shù)據(jù)用于預(yù)訓(xùn)練或繼續(xù)訓(xùn)練數(shù)據(jù)格式就是一張圖片配一段描述文本另一類是指令數(shù)據(jù)用于微調(diào)數(shù)據(jù)格式是一張圖片配一組多輪對(duì)話對(duì)話中包含用戶問題、模型回答。自己從零收集海量圖文對(duì)不現(xiàn)實(shí)更好用的做法是使用公開數(shù)據(jù)集。比如LAION、CC3M、CC12M這些圖文對(duì)數(shù)據(jù)集或者用LLaVA-Pretrain這種已經(jīng)處理好的預(yù)訓(xùn)練數(shù)據(jù)。指令微調(diào)階段可以用LLaVA-Instruct、ShareGPT4V這類公開數(shù)據(jù)也可以根據(jù)自己的業(yè)務(wù)場(chǎng)景構(gòu)造小規(guī)模的高質(zhì)量指令數(shù)據(jù)。在構(gòu)造指令數(shù)據(jù)時(shí)我有一個(gè)建議質(zhì)量永遠(yuǎn)比數(shù)量重要。幾千條高質(zhì)量、覆蓋各種提問方式的數(shù)據(jù)效果往往比幾萬條重復(fù)模板數(shù)據(jù)要好。指令數(shù)據(jù)要多樣化包含描述類問題、推理類問題、比較類問題、計(jì)數(shù)類問題等。我見過太多人拿一個(gè)模板生成幾萬條數(shù)據(jù)訓(xùn)出來的模型只會(huì)按模板說話換個(gè)問法就崩了。5.2 數(shù)據(jù)格式化示例以LLaVA系列的訓(xùn)練數(shù)據(jù)為例一般用一個(gè)JSON文件組織對(duì)話。每條數(shù)據(jù)大概長這樣{ id: 00000001, image: path/to/image.jpg, conversations: [ { from: human, value: 請(qǐng)描述這張圖片的內(nèi)容。 }, { from: gpt, value: 圖片中是一片海灘遠(yuǎn)處有幾棵椰子樹近處有一個(gè)人在海邊散步。 } ] }不同框架的數(shù)據(jù)格式略有差異但核心思想一致圖片路徑加對(duì)話輪次。訓(xùn)練時(shí)模型會(huì)看到圖片對(duì)應(yīng)的視覺特征和全部對(duì)話歷史基于前面的對(duì)話來生成當(dāng)前輪的回復(fù)。指令數(shù)據(jù)里有些框架會(huì)區(qū)分“系統(tǒng)提示”和“用戶消息”處理時(shí)要看清框架要求。5.3 微調(diào)工具的選擇與上手現(xiàn)在做多模態(tài)微調(diào)不太需要自己從頭寫訓(xùn)練腳本。我常用的工具是LLaMA Factory和Xinference其中LLaMA Factory對(duì)多模態(tài)模型的支持比較完整界面友好文檔也寫得很清楚。用LLaMA Factory做多模態(tài)微調(diào)大致步驟是安裝依賴包括PyTorch、transformers、peft、deepspeed等。準(zhǔn)備訓(xùn)練數(shù)據(jù)按照框架規(guī)定的JSON格式組織。在配置界面選擇模型名稱、微調(diào)方法LoRA、數(shù)據(jù)集、學(xué)習(xí)率、批次大小等參數(shù)。啟動(dòng)訓(xùn)練監(jiān)控?fù)p失曲線和顯存占用。訓(xùn)練完成后合并LoRA權(quán)重導(dǎo)出完整模型。用評(píng)測(cè)集或?qū)嶋H圖片測(cè)試模型效果。這里重點(diǎn)說兩個(gè)容易被忽視的參數(shù)。第一個(gè)是image_resolution也就是輸入圖片的分辨率。不同模型對(duì)分辨率有不同要求盲目調(diào)高會(huì)導(dǎo)致視覺token數(shù)量暴增訓(xùn)練顯存跟不上。第二個(gè)是lora_rankLoRA的秩大小。秩越大可訓(xùn)練參數(shù)越多模型能力上限越高但過擬合風(fēng)險(xiǎn)也增加。我一般先設(shè)64看驗(yàn)證集效果再調(diào)整。5.4 顯存不夠怎么辦很多人在本地部署或微調(diào)多模態(tài)模型時(shí)卡在顯存上。16G顯存加32G內(nèi)存能部署什么規(guī)模的多模態(tài)模型我的經(jīng)驗(yàn)是純推理情況下7B到8B的模型可以用4比特量化跑起來大概占用6G到8G顯存剩余內(nèi)存會(huì)被部分卸載到系統(tǒng)內(nèi)存速度會(huì)慢一些但能用。如果是14B模型建議至少24G顯存或者用CPU推理方案速度比較慢但至少能跑。微調(diào)比推理更吃顯存。16G顯存跑7B模型的LoRA微調(diào)開啟梯度檢查點(diǎn)把batch size設(shè)成1勉強(qiáng)可行。如果想跑14B的微調(diào)建議還是上24G或更高顯存的顯卡。這個(gè)資源門檻是客觀存在的避不開。但不用為此焦慮先跑小模型把流程走通比什么都強(qiáng)。6. 評(píng)測(cè)指標(biāo)與模型效果驗(yàn)證6.1 常用的公開評(píng)測(cè)基準(zhǔn)多模態(tài)模型的評(píng)測(cè)比純語言模型復(fù)雜因?yàn)榧纫次谋旧少|(zhì)量又要看圖文匹配的準(zhǔn)確性。目前常見的評(píng)測(cè)基準(zhǔn)有MMMU涵蓋多個(gè)學(xué)科領(lǐng)域的多模態(tài)理解基準(zhǔn)題目涉及圖表、幾何、人文社科等難度較高。MMBench中文和英文都覆蓋的多模態(tài)評(píng)測(cè)基準(zhǔn)題目類型豐富適合衡量綜合能力。SEED-Bench包含視頻和圖像理解任務(wù)側(cè)重跨模態(tài)理解能力。TextVQA聚焦圖片中的文字識(shí)別與問答測(cè)試模型對(duì)OCR結(jié)果的推理能力。這些基準(zhǔn)都有公開的評(píng)測(cè)腳本可以直接跑。但要注意同一個(gè)模型在不同評(píng)測(cè)集上的表現(xiàn)差異可能很大因?yàn)樵u(píng)測(cè)題目的數(shù)據(jù)分布不同。選擇評(píng)測(cè)基準(zhǔn)時(shí)要結(jié)合自己的應(yīng)用場(chǎng)景。如果你做的是文檔理解TextVQA的參考價(jià)值就比MMMU更大。6.2 手動(dòng)評(píng)測(cè)的意義公開評(píng)測(cè)集不能解決所有問題。我見過不少模型在公開評(píng)測(cè)集上分?jǐn)?shù)很高但在真實(shí)業(yè)務(wù)數(shù)據(jù)上表現(xiàn)平平原因就是數(shù)據(jù)分布不匹配。所以除了跑公開集我強(qiáng)烈建議自己準(zhǔn)備一批“私有評(píng)測(cè)數(shù)據(jù)”最好是從實(shí)際場(chǎng)景里抽出來的圖片和問題。手動(dòng)評(píng)測(cè)時(shí)不要只看答案對(duì)不對(duì)還要關(guān)注幾點(diǎn)回答是否詳細(xì)具體還是只會(huì)給模糊結(jié)論對(duì)同一張圖片用不同問法問回答是否穩(wěn)定面對(duì)圖片里的文字、圖表、復(fù)雜場(chǎng)景時(shí)是理解還是胡編。這些觀察能幫你快速找到模型的短板再針對(duì)性地補(bǔ)充訓(xùn)練數(shù)據(jù)。比如發(fā)現(xiàn)模型總是把數(shù)字看錯(cuò)就多收集帶數(shù)字的圖片數(shù)據(jù)。這種“評(píng)測(cè)-發(fā)現(xiàn)問題-補(bǔ)充數(shù)據(jù)-再評(píng)測(cè)”的循環(huán)才是實(shí)際工作中提升模型效果最有效的方式。6.3 常見評(píng)價(jià)指標(biāo)的坑多模態(tài)生成類任務(wù)里很多人喜歡用BLEU、ROUGE這類文本匹配指標(biāo)但我要提醒一句這類指標(biāo)在多模態(tài)問答場(chǎng)景下參考價(jià)值很有限。因?yàn)橥粋€(gè)問題可以有多種表達(dá)方式答案文字不同不代表語義錯(cuò)誤。更好的做法是同時(shí)使用語義相似度指標(biāo)和人工評(píng)測(cè)。另外準(zhǔn)確率不等于能力。有時(shí)候模型在某個(gè)評(píng)測(cè)集上準(zhǔn)確率提升只是因?yàn)樗诖鸢改0迳线^擬合了。所以做評(píng)測(cè)時(shí)最好定期換一批新問題避免模型“記住”測(cè)試集。7. 部署落地把多模態(tài)模型跑起來7.1 部署框架選型訓(xùn)練完模型最終要部署成服務(wù)才能真正被業(yè)務(wù)使用。多模態(tài)模型的部署和純語言模型類似核心目標(biāo)都是在有限的硬件資源下盡量提高吞吐量和降低響應(yīng)延遲。目前主流的部署工具有vLLM、SGLang、Xinference以及Ollama這類面向個(gè)人用戶的產(chǎn)品級(jí)工具。它們都支持常見的多模態(tài)模型格式。vLLM的優(yōu)勢(shì)是吞吐量高支持連續(xù)批處理和PagedAttention適合并發(fā)請(qǐng)求較多的場(chǎng)景。SGLang在結(jié)構(gòu)化推理方面有優(yōu)勢(shì)但社區(qū)生態(tài)和文檔相對(duì)vLLM少一些。Ollama的優(yōu)勢(shì)是上手門檻極低適合個(gè)人電腦上體驗(yàn)但生產(chǎn)環(huán)境的靈活度和性能優(yōu)化選項(xiàng)不夠豐富。我實(shí)際用下來的體驗(yàn)是做生產(chǎn)環(huán)境優(yōu)先考慮vLLM個(gè)人折騰Ollama就夠了。如果你部署的是Qwen-VL或InternVL這類主流模型vLLM官方文檔基本都有完整的部署示例照著做就行。7.2 部署一個(gè)多模態(tài)服務(wù)的操作示范以vLLM部署Qwen2-VL-7B-Instruct為例代碼大致是這樣的from vllm import LLM, SamplingParams llm LLM( modelQwen/Qwen2-VL-7B-Instruct, limit_mm_per_prompt{image: 4, video: 1}, ) sampling_params SamplingParams( temperature0.7, top_p0.8, max_tokens512, ) prompt [ { role: user, content: [ {type: image, image: https://example.com/cat.jpg}, {type: text, text: 請(qǐng)描述這張圖片里的動(dòng)物。} ] } ] outputs llm.chat(messagesprompt, sampling_paramssampling_params) print(outputs[0].outputs[0].text)這里幾個(gè)參數(shù)值得解釋一下。limit_mm_per_prompt限制了單次請(qǐng)求里能包含的圖片或視頻數(shù)量防止用戶傳入超大輸入導(dǎo)致顯存溢出。max_tokens控制生成的最大長度對(duì)于視覺問答場(chǎng)景我一般設(shè)256到512太長會(huì)拖慢響應(yīng)速度。如果你要部署成HTTP服務(wù)vLLM還提供了OpenAI兼容的API服務(wù)啟動(dòng)方式一條命令就能完成vllm serve Qwen/Qwen2-VL-7B-Instruct --limit-mm-per-prompt image4啟動(dòng)之后可以按OpenAI接口格式發(fā)送請(qǐng)求這對(duì)于接入現(xiàn)有的應(yīng)用框架非常方便。7.3 推理速度和并發(fā)優(yōu)化多模態(tài)模型的推理速度瓶頸通常在兩個(gè)地方視覺編碼器的前向計(jì)算以及語言模型階段的token生成。如果你發(fā)現(xiàn)服務(wù)響應(yīng)很慢先判斷慢在哪一步。一般圖片尺寸越大視覺編碼階段越慢。優(yōu)化手段包括控制輸入圖片的分辨率、對(duì)圖片做預(yù)處理縮放、使用更小的視覺編碼器。并發(fā)場(chǎng)景下顯存是稀缺資源。如果多張卡并行可以使用張量并行tensor parallel或數(shù)據(jù)并行。vLLM會(huì)自動(dòng)處理連續(xù)批處理但你要根據(jù)實(shí)際并發(fā)量調(diào)整max_num_seqs參數(shù)。設(shè)太大會(huì)把顯存占滿設(shè)太小又浪費(fèi)算力。我一般是從默認(rèn)值開始實(shí)測(cè)并發(fā)和延遲后再調(diào)。還有一個(gè)經(jīng)驗(yàn)部署模型前先把精度測(cè)試和壓力測(cè)試做一遍。精度測(cè)試看模型輸出是否正確壓力測(cè)試看并發(fā)上來后會(huì)不會(huì)OOM或超時(shí)。這兩步在真實(shí)業(yè)務(wù)里非常重要但很多初學(xué)者容易忽略。8. 實(shí)操過程中最常踩的坑8.1 訓(xùn)練不收斂或Loss震蕩多模態(tài)模型訓(xùn)練比純語言模型更容易出現(xiàn)Loss不收斂的情況。第一個(gè)原因是學(xué)習(xí)率設(shè)置不當(dāng)。多模態(tài)模型通常有兩個(gè)或多個(gè)模塊不同模塊適合的學(xué)習(xí)率不同。比如連接器部分可以給稍大的學(xué)習(xí)率視覺編碼器如果解凍則需要更小的學(xué)習(xí)率。我在訓(xùn)練時(shí)一般把基礎(chǔ)學(xué)習(xí)率設(shè)為1e-5到2e-5LoRA層的學(xué)習(xí)率可以稍大一些。第二個(gè)原因是數(shù)據(jù)問題。圖文數(shù)據(jù)不對(duì)齊、圖片路徑錯(cuò)誤、文本與圖片內(nèi)容不相關(guān)都會(huì)導(dǎo)致訓(xùn)練不穩(wěn)定。建議訓(xùn)練前先寫一個(gè)數(shù)據(jù)驗(yàn)證腳本隨機(jī)抽幾百條數(shù)據(jù)檢查圖片能不能正常加載、文本是否有亂碼、圖文內(nèi)容是否確實(shí)相關(guān)。第三個(gè)原因是精度問題?;旌暇扔?xùn)練用的bf16和fp16在多模態(tài)場(chǎng)景下表現(xiàn)差異明顯。如果模型加載后出現(xiàn)Loss跑飛可以嘗試切到bf16它對(duì)數(shù)值溢出的容錯(cuò)性更好。8.2 模型輸出“幻覺”嚴(yán)重多模態(tài)模型的幻覺問題非常常見具體表現(xiàn)是圖片里根本沒有的東西模型描述得頭頭是道圖片里看不清的文字模型會(huì)腦補(bǔ)出內(nèi)容。這個(gè)問題和訓(xùn)練數(shù)據(jù)的質(zhì)量直接相關(guān)。如果訓(xùn)練數(shù)據(jù)里大量出現(xiàn)圖文不匹配的情況模型就學(xué)會(huì)“編造”了。一個(gè)有效的緩解方法是在指令數(shù)據(jù)里加入明確的約束比如問“圖片中有幾條狗”時(shí)答案統(tǒng)一寫“根據(jù)圖像圖中有一條狗”而不是簡單寫“一條狗”。這種帶有推理過程的回答能幫助模型建立起“先看再答”的習(xí)慣。另外在推理時(shí)可以設(shè)置較低的溫度參數(shù)比如0.1或0.2降低生成時(shí)的隨機(jī)性減少幻覺。8.3 本地資源不足的應(yīng)對(duì)策略如果你手頭只有16G顯存甚至更少別灰心有幾個(gè)變通思路第一盡量用量化模型。4比特量化對(duì)多模態(tài)模型的視覺特征表達(dá)能力有影響但多數(shù)場(chǎng)景下可以接受。第二用小尺寸底座。3B、4B級(jí)別的多模態(tài)模型在普通顯卡上也能跑得不錯(cuò)效果雖不如7B但對(duì)學(xué)習(xí)流程來說足夠了。第三用云GPU。如果只是偶爾訓(xùn)練租一塊40G以上顯存的顯卡按小時(shí)計(jì)費(fèi)比自己買卡劃算得多。我之前就是用16G顯存跑了4比特量化后的7B模型微調(diào)batch size為1開了梯度檢查點(diǎn)雖然每一步訓(xùn)練時(shí)間比大顯存慢不少但流程完全跑通了。有些事不是條件完美才能做而是先跑起來再逐步優(yōu)化。9. 從學(xué)到用的擴(kuò)展建議我之前在本地用Ollama部署過幾個(gè)多模態(tài)模型配合一些主流的RAG框架做圖文混合檢索效果出乎意料地好。比如把一份文檔里的圖片和文字分別抽出來圖片用多模態(tài)模型生成文字描述再統(tǒng)一走向量檢索這樣用戶在提問時(shí)既能命中文字段落也能通過圖片描述找到相關(guān)圖片。這套方案特別適合知識(shí)庫、產(chǎn)品說明書、培訓(xùn)資料這類場(chǎng)景。多模態(tài)模型的應(yīng)用范圍還在快速擴(kuò)展和Agent結(jié)合也是一個(gè)大方向。讓模型不僅能看圖說話還能根據(jù)圖片內(nèi)容調(diào)用工具、操作系統(tǒng)這個(gè)領(lǐng)域還處于比較早期的階段值得持續(xù)關(guān)注。但我始終相信先把基礎(chǔ)打牢把訓(xùn)練、微調(diào)、評(píng)測(cè)、部署這一整套流程走通無論后續(xù)技術(shù)怎么演進(jìn)你都有能力快速跟上。對(duì)于正在規(guī)劃學(xué)習(xí)路線的人我的建議是不要囤資料不要重復(fù)看教程找一個(gè)開源的多模態(tài)模型準(zhǔn)備一批自己的數(shù)據(jù)從微調(diào)到部署親手走一遍。這個(gè)過程會(huì)比看十篇論文都管用。踩過坑、看過崩潰日志、調(diào)過損失曲線這些經(jīng)歷才是真正讓你從“知道”變成“會(huì)做”的關(guān)鍵。