幾個小實踐帶你兩天快速上手MindSpore(下)
上一篇講到的:>>點我查看 幾個小實踐帶你兩天快速上手MindSpore(上)
1.MindSpore端邊云統一格式— — MindIR
2.華為智慧終端背后的黑科技— —超輕量AI引擎MindSpore Lite
今天將為繼續大家帶來:
1.一鍵部署在線推理服務— —MindSpore Serving
2.AI數據高速加載直通車— —單節點數據緩存
3.快速定位模型精度問題— —MindSpore調試器
一、一鍵部署在線推理服務
— —MindSpore Serving
MindSpore Serving就是為實現將深度學習部署到生產環境而產生的
MindSpore Serving是一個簡單易用、高性能的服務模塊,旨在幫助MindSpore開發者在生產環境中高效部署在線推理服務
注:MindSpore Serving當前僅支持Ascend 310和Ascend 910環境。
大家可以在MindSpore官網下載對應版本安裝包實踐:https://www.mindspore.cn/versions
特點
(1)簡單易用
提供Python接口配置和啟動Serving服務,對客戶端提供gRPC和RESTful訪問接口,提供Python客戶端接口,通過它,大家可以輕松定制、發布、部署和訪問模型服務。
安裝:
pip install mindspore_serving-1.1.0-cp37-cp37m-linux_aarch64.whl
1.輕量級部署
服務端調用Python接口直接啟動推理進程(master和worker共進程),客戶端直接連接推理服務后下發推理任務。 執行master_with_worker.py,完成輕量級部署服務:
import os from mindspore_serving import master from mindspore_serving import worker def start(): servable_dir = os.path.abspath(".") worker.start_servable_in_master(servable_dir, "add", device_id=0) master.start_grpc_server("127.0.0.1", 5500) if __name__ == "__main__": start()
當服務端打印日志Serving?gRPC?start?success,?listening?on?0.0.0.0:5500時,表示Serving服務已加載推理模型完畢。
2.集群部署
服務端由master進程和worker進程組成,master用來管理集群內所有的worker節點,并進行推理任務的分發。
部署master:
import os from mindspore_serving import master def start(): servable_dir = os.path.abspath(".") master.start_grpc_server("127.0.0.1", 5500) master.start_master_server("127.0.0.1", 6500) if __name__ == "__main__": start()
部署worker:
import os from mindspore_serving import worker def start(): servable_dir = os.path.abspath(".") worker.start_servable(servable_dir, "add", device_id=0, master_ip="127.0.0.1", master_port=6500, worker_ip="127.0.0.1", worker_port=6600) if __name__ == "__main__": start()
輕量級部署和集群部署啟動worker所使用的接口存在差異,其中,輕量級部署使用start_servable_in_master接口啟動worker,集群部署使用start_servable接口啟動worker。
(2)提供定制化服務
支持模型供應商打包發布模型、預處理和后處理,圍繞模型提供定制化服務,并一鍵部署,服務使用者不需要感知模型處理細節。
舉個栗子:實現導出兩個tensor相加操作的模型
import os from shutil import copyfile import numpy as np import mindspore.context as context import mindspore.nn as nn import mindspore.ops as ops import mindspore as ms context.set_context(mode=context.GRAPH_MODE, device_target="Ascend") class Net(nn.Cell): """Define Net of add""" def __init__(self): super(Net, self).__init__() self.add = ops.TensorAdd() def construct(self, x_, y_): """construct add net""" return self.add(x_, y_) def export_net(): """Export add net of 2x2 + 2x2, and copy output model `tensor_add.mindir` to directory ../add/1""" x = np.ones([2, 2]).astype(np.float32) y = np.ones([2, 2]).astype(np.float32) add = Net() output = add(ms.Tensor(x), ms.Tensor(y)) ms.export(add, ms.Tensor(x), ms.Tensor(y), file_name='tensor_add', file_format='MINDIR') dst_dir = '../add/1' try: os.mkdir(dst_dir) except OSError: pass dst_file = os.path.join(dst_dir, 'tensor_add.mindir') copyfile('tensor_add.mindir', dst_file) print("copy tensor_add.mindir to " + dst_dir + " success") print(x) print(y) print(output.asnumpy()) if __name__ == "__main__": export_net()
構造一個只有Add算子的網絡,并導出MindSpore推理部署模型,該模型的輸入為兩個shape為[2,2]的二維Tensor,輸出結果是兩個輸入Tensor之和。
(3)支持批處理
用戶一次請求可發送數量不定樣本,Serving分割和組合一個或多個請求的樣本以匹配模型的實際batch,不僅僅加速了Serving請求處理能力,并且也簡化了客戶端的使用。
主要針對處理圖片、文本等包含batch維度的模型。假設batch_size=2,當前請求有3個實例,共3張圖片,會拆分為2次模型推理,第1次處理2張圖片返回2個結果,第2次對剩余的1張圖片進行拷貝做一次推理并返回1個結果,最終返回3個結果。
對于一個模型,假設其中一個輸入是數據輸入,包括batch維度信息,另一個輸入為模型配置信息,沒有包括batch維度信息,此時在設置with_batch_dim為True基礎上,設置額**數without_batch_dim_inputs指定沒有包括batch維度信息的輸入信息。
from mindspore_serving.worker import register # Input1 indicates the input shape information of the model, without the batch dimension information. # input0: [N,3,416,416], input1: [2] register.declare_servable(servable_file="yolov3_darknet53.mindir", model_format="MindIR", with_batch_dim=True, without_batch_dim_inputs=1)
(4) 高性能高擴展
支持多模型多卡并發,通過client/master/worker的服務體系架構,實現MindSpore Serving的高性能和高擴展性。
華為Ascend主打芯片低功耗、高算力等特性,MindSpore提供高效的內核算法、自動融合,自動并行等能力。支持多模型多卡并發,通過client/master/worker的服務體系架構,實現MindSpore Serving的高性能和高擴展性。
高可靠性設計(某個服務節點宕機,不影響客戶端正常服務),負載均衡(如何更合理的使用所有資源信息),彈性擴容縮容(根據業務的高峰低谷,動態調整資源)
二、AI數據高速加載直通車
— —單節點數據緩存
Cache單節點緩存模塊可用于緩存預處理后的訓練數據,加速數據加載,提升數據復用率,降低數據預處理所需的CPU算力
對于需要重復訪問遠程的數據集或需要重復從磁盤中讀取數據集的情況,可以使用單節點緩存算子將數據集緩存于本地內存中,以加速數據集的讀取。? 緩存算子依賴于在當前節點啟動的緩存服務器,緩存服務器作為守護進程獨立于用戶的訓練腳本而存在,主要用于提供緩存數據的管理,支持包括存儲、查找、讀取以及發生緩存未命中時對于緩存數據的寫入等操作。
對比使用數據緩存和不使用數據緩存的數據加載流程pipeline,第一個,是不使用數據緩存服務的常規數據處理流程
1.緩存加載后的原始數據,用戶可以在數據集加載算子中使用緩存。這將把加載完成的數據存到緩存服務器中,后續若需相同數據則可直接從中讀取,避免從磁盤中重復加載。
2.緩存經過數據增強操作后的數據,用戶也可在Map算子中使用緩存。這將允許我們直接緩存數據增強(如圖像裁剪、縮放等)處理后的數據,避免數據增強操作重復進行,減少了不必要的計算量。
3. 以上兩種類型的緩存本質上都是為了提高數據復用,以減少數據處理過程耗時,提高網絡訓練性能。
Cache的三個重要組件
(1)緩存算子
1.對于mappable的數據集(如ImageFolder)的pipeline,Cache將創建名為CacheLookupOp和CacheMergeOp的兩個緩存算子,并對pipeline做出相應的調整。
2.見于上圖Mappable數據集圖示,左邊的數據處理pipeline,當用戶在MapOp后插入緩存算子后,經過Cache變換調整過程,將對pipeline進行變換并最終將其調整為右圖中包含CacheLookupOp和CacheMergeOp兩個緩存算子的結構
3.對于包含non-mappable的數據集(如TFRecord)的pipeline,我們將創建名為CacheOp的緩存算子,并在pipeline相應位置插入CacheOp。見于上圖Non-mappable數據集圖示,左邊的數據處理pipeline,當用戶在MapOp后插入緩存算子后,經過Cache變換調整過程,將對pipeline進行變換并最終將其調整為右圖中包含CacheOp緩存算子的結構。
(2)緩存服務器
主要負責響應緩存客戶端所發送的請求,提供緩存數據的查找、讀取,以及發生緩存未命中時對于緩存數據的寫入等功能。緩存服務器擁有自己的工作隊列,不斷循環從工作隊列中獲取一個請求去執行并將結果返回給客戶端。同一個緩存服務器可以為多個緩存客戶端提供服務,且緩存服務器通過緩存客戶端的session_id以及該緩存客戶端所對應的數據處理pipeline的crc碼來唯一確定該緩存客戶端。因此,兩個完全一致的pipeline可以通過指定相同的session_id來共享同一個緩存服務,而不同的pipeline若試圖共享同一個緩存客戶端則會報錯。
1.Cache_server如何啟動?
Cache Server的服務由一個外部守護進程提供,在用戶使用Cache服務之前,需要先在mindspore外部啟動一個服務器守護進程,來與緩存客戶進行交互溝通;
ms_cache_server start|session [–m
然后啟動
cache_admin --start
2.cache_server創建時默認的port端口號是多少?
默認對IP為127.0.0.1(localhost)且端口號為50052的服務器執行操作
(3)緩存客戶端
主要負責與緩存服務器建立通訊,向緩存服務器發起數據讀取、數據寫入、狀態查詢等請求。緩存客戶端與服務器之間通過gRPC進行通訊,如下圖所示:當客戶端需要發起請求時,僅需要將請求添加到gRPC函數庫所提供的gRPC隊列,由gRPC線程不斷循環從gRPC隊列中獲取一個請求并將該請求發送到緩存服務器的工作隊列中。當緩存服務器需要將處理后的響應數據返回給客戶端時,也通過類似的方式將響應數據添加到gRPC隊列中,并依賴gRPC實際將數據傳輸至客戶端。
3.cache_client實體在創建時,其
唯一標識與緩存服務的連接session。應該從ms_cache_service session命令返回的session_id。當給出該選項時,緩存的大小和溢出行為取自session。如果未給出值,則假設這是唯一的通道,沒有其他通道將共享此緩存。在這種情況下,將自動生成一個session_id。
ms_cache_server start|session [–m
若緩存服務器中不存在緩存會話,則需要創建一個緩存會話,得到緩存會話id:
其中3231564523為端口50052的服務器分配的緩存會話id,緩存會話id由服務器分配。
三、快速定位模型精度問題
--MindSpore調試器
在圖模式下,用戶難以從Python層獲取到計算圖中間節點的結果。MindSpore調試器是為圖模式訓練提供的調試工具,可以用來查看并分析計算圖節點的中間結果。
使用MindSpore調試器,可以:
(1)在MindInsight調試器界面結合計算圖,查看圖節點的輸出結果;
(2)設置監測點,監測訓練異常情況(比如檢查張量溢出),在異常發生時追蹤錯誤原因;
(3)查看權重等參數的變化情況。
一、常見精度問題和定位思路
(1)常見現象
loss:跑飛,不收斂,收斂慢
metrics:accuracy、precision等達不到預期
梯度:梯度消失、梯度爆炸
權重:權重不更新、權重變化過小、權重變化過大
激活值:激活值飽和、dead relu
(2)常見問題
模型結構問題:算子使用錯誤、權重共享錯誤、權重凍結錯誤、節點連接錯誤、 loss函數錯誤、優化器錯誤等
超參問題:超參設置不合理等
數據問題:缺失值過多、異常值、未歸一化等
(3)常用定位思路
(1定位準備
回顧算法設計,全面熟悉模型
?算法設計、超參、loss、優化器、數據處理等
?參考論文、其它實現
熟悉可視化工具
?安裝MindInsight https://www.mindspore.com/install
?加入SummaryCollector callback,收集訓練信息
?在summary_dir的父目錄中啟動MindInsight
?mindinsight start
?熟悉調試器使用
熟悉調試器
?MindSpore調試器是為圖模式訓練提供的調試工具
?在MindInsight調試器界面結合計算圖,查看圖節點的輸出結果;
?設置監測點,監測訓練異常情況(比如檢查張量溢出),在異常發生時追蹤錯誤原因;
?查看權重等參數的變化情況。
使用指南請見?https://www.mindspore.cn/tutorial/training/zh-CN/master/advanced_use/summary_record.html
?debugger使用指南請見https://www.mindspore.cn/tutorial/training/zh-CN/r1.1/advanced_use/debugger.html
(2檢查代碼、超參、模型結構
走讀腳本,檢查代碼
?小黃鴨調試法
?檢查代碼同模型設計、論文、參考腳本等是否一致
超參常見問題:
?學習率不合理
?權重初始化參數不合理等
MindInsight輔助檢查:訓練列表->訓練參數詳情
模型結構常見問題:
?算子使用錯誤(使用的算子不適用于目標場景,如應該使用浮點除,錯誤地使用了整數除),
?權重共享錯誤(共享了不應共享的權重),
?權重凍結錯誤(凍結了不應凍結的權重),
?節點連接錯誤(應該連接到計算圖中的block未連接),
?loss函數錯誤,
?優化器算法錯誤(如果自行實現了優化器)等。
MindInsight輔助檢查:訓練列表->訓練看板->計算圖
(3檢查輸入數據
輸入數據常見問題:
?數據缺失值過多? ? ? ?每個類別中的樣本數目不均衡? ? ? ?數據中存在異常值? ? ? ?數據標簽錯誤
?訓練樣本不足? ? ? ? ? ?未對數據進行標準化,輸入模型的數據不在正確的范圍內? ? ? ?finetune和pretrain的數據處理方式不同
?訓練階段和推理階段的數據處理方式不同? ? ? ?數據處理參數不正確等。
MindInsight輔助檢查:訓練列表->訓練看板->數據抽樣
(4檢查loss曲線
常見現象
?loss跑飛
回顧腳本、模型結構和數據,
?檢查超參是否有不合理的特別大/特別小的取值,
?檢查模型結構是否實現正確,特別是檢查loss函數是否實現正確,
?檢查輸入數據中是否有缺失值、是否有特別大/特別小的取值。
使用參數分布圖檢查參數更新是否有劇烈變化
使用調試器功能對訓練現場進行檢查
?配置“檢查張量溢出”監測點,定位NAN/INF出現位置
?配置“檢查過大張量”監測點,定位出現大值的算子
?配置“檢查權重變化過大”、“檢查梯度消失”、“檢查梯度過大”監測點,定位異常的權重或梯度
?loss收斂慢
MindInsight輔助檢查:訓練列表->訓練看板->標量曲線/參數分布圖
調試器定位
(5檢查精度是否達到預期
回顧代碼、模型結構、輸入數據和loss曲線,
?檢查超參是否有不合理的值
?檢查模型結構是否實現正確
?檢查輸入數據是否正確
?檢查loss曲線的收斂結果和收斂趨勢是否存在異常
嘗試使用“溯源分析”和調參器優化超參
?mindoptimizer --config ./config.yaml --iter 10
嘗試模型解釋
嘗試優化模型算法
注意事項
場景支持
?調試器暫不支持分布式訓練場景。
?調試器暫不支持推斷場景。
?調試器暫不支持單機多卡/集群場景。
?調試器暫不支持連接多個訓練進程。
?調試器暫不支持CPU場景。
性能影響
?使用調試器時,會對訓練性能產生一定影響。
?設置的監測點數目過多時,可能會出現系統內存不足(Out-of-Memory)的異常。
GPU場景
?在GPU場景下,只有滿足條件的參數節點可以與自身的上一輪次結果作對比:使用下一個節點執行過的節點、使用運行到該節點時選中的節點、作為監測點輸入的參數節點。其他情況均無法使用上一輪次對比功能。
?由于GPU上一個輪次是一個子圖(而非完整的圖),GPU上多圖做重新檢查時,只能重新檢查當前的子圖。
重新檢查只檢查當前有張量值的監測點。
檢查計算過程溢出需要用戶開啟異步Dump的全部溢出檢測功能,開啟方式請參照異步Dump功能介紹
調試器展示的圖是優化后的最終執行圖。調用的算子可能已經與其它算子融合,或者在優化后改變了名稱。
參考
[1]www.mindspore.cn
[2]gitee.com/mindspore
[3]github.com/mindspore-ai
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。