昇思+昇騰開發板+DeepSeek模型推理和性能優化

昇思+昇騰開發板+DeepSeek模型推理和性能優化

模型推理

流程: 權重加載 -> 啟動推理 -> 效果比較與調優 -> 性能測試 -> 性能優化
權重加載
如微調章節介紹,最終的模型包含兩部分:base model 和 LoRA adapter,其中base model的權重在微調時被凍結,推理時加載原權重即可,LoRA adapter可通過PeftModel.from_pretrained進行加載。

### 加載基礎模型
model = AutoModelForCausalLM.from_pretrained("MindSpore-Lab/DeepSeek-R1-Distill-Qwen-1.5B-FP16", mirror="modelers", ms_dtype=mindspore.float16)
### 加載LoRA adapter
model = PeftModel.from_pretrained(model, "./output/adapter_model_for_demo") # adapter_model path
## 啟動推理
通過model.generate,啟動推理。generate_kwargs = dict(input_ids=input_ids,streamer=streamer,max_new_tokens=1024,do_sample=True,top_p=0.9,temperature=0.1,num_beams=1,
)
## 使用線程啟動生成
t = Thread(target=model.generate, kwargs=generate_kwargs)
'''

效果比較

演示中以一個微調多輪后的LoRA權重為例,在微調前(不加載LoRA adapter),在問模型“你是誰”時,回答的是 "DeepSeek-R1”,而在加載LoRA adapter之后,回答為“甄嬛”。
微調前:

問: 你是誰?
答: 您好!我是由中國的深度求索(DeepSeek)公司開發的智能助手DeepSeek-R1。如您有任何任何問題或需要幫助,我會盡我所能為您提供幫助。

微調后:

問: 你是誰?
答: 我是甄嬛,家父是大理寺少卿甄遠道。

效果調優

在進行長文本輸出的過程當中,輸出回答到一定長度后模型會輸出重復內容,如下圖所示,可在generate_kwargs中添加 repetition_penalty=1.2,解決長文本輸出重復問題。
調優前: 模型在生成長回復時,末尾出現大量重復語句。
調優后: 通過設置 repetition_penalty,模型能夠生成邏輯連貫且不重復的長篇回復。

性能測試

凡是在推理過程中涉及采樣(do_sample=True)的案例,可以通過配置如下變量,注釋掉之前添加的同步模式代碼,再運行代碼,即可獲取每個token的推理時長和平均時長。

export INFERENCE_TIME_RECORD=True

此時,從終端的運行日志可以看到,平均推理時間為0.727秒,可通過禁用多線程將推理速度適當提升為平均單token推理時長0.674秒。
操作: 在腳本中添加禁用多線程代碼

from mindspore._c_expression import disable_multi_thread
disable_multi_thread()

性能優化

通過上述禁用多線程的方式,可以適當減少平均單token的推理時長,但效果不明顯。在此基礎上,還可以通過jit即時編譯的方式進一步加速。jit即時編譯通過jit修飾器修飾Python函數或者Python類的成員函數使其被編譯成計算圖,通過圖優化等技術提高運行速度。
在本章節的場景下,jit修飾器應該修飾模型decode的函數,但由于原代碼將模型的logits計算、解碼等過程整體封裝成了一個model.generate函數,不好進行優化,所以需要手動實現解碼邏輯。
DeepSeek-R1-Distill-Qwen-1.5B 模型推理性能調優
性能優化

前序準備

實現解碼邏輯(decode函數、prefill-decode階段)。
實例化StaticCache,動態Cache無法成圖。
添加jit裝飾器
設置O2整圖下沉進一步優化。
調用 model.jit()。
使用 mindspore.jit 裝飾器修飾decode函數。

#### 1. 設置上下文
mindspore.set_context(enable_graph_kernel=True, mode=mindspore.GRAPH_MODE, jit_config={"jit_level": "02"})#### ... 模型加載 ...
#### 2. 編譯模型
model.jit()#### 3. jit裝飾器修飾解碼函數
@mindspore.jit(jit_config=mindspore.JitConfig(jit_syntax_level='STRICT'))
def decode_one_tokens_logits(model, cur_token, input_pos, cache_position, past_key_values):logits = model(...)return logits

Top_p函數的實現

出于效率的考慮,優先使用numpy進行函數的實現。
而在gather函數的實現上,基于mindspore.mint的實現方式會出現報錯,故使用mindspore.ops來實現。
modeling_qwen2.py的decoder_layer中,需添加_modules.values()
為了在靜態圖模式下能正確遍歷網絡層,需要修改循環方式。

原代碼
for decoder_layer in self.layers:
修改后
for decoder_layer in self.layers._modules.values():

modeling_qwen2.py原RotaryEmbedding在靜態圖編譯會出現報錯

需要參考modeling_llama.py將該類進行重寫。相關pr已經合入mindnlp的0.4分支。

性能優化效果測試

推理時間測試代碼
##### 自回歸生成循環
cache_position = mindspore.tensor([seq_length + 1])
for i in range(1, NUM_TOKENS_TO_GENERATE):s = time.time()next_token = decode_one_tokens(model, next_token, None, cache_position, past_key_values)generated_ids[:, cache_position] = next_token.int()cache_position += 1t = time.time()print("[%d]: %s" % (i, t-s)) # 打印單步生成耗時

不使用jit優化,每個token推理時間約為1.1秒。
使用jit優化,每個token推理時間約為0.32秒,效率顯著提高。
但是在推理首個token前需要對全圖進行編譯,故首token推理時間較長。在推理token數量較多時,使用JIT優化對效率提升效果更明顯。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/92832.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/92832.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/92832.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

未給任務“Fody.WeavingTask”的必需參數“IntermediateDir”賦值。 WpfTreeView

c#專欄記錄: 報錯 未給任務“Fody.WeavingTask”的必需參數“IntermediateDir”賦值。 WpfTreeView 生成 解決辦法 清理和重新生成項目 完成上述配置后,嘗試執行以下步驟: 清理項目:刪除 bin 和 obj 文件夾。 重新生成項目&…

[Linux]學習筆記系列 -- [arm][lib]

文章目錄arch/arm/lib/delay.cregister_current_timer_delay 注冊當前定時器延遲read_current_timer 讀取當前定時器drivers/clocksource/timer-stm32.cstm32_clocksource_init STM32 平臺上初始化時鐘源https://github.com/wdfk-prog/linux-study arch/arm/lib/delay.c regis…

harbor倉庫搭建(配置https)

目錄 1. 環境準備 2. 配置https的原因 3. 生成ca證書 4. 搭建harbor倉庫 5. 訪問harbor 6. 修改加密算法 1. 環境準備 需要提前安裝docker和docker-compose,harbor倉庫版本越新,對應的docker和docker-compose版本越新。 主機IP192.168.48.19dock…

C++多線程服務器

C多線程服務器 因為自己同時在看多本書,之前看過《TCP/IP 網絡編程》一書,其中有一個自己編寫一個多線程服務器的例子,于是就把代碼直接抄了一變。 在學習網絡編程前需要先了解網絡的7層模型。 具體代碼如下: 服務器端&#xff1a…

【Pandas】常用數據處理技巧

一. 數據讀取 1.pd.to_csv & pd.read_csv 細節: 1.pd.read_csv 需要 ignore_index True or ,index_col0 否則會有列Unnamed0 2.pickle具有更快的讀取速度,與更小的體積。 讀取前N行(若不需獲取所有數據) pd.read_csv(…

Docker Compose 部署高可用 MongoDB 副本集集群(含 Keepalived + HAProxy 負載均衡)

Docker Compose 部署高可用 MongoDB 副本集集群(含 Keepalived HAProxy 負載均衡)背景與目標📋 環境規劃**服務器信息****軟件版本**部署步驟1. 創建目錄結構2、生成 keyFile(三臺機器內容必須一致)3. 準備 Keepalive…

MySQL(189)如何分析MySQL的鎖等待問題?

分析MySQL的鎖等待問題有助于發現和解決數據庫性能瓶頸。鎖等待問題通常會導致數據庫響應時間變長,影響系統的整體性能。以下是詳細深入的方法和代碼示例,幫助你分析和解決MySQL的鎖等待問題。 一、鎖的類型和概念 在MySQL中,主要有以下幾種鎖…

26.Scikit-learn實戰:機器學習的工具箱

Scikit-learn實戰:機器學習的工具箱 🎯 前言:機器學習界的"宜家家具" 還記得第一次逛宜家的感受嗎?琳瑯滿目的家具,每一件都有詳細的說明書,組裝簡單,樣式統一,關鍵是—…

wordpress文章摘要調用的3種方法

以下是WordPress文章摘要的3種調用方法: 1. 使用the_excerpt()函數 這是WordPress自帶的函數,用于調用文章摘要。如果文章有手動填寫的摘要,則會顯示手動摘要;如果沒有手動摘要,WordPress會自動從文章內容中提取前55個單詞作為摘…

java excel轉圖片常用的幾種方法

十分想念順店雜可。。。在 Java 中實現 Excel 轉圖片,常用的方法主要分為兩類:使用商業庫(簡單高效但可能收費)和使用開源庫組合(免費但實現復雜)。以下是幾種常用方案及實現思路:一、使用商業庫…

QT項目 -仿QQ音樂的音樂播放器(第五節)

目錄 一、CommonPage界?設置和顯示 二、自定義ListItemBox 三、支持hover效果 四、自定義VolumeTool 五、界面設置 六、頁面創建及彈出 七、繪制三角 一、CommonPage界面設置和顯示 void CommonPage::setCommonPageUI(const QString &title, const QString &imag…

wstool和git submodule優劣勢對比

wstool 和 git submodule 都可以用來管理項目中的外部源代碼依賴,但它們的設計理念、工作流程和適用場景有很大不同。 我們來深入對比一下它們的優勢和劣勢。 核心理念比喻 git submodule:像是在你的汽車設計圖紙中,直接嵌入了另一家公司&…

六、RuoYi-Cloud-Plus OSS文件上傳配置

1.前面我們完成了RuoYi-Cloud-Plus 部署及啟動,此刻已經可以正常訪問。 前面文章的專欄內容在這,感興趣可以看看。 https://blog.csdn.net/weixin_42868605/category_13023920.html 2.但現在雖然已經啟動成功,但有很多功能我們依舊用不了&a…

達夢數據庫日常運維命令

查詢數據庫表空間數據文件使用大小限制DECLARE K INT:(SELECT cast(PAGE()/1024 as varchar)); BEGIN SELECTF."PATH" 數據文件 ,F.CLIENT_PATH,G.NAME 所屬表空間,F.MAX_SIZE||M 文件擴展限制,(CASE F.AUTO_EXTEND WHEN 1 THEN 是 ELSE 否 END) 文件…

使用線性降維方法進行數據降維

在數據科學與機器學習的領域中,維度災難問題經常導致模型的性能下降。線性降維方法是一種常見的技術,用于在保留盡可能多的原始數據特征的同時,減少數據集的維度。這些方法通過將高維數據映射到低維空間來減少特征數量,從而加速模…

OpenCV圖像裁剪與 ROI 操作

在圖像處理領域,ROI(Region of Interest)區域感興趣操作是非常基礎而重要的一環。無論是進行目標檢測、圖像分割,還是簡單的圖像處理,都離不開對圖像某一區域的選取與處理。本文將結合 OpenCV 的 C 接口,詳…

關于AI應用案例計算機視覺、自然語言處理、推薦系統和生成式AI四大領域的詳細技術分析。

一、計算機視覺應用:實時物體檢測 案例描述:使用YOLOv8模型實現實時物體檢測系統,應用于安防監控場景。 1. 代碼示例(Python) python from ultralytics import YOLO import cv2# 加載預訓練模型 model YOLO("…

各個網絡層擁有的協議簡寫

OSI 七層模型(從下到上分別為物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層)是網絡通信的經典理論框架,每層都有其核心功能和對應的協議。以下是各層的主要協議列舉:1. 物理層(Physical Layer&#xff…

django基于Python的設計師作品平臺的數據可視化系統設計與實現

django基于Python的設計師作品平臺的數據可視化系統設計與實現

等保測評-RabbitMQ中間件

RabbitMQ-docker部署查看版本:rabbitmqctl version、rabbitmqctl status | grep version配置文件:一般為rabbitmq.conf端口號:一般為15672一、身份鑒別a)應對登錄的用戶進行身份標識和鑒別,身份標識具有唯一性&#xf…