大數據

《AI開發者的docker實踐》之docker&大賽

一、docker 大賽技巧

本地調試可以切一部分訓練集做測試集通過docker -v /drta_dir:/tcdata 模擬線上環境進行測試,一般本地成功運行線上都能通過。線上運行與本地運行的區別點:

1.本地有網絡,線上無網絡

2.本地內存大小、存儲大小、顯存大小如果大於線上配置,則需要注意資源使用不要超過線上配置

如docker 本地測試運行時可通過-m參數限制內存使用大小

docker run -m 1024 registry.cn-shanghai.aliyuncs.com/xxxx/test:0.1 sh run.sh

3.線下驅動版本高於線上nvidia驅動版本,可能對應的cuda在線上不能支持

可參見Nvidia官網的驅動版本與cuda的對照表

4.遇到異常情況自己要完整跟一遍狀態變化,關注是在那個環節出現問題,向官方求助時需說明狀態變化及錯誤信息,並附帶該次提交的日誌鏈接,如果還在運行的,可提供歷史日誌鏈接。日誌鏈接非常重要,用於快速查詢你的隊伍信息。

二、天池大賽下限制條件/注意事項/常見問題集

1.運行時間/效率:

概念解釋:

costtime:(單位ms)與選手運行時間無關,無需關注,這個時間是系統讀取選手預測結果並計算成績耗費的時間。

運行時間計算方式為(選手鏡像運行結束變為terminal時刻)-(選手鏡像變為running時刻)-(系統評測佔用時間costtime)

2.超時時間:

超時時間分為三個維度,一般大賽僅涉及兩個維度(嚴重超時:從鏡像提交到選手代碼運行結束過程中時間超過官方規定的超時時間+30min到60min,視為程序嚴重超時/程序死機,此時會啟動資源回收機制強制kill選手進程; 超時:從選手代碼開始運行到結束運行時間超過官方規定的超時時間,則視為選手程序效率不符合賽題要求,成績會被置為無效,運行時間超過“超時時間”但未超過“嚴重超時時間”會正常運行結束並可在日誌頁看到成績,以供調整參考);第三個超時維度為細粒度的infer效率控制,對於工業等流水線業務對實時性要求高的賽題可能會設置“單次infer”超時時間,測試數據以流的形式依此餵給選手模型,模型“從收到單例數據到infer返回結果”時間需滿足官方規定,超時則成績無效。

3.日誌異常

a.cant connect tianchi.aliyun.com (已知偶現bug跟隨某臺ecs存在,此時由於網絡不可達且未代碼運行,並不會扣除提交次數,可直接再次提交,並告知官方出現的問題及對應日誌鏈接)

4.長時間init

init一般為初始化狀態,如果剛提交後出現init為正常現象,有時init很快變為watiing有時則需很久(不超過30min),這是因為機器庫存在根據大家提交量動態變化,提交量突增時機器庫存不足則會觸發自動購買添加動作,該動作可能會耗費較長時間 但不會超過30分鐘,如果超過30分鐘則不正常。

5.長時間creating

如果狀態一直停留在creating,且展開狀態欄的reason 顯示imgbackoff,此時證明你的鏡像在拉取時出現錯誤,可能鏡像鏈接有誤或者賬號密碼不對。

這裡需要注意,每次修改鏡像鏈接,包括僅修改版本號,都需要重新填寫賬號密碼

6.代碼規範

為了方便代碼審核,除特殊說明的大賽外,養成如下格式習慣:

/workspace #存放選手代碼的目錄,需要在dockerfile中設置此目錄為WORKDIR(官方鏡像會逐漸整改,全部默認設置為/workspace )。此目錄下需包含且僅包含大賽的完整代碼

7.代碼審核

代碼審核沒有特殊說明的大賽默認取的是(規定時間內)排行榜最優成績那次提交對應的備份鏡像進行審核。如果最優成績對應鏡像不符合審核要求(如不包含官方要求的完整代碼)則會直接淘汰。如果出現前期僅提交預測代碼得到的最優成績在最後幾天提交完整代碼時無法復現出來,可以在官方群聯繫賽題組取消無法復現的最優成績。

8.遇見問題如何提問?

遇到問題,不要僅描述問題,同時需附帶日誌鏈接和大賽名稱。組委會優先處理信息完整的提問。

9.設置賬號密碼時提示驗證通過,並非賬號密碼正確。

鏡像倉庫服務和提交運行服務(tcc)是獨立的兩套系統,此時驗證的僅僅是鏡像鏈接格式無誤,不會驗證賬號密碼。

10.運行過程中主動結束

遇到想要主動結束運行的情況時可通過直接覆蓋提交實現運行新的提交,或提交一個錯誤鏈接終止掉正在運行的程序。

11.提交次數計數邏輯

提交次數的扣除僅以“狀態進入running”為唯一標準,如果鏡像提交錯誤或還未變成running就覆蓋提交都不會扣除提交次數。

12.實時日誌

有些訓練/預測時間特別久的比賽,如淘寶直播大賽視頻類型競賽,查看實時日誌對選手而言非常重要,所以運行時間較長的比賽會開放實時日誌,用於及早發現問題。通過點擊實時日誌框右上角刷新按鈕更新最新日誌(實時日誌有大小限制,如果打印過多內容,歷史日誌會被實時截斷,優先顯示最新日誌)

三、其他技巧

docker共享主機屏幕,實現可視化

算法同學不同於應用開發,經常在本地調試過程中需要可視化一些內容,如plot或者查看數據集裡的一張圖片等,而docker自身並不支持這些能力,但是你可以把本機的屏幕掛給容器(/tmp/.X11-unix),這樣在容器內執行plot時,畫面會在本機桌面上直接顯示,sample:(需要注意,如果你不是在本地運行,宿主機並沒有屏幕可以共享給容器,此時想要可視化會比較麻煩,可通過ai-hub包綁定微信進行顯示,詳見https://github.com/gaoxiaos/AI_HUB

docker run --gpus all -it -v /tmp/.X11-unix:/tmp/.X11-unix registry.cn-shanghai.aliyuncs.com/tcc-public/super-mario-ppo:localdisplay  /bin/bash
docker容器後臺運行

一些提供服務類的鏡像,一般需要放在後臺一直運行。或者在本地運行長時間任務(訓練模型)的鏡像,希望運行結束容器不銷燬。

docker提供了-d選項 保持容器在後臺

docker run -d xserver:latest
兩個docker容器綁定通信(一般用與分離的服務端和客戶端)

當你有時需要一個固定的服務時,不妨把服務端單獨拎出來作為後臺容器一直存在,專注開發客戶端代碼,每次運行時通過(--link)綁定服務端容器,sample:

docker run -itd --link display:xserver client:latest /bin/bash
容器中文件讀寫權限問題

由於docker鏡像一般都精簡掉了非必要模塊,所以不支持sudo權限,那麼遇到目錄寫權限報錯時該怎麼做呢

1.一般工作目錄下都是讀寫全開的,最簡單就是寫在有權限的目錄

2.一定要寫在該目錄,可在dockerfile中  chmod對應權限 777是最高權限,你可以相應調整

RUN chmod 777 /your_dir

3.同理,不想在dockerfile中執行的話 ,直接修改基礎鏡像在基礎鏡像中對指定目錄執行chmod後作為新的基礎鏡像也可。

海外同學上傳鏡像慢的建議方案

由於大賽的計算節點一般都在中國的上海或深圳,所以當鏡像較大時海外選手上傳鏡像到國內會非常慢,儘管有些大賽開通了海外專線,但是速度還是比較受限。

因此建議海外同學可以使用阿里雲鏡像服務(ACR)的自動構建(鏡像)功能,步驟如下:

a.使用github等託管自己的代碼(推薦code.aliyun.com)

b.在acr(阿里雲容器服務)產品頁做代碼源綁定,並開啟自動構建

image.png

c.構建完成設置hook自動提交(警惕次數消耗),或者謹慎起見構建完成後手動提交。

觸發器設置方法:https://help.aliyun.com/document_detail/60949.html?spm=5176.8351553.0.dexternal.7f231991sUvASL

容器中使用plot 可視化圖表,或者可視化數據集中的圖片等數據

由於容器無顯示設備,因此需要綁定宿主機的顯示設備用來可視化,Linux下可通過3.1節其他技巧的共享宿主機屏幕實現:

docker run -it -v /tmp/.X11-unix:/tmp/.X11-unix registry.cn-shanghai.aliyuncs.com/tcc-public/super-mario-ppo:localdisplay  /bin/bash

如果宿主機也沒有顯示設備,則需考慮把圖片等保存下來傳送到本地查看,這個流程比較複雜,這裡推薦大家使用ai-hub的plot函數或命令行,直接會把圖像發送至綁定的微信賬號查看,詳情查看(公共號能力尚未開通,可先關注,後續在公眾號通知)https://github.com/gaoxiaos/AI_HUB

容器中做耗時任務(如訓練模型)消息觸達(通知)

消息觸達模塊可使用AI-HUB中的Notice模塊,目前公眾號尚未開通消息能力,可先關注公眾號,後續更新會在公眾號中通知。

https://github.com/gaoxiaos/AI_HUB

四、常見問題

1.天池大賽出現長時間waiting,展開狀態欄reason顯示imagebackoff

imgbackoff一般是因為賬號名密碼或鏈接錯誤導致拉去鏡像失敗出現的錯誤。請重新填寫鏈接、賬號密碼提交,此時不會扣提交次數。

tips:填寫賬號密碼時,點確認按鈕時提交驗證通過,僅僅是驗證url的合法性,並未進行賬號密碼驗證,所以驗證通過不代表賬號密碼正確。

2.本地出現一些鏡像

鏡像出現的原因是舊的鏡像名被新的佔用,導致舊的鏡像變成了,比如你build新的鏡像時指定了就鏡像相同的鏡像名:版本號

刪除鏡像可使用:

docker image prune

3.天池大賽日誌為空,僅提示網絡錯誤

此時可能遇到了bad節點,雖然機率較小,但是k8s社區仍然會有類似bug,遇到時可重新提交即可,此時不會扣除提交次數。

4.鏡像沒有讀寫權限怎麼辦

點擊下方課程鏈接即可直達鏡像沒有讀寫權限怎麼辦視頻教程。

https://tianchi.aliyun.com/course/351/4130

Leave a Reply

Your email address will not be published. Required fields are marked *