La programación compartida de GPU permite ejecutar varias tareas de inference en una sola GPU de forma simultánea, lo que mejora la utilización de la GPU. Esta guía le muestra cómo enviar una tarea de inference de TensorFlow mediante Arena con recursos compartidos de GPU.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Un clúster ACK Pro con Kubernetes 1.18.8 o posterior. Consulte Create an ACK Pro cluster
Arena 0.5.0 o posterior instalado. Consulte Configure the Arena client
Funcionamiento de la programación compartida de GPU
Al enviar una tarea de inference con --gpumemory y --gpucore, Arena programa la tarea en una GPU que tenga suficiente memoria libre y potencia de cómputo para atender la solicitud, sin necesidad de asignar una GPU completa.
La siguiente tabla muestra cómo dos tareas pueden compartir una GPU de 8 GiB con 100 unidades de potencia de cómputo:
|
Dimensión del recurso |
Solicitud de la tarea A |
Solicitud de la tarea B |
¿Cabe en una GPU? |
|
Memoria ( |
3 GiB |
4 GiB |
Sí (3 + 4 = 7 GiB, dentro de los 8 GiB) |
|
Potencia de cómputo ( |
10% |
50% |
Sí (10 + 50 = 60%, dentro del 100%) |
--gpucore especifica el porcentaje de potencia de cómputo que se solicita.
Envío de una tarea de inference
Paso 1: Comprobar los recursos de GPU disponibles
Ejecute el siguiente comando para consultar cuántas GPU hay disponibles en el clúster:
arena top node
Salida esperada:
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%)
El clúster cuenta con 3 GPU, todas sin asignar.
Paso 2: Enviar la tarea de inference
Ejecute el siguiente comando para enviar una tarea de inference de TensorFlow:
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
Este ejemplo utiliza un modelo de TensorFlow incluido en la imagen de Docker durante su compilación. Si el archivo del modelo se almacena por separado, móntelo mediante un volumen NAS compartido antes de enviar la tarea. Consulte Configure a shared NAS volume.
La siguiente tabla describe los parámetros clave.
|
Parámetro |
Tipo |
Descripción |
|
|
String |
Nombre de la tarea de inference. |
|
|
String |
Nombre del modelo. |
|
|
Integer (GiB) |
Memoria de GPU que se solicita. |
|
|
Integer (0–100) |
Porcentaje de potencia de cómputo de la GPU que se solicita. |
|
|
String |
Imagen de contenedor utilizada para ejecutar la tarea. |
|
|
String |
Ruta al modelo dentro del contenedor. |
|
|
String |
Versión del modelo que se carga. |
|
|
String |
Montaje de volumen en formato |
Paso 3: Verificar que la tarea se está ejecutando
Ejecute el siguiente comando para listar todas las tareas de inference:
arena serve list
Salida de ejemplo:
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
Ejecute el siguiente comando para obtener detalles de mymnist2:
arena serve get mymnist2
Salida esperada:
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
Si el valor de Desired es igual al valor de Available, la tarea está lista.
Paso 4: (Opcional) Consultar los registros de la tarea
Ejecute el siguiente comando para mostrar las últimas 10 líneas de los registros:
arena serve logs mymnist2 -t 10
Salida de ejemplo:
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 ...
Verificación del servicio de inference
-
Cree un pod de cliente de prueba. Guarde el siguiente contenido como
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 -
Despliegue el pod:
kubectl apply -f tfserving-test-client.yaml -
Obtenga la dirección IP y el puerto del servicio de inference:
arena serve listEn la salida,
mymnist2está disponible en172.16.1.147:8501. -
Envíe una solicitud de prueba para verificar el servicio:
kubectl exec -ti tfserving-test-client bash validate.sh 172.16.1.147 8501Salida esperada:
{ "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] ] }El script
validate.shenvía valores de píxeles de una imagen de prueba MNIST. El modelo predice que los datos de entrada corresponden al dígito 7 entre todos los números de un solo dígito del 0 al 9, con una probabilidad máxima de 0.99597472, lo que confirma que el servicio funciona correctamente.
Pasos siguientes
Para enviar más tareas de inference que compartan la misma GPU, repita el paso 2 con diferentes valores de
--namey ajuste--gpumemoryy--gpucorepara que las solicitudes combinadas no excedan los recursos disponibles de la GPU.