用于推理的 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 上
trtllm-mn-entrypoint.sh — 用于多节点设置的容器入口点脚本
模型支持矩阵
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