Generative AI

NVIDIA TensorRT-LLM 및 NVIDIA Triton Inference Server로 Meta Llama 3 성능 강화

Reading Time: 5 minutes

LLM 추론 성능을 가속화 및 최적화하는 NVIDIA TensorRT-LLM의 Meta Llama 3 모델 제품군에 대한 지원을 발표합니다. 브라우저 사용자 인터페이스를 통해 시리즈의 첫 번째 모델인 Llama 3 8BLlama 3 70B를 즉시 체험해 볼 수 있습니다. 또는 NVIDIA API 카탈로그의 완전히 가속화된 NVIDIA 스택에서 실행되는 API 엔드포인트를 통해 Llama 3가 어디에나 배포할 수 있는 표준 API와 함께 NVIDIA NIM으로 패키징됩니다.

거대 언어 모델은 연산 집약적입니다. 크기로 인해 비용이 많이 들고 특히 적합한 기술이 없으면 실행 속도가 느립니다. C++ 구현, KV 캐싱, 연속 인플라이트 배칭(in-flight batching)페이지드 어텐션(paged attention)과 같은 런타임 최적화에 대한 커널 융합양자화 등 많은 최적화 기술을 사용할 수 있습니다. 개발자는 어떤 조합이 사용 사례에 도움이 될지 결정해야 합니다. TensorRT-LLM은 이 작업을 단순화합니다.

TensorRT-LLM은 NVIDIA GPU의 최신 LLM에서 추론 성능을 가속화하는 오픈 소스 라이브러리입니다. NeMo는 생성형 AI 애플리케이션 구축, 맞춤화 및 배포를 위한 엔드 투 엔드 프레임워크로, TensorRT-LLM 및 NVIDIA Triton Inference Server를 사용하여 생성형 AI 배포를 지원합니다. 

TensorRT-LLM은 NVIDIA TensorRT 딥 러닝 컴파일러를 사용합니다. 여기에는 FlashAttention의 최첨단 구현을 위해 최적화된 최신 커널과 LLM 모델 실행을 위한 마스킹 처리된 멀티 헤드 어텐션(MHA)이 포함되어 있습니다. 또한 GPU에서의 획기적인 LLM 추론 성능을 위한 간단한 오픈 소스 Python API의 사전 및 사후 처리 단계와 멀티 GPU/멀티 노드 커뮤니케이션 프리미티브로 구성됩니다.

라이브러리와 사용 방법을 알아보기 위해 TensorRT-LLM 및 Triton Inference Server와 함께 Llama 3 8B를 사용하고 배포하는 방법의 예를 살펴보겠습니다.

다양한 모델과 최적화 및 멀티 GPU 실행을 비롯하여 보다 심층적인 내용에 대해 알아보려면 TensorRT-LLM 예제의 전체 목록을 확인하세요. 

설치 시작하기

먼저 pip 명령으로 OS별 설치 지침에 따라 TensorRT-LLM 라이브러리를 복제하고 구축하겠습니다. 이는 TensorRT-LLM을 구축하는 더 쉬운 방법 중 하나입니다. 또는 dockerfile을 사용하여 종속성을 검색해 라이브러리를 설치할 수 있습니다.

다음 명령은 오픈소스 라이브러리를 풀링하고 컨테이너 내부에 TensorRT-LLM 설치에 필요한 모든 종속성을 설치합니다. 

git clone -b v0.8.0 https://github.com/NVIDIA/TensorRT-LLM.git
cd TensorRT-LLM

모델 가중치 가져오기

TensorRT-LLM은 LLM 추론을 위한 라이브러리입니다. 이를 사용하려면 트레이닝된 가중치 세트를 제공해야 합니다. 가중치 세트는 Hugging Face Hub 또는 NVIDIA NGC와 같은 리포지토리에서 가져올 수 있습니다. 또 다른 옵션은 NeMo와 같은 프레임워크에서 트레이닝된 자체 모델 가중치를 사용하는 것입니다.

이 게시물의 명령은 Hugging Face Hub에서 80억 개의 매개변수 Llama 3 모델의 지시 조정(instruction-tuned)된 변형에 대한 가중치(및 Tokenizer 파일)를 자동으로 가져옵니다. 다음 명령을 통해 오프라인에서 사용할 가중치를 다운로드하고 이 디렉터리를 가리키도록 이후 명령의 경로를 업데이트할 수도 있습니다.

git lfs install
git clone https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct

이 모델을 사용하려면 특정 라이선스가 필요합니다. 약관에 동의하고 HuggingFace로 인증하여 필요한 파일을 다운로드합니다. 

TensorRT-LLM 컨테이너 실행

기본 도커 컨테이너를 시작하고 TensorRT-LLM에 필요한 종속성을 설치하겠습니다.

# Obtain and start the basic docker image environment.
docker run --rm --runtime=nvidia --gpus all --volume ${PWD}:/TensorRT-LLM --entrypoint /bin/bash -it --workdir /TensorRT-LLM nvidia/cuda:12.1.0-devel-ubuntu22.04

# Install dependencies, TensorRT-LLM requires Python 3.10
apt-get update && apt-get -y install python3.10 python3-pip openmpi-bin libopenmpi-dev

# Install the stable version (corresponding to the cloned branch) of TensorRT-LLM.

pip3 install tensorrt_llm==0.8.0 -U --extra-index-url https://pypi.nvidia.com

모델 컴파일

프로세스의 다음 단계는 모델 가중치와 TensorRT-LLM Python API로 작성된 모델 정의를 사용하여 모델을 TensorRT 엔진으로 컴파일하는 것입니다. 

TensorRT-LLM 리포지토리에는 여러 모델 아키텍처가 포함되어 있으며 Llama 모델 정의를 사용합니다. 자세한 내용과 더 강력한 플러그인 및 양자화에 대해서는 이 Llama 예제정밀도 문서를 참조하세요.

# Log in to huggingface-cli
# You can get your token from huggingface.co/settings/token
huggingface-cli login --token *****

# Build the Llama 8B model using a single GPU and BF16.
python3 examples/llama/convert_checkpoint.py --model_dir ./Meta-Llama-3-8B-Instruct \
            --output_dir ./tllm_checkpoint_1gpu_bf16 \
            --dtype bfloat16

trtllm-build --checkpoint_dir ./tllm_checkpoint_1gpu_bf16 \
            --output_dir ./tmp/llama/8B/trt_engines/bf16/1-gpu \
            --gpt_attention_plugin bfloat16 \
            --gemm_plugin bfloat16

TensorRT-LLM API로 모델 정의를 생성할 때는 뉴럴 네트워크의 레이어를 형성하는 TensorRT 프리미티브에서 연산 그래프를 구축합니다. 이러한 작업은 GPU용으로 사전 작성된 프로그램인 특정 커널에 매핑됩니다. 

TensorRT 컴파일러는 그래프를 탐색하여 각 작업과 사용 가능한 각 GPU에 가장 적합한 커널을 선택할 수 있습니다. 또한 그래프에서 여러 작업이 단일 융합 커널로 병합하기에 좋은 후보인 패턴을 식별하여 필요한 메모리 이동량과 여러 GPU 커널을 실행하는 데 따른 오버헤드를 줄일 수 있습니다. 

더불어 TensorRT는 동시에 실행 가능한 NVIDIA CUDA 그래프로 작업 그래프를 구축합니다. 이는 커널 실행의 오버헤드를 더욱 줄입니다.

TensorRT 컴파일러는 레이어를 융합하고 실행 속도를 높이는 데 효율적이지만, FlashAttention과 같이 일부 복잡한 레이어 융합은 많은 작업을 함께 인터리브해야 하며 자동으로 발견할 수 없습니다. 이를 위해 컴파일 타임에 그래프의 일부를 플러그인으로 명시적으로 대체할 수 있습니다. 이 예시에서는 FlashAttention과 유사한 융합 어텐션 커널을 구현하는 gpt_attention 플러그인과 FP32 누산으로 행렬 곱셈을 수행하는 gemm 플러그인이 있습니다. 또한 전체 모델에 대해 원하는 정밀도를 HuggingFace에서 다운로드한 가중치의 기본 정밀도와 일치하는 FP16으로 호출합니다.  

빌드 스크립트 실행이 끝나면 /tmp/llama/8B/trt_engines/bf16/1-gpu 폴더에 다음 세 개의 파일이 표시됩니다.

  • rank0.engine은 빌드 스크립트의 주요 출력으로, 모델 가중치가 포함된 실행 가능한 작업 그래프가 포함되어 있습니다. 
  • config.json에는 일반 구조 및 정밀도와 같은 모델에 대한 자세한 정보와 어떤 플러그인이 엔진에 통합되었는지에 대한 정보가 포함됩니다. 

모델 실행

이제 모델 엔진이 준비되었으니 이 엔진으로 무엇을 할 수 있을까요?

엔진 파일에는 모델을 실행하기 위한 정보가 포함되어 있습니다. TensorRT-LLM에는 엔진 파일을 실행하고 모델 출력에서 토큰 샘플링, KV 캐시 관리, 요청 일괄 처리 등의 프로세스를 관리하기 위해 고도로 최적화된 C++ 런타임이 있습니다. 

런타임을 직접 사용하여 모델을 로컬에서 실행하거나 프로덕션 환경에서 Triton Inference Server를 사용해 배포하여 모델을 여러 사용자와 공유할 수 있습니다. 

모델을 로컬에서 실행하기 위해 다음 명령을 실행할 수 있습니다.

python3 examples/run.py --engine_dir=./tmp/llama/8B/trt_engines/bf16/1-gpu --max_output_len 100 --tokenizer_dir ./Meta-Llama-3-8B-Instruct --input_text "How do I count to nine in French?"

Triton Inference Server 배포

로컬 실행을 넘어 Triton Inference Server를 사용하여 LLM의 프로덕션 대비용 배포를 만들 수도 있습니다. TensorRT-LLM용 Triton Inference Server 백엔드는 고성능 추론 실행을 위해 TensorRT-LLM C++ 런타임을 사용합니다. 여기에는 짧은 지연 시간으로 높은 처리량을 제공하는 인플라이트 배칭페이지드 KV 캐싱과 같은 기술이 포함됩니다. TensorRT-LLM 백엔드는 Triton Inference Server와 함께 번들로 제공되며 NGC에서 사전 구축된 컨테이너로 사용할 수 있습니다.

먼저 Triton Inference Server가 모델 및 모든 관련 메타데이터를 읽을 수 있도록 모델 리포지토리를 만들어야 합니다. 

tensorrtllm_backend 리포지토리에는 복제 가능한 all_models/inflight_batcher_llm/ 아래에 필수 모델 리포지토리의 설정이 포함되어 있습니다. 

이 디렉터리에는 모델 실행 프로세스의 여러 부분에 대한 아티팩트가 들어 있는 4개의 하위 폴더가 있습니다. preprocessing/postprocessing/ 폴더에는 Triton Inference Server python 백엔드에 대한 스크립트가 있습니다. 해당 스크립트는 텍스트 입력을 토큰화하고 모델 출력을 토큰화 해제하여 모델이 작동하는 문자열과 토큰 ID 간에 변환하기 위한 것입니다. 

tensorrt_llm 폴더는 이전에 컴파일한 모델 엔진을 배치할 위치입니다. 마지막으로 ensemble 폴더는 앞의 세 가지 구성 요소를 함께 연결하고 Triton Inference Server에 이러한 구성 요소를 통해 데이터가 흐르는 방법을 알려주는 모델 앙상블을 정의합니다. 

예제 모델 리포지토리를 풀다운하고 이전 단계에서 컴파일한 모델을 복사합니다.

# After exiting the TensorRT-LLM docker container
cd ..
git clone -b v0.8.0 https://github.com/triton-inference-server/tensorrtllm_backend.git
cd tensorrtllm_backend
cp ../TensorRT-LLM/tmp/llama/8B/trt_engines/bf16/1-gpu/* all_models/inflight_batcher_llm/tensorrt_llm/1/

다음으로 리포지토리 스켈레톤의 구성 파일을 컴파일된 모델 엔진의 위치로 수정해야 합니다. 또한 추론을 위해 요청을 배치할 때 KV 캐시에 대한 메모리 할당을 사용하고 처리하도록 Tokenizer와 같은 구성 매개변수를 업데이트해야 합니다.

#Set the tokenizer_dir and engine_dir paths
HF_LLAMA_MODEL=TensorRT-LLM/Meta-Llama-3-8B-Instruct
ENGINE_PATH=tensorrtllm_backend/all_models/inflight_batcher_llm/tensorrt_llm/1

python3 tools/fill_template.py -i all_models/inflight_batcher_llm/preprocessing/config.pbtxt tokenizer_dir:${HF_LLAMA_MODEL},tokenizer_type:auto,triton_max_batch_size:64,preprocessing_instance_count:1

python3 tools/fill_template.py -i all_models/inflight_batcher_llm/postprocessing/config.pbtxt tokenizer_dir:${HF_LLAMA_MODEL},tokenizer_type:auto,triton_max_batch_size:64,postprocessing_instance_count:1

python3 tools/fill_template.py -i all_models/inflight_batcher_llm/tensorrt_llm_bls/config.pbtxt triton_max_batch_size:64,decoupled_mode:False,bls_instance_count:1,accumulate_tokens:False

python3 tools/fill_template.py -i all_models/inflight_batcher_llm/ensemble/config.pbtxt triton_max_batch_size:64

python3 tools/fill_template.py -i all_models/inflight_batcher_llm/tensorrt_llm/config.pbtxt triton_max_batch_size:64,decoupled_mode:False,max_beam_width:1,engine_dir:${ENGINE_PATH},max_tokens_in_paged_kv_cache:2560,max_attention_window_size:2560,kv_cache_free_gpu_mem_fraction:0.5,exclude_input_in_output:True,enable_kv_cache_reuse:False,batching_strategy:inflight_fused_batching,max_queue_delay_microseconds:0

이제 도커 컨테이너를 스핀업하고 Triton 서버를 시작할 수 있습니다. 월드 크기(모델이 구축된 GPU 수량)를 지정하고 방금 설정한 model_repo를 가리켜야 합니다.

#Change to base working directory
cd..
docker run -it --rm --gpus all --network host --shm-size=1g \
-v $(pwd):/workspace \
--workdir /workspace \
nvcr.io/nvidia/tritonserver:24.03-trtllm-python-py3

# Log in to huggingface-cli to get tokenizer
huggingface-cli login --token *****

# Install python dependencies
pip install sentencepiece protobuf

# Launch Server

python3 tensorrtllm_backend/scripts/launch_triton_server.py --model_repo tensorrtllm_backend/all_models/inflight_batcher_llm --world_size 1

요청 전송

실행 중인 서버에서 추론 요청을 보내고 완료를 수신하려면 Triton Inference Server 클라이언트 라이브러리 중 하나를 사용하거나 생성된 엔드포인트에 HTTP 요청을 보낼 수 있습니다. 
다음의 컬 명령은 실행 중인 서버에서 완료를 요청하기 위한 신속한 테스트를 보여주며, 서버와 통신하기 위해 더 완전한 기능을 갖춘 클라이언트 스크립트를 검토할 수 있습니다.

curl -X POST localhost:8000/v2/models/ensemble/generate -d \
'{
"text_input": "How do I count to nine in French?",
"parameters": {
"max_tokens": 100,
"bad_words":[""],
"stop_words":[""]
}
}'

결론

TensorRT-LLM은 NVIDIA GPU에서 거대 언어 모델을 최적화하고 효율적으로 실행하기 위한 도구를 제공합니다. Triton Inference Server는 Llama 3와 같은 거대 언어 모델을 효율적으로 배포하고 제공하는 데 이상적입니다. 

이 시작 가이드를 사용하여 Llama 3 및 기타 여러 거대 언어 모델을 사용할 수 있도록 오픈 소스 도구를 활용하는 여정을 시작하세요. 

TensorRT를 포함하는 엔드 투 엔드 AI 소프트웨어 플랫폼인 NVIDIA AI Enterprise에는 엔터프라이즈급 보안, 안정성, 관리 용이성 및 지원을 갖춘 주요 업무용 AI 추론을 위한 TensorRT-LLM이 곧 포함됩니다.

시작을 위한 리소스 

  • TensorRT-LLM 오픈 소스 라이브러리에 액세스합니다.
  • NVIDIA NeMo 오픈 소스 라이브러리에 대해 자세히 알아보세요. 
  • TensorRT 및 TensorRT-LLM용 개발자 가이드를 읽어보세요.
  • GitHub에서 샘플 코드, 벤치마크 및 문서 살펴보기 
  • 최적화된 추론을 위해 TensorRT-LLM을 활용하는 NVIDIA NIM에 대해 ai.nvidia.com에서 알아보세요.

관련 리소스

GTC 세션: NeMo, TensorRT-LLM 및 Triton 추론 서버의 가속화된 LLM 모델 정렬 및 배포
GTC 세션: 데스크톱 및 워크스테이션에서 추론 성능 최적화 및 새로운 LLM 기능 통합하기
GTC 세션: Triton 추론 서버로 거대 언어 모델 배포, 최적화 및 벤치마킹하기
SDK: TensorRT-ONNX 런타임
SDK: TensorRT – MXNet
웨비나: GPU 추론 파이프라인의 기술 개요

Discuss (0)

Tags