生成式人工智能/大语言模型

借助统一的 NVIDIA NIM 工作流简化 LLM 部署和 AI 推理

大语言模型 (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 会执行以下操作:

  1. 分析模型格式并检测您的模型是否为 Hugging Face 格式、TensorRT-LLM 检查点格式或 TensorRT-LLM 引擎格式。
  2. 通过检查模型配置以确定其架构 (例如 Llama 或 Mistral) 来识别架构。
  3. 检测量化格式并识别模型权重 (例如 FP16、FP8、INT4) 的精度。
  4. 根据信息选择最佳后端 (vLLM、SGLang 或 TensorRT-LLM)。
  5. 为您的指定模型应用优化设置,并启动inference服务器。

NIM 支持三种主要的 weight 格式:

  1. Hugging Face 检查点:带有 .safetensors 或 .gguf 文件的标准 Hugging Face 模型库。
  2. TensorRT-LLM 检查点:具有 trtllm_ckpt 目录的模型,包含配置文件和权重文件。
  3. 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部署。这消除了使用多个推理框架和容器的需求,简化了测试和部署不同模型的过程。

智能后端选择功能可确保为您的特定模型和硬件配置提供最佳性能,而一致的用户体验可让您轻松尝试不同的模型,而无需学习新的工具或流程。

标签