iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 8
1

2. Label and Label Selector

接下來是Label 透過Label我們可以將IO強大的節點分配給Data Source,擁有眾多計算能力的節點分配給AI系統,具體來說我們可以創造一個Label:GPU=K80並把它貼在有K80 GPU的節點上,並在我們Deployment,Statefulset的yaml中添加Label Selector加上GPU=K80字段,那POD運行時K8s系統就會幫我們把POD分配到有Label:GPU=K80的節點上,如果是使用Spark官方提供的bin/spark-submit方法只要在參數加入--conf spark.kubernetes.node.selector.GPU=K80即可。

接著我們就在GCP上進行實作,為了示範方便我們就直接再Web操作而不是使用GCP SDK下指令,不然裝SDK又要一些時間,加上SDK不停改版有些API廢棄了Doc卻沒更新,不熟悉的朋友可能還會跑出一堆Bug。

步驟A:

在IAM申請GPU配額,申請後約1~2個工作天就會收到GCP回應

https://ithelp.ithome.com.tw/upload/images/20190918/20120793Op4LgXPi0c.png

步驟B:

在GKE選GPU加速運算,並點擊更多選項,請注意並不是每個區域都有支援GPU運算

https://ithelp.ithome.com.tw/upload/images/20190918/20120793kx2q3eKAbj.png

步驟C:

幫節點貼上GPU=K80標籤Label

https://ithelp.ithome.com.tw/upload/images/20190918/20120793UZkmOj86on.png

步驟D:

進入Terminal下kubectl get node會看到兩個node,其一叫gpu-pool是包含gpu的K8s節點

https://ithelp.ithome.com.tw/upload/images/20190918/201207938WAlkcOgdi.png

步驟E:

使用kubectl describe node <node-name>就可以看到node貼的標籤

https://ithelp.ithome.com.tw/upload/images/20190918/20120793hGLUMMonZ7.png

步驟F:

在spark-submit加入--conf spark.kubernetes.node.selector.GPU=K80,這樣K8s就會把spark-executor佈署到GPU節點比用Apache Yarn做簡單很多吧!

bin/spark-submit \
    --master <Your K8sMaster IP> \
    --deploy-mode cluster \
    --name spark-pi \
    --class org.apache.spark.examples.SparkPi \
    --conf spark.executor.instances=1 \
    --conf spark.kubernetes.executor.request.cores=10m \
    --conf spark.kubernetes.executor.limit.cores=50m \
    --conf spark.kubernetes.namespace=spark-intern \
    --conf spark.kubernetes.container.image=ted00132/spark:v1 \
    --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark-intern \
    --conf spark.kubernetes.node.selector.GPU=K80 \
    local:///opt/spark/examples/jars/spark-examples_2.11-2.4.3.jar

步驟E:

執行後你會發現Task卡在Pending,這是因為GCP預設有幫GPU節點打上汙點,為什麼GCP要這樣做呢?與汙點的原理/用途?之後會說明,因為Spark官方參數還沒支援汙點容忍Tolerations技術所以我們先用去除汙點的方法

https://ithelp.ithome.com.tw/upload/images/20190918/20120793IXYHoy0VXA.png

kubectl taint nodes <gpu_node_name> nvidia.com/gpu- 

nvidia.com/gpu是key值,而後面-代表刪除汙點

https://ithelp.ithome.com.tw/upload/images/20190918/20120793qofxLcEGyS.png

kubectl get pods --all-namespaces

https://ithelp.ithome.com.tw/upload/images/20190918/201207938l2hPw3LKg.png

接著我們用echo $(kubectl describe pods <spark-pod-name> -n <namespace-name> | grep Node:)看Task是否真的跑在GPU節點上

https://ithelp.ithome.com.tw/upload/images/20190918/20120793M8zCAPSALn.png

運算時間就不寫了,畢竟只有圖類處理的AI演算法在GPU上才會有比較好的效果,而且Spark-pi應該沒支援GPU運算,這篇只是在示範開頭說的如何透過label將算力強大節點分配給特定計算型Task。

---------------------------------------------------回目錄---------------------------------------------------


上一篇
Day7-K8s那些特性可以提升AI系統性能(1)
下一篇
Day9-K8s那些特性可以提升AI系統性能(3)
系列文
公有雲, K8s 的特性改進AI系統以Spark為例32

尚未有邦友留言

立即登入留言