昇思+昇騰開發板+DeepSeek模型LoRA微調
LoRA微調原理
-
核心思想:凍結預訓練模型權重,僅訓練橙色的低秩適配矩陣(A/B矩陣)
-
-
優勢:
- 訓練參數量減少至全量微調的0.5%
- 顯存占用降低50%以上
- 適配器權重僅需保存3MB(原模型5.6GB)
關鍵配置
config = LoraConfig(
task_type=TaskType.CAUSAL_LM,
target_modules=[“q_proj”, “k_proj”, “v_proj”, “gate_proj”, “up_proj”, “down_proj”],
inference_mode=False,
r=8, # 低秩維度
lora_alpha=32, # 縮放系數
lora_dropout=0.1
)
開啟同步
通過mindspore.set_context(pynative_synchronize=True)開啟同步,方便在出現問題時進行快速定位。
流程:
環境準備與檢查 -> 代碼下載 -> 權重下載 -> 其他環境準備 -> 啟動運行
代碼實現知識點1:
MindSpore在將數據預處理操作應用到數據集時,代碼實現會和Hugging Face Transformers有所區別。
MindSpore配合數據處理Pipeline來實現數據預處理,所有的數據變換通過.map(…)方法傳入,需要指定作用的數據列。
.map(…) 操作可以針對數據集指定列 (column) 添加數據變換 (Transforms),將數據變換應用于該列數據的每個元素,并返回包含變換后元素的新數據集。
.map(…) 操作可以執行Dataset模塊提供的內置數據變換操作,也可以執行用戶自定義的變換操作。
代碼實現知識點2:
腳本中自定義了SavePeftModelCallback,即每次在save_steps個步數后,將模型當前的LoRA adapter權重保存下來,做到保存微調過程中的權重。
保存后的權重可在指定的保存路徑(案例中為“./output/DeepSeek-R1-Distill-Qwen-1.5B/adapter_model”)找到。
經驗分享
香橙派AIpro的host側和device側共享,所以在host側的內存占用(如python的多進程,模型加載等)也會影響到顯存。
優化方案1
在加載模型時,直接加載fp16的權重,而非加載fp32權重再轉成fp16。
加載fp32權重,然后轉成fp16會占用大量內存。
直接加載fp16權重可以顯著減少內存占用。
DeepSeek-R1-Distill-Qwen-1.5B 模型LoRA微調
優化方案2
如何限制拉起的python進程數,從而控制額外的內存占用,減少對顯存的影響。 比較好的解決方案是通過設置如下環境變量,可以把python進程控制在4-6個:
export MAX_COMPILE_CORE_NUMBER=1
export TE_PARALLEL_COMPILER=1
MAX_COMPILE_CORE_NUMBER: 此環境變量用于指定圖編譯時可用的CPU核數。
TE_PARALLEL_COMPILER: 算子最大并行編譯進程數,當大于1時開啟并行編譯。