在某些情境下,您可能需要多個模型推理任務共用同一塊GPU以提高GPU的利用率。本文介紹如何使用Arena提交一個GPU共用模型推理任務。
前提條件
已建立ACK Pro版叢集,且叢集的Kubernetes版本大於等於1.18.8。具體步驟,請參見建立ACK Pro版叢集。
已安裝Arena用戶端,且版本大於等於0.5.0。具體操作,請參見配置Arena用戶端。
操作步驟
執行以下命令檢查叢集可用的GPU資源。
arena top node系統輸出類似以下結果:
NAME IPADDRESS ROLE STATUS GPU(Total) GPU(Allocated) cn-beijing.192.168.1.108 192.168.20.255 <none> Ready 0 0 cn-beijing.192.168.8.10 192.168.8.10 <none> Ready 0 0 cn-beijing.192.168.1.101 192.168.1.101 <none> Ready 1 0 cn-beijing.192.168.1.112 192.168.1.112 <none> Ready 1 0 cn-beijing.192.168.8.252 192.168.8.252 <none> Ready 1 0 --------------------------------------------------------------------------------------------------- Allocated/Total GPUs In Cluster: 0/3 (0.0%)從以上輸出結果,可以看到叢集共有3塊GPU,已使用0塊,使用率為0.0%。
使用Arena提交推理任務。
重要本樣本提交一個Tensorflow類型的推理任務。訓練模型已在製作Docker鏡像時添加到鏡像中。
如果您沒有將模型檔案放入鏡像中,需要配置共用儲存。具體操作,請參見配置NAS共用儲存。
使用以下命令,提交一個推理任務:
arena serve tensorflow \ --name=mymnist2 \ --model-name=mnist \ --gpumemory=3 \ --gpucore=10 \ --image=registry.cn-beijing.aliyuncs.com/ai-samples/tensorflow:latest-gpu-mnist \ --model-path=/tfmodel/mnist \ --version-policy=specific:2 --data=mydata=/mnt/data參數解釋如下表所示:
參數
說明
--name指定任務名稱。
--model-name指定模型名稱。
--gpumemory指定申請顯存的大小。例如:一塊GPU有8 GiB顯存,第一個任務使用
--gpumemory=3申請3 GiB顯存,那麼這張卡還剩5 GiB顯存。第二個任務使用--gpumemory=4申請4 GiB顯存,此時這兩個任務都在這塊GPU上運行。--gpucore按百分比指定申請算力的大小。例如:一塊GPU預設有100個算力,第一個任務使用
--gpucore=10申請10%的算力,那麼這張卡還剩90%的算力。第二個任務使用--gpucore=50申請50%的算力,此時這兩個任務都在這塊GPU上運行。--image指定任務所需的鏡像。
--model-path指定模型檔案在任務容器中的存放路徑。
--version-policy指定模型版本,例如:
--version-policy=specific:2表示指定模型版本為2的模型生效(在--model-path指定路徑下存在一個為2的目錄)。--data=mydata指定資料卷的掛載目錄。本樣本為
/mnt/data。執行以下命令,查看所有任務。
arena serve list系統輸出類似以下結果:
NAME TYPE VERSION DESIRED AVAILABLE ADDRESS PORTS mymnist1 Tensorflow 202101162119 1 0 172.16.3.123 GRPC:8500,RESTFUL:8501 mymnist2 Tensorflow 202101191447 1 1 172.16.1.147 GRPC:8500,RESTFUL:8501執行以下命令,查看提交的任務的詳細資料。
arena serve get mymnist2系統輸出類似以下結果:
Name: mymnist2 Namespace: default Type: Tensorflow Version: 202101191447 Desired: 1 Available: 1 Age: 20m Address: 172.16.1.147 Port: GRPC:8500,RESTFUL:8501 GPUMemory(GiB): 3 Instances: NAME STATUS AGE READY RESTARTS GPU(Memory/GiB) NODE ---- ------ --- ----- -------- --------------- ---- mymnist2-202101191447-tensorflow-serving-7f64bf9749-mtnpc Running 20m 1/1 0 3 cn-beijing.192.168.1.112說明當Desired數量與Available數量相等時,代表任務準備就緒。
可選:執行以下命令查看任務日誌。
arena serve logs mymnist2 -t 10說明-t 10表示僅顯示最後10行日誌資訊。系統輸出類似以下結果:
2021-01-18 13:21:58.482985: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:206] Restoring SavedModel bundle. 2021-01-18 13:21:58.483673: I external/org_tensorflow/tensorflow/core/platform/profile_utils/cpu_utils.cc:112] CPU Frequency: 2500005000 Hz 2021-01-18 13:21:58.508734: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:190] Running initialization op on SavedModel bundle at path: /tfmodel/mnist/2 2021-01-18 13:21:58.513041: I external/org_tensorflow/tensorflow/cc/saved_model/loader.cc:277] SavedModel load for tags { serve }; Status: success: OK. Took 798017 microseconds. 2021-01-18 13:21:58.513263: I tensorflow_serving/servables/tensorflow/saved_model_warmup_util.cc:59] No warmup data file found at /tfmodel/mnist/2/assets.extra/tf_serving_warmup_requests 2021-01-18 13:21:58.513467: I tensorflow_serving/core/loader_harness.cc:87] Successfully loaded servable version {name: mnist2 version: 2} 2021-01-18 13:21:58.516620: I tensorflow_serving/model_servers/server.cc:371] Running gRPC ModelServer at 0.0.0.0:8500 ... [warn] getaddrinfo: address family for nodename not supported 2021-01-18 13:21:58.521317: I tensorflow_serving/model_servers/server.cc:391] Exporting HTTP/REST API at:localhost:8501 ... [evhttp_server.cc : 238] NET_LOG: Entering the event loop ...部署並驗證Tensorflow推理服務。
建立一個
tfserving-test-client.yaml檔案,檔案內容如下。cat <<EOF | kubectl create -f - kind: Pod apiVersion: v1 metadata: name: tfserving-test-client spec: containers: - name: test-client image: registry.cn-beijing.aliyuncs.com/ai-samples/tensorflow-serving-test-client:curl command: ["sleep","infinity"] imagePullPolicy: IfNotPresent EOF執行以下命令,建立Pod。
kubectl apply -f tfserving-test-client.yaml執行以下命令,擷取訪問IP和連接埠。
arena serve list系統輸出類似以下結果,其中
mymnist2的IP為172.16.1.147,連接埠為8501。NAME TYPE VERSION DESIRED AVAILABLE ADDRESS PORTS mymnist1 Tensorflow 202101162119 1 0 172.16.3.123 GRPC:8500,RESTFUL:8501 mymnist2 Tensorflow 202101191447 1 1 172.16.1.147 GRPC:8500,RESTFUL:8501執行以下命令,驗證Tensorflow推理服務是否可用。
kubectl exec -ti tfserving-test-client bash validate.sh 172.16.1.147 8501系統輸出類似以下結果。
{ "predictions": [[2.04608277e-05, 1.72721537e-09, 7.74099826e-05, 0.00364777911, 1.25222937e-06, 2.27521796e-05, 1.14668763e-08, 0.99597472, 3.68833389e-05, 0.000218785644] ] }從以上輸出的返回資料可知:
validate.sh指令碼中包含請求的資料實際上是mnist測試資料集中某張圖片的像素列表。模型在所有個位元(0~9)的資料中以最高機率(0.99597472)將輸入資料預測為“7”。