大家好,今天給大家介紹一下GECRM的CPU和NUMAfinity來達到AI任務加速的這個議題這個議題是由浪潮的王德葵和我來自英特爾的傑瑞王給大家介紹把本議題得到了英特爾麥克富的team的大力協助在此非常感謝本題介紹的內容主要有以下五個方面首先會給大家再回顧一下CRM的架構然後再介紹一下用戶的場景第三再給大家介紹一下CRM的具體的實現第四部分主要是給大家講一下這個脫補感知資源對齊的這種策略最後會介紹一下就是我們在AI cleaning集群中遇到的一些問題並且是如何解決的下面給大家介紹一下CRM的架構CRM主要是由這個上層是由cooperate然後中間是CRM的這個守護進程這個守護進程裡面包含有四大部分裡面有一個右邊的話是有一個資源管理器這個模塊這個模塊裡面主要就是負責這個服務器上的各種資源的控制和調度左邊的話最上面是會起一個CRI的服務叫做CRI server然後中間呢會有一個模塊叫做CRI relay這樣就相當於是中介中轉主要是負責CRM相關的消息的轉發下面還有一個小模塊叫CRI client它主要是用來和container runtime容器已經持來這個模塊來交互一達到對容器的控制在這個CRM的這個守護進程裡最關鍵的部分是result manager它裡面大概分為四個部分第一個部分是policy就是說顧名思義就是策略目前的話我們CRMCRM裡面內置了兩種策略一個策略是脫補感知策略另外一個是精態池策略另外還有一些控制器這個控制器主要是有控制三個東西第一個是container CRIcontainer runtime接口用來對容器運行時接口要進行控制第二部分是RTTRTT是英特爾的一種基於英特爾應見資源管理的一個技術它可以管理catch內存貸款還有IO第三個控制器是block IO就是它可以控制塊設備的IO帶寬然後中間的話它還有一個catch模塊然後右邊的話有三個模塊分別是configure matrix和interpection下面給大家介紹一下脫補感知資源對齊這個策略這個策略主要是用來就是分配處理器的內存IO設備CPU還有內存控制器等等把它分給合適的Workload如果是不合適的分布的話會導致性能下降另外的話應見脫補它也應該會被擋制到Noise neighbor的話是這種場景就是說我們這個服務器下面有各種各樣的負載比如說我目前有足戶abcde5個負載然後對於足戶ca來講其他的足戶abde就是noise neighbor中文叫做吵鬧的鄰居通常的話我們要盡量減少低優先級的負載對高優先級負載的影響應當盡量保證高優先級我副工作負載的運行所以多足戶場景是noise neighbor的經常會遇到的一個問題第二個是同一服務器的負載彼此會干擾第三種形容場景就是多個工作負載會共享CPU第四種場景就是我們有時候不同的CPU上面的L3CATS內存控制器還有L是需要共享給不同的負載的這些資源的調度也會影響第五個是我們要確保關鍵的工作負載佔用合適的應見資源現在給大家介紹一下延遲關鍵的工作負載特別是網絡密集行延遲對延遲比較敏感的負載這種場景通常是在NFV的場景上經常用到通常NFV的場景是需要對以下三個方面是有比較高的要求第一個就是可靠性另外就是可預測另外就是抗干擾所以NFV場景通常會它是在一個服務器上運行一些虛擬化網絡的相關的軟件通過吸引機來進行網絡的轉發另外還有一種情況就是CPU失蹤速度的降頻比如說某些工作負載會導致CPU頻率下降另外就是分布是附近要把有破壞性的這種工作負載把它盡量均勻的分配從而減少它的破壞性第三個就是多個時鐘域和GDP域多個時鐘域指的是在同一個機群裏面的同一個節點有可能會CPU有不同的荷爾會跑在不同的頻率這種情況C就表示CLOCKP就是代表Power還有一種情況就是同一個服務器或者說不同服務器上的CPU也會跑在不同的Power這種情況下這種時候所以就會分成多個時鐘域和GDP的導門GDP就是Summer Design Power它通常就意味著CPU設計功耗所能達到的理論機械通常我們要保持相關的值在關鍵的預值以下比如說CPU的功耗不能讓它超過GDP如果超過的話會發生這種過熱的情況另外就是需要把這個工作負載壓縮到盡可能少的CLOCK導門和GDP這也給大家詳細介紹一下有效資源和控制的情況通常容器運行時控制它會控制下面這些東西比如說Kernel CFS的CPU參數CFS就是Fairness容器公平調度它通常分為有三個參數就是Share還有Quota另外就是Pierrot然後CFS的參數在CRI的協議裡面Share和Quota是支持的另外還可以控制Memory的Limit我們這個POD它用多少Memory還有OM scope調整也是對MemoryRequest的一種控制這個也是支持的另外就是RGTRGT目前也是支持的Block IO的話也可以支持然後Memory Demotion所謂Memory Demotion在Memory Tiring的情況下比如說插了PMEM凹層持久內存這種情況的話我們的Memory就分為兩層第一層叫做傳統的DRAM傳統的DDRAM第二層就是PMEMMemory Demotion就是把熱數據從DRAM裡面搬移到相對溫的地方叫溫數據比如說PMEM這個就叫做Memory Demotion對於Memory Demotion的話可能是有限的支持我們會就是說CRM會動態監控這個工作負責周期性的案案它會定期來做IDLE PAGE的Demotion下面給大家介紹一下這個臀部感知感知臀部策略的這個情況它用到的這個技術技術就是CPU拼領就是我們會把這個工作負責拼到CPU的和內存控制系統另外就是CPU隔離我們會隔離關鍵負責通過這個專有的這個CPU分配另外還有就是CPU的優先級這個就不詳細介紹了大家看一下就OK了下面給大家介紹一下精態持冊裂精態持冊裂主要就是用於這個做CPU拼領和隔離的它是就是預定義的這個CPUCore和Pore另外就是用戶也有一個用專有的這個Pore和共享的Pore來構建就是它的原理主要就是開兩個池把它把這個CPU持化並且這個池子分成兩種一種是可以共享的一種是不能共享的然後用戶就是根據自己的要求來從這兩個池子裡來給自己的容器來分配CPU另外還有就是CRM就是每個節點上運行CRM節點上都有一個NodeAgent這個NodeAgent的話就是一個守護進程它這個它就是用來處理這個就是動態配置管理並且管理這個節點的對象消滅的一些對象還有就是處理動態調整的容器資源的分配都是通過這個NodeAgent來來實現的還有就是這個CRM它有一個Webhook就是它可以配置為這種Mutation Access這個Network hook原來就是它會給所有的這個Workload做一些標記通過這個Webhook我們就可以獲得一個精確的這個資源需求的一個試圖因為Webhook它它會擷取所有的這個容器集群上面的情況還有工作負載的情況下面介紹一下這個脫補感知資源對齊的這個策略這個策略它有三個原則就是它會盡量就是過濾掉那些就是容量不夠的那種池子還有就是它會它喜歡那種更緊密的更緊湊的對齊和更低的延遲第三個就是它這個傾向於就是更多保持保持這個有效的容量和更少的Workload的大家好前面英特爾的同事給大家介紹了CRM這個項目這裡我主要介紹一下我們基於K5S搭建AR訓練集群時遇到了一些問題以及我們使用CRM項目的一些實踐對於我們不少用戶它會嘗試使用集群中的CPU服務器進行AR訓練當然它的性能肯定沒有GPU服務器那麼好但是對於AR初學者可能說是做一些的簡單的模型掩飾數據域處理這些都是沒問題的所以我們可能就需要考慮到這些場景然後提高一些性能這裡主要是對CPU的行動進行提升我們知道在K5S中有這種CPU BUN和NUMAR提合性的特性但是其實這只能在K5S中使用當然對於我們很多項目它其實是因為它上面比較低的但是可能是很難進行K5S的升級或者重新部署這當然是會出一些困難的所以它可能沒辦法使用這種K5S的新特性來另一方面K5S中的CPU Manager和Tool Manager它是集成在Cable it裡面的這樣其實是很難很難去做更好的開發不像DevaPlane那種機制一樣我們可以去做更多的這種關於單解點資源的調度還有一方面就是說我們去看Tool Manager我們可以看到其實K5S的這種CPU BUN和NUMAR提合性只是對指定的K5S才生效但是對於很多的AR場景很多用戶它一般都不會去限制內存這時候可能我們就沒辦法使用這個特性來這裡我首先給大家介紹一下我們是如何基於K5S加Docker或者可能能體來搭建AR訓練機群的其實AR訓練機群或者是AR訓練平台和大部分的訓練平台大部分的平台型產品類似到一個純上其下的作用對下面它會籌下那種計算資源存儲資源網絡資源然後更上它會整合我們熟悉的AR業務流程提出模型開發模型訓練核輸醫機管理應用開發等我們知道了很多算法人員他其實可能對這種應驗的計劃這不是太了解例如這個Urk網絡RB網絡SDS存儲如何發揮他的最優的性能其實可能算法開發的可能他並不是太關心所以對於我們這種平台型產品我們可能就需要挖掘出這種應驗的極致性能然後來提供給AR訓練的使用人員來提高他們的訓練速度這裡我們看一下在CPU上去跑AR訓練任務對於AR很多AR開發的他可能認為我如果學習ARAR可能必須要有GPU其實其實並不是這樣你只需要一台CPU服務器就可以做很多關於AR的事情CPU在ARAR的訓練內容中發揮了很重要的作用像數據處理圖像的旋轉外號的編碼採檢等等當然對於訓練中最重要的這種卷計計算我們很多場景肯定是會用GPU的因為GPU有大量的ARU計算專員可以進行並行計算這可以加速這種訓練速度訓練降低訓練時間但是我們知道對於CPU它其實也是有少量的ARU計算代言的但是雖然這只是串型計算但是進行卷型計算肯定是沒有問題的你如果是對於一些AR除了去跑一個miniFiz的數據級這肯定是沒有問題的關於這種CPU的性能優化我們想到的就是說牛馬廳核性因為我們知道在同一牛馬組的這種CPU單元CPU它會共享一些內存這樣可能會減少一些通信水耗然後來提高訓練性的其實英特爾對對使用CPU加速AN訓練有更多的這種研究大家可以去搜索一下我們來看一下KBS中的CPU管理我們知道KBS中的CPU管理主要是基於底層的concentrate run time來進行的一般都會基於Linux的CFCorto機制來做處理只對一個POD分配的CPU實驗站的進行限制KBS默認的策略其實是POD中的定程其實它的上下文可以在這種全部CPU上進行切換然後不會把它綁定到某個CPU上去CPU KBS默認的策略它只是參考了有馬清合性處理然後看右邊這個圖的話我們知道KBS中的科普管理會做這種清合性的一些選擇順利的主要包括這種Devas Manager和CPU ManagerCPU Manager和Devas Manager他們的處理對象不太一樣Devas Manager可能會處理這種GPU設備和IB設備CPU Manager主要關注於CPU就像CPU Manager和Devas Manager會基於這種牛馬清合性會給出一些建議我們可以認為是CPU Tophands和GPU Tophands然後Tophander會做一些莫子然後給出會基於這種牛馬清合性給出一個最終的建議這裡我們可以看到這種標紅的標紅的就是就是最終Tophander給出的建議然後我們來看一下KBS是怎麼來繼承CRR-M其實前面Jerry也介紹了CRR-M的原理CRR-M其實就類似做了一層一片的劫持在KBS和Devas Manager之間做了一層劫持我們知道KBS他為了兼容Docker做了一層DockerSame所以我們的集群在對架Docker的時候會有一些特殊處理會是像右邊這樣的圖示我們會會起一個DockerSame的虛擬實力來連接這個Docker和CRR-M然後其中CRR-M的時候會會運行在Cablet和DockerSameDockerSame實力之間就會類似一個這樣的大構圖其實啟動去CRR-M來說還是比較簡單的第一個就是我們會去配置一下CRR-Retools Manager Service將DockerSame的一些SOC地址還有Runtime SOC的Runtime SOC的進行配置然後我們第二步我們會啟動一個虛擬的DockerSame實力這裡就直接使用DockerCablet而進的就可以了我們會前面加一個ApparentDockerSame等於處這樣就可以了第三步我們會配置這個Cablet Service將它的CRR-Runtime和CRR-Runtime的interpoints進行修改這樣我們就會搭建這個環境來了然後在我們的AR訓練平台去創建訓練任務的時候就會自動創建出GCRM分配資源的容器這裡我們主要做了一些測試就是看使用CRR-Runtime之後我們的性能提升這裡我們是使用網絡的F528.M5CPU是28核的inter6132CPU我們使用的K8S版面比較低是1.14.8跑Bitmark我們是用標準的TFBitmark比較低然後TenFlow是1.15.3滿倍然後我們給這個PoE分配了14個CPU並不會做內臣的限制另外一邊是這個節點的NUMA-TOP我們只是在單個一輛進行的測試第一個測試行動是我們跑了Return的5.0和MLGNET的數據節其實通常的一會兒可能是不是這樣的我們為了更加明顯的去顯示對CPU的影響我們這時候會指定這個GunDevice等於CPU這個參數讓這個訓練任務去跑在CPU上這裡我們可以簡單看一下這個CPU利用率在我們沒有使用CRR-M的參數之前這個CPU利用率是大約是1400%就接近一把所有的CPU都站滿了但當我們去使用CRR-M之後這個CPU利用率加了百分之一千第二個測試測試case是CNN加MiniFace的數據節這裡的運行比較簡單了我們並沒有給這個容清的分泌CPU所以他會默認的就會跑到這個CPU上去我們看到的CPU利用率和剛才我們看到的效果類似CPU利用率有使用之前的百分之一千四百將降低到了百分之九百五其實這個CPU利用率加強是很明顯的這是我們的總結測試總結吧其實我們可以看到一個很有趣的現象就是說我們沒有使用CRR-M之前CPU利用率比較高但是訓練速度比較低訓練時間當然也比較長了當我們使用CRR-M之後CPU利用率不僅降低了而且提高了訓練速度訓練時間也進行了一斤的下降對於RTN50的測試的時候CPU利用率是有百分之一千四降低到了百分之一千訓練速度是由八點五五個張圖片每秒訓練時間是由十六分鐘減少到了十四分鐘四十秒對於Minefits的Test的數據級CPU利用率是百分之一千四百降低到了百分之九百訓練時間由三分三秒降低到了一分五十六秒我們可以看到它帶來的效果還是很明顯的當然這裡我們這裡主要是主要是我們對CPU的一些測試其實前面介紹一下更多的這種CNR-M的特性我們後續還會做更多的優化和測試今天的主要是這些內容謝謝大家