O NVIDIA Device Plugin é um plugin de dispositivo GPU para clusters Kubernetes que gerencia GPUs em cada nó, permitindo que o Kubernetes utilize recursos de GPU com maior eficiência. Este tópico descreve como atualizar e reiniciar o NVIDIA Device Plugin, isolar dispositivos GPU e verificar sua versão nos nós do Alibaba Cloud Container Service for Kubernetes (ACK) em cenários de agendamento exclusivo de GPU.
Notas de uso
Ao implantar o NVIDIA Device Plugin como um DaemonSet, observe o seguinte:
O add-on é instalado automaticamente quando você cria um cluster.
Se você desinstalar este add-on, os nós com aceleração GPU adicionados por dimensionamento não conseguirão reportar seus recursos de GPU corretamente.
A atualização de um cluster de uma versão anterior para a 1.32 também atualiza o NVIDIA Device Plugin de um static pod para um add-on ACK.
O DaemonSet usa um NodeSelector (
ack.node.gpu.schedule=default). Quando um nó com aceleração GPU é adicionado ao cluster, o script ACK que adiciona o nó anexa automaticamente esse rótulo ao nó. O DaemonSet então implanta seu pod no nó com aceleração GPU.
Se um nó executa Ubuntu 22.04 ou Red Hat Enterprise Linux (RHEL) 9.3 64-bit, o NVIDIA Device Plugin pode não funcionar corretamente após a execução do comando
systemctl daemon-reloadousystemctl daemon-reexec. Esse problema ocorre porque o componenteack-nvidia-device-plugindefine a variável de ambienteNVIDIA_VISIBLE_DEVICES=allpara os pods por padrão, o que pode tornar o dispositivo GPU inacessível. Para mais informações, consulte What do I do if the "Failed to initialize NVML: Unknown Error" error occurs when I run a GPU container?.-
Se você atualizar um cluster de uma versão anterior à 1.32 para a versão 1.32 antes de 1º de maio de 2025, o cluster poderá conter NVIDIA Device Plugins implantados tanto como static pods quanto como DaemonSets. Execute o script a seguir para localizar os nós onde o NVIDIA Device Plugin está implantado como um static pod.
#!/bin/bash # Loop through all pods with the component=nvidia-device-plugin label in the kube-system namespace. for i in $(kubectl get po -n kube-system -l component=nvidia-device-plugin | grep -v NAME | awk '{print $1}');do # Check if the pod's configuration source is 'file', which indicates a static pod. if kubectl get po $i -o yaml -n kube-system | grep 'kubernetes.io/config.source: file' &> /dev/null;then # Print the node name if it is a static pod. kubectl get pod $i -n kube-system -o jsonpath='{.spec.nodeName}{"\n"}' fi doneSaída esperada:
cn-beijing.10.12.XXX.XX cn-beijing.10.13.XXX.XXA saída indica que alguns nós ainda têm o NVIDIA Device Plugin implantado como um static pod. Use o comando a seguir para migrar o NVIDIA Device Plugin de um static pod para um DaemonSet.
kubectl label nodes <NODE_NAME> ack.node.gpu.schedule=default Ao atualizar um node pool em um cluster de versão 1.31 ou anterior, o processo também atualiza o NVIDIA Device Plugin e redefine quaisquer configurações não padrão.
Diferenças entre versões
A implementação e as estratégias de gerenciamento do componente ack-nvidia-device-plugin variam conforme a versão do cluster, conforme descrito na tabela a seguir.
|
Recurso |
Versão 1.32 e posteriores |
Versões 1.20 a 1.31 |
|
Método de implantação |
DaemonSet |
static pod |
|
Método de gerenciamento |
Página Add-ons no console ACK |
Manual |
|
Requisito de rótulo do nó |
ack.node.gpu.schedule=default |
Nenhum |
|
Estratégia de atualização do node pool |
Atualização manual |
Atualização automática |
Se a versão do seu cluster for anterior à 1.20, recomendamos que você manually upgrade the cluster .
Pré-requisitos
Acesse o ACK console. No painel de navegação à esquerda, clique em Clusters.
Use kubectl to connect to the cluster in Workbench or CloudShell.
Verificar a versão do NVIDIA device plugin
Version 1.32 and later
Para add-ons implantados como DaemonSet, acesse a página Add-ons no console ACK, localize o add-on ack-nvidia-device-plugin e visualize sua versão no card do add-on.
Versions 1.20 to 1.31
Para add-ons implantados como static pod, execute o comando a seguir para verificar a versão do add-on.
kubectl get pods -n kube-system -l component=nvidia-device-plugin \
-o jsonpath='{range .items[*]}{.spec.containers[0].image}{"\t"}{.spec.nodeName}{"\n"}{end}' \
| awk -F'[:/]' '{split($NF, a, "-"); print a[1] "\t" $0}' \
| sort -k1,1V \
| cut -f2- \
| awk -F'\t' '{split($1, img, ":"); print img[NF] "\t" $2}'
Atualizar o NVIDIA device plugin
-
Atualize o add-on ack-nvidia-device-plugin.
Version 1.32 and later
Acesse o ACK console. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Add-ons.
Na página Add-ons, localize o card ack-nvidia-device-plugin e clique em Upgrade.
Na caixa de diálogo exibida, clique em OK.
Versions 1.20 to 1.31
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em .
-
Selecione os nós com aceleração GPU que deseja gerenciar, clique em Batch Operations na parte inferior da lista de nós, selecione Run Shell Scripts na caixa de diálogo Batch Operations e clique em OK.
ImportanteRecomendamos que você primeiro atualize o GPU device plugin em um número reduzido de nós com aceleração GPU. Após verificar que o plugin funciona conforme o esperado, realize a atualização nos nós restantes.
Você será redirecionado para o console do CloudOps Orchestration Service (OOS). Defina Execution Mode como Paused Upon Failure e clique em Next: Parameter Settings.
-
Na página de configurações de parâmetros, selecione Run Shell Script e cole o script de exemplo a seguir.
NotaDefina o parâmetro
RUN_PKG_VERSIONno script com o número de versão principal do cluster (por exemplo, 1.30). Não insira o número de versão secundário (por exemplo, 1.30.1), pois o script retornará um erro.No script, altere o parâmetro
REGION_IDpara o ID de região do cluster atual, por exemplo, cn-beijing.
#!/bin/bash set -xe # Set the Kubernetes major version. RUN_PKG_VERSION=1.30 # Set the region ID. REGION_ID=cn-beijing function update_device_plugin() { base_dir=/tmp/update_device_plugin rm -rf $base_dir mkdir -p $base_dir cd $base_dir region_id=$REGION_ID PKG_URL=https://aliacs-k8s-${region_id}.oss-${region_id}-internal.aliyuncs.com/public/pkg/run/run-${RUN_PKG_VERSION}.tar.gz curl -sSL --retry 3 --retry-delay 2 -o run.tar.gz $PKG_URL tar -xf run.tar.gz local dir=pkg/run/$RUN_PKG_VERSION/module # Replace the image registry address. sed -i "s@registry.cn-hangzhou.aliyuncs.com/acs@registry-${region_id}-vpc.ack.aliyuncs.com/acs@g" $dir/nvidia-device-plugin.yml mkdir -p /etc/kubernetes/device-plugin-backup mkdir -p /etc/kubernetes/manifests # Back up the old configuration file. mv /etc/kubernetes/manifests/nvidia-device-plugin.yml /etc/kubernetes/device-plugin-backup/nvidia-device-plugin.yml.$(date +%s) sleep 5 # Copy the new configuration file. cp -a $dir/nvidia-device-plugin.yml /etc/kubernetes/manifests echo "succeeded to update device plugin" } # Check if the nvidia-device-plugin.yml file exists. if [ -f /etc/kubernetes/manifests/nvidia-device-plugin.yml ]; then update_device_plugin else echo "skip to update device plugin" fi -
Clique em Next: Confirm. Após confirmar as informações, clique em Create.
Após a criação da tarefa, você será redirecionado automaticamente para a página Task Execution Management, onde poderá visualizar o status de execução da tarefa. A atualização foi bem-sucedida se o campo Output exibir
succeeded to update device plugin.
-
Verifique se o add-on funciona conforme o esperado.
Execute os comandos a seguir para verificar se o GPU device plugin está funcionando corretamente no nó com aceleração GPU.
Use kubectl to connect to the cluster in Workbench or CloudShell.
-
Execute o comando a seguir para verificar se o NVIDIA Device Plugin foi reiniciado:
kubectl get po -n kube-system -l component=nvidia-device-pluginA coluna AGE na saída de exemplo indica se o pod foi reiniciado.
NAME READY STATUS RESTARTS AGE nvidia-device-plugin-xxxx 1/1 Running 1 1m -
Após todos os pods reiniciarem, execute o script a seguir para verificar se os nós estão reportando recursos de GPU:
#!/bin/bash # Get all NVIDIA Device Plugin pods and their corresponding nodes. PODS=$(kubectl get po -n kube-system -l component=nvidia-device-plugin -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.nodeName}{"\n"}{end}') # Iterate through each pod's node. echo "$PODS" | while IFS=$'\t' read -r pod_name node_name; do # Get the allocatable nvidia.com/gpu resource value for the node. gpu_allocatable=$(kubectl get node "$node_name" -o jsonpath='{.status.allocatable.nvidia\.com/gpu}' 2>/dev/null) # Check if the resource value is 0. if [ "$gpu_allocatable" == "0" ]; then echo "Error: node=$node_name, pod=$pod_name, resource(nvidia.com/gpu) is 0" fi doneSe um nó reportar zero recursos, consulte Restart the NVIDIA Device Plugin.
Reiniciar o NVIDIA device plugin
Nos cenários de agendamento exclusivo de GPU no ACK, o device plugin que reporta os dispositivos GPU em um nó é implantado como um pod por padrão. Portanto, reinicie o plugin diretamente no nó de destino.
Version 1.32 and later
-
Execute o comando a seguir para localizar o pod do device plugin no nó correspondente.
kubectl get pod -n kube-system -l component=nvidia-device-plugin -o wide | grep <NODE> -
Execute o comando a seguir para reiniciar o pod do device plugin correspondente.
kubectl delete po <DEVICE_PLUGIN_POD> -n kube-system
Versions 1.20 to 1.31
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em .
-
Na página Node Pools, clique no nome do node pool para acessar a página de gerenciamento de nós e, em seguida, faça login no nó com aceleração GPU de destino.
Se o sistema operacional for ContainerOS, o login direto de usuário é desabilitado por padrão para reduzir riscos de segurança, e o login via SSH não é fornecido. Caso ainda precise acessar uma instância para operações de O&M, consulte O&M for ContainerOS nodes .
-
Selecione os nós com aceleração GPU que deseja gerenciar, clique em Batch Operations na parte inferior da lista de nós, selecione Execute Shell Command na caixa de diálogo Batch Operations e clique em OK.
ImportanteRecomendamos que você primeiro reinicie o device plugin em um número reduzido de nós com aceleração GPU. Após verificar que o plugin funciona conforme o esperado, realize o reinício nos nós restantes.
Você será redirecionado para o console OOS. Defina Execution Mode como Paused Upon Failure e clique em Next: Parameter Settings.
-
Na página de configurações de parâmetros, selecione Run Shell Script e cole o script de exemplo a seguir.
#!/bin/bash set -e # Check if the nvidia-device-plugin.yml file exists. if [ -f /etc/kubernetes/manifests/nvidia-device-plugin.yml ]; then # Move the file to restart the static pod. cp -a /etc/kubernetes/manifests/nvidia-device-plugin.yml /etc/kubernetes rm -rf /etc/kubernetes/manifests/nvidia-device-plugin.yml sleep 5 mv /etc/kubernetes/nvidia-device-plugin.yml /etc/kubernetes/manifests echo "the nvidia device is restarted" else echo "no need to restart nvidia device plugin" fi Clique em Next: Confirm. Após confirmar as informações, clique em Create. Você será redirecionado para a página Task Execution Management, onde poderá visualizar o status da tarefa.
-
Execute o comando a seguir para verificar se o GPU device plugin está funcionando corretamente no nó com aceleração GPU.
kubectl get nodes <NODE_NAME> -o jsonpath='{.metadata.name} ==> nvidia.com/gpu: {.status.allocatable.nvidia\.com/gpu}'Saída esperada:
cn-hangzhou.172.16.XXX.XX ==> nvidia.com/gpu: 1Um valor diferente de zero para o recurso estendido
nvidia.com/gpuem um nó com aceleração GPU indica que o Device Plugin está funcionando corretamente.
Modificar a chave de checkpoint do device plugin
Ao alocar um dispositivo para um pod, o device plugin cria um arquivo de checkpoint no nó que registra quais dispositivos estão alocados para quais pods. Por padrão, o NVIDIA Device Plugin usa o UUID da GPU como chave exclusiva de cada dispositivo GPU no arquivo de checkpoint. Altere essa chave para o índice do dispositivo a fim de resolver problemas como perda de UUID após uma migração a frio de VM.
Version 1.32 and later
-
Execute o comando a seguir para editar o DaemonSet do NVIDIA Device Plugin.
kubectl edit ds -n kube-system ack-nvidia-device-plugin -
Adicione a variável de ambiente
CHECKPOINT_DEVICE_ID_STRATEGY.env: - name: CHECKPOINT_DEVICE_ID_STRATEGY value: index Restart the NVIDIA Device Plugin para aplicar as alterações.
Versions 1.20 to 1.31
Verifique a tag de imagem no arquivo
/etc/kubernetes/manifests/nvidia-device-plugin.ymlno nó de destino. A tag indica a versão do Device Plugin. Se a versão for 0.9.3 ou posterior, nenhuma ação é necessária. Caso contrário, atualize a versão parav0.9.3-0dd4d5f5-aliyun.-
Modifique as variáveis de ambiente do static pod no arquivo
/etc/kubernetes/manifests/nvidia-device-plugin.yml. Consulte o código a seguir para adicionar a variável de ambienteCHECKPOINT_DEVICE_ID_STRATEGY.env: - name: CHECKPOINT_DEVICE_ID_STRATEGY value: index Restart the NVIDIA Device Plugin para aplicar as alterações.
Ativar o isolamento de dispositivos GPU
O isolamento de dispositivos GPU é suportado apenas no nvidia-device-plugin v0.9.1 ou posterior. Para mais informações, consulte Check the NVIDIA Device Plugin Version.
Nos cenários de agendamento exclusivo de GPU no ACK, pode ser necessário isolar um dispositivo GPU em um nó devido a uma falha ou outros motivos. O ACK fornece um mecanismo para isolar manualmente um dispositivo e impedir que o scheduler atribua novos pods de aplicações GPU a esse dispositivo. Siga estas etapas:
No nó de destino, gerencie o arquivo unhealthyDevices.json no diretório /etc/nvidia-device-plugin/. Se este arquivo não existir, crie-o. O arquivo unhealthyDevices.json deve estar no seguinte formato JSON. O array pode conter múltiplas chaves de checkpoint de dispositivo. Adicione as chaves conforme necessário.
{
"index": ["x", "x"],
"uuid": ["xxx", "xxx"]
}
Insira o index ou o uuid do dispositivo de destino para isolamento no arquivo JSON. É necessário inserir apenas um dos dois para cada dispositivo. As alterações entram em vigor automaticamente após salvar o arquivo.
Após concluir a configuração, verifique o número de recursos nvidia.com/gpu reportados pelo nó Kubernetes para confirmar o efeito do isolamento.
Montar dispositivos GDR e ativar aceleração de cópia de memória GPU
Requisitos
A partir da v0.5.0, o ack-nvidia-device-plugin suporta a montagem de dispositivos GDR em contêineres GPU. Este recurso exige o seguinte:
A versão do cluster é 1.32 ou posterior.
O nó é um nó Lingjun.
-
O software GDR está instalado no nó.
Faça login no nó e execute o comando
lsmod | grep gdrdrvpara verificar se o módulo de kernel GDR está carregado. O exemplo de saída é o seguinte:gdrdrv 196608 0 nvidia 14680064 88 nvidia_uvm,nvidia_peermem,gdrdrv,nvidia_modeset -
O NVIDIA Container Toolkit 1.15.0 ou posterior está instalado no nó.
Verifique a versão fazendo login no nó e executando
nvidia-container-cli --version. Veja a seguir um exemplo de saída:cli-version: 1.17.8 lib-version: 1.17.8
Ativar a aceleração GDR
Acesse o ACK console. No painel de navegação à esquerda, clique em Clusters.
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em Add-ons .
Na página Add-ons, localize o card ack-nvidia-device-plugin e clique em Configuration.
Na caixa de diálogo exibida, selecione Enable GDRCopy for GPU memory copy acceleration (takes effect on Lingjun nodes with GDR software installed and nvidia-container-toolkit version >= 1.15.0).
Verificar o resultado
Na página Clusters, clique no nome do seu cluster. No painel de navegação à esquerda, clique em .
-
Na página Deployments, clique em Create from YAML. Use o código de exemplo a seguir para criar uma aplicação.
apiVersion: v1 kind: Pod metadata: name: tensorflow-mnist namespace: default spec: containers: - image: registry.cn-beijing.aliyuncs.com/acs/tensorflow-mnist-sample:v1.5 name: tensorflow-mnist command: - python - tensorflow-sample-code/tfjob/docker/mnist/main.py - --max_steps=100000 - --data_dir=tensorflow-sample-code/data resources: limits: nvidia.com/gpu: 1 # Request one GPU card for this container. workingDir: /root restartPolicy: Always -
Execute o comando a seguir para acessar o pod:
kubectl exec -ti tensorflow-mnist -- ls /dev/gdrdrvSaída esperada:
/dev/gdrdrvA saída indica que o dispositivo gdrdrv foi montado com sucesso.
Perguntas frequentes
Desativar o recurso nativo de isolamento de GPU
Contexto
Quando uma GPU em um nó apresenta falha, o ACK isola automaticamente a GPU defeituosa usando o NVIDIA Device Plugin para impedir que o scheduler atribua tarefas a ela. No entanto, esse isolamento automático não realiza um reparo automático. Ainda é necessário reiniciar ou reparar o nó manualmente. Recomendamos que você configure alertas para exceções de GPU a fim de tratá-las prontamente. Para mais informações sobre o recurso nativo de isolamento de GPU do NVIDIA Device Plugin, consulte k8s-device-plugin.
Após o isolamento, se o nó tiver GPUs insuficientes para os requisitos de uma tarefa (por exemplo, uma tarefa precisa de oito cards, mas apenas sete estão disponíveis), o scheduler não consegue alocar a tarefa naquele nó, deixando recursos de GPU ociosos.
Quando o status da GPU volta ao normal, o sistema remove automaticamente o isolamento do dispositivo.
Caso seja necessário desativar o isolamento automático para que o nó continue reportando recursos de GPUs defeituosas, consulte a solução a seguir.
Solução
-
Confirme se o recurso nativo de isolamento de GPU está ativado no add-on.
Se não estiver ativado, as etapas subsequentes de desativação não são necessárias.
Version 1.32 and later
Acesse o ACK console e verifique a versão do ack-nvidia-device-plugin na página Add-ons do cluster de destino. Se a versão for v0.1.0, o recurso de isolamento de GPU está ativado.
Versions 1.20 to 1.31
Use kubectl to connect to the cluster in Workbench or CloudShell.
-
Verifique se o NVIDIA Device Plugin tem o isolamento de GPU ativado.
check_gpu_isolation_enabled() { echo "Checking nodes with NVIDIA Device Plugin deployed as static pods that have GPU isolation enabled (i.e., DP_DISABLE_HEALTHCHECKS is not set to 'all')..." # Get pod names with the expected label. pods=$(kubectl get pods -n kube-system -l component=nvidia-device-plugin --no-headers -o custom-columns=":metadata.name" 2>/dev/null) if [ -z "$pods" ]; then echo "No pods found with label 'component=nvidia-device-plugin'." return 0 fi found=0 while IFS= read -r pod; do [ -z "$pod" ] && continue # Check if it's a static pod: annotation kubernetes.io/config.source must be "file". config_source=$(kubectl get pod "$pod" -n kube-system -o jsonpath='{.metadata.annotations.kubernetes\.io/config\.source}' 2>/dev/null) if [ "$config_source" != "file" ]; then # Not a static pod (e.g., managed by a DaemonSet), skip. continue fi # Get node name. node=$(kubectl get pod "$pod" -n kube-system -o jsonpath='{.spec.nodeName}' 2>/dev/null) [ -z "$node" ] && continue # Check if DP_DISABLE_HEALTHCHECKS is set to "all". disabled_value=$(kubectl get pod "$pod" -n kube-system -o jsonpath='{range .spec.containers[*]}{range .env[?(@.name=="DP_DISABLE_HEALTHCHECKS")]}{.value}{"\n"}{end}{end}' 2>/dev/null | head -n1) # If not set or not equal to "all", health checks are active, which means isolation is enabled. if [ -z "$disabled_value" ] || [ "$disabled_value" != "all" ]; then echo "Node: $node, Static Pod: $pod" found=1 fi done <<< "$pods" if [ "$found" -eq 0 ]; then echo "No static pods found with GPU isolation enabled." else echo "Note: The above nodes will automatically isolate faulty GPUs via the NVIDIA Device Plugin." fi } check_gpu_isolation_enabledSaída esperada:
Checking nodes with NVIDIA Device Plugin deployed as static pods that have GPU isolation enabled (i.e., DP_DISABLE_HEALTHCHECKS is not set to 'all')... Node: cn-beijing.192.168.XXX.XXX, Static Pod: nvidia-device-plugin-cn-beijing.192.168.XXX.XXX Note: The above nodes will automatically isolate faulty GPUs via NVIDIA Device Plugin.Se a saída contiver
Note: The above nodes will automatically isolate faulty GPUs via NVIDIA Device Plugin., o recurso de isolamento de GPU está ativado.
-
Desative o recurso de isolamento de GPU atualizando o add-on.
O recurso nativo de isolamento de GPU é desativado por padrão na versão mais recente do add-on NVIDIA Device Plugin. Upgrade the NVIDIA Device Plugin para a versão mais recente e aplicar essa alteração.
Tópicos relacionados
Para o histórico de alterações do add-on, consulte ack-nvidia-device-plugin.
Se você encontrar problemas com nós com aceleração GPU, consulte Diagnose GPU-accelerated node issues e GPU FAQ.
Para informações sobre agendamento compartilhado de GPU, consulte Shared GPU scheduling.