Amazon SageMaker AI Async Inference agora suporta payloads inline nas requisições

O que mudou no SageMaker AI Async Inference

A AWS anunciou suporte a payloads inline para o Amazon SageMaker AI Async Inference. A partir de agora, é possível enviar os dados de entrada diretamente no corpo da requisição da API InvokeEndpointAsync, sem precisar fazer upload do payload no Amazon Simple Storage Service (S3) antes de cada chamada. Para payloads de até 128.000 bytes, isso elimina uma viagem de rede completa, simplifica o código do lado do cliente e reduz a superfície operacional das cargas de trabalho de inferência assíncrona.

Como funcionava antes

O Amazon SageMaker AI Async Inference é indicado para enfileirar requisições de inferência e processá-las de forma assíncrona. É uma boa escolha para cargas de trabalho com payloads grandes, tráfego variável ou tolerância a latências de segundos a minutos. O serviço suporta escalonamento automático até zero, tornando-o eficiente em custo para workloads intermitentes ou em estilo batch.

Até então, o fluxo de trabalho exigia duas etapas a cada invocação:

  • Fazer upload do payload de entrada em um bucket do Amazon S3.
  • Invocar o endpoint passando o URI do objeto S3 como InputLocation.

O endpoint processava a requisição de forma assíncrona e gravava o resultado em um local de saída S3 configurado, que o cliente monitorava por polling ou recebia via notificação do Amazon Simple Notification Service (SNS).

Esse padrão de duas etapas funciona bem para payloads grandes — imagens, áudios, documentos com vários megabytes. Mas para quem trabalhava com payloads pequenos (em kilobytes) e precisava de tempos de processamento maiores do que a inferência em tempo real permite, a dependência obrigatória do S3 adicionava complexidade desnecessária.

O que é novo: payload inline via parâmetro Body

Com o lançamento, a API InvokeEndpointAsync passa a aceitar um novo parâmetro chamado Body. Quando presente, o payload é enviado inline na própria requisição da API, sem necessidade de upload no S3. Veja os detalhes principais:

  • Novo parâmetro: Body, em bytes brutos, limitado a 128.000 bytes.
  • Tamanho máximo inline: 128.000 bytes (payload bruto).
  • Exclusividade mútua: Body e InputLocation são mutuamente exclusivos. A API rejeita requisições que definam os dois ao mesmo tempo.
  • Comportamento de saída: sem alteração. A saída continua sendo gravada no OutputLocation no S3.
  • Compatibilidade com endpoints: projetado para funcionar com endpoints assíncronos existentes, sem necessidade de alterações no modelo ou no container.
  • Tratamento de erros: violações de tamanho e de exclusividade mútua retornam respostas síncronas de ValidationError.
  • Disponibilidade: disponível em 31 regiões comerciais da AWS, incluindo GRU (São Paulo).

Antes e depois: a experiência na prática

A mudança fica mais clara no código. Os dois exemplos a seguir realizam a mesma invocação assíncrona contra o mesmo endpoint. O primeiro usa o passo de upload no S3 que era obrigatório até então; o segundo usa o parâmetro inline Body que o substitui.

Antes: upload no S3 primeiro, depois invocação

import boto3, json, uuid

s3 = boto3.client("s3")
sagemaker_runtime = boto3.client("sagemaker-runtime")

payload = json.dumps({"inputs": "your prompt here"}).encode("utf-8")

# 1. Upload the request payload to S3 (extra latency + cost)
input_key = f"async-input/{uuid.uuid4()}.json"
s3.put_object(Bucket="my-async-bucket", Key=input_key, Body=payload)
input_location = f"s3://my-async-bucket/{input_key}"

# 2. Invoke the endpoint
response = sagemaker_runtime.invoke_endpoint_async(
    EndpointName="my-async-endpoint",
    InputLocation=input_location,
    ContentType="application/json",
)

print(response["OutputLocation"])

Essa abordagem exige:

  • Um cliente S3 e um bucket de entrada provisionados.
  • Permissão IAM (Gerenciamento de Identidade e Acesso) s3:PutObject para o chamador.
  • Um esquema de nomenclatura (UUID ou similar) para evitar colisões de chave.
  • Uma estratégia de limpeza para objetos de entrada obsoletos.

Depois: envio do payload inline

import boto3, json

sagemaker_runtime = boto3.client("sagemaker-runtime")

payload = json.dumps({"inputs": "your prompt here"}).encode("utf-8")

# One call, no S3 upload, no input bucket needed
response = sagemaker_runtime.invoke_endpoint_async(
    EndpointName="my-async-endpoint",
    Body=payload,
    ContentType="application/json",
)

print(response["OutputLocation"])

Sem cliente S3, sem UUID, sem bucket de entrada, sem permissões IAM no caminho de entrada e sem limpeza de objetos obsoletos.

Benefícios concretos para quem usa o serviço

Enviar o payload inline remove uma viagem de rede e uma dependência de cada requisição. Isso se traduz em cinco benefícios práticos:

  • Latência reduzida: uma viagem de rede e um S3 PUT a menos por requisição. Para workloads com alta paralelização, essa economia de latência se multiplica de forma significativa.
  • Arquitetura mais simples: elimina o provisionamento do bucket de entrada, políticas de ciclo de vida, padrões de acesso entre contas e a permissão IAM s3:PutObject no caminho de entrada do chamador.
  • Menos caminhos de erro: a requisição é uma única chamada de API. Ou ela entra na fila, ou não entra.
  • Custo menor: remove a cobrança do S3 PUT para o upload de entrada em cada invocação inline.
  • Validação imediata: erros de tamanho e de exclusividade mútua são retornados de forma síncrona.

Quando usar cada abordagem

Payloads inline são geralmente a escolha mais simples para entradas pequenas, mas o InputLocation ainda tem seu lugar. A tabela abaixo ajuda a decidir qual caminho se encaixa melhor em cada cenário:

  • Payload ≤ 128.000 bytes (prompts JSON, dados estruturados): use Body inline. Mais simples, evita uma viagem de rede e as cobranças de S3 PUT.
  • Payload > 128.000 bytes (imagens, áudios, documentos grandes): use InputLocation. Faça upload no S3 primeiro.
  • Workload misto com tamanhos variáveis de payload: ramifique por tamanho. Use Body para os pequenos e InputLocation para os grandes.
  • Necessidade de manter os dados de entrada no S3 para auditoria ou replay: use InputLocation. Mantém as entradas no seu bucket.

Como começar a usar

Consulte o notebook de exemplo com o passo a passo completo. Antes de começar, certifique-se de ter:

  • Um endpoint Amazon SageMaker AI Async Inference existente (verifique com aws sagemaker describe-endpoint --endpoint-name my-async-endpoint).
  • A versão mais recente do AWS SDK para Python (Boto3) instalada e configurada com credenciais.
  • Permissões IAM para sagemaker:InvokeEndpointAsync.
  • Um bucket S3 de saída configurado para o seu endpoint assíncrono (por exemplo, my-output-bucket).

Atenção: seguir este guia utiliza recursos AWS faturáveis. Endpoints de inferência assíncrona do SageMaker AI geram cobranças por horas de instância, e buckets S3 geram cobranças por armazenamento e requisições. Siga os passos de limpeza após concluir o tutorial para evitar cobranças contínuas.

Passos para ativar o suporte a payload inline

O suporte a payload inline já está disponível. Para utilizá-lo:

  • Atualize o AWS SDK. Instale ou atualize o Boto3 para a versão mais recente: pip install --upgrade boto3. Verifique a instalação com pip show boto3.
  • Substitua o código de invocação. Na sua aplicação, troque o padrão de upload no S3 + InputLocation pelo parâmetro direto Body, conforme o exemplo de código acima.
  • Teste a invocação chamando a API InvokeEndpointAsync com o parâmetro Body. Verifique se a resposta contém o campo OutputLocation.
  • Monitore o OutputLocation no S3 para confirmar que o resultado da inferência foi gravado com sucesso.

Nenhuma alteração é necessária na configuração do endpoint, no container do modelo ou na configuração do S3 de saída.

Limpeza dos recursos

Para evitar cobranças contínuas, exclua os recursos utilizados:

  • Exclua o endpoint SageMaker AI se foi criado apenas para testes: aws sagemaker delete-endpoint --endpoint-name my-async-endpoint
  • Exclua o bucket S3 de saída (se não for mais necessário). Atenção: excluir um bucket S3 remove permanentemente os objetos dentro dele. Certifique-se de ter feito backup dos resultados de inferência que precisar manter: aws s3 rb s3://my-output-bucket --force
  • Remova quaisquer políticas IAM criadas especificamente para este tutorial.

Conclusão

O suporte a payloads inline no SageMaker AI Async Inference remove um ponto de atrito comum nos fluxos de trabalho de inferência assíncrona: o upload obrigatório no S3 para cada requisição. Para a maioria dos payloads de inferência que cabem dentro de 128.000 bytes, agora é possível fazer uma única chamada de API e deixar o SageMaker AI cuidar do resto.

O recurso foi projetado para ser compatível com versões anteriores. Os fluxos de trabalho existentes com InputLocation continuam funcionando sem alterações. Tanto as entradas inline quanto as entradas via S3 são processadas de forma idêntica após a aceitação da requisição, e os modelos recebem requisições idênticas independentemente da origem da entrada.

Para começar, basta atualizar o AWS SDK e usar o parâmetro Body na API SageMaker AI InvokeEndpointAsync. Para saber mais sobre inferência assíncrona, consulte a documentação do Amazon SageMaker AI Async Inference.

Fonte

Amazon SageMaker AI Async Inference now supports inline request payloads (https://aws.amazon.com/blogs/machine-learning/amazon-sagemaker-ai-async-inference-now-supports-inline-request-payloads/)

Comments

Leave a Reply

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