百度PaddlePaddle聯手Kubernetes,助力開發者高效訓練深度學習模型

2021-01-18 機器之心Pro

選自Kubernetes等參與:吳攀、李亞洲、蔣思源

2016 年 9 月,百度開源了深度學習框架 PaddlePaddle,今天,百度又宣布實現了這一框架和集群管理系統(cluster management system)Kubernetes 的兼容,從而使 PaddlePaddle 成為了迄今為止唯一一個官方支持 Kubernetes 的框架。

據百度研究官網介紹,這種兼容性將使得開發者可以很方便地在全球所有主要的雲服務提供商(包括百度雲和企業內部的集群(on-premise clusters))上訓練大型的模型。該項目是由百度和 CoreOS 聯合開發的;CoreOS 是 Kubernetes 的主要貢獻者之一。

開發者通常會將人工智慧程序與網絡服務、日誌收集器和數據處理器一起聯合部署在同一個通用的集群上,以實現高效的數據流程(data pipelines)。為了管理這個過程,開發者就會用到 Kubernetes 這樣的工具;Kubernetes 是現在最複雜精細的通用集群管理系統之一。通過使 PaddlePaddle 與 Kubernetes 兼容,開發者現在可以用它們開發高效的深度學習驅動的應用。

「使用 Kubernetes 這樣的框架,開發者再也不用擔心為了在一個標準雲平臺上配置和部署深度學習訓練系統而編寫不必要的代碼。」PaddlePaddle 項目技術負責人 Yi Wang 說,「這最終能幫助他們更快地將他們的項目落地。」

Kubernetes 可將 PaddlePaddle 中需要 GPU 的工作和需要其它資源(如大型存儲或磁碟 I/O 流通)的工作封裝到同一套物理計算機上,從而可以充分利用集群硬體。而且當白天存在許多活躍用戶時,它還會自動擴展其在線服務,而到了夜間用戶較少時它又會釋放出一些資源。

PaddlePaddle 是一個源於百度的易用的深度學習框架,已經在百度的許多產品和技術中得到了應用,其中包括搜索排序和機器翻譯。據介紹,該框架非常適合用於訓練循環神經網絡,從而使其可以高效地被應用在自然語言理解、語音和多媒體等應用中。百度聲稱,自去年 9 月開源之後,PaddlePaddle 已經成為了現在增長最快的深度學習框架之一。

關於在 Kubernetes 上運行 PaddlePaddle 的更多細節,可在下面的介紹文章中了解(下文作者為 Baidu Research 的 Yi Wang 和 CoreOS 的 Xiang Li)。

什麼是 PaddlePaddle

PaddlePaddle 是一個易於使用、高效、靈活和可擴展的深度學習平臺,該平臺最初是由百度在 2014 年為其產品應用深度學習而開發的。

現在已經使用 PaddlePaddle 的創新已經超過了 50 項,並支持包括搜尋引擎、在線廣告、Q&A 和系統安全等 15 項百度產品。

2016 年 9 月,百度開源了 PaddlePaddle,並且很快就吸引了很多來自百度外的參與者。

為什麼要在 Kubernetes 上運行 PaddlePaddle

PaddlePaddle 是被工程師們設計成精簡且不依賴於計算基礎設備的深度學習平臺。用戶可以在 Hadoop、Spark、Mesos、Kubernetes 和其他平臺上運行它。我們對 Kubernetes 有很強烈的興趣,因為它的適應性、高效性等豐富的特點。

當我們將 PaddlePaddle 應用於百度的各種產品時,我們注意到 PaddlePaddle 的兩種主要用法——研究和產品。用於研究的數據並不會經常性地變動,重點是快速地實驗以達到預期的科學度量。而應用於產品的數據會經常性地變動,它通常來自網頁服務而產生的日誌信息。

一個成功的深度學習項目包括了研究和數據處理流程(pipeline)。因為有很多參數需要調整,許多工程師在整個項目的不同部分同時工作。

為了確保項目易於管理且能高效利用硬體資源,我們希望能將項目的所有部分運行在同一個基礎平臺之上。

這樣的平臺需要提供:

容錯性(fault-tolerance)。它應該將流程(pipeline)的每一個階段摘取為一個服務,並且這些服務包含了許多過程,這樣的冗餘能夠提供高流通量(high throughput)和魯棒性。自動擴展(auto-scaling)。在白天,通常有許多活躍用戶,因此平臺就需要能向外擴展其在線服務。而到了晚上,平臺就需要釋放一些資源進行深度學習試驗。工作封裝和隔離(job packing and isolation)。平臺需要能夠為 PaddlePaddle 訓練器過程(trainer process)分配要求的 GPU、需要大內存的網絡後端服務和需要磁碟吞吐量的 CephFS 過程,並且保證相同的節點充分利用其硬體資源。

我們想要的是一個能在同一個集群上運行深度學習系統、網頁伺服器(如 Nginx)、日誌收集器(如 fluentd)、分布式隊列服務(如 Kafka)、日誌加入器(log joiner)和使用 Storm、 Spark、Hadoop MapReduce 編寫的其他數據處理器的平臺。我們希望所有的工作(線上線下、產品和實驗)都能在同一個集群上運作,這樣我們才能充分利用集群,因為不同的工作需要不同的硬體資源。

我們選擇的是基於容器(container based)的解決方案,因為由虛擬機(VM)引入的總開銷與我們的高效、實用這一目標相矛盾。

基於我們對不同的基於容器(container based)解決方案的研究,Kubernetes 最符合我們的要求。

在 Kubernetes 上的分布式訓練

PaddlePaddle 本就支持分布式訓練,在 PaddlePaddle 集群中有兩個角色:參數伺服器(parameter server)和訓練器(trainer)。每個參數伺服器處理包含全局模型的一部分,每個訓練器有該模型的局部複製,並且使用它的局部數據更新該模型。

在訓練的過程中,訓練器將模型更新信息發送到參數伺服器,參數伺服器負責聚集這些更新,以便於訓練器能夠能夠與全局模型同步它們的本地複製版本。

圖 1:模型被劃分為兩個分片(shard),分別由兩個參數伺服器管理。

一些其他的方法使用一系列參數伺服器在多臺主機的 CPU 存儲空間中一起存儲一個非常大型的模型。但在實際中,我們通常沒有這麼大的模型,因為由於 GPU 的存儲限制,處理特別大的模型是效率低下的。在我們的配置中,多參數伺服器大部分是為了快速通信。假設只有一個參數伺服器處理與所有的訓練器一起工作,參數伺服器要聚集來自所有訓練器的梯度,這是一個瓶頸。在我們的經驗中,經實驗驗證的有效配置包括同樣數量的訓練器和參數伺服器。我們通常在同樣的節點上運行一對訓練器和參數伺服器。在下面的 Kubernetes 配置中,我們啟動了一個運行了 N 個 pod 的工作,其中每個 pod 中都有一個參數伺服器和一個訓練器。

yaml

apiVersion: batch/v1

kind: Job

metadata:

name: PaddlePaddle-cluster-job

spec:

parallelism: 3

completions: 3

template:

metadata:

name: PaddlePaddle-cluster-job

spec:

volumes:

- name: jobpath

hostPath:

path: /home/admin/efs

containers:

- name: trainer

image: your_repo/paddle:mypaddle

command: ["bin/bash", "-c", "/root/start.sh"]

env:

- name: JOB_NAME

value: paddle-cluster-job

- name: JOB_PATH

value: /home/jobpath

- name: JOB_NAMESPACE

value: default

volumeMounts:

- name: jobpath

mountPath: /home/jobpath

restartPolicy: Never

我們能從配置中看到,並行和實現都被設定為 3。所以該工作將同步啟動 3 個 PaddlePaddle pod,而且在所有的 3 個 pod 結束後運行的工作才會結束。

圖片 2:運行在 2 個節點上的 3 個 pod 的 Job A 和 1 個 pod 的 Job B

每個 pod 的入口是 start.sh。它從一個存儲服務下載數據,所以訓練器可以從 pod 本地的磁碟空間快速讀取。下載完成之後,其會運行一個 Python 腳本 start_paddle.py,該腳本會啟動一個參數伺服器,然後等待所有 pod 的參數伺服器都為使用做好準備,之後再啟動該 pod 中的訓練器過程。

這裡的等待是必需的,因為每個訓練器都需要與所有的參數伺服器進行通信(如圖 1)。Kubernetes API 使訓練器能夠檢查 pod 的狀態,所以該 Python 腳本可以等待,直到所有的參數伺服器的狀態都改為「running」,然後它才會觸發訓練過程。

目前,從數據分片(data shards)到 pods/trainers 的映射是靜態的。如果我們要運行 N 個訓練器,我們需要將數據分割成 N 個分片,並將每個數據分片靜態地分配給訓練器。同樣我們依賴於 Kubernetes API 來獲取工作中的 pods,因此我們可以將 pods / trainers 從 1 到 N 建立索引。第 i 個訓練器將讀取第 i 個數據分段。

訓練數據通常是在一個分布式文件系統上提供的。我們實際上在我們的企業內集群上使用了 CephFS,在 AWS 上使用了 Amazon Elastic File System。如果你對構建 Kubernetes 集群來運行分布式 PaddlePaddle 訓練工作感興趣,請參考這個教程:https://github.com/PaddlePaddle/Paddle/blob/develop/doc/howto/usage/k8s/k8s_aws_en.md

未來

我們正在努力讓 PaddlePaddle 能夠在 Kubernetes 上運行得更加順暢。

你可能已經注意到,當前的訓練器調度(trainer scheduling)完全依賴於基於靜態分區圖(static partition map)的 Kubernetes。這種方法開始是很簡單,但也可能會導致一些效率問題。

首先,緩慢或死亡的訓練器會終止整個工作。在初始部署之後就沒有什麼受控的優先權(preemption)或重新調度(rescheduling)了。

其次,其資源配置是靜態的。所以如果 Kubernetes 有比我們預計的更多的資源,那麼我們就必須手動修改其資源要求。這是一個非常繁重的工作,與我們的效率和實用的目標不一致。

為了解決上述問題,我們將添加一個理解 Kubernetes API 的 PaddlePaddle master,其可以動態地添加/移除資源量,並且可以以一種更加動態的方式為訓練器處理分片(shard)。該 PaddlePaddle master 使用 etcd 作為從分片到訓練器的動態映射的容錯存儲。因此,即使該 master 崩潰,該映射也不會丟失。Kubernetes 可以重啟該 master,然後該工作將會繼續運行。

另一個潛在的提升是更好的 PaddlePaddle 工作配置(job configuration)。我們的有相同數量的訓練器和參數伺服器的經驗大多數都收集自在專用集群(special-purpose clusters)上的應用。據我們觀察,這種策略在我們客戶的僅運行 PaddlePaddle 工作的集群上是高性能的。但是,這種策略可能在能夠運行許多種工作的通用集群上並不是最優的。

PaddlePaddle 訓練器可以利用多個 GPU 來加速計算。GPU 目前還不是 Kubernetes 中的首選資源。我們還必須半人工地管理 GPU。我們期望能與 Kubernetes 社區一起提升 GPU 支持,以確保 PaddlePaddle 能在 Kubernetes 上實現最佳的表現。

資源

Kubernetes:http://get.k8s.io/本 Kubernetes 項目的 GitHub:https://github.com/kubernetes/kubernetesStack Overflow 問題討論:http://stackoverflow.com/questions/tagged/kubernetesSlack 社區:http://slack.k8s.io/

相關焦點

  • 23個系列分類網絡,10萬分類預訓練模型,這是飛槳PaddleClas百寶箱
    飛槳圖像分類套件 PaddleClas 是飛槳為工業界和學術界所準備的一個圖像分類任務的工具集,助力使用者訓練出更好的視覺模型和應用落地。PaddleClas 具備以下 4 大特色,豐富的模型庫、高階優化支持、特色拓展應用、以及工業級部署工具。下面將為大家詳細分解。
  • 520禮包 | 情感分析算法從原理到PaddlePaddle實戰全解
    在下文中,我們將以情感分析為例,介紹使用深度學習的方法進行端對端的短文本分類,並使用PaddlePaddle完成全部相關實驗。應用背景在自然語言處理中,情感分析屬於典型的文本分類問題,即把需要進行情感分析的文本劃分為其所屬類別。文本分類涉及文本表示和分類方法兩個問題。
  • 百度開源業內首個口罩人臉檢測及分類模型
    2月13日,百度宣布免費開源業內首個口罩人臉檢測及分類模型。該模型可以有效檢測在密集人流區域中攜帶和未攜戴口罩的所有人臉,同時判斷該者是否佩戴口罩。目前已通過飛槳PaddleHub開源出來,廣大開發者用幾行代碼即可快速上手,免費調用。
  • PaddlePaddle 2.0.0 Beta 發布,API 體系升級,命令式編程完善
    訓練框架基礎API兼容性說明 Paddle 2.x版本推薦用戶使用位於paddle根目錄下的API,同時在paddle.fluid目錄下保留了所有的Paddle 1.x版本的API。按照設計,Paddle 1.x版本訓練的代碼,不做任何修改,即可在Paddle 2.x版本上正常運行;Paddle 1.x版本訓練保存的模型,可以使用Paddle 2.x版本進行推理。
  • 十行代碼就能搞定深度學習?飛槳框架高層API,輕鬆玩轉AI
    機器之心發布機器之心編輯部嚮往深度學習技術,可是深度學習框架太難學怎麼辦?百度傾心打造飛槳框架高層 API,零基礎也能輕鬆上手深度學習,一起來看看吧?另:文末有福利,一定要看完呦~高層 API,What深度學習作為人工智慧時代的核心技術,近年來無論學術、還是工業領域,均發揮著愈加重要的作用。然而,深度學習理論太難學,開發過程太複雜,又將許多人拒之於深度學習的門外。
  • 經典目標檢測方法Faster R-CNN和Mask R-CNN|基於PaddlePaddle深度...
    因此,百度深度學習框架 PaddlePaddle 開源了用於目標檢測的 RCNN 模型,從而可以快速構建強大的應用,滿足各種場景的應用,包括但不僅限於安防監控、醫學圖像識別、交通車輛檢測、信號燈識別、食品檢測等等。
  • 如何用Paddle Fluid API搭建簡單的神經網絡?這裡有一份編程指南
    PaddlePaddle 是百度自主研發,集深度學習核心框架、工具組件和服務平臺為一體的開源深度學習平臺。該平臺技術領先、功能完備。Paddle Fluid 是 PaddlePaddle 的核心框架,滿足模型開發、訓練、部署的全流程需求。本文將展示如何用 Paddle Fluid API 編程並搭建一個簡單的神經網絡。
  • 百度ERNIE語義理解開源套件重磅升級 零基礎也能秒變NLP達人
    藉助國產深度學習框架飛槳動態圖優勢,本次升級實現了「動態圖」與「靜態圖」的完美結合,即「一套代碼,兩種運行方式」,使得開發者更加高效、方便的使用ERNIE解決工業生產中的各類NLP問題,達到簡單幾行代碼即可實現基於ERNIE的文本分類、情感分析等經典NLP任務。
  • 百度AI開發者實戰營第二季·北京站招募啟動,AI老司機了解一下?
    經典落地案例+深度技術培訓,全方位展示AI技術商業化落地路徑去年,百度AI開發者實戰營第一季先後落地深圳、成都、杭州、上海、廣州、北京六大城市,數十位經驗豐富的百度AI高級工程師深入開發者群體,教開發者們將語音、圖像、人臉、UNIT、AR等百度最核心的AI技術能力,應用於各自的產品中。
  • 推理引擎Paddle Inference改造三要點,ERNIE時延降低81.3%
    本文經授權轉自公眾號 開源中國(ID:oschina2013)隨著深度學習技術的成熟和人工智慧的發展,機器開始變得越來越「聰明」,越來越了解用戶的喜好和習慣
  • 百度發布 Paddle Fluid v1.3 版本,帶來多項重要更新
    日前,百度 PaddlePaddle 更新至 Fluid v1.3 版本,一如既往地, Fluid v1.3 版本在基礎框架、預測引擎、模型建設、分布式訓練各個方向上都實現了多項更新,而其中比較重要的更新包括:統一 Executor 和 ParallelExecutor 接口,用戶只需通過 CompiledProgram 將單卡模型轉化多卡模型,並利用 Executor
  • 百度PaddlePaddle開源視頻分類模型Attention Cluster 曾奪挑戰賽...
    百度 PaddlePaddle  百度深度學習框架 PaddlePaddle 最近開源了用於視頻分類的 Attention Cluster 模型。由於擁有卓越的分類能力,它曾助力百度計算機視覺團隊奪取了 ActivityNet Kinetis Challenge 2017 挑戰賽的冠軍。
  • 百度Paddle Fluid v1.3版本官方正式發布
    高效先進的視頻分類庫新增視頻模型庫,提供5個視頻分類經典模型以及適合視頻分類任務的通用骨架代碼,用戶可一鍵式高效配置模型完成訓練和評測。基於PaddlePaddle的NLP裡程碑Bert模型新增支持NLP語義表示BERT模型,支持多機多卡訓練,支持混合精度訓練,訓練速度對比主流實現提升50%+,提供完整部署示例。
  • 走進機器閱讀理解的世界,飛槳開源升級版 BiDAF模型解讀
    導讀:飛槳(PaddlePaddle)致力於讓深度學習技術的創新與應用更簡單。在百度的搜索問答和小度音箱中,都使用到了機器閱讀理解技術,為數億用戶提供了精準問答。2. BiDAF模型原理介紹BiDAF是一個經典的機器閱讀理解模型,包含多階段的層次化過程,通過使用雙向注意流機制,在不進行早期總結的情況下,仍可以在不同的粒度級別上,獲得一個查詢感知的上下文表示。
  • 百度發布飛槳螺旋槳PaddleHelix
    百度正式發布基於飛槳的生物計算平臺 - 螺旋槳 PaddleHelix,進軍生物計算領域。在本月 20 號召開的 WAVE SUMMIT+2020 深度學習開發者峰會上,百度正式發布了基於飛槳的生物計算平臺 - 螺旋槳 PaddleHelix,進軍生物計算領域。
  • 用深度學習理解遙感圖像,識別效率提升90倍 | PaddlePaddle出品
    可以用深度學習。現在, 遙感所是這樣做的:針對一個地方構建樣本庫,然後基於樣本庫中的圖像訓練深度學習模型。第二年,這一地方的環境和氣候發生變化,只需要把新的圖像加進樣本庫,然後重新把模型訓練一遍就可以了。同時,這樣也能夠減少對人的依賴,模型的調整不再受限於專家經驗,而是依靠數據的變化。
  • 百度飛槳發布工業級圖像分割利器PaddleSeg
    機器之心發布機器之心編輯部近日,飛槳官方發布了工業級圖像分割模型庫 PaddleSeg,給開發者帶來誠意滿滿的三重超值驚喜:①一次性開源 15 個官方支持的圖像分割領域主流模型,大禮包帶來大滿足。②多卡訓練速度比對標產品快兩倍,工業級部署能力,時間節省超痛快。
  • 百度EasyDL自研數據增強服務加持AI模型開發
    在 AI 模型開發的過程中,許多開發者被不夠充足的訓練數據擋住了提升模型效果的腳步,一個擁有出色效果的深度學習模型,支撐它的通常是一個龐大的標註數據集。因此,提升模型的效果的通用方法是增加數據的數量和多樣性。但在實踐中,收集數目龐大的高質量數據並不容易,在某些特定領域與應用場景甚至難以獲取大量數據。那麼如何能在有限數據的情況下提升模型的效果呢?
  • 逆勢而上的技術:圖神經網絡學習來了!
    在實際場景中,有大量的數據是在非歐式空間,限制了深度神經網絡的應用。得益於圖神經網絡在非結構化數據上出色的處理能力,它在學界與工業界上大放光彩。然而,圖神經網絡模型目前仍處於前期高速發展期,面臨著多項方法論和實踐挑戰。
  • 零基礎入門深度學習(六):圖像分類任務之LeNet和AlexNet
    課程名稱 | 零基礎入門深度學習授課講師 | 孫高峰 百度深度學習技術平臺部資深研發工程師授課時間 | 每周二、周四晚20:00-21:0001 導讀本課程是百度官方開設的零基礎入門深度學習課程,主要面向沒有深度學習技術基礎或者基礎薄弱的同學,幫助大家在深度學習領域實現從0到1+的跨越。