

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 생성형 AI 추론 엔드포인트 벤치마크
<a name="generative-ai-inference-recommendations-benchmark"></a>

SageMaker AI 벤치마킹 서비스는 SageMaker AI 엔드포인트에서 호스팅되는 대규모 언어 모델(LLMs)의 성능을 측정합니다. NVIDIA AIPerf를 사용하여 벤치마크를 실행하여 요청 지연 시간, 처리량, 첫 번째 토큰까지의 시간, 토큰 간 지연 시간과 같은 지표를 생성합니다.

## 사전 조건
<a name="generative-ai-inference-recommendations-benchmark-prereqs"></a>

벤치마크 작업을 생성하기 전에 다음이 필요합니다.
+ OpenAI 호환 채팅 완료 API를 지원하는 LLM을 호스팅하는 `InService` 상태의 SageMaker AI 엔드포인트
+ 벤치마크 출력을 위한 Amazon S3 버킷
+ 엔드포인트 및 출력 버킷에 대한 SageMaker AI 액세스 권한을 부여하는 IAM 실행 역할

## 1단계: 벤치마크 작업 생성
<a name="generative-ai-inference-recommendations-benchmark-create"></a>

벤치마크 작업은 특정 SageMaker AI 엔드포인트를 대상으로 하며 워크로드 구성을 참조합니다.

**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
```

엔드포인트가 추론 구성 요소를 통해 여러 모델을 호스팅하는 경우의 `InferenceComponents` 파라미터에서 모델을 지정할 수 있습니다`BenchmarkTarget`.

엔드포인트가 VPC에 있는 경우 보안 그룹 IDs 및 서브넷을 포함한 `VpcConfig` 설정과 함께 `NetworkConfig` 파라미터를 전달합니다.

SageMaker AI에서 완전 관리형 MLflow를 사용하여 벤치마크 결과를 추적하려면에 `MlflowConfig` 객체를 추가합니다`OutputConfig`. 자세한 내용은 [MLflow를 사용하여 추론 권장 사항 및 벤치마크 결과 추적](generative-ai-inference-recommendations-mlflow.md) 단원을 참조하십시오.

## 추론 구성 요소 벤치마크
<a name="generative-ai-inference-recommendations-benchmark-inference-components"></a>

엔드포인트가 모델을 직접 배포하는 대신 *추론 구성 요소를* 사용하는 경우에서 벤치마킹할 추론 구성 요소를 지정해야 합니다`BenchmarkTarget`. 추론 구성 요소를 지정하면 벤치마킹 서비스는 엔드포인트의 기본 모델이 아닌 특정 구성 요소로 요청을 라우팅합니다.

`InferenceComponents` 목록에서 하나 이상의 추론 구성 요소 이름 또는 ARNs을 전달합니다.

**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
```

**참고**  
엔드포인트가 추론 구성 요소에 대해 구성되었지만 벤치마크 대상`InferenceComponents`에를 지정하지 않으면 작업이 실패하고 엔드포인트에 직접 배포된 모델이 없음을 나타내는 오류가 발생합니다. inference-component-based 엔드포인트를 벤치마킹할 때는 항상 `InferenceComponents` 파라미터를 포함합니다.

## 다중 LoRA 엔드포인트 벤치마크
<a name="generative-ai-inference-recommendations-benchmark-multi-lora"></a>

여러 LoRA 어댑터를 제공하는 엔드포인트를 벤치마킹하려면에서 각 어댑터를 추론 구성 요소로 지정합니다`BenchmarkTarget`. 선택적으로 `model_selection_strategy` 워크로드 파라미터를 사용하여 벤치마크가 어댑터 간에 요청을 분산하는 방법을 제어할 수 있습니다. 전략을 지정하지 않으면 기본값은 입니다`round_robin`.

먼저 워크로드 구성을 생성합니다. 다음 예제에는 선택적 `model_selection_strategy` 파라미터가 포함되어 있습니다.

```
# 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)}
)
```

그런 다음 모든 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",
)
```

`model_selection_strategy` 파라미터는 선택 사항이며 벤치마크 도구가 지정된 추론 구성 요소에 요청을 분산하는 방법을 결정합니다. 유효값은 다음과 같습니다.
+ `round_robin` (기본값) - 각 어댑터는 순서대로 요청을 수신합니다. n번째 요청은 (n mod number-of-models)번째 어댑터로 전송됩니다.
+ `random` - 각 요청은 어댑터에 무작위로 균일하게 할당됩니다.

를 지정하지 않으면 벤치마크`model_selection_strategy`는 `round_robin` 기본적으로를 사용합니다.

## 합성 이미지로 멀티모달 엔드포인트 벤치마킹
<a name="generative-ai-inference-recommendations-benchmark-image"></a>

워크로드 구성의 일부로 합성 이미지를 생성하여 비전 언어 모델을 벤치마킹할 수 있습니다. 벤치마킹 서비스는 AIPerf를 사용하여 구성 가능한 차원 및 형식으로 이미지를 생성한 다음 이를 base64로 인코딩된 페이로드로 엔드포인트에 전송합니다.

다음 예제에서는 합성 이미지로 비전 언어 모델을 벤치마킹하기 위한 워크로드 구성을 생성합니다.

```
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)}
)
```

다음 파라미터는 합성 이미지 생성을 제어합니다.


| 파라미터 | 유형 | 기본값 | 설명 | 
| --- | --- | --- | --- | 
| image\_width\_mean | 실수 | 없음 | 픽셀 단위의 평균 이미지 너비입니다. | 
| image\_width\_stddev | 실수 | 없음 | 이미지 너비의 표준 편차입니다. 요청 간에 이미지 차원을 변경하도록 설정합니다. | 
| image\_height\_mean | 실수 | 없음 | 픽셀 단위의 평균 이미지 높이입니다. | 
| image\_height\_stddev | 실수 | 없음 | 이미지 높이의 표준 편차입니다. | 
| image\_batch\_size | int | 1 | 요청당 이미지 수입니다. | 
| image\_format | 문자열 | PNG | 이미지 형식 유효한 값: png (손실 없음), jpeg (손실 있음, 작은 파일), random (이미지당 PNG 또는 JPEG를 무작위로 선택). | 

**가변 크기 이미지**

표준 편차 파라미터를 사용하여 다양한 차원의 이미지를 생성하여 이미지 크기가 다른 실제 워크로드를 시뮬레이션합니다.

```
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"
    }
}
```

## 합성 비디오로 멀티모달 엔드포인트 벤치마킹
<a name="generative-ai-inference-recommendations-benchmark-video"></a>

워크로드 구성의 일부로 합성 비디오를 생성하여 비디오 입력을 처리하는 멀티모달 모델을 벤치마킹할 수 있습니다. 벤치마킹 서비스는 AIPerf의 합성 비디오 생성을 사용하여 구성 가능한 해상도, 프레임 속도, 기간 및 인코딩으로 비디오를 생성한 다음 엔드포인트에 base64 인코딩 페이로드로 전송합니다.

**참고**  
비디오 생성은 기본적으로 비활성화되어 있습니다. 워크로드 구성을 활성화하려면 워크로드 구성`video_height`에서 `video_width` 및를 모두 지정해야 합니다.

다음 예제에서는 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)}
)
```

### 비디오 파라미터
<a name="generative-ai-inference-recommendations-benchmark-video-params"></a>

다음 파라미터는 합성 비디오 생성을 제어합니다.


| 파라미터 | 유형 | 기본값 | 설명 | 
| --- | --- | --- | --- | 
| video\_width | int | 없음 | 프레임 너비는 픽셀 단위입니다. 비디오 생성을 활성화video\_height하려면 로 설정해야 합니다. | 
| video\_height | int | 없음 | 프레임 높이를 픽셀 단위로 표시합니다. 비디오 생성을 활성화video\_width하려면 로 설정해야 합니다. | 
| video\_fps | int | 4 | 초당 프레임 수. | 
| video\_duration | 실수 | 5.0 | 초 단위의 클립 지속 시간입니다. | 
| video\_batch\_size | int | 1 | 요청당 비디오 수입니다. | 
| video\_synth\_type | 문자열 | 이동\_셰이프 | 합성 패턴. 유효한 값: moving\_shapes (애니메이션된 기하학적 셰이프), grid\_clock (클럭 애니메이션이 있는 그리드), noise (랜덤 픽셀 노이즈). | 
| video\_format | 문자열 | 웹 | 컨테이너 형식. 유효한 값: webm. | 
| video\_codec | 문자열 | libvpx-vp9 | 비디오 코덱. 지원되는 값: libvpx-vp9 (VP9, WebM). | 

**참고**  
벤치마킹 서비스는 WebM 형식의 VP9 인코딩만 지원합니다.

### 임베디드 오디오 트랙
<a name="generative-ai-inference-recommendations-benchmark-video-audio"></a>

비디오와 오디오를 함께 처리하는 모델의 경우 생성된 비디오에 합성 오디오 트랙을 포함할 수 있습니다. 오디오는 기본적으로 비활성화되어 있습니다. `1` (모노) 또는 `2` (스테레오)`video_audio_num_channels`로 설정하여 활성화합니다.


| 파라미터 | 유형 | 기본값 | 설명 | 
| --- | --- | --- | --- | 
| video\_audio\_num\_channels | int | 0 | 0 = 비활성화됨, 1 = 모노, 2 = 스테레오. | 
| video\_audio\_sample\_rate | int | 44100 | Hz(8000\~96000) 단위의 샘플 속도입니다. | 
| video\_audio\_codec | 문자열 | auto | 오디오 코덱. WebM의 libvorbis 경우 , MP4의 aac 경우를 자동으로 선택합니다. aac, 또는 로 재정libvorbis의할 수 있습니다libopus. | 
| video\_audio\_depth | int | 16 | 샘플당 비트 깊이(8, 16, 24 또는 32). | 

### 비디오 벤치마킹 예제
<a name="generative-ai-inference-recommendations-benchmark-video-examples"></a>

**저해상도 비디오 이해**

```
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"
    }
}
```

**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"
    }
}
```

**멀티모달 모델용 오디오가 포함된 비디오**

```
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"
    }
}
```

**혼합 텍스트 및 비디오**

비디오 질문 응답 또는 캡션 워크로드에 대한 텍스트 프롬프트와 비디오를 결합합니다.

```
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"
    }
}
```

### 성능 고려 사항
<a name="generative-ai-inference-recommendations-benchmark-video-considerations"></a>
+ 해상도와 프레임 속도가 높을수록 비디오 인코딩 시간과 페이로드 크기가 증가합니다. 처리량이 많은 테스트의 경우 더 낮은 해상도(320×240 또는 640×480)를 사용합니다.
+ WebM 형식의 VP9(`libvpx-vp9`)는 유일하게 지원되는 코덱이며 페이로드 벤치마킹에 적합한 압축을 제공합니다.
+ 오디오는 비디오 스트림에 비해 오버헤드를 최소화합니다. 스피치 중심 워크로드에는 16kHz의 모노(`1`)를 사용합니다.

## 2단계: 작업 상태 모니터링
<a name="generative-ai-inference-recommendations-benchmark-monitor"></a>

터미널 상태에 도달할 때까지 작업 상태를 폴링합니다.

**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
```

## 3단계: 벤치마크 결과 검토
<a name="generative-ai-inference-recommendations-benchmark-results"></a>

벤치마크 결과는 지정한 Amazon S3 출력 위치에 기록됩니다. 결과에는 다음과 같은 주요 지표가 포함됩니다.

`request_throughput`  
초당 요청 수.

`request_latency`  
백분위수 분석(P50, P90, P99)이 포함된 End-to-end 요청 지연 시간입니다.

`time_to_first_token`  
요청 제출부터 수신된 첫 번째 토큰까지의 시간입니다.

`inter_token_latency`  
연속 출력 토큰 사이의 시간입니다.

`output_token_throughput`  
초당 생성된 출력 토큰입니다.

각 지표에는 평균, 최소, 최대, P50, P90, P99 및 표준 편차와 같은 통계 요약이 포함됩니다.

## 사용자 지정 형식 엔드포인트 벤치마크
<a name="generative-ai-inference-recommendations-benchmark-custom-format"></a>

엔드포인트가 사용자 지정 요청 또는 응답 형식(예: DJL 사용자 지정 핸들러, TensorRT-LLM 기본 형식 또는 OpenAI 채팅 완료 API를 지원하지 않는 기타 서빙 프레임워크)을 사용하는 경우 Jinja2 템플릿을 사용하여 벤치마킹하여 엔드포인트의 페이로드 셰이프를 정의할 수 있습니다.

벤치마킹 서비스는 합성 또는 사용자 지정 프롬프트를 사용하여 요청당 템플릿을 렌더링한 다음 페이로드를 SageMaker AI 엔드포인트로 전달합니다. 또한 JMESPath 쿼리를 지정하여 엔드포인트의 응답에서 생성된 텍스트를 추출합니다.

### 페이로드 템플릿 생성
<a name="generative-ai-inference-recommendations-benchmark-custom-format-template"></a>

엔드포인트의 요청 형식을 Jinja2 템플릿 파일로 정의합니다. 템플릿에서 사용할 수 있는 변수는 다음과 같습니다.


| 변수 | 설명 | 
| --- | --- | 
| text | 첫 번째 텍스트 콘텐츠(합성 또는 데이터 세트). | 
| texts | 모든 텍스트 콘텐츠의 목록입니다. | 
| model | 모델 이름입니다. | 
| max\_tokens | 출력 토큰 제한입니다. | 
| stream | 스트리밍 활성화 여부. | 

문자열 값의 적절한 JSON 이스케이프를 위해 `|tojson` 필터를 사용합니다. 다음 예제에서는 도구 호출 형식의 DJL 엔드포인트에 대한 템플릿을 보여줍니다.

```
{
  "messages": [{"role": "user", "content": {{ text|tojson }}}],
  "tools": [
    {"function": {"name": "Chit_Chat", "description": "casual conversation",
      "parameters": {"type": "object", "properties": {}}}}
  ],
  "max_tokens": {{ max_tokens }}
}
```

템플릿 파일을 Amazon S3에 업로드합니다(예: `s3://DOC-EXAMPLE-BUCKET/templates/my_endpoint_template.jinja`).

### 워크로드 구성 생성
<a name="generative-ai-inference-recommendations-benchmark-custom-format-config"></a>

템플릿 파일을 참조하는 워크로드 구성을 생성합니다. `extra_inputs` 파라미터를 사용하여 템플릿 경로와 응답 추출 쿼리를 지정합니다. `DatasetConfig` 채널을 통해 템플릿 파일을 벤치마크 컨테이너로 전송합니다.

```
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",
                    }
                },
            }
        ]
    },
)
```

는 벤치마크 컨테이너 내에서 파일이 나타나는 위치를 `ChannelName` 결정합니다. 라는 채널을 `template` 사용하면에서 파일을 사용할 수 있습니다`/opt/ml/input/data/template/<filename>`.

`response_field` 값은 엔드포인트의 응답에서 생성된 텍스트를 추출하는 [JMESPath](https://jmespath.org/) 쿼리입니다. 일반적인 패턴은 다음과 같습니다.
+ `choices[0].message.content` - OpenAI 형식
+ `generation_details.generations[0].content` - DJL 형식
+ `output.text` - 간단한 텍스트 응답

`response_field`를 생략하면 벤치마킹 도구가 응답 형식을 자동으로 감지합니다.

### 벤치마크 실행
<a name="generative-ai-inference-recommendations-benchmark-custom-format-run"></a>

엔드포인트를 대상으로 하는 벤치마크 작업을 생성합니다. 서비스는의 `payload_template` 키에서 템플릿 모드를 자동으로 감지`extra_inputs`하고 적절한 프록시 경로를 통해 요청을 라우팅합니다.

```
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",
)
```

### 고려 사항
<a name="generative-ai-inference-recommendations-benchmark-custom-format-notes"></a>
+ 템플릿은 Amazon S3를 통해 파일로 전달되어야 합니다. JSON의 쉼표가 파라미터 구문 분석기와 충돌하기 때문에 `extra_inputs` 문자열의 인라인 JSON 템플릿은 지원되지 않습니다.
+ 단일 추론 구성 요소가 있는 엔드포인트가 지원됩니다. 서비스가 임의의 페이로드 형식에서 각 요청을 라우팅할 구성 요소를 결정할 수 없으므로 여러 추론 구성 요소가 있는 엔드포인트는 템플릿 모드에서 지원되지 않습니다.
+ 스트리밍 엔드포인트와 비스트리밍 엔드포인트가 모두 지원됩니다. 워크로드 파라미터`"streaming": false`에서 `"streaming": true` 또는를 설정합니다.

## 벤치마크 프롬프트와 응답의 상관관계 파악
<a name="generative-ai-inference-recommendations-benchmark-correlate-io"></a>

벤치마크 작업이 완료되면 출력 아티팩트에는 사후 처리를 위해 함께 조인할 수 있는 요청별 입력 및 출력 데이터가 포함됩니다. 이를 통해 품질 평가, 안전 감사, 구성 간 응답 비교, 예상치 못한 모델 동작 디버깅과 같은 사용 사례를 사용할 수 있습니다.

### 출력 아티팩트 벤치마크
<a name="generative-ai-inference-recommendations-benchmark-correlate-io-artifacts"></a>

Amazon S3 출력 위치의 `output.tar.gz` 아카이브에는 프롬프트-응답 상관 관계와 관련된 다음 파일이 포함되어 있습니다.

`inputs.json`  
생성된 대화의 전체 합성 데이터 세트입니다. 각 레코드에는 `session_id` 및 전체 요청 페이로드(메시지, max\_tokens, 모델)가 있습니다.

`outputs.json`  
엔드포인트로 전송된 요청에 대한 요청별 응답 메타데이터입니다. 각 레코드에는 모델의 응답 텍스트, 요청당 지연 시간, 출력 토큰 수 및 입력에 다시 매핑`conversation_id`되는이 포함됩니다.

### 입력을 출력에 조인
<a name="generative-ai-inference-recommendations-benchmark-correlate-io-join"></a>

의 `conversation_id` 필드`outputs.json`와의 `session_id` 필드를 사용하여 프롬프트를 응답과 연관시킵니다`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}...")
```

### 중요 정보
<a name="generative-ai-inference-recommendations-benchmark-correlate-io-notes"></a>
+ **조인 키.** `conversation_id`의와 일치`outputs.json`시키려면 `session_id`의를 사용합니다`inputs.json`. 를 위치 인덱스`session_num`로 사용하지 마십시오. 동시성이 1보다 클 때 입력 생성 순서와 다른 실행 순서를 나타냅니다.
+ **모든 입력에 출력이 있는 것은 아닙니다.** `inputs.json` 파일에는 완전히 생성된 데이터 세트 풀이 포함되어 있습니다. `request_count`가 풀 크기보다 작으면 대화의 하위 집합만 엔드포인트로 전송됩니다. 일치하지 않는 입력은 생성되었지만 사용되지 않은 대화입니다.
+ **출력 스키마입니다.** 의 각 레코드`outputs.json`에는 `conversation_id`, `response_text`, `metrics` ( `request_latency` 및 ) 및 타이밍 필드(`request_start_ns`, `output_sequence_length`)가 포함됩니다`request_end_ns`.

## 벤치마크 리소스 관리
<a name="generative-ai-inference-recommendations-benchmark-manage"></a>

다음 작업을 사용하여 벤치마크 작업 및 워크로드 구성을 관리합니다.

```
# 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"
)
```