Red Hat · Sessão Técnica

Fatiamento
de GPU.

Como dividir, compartilhar e orquestrar GPUs no OpenShift — time-slicing, MPS, MIG e DRA — e como vLLM e llm-d extraem o máximo de cada fatia.

29 de Agosto de 2026 · Red Hat
Red Hat · Fatiamento de GPU
Agenda

Do silício ao token

Começamos pela anatomia da GPU, passamos por cada técnica de fatiamento e terminamos no serving distribuído de LLMs.

01

Por que fatiar a GPU

Anatomia da GPU, o que uma inferência LLM consome e onde a GPU fica ociosa.

02

Time-slicing e MPS

Compartilhamento por tempo e por processo no NVIDIA GPU Operator — mecânica, configuração e limites.

03

MIG — Multi-Instance GPU

Partição por hardware: perfis, isolamento real, estratégias single/mixed e o mig-manager.

04

DRA — Dynamic Resource Allocation

O novo modelo de alocação do Kubernetes: ResourceSlice, DeviceClass, ResourceClaim e o driver NVIDIA.

05

vLLM

PagedAttention, continuous batching e o Red Hat AI Inference Server sobre qualquer fatia.

06

llm-d

Inferência distribuída: roteamento consciente de KV cache, prefill/decode desagregado e OpenShift AI.

Agenda · Item 01
Por que fatiar · Anatomia

O que existe dentro de uma GPU

1 · Anatomia2 · Inferência LLM3 · O problema→ avança o estágio

Compute + memória + banda. Dezenas de SMs executam kernels em paralelo; a HBM guarda pesos e KV cache; a banda entre eles é o limite físico. Tudo isso é o que vamos fatiar.Duas fases com perfis opostos: o prefill satura os SMs (compute-bound); o decode gera um token por vez relendo os pesos inteiros da HBM (memory-bound). O KV cache cresce com contexto × requisições.Kubernetes só entende inteiros: um pod pede nvidia.com/gpu: 1 e leva a GPU inteira — mesmo usando 20% da memória e uma fração dos SMs. O resto fica ocioso e alguém fica na fila.

GPU · ex.: NVIDIA H100 80 GB SMs · unidades de compute (132 no H100) L2 cache HBM 80 GB memória banda de memória ≈ 3,3 TB/s · NVLink entre GPUs ≈ 900 GB/s · PCIe para o host Três recursos, um só contador SMs: onde os kernels executam (compute) HBM: pesos do modelo + KV cache + ativações Banda: quantos bytes/s saem da HBM para os SMs Para o Kubernetes tudo isso é nvidia.com/gpu: 1 Fatiar = decidir como repartir SMs, memória e banda entre vários consumidores — e com qual isolamento. pesos KV cache Prefill — compute-bound processa o prompt inteiro em paralelo: satura os SMs Decode — memory-bound cada token novo relê todos os pesos: o gargalo é a banda KV cache — memória cresce com contexto × requisições concorrentes; vive na HBM SMs ociosos ≈ 60 GB livres O problema • Modelo 8B em FP16 ≈ 16 GB de pesos numa HBM de 80 GB • Um notebook, um embedding, um modelo pequeno: cada um pede nvidia.com/gpu: 1 e leva tudo • Resultado: a peça mais cara do cluster parcialmente ociosa — e fila de quem precisa de GPU Fatiar = vários consumidores por GPU, com o isolamento certo para cada caso
Agenda · Item 01
Por que fatiar · Mapa da sessão

Quatro formas de repartir uma GPU

Cada técnica reparte um recurso diferente e oferece um nível diferente de isolamento. Não são concorrentes: são ferramentas para cargas diferentes — e o DRA muda a forma de pedi-las ao Kubernetes.

  • Time-slicing reparte o tempo: contextos alternam na mesma GPU.
  • MPS reparte o espaço: kernels de processos diferentes rodam juntos.
  • MIG reparte o hardware: instâncias com SMs, L2 e HBM próprios.
  • DRA reparte a API: dispositivos com atributos, claims e alocação dinâmica.
1→7

instâncias isoladas por GPU com MIG (A100 / H100 / H200 / B200) — e N fatias de tempo em qualquer GPU.

Time-slicing

Qualquer GPU · sem isolamento · dev, notebooks, cargas esporádicas.

MPS

Kernels concorrentes · limite de memória por cliente · muitos processos pequenos.

MIG

Partição física · isolamento de memória, falhas e QoS · multi-tenant com SLA.

DRA

Seleção por atributos · MIG sob demanda · multi-nó (NVLink) · GA no K8s 1.34.

Agenda · Item 02
Time-slicing · NVIDIA GPU Operator

Time-slicing: repartindo o tempo

1 · Oversubscription2 · Fatias de tempo→ avança o estágio

replicas: N faz o device plugin anunciar N recursos por GPU física. N pods pedem nvidia.com/gpu: 1 e são escalonados na mesma GPU.A GPU alterna entre os contextos em fatias de tempo: nunca rodam ao mesmo tempo. Sem isolamento de memória (a soma precisa caber na HBM) nem de falhas; a latência depende dos vizinhos.

Pod Anvidia.com/gpu: 1 Pod Bnvidia.com/gpu: 1 Pod Cnvidia.com/gpu: 1 GPU física · 1×device plugin anuncia nvidia.com/gpu: 3 replicas: 3 o scheduler enxerga 3 "GPUs" — todas apontam para o mesmo silício Linha do tempo · contextos alternando ABCABCABCA ▲ troca de contexto a cada fatia (ms) · só um contexto executa por vez HBM · sem partição memória Amemória Bmemória Clivre A + B + C precisa caber · um OOM ou erro de kernel derruba todos
# ConfigMap lido pelo device plugin (namespace do GPU Operator) apiVersion: v1 kind: ConfigMap metadata: name: device-plugin-config namespace: nvidia-gpu-operator data: time-sliced: |- version: v1 sharing: timeSlicing: renameByDefault: false # true → nvidia.com/gpu.shared failRequestsGreaterThanOne: true resources: - name: nvidia.com/gpu replicas: 4 # 4 pods por GPU # ativa no ClusterPolicy e escolhe por nó (label) $ oc patch clusterpolicy gpu-cluster-policy --type merge \ -p '{"spec":{"devicePlugin":{"config":{"name":"device-plugin-config","default":"time-sliced"}}}}' $ oc label node <nó> nvidia.com/device-plugin.config=time-sliced
  • Funciona em qualquer GPU (T4, L4, L40S, A10…), sem requisito de hardware.
  • Config por nó, não por workload — todos os pods do nó compartilham a mesma regra.
  • Sem isolamento de memória, falhas ou desempenho; latência imprevisível.
  • Não combina com nvidia.com/gpu: 2 na mesma GPU (failRequestsGreaterThanOne).
Agenda · Item 02
MPS · Multi-Process Service

MPS: repartindo o espaço

Um daemon de controle funde os processos clientes num único contexto CUDA: kernels de pods diferentes executam ao mesmo tempo, em SMs diferentes — sem troca de contexto. O device plugin limita threads e memória por cliente.

Pod Anvidia.com/gpu: 1 Pod Bnvidia.com/gpu: 1 Pod Cnvidia.com/gpu: 1 MPS control daemon · 1 contexto CUDA GPU física · kernels concorrentes activeThreadPercentage = 100 / replicas · cada cliente usa uma fração dos SMs HBM · limite por cliente (pinned memory limit) A · 1/4B · 1/4C · 1/4D · 1/4 memória limitada por cliente · sem troca de contexto · menor latência que time-slicing
# mesmo ConfigMap do device plugin — chave "mps" data: mps: |- version: v1 sharing: mps: renameByDefault: false resources: - name: nvidia.com/gpu replicas: 4 # 4 clientes · 25% SMs · 1/4 HBM cada $ oc label node <nó> nvidia.com/device-plugin.config=mps # o GPU Operator sobe o daemon MPS por GPU e injeta # CUDA_MPS_PIPE_DIRECTORY nos containers clientes
  • Kernels em paralelo (spatial sharing) — melhor throughput e latência que time-slicing para processos pequenos.
  • Limite de memória por cliente imposto pelo daemon: um cliente não "come" a HBM dos outros.
  • Suportado no GPU Operator (≥ 24.3) em GPUs Volta+.
  • Isolamento de falhas fraco: um erro fatal no contexto compartilhado afeta todos os clientes.
  • Não se combina com MIG na mesma GPU pelo device plugin; sem QoS garantida de banda.
Agenda · Item 03
MIG · Multi-Instance GPU

MIG: repartindo o hardware

1 · Fatias físicas2 · Perfis3 · Pods isolados→ avança o estágio

GPUs Ampere+ (A100, H100, H200, B200) nascem com 7 fatias de compute (GPCs com seus SMs e L2) e 8 fatias de memória (HBM + controladores + banda). O MIG combina essas fatias em instâncias.Um perfil Ng.MMgb = N fatias de compute + MM GB de HBM. Perfis podem ser misturados na mesma GPU, respeitando as combinações que o hardware permite.Cada instância aparece ao Kubernetes como um recurso próprio (nvidia.com/mig-3g.40gb). Pods não disputam SMs, L2, HBM ou banda: isolamento de memória, de falhas e de desempenho garantido pelo silício.

NVIDIA H100 80 GB · recursos particionáveis Compute · 7 fatias (GPC → SMs + L2) GPC 0GPC 1GPC 2GPC 3GPC 4GPC 5GPC 6 Memória · 8 fatias (HBM + banda) 10 GB10 GB10 GB10 GB10 GB10 GB10 GB10 GB Sem MIG: uma instância só (7g.80gb) — o mesmo "nvidia.com/gpu: 1" de sempre. 3g.40gb 40 GB · 4/8 da banda 2g.20gb 20 GB 1g.10gb 10 GB 1g.10gb 10 GB 3 + 2 + 1 + 1 = 7 fatias de compute · 4 + 2 + 1 + 1 = 8 fatias de memória → 4 instâncias numa GPU · perfis Ng.MMgb vLLM · Llama 3.1 8Bnvidia.com/mig-3g.40gb: 1 Embeddings / reranknvidia.com/mig-2g.20gb: 1 Notebookmig-1g.10gb: 1 Batch jobmig-1g.10gb: 1 ↑ OOM ou erro fatal aqui: os outros três continuam intactos 4 recursos distintos no Kubernetes · SMs, L2, HBM e banda dedicados por instância
Agenda · Item 03
MIG · Perfis e configuração no OpenShift

Perfis, estratégias e o mig-manager

A100 40 GB fração dos SMs · instâncias por GPU

1g.5gb
até 7
2g.10gb
até 3
3g.20gb
até 2
4g.20gb
1
7g.40gb
1 (inteira)

H100 80 GB também H200 (141 GB) e B200 com perfis análogos

1g.10gb
até 7
1g.20gb
até 4
2g.20gb
até 3
3g.40gb
até 2
7g.80gb
1 (inteira)
Estratégia no ClusterPolicy (spec.mig.strategy): single → todas as GPUs do nó com o mesmo perfil, expostas como nvidia.com/gpu (transparente para as cargas); mixed → perfis diferentes, expostos como nvidia.com/mig-3g.40gb, nvidia.com/mig-1g.10gb
# 1) escolher o perfil do nó — o mig-manager faz o resto $ oc label node <nó> nvidia.com/mig.config=all-1g.10gb --overwrite # drena pods de GPU → aplica perfis → nvidia.com/mig.config.state=success # 2) layout personalizado (ConfigMap referenciado em spec.migManager.config) data: config.yaml: | version: v1 mig-configs: inferencia-mista: - devices: all mig-enabled: true mig-devices: "3g.40gb": 1 "2g.20gb": 1 "1g.10gb": 2 $ oc label node <nó> nvidia.com/mig.config=inferencia-mista --overwrite # 3) o pod pede a instância (strategy: mixed) resources: limits: nvidia.com/mig-3g.40gb: 1
  • OpenShift AI: um Accelerator Profile por recurso MIG — o usuário escolhe "GPU pequena / média / grande" no workbench ou no serving.
  • Reconfigurar o perfil esvazia o nó de cargas GPU: planejar por pool de nós (MachineSet por perfil).
  • Sem NVLink entre instâncias: tensor parallel exige GPUs inteiras.
Agenda · Item 03
Comparativo

Time-slicing × MPS × MIG

Três mecanismos, três níveis de isolamento. Tudo configurado pelo NVIDIA GPU Operator, por nó, via ConfigMap + label.

Time-slicingMPSMIG
O que reparteTempo (contextos alternam)Espaço (kernels concorrentes num contexto)Hardware (SMs, L2, HBM, banda)
Isolamento de memóriaNenhum — soma precisa caberLimite por cliente (daemon)Físico — endereçamento separado
Isolamento de falhasNenhumFraco — erro fatal afeta todosTotal por instância
Latência / QoSImprevisível (vizinhos)Melhor, sem garantia de bandaPrevisível — banda dedicada
HardwareQualquer GPU NVIDIAVolta+A100 · A30 · H100 · H200 · B200 (Ampere+)
Granularidadereplicas: N livrereplicas: N → 1/N SMs e HBMPerfis fixos Ng.MMgb, até 7
Recurso no Kubernetesnvidia.com/gpu (ou .shared)nvidia.com/gpu (ou .shared)nvidia.com/gpu (single) · nvidia.com/mig-* (mixed)
Melhor paraDev, notebooks, cargas esporádicas, CIMuitos processos pequenos do mesmo tenantMulti-tenant, produção com SLA, inferência de modelos ≤ 40 GB
Agenda · Item 04
DRA · Dynamic Resource Allocation

DRA: repartindo a API

1 · Inventário2 · Claim3 · Preparação→ avança o estágio

O driver DRA da NVIDIA roda em cada nó e publica um ResourceSlice: cada GPU com seus atributos (modelo, memória, arquitetura, MIG) — não mais um contador opaco. Ele também instala as DeviceClasses.O desenvolvedor descreve o que precisa num ResourceClaimTemplate com seletor CEL; o Pod referencia a claim. O scheduler casa demanda × inventário e reserva o dispositivo na ResourceClaim.No nó, o kubelet chama o driver (NodePrepareResources): ele prepara o dispositivo — pode criar a instância MIG só naquele momento — e injeta no container via CDI. Multi-nó (GB200 NVLink): ComputeDomain + IMEX.

DeviceClasses instaladas pelo driver gpu.nvidia.com mig.nvidia.com compute-domain.nvidia.com API server + schedulerResourceSlice · DeviceClass · ResourceClaim Nó · kubelet + driver DRAkubelet plugin NVIDIA (gRPC) GPU 0 · H100 80 GBMIG-capable · NVLink 1 ResourceSlice O inventário ganha atributos gpu-0: productName=H100-80GB architecture=Hopper memory=80Gi · migCapable=true cudaComputeCapability=9.0 Antes: "nvidia.com/gpu: 3" — sem saber qual, com quanta memória, ou como compartilhar. Pod + ResourceClaimTemplateCEL: H100 · ≥ 40 GiB → resourceClaims 2 3scheduler: CEL × atributos→ reserva o device na ResourceClaim Pedido por característica, não por contagem: "uma H100 com ≥ 40 GiB" ou "um MIG 3g.40gb". 4 NodePrepareResources 5 MIG 3g.40gb ↳ instância MIG criada sob demanda para a claim ↳ CDI injeta o device; o container só vê a sua fatia ↳ ao terminar: NodeUnprepare → MIG desfeita
Agenda · Item 04
DRA · Na prática

Claims em vez de contadores Tech Preview no OpenShift · confirmar versão-alvo

# "quero uma H100 com ≥ 40 GiB" — resource.k8s.io/v1 (GA no K8s 1.34) apiVersion: resource.k8s.io/v1 kind: ResourceClaimTemplate metadata: {name: h100-40gb} spec: spec: devices: requests: - name: gpu exactly: # em v1beta1, campos direto no request deviceClassName: gpu.nvidia.com selectors: - cel: expression: | device.attributes["gpu.nvidia.com"].productName.matches("H100") && device.capacity["gpu.nvidia.com"].memory.compareTo(quantity("40Gi")) >= 0 # variante MIG sob demanda: deviceClassName: mig.nvidia.com # expression: device.attributes["gpu.nvidia.com"].profile == "3g.40gb"
# o Pod referencia a claim — sem nvidia.com/gpu nos limits apiVersion: v1 kind: Pod spec: resourceClaims: - name: gpu resourceClaimTemplateName: h100-40gb containers: - name: vllm image: registry.redhat.io/rhaiis/vllm-cuda-rhel9:<versão> args: ["--model", "meta-llama/Llama-3.1-8B-Instruct"] resources: claims: - name: gpu # multi-nó (GB200 NVL72): ComputeDomain → IMEX entre nós apiVersion: resource.nvidia.com/v1beta1 kind: ComputeDomain spec: {numNodes: 4, channel: {resourceClaimTemplate: {name: cd-channel}}}

Device plugin (hoje)

Inteiro opaco · sharing configurado por nó · sem escolher modelo/memória · sem relação entre dispositivos.

DRA

Atributos + CEL · sharing e MIG por workload · claims compartilháveis entre pods · topologia (NVLink, multi-nó).

Status

GA no Kubernetes 1.34 · driver k8s-dra-driver-gpu da NVIDIA · OpenShift: feature gate DynamicResourceAllocation (TP) validar

Convivência

Device plugin e DRA coexistem no GPU Operator; migração gradual por pool de nós. Time-slicing/MPS/MIG viram opções da claim.

Agenda · Item 05
vLLM · PagedAttention

vLLM: a memória da fatia rende mais

1 · Sem PagedAttention2 · Com PagedAttention→ avança o estágio

O KV cache de cada sequência era reservado contíguo, para o comprimento máximo. O que não é usado fica preso (fragmentação interna) e sobram buracos entre sequências (externa): poucas requisições cabem por GPU.PagedAttention divide o KV cache em blocos fixos (16 tokens) mapeados por uma tabela — como paginação de memória virtual. Blocos são alocados só quando o token chega e podem ser compartilhados entre requisições (prefix caching).

HBM da fatia (ex.: MIG 3g.40gb) pesos do modeloLlama 8B FP16 ≈ 16 GB R1reservado R2reserv. R3reservado, não usado R4não cabe Cada sequência reserva memória contígua até max_model_len — e o gerador não sabe de antemão quantos tokens virão. 3 requisições cabem; a maior parte da memória reservada nunca é tocada. 60–80% do KV cache desperdiçado em sistemas de serving tradicionais — medição do paper do vLLM (SOSP 2023) blocos de 16 tokens · 5 requisições + 12 blocos livres R1 → blocos [0, 7, 12, 13, 21] R2 → [1, 2, 3, 8, 9, 14, 15, 22, 23] tabela de blocos: lógico → físico Não contíguo, alocado sob demanda (o bloco piscando é R2 recebendo tokens) · bloco 0 tracejado: prefixo compartilhado por R1 e R3, copy-on-write. desperdício < 4% · 2–4× mais throughput mais sequências por fatia · prefix caching · sampling paralelo e beam search sem copiar KV
Agenda · Item 05
vLLM · Continuous batching

vLLM: a fatia nunca fica parada

1 · Static batching2 · Continuous batching→ avança o estágio

No lote estático, N requisições entram juntas e o lote só termina quando a mais longa termina. Cada slot que acaba cedo fica ocioso e a fila espera o lote inteiro.O scheduler do vLLM decide a cada iteração (um token por sequência): sequências prontas saem, novas entram no mesmo instante. A GPU fica cheia — limitada só pelo KV cache disponível (PagedAttention).

slot 1slot 2slot 3slot 4 05101520 iterações R1 · 10 tokens R2ocioso R3 R4ocioso lote 2 só começa aqui R5 R6 R7 · 10 tokens R8 ocupação ≈ 57% · R5–R8 esperaram 10 iterações na fila R1R6R9 R2R5 entra na iteração 4R8R10 R3R7R11 R4R12R13R14 ocupação ≈ 100% · latência de fila cai · throughput 2–4× ▌ iteração atual · a cada passo, 1 token por sequência ativa
Agenda · Item 05
vLLM · Red Hat AI Inference Server

vLLM suportado, em qualquer fatia

O Red Hat AI Inference Server é o vLLM empacotado, endurecido e suportado pela Red Hat — em container no RHEL, no OpenShift AI (runtime KServe) ou em qualquer Kubernetes. Ele enxerga exatamente o que o Kubernetes entrega: uma GPU inteira, uma instância MIG ou uma fatia de tempo.

Motor vLLM

PagedAttention, continuous batching, prefix caching, speculative decoding, chunked prefill, multi-LoRA, API compatível com OpenAI.

LLM Compressor

Quantização FP8 / INT8 / INT4 (AWQ, GPTQ) e sparsity: modelo 8B cabe em 1g.10gb; 70B em uma H100.

Modelos validados

Repositório Red Hat AI (Hugging Face) com modelos otimizados e testados por aceleradores (NVIDIA, AMD, TPU, Gaudi).

Paralelismo

--tensor-parallel-size entre GPUs inteiras com NVLink; --pipeline-parallel-size entre nós.

Ajustes por tipo de fatia
MIG · a instância é "uma GPU pequena": --gpu-memory-utilization 0.9, --max-model-len conforme a HBM, sem TP.
Time-slicing / MPS · reduzir --gpu-memory-utilization (ex.: 0.3) para a soma caber; aceitar latência variável.
GPU inteira · --tensor-parallel-size N para modelos maiores que a HBM; --enable-prefix-caching para RAG/agentes.
Sempre · --max-num-seqs e --max-num-batched-tokens definem o teto do continuous batching por fatia.
Agenda · Item 06
llm-d · Inferência distribuída

llm-d: muitas fatias, um serviço

1 · Gateway + pool2 · Roteamento KV-aware3 · Prefill / Decode→ avança o estágio

llm-d (Red Hat, Google, IBM, NVIDIA, CoreWeave…) é o vLLM em escala Kubernetes: um Inference Gateway (Envoy + Gateway API Inference Extension) na frente de um pool de réplicas vLLM. Um balanceador comum distribui por round-robin — e ignora o cache.O EPP (Endpoint Picker, scheduler do llm-d) sabe qual réplica já tem o prefixo no KV cache e qual está com fila curta. A requisição vai para onde o prefill pode ser pulado: menos latência (TTFT) e mais throughput para RAG, agentes e chats longos.Prefill/Decode desagregados: prefill (compute-bound) em um pool, decode (memory-bound) em outro; o KV cache viaja via NIXL (RDMA/NVLink). Cada pool escala e usa a fatia certa. Terceiro caminho: wide expert parallelism para MoE.

ClientesAPI OpenAI Inference GatewayEnvoy · Gateway APIInference Extension EPP · Endpoint Pickerscheduler do llm-d (ext-proc) vLLM · réplica 1nvidia.com/gpu: 1 vLLM · réplica 2nvidia.com/gpu: 1 vLLM · réplica 3nvidia.com/gpu: 1 Balanceador comum • round-robin / menos conexões • não sabe onde está o KV cache • não vê a fila de cada réplica → prefill repetido, TTFT alto Índice de prefixos / KVa1f3… → réplica 2 ✓9c02… → réplica 1fila: r1=3 r2=1 r3=5KV livre: r2 = 62%métricas do vLLM + eventos de cache cache hit · prefill pulado EPP pontua cada réplica:prefixo em cache × fila× KV livre → réplica 2 Prefillcompute-boundGPU inteira · TP Decode 1memory-bound · KV grande Decode 2escala independente Desagregação P/D • prefill e decode escalam separados • sem interferência prefill ↔ decode • KV transferido via NIXL (RDMA · NVLink · InfiniBand) → SLO de TTFT e TPOT por pool
Agenda · Item 06
llm-d · No OpenShift AI

llm-d dentro do OpenShift AI OpenShift AI 3.x · confirmar versão

Distributed inference com llm-d é um modo de serving do OpenShift AI: o mesmo Red Hat AI Inference Server, orquestrado por um gateway inteligente sobre Gateway API — tudo suportado.

Componentes

Stack llm-d

Gateway API + Inference Extension (InferencePool · InferenceModel)
EPP / scheduler llm-d — prefix-aware · load-aware · SLO-aware
vLLM (Red Hat AI Inference Server) — pools prefill · decode · réplicas
KV cache distribuído — NIXL (transfer) · LMCache (offload · tiering)
GPUs fatiadas — MIG · inteiras · time-slicing · claims DRA
Well-lit paths

Três caminhos prontos

  • Intelligent inference scheduling — roteamento por prefixo + carga; ganha em qualquer pool de réplicas, sem mudar o vLLM.
  • Prefill/Decode disaggregation — pools separados, KV via NIXL; para contextos longos e SLO de latência.
  • Wide expert parallelism — MoE (DeepSeek, Mixtral) com experts espalhados em muitas GPUs.
Helm charts / guias por caminho · métricas Prometheus · autoscaling por SLO
Kueue: cotas por tipo de fatia (mig-3g.40gb, gpu) por time/projeto
Encerramento
Síntese

Qual fatia para qual carga

CargaTécnicaPor quêServing
Notebooks, dev, CI, experimentosTime-slicingBarato, qualquer GPU, sem exigência de SLA; oversubscription alta.Workbench OpenShift AI
Muitos processos pequenos do mesmo time (visão, embeddings)MPSConcorrência real de kernels com limite de memória por cliente.vLLM / Triton por processo
Inferência multi-tenant com SLA, modelos ≤ 40 GBMIGIsolamento físico de memória, falhas e banda; latência previsível.vLLM em mig-3g.40gb / 1g.10gb
Modelos > 1 GPU (70B+, contextos longos)GPU inteira + TP/PPMIG não tem NVLink; tensor parallel precisa de GPUs inteiras.vLLM --tensor-parallel-size
Alto volume, prefixos repetidos (RAG, agentes), SLO de TTFTllm-dRoteamento KV-aware + P/D desagregado sobre o pool de fatias.OpenShift AI · distributed inference
Seleção por atributo, MIG sob demanda, multi-nó NVLinkDRAClaims descrevem o que a carga precisa; o cluster decide onde e como.Qualquer — via ResourceClaim
Na prática, tudo junto: pools de nós com MIG para os modelos pequenos, GPUs inteiras para os grandes, time-slicing para desenvolvimento — e DRA para pedir cada um pelo que ele é.
Encerramento
Arquitetura de referência

A pilha Red Hat, do driver ao serving

Plataforma

OpenShift + OpenShift AI

OpenShift AI — KServe + runtime vLLM (RHAIIS) · llm-d · Accelerator Profiles · Model Registry · Workbenches
OpenShift — scheduler · Kueue (cotas por fatia) · Gateway API · DRA (ResourceClaims) · GitOps
NVIDIA GPU Operator (certificado) — driver · container toolkit · device plugin / driver DRA · MIG manager · DCGM exporter · NFD
RHEL CoreOS · GPUs NVIDIA (A100 · H100 · H200 · L40S · B200)
Como operar

Diretrizes

  • Git como centro: ConfigMaps do device plugin, perfis MIG, ClusterPolicy, claims DRA e runtimes versionados e aplicados por GitOps.
  • Pools de nós por perfil (MachineSet + labels nvidia.com/mig.config, device-plugin.config): reconfigurar MIG esvazia o nó.
  • Cotas por fatia com Kueue/ResourceQuota — nvidia.com/mig-1g.10gb é um recurso como outro qualquer.
  • Observabilidade: DCGM exporter (utilização de SM, HBM, por instância MIG) + métricas do vLLM (TTFT, TPOT, KV usage) no Prometheus.
  • Reproduzir no lab Red Hat → replicar no cliente, com mínimo esforço do time do cliente.
Encerramento
Próximos passos

Checklist para a PoC

MIG possívelSem MIG (T4/L4/L40S…)
Avaliar DRASó device plugin
NotebooksInferênciaMistas
RHAIIS standaloneOpenShift AI · KServellm-d

Respostas salvas neste navegador (localStorage).

Obrigado!

Fatiamento de GPU · Time-slicing, MPS, MIG, DRA, vLLM e llm-d

1 GPU · 7 instâncias · isolamento real 3g.40gb · 2g.20gb · 1g.10gb · 1g.10gb

Red Hat OpenShift AI · NVIDIA GPU Operator · Red Hat AI Inference Server · llm-d