iT邦幫忙

2021 iThome 鐵人賽

DAY 7
0
自我挑戰組

少年DevOps的K8s奇怪漂流系列 第 6

Day7-AI Performance

原文寫於2019如無法執行請閱讀官方文件

2. Label and Label Selector

接下來是Label 透過Label我們可以將IO強大的節點分配給Data Base,擁有眾多計算能力的節點分配給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即可。

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

https://ithelp.ithome.com.tw/upload/images/20210914/20098886lRNu6i8qDx.png

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

https://ithelp.ithome.com.tw/upload/images/20210914/20098886JPAQF464QG.png

步驟C:
幫節點貼上GPU=K80標籤Label

https://ithelp.ithome.com.tw/upload/images/20210914/20098886VoeGB9cQKx.png

步驟D:
進入Terminal下kubectl get node會看到兩個node,其一叫gpu-pool是包含gpu的K8s節點
https://ithelp.ithome.com.tw/upload/images/20210914/20098886A3cQ3lmPmv.png

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

https://ithelp.ithome.com.tw/upload/images/20210914/200988867ymAYjGw6W.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/20210914/20098886pUddObeZYF.png

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

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

https://ithelp.ithome.com.tw/upload/images/20210914/20098886lQHufzHyQk.png

kubectl get pods --all-namespaces

https://ithelp.ithome.com.tw/upload/images/20210914/20098886nODXp7Ybtq.png
接著我們用echo $(kubectl describe pods <spark-pod-name> -n <namespace-name> | grep Node:)看Task是否真的跑在GPU節點上

https://ithelp.ithome.com.tw/upload/images/20210914/20098886fP2RBVxJaU.png

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


上一篇
Day6-AI Performance
下一篇
Day8-我要學冨樫
系列文
少年DevOps的K8s奇怪漂流7

尚未有邦友留言

立即登入留言