Todos los productos
Search
Centro de documentos

Container Service for Kubernetes:Deploy GPU-shared inference services

Última actualización: Sep 04, 2026

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:

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.

  1. 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
  2. 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
  3. 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

  4. 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

--name

Cadena

Sí

Nombre del servicio. Debe ser único a nivel global.

--image

Cadena

Sí

Imagen del contenedor.

--gpumemory

Entero (GB)

No

Asignación de memoria de GPU en GB, por ejemplo --gpumemory=6 para 6 GB. La suma total de todos los servicios en un nodo no debe exceder la memoria física de la GPU.

--cpu

Entero

No

Cantidad de vCPU.

--memory

Cadena

No

Asignación de RAM, por ejemplo 8Gi.

--data

Cadena

No

Montaje de PVC a contenedor en formato <pvc-name>:<container-path>. En este caso, llm-model se monta en /mnt/models/.

Paso 3: Verificar los servicios de inference

  1. Compruebe que ambos pods se estén ejecutando en el mismo nodo de GPU.

    kubectl get pod -owide | grep qwen

    Salida 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.

  2. 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 service

    Salida 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.

  3. 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