NVIDIA Model Optimizer 소개
큰 언어 모델을 서비스에 올려 추론(Inference)을 수행하려는 팀이 가장 먼저 부딪히는 벽은 정확도가 아니라 메모리와 지연 시간입니다. BF16 그대로 올리면 GPU가 부족하고, 정확도를 조금 내주고 압축하기로 결정하면 이번에는 도구 선택 문제가 남습니다. 양자화(Quantization), 가지치기(Pruning), 지식 증류(Knowledge Distillation), 추측 디코딩(Speculative Decoding)은 각각 별개의 연구 계보에서 나온 기법이라 구현체도 따로 흩어져 있고, 두 가지를 겹쳐 쓰려면 중간 산출물의 형식을 직접 맞춰야 합니다. 어렵게 압축을 끝내도 마지막 관문이 하나 더 있습니다. 만들어 둔 체크포인트를 실제 추론 엔진이 그대로 읽어 주느냐입니다.
NVIDIA Model Optimizer 는 이 기법들을 한 파이썬 라이브러리 안에서 조합하고, 그 결과를 추론 엔진이 바로 읽을 수 있는 체크포인트로 내보내는 것을 목표로 하는 모델 최적화 라이브러리입니다. NVIDIA는 이 프로젝트를 짧게 Model Optimizer 또는 ModelOpt 으로 부르며, 파이썬 패키지 이름은 nvidia-modelopt 입니다. 입력으로는 Hugging Face, PyTorch, ONNX 모델을 받고, 출력된 체크포인트는 TensorRT-LLM, TensorRT, vLLM, SGLang 에 배포할 수 있습니다. 학습이 필요한 최적화 기법을 위해 NVIDIA Megatron-Bridge, Megatron-LM, Hugging Face Accelerate 와의 연동도 함께 제공합니다.
이 프로젝트의 이름을 검색할 때 한 가지 주의할 점이 있습니다. 원래 이름은 NVIDIA TensorRT Model Optimizer 였고 2025년 12월 8일에 지금의 NVIDIA Model Optimizer 로 바뀌었습니다. 이름에 TensorRT 가 남아 있던 시절의 문서를 보고 배포 대상이 TensorRT 계열로 한정된다고 짐작하기 쉽지만, 지금 저장소가 밝히는 배포 대상에는 vLLM 과 SGLang 도 함께 들어 있습니다. 저장소가 오픈소스로 공개된 시점은 2025년 1월 28일입니다.
Model Optimizer의 6가지 최적화 기법
Model Optimizer가 제공하는 기법은 여섯 가지이고, 각각 무엇을 줄이는지가 다릅니다. 저장소가 정리해 둔 목록은 다음과 같습니다:
| 기법 | 무엇을 하는가 | 학습 필요 | 문서 |
|---|---|---|---|
| 학습 후 양자화(Post Training Quantization) | 모델 크기를 2~4배 줄여 품질을 유지한 채 추론을 가속 | 불필요(보정 데이터만) | 가이드 |
| 양자화 인식 학습(Quantization Aware Training) | 몇 단계의 추가 학습으로 양자화 모델의 정확도를 회복 | 필요 | 가이드 |
| 가지치기(Pruning) | 불필요한 가중치를 제거해 파라미터 수와 메모리를 줄임 | 보통 재학습 병행 | 예제 |
| 지식 증류(Distillation) | 작은 모델이 큰 모델의 동작을 따라 하도록 학습 | 필요 | 가이드 |
| 추측 디코딩(Speculative Decoding) | 초안 모듈을 학습해 추론 중 토큰을 미리 예측 | 필요 | 가이드 |
| 희소성(Sparsity) | 0이 아닌 값과 그 위치만 저장해 모델을 압축 | 불필요 | 가이드 |
위 표에서 학습이 필요한 기법과 그렇지 않은 기법이 갈리는 지점이 실무 판단의 첫 갈림길입니다. 보정 데이터 수백 건만 있으면 되는 학습 후 양자화와 희소성은 GPU 몇 장으로 오후에 시도해 볼 수 있지만, 양자화 인식 학습과 지식 증류, 추측 디코딩은 학습 파이프라인을 붙여야 합니다. Model Optimizer가 Megatron-Bridge 와 Hugging Face Accelerate 연동을 함께 제공하는 이유가 뒤쪽 세 기법 때문입니다.
기법을 겹쳐 쓴 사례도 저장소가 함께 공개해 두었습니다. Nemotron-3-Nano-30B-A3B 를 대상으로 한 종단간 최적화 튜토리얼 은 가지치기와 2단계 지식 증류, FP8 양자화를 차례로 적용해 vLLM 처리량 2.6배와 메모리 2.6배 절감을 달성했다고 적고 있습니다. 폴란드어 모델을 만드는 Bielik.AI 는 같은 조합(Minitron 가지치기 + 지식 증류)으로 33% 작고 50% 빠르면서 품질을 90% 유지한 Bielik Minitron 7B 를 만들었다고 밝혔습니다.
어떤 양자화 방식을 골라야 하는가
Model Optimizer를 실제로 쓸 때 시간을 가장 많이 잡아먹는 결정은 양자화 방식 선택입니다. NVIDIA는 공식 문서의 양자화 방식 선택 가이드 에서 10개 이상의 주요 LLM으로 측정한 결과를 근거로 다음 표를 제시합니다(행 순서는 원문 그대로입니다):
| 양자화 방식 | 소배치 성능 | 대배치 성능 | 정확도 저하 | 압축률과 지원 GPU |
|---|---|---|---|---|
| FP8 | 중 | 중 | 매우 낮음 | 원본의 50%, Ada/Hopper 이후 |
| INT8 SmoothQuant | 중 | 중 | 중간 | 원본의 50%, 대부분의 GPU |
| INT4 가중치 전용 AWQ(Activation-aware Weight Quantization, W4A16) | 높음 | 낮음 | 낮음 | 원본의 25%, Ampere 이후 |
| INT4-FP8 AWQ(W4A8) | 높음 | 중 | 낮음 | 원본의 25%, Ada/Hopper 이후 |
NVIDIA의 권고는 FP8을 먼저 시도하고, FP8의 성능이 요구를 못 채우면 INT4-FP8 AWQ 를 보라는 것입니다. Ampere 이전 세대 GPU에 배포한다면 INT4 AWQ 나 INT8 SmoothQuant 를 권합니다. 배치 크기가 4 이하인 소배치 추론은 가중치를 GPU 메모리에서 캐시로 올리는 시간이 병목이라 가중치만 4비트로 줄이는 방식이 유리하고, 배치 16 이상의 서빙 환경에서는 연산 밀도까지 문제가 되므로 가중치와 활성값을 함께 양자화하는 방식이 낫다는 것이 그 근거입니다. 보정에 걸리는 시간도 FP8과 INT8 SmoothQuant 는 수 분, INT4 계열은 수십 분으로 차이가 납니다.
Model Optimizer의 벤치마크 수치와 그 한계
NVIDIA가 벤치마크 문서에 공개한 값은 H200 GPU, nvidia-modelopt v0.21.1, TensorRT-LLM v0.15 환경에서 입력 2,048 토큰과 출력 128 토큰으로 측정한 것입니다. NVIDIA는 이 수치를 참고점이라고 밝히면서 Model Optimizer가 낼 수 있는 최고 성능으로 보지 말라고 문서 앞부분에 명시해 두었습니다. 또한 표의 속도 향상은 GPU 개수로 정규화한 값입니다. BF16 기준선의 Llama3.1-70B 는 텐서 병렬 2로, FP8 은 1로 실행합니다. 초당 토큰 수 자체는 비슷해도 GPU 절반으로 같은 일을 한 셈입니다.
Llama3.1-70B 의 배치 크기별 속도 향상은 다음과 같습니다:
| 배치 크기 | FP8 | INT4 AWQ | W4A8 AWQ |
|---|---|---|---|
| 1 | 1.90배 | 1.93배 | 2.02배 |
| 8 | 1.99배 | 1.03배 | 1.53배 |
| 64 | 2.10배 | 0.88배 | 1.72배 |
INT4 AWQ 열의 배치 64 값이 0.88배, 즉 기준선보다 느립니다. 8B 모델에서도 배치 8과 64에서 각각 0.75배와 0.83배로 떨어집니다. 앞 절의 선택 가이드가 INT4 가중치 전용 방식의 대배치 성능을 "낮음"으로 적어 둔 것이 이 수치와 맞물립니다. 4비트가 항상 빠른 것이 아니라 소배치에서만 유리하다는 뜻이고, 서빙 환경에서 무조건 낮은 비트를 고르면 손해를 볼 수 있습니다.
정확도 쪽 수치는 H100에서 측정한 MMLU(Massive Multitask Language Understanding) 손실률입니다. Llama3.1-8B(instruct) 는 FP8 에서 1.50%, INT4 AWQ 에서 5.66%, W4A8 AWQ 에서 6.00% 떨어지고, Llama3.1-70B(instruct) 는 같은 순서로 0.38%, 1.07%, 1.20% 떨어집니다. 모델이 클수록 저비트 양자화의 정확도 손실이 작아지는 경향이 두 행에서 함께 읽힙니다.
양자화 인식 학습이 무엇을 회복하는지는 Llama 2 7B 를 INT4 가중치와 INT8 활성값으로 양자화한 사례에서 가장 뚜렷합니다. samsum 데이터셋 기준으로 BF16 기준선의 검증 손실이 1.036 인데, 학습 후 양자화만 적용하면 3.321 까지 벌어지고, 여기에 양자화 인식 학습까지 적용하면 1.294 로 돌아옵니다. 가중치와 활성값을 모두 4~8비트로 낮추는 구간에서는 추가 학습 없이는 쓰기 어렵다는 것을 보여주는 수치입니다.
Model Optimizer 설치와 기본 사용법
안정 버전은 PyPI 에서 받습니다:
pip install -U nvidia-modelopt[all]
최신 기능이 필요하거나 개발 의존성까지 필요하면 저장소를 복제해 편집 가능 모드로 설치합니다:
git clone git@github.com:NVIDIA/Model-Optimizer.git
cd Model-Optimizer
pip install -e .[dev]
Model Optimizer가 미리 설치된 NVIDIA 컨테이너 이미지(nvcr.io/nvidia/pytorch:<version>-py3, nvcr.io/nvidia/nemo:<version>, nvcr.io/nvidia/tensorrt-llm/release:<version>)를 쓰는 방법도 있습니다. 다만 저장소는 설치 과정에서 서드파티 오픈소스 패키지를 함께 내려받아 설치한다는 점과, 컨테이너 이미지도 각자의 라이선스 조항을 먼저 확인해 달라는 점을 명시하고 있습니다.
PyTorch 모델에 학습 후 양자화를 적용하는 최소 예시는 공식 문서의 다음 코드입니다:
import modelopt.torch.quantization as mtq
# Setup the model
model = get_model()
# Select quantization config
config = mtq.INT8_SMOOTHQUANT_CFG
# Quantization need calibration data. Setup calibration data loader
# An example of creating a calibration data loader looks like the following:
data_loader = get_dataloader(num_samples=calib_size)
# Define forward_loop. Please wrap the data loader in the forward_loop
def forward_loop(model):
for batch in data_loader:
model(batch)
# Quantize the model and perform calibration (PTQ)
model = mtq.quantize(model, config, forward_loop)
핵심은 mtq.quantize() 한 줄에 모델, 양자화 설정, 순전파 루프를 넘기는 형태라는 점입니다. 순전파 루프는 보정용 데이터로더를 감싸는 함수이고, 보정에는 학습 또는 평가 데이터 128~512건 정도를 씁니다. 양자화가 끝난 뒤 mtq.print_quant_summary(model) 로 어떤 계층에 양자화 노드가 삽입되었는지 확인할 수 있습니다.
압축을 직접 수행하는 대신 결과만 쓰고 싶다면 NVIDIA가 미리 양자화해 공개한 체크포인트를 받는 방법도 있습니다. Hugging Face 컬렉션에 올라온 체크포인트는 TensorRT-LLM, vLLM, SGLang 에 그대로 배포할 수 있습니다.
Model Optimizer는 누구에게 유용한가
여러 최적화 기법을 겹쳐 쓸 계획이 있고 배포 대상이 TensorRT-LLM, vLLM, SGLang 중 하나인 팀에게 Model Optimizer는 적합한 선택입니다. 기법마다 다른 구현체를 붙이고 중간 형식을 맞추는 작업이 한 라이브러리 안으로 들어오고, 각 기법의 지원 모델 목록을 저장소가 지원 매트릭스로 따로 관리하고 있어 시도 전에 대상 모델이 되는지 확인할 수 있습니다.
반대로 API 안정성이 중요한 팀은 도입 시점을 신중하게 잡아야 합니다. 저장소는 아직 1.0 이전이라고 밝히면서, 기능이 사용 중단(deprecation)될 때 약 한 달, 즉 한 번의 릴리즈만큼의 이전 기간을 준다고 명시합니다. 그 기간이 지나면 0.x 대의 마이너 버전 업데이트에서도 호환성이 깨지는 변경이 들어올 수 있습니다. 또한 FP8 은 Ada 와 Hopper 이후 세대에서만 지원되므로, 보유한 GPU 세대가 그 이전이면 선택 가능한 방식이 INT8 SmoothQuant 와 INT4 AWQ 로 좁아집니다.
Model Optimizer의 라이선스
NVIDIA Model Optimizer는 Apache 라이선스 2.0으로 공개되어 있어 개인 및 상업적 목적으로 자유롭게 사용할 수 있습니다.
단, pip install 과정에서 함께 설치되는 서드파티 오픈소스 패키지와 NVIDIA 컨테이너 이미지는 각자의 라이선스를 따르므로, 상업적 배포 전에는 그 조항들을 별도로 확인해야 합니다.
NVIDIA Model Optimizer 문서 사이트
NVIDIA Model Optimizer 프로젝트 GitHub 저장소
Model Optimizer로 미리 양자화한 체크포인트 모음
더 읽어보기
이 글은 GPT 모델로 정리한 초안을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 댓글로 알려주시기를 부탁드립니다. ![]()
이 도구를 직접 설치해 사용해보셨다면, 파이토치 한국 사용자 모임
회원들을 위해 경험이나 팁을 댓글로 남겨주세요! ![]()


