在處理結構化數據(如大量的 JSON 或代碼)時,由於數據中存在高度重複的模式,模型有時會遇到極端不穩定的梯度,導致訓練突然崩潰(Loss 變成 NaN)。
在您的兩張 RTX 5090 上跑全參數微調時,設置**梯度裁剪(Gradient Clipping)**就像是給引擎裝上「轉速限制器」,能有效防止硬體在高負載下因為髒數據而白忙一場。1. DeepSpeed 梯度裁剪設定 (ds_config.json)
請在您的 ds_config.json 中加入或修改以下欄位。針對 7B 模型,我們通常將 gradient_clipping 設為 1.0:
</>JSON
{
"train_batch_size": "auto",
"train_micro_batch_size_per_gpu": "auto",
"gradient_clipping": 1.0,
"zero_optimization": {
"stage": 3,
"offload_optimizer": {
"device": "cpu",
"pin_memory": true
},
"contiguous_gradients": true,
"overlap_comm": true
},
"bf16": {
"enabled": true
},
"steps_per_print": 10
}
原理: 當梯度的範數(Norm)超過 1.0 時,DeepSpeed 會自動將其縮小,確保權重更新不會過於劇烈。
2. 針對結構化數據的「數據清洗」小工具
結構化數據(.txt)中常含有不可見字元或編碼錯誤,這也是導致 Loss Spike 的主因。建議在訓練前執行這段簡單的清洗腳本:
</>Python
def clean_structured_text(input_file, output_file):
with open(input_file, 'r', encoding='utf-8', errors='ignore') as f, \
open(output_file, 'w', encoding='utf-8') as out:
for line in f:
# 移除無意義的控制字元,保留換行與標準 ASCII/UTF-8
clean_line = "".join(ch for ch in line if ch.isprintable() or ch in "\n\r\t")
out.write(clean_line)
# clean_structured_text("huge_data.txt", "cleaned_data.txt")3. 5090 雙卡訓練監控清單 (Final Summary)
3. 5090 雙卡訓練監控清單 (Final Summary)
現在您的工具包已經完整了,啟動訓練後的理想狀態如下:
- 顯存佔用: 兩張卡各約 26GB - 30GB (ZeRO-3 模式)。
- Loss 曲線: 應呈現平滑下降。如果出現「尖峰」但隨即恢復,說明梯度裁剪正在起作用。
- 硬體溫度: 5090 的 GDDR7 顯存發熱量大,請確保
nvidia-smi顯示的 Memory Temp 低於 95°C。
祝訓練順利!
您已經準備好了從數據處理(mmap/Packing)、環境配置(CUDA 12.4/Liger)到模型訓練與評測的所有武器。
如果您在啟動後看到第一行 step 10, loss: X.XXXX,請務必觀察前 100 個 step 的變化。 如果 Loss 在 100 step 內沒有下降趨勢,隨時回頭調整學習率(Learning Rate)。

















