使用MindStudio進(jìn)行MindInsight調(diào)優(yōu)
相對應(yīng)的視頻教學(xué)可以在B站進(jìn)行觀看:https://www.bilibili.com/vIDEo/BV1St4y1473r
一、MindSpore和MindInsight環(huán)境搭建和配置介紹
1 MindSpore簡介
昇思mindspore是一個全場景深度學(xué)習(xí)框架,旨在實現(xiàn)易開發(fā)、高效執(zhí)行、全場景覆蓋三大目標(biāo)。
其中,易開發(fā)表現(xiàn)為API友好、調(diào)試難度低;高效執(zhí)行包括計算效率、數(shù)據(jù)預(yù)處理效率和分布式訓(xùn)練效率;全場景則指框架同時支持云、邊緣以及端側(cè)場景。
昇思MindSpore總體架構(gòu)如下圖所示:
ModelZoo(模型庫):ModelZoo提供可用的深度學(xué)習(xí)算法網(wǎng)絡(luò)(ModelZoo地址)
Extend(擴(kuò)展庫):昇思MindSpore的領(lǐng)域擴(kuò)展庫,支持拓展新領(lǐng)域場景,如GNN/深度概率編程/強(qiáng)化學(xué)習(xí)等,期待更多開發(fā)者來一起貢獻(xiàn)和構(gòu)建。
Science(科學(xué)計算):MindScience是基于昇思MindSpore融合架構(gòu)打造的科學(xué)計算行業(yè)套件,包含了業(yè)界領(lǐng)先的數(shù)據(jù)集、基礎(chǔ)模型、預(yù)置高精度模型和前后處理工具,加速了科學(xué)行業(yè)應(yīng)用開發(fā)(了解更多)。
Expression(全場景統(tǒng)一API):基于python的前端表達(dá)與編程接口。同時未來計劃陸續(xù)提供C/C 、華為自研編程語言前端-倉頡(目前還處于預(yù)研階段)等第三方前端的對接工作,引入更多的第三方生態(tài)。
Data(數(shù)據(jù)處理層):提供高效的數(shù)據(jù)處理、常用數(shù)據(jù)集加載等功能和編程接口,支持用戶靈活的定義處理注冊和pipeline并行優(yōu)化。
Compiler(AI編譯器):圖層的核心編譯器,主要基于端云統(tǒng)一的MindIR實現(xiàn)三大功能,包括硬件無關(guān)的優(yōu)化(類型推導(dǎo)、自動微分、表達(dá)式化簡等)、硬件相關(guān)優(yōu)化(自動并行、內(nèi)存優(yōu)化、圖算融合、流水線執(zhí)行等)、部署推理相關(guān)的優(yōu)化(量化、剪枝等)。
Runtime(全場景運(yùn)行時):昇思MindSpore的運(yùn)行時系統(tǒng),包含云側(cè)主機(jī)側(cè)運(yùn)行時系統(tǒng)、端側(cè)以及更小IoT的輕量化運(yùn)行時系統(tǒng)。
Insight(可視化調(diào)試調(diào)優(yōu)工具):昇思MindSpore的可視化調(diào)試調(diào)優(yōu)工具,能夠可視化地查看訓(xùn)練過程、優(yōu)化模型性能、調(diào)試精度問題、解釋推理結(jié)果(了解更多)。
Armour(安全增強(qiáng)庫):面向企業(yè)級運(yùn)用時,安全與隱私保護(hù)相關(guān)增強(qiáng)功能,如對抗魯棒性、模型安全測試、差分隱私訓(xùn)練、隱私泄露風(fēng)險評估、數(shù)據(jù)漂移檢測等技術(shù)(了解更多)。
執(zhí)行流程
有了對昇思MindSpore總體架構(gòu)的了解后,我們可以看看各個模塊之間的整體配合關(guān)系,具體如圖所示:
昇思MindSpore作為全場景AI框架,所支持的有端(手機(jī)與IOT設(shè)備)、邊(基站與路由設(shè)備)、云(服務(wù)器)場景的不同系列硬件,包括昇騰系列產(chǎn)品,英偉達(dá)NVIDIA系列產(chǎn)品,Arm系列的高通驍龍、華為麒麟的芯片等系列產(chǎn)品。
左邊藍(lán)色方框的是MindSpore主體框架,主要提供神經(jīng)網(wǎng)絡(luò)在訓(xùn)練、驗證相關(guān)的基礎(chǔ)API功能,另外還會默認(rèn)提供自動微分、自動并行等功能。
藍(lán)色方框往下是MindSpore Data模塊,可以利用該模塊進(jìn)行數(shù)據(jù)預(yù)處理,包括數(shù)據(jù)采樣、數(shù)據(jù)迭代、數(shù)據(jù)格式轉(zhuǎn)換等不同的數(shù)據(jù)操作。在訓(xùn)練的過程會遇到很多調(diào)試調(diào)優(yōu)的問題,因此有MindSpore Insight模塊對loss曲線、算子執(zhí)行情況、權(quán)重參數(shù)變量等調(diào)試調(diào)優(yōu)相關(guān)的數(shù)據(jù)進(jìn)行可視化,方便用戶在訓(xùn)練過程中進(jìn)行調(diào)試調(diào)優(yōu)。
設(shè)計理念
- 支持全場景協(xié)同
- 昇思MindSpore是源于全產(chǎn)業(yè)的最佳實踐,向數(shù)據(jù)科學(xué)家和算法工程師提供了統(tǒng)一的模型訓(xùn)練、推理和導(dǎo)出等接口,支持端、邊、云等不同場景下的靈活部署,推動深度學(xué)習(xí)和科學(xué)計算等領(lǐng)域繁榮發(fā)展。
- 提供Python編程范式,簡化AI編程
- 昇思MindSpore提供了Python編程范式,用戶使用Python原生控制邏輯即可構(gòu)建復(fù)雜的神經(jīng)網(wǎng)絡(luò)模型,AI編程變得簡單。
- 提供動態(tài)圖和靜態(tài)圖統(tǒng)一的編碼方式
- 目前主流的深度學(xué)習(xí)框架的執(zhí)行模式有兩種,分別為靜態(tài)圖模式和動態(tài)圖模式。靜態(tài)圖模式擁有較高的訓(xùn)練性能,但難以調(diào)試。動態(tài)圖模式相較于靜態(tài)圖模式雖然易于調(diào)試,但難以高效執(zhí)行。 昇思MindSpore提供了動態(tài)圖和靜態(tài)圖統(tǒng)一的編碼方式,大大增加了靜態(tài)圖和動態(tài)圖的可兼容性,用戶無需開發(fā)多套代碼,僅變更一行代碼便可切換動態(tài)圖/靜態(tài)圖模式,例如設(shè)置context.set_context(mode=context.PYNATIVE_MODE)切換成動態(tài)圖模式,設(shè)置context.set_context(mode=context.GRAPH_MODE)即可切換成靜態(tài)圖模式,用戶可擁有更輕松的開發(fā)調(diào)試及性能體驗。
- 采用函數(shù)式可微分編程架構(gòu),使用戶聚焦于模型算法的數(shù)學(xué)原生表達(dá)
- 神經(jīng)網(wǎng)絡(luò)模型通?;谔荻认陆邓惴ㄟM(jìn)行訓(xùn)練,但手動求導(dǎo)過程復(fù)雜,結(jié)果容易出錯。昇思MindSpore的基于源碼轉(zhuǎn)換(Source Code Transformation,SCT)的自動微分(Automatic Differentiation)機(jī)制采用函數(shù)式可微分編程架構(gòu),在接口層提供Python編程接口,包括控制流的表達(dá)。用戶可聚焦于模型算法的數(shù)學(xué)原生表達(dá),無需手動進(jìn)行求導(dǎo)。
- 統(tǒng)一單機(jī)和分布式訓(xùn)練的編碼方式
- 隨著神經(jīng)網(wǎng)絡(luò)模型和數(shù)據(jù)集的規(guī)模不斷增加,分布式并行訓(xùn)練成為了神經(jīng)網(wǎng)絡(luò)訓(xùn)練的常見做法,但分布式并行訓(xùn)練的策略選擇和編寫十分復(fù)雜,這嚴(yán)重制約著深度學(xué)習(xí)模型的訓(xùn)練效率,阻礙深度學(xué)習(xí)的發(fā)展。MindSpore統(tǒng)一了單機(jī)和分布式訓(xùn)練的編碼方式,開發(fā)者無需編寫復(fù)雜的分布式策略,在單機(jī)代碼中添加少量代碼即可實現(xiàn)分布式訓(xùn)練,例如設(shè)置context.set_auto_parallel_context(parallel_mode=ParallelMode.AUTO_PARALLEL)便可自動建立代價模型,為用戶選擇一種較優(yōu)的并行模式,提高神經(jīng)網(wǎng)絡(luò)訓(xùn)練效率,大大降低了AI開發(fā)門檻,使用戶能夠快速實現(xiàn)模型思路。
層次結(jié)構(gòu)
昇思MindSpore向用戶提供了3個不同層次的API,支撐用戶進(jìn)行網(wǎng)絡(luò)構(gòu)建、整圖執(zhí)行、子圖執(zhí)行以及單算子執(zhí)行,從低到高分別為Low-Level Python API、Medium-Level Python API以及High-Level Python API。
- High-Level Python API
- 第一層為高階API,其在中階API的基礎(chǔ)上又提供了訓(xùn)練推理的管理、混合精度訓(xùn)練、調(diào)試調(diào)優(yōu)等高級接口,方便用戶控制整網(wǎng)的執(zhí)行流程和實現(xiàn)神經(jīng)網(wǎng)絡(luò)的訓(xùn)練推理及調(diào)優(yōu)。例如用戶使用Model接口,指定要訓(xùn)練的神經(jīng)網(wǎng)絡(luò)模型和相關(guān)的訓(xùn)練設(shè)置,對神經(jīng)網(wǎng)絡(luò)模型進(jìn)行訓(xùn)練,通過Profiler接口調(diào)試神經(jīng)網(wǎng)絡(luò)性能。
- Medium-Level Python API
- 第二層為中階API,其封裝了低階API,提供網(wǎng)絡(luò)層、優(yōu)化器、損失函數(shù)等模塊,用戶可通過中階API靈活構(gòu)建神經(jīng)網(wǎng)絡(luò)和控制執(zhí)行流程,快速實現(xiàn)模型算法邏輯。例如用戶可調(diào)用Cell接口構(gòu)建神經(jīng)網(wǎng)絡(luò)模型和計算邏輯,通過使用Loss模塊和Optimizer接口為神經(jīng)網(wǎng)絡(luò)模型添加損失函數(shù)和優(yōu)化方式,利用Dataset模塊對數(shù)據(jù)進(jìn)行處理以供模型的訓(xùn)練和推導(dǎo)使用。
- Low-Level Python API
- 第三層為低階API,主要包括張量定義、基礎(chǔ)算子、自動微分等模塊,用戶可使用低階API輕松實現(xiàn)張量定義和求導(dǎo)計算。例如用戶可通過Tensor接口自定義張量,使用ops.composite模塊下的GradOperation算子計算函數(shù)在指定處的導(dǎo)數(shù)。
2 MindInsight簡介
MindInsight是昇思MindSpore的可視化調(diào)試調(diào)優(yōu)工具。利用MindInsight,您可以可視化地查看訓(xùn)練過程、優(yōu)化模型性能、調(diào)試精度問題、解釋推理結(jié)果。您還可以通過MindInsight提供的命令行方便地搜索超參,遷移模型。在MindInsight的幫助下,您可以更輕松地獲得滿意的模型精度和性能。
MindInsight包括以下內(nèi)容:
- 訓(xùn)練過程可視 (收集Summary數(shù)據(jù)、查看訓(xùn)練看板)
- 訓(xùn)練溯源及對比
- 性能調(diào)優(yōu)
- 精度調(diào)試
- 超參調(diào)優(yōu)
- 模型遷移
3 環(huán)境安裝配置
3.1 MindSpore環(huán)境安裝配置
選擇適合自己的環(huán)境條件后,獲取命令并按照指南進(jìn)行安裝,或使用云平臺創(chuàng)建和部署模型,安裝細(xì)節(jié)參見鏈接:https://www.mindspore.cn/install
驗證是否安裝成功
方法一:
python -c "import mindspore;mindspore.run_check()"
如果輸出:
MindSpore version: 版本號
The result of multiplication calculation is correct, MindSpore has been installed successfully!
說明MindSpore安裝成功了。
方法二:
import numpy as np
from mindspore import Tensor
import mindspore.ops as ops
import mindspore.context as context
context.set_context(device_target="Ascend")
x = Tensor(np.ones([1,3,3,4]).astype(np.float32))
y = Tensor(np.ones([1,3,3,4]).astype(np.float32))
print(ops.add(x, y))
如果輸出:
[[[[2. 2. 2. 2.]
[2. 2. 2. 2.]
[2. 2. 2. 2.]]
[[2. 2. 2. 2.]
[2. 2. 2. 2.]
[2. 2. 2. 2.]]
[[2. 2. 2. 2.]
[2. 2. 2. 2.]
[2. 2. 2. 2.]]]]
說明MindSpore安裝成功了。
升級MindSpore版本
當(dāng)需要升級MindSpore版本時,可執(zhí)行如下命令:
pip install –upgrade mindspore-ascend=={version}
其中:
- 升級到rc版本時,需要手動指定{version}為rc版本號,例如1.6.0rc1;如果升級到正式版本,=={version}字段可以缺省。
3.2 MindInsight環(huán)境安裝配置
確認(rèn)系統(tǒng)環(huán)境信息
- 硬件平臺支持Ascend、GPU和CPU。
- 確認(rèn)安裝Python 3.7.5或3.9.0版本。如果未安裝或者已安裝其他版本的Python,可以選擇下載并安裝:Python 3.7.5版本 64位,下載地址:官網(wǎng)或華為云。Python 3.9.0版本 64位,下載地址:官網(wǎng)或華為云。
- MindInsight與MindSpore的版本需保持一致。
- 若采用源碼編譯安裝,還需確認(rèn)安裝以下依賴。確認(rèn)安裝node.js 10.19.0及以上版本。確認(rèn)安裝wheel 0.32.0及以上版本。
- 其他依賴參見requirements.txt。
可以采用pip安裝,源碼編譯安裝和Docker安裝三種方式。
pip安裝
安裝PyPI上的版本:
pip install mindinsight=={version}
安裝自定義版本:
pip install https://ms-release.obs.cn-north-4.myhuaweicloud.com/{version}/MindInsight/any/mindinsight-{version}-py3-none-any.whl –trusted-host ms-release.obs.cn-north-4.myhuaweicloud.com -i https://pypi.tuna.tsinghua.edu.cn/simple
其中:
- 當(dāng)環(huán)境中的MindSpore不是最新版本時,需要手動指定{version}為當(dāng)前環(huán)境中MindSpore版本號。
注:非root用戶需要在命令中加入“–user”參數(shù)。
源碼編譯安裝
從代碼倉下載源碼
git clone https://gitee.com/mindspore/mindinsight.git -b r1.7
編譯安裝MindInsight
可選擇以下任意一種安裝方式:
1.在源碼根目錄下執(zhí)行如下命令。
cd mindinsight
pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple
python setup.py install
2.構(gòu)建whl包進(jìn)行安裝
進(jìn)入源碼的根目錄,先執(zhí)行build目錄下的MindInsight編譯腳本,再執(zhí)行命令安裝output目錄下生成的whl包。
cd mindinsight
bash build/build.sh
pip install output/mindinsight-{version}-py3-none-any.whl -i https://pypi.tuna.tsinghua.edu.cn/simple
Docker安裝
MindSpore的鏡像包含MindInsight功能,請參考官網(wǎng)安裝指導(dǎo)。
驗證是否成功安裝
執(zhí)行如下命令:
mindinsight start
如果出現(xiàn)下列提示,說明安裝成功:
Web address: http://127.0.0.1:8080
service start state: success
二、MindStudio簡介和安裝
1 MindStudio簡介
MindStudio提供在AI開發(fā)所需的一站式開發(fā)環(huán)境,支持模型開發(fā)、算子開發(fā)以及應(yīng)用開發(fā)三個主流程中的開發(fā)任務(wù)。依靠模型可視化、算力測試、IDE本地仿真調(diào)試等功能,MindStudio能夠幫助您在一個工具上就能高效便捷地完成AI應(yīng)用開發(fā)。MindStudio采用了插件化擴(kuò)展機(jī)制,開發(fā)者可以通過開發(fā)插件來擴(kuò)展已有功能。
功能簡介
- 針對安裝與部署,MindStudio提供多種部署方式,支持多種主流操作系統(tǒng),為開發(fā)者提供最大便利。
- 針對網(wǎng)絡(luò)模型的開發(fā),MindStudio支持TensorFlow、Pytorch、MindSpore框架的模型訓(xùn)練,支持多種主流框架的模型轉(zhuǎn)換。集成了訓(xùn)練可視化、腳本轉(zhuǎn)換、模型轉(zhuǎn)換、精度比對等工具,提升了網(wǎng)絡(luò)模型移植、分析和優(yōu)化的效率。
- 針對算子開發(fā),MindStudio提供包含UT測試、ST測試、TIK算子調(diào)試等的全套算子開發(fā)流程。支持TensorFlow、PyTorch、MindSpore等多種主流框架的TBE和AI CPU自定義算子開發(fā)。
- 針對應(yīng)用開發(fā),MindStudio集成了Profiling性能調(diào)優(yōu)、編譯器、MindX SDK的應(yīng)用開發(fā)、可視化pipeline業(yè)務(wù)流編排等工具,為開發(fā)者提供了圖形化的集成開發(fā)環(huán)境,通過MindStudio能夠進(jìn)行工程管理、編譯、調(diào)試、性能分析等全流程開發(fā),能夠很大程度提高開發(fā)效率。
功能框架
MindStudio功能框架如圖所示,目前含有的工具鏈包括:模型轉(zhuǎn)換工具、模型訓(xùn)練工具、自定義算子開發(fā)工具、應(yīng)用開發(fā)工具、工程管理工具、編譯工具、流程編排工具、精度比對工具、日志管理工具、性能分析工具、設(shè)備管理工具等多種工具。
工具功能
MindStudio工具中的主要幾個功能特性如下:
- 工程管理:為開發(fā)人員提供創(chuàng)建工程、打開工程、關(guān)閉工程、刪除工程、新增工程文件目錄和屬性設(shè)置等功能。
- SSH管理:為開發(fā)人員提供新增SSH連接、刪除SSH連接、修改SSH連接、加密SSH密碼和修改SSH密碼保存方式等功能。
- 應(yīng)用開發(fā):針對業(yè)務(wù)流程開發(fā)人員,MindStudio工具提供基于AscendCL(Ascend Computing Language)和集成MindX SDK的應(yīng)用開發(fā)編程方式,編程后的編譯、運(yùn)行、結(jié)果顯示等一站式服務(wù)讓流程開發(fā)更加智能化,可以讓開發(fā)者快速上手。
- 自定義算子開發(fā):提供了基于TBE和AI CPU的算子編程開發(fā)的集成開發(fā)環(huán)境,讓不同平臺下的算子移植更加便捷,適配昇騰AI處理器的速度更快。
- 離線模型轉(zhuǎn)換:訓(xùn)練好的第三方網(wǎng)絡(luò)模型可以直接通過離線模型工具導(dǎo)入并轉(zhuǎn)換成離線模型,并可一鍵式自動生成模型接口,方便開發(fā)者基于模型接口進(jìn)行編程,同時也提供了離線模型的可視化功能。
- 日志管理:MindStudio為昇騰AI處理器提供了覆蓋全系統(tǒng)的日志收集與日志分析解決方案,提升運(yùn)行時算法問題的定位效率。提供了統(tǒng)一形式的跨平臺日志可視化分析能力及運(yùn)行時診斷能力,提升日志分析系統(tǒng)的易用性。
- 性能分析:MindStudio以圖形界面呈現(xiàn)方式,實現(xiàn)針對主機(jī)和設(shè)備上多節(jié)點(diǎn)、多模塊異構(gòu)體系的高效、易用、可靈活擴(kuò)展的系統(tǒng)化性能分析,以及針對昇騰AI處理器的性能和功耗的同步分析,滿足算法優(yōu)化對系統(tǒng)性能分析的需求。
- 設(shè)備管理:MindStudio提供設(shè)備管理工具,實現(xiàn)對連接到主機(jī)上的設(shè)備的管理功能。
- 精度比對:可以用來比對自有模型算子的運(yùn)算結(jié)果與Caffe、TensorFlow、ONNX標(biāo)準(zhǔn)算子的運(yùn)算結(jié)果,以便用來確認(rèn)神經(jīng)網(wǎng)絡(luò)運(yùn)算誤差發(fā)生的原因。
- 開發(fā)工具包的安裝與管理:為開發(fā)者提供基于昇騰AI處理器的相關(guān)算法開發(fā)套件包Ascend-cann-toolkit,旨在幫助開發(fā)者進(jìn)行快速、高效的人工智能算法開發(fā)。開發(fā)者可以將開發(fā)套件包安裝到MindStudio上,使用MindStudio進(jìn)行快速開發(fā)。Ascend-cann-toolkit包含了基于昇騰AI處理器開發(fā)依賴的頭文件和庫文件、編譯工具鏈、調(diào)優(yōu)工具等。
2 MindStudio安裝
2.1 安裝Python依賴
(1)官方網(wǎng)站下載安裝安裝Python3.7.5到Windows本地。
(2)設(shè)置環(huán)境變量。
(3)“Win R”快捷鍵打開系統(tǒng)命令行,輸入“Python -V”,顯示Python版本號表示安裝成功。
(4)安裝Python3相關(guān)依賴。
pip install xlrd==1.2.0
pip install absl-py
pip install numpy
pip install requests
(5)如若返回如下信息,則表示安裝成功。
Successfully installed xlrd-1.2.0
Successfully installed absl-py-0.12.0 six-1.15.0
Successfully installed numpy-1.20.1
Successfully installed requests-2.27.1
更多安裝細(xì)節(jié)請參考:https://www.hiascend.com/document/detail/zh/mindstudio/50RC1/instg/instg_000022.html
2.2 安裝MinGW依賴
(1)根據(jù)電腦配置,下載適合的(下載參考地址),例如64位可以選擇x86_64-posix-seh。
(2)解壓MinGW安裝包到自定義路徑。
(3)在Windows 10操作系統(tǒng)的“控制面板 > 系統(tǒng)和安全 > 系統(tǒng)”中選擇“高級系統(tǒng)設(shè)置”,如圖所示。
(4)打開系統(tǒng)命令行,輸入gcc –v命令。若顯示版本號表示安裝成功。
更多安裝細(xì)節(jié)請參考:https://www.hiascend.com/document/detail/zh/mindstudio/50RC1/instg/instg_000022.html
2.3 安裝java依賴
(1)要求Java版本為11,參考下載地址。
(2)下載后安裝到本地,設(shè)置Java環(huán)境變量。
(3)打開系統(tǒng)命令,輸入java –version,如顯示Java版本信息,則表示安裝成功。
2.4 安裝Cmake
以msi格式軟件包為例,安裝步驟如下(下載參考地址),你也可以登錄CMake官網(wǎng)下載合適的版本
(1)單擊快捷鍵“win R”,輸入cmd,單擊快捷鍵“Ctrl Shift Enter”,進(jìn)入管理員權(quán)限命令提示符。若彈出“用戶帳戶控制”提示窗口,單擊“是”。
(2)執(zhí)行以下命令,安裝軟件包:
msiexec /package {path}{name}.msi
例如:
msiexec /package D:cmake-3.22.3-win64-x64.msi
(3)根據(jù)安裝向?qū)нM(jìn)行安裝。
更多安裝細(xì)節(jié)請參考:https://www.hiascend.com/document/detail/zh/mindstudio/50RC1/instg/instg_000022.html
2.5 安裝MindStudio
(1)MindStudio官網(wǎng)為我們提供兩種安裝方式。大家可以選擇.zip文件,也可以選擇.exe文件。此處我選擇下載.zip文件。
(2)下載好后直接解壓到任意目錄。解壓后目錄結(jié)構(gòu)如圖所示。
(3)點(diǎn)擊“bin”目錄,然后雙擊目錄下的“MindStudio64.exe”應(yīng)用程序,運(yùn)行MindStudio。
詳細(xì)安裝指導(dǎo)請參閱:https://www.hiascend.com/document/detail/zh/mindstudio/50RC1/instg/instg_000021.html
三、使用MindStudio創(chuàng)建訓(xùn)練工程和運(yùn)行腳本
1 導(dǎo)入模型代碼創(chuàng)建訓(xùn)練工程
(1) 啟動MindStudio
首次啟動MindStudio會進(jìn)入如下歡迎界面,大家按需選擇新建項目或打開本地項目,在這里,我點(diǎn)擊 Open 按鈕打開本地現(xiàn)存項目(https://gitee.com/mindspore/models/tree/master/official/recommend/ncf)。
(2) 選擇項目所在位置,添加 ncf 項目,點(diǎn)擊 OK確定。
(3) 項目結(jié)構(gòu)如圖所示。
2 配置遠(yuǎn)程環(huán)境
2.1 連接遠(yuǎn)程服務(wù)器
(1) 點(diǎn)擊 Tools -> Deployment -> Configuration,配置遠(yuǎn)程連接服務(wù)器。
(2) 選中左側(cè) Deployment 選項卡,點(diǎn)擊左上角加號,輸入自定義遠(yuǎn)程連接名稱。
(3) 輸入服務(wù)器 IP 地址、端口號、用戶名及密碼,建議勾選 Save password 保存密碼,測試可以成功連接后,點(diǎn)擊OK確定。
(4) 點(diǎn)擊 Mappings 配置本地到服務(wù)器的文件路徑映射。Local Path 填入本地項目路徑,Deployment Path 選中遠(yuǎn)程服務(wù)器的項目路徑,這兩個文件夾名稱不必完全相同。Excluded Paths(非必需)為配置忽略路徑,表示忽略的項目文件不會上傳到遠(yuǎn)程服務(wù)器。配置完成后,點(diǎn)擊 OK 確定。
2.2 設(shè)置CANN
(1) 點(diǎn)擊 File -> Settings,進(jìn)入設(shè)置。
(2) 在左側(cè)菜單依次選中 Appearance & Behavior -> System Settings -> CANN, 進(jìn)入 CANN 配置選項卡中,設(shè)置遠(yuǎn)程服務(wù)器CANN路徑。
2.3 配置遠(yuǎn)程SDK
(1) 點(diǎn)擊 File -> Projects Structure 進(jìn)入項目設(shè)置。
(2) 在左側(cè)菜單中選擇 SDKs,點(diǎn)擊左上角加號,選擇 Add Python SDK… 進(jìn)行SDK配置。
(3) 在彈出的選項卡中選擇 SSH Interpreter,在Deploy中選擇遠(yuǎn)程連接名稱,等待 IDE 自動檢測可用的Interpreter。
(4) 自動檢測遠(yuǎn)程的SDK并顯示如下,可以對其進(jìn)行手動修改,我將 SDK 名稱更改為 msp1.7 以便區(qū)分。
(5) 在 Project 中設(shè)置剛才配置的遠(yuǎn)程SDK msp1.7。
3 運(yùn)行訓(xùn)練腳本
3.1 安裝項目依賴
(1) 點(diǎn)擊 Tools -> Start SSH session 打開遠(yuǎn)程服務(wù)器終端。
(2) 遠(yuǎn)程服務(wù)器終端顯示在 IDE 下方控制臺處,輸入 pip list 檢查所需依賴是否已安裝。
(3) 菜單欄中點(diǎn)擊 Ascend -> Convert To Ascend Project,將當(dāng)前項目轉(zhuǎn)換為昇騰項目。
(4) 在彈出的對話框中選擇轉(zhuǎn)換的類型和框架,此處選擇 Ascend Training 和 MindSpore 框架,點(diǎn)擊 OK 確定。
3.2 數(shù)據(jù)集下載和處理
(1)NCF模型介紹
NCF 是用于協(xié)同過濾推薦的通用框架,其中神經(jīng)網(wǎng)絡(luò)架構(gòu)用于對用戶交互進(jìn)行建模。與傳統(tǒng)模型不同,NCF 不訴諸矩陣分解 (MF),其對用戶和項目的潛在特征進(jìn)行內(nèi)積。它用可以從數(shù)據(jù)中學(xué)習(xí)任意函數(shù)的多層感知器代替積。
詳見:https://gitee.com/mindspore/models/tree/master/official/recommend/ncf
(2)展開src目錄,右擊 movielens.py,配置運(yùn)行參數(shù)。
(3)配置運(yùn)行參數(shù),其中 Script path 設(shè)置為運(yùn)行文件,Parameters 中設(shè)置參數(shù),Python interpreter 選擇前文配置的遠(yuǎn)程服務(wù)器中的 SDK,點(diǎn)擊 OK 確定。
(4) 點(diǎn)擊工具欄中的運(yùn)行按鈕,等待 ml-1m 數(shù)據(jù)集下載和預(yù)處理,大家可以在控制臺輸出查看當(dāng)前程序運(yùn)行的實時日志。
如果數(shù)據(jù)處理結(jié)束,會在控制臺輸出正常退出。
(5) 當(dāng)運(yùn)行程序后產(chǎn)生新的文件時,需要本地同步更新。建議大家點(diǎn)擊Tools -> Deployment -> Automatic Upload 開啟本地與服務(wù)器文件自動同步的功能。
(6)開啟自動同步后,更新過程如圖所示:
3.3 訓(xùn)練項目
(1)如圖所示,點(diǎn)擊Edit Configuration來編輯配置
(2)設(shè)置訓(xùn)練參數(shù),此處設(shè)置了訓(xùn)練20個epoch,batch_size為256,輸出保存在 ./output文件夾中,checkpoint保存在 ./nfc.ckpt 文件夾中,點(diǎn)擊 OK 確定。
(3)點(diǎn)擊運(yùn)行,項目開始進(jìn)行訓(xùn)練。
(4)在控制臺中查看訓(xùn)練過程中實時打印的日志。
四、MindInsight訓(xùn)練可視化及精度調(diào)優(yōu)指南
1 準(zhǔn)備訓(xùn)練腳本
(1)在train.py中,導(dǎo)入SummaryCollector。
from mindspore.train.callback import SummaryCollector
(2)在train.py代碼中,實例化 SummaryCollector,并添加到callbacks中。
# Init summary_collector
summary_collector = SummaryCollector(summary_dir="./summary_dir")
model.train(epochs,
ds_train,
callbacks=[TimeMonitor(ds_train.get_dataset_size()),
callback, ckpoint_cb, summary_collector],
dataset_sink_mode=False)
(3)增加如上代碼后,須重新訓(xùn)練模型,收集的數(shù)據(jù)存放于 ./summary_dir 中。
2 MindInsight訓(xùn)練可視化配置
(1)在工具欄選擇 Ascend -> MindInsight 打開 MindInsight 管理界面。
(2) MindInsight 管理界面可顯示并管理多個 MindInsight訓(xùn)練可視化工程。MindInsight 管理界面相關(guān)屬性說明如下圖所示,點(diǎn)擊Enable按鈕,配置MindInsight組件相關(guān)參數(shù)。
(3)在彈出的選項卡中,配置MindInsight組件相關(guān)參數(shù),其中 Summary Base Dir 填入代碼中設(shè)置的目錄,WorkSpace 可以在 SSH 終端中輸入 mindinsight start 查看,Port為端口號。
(4)單擊 OK 完成 MindInsight 組件相關(guān)參數(shù)配置,出現(xiàn)如圖所示界面,說明配置成功。
(5)點(diǎn)擊 View 按鈕即可跳轉(zhuǎn) MindInsight 界面。
3 查看MindInsight訓(xùn)練看板及精度調(diào)優(yōu)指南
代碼是精度問題的重要源頭,超參問題、模型結(jié)構(gòu)問題、數(shù)據(jù)問題、算法設(shè)計和實現(xiàn)問題會體現(xiàn)在腳本中,而我們使用的MindInsight生態(tài)工具可以將腳本中的各類問題以生動的可視化數(shù)據(jù)呈現(xiàn)給開發(fā)者,下面我們開始探究如何使用MindInsight進(jìn)行精度調(diào)優(yōu)。
(1)進(jìn)入訓(xùn)練列表后,我們可以點(diǎn)擊右上角的按鈕選擇開啟/關(guān)閉自動刷新看板信息和設(shè)置刷新頻率,以及切換語言和主題。
(2)點(diǎn)擊“訓(xùn)練看板”后,可以看見訓(xùn)練時的各類可視化數(shù)據(jù)。主要包括損失函數(shù)、訓(xùn)練參數(shù)、訓(xùn)練數(shù)據(jù)以及網(wǎng)絡(luò)計算圖等。
(3)點(diǎn)擊 “參數(shù)詳情” ,檢查超參。
MindInsight可以輔助用戶對超參做檢查,大多數(shù)情況下,SummaryCollector會自動記錄常見超參,大家可以通過MindInsight的訓(xùn)練參數(shù)詳情功能和溯源分析功能查看超參。結(jié)合MindInsight模型溯源分析模塊和腳本中的代碼,可以確認(rèn)超參的取值,識別明顯不合理的超參。如果有標(biāo)桿腳本,建議同標(biāo)桿腳本一一比對超參取值,如果有默認(rèn)參數(shù)值,則默認(rèn)值也應(yīng)一并比對,以避免不同框架的參數(shù)默認(rèn)值不同導(dǎo)致精度下降或者訓(xùn)練錯誤。
根據(jù)我們的經(jīng)驗,超參問題主要體現(xiàn)為幾個常見的超參取值不合理,例如:
①學(xué)習(xí)率過大導(dǎo)致loss震蕩難收斂,學(xué)習(xí)率過小導(dǎo)致訓(xùn)練不充分,學(xué)習(xí)率帶來的影響可以直觀地從loss曲線觀察到;
②loss_scale參數(shù)不合理,有可能導(dǎo)致loss為nan或loss遲遲不收斂;
③權(quán)重初始化參數(shù)不合理等。
參數(shù)詳情可以顯示常見的超參數(shù)。如下圖所示:
(4)點(diǎn)擊 “參數(shù)分布圖”,可以查看網(wǎng)絡(luò)可訓(xùn)練參數(shù)隨著迭代次數(shù)增加而產(chǎn)生的分布變化情況。大多數(shù)情況下,SummaryCollector會自動記錄模型參數(shù)變化情況(默認(rèn)記錄5個參數(shù)),可以通過MindInsight的參數(shù)分布圖模塊查看。如果想要記錄更多參數(shù)的參數(shù)分布圖,請參考SummaryCollector的histogram_regular參數(shù),或參考HistogramSummary算子。
(5)點(diǎn)擊“計算圖”,檢查模型結(jié)構(gòu)。
在模型結(jié)構(gòu)方面,常見的問題有:
①算子使用錯誤(使用的算子不適用于目標(biāo)場景,如應(yīng)該使用浮點(diǎn)除,錯誤地使用了整數(shù)除)。
②權(quán)重共享錯誤(共享了不應(yīng)共享的權(quán)重)。
③權(quán)重凍結(jié)錯誤(凍結(jié)了不應(yīng)凍結(jié)的權(quán)重)。
④節(jié)點(diǎn)連接錯誤(應(yīng)該連接到計算圖中的block未連接)。
⑤loss函數(shù)錯誤。
⑥優(yōu)化器算法錯誤(如果自行實現(xiàn)了優(yōu)化器)等。
MindInsight可以輔助用戶對模型結(jié)構(gòu)進(jìn)行檢查。大多數(shù)情況下,SummaryCollector會自動記錄計算圖,點(diǎn)擊 “計算圖”,可以直觀地看到各個網(wǎng)絡(luò)節(jié)點(diǎn)的關(guān)系,如下圖所示:
圖中左側(cè)為直觀的計算圖,右側(cè)為各節(jié)點(diǎn)的樹狀結(jié)構(gòu)圖,點(diǎn)擊相應(yīng)的節(jié)點(diǎn)可以將其展開或折疊,方便用戶查看。
(6)點(diǎn)擊“標(biāo)量信息”,檢查loss曲線。
大多數(shù)精度問題會在網(wǎng)絡(luò)訓(xùn)練過程中發(fā)現(xiàn),并且可以直觀地體現(xiàn)在損失函數(shù)的圖表中,我們總結(jié)了一些可以體現(xiàn)在損失函數(shù)異常的常見問題:
①權(quán)重問題(例如權(quán)重不更新、權(quán)重更新過大、權(quán)重值過大/過小、權(quán)重凍結(jié)不準(zhǔn)確、權(quán)重共享設(shè)置有誤);
②激活值問題(激活值飽和或過弱,例如Sigmoid的輸出接近1,Relu的輸出全為0);
③梯度問題(例如梯度消失、梯度爆炸);
④訓(xùn)練epoch不足(loss還有繼續(xù)下降的趨勢);
⑤算子計算結(jié)果存在NAN、INF等。
如下圖,我們可以查看詳細(xì)的損失函數(shù)信息,并且面板設(shè)置有開啟/關(guān)閉Loss曲線全屏等功能,在這里可以直觀地看到損失函數(shù)的收斂趨勢以及波動幅度。
五、MindInsight訓(xùn)練耗時統(tǒng)計及性能調(diào)優(yōu)指南
1 準(zhǔn)備訓(xùn)練腳本
(1) 在train.py中導(dǎo)入Profiler。
from mindspore.profiler import Profiler
(2)收集profiler數(shù)據(jù)并分析。
profiler = Profiler(output_path='./profiler_data')
profiler.analyse()
(3)再次訓(xùn)練項目。此處僅僅作為模型性能調(diào)優(yōu),可以適當(dāng)將訓(xùn)練總分步數(shù)調(diào)?。ɡ鐑蓚€step,數(shù)據(jù)經(jīng)過整個計算圖即可得到算子耗時)。
2 MindInsight調(diào)優(yōu)配置
(1)更改MindInsight配置參數(shù),與訓(xùn)練可視化的操作相似,這里的 Summary Base Dir 填入代碼里設(shè)置的參數(shù)。
(2)單擊 OK 完成 MindInsight 組件相關(guān)參數(shù)配置,出現(xiàn)如圖所示界面,說明配置成功。
(3)點(diǎn)擊 View 按鈕即可跳轉(zhuǎn) MindInsight 界面。
3 查看MindInsight性能看板及性能調(diào)優(yōu)指南
(1)右上角可以選擇開啟/關(guān)閉自動刷新看板信息和刷新頻率,以及切換語言和主題。點(diǎn)擊 “性能分析”。
(2)進(jìn)入性能分析看板后,可以看見有關(guān)訓(xùn)練耗時的各類數(shù)據(jù)圖表。
(3)點(diǎn)擊“算子耗時統(tǒng)計排名”,可以查看各個算子的執(zhí)行時間進(jìn)行統(tǒng)計展示(包括AICORE、AICPU、HOSTCPU算子)。在右上角可以選擇餅圖/柱狀圖展示各算子類別的時間占比,每個算子類別的執(zhí)行時間會統(tǒng)計屬于該類別的算子執(zhí)行時間總和。統(tǒng)計前20個占比時間最長的算子類別,展示其時間所占的百分比以及具體的執(zhí)行時間(毫秒),我們可以選擇算子耗時排名靠前的算子進(jìn)行性能優(yōu)化,這樣有更大的優(yōu)化空間。
(4)點(diǎn)擊“迭代軌跡”,查看每次迭代中各階段的耗時,確定性能瓶頸點(diǎn)在哪個階段,然后再針對該階段進(jìn)行詳細(xì)分析。下面簡單解釋一下迭代軌跡中的三個階段:
- 迭代間隙:該階段反映的是每個迭代開始時等待訓(xùn)練數(shù)據(jù)的時間。如果該階段耗占比較高,說明數(shù)據(jù)處理的速度跟不上訓(xùn)練的速度。
- 前反向計算:該階段主要執(zhí)行網(wǎng)絡(luò)中的前向及反向算子,承載了一個迭代主要的計算工作。如果該階段耗占比較高,較為合理。
- 迭代拖尾:該階段主要包含參數(shù)更新等操作,在多卡場景下還包括集合通信等操作。如果該階段耗占比較高,可能是集合通信耗時比較長。
(5)進(jìn)入“迭代軌跡”面板查看迭代軌跡詳情。當(dāng)我們確定性能瓶頸點(diǎn)在哪個階段時,就可以更有針對性地進(jìn)行性能優(yōu)化。此處我們總結(jié)了三個階段時間異常的原因分析及解決方案:
- 針對迭代間隙過長的問題:理想情況下,某個迭代開始前向訓(xùn)練時,其所需要的訓(xùn)練數(shù)據(jù)已經(jīng)在Host側(cè)完成了加載及增強(qiáng)并發(fā)送到了Device側(cè),反映到迭代間隙耗時通常在1毫秒內(nèi),否則就會由于等待訓(xùn)練數(shù)據(jù)而造成芯片算力的浪費(fèi)。迭代間隙耗時長,說明該迭代開始前向計算時等待了較長的時間后訓(xùn)練數(shù)據(jù)才發(fā)送到了Device側(cè)。用戶需要到“數(shù)據(jù)準(zhǔn)備”頁面進(jìn)一步確認(rèn)是數(shù)據(jù)增強(qiáng)還是數(shù)據(jù)發(fā)送過程存在性能問題。
- 針對前反向耗時過長的問題:該階段主要包含網(wǎng)絡(luò)中前向及反向算子的執(zhí)行時間。若該時間段耗時較長,建議按跳轉(zhuǎn)到“算子耗時統(tǒng)計排名”標(biāo)簽頁,查看訓(xùn)練過程中各算子的耗時情況,重點(diǎn)關(guān)注耗時排名靠前的部分算子。分享一些解決算子耗時長的小tips(歡迎補(bǔ)充~):在不影響精度的前提下,將float32類型修改為float16類型;存在轉(zhuǎn)換算子過多(TransData、Cast類算子)且耗時明顯時,如果是用戶手動加入的算子,可分析其必要性,如果對精度沒有影響,可去掉冗余的Cast、TransData算子;
- 針對迭代拖尾耗時過長的問題:該階段在單卡場景主要包含參數(shù)更新等操作。從實際的調(diào)優(yōu)經(jīng)驗來看,在單卡訓(xùn)練場景下該階段耗時都很短,不會存在性能瓶頸。如果用戶遇到單卡場景下該階段耗時長,可以下載“時間線”,使用chrome://tracing工具觀察參數(shù)更新相關(guān)的算子耗時是否有異常,并到MindSpore社區(qū) 反饋。
六、FAQ
1、使用遠(yuǎn)程conda環(huán)境無法識別conda環(huán)境里的包
原因:使用MindStudio進(jìn)行遠(yuǎn)程連接服務(wù)器資源時,默認(rèn)使用/usr/local/…下的本地環(huán)境。
解決方法:可以嘗試指定運(yùn)行文件為shell腳本,在shell腳本靠前位置指明source activate xxx-env來激活遠(yuǎn)程conda環(huán)境。
2、啟動MindInsight訓(xùn)練看板卡頓,單擊無響應(yīng)。
解決方法:
(1)嘗試disable后重新開啟;
(2)嘗試重新存儲訓(xùn)練數(shù)據(jù);
(3)SummaryCollector實例化的參數(shù)收集頻率collect_freq設(shè)置的值過小,嘗試調(diào)大一點(diǎn)。
3、點(diǎn)擊View查看MindInsight訓(xùn)練面板,顯示為空。
解決方法:Summary Base Dir 填入正確的目錄,無需加前綴“./”。
4、MindInsight訓(xùn)練面板顯示異常數(shù)據(jù)(數(shù)據(jù)不符合預(yù)期)。
原因:每個summary日志文件目錄中,應(yīng)該只放置一次訓(xùn)練的數(shù)據(jù)。一個summary日志目錄中如果存放了多次訓(xùn)練的summary數(shù)據(jù),MindInsight在可視化數(shù)據(jù)時會將這些訓(xùn)練的summary數(shù)據(jù)進(jìn)行疊加展示,可能會與預(yù)期可視化效果不相符。
解決方法:將summary日志文件目錄刪除后,重新訓(xùn)練生成文件。
5、訓(xùn)練看板中Loss曲線過于平滑,難以分析Loss震蕩幅度。
解決方法:將model.train方法的dataset_sink_mode參數(shù)設(shè)置為False,從而以step作為collect_freq參數(shù)的單位收集數(shù)據(jù)。當(dāng)dataset_sink_mode為True時,將以epoch作為collect_freq的單位,此時建議手動設(shè)置collect_freq參數(shù)。collect_freq參數(shù)默認(rèn)值為10。
七、從昇騰官方中體驗更多內(nèi)容
MindSpore模型開發(fā)教程與API可參考MindSpore官網(wǎng):https://www.mindspore.cn/, 也可以在昇騰論壇進(jìn)行討論和交流: https://bbs.huaweicloud.com/forum/forum-726-1.html
總結(jié)
本文主要介紹了如何使用MindStudio在MindSpore模型開發(fā)時使用MindInsight工具進(jìn)行調(diào)優(yōu),詳細(xì)介紹了其中的MindSpore環(huán)境搭建和配置介紹、MindStudio的安裝與使用、訓(xùn)練工程的導(dǎo)入與配置、MindInsight訓(xùn)練可視化以及MindInsight性能調(diào)優(yōu)等。 歡迎大家提出意見與反饋,謝謝!