我們很高興地宣布支持 Meta Llama 3 系列模型,通過 NVIDIA TensorRT LLM?加速和優化 LLM 推理性能。您現在可以立即嘗試?Llama 3 8B?和?Llama 3 70B,該系列中的第一個模型,通過瀏覽器用戶界面進行體驗。另外,您也可以通過?NVIDIA API 產品目錄?中的 API 端點訪問 Llama 3,后者被包裝為?NVIDIA NIM,提供了標準 API,能夠部署在任何地方。
大型語言模型需要大量的計算資源。它們的大小使其運行成本高昂且速度緩慢,尤其是在沒有正確技術的情況下。許多優化技術都可用,例如內核融合和量化到運行時優化(如 C++ 實現、KV 緩存、連續運行中批處理和分頁注意力)。 開發人員必須決定哪種組合有助于他們的用例。 TensorRT-LLM 簡化了這項工作。
TensorRT-LLM 是一個開源庫,用于加速 NVIDIA GPU 上最新的 LLM 推理性能。NeMo 是用于構建、自定義和部署生成式 AI 應用的端到端框架,并使用 TensorRT-LLM 和 NVIDIA Triton 推理服務器 來進行生成式 AI 部署。
TensorRT-LLM 使用 NVIDIA TensorRT 深度學習編譯器。它包含最新的優化的內核,用于先進的 FlashAttention 實現,以及用于 LLM 模型執行的遮罩多頭注意力 (MHA)。它還包含預處理和后處理步驟以及簡單的開源 Python API 中的多 GPU/多節點通信基元,可在 GPU 上實現突破性的 LLM 推理性能。
要了解該庫及其使用方法,我們來看看一個示例,了解如何使用和部署 Llama 3 8B 以及 TensorRT-LLM 和 Triton 推理服務器。
有關更深入的模型和執行細節,請參閱 TensorRT-LLM 示例。
開始安裝
首先,我們提供了特定于操作系統的安裝步驟,以克隆和構建 TensorRT-LLM 庫。您可以按照 此處說明 使用 pip 命令進行更簡單的安裝。此外,您也可以使用 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 模型的指令調整變體的權重(和分詞器文件)。 您還可以使用以下命令下載要離線使用的權重,并更新后面命令中的路徑以指向此目錄:
git lfs install
git clone https://huggingface.co/meta-llama/Meta-Llama-3-8B-Instruct
請注意,使用此模型需要遵守 特定 許可。同意條款并 使用 HuggingFace 進行身份驗證 下載必要的文件。
運行 TensorRT-LLM 容器
我們將啟動基礎 Docker 容器,并安裝 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 引擎,其中包含模型權重和使用 TensorRT-LLM Python API 編寫的模型定義。
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 涉及將許多運算交織在一起且無法自動發現的操作。對于這些操作,我們可以將部分圖形顯式替換為 插件。在我們的示例中,我們包含 gpt_attention 插件 (可實現類似 FlashAttention 的融合注意力核函數) 和 gemm 插件 (可通過 FP32 累加執行矩陣乘法運算)。我們還將完整模型的所需精度調用為 FP16,以匹配從 HuggingFace 下載的權重的默認精度。
完成運行構建腳本后,我們有望在/tmp/llama/8B/trt_engines/bf16/1-gpu 文件夾中看到以下三個文件:
rank0.engine
是構建腳本的主要輸出,其中包含嵌入模型權重的可執行操作圖。- `config.json` 文件包含模型的詳細信息,例如其結構和精度,以及引擎中集成的插件列表。
運行模型
既然我們已經有了模型引擎,我們可以用它做什么?
引擎文件包含執行模型所需的信息。TensorRT-LLM 包含高度優化的 C++運行時,用于執行引擎文件和管理流程,例如從模型輸出中采樣令牌、管理 KV 緩存以及同時處理批處理請求。
我們可以直接使用運行時環境在本地執行模型,也可以在生產環境中使用 Triton 推理服務器進行部署,以便與多個用戶共享模型。
要在本地運行模型,我們可以執行以下命令:
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 推理服務器進行部署
除了本地執行,我們還可以使用 Triton 推理服務器 以創建 LLM 的生產就緒型部署。適用于 TensorRT-LLM 的 Triton 推理服務器后端 使用 TensorRT-LLM C++運行時實現高性能推理執行。它包括 動態批處理 和 分頁 KV 緩存,可提供低延遲和高吞吐量。TensorRT-LLM 后端已與 Triton 推理服務器捆綁在一起,并可作為預構建容器使用 在 NGC 上運行。
首先,我們必須創建模型庫,以便 Triton 推理服務器能夠讀取模型和任何相關元數據。
tensorrtllm_backend 存儲庫包含所需的模型庫,位于 `all_models/inflight_batcher_llm/` 中。
該目錄包含四個子文件夾,分別包含模型執行過程的不同部分的構件。Triton 推理服務器 Python 后端 中的 `preprocessing/` 和 `postprocessing/` 文件夾包含用于對文本輸入進行標記化和去標記化的腳本,以在字符串和模型所運行的令牌 ID 之間進行轉換。
我們的 `tensorrt_llm` 文件夾包含之前編譯的模型引擎。最后,我們的 `ensemble` 文件夾定義了 模型集成,該技術將之前的三個組件連接在一起,并指示 Triton 推理服務器如何通過這些組件流數據。
向下拉取示例模型庫,并將您在上一步中編譯的模型復制到其中。
# 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/
接下來,我們必須使用編譯模型引擎的位置修改資源庫骨架中的配置文件。我們還必須更新配置參數 (例如 tokenizer),以便在批處理推理請求時使用和處理 KV 緩存的內存分配。
#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
現在,我們可以啟動 Docker 容器并啟動 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 推理服務器客戶端庫 或將 HTTP 請求發送到 生成的端點。以下 curl 命令演示了正在運行的服務器請求完成等操作的快速測試:功能齊全的客戶端腳本 可以進行審查,以便與服務器進行通信。
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 推理服務器是部署和高效服務 Llama 3 等大型語言模型的理想選擇。
使用此入門指南,并利用開源工具開始您的使用之旅,以使用 Llama 3 和許多其他大型語言模型。
NVIDIA AI Enterprise 包含 TensorRT 的端到端 AI 軟件平臺 TensorRT,即將包含 TensorRT-LLM,以提供具有企業級安全性、穩定性、可管理性和支持的任務關鍵型 AI 推理。
入門資源
- 訪問 TensorRT-LLM 開源庫。
- 詳細了解 NVIDIA NeMo 開源庫的 功能和特性。
- 閱讀 TensorRT 和 TensorRT-LLM 開發者指南。
- 在 GitHub 上探索我們的示例代碼、基準測試和文檔
- NVIDIA NIM 利用 TensorRT-LLM 優化推理,以在 ai.nvidia.com 上提供高效的模型推理。