
1. 項目概述為什么你需要這份超參數指南如果你正在嘗試用LlamaFactory微調大模型卻發現自己像個無頭蒼蠅一樣面對幾十個超參數無從下手那么你來對地方了。我見過太多朋友興致勃勃地打開項目準備好數據集結果在訓練配置頁面卡了半小時最后只能憑感覺亂填一通或者干脆照抄一個“據說有效”的配置。結果呢要么訓練了幾個小時發現loss紋絲不動白白浪費電費要么模型訓出來效果詭異還不如不調。這份指南的目的就是終結這種“玄學調參”的狀態。它不是一份冰冷的官方文檔翻譯而是我基于大量實戰微調從7B到70B參數的各種模型后把那些文檔里沒寫、論壇里散落、以及用真金白銀的GPU時間換來的經驗系統性地梳理給你。LlamaFactory作為一個功能強大的微調框架把很多復雜操作封裝成了簡單的Web UI和配置項但這并不意味著背后的原理可以忽略。理解每一個滑塊、每一個輸入框背后的含義你才能真正掌控訓練過程讓模型朝著你期望的方向進化而不是聽天由命。無論你是想用QLoRA低成本微調一個專屬的客服助手還是用全量參數微調打造一個領域專家模型超參數都是你手中的“方向盤”和“油門”。調好了事半功倍調瞎了事倍功半甚至前功盡棄。接下來我會把這些參數分成幾個核心模塊不僅告訴你怎么設更重點講清楚為什么這么設以及設錯了會怎樣。這份指南足夠你從完成第一次微調到逐步優化出屬于自己的最佳配方。2. 訓練前的基石數據、模型與基礎配置解析在動任何一個超參數之前有三件事必須門兒清你的數據長什么樣、你的模型基礎是什么、你打算用什么“方法論”來訓。這相當于打仗前的偵察、裝備檢查和戰術制定。2.1 數據格式與預處理喂給模型的第一口糧數據是訓練的根基。LlamaFactory支持常見的指令微調格式如alpaca、sharegpt等但萬變不離其宗核心通常是三個字段instruction指令、input輸入、output輸出。很多新手會直接拿網上爬的對話數據往里塞導致格式不對齊訓練時模型完全學歪。關鍵實操點格式清洗確保你的每條數據都結構清晰。例如對于單輪問答instruction是問題input可以為空output是標準答案。對于多輪對話通常需要使用sharegpt格式將整個對話歷史按角色human/gpt組織成一個列表。一個常見的坑是數據里包含了多余的空格、換行符或者特殊標記如|im_end|這些需要在預處理時用腳本統一清洗掉。長度處理大模型有上下文長度限制如4096、8192 tokens。你需要估算你的數據經過分詞tokenization后的大致長度。可以使用transformers庫的AutoTokenizer快速測試。如果instructioninputoutput遠超模型最大長度必須進行截斷或滑窗處理否則訓練會報錯。LlamaFactory的max_source_length和max_target_length參數就是用來控制這個的通常max_source_length設為你數據中“輸入部分”instructioninput的最大token數再加一點余量max_target_length設為“輸出部分”output的最大token數。質量檢查垃圾進垃圾出。隨機的、矛盾的、低質量的數據會讓模型性能下降。至少手動抽查幾百條數據確保指令明確、答案正確。對于垂直領域數據術語的一致性非常重要。注意不要迷信“數據越多越好”。1萬條高質量、清洗干凈的數據遠勝于10萬條噪聲大的數據。在資源有限的情況下優先提升數據質量。2.2 基座模型選擇站在巨人的哪個肩膀上微調不是無中生有而是對預訓練好的基座模型Base Model進行“二次教育”。選擇什么樣的基座決定了你的起點和天花板。模型尺寸參數量7B、13B、34B、70B……參數越大通常理解能力和生成能力越強但訓練和推理成本也指數級上升。對于大多數個人開發者或中小團隊7B或13B模型是性價比最高的起點。它們可以在消費級顯卡如RTX 4090上使用QLoRA進行微調并且響應速度較快。模型家族Llama、Qwen、Baichuan、ChatGLM等各有特點。例如Meta的Llama系列通用性強生態最豐富Qwen在中文和代碼上表現突出ChatGLM對中文友好。你的選擇應優先考慮目標任務的語種和領域。如果你想做中文對話選一個中文預訓練占比高的基座如Qwen或Baichuan會比用純英文Llama基座微調中文數據起點高得多。版本與量化注意模型是FP16、BF16還是GPTQ/AWQ量化版本。訓練時應盡量使用FP16/BF16的原始精度模型。量化模型如GPTQ-Int4主要用于推理節省顯存直接用來微調可能會引入精度損失影響最終效果。你下載的模型如果是量化版需要確認是否有對應的非量化版本。如何決策如果你做通用對話選最新的Llama或Qwen的7B/13B版本。如果做垂直領域法律、醫療可以尋找在該領域數據上繼續預訓練過的模型作為基座這叫“領域適應預訓練”比直接用通用基座微調效果更好。2.3 微調方法選型全量、LoRA還是QLoRA這是核心決策點直接決定了你的硬件門檻和訓練效果。全量參數微調更新模型的所有參數。效果通常最好能最大程度讓模型適應新數據。但代價是需要巨大的顯存足以放下整個模型、優化器狀態和梯度。即使是7B模型全量微調也需要多張A100級別的顯卡。除非你有充足的算力且追求極致效果否則不推薦個人玩家嘗試。LoRA一種參數高效微調方法。它不在原始模型權重上直接更新而是通過引入額外的、低秩的適配器Adapter矩陣只訓練這些新增的小參數。比如一個7B的模型LoRA參數可能只有幾百萬顯存占用極低。好處是快、省資源并且可以多個任務訓練不同的LoRA權重靈活切換。效果上通常非常接近全量微調。QLoRALoRA的“升級省流版”。它在LoRA的基礎上進一步將基座模型的權重量化為4-bitNF4格式同時采用一種叫雙重量化的技術來節省內存。QLoRA是當前個人電腦微調大模型的絕對主流選擇。它能讓你在單張24GB顯存的卡上如RTX 4090微調13B甚至34B的模型而效果損失極小。我的建議對于99%的場景無腦選擇QLoRA。它在LlamaFactory中集成得非常好配置簡單。你需要關心的相關參數主要是lora_rankLoRA的秩決定適配器的大小和能力、lora_alpha縮放系數和lora_dropout防止過擬合。通常可以從一個中等配置開始如rank64, alpha16這是一個效果和效率的平衡點。3. 學習過程控制優化器、調度器與批次設置詳解這一部分是訓練過程的“發動機”和“變速器”控制著模型如何從數據中學習。3.1 學習率前進的步幅大小學習率是最重要也最需要小心的超參數之一。它決定了每次參數更新的幅度。設置多大對于使用AdamW優化器的QLoRA微調學習率通常在1e-4到5e-5這個范圍。這是一個經驗性的安全區間。學習率太大如1e-3可能導致訓練不穩定loss劇烈震蕩甚至發散變成NaN。學習率太小如1e-6則學習速度過慢需要非常多的步數才能收斂不經濟。如何調整一個穩妥的策略是從2e-4或1e-4開始。觀察訓練前幾百步的loss曲線。如果loss快速下降且平穩說明學習率合適。如果loss劇烈跳動應調小學習率例如除以2或5。如果loss下降極其緩慢可以適當調大。學習率調度我們很少使用固定的學習率。更常見的做法是配合學習率調度器比如余弦退火。在LlamaFactory中你可以設置lr_scheduler_type為cosine并設置warmup_steps。這意味著訓練開始時學習率會從一個很小的值或0線性“預熱”到你設定的峰值學習率幫助訓練初期穩定然后在訓練過程中按照余弦曲線逐漸下降至0讓訓練后期更精細地收斂。實操心得對于不同的模型尺寸學習率可以微調。大模型如70B有時對學習率更敏感可能需要更小的初始值如5e-5。當你更換基座模型或數據集時第一輪訓練建議保守一點用較低的學習率探路。3.2 優化器選擇AdamW及其變種AdamW是目前深度學習默認的優化器它自適應地調整每個參數的學習率并加入了權重衰減Weight Decay來防止過擬合。在LlamaFactory中你通常不需要改動優化器類型。但需要關注一個關鍵參數weight_decay。權重衰減相當于對大的權重值施加懲罰鼓勵模型保持較小的權重起到正則化的作用。對于微調任務特別是數據量不是特別大的時候一個較小的權重衰減如0.01或0.001有助于防止模型在少量數據上過擬合忘記它原有的通用知識。如果設置為0則沒有正則化。3.3 批次設置批量大小與梯度累積由于顯存限制我們無法一次性將大量數據送入模型。批次設置就是解決這個問題的。per_device_train_batch_size這是每張顯卡一次前向傳播處理的樣本數。這個值越大訓練越穩定對梯度的估計越準確但顯存占用越高。在QLoRA下由于模型本身被量化顯存主要被激活activation和優化器狀態占用。對于24G顯存7B模型這個值可以設到4-813B模型可以設到2-4。你需要根據CUDA Out Of Memory (OOM) 錯誤來調整。gradient_accumulation_steps梯度累積步數。這是核心技巧假設你希望的有效批次大小是32但單卡只能放下批次大小4。那么你可以設置gradient_accumulation_steps8。這樣模型會連續進行8次前向傳播和反向傳播累積8次的梯度然后再進行一次真正的參數更新。它讓你在有限的顯存下模擬出大批次訓練的效果。最終的有效批次大小 per_device_train_batch_size*gradient_accumulation_steps* GPU數量。max_grad_norm梯度裁剪的閾值。在反向傳播時如果梯度的范數可以理解為“長度”超過這個值就會被按比例縮放。這是一個安全措施防止梯度爆炸導致訓練崩潰。通常設置為0.5或1.0即可。配置策略首先根據你的顯存將per_device_train_batch_size調到最大不OOM為止。然后根據你期望的有效批次大小反推gradient_accumulation_steps。對于語言模型微調有效批次大小在32到128之間都是常見的。例如單卡batch_size4想要有效批次大小32則設置gradient_accumulation_steps8。4. 訓練過程與評估監控參數設好了訓練跑起來了但這只是開始。你需要像監工一樣盯著整個過程確保它在正確的軌道上。4.1 訓練輪數與步數控制num_train_epochs在整個數據集上完整遍歷的次數。對于指令微調數據集通常不大幾千到幾萬條1到5個epoch通常就足夠了。模型很快就能學會數據中的映射關系。過多的epoch會導致過擬合即模型完美記住了你的訓練數據但失去了泛化能力對新問題回答得很差。max_steps訓練的最大步數。如果設置了此項會覆蓋num_train_epochs。一步step即一次參數更新優化器step。總步數 ≈ (總樣本數 * num_train_epochs) / 有效批次大小。我更傾向于用max_steps來控制因為它更直觀。例如我有1萬條數據有效批次大小是32那么一個epoch大約是312步。我想訓練3個epoch就設max_steps936。如何判斷何時停止光看epoch數不夠必須看評估指標。4.2 評估策略與損失曲線解讀LlamaFactory允許你設置一個評估數據集eval dataset和eval_steps每多少步評估一次。Loss損失曲線這是最直接的監控指標。訓練loss應該隨著步數增加而穩步下降最終趨于平緩。評估loss的變化趨勢更重要理想情況訓練loss和評估loss同步下降且評估loss略高于訓練loss。這說明模型在很好地學習泛化。過擬合跡象訓練loss持續下降但評估loss在下降到某個點后開始反彈上升。這說明模型開始“死記硬背”訓練數據對新數據不友好了。此時應該立即停止訓練或者回滾到評估loss最低的那個檢查點。欠擬合跡象訓練loss和評估loss都很高且下降緩慢。這可能是因為學習率太低、模型容量不足LoRA的rank太小或數據質量太差。生成質量評估Loss是數字但生成文本的質量才是終極檢驗。你需要定期比如每半個或一個epoch讓模型在預留的測試集或一些標準問題上生成文本人工評估其流暢度、相關性和準確性。這是發現Loss曲線無法反映的問題如胡說八道、重復生成的唯一方法。避坑技巧一定要保留一部分高質量數據比如10%作為驗證集不用來訓練只用來評估。用驗證集上的loss最低點來選擇最佳模型而不是用訓練結束時的模型。4.3 保存與日志策略save_steps/save_strategy設置模型檢查點保存的頻率。“steps”模式按步數保存“epoch”模式按輪次保存。對于長時間訓練建議按步數保存如每500步這樣如果訓練中斷可以從最近的檢查點恢復而不是從頭開始。logging_steps控制日志打印頻率。設為10或20方便你實時觀察loss變化。report_to日志報告到哪里。設為“tensorboard”或“wandb”Weights Biases可以可視化訓練過程強烈推薦。TensorBoard是本地工具WandB是線上服務功能更強大。5. 高級參數與實戰調優策略掌握了基礎參數后這些高級設置能幫你進一步微調訓練行為解決特定問題。5.1 長度外推與注意力機制rope_scaling/max_position_embeddings如果你的訓練數據或應用場景需要模型處理比其預訓練時更長的文本例如Llama2預訓練長度是4096但你想處理8000 tokens的文檔就需要進行長度外推。rope_scaling如linear,dynamic是一種技術可以讓模型在一定程度上適應更長的序列。但請注意這并非萬能效果可能不如在長文本上直接繼續預訓練。對于微調除非必要否則建議將訓練數據截斷到模型原生支持的長度內以獲得最穩定的效果。flash_attention_2如果你的顯卡架構支持如Ampere架構的RTX 30/40系列或更新開啟FlashAttention-2可以大幅提升訓練速度并降低顯存占用。在LlamaFactory的配置中或代碼里啟用它通常是設置一個use_flash_attention_2True的標志。這是免費的午餐能開就開。5.2 防止過擬合的利器Dropout與早停dropout/lora_dropoutDropout是一種在訓練過程中隨機“關閉”一部分神經元的技術可以強制模型學習更魯棒的特征是防止過擬合的有效手段。對于全量微調可以設置一個較小的dropout如0.05或0.1。對于LoRA/QLoRA可以設置lora_dropout如0.05。如果發現模型在訓練集上表現太好在驗證集上表現差可以適當增加這個值。早停雖然LlamaFactory的Trainer沒有內置早停回調但你可以通過監控評估loss來實現。如果連續N次評估例如3-5次的loss都不再下降甚至上升就可以手動停止訓練。WandB等工具可以設置警報。5.3 實戰調優流程與參數表這里提供一個基于QLoRA微調7B/13B模型的通用參數起點表你可以以此為基礎進行微調參數類別參數名推薦值/范圍作用與說明模型與數據model_name_or_path你的基座模型路徑必須是FP16/BF16格式非量化版max_source_length512-1024輸入指令上下文最大token長度根據數據調整max_target_length256-512輸出回答最大token長度根據數據調整LoRA配置use_loraTrue啟用LoRAlora_rank(r)64LoRA秩影響適配器大小。8/16/32/64/128常見越大能力越強但參數越多lora_alpha16縮放系數通常與rank保持比例如 rank64, alpha16lora_dropout0.05LoRA層的dropout率防過擬合lora_targetq_proj,v_proj作用的目標模塊。通常作用于注意力層的Q/V投影矩陣。all也行但更慢訓練控制num_train_epochs1-5訓練輪數數據少可多幾輪數據多則少幾輪per_device_train_batch_size2-8根據顯存調整24G卡13B模型可設2-4gradient_accumulation_steps8-32用于調整有效批次大小使batch_size*accum_steps在32-128間learning_rate1e-4 到 5e-5學習率從2e-4開始嘗試lr_scheduler_typecosine余弦退火調度器warmup_steps總步數的3%-10%學習率預熱步數幫助訓練初期穩定optimadamw_torch優化器weight_decay0.01權重衰減正則化項max_grad_norm0.5梯度裁剪閾值防梯度爆炸評估與保存evaluation_strategysteps按步評估eval_steps100-200每多少步評估一次save_strategysteps按步保存save_steps500每多少步保存一個檢查點logging_steps20每多少步打印一次日志report_totensorboard或wandb可視化工具調優流程建議基線運行使用上表中的推薦值作為起點跑一個完整的訓練例如1-3個epoch。分析Loss曲線觀察訓練和評估loss。如果收斂良好評估loss未上升進入步驟4。如果欠擬合loss高且降得慢進入步驟3。如果過擬合評估loss上升進入步驟5。應對欠擬合嘗試增大學習率如從2e-4調到3e-4、增加LoRA rank如從64調到128、檢查數據質量或增加訓練輪數。效果評估用測試集進行人工或自動評估。如果效果滿意可以嘗試減小學習率如調到5e-5再微調少量步數可能獲得更精細的收斂。應對過擬合首先減少訓練輪數或提前停止。其次可以增加lora_dropout如調到0.1、增加weight_decay如調到0.05。最后考慮擴充或提升訓練數據質量。6. 常見問題排查與實戰心得理論說再多不如踩一次坑。下面是我和社區里經常遇到的一些典型問題及解決方案。6.1 訓練不收斂或Loss異常現象Loss值非常高如10且幾乎不下降或者變成NaN。排查學習率過大這是首要懷疑對象。立即將學習率調低一個數量級例如從1e-4調到1e-5重新嘗試。數據格式錯誤檢查你的數據預處理腳本。確保input和output字段沒有錯位分詞后沒有異常token。一個快速檢查方法是打印幾條數據看看拼接后的文本是否符合“Human: ... Assistant: ...”這樣的預期格式。梯度爆炸嘗試減小max_grad_norm比如從1.0調到0.5。模型/權重加載錯誤確認你加載的基座模型路徑正確且模型文件完整。嘗試用from_pretrained方法先加載一下模型和分詞器看是否報錯。6.2 顯存溢出CUDA Out Of Memory現象訓練開始不久就報CUDA out of memory錯誤。排查降低per_device_train_batch_size這是最直接有效的方法每次減半嘗試。啟用梯度檢查點在Trainer參數中設置gradient_checkpointingTrue。這會用計算時間換顯存通常能節省20%-30%的顯存。啟用FlashAttention-2如前所述能顯著節省顯存。檢查數據長度過長的max_source_length或max_target_length會急劇增加顯存消耗。確保它們設置合理。使用更小的模型或更低的量化如果以上都不行考慮換用參數量更小的基座模型或者在QLoRA中嘗試使用NF4量化這是默認的而不是FP16。6.3 模型輸出質量差重復、無關或胡說八道現象訓練結束后模型生成的內容重復一段話或者答非所問甚至輸出亂碼。排查過擬合這是最常見原因。模型只記住了訓練數據中的某些模式。檢查評估loss曲線看是否在后期上升。解決方案是使用早停或者增加Dropout/權重衰減。數據噪聲訓練數據中存在大量低質量或矛盾的樣本。需要清洗數據。溫度參數在推理時temperature參數控制生成隨機性。如果設為0模型會總是選擇概率最高的詞可能導致枯燥和重復。在生成時可以嘗試將temperature設為0.7-0.9top_p設為0.9以增加多樣性。LoRA權重未正確加載/合并確保在推理時正確加載了你微調好的LoRA權重適配器。在LlamaFactory的Web UI中需要在“模型”頁面正確選擇“適配器”路徑。6.4 一個實戰案例微調一個代碼助手假設我想用QLoRA微調一個CodeLlama-7B模型讓它更擅長寫Python代碼。數據準備我收集了約1萬條高質量的(問題描述, Python代碼)對格式化為alpaca格式。清洗掉代碼錯誤、描述模糊的樣本。統計后設定max_source_length512,max_target_length768。基座模型選擇CodeLlama-7B-Python因為它本身就在代碼上預訓練過起點高。QLoRA配置lora_rank64,lora_alpha16,lora_dropout0.05,lora_target_modules“q_proj,v_proj”。訓練配置per_device_train_batch_size4單卡RTX 4090gradient_accumulation_steps8有效批次大小32learning_rate2e-4num_train_epochs3warmup_steps50lr_scheduler_typecosineweight_decay0.01。監控設置eval_steps100用一個包含200條未見過代碼問題的驗證集進行評估。同時每500步保存一個檢查點。訓練與選擇訓練開始后通過TensorBoard觀察loss。訓練loss穩步下降評估loss在第800步約2.5個epoch達到最低點之后開始緩慢上升。我果斷停止了訓練并選擇了第800步的檢查點作為最終模型。測試用該模型生成一些新的編程問題發現其代碼正確率和風格都明顯優于原始基座模型達到了預期目標。這個過程中最關鍵的就是通過評估loss發現了過擬合的苗頭并及時早停選出了泛化能力最好的模型而不是盲目跑完3個epoch。調參不是一蹴而就的而是一個觀察、分析、調整的循環。每次訓練都是一次實驗記錄下你的配置和結果慢慢你就會形成自己的“參數直覺”。