Como Implantar Modelos Quantizados no Amazon SageMaker AI com Unsloth

Por que quantização importa na prática

Manter modelos de linguagem em precisão total — 16 bits por parâmetro (BF16 ou FP16) — é caro. Instâncias grandes de GPU têm custo elevado, os ciclos de iteração ficam lentos e o armazenamento cresce rapidamente. A quantização resolve isso reduzindo a precisão numérica dos pesos do modelo: em vez de 16 bits por parâmetro, você passa a usar 4 ou 8 bits, encolhendo o consumo de memória de forma significativa.

O problema clássico da quantização é a perda de qualidade. É aí que entra a quantização dinâmica, metodologia desenvolvida pela Unsloth Dynamic. Em vez de aplicar a mesma redução de bits em todas as camadas do modelo, a abordagem analisa camada por camada: as mais sensíveis à perda de precisão permanecem em maior resolução (por exemplo, 16 bits), enquanto as menos sensíveis são comprimidas de forma agressiva (4 bits ou menos). O resultado é um modelo muito menor com degradação de qualidade bem controlada.

Para ter uma ideia prática: um modelo com 8 bilhões de parâmetros em BF16 ocupa cerca de 16 GB de memória. Com quantização para 4 bits, esse footprint cai para aproximadamente 5 GB — o que frequentemente significa a diferença entre precisar de uma instância multi-GPU e caber confortavelmente em uma GPU única.

A Unsloth é a ferramenta que viabiliza esse fluxo de ponta a ponta: ajuste fino, quantização, exportação e implantação em um único workflow unificado.

Qual formato de modelo usar

Antes de escolher o serviço AWS, a AWS orienta a escolher o artefato de saída correto — a infraestrutura vem depois. O Unsloth suporta dois tipos principais de exportação voltados para implantação:

  • Arquivos GGUF — formato de arquivo único que empacota pesos, tokenizador e metadados juntos. É autocontido e pronto para ser carregado sem arquivos adicionais. Ideal para runtimes leves como llama.cpp, Ollama e Unsloth. No ambiente AWS, mapeia para Amazon EC2 ou container customizado no Amazon SageMaker AI.
  • Pesos safetensors mesclados — (16 bits, 8 bits, FP8, 4 bits, NVFP4) para engines de maior throughput como vLLM e SGLang. No AWS, mapeia para containers de Inferência de Modelos Grandes (LMI) do SageMaker AI, Amazon EKS ou Amazon ECS.

A tabela abaixo, presente no artigo original, resume o mapeamento entre artefato, runtime e destino AWS:

  • GGUF + llama.cpp/Unsloth → Amazon EC2: validação rápida com acesso direto à instância
  • GGUF + container customizado → Amazon SageMaker AI: endpoints gerenciados com autoscaling e runtime leve
  • Pesos mesclados 16 bits ou 4 bits + vLLM/SGLang/LMI → Amazon SageMaker AI: alto throughput, batching, autoscaling, GPU em produção
  • Qualquer stack containerizado → Amazon EKS ou Amazon ECS: quando a inferência precisa se integrar a um framework de containers já existente

Os quatro padrões de implantação

Padrão 1: GGUF no Amazon EC2 com llama.cpp

O ponto de partida recomendado é o Amazon EC2, pela transparência e controle máximo. Nele é possível comparar diferentes níveis de quantização, testar formatação de prompts, avaliar comportamento em CPU versus GPU e medir o consumo real de memória antes de se comprometer com um endpoint gerenciado.

Uma exportação típica no Unsloth se parece com isso:

model.save_pretrained_gguf("gguf_model", tokenizer, quantization_method="q4_k_xl")

Para iniciar o servidor, o comando mínimo do llama-server é:

llama-server \
  --model /models/my-model.gguf \
  --alias my-model \
  --ctx-size 8192 \
  --host 0.0.0.0 \
  --port 8080

Ou usando o Unsloth diretamente:

unsloth run \
  --model /models/my-model.gguf \
  --alias my-model \
  --ctx-size 8192 \
  --host 0.0.0.0 \
  --port 8080

A partir daí, a aplicação se comunica com o modelo via interface compatível com OpenAI:

from openai import OpenAI
client = OpenAI(
    base_url="http://<ec2-private-ip>:8080/v1",
    api_key="not-required",
)
response = client.chat.completions.create(
    model="my-model",
    messages=[
        {"role": "system", "content": "You are a helpful assistant."},
        {"role": "user", "content": "Explain AWS Graviton in two sentences."},
    ],
    max_tokens=128,
)
print(response.choices[0].message.content)

Atenção: essa configuração é adequada para testes isolados. Em produção, é necessário restringir o grupo de segurança a blocos de Roteamento entre Domínios sem Classe (CIDR) conhecidos, vincular a uma interface privada e colocar o endpoint atrás de um gateway de API autenticado ou balanceador de carga.

Consulte a documentação GGUF do Unsloth para a lista completa de métodos de quantização e suas características.

Padrão 2: GGUF no Amazon SageMaker AI com container customizado

Quando é necessário um endpoint de produção com autoscaling, monitoramento, integração com Gerenciamento de Identidade e Acesso (IAM) e uma superfície de API estável, os endpoints de inferência do Amazon SageMaker AI são a escolha mais adequada.

Para implantações GGUF, o design mais prático é um container de inferência customizado que empacota o arquivo GGUF junto com o llama.cpp. O container precisa escutar na porta 8080, implementar /ping para verificações de saúde e /invocations para requisições de inferência.

O repositório GitHub de exemplo inclui uma demonstração completa desse padrão. Ele implanta uma comparação lado a lado entre o Qwen3-VL-8B-Instruct quantizado dinamicamente pelo Unsloth (GGUF Q4_K_XL servido com llama.cpp em ml.g5.xlarge, aproximadamente US$ 1,41/hora) e a variante BF16 em precisão total (servida com vLLM em ml.g5.12xlarge, aproximadamente US$ 7,09/hora). Preços referentes a junho de 2026; consulte a página de preços do Amazon SageMaker AI para valores atualizados.

O script de entrada inicia o llama-server em uma porta interna e usa o nginx como proxy reverso para satisfazer a interface do SageMaker AI:

# Start llama-server with the GGUF model and vision projector
/app/llama-server \
  --model /models/Qwen3-VL-8B-Instruct-UD-Q4_K_XL.gguf \
  --mmproj /models/mmproj-F16.gguf \
  --host 0.0.0.0 \
  --port 8081 \
  --ctx-size 4096

O nginx então mapeia /ping para o health check do llama-server e /invocations para o endpoint de chat completions:

# SageMaker health check endpoint
location /ping {
    proxy_pass http://llama_backend/health;
}
# SageMaker inference endpoint -> llama.cpp chat completions
location /invocations {
    proxy_pass http://llama_backend/v1/chat/completions;
    proxy_read_timeout 120s;
}

A arquitetura típica funciona assim: o arquivo GGUF finalizado fica armazenado no Amazon Simple Storage Service (Amazon S3); ao iniciar, o container do SageMaker AI carrega o modelo de /opt/ml/model e expõe uma camada de API que traduz as requisições do SageMaker AI em chamadas de inferência locais.

Padrão 3: Pesos mesclados no Amazon SageMaker AI com engines otimizadas para GPU

GGUF é excelente quando o tamanho do arquivo e o runtime leve são as prioridades. Mas quando throughput e eficiência de GPU são o foco, os pesos mesclados se tornam mais atrativos.

Pesos mesclados são o modelo salvo como um conjunto unificado de pesos em safetensors — frequentemente o resultado da combinação de um adaptador ajustado (como um adaptador de Adaptação de Baixo Rank, LoRA) com o modelo base. O Unsloth suporta exportações de saída mesclada em 16 bits e 4 bits, mais adequadas para runtimes como vLLM e SGLang, construídos para padrões de serving em GPU de produção: batching, alto throughput de tokens e escalonamento multi-GPU.

Uma exportação representativa:

model.save_pretrained_merged(
    "finetuned_model",
    tokenizer,
    save_method="merged_16bit",
)

O caminho de serving é simplesmente:

vllm serve finetuned_model

No AWS, os containers LMI disponíveis para o Amazon SageMaker AI são especialmente relevantes aqui. Para o endpoint de precisão total no exemplo de referência, o container LMI é configurado inteiramente por variáveis de ambiente no recurso Terraform:

HF_MODEL_ID             = "Qwen/Qwen3-VL-8B-Instruct"
OPTION_DTYPE            = "bf16"
OPTION_ROLLING_BATCH    = "vllm"
OPTION_TENSOR_PARALLEL_DEGREE = "4"
OPTION_MAX_MODEL_LEN    = "4096"

Nenhum container customizado é necessário. O container LMI baixa o modelo do Hugging Face na inicialização e o serve via vLLM com paralelismo tensorial em 4 GPUs A10G. O paralelismo tensorial divide o modelo entre múltiplas GPUs para que cada uma processe uma parte da computação em paralelo.

A regra prática sugerida no artigo: use GGUF e llama.cpp quando quiser o caminho de implantação mais leve. Use pesos mesclados com vLLM, SGLang ou backend LMI quando throughput, batching, concorrência ou topologia de hardware se tornarem as restrições dominantes.

Padrão 4: Amazon EKS ou Amazon ECS quando a inferência precisa se encaixar no ambiente existente

Para equipes que já padronizaram em Kubernetes ou Amazon ECS, faz mais sentido empacotar o runtime do Unsloth nesse ambiente do que introduzir uma superfície de serving separada apenas para modelos. Esse padrão é especialmente útil quando a inferência precisa conviver com outros serviços de aplicação, quando já existe tooling robusto em torno do Amazon EKS ou Amazon ECS, ou quando deployment, rede, observabilidade e segurança já estão padronizados na camada de infraestrutura.

Para equipes que precisam de infraestrutura de cluster gerenciada para treinamento e inferência em larga escala, o Amazon SageMaker HyperPod também vale ser avaliado, embora o artigo original foque em padrões de implantação apenas de inferência.

Práticas operacionais que fazem diferença em produção

Mantenha a formatação de prompts consistente de ponta a ponta

Formatação inconsistente de prompts é uma das formas mais comuns de diagnosticar erroneamente um bom modelo como uma implantação ruim. Quando um modelo exportado se comporta pior fora do Unsloth, o problema geralmente não é o método de quantização — é uma incompatibilidade no template de chat, no tratamento do token de fim de sequência (EOS) ou na estrutura do prompt entre treino e inferência. Consulte a documentação de templates de chat do Unsloth para detalhes sobre configuração de template no momento da exportação.

Avalie o formato completo de implantação, não apenas o nível de quantização

Um benchmark de quantização isolado não é suficiente. O comportamento real depende do tamanho do contexto, concorrência, mix de requisições, comportamento de streaming, caminho de inicialização e o próprio runtime. O Amazon SageMaker AI também oferece recomendações de inferência que podem ajudar a identificar tipos de instância e configurações otimizadas.

Use entrega estável de artefatos

Após finalizar o modelo, promova-o por um caminho de armazenamento previsível. No AWS, isso geralmente significa armazenar o arquivo de modelo escolhido no Amazon S3 e carregá-lo a partir daí, em vez de depender de downloads em tempo de execução de fontes externas durante a inicialização.

Monitore o serviço, não apenas o modelo

Performance em produção não é só sobre qualidade dos tokens — é também sobre tempo de inicialização, latência de cauda, concorrência, comportamento de escalonamento e características de carregamento do modelo. Endpoints gerenciados tornam isso mais visível porque é possível acompanhar métricas de invocação e sinais de escalonamento diretamente pelo Amazon CloudWatch.

Valide o contrato do container com antecedência

Se estiver implantando no Amazon SageMaker AI com um container customizado, valide o container localmente antes de fazer o deploy. Certifique-se de que /ping e /invocations se comportam corretamente e que o runtime sobrevive a tamanhos de prompt realistas. Consulte o guia de containers customizados do Amazon SageMaker para a especificação completa da interface.

Projete segurança e rede desde o início

Serving de modelos frequentemente se torna parte de um ambiente de aplicação maior, o que significa que rede, escopo de papéis IAM, acesso à internet, criptografia com o Serviço de Gerenciamento de Chaves AWS (AWS KMS) e posicionamento na Nuvem Privada Virtual (VPC) importam tanto quanto a performance do runtime. Tome essas decisões desde o início. Habilite o AWS CloudTrail para registro de auditoria em nível de API. Consulte a documentação de segurança de infraestrutura do Amazon SageMaker para orientações sobre configuração de VPC e criptografia.

Próximos passos

Para ver esses padrões em ação, o artigo original recomenda clonar o repositório GitHub de exemplo e executar terraform apply para implantar tanto um endpoint GGUF quantizado quanto um endpoint vLLM de precisão total no Amazon SageMaker AI. O Terraform provisiona toda a infraestrutura e uma instância de Notebook do Amazon SageMaker com o repositório pré-clonado, permitindo executar o notebook de comparação imediatamente.

O notebook envia prompts de imagem idênticos para ambos os endpoints, demonstrando inferência multimodal de visão-linguagem com o Qwen3-VL, e produz comparações lado a lado de qualidade de saída, latência, throughput e custo. Ele também inclui um framework de benchmarking que avalia ambos os modelos com métricas objetivas de qualidade (correspondência exata, BLEU, ROUGE-L), permitindo quantificar a degradação causada pela quantização em vez de depender de julgamento subjetivo.

Para evitar cobranças contínuas ao terminar, basta executar terraform destroy para remover os recursos provisionados.

Para aprofundamento, o artigo original indica:

Fonte

Deploying quantized models on Amazon SageMaker AI with Unsloth (https://aws.amazon.com/blogs/machine-learning/deploying-quantized-models-on-amazon-sagemaker-ai-with-unsloth/)

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *