將大語言模型 (LLM) 集成到真實用戶與之大規模交互的生產環境中,是任何 AI 工作流中最重要的部分。這不僅僅是讓模型運行,而是讓它們變得快速、易于管理和足夠靈活,以支持不同的用例和生產需求。
隨著 LLM 數量的不斷增加,每個 LLM 都有自己的架構、量化格式和首選部署框架,管理推理后端很快就變得繁瑣。NVIDIA TensorRT-LLM、vLLM 和 SGLang 等推理后端提供針對特定需求定制的獨特功能,例如提高吞吐量、降低延遲或模型支持。雖然每個推理后端在其域中都表現出色,但決定與模型一起使用哪個后端或在不同的后端之間切換可能既復雜又耗時。
NVIDIA NIM 通過簡化模型加載、后端選擇、服務和優化的復雜性來簡化 LLM 部署,以便您專注于構建。它提供了一種通過單個容器部署各種模型的簡單、統一的方法,只需使用幾個簡單的命令即可將這些模型快速部署到任何地方。
在本文中,我們將展示如何使用 NIM 輕松部署 LLM:無論是托管在 Hugging Face 上,還是由 vLLM 或 SGLang 等領先的生態系統后端提供支持,還是作為 TensorRT-LLM 檢查點和引擎提供。您將學習如何使用簡單、一致的工作流程,以最少的設置在多個模型之間部署和切換。
了解 NIM 模型部署功能
NIM 提供單個 Docker 容器,可服務于各種 LLM。如以下示例所示,將模型輸入容器時,NIM 會執行以下操作:
- 分析模型格式并檢測您的模型是否為 Hugging Face 格式、TensorRT-LLM 檢查點格式或 TensorRT-LLM 引擎格式。
- 通過檢查模型配置以確定其架構 (例如 Llama 或 Mistral) 來識別架構。
- 檢測量化格式并識別模型權重 (例如 FP16、FP8、INT4) 的精度。
- 根據信息選擇最佳后端 (vLLM、SGLang 或 TensorRT-LLM)。
- 為您的指定模型應用優化設置,并啟動inference服務器。
NIM 支持三種主要的 weight 格式:
- Hugging Face 檢查點:帶有 .safetensors 或 .gguf 文件的標準 Hugging Face 模型庫。
- TensorRT-LLM 檢查點:具有 trtllm_ckpt 目錄的模型,包含配置文件和權重文件。
- TensorRT-LLM 引擎:trtllm_engine 目錄中的預構建 TensorRT-LLM 引擎。
NIM 使用一系列選擇標準來選擇最佳后端。對于全精度,可以使用 Hugging Face 模型、TensorRT-LLM、vLLM 或 SGLang,而量化 Hugging Face 模型通常在 vLLM 或 SGLang 中運行效果最佳。采用 FP8 量化的統一 Hugging Face 檢查點最好與 TensorRT-LLM 一起運行,而 TensorRT-LLM 檢查點或引擎自然會使用 TensorRT-LLM 后端。
此選擇會考慮模型架構與每個后端的兼容性、量化格式和性能特征,以提供最佳體驗。
使用 NIM 部署 LLM 的示例
讓我們通過幾個實際示例來展示這些 NIM 功能。在繼續操作之前,請確保您滿足以下前提條件。
預備知識
- 配備適當驅動程序 (NVIDIA CUDA 12.1+) 的 NVIDIA GPU。以下示例假設您擁有至少 80 GB 的 GPU 顯存。對于不適合單個 GPU 的模型,請按照說明啟用 tensor 并行,以避免遇到內存不足問題。
- Docker 已安裝并配置完畢。
- 擁有 NGC 帳戶和 API 密鑰
- 擁有 Hugging Face 帳戶和 API token (適用于需要身份驗證的模型)。
環境設置
為便于使用,我們將一些常用信息存儲在environment variables中。
# A variable for storing the NIM docker image specification
NIM_IMAGE=llm-nim
# Populate with your Hugging Face API token.
HF_TOKEN=<your_huggingface_token>
NIM 容器需要主機上的目錄來存儲下載的模型檢查點和中間結果。在容器內,此目錄位于 /opt/nim/.cache
。為了使模型下載在不同的運行中具有持久性,建議將此位置映射到主機上的目錄。我們將創建一個新目錄,然后在所有 NIM 啟動命令中映射該目錄。
有關 Unix 權限的說明:
確保為目錄正確設置了 Unix 權限。建議啟動 Docker 容器的同一 Unix 用戶擁有目錄;否則,您可能會遇到權限問題,部署命令可能會失敗。因此,顯示的所有 Docker 命令均使用主機的用戶 ID (通過向 docker run 命令提供標志 -u $(id -u)
) 啟動。這可確保 NIM 容器的用戶與主機的用戶相同。
mkdir $(pwd)/nim_cache
示例 1:從 Hugging Face 或本地文件系統部署基本模型
此示例展示了如何直接從 Hugging Face 部署功能強大的代碼生成模型 Codestral-22B。在使用此模型之前,您必須接受訪問協議。
# Deploying directly from Hugging Face
docker run --rm --gpus all \
--shm-size=16GB \
--network=host \
-u $(id -u) \
-v $(pwd)/nim_cache:/opt/nim/.cache \
-v $(pwd):$(pwd) \
-e HF_TOKEN=$HF_TOKEN \
-e NIM_TENSOR_PARALLEL_SIZE=1 \
-e NIM_MODEL_NAME="hf://mistralai/Codestral-22B-v0.1" \
$NIM_IMAGE
在本示例中,我們通過將環境變量 NIM_MODEL_NAME
設置為目標模型來指定目標模型。請注意在指定要部署的模型時使用 hf://
。這將指示 NIM 從 Hugging Face 自動下載模型。
如果您的模型已在本地下載,則只需將 # A variable for storing the NIM docker image specification
NIM_IMAGE=llm-nim
# Populate with your Hugging Face API token.
HF_TOKEN=<your_huggingface_token>
0 指向文件系統中目標模型所在的位置,如下所示。請注意,您需要使用 -v 在 Docker 中掛載機器中的目錄,并使這些路徑對 NIM 可見:
# Deploying a model that is available on the local file system
docker run --rm --gpus all \
--shm-size=16GB \
--network=host \
-u $(id -u) \
-v $(pwd)/nim_cache:/opt/nim/.cache \
-v $(pwd):$(pwd) \
-v /path/to/model/dir:/path/to/model/dir \
-e HF_TOKEN=$HF_TOKEN \
-e NIM_TENSOR_PARALLEL_SIZE=1 \
-e NIM_MODEL_NAME="/path/to/model/dir/mistralai-Codestral-22B-v0.1" \
$NIM_IMAGE
從本地文件系統下載或加載模型后,NIM 會將其識別為全精度 Mistral 模型,選擇最佳后端 (通常為 TensorRT-LLM 以實現最佳性能) ,并針對您的硬件優化配置服務器。
部署模型時,您可以隨時查看輸出日志,了解模型部署期間 NIM 做出的選擇。已部署的模型將在 http://localhost:8000
上提供,以供使用。您可以在 http://localhost:8000/docs
下查看可用的端點
底層引擎提供其他參數。您可以通過在容器中運行 nim-run --help
來檢查此類參數的完整列表,如下所示。
docker run --rm --gpus all \
--network=host \
-u $(id -u) \
$NIM_IMAGE nim-run --help
有關 Tensor 并行和多GPU部署的說明:
對于不適合單個 GPU 的模型,您可以使用張量并行在多個 GPU 上分配模型。為此,可以將環境變量 NIM_TENSOR_PARALLEL_SIZE
傳遞給 Docker 命令,并指定用于部署的 GPU 數量。在示例中,我們將張量并行指定為 1。
當指定張量并行度大于 1 時,您還應將標志 --shm-size=<shared memory size>
傳遞給 Docker 啟動命令,該命令為多 GPU 通信分配主機內存。不提供此標志通常會導致 NCCL 錯誤。
啟用 NVIDIA NVLink 的單 GPU 模型或 GPU 不需要此標志。確切的共享顯存大小需求取決于所部署的模型。如果遇到錯誤,請嘗試增加此值。
示例 2:在部署給定模型時指定后端
NIM 會自動選擇合適的后端用于部署給定模型。如果您想覆蓋默認行為,還可以指示 NIM 使用特定 后端進行部署。
部署前,請檢查哪些后端與您的模型兼容。list-model-profiles
入口點將顯示所有經過篩選的可用部署配置文件,以便與您指定的模型和硬件兼容。以下命令展示了如何使用此 CLI 檢查 Hugging Face 上給定模型 (本例中為 meta-llama/Llama-3.1-8B-Instruct) 的可用部署配置文件。
docker run --rm --gpus all \
--shm-size=16GB \
--network=host \
-u $(id -u) \
-v $(pwd)/nim_cache:/opt/nim/.cache \
-v $(pwd):$(pwd) \
-e HF_TOKEN=$HF_TOKEN \
$NIM_IMAGE list-model-profiles --model "hf://meta-llama/Llama-3.1-8B-Instruct"
以上命令的輸出示例如下:
MODEL PROFILES
- Compatible with system and runnable:
- 668b575f1701fa70a97cfeeae998b5d70b048a9b917682291bb82b67f308f80c (tensorrt_llm)
- e2f00b2cbfb168f907c8d6d4d40406f7261111fbab8b3417a485dcd19d10cc98 (vllm)
- 50e138f94d85b97117e484660d13b6b54234e60c20584b1de6ed55d109ca4f21 (sglang)
- With LoRA support:
- cdcd22d151713c8b91fcd279a4b5e021153e72ff5cf6ad5498aac96974f5b7d7 (tensorrt_llm-lora)
- 93c5e281d6616f45e2ef801abf4ed82fc65e38ec5f46e0664f340bad4f92d551 (vllm-lora)
- 0d08589f2f7cd931cf3a03357d3aa901c132ac97c11073c607c20ae105c87c64 (sglang-lora)
- Compilable to TRT-LLM using just-in-time compilation of HF models to TRTLLM engines: <None>
此輸出表明,所有推理后端 (TensorRT-LLM、vLLM 和 SGLang) 均可用于此特定模型,包括支持 LoRA 適配器的模型。要使用特定后端部署此模型,您需要將環境變量 NIM_MODEL_PROFILE
傳遞給 Docker 命令,并將其設置為上面列出的其中一個配置文件。在以下示例中,我們將使用 vLLM 后端部署 LLaMa 模型:
# Using the vLLM backend to deploy a LLaMa model
docker run --rm --gpus all \
--shm-size=16GB \
--network=host \
-u $(id -u) \
-v $(pwd)/nim_cache:/opt/nim/.cache \
-v $(pwd):$(pwd) \
-e HF_TOKEN=$HF_TOKEN \
-e NIM_TENSOR_PARALLEL_SIZE=1 \
-e NIM_MODEL_NAME="hf://meta-llama/Llama-3.1-8B-Instruct" \
-e NIM_MODEL_PROFILE="e2f00b2cbfb168f907c8d6d4d40406f7261111fbab8b3417a485dcd19d10cc98" \
$NIM_IMAGE
現在,我們來看一個給定模型僅支持一個后端的示例。在撰寫本文時,只能通過 SGLang 后端獲得對 lmms-lab/llama3-llava-next-8b 的支持。運行以下命令以檢查此模型支持的配置文件:
docker run --rm --gpus all \
--shm-size=16GB \
--network=host \
-u $(id -u) \
-v $(pwd)/nim_cache:/opt/nim/.cache \
-v $(pwd):$(pwd) \
-e HF_TOKEN=$HF_TOKEN \
$NIM_IMAGE list-model-profiles --model "hf://lmms-lab/llama3-llava-next-8b"
該命令將輸出以下內容,這表示此模型將通過 SGLang 后端部署:
MODEL PROFILES
- Compatible with system and runnable:
- 50e138f94d85b97117e484660d13b6b54234e60c20584b1de6ed55d109ca4f21 (sglang)
- With LoRA support:
- 0d08589f2f7cd931cf3a03357d3aa901c132ac97c11073c607c20ae105c87c64 (sglang-lora)
- Compilable to TRT-LLM using just-in-time compilation of HF models to TRTLLM engines: <None>
示例 3:部署 Quantized 模型
NIM 支持以各種量化格式部署模型。這些模型可以使用上述相同的命令輕松部署,無需修改。以下示例展示了如何加載采用 GGUF 量化的模型和采用 AWQ 量化的另一個模型:
# Choose a quantized model and populate the MODEL variable, for example:
# MODEL="hf://modularai/Llama-3.1-8B-Instruct-GGUF"
# or
# MODEL="hf://Qwen/Qwen2.5-14B-Instruct-AWQ"
docker run --rm --gpus all \
--shm-size=16GB \
--network=host \
-u $(id -u) \
-v $(pwd)/nim_cache:/opt/nim/.cache \
-v $(pwd):$(pwd) \
-e HF_TOKEN=$HF_TOKEN \
-e NIM_TENSOR_PARALLEL_SIZE=1 \
-e NIM_MODEL_NAME=$MODEL \
$NIM_IMAGE
在本示例中,NIM 會自動檢測量化格式,并選擇支持此量化方法的適當后端。
自定義部署
雖然 NIM 的自動選擇適用于大多數情況,但您可以使用 -e
switch 將特定環境變量傳遞給 NIM Docker 命令,從而自定義部署的各個方面。例如,您可以使用 NIM_MODEL_PROFILE
指定 backend,使用 NIM_TENSOR_PARALLEL_SIZE
控制 tensor parallelism,或使用 NIM_MAX_MODEL_LEN
設置 context length。
有關 NIM 配置選項的完整列表,請查看文檔。高級用戶還可以使用帶有適當標志的 nim-run
命令將其他參數傳遞給底層推理引擎。您可以通過在容器中運行 nim-run --help
來查看這些標志的完整列表。
有關更多詳細信息,請參閱支持的模型架構。
開始部署 LLM
NIM 提供了一個容器,可以通過自動優化運行各種LLM模型,從而簡化LLM部署。這消除了使用多個推理框架和容器的需求,簡化了測試和部署不同模型的過程。
智能后端選擇功能可確保為您的特定模型和硬件配置提供最佳性能,而一致的用戶體驗可讓您輕松嘗試不同的模型,而無需學習新的工具或流程。