GPU Mounter - 支持 GPU 熱掛載的 Kubernetes 插件

前言
GPU Mounter 是一個(gè)支持動(dòng)態(tài)調(diào)整運(yùn)行中 Pod 可用 GPU 資源的 Kubernetes 插件,已經(jīng)開源在 GitHub[1]:
支持 Pod 可用 GPU 資源的動(dòng)態(tài)調(diào)整 兼容 Kubernetes 調(diào)度器 無侵入式修改 REST API 接口 一鍵部署

下面聊一聊我對(duì) GPU 容器化和 GPU 掛載的認(rèn)識(shí),以及為什么需要 GPU 熱掛載。
1. GPU 容器化與 GPU 掛載
GPU 掛載很好理解,即為容器或 Pod 掛載 GPU 資源,允許容器中的應(yīng)用程序使用。在容器化的趨勢席卷各個(gè)領(lǐng)域的今天,深度學(xué)習(xí)也同樣無法 “幸免”。各大云服務(wù)提供商,推出了自己的深度學(xué)習(xí)云平臺(tái)(如國內(nèi)阿里 PAI、騰訊 TI-ONE、百度 BML,國外 AWS Sagemaker 等),深度學(xué)習(xí)領(lǐng)域的研究者,也開始傾向于在本地采用 Docker 容器的方式構(gòu)建深度學(xué)習(xí)訓(xùn)練環(huán)境。截止到目前 DockerHub 上 tensorflow 鏡像被超過 10M 次,pytorch 鏡像被拉取超過 1M 次,可見容器化的影響。
談到深度學(xué)習(xí)的容器化,GPU 掛載是一個(gè)繞不開的話題,為此 Docker、Kubernetes、Nvidia 都做出了很多貢獻(xiàn):
Nvidia 貢獻(xiàn)了 nvidia-docker、nvidia-container-runtime、k8s-deivice-plugin 等,支持在 Docker 和 Kubernetes 環(huán)境下使用 Nvidia GPU 資源
Docker 從 19.03 版本開始原生支持
--gpus參數(shù)對(duì)接 nvidia-container-runtimeKubernetes 從 1.8 版本開始提供 Device Plugin 接口,解耦源代碼中對(duì) Nvidia GPU 的原生支持
因?yàn)橛辛松鲜龉ぷ鳎覀冊(cè)?Docker 或 Kubernetes 環(huán)境中想要使用 GPU,只需一個(gè)--gpus參數(shù)或者一個(gè)nvidia.com/gpu資源字段即可完成 GPU 資源的掛載。
2. 當(dāng)前 GPU 掛載方案的不足
當(dāng)前的 GPU 容器化的方案仍然存在一點(diǎn)不足,無法動(dòng)態(tài)調(diào)整一個(gè)已經(jīng)正在運(yùn)行的容器或 Pod 可用的 GPU 資源。即我們必須在啟動(dòng)容器時(shí)就一次設(shè)定好容器可用的 GPU 資源,如果容器已經(jīng)啟動(dòng)而我們又想要調(diào)整其 GPU 資源,只能先關(guān)掉這個(gè)容器,重新設(shè)定后再啟動(dòng)。
也許正處于這一限制,當(dāng)前各大深度學(xué)習(xí)云平臺(tái)均無法支持調(diào)整一個(gè)運(yùn)行中實(shí)例的 GPU 資源的特性。
關(guān)于 Docker 和 Kubernetes 為什么沒有解決這一問題,我的理解是容器或 Pod 通常被認(rèn)為應(yīng)該是無狀態(tài)的(Stateless),應(yīng)該維持其不變性(Immutability),即容器啟動(dòng)后就不應(yīng)該更改其配置,如果有需要,應(yīng)該基于一個(gè)滿足要求的鏡像重新開啟新的容器。從容器的通用應(yīng)用場景來看,這種觀點(diǎn)是沒有問題的,但是在深度學(xué)習(xí)平臺(tái)場景下,這一點(diǎn)我認(rèn)為值得商榷,深度學(xué)習(xí)應(yīng)用的依賴通常比較復(fù)雜,難以構(gòu)建標(biāo)準(zhǔn)統(tǒng)一的 “萬能” 鏡像即插即用。而出于安全的原因,平臺(tái)一般只允許用戶使用平臺(tái)提供的通用鏡像,因此用戶不得不破壞不變性,在運(yùn)行中的容器里安裝各種復(fù)雜依賴,因此深度學(xué)習(xí)平臺(tái)的容器應(yīng)該被認(rèn)為是有狀態(tài)的。
3. 什么是 / 為什么需要 GPU 熱掛載?
GPU 熱掛載即調(diào)整一個(gè)運(yùn)行中容器的 GPU 資源,能夠增加或刪除一個(gè)運(yùn)行中的容器可用的 GPU 資源而無需暫停或重啟容器。
GPU 熱掛載這個(gè)場景在深度學(xué)習(xí)云平臺(tái)上其實(shí)很常見,我們來考慮下用戶使用深度學(xué)習(xí)云平臺(tái)的基本流程。
用戶啟動(dòng)一個(gè)實(shí)例后實(shí)際上還需要基于平臺(tái)提供的基礎(chǔ)鏡像環(huán)境再去下載導(dǎo)入數(shù)據(jù)集和安裝其他復(fù)雜的依賴庫,這一過程數(shù)據(jù)集規(guī)模較大或代碼依賴在較為復(fù)雜時(shí)可能需要耗費(fèi)較長時(shí)間,然而由于無法在環(huán)境準(zhǔn)備完成后再掛載 GPU 資源,用戶不得不在一開始啟動(dòng)實(shí)例時(shí)就申請(qǐng)所需 GPU 資源。在上述準(zhǔn)備環(huán)境的過程中 GPU 實(shí)際上處于閑置狀態(tài),對(duì)用戶來說需要承受昂貴的 GPU 費(fèi)用,對(duì)平臺(tái)而言降低了整個(gè)平臺(tái)的資源利用率。

而如果有了 GPU 熱掛載的特性,我們就可以將上述流程優(yōu)化成下圖:

顯而易見 GPU 的閑置時(shí)間可以大大減少。
4. GPU Mounter - 支持 GPU 熱掛載的 Kubernetes 插件
出于上面的原因,我開源了一個(gè) Kubernetes 插件支持 GPU 資源的熱掛載。
利用 GPU 熱掛載這一特性我們就可以將上述的流程優(yōu)化成如下:
具體部署與使用詳見 GitHub 倉庫[2]的 README。
如果覺得有價(jià)值希望能點(diǎn)一個(gè) star 讓更多人看到,也歡迎提 Issue 和 PR 幫助我更好的改進(jìn)這個(gè)項(xiàng)目。
參考資料
GitHub: https://link.zhihu.com/?target=https%3A//github.com/pokerfaceSad/GPUMounter
[2]GitHub 倉庫: https://link.zhihu.com/?target=https%3A//github.com/pokerfaceSad/GPUMounter
原文鏈接:https://zhuanlan.zhihu.com/p/338251170


你可能還喜歡
點(diǎn)擊下方圖片即可閱讀

云原生是一種信仰 ??
關(guān)注公眾號(hào)
后臺(tái)回復(fù)?k8s?獲取史上最方便快捷的 Kubernetes 高可用部署工具,只需一條命令,連 ssh 都不需要!


點(diǎn)擊 "閱讀原文" 獲取更好的閱讀體驗(yàn)!
發(fā)現(xiàn)朋友圈變“安靜”了嗎?


