- 產品
- 產品解決方案
- 行業解決方案
- 案例
- 數據資產入表
- 賦能中心
- 伙伴
- 關于
時間:2022-02-17來源:帥炸了瀏覽數:256次
? ? ? ?導讀:作為一家高度重視人工智能的公司,字節跳動內部構建了一套豐富的產品矩陣,涵蓋數據處理、模型開發、離線訓練到在線推理等機器學習研發的全流程,以支持抖音、頭條等產品的高速發展。億級的用戶規模和不斷深研的業務場景,對字節機器學習平臺從研發體驗、訓練時效、任務編排、資源運維等方面不斷提出新的要求挑戰,以?K8s?為核心的云原生理念正是為解決以上問題提出,并在業界取得了廣泛應用。本文主要對字節跳動機器學習平臺的云原生化的改造工作進行介紹,期望可以帶給讀者一些實踐經驗。
? ? ? ?今天的介紹主要圍繞以下三點展開:
? ? ? ?機器學習系統云原生化動機
? ? ? ?機器學習系統云原生化落地
? ? ? ?未來展望
? ? ? ?首先和大家簡單分享下字節內部機器學習訓練場景訓練框架特點,及在實際生產環境中遇到的問題痛點。

? ? ? ?抖音、西瓜、火山、頭條等作為字節的核心C端產品,推廣搜在其中扮演著極其重要的角色。Deep-Wide 是其主流訓練模型,億級別用戶規模和 item(視頻、商品)特征表決定了它必須是采用 PS-Worker 的訓練框架。PS-Worker 框架包含兩種角色:
? ? ? ?PS(ParameterServer): 主要存放模型參數,擴展能力相對比較弱,單個異常會導致整個任務的失敗,木桶效應強烈,網絡帶寬大;
? ? ? ?Worker: 迭代計算模型參數梯度并返回給PS,單個異常不影響任務,可以彈性伸縮,慢 worker 的梯度會被丟棄。
? ? ? ?PS-Worker 框架特點,在工程實踐時要求:
? ? ? ?PS 必須保證是一個高優資源,保障其穩定性,避免受干擾;
? ? ? ?PS 資源盡量保持同質化,例如相同的機型(CPU型號);
? ? ? ?PS 和 Worker 必須考慮網絡拓撲的親和性。

? ? ? ?字節的產品多以視頻和文字的形式展現,CV、NLP 等通用的深度學習技術同樣有著廣泛應用,這類的場景模型參數能夠單機塞滿,因此使用 Ring AllReduce 框架。AllReduce 框架沒有中心式的節點,只有 Worker 一種角色,有以下特點:
? ? ? ?Worker 存儲完整模型,具備故障容忍和彈性能力;
? ? ? ?Worker 木桶效應強烈,算力要求高,網絡帶寬需求大。
? ? ? ?因此在工程實踐上面臨以下挑戰:
? ? ? ?Worker 資源必須同質化(相同GPU);
? ? ? ?Worker 必須考慮網絡拓撲的親和性;
? ? ? ?Worker 故障/擴縮需要讓相關 Worker 感知和更新通訊拓撲;
? ? ? ?對彈性資源的支持需要業務、框架、編排調度相互協調。
? ? ? ?受一些歷史技術因素影響,字節的 AI 離線場景基本全部構建在 Yarn 生態上,在線微服務和推理則運行在 K8s 生態上,在離線場景技術體系比較割裂。一方面,平臺技術的割裂對用戶研發體驗不佳,同時也不利于機器學習研發流程 DevOps/ AIOps 的演進。另一方面,在離線資源池的隔離阻礙了資源的高效流轉,不利于資源利用率的提升。
? ? ? ?另一方面,字節復雜多樣的業務場景和高速變化的業務需求,對當前的機器學習系統在深度定制、產品多樣上也不斷提出新的要求。
? ? ? ?基于以上業務場景和問題需求,字節開啟了機器學習系統的云原生化改造工作。
? ? ? ?那么什么是云原生,云原生為什么可以解決、怎么解決以上問題呢?先從云原生的概念講起。
? ? ? ?① 云原生CNCF定義
? ? ? ?概念:在公有云、私有云和混合云等新型動態環境中,構建和運行可彈性擴展的應用。
? ? ? ?技術:包括 Kubernetes、容器、服務網格、微服務、不可變基礎設施和聲明式 API。

? ? ? ?上圖是 CNCF 官網上云原生產品的全景圖,可以看到它的生態其實是非常豐富的。
? ? ? ?② 云原生操作系統 Kubernetes
? ? ? ?在云原生領域,Kubernetes 作為云原生操作系統,是最核心的組件之一,它有著以下幾個特點:
? ? ? ?強大的抽象能力
? ? ? ?良好的擴展和分布式特性
? ? ? ?高度統一的規范標準

? ? ? ?K8s 整體架構如上圖所示,包括 Master 和 Kubelet 兩大部分:
? ? ? ?Master 包括 ETCD、API server、scheduler 和 controller manager。
? ? ? ?ETCD 是 KV 數據庫存儲,存儲 K8s 中的所有的資源對象。
? ? ? ?API server 在 ETCD 的基礎上封裝了一層緩存,提供了 restful api 支持,是集群所有對象增刪改查的唯一入口。
? ? ? ?Scheduler 是資源調度中心,用于將工作負載分發到物理節點上。
? ? ? ?Controller Manager 是對象控制中心,驅動 K8s 內置對象,直到滿足用戶指定的終態,它是實現 K8s 聲明式語義的一個重要組件。
? ? ? ?Kubelet 是單機 agent,負責單機節點上容器生命周期的管理和物理資源的管控上報。
? ? ? ?K8s 在以上架構實現之上提供了豐富的可擴展機制:
? ? ? ?Scheduler 調度策略可以以 plugin 的方式進行擴展。
? ? ? ?Opertor 提供了業務依據業務場景定制 controller 的能力。比如定義一個簡單的 job crd 并按照規范實現對應的 job controller ,在用戶聲明需要一個需要2個 worker 的 job cr 后,job controller 會直接創建2個 worker 。
? ? ? ?CRI/CNI/CSI 分別定義了容器運行時、容器網絡、容器存儲的擴展標準。
? ? ? ?DevicePlugin 機制可以很方便的擴展系統硬件資源,像使用 CPU、Mem 一樣進行資源的上報、調度和分配,常見的 devicepluin 有 GPU、RDMA 、高性能NIC 等。
? ? ? ?標準化的擴展能力讓 K8s 不止非常友好的支持了微服務,同時在大數據和機器學習領域也愈加流行,像開源的 Kubeflow 就在 K8s 之上構建了機器學習場景的完整工具集。字節機器學習系統的云原化工作同樣是圍繞 K8s 生態進行開展。

? ? ? ?上圖是字節機器學習系統的整體概覽圖,自上而下來看,包括以下幾部分:
? ? ? ?一站式機器學習平臺:提供了包括實驗環境,沙盒調試,特征工程,離線訓練和在線推理等完整 AI 研發生命周期的支持;
? ? ? ?統一 Operator:在線推理主要是使用 K8s 原生的 deployment 做支持,離線訓練場景則是自研的 operator 進行支持;
? ? ? ?統一調度和資源并池:通過在離線統一調度和資源池合并池化,加速資源流傳,滿足訓練推理不同的資源訴求;
? ? ? ?異構資源/設備支持:通過 K8s deviceplugin 框架擴展實現 GPU、Habana、RDMA 等異構資源設備的感知上報和調度分配;
? ? ? ?通用基礎運維組件:日志、指標、Webshell 遠程登錄、Quota 資源管理等基礎運維能力均進行統一形式進行提供。
? ? ? ?在線推理業務場景時延敏感,對穩定性的要求比較高,此部分工作主要圍繞以下四個方面展開。
? ? ? ?① 共享 GPU 優化資源利用率
? ? ? ?構建了容器化形態下的 GPU 共享能力,將 GPU 資源的申請的最小單位從卡級別降低到0.1卡級別;
? ? ? ?調度器支持 GPU 資源多維度調度以及多種靈活的調度策略,將多個 Pod 調度到同一張 GPU 卡上,資源維度包括算力、顯存、視頻編解碼,調度策略包括重顯存模型和重算力模型的親和性反親和性、binpacking 等;
共享模式支持時間片和 MPS 兩種并行模式。
? ? ? ?② 微拓撲感知資源分配策略優化單機性能
? ? ? ?支持 NUMA 親和性調度,保證為容器分配的 CPU、Memory、GPU 在同一個 NUMA 節點上;
? ? ? ?支持 GPU 拓撲感知調度,保證為容器分配的 GPU 資源拓撲最優,通過 NV-Link 加速 GPU 設備之間的數據通信。
? ? ? ?③ 高可用MPS
? ? ? ?字節內部大量使用了 MPS 來提高 GPU 設備的空間利用率,通過以 Pod Sidecar 的形式實現了 MPS 容器化,將 MPS 的部署粒度從整機所有卡降低到 POD 級別,以減小 MPS 故障影響面。
? ? ? ?④?監控與周邊工具
? ? ? ?基于 DCGM 工具和 NVML 庫,從維度和粒度兩個方面提高指標的覆蓋程度。維度方面,將指標從單純顯存和算力監控,擴展到空間利用率、頻率、溫度、PCIE 字節數等。粒度方面,將算力、顯存、編解碼等利用率指標從卡粒度,精細到服務和進程級別。
? ? ? ?實現了內部版 nvidia-smi 工具,解決容器內無法通過 nvidia-smi 看到 GPU 進程的痛點,在保證安全隔離性的前提下,幫助業務調試和診斷進程信息。

? ? ? ?離線訓練部分是通過統一的 operator 進行支持。

? ? ? ?離線訓練場景通過統一的 Operator 進行支持,自研 TrainingJob Operator 既支持公司自研 Lagrange 等訓練框架,同時也支持 tensflow、pytorch 開源產品等。
? ? ? ?一個 operator 支持多種框架,一方面降低了接入成本,優化了用戶體驗;
? ? ? ?operator 與框架做一個深度的聯動,框架可以通過感知 worker 數量變化來動態調整訓練的學習率;
? ? ? ?目前字節內部微服務以常態混部作為資源優化的主要手段,但對于 socket 和 GPU 服務來說,仍會以 HPA 彈性出讓的方式為主,統一的 operator 有利于做在離線一體的彈性策略的支持。
? ? ? ?字節在線 K8s 集群節點的量級在萬臺規模,Yarn 集群節點可支撐五萬+規模,為支持超大規模的集群調度,自研分布式調度器支持在離線的統一調度。

? ? ? ?調度器主要包括三個組:Dispatcher、Scheduler、Binder。Dispatcher 是一個單實例,主要負責監聽集群中的 pending pod,然后把這些 pod 基于某些特定的分配策略,分配給不同的 Scheduler 去執行;Scheduler 多實例,各個實例之間是樂觀并發工作,負責具體的調度計算工作,同時把計算調度的結果傳遞給 binder;binder 單實例,單點收斂 scheduler 樂觀并發的結果,做一些沖突檢查,最終提交調度結果。
? ? ? ?調度策略上豐富了對離線場景調度功能的支持,例如 DRF、Gang 調度、優先級搶占、Fairshare 等功能。Gang 調度是離線訓練場景基礎功能 feature 之一,調度時要求對一批實例(pod)要么全部成功,要么全部失敗,不存在部分成功的中間狀態。
? ? ? ?調度上的統一同時需要要求資源 Quota 統一,在此通過把資源抽象成 Guatanteed 和 BestEffort 兩大類資源類型,配合通過 min/max 語義支持資源的彈性超售分配。

? ? ? ?在上文中可以看到字節內部存在多種異構資源,這部分主要通過擴展 K8s deviceplugin框架進行支持;微拓撲感知調度,例如網卡親和 numa 親和,可以很大程度提升訓練速度,整體流程如上圖所示:
? ? ? ?Collector 收集靜態物理拓撲信息和節點實時已分配信息;
? ? ? ?CNR 是自定義 K8S CRD 資源,存儲節點拓撲信息;
? ? ? ?Scheduler Plugin 根據 CNR 和 Pod 請求信息進行節點的綁定;
? ? ? ?NumaAffinity DevicePlugin 完成最終親和性分配和綁定。
? ? ? ?對于在線服務潮汐現象明顯,相反離線訓練資源短缺的情況,在離線統一由 K8s 做資源編排的背景下,基于 Virtual Kubernetes 實現了在線跨集群的資源整合,以支持離線彈性訓練需求。

? ? ? ?Virtual-Kubernetes 基于開源的 Virtual-Kubelet(簡稱VK)項目演進而來,提供了跨集群整合零散資的能力。在 K8s 中 Kubelet 負責節點的資源管控和 pod 啟停,Virtual-Kubelet 模擬了這一行為,只是啟動的節點是一個不在本集群中的虛擬節點。舉例來說,在離線分屬不同的 K8s 集群,其中離線的彈性訓練實例就可以通過 VK 部署到在線集群中的空閑節點中,上圖右下角虛框標識的 Node' 節點實際上就是一個虛擬節點。
? ? ? ?以 Horovod 舉例,Horovod 是 Uber 開源的一個分式訓練框架,使用的是 Ring Allreduce 來進行通信。首先通過 VK 的方式,提供跨集群的潮汐資源。AutoScaler是一個彈性擴縮控制器,監控潮汐資源的狀態,通過策略觸發 training job 擴縮配置的調整。TrainingJobOperator 提供 worker replica 調整能力,與訓練框架相互配合,完成數據的 checkpoint 和 failover 機制等。
? ? ? ?最后一部分是對未來的展望。

? ? ? ?先總結一下字節內部對云原生的理解。字節對云原生踐行主要體現在效率和成本兩方面。
? ? ? ?① 效率方面
? ? ? ?通過 CNI/CSI 完成對網絡存儲的抽象,通過 DevicePlugin 完成對異構資源的抽象等,以此來達到基礎設施的標準化;
? ? ? ?有狀態服務,通過擴展 Statefulset 進行支持,離線訓練通過自研的 operator 支持,完成業務框架的標準化;
? ? ? ?面向服務或者模型的 CI/CD 流程完成流程規范的標準化;
? ? ? ?基于容器和鏡像提供了標準一致的運行環境,進而達到交付形態的標準化。
? ? ? ?② 成本方面
? ? ? ?容器秒級彈性特征,讓業務可以放心按需分配資源,無需考慮常態部署下的N倍容災;
? ? ? ?各種混部方式,比如在離線混、計算存儲混、01 出借和常態混部等,有效提升了資源配置的利用率,降低了總體資源需求。

? ? ? ?目前的編排調度能力在集群聯邦層次相對比較薄弱,后續會進一步加強集群聯邦編排調度能力,在跨任務編排時更多的考慮 Quota 分配、任務排隊、依賴的數據地理親和性和網絡帶寬等等因素。
? ? ? ?任務/數據編排方面,可能會嘗試以 Argo(開源的編排組件)去構建云原生的 DAG 編排能力,支持機器學習研發訓練各種流程中的 pipeline 場景。數據編排可能會考慮引入如 Alluxio 等 cache 能力。
? ? ? ?最后更長期持續跟進的事項是構建在離線一體的云基礎設施能力。目前在離線 GPU 資源分屬不同的 K8s 集群,雖然通過 VK 一定程度上解決了資源的隔離,但是長遠來看,還是希望進一步探索深度并池的可能,支持 CPU 與 GPU 或者在離線 GPU 之間的常態混部。