As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.
Endpoints de inferência de IA generativa de referência
O serviço de benchmarking de SageMaker IA mede o desempenho de modelos de linguagem grande (LLMs) hospedados em endpoints de SageMaker IA. Ele executa benchmarks usando o NVIDIA AiPerf, produzindo métricas como latência da solicitação, taxa de transferência, tempo até o primeiro token e latência entre tokens.
Pré-requisitos
Antes de criar um trabalho de referência, você precisa do seguinte:
-
Um endpoint de SageMaker IA em
InServicestatus hospedando um LLM que suporta a API de conclusão de OpenAI-compatible bate-papo -
Um bucket Amazon S3 para resultados de benchmark
-
Uma função de execução do IAM que concede acesso à SageMaker IA ao seu endpoint e bucket de saída
Etapa 1: criar um trabalho de referência
Um trabalho de benchmark tem como alvo um endpoint de SageMaker IA específico e faz referência a uma configuração de carga de trabalho.
Python (boto3)
response = client.create_ai_benchmark_job( AIBenchmarkJobName="my-benchmark-job", BenchmarkTarget={ "Endpoint": { "Identifier": "my-sagemaker-endpoint" } }, OutputConfig={ "S3OutputLocation": "s3://DOC-EXAMPLE-BUCKET/benchmark-results/" }, AIWorkloadConfigIdentifier="my-benchmark-config", RoleArn="arn:aws:iam::111122223333:role/ExampleRole", ) print(response["AIBenchmarkJobArn"])
AWS CLI
aws sagemaker create-ai-benchmark-job \ --ai-benchmark-job-name "my-benchmark-job" \ --benchmark-target '{"Endpoint": {"Identifier": "my-sagemaker-endpoint"}}' \ --output-config '{"S3OutputLocation": "s3://DOC-EXAMPLE-BUCKET/benchmark-results/"}' \ --ai-workload-config-identifier "my-benchmark-config" \ --role-arn "arn:aws:iam::111122223333:role/ExampleRole" \ --region us-west-2
Se seu endpoint hospeda vários modelos por meio de componentes de inferência, você pode especificá-los no InferenceComponents parâmetro do. BenchmarkTarget
Se seu endpoint estiver em uma VPC, passe NetworkConfig o parâmetro com VpcConfig suas configurações, incluindo IDs de grupos de segurança e sub-redes.
Para acompanhar os resultados do benchmark com MLflow totalmente gerenciado em SageMaker IA, adicione um MlflowConfig objeto a. OutputConfig Para obter mais informações, consulte Acompanhe as recomendações de inferência e os resultados de benchmark com o MLflow.
Componentes de inferência de benchmark
Se seu endpoint usa componentes de inferência em vez de implantar um modelo diretamente, você deve especificar os componentes de inferência a serem comparados no. BenchmarkTarget Quando os componentes de inferência são especificados, o serviço de benchmarking encaminha as solicitações para esses componentes específicos, em vez do modelo padrão do endpoint.
Passe um ou mais nomes de componentes de inferência ou ARNs na InferenceComponents lista:
Python (boto3)
response = client.create_ai_benchmark_job( AIBenchmarkJobName="my-ic-benchmark", BenchmarkTarget={ "Endpoint": { "Identifier": "my-multi-model-endpoint", "InferenceComponents": [ {"Identifier": "my-inference-component-llama"} ] } }, OutputConfig={ "S3OutputLocation": "s3://DOC-EXAMPLE-BUCKET/benchmark-results/" }, AIWorkloadConfigIdentifier="my-benchmark-config", RoleArn="arn:aws:iam::111122223333:role/ExampleRole", )
AWS CLI
aws sagemaker create-ai-benchmark-job \ --ai-benchmark-job-name "my-ic-benchmark" \ --benchmark-target '{ "Endpoint": { "Identifier": "my-multi-model-endpoint", "InferenceComponents": [ {"Identifier": "my-inference-component-llama"} ] } }' \ --output-config '{"S3OutputLocation": "s3://DOC-EXAMPLE-BUCKET/benchmark-results/"}' \ --ai-workload-config-identifier "my-benchmark-config" \ --role-arn "arn:aws:iam::111122223333:role/ExampleRole" \ --region us-west-2
nota
Se seu endpoint estiver configurado para componentes de inferência, mas você não especificar InferenceComponents no destino do benchmark, o trabalho falhará com um erro indicando que nenhum modelo foi implantado diretamente no endpoint. Sempre inclua o InferenceComponents parâmetro ao comparar endpoints baseados em componentes de inferência.
Compare endpoints multi-LoRa
Para comparar um endpoint que atende a vários adaptadores LoRa, especifique cada adaptador como um componente de inferência no. BenchmarkTarget Opcionalmente, você pode usar o parâmetro model_selection_strategy de carga de trabalho para controlar como o benchmark distribui as solicitações entre os adaptadores. Se você não especificar uma estratégia, o padrão seráround_robin.
Primeiro, crie uma configuração de carga de trabalho. O exemplo a seguir inclui o model_selection_strategy parâmetro opcional:
# Create a workload config for multi-LoRA benchmarking workload_spec = { "benchmark": {"type": "aiperf"}, "parameters": { "prompt_input_tokens_mean": 550, "output_tokens_mean": 150, "concurrency": 10, "streaming": True, "tokenizer": "meta-llama/Llama-3.2-1B", "model_selection_strategy": "round_robin" }, "secrets": { "hf_token": "arn:aws:secretsmanager:us-west-2:111122223333:secret:my-hf-token-AbCdEf" }, "tooling": {"api_standard": "openai"} } import json client.create_ai_workload_config( AIWorkloadConfigName="multi-lora-config", WorkloadSpec={"Inline": json.dumps(workload_spec)} )
Em seguida, crie um trabalho de benchmark que tenha como alvo todos os componentes de inferência do adaptador LoRa:
response = client.create_ai_benchmark_job( AIBenchmarkJobName="multi-lora-benchmark", BenchmarkTarget={ "Endpoint": { "Identifier": "my-lora-endpoint", "InferenceComponents": [ {"Identifier": "lora-adapter-customer-support"}, {"Identifier": "lora-adapter-code-generation"}, {"Identifier": "lora-adapter-summarization"} ] } }, OutputConfig={ "S3OutputLocation": "s3://DOC-EXAMPLE-BUCKET/multi-lora-results/" }, AIWorkloadConfigIdentifier="multi-lora-config", RoleArn="arn:aws:iam::111122223333:role/ExampleRole", )
O model_selection_strategy parâmetro é opcional e determina como a ferramenta de benchmark distribui as solicitações nos componentes de inferência especificados. Os valores válidos são:
-
round_robin(padrão) — cada adaptador recebe solicitações em ordem. A enésima solicitação é enviada para o adaptador (no modo número de modelos). -
random— cada solicitação é atribuída a um adaptador de maneira uniforme e aleatória.
Se você não especificarmodel_selection_strategy, o benchmark usará round_robin por padrão.
Compare endpoints multimodais com imagens sintéticas
Você pode comparar modelos de linguagem de visão gerando imagens sintéticas como parte da configuração da carga de trabalho. O serviço de benchmarking usa o AiPerf para criar imagens com dimensões e formato configuráveis e, em seguida, as envia como cargas codificadas em base64 para seu endpoint.
O exemplo a seguir cria uma configuração de carga de trabalho para comparar um modelo de linguagem de visão com imagens sintéticas:
import json workload_spec = { "benchmark": {"type": "aiperf"}, "parameters": { "image_width_mean": 640, "image_height_mean": 480, "prompt_input_tokens_mean": 100, "output_tokens_mean": 150, "concurrency": 8, "request_count": 100, "streaming": True, "tokenizer": "meta-llama/Llama-3.2-1B" }, "secrets": { "hf_token": "arn:aws:secretsmanager:us-west-2:111122223333:secret:my-hf-token-AbCdEf" } } client.create_ai_workload_config( AIWorkloadConfigName="image-benchmark-config", WorkloadSpec={"Inline": json.dumps(workload_spec)} )
Os seguintes parâmetros controlam a geração de imagens sintéticas:
| Parâmetro | Tipo | Padrão | Description |
|---|---|---|---|
image_width_mean |
flutuação | Nenhum | Largura média da imagem em pixels. |
image_width_stddev |
flutuação | Nenhum | Desvio padrão da largura da imagem. Defina para variar as dimensões da imagem em todas as solicitações. |
image_height_mean |
flutuação | Nenhum | Altura média da imagem em pixels. |
image_height_stddev |
flutuação | Nenhum | Desvio padrão da altura da imagem. |
image_batch_size |
int | 1 | Número de imagens por solicitação. |
image_format |
string | png | Formato da imagem. Valores válidos: png (sem perdas), jpeg (com perdas, arquivos menores), (seleciona aleatoriamente PNG ou random JPEG por imagem). |
Variable-size imagens
Use parâmetros de desvio padrão para gerar imagens com dimensões variadas, simulando cargas de trabalho do mundo real em que os tamanhos das imagens são diferentes:
workload_spec = { "benchmark": {"type": "aiperf"}, "parameters": { "image_width_mean": 800, "image_width_stddev": 200, "image_height_mean": 600, "image_height_stddev": 150, "image_batch_size": 2, "concurrency": 4, "request_count": 50, "streaming": True, "tokenizer": "meta-llama/Llama-3.2-1B" } }
Compare endpoints multimodais com vídeo sintético
Você pode comparar modelos multimodais que processam entradas de vídeo gerando vídeos sintéticos como parte da configuração da carga de trabalho. O serviço de benchmarking usa a geração de vídeo sintético do AiPerf para criar vídeos com resolução, taxa de quadros, duração e codificação configuráveis e, em seguida, os envia como cargas codificadas em base64 para seu endpoint.
nota
A geração de vídeo está desativada por padrão. Você deve especificar ambos video_width e video_height em sua configuração de carga de trabalho para habilitá-lo.
O exemplo a seguir cria uma configuração de carga de trabalho para comparar um modelo multimodal com vídeo sintético com resolução de 640 × 480:
import json workload_spec = { "benchmark": {"type": "aiperf"}, "parameters": { "video_width": 640, "video_height": 480, "video_fps": 4, "video_duration": 5.0, "output_tokens_mean": 150, "concurrency": 4, "request_count": 50, "streaming": True, "tokenizer": "meta-llama/Llama-3.2-1B" }, "secrets": { "hf_token": "arn:aws:secretsmanager:us-west-2:111122223333:secret:my-hf-token-AbCdEf" } } client.create_ai_workload_config( AIWorkloadConfigName="video-benchmark-config", WorkloadSpec={"Inline": json.dumps(workload_spec)} )
Parâmetros de vídeo
Os seguintes parâmetros controlam a geração de vídeo sintético:
| Parâmetro | Tipo | Padrão | Description |
|---|---|---|---|
video_width |
int | Nenhum | Largura da moldura em pixels. Deve ser definido com video_height para permitir a geração de vídeo. |
video_height |
int | Nenhum | Altura do quadro em pixels. Deve ser definido com video_width para permitir a geração de vídeo. |
video_fps |
int | 4 | Quadros por segundo. |
video_duration |
flutuação | 5,0 | Duração do clipe em segundos. |
video_batch_size |
int | 1 | Número de vídeos por solicitação. |
video_synth_type |
string | formas_móveis | Padrão de síntese. Valores válidos: moving_shapes (formas geométricas animadas), grid_clock (grade com animação de relógio), noise (ruído aleatório de pixels). |
video_format |
string | webm | Formato de contêiner. Valor válido: webm. |
video_codec |
string | libvpx-vp9 | Codec de vídeo. Valor suportado: libvpx-vp9 (VP9, WebM). |
nota
O serviço de benchmarking suporta a codificação VP9 somente com o formato WebM.
Faixas de áudio incorporadas
Para modelos que processam vídeo e áudio juntos, você pode incorporar uma faixa de áudio sintética nos vídeos gerados. O áudio está desativado por padrão. video_audio_num_channelsDefina como 1 (mono) ou 2 (estéreo) para ativá-lo.
| Parâmetro | Tipo | Padrão | Description |
|---|---|---|---|
video_audio_num_channels |
int | 0 | 0 = desativado, 1 = mono, 2 = estéreo. |
video_audio_sample_rate |
int | 44100 | Taxa de amostragem em Hz (8000—96000). |
video_audio_codec |
string | auto | Codec de áudio. Auto-selects libvorbispara WebM e MP4aac. Você pode substituir por aaclibvorbis, oulibopus. |
video_audio_depth |
int | 16 | Profundidade de bits por amostra (8, 16, 24 ou 32). |
Exemplos de benchmarking de vídeo
Low-resolution compreensão de vídeo
workload_spec = { "benchmark": {"type": "aiperf"}, "parameters": { "video_width": 320, "video_height": 240, "video_fps": 2, "video_duration": 3.0, "video_synth_type": "moving_shapes", "concurrency": 4, "request_count": 50, "streaming": True, "tokenizer": "meta-llama/Llama-3.2-1B" } }
Análise comparativa de vídeo em HD
workload_spec = { "benchmark": {"type": "aiperf"}, "parameters": { "video_width": 1920, "video_height": 1080, "video_fps": 8, "video_duration": 10.0, "concurrency": 2, "request_count": 20, "streaming": True, "tokenizer": "meta-llama/Llama-3.2-1B" } }
Vídeo com áudio para modelos multimodais
workload_spec = { "benchmark": {"type": "aiperf"}, "parameters": { "video_width": 640, "video_height": 480, "video_fps": 4, "video_duration": 5.0, "video_audio_num_channels": 1, "video_audio_sample_rate": 16000, "concurrency": 4, "request_count": 50, "streaming": True, "tokenizer": "meta-llama/Llama-3.2-1B" } }
Texto e vídeo mistos
Combine vídeo com instruções de texto para cargas de trabalho de resposta a perguntas ou legendas em vídeo:
workload_spec = { "benchmark": {"type": "aiperf"}, "parameters": { "video_width": 640, "video_height": 480, "video_fps": 4, "video_duration": 5.0, "prompt_input_tokens_mean": 100, "output_tokens_mean": 50, "concurrency": 8, "request_count": 100, "streaming": True, "tokenizer": "meta-llama/Llama-3.2-1B" } }
Considerações sobre a performance
-
Resoluções e taxas de quadros mais altas aumentam o tempo de codificação do vídeo e o tamanho da carga útil. Para testes de alto rendimento, use resoluções mais baixas (320 × 240 ou 640 × 480).
-
O VP9 (
libvpx-vp9) com formato WebM é o único codec compatível e fornece boa compactação para benchmarking de cargas úteis. -
O áudio adiciona uma sobrecarga mínima em comparação com o fluxo de vídeo. Use mono (
1) a 16 kHz para cargas de trabalho focadas na fala.
Etapa 2: Monitorar o status do trabalho
Pesquise o status do trabalho até que ele atinja um estado terminal.
Python (boto3)
import time while True: response = client.describe_ai_benchmark_job( AIBenchmarkJobName="my-benchmark-job" ) status = response["AIBenchmarkJobStatus"] print(f"Status: {status}") if status in ("Completed", "Failed", "Stopped"): break time.sleep(30) if status == "Completed": print(f"Results at: {response['OutputConfig']['S3OutputLocation']}") elif status == "Failed": print(f"Job failed: {response.get('FailureReason', 'unknown')}")
AWS CLI
aws sagemaker describe-ai-benchmark-job \ --ai-benchmark-job-name "my-benchmark-job" \ --region us-west-2
Etapa 3: Analise os resultados do benchmark
Os resultados do benchmark são gravados no local de saída do Amazon S3 que você especificou. Os resultados incluem as seguintes métricas principais:
request_throughput-
Solicitações por segundo.
request_latency-
End-to-end latência de solicitação com detalhamentos de percentis (P50, P90, P99).
time_to_first_token-
Tempo desde o envio da solicitação até o primeiro token recebido.
inter_token_latency-
Tempo entre tokens de saída consecutivos.
output_token_throughput-
Tokens de saída gerados por segundo.
Cada métrica inclui resumos estatísticos: média, mínimo, máximo, P50, P90, P99 e desvio padrão.
Compare endpoints com formato personalizado
Se o seu endpoint usa um formato personalizado de solicitação ou resposta (por exemplo, manipuladores personalizados DJL, formato TensorRT-LLM nativo ou outras estruturas de atendimento que não suportam a API de conclusão de chat do OpenAI), você pode compará-lo usando um modelo Jinja2 para definir a forma da carga útil do seu endpoint.
O serviço de benchmarking renderiza o modelo por solicitação com solicitações sintéticas ou personalizadas e, em seguida, encaminha a carga para seu endpoint de IA. SageMaker Você também especifica uma consulta JMESPath para extrair o texto gerado da resposta do seu endpoint.
Crie o modelo de carga
Defina o formato de solicitação do seu endpoint como um arquivo de modelo Jinja2. As seguintes variáveis estão disponíveis no modelo:
| Variável | Description |
|---|---|
text |
Primeiro conteúdo de texto (sintético ou do conjunto de dados). |
texts |
Lista de todo o conteúdo do texto. |
model |
Nome do modelo. |
max_tokens |
Limite do token de saída. |
stream |
Se o streaming está ativado. |
Use o |tojson filtro para o escape JSON adequado dos valores da string. O exemplo a seguir mostra um modelo para um endpoint DJL com formato de chamada de ferramenta:
{ "messages": [{"role": "user", "content": {{ text|tojson }}}], "tools": [ {"function": {"name": "Chit_Chat", "description": "casual conversation", "parameters": {"type": "object", "properties": {}}}} ], "max_tokens": {{ max_tokens }} }
Faça o upload do arquivo de modelo para o Amazon S3 (por exemplo,s3://DOC-EXAMPLE-BUCKET/templates/my_endpoint_template.jinja).
Crie a configuração da carga de trabalho
Crie uma configuração de carga de trabalho que faça referência ao arquivo de modelo. Use o extra_inputs parâmetro para especificar o caminho do modelo e a consulta de extração da resposta. Entregue o arquivo de modelo ao contêiner de benchmark por meio de um DatasetConfig canal.
import json TEMPLATE_LOCAL_PATH = "/opt/ml/input/data/template/my_endpoint_template.jinja" RESPONSE_FIELD = "generation_details.generations[0].content" workload_spec = { "benchmark": {"type": "aiperf"}, "parameters": { "extra_inputs": f"payload_template:{TEMPLATE_LOCAL_PATH} response_field:{RESPONSE_FIELD}", "tokenizer": "meta-llama/Llama-3.2-1B", # ... other benchmark parameters (concurrency, request_count, etc.) }, } response = client.create_ai_workload_config( AIWorkloadConfigName="custom-format-config", AIWorkloadConfigs={"WorkloadSpec": {"Inline": json.dumps(workload_spec)}}, DatasetConfig={ "InputDataConfig": [ { "ChannelName": "template", "DataSource": { "S3DataSource": { "S3Uri": "s3://DOC-EXAMPLE-BUCKET/templates/my_endpoint_template.jinja", } }, } ] }, )
ChannelNameDetermina onde o arquivo aparece dentro do contêiner de benchmark. Um canal chamado template disponibiliza o arquivo em/opt/ml/input/data/template/<filename>.
O response_field valor é uma consulta JMESPath
-
choices[0].message.content— Formato OpenAI -
generation_details.generations[0].content— Formato DJL -
output.text— resposta de texto simples
Se você omitirresponse_field, a ferramenta de benchmarking detectará automaticamente o formato da resposta.
Execute o benchmark
Crie um trabalho de referência direcionado ao seu endpoint. O serviço detecta automaticamente o modo de modelo a partir da payload_template chave extra_inputs e encaminha as solicitações pelo caminho de proxy apropriado.
response = client.create_ai_benchmark_job( AIBenchmarkJobName="custom-format-benchmark", BenchmarkTarget={"Endpoint": {"Identifier": "my-custom-endpoint"}}, OutputConfig={"S3OutputLocation": "s3://DOC-EXAMPLE-BUCKET/results/"}, AIWorkloadConfigIdentifier="custom-format-config", RoleArn="arn:aws:iam::111122223333:role/ExampleRole", )
Considerações
-
Os modelos devem ser entregues como arquivos por meio do Amazon S3. Os modelos JSON embutidos na
extra_inputsstring não são suportados porque as vírgulas no JSON entram em conflito com o analisador de parâmetros. -
Há suporte para endpoints com um único componente de inferência. Não há suporte para endpoints com vários componentes de inferência no modo modelo porque o serviço não pode determinar para qual componente rotear cada solicitação a partir de um formato arbitrário de carga útil.
-
Tanto os endpoints de streaming quanto os de não streaming são suportados. Defina
"streaming": trueou"streaming": falsenos parâmetros da carga de trabalho.
Correlacione solicitações e respostas de benchmark
Após a conclusão de um trabalho de benchmark, os artefatos de saída incluem dados de entrada e saída por solicitação que você pode unir para pós-processamento. Isso permite casos de uso como avaliação de qualidade, auditoria de segurança, comparação de respostas entre configurações e depuração de comportamento inesperado do modelo.
Artefatos de saída de referência
O output.tar.gz arquivamento em seu local de saída do Amazon S3 contém os seguintes arquivos relevantes para a correlação de resposta rápida:
inputs.json-
O conjunto completo de dados sintéticos das conversas geradas. Cada registro tem uma
session_idcarga útil de solicitação completa (mensagens, max_tokens, modelo). outputs.json-
Per-request metadados de resposta para solicitações enviadas ao endpoint. Cada registro inclui o texto de resposta do modelo, a latência por solicitação, a contagem de tokens de saída e um
conversation_idque é mapeado de volta para a entrada.
Unir entradas às saídas
Correlacione as solicitações com suas respostas usando o conversation_id campo em outputs.json e o session_id campo em: inputs.json
import json # Load the artifacts extracted from output.tar.gz in your S3 output location with open("inputs.json") as f: inputs = json.load(f) with open("outputs.json") as f: outputs = json.load(f) # Build lookup tables and join inputs_by_id = {rec["session_id"]: rec for rec in inputs["data"]} outputs_by_id = {rec["conversation_id"]: rec for rec in outputs["data"]} matched_ids = set(inputs_by_id.keys()) & set(outputs_by_id.keys()) print(f"Matched: {len(matched_ids)} prompt-response pairs") # Display a correlated sample for sid in sorted(matched_ids)[:3]: in_rec = inputs_by_id[sid] out_rec = outputs_by_id[sid] prompt = in_rec["payloads"][0]["messages"][0]["content"][:100] response = out_rec.get("response_text", "")[:100] latency = out_rec["metrics"]["request_latency"] print(f"\n[{sid}] Latency: {latency:.0f}ms") print(f" Prompt: {prompt}...") print(f" Response: {response}...")
Observações importantes
-
Chave de junção. Use
conversation_idinoutputs.jsonpara jogar contrasession_idininputs.json. Não usesession_numcomo índice posicional — ele representa a ordem de execução, que difere da ordem de criação da entrada quando a simultaneidade é maior que 1. -
Nem todas as entradas têm saídas. O
inputs.jsonarquivo contém todo o conjunto de dados gerado. Quandorequest_counté menor que o tamanho do pool, somente um subconjunto de conversas é enviado para o endpoint. As entradas incomparáveis são conversas que foram geradas, mas não usadas. -
Esquema de saída. Cada registro
outputs.jsoninclui os camposconversation_idresponse_text,,metrics(comrequest_latencyeoutput_sequence_length) e temporização (request_start_ns,request_end_ns).
Gerencie recursos de benchmark
Use as operações a seguir para gerenciar seus trabalhos de referência e configurações de carga de trabalho.
# List benchmark jobs response = client.list_ai_benchmark_jobs(MaxResults=10) for job in response["AIBenchmarkJobs"]: print(f"{job['AIBenchmarkJobName']} - {job['AIBenchmarkJobStatus']}") # Stop a running job client.stop_ai_benchmark_job( AIBenchmarkJobName="my-benchmark-job" ) # Delete a job (must be in a terminal state) client.delete_ai_benchmark_job( AIBenchmarkJobName="my-benchmark-job" ) # List workload configurations response = client.list_ai_workload_configs(MaxResults=10) for config in response["AIWorkloadConfigs"]: print(f"{config['AIWorkloadConfigName']} - {config['AIWorkloadConfigArn']}") # Delete a workload configuration client.delete_ai_workload_config( AIWorkloadConfigName="my-benchmark-config" )