O problema clássico: esperar por GPU disponível
Quem trabalha com treinamento de modelos de IA em escala conhece bem a frustração: você submete um job, e a instância GPU que precisa simplesmente não está disponível naquele momento. Com o job preso a um único tipo de instância, a única saída é esperar — ou montar gambiarras manuais para tentar alternativas.
Esse cenário é especialmente crítico em pipelines de re-treinamento noturno, execuções de fine-tuning em produção e jobs de processamento agendados. Um simples InsufficientCapacityError às 2h da manhã pode comprometer a atualização do modelo e atrasar ciclos inteiros de experimentação.
Para contornar o problema, muitas equipes desenvolveram scripts customizados que monitoram o status do job, cancelam requisições travadas e resubmetem com tipos alternativos. Além de frágeis, essas soluções não se integram com opções de capacidade reservada — e adicionam sobrecarga operacional que se acumula a cada nova execução de treinamento.
A solução: listas de preferência de instâncias
A AWS anunciou as listas de preferência de instâncias para Jobs de Treinamento do Amazon SageMaker AI e Jobs de Processamento do Amazon SageMaker AI. Com essa funcionalidade, em vez de fixar o job a um único tipo de instância, é possível fornecer uma lista ordenada de até cinco tipos aceitáveis em uma única chamada de API.
O Amazon SageMaker AI avalia a lista em ordem de prioridade e inicia o job no primeiro tipo com capacidade disponível — sem intervenção manual, sem scripts de polling e sem loops de retry.
Como o fluxo de provisionamento funciona
O processo segue quatro etapas principais:
- Etapa 1: Você submete o job com uma lista ordenada de até cinco tipos de instância.
- Etapa 2: O SageMaker AI valida a configuração do job e a lista de preferências em relação aos tipos suportados e aos limites de recursos.
- Etapa 3: O scheduler realiza uma varredura em memória pela lista ordenada e identifica o primeiro tipo com capacidade disponível.
- Etapa 4: O tipo vencedor é provisionado imediatamente e o job começa a execução.
Se nenhum tipo da lista tiver capacidade disponível no momento da avaliação, o job entra em uma fila orientada a eventos e realiza retries automáticos quando a capacidade for liberada. Esse tempo de espera é controlado pelo parâmetro MaxPendingTimeInSeconds, que define o tempo máximo que o SageMaker AI pode aguardar percorrendo a lista.
Vale destacar: o MaxPendingTimeInSeconds só tem efeito para jobs que solicitam instâncias de computação acelerada — como as famílias ml.p, ml.g e ml.trn. Para instâncias CPU, esse parâmetro não tem efeito. Além disso, o timeout se aplica à lista inteira, não a cada tipo individualmente.

Integração com Planos de Treinamento Flexíveis (FTP)
Equipes que investiram em Planos de Treinamento Flexíveis (FTP) — que reservam capacidade GPU por um período definido a taxas com desconto — ganham uma extensão natural com as listas de preferência. É possível associar um Training Plan a preferências específicas da lista e deixar as demais usando capacidade sob demanda.
O sweep avalia a reserva primeiro. Se aquela preferência não puder ser provisionada, o sistema avança para o próximo tipo na lista, que pode usar capacidade on-demand. Não é necessária nenhuma troca manual — o que tiver capacidade primeiro vence.

Exemplos de código: jobs de treinamento
Os exemplos abaixo utilizam o SDK Python do Amazon SageMaker v3 com a classe ModelTrainer.
Exemplo 1: Três tipos de GPU com contagem uniforme (P5, P4d e P4de)
Neste exemplo, são especificados três tipos de instância GPU com a mesma contagem. O SageMaker AI tenta provisionar a primeira preferência (P5) e recorre ao P4d ou P4de se não houver capacidade disponível.
from sagemaker.core.shapes.shapes import InstancePreference
from sagemaker.train.model_trainer import ModelTrainer
from sagemaker.train.configs import Compute, OutputDataConfig
trainer = ModelTrainer(
training_image="763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-training:2.3.0-gpu-py311-cu121-ubuntu22.04-sagemaker",
source_code="train.py",
role="arn:aws:iam:: 111122223333:role/SageMakerExecutionRole",
base_job_name="large-model-training-70b",
output_data_config=OutputDataConfig(
s3_output_path="s3:// amzn-s3-demo-bucket /training-output/"
),
compute=Compute(
instance_count=8, # Same count regardless of which type wins
volume_size_in_gb=500,
keep_alive_period_in_seconds=3600,
instance_preferences=[
InstancePreference(instance_type="ml.p5.48xlarge"), # Priority 1: H100
InstancePreference(instance_type="ml.p4d.24xlarge"), # Priority 2: A100
InstancePreference(instance_type="ml.p4de.24xlarge"), # Priority 3: A100 (80GB)
],
),
)
trainer.train(wait=False)
print(f"Job submitted: {trainer._latest_training_job.training_job_name}")
Exemplo 2: Contagens por preferência para equivalência de computação
Nem todos os tipos de instância entregam o mesmo throughput por nó. Quando a lista inclui tipos com arquiteturas de GPU diferentes, é possível especificar uma contagem de instâncias diferente para cada entrada, alcançando throughput total equivalente. No exemplo abaixo, duas instâncias ml.g6.48xlarge (16 GPUs L40S no total) são a primeira preferência, com quatro ml.g5.48xlarge (32 GPUs A10G no total) como fallback para compensar a menor performance por GPU.
compute = Compute(
volume_size_in_gb=500,
instance_preferences=[
# 2× g6.48xlarge (8× L40S GPUs each = 16 GPUs total)
InstancePreference(instance_type="ml.g6.48xlarge", instance_count=2),
# 4× g5.48xlarge (8× A10G GPUs each = 32 GPUs, but lower per-GPU perf)
InstancePreference(instance_type="ml.g5.48xlarge", instance_count=4),
],
)
Dica: Use contagens por preferência quando seu script de treinamento consegue se adaptar a diferentes quantidades de GPU — por exemplo, via torchrun com --nproc_per_node=auto. Cada configuração deve entregar throughput total equivalente para sua carga de trabalho.
Exemplo 3: Integração com Training Plan (híbrido reservado e on-demand)
Este exemplo combina capacidade reservada de um Training Plan com fallback on-demand, garantindo que os jobs possam iniciar mesmo quando a capacidade reservada está totalmente utilizada.
compute = Compute(
instance_count=4,
volume_size_in_gb=500,
instance_preferences=[
# Priority 1: Use my reserved P5 capacity (guaranteed, no wait)
InstancePreference(
instance_type="ml.p5.48xlarge",
training_plan_arns=[
"arn:aws:sagemaker:us-west-2:111122223333:training-plan/my-p5-reservation"
],
),
# Priority 2: On-demand P4d (if reservation is fully consumed)
InstancePreference(instance_type="ml.p4d.24xlarge"),
# Priority 3: On-demand P4de (last resort)
InstancePreference(instance_type="ml.p4de.24xlarge"),
],
)
Jobs de processamento também são suportados
O mesmo mecanismo de fallback se aplica a jobs de processamento. Em vez de configurar as preferências de instância no recurso de treinamento, você as especifica no ClusterConfig do job de processamento. O SageMaker AI avalia a lista em ordem de prioridade no momento do lançamento e provisiona automaticamente o cluster com o primeiro tipo disponível.
from sagemaker.processing import Processor
processor = Processor(
role="arn:aws:iam::123456789012:role/SageMakerExecutionRole",
image_uri="763104351884.dkr.ecr.us-east-1.amazonaws.com/pytorch-training:2.3.0-gpu-py311-cu121-ubuntu22.04-sagemaker",
instance_count=2,
volume_size_in_gb=100,
entrypoint=["python3", "process.py"],
instance_preferences=[
{"InstanceType": "ml.g5.12xlarge"}, # Priority 1
{"InstanceType": "ml.g5.4xlarge"}, # Priority 2
{"InstanceType": "ml.m5.12xlarge"}, # Priority 3 (CPU fallback)
],
)
processor.run(
inputs=[...],
outputs=[...],
)
Atenção: Jobs de processamento não suportam integração com Training Plans. O campo TrainingPlanArns é exclusivo para jobs de treinamento.
Boas práticas ao configurar listas de preferência
1. Liste apenas tipos de instância compatíveis
O SageMaker AI não valida compatibilidade entre tipos — arquitetura de GPU, suporte a Elastic Fabric Adapter (EFA) e versões de driver. Certifique-se de que seu container de treinamento funciona em todos os tipos listados.
2. Use contagens por preferência para equivalência de throughput
Se a lista inclui tipos com diferentes capacidades de computação por nó, ajuste as contagens para equiparar o throughput total:
{ "InstanceType": "ml.p5.48xlarge", "InstanceCount": 2 }, // 2× H100 nodes
{ "InstanceType": "ml.p4d.24xlarge", "InstanceCount": 4 } // 4× A100 nodes ≈ same total FLOPS
3. Combine com Training Plans para capacidade garantida e flexível
Coloque a capacidade reservada primeiro na lista de preferências, para que o SageMaker AI tente iniciar com recursos pré-pagos antes de recorrer a alternativas on-demand:
- Prioridade 1: P5 reservado (via Training Plan) → instantâneo se a reserva estiver disponível
- Prioridade 2: P4d on-demand → bom fallback a taxas padrão
- Prioridade 3: P4de on-demand → último recurso
4. Controle o tempo de fila com MaxPendingTimeInSeconds
Defina por quanto tempo o job pode continuar tentando a lista antes de ser encerrado (aplica-se apenas a instâncias de computação acelerada):
StoppingCondition={
"MaxRuntimeInSeconds": 86400,
"MaxPendingTimeInSeconds": 1800 # Fail after 30 minutes if no capacity
}
Como começar
Para usar as listas de preferência de instâncias, basta seguir estes passos:
- Atualize o SDK Python do Amazon SageMaker:
pip install --upgrade sagemaker - Adicione
instance_preferencesà sua configuração deComputeseguindo o Guia do Desenvolvedor do Amazon SageMaker AI - Liste de 2 a 5 tipos de instância compatíveis em ordem de prioridade
- Submeta o job pelo console do Amazon SageMaker AI e deixe o serviço encontrar capacidade automaticamente
Para saber mais sobre tipos de instância, preços e Training Plans, consulte a página de detalhes do Amazon SageMaker AI.
Fonte
Announcing instance preference lists for Amazon SageMaker AI training jobs (https://aws.amazon.com/blogs/machine-learning/announcing-instance-preference-lists-for-amazon-sagemaker-ai-training-jobs/)
