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