無人駕駛場景下 Kubeflow 的應用與開發 Momenta Pape
講師:薛磊 / Momenta 資深研發工程師編輯:小君君
在實際的機器學習生命週期中,訓練模型只是很小一部分。如何準備模型?模型訓練好了如何部署?如何上雲?這些都是隨之而來的挑戰。本文圍繞深度學習講述 Momenta 如何利用 Kubeflow 實現無人駕駛的開發。
今天將介紹以下三部分內容:
- 第一:Kubeflow 的應用;
- 第二:基於 Kubeflow 的開發;
- 第三:Momenta 深度學習資料流。

Kubeflow 的應用
為什麼要用 Kubeflow?
在一些 GPU 叢集較小的機構(例如實驗室、科研機構等)中,他們一般只有幾臺多卡 GPU。實驗人員可能會將一臺機器或兩臺機器用於安裝各種環境以及 GPU 的驅動,同時使用 Caffe 或 TensorFlow 等工具做模型訓練。這種場景較為簡單,但會帶來一個問題,即人員需要花大量精力管理這幾臺機器的環境。
為了解決這個問題,降低使用者的部署成本,技術人員可以引入容器技術,用 nvidia-docker 允許容器使用 GPU,將 TensorFlow、PyTorch 以及 Caffe 封裝到 Docker 映象中,用 nvidia-docker 在物理機上面執行訓練任務。
但是以上只是小規模 GPU 叢集中的解決方法,一旦叢集規模擴大,實驗人員就不得不需要解決這些問題:如何合理地分配 GPU 資源?如果讓每位使用者直接在每臺機器上獲取資源?技術人員如何進行資源管理、環境維護?2017 年年底發行的 Kubeflow 很好地解決了這些難題,它將訓練任務裝到容器中,利用 Kubernetes 對 CPU、GPU 等資源進行充分管理。
什麼是 Kubeflow?
Kubeflow 可以看作是 Kubernetes + TensorFlow 的成果。它是一個基於 Kubernetes 的機器學習工具專案,支援眾多訓練框架,包括 TensorFlow、PyTorch、Caffe2、MxNet 等。
Kubeflow 社群在半年多的時間內收集了 4000 多個 stars,發展非常迅速。同時,眾多國內公司也助力了 Kubeflow 的發展,貢獻了很多專案。例如才雲貢獻的 tf - operator 專案,Momenta 貢獻的 caffe2 - operator 專案。新浪、京東和拼多多也在嘗試使用 Kubeflow 解決問題。
在 Kubernetes 裡部署 Kubeflow 的方法有很多,常規方法是用 ksonnet 或單獨用 kubectl 手動部署各個 Operator 以及相應的服務。個人使用者也可以很方便地體驗用 Kubeflow 輕鬆部署一套用於訓練模型的環境。
# CNN_JOB_NAME=mycnnjob# VERSION=v0.2-branch# ks registry add kubeflow-git github.com/kubeflow/kubeflow/tree/${VERSION}/kubeflow# ks pkg install kubeflow-git/examples# ks generate tf-job-simple ${CNN_JOB_NAME} --name=${CNN_JOB_NAME}# ks apply ${KF_ENV} -c ${CNN_JOB_NAME}
以上是直接從 Kubeflow 官網上獲取的一個示例。以往在部署環境時,實驗人員需要預裝很多東西用於模型訓練,但如果使用 Kubeflow,他們就可以很簡單地跑一個已知數、已知模型。如果在其中加入一些引數,程式就可以跑整個 Kubeflow 的任務(僅以 TensorFlow 為例)。
# arena submit tf --name=tf-git --gpus=1 --image=tensorflow/tensorflow:1.5.0-devel-gpu \ --syncMode=git --syncSource=https://github.com/cheyang/tensorflow-sample-code.git \ --env=GIT_SYNC_USERNAME=yourname --env=GIT_SYNC_PASSWORD=yourpwd \ "python code/tensorflow-sample-code/tfjob/docker/mnist/main.py”# arena listNAME STATUS TRAINER AGE NODEtf-git RUNNING tfjob 0s 192.168.1.120
在這個例項中,arena 是另外一套基於 Kubeflow 的封裝,相當於簡化版本的命令列。arena 能幫助演算法研發人員減少對 kubectl 的使用,通過命令列指定各種演算法引數以及要執行的指令碼,直接執行 arena submit 來提交訓練任務。
基於 Kubeflow 的開發
為了滿足不同場景需求,目前 Kubeflow 已經擁有許多解決方案,但它們大多比較簡單。如果訓練資料集較大,需求較複雜,開發任務將會涉及很多塊 GPU 的使用(例如用 128 塊 GPU 訓練很多天)。
接下來,我們嘗試搭設一個深度學習實驗平臺。這裡需要注意的是,我們定義的是 “實驗平臺”,因為 Momenta 的演算法研究人員在調參、看論文時需要測試各種各樣的網路。對他們而言,深度學習實驗平臺非常重要,而且要滿足多種需求。
- 第一:實驗平臺需要多機多卡排程。比如研發人員有排程 128 塊卡的需求,如果卡不足,就需要等待排程;
- 第二:多租戶。在多使用者的環境下共用相同的系統或程式元件,且仍可確保各使用者間資料的隔離性;
- 第三:多訓練框架支援。比如 Caffe、TensorFlow、PyTorch 等;其他的還有日誌收集、監控資訊收集(如 GPU 的使用率)等。
考慮到以上需求,我們設計了一個訓練平臺架構,如上圖所示。我們在 Kubernetes 前面加了一個帶狀態的 apigateway,它包含使用者資訊、狀態管理、後期審計等功能。架構還包括 caffe2 - operator、mpi - operator 和 TensorFlow 的 Operator,主要是為了能夠統一管理訓練任務的生命週期。此外,該架構還支援運用 kube - batch 實現多機多卡的排程期。圖中的假設比較簡單,每個 Pod 都是一個單獨的機器。
如何實現多臺機器間的通訊也是框架的重點。該設計分為兩套環境:
- 線下的環境使用 Infiniband,藉助高速的 RDMA 網路就能很好地解決延遲問題,並提供非常高的頻寬;
- 線上的環境使用 25Gb/s 的乙太網,其相對於 Infiniband 延遲過高,所以在多機通訊的過程中,需要包一個聚合再下發,才能解決延遲問題。
底層的資料儲存也需要使用分散式資料儲存以及影象快取,基於 Momenta 的資料的特徵(不需要對圖片進行修改),使用者可以在客戶端加上一些快取。比如在客戶端安裝高速 SSD,使用開源的 fscache 把資料快取到 SSD 上,保證整個訓練過程中資料的高速傳輸。用相對比較便宜的 SSD 確保昂貴的 GPU 的充分使用,這是 Momenta 整套訓練平臺的架構的最大優勢之一。
對具有一定操作經驗的使用者而言,他們更喜歡以命令列的方式操作,習慣用 HPC 領域的 slurm 作為操作工具。為了相容 slurm 的命令列,Momenta 形成了一套類似 slurm 管理命令列的操作方式。同時,平臺也提供 Web 端的操作方式。
上圖是一個任務提交的案例,包括以下幾點:
- 定義了幾個節點;
- 每個節點需要幾個 GPU;
- 基於哪些的框架(如 TensorFlow、PyTorch 及 Caffe2 等);
- 當前的工作任務。
我們之所以做出這樣的設計,一個原因是為了相容舊的使用習慣,讓老使用者能夠無縫遷移。另一個原因是重新設計一套互動方式的時間成本太高,基礎架構開發人員需要花很長時間才能瞭解平臺使用者在進行深度學習研發的操作行為和操作意圖。
Momenta 深度學習資料流
在實現自動駕駛的過程中,深度學習演算法在訓練模型時需要大量影象資料作為支撐。Momenta 平臺可以處理自動駕駛領域的資料流。
資料篩選
上圖是車輛識別的(電動車)的一個典型。目前,Momenta 在電動車識別上準確率較高。在人工智慧資料流中,資料篩選有以下作用:
- 降低成本:無需重複標註即可識別素材,降低標註成本。
- 提高模型訓練效率:去除無效素材,提取包含識別目標的素材,提高訓練效率;
- 提高模型訓練邊際效用:通過對極端情況(corner case)的資料進行鍼對性訓練,有效地提高模型效能。
資料標註
經過一輪篩選後,部分圖片會需要人工標註。Momenta 開發的線上遠端眾包資料標註系統允許視覺化操作,即便不懂程式碼的眾包人員也能遠端完成各類標註任務。資料標註的作用主要是提供更多帶標註的影象資料,提供包含更多識別目標的素材,最終提高模型訓練精度。
模型訓練
上圖是模型訓練的流程圖:
- 資料匯入:支援多種資料型別,支援多批次資料合併,支援多種組合規則;
- 模型訓練:多機多卡併發訓練,共享式叢集、支援多人多工同時進行,支援多種主流訓練框架,所有任務由 Kubernetes 自動排程完成;
- 模型驗證:訓練所得模型自動在驗證集上進行驗證,通過驗證的模型將進入模型倉庫供後續流程使用;
- 與傳統方式相比,Momenta 採用的共享叢集排程讓使用者(內部的演算法研發人員)可以編寫任務描述和訓練指令碼,而管理員通過網頁介面進行叢集管理和工作排程。極大地節省人工成本,提高資源利用率,實現集中性管理,提高安全性。
結語
Kubeflow 基於 Kubernetes 和 TensorFlow ,提供了一個數據科學工具箱和部署平臺。它具有很多優點,如 DevOps 和 CICD 的支援、多核心支援等。但它的缺點也很明顯,就是元件較多,協調較差。
如何利用 Kubeflow 更好地做二次開發?這是當下的一個熱點問題,也是 Momenta 致力於解決的一大問題,是我們圍繞不同級別自動駕駛方案和一級供應商展開合作時首先要解決的一個必要問題。為了見證自動駕駛汽車的落地,為了共同打造更好的人工智慧自動駕駛產品,歡迎有想法的小夥伴與我共同探討基於 Kubeflow 的深度學習。
講師
薛磊 / Momenta 資深研發工程師