Google Cloud 機器學習的客製化
這一篇我們來介紹,來GCP上所有提供的機器學習(後面簡稱ML)的服務都無法符合你的需求時,我們該如何使用GCP上的infrastructure來客製化你的需求呢?我們也會討論到分散式機器與單台機器還有邊緣運算來客製你的ML model. 還有使用硬體加速的方式提增效能。
在這一篇我們會介紹以下幾個當你在GCP上客製化你的ML相關議題
- 分佈式或單一機器的Infrastructure
- 使用硬體加速器
- 使用 edge computing
硬體加速器
積體電路和指令集設計的進步導致了專用的電腦硬體運算器的發展,就是我們大家所熟知的電腦CPU。CPU主要是進行邏輯運算的。但在GCP中還提供了兩種不同的計算功能硬體,分別是
- Graphics processing units(GPUs)
- Tensor processing units(TPUs)
Graphics processing units(GPUs)
GPU是一個擁有多個arithemtic logic units(ALUs)的運算單元,這是可以執行加法與乘法功能。現今的一個GPU裡會有數百個ALUs. 這種架構適合大規模的平行處理作業,像是訓練一個深度模型。GPU 通常將深度學習模型的訓練性能提高 10 倍。
GPU與CPU是共用一種通用的設計模式: 計算估能會使用暫存器或共享memory的方式作為中途計算的結果,這將會導致馮.諾依曼瓶頸,即處理器和memory之間的資料速率有限,所以處理效能很差。這導致了Google設計了TPU。
Tensor processing units(TPUs)
TPU是一種基於ASIC的運算單元,目的是為了加強訓練深度神經網路。TPU是為了TensorFlow 框架所設計的。所以TPU是專屬於Google並且你只能在Google的雲端服務或是Google的 Edge TPU 設備中能使用。
與GPU來比較,TPU實現低於 8 bit的低精度運算。使用這種低精度運算會有很高的throughput。在一項基準測試(benchmark)中,訓練深度神經網路使用一顆TPU將比使用8顆GPU快上27倍。
TPU是設計來可以用在scale horizontally,稱為TPU pods(一群TPU),這是將數百顆TPU同時運作。TPU pod 一個二維網狀網路,將 TPU 呈現為單個可編程資源。
TPU靠著實現處理器中的矩陣乘法來減低馮.諾依曼瓶頸的衝擊。因為TPU是特別的設計使用在深度神經網路上,所以它並不適合用在一般CPU的邏輯運算但是適合比GPU用在需要大規模乘法運算的深度學習模型中。
TPU功能可以被用在GCP的 Compute Engine, Kubernetes Engine, 還有AI engine.
該選 CPUs, GPUs還是TPUs?
這三種運算單位都可以用在ML上,不過Google 提供了一個指引,根據你的workload來做最佳選擇。
GPU被建議用來使用在下面狀況
- Model不是建立在TensorFlow上的
- Model 的source code無法更動或是變動很困難的
- Model的一部分需要靠CPU來運算的
- Model使用TensorFlow來操作但TPU不支援的。支援的操作可以參考這裡。
- 可以用large batch訓練的中型到大型model
TPU被建議用來使用在下面狀況
- Model是使用矩陣乘法的
- 在主要的training loop沒有使用到自定義的TensorFlow操作
- Model需要在CPU 或GPU訓練一周甚至到一個月的
- 在非常大的batch size訓練大型或超大型的model
TPU不建議將用在需要高精度的工作負載。
分佈式或單一機器的Infrastructure
在討論到ML Infrastructure就要分辨我們要用甚麼樣的Infra來做ML training. 由於模型訓練是一種高度密集的運算,如果運算資源足夠就意味著在不同的model狀況下我們可能訓練時間可能只從以天計算減低到以小時計算。實際運作ML models的意思是,當我們部署model到Production開始進行預測作業時,是用到很少的CPU資源的。事實上,廣泛的使用深度學習平台 TensorFlow,包含可以運作在行動裝置與IoT 裝置的ML models的TensorFlow Lite框架。
單一機器模型訓練
當我們訓練小型的model使用單一機器(一台VM)是合適的,特別用在開發階段與使用Jupyter Notebook(或相關工具)的資料探索階段。用單台VM會有其極限,因為CPU, GPU, memory總是會有加到頂的時候。
當然我們在train model時可以將某些負載從CPU轉到GPU。 因為GPU有大頻寬memory與在浮點運算優於CPU的能力。GCP使用的是NVIDA GPUs。 NVIDIA是 CUDA的創造者, 一種能利用GPU特性的平行運算平台。GCP提供的NVIDIA GPU型號可以參考這個網址。
目前Compute Engine在單一台VM最多可以掛上8顆GPU。
分佈式模型訓練
透過一群Server來做model training可以達到服務的scalability與availability。這種分佈式模型訓練有不同的方式來使用這一群Server,並且視你的需求與開發方式來決定。
其中一種方式是用本身就用設計用來使用這種分佈式環境的ML框架。由Google開發的TensorFlow這種深度學習框架(open source),就適合這種方式。例如,TensorFlow同時支援synchronous 與asynchronous training。 synchronous training對所有worker進行不同輸入data subset的訓練,並逐步組合結果。asynchronous training則是workers都是獨立運作並且是非同步的update 變量(variables)。
以下為針對將TensorFlow 策略用在分佈式訓練的範例
Mirrored Strategy 支援同步分佈式在一台有多個GPU上的機器。每一個變量都會被mirror到所有的GPU上。
Central Storage Strategy 同步分佈式訓練但變量不會被mirror到GPU與CPU上
Multi Worker Mirrored Strategy 這個像是mirrored strategy,但是它只用在有多個node(機器)的架構上
TPU strategy 在TPU上進行同步訓練
TensorFlow training可以使用TensorFlow Training Job Customer resource運行在Kubernetes engine上。更多的TensorFlow 分佈式處理模型可以參考這裡。
或者我們也可以使用分佈式基礎建設來建立在平行處理下的多個modles。例如,我們有一個設定成ML tools 的container運行在GKE中。我們可以使用這個container image來產生被train好的model(有著不同的hyperparameter)。每個有著不同的hyperparameter的container就可平行運作。
Serving models
Serving a machine learning model是使model可用於對其他服務進行預測的過程。當serving model時,我們需要記住以下事項
- Latency
- Scalability
- Version management
- Online versus batch prediction
模型預測的延遲在很大程度上取決我們有多少資源來執行模型、模型類型和所需的預處理量。執行模型與訓練模型是有著很大的不同。例如,當要建立一個決策樹,其演算法將會涉及到許多的instance與feature。當這個決策樹開始用來進行預測時,模型是開始使用資料進行一連串的評估進到模型中。評估的數量將會是tree深度的函數,但它所需要的工作量將是遠少於建模的過程。
Serving models來自於集中式地點(類似Data Center)它會產生延遲,因為從輸入資料到最後的結果其過程都需要靠網路傳遞。如果Application需要及時的結果,其服務模式應該是越接近這個Application越好,這種用法就像edge 或IoT device。
Models將需要在workload有需要時能進行擴展。所以這篇文章我們將焦點仿在Compute engine與Kubernete engine。使用Compute engine時,要能達到擴展就需要使用到insatcne group。 Compute Engine將會將會視工作負載來自動scale up / down. Kubernetes engine也是一樣的原則,只不過workload的單位是Pod.
ML models的版本控制其實就像軟體的版控一樣。當我們開始使用模型時,我們也許需要將一部分的traffic路由到新版本的model而其他的traffic仍舊使用舊的版本。這其實就是軟體版控的金絲雀部署,其他的部署方式也有 incremental rollout。
預測推論結果可能來自於batch mode or online mode. Batch mode是一次使用許多instance進行預測推論。這種方式適合我們的預測估工作需要大量的instance而其結果不需要哪麼及時。例如,零售業會使用batch mode的方式來進行預測客戶的流失。這是因為這一類的分類工作不需要哪樣及時,分類出來之後該公司可能會對這一些可能會流失的客戶進行一些產品銷售的工作。
而另一種預測可能就需要online(及時的預測)。例如,信用卡的交易詐欺偵測。在online mode下,model就會要有API介面能夠讓Application呼叫並及時的傳回預測結果。
GCP的 Edge computing
這是讓運算與儲存功能越靠近運算所需的地點,像是工廠或農地。
Edge computing 概觀
一種較早跟概念性與edge computing相近的服務是CDN(content distribution network)。CDN將資料中心的資料存放在靠近外部使用者的位置。關於CDN的概念有興趣的讀者可以Google網路上其他文章,CDN的重點在於當外部大量的User要取用資料時,透過這個機制這些User很夠很快的讀取到(很低的資料延遲)他們要的資料同時又不會造成Data Center機器的大量負擔。而Edge computing也是取自這個概念。
Edge computing devices可以是相對簡單的IoT device,像是有限的運算能力與小量的記憶體。這種device適合處理很小量的資料負載。假如最原始的資料不需要傳送到Data Center或雲端來儲存,哪麼在edge端先處理後再將其決果傳回雲端就可以使用Edge computing device(下圖為一個範例參考)。
Edge computing是使用在處理資料需要有low latency。例如,自駕車或工廠生產設備,edge device可以監控這些設備可能的異常聲音來判斷哪一部分的零件不正常。
Google Cloud 的edge computing 提供 Edge TPU與雲端IoT Edge服務。
Edge computing Components and Processes
Google Cloud IoT edge computing由以下三個基本元件組成
- Edge devices, 與它所處的環境進行互動
- Gateway device, 代表IoT設備處理資料
- Cloud Platform, 如GCP
Edge devices則有三種類型的資料
- Metadata, 像是device ID, 型號與序號
- 關於device的狀態的State information
- Telemetry, 由device所收集的資料
在IoT device進入一個IoT處理系統之前,我們需要對其做provision與configure。 Provisioning包括了bootstrapping這個設備與收集基本的identifying information。從安全角度說,設備應該使用token, key或其他機制來做驗證。該設備也會收到一個授權來定義設備可以進行那些作業。該設備也要能被一個中央設備註冊機制來追蹤。
以上的驗證都完成後,該設備就開始收集資料,資料會被在設備上處理。資料處理包含了轉換資料格式,根據業務規則驗證資料,彙總資料,與用額外的attribute加強資料的內容。
經過本地端的處理後。資料就會用網路的方式傳送到gateway。網路的方式有很多種,可能是一般網路線或是WIFI/藍芽/ZigBee等等的網路協定。最蹤透過TCP/IP網路送回雲端。
在GCP,IoT資料的匯入可以用以下的服務
- Cloud Pub/Sub — 可擴展的資料匯入
- IoT Core MQTT,一種產業標準的Message Telemetry Transport broker
- Stackdriver Monitoring 與Stackdriver Logging, 這個也可能被用來匯入與處理metrics 與log messages.
AI platform (GCP的託管服務)能夠支援將ML Model部署在edge device. 它解決了在edge 端進行預測推論時需要考慮的幾個因素:
- Serving Prediction
- Restricting access to functionality based on authorizations
- Enforcing quotas on users
- Managing API keys
- Deploying New models
AI platform也有API 介面來進行online prediction
Edge TPU
這是Google出的硬體設備,專門用來做edge computing。 Edge TPU可以進行推論功能,所以可以把model放上去跑。這個設備是基於要運行AI服務的application-specific integrated circuit(ASIC)設計,並且使與Cloud TPU與GCP的服務一起運作的。除了硬體部分Edge TPU也包含的軟體與演算法。以下為使用Edge TPU的適合場景:
- 製造環境的影像處理
- 機器人控制
- 時間序列資料的異常偵測
- 聲音辨識與回應
Cloud IoT
這是Google為IoT service推出的託管服務。這個平台可以整合edge computing與集中式處理的服務。資料會被Cloud IoT Core service擷取,之後就將資料推送到Cloud Pub/Sub做streaming分析。也可以被儲存到BigQuery或用來在Cloud ML中訓練ML model。也可以用來觸發Cloud function與相關的workflow。
下圖為Cloud IoT的參考架構