配置 NIM#

NVIDIA NIM for LLMs (NIM for LLMs) 在底层使用 Docker 容器。每个 NIM 都是其自身的 Docker 容器,并且有几种配置方法。以下是配置 NIM 容器的所有方法的完整参考。

GPU 选择#

在具有一个或多个相同 GPU 的同构环境中,将 --gpus all 传递给 docker run 是可以接受的。

注意

只有当您的配置具有与 支持的模型 中为模型指定的相同数量的 GPU 时,--gpus all 才有效。在 GPU 数量少于或多于配置数量的配置上运行推理可能会导致运行时错误。

在具有 GPU 组合的异构环境中(例如:A6000 + GeForce 显示 GPU),工作负载应仅在具有计算能力的 GPU 上运行。使用以下任一方法在容器内公开特定的 GPU

  • --gpus 标志(例如:--gpus='"device=1"'

  • 环境变量 NVIDIA_VISIBLE_DEVICES(例如:-e NVIDIA_VISIBLE_DEVICES=1

要用作输入的设备 ID 列在 nvidia-smi -L 的输出中

GPU 0: Tesla H100 (UUID: GPU-b404a1a1-d532-5b5c-20bc-b34e37f3ac46)
GPU 1: NVIDIA GeForce RTX 3080 (UUID: GPU-b404a1a1-d532-5b5c-20bc-b34e37f3ac46)

有关更多说明,请参阅 NVIDIA Container Toolkit 文档

我需要多少个 GPU?#

每个 配置文件 都将具有 TP(张量并行)和 PP(流水线并行),可以通过其可读名称来解读(示例:tensorrt_llm-trtllm_buildable-bf16-tp8-pp2)。

在大多数情况下,您将需要 TP * PP 个 GPU 来运行特定的配置文件。

例如,对于配置文件 tensorrt_llm-trtllm_buildable-bf16-tp8-pp2,您将需要 2 个节点,每个节点有 8 个 GPU,或者在一个节点上有 2 * 8 = 16 个 GPU。

共享内存标志#

当不使用 NVLink 进行多 GPU 设置时,需要将 --shm-size=16GB 传递给 docker run。在 SXM 系统上或使用仅使用 1 个 GPU 的配置文件时(例如 NIM_TENSOR_PARALLEL_SIZE=1),则不需要。

环境变量#

以下是可以传递到 NIM 中的 **必需** 和 **可选** 环境变量的参考(-e 添加到 docker run

ENV

必需?

默认值

注释

NGC_API_KEY

您必须将此变量设置为您的个人 NGC API 密钥的值。

NIM_CACHE_PATH

/opt/nim/.cache

容器缓存模型工件的位置(在容器中)。

NIM_DISABLE_LOG_REQUESTS

1

设置为 0 以查看请求日志。默认情况下,发送到 v1/completionsv1/chat/completions 的请求详细信息的日志被禁用。这些日志包含请求的敏感属性,包括 promptsampling_paramsprompt_token_ids。用户应注意,启用此参数后,这些属性将暴露于容器日志。

NIM_JSONL_LOGGING

0

设置为 1 以启用 JSON 格式的日志。默认情况下启用可读文本日志。

NIM_LOG_LEVEL

DEFAULT

NIM for LLMs 服务的日志级别。该变量的可能值为 DEFAULT、TRACE、DEBUG、INFO、WARNING、ERROR、CRITICAL。大多数情况下,DEBUG、INFO、WARNING、ERROR、CRITICAL 的效果在 Python 3 日志记录 文档 中进行了描述。TRACE 日志级别启用了在 TRT-LLM 和 uvicorn 中打印用于调试目的的诊断信息。当 NIM_LOG_LEVELDEFAULT 时,将所有日志级别设置为 INFO,但 TRT-LLM 日志级别除外,后者等于 ERROR。当 NIM_LOG_LEVELCRITICAL 时,TRT-LLM 日志级别为 ERROR

NIM_SERVER_PORT

8000

将 NIM 服务发布到容器内指定的端口。确保调整传递给 docker run-p/--publish 标志的端口以反映这一点(例如:-p $NIM_SERVER_PORT:$NIM_SERVER_PORT)。此 : 的左侧是您的主机地址:端口,并且不必与 $NIM_SERVER_PORT 匹配。此 : 的右侧是容器内的端口,该端口必须与 NIM_SERVER_PORT(或未设置时的 8000)匹配。

NIM_MODEL_PROFILE

通过指定位于 /opt/nim/etc/default/model_manifest.yaml 的清单中的配置文件 ID,覆盖自动选择的 NIM 优化配置文件。如果未指定,NIM 将尝试选择与可用 GPU 兼容的最佳配置文件。可以通过在 docker run 命令末尾附加 list-model-profiles 来获取兼容配置文件的列表。使用配置文件名称 default 将选择最大程度兼容的配置文件,但可能不是您硬件的最佳配置文件。

NIM_MANIFEST_ALLOW_UNSAFE

0

如果设置为 1,则启用选择未包含在原始 model_manifest.yaml 中的模型配置文件。如果设置,您还必须将 NIM_MODEL_NAME 设置为模型目录的 **路径** 或 NGC 路径。

NIM_MODEL_NAME

“模型名称”

仅当 NIM_MANIFEST_ALLOW_UNSAFE 设置为 1 时才必须设置。这必须是模型目录的路径或 NGC 路径,格式为 ngc://<org>/<team>/<model_name>:<version>。示例:ngc://nim/meta/llama3-8b-instruct:hf

NIM_PEFT_SOURCE

如果您想使用本地 PEFT 模块启用 PEFT 推理,则设置 NIM_PEFT_SOURCE 环境变量并将其传递到运行容器命令中。如果您的 PEFT 源是 LOCAL_PEFT_DIRECTORY 中的本地目录,请将您的本地 PEFT 目录挂载到由 NIM_PEFT_SOURCE 设置的容器的 PEFT 源。确保您的目录仅包含基础 NIM 的 PEFT 模块。还要确保 PEFT 目录及其中的所有内容都可被 NIM 读取。

NIM_MAX_LORA_RANK

32

设置最大 LoRA 秩。

NIM_MAX_GPU_LORAS

8

设置可以容纳在 GPU PEFT 缓存中的 LoRA 数量。这是单个批次中可以使用的最大 LoRA 数量。

NIM_MAX_CPU_LORAS

16

设置可以容纳在 CPU PEFT 缓存中的 LoRA 数量。这应设置为 >= 最大并发数或您正在服务的 LoRA 数量,以较小者为准。如果您的并发 LoRA 请求多于 NIM_MAX_CPU_LORAS,您可能会看到“缓存已满”错误。此值必须 >= NIM_MAX_GPU_LORAS。

NIM_PEFT_REFRESH_INTERVAL

检查 NIM_PEFT_SOURCE 以查找新模型的时间间隔(秒)。如果未设置,PEFT 缓存将不会刷新。如果您选择通过设置此 ENV 变量来启用 PEFT 刷新,我们建议将该数字设置为大于 30。

NIM_SERVED_MODEL_NAME

API 中使用的模型名称。如果提供了多个名称(以逗号分隔),服务器将响应任何提供的名称。响应的模型字段中的模型名称将是此列表中的第一个名称。如果未指定,模型名称将从位于 /opt/nim/etc/default/model_manifest.yaml 的清单中推断出来。请注意,此名称也将用于 Prometheus 指标的 model_name 标签内容中,如果提供了多个名称,则指标标签将采用第一个名称。

NIM_CUSTOM_MODEL_NAME

赋予本地构建引擎的模型名称。如果设置,本地构建的引擎将命名为 NIM_CUSTOM_MODEL_NAME,并以相同的名称缓存在 NIM 缓存中。此名称必须与其他缓存的自定义引擎不重复。此缓存的引擎也将通过 list-model-profiles 命令以相同的名称可见,并且行为将与其他每个配置文件类似。在后续的 docker 运行中,本地缓存的引擎将优先于每种其他类型的配置文件。您还可以将 NIM_MODEL_PROFILE 设置为特定的自定义模型名称,以强制 NIM LLM 服务于该缓存的引擎。

NIM_LOW_MEMORY_MODE

0

将此标志设置为 1 以启用将本地构建的 TRTLLM 引擎卸载到磁盘。这降低了运行时主机内存需求,但可能会增加启动时间和磁盘使用量。

NIM_ENABLE_OTEL

0

将此标志设置为 1 以在 NIM 中启用 OpenTelemetry instrumentation。

NIM_OTEL_TRACES_EXPORTER

console

指定用于跟踪的 OpenTelemetry 导出器。将此标志设置为 otlp 以使用 OpenTelemetry 协议导出跟踪。将其设置为 console 以将跟踪打印到标准输出。

NIM_OTEL_METRICS_EXPORTER

console

类似于 NIM_OTEL_TRACES_EXPORTER,但用于指标。

NIM_OTEL_EXPORTER_OTLP_ENDPOINT

OpenTelemetry Collector 正在侦听 OTLP 数据的端点。调整 URL 以匹配您的 OpenTelemetry Collector 的配置。

NIM_OTEL_SERVICE_NAME

设置您的服务名称,以帮助识别和分类数据。

NIM_TOKENIZER_MODE

auto

分词器模式。auto 将在可用时使用快速分词器。slow 将始终使用慢速分词器。

NIM_ENABLE_KV_CACHE_REUSE

0

设置为 1 以启用自动前缀缓存/ KV 缓存重用。适用于频繁出现大型提示的用例,并且跨请求的 KV 缓存缓存将加速推理。

NIM_RELAX_MEM_CONSTRAINTS

0

如果设置为 1 且未指定 NIM_NUM_KV_CACHE_SEQ_LENS,则 NIM_NUM_KV_CACHE_SEQ_LENS 将自动设置为 1。否则,如果设置为 1,将使用从 NIM_NUM_KV_CACHE_SEQ_LENS 提供的值。NIM LLM 的建议默认值是所有 GPU 都具有 >= 95% 的可用内存。将此变量设置为 true 将覆盖此默认值,并将运行模型,而无需考虑内存约束。它还将使用启发式方法来确定 GPU 是否可能满足或未满足内存要求,并在适用时提供警告。

NIM_NUM_KV_CACHE_SEQ_LENS

必须将 NIM_RELAX_MEM_CONSTRAINTS 设置为 1,此环境变量才会生效。设置为大于或等于 1 的值,以覆盖 NIM LLM 的默认 KV 缓存内存分配设置。提供的值将用于确定 KV 缓存中可以容纳的最大序列长度(例如 2 或 3.75)。最大序列长度是模型的上下文大小。

NIM_MAX_MODEL_LEN

模型上下文长度。如果未指定,将从模型配置自动派生。请注意,此设置仅对在 vLLM 后端上运行的模型以及所选配置文件的 trtllm-buildable 等于 true 的模型有效。在 trtllm-buildable 等于 true 的情况下,TRT-LLM 构建参数 max_seq_len 将设置为此值。

NIM_REPOSITORY_OVERRIDE

如果设置为非空字符串,则 NIM_REPOSITORY_OVERRIDE 值将替换存储库的硬编码位置以及访问存储库的协议。此环境变量的值的结构如下:<repository type>://<repository location>。请注意,仅支持协议 ngc://s3://https://,并且仅替换 URI 的第一个组件。例如
- 如果清单中的 URI 是 ngc://org/meta/llama3-8b-instruct:hf?file=config.jsonNIM_REPOSITORY_OVERRIDE=ngc://myrepo.ai/,则 API 端点的域名设置为 myrepo.ai
- 如果 NIM_REPOSITORY_OVERRIDE=s3://mybucket/,则替换结果将为 s3://mybucket/nim%2Fmeta%2Fllama3-8b-instruct%3Ahf%3Ffile%3Dconfig.json
- 如果 NIM_REPOSITORY_OVERRIDE=https://mymodel.ai/some_path_optional,则替换结果将为 https://mymodel.ai/some_path/nim%2Fmeta%2Fllama3-8b-instruct%3Ahf%3Ffile%3Dconfig.json

此存储库覆盖功能支持基本身份验证机制
- https 假定使用 Authorization 标头和 NIM_HTTPS_CREDENTIAL 中的凭据值进行授权。
- ngc 需要 NGC_API_KEY 环境变量中的凭据。
- s3 需要环境变量 AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY 和(如果使用临时凭据)AWS_SESSION_TOKEN

NIM_GUIDED_DECODING_BACKEND

"outlines"

要使用的引导解码后端。可以是 "fast_outlines"(自定义 NIM 加速版本的 outlines)、"outlines""lm-format-enforcer" 之一。

#

本地路径可以挂载到以下容器路径。

容器路径

必需?

注释

Docker 参数示例

/opt/nim/.cache(或 NIM_CACHE_PATH,如果存在)

否;但是,如果未挂载此卷,则容器每次启动时都会全新下载模型。

此目录是模型在容器内下载到的位置。您可以通过将 -u $(id -u) 选项添加到 docker run 命令,从容器内部访问此目录。例如,要使用 ~/.cache/nim 作为主机机器目录来缓存模型,请首先在运行 docker run ... 命令之前运行 mkdir -p ~/.cache/nim

-v ~/.cache/nim:/opt/nim/.cache -u $(id -u)