Bedrock Batches
Bedrock Batches
LiteLLM을 통해 Amazon Bedrock Batch Inference API를 사용해요.
출처: 문서
본문
개요 (Overview)
| 속성 | 설명 |
|---|---|
| 설명 | Amazon Bedrock Batch Inference는 대규모 데이터셋에 대해 비동기적으로 추론을 실행할 수 있게 해요 |
| 공급자 문서 | AWS Bedrock Batch Inference |
| 비용 추적 | ✅ 지원 |
용도:
- Bedrock 모델로 대규모 데이터셋에 배치 추론 실행
- 채팅 완성 모델과 동일하게 키/사용자/팀별 배치 모델 접근 제어
- 배치 입력/출력 파일용 S3 스토리지 관리
(Proxy Admin) 사용법
개발자에게 Bedrock Batch 모델 접근을 주는 방법이에요.
1. config.yaml 설정
각 모델에 mode: batch를 지정해 개발자에게 배치 모델임을 알리고, S3 버킷과 AWS 자격 증명을 구성해요.
model_list:
- model_name: "bedrock-batch-claude"
litellm_params:
model: bedrock/us.anthropic.claude-sonnet-5
#########################################################
########## batch specific params ########################
s3_bucket_name: litellm-proxy
s3_region_name: us-west-2
s3_access_key_id: os.environ/AWS_ACCESS_KEY_ID
s3_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY
aws_batch_role_arn: arn:aws:iam::888602223428:role/service-role/AmazonBedrockExecutionRoleForAgents_BB9HNW6V4CV
# Optional: Custom KMS encryption key for the S3 input upload and the batch output
# s3_encryption_key_id: arn:aws:kms:us-west-2:123456789012:key/12345678-1234-1234-1234-123456789012
# Optional: AWS account id that owns the S3 buckets, when they live in another account
# s3_bucket_owner: "123456789012"
model_info:
mode: batch # 👈 SPECIFY MODE AS BATCH, to tell user this is a batch model
필수 파라미터:
| 파라미터 | 설명 |
|---|---|
| s3_bucket_name | 배치 입력/출력 파일용 S3 버킷 |
| s3_region_name | S3 버킷용 AWS 지역 |
| s3_access_key_id | S3 버킷용 AWS 접근 키 |
| s3_secret_access_key | S3 버킷용 AWS 시크릿 키 |
| aws_batch_role_arn | Bedrock 배치 작업용 IAM 역할 ARN. Bedrock Batch API는 IAM 역할 ARN이 설정되어야 해요 |
| mode: batch | LiteLLM에 이것이 배치 모델임을 표시 |
선택 파라미터:
| 파라미터 | 설명 |
|---|---|
| s3_encryption_key_id | LiteLLM이 S3에 업로드하는 배치 입력 파일과 배치 출력 데이터용 사용자 지정 KMS 암호화 키 ID. LiteLLM이 업로드를 서명하는 자격 증명에 해당 키에 대한 kms:GenerateDataKey가 필요. 지정하지 않으면 Bedrock은 AWS 관리 암호화 키를 사용 |
| s3_bucket_owner | 배치 입력/출력 S3 버킷을 소유한 AWS 계정 id. Bedrock 작업의 입력·출력 데이터 구성 모두에 s3BucketOwner로 전송. 버킷이 배치 작업을 실행하는 계정과 다른 계정에 있으면 설정. AWS_S3_BUCKET_OWNER 환경 변수로도 설정 가능 |
2. 가상 키 생성
curl -L -X POST 'https://{PROXY_BASE_URL}/key/generate' \
-H 'Authorization: Bearer ***' \
-H 'Content-Type: application/json' \
-d '{"models": ["bedrock-batch-claude"]}'
이제 가상 키로 배치 모델에 접근할 수 있어요 (개발자 흐름 참고).
(개발자) 사용법
LiteLLM 관리 파일을 만들고 파일로 Bedrock Batch CRUD 작업을 실행하는 방법이에요.
1. request.jsonl 생성
/model_group/info로 사용 가능한 모델 확인 (mode: batch인 모델 모두). .jsonl의 model을 /model_group/info의 모델로 설정해요. LiteLLM이 이를 bedrock 배포별 값(예: bedrock/us.anthropic.claude-sonnet-5)으로 변환해요.
{"custom_id": "request-1", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "bedrock-batch-claude", "messages": [{"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "Hello world!"}], "max_tokens": 1000}}
{"custom_id": "request-2", "method": "POST", "url": "/v1/chat/completions", "body": {"model": "bedrock-batch-claude", "messages": [{"role": "system", "content": "You are an unhelpful assistant."}, {"role": "user", "content": "Hello world!"}], "max_tokens": 1000}}
2. 파일 업로드
LiteLLM 관리 파일과 요청 검증을 활성화하려면 target_model_names: "<model-name>"을 지정해요. model-name은 request.jsonl의 model-name과 같아야 해요. 파일은 config에 지정된 S3 버킷에 기록되고 Bedrock 배치 추론용으로 준비돼요.
Python:
from openai import OpenAI
client = OpenAI(
base_url="http://0.0.0.0:4000",
api_key="sk-<your-litellm-api-key>",
)
# Upload file
batch_input_file = client.files.create(
file=open("./bedrock_batch_completions.jsonl", "rb"),
# {"model": "bedrock-batch-claude"} <-> {"model": "bedrock/us.anthropic.claude-sonnet-5"}
purpose="batch",
extra_body={"target_model_names": "bedrock-batch-claude"}
)
print(batch_input_file)
curl:
curl http://localhost:4000/v1/files \
-H "Authorization: Bearer ***" \
-F purpose="batch" \
-F file="@bedrock_batch_completions.jsonl" \
-F extra_body='{"target_model_names": "bedrock-batch-claude"}'
3. 배치 생성
Python:
# Create batch
batch = client.batches.create(
input_file_id=batch_input_file.id,
endpoint="/v1/chat/completions",
completion_window="24h",
metadata={"description": "Test batch job"},
)
print(batch)
curl:
curl http://localhost:4000/v1/batches \
-H "Authorization: Bearer ***" \
-H "Content-Type: application/json" \
-d '{
"input_file_id": "file-abc123",
"endpoint": "/v1/chat/completions",
"completion_window": "24h",
"metadata": {"description": "Test batch job"}
}'
4. 배치 결과 조회
배치 작업이 완료되면 S3에서 결과를 다운로드해요.
Python:
# Wait for batch completion (check status periodically)
batch_status = client.batches.retrieve(batch_id=batch.id)
if batch_status.status == "completed":
# Download the output file
result = client.files.content(
file_id=batch_status.output_file_id,
extra_headers={"custom-llm-provider": "bedrock"}
)
# Save or process the results
with open("batch_output.jsonl", "wb") as f:
f.write(result.content)
# Parse JSONL results
for line in result.text.strip().split('\n'):
record = json.loads(line)
print(f"Record ID: {record['recordId']}")
print(f"Output: {record.get('modelOutput', {})}")
curl:
# First retrieve batch to get output_file_id
curl http://localhost:4000/v1/batches/batch_abc123 \
-H "Authorization: Bearer ***"
# Then download the output file
curl http://localhost:4000/v1/files/{output_file_id}/content \
-H "Authorization: Bearer ***" \
-H "custom-llm-provider: bedrock" \
-o batch_output.jsonl
LiteLLM 직접 사용:
import litellm
from litellm import file_content
# Download using litellm directly (bypasses proxy managed files)
result = file_content(
file_id=batch_status.output_file_id, # Can be S3 URI or unified file ID
custom_llm_provider="bedrock",
aws_region_name="us-west-2",
)
# Process results
print(result.text)
출력 형식:
배치 출력 파일은 JSONL 형식이며 각 줄에 다음이 포함돼요:
{
"recordId": "request-1",
"modelInput": {
"messages": [...],
"max_tokens": 1000
},
"modelOutput": {
"content": [...],
"id": "msg_abc123",
"model": "us.anthropic.claude-sonnet-5",
"role": "assistant",
"stop_reason": "end_turn",
"usage": {
"input_tokens": 15,
"output_tokens": 10
}
}
}
FAQ
내 파일은 어디에 기록되나요?
target_model_names이 지정되면 파일은 Bedrock 배치 모델 구성에 설정된 S3 버킷에 기록돼요.
어떤 모델이 지원되나요?
AWS가 배치 추론에 나열하는 Bedrock 모델이라면, LiteLLM이 입력 파일의 OpenAI 형식 레코드를 그 모델의 요청 본문으로 변환할 수 있는 한 동작해요. 오늘은 Anthropic Claude 모델, Amazon Nova 모델(각 레코드가 Nova가 기대하는 Converse 요청 형태로 작성됨), /v1/embeddings 레코드용 Amazon Titan Text Embeddings V2, 그리고 openai.gpt-oss-120b-1:0, Qwen, DeepSeek 같은 OpenAI 호환 Bedrock 모델(레코드가 OpenAI 스타일의 chat 본문으로 그대로 전달됨)을 지원해요. Chat 레코드는 url로 /v1/chat/completions, /v1/completions, /v1/responses를 쓸 수 있고, completions/responses 레코드는 업로드 전에 chat 요청으로 변환돼요. Titan Text Embeddings V2가 오늘 유일하게 변환되는 임베딩 모델이에요.
지역에서 AWS가 배치 작업에 허용하는 모델 id를 사용하세요. 대부분의 최신 모델은 cross-region inference profile로만 배치 작업을 실행하므로 id에 보통 us.(또는 eu., apac.) 접두사가 붙어요 (예: amazon.nova-lite-v1:0 대신 us.amazon.nova-lite-v1:0). 또한 Bedrock은 모델과 무관하게 100개 미만 레코드의 작업은 거부해요.
비-Anthropic 배치 모델도 위 Claude 예시와 같은 방식으로 구성돼요:
model_list:
- model_name: "bedrock-batch-nova"
litellm_params:
model: bedrock/us.amazon.nova-lite-v1:0
s3_bucket_name: litellm-proxy
s3_region_name: us-east-1
s3_access_key_id: os.environ/AWS_ACCESS_KEY_ID
s3_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY
aws_batch_role_arn: arn:aws:iam::123456789012:role/LiteLLMBedrockBatchRole
model_info:
mode: batch
- model_name: "bedrock-batch-titan-embeddings"
litellm_params:
model: bedrock/amazon.titan-embed-text-v2:0
s3_bucket_name: litellm-proxy
s3_region_name: us-east-1
s3_access_key_id: os.environ/AWS_ACCESS_KEY_ID
s3_secret_access_key: os.environ/AWS_SECRET_ACCESS_KEY
aws_batch_role_arn: arn:aws:iam::123456789012:role/LiteLLMBedrockBatchRole
model_info:
mode: batch
입력 파일의 레코드는 그 model_name을 참조하고({"model": "bedrock-batch-nova", ...}), 업로드는 target_model_names를 같은 이름으로 설정하며, 배치는 chat 모델이면 endpoint를 /v1/chat/completions로, 임베딩 모델이면 /v1/embeddings로 설정해 생성해요. aws_batch_role_arn의 IAM 역할에는 배치 작업을 실행하는 모든 모델에 대한 bedrock:InvokeModel이 필요해요.
LiteLLM이 아직 변환하지 못하는 Bedrock 모델(예: 다른 임베딩 모델)이 필요하면 여기에 이슈를 등록해 주세요.
사용자 지정 KMS 암호화 키는 어떻게 쓰나요?
S3 버킷이 사용자 지정 KMS 암호화 키를 요구하면 s3_encryption_key_id로 구성에 지정할 수 있어요. 항목 키는 LiteLLM이 건드리는 두 객체를 모두 커버해요: 버킷에 업로드하는 배치 입력 파일과 Bedrock이 다시 쓰는 배치 출력. 입력 업로드는 x-amz-server-side-encryption: aws:kms와 이 키 ARN으로 서명되므로, LiteLLM이 업로드에 사용하는 AWS 신원은 키에 대한 kms:GenerateDataKey가 필요해요. 키를 설정하기 전에 이를 부여하세요. 그렇지 않으면 POST /v1/files가 S3 AccessDenied로 실패해요.
암호화 키는 두 가지 방법으로 설정할 수 있어요:
config.yaml (권장):
model_list:
- model_name: "bedrock-batch-claude"
litellm_params:
model: bedrock/us.anthropic.claude-sonnet-5
s3_encryption_key_id: arn:aws:kms:us-west-2:123456789012:key/12345678-1234-1234-1234-123456789012
# ... other params
환경 변수:
export AWS_S3_ENCRYPTION_KEY_ID=arn:aws:kms:us-west-2:123456789012:key/12345678-1234-1234-1234-123456789012
다른 AWS 계정이 소유한 S3 버킷은 어떻게 쓰나요?
Bedrock은 입력·출력 버킷이 s3BucketOwner에 지정된 계정에 속하는지 확인하며, 이 필드가 없으면 기본적으로 배치 작업을 실행하는 계정을 사용해요. 버킷이 다른 계정에 있으면 버킷 정책이 접근을 허용하더라도 작업이 S3 권한 에러로 검증 실패해요. 버킷을 소유한 계정의 id로 s3_bucket_owner를 설정하면 LiteLLM이 입력·출력 데이터 구성 모두에 전송해요.
Proxy에서는 /v1/batches 요청 본문에 전달된 s3_bucket_owner가 배포의 litellm_params 값보다 우선하고, 그 값이 AWS_S3_BUCKET_OWNER 환경 변수보다 우선해요. 이는 router가 s3_bucket_name이나 s3_encryption_key_id 같은 다른 모든 배포 파라미터에 적용하는 순서와 같아요. 아무것도 설정하지 않으면 필드가 생략되고 Bedrock이 기본값을 유지해요.