關(guān)于在昇騰眾智項(xiàng)目中提交了5個(gè)模型這件事
關(guān)于在昇騰眾智項(xiàng)目中提交了5個(gè)模型這件事
我負(fù)責(zé)了學(xué)校華為模型遷移的對(duì)接工作,自己也參與其中。項(xiàng)目周期中總共完成了5個(gè)模型的遷移。其中MindSpore模型一個(gè),Tensorflow模型四個(gè)。想通過(guò)這篇博客分享一下模型開(kāi)發(fā)過(guò)程,一起其中遇到的一些問(wèn)題,希望可以和開(kāi)發(fā)者們共同進(jìn)步。
1.所用到的工具
昇騰全棧AI軟硬件平臺(tái)產(chǎn)品非常完善,這次我參與的眾籌項(xiàng)目是把給定的幾個(gè)模型在昇騰環(huán)境上跑通訓(xùn)練腳本,精度達(dá)標(biāo)后跑通離線推理。我主要涉及ModelArts平臺(tái)、ModelZoo倉(cāng)庫(kù)、MindSpore和Tensorflow軟件框架三個(gè)產(chǎn)品的使用。
2.遷移的步驟
首先是本地跑通模型的代碼,跑通本之后,由于目前昇騰環(huán)境只對(duì)Tensorflow1.15做了適配,所以我們要在本地先把訓(xùn)練腳本遷移到1.15的版本。
本地跑通之后,需要使用ModelArts來(lái)跑代碼,ModelArts可以提供裝有CANN和Ascend NPU硬件的訓(xùn)練環(huán)境。我當(dāng)時(shí)使用的是Pycharm ToolKit工具,可以很方便的調(diào)試Python代碼,一鍵就能上傳代碼、數(shù)據(jù)集,然后拉起訓(xùn)練任務(wù)。
當(dāng)你在ModelArts跑通了之后,說(shuō)明你本地的1.15版本移植是正確的,這時(shí)候需要按照模型遷移手冊(cè),指定模型創(chuàng)建的Session下沉到NPU去運(yùn)行。
調(diào)參、調(diào)參、調(diào)參。
精度達(dá)標(biāo)后,又要讀離線推理的文檔。主要工作是將模型的ckpt轉(zhuǎn)換成pb,然后使用CANN提供的ATC命令將pb轉(zhuǎn)換成om,最后使用離線推理工具msame運(yùn)行om文件。
3. 一些經(jīng)驗(yàn)
3.1keras的遷移和轉(zhuǎn)pb并不比session麻煩
遷移首先需要解決Tensorflow的版本問(wèn)題,之后就是把Session下沉到NPU。按照遷移手冊(cè)也就是幾行代碼的事情,根據(jù)Tensorflow寫(xiě)法,遷移最長(zhǎng)見(jiàn)的是以下兩類(lèi):
session.run(config=config)
keras.backend
第一類(lèi)是最簡(jiǎn)單的情況,只需要構(gòu)造NPU Session Config,然后傳進(jìn)去即可。keras也只需要通過(guò)backend設(shè)置 NPU Session Config??蚣艿谋举|(zhì)就是session,所以基于keras的模型,NPU Session Config也是使用backend.set_session()方法遷移的。只要通過(guò)keras.backend.get_session()方法獲取到session,那么后續(xù)轉(zhuǎn)ckpt、轉(zhuǎn)pb、轉(zhuǎn)om的步驟都是一樣的。沒(méi)有像文檔中所說(shuō)的,對(duì)keras的支持那么不友好。
3.2 對(duì)數(shù)據(jù)和模型有充分理解再開(kāi)始工作
在做模型的過(guò)程中,最經(jīng)典的就是動(dòng)態(tài)shape問(wèn)題。由于TF支持程度一開(kāi)始對(duì)NPU支持不太友好,我們需要規(guī)避動(dòng)態(tài)shape問(wèn)題,很多小伙伴看到報(bào)錯(cuò)就大失所望,其實(shí)只要靜下來(lái)讀一讀代碼,知道了輸入數(shù)據(jù)的形狀,網(wǎng)絡(luò)的結(jié)構(gòu)大致是怎么樣的,就很好解決動(dòng)態(tài)shape問(wèn)題。只需要把shape的第一維度None設(shè)置成給定的batch size,就可以解決大部分問(wèn)題了。
3.3 離線推理中的模型轉(zhuǎn)換
模型轉(zhuǎn)換的一般步驟就是先把ckpt轉(zhuǎn)換為pb再轉(zhuǎn)換為om。這個(gè)過(guò)程中,需要你對(duì)模型的輸入數(shù)據(jù)、輸出數(shù)據(jù)的形狀有特別清晰的認(rèn)識(shí)。不然你在使用ATC命令,閱讀msame工具文檔的時(shí)候,會(huì)有很多名詞對(duì)不上。輸入數(shù)據(jù)的形狀固定了,那么網(wǎng)絡(luò)中各個(gè)階段的輸入也就固定了。在完成模型遷移的時(shí)候,一定要慢慢來(lái),把模型和數(shù)據(jù)研究透徹,再開(kāi)始做。
3.4 離線推理中的數(shù)據(jù)格式
由于msame工具僅支持使用bin文件的形式進(jìn)行推理,數(shù)據(jù)處理一般都是python中用一個(gè)迭代器取數(shù)據(jù)。我認(rèn)為最好用的方式是使用numpy的tofile()方法,指定文件名為bin即可。但是我在實(shí)踐中發(fā)現(xiàn),有很多om精度不達(dá)標(biāo)的問(wèn)題,都出在tofile()導(dǎo)出的時(shí)候,沒(méi)有給定數(shù)據(jù)格式。如果數(shù)據(jù)精度和tofile()默認(rèn)保存的精度不一樣,那么喂給om之后得到的結(jié)果肯定也是錯(cuò)的。在tofile()的方法中就要指定好數(shù)據(jù)精度,在pb轉(zhuǎn)om的過(guò)程中,要保證輸入數(shù)據(jù)的精度和tofile()時(shí)的精度一致。
4. 總結(jié)和收獲
要增強(qiáng)對(duì)問(wèn)題的描述能力,Issue寫(xiě)的好,才能和研發(fā)工程師們高效交流?;仡櫤芏郔ssue,如果某個(gè)問(wèn)題換個(gè)說(shuō)法,可以更快解決
工欲善其事必先利其器,寫(xiě)代碼不要著急動(dòng)手,要讀完相關(guān)文檔再行動(dòng)
5. 比較重要的文檔:
Wiki上比較重要的教程
[簡(jiǎn)歷個(gè)人分支&提交代碼]([https://gitee.com/ascend/modelzoo/wikis/002 建立個(gè)人分支&提交PR?sort_id=3282131](https://gitee.com/ascend/modelzoo/wikis/002 建立個(gè)人分支&提交PR?sort_id=3282131))
如何規(guī)避動(dòng)態(tài)shape
離線推理案例分享
官方文檔:
ATC命令文檔
基于Session.run的遷移
基于Keras的遷移
AI 代碼遷移 昇騰
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。