MegEngine 使用小技巧:Profiler使用手冊(cè)
0.寫(xiě)在前面
“xx,R 那邊反應(yīng)多機(jī)訓(xùn)練速度慢,你看一下什么情況”
“xxx,為什么 MGE 更新之后,xxx 網(wǎng)絡(luò)訓(xùn)練變慢了,你看一下”
這是組內(nèi)日常對(duì)話
(資料圖)
然后有人日常背鍋
組員的狀態(tài)是:提性能,提性能,還是 TMD 提性能
據(jù)不完全統(tǒng)計(jì),有 80% 的性能問(wèn)題其實(shí)是因?yàn)橛?xùn)練代碼寫(xiě)的不夠好,讓 MGE 有力使不出來(lái)
包括但不限于以下情況
1)沒(méi)開(kāi) fast_run
2)頻繁使用 numpy 進(jìn)行同步
3)沒(méi)有用 make_allreduce_cb,讓計(jì)算通信串行
4)。。。
次數(shù)多了,就發(fā)現(xiàn)這玩意太花時(shí)間了,而且每次的步驟都千篇一律,為啥一定要我來(lái)做,所以寫(xiě)這篇文章進(jìn)行總結(jié),方便大家也方便自己
1.Profiler 介紹
首先我們要認(rèn)識(shí) Profiler 這個(gè)東西
簡(jiǎn)單來(lái)說(shuō),Profiler 以時(shí)間軸的形式記錄了所有算子的運(yùn)行時(shí)間
通過(guò) Profile 結(jié)果,我們可以很快的發(fā)現(xiàn)這段代碼為什么跑的慢
是做了多余的工作?還是計(jì)算資源的浪費(fèi)?或者是算子本身的性能很差,需要替換成別的算子
這是一個(gè)簡(jiǎn)單的 profile 結(jié)果展示
大部分情況下我們只關(guān)注 gpu thread,每一個(gè) gpu thread 對(duì)應(yīng)一個(gè) cuda stream,上面都是運(yùn)行在這個(gè) cuda stream 上的算子
2.使用方式
PS:靜態(tài)圖的統(tǒng)計(jì)信息還不夠完善(受到圖優(yōu)化影響),profile 結(jié)果相對(duì)動(dòng)態(tài)圖的不夠友好
from megengine.utils.profiler import profile, Profiler # 裝飾器寫(xiě)法@profile()def train_step(data, label, *, optimizer, gm, model) with gm: logits = model(data) loss = F.loss.cross_entropy(logits, label) gm.backward(loss) optimizer.step().clear_grad() return loss # with 寫(xiě)法# 訓(xùn)練過(guò)程中最好只有一個(gè)profiler實(shí)例,因?yàn)閜rofiler會(huì)在析構(gòu)時(shí)自動(dòng)dump出結(jié)果,如果有多個(gè)實(shí)例的話每個(gè)iter都會(huì)dump,非常慢profiler = Profiler() def train_step(data, label, *, optimizer, gm, model) with profiler: with gm: logits = model(data) loss = F.loss.cross_entropy(logits, label) gm.backward(loss) optimizer.step().clear_grad() return loss
??注意,profiler 默認(rèn)會(huì)在析構(gòu)的時(shí)候?qū)С?profile 結(jié)果,也可以手動(dòng)調(diào)用 profiler.dump 方法手動(dòng) dump
參數(shù)說(shuō)明:
Profiler
的構(gòu)造函數(shù)支持如下參數(shù):
- path: profile 數(shù)據(jù)的存儲(chǔ)路徑,默認(rèn)為當(dāng)前路徑下的profile文件夾.
- format: 輸出數(shù)據(jù)的格式,默認(rèn)為chrome_timeline.json,是 Chrome 支持的一種標(biāo)準(zhǔn)格式,以時(shí)間線的形式展現(xiàn) profiling 結(jié)果. 可選項(xiàng)還有有 memory_flow.svg,以時(shí)間x地址空間的形式展示內(nèi)存使用情況.
- formats: 若需要的輸出格式不止一種,可以在 formats 參數(shù)里列出.
- sample_rate: 若該項(xiàng)不為零,則每隔 n 個(gè) op 會(huì)統(tǒng)計(jì)一次顯存信息,分析數(shù)據(jù)時(shí)可以繪制顯存占用曲線,默認(rèn)為 0.
- profile_device: 是否記錄 gpu 耗時(shí),默認(rèn)為 True.
- with_scopes: 是否額外記錄 functional/ tensor method 等 python API 對(duì)應(yīng)的 scope, 默認(rèn)為 False.
- with_backtrace: 是否記錄 op/event 對(duì)應(yīng)的 python 調(diào)用棧, 默認(rèn)為 False, 開(kāi)啟會(huì)使記錄數(shù)據(jù)文件體積變大.
scope 使用介紹
我們會(huì)自動(dòng)在 module 的 forward 還有 backward 以及 step 步驟中加入 scope,scope 會(huì)在 host thread 上顯示,能看出 op 屬于哪一個(gè) module 的什么階段
也可以自己加上 scope
from megengine.utils.profiler import Profiler, scope def main() with Profiler(): x = Tensor(1) with scope("Add"): y = x+1 with scope("Mul"): z = x*3
默認(rèn)情況下 profiler 只會(huì)記錄 module forward, backward, step 三類(lèi) scope, 用戶(hù)可以在構(gòu)造 Profiler 對(duì)象時(shí)傳入?yún)?shù)with_scopes = True
額外記錄 functional
, tensor method
等 api
調(diào)用對(duì)應(yīng)的 scope
。
開(kāi)啟 with_scopes
選項(xiàng)后額外記錄了 BatchNorm2d Module
內(nèi)部調(diào)用的 functional / tensor method API
調(diào)用 scope
開(kāi)啟 with_scopes 選項(xiàng)后額外記錄了 backward scope, 該 scope 用于記錄反向計(jì)算序列對(duì)應(yīng)的前向算子, 可用于查找反向計(jì)算中有性能問(wèn)題的算子是由哪種算子前向計(jì)算產(chǎn)生。下圖 scope 表示 Broadcast, SetSubtensor 等算子是由 Subtensor 反向計(jì)算產(chǎn)生的。
3.可視化顯示
推薦使用perfetto查看 profile 結(jié)果,也可以用 Chrome 開(kāi)發(fā)者模式(F12)的 Performance 模塊查看 timeline 格式文件,也可以用chrome://tracing/進(jìn)行查看
以下介紹的都是基于 perfetto 的操作方式
1)統(tǒng)計(jì)
可以選中一段連續(xù)的時(shí)間段,查看這一個(gè)時(shí)間段的統(tǒng)計(jì)結(jié)果
下方會(huì)顯示事件統(tǒng)計(jì)結(jié)果,可以看到事件實(shí)際占用時(shí)間(Wall duration)(可以結(jié)合總時(shí)間算出空閑時(shí)間),可以按照總占用時(shí)間排序,也可以按照平均時(shí)間排序
2)依賴(lài)關(guān)系
在 host thread上,op 會(huì)記錄對(duì)應(yīng)的 input和output 以及相應(yīng)的依賴(lài)關(guān)系,可以依據(jù)箭頭找到 input 依賴(lài)的上一個(gè) op,也可以通過(guò)下方 flow event 點(diǎn)擊移動(dòng)到上一個(gè)或者下一個(gè)
我們還能找到 op 對(duì)應(yīng)的 host 時(shí)間和 gpu 時(shí)間,點(diǎn)擊 op 可以看到在不同 thread(cpu,gpu)占用的時(shí)間
3)查看顯存使用, gpu 利用率等指標(biāo)
profiler 除了記錄時(shí)間算子執(zhí)行時(shí)間外,還會(huì)記錄一些與顯存和性能相關(guān)的指標(biāo)。gpu_usage_ratio 記錄程序執(zhí)行平均的 gpu 利用率(gpu 執(zhí)行 kernel 時(shí)間占總時(shí)間的比例),gpu_usage_ratio 低說(shuō)明程序 host 側(cè)是瓶頸 。gpux:x alloc_mem_value 記錄了gpux 顯存使用量隨時(shí)間的變化的曲線, 需要把 sample_rate 設(shè)置為大于 0 的整數(shù)(sampe rate 代表每隔 n 個(gè) op 記錄一次顯存使用量)
4)放大縮小
可以拖動(dòng)上方時(shí)間軸的起始和結(jié)束點(diǎn)來(lái)修改起始點(diǎn)和結(jié)束點(diǎn),也可以通過(guò)放大縮小手勢(shì)進(jìn)行放大縮小
中間豎線上面的灰色小方塊就是可以拖動(dòng)的點(diǎn)
4.常見(jiàn)調(diào)試技巧(附使用例子
1)多余計(jì)算
yolox 例子,forward,backward,step 運(yùn)行完成了,但是后面多出了很多的 reshape 操作(一般認(rèn)為 reshape 無(wú)實(shí)際計(jì)算,所以基本看作是浪費(fèi)
找到原因后結(jié)果如下(5s->1.3s)
2)計(jì)算通信串行(請(qǐng)認(rèn)準(zhǔn) make_allreduce_cb)
allreduce 通信在 gpu0:1,如果發(fā)現(xiàn)通信在 gpu0:0 那就是用錯(cuò)了
3)host 性能慢,gpu 利用率不高
cpu 時(shí)間和 gpu 時(shí)間基本上一致,很可疑
放大仔細(xì)看,gpu 運(yùn)行時(shí)間中有很多空隙,而且點(diǎn)擊對(duì)應(yīng) op 查看依賴(lài)關(guān)系,可以看出中間的空隙時(shí)間是在等待 host 進(jìn)行 launch cuda kernel
4)使用 backtrace 記錄功能查找性能瓶頸部分對(duì)應(yīng)源碼
上述示例介紹了如何從 profile 結(jié)果中發(fā)現(xiàn)性能異常的部分, profiler 提供了 backtrace 調(diào)用棧記錄功能, 方便用戶(hù)找到異常部分對(duì)應(yīng)的訓(xùn)練代碼源碼。backtrace 記錄會(huì)記錄算子的 dispatch/kernel 執(zhí)行,TensorWaitProperty 等事件對(duì)應(yīng)的 python 調(diào)用棧。
可以在構(gòu)造 Profiler 對(duì)象時(shí)通過(guò)傳入 with_backtrace = True 開(kāi)啟調(diào)用棧記錄功能。 開(kāi)啟該選項(xiàng)后 profiler 保存數(shù)據(jù)文件體積會(huì)增大。
用戶(hù)可以在 perfetto UI 界面上點(diǎn)擊 op 查看其對(duì)應(yīng)的源碼。
下圖 profiler 結(jié)果中 CompiledOp[IOU] 算子執(zhí)行時(shí)間較長(zhǎng), 通過(guò)記錄的 backtrace 可以發(fā)現(xiàn)該算子是檢測(cè)模型計(jì)算 loss 部分調(diào)用的。
下圖中 interpreter 線程中某個(gè) TensorWaitProp 占用時(shí)間很長(zhǎng),可能會(huì)拖慢 host 執(zhí)行速度,導(dǎo)致 gpu 空閑。
(TensorWaitProp 可能是由 tensor.shape, tensor.numpy() 等方法調(diào)用產(chǎn)生的, 會(huì)讓 host 側(cè)等待 device 執(zhí)行,以獲取 Tensor 的 value 或 shape 屬性)
通過(guò)調(diào)用??梢园l(fā)現(xiàn)該事件是由 basedet 檢測(cè)模型 get_ground_truth 方法中的某個(gè) getitem產(chǎn)生的 ( __getitem__中使用了 tensor shape 屬性觸發(fā)了 host 側(cè)的 sync)。
附
更多 MegEngine 信息獲取,您可以:查看文檔和GitHub 項(xiàng)目,或加入 MegEngine 用戶(hù)交流 QQ 群:1029741705。歡迎參與 MegEngine 社區(qū)貢獻(xiàn),成為Awesome MegEngineer,榮譽(yù)證書(shū)、定制禮品享不停。
關(guān)鍵詞:
您可能也感興趣:
今日熱點(diǎn)
為您推薦
滬市77家公司推出現(xiàn)金分紅方案,合計(jì)擬派現(xiàn)超1848億元
提升老賽道開(kāi)辟新賽道初見(jiàn)成效 綠地2023上半年實(shí)現(xiàn)平穩(wěn)發(fā)展
大學(xué)女教師擅自離境失聯(lián),校方:解聘
更多
- 第三人稱(chēng)生存恐怖游戲 《白日夢(mèng)魘:沙堡1994》現(xiàn)已正式上線...
- 沈陽(yáng)前十名的整形醫(yī)院 有名氣的醫(yī)院名單推薦
- 京東方A(000725.SZ)發(fā)半年度業(yè)績(jī),凈利潤(rùn)7.36億元,同比減少88.84%
- 洛陽(yáng)市委召開(kāi)專(zhuān)題會(huì)議 研究城市陽(yáng)臺(tái)建設(shè)、洛邑古城片區(qū)保護(hù)...
- 科隆股份(300405.SZ):上半年凈虧損1313.39萬(wàn)元
- 黃土塬溝道侵蝕擴(kuò)張機(jī)理與固溝保塬工程研究取得進(jìn)展
- 基金持倉(cāng)動(dòng)向:交銀施羅德基金何帥二季度加倉(cāng)這些股(名單)
- 也門(mén)政府軍與胡塞武裝交火至少23人死亡
更多
- 信號(hào)工指揮塔吊教程 信號(hào)工
- 藥康生物:2023年半年度凈利潤(rùn)約7757萬(wàn)元 同比下降4.98%
- 洗車(chē)店污水直排引居民不滿(mǎn),怎么辦?聽(tīng)公益訴訟檢察官講辦案故事
- 氧氟沙星上市公司股票有哪些?相關(guān)氧氟沙星龍頭一覽(2023/8/29)
- 郭臺(tái)銘釀2024亂局,侯友宜民調(diào)恐有巨變?沈富雄大膽預(yù)言結(jié)局
- 活久見(jiàn)!一個(gè)“家族”集體賣(mài)淫服務(wù),你見(jiàn)過(guò)嗎?
- 鄭州沁河苑1號(hào)院戶(hù)型圖+面積+實(shí)拍照片
- 萊奧塔爾足球俱樂(lè)部(關(guān)于萊奧塔爾足球俱樂(lè)部簡(jiǎn)述)
排行
- 光伏環(huán)保設(shè)備龍頭仕凈科技——上半年歸母凈利潤(rùn)同比大漲153.5%
- 勞務(wù)輸出是什么意思網(wǎng)絡(luò)用語(yǔ)_勞務(wù)輸出是什么意思 全球關(guān)注
- net framework4.8下載_net framework 4 0 32位下載 世界短訊
- 廣州希爾頓酒店多少錢(qián)一晚_希爾頓酒店多少錢(qián)一晚 環(huán)球最新
- 孕婦可以吃杏呢_孕婦可以吃杏嗎-焦點(diǎn)熱文
- t17_關(guān)于t17的介紹
- 紫牛拍咖丨天空的禮物!京杭大運(yùn)河上空粉色晚霞好浪漫
- 全球今頭條!打造標(biāo)桿綠色建筑 臺(tái)泥大陸運(yùn)營(yíng)總部封頂
- 花壇展“新顏”,小河街道“盛裝”迎亞運(yùn)
- 滬深股通|微芯生物8月21日獲外資買(mǎi)入2910.0股
最近更新
- MegEngine 使用小技巧:Profiler使用手冊(cè)
- 開(kāi)國(guó)大典電影免費(fèi)
- 安徽肥西:住房保障工作交出亮眼“期中答卷”
- 西安浐灞生態(tài)區(qū)3.02億掛牌2宗地?不接受聯(lián)合競(jìng)買(mǎi)
- 耀皮玻璃2023年半年度董事會(huì)經(jīng)營(yíng)評(píng)述
- 巴吉度獵犬好養(yǎng)嗎 多少錢(qián)一只
- 廣西來(lái)賓市互聯(lián)網(wǎng)銷(xiāo)售危險(xiǎn)化學(xué)品專(zhuān)項(xiàng)治理取得階段性成效
- 青海省海東市召開(kāi)幫扶個(gè)體工商戶(hù)和私營(yíng)企業(yè)交流座談會(huì)
- 募資兩百億買(mǎi)理財(cái),把股民當(dāng)作提款機(jī)?
- 4個(gè)月女?huà)氡桓呖諕佅碌臒燁^燙傷,物業(yè):正準(zhǔn)備加裝高空攝像頭
- 農(nóng)業(yè)銀行:縣域貸款余額增量創(chuàng)新高
- 從半年報(bào)看消費(fèi)新趨勢(shì)
- 廣州官宣“認(rèn)房不用認(rèn)貸”
- 8月30日漲停復(fù)盤(pán):我樂(lè)家居3連板 人民網(wǎng)漲停
- 確保正常開(kāi)學(xué)安全開(kāi)學(xué)
- 泉州農(nóng)險(xiǎn)“看天賠”
- 中國(guó)援外醫(yī)療隊(duì):妙手仁心傳大愛(ài)
- 五部門(mén)規(guī)范貨幣經(jīng)紀(jì)公司數(shù)據(jù)服務(wù)
- 餃子飄香德國(guó)校園
- 開(kāi)能健康(300272)8月30日主力資金凈賣(mài)出964.13萬(wàn)元
- 山東打造農(nóng)險(xiǎn)“齊魯樣板”
- 單克隆抗體成功預(yù)防移植后器官排斥
- 農(nóng)發(fā)行宜春市分行召開(kāi)紀(jì)檢干部 集中學(xué)習(xí)交流研討會(huì)
- 1億“入淘”,能讓俞敏洪忘了APP嗎?
- 微信表情開(kāi)放平臺(tái)現(xiàn)已支持單個(gè)表情投稿,審核通過(guò)后立即上架
- 存量房貸利率下調(diào)?多家銀行回應(yīng):暫無(wú)正式政策文件
- 美媒評(píng)30隊(duì)休賽期操作:湖人成大贏家獲A 勇士?jī)H獲B 火箭喜提A-
- ?京滬高鐵:上半年凈利潤(rùn)51.36億元
- 包頭市紅十字會(huì)原黨組書(shū)記、常務(wù)副會(huì)長(zhǎng)王鳳蓮被查
- 日央行鷹派成員釋放轉(zhuǎn)向信號(hào) 暗示明年初有可能退出超寬松政策
今日要聞
- 央行馬賤陽(yáng):抓緊制定金融支持民營(yíng)企業(yè)發(fā)展有關(guān)政策 持續(xù)提高民企貸款占比
- 信號(hào)工指揮塔吊教程 信號(hào)工
- RetroNostalgia與首款藍(lán)牙盒式磁帶播放器無(wú)線連接
- 藥康生物:2023年半年度凈利潤(rùn)約7757萬(wàn)元 同比下降4.98%
- 代扣代繳個(gè)人工會(huì)經(jīng)費(fèi)的會(huì)計(jì)處理怎么做?
- 寧德時(shí)代正在向電池版圖外的上游“下狠手”
- 網(wǎng)易游戲暑期進(jìn)行未成年人保護(hù)體系四維升級(jí)
- 洗車(chē)店污水直排引居民不滿(mǎn),怎么辦?聽(tīng)公益訴訟檢察官講辦案故事
- 聯(lián)泰科技發(fā)布工業(yè)級(jí)SLM 金屬打印解決方案Muees 310
- 蒙古國(guó)企業(yè)熱切期待參加第四屆中蒙博覽會(huì)