Amazon SageMaker AI
Amazon SageMaker AI
AWS Deep Learning Container(DLC)를 이용해 SGLang을 Amazon SageMaker AI 엔드포인트로 배포하는 방법을 설명합니다. SageMaker 이미지 변형은 환경 변수로 모델 설정을 받아들이고 8080 포트에서 서빙해요.
출처: 문서
본문
Amazon SageMaker AI 엔드포인트에 SGLang용 AWS Deep Learning Container (DLC)를 사용해 SGLang을 배포하는 방법을 다룹니다. SageMaker 이미지 변형은 환경 변수(environment variables)를 통해 모델 구성을 받고 8080 포트에서 서빙합니다.
이 가이드는 미리 빌드된 DLC 이미지를 사용해요. 직접 컨테이너를 빌드해 배포하려면 설치 가이드의 Method 7: Run on AWS SageMaker를 참고하세요.
컨테이너 이미지 (Container image)
AWS는 보안 패치가 적용된 SGLang DLC를 미리 빌드해 게시합니다. SageMaker GPU 이미지는 각 지원 리전의 Amazon ECR 레지스트리(계정 763104351884)에서 사용할 수 있어요. 예를 들어 us-west-2에서는:
763104351884.dkr.ecr.us-west-2.amazonaws.com/sglang:server-sagemaker-cuda-v1.0
전체 이미지 태그 목록은 Available DLC Images 레퍼런스를, 리전별 계정 ID와 지원 리전은 Region Availability를 참고하세요.
모델 지정 (Specifying the model)
SageMaker 이미지는 다음과 같은 순서로 모델을 결정합니다.
SM_SGLANG_MODEL_PATH환경 변수 — 명시적인 Hugging Face ID 또는 경로./opt/ml/model— SageMaker가ModelDataUrl또는ModelDataSource로 모델 아티팩트를 마운트하면 엔트리포인트가 기본적으로 이 경로를 사용.
게이트(gated) 모델이라면 HF_TOKEN도 함께 전달하세요.
SM_SGLANG_* 환경 변수는 모두 --<name> SGLang 서버 인자로 변환됩니다(예: SM_SGLANG_CONTEXT_LENGTH=4096 → --context-length 4096).
SageMaker Python SDK로 배포하기
from sagemaker.model import Model
from sagemaker.predictor import Predictor
from sagemaker.serializers import JSONSerializer
model = Model(
image_uri="763104351884.dkr.ecr.us-west-2.amazonaws.com/sglang:server-sagemaker-cuda-v1.0",
role="arn:aws:iam::<account_id>:role/<role_name>",
predictor_cls=Predictor,
env={"SM_SGLANG_MODEL_PATH": "openai/gpt-oss-20b"},
)
predictor = model.deploy(
instance_type="ml.g5.2xlarge",
initial_instance_count=1,
inference_ami_version="al2023-ami-sagemaker-inference-gpu-4-1",
serializer=JSONSerializer(),
)
response = predictor.predict({
"model": "openai/gpt-oss-20b",
"messages": [{"role": "user", "content": "What is deep learning?"}],
"max_tokens": 256,
})
print(response)
# Cleanup
predictor.delete_model()
predictor.delete_endpoint(delete_endpoint_config=True)
Boto3로 배포하기
import json
import boto3
sm = boto3.client("sagemaker")
smrt = boto3.client("sagemaker-runtime")
sm.create_model(
ModelName="sglang-model",
PrimaryContainer={
"Image": "763104351884.dkr.ecr.us-west-2.amazonaws.com/sglang:server-sagemaker-cuda-v1.0",
"Environment": {"SM_SGLANG_MODEL_PATH": "openai/gpt-oss-20b"},
},
ExecutionRoleArn="arn:aws:iam::<account_id>:role/<role_name>",
)
sm.create_endpoint_config(
EndpointConfigName="sglang-config",
ProductionVariants=[{
"VariantName": "default",
"ModelName": "sglang-model",
"InstanceType": "ml.g5.2xlarge",
"InitialInstanceCount": 1,
"InferenceAmiVersion": "al2023-ami-sagemaker-inference-gpu-4-1",
}],
)
sm.create_endpoint(EndpointName="sglang-endpoint", EndpointConfigName="sglang-config")
sm.get_waiter("endpoint_in_service").wait(EndpointName="sglang-endpoint")
resp = smrt.invoke_endpoint(
EndpointName="sglang-endpoint",
ContentType="application/json",
Body=json.dumps({
"model": "openai/gpt-oss-20b",
"messages": [{"role": "user", "content": "What is deep learning?"}],
"max_tokens": 256,
}),
)
print(json.loads(resp["Body"].read()))
# Cleanup
sm.delete_endpoint(EndpointName="sglang-endpoint")
sm.delete_endpoint_config(EndpointConfigName="sglang-config")
sm.delete_model(ModelName="sglang-model")
모델 아티팩트 (Model artifacts)
ModelDataUrl(또는 ModelDataSource)가 타르볼이나 S3 프리픽스를 가리키면 SageMaker는 내용물을 /opt/ml/model에 마운트합니다. 엔트리포인트는 --model-path를 기본적으로 그 위치로 설정하므로, SM_SGLANG_MODEL_PATH는 생략할 수 있어요:
model.tar.gz
├── config.json # standard model files (Hugging Face layout)
├── tokenizer.json
└── *.safetensors
참고 사항 (Notes)
- GPU 배포에는
inference_ami_version이 필요합니다. 기본 SageMaker 호스트 AMI는 CUDA 13 이미지와 호환되지 않는 NVIDIA 드라이버를 갖고 있어요. 유효한 값은 ProductionVariant API reference를 참고하세요. - 엔드포인트는 OpenAI 호환 API를 노출하므로 요청 본문은 SGLang 서버의
/v1/chat/completions스키마와 일치합니다.