O Lingjun Runtime Kit oferece alocação de GPU inteira, fatiamento, solicitações multi-GPU e agendamento com reconhecimento de topologia para recursos de GPU e PPU no Kubernetes. Este tópico descreve a sintaxe YAML para cada cenário e como consumir métricas de monitoramento.
Preview público: Este product está atualmente em preview público. Se você tiver dúvidas ou sugestões, envie um ticket.
1. Pré-requisitos
Antes de utilizar este guia, confirme que o cluster seguiu Deployment and release guide para concluir a implantação com um clique em Section 3.3 e passou na verificação de implantação em Section 3.4:
O nó de destino possui o rótulo
lj_runtimekit_enable=truee os recursos do Runtime Kit estão ativados no nó (consulte 3.5 Enable and disable features).O Device Plugin e o Scheduler Framework estão implantados e funcionando corretamente, e os recursos do nó são reportados (consulte 3.4 Verify the deployment).
A RuntimeClass
lj-runtimefoi criada no cluster e o handler de runtime correspondente está registrado no containerd do nó (consulte 3.2 Pre-deployment tasks, Etapa 5).Caso utilize agendamento de topologia gang entre nós e seu cluster não ofereça capacidades nativas de gang scheduling, instale o JobSet. O JobSet fornece semântica de grupo de Pods para o gang scheduling, garantindo que jobs de treinamento multinó iniciem e parem simultaneamente.
2. Modelo de recursos
O Device Plugin reporta os seguintes recursos estendidos ao cluster. Especifique-os em resources.limits do Pod (recursos estendidos exigem apenas limits, não requests):
|
Nome do recurso |
Finalidade |
Exemplo de uso |
|
|
Fatiamento de poder computacional por divisão de tempo |
|
|
|
Fatiamento de memória da GPU |
|
|
|
Particionamento espacial MIG |
|
|
|
GPU inteira (agnóstico a fornecedor) |
|
|
|
GPU inteira (compatível com a comunidade) |
|
|
|
Chave para ativar a montagem de NIC RDMA |
|
Observação:
gpu-sliceaceita os valores 1, 2, 3, 4 e 7, que correspondem aos perfis padrão da NVIDIA Multi-Instance GPU (MIG). Atualmente, o MIG suporta os modelos de placa A100 e H800.aliyun.com/gpué um nome de recurso de GPU inteira agnóstico a fornecedor. Para agendar um Pod em um nó com placas aceleradoras de um fabricante específico, personalize os rótulos do nó e utilize-os junto com afinidade de nó. Por exemplo, adicione o rótuloaccelerator/vendor=ppua um nó (kubectl label node <node-name> accelerator/vendor=ppu) e depois especifique o rótulo no Pod usando nodeSelector. Jánvidia.com/gpué o nome de recurso padrão da comunidade, utilizado exclusivamente para cenários de GPU NVIDIA inteira.A tabela anterior lista os nomes de recursos padrão. Para personalizar o prefixo do nome do recurso e adequá-lo às convenções de nomenclatura da sua plataforma, atualize também as configurações dos três componentes: Device Plugin, Scheduler Framework e Exporter (para mais informações, consulte Customize open source components).
Pods que utilizam as capacidades de agendamento do Lingjun exigem duas definições:
spec:
schedulerName: lj-runtimekit-scheduler # Uses the Lingjun scheduler to allocate sliced resources
runtimeClassName: lj-runtime # So that GPU and PPU devices are correctly injected into the container
Pods que não especificam schedulerName são gerenciados pelo agendador padrão, que não reconhece recursos de fatiamento de GPU.
3. Cenários de solicitação de recursos
3,1 Alocação de GPU inteira
Para solicitar uma GPU inteira, especifique apenas recursos de GPU inteira. Não é necessário definir poder computacional ou memória da GPU:
apiVersion: v1
kind: Pod
metadata:
name: whole-card-demo
spec:
schedulerName: lj-runtimekit-scheduler
runtimeClassName: lj-runtime
containers:
- name: app
image: <your-image>
resources:
limits:
nvidia.com/gpu: "1" # Whole NVIDIA GPU (the community-compatible resource name). For whole GPUs from other vendors, use aliyun.com/gpu
3,2 Fatiamento de poder computacional por divisão de tempo (TDM)
Especifique duas dimensões independentes: gpu-core (percentual de poder computacional, de 1 a 100) e gpu-memory (memória da GPU, em GiB), combinando-as livremente:
apiVersion: v1
kind: Pod
metadata:
name: tdm-demo
spec:
schedulerName: lj-runtimekit-scheduler
runtimeClassName: lj-runtime
containers:
- name: app
image: <your-image>
resources:
limits:
aliyun.com/gpu-core: "50" # 50% of the computing power of a single GPU
aliyun.com/gpu-memory: "4" # 4 GiB of GPU memory
Importante: Não especifique gpu-core ao usar uma GPU inteira. Deixar esse campo indefinido significa que o limite de poder computacional não está ativo. Definir explicitamente como 0 também não impõe limites, mas isso pode fazer com que o programa de GPU no contêiner apresente comportamento inesperado.
3,3 Particionamento espacial MIG
Antes de usar o particionamento espacial MIG, o administrador do cluster deve ativar o modo MIG na GPU executando o comando nvidia-smi mig no nó. Trata-se de uma alteração de configuração de hardware que exige reinicialização da GPU. Após a ativação do modo MIG, o sistema gerencia automaticamente a criação e a recuperação das instâncias. Quando um Pod inicia, uma instância MIG é criada conforme as especificações solicitadas. Ao destruir o Pod, a instância é recuperada automaticamente, sem necessidade de intervenção manual.
apiVersion: v1
kind: Pod
metadata:
name: mig-demo
spec:
schedulerName: lj-runtimekit-scheduler
runtimeClassName: lj-runtime
containers:
- name: app
image: <your-image>
resources:
limits:
aliyun.com/gpu-slice: "3" # A MIG instance with three shares of computing power
aliyun.com/gpu-memory: "4" # 4 GiB of GPU memory
gpu-slice aceita os valores 1, 2, 3, 4 e 7. O MIG suporta atualmente apenas os modelos de placa A100 e H800. Para PPU, a capacidade equivalente é a tecnologia de particionamento espacial nativa do PPU. Em cenários com PPU, recomendamos priorizar o uso de multiplexação por divisão de tempo (TDM).
3,4 Solicitações multi-GPU homogêneas
As solicitações multi-GPU suportam atualmente apenas configurações homogêneas (cada GPU recebe a mesma alocação de poder computacional e memória). Defina a quantidade de GPUs usando o rótulo de Pod replica e especifique a configuração de recursos para cada GPU em resources.limits:
apiVersion: v1
kind: Pod
metadata:
name: multi-gpu-demo
labels:
replica: "2" # Requests 2 GPUs
spec:
schedulerName: lj-runtimekit-scheduler
runtimeClassName: lj-runtime
containers:
- name: app
image: <your-image>
resources:
limits:
aliyun.com/gpu-core: "50"
aliyun.com/gpu-memory: "4"
3,5 Limitações
Não é possível ativar simultaneamente multiplexação por divisão de tempo (TDM) e particionamento espacial Multi-Instance GPU (MIG) na mesma GPU.
O TDM é compatível com todas as séries de GPUs NVIDIA e com PPU. Placas AMD suportam apenas GPUs inteiras, sem suporte a fatiamento.
A memória da GPU é especificada em GiB ou MiB. No modo MiB, a granularidade mínima é de 128 MiB.
4. Agendamento com reconhecimento de topologia (PPU)
O agendamento com reconhecimento de topologia seleciona a combinação ideal de dispositivos para solicitações multi-GPU com base na topologia física. Atualmente, há suporte para PPU 810E e PPU M890P. Os componentes coletam e reportam as informações de topologia automaticamente, sem necessidade de configuração adicional. Basta especificar os recursos seguindo as regras abaixo.
4,1 Agendamento de topologia multi-GPU intra-nó
PPU 810E: Essa funcionalidade entra em vigor automaticamente quando você solicita aliyun.com/gpu e a quantidade de GPUs é 2, 4 ou 8. O agendador prioriza as GPUs mais interconectadas dentro do mesmo grupo de topologia. Para cenários RDMA, solicite também aliyun.com/rdma.
spec:
schedulerName: lj-runtimekit-scheduler
runtimeClassName: lj-runtime
containers:
- name: train
image: <your-training-image>
resources:
limits:
aliyun.com/gpu: "4" # Requests 4 whole PPU 810E GPUs; topology optimization is applied automatically
PPU M890P (afinidade conjunta GPU-RDMA): Em resources.limits, solicite aliyun.com/gpu (qualquer inteiro de 1 a 8) e aliyun.com/rdma: "1" simultaneamente para habilitar esse recurso. O agendador aloca as GPUs e as NICs RDMA no mesmo domínio PCIe como um grupo, aplicando fallback em quatro níveis na ordem switch PCIe → nó NUMA → soquete CPU → entre soquetes, do mais próximo ao mais distante. aliyun.com/rdma funciona como chave para ativar o caminho de afinidade de topologia e não representa a quantidade de NICs. O Device Plugin monta automaticamente os dispositivos RDMA correspondentes no contêiner. A comunicação RDMA requer hostNetwork: true.
spec:
schedulerName: lj-runtimekit-scheduler
runtimeClassName: lj-runtime
hostNetwork: true
containers:
- name: training
image: <your-training-image>
resources:
limits:
aliyun.com/gpu: "4"
aliyun.com/rdma: "1"
4,2 Agendamento de topologia gang entre nós
Para treinamento distribuído em vários nós, envie seu job por meio do JobSet para acionar essa funcionalidade. O agendador identifica automaticamente os Pods do mesmo JobSet como um único grupo de agendamento e aloca nós com base na afinidade de topologia de rede. Convenções principais:
Nos rótulos do modelo de Pod, defina
aliyun.com/min-member: "N". O valor deve ser igual aparallelism(quantidade total de Pods no grupo).Em uma configuração típica,
parallelism=completions=aliyun.com/min-member.Para comunicação RDMA, defina
hostNetwork: truee adicione a capacidadeIPC_LOCK. Caso contrário, o registro de memória RDMA falhará.
Comportamento do agendador: O agendador prefere posicionar os membros do grupo nos nós com menor distância de comunicação de rede (mesmo nó > mesmo HyperNode > mesmo switch leaf > mesmo network-pod). O agendamento segue a lógica "tudo ou nada": se nem todos os membros do grupo estiverem prontos em até 180 segundos, todo o grupo é revertido e tentado novamente. Se os recursos totais dentro do domínio network-pod forem insuficientes para acomodar todo o grupo, todos os membros permanecem em Pending.
Exemplo (treinamento distribuído gang entre nós com 7 workers, apenas partes principais):
apiVersion: jobset.x-k8s.io/v1alpha2
kind: JobSet
metadata:
name: gang-nccl-test
spec:
replicatedJobs:
- name: worker
template:
spec:
completionMode: Indexed
parallelism: 7
completions: 7
backoffLimit: 2
template:
metadata:
labels:
app: gang-nccl-test
aliyun.com/min-member: "7" # The number of gang group members, equal to parallelism
spec:
schedulerName: lj-runtimekit-scheduler
runtimeClassName: lj-runtime
hostNetwork: true
containers:
- name: trainer
image: <your-training-image>
resources:
limits:
aliyun.com/gpu: "1"
aliyun.com/rdma: "1"
securityContext:
capabilities:
add: ["IPC_LOCK"]
restartPolicy: Never
5. Consumo de métricas de monitoramento
O Exporter expõe métricas de runtime da GPU no formato padrão Prometheus. As métricas usam o prefixo DCGM_FI_* e são compatíveis com o ecossistema de monitoramento NVIDIA DCGM, permitindo reutilizar painéis Grafana e regras de alerta da comunidade. Os dados reais são coletados pelos componentes do Lingjun através da interface de driver subjacente, fornecendo métricas de GPU em nível de contêiner mais granulares do que o DCGM nativo.
Categorias de métricas:
|
Categoria |
Exemplos de métricas |
Granularidade |
|
Hardware de GPU inteira |
Utilização de SM, utilização de memória da GPU, largura de banda de memória da GPU, uso de PCIe/NVLink, temperatura e energia |
GPU inteira |
|
Instâncias fatiadas |
Utilização de tempo da instância e uso de memória da GPU da instância |
Pod |
|
Status de integridade |
Travamentos de driver, erros ECC e exceções P2P/NVLink |
GPU inteira |
Rótulos de métricas: gpu (índice), UUID, modelName (modelo), Hostname, NodeName, pod, namespace e container_name.
Integração com Prometheus: Adicione um alvo de coleta ao prometheus.yml (a porta padrão do Exporter é 9501):
scrape_configs:
- job_name: 'lj-runtimekit-exporter'
static_configs:
- targets: ["<node-ip>:9501"]
Referências:
Definições completas de métricas (80 itens, cobrindo GPU inteira, contêiner, ECC, integridade e outras categorias):
docs/metrics-definition.mdno componente Exporter do repositório open-source.Modelo de painel Grafana: consulte a documentação do componente Exporter no repositório open-source. Importe-o no Grafana clicando em Import.
Exemplos comuns de alertas (status geral de integridade da GPU; valor 0 indica exceção):
# View the health status of a specified node
DCGM_FI_HEALTH_WATCH_OVERALL{NodeName="gpu-node-01"}
# Filter the nodes that have exceptions
DCGM_FI_HEALTH_WATCH_OVERALL == 0
FAQ
Q1: Um contêiner é criado com sucesso, mas o programa de GPU não gera saída por muito tempo
Possíveis causas: O poder computacional foi definido como 0 na solicitação Allocate. Solução: Não especifique o campo de poder computacional ao usar uma GPU inteira. Para limitar o poder computacional, especifique uma porcentagem inteira positiva.
Q2: Um Pod permanece em Pending
Verifique o seguinte: O Pod especifica schedulerName: lj-runtimekit-scheduler. O nó de destino tem o rótulo lj_runtimekit_enable=true e seus recursos foram reportados. Os valores solicitados de poder computacional, memória da GPU e slice são válidos (slice aceita apenas 1, 2, 3, 4 e 7, e o modelo da placa deve ser A100 ou H800). Para mais detalhes sobre solução de problemas no lado da implantação, consulte Deployment and release guide - FAQ.
Apêndice: Referência rápida de YAML
|
Cenário |
Configuração principal |
|
Alocação de GPU inteira |
|
|
Fatiamento por divisão de tempo |
|
|
Particionamento espacial MIG |
|
|
Multi-GPU homogênea |
Rótulo de Pod |
|
Topologia 810E |
|
|
Topologia M890P |
|
|
Gang entre nós |
JobSet + rótulo |
|
Requisitos comuns |
|