Ejecute varios servicios de inference en una sola GPU mediante la segmentación de su memoria con la programación compartida de GPU.
Funcionamiento
El complemento de programación compartida de GPU segmenta la memoria de la GPU entre los pods. Cada servicio especifica sus necesidades de memoria mediante el indicador --gpumemory. El programador ubica los pods en el mismo nodo de GPU hasta que la memoria total solicitada alcanza la capacidad física del nodo.
Utilice la programación compartida de GPU cuando maximizar la utilización de la GPU sea más importante que el aislamiento de fallos. Si requiere un aislamiento estricto, utilice nodos de GPU dedicados.
Limitaciones
La memoria total de GPU solicitada por todos los pods en un nodo no debe exceder la memoria física de GPU del nodo.
Los nodos acelerados por GPU utilizan CUDA 11 de forma predeterminada. Esta guía requiere CUDA 12.0 o posterior.
ack-kserve debe estar en Raw Deployment mode.
Requisitos previos
Asegúrese de cumplir con lo siguiente:
Un clúster administrado o dedicado de ACK con nodos acelerados por GPU, que ejecute Kubernetes 1.22 o posterior. Consulte Add GPU-accelerated nodes to a cluster o Create an ACK dedicated cluster with GPU-accelerated nodes.
CUDA 12.0 o posterior en los nodos de GPU. La versión predeterminada es CUDA 11; agregue la etiqueta
ack.aliyun.com/nvidia-driver-version:525.105.17al node pool para usar CUDA 12. Consulte Customize the NVIDIA GPU driver version on nodes.shared GPU scheduling component instalado en el clúster.
Arena client 0.9.15 o posterior. Consulte Configure the Arena client.
cert-manager y ack-kserve instalados, con ack-kserve en Raw Deployment mode.
Paso 1: Preparar los datos del modelo
Almacene el modelo en un bucket de OSS o en un sistema de archivos NAS. Esta guía utiliza OSS. Consulte Use an ossfs 1.0 statically provisioned volume o Mount a statically provisioned NAS volume.
-
Descargue el modelo Qwen1.5-0.5B-Chat.
git lfs install GIT_LFS_SKIP_SMUDGE=1 git clone https://www.modelscope.cn/Qwen/Qwen1.5-0.5B-Chat.git cd Qwen1.5-0.5B-Chat git lfs pull -
Cargue los archivos del modelo en su bucket de OSS.
Consulte Install ossutil .
ossutil mkdir oss://<your-bucket-name>/models/Qwen1.5-0.5B-Chat ossutil cp -r ./Qwen1.5-0.5B-Chat oss://<your-bucket-name>/models/Qwen1.5-0.5B-Chat -
Cree un volumen persistente (PV) con la siguiente configuración.
Configuration item
Value
Persistent volume type
OSS
Name
llm-model
Certificate Access
AccessKey ID y AccessKey secret del bucket de OSS
Bucket ID
El bucket de OSS creado en el paso anterior
OSS path
/Qwen1.5-0.5B-Chat
-
Cree una solicitud de volumen persistente (PVC) vinculada al PV.
Configuration item
Value
Persistent volume claim type
OSS
Name
llm-model
Allocation mode
Seleccione Existing persistent volume
Existing persistent volume
Haga clic en Select Existing persistent volume y seleccione el PV creado en el paso anterior
Paso 2: Desplegar los servicios de inference
Despliegue dos servicios de inference de Qwen, cada uno solicitando 6 GB de memoria de GPU. Solo el parámetro --name difiere entre los comandos.
Inicie el primer servicio:
arena serve kserve \
--name=qwen1 \
--image=kube-ai-registry.cn-shanghai.cr.aliyuncs.com/kube-ai/vllm:0.4.1 \
--gpumemory=6 \
--cpu=3 \
--memory=8Gi \
--data="llm-model:/mnt/models/Qwen1.5-0.5B-Chat" \
"python3 -m vllm.entrypoints.openai.api_server --port 8080 --trust-remote-code --served-model-name qwen --model /mnt/models/Qwen1.5-0.5B-Chat --dtype=half --max-model-len=4096"
Inicie el segundo servicio con --name=qwen2.
Parámetros clave:
|
Parameter |
Type |
Required |
Description |
|
|
Cadena |
Sí |
Nombre del servicio. Debe ser único a nivel global. |
|
|
Cadena |
Sí |
Imagen del contenedor. |
|
|
Entero (GB) |
No |
Asignación de memoria de GPU en GB, por ejemplo |
|
|
Entero |
No |
Cantidad de vCPU. |
|
|
Cadena |
No |
Asignación de RAM, por ejemplo |
|
|
Cadena |
No |
Montaje de PVC a contenedor en formato |
Paso 3: Verificar los servicios de inference
-
Compruebe que ambos pods se estén ejecutando en el mismo nodo de GPU.
kubectl get pod -owide | grep qwenSalida esperada:
qwen1-predictor-856568bdcf-5pfdq 1/1 Running 0 7m10s 10.130.XX.XX cn-beijing.172.16.XX.XX <none> <none> qwen2-predictor-6b477b587d-dpdnj 1/1 Running 0 4m3s 10.130.XX.XX cn-beijing.172.16.XX.XX <none> <none>Ambos pods se ejecutan en el mismo nodo (
cn-beijing.172.16.XX.XX), lo que confirma que el uso compartido de GPU está activo. -
Verifique la memoria de GPU por pod (un comando por servicio):
kubectl exec -it qwen1-predictor-856568bdcf-5pfdq -- nvidia-smi # First service kubectl exec -it qwen2-predictor-6b477b587d-dpdnj -- nvidia-smi # Second serviceSalida esperada para cada pod: Memoria de GPU asignada al primer servicio de inference
Fri Jun 28 06:20:43 2024 +---------------------------------------------------------------------------------------+ | NVIDIA-SMI 535.161.07 Driver Version: 535.161.07 CUDA Version: 12.2 | |-----------------------------------------+----------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+======================+======================| | 0 Tesla V100-SXM2-16GB On | 00000000:00:07.0 Off | 0 | | N/A 39C P0 53W / 300W | 5382MiB / 6144MiB | 0% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ +---------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=======================================================================================| +---------------------------------------------------------------------------------------+Memoria de GPU asignada al segundo servicio de inference
Fri Jun 28 06:40:17 2024 +---------------------------------------------------------------------------------------+ | NVIDIA-SMI 535.161.07 Driver Version: 535.161.07 CUDA Version: 12.2 | |-----------------------------------------+----------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+======================+======================| | 0 Tesla V100-SXM2-16GB On | 00000000:00:07.0 Off | 0 | | N/A 39C P0 53W / 300W | 5382MiB / 6144MiB | 0% Default | | | | N/A | +-----------------------------------------+----------------------+----------------------+ +---------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=======================================================================================| +---------------------------------------------------------------------------------------+Cada pod muestra un límite de 6 GB (6,144 MiB), lo que confirma que el uso compartido de memoria de GPU funciona según la configuración.
-
Envíe una solicitud de prueba a través de la puerta de enlace NGINX Ingress.
curl -H "Host: $(kubectl get inferenceservice qwen1 -o jsonpath='{.status.url}' | cut -d "/" -f 3)" \ -H "Content-Type: application/json" \ http://$(kubectl -n kube-system get svc nginx-ingress-lb -ojsonpath='{.status.loadBalancer.ingress[0].ip}'):80/v1/chat/completions \ -d '{ "model": "qwen", "messages": [{"role": "user", "content": "This is a test."}], "max_tokens": 10, "temperature": 0.7, "top_p": 0.9, "seed": 10 }'Salida esperada:
{"id":"cmpl-bbca59499ab244e1aabfe2c354bf6ad5","object":"chat.completion","created":1719303373,"model":"qwen","choices":[{"index":0,"message":{"role":"assistant","content":"OK. What do you want to test?"},"logprobs":null,"finish_reason":"length","stop_reason":null}],"usage":{"prompt_tokens":21,"total_tokens":31,"completion_tokens":10}}Una respuesta confirma que el servicio de inference funciona correctamente.
(Opcional) Paso 4: Limpieza
Elimine los recursos cuando ya no sean necesarios.
Elimine los servicios de inference:
arena serve delete qwen1
arena serve delete qwen2
Elimine el PVC y el PV:
kubectl delete pvc llm-model
kubectl delete pv llm-model