一部のシナリオでは、複数の推論タスク間で GPU を共有して GPU 使用率を向上させたい場合があります。このトピックでは、Arena を使用して共有 GPU リソースを使用する推論タスクを送信する方法について説明します。
前提条件
Container Service for Kubernetes (ACK) Pro マネージドクラスターが作成されており、クラスターの Kubernetes バージョンが 1.18.8 以降であること。詳細については、「ACK Pro マネージドクラスターの作成」をご参照ください。
Arena クライアントがインストールされており、Arena のバージョンが 0.5.0 以降であること。詳細については、「Arena クライアントの設定」をご参照ください。
共有 GPU スケジューリングコンポーネントがインストールされていること。
操作手順
次のコマンドを実行して、クラスターで使用可能な 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 があり、各 GPU の使用率が 0.0% であることを示しています。
Arena を使用して推論タスクを送信します。
重要この例では、TensorFlow 推論タスクを送信します。トレーニングモデルは、イメージの作成時に Docker イメージに追加されています。
モデルファイルがイメージに追加されていない場合は、共有 NAS ボリュームを設定する必要があります。詳細については、「共有 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 メモリの量 (GiB)。たとえば、GPU に 8 GiB のメモリがあるとします。最初のタスクが 3 GiB (
--gpumemory=3) をリクエストすると、5 GiB のメモリが残ります。2 番目のタスクが 4 GiB (--gpumemory=4) をリクエストした場合、両方のタスクを同じ GPU で実行できます。--gpucoreリクエストする計算能力の割合。デフォルトでは、GPU には 100 ユニットの計算能力があります。たとえば、最初のタスクが計算能力の 10% (
--gpucore=10) をリクエストすると、計算能力の 90% が残ります。2 番目のタスクが計算能力の 50% (--gpucore=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 までのすべての一桁の数字の中で 7 であると予測し、その確率は 0.99597472 で最も高くなっています。