SageMaker Large Model Inference (LMI)를 활용한 모델 서빙 및 최적화 가이드

DJL Serving 기반 대규모 언어 모델 추론 인프라 개요

대규모 언어/파운데이션 모델의 추론 환경은 종래 머신 러닝 모델 배포 이상의 복합적 고려가 필요합니다. 모델의 크기가 수십억~수천억 파라미터에 이르고 트래픽의 변동성이 종래 모델 대비 많기 때문에, 추론 효율·레이턴시·메모리 관리·동시성 제어·오토스케일링·비용 효율성 등 다양한 요소가 균형 있게 통합되어야 합니다.

Amazon SageMaker의 Large Model Inference (이하 LMI) 컨테이너는 이러한 복잡성을 해결하기 위한 통합 추론 프레임워크입니다. 이 컨테이너는 DJL(Deep Java Library) Serving 위에서 동작하며, 내부적으로 vLLM, TensorRT-LLM, Transformers NeuronX 등의 백엔드를 선택적으로 결합할 수 있습니다. AWS는 이를 통해 대규모 모델의 효율적인 서빙과 확장 가능한 운영 환경을 제공합니다. 본 문서는 LMI의 동작 원리와 아키텍처 구성 요소, vLLM 및 SGLang과 같은 단독 추론 프레임워크 대비 장점, 그리고 실제 배포 방법론 및 최적화 가이드를 다룹니다.

1. LMI 동작 원리 및 특장점


1.1. LMI 동작 원리

SageMaker Large Model Inference (LMI) 컨테이너

LMI는 크게 3가지 계층 구조로 구성됩니다.

  • 프론트엔드 레이어: DJL Serving - HTTP/gRPC 요청을 처리하는 핵심 서버 계층

    • 요청 수신 및 라우팅: Netty 기반의 프론트엔드를 통해 들어오는 요청을 라우팅하고 백엔드 워커로 전달)

    • 모델 로드 및 관리: 디바이스별로 워커 그룹을 생성하여 CPU와 GPU에서의 병렬 실행을 지원하며 하드웨어 리소스(CPU 코어 수, GPU 디바이스 수)를 기반으로 모델이 지원할 수 있는 최대 워커 수를 자동으로 결정

    • 멀티 모델 동시 운영 및 워커 스케줄링: 트래픽 로드에 따라 워커를 동적으로 증감

  • 중간 레이어: Python 엔진/MPI 엔진 - DJL Serving이 추론 라이브러리와 통신할 수 있도록 중계하는 계층

    • 엔진은 별도의 서브프로세스로 실행되며, DJL Serving과 IPC(gRPC, Unix socket 등)로 연결

    • 요청 단위로 스레드를 분리해 병렬 추론 처리 수행

    • 텐서 병렬화와 같은 병렬 기법을 통해 다중 GPU 추론을 지원해야 하는 경우, MPI를 통한 분산 추론 활용

  • 백엔드 레이어: 추론 라이브러리 런타임 - 실제 추론이 실행되는 레이어로 필요 시 커스텀 핸들러를 통해 새로운 백엔드를 추가하는 것도 가능

    • vLLM: Token streaming, continuous batching, PagedAttention을 통한 GPU 메모리 효율 극대화

    • TensorRT-LLM: NVIDIA TensorRT 최적화를 활용한 빠른 텍스트 생성

    • Transformers NeuronX: AWS Inferentia/Trainium 전용 가속기 환경

LMI 컨테이너의 요청 처리 과정은 다음과 같은 순서로 진행됩니다.

  1. 사용자가 SageMaker Endpoint를 통해 추론 요청을 보냅니다.

  2. DJL Serving이 요청을 수신하고, 요청된 모델 이름 혹은 엔드포인트별 설정에 따라 해당 Python/MPI 엔진으로 라우팅합니다. 구체적인 워크플로는 위의 도식을 참조 바랍니다.

  3. 엔진은 내부의 추론 런타임(vLLM, TensorRT-LLM 등)에 요청을 전달합니다.

  4. 런타임 엔진은 토큰을 단계적으로 생성하며, 스트리밍 모드로 응답을 반환할 수 있습니다.

  5. DJL Serving은 이를 JSON 혹은 gRPC Response 형태로 가공하여 최종적으로 클라이언트에 전송합니다.

이 구조 덕분에 모델 백엔드 교체나 다중 모델 병행 배포가 "플러그인형"으로 상대적으로 용이하며, AWS 관리형 인프라와 연동해 확장성(autoscaling)과 로깅·모니터링이 자동화됩니다.

1.2. 단독 프레임워크 대비 LMI의 장점

"vLLM만 사용하면 되지 않나요?"

많은 개발자들이 "왜 vLLM을 직접 배포하지 않고 LMI를 사용해야 하는가?"라는 질문을 제기합니다. 이는 타당한 질문이지만, LMI는 단순히 vLLM을 래핑하는 것 이상의 가치를 제공합니다.

  • 통합 설정 인터페이스 제공: serving.properties 파일이나 환경 변수를 통해 다양한 백엔드(vLLM, TensorRT-LLM, LMI-Dist, Transformers NeuronX)를 동일한 방식으로 설정할 수 있습니다. 백엔드 전환은 몇 가지 설정 변경만으로 가능하며, 각 백엔드에 특화된 복잡한 초기화 로직을 직접 작성할 필요가 없습니다.

  • 프로덕션 운영에 필요한 기능 내장: DJL Serving은 모델 versioning, 멀티 모델 엔드포인트, 자동 워커 스케일링, 헬스 체크 API, 메트릭Metrics 수집 등의 기능을 기본으로 제공합니다. vLLM을 단독으로 사용할 경우 이러한 기능들을 직접 구현해야 하는 부담이 있습니다.

  • SageMaker 생태계와의 긴밀한 통합: LMI 컨테이너는 SageMaker의 관리형 인프라, IAM 권한 관리, CloudWatch 로깅, 네트워크 격리, 모델 아티팩트 자동 다운로드 등의 기능과 통합됩니다. 커스텀 컨테이너를 구축하고 SageMaker와 통합하는 데 필요한 boilerplate 코드와 설정을 제거할 수 있습니다.

  • 멀티 엔진 지원을 통한 유연성: DJL Serving은 동시에 여러 프레임워크의 모델을 호스팅할 수 있습니다. 예를 들어, PyTorch와 TensorFlow 모델을 같은 엔드포인트에서 서빙하거나, 복잡한 워크플로우에서 일부는 CPU에서, 일부는 GPU에서 실행하도록 구성할 수 있습니다.

내장 핸들러와 커스터마이징의 균형

LMI는 지원되는 모든 백엔드에 대해 기본 추론 핸들러를 제공합니다. 이러한 핸들러는 설정 파싱, 가속기에 모델 로딩, 최적화 적용, 추론 실행을 자동으로 처리한다. 대부분의 경우 모델 ID와 몇 가지 설정만 제공하면 즉시 배포가 가능합니다.

동시에 커스터마이징이 필요한 경우를 위해 model.py 파일을 통한 커스텀 핸들러 작성도 지원합니다. 전처리, 후처리 로직을 자유롭게 구현할 수 있으며, DJL의 Python Engine은 동기 모드와 비동기 모드를 모두 지원합니다. 비동기 모드(option.async_mode=true)를 사용하면 asyncio를 활용하여 단일 요청 레벨에서 코드를 작성하면서도 여러 동시 요청을 효율적으로 처리할 수 있습니다.

성능 최적화 기능

LMI v16(2025년 10월 출시)는 vLLM 0.10.2와 V1 엔진을 지원하며 V1 엔진은 단순화된 스케줄링, 제로 오버헤드 prefix caching, 효율적인 텐서 병렬 추론, torch.compile 및 Flash Attention 3와 같은 고급 최적화 기능을 지원합니다.

async 모드는 vLLM의 AsyncLLMEngine과 직접 통합되어 요청 처리 효율을 개선합니다. 백그라운드 루프가 지속적으로 들어오는 요청을 처리하여 이전 Rolling-Batch 구현보다 높은 처리량으로 여러 동시 요청을 처리하고 출력을 스트리밍할 수 있습니다.

1.3. 한계점 (멀티 노드 분산 미지원)

SageMaker 실시간 엔드포인트는 단일 인스턴스 내에서만 병렬화를 지원하며, 멀티 인스턴스(노드)의 분산 추론과 disaggregated serving 기능은 2025년 10월 기준으로 지원하지 않습니다.

  • initial_instance_count > 1로 설정하면 여러 인스턴스가 생성되지만, 이는 수평 확장(horizontal scaling)이며 각 인스턴스는 완전히 독립적인 모델 복사본을 실행합니다

  • 인스턴스 간 통신이나 모델 파티셔닝은 지원되지 않습니다

따라서, 초거대 모델의 배포가 필요할 땐 증류 기법이나 양자화를 통해 모델 크기를 줄이거나, HyperPod EKS로 배포하는 옵션을 고려해야 합니다.

2. Getting Started


2.1. 모델 아티팩트 준비 및 설정

모델 아티팩트 준비

LMI 배포의 첫 단계는 모델 아티팩트를 준비하는 것으로 허깅페이스에 등록된 OSS 모델은 모델 ID만 입력하여 직접 배포가 가능하며(예: meta-llama/Llama-3.3-70B-Instruct), 모델 아티팩트가 S3에 저장된 경우에는 S3 URI를 입력하면 됩니다. (예: s3://my-bucket/my-model/).

모델 아티팩트가 S3에 저장된 경우, 압축되지 않은 형태로 저장하는 것이 권장됩니다. LMI는 대규모 모델에 최적화된 빠른 다운로드 메커니즘을 구현했으며, 이는 아티팩트가 압축되지 않은 상태를 요구합니다. SageMaker의 S3DataType을 S3Prefix로, CompressionType을 None으로 설정하면 SageMaker가 모델 아티팩트를 다운로드하여 컨테이너에 마운트합니다.

설정 방식: 환경 변수 vs. serving.properties

LMI는 두 가지 설정 메커니즘을 제공한다. serving.properties 파일을 사용하거나 환경 변수를 통해 설정할 수 있습니다. 대부분의 사용 사례에서는 환경 변수만으로 충분하지만, 동일한 컨테이너 내에서 여러 모델을 서빙하는 경우(SageMaker Multi-Model Endpoint)에는 모델별 serving.properties 파일을 사용해야 합니다.

환경 변수는 전역 설정이며 단일 LMI 인스턴스 내에서 서빙되는 모든 모델에 적용됩니다. serving.properties와 환경 변수를 혼합할 수 있지만, 한 가지 방식을 선택하여 모든 설정을 지정하는 것이 권장됩니다. serving.properties 파일의 설정은 환경 변수의 설정을 오버라이드합니다.

2.2. SageMaker Python SDK를 통한 배포

환경 변수 사용

환경 변수를 통한 설정 예시는 다음과 같습니다.

import sagemaker
from sagemaker.model import Model

role = "[YOUR ROLE]"
region = "us-west-2"

# LMI 컨테이너 URI 조회
container_uri = sagemaker.image_uris.retrieve(
    framework="djl-lmi",
    version="0.32.0",
    region=region
)

# 사용할 모델 지정
HF_MODEL_ID = "meta-llama/Llama-3.3-70B-Instruct"

# Hugging Face 토큰 (선택사항)
HF_TOKEN = ""

# 환경 변수로 설정 지정
env = {
    "HF_MODEL_ID": "meta-llama/Llama-3.2-3B",
    "TENSOR_PARALLEL_DEGREE": "max",
    "OPTION_ROLLING_BATCH": "vllm",
    "OPTION_DTYPE": "bf16"
}

# 모델 생성
model = Model(
    image_uri=container_uri,
    role=role,
    env=vllm_config
)

# 엔드포인트 배포
predictor = model.deploy(
    instance_type="ml.g5.xlarge",
    initial_instance_count=1,
    endpoint_name="my-llm-endpoint",
    container_startup_health_check_timeout=1800
)

serving.properties 파일 사용

serving.properties 파일을 사용하는 경우, 해당 파일을 S3에 업로드하고 모델 아티팩트와 함께 배포합니다.

engine=Python
option.model_id=meta-llama/Llama-3.2-3B
option.tensor_parallel_degree=max
option.rolling_batch=vllm
option.dtype=bf16
option.trust_remote_code=true

디렉토리 구조는 다음과 같습니다.

my-model/
├── serving.properties
├── config.json
├── model-00001-of-00002.safetensors
└── model-00002-of-00002.safetensors ...

S3에 업로드 후 ModelDataSource를 통해 배포합니다.

model_data = {
    "S3DataSource": {
        "S3Uri": "s3://my-bucket/my-model/",
        "S3DataType": "S3Prefix",
        "CompressionType": "None"
    }
}

model = Model(
    image_uri=container_uri,
    role=role,
    model_data=model_data
)

2.3. 추론 실행 및 스트리밍

배포된 엔드포인트는 REST API, AWS boto3 SDK 또는 SageMaker Python SDK를 통해 호출합니다. 기본적으로 JSON 직렬화를 사용합니다.

response = predictor.predict({
    "inputs": "What is deep learning?",
    "parameters": {
        "max_new_tokens": 512,
        "temperature": 0.7,
        "top_p": 0.9
    }
})

LMI v15부터는 세 가지 API 스키마를 지원합니다. OpenAI Chat Completions API와 호환되는 Message 형식, OpenAI Completions 형식, 그리고 이전 모델과의 하위 호환성을 위한 Text Generation Inference(TGI) 스키마가 있습니다.

스트리밍 응답을 위해서는 SageMaker Runtime의 invoke_endpoint_with_response_stream을 사용합니다.

import boto3

smr_client = boto3.client("sagemaker-runtime")

response = smr_client.invoke_endpoint_with_response_stream(
    EndpointName="my-llm-endpoint",
    Body=json.dumps({
        "inputs": "Explain quantum computing",
        "parameters": {"max_new_tokens": 256}
    }),
    ContentType="application/json"
)

for event in response["Body"]:
    print(event["PayloadPart"]["Bytes"].decode())

보다 자세한 내용은 https://github.com/daekeun-ml/sm-endpoint-bmt 를 참조하기 바랍니다.

3. 성능 튜닝 및 최적화 가이드


3.1. 베이스라인

인스턴스 타입 선택 베이스라인

모델 크기
활성화 파라미터
권장 인스턴스
GPU 메모리

DeepSeek-R1 (671B)

37B

ml.p5en.48xlarge

1,128GB

Qwen3-235B-A22B

22B

ml.p5.48xlarge

640GB

GPT-OSS-120B

5.1B

ml.g6.48xlarge

192GB

GPT-OSS-20B

3.6B

ml.g6.2xlarge

24GB

vLLM 전용 설정

{
  "OPTION_ROLLING_BATCH": "vllm",
  "OPTION_ENFORCE_EAGER": "false",
  "OPTION_DISABLE_SLIDING_WINDOW": "false",
  "OPTION_ENABLE_PREFIX_CACHING": "true",
  "OPTION_DISABLE_LOG_STATS": "false",
  "OPTION_GUIDED_DECODING_BACKEND": "outlines"
}

주요 vLLM 파라미터:

  • ENFORCE_EAGER: CUDA 그래프 비활성화 (디버깅용)

  • ENABLE_PREFIX_CACHING: 공통 프롬프트 캐싱으로 성능 향상

  • GUIDED_DECODING_BACKEND: 구조화된 출력 (JSON, Regex)

TensorRT-LLM 전용 설정

{
  "OPTION_ROLLING_BATCH": "trtllm",
  "OPTION_MAX_BEAM_WIDTH": "1",
  "OPTION_DECODING_STRATEGY": "sample",
  "OPTION_TRT_ENABLE_CHUNKED_CONTEXT": "true",
  "OPTION_PAGED_KV_CACHE": "true"
}

LMI-Dist 전용 설정

{
  "OPTION_ROLLING_BATCH": "lmi-dist",
  "OPTION_SPECULATIVE_DRAFT_MODEL": "model-id",
  "OPTION_SPECULATIVE_LENGTH": "5",
  "OPTION_DRAFT_MODEL_TP_SIZE": "1"
}

DeepSpeed 전용 설정

{
  "OPTION_ROLLING_BATCH": "deepspeed",
  "OPTION_TRIANGULAR_MASKING": "true",
  "OPTION_RETURN_ALL_LOGITS": "false",
  "OPTION_CHECKPOINT": "auto"
}

베이스라인 세팅 1: vLLM 비동기 모드 (권장)

{
  "HF_MODEL_ID": "meta-llama/Meta-Llama-3-8B-Instruct",
  "HF_TOKEN": "<your-huggingface-token>",
  "OPTION_ROLLING_BATCH": "vllm",
  "OPTION_DTYPE": "fp16",
  "TENSOR_PARALLEL_DEGREE": "max",
  "OPTION_MAX_MODEL_LEN": "4096",
  "OPTION_GPU_MEMORY_UTILIZATION": "0.9",
  "OPTION_MODEL_LOADING_TIMEOUT": "1800",
  "SERVING_LOAD_MODELS": "test::vLLM=/opt/ml/model"
}

베이스라인 세팅 2: GPT-OSS-120B

    "HF_MODEL_ID": "openai/gpt-oss-120b",
    "TENSOR_PARALLEL_DEGREE": "8",
    "OPTION_ROLLING_BATCH": "vllm",
    "OPTION_DTYPE": "bf16",  # 또는 fp8
    "OPTION_MAX_ROLLING_BATCH_SIZE": "64",
    "OPTION_MAX_MODEL_LEN": "8192",
    "OPTION_TRUST_REMOTE_CODE": "true"
}

베이스라인 세팅 3: Qwen3-235B-A22B

{
    "HF_MODEL_ID": "Qwen/Qwen3-235B-A22B-Instruct",
    "TENSOR_PARALLEL_DEGREE": "8",
    "OPTION_ROLLING_BATCH": "vllm",
    "OPTION_DTYPE": "fp8",  # 대규모 MoE는 FP8 권장
    "OPTION_MAX_ROLLING_BATCH_SIZE": "48",
    "OPTION_MAX_MODEL_LEN": "16384",
    "OPTION_TRUST_REMOTE_CODE": "true",
    "OPTION_GPU_MEMORY_UTILIZATION": "0.92"
}

베이스라인 세팅 4: 양자화 모델 (AWQ)

{
  "HF_MODEL_ID": "TheBloke/Llama-2-70B-AWQ",
  "OPTION_ROLLING_BATCH": "vllm",
  "OPTION_QUANTIZE": "awq",
  "TENSOR_PARALLEL_DEGREE": "4",
  "OPTION_MAX_MODEL_LEN": "4096",
  "OPTION_GPU_MEMORY_UTILIZATION": "0.95"
}

베이스라인 세팅 5: LoRA 어댑터 활용

{
  "HF_MODEL_ID": "meta-llama/Meta-Llama-3-8B",
  "OPTION_ROLLING_BATCH": "lmi-dist",
  "OPTION_ENABLE_LORA": "true",
  "OPTION_MAX_LORAS": "4",
  "OPTION_MAX_LORA_RANK": "64",
  "OPTION_LORA_EXTRA_VOCAB_SIZE": "256",
  "TENSOR_PARALLEL_DEGREE": "1"
}

3.2. 필수 설정

모델 식별

변수
설명
예제
필수

HF_MODEL_ID

HuggingFace 모델 ID

meta-llama/Meta-Llama-3-8B-Instruct

HF_TOKEN

HuggingFace 액세스 토큰 (gated 모델용)

hf_xxxxx

조건부

OPTION_MODEL_ID

로컬 모델 경로 또는 S3 경로

s3://bucket/model/

HF_MODEL_ID 대신

백엔드 선택

변수
설명
가능한 값
기본값

OPTION_ROLLING_BATCH

추론 백엔드 엔진

vllm, lmi-dist, trtllm, deepspeed, scheduler

vllm

백엔드 선택 가이드:

  • vLLM: 가장 범용적, 최신 기능 지원, 커뮤니티 활발 (권장)

  • TensorRT-LLM: NVIDIA GPU 최적화, 최고 성능, 복잡한 설정

  • LMI-Dist: AWS 자체 엔진, vLLM 기반, LoRA 최적화

  • DeepSpeed: Microsoft 엔진, 대규모 모델 분산 추론

3.3. 핵심 설정

병렬화 설정

변수
설명
권장값
비고

TENSOR_PARALLEL_DEGREE

텐서 병렬 처리 GPU 수

max 또는 GPU 수

max는 사용 가능한 모든 GPU 사용

OPTION_MAX_ROLLING_BATCH_SIZE

동시 처리 요청 수

32-128

높을수록 처리량 증가, 지연 증가

텐서 병렬화 가이드:

  • 모델 크기가 단일 GPU 메모리를 초과할 때 필수

  • 7B 모델: 1 GPU (FP16 기준 ~14GB)

  • 13B 모델: 1-2 GPU

  • 70B 모델: 4-8 GPU

  • 큰 배치 사이즈보다 텐서 병렬화가 지연시간에 유리

데이터 타입

변수
설명
가능한 값
권장

OPTION_DTYPE

모델 가중치 정밀도

fp32, fp16, bf16, auto

bf16 (A100+) 또는 fp16

데이터 타입 선택:

  • BF16: A100, H100 등 최신 GPU에서 권장, 수치 안정성 우수

  • FP16: V100, T4 등 구형 GPU, 메모리 효율 높음

  • FP32: 디버깅용, 실제 서비스에서는 비권장

  • Auto: 모델 설정에 따라 자동 선택

컨텍스트 길이 설정

변수
설명
권장값
비고

OPTION_MAX_MODEL_LEN

최대 시퀀스 길이 (입력+출력)

2048-8192

모델 한계 내에서 설정

OPTION_MAX_INPUT_LEN

최대 입력 토큰 수

MAX_MODEL_LEN - 512

출력 공간 확보 필요

OPTION_MAX_NEW_TOKENS

최대 생성 토큰 수

512-2048

사용 사례에 따라 조정

3.4. 성능 튜닝

메모리 최적화

변수
설명
권장값
영향

OPTION_GPU_MEMORY_UTILIZATION

GPU 메모리 사용률

0.85-0.95

높을수록 배치 크기 증가, OOM 위험

OPTION_MAX_NUM_BATCHED_TOKENS

배치당 최대 토큰 수

8192-32768

처리량과 지연시간 트레이드오프

OPTION_MAX_NUM_SEQS

동시 처리 시퀀스 수

256

높으면 처리량 증가

메모리 튜닝 전략:

  • 초기 설정: GPU_MEMORY_UTILIZATION=0.85로 시작

  • OOM 에러 발생: 0.8로 낮추기

  • 여유 메모리 있음: 0.9~0.95로 증가하여 배치 크기 확대

  • 모니터링: CloudWatch에서 GPU 메모리 사용률 확인

배치 처리 최적화

변수
설명
권장값
사용 사례

OPTION_MAX_ROLLING_BATCH_PREFILL_TOKENS

Prefill 단계 토큰 수

4096-16384

긴 입력 처리 시 증가

OPTION_ENABLE_CHUNKED_PREFILL

청크 단위 prefill

true

긴 컨텍스트 안정성 향상

스케줄링 정책

변수
설명
가능한 값
권장

OPTION_SCHEDULER_POLICY

요청 스케줄링 방식

fcfs, priority

fcfs (선착순)

KV 캐시 최적화 (vLLM)

{
  "OPTION_BLOCK_SIZE": "16",
  "OPTION_SWAP_SPACE": "4",
  "OPTION_ENABLE_PREFIX_CACHING": "true"
}

KV 캐시 설정:

  • BLOCK_SIZE: 캐시 블록 크기, 작을수록 메모리 효율 증가, 16 또는 32 권장

  • SWAP_SPACE: CPU 메모리로 스왑 가능 공간(GB), 긴 시퀀스 처리 시 유용

  • ENABLE_PREFIX_CACHING: 공통 프롬프트 캐싱, 반복 요청 시 성능 향상

3.5. 양자화 설정

지원 양자화 방법

변수
설명
지원 백엔드
성능

OPTION_QUANTIZE

양자화 방법 선택

-

-

awq

Activation-aware Weight Quantization

vLLM, LMI-Dist

4-bit, 높은 정확도

gptq

GPT Quantization

vLLM

4-bit, 범용적

squeezellm

SqueezeLLM

vLLM

3-4bit, 메모리 극대화

bitsandbytes

BitsAndBytes

LMI-Dist

8-bit/4-bit, 쉬운 적용

양자화 모델 사용 예제

AWQ 양자화 (권장)

{
  "HF_MODEL_ID": "casperhansen/llama-3-70b-instruct-awq",
  "OPTION_ROLLING_BATCH": "vllm",
  "OPTION_QUANTIZE": "awq",
  "TENSOR_PARALLEL_DEGREE": "4",
  "OPTION_MAX_MODEL_LEN": "8192",
  "OPTION_GPU_MEMORY_UTILIZATION": "0.95"
}

GPTQ 양자화

{
  "HF_MODEL_ID": "TheBloke/Llama-2-70B-Chat-GPTQ",
  "OPTION_ROLLING_BATCH": "vllm",
  "OPTION_QUANTIZE": "gptq",
  "TENSOR_PARALLEL_DEGREE": "4"
}

BitsAndBytes (LMI-Dist)

{
  "HF_MODEL_ID": "meta-llama/Meta-Llama-3-70B-Instruct",
  "OPTION_ROLLING_BATCH": "lmi-dist",
  "OPTION_QUANTIZE": "bitsandbytes",
  "OPTION_LOAD_IN_4BIT": "true",
  "TENSOR_PARALLEL_DEGREE": "4"
}

양자화 선택 가이드

  • 최고 정확도 필요: AWQ (4-bit)

  • 범용적 사용: GPTQ

  • 최대 메모리 절감: SqueezeLLM (3-bit)

  • 간편한 적용: BitsAndBytes

  • 70B 이상 모델: AWQ 또는 GPTQ 필수

3.6. LoRA 어댑터

LoRA 기본 설정

변수
설명
권장값
비고

OPTION_ENABLE_LORA

LoRA 활성화

true

LMI-Dist 백엔드 권장

OPTION_MAX_LORAS

동시 로드 가능 LoRA 수

4-8

메모리에 따라 조정

OPTION_MAX_LORA_RANK

최대 LoRA rank

64-128

모든 어댑터가 이하여야 함

OPTION_LORA_EXTRA_VOCAB_SIZE

LoRA 추가 어휘 크기

256

새 토큰 추가 시 필요

OPTION_MAX_CPU_LORAS

CPU 메모리 LoRA 수

8-16

동적 로딩 시 유용

LoRA 사용 예제

단일 LoRA 어댑터

{
  "HF_MODEL_ID": "meta-llama/Meta-Llama-3-8B",
  "OPTION_ROLLING_BATCH": "lmi-dist",
  "OPTION_ENABLE_LORA": "true",
  "OPTION_MAX_LORAS": "1",
  "OPTION_MAX_LORA_RANK": "64",
  "TENSOR_PARALLEL_DEGREE": "1"
}

다중 LoRA 어댑터 (멀티테넌트)

{
  "HF_MODEL_ID": "meta-llama/Meta-Llama-3-8B",
  "OPTION_ROLLING_BATCH": "lmi-dist",
  "OPTION_ENABLE_LORA": "true",
  "OPTION_MAX_LORAS": "8",
  "OPTION_MAX_LORA_RANK": "128",
  "OPTION_MAX_CPU_LORAS": "16",
  "OPTION_LORA_EXTRA_VOCAB_SIZE": "256",
  "TENSOR_PARALLEL_DEGREE": "2"
}

LoRA 요청 방법

추론 요청 시 adapters 필드로 어댑터 지정:

response = predictor.predict({
    "inputs": "Your prompt here",
    "parameters": {
        "max_new_tokens": 512,
        "temperature": 0.7
    },
    "adapters": ["adapter-name-1"]  # LoRA 어댑터 지정
})

3.7. 추가 설정

모델 로딩

변수
설명
권장값
비고

OPTION_MODEL_LOADING_TIMEOUT

모델 로딩 제한 시간 (초)

1800-3600

대형 모델은 길게 설정

SERVING_LOAD_MODELS

모델 로딩 정의

test::Python=/opt/ml/model

백엔드별 형식 다름

OPTION_TRUST_REMOTE_CODE

원격 코드 실행 허용

true

커스텀 모델 필요 시

출력 제어

변수
설명
권장값
사용 사례

OPTION_OUTPUT_FORMATTER

출력 형식

jsonlines, json

스트리밍: jsonlines

OPTION_RETURN_ALL_LOGITS

모든 로짓 반환

false

디버깅 시만 true

OPTION_MAX_LOGPROBS

로그 확률 상위 K개

5-10

필요 시만 활성화

토큰화

변수
설명
권장값
비고

OPTION_DISABLE_CUSTOM_ALL_REDUCE

커스텀 all-reduce 비활성화

false

NCCL 문제 시 true

OPTION_TOKENIZER_MODE

토크나이저 모드

auto, slow

auto 권장

엔드포인트 설정

변수
설명
권장값
비고

SERVING_FAIL_FAST

빠른 실패 모드

true

프로덕션 환경 권장

OPTION_PAGED_ATTENTION

Paged Attention 활성화

true

vLLM 기본 활성화

4. 트러블슈팅


OOM (Out of Memory) 에러

증상: CUDA out of memory 에러 해결책

{
  "OPTION_GPU_MEMORY_UTILIZATION": "0.8",  // 0.9에서 낮추기
  "OPTION_MAX_MODEL_LEN": "2048",  // 컨텍스트 길이 감소
  "OPTION_MAX_NUM_SEQS": "128",  // 배치 크기 감소
  "TENSOR_PARALLEL_DEGREE": "max"  // GPU 추가 분산
}

모델 로딩 타임아웃

증상: Model loading timeout 에러 해결책

{
  "OPTION_MODEL_LOADING_TIMEOUT": "3600",  // 1시간으로 증가
  "OPTION_TRUST_REMOTE_CODE": "true"
}

느린 추론 속도

증상: 높은 지연 시간 해결책

{
  "OPTION_GPU_MEMORY_UTILIZATION": "0.95",  // 배치 크기 증가
  "OPTION_MAX_NUM_BATCHED_TOKENS": "16384",
  "OPTION_ENABLE_PREFIX_CACHING": "true",  // 캐싱 활성화
  "OPTION_ENABLE_CHUNKED_PREFILL": "false"  // 단일 요청 최적화
}

NCCL 통신 에러

증상: NCCL error 또는 텐서 병렬 실패 해결책

{
  "OPTION_DISABLE_CUSTOM_ALL_REDUCE": "true",
  "NCCL_DEBUG": "INFO",  // 디버깅용
  "NCCL_SOCKET_IFNAME": "eth0"  // 네트워크 인터페이스 지정
}

토큰화 에러

증상: Tokenizer 로드 실패 해결책

{
  "OPTION_TRUST_REMOTE_CODE": "true",
  "OPTION_TOKENIZER_MODE": "slow",
  "HF_TOKEN": "<valid-token>"
}

References

Last updated