1. 程式人生 > >AI雲原生淺談:好未來AI中臺實踐

AI雲原生淺談:好未來AI中臺實踐

AI時代的到來,給企業的底層IT資源的豐富與敏捷提出了更大的挑戰,利用阿里雲穩定、彈性的GPU雲伺服器,領先的GPU容器化共享和隔離技術,以及K8S叢集管理平臺,好未來通過雲原生架構實現了對資源的靈活排程,為其AI中臺奠定了敏捷而堅實的技術底座。

在2020年雲棲大會上,好未來AI中臺負責人劉東東,分享了他對AI雲原生的理解與好未來的AI中臺實踐,本文為演講內容整理。

大家好,我是好未來AI中臺技術負責人劉東東。今天我給大家帶來的演講主題是《好未來AI雲原生的淺談》。我的分享主要分成四個部分:

第一,AI服務對雲原生的挑戰。
第二,AI與雲原生的服務部署。
第三,AI與雲原生的服務治理。
最後想談一談, K8S與Spring Cloud的有機結合。

1、AI服務對雲原生的挑戰

首先,我們來講一講AI服務對雲原生的挑戰。在雲原生時代,AI服務其中最大的一個特點就是,需要更大的算力支援,以及更強大的一個服務的穩定性。

 

我們的服務不單單只是原來的一個單體服務,現在已經轉入到一個叢集服務。同時對效能的穩定性要求,已經從3個9,開始向5個9發起了挑戰。

那麼這些問題,已經不再是原有的傳統技術架構能夠解決的。所以我們需要一個新的技術架構。

這個新的技術架構是什麼呢?就是雲原生。

我們來看一看,雲原生對我們帶來的變化。雲原生帶來的最大變化,我總結為四個要點和兩大方面。

四大要點分別是,DevOps、持續交付、微服務、容器的四個特點。兩個方面則是服務部署和服務治理。當然,它還有12個要素的整體系統總結。

 

今天重點來講的是服務部署和服務治理。

在雲原生浪潮下,我們是如何處理服務部署和服務治理呢?

首先我們通過AI與雲原生的服務部署,即通過K8S,加上一個資源的虛擬化,資源的池化等技術,解決了AI服務對各種硬體資源的數量級增長需求。

第二個,AI服務與雲原生的服務治理進行有機結合。通過服務治理的技術,包括服務發現、HPA、負載均衡等,解決AI服務對5個9的SLA的需求。

 

2、AI服務的雲原生部署

第一點談一下是怎麼把AI與雲原生的服務部署結合起來的。

首先看一下,在AI時代下服務部署有哪些特點呢?

第一個就是硬體資源需求與費用增長的一個矛盾。AI服務對於硬體的需求成數量級增長,但是硬體預算並沒有成數量級增長。

第二,AI服務對硬體的需求是多樣化的。如,對高GPU的需求、高CPU的需求、高記憶體的需求,甚至還有部分混合的需求。

第三,AI服務對資源的隔離是有需求的。每一個AI服務都能夠獨立使用這些資源,並且相互之間不會打擾。

第四,AI服務能夠對資源池化有要求。AI服務不需要去感知機器的具體配置,一旦將所有的資源進行池化,即可降低資源碎片,提升使用率。

最後一點,AI服務對突發的資源是有請求的。因為流量是不可預知的,企業需要隨時保持,能夠隨時擴充資源池的能力。

 

我們的解決方案是什麼呢?

首先,我們使用Docker的虛擬化技術,實現資源的隔離。

然後使用GPU共享技術,將GPU、記憶體、CPU等資源進行池化,然後將整個資源進行統一的管理。

最後,使用K8S的resources,包括汙點(taints)、容忍度(tolerations)等這些技術特性,實現服務的靈活配置。

另外,建議大家要買一些高配置的機器,這些高配置的機器,主要是為了進一步降低碎片。

當然,還要實現對整個叢集硬體的監控,充分利用ECS可以各種複雜的時間規則排程特性(下圖的cron是一個基於時間的作業排程任務),應對高峰流量。

 

接下來,我們更仔細地看看好未來AI中臺是如何解決這些AI部署問題的。

這個頁面是我們的一個Node的服務管理,通過這個業務,我們是可以清晰看到每一個伺服器上面的部署情況,包括資源使用情況、部署哪些pod、哪些節點等等。

 

第二個實際上是AI中臺的服務部署頁面。我們是可以通過壓碼檔案,精準地控制每一個pod的記憶體、CPU、GPU的使用。同時,通過汙點等技術,讓伺服器的多樣化部署得到滿足。

 

根據我們的對比實驗,使用雲原生的方式部署對比使用者自行部署,成本大概節省了65%。而且,這樣的優勢會隨著AI叢集的增長,在經濟收益上和臨時流量擴容上,將會受益更多。

3、AI與雲原生服務治理

接下來再討論一下AI與雲原生的服務治理。

簡單介紹一下什麼叫微服務?其實微服務,只是服務的一種架構風格,它實際上是將單個服務,作為一整套的小型服務開發,然後每一個應用程式都有自己程序去執行,並且通過輕量級的一些,比如說HTTP、API等進行通訊。

 

這些服務,實際上是圍繞著業務本身去構建的,可以通過自動化的部署等手段去集中管理。同時,通過不同的語言去編寫,使用不同的儲存資源。

總結起來微服務有哪些特點?

第一,微服務它足夠小,甚至它只能做一件事情。
第二,微服務是無狀態的。
第三,微服務相互之間是相互獨立的,並且它們是面向介面的。
最後,微服務是高度自治的,每個人只對自己負責。

 

看到這些微服務的特點之後,再去想一想,AI服務與微服務特點,我們發現,AI服務天生適合微服務。每一個微服務,其實本質上只做一件事情。比如OCR,OCR服務,只做OCR服務;ASR,主要做ASR服務。

繼而,每一個AI服務的請求都是獨立的。舉個簡單例子,一個OCR請求和另外一個OCR請求,在本質上是沒有什麼關聯的。

AI服務對橫向擴容是有天生苛求的。為什麼?因為AI服務隊資源的渴求非常大。於是,這種擴容就顯得非常有必要性了。

AI服務之間的依賴性也特別小。比如說像我們的OCR服務,可能對NLP的服務,或者是對其它的AI服務,可能沒有什麼太大的要求。

所有的AI服務,都可以通過寫申明式的HTTP,甚至API的方式,提供AI能力。
進一步去看一下AI服務,會發現,並不能將所有的AI服務進行微服務化。於是,我們做了什麼事?

第一,需要將AI服務做成一個無狀態的服務,這些無狀態服務,都是有畜牲化、無狀態、可丟棄,並且不採用任何的一些磁碟或者記憶體的請求方式,去做一些儲存功能。這樣就可以讓服務部署在任何的一個節點,任何一個地方。

當然,並不是所有的服務都能做到無狀態。如果它有狀態了怎麼辦呢?我們會通過配置中心、日誌中心、Redis、MQ,還有SQL等資料庫,儲存這些請求狀態。同時,確保這些元件的高可靠性。

 

這個就是好未來AI中臺PaaS的整體架構圖。首先可以看一下最外層是服務介面層。最外層介面層是面向外部提供AI能力的。

平臺層裡最重要的層是服務閘道器,主要是負責一些動態路由、流量控制、負載均衡、鑑權等。再往下就是我們的一些服務發現,註冊中心,容錯、配置管理、彈性伸縮等等一些功能。

再下面是業務層,這些業務層就是我們所說的,一些AI的推理服務。

最下面就是阿里雲給我們提供的K8S叢集。

也就是說整體的一個架構是,K8S負責服務部署,SpringCloud負責服務治理。

 

我們是怎麼通過技術手段來實現剛才說的一個整體架構圖?

首先是通過Eureka作為註冊中心,實現分散式系統的服務發現與註冊。通過配置中心Apoll來管理伺服器的配置屬性,並且支援動態更新。閘道器Gateway,可以做到隔離內外層的效果。熔斷Hystrix,主要是分為分時熔斷和數量熔斷,然後保護我們的服務不被阻塞。

負載均衡加上Fegin操作,可以實現整體流量的負載均衡,並且將我們的Eureka相關注冊資訊進行消費。消費匯流排Kafka是非同步處理的元件。然後鑑權是通過Outh2+RBAC的方法去做的,實現了使用者的登入包括介面的鑑權管理,保證安全可靠。

鏈路追蹤,採用的是Skywalking,通過這種APM的一個架構,我們可以追蹤每一個請求的情況,便於定位和告警每一個請求。

最後日誌系統是通過Filebeat+ES,分散式收集整個叢集的日誌。

 

同時我們也開發了一些自己的服務,比如說部署服務、Contral服務。主要是負責與K8S進行通訊,收集整個K8S叢集裡面服務的服務部署、K8S相關的硬體資訊。

然後告警系統是通過Prometheus+Monitor去做的,可以收集硬體資料,負責資源、業務等相關的告警。

資料服務是主要用於下載,包括資料迴流,然後擷取我們推理場景下的資料情況。

限流服務是限制每個客戶的請求和QPS相關功能。

HPA實際上是最重要的一個部分。HPA不單單隻支援記憶體級別的,或CPU級別的HPA,還支援一些P99、QPS、GPU等相關規則。

最後是統計服務,主要是用於統計相關呼叫量,比如請求等。

 

我們通過一個統一的控制檯,對AI開發者提供了一站式的解決方案,通過一個平臺解決了全部的服務治理問題,提升了運維的工作自動化,讓原來需要幾個人維護的一個AI服務的情況,變成了一個人能夠做到維護十幾個AI服務。

這個頁面展示的就是服務路由、負載均衡、限流相關的配置頁面。

 

這個頁面展示的是我們在介面級別的一些告警,以及部署級別的硬體告警。

 

這是日誌檢索,包括實時日誌相關功能。

 

這個是手動伸縮和自動伸縮操作頁面。其中自動伸縮包括CPU、記憶體級別的HPA,也包括基於相應響應時長制定HPA、定時的HPA。

 

4、K8S與Spring Cloud的有機結合

最後來聊一下K8S與SpringCloud的有機結合。

 

可以看一下這兩張圖。左圖是我們SpringCloud資料中心到路由的圖。右邊是K8S的service到它的pod的圖。

這兩個圖在結構上是非常接近的。我們是怎麼做到呢?實際上是將我們的Application與K8S的service進行繫結,也就是說最終註冊到我們SpringCloud裡面LB的地址,實際上是把它轉成了K8S service的地址。這樣就可以將K8S與SpringCloud結合起來。這是路由級別集合。有了這個集合,就能達到最終的效果

 

SprigCloud它是一個Java的技術語言站。而AI服務的語言是多樣化的,有C++、Java,甚至有PHP。

為了實現跨語言,我們引入了sidecar技術,將AI服務與sidecar通過RPC去通訊,就可以遮蔽語言的特性。

Sidecar主要的功能有,應用服務發現與註冊、路由追蹤、鏈路追蹤,以及健康檢查。

今天我的演講到此結束,非常感謝各位的聆聽。謝謝大