텐서RT-LLM으로 LLM 추론 성능 최적화 방법 소개
LLM 추론 벤치마킹: TensorRT-LLM을 사용한 성능 최적화 대규모 언어 모델(LLM) 프레임워크를 배포, 통합, 또는 벤치마킹할 때 추론 성능을 고려하는 것이 중요합니다. 선택한 프레임워크와 기능을 최적화하여 애플리케이션에 중요한 성능 지표를 충족시키는지 확인해야 합니다. NVIDIA의 오픈소스 AI 추론 엔진인 TensorRT-LLM은 모델을 배포하고 벤치마킹 및 서비스 도구를 사용하는 방법을 제공합니다. 이번 글에서는 trtllm-bench를 사용하여 모델을 최적화하고 trtllm-serve를 사용하여 배포하는 실용적인 가이드를 제공하겠습니다. trtllm-bench로 벤치마킹하기 trtllm-bench는 TensorRT-LLM의 Python 기반 유틸리티로, 전체 추론 배포의 오버헤드 없이 모델 성능을 직접 벤치마킹할 수 있게 해줍니다. 이를 통해 모델 성능에 대한 빠른 인사이트를 생성할 수 있습니다. trtllm-bench는 일반적으로 좋은 성능을 제공하는 최적화된 설정으로 엔진을 내부적으로 설정합니다. GPU 환경 설정하기 벤치마킹은 적절히 구성된 GPU 환경에서 시작됩니다. GPU의 기본 설정을 복원하려면 다음 명령을 실행하세요: nvidia-smi -r GPU의 최대 사용량을 확인하려면: nvidia-smi -q 특정 전력 제한을 설정하거나 최대 값을 설정하려면: nvidia-smi -pl [specific_power_limit] | nvidia-smi -pm 1 자세한 내용은 trtllm-bench 문서를 참조하세요. 데이터셋 준비하기 prepare_dataset를 사용하여 합성 데이터셋을 준비하거나, 문서에서 지정된 형식을 사용하여 자체 데이터셋을 만들 수 있습니다. 사용자 정의 데이터셋의 경우, 각 줄에 페이로드가 구성된 JSON Lines(jsonl) 파일을 포맷팅하세요. 단일 데이터셋 항목의 예시는 아래와 같습니다: {"input": "example input", "output": "example output"} 이 글에서는 ISL/OSL이 128/128인 합성 데이터셋 결과를 기반으로 제공합니다. 벤치마크 실행하기 trtllm-bench를 사용하여 벤치마크를 실행하려면, trtllm-bench throughput 하위 명령을 사용하세요. PyTorch 플로우를 사용하여 벤치마크를 실행하려면, TensorRT-LLM이 설치된 환경에서 다음 명령을 실행하세요: python trtllm-bench throughput --model llama-3.1b --precision fp16 --dataset synthetic --isl 128 --osl 128 이 명령은 HuggingFace에서 체크포인트를 자동으로 불러오고 (캐시되지 않은 경우) PyTorch 플로우로 TensorRT-LLM을 부트스트랩합니다. 실행이 완료되면 결과가 results.json 파일에 저장되고 터미널에도 출력됩니다: { "performance_overview": { "total_time": 120.45, "throughput": 102.34, "latency": 1.18 }, "details": { "max_tokens": 128, "batch_size": 8 } } 성능 결과 분석하기 위 명령어를 실행하면 PERFORMANCE OVERVIEW 섹션에서 주요 통계 정보가 표시됩니다. 몇 가지 유용한 용어는 다음과 같습니다: Throughput: 단위 시간당 처리할 수 있는 토큰 수 Latency: 요청이 처리되기까지 걸리는 시간 ISL (Input Sequence Length): 입력 시퀀스의 길이 OSL (Output Sequence Length): 출력 시퀀스의 길이 분석 시 우선순위를 알아야 합니다. 일반적인 질문은 다음과 같습니다: 사용자를 위한 출력 속도를 최대한 빠르게 하고 싶습니다. 시스템의 최대 활용률을 알고 싶습니다. 품질을 유지하면서 처리량을 늘릴 수 있는 방법이 무엇인가요? 이 글에서는 사용자 경험을 최적화하는 데 초점을 맞추겠습니다. 특히 Context 단계가 완료된 후 사용자에게 반환되는 토큰의 속도(Per User Output Speed)를 중점으로 두겠습니다. trtllm-bench를 사용하여 처리 가능한 사용자 수를 좁혀나가는 데 concurrency 옵션을 사용할 수 있습니다. 예를 들어, 128/128 ISL/OSL 시나리오에서 NVIDIA의 Llama-3.1 8B FP8와 Meta의 Llama-3.1 8B FP16 모델을 벤치마킹한 결과를 살펴보겠습니다. 사용자가 대략 50 토큰/초(토큰 간 20ms)의 출력 속도를 체험하면서 시스템을 가능한 한 많이 활용하고자 합니다. GPU의 출력 처리량과 사용자 출력 속도를 플롯하여 GPU 성능과 사용자 경험 사이의 균형을 파악할 수 있습니다. 그림 1에서 Llama-3.1 8B FP16 모델은 대략 72 토큰/초/사용자로 256명의 동시 사용자만 처리할 수 있지만, Llama-3.1 8B FP8 최적화 체크포인트를 사용하면 TensorRT-LLM은 같은 예산으로 512명의 동시 사용자를 66 토큰/초/사용자로 처리할 수 있습니다. 이 데이터를 바탕으로 trtllm-bench를 사용하여 두 모델을 모두 스윕(sweep)하여 더 많은 사용자를 서비스할 수 있음을 확인할 수 있습니다. 이 데이터를 바탕으로 다음과 같이 고려할 수 있습니다: 엔진을 512 엔트리로 강제 설정하면, 트래픽이 512를 초과할 경우 첫 번째 토큰까지의 시간(TTFT)이 증가할 위험이 있습니다 (512를 초과한 요청은 대기열에 추가됨). trtllm-bench를 사용하여 다른 데이터셋과 시나리오를 평가하고 다양한 메트릭을 플롯할 수 있습니다. 이 도구는 명령줄을 쉽게 조정하여 우선순위에 따라 가치 평가를 할 수 있게 해줍니다. LLM를 trtllm-serve로 서비스하기 TensorRT-LLM은 trtllm-serve 명령을 사용하여 OpenAI 호환 엔드포인트를 쉽게 설정할 수 있는 기능을 제공합니다. 벤치마킹에서 얻은 조정값을 사용하여 최적화된 서버를 시작할 수 있습니다. 벤치마크와 달리, trtllm-serve는 일반 설정 외에는 구성에 대해 가정하지 않습니다. 최대 처리량 결과를 바탕으로 서버를 조정하려면, 다음 명령을 실행하세요: python trtllm-serve --model llama-3.1b --precision fp16 --batch_size 8 --max_outstanding_requests 512 --extra_llm_api_options 옵션을 사용하여 LLM API 수준에서 설정을 직접 변경할 수 있습니다. 벤치마킹과 동일한 설정을 적용하려면 llm_api_options.yml 파일에 다음 내용을 포함하세요: max_outstanding_requests: 512 설정 후 실행하면 서버가 실행 중이라는 상태 업데이트가 표시됩니다: Server is running on port 8000 서버가 실행되면, GenAI-Perf(이 시리즈의 두 번째 글) 또는 benchmark_serving.py의 포팅 버전을 사용하여 모델의 성능을 벤치마킹하여 조정된 서버 구성의 성능을 검증할 수 있습니다. 향후 릴리즈에서는 trtllm-bench를 사용하여 최적화된 서버를 벤치마킹할 수 있도록 기능을 확장할 계획입니다. LLM 벤치마킹 및 성능 최적화 시작하기 trtllm-bench를 사용하면 다양한 구성, 조정, 동시성, 기능을 쉽게 벤치마킹할 수 있습니다. trtllm-bench에서 얻은 설정은 TensorRT-LLM의 본격적인 서비스 솔루션인 trtllm-serve로 쉽게 옮겨갈 수 있습니다. 이를 통해 OpenAI 호환 배포를 위한 성능 조정을 원활하게 수행할 수 있습니다. 더 자세한 성능 정보, 모델별 조정, TensorRT-LLM의 조정/벤치마킹에 대한 자원은 다음과 같습니다: TensorRT-LLM Documentation LLM Inference Benchmarking: Fundamental Concepts LLM Inference Benchmarking Guide: NVIDIA GenAI-Perf and NIM