NVIDIA Model Optimizer
NVIDIA Model Optimizer (NVIDIA Model Optimizer)
NVIDIA GPU로 추론할 모델을 최적화하고 싶다면 NVIDIA Model Optimizer가 큰 도움이 돼요. LLM, VLM(비전-언어 모델), 디퓨전 모델을 대상으로 PTQ(Post-Training Quantization) 와 QAT(Quantization Aware Training) 도구를 제공하는 라이브러리죠. 이 페이지에서 ModelOpt 체크포인트를 vLLM에서 쓰는 방법을 살펴볼게요.
설치 (Installation)
라이브러리를 설치하는 걸 권장해요.
pip install nvidia-modelopt
지원되는 ModelOpt 체크포인트 포맷 (Supported checkpoint formats)
vLLM은 hf_quant_config.json으로 ModelOpt 체크포인트를 감지하고, 다음 quantization.quant_algo 값을 지원해요.
FP8: 텐서별(tensor) 웨이트 스케일(+ 선택적 정적 활성화 스케일).FP8_PER_CHANNEL_PER_TOKEN: 채널별 웨이트 스케일 + 동적 토큰별 활성화 양자화.FP8_PB_WO(ModelOpt가fp8_pb_wo로 내보낼 수도 있음): 블록 스케일 FP8 웨이트 온리(보통 128×128 블록).NVFP4: ModelOpt NVFP4 체크포인트(quantization="modelopt_fp4").W4A16_NVFP4: 16비트 활성화를 쓰는 웨이트 온리 ModelOpt NVFP4 체크포인트(quantization="modelopt_fp4").MXFP8: ModelOpt MXFP8 체크포인트(quantization="modelopt_mxfp8").
NVFP4 체크포인트에서는 vLLM이 현재 플랫폼에 사용 가능한 백엔드(CUTLASS, FlashInfer, Marlin 등)에서 GEMM 커널을 로드 시점에 자동 선택해요. 네이티브 FP4 GEMM 커널을 지원하지 않는 GPU에서는 Marlin으로 웨이트 온리(W4A16) 실행에 폴백하고 경고를 로깅하죠. 이 경우 컴퓨트 집약 워크로드에서 처리량이 줄 수 있어요. 자동 선택을 바꾸려면 --linear-backend를 쓰면 됩니다(이는 예전 VLLM_NVFP4_GEMM_BACKEND 환경 변수를 대체해요). W4A16_NVFP4에서는 auto가 현재 Marlin을 선택하죠.
참고: SM100 계열 GPU에서 BF16 활성화의 MXFP8 모델이라면,
--linear-backend flashinfer_trtllm으로 FlashInfer의 TensorRT-LLM GEMM 백엔드를 선택하세요.
PTQ로 HuggingFace 모델 양자화하기 (Quantizing with PTQ)
Model Optimizer 저장소의 예시 스크립트로 HuggingFace 모델을 양자화할 수 있어요. LLM PTQ용 기본 스크립트는 보통 examples/llm_ptq 디렉터리에 있어요. 아래는 modelopt의 PTQ API로 모델을 양자화하는 예시입니다.
import modelopt.torch.quantization as mtq
from transformers import AutoModelForCausalLM
# HuggingFace에서 모델 로딩
model = AutoModelForCausalLM.from_pretrained("<path_or_model_id>")
# 양자화 config 선택, 예: FP8
config = mtq.FP8_DEFAULT_CFG
# 캘리브레이션용 forward 루프 함수 정의
def forward_loop(model):
for data in calib_set:
model(data)
# 양자화된 모듈을 in-place로 교체하는 PTQ
model = mtq.quantize(model, config, forward_loop)
모델을 양자화한 뒤에는 export API로 양자화 체크포인트를 내보낼 수 있어요.
import torch
from modelopt.torch.export import export_hf_checkpoint
with torch.inference_mode():
export_hf_checkpoint(
model, # 양자화된 모델
export_dir, # 내보낸 파일이 저장될 디렉터리
)
양자화된 체크포인트는 이제 vLLM으로 배포할 수 있어요. meta-llama/Llama-3.1-8B-Instruct에서 파생된 FP8 체크포인트인 nvidia/Llama-3.1-8B-Instruct-FP8을 배포하는 예시예요.
from vllm import LLM, SamplingParams
def main():
model_id = "nvidia/Llama-3.1-8B-Instruct-FP8"
# modelopt 체크포인트를 로딩할 때는 quantization="modelopt"를 꼭 지정
llm = LLM(model=model_id, quantization="modelopt", trust_remote_code=True)
sampling_params = SamplingParams(temperature=0.8, top_p=0.9)
prompts = [
"Hello, my name is",
"The president of the United States is",
"The capital of France is",
"The future of AI is",
]
outputs = llm.generate(prompts, sampling_params)
for output in outputs:
prompt = output.prompt
generated_text = output.outputs[0].text
print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")
if __name__ == "__main__":
main()
OpenAI 호환 서버로 배포하기 (OpenAI-compatible server)
로컬 ModelOpt 체크포인트를 OpenAI 호환 API로 서빙하려면:
vllm serve <path_to_exported_checkpoint> \
--quantization modelopt \
--host 0.0.0.0 --port 8000
테스트 (local checkpoints)
vLLM의 ModelOpt 유닛 테스트는 로컬 체크포인트 경로에 의존해서 기본적으로 CI에서 건너뛰어요. 로컬에서 직접 테스트하려면:
export VLLM_TEST_MODELOPT_FP8_PC_PT_MODEL_PATH=<path_to_fp8_pc_pt_checkpoint>
export VLLM_TEST_MODELOPT_FP8_PB_WO_MODEL_PATH=<path_to_fp8_pb_wo_checkpoint>
pytest -q tests/quantization/test_modelopt.py