一、權重的加載
模型包含兩部分:
base model 和 LoRA adapter
其中base model的權重在微調時被凍結,
推理時加載原權重即可,LoRA adapter可通過PeftModel.from_pretrained進行加載。
二、啟動推理
通過model.generate,啟動推理。
三、效果比較
“DeepSeek-R1”,而在加載LoRA adapter之后,回答為“甄嬛”。
在微調多輪后的LoRA權重,在加載LoRA adapter之后,回答為“甄嬛”
在generate_kwargs中添加 repetition_penalty=1.2減少重復文本輸出
四、性能測試
凡是在推理過程中涉及采樣(do_sample=True)的案例,可以通過配置如下變量,
注釋掉之前添加的同步模式代碼,再運行代碼,即可獲取每個token的推理時長和平均時長。
export INFERENCE_TIME_RECORD=True
此時,從終端的運??志可以看到,平均推理時間為0.727秒,
可通過禁用多線程將推理速度適當提升為平均單token推理時長0.674秒。
五、性能優化
通過上述禁用多線程的方式,可以適當減少平均單token的推理時長,但效果不明顯。
在此基礎上,還可以通過jit即時編譯的方式進一步加速
jit即時編譯通過jit修飾器修飾Python函數或者Python類的成員函數使其被編譯成計算圖,通過圖優化等技術提高運行速度。
jit修飾器應該修飾模型decode的函數,但由于原代碼將模型的logits計算、解碼等過程整體封裝成了一個
model.generate函數,不好進行優化,所以需要手動實現解碼邏輯。
六、實操
6.1 訪問云上Jupyter
6.1.1 點擊“打開Jupyter在線編程”
6.1.2 選擇如下紅框中的來運行起來:
6.1.3 進入后,選擇“應用實際”、“昇騰開發板”
6.1.4 進入后,選擇“deepdeek-r1-distill-qwen-1.5b-jit.ipynb**”并運行它
七、代碼的邏輯
7.1 每一步執行推理的時間都打印了出來,較之前有提升
7.2 運行結果