用于推理的 TRT LLM

在 Spark 设备上部署 LM Studio 并提供大语言模型服务;使用 LM Link 远程访问模型。

基本理念

NVIDIA TensorRT-LLM (TRT-LLM) 是一个开源库,用于优化和加速 NVIDIA GPU 上的大语言模型 (LLM) 推理。

它提供高效的内核、内存管理和并行策略 (如张量、工作流和序列并行) ,因此开发者可以提供延迟更低、吞吐量更高的 LLM。

TRT-LLM 与 Hugging Face 和 PyTorch 等框架集成,使大规模部署先进模型变得更加容易。

您将完成的任务

您需要设置 TensorRT-LLM,以便在 DGX Spark 上优化和部署大语言模型,与标准 PyTorch 相比,实现更高的吞吐量和更低的延迟 通过内核级优化、高效内存布局和高级量化进行推理。

开始之前需要了解的内容

  • Python 熟练掌握 PyTorch 或类似 ML 框架并具备相关经验

  • 用于运行 CLI 工具和 Docker 容器的命令行便捷性

  • 基本了解 GPU 概念,包括显存、批处理和量化 (FP16/ INT8)

  • 熟悉 NVIDIA 软件堆栈 (CUDA 工具包、驱动)

  • 具备推理服务器和容器化环境方面的经验

预备知识

  • DGX Spark 设备

  • 与 CUDA 12.x 兼容的 NVIDIA 驱动程序: nvidia-smi

  • 足够的 GPU VRAM (对于 700 亿个模型,推荐 40GB 以上)

  • 通过互联网连接下载模型和容器镜像

  • 通过互联网连接下载模型和容器镜像

辅助文件

可以找到所有必需素材 GitHub

模型支持矩阵

Spark 上的 TensorRT-LLM 支持以下模型。列出的所有型号均可立即使用:

Model
Quantization
Support Status
ModelScope Handle
Qwen3.5-35B-A3B
BF16
Qwen/Qwen3.5-35B-A3B
Qwen3.5-35B-A3B
FP8
Qwen/Qwen3.5-35B-A3B-FP8
Qwen3.5-122B-A10B
NVFP4
unsloth/Qwen3.5-122B-A10B-NVFP4
GLM-4.7-Flash
BF16
ZhipuAI/GLM-4.7-Flash
GLM-4.5-Air
FP8
ZhipuAI/GLM-4.5-Air-FP8
Qwen3.5-9B
BF16
Qwen/Qwen3.5-9B
GLM-4.6V-Flash
BF16

ZhipuAI/GLM-4.6V-Flash
Qwen3.6-35B-A3B
NVFP4
nv-community/Qwen3.6-35B-A3B-NVFP4
Qwen3-8B
FP8
nv-community/Qwen3-8B-FP8
Qwen3-8B
NVFP4
nv-community/Qwen3-8B-FP4
Qwen3-14B
FP8
nv-community/Qwen3-14B-FP8
Qwen3-14B
NVFP4
nv-community/Qwen3-14B-FP4
Qwen3-32B
NVFP4
nv-community/Qwen3-32B-FP4
Qwen3-30B-A3B
NVFP4
nv-community/Qwen3-30B-A3B-FP4
Qwen3-235B-A22B (two Sparks only)
NVFP4
nv-community/Qwen3-235B-A22B-FP4

注意

您可以使用 NVFP4 量化文档为您喜爱的模型生成自己的 NVFP4 量化检查点。这使您能够充分利用 NVFP4 量化的性能和内存优势,即使对于尚未由 NVIDIA 发布的模型也是如此。

提醒:并非所有模型架构都支持 NVFP4 量化。

时间和风险

  • 时长:45-60 分钟,用于设置和 API 服务器部署

  • 风险等级:中等 – 容器提取和模型下载可能会因网络问题而失败

  • 回滚:停止推理服务器并移除下载的模型以释放资源。

  • 上次更新时间:2026 年 4 月 28 日

第 1 步:配置 Docker 权限

要在不使用 sudo 的情况下轻松管理容器,您必须位于 docker 组。如果您选择跳过此步骤,则需要使用 sudo 运行 Docker 命令。

打开新终端并测试 Docker 访问。在终端中,运行:

docker ps

如果您看到 permission denied 错误 (例如尝试连接到 Docker 守护程序套接字时 permission denied) ,请将您的用户添加到 docker 组,这样您就不需要使用 sudo 运行命令。

sudo usermod -aG docker $USER
newgrp docker

第 2 步:验证环境前提条件

确认您的 Spark 设备具有必要的 GPU 访问权限和网络连接以进行下载 模型和容器。

# Check GPU visibility and driver
nvidia-smi

# Verify Docker GPU support
docker run --rm --gpus all nvcr.io/nvidia/tensorrt-llm/release:1.3.0rc24 nvidia-smi

第 3 步:设置环境变量

export DOCKER_IMAGE="nvcr.io/nvidia/tensorrt-llm/release:1.3.0rc24"

第 4 步:验证 TensorRT-LLM 安装

确认 GPU 访问后,验证是否可以在容器内导入 TensorRT-LLM。

docker run --rm -it --gpus all \
  $DOCKER_IMAGE \
  python -c "import tensorrt_llm; print(f'TensorRT-LLM version: {tensorrt_llm.__version__}')"

预期输出:

[TensorRT-LLM] TensorRT-LLM version: 1.3.0rc24
TensorRT-LLM version: 1.3.0rc24

第 5 步:创建缓存目录

设置本地缓存,以避免在后续运行中重新下载模型。

python3 -m venv "$HOME/.venvs/modelscope-hub"
source "$HOME/.venvs/modelscope-hub/bin/activate"
python3 -m pip install --upgrade modelscope
# Create Modelscope cache directory
mkdir -p $HOME/.cache/modelscope/

第 6 步:使用 quickstart_advanced 验证设置

此快速入门通过测试模型加载、推理引擎初始化和使用真实文本生成的 GPU 执行,端到端验证您的 TensorRT-LLM 设置。在启动推理 API 服务器之前,这是确认一切正常的最快方式。

LLM 快速入门示例

Qwen3.5-9B 说明

export MODEL_SCOPE_CACHE="$HOME/.cache/modelscope"
export MODEL_HANDLE="Qwen/Qwen3.5-9B"
modelscope download --model "$MODEL_HANDLE" --local_dir "$MODEL_SCOPE_CACHE/$MODEL_HANDLE"

export LOCAL_MODEL="/root/.cache/modelscope/$MODEL_HANDLE"

docker run \
  -e LOCAL_MODEL="$LOCAL_MODEL" \
  -v "$MODEL_SCOPE_CACHE:/root/.cache/modelscope:ro" \
  --rm -it --ulimit memlock=-1 --ulimit stack=67108864 \
  --gpus=all --ipc=host --network host \
  "$DOCKER_IMAGE" \
  bash -c '
    python examples/llm-api/quickstart_advanced.py \
      --model_dir "$LOCAL_MODEL" \
      --prompt "Paris is great because" \
      --max_tokens 64
    '

Qwen3.6-35B-A3B-NVFP4

export MODEL_SCOPE_CACHE="$HOME/.cache/modelscope"
export MODEL_HANDLE="nv-community/Qwen3.6-35B-A3B-NVFP4"

modelscope download \
  --model "$MODEL_HANDLE" \
  --local_dir "$MODEL_SCOPE_CACHE/$MODEL_HANDLE"

export LOCAL_MODEL="/root/.cache/modelscope/$MODEL_HANDLE"

docker run \
  -e LOCAL_MODEL="$LOCAL_MODEL" \
  -v "$MODEL_SCOPE_CACHE:/root/.cache/modelscope:ro" \
  --rm -it --ulimit memlock=-1 --ulimit stack=67108864 \
  --gpus=all --ipc=host --network host \
  "$DOCKER_IMAGE" \
  bash -c '
    python examples/llm-api/quickstart_advanced.py \
      --model_dir "$LOCAL_MODEL" \
      --prompt "Paris is great because" \
      --max_tokens 64 \
      --max_seq_len 4096 \
      --max_batch_size 1 \
      --max_num_tokens 512 \
      --kv_cache_fraction 0.20
  '

Qwen3.5-122B-A10B-NVFP4

export MODEL_SCOPE_CACHE="$HOME/.cache/modelscope"
export MODEL_HANDLE="nv-community/Qwen3.5-122B-A10B-NVFP4"
modelscope download --model "$MODEL_HANDLE" --local_dir "$MODEL_SCOPE_CACHE/$MODEL_HANDLE"

export LOCAL_MODEL="/root/.cache/modelscope/$MODEL_HANDLE"

docker run \
  -e LOCAL_MODEL="$LOCAL_MODEL" \
  -v "$MODEL_SCOPE_CACHE:/root/.cache/modelscope:ro" \
  --rm -it --ulimit memlock=-1 --ulimit stack=67108864 \
  --gpus=all --ipc=host --network host \
  "$DOCKER_IMAGE" \
  bash -c '
    python examples/llm-api/quickstart_advanced.py \
      --model_dir "$LOCAL_MODEL" \
      --prompt "Paris is great because" \
      --max_tokens 64 \
      --max_seq_len 4096 \
      --max_batch_size 1 \
      --max_num_tokens 512 \
      --kv_cache_fraction 0.20
    '

第 7 步:使用 quickstart_multimodal 验证设置

VLM 快速入门示例

这通过运行带有图像理解的推理来展示视觉语言模型的功能。该示例使用多模态输入来验证文本和视觉处理工作流。

Qwen3.5-9B 多模态指令

此模型可以直接使用完整检查点运行图像理解,不需要额外加载 LoRA 权重。

export MODEL_SCOPE_CACHE="$HOME/.cache/modelscope"
export MODEL_HANDLE="Qwen/Qwen3.5-9B"

modelscope download \
  --model "$MODEL_HANDLE" \
  --local_dir "$MODEL_SCOPE_CACHE/$MODEL_HANDLE"

export LOCAL_MODEL="/root/.cache/modelscope/$MODEL_HANDLE"

docker run \
  -e LOCAL_MODEL="$LOCAL_MODEL" \
  -v "$MODEL_SCOPE_CACHE:/root/.cache/modelscope:ro" \
  --rm -it --ulimit memlock=-1 --ulimit stack=67108864 \
  --gpus=all --ipc=host --network host \
  "$DOCKER_IMAGE" \
  bash -c '
    python3 examples/llm-api/quickstart_multimodal.py \
      --model_dir "$LOCAL_MODEL" \
      --modality image \
      --media "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg" \
      --prompt "What is happening in this image?" \
      --max_batch_size 1 \
      --max_seq_len 4096 \
      --max_num_tokens 4096 \
      --disable_kv_cache_reuse
  '

注意

如果您在下载或首次运行时遇到主机 OOM,请释放主机 (容器外部) 上的操作系统页面缓存,然后重试:

sudo sh -c 'sync; echo 3 > /proc/sys/vm/drop_caches'

第 8 步:使用兼容 OpenAI 的 API 提供 LLM

通过 trtllm-serve 使用兼容 OpenAI 的 API 提供服务:

Qwen3.6-35B-A3B-NVFP4

此示例中 `qwen3.yaml` 用于 KV 缓存、MoE 和 CUDA 计算图设置,然后启动 `trtllm-serve` 在端口 8355 上使用 Qwen3.6 推理解析器。

export MODEL_SCOPE_CACHE="$HOME/.cache/modelscope"
export MODEL_HANDLE="nv-community/Qwen3.6-35B-A3B-NVFP4"
modelscope download --model "$MODEL_HANDLE" --local_dir "$MODEL_SCOPE_CACHE/$MODEL_HANDLE"

export LOCAL_MODEL="/root/.cache/modelscope/$MODEL_HANDLE"

docker run --name trtllm_llm_server --rm -it --gpus all --ipc host --network host \
  -e MODEL_HANDLE="$MODEL_HANDLE" \
  -e LOCAL_MODEL="$LOCAL_MODEL" \
  -v "$MODEL_SCOPE_CACHE:/root/.cache/modelscope:ro" \
  "$DOCKER_IMAGE" \
  bash -c '
    cat > qwen3.yaml <<EOF
kv_cache_config:
  enable_block_reuse: false
  free_gpu_memory_fraction: 0.80
moe_config:
  backend: CUTLASS
cuda_graph_config:
  enable_padding: true
  max_batch_size: 1
max_batch_size: 1
EOF
    PYTORCH_ALLOC_CONF=expandable_segments:True \
    trtllm-serve serve "$LOCAL_MODEL" \
      --host 0.0.0.0 \
      --port 8355 \
      --trust_remote_code \
      --served_model_name "$MODEL_HANDLE" \
      --reasoning_parser qwen3 \
      --tool_parser qwen3 \
      --extra_llm_api_options qwen3.yaml
  '

Qwen3.5-9B 说明

export MODEL_SCOPE_CACHE="$HOME/.cache/modelscope"
export MODEL_HANDLE="Qwen/Qwen3.5-9B"
modelscope download --model "$MODEL_HANDLE" --local_dir "$MODEL_SCOPE_CACHE/$MODEL_HANDLE"

export LOCAL_MODEL="/root/.cache/modelscope/$MODEL_HANDLE"

docker run --name trtllm_llm_server --rm -it --gpus all --ipc host --network host \
  -e MODEL_HANDLE="$MODEL_HANDLE" \
  -e LOCAL_MODEL="$LOCAL_MODEL" \
  -v "$MODEL_SCOPE_CACHE:/root/.cache/modelscope:ro" \
  "$DOCKER_IMAGE" \
  bash -c '
    cat > /tmp/extra-llm-api-config.yml <<EOF
print_iter_log: false
kv_cache_config:
  dtype: "auto"
  free_gpu_memory_fraction: 0.9
cuda_graph_config:
  enable_padding: true
disable_overlap_scheduler: true
EOF
    trtllm-serve serve "$LOCAL_MODEL" \
      --max_batch_size 64 \
      --trust_remote_code \
      --port 8355 \
      --served_model_name "$MODEL_HANDLE" \
      --extra_llm_api_options /tmp/extra-llm-api-config.yml
  '

GLM-4.7-Flash

export MODEL_SCOPE_CACHE="$HOME/.cache/modelscope"
export MODEL_HANDLE="ZhipuAI/GLM-4.7-Flash"

modelscope download \
  --model "$MODEL_HANDLE" \
  --local_dir "$MODEL_SCOPE_CACHE/$MODEL_HANDLE"

export LOCAL_MODEL="/root/.cache/modelscope/$MODEL_HANDLE"


docker run --name trtllm_llm_server --rm -it \
  --gpus all --ipc=host --network host \
  -e MODEL_HANDLE="$MODEL_HANDLE" \
  -e LOCAL_MODEL="$LOCAL_MODEL" \
  -v "$MODEL_SCOPE_CACHE:/root/.cache/modelscope:ro" \
  "$DOCKER_IMAGE" \
  bash -c '
    cat > /tmp/glm47-autodeploy.yml <<EOF
runtime: trtllm
skip_loading_weights: false
world_size: 1

cuda_graph_config:
  max_batch_size: 1
  batch_sizes: [1]
  enable_padding: true

transforms:
  resize_kv_cache:
    free_mem_ratio: 0.20
  compile_model:
    backend: torch-opt
    cuda_graph_batch_sizes: [1]
EOF

    PYTORCH_ALLOC_CONF=expandable_segments:True \
    trtllm-serve serve "$LOCAL_MODEL" \
      --backend _autodeploy \
      --host 0.0.0.0 \
      --port 8355 \
      --max_batch_size 1 \
      --max_seq_len 4096 \
      --max_num_tokens 4096 \
      --trust_remote_code \
      --served_model_name "$MODEL_HANDLE" \
      --extra_llm_api_options /tmp/glm47-autodeploy.yml
  '

最少的 OpenAI 式聊天请求。从单独的终端运行此命令。

curl -s http://localhost:8355/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "'"$MODEL_HANDLE"'",
    "messages": [{"role": "user", "content": "Paris is great because"}],
    "max_tokens": 64
  }'

第 9 步:清理和回滚

删除已下载的模型和容器,以便在测试完成时释放空间。

Qwen3.5-9B 多模态指令

此模型可以直接使用完整检查点运行图像理解,不需要额外加载 LoRA 权重。

export MODEL_SCOPE_CACHE="$HOME/.cache/modelscope"
export MODEL_HANDLE="Qwen/Qwen3.5-9B"

modelscope download \
  --model "$MODEL_HANDLE" \
  --local_dir "$MODEL_SCOPE_CACHE/$MODEL_HANDLE"

export LOCAL_MODEL="/root/.cache/modelscope/$MODEL_HANDLE"

docker run \
  -e LOCAL_MODEL="$LOCAL_MODEL" \
  -v "$MODEL_SCOPE_CACHE:/root/.cache/modelscope:ro" \
  --rm -it --ulimit memlock=-1 --ulimit stack=67108864 \
  --gpus=all --ipc=host --network host \
  "$DOCKER_IMAGE" \
  bash -c '
    python3 examples/llm-api/quickstart_multimodal.py \
      --model_dir "$LOCAL_MODEL" \
      --modality image \
      --media "https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg" \
      --prompt "What is happening in this image?" \
      --max_batch_size 1 \
      --max_seq_len 4096 \
      --max_num_tokens 4096 \
      --disable_kv_cache_reuse
  '

警告

这将删除所有缓存模型,并且可能需要重新下载以备将来运行。

```
# Remove ModelScope cache
sudo chown -R "$USER:$USER" "$HOME/.cache/modelscope"
rm -rf $HOME/.cache/modelscope/

# Clean up Docker images
docker image prune -f
docker rmi $DOCKER_IMAGE
```

在单个 Spark 上运行时遇到的常见问题

症状
原因
修复
无法访问 URL 的门控存储库
某些 ModelScope 模型的访问受限
在对应的 ModelScope 模型页面确认访问权限;需要登录时,在实际执行下载的环境中运行 `modelscope login --token "你的 ModelScope 访问令牌"`。令牌可在此处获取。
加载权重时的 OOM (例如,Nemotron Super 49B)
并行权重 - 负载内存压力
export TRT_LLM_DISABLE_LOAD_WEIGHTS_IN_PARALLEL=1
“CUDA out of memory”
GPU 显存不足
减少 free_gpu_memory_fraction: 0.9 或批量大小,或使用较小的模型
“Model not found”报错
ModelScope 仓库 ID 或版本不正确、模型不可访问,或本地模型目录/挂载路径不正确
核对 ModelScope 模型页面中的仓库 ID 和版本;本地加载时,确认模型已完整下载,`LOCAL_MODEL` 指向容器内实际存在的目录,并检查 `config.json`、权重文件和 Docker 挂载。
容器提取超时
网络连接问题
重试提取或使用本地镜像
导入 tensorrt_llm 失败
容器运行时问题
重启 Docker 守护程序,然后重试

在两个 Spark 上运行的常见问题

症状
原因
修复
MPI 主机名测试返回单个主机名
网络连接问题
验证两个节点均位于可访问的 IP 地址上
无法访问 URL 的门控存储库
某些 ModelScope模型的访问受限
在对应的 ModelScope 模型页面确认访问权限;需要登录时,在实际执行下载的环境中运行 `modelscope login --token "你的ModelScope访问令牌"`。令牌可在此处获取。
“CUDA out of memory”错误
GPU 显存不足
减少--max_batch_size 或 --max_num_tokens
容器立即退出
缺少入口点脚本
确保 trtllm-mn-entrypoint.sh 下载成功并具有可执行权限,还需确保您未在节点上运行容器。如果已使用端口 2233,入口点脚本将不会启动。
守护程序的错误响应:验证根 CA 证书时出现错误
系统时钟不同步或证书过期
更新系统时间以与 NTP 服务器同步 sudo timedatectl set-ntp true
“invalid mount config for type 'bind'”
缺少或无法执行入口点脚本
运行 docker inspect 查看完整的错误消息。验证 trtllm-mn-entrypoint.sh 存在于您主目录中的两个节点上 (ls -la $HOME/trtllm-mn-entrypoint.sh) 并具有可执行权限 (chmod +x $HOME/trtllm-mn-entrypoint.sh)
“task: non-zero exit (255)”
带错误代码 255 的容器退出
使用检查容器日志 docker ps -a --filter "name=trtllm-multinode_trtllm" 获取容器 ID,然后 docker logs 查看详细的错误消息
Docker 状态卡在“Pending”(待处理),并显示“no suitable node (insufficien...)”
未正确配置 Docker 守护程序以进行 GPU 访问
验证步骤 2-4 是否已成功完成 /etc/docker/daemon.json 包含正确的 GPU 配置
服务模型失败 ptxas fatal 错误
模型需要运行时 Triton 内核编译
在“Step 10”(步骤 10) 中,添加 -x TRITON_PTXAS_PATH 您的 mpirun 命令

注意

DGX Spark 采用统一内存架构 (UMA) ,可在 GPU 和 CPU 之间实现动态内存共享。 由于许多应用程序仍在更新以利用 UMA,您可能会遇到内存问题,即使在 DGX Spark 的内存容量。如果发生这种情况,请使用以下命令手动刷新缓冲区缓存:

sudo sh -c 'sync; echo 3 > /proc/sys/vm/drop_caches'

第 1 步:配置网络连接

按照网络设置连接两个 Spark用于在 DGX Spark 节点之间建立连接的操作手册。

其中包括:

  • 物理 QSFP 线缆连接

  • 网络接口配置 (自动或手动分配 IP)

  • 无密码 SSH 设置

  • 网络连接验证

第 2 步:配置 Docker 权限

要在不使用 sudo 的情况下轻松管理容器,您必须位于 docker 组。如果您选择跳过此步骤,则需要使用 sudo 运行 Docker 命令。

打开新终端并测试 Docker 访问。在终端中,运行:

docker ps

如果您看到 permission denied 错误 (例如尝试连接到 Docker 守护程序套接字时 permission denied),请将您的用户添加到 docker 组,这样您就不需要使用 sudo 运行命令。

sudo usermod -aG docker $USER
newgrp docker

在两个节点上重复此步骤。

第 3 步:创建 OpenMPI 主机文件

为 MPI 操作创建包含两个节点 IP 地址的主机文件。在每个节点上,获取网络接口的 IP 地址:

ip a show enp1s0f0np0

或者,如果您使用的是第二个界面:

ip a show enp1s0f1np1

寻找 inet 查找 IP 地址的行 (例如, 192.168.1.10/24 ) 。

在主节点上,创建主机文件 ~/openmpi-hostfile 收集到的 IP:

cat > ~/openmpi-hostfile <<EOF
192.168.1.10
192.168.1.11
EOF

将 IP 地址替换为您的实际节点 IP。

第 4 步:在两个节点上启动容器

在每个节点 (主节点和工作节点) 上,运行以下命令以启动 TRT-LLM 容器:

export MODEL_SCOPE_CACHE="$HOME/.cache/modelscope"
mkdir -p "$MODEL_SCOPE_CACHE"

docker run -d --rm \
  --name trtllm-multinode \
  --gpus '"device=all"' \
  --network host \
  --ulimit memlock=-1 \
  --ulimit stack=67108864 \
  --device /dev/infiniband:/dev/infiniband \
  -e UCX_NET_DEVICES="enp1s0f0np0,enp1s0f1np1" \
  -e NCCL_SOCKET_IFNAME="enp1s0f0np0,enp1s0f1np1" \
  -e OMPI_MCA_btl_tcp_if_include="enp1s0f0np0,enp1s0f1np1" \
  -e OMPI_MCA_orte_default_hostfile="/etc/openmpi-hostfile" \
  -e OMPI_MCA_rmaps_ppr_n_pernode="1" \
  -e OMPI_ALLOW_RUN_AS_ROOT="1" \
  -e OMPI_ALLOW_RUN_AS_ROOT_CONFIRM="1" \
  -e CPATH=/usr/local/cuda/include \
  -e TRITON_PTXAS_PATH=/usr/local/cuda/bin/ptxas \
  -v "$MODEL_SCOPE_CACHE:/root/.cache/modelscope" \
  -v ~/.ssh:/tmp/.ssh:ro \
  nvcr.io/nvidia/tensorrt-llm/release:1.3.0rc25 \
  sh -c "curl https://raw.githubusercontent.com/NVIDIA/dgx-spark-playbooks/refs/heads/main/nvidia/trt-llm/assets/trtllm-mn-entrypoint.sh | sh"

注意

请确保在主节点和工作节点上运行此命令。

第 5 步:验证容器是否正在运行

在每个节点上,验证容器是否正在运行:

docker ps

您应看到类似于以下内容的输出:

```
CONTAINER ID   IMAGE                                                 COMMAND                  CREATED          STATUS          PORTS     NAMES
abc123def456   nvcr.io/nvidia/tensorrt-llm/release:1.3.0rc25        "sh -c 'curl https:…"    10 seconds ago   Up 8 seconds              trtllm-multinode

第 6 步:将主机文件复制到主容器

在主节点上,将 OpenMPI 主机文件复制到容器中:

docker cp ~/openmpi-hostfile trtllm-multinode:/etc/openmpi-hostfile

第 7 步:保存容器参考

为方便起见,请在主节点上将容器名称保存在变量中:

export TRTLLM_MN_CONTAINER=trtllm-multinode

第 8 步:生成配置文件

在主节点上,在容器内生成配置文件:

docker exec $TRTLLM_MN_CONTAINER bash -c 'cat <<EOF > /tmp/extra-llm-api-config.yml
print_iter_log: false
kv_cache_config:
  dtype: "auto"
  free_gpu_memory_fraction: 0.9
cuda_graph_config:
  enable_padding: true
EOF'

第 9 步:下载模型

我们可以使用以下命令从 ModelScope 下载模型。您可以替换 `nv-community/Qwen3-235B-A22B-FP4` 为您选择的 ModelScope 模型。

# 公共 ModelScope 模型无需访问令牌。
export MODEL_HANDLE="nv-community/Qwen3-235B-A22B-FP4"
export LOCAL_MODEL="/root/.cache/modelscope/$MODEL_HANDLE"

docker exec \
  -e MODEL_HANDLE="$MODEL_HANDLE" \
  -e LOCAL_MODEL="$LOCAL_MODEL" \
  -it $TRTLLM_MN_CONTAINER bash -c '
    mpirun python3 -m pip install --upgrade modelscope &&
    mpirun modelscope download \
      --model "$MODEL_HANDLE" \
      --local_dir "$LOCAL_MODEL"'

第 10 步:服务模型

在主节点上,启动 TensorRT-LLM 服务器:

docker exec \
  -e MODEL_HANDLE="$MODEL_HANDLE" \
  -e LOCAL_MODEL="$LOCAL_MODEL" \
  -it $TRTLLM_MN_CONTAINER bash -c '
    mpirun -x MODEL_HANDLE -x LOCAL_MODEL \
      trtllm-llmapi-launch trtllm-serve "$LOCAL_MODEL" \
      --tp_size 2 \
      --ep_size 2 \
      --backend pytorch \
      --max_seq_len 4096 \
      --max_num_tokens 8192 \
      --max_batch_size 1 \
      --custom_tokenizer deepseek_v4 \
      --served_model_name "$MODEL_HANDLE" \
      --extra_llm_api_options /tmp/extra-llm-api-config.yml \
      --port 8355'

这将在端口 8355 上启动 TensorRT-LLM 服务器。然后,您可以向 http://localhost:8355 使用兼容 OpenAI 的 API 格式。

注意

您可能会看到一个警告,例如 UCX WARN network device 'enp1s0f0np0' is not available, please use one or more of。如果您的推理成功,您可以忽略此警告,因为它与您正在使用的两个 CX-7 端口中的一个有关,而另一个则未使用。

预期输出:服务器启动日志和准备就绪消息。

第 11 步:验证 API 服务器

服务器运行后,您可以使用 CURL 请求对其进行测试。在主节点上运行以下命令:

curl -s http://localhost:8355/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "nvidia/Qwen3-235B-A22B-FP4",
    "messages": [{"role": "user", "content": "Paris is great because"}],
    "max_tokens": 64
  }'

预期输出:生成文本完成后的 JSON 响应。

第 12 步:清理和回滚

停止并移除每个节点上的容器。以 SSH 方式访问每个节点并运行:

docker stop trtllm-multinode

警告

您可能会看到一个警告,例如 UCX WARN network device 'enp1s0f0np0' is not available, please use one or more of。如果您的推理成功,您可以忽略此警告,因为它与您正在使用的两个 CX-7 端口中的一个有关,而另一个则未使用。

删除已下载的模型以释放每个节点上的磁盘空间:

rm -rf "$HOME/.cache/modelscope/nv-community/Qwen3-235B-A22B-FP4"

第 13 步:后续步骤

您现在可以在 DGX Spark 集群上部署其他模型。

第 1 步:为使用 Open WebUI 和 TRT-LLM 做好准备

在单节点或多节点配置中设置 TensorRT-LLM 推理服务器后, 您可以部署 Open WebUI,通过 Open WebUI 与您的模型进行交互。要进行设置,只需确保以下内容按顺序

  • 运行并可在 http://localhost:8355 访问的 TensorRT-LLM 推理服务器

  • Docker 的安装和配置 (请参阅前面的步骤)

  • DGX Spark 提供端口 3000

第 2 步:启动 Open WebUI 容器

在运行 TensorRT-LLM 推理服务器的 DGX Spark 节点上运行以下命令。 对于多节点设置,这是主要节点。

注意

如果您为兼容 OpenAI 的 API 服务器使用了其他端口,请调整 OPENAI_API_BASE_URL="http://localhost:8355/v1" 以匹配 TensorRT-LLM 推理服务器的 IP 和端口。

docker run \
  -d \
  -e OPENAI_API_BASE_URL="http://localhost:8355/v1" \
  -v open-webui:/app/backend/data \
  --network host \
  --add-host=host.docker.internal:host-gateway \
  --name open-webui \
  --restart always \
  ghcr.io/open-webui/open-webui:main

此命令:

  • 通过 http://localhost:8355 连接到兼容 OpenAI 的 TensorRT-LLM API 服务器

  • 允许访问 http://localhost:8080 上的 Open WebUI 界面

  • 在 Docker Volume 中保留聊天数据

  • 启用容器自动重启

  • 使用最新的 Open WebUI 镜像

第 3 步:访问 Open WebUI 界面

打开 Web 浏览器,然后导航至:

http://localhost:8080

您应在 http://localhost:8080 上看到 Open WebUI 界面,您可以在其中执行以下操作:

  • 与您部署的模型交流

  • 允许访问 http://localhost:8080 上的 Open WebUI 界面

  • 调整模型参数

  • 查看聊天记录

  • 管理模型配置

您可以从左上角的下拉菜单中选择模型。您只需完成这些操作,即可开始在部署的模型中使用 Open WebUI。

注意

如果从远程机器访问,请将本地主机替换为 DGX Spark 的 IP 地址。

第 4 步:清理和回滚

警告:

这将删除所有聊天数据,并且可能需要重新上传以备将来运行。

使用以下命令删除容器:

docker stop open-webui
docker rm open-webui
docker volume rm open-webui
docker rmi ghcr.io/open-webui/open-webui:main