開啟GpuGeek算力市場,地址如下:
https://gpugeek.com/login?type=register&source=wechat_DLNLP_01
其中最棒的是RTX-A5000-24G顯示卡,竟然每小時只要0.88元,朋友直呼太便宜了。
比較好奇為什麼這個型號RTX-A5000-24G這麼便宜,之前經常用到4090、3090顯示卡,同級別24GB顯示卡這個價格這不是白送嗎?
筆者查了一下,發現A5000性價比超高!
A5000搭載強大圖形核心與多流處理器,擁有超強並行計算能力,單精度浮點性能達27.8 TFLOPS,顯存頻寬768 GB/s。
這款顯示卡不僅在性能上達到了NVIDIA RTX 3090的80%,而且價格僅為3090的66%。對於線性回歸、主成分分析等常涉矩陣操作的算法,運算效率直線上漲,助力算法工程師更快迭代模型,搭配映像和網路加速功能可滿足更多應用場景。下面是核心參數的對比:
既然這麼便宜,我們就用它來復現minimind這個專案。此開源專案旨在完全從零開始,僅用3塊錢成本 + 2小時!即可訓練出僅為25.8M的超小語言模型MiniMind。
專案地址:https://github.com/jingyaogong/minimind
PS: 因為我們訓練參數非常小,本次訓練更關注於整個大模型訓練過程,所以對性能我們暫時不抱有太大預期,最後我們會測試模型的實際效果。
至此,背景介紹完畢,下面開始動手,我們從頭開始訓練一個小參數的「大模型」!
建立GPU實例
首先,我們需要建立一個GpuGeek帳號,官網地址為:https://gpugeek.com/login?type=register&source=wechat_DLNLP_01,不過需要實名認證一下,新用戶可能會送一些福利,這裡不展開贅述了。
點擊導覽列中的控制台,然後點擊「建立實例」。
下一步我們進入建立頁面,這裡自行選擇配置,我們直接選擇RTX-A5000-24G顯示卡,確認價格沒問題,那我們就可以建立了。
建立完之後我們在左側容器實例介面,可以看到實例操作方式。
這裡登錄方式可以支持多種,比如ssh、jupyterlab。
點擊更多,我們可以對容器進行更多操作。
另外發現一個福利,就是數據盤擴充好便宜,下面是100GB的價格,每天不到1塊錢,太瘋狂了!
我這裡擴展了100GB,以保證我們後續數據以及模型正常儲存,下面我們開始訓練模型,有了實例之後,下一步下載數據集。
下載MiniMind訓練數據集
MiniMind專案開源了大模型預訓練、微調以及強化學習所有數據集,無需再自行預處理大規模數據集,避免重複性的數據處理工作。
數據集地址:
https://www.modelscope.cn/datasets/gongjy/minimind_dataset/summary
下面是各數據集簡介:
dpo.jsonl --RLHF階段數據集
lora_identity.jsonl --自我認知數據集(例如:你是誰?我是minimind...),推薦用於lora訓練(亦可用於全參SFT,勿被名字局限)
lora_medical.jsonl --醫療問答數據集,推薦用於lora訓練(亦可用於全參SFT,勿被名字局限)
pretrain_hq.jsonl ✨ --預訓練數據集,整合自jiangshu科技
r1_mix_1024.jsonl --DeepSeek-R1-1.5B蒸餾數據,每條數據字符最大長度為1024(因此訓練時設置max_seq_len=1024)
sft_1024.jsonl --整合自Qwen2.5蒸餾數據(是sft_2048的子集),每條數據字符最大長度為1024(因此訓練時設置max_seq_len=1024)
sft_2048.jsonl --整合自Qwen2.5蒸餾數據,每條數據字符最大長度為2048(因此訓練時設置max_seq_len=2048)
sft_512.jsonl --整合自匠數科技SFT數據,每條數據字符最大長度為512(因此訓練時設置max_seq_len=512)
sft_mini_512.jsonl ✨ --極簡整合自匠數科技SFT數據+Qwen2.5蒸餾數據(用於快速訓練Zero模型),每條數據字符最大長度為512(因此訓練時設置max_seq_len=512)
tokenizer_train.jsonl --均來自於匠數大模型數據集,這部分數據相對次要,(不推薦自己重複訓練tokenizer,理由如上)如需自己訓練tokenizer可以自由選擇數據集。
下面是大模型訓練每個階段用到的數據集示意圖,這其實也是組合的過程,大家可以想一想為什麼這樣的順序和組合?
我們使用modelscope的SDK來下載數據集。
在下載前,請先通過如下命令安裝ModelScope:
pip install modelscope
下載完整數據集:
cd /gz-data # 數據盤目錄
modelscope download --dataset gongjy/minimind_dataset --local_dir minimind_dataset
GpuGeek的網速特別快,下面是數據集下載速度示意圖,太棒了,再也沒有網速焦慮了!
下載完之後,我們看一下檔案大小是否正常。
下一步我們下載minimind專案程式碼,然後進行訓練,下載命令如下:
git clone https://ghfast.top/https://github.com/jingyaogong/minimind
https://ghfast.top/ 這個地址是為了加速github下載,國內下載github可能會存在網路問題。
環境準備
cd minimind
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
這裡有個坑,就是我們可以去掉後面的版本號,否則安裝失敗的可能性很大!
提前測試Torch是否可用cuda
import torch
print(torch.cuda.is_available())
我們將數據集檔案都移動到程式碼目錄下的dataset。
大模型預訓練 - 學知識
訓練程式碼都在trainer目錄下,由於這個小參數單卡就可以運行,程式碼還是比較清晰的,不是很複雜,基本上單個腳本就可以完成對應訓練。我認為這些源碼非常適合新手來理解大模型訓練的整個流程。
cd trainer
python train_pretrain.py
執行預訓練,得到 pretrain_*.pth 作為預訓練的輸出權重(其中*為模型的dimension,默認為512)。
大模型指令微調 - 學對話
python train_full_sft.py
執行監督微調,得到 full_sft_*.pth 作為指令微調的輸出權重(其中full即為全參數微調)。
大模型強化學習 - 學偏好
python train_dpo.py
訓練推理模型
數據集來源已如上文介紹。數據格式例如:
{"conversations": [{"role":"user","content":"你好,我是小芳,很高興認識你。"}, {"role":"assistant","content":"
推理模型R1的回复模板是:
這在GRPO中通過設置規則獎勵函數約束模型符合思考標籤和回复標籤(在冷啟動靠前的階段獎勵值設置應該提高一些)。
另一個問題是蒸餾過程雖然和SFT一樣,但實驗結果是模型難以每次都符合模板規範的回复,即脫離思考和回复標籤約束。這裡的小技巧是增加標記位置token的損失懲罰,詳見train_distill_reason.py:
# 在 sp_ids 對應的位置增加額外的懲罰...loss_mask[sp_ids] = 10 # 懲罰係數
更多細節大家可以查看:
https://github.com/jingyaogong/minimind
訓練之後,我們可以在out目錄得到四個模型權重。
測試模型
最後我們可以通過eval_model.py腳本來測試模型效果。
至此我們大功告成,可以看到訓練的模型可以回答問題,不過測試一些案例,發現比較簡短,這個和模型參數還是有很大關係的。
最後建議大家閱讀一下源碼,學習一下背後的原理以及實現過程,下面貼一下Minimind模型結果部分的程式碼。
這段程式碼實現了一個名為 MiniMind 的語言模型,它基於Transformer架構,並包含混合專家系統(MoE)功能。下面是主要組件的簡要總結:
1. 配置類 (MiniMindConfig)
定義了模型的基礎參數,如隱藏層大小、注意力頭數量、層數等。
包含混合專家系統(MoE)的配置參數,如專家數量、每個token選擇的專家數量等。
2. 基礎模塊
RMSNorm: 實現了Root Mean Square歸一化。
旋轉位置編碼: 實現了位置信息的編碼 (RoPE - Rotary Position Embedding)。
注意力機制 (Attention): 包含多頭自注意力實現,支持Flash Attention優化。
3. 前饋網絡
FeedForward: 傳統的前饋網絡實現,包含SwiGLU激活函數。
MOEFeedForward: 混合專家系統的前饋網絡實現。
MoEGate: 專家選擇門控機制。
4. 模型結構
MiniMindBlock: 模型的主要構建塊,包含自注意力和前饋網絡。
MiniMindModel: 組合多個Block,形成完整的編碼器。
MiniMindForCausalLM: 最終用於因果語言建模的模型,包含解碼頭。
主要特色功能如下:
1. 混合專家系統 (MoE)
允許為每個token動態選擇專家網絡。
使用門控機制決定每個token應該由哪些專家處理。
支持輔助損失函數以平衡專家的使用。
2. 優化實現
支持Flash Attention以加速注意力計算。
高效的KV緩存機制用於推理加速。
針對推理的專家系統優化。
3. 與Hugging Face生態系統整合
繼承自PreTrainedModel和GenerationMixin。
兼容Hugging Face的模型載入和生成接口。
模型的執行流程如下:
1. 輸入token被嵌入為向量。
2. 通過多層Transformer塊處理。
3. 每個塊包含自注意力和前饋網路(普通或MoE)。
4. 最後通過語言模型頭生成輸出詞彙分佈。
這個實現提供了一個輕量級但功能齊全的語言模型框架,特別是通過混合專家系統,在保持參數效率的同時增強了模型容量。
建議大家再去閱讀一下模型訓練部分的源碼。