練2B模型:Puro-2B低成本復(fù)現(xiàn)指南)
Puro-2B 這個項目一句話就能說清楚它來自一個預(yù)算很緊的“窮人實驗室”目標是在一張 RTX 5090 顯卡上、用 5090 美元左右的總投入完成 Qwen2-1.5B 基礎(chǔ)模型的繼續(xù)訓(xùn)練最終得到一個參數(shù)規(guī)模在 2B 量級的模型。這個項目最值得關(guān)注的點不是效果能打平幾十 B 的大模型而是把“訓(xùn)練一個可用小模型”的硬件門檻壓到了消費級單卡范圍。這篇文章我會先拆解項目標題透露的關(guān)鍵信息再給出一套可以落地的復(fù)現(xiàn)路線從 RTX 5090 本地訓(xùn)練環(huán)境準備、Qwen2-1.5B 權(quán)重下載、LoRA / 全參微調(diào)腳本到推理接口部署和批量任務(wù)調(diào)用。如果你手里有 32GB 顯存級別的顯卡也關(guān)心 50 系顯卡上 PyTorch / CUDA 適配怎么處理可以直接照著下文走一遍。先說清楚Puro-2B 目前公開可查的信息主要集中在項目命名本身具體權(quán)重和訓(xùn)練代碼如果作者后續(xù)沒有放出來我們這篇文章的重點就是“復(fù)現(xiàn)一條同路線”。拿到作者倉庫后把模型路徑和訓(xùn)練腳本替換掉就能跑同一個思路。1. Puro-2B 核心能力速覽從項目標題可以穩(wěn)定提取出這幾個關(guān)鍵參數(shù)項目說明項目名稱Puro-2B基礎(chǔ)模型Qwen2-1.5B最終模型規(guī)模2B 級別訓(xùn)練硬件NVIDIA RTX 509032GB GDDR7 顯存項目預(yù)算約 5090 美元項目類型低成本本地訓(xùn)練實驗 / 微型實驗室開源項目訓(xùn)練目標在單張消費級顯卡上完成小參數(shù)模型的繼續(xù)訓(xùn)練適用讀者想自己訓(xùn)練私有模型的個人開發(fā)者、高校實驗室、中小團隊推理服務(wù)拿到權(quán)重后可用 vLLM / transformers 自建 OpenAI 兼容接口批量任務(wù)支持通過 JSONL 批量調(diào)用或腳本循環(huán)完成商用邊界需遵守 Qwen2 開源協(xié)議訓(xùn)練數(shù)據(jù)必須有合法授權(quán)這里有幾個點值得展開一下基礎(chǔ)模型選 Qwen2-1.5B說明作者更關(guān)注“小模型 通用對話能力”的組合。Qwen2 系列在中文和英文任務(wù)上的平衡做得不錯1.5B 參數(shù)量對單卡訓(xùn)練非常友好。RTX 5090 是 Blackwell 架構(gòu)的旗艦消費卡32GB 顯存給了單卡訓(xùn)練 1.5B 級模型足夠的空間。全參微調(diào)不是沒可能LoRA / QLoRA 更穩(wěn)妥。5090 美元這個數(shù)字把顯卡、整機、存儲、電費等成本壓縮到了一個“個人攢機”的預(yù)算范圍。這本身就是這個項目最大的價值信號。從這張表可以看出Puro-2B 不是一個典型的高性能大模型項目而是一次“平民化訓(xùn)練”實驗。它真正想做的是證明小實驗室不用租云端集群也能把一個 2B 級模型從底座訓(xùn)練到可用狀態(tài)。2. Puro-2B 的定位與適用邊界2.1 這個項目適合誰如果你屬于下面幾類人Puro-2B 這條路線值得花半天時間跑一遍需要私有化模型的團隊。數(shù)據(jù)不能出內(nèi)網(wǎng)只能本地訓(xùn)練和推理2B 級模型部署成本低單卡就能扛。準備入門大模型訓(xùn)練的學生或研究者。用 RTX 5090 單卡跑通一遍訓(xùn)練流程比看十篇論文理解更深。做垂直領(lǐng)域應(yīng)用的個人開發(fā)者。想在客服問答、文檔摘要、代碼補全等特定場景里做一個“夠用”的模型而不是追求通用能力。2.2 這個項目不適合什么場景如果目標是通用助手級別的智能水平Puro-2B 這種 2B 模型沒辦法和幾十 B、上百 B 的模型比。它在知識密度、復(fù)雜推理、長文本穩(wěn)定性上都會明顯受限于參數(shù)量。更適合做垂直任務(wù)、專用場景的模型不適合直接當全能聊天機器人給一群用戶用。2.3 使用邊界和合規(guī)提醒訓(xùn)練、推理和二次開源時必須注意幾個底線Qwen2 系列模型有自己的開源協(xié)議。如果你基于 Qwen2-1.5B 繼續(xù)訓(xùn)練發(fā)布微調(diào)模型時一般需要繼續(xù)遵守原協(xié)議。訓(xùn)練語料必須來源合法。不要爬取未授權(quán)的對話數(shù)據(jù)、他人隱私信息或受版權(quán)保護的書籍文章。如果模型會處理用戶輸入需要考慮數(shù)據(jù)脫敏和隱私保護。不要用這個能力去做欺騙、偽造、批量騷擾等行為。這塊不是套話是本地模型最容易踩的坑。很多同學訓(xùn)練的時候不在意語料來源后面如果要商用授權(quán)問題會直接卡住項目。3. 訓(xùn)練復(fù)現(xiàn)的環(huán)境準備3.1 硬件配置Puro-2B 項目的核心訓(xùn)練硬件是 RTX 5090。要跑通 Qwen2-1.5B 的 LoRA 微調(diào)32GB 顯存空間非常充裕即使你手里是 24GB 顯存的 RTX 4090做同樣的實驗也沒有問題。建議的硬件基線部件最低配置推薦配置GPURTX 4090 24GBRTX 5090 32GBCPU8 核以上16 核以上內(nèi)存32GB64GB硬盤50GB 可用空間200GB SSD 以上系統(tǒng)Ubuntu 22.04 / 24.04Ubuntu 24.04 或 Windows WSL2Qwen2-1.5B 模型文件、訓(xùn)練數(shù)據(jù)集、中間 checkpoint 和最終權(quán)重加起來早期預(yù)留 50GB 左右比較舒服。3.2 系統(tǒng)與驅(qū)動檢查RTX 50 系列發(fā)布后驅(qū)動、CUDA、PyTorch 三者的版本適配成了最常見的問題。如果你在 50 系顯卡上訓(xùn)練先做一次環(huán)境自檢nvidia-smi這一步可以確認驅(qū)動是否正常識別顯卡。然后查看驅(qū)動對應(yīng)的 CUDA 版本再根據(jù) PyTorch 官方安裝頁選擇匹配的組合。更穩(wěn)妥的做法是確認nvidia-smi能顯示 RTX 5090再去 PyTorch 官網(wǎng)選擇對應(yīng) CUDA 版本的安裝命令。很多“訓(xùn)練時報錯找不到 GPU”的情況不是顯卡壞了而是 PyTorch 沒有編譯對應(yīng) Blackwell 架構(gòu)的 kernel。3.3 Python 環(huán)境與依賴庫建議用 conda 建一個獨立環(huán)境避免污染系統(tǒng) Pythonconda create -n puro2b python3.10 -y conda activate puro2b然后安裝基礎(chǔ)依賴pip install torch transformers datasets peft trl bitsandbytes accelerate國內(nèi)網(wǎng)絡(luò)環(huán)境下可以用鏡像源pip install torch transformers datasets peft trl bitsandbytes accelerate -i https://mirrors.aliyun.com/pypi/simple/依賴庫版本不用刻意鎖死但要注意PyTorch 必須選擇支持 Blackwell 架構(gòu)的新版本bitsandbytes 也要升級到兼容版本。舊版本容易在加載模型時報CUDA error: no kernel image is available。安裝完成后執(zhí)行下面這段代碼確認 GPU 可用python -c import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))輸出為True和NVIDIA GeForce RTX 5090才說明環(huán)境正常。4. 模型與微調(diào)數(shù)據(jù)準備4.1 下載 Qwen2-1.5B 權(quán)重國內(nèi)用戶直接從 Hugging Face 下載可能比較慢可以用 ModelScopefrom modelscope import snapshot_download snapshot_download( Qwen/Qwen2-1.5B, local_dir./Qwen2-1.5B )也可以直接用transformers在運行時加載遠程權(quán)重但訓(xùn)練場景建議先下載到本地目錄避免訓(xùn)練過程中斷網(wǎng)導(dǎo)致失敗。4.2 構(gòu)造微調(diào)數(shù)據(jù)集對話類微調(diào)比較常見的數(shù)據(jù)格式是 ShareGPT 風格或 Alpaca 風格。這里用一個簡單的 JSONL 格式示例{conversations: [{role: user, content: 什么是RTX 5090}, {role: assistant, content: RTX 5090是NVIDIA基于Blackwell架構(gòu)的旗艦消費級顯卡配備32GB GDDR7顯存。}]} {conversations: [{role: user, content: 寫一個Python快速排序函數(shù)}, {role: assistant, content: def quick_sort(arr):\n if len(arr) 1:\n return arr\n pivot arr[len(arr) // 2]\n left [x for x in arr if x pivot]\n mid [x for x in arr if x pivot]\n right [x for x in arr if x pivot]\n return quick_sort(left) mid quick_sort(right)}]}訓(xùn)練時通過datasets.load_dataset(json, data_filestrain.jsonl)加載。如果數(shù)據(jù)量不大比如只有幾千條建議用 LoRA 而不是全參微調(diào)效果穩(wěn)定顯存壓力也小。4.3 數(shù)據(jù)質(zhì)量檢查訓(xùn)練前把數(shù)據(jù)里的空行、格式錯誤 JSON 行、超長對話清理掉。一個簡單檢查腳本import json valid_count 0 with open(train.jsonl, r, encodingutf-8) as f: for line in f: line line.strip() if not line: continue try: item json.loads(line) if conversations in item and len(item[conversations]) 2: valid_count 1 except json.JSONDecodeError: print(bad line:, line[:100]) print(valid samples:, valid_count)這一步能省掉很多訓(xùn)練中途 loss 變成 NaN 的麻煩。5. 微調(diào)訓(xùn)練與顯存規(guī)劃5.1 全參微調(diào)還是 LoRA從 Puro-2B 項目名字里的 “Trained on RTX 5090” 來看作者做的不是簡單推理而是真正在顯卡上跑了訓(xùn)練流程。但實際訓(xùn)練 1.5B 級模型有兩種路線全參微調(diào)Qwen2-1.5B 的 bf16 權(quán)重約 3GB。梯度約 3GB。AdamW 優(yōu)化器狀態(tài)按 12 字節(jié)/參數(shù)估算約 18GB。再加上激活值。這個量在 32GB 顯存的 RTX 5090 上可以跑但 batch size 和序列長度需要保守設(shè)置還要開gradient_checkpointing。LoRA 微調(diào)基礎(chǔ)權(quán)重凍結(jié)顯存占用大幅下降。優(yōu)化器狀態(tài)只更新新增的低秩適配器可能只需要 1GB 到 2GB。整體顯存占用通常在 10GB 到 15GB 之間訓(xùn)練更穩(wěn)定。如果數(shù)據(jù)量只有幾千條LoRA 更實用。如果你想把整個底座知識都更新一遍再考慮全參微調(diào)。5.2 LoRA 訓(xùn)練示例代碼下面是一份通用 LoRA 微調(diào)腳本按項目實際路徑替換模型目錄和數(shù)據(jù)集路徑即可# finetune_lora_puro2b.py import torch from datasets import load_dataset from transformers import ( AutoModelForCausalLM, AutoTokenizer, TrainingArguments, BitsAndBytesConfig, ) from peft import LoraConfig, get_peft_model, prepare_model_for_kbit_training from trl import SFTTrainer model_path ./Qwen2-1.5B dataset_path ./train.jsonl output_dir ./puro2b_lora_out bnb_config BitsAndBytesConfig( load_in_4bitTrue, bnb_4bit_compute_dtypetorch.bfloat16, bnb_4bit_use_double_quantTrue, bnb_4bit_quant_typenf4, ) model AutoModelForCausalLM.from_pretrained( model_path, quantization_configbnb_config, device_mapauto, trust_remote_codeTrue, ) tokenizer AutoTokenizer.from_pretrained(model_path, trust_remote_codeTrue) model prepare_model_for_kbit_training(model) lora_config LoraConfig( r16, lora_alpha32, lora_dropout0.05, biasnone, task_typeCAUSAL_LM, target_modules[q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj], ) model get_peft_model(model, lora_config) training_args TrainingArguments( output_diroutput_dir, per_device_train_batch_size2, gradient_accumulation_steps8, num_train_epochs3, learning_rate2e-4, bf16True, logging_steps10, save_steps200, save_total_limit3, report_tonone, optimpaged_adamw_8bit, gradient_checkpointingTrue, remove_unused_columnsFalse, ) trainer SFTTrainer( modelmodel, argstraining_args, train_datasetload_dataset(json, data_filesdataset_path, splittrain), tokenizertokenizer, max_seq_length2048, dataset_text_fieldconversations, ) trainer.train() trainer.save_model(output_dir) tokenizer.save_pretrained(output_dir)注意TRL 版本較新時SFTTrainer的dataset_text_field等參數(shù)可能調(diào)整遇到報錯時以對應(yīng)版本文檔為準。這段代碼是通用模板保證思路完整。5.3 訓(xùn)練參數(shù)對照參考設(shè)置項全參微調(diào)建議值LoRA 建議值權(quán)重精度bf164bit 量化 bf16 計算最大序列長度1024-20481024-2048Batch Size1-22-4梯度累積8-164-8優(yōu)化器AdamWpaged_adamw_8bit學習率1e-52e-4訓(xùn)練輪數(shù)2-32-3梯度檢查點開啟開啟混合精度bf16bf16這些配置不是固定標準但以 Qwen2-1.5B 和 RTX 5090 的組合來看是比較穩(wěn)的起點。5.4 先小規(guī)模預(yù)跑正式訓(xùn)練前強烈建議先切出 100 條數(shù)據(jù)、訓(xùn)練 5 到 10 步確認環(huán)境沒問題再全量訓(xùn)練。這樣能避免跑了兩小時后才發(fā)現(xiàn)數(shù)據(jù)集解析錯誤。python finetune_lora_puro2b.py訓(xùn)練過程中可以看到 loss 逐步下降。如果 loss 完全不動或者直接 NaN優(yōu)先檢查學習率、數(shù)據(jù)格式和混合精度設(shè)置。6. 推理驗證與接口部署6.1 合并 LoRA 權(quán)重訓(xùn)練完的 LoRA adapter 需要合并回基礎(chǔ)模型方便后續(xù)部署# merge_lora.py import torch from transformers import AutoModelForCausalLM, AutoTokenizer from peft import PeftModel base_model_path ./Qwen2-1.5B lora_path ./puro2b_lora_out merged_path ./puro2b_merged model AutoModelForCausalLM.from_pretrained( base_model_path, torch_dtypetorch.bfloat16, device_mapauto, ) model PeftModel.from_pretrained(model, lora_path) model model.merge_and_unload() model.save_pretrained(merged_path) tokenizer AutoTokenizer.from_pretrained(base_model_path) tokenizer.save_pretrained(merged_path)合并后puro2b_merged目錄就是一個完整的模型目錄可以直接加載。6.2 本地推理驗證沒有部署服務(wù)之前先用 transformers 做一次對話驗證from transformers import AutoModelForCausalLM, AutoTokenizer model_path ./puro2b_merged tokenizer AutoTokenizer.from_pretrained(model_path, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained( model_path, torch_dtypetorch.bfloat16, device_mapauto, ) messages [ {role: user, content: 請用三句話介紹你自己} ] text tokenizer.apply_chat_template( messages, tokenizeFalse, add_generation_promptTrue, ) inputs tokenizer(text, return_tensorspt).to(model.device) outputs model.generate( **inputs, max_new_tokens256, do_sampleTrue, temperature0.7, top_p0.9, ) print(tokenizer.decode(outputs[0], skip_special_tokensTrue))這里重點看模型能不能按對話模板輸出會不會重復(fù)、亂碼或者生成長度異常。6.3 用 vLLM 部署 OpenAI 兼容接口如果需要把模型接到自己的工具或前端推薦用 vLLM 啟動一個 OpenAI 兼容服務(wù)vllm serve ./puro2b_merged \ --dtype bfloat16 \ --gpu-memory-utilization 0.9 \ --max-model-len 4096 \ --served-model-name puro2b啟動成功后會監(jiān)聽http://127.0.0.1:8000。這時可以用 curl 驗證接口curl http://127.0.0.1:8000/v1/chat/completions \ -H Content-Type: application/json \ -d { model: puro2b, messages: [ {role: user, content: RTX 5090有多少顯存} ], max_tokens: 256, temperature: 0.7 }接口能用后面就可以接到自己寫的業(yè)務(wù)腳本里。6.4 批量任務(wù)調(diào)用批量任務(wù)最簡單的做法是準備一個 JSONL 文件用腳本循環(huán)調(diào)用接口import json import requests import time results [] with open(inputs.jsonl, r, encodingutf-8) as f: for line in f: line line.strip() if not line: continue item json.loads(line) resp requests.post( http://127.0.0.1:8000/v1/chat/completions, json{ model: puro2b, messages: [{role: user, content: item[prompt]}], max_tokens: 256, }, timeout120, ) if resp.status_code 200: answer resp.json()[choices][0][message][content] results.append({prompt: item[prompt], answer: answer}) else: results.append({prompt: item[prompt], error: resp.text}) with open(outputs.jsonl, w, encodingutf-8) as f: for r in results: f.write(json.dumps(r, ensure_asciiFalse) \n)批量任務(wù)容易遇到超時、進程卡死、單條 prompt 過長等問題。建議每條請求之間加time.sleep(0.2)并做失敗重試。下面是一個增加重試的簡單方式def chat_once(prompt, retry3): for attempt in range(retry): try: resp requests.post( http://127.0.0.1:8000/v1/chat/completions, json{ model: puro2b, messages: [{role: user, content: prompt}], max_tokens: 256, }, timeout120, ) if resp.status_code 200: return resp.json()[choices][0][message][content] except Exception: pass time.sleep(2 * (attempt 1)) return None7. 訓(xùn)練過程資源觀察訓(xùn)練時怎么觀察 RTX 5090 的顯存和功耗是很多新手最關(guān)心的問題。推薦用nvidia-smi動態(tài)監(jiān)控watch -n 1 nvidia-smi訓(xùn)練過程中重點看幾個字段Memory-Usage顯存占用。LoRA 微調(diào) Qwen2-1.5B 通常在 10GB 到 16GB 區(qū)間具體取決于 batch size、序列長度和是否開啟梯度檢查點。Power功耗。訓(xùn)練時整卡功耗會明顯升高RTX 5090 功耗較高要注意散熱。Temperature溫度。長時間訓(xùn)練建議控制在 80 度以內(nèi)超過就要檢查機箱風道。顯存占用不是固定值。把per_device_train_batch_size從 2 調(diào)到 4或者把max_seq_length從 2048 調(diào)到 4096顯存占用都會明顯變化。遇到推理階段顯存不足時可以調(diào)低--max-model-len或者減小--gpu-memory-utilization。還有一個小經(jīng)驗訓(xùn)練跑完后建議確認沒有殘留的 Python 進程占著顯存nvidia-smi ps aux | grep python如果服務(wù)已經(jīng)退出但顯存還沒釋放直接強殺對應(yīng)進程即可。8. 常見問題與排查方法問題現(xiàn)象可能原因排查方式解決方案啟動訓(xùn)練時報CUDA out of memorybatch size 過大、序列過長、顯存碎片看報錯發(fā)生在加載模型還是反向傳播階段調(diào)小 batch size、開啟gradient_checkpointing、縮短max_seq_length顯卡能識別但 PyTorch 報No kernel image驅(qū)動、CUDA、PyTorch 版本不匹配運行torch.cuda.is_available()檢查ptxas版本升級 NVIDIA 驅(qū)動安裝支持 Blackwell 架構(gòu)的 PyTorch 版本bitsandbytes加載 4bit 模型失敗庫版本太舊查看導(dǎo)入報錯pip install -U bitsandbytes訓(xùn)練 loss 不下降或震蕩學習率太高、數(shù)據(jù)格式錯誤、優(yōu)化器狀態(tài)異常查看前幾步 loss 日志降低學習率清理數(shù)據(jù)集空行重新訓(xùn)練vLLM 服務(wù)啟動后接口超時max_model_len太小、并發(fā)請求過多、磁盤讀取慢用 curl 測試單條請求調(diào)大max_model_len降低并發(fā)或用 SSD 存放模型接口返回亂碼對話模板使用錯誤檢查apply_chat_template輸出按 Qwen 官方模板重新處理輸入批量任務(wù)卡在一條數(shù)據(jù)上prompt 超過模型長度或接口異常給請求加超時和重試數(shù)據(jù)截斷、批量腳本加timeout磁盤空間不足checkpoint 保存過多查看output_dir大小調(diào)低save_total_limit定期清理中間 checkpoint以上是這類單卡訓(xùn)練項目最常見的坑。RTX 50 系列剛出來那段時間驅(qū)動和 PyTorch 適配問題非常普遍遇到報錯先別懷疑顯卡壞了按順序檢查驅(qū)動、CUDA、PyTorch 三者的匹配關(guān)系。9. 低成本訓(xùn)練最佳實踐9.1 先跑最小實驗第一次訓(xùn)練不要直接丟幾萬條數(shù)據(jù)進去。切 100 到 500 條數(shù)據(jù)把訓(xùn)練步數(shù)控制在 10 步以內(nèi)確認環(huán)境、數(shù)據(jù)、權(quán)重、推理鏈路全部通順后再放量跑。這一步能節(jié)省大量排錯時間。9.2 保存一份最小可運行配置把訓(xùn)練腳本、依賴清單和當前環(huán)境版本固定下來pip freeze requirements.txt下次換機器或隔一段時間再訓(xùn)練pip install -r requirements.txt就能恢復(fù)環(huán)境。9.3 模型目錄管理建議目錄結(jié)構(gòu)puro2b/ ├── data/ │ ├── train.jsonl │ └── val.jsonl ├── models/ │ ├── Qwen2-1.5B/ │ ├── lora_checkpoint/ │ └── puro2b_merged/ ├── scripts/ │ ├── finetune_lora.py │ └── merge_lora.py └── outputs/ └── inference_results/模型文件、輸入數(shù)據(jù)、訓(xùn)練腳本、輸出結(jié)果分開放是避免后續(xù)混亂最有效的方式。9.4 訓(xùn)練任務(wù)要打日志訓(xùn)練日志默認輸出到控制臺但批量或長時間訓(xùn)練時建議落盤nohup python finetune_lora_puro2b.py train.log 21 查看訓(xùn)練進度tail -f train.log另外最好開啟 checkpoint 保存并定期把 checkpoint 復(fù)制到另一塊硬盤。訓(xùn)練中斷后可以從最近保存點繼續(xù)不用整個重來。9.5 接口服務(wù)要限制訪問范圍vLLM 默認監(jiān)聽127.0.0.1如果要在局域網(wǎng)提供推理服務(wù)要確認網(wǎng)絡(luò)環(huán)境安全。不要把裸 API 直接暴露到公網(wǎng)。接入業(yè)務(wù)系統(tǒng)前在服務(wù)前面加一層鑒權(quán)或內(nèi)網(wǎng)轉(zhuǎn)發(fā)。9.6 訓(xùn)練數(shù)據(jù)授權(quán)自查涉及人臉、聲音、他人作品、未公開文檔時必須確認有沒有合法授權(quán)。如果沒有明確授權(quán)不要用于訓(xùn)練和分發(fā)。這個檢查比調(diào)參更重要。10. 總結(jié)與下一步Puro-2B 這個項目最值得嘗試的點是把訓(xùn)練成本壓縮到一張消費級顯卡能完成的范圍。Qwen2-1.5B 底座 RTX 5090 單卡 LoRA 微調(diào)基本就是這套路線的標準組合。對大多數(shù)個人開發(fā)者和小團隊來說這比租 GPU 集群更可控也比閉源 API 更私有化。拿到 Puro-2B 權(quán)重之后第一件該做的事是用自己的測試集跑一遍推理看看基礎(chǔ)效果和原版 Qwen2-1.5B 差多少。如果作者公開了訓(xùn)練數(shù)據(jù)和超參數(shù)建議先復(fù)現(xiàn)訓(xùn)練再調(diào)整成自己的數(shù)據(jù)集。最容易踩的坑有兩個一是 RTX 50 系列顯卡的驅(qū)動和 PyTorch 版本適配二是訓(xùn)練數(shù)據(jù)格式錯誤導(dǎo)致 loss 異常。這兩個問題解決掉后面基本就是按部就班地訓(xùn)練、合并、部署。后續(xù)可以擴展的方向也不少把 LoRA 換成全參微調(diào)、加入偏好學習提升回復(fù)質(zhì)量、用 vLLM 批量跑一批領(lǐng)域評測集或者把模型接到一個簡單的前端上做產(chǎn)品原型。單卡訓(xùn)練小模型這件事已經(jīng)不像以前那么“高不可攀”了Puro-2B 給的就是一個很具體的例子。