SageMaker AI에서 llama.cpp로 의사결정 모델 배포, GPU가 p50 4.9배 빠름

AWS ML 블로그가 10월 13일 00시 51분(한국 시각, 10월 12일 15:51 UTC) 'AWS DLC for llama.cpp'로 SageMaker AI에 양자화 모델을 배포하는 방법을 공개했습니다. 기본 경로는 OpenAI 호환 채팅 응답을 돌려주고, 확장 경로인 SemIf는 답변 토큰을 생성하지 않고 미리 정한 선택지별 확률을 돌려줍니다. 글은 같은 231개 과제로 CPU와 GPU 엔드포인트를 비교한 수치도 함께 싣고 있습니다.
1/같은 모델로 두 갈래 서빙 경로
기본 경로는 AWS DLC(Deep Learning Containers)를 그대로 써서 SageMaker AI InvokeEndpoint로 OpenAI 호환 chat completions를 제공합니다. 컨테이너는 /opt/ml/model 아래 첫 번째 .gguf 파일을 찾고, POST /invocations를 llama-server의 /v1/chat/completions로 연결합니다. 확장 경로는 SemIf(옛 이름 OpenJev)입니다. llama-server HTTP API가 마지막 위치의 logits와 상태 조작을 노출하지 않기 때문에, AWS CodeBuild로 자식 이미지를 만들어 Amazon ECR에 저장하고 기본 서버 대신 SageMaker 호환 어댑터를 진입점으로 씁니다. SemIf 요청에는 호출자가 정한 ID, 비정형 상태, 질문, 순서가 있는 선택지 목록이 들어갑니다. 응답은 option_ids, probabilities, 원시 option_logits를 같은 순서로 돌려줍니다.
2/231개 과제: GPU p50 0.352초, CPU 1.715초
벤치마크는 SemIf 확장에 대한 것이며, 공개 JevBench 과제 231개를 CPU 엔드포인트 하나와 GPU 엔드포인트 하나에 순차로 보냈습니다. 둘 다 Qwen3.5-4B Q4_K_M 모델이고 유효 응답은 231/231입니다. CPU(ml.c6i.8xlarge, 32 threads)는 정확도 179/231(77.5%), 클라이언트 p50 1.715초, p95 19.291초였습니다. GPU(ml.g6e.xlarge, 전체 GPU 오프로드)는 180/231(77.9%), p50 0.352초, p95 0.599초였습니다. GPU는 CPU보다 p50 기준 4.9배, p95 기준 32.2배 빨랐습니다. 더 작은 2B와 0.8B 후보의 정확도는 각각 66.7%, 58.4%여서 4B Q4_K_M이 기본값으로 남았습니다. CPU와 GPU 이미지는 llama.cpp 빌드가 달라 어려운 과제 6개에서 예측이 달랐고, 원문은 한 문제 차이를 GPU가 품질을 높인다는 근거로 보지 말라고 밝혔습니다. 이 수치는 네트워크 지연을 포함하며 서비스 보증치가 아닙니다.
3/S3의 model.tar.gz와 공개 이미지로 배포
기본 경로는 모델을 Amazon S3에 model.tar.gz로 올리고 공개된 server-sagemaker-cpu-v1(또는 CUDA용 server-sagemaker-cuda-v1) 이미지를 지정하면 됩니다. 이 경로에는 Dockerfile도 ECR 저장소도 필요 없습니다. 엔드포인트에 외부 네트워크 송신이 가능하면 SM_LLAMA_CPP_HF_REPO와 SM_LLAMA_CPP_HF_FILE로 Hugging Face에서 GGUF 파일을 내려받을 수도 있습니다. SemIf는 CodeBuild로 자식 이미지를 빌드한 뒤 변경 불가능한 digest로 지정해 배포하고, 배포 스크립트는 변경 가능한 태그를 거부합니다. GPU 배포는 인스턴스 풀 기능으로 g6e, g6, g5, g4dn 순서의 대체 후보를 줄 수 있으며, 이번 측정에서는 ml.g6e.xlarge가 선택되어 NVIDIA L40S에 34개 레이어가 모두 오프로드되었습니다. 인스턴스 풀은 배치 대체 순서일 뿐 추론 부하 분산이 아닙니다. 코드 샘플은 GitHub의 aws-samples/sagemaker-genai-hosting-examples에 있고, 제공 리전은 원문에 따로 명시되어 있지 않습니다.
4/단가 없음, 동시 처리와 검증은 사용자 몫
공지에 단가는 없고 엔드포인트를 만들기 전에 SageMaker AI 요금을 확인하라고만 안내합니다. SemIf 어댑터는 상태를 가진 llama.cpp 컨텍스트 하나를 두고 채점을 직렬로 처리하므로, 동시 처리는 엔드포인트 인스턴스를 늘려서 대응해야 합니다. 대기열이 무한히 쌓이는 것을 막기 위해 재시도 가능한 HTTP 503을 돌려줍니다. 답변 토큰을 생성하지 않아도 모델은 상태, 질문, 선택지 설명 전체를 처리하므로 프롬프트는 짧게 유지하라고 합니다. 권한 판단과 결정적인 업무 규칙은 모델 밖에 두고, 모델이 내놓은 확률은 운영상 신뢰도로 쓰기 전에 검증해야 합니다. 사전 준비로 x86 CPU 또는 NVIDIA GPU 실시간 엔드포인트용 쿼터와 IAM 역할 등이 필요합니다.
5/텍스트 생성이 아닌 점수 계산이 필요할 때AMEET 해석
요청 분류나 에이전트 행동 선택처럼 선택지가 고정된 업무라면, 문장을 생성해 파싱하는 대신 확률을 바로 받아 임계값과 대체 처리에 쓰는 구성이 가능해졌습니다. 다만 SemIf는 DLC 기본 기능이 아니라 자식 이미지를 따로 빌드해야 하는 확장이어서, 일반 채팅 응답만 필요하면 기본 경로로 충분합니다. 벤치마크는 4B 모델 하나와 JevBench 하나에서 나온 결과이므로, 지연 요건이 빡빡한 업무에서 CPU와 GPU 중 무엇을 고를지는 자사 데이터로 다시 재 봐야 합니다.