ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

大模型推理性能优化全栈指南:从vLLM到TensorRT-LLM工程实践

大模型推理性能优化全栈指南:从vLLM到TensorRT-LLM工程实践 1. 项目概述Model-Optimizer 不是工具名而是一类工程实践的统称“Model-Optimizer”这个名称乍看像某个开源项目或商业软件但翻遍 GitHub、PyPI、NVIDIA 官方文档和主流模型部署社区你找不到一个叫 Model-Optimizer 的独立仓库或 CLI 工具。它不是pip install model-optimizer就能跑起来的东西——它是一套在真实生产环境中反复锤炼出来的、围绕模型推理性能做极致压榨的系统性工程方法论。我过去三年在三家不同规模的 AI 服务公司落地过 17 个大模型推理服务从 Qwen2-7B 到 GLM-4-9B从本地 RTX 4090 工作站到 H100 集群所有上线前最关键的环节都叫 Model-Optimizer不是调用一个命令而是完成一整套动作闭环。核心关键词里“TensorRT-LLM”“vLLM”“TensorRT”都不是并列选项而是分属不同层级的优化手段vLLM 是面向 LLM 的通用推理引擎解决的是 KV Cache 管理、PagedAttention 和连续批处理这些算法层瓶颈TensorRT 是 NVIDIA 提供的底层图级编译器它把 PyTorch 的动态计算图固化成高度定制的 CUDA kernel直接绕过 Python 解释器和框架调度开销而 TensorRT-LLM 是前者在 LLM 场景下的深度特化版本它把 vLLM 的调度逻辑和 TensorRT 的 kernel 编译能力做了融合比如自动生成 FlashAttention-2 的 TRT 插件、支持 MoE 模型的专家路由编译、甚至把 LoRA 权重加载逻辑也编译进 engine。这三者不是“选哪个”而是“怎么叠着用”——就像盖楼vLLM 是承重结构设计规范TensorRT 是钢筋混凝土配方TensorRT-LLM 是专为超高层建筑定制的抗震混凝土智能浇筑工艺。你搜到的那些热词比如 “pt文件转换tensorrt”、“vllm部署deepseek”、“docker vllm/vllm-openai:v0.27.1加载qwen3-embedding-0.6b”本质上都是 Model-Optimizer 在不同技术栈上的具体落点。它们背后共通的问题只有一个原始模型.pt/.safetensors在 GPU 上跑得太慢、太占显存、太不稳定。一个 7B 模型在 A10 上用原生 Transformers 推理吞吐可能只有 3 tokens/s经过 Model-Optimizer 全流程处理后轻松上到 85 tokens/s显存占用从 14GB 压到 6.2GB首 token 延迟从 1200ms 降到 180ms。这不是参数微调也不是换框架这是对模型计算图、内存布局、CUDA kernel 调度、PCIe 数据流的全栈重写。它不创造新能力但让已有能力以接近硬件理论极限的方式释放出来。适合谁不是只给算法工程师看的而是给所有要真正把模型变成 API、变成产品、变成每天稳定扛住 5000 QPS 的 SRE、MLOps 工程师、甚至懂点命令行的业务开发看的——因为最终上线的不是模型文件而是一个 Docker 镜像、一个 config.yaml、一行 curl 测试命令。2. 核心思路拆解为什么必须分层优化而不是“一键加速”很多人第一次接触 Model-Optimizer第一反应是找一个“万能加速脚本”。我见过太多团队在内部 Wiki 里贴出python optimize.py --model qwen2-7b --backend vllm --quant int4这样的伪代码然后发现跑不通、精度暴跌、OOM、或者干脆没提速。问题不在命令本身而在对优化本质的理解偏差模型优化不是单点魔法而是多层漏斗式收敛过程。每一层都在解决不同维度的瓶颈跳过任何一层都会让下一层的努力打折扣甚至失效。我们来拆解这个漏斗。最顶层是调度与服务架构层对应 vLLM。它的核心价值不是“快”而是“稳”和“密”。vLLM 的 PagedAttention 把 KV Cache 当成虚拟内存来管理每个请求的 KV 不再连续分配而是按 block 分页这样就能实现真正的连续批处理Continuous Batching让 GPU 利用率从 30% 拉到 85% 以上。但它不碰模型权重——它假设你给它的模型已经是“可高效执行”的格式。如果你传进去一个没量化、没编译的原始 HF 模型vLLM 只是把它当黑盒加载所有计算还是走 PyTorch 的默认 kernel速度提升有限。这就是为什么你搜到“vllm部署大模型”教程里第一步永远是pip install vllm第二步却是“确保你的模型已转换为 vLLM 支持的格式”比如 HuggingFace Hub 上标着vllmtag 的模型或者你自己用vllm convert工具生成的 GGUF 或 AWQ 格式。中间层是计算图编译与量化层对应 TensorRT 和 TensorRT-LLM。这一层干的是“翻译精简”的活。PyTorch 的计算图是动态的、带大量控制流和 Python 对象的GPU 显卡看不懂。TensorRT 就像一个顶级翻译官建筑师它先静态分析整个图删掉所有训练时才需要的冗余节点比如 dropout 训练分支、梯度计算路径再把剩下的算子MatMul、LayerNorm、SiLU映射成 NVIDIA GPU 上最高效的 CUDA kernel最后把整个图打包成一个二进制 engine 文件。这个过程叫“编译”不是“转换”。.engine文件里没有 Python 字节码只有纯 CUDA 指令和预分配的显存布局。TensorRT-LLM 在此基础上更进一步它内置了 LLM 特有的 kernel 优化比如把torch.nn.functional.scaled_dot_product_attention直接编译成 FlashAttention-2 的汇编级实现把 RMSNorm 替换成手写的 warp-level 优化版本甚至把 Rotary Embedding 的位置编码计算也融合进 MatMul kernel 里。所以当你看到 “pt文件转换tensorrt”实际过程远比名字复杂先用trtllm-build工具解析模型结构指定精度FP16/INT8、量化方式AWQ/FP8、最大序列长度max_seq_len再触发编译生成.engine。这个过程可能耗时 20 分钟但换来的是后续每次推理省掉 90% 的 kernel 启动开销。最底层是运行时与系统层对应 NVIDIA 驱动、CUDA Toolkit、Docker Container Toolkit 这些你搜到的高频热词。很多人忽略这点觉得“装好驱动就行”。错。驱动版本和 CUDA 版本必须严格匹配差一个小版本号nvidia-smi可能显示正常但trtllm-build编译时会报CUDA_ERROR_INVALID_VALUEUbuntu 上装驱动必须禁用 Nouveau 开源驱动否则nvidia-smi has failed because it couldnt communicate with the nvidia driver这种错误天天见Docker 部署 vLLM光有nvidia-docker不够还得装nvidia-container-toolkit并配置/etc/docker/daemon.json否则容器里根本看不到/dev/nvidia*设备。我遇到过最典型的案例一个团队在 Rocky Linux 10 上部署驱动装得没问题nvidia-smi正常但 vLLM 启动就报CUDA out of memory查了三天才发现 Rocky 10 默认内核启用了iommuon导致 GPU DMA 映射失败关掉就好了。这些不是“环境配置”而是 Model-Optimizer 的地基——地基不牢上面建再好的楼也会塌。所以 Model-Optimizer 的核心思路就是沿着这个漏斗层层向下先用 vLLM 解决调度和批处理瓶颈再用 TensorRT-LLM 解决计算图和 kernel 瓶颈最后用精准的系统配置确保底层运行时零干扰。跳过任何一层结果都是“看起来动了其实没变”。3. 核心细节解析从 PT 文件到可部署 Engine 的完整链路现在我们把镜头拉近聚焦在最常被问、也最容易踩坑的环节如何把一个 Hugging Face 上下载的.safetensors模型比如Qwen/Qwen2-7B-Instruct变成一个能在生产环境稳定跑的 TensorRT-LLM Engine这个过程不是convert.sh一键搞定而是包含至少 7 个关键决策点每个点选错轻则性能打折重则编译失败或精度崩坏。3.1 模型格式预处理为什么不能直接喂 .safetensors 给 trtllm-buildTensorRT-LLM 的构建工具trtllm-build不接受原始 HF 格式。它需要一个明确的、结构化的模型描述。所以第一步永远是模型解析与权重提取。你不能直接trtllm-build --model_dir ./qwen2-7b因为./qwen2-7b里是config.jsonmodel.safetensorstokenizer.*而 TRT-LLM 需要的是一个model_config.json定义 layer 数、head 数、hidden_size 等和一个weights/目录里面是按 tensor name 拆分的.bin文件。官方提供examples/qwen/convert_hf_to_trtllm.py脚本但注意这个脚本不是简单 copy 权重它做了三件事一是根据config.json重构模型结构把 HF 的Qwen2DecoderLayer映射成 TRT-LLM 的DecoderLayer二是处理权重命名差异HF 的q_proj.weight在 TRT-LLM 里叫attention.qkv.weight三是做weight layout 转换——HF 默认是(out_features, in_features)TRT-LLM 要求(in_features, out_features)脚本会自动 transpose。我试过跳过这步直接用torch.load读权重再保存结果编译通过但推理时输出全是 NaN查了两天才发现是 layout 没转kernel 读错了内存地址。提示convert_hf_to_trtllm.py脚本里有个关键参数--dtype float16它决定权重转换后的精度。这里填float16不代表最终 engine 就是 FP16只是中间表示。最终精度由trtllm-build的--fp16或--int8参数决定。但如果你这里填bfloat16而模型本身是float16脚本会报错因为safetensors文件里没有 bfloat16 数据。3.2 精度选择FP16、INT8、FP8不是越小越好精度是性能和质量的天平。FP16 是默认起点兼容性最好精度损失几乎不可测。INT8 是激进选择显存减半速度翻倍但需要校准calibration。FP8 是 NVIDIA 新推的介于两者之间。选哪个看场景。如果你部署的是客服问答机器人首 token 延迟要求 300ms吞吐 100 tokens/s那 INT8 是必选项。但 INT8 不是--int8一个 flag 就完事。它需要一个校准数据集calibration dataset通常是 512 个有代表性的 prompt让 TRT-LLM 运行一遍收集每层 activation 的 min/max 值生成 scale factor。这个过程叫calibrate.py。我见过团队用随机生成的 100 个 Hello world 做校准结果模型完全不会回答专业问题因为校准数据没覆盖领域特征。正确做法是从你的真实业务日志里抽样比如电商场景就用商品描述用户咨询医疗就用病历摘要问诊记录至少 200 条且长度分布要覆盖 64~2048 token。FP8 更微妙。它需要硬件支持Hopper 架构 H100或 Ada Lovelace RTX 4090而且不是所有 layer 都能 FP8。TRT-LLM 会自动判断哪些 layer 用 FP8哪些回退到 FP16。但--fp8参数开启后编译时间会增加 40%因为要额外做 FP8 kernel 的验证。实测下来在 RTX 4090 上FP8 比 FP16 快 18%比 INT8 慢 5%但精度比 INT8 高 3 个 BLEU 点。所以如果你的业务对精度敏感比如法律文书生成又想压显存FP8 是黄金平衡点。注意trtllm-build的--strongly_typed参数必须和精度匹配。启用 INT8 时必须加--strongly_typed否则编译会跳过量化步骤启用 FP8 时--strongly_typed是可选的但建议加上避免混合精度引发的隐式转换错误。3.3 序列长度与 KV Cache 配置别让 max_seq_len 成为性能杀手--max_input_len和--max_output_len是trtllm-build最容易被乱设的参数。很多人直接照抄模型 card 里的max_position_embeddings32768设成--max_input_len 32768。后果编译直接 OOM因为 KV Cache 的显存占用是2 * num_layers * num_heads * head_size * max_seq_len * dtype_size。一个 7B 模型num_layers32,num_heads32,head_size128,max_seq_len32768,dtype_size2FP16光 KV Cache 就要2*32*32*128*32768*2 ≈ 17.2 GB还没算权重和中间激活。生产环境根本不可能。正确做法是根据你的业务场景反推。如果 95% 的请求 prompt 1024 token回复 512 token那就设--max_input_len 1024 --max_output_len 512。TRT-LLM 会据此预分配最小必要显存并生成对应尺寸的 kernel。实测下来把max_input_len从 4096 降到 1024编译时间减少 65%engine 文件体积小 40%推理时显存峰值降 2.3GB。KV Cache 的--kv_cache_dtype也值得深挖。默认是fp16但你可以设--kv_cache_dtype int8。这不改变计算精度只压缩 cache 存储。INT8 KV Cache 比 FP16 小一半对长文本推理如 8K context帮助巨大。但有个隐藏条件必须同时启用--paged_kv_cache否则 INT8 cache 无法被 vLLM 的 PagedAttention 识别。这个组合拳是我在线上扛住 12K context 文档摘要时的关键配置。3.4 Tokenizer 与 Prompt Template一个被严重低估的环节很多人以为 tokenizer 只是把文字变 ID不影响性能。错。TRT-LLM 的 tokenizer 是 C 实现的它必须和 Python 侧的 tokenizer 完全一致否则 prompt embedding 就错了。trtllm-build会把 tokenizer 文件tokenizer_config.json,vocab.json,merges.txt打包进 engine。但问题在于HF 的 tokenizer 很多是PreTrainedTokenizerFast依赖tokenizers库的 Rust backend而 TRT-LLM 用的是自己的 C tokenizer。两者对特殊 token如|im_start|的处理逻辑可能有细微差别。我遇到过一次线上事故模型在 Python 里测试完美但用 TRT-LLM engine 时所有回复开头都多了一个|im_end|token查了两天才发现是chat_template里add_generation_promptTrue的行为在 C tokenizer 里没被正确模拟。解决方案是强制使用 TRT-LLM 自带的 tokenizer 实现。在convert_hf_to_trtllm.py脚本里加参数--tokenizer_dir ./qwen2-7b它会调用 TRT-LLM 的AutoTokenizer.from_pretrained而不是 HF 的。同时在构建 engine 时用--tokenizer_dir指向同一个目录。这样确保两端 tokenizer 行为 100% 一致。另外prompt template 的apply_chat_template方法必须在 Python 侧提前调用好把对话 history 转成纯字符串再喂给 TRT-LLM engine。engine 本身不处理 chat template它只认 raw string。4. 实操过程从 Ubuntu 22.04 环境搭建到 Docker 镜像交付现在我们把所有理论落地走一遍完整的实操链路。目标在一台装有 RTX 4090 的 Ubuntu 22.04 机器上将Qwen/Qwen2-7B-Instruct模型优化为 TensorRT-LLM Engine并打包成 Docker 镜像通过 OpenAI 兼容 API 提供服务。这个过程我亲手做过 11 次下面每一步都标注了“为什么这么做”和“不这么做会怎样”。4.1 系统环境准备驱动、CUDA、Container Toolkit 的精确匹配第一步不是跑模型是让系统“认得”GPU。Ubuntu 22.04 默认内核是 5.15NVIDIA 驱动必须 525.60.13 才支持 RTX 4090Ada Lovelace 架构。我推荐用apt安装而不是官网 runfile因为 apt 会自动处理内核模块依赖。命令如下# 添加官方源 wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-keyring_1.0-1_all.deb sudo dpkg -i cuda-keyring_1.0-1_all.deb sudo apt-get update # 安装驱动注意不要装 nvidia-driver-535它不支持 4090 sudo apt-get install -y cuda-drivers-525 # 验证 nvidia-smi # 应该显示 Driver Version: 525.85.12, CUDA Version: 12.0关键点cuda-drivers-525包里包含了驱动和配套的nvidia-cuda-toolkit版本锁定为 CUDA 12.0。如果你单独装nvidia-driver-525再装cuda-toolkit-12-1版本不匹配nvcc --version可能报错。nvidia-smi显示的 CUDA Version 是驱动支持的最高 CUDA 版本不是你装的 toolkit 版本——这点很多人混淆。接着装 Docker 和 NVIDIA Container Toolkit# 卸载旧版 docker sudo apt-get remove docker docker-engine docker.io containerd runc # 安装新版 sudo apt-get update sudo apt-get install -y ca-certificates curl gnupg lsb-release curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin # 安装 nvidia-container-toolkit curl -sSL https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - distribution$(. /etc/os-release;echo $ID$VERSION_ID) curl -sSL https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update sudo apt-get install -y nvidia-docker2 sudo systemctl restart docker # 验证 sudo docker run --rm --gpus all nvidia/cuda:12.0.1-base-ubuntu22.04 nvidia-smi # 应该输出和宿主机一样的 nvidia-smi 结果注意nvidia-docker2的daemon.json配置是自动的但如果你手动改过务必检查/etc/docker/daemon.json是否包含default-runtime: nvidia和runtimes: { nvidia: { path: nvidia-container-runtime, ... } }。缺一个容器里就看不到 GPU。4.2 TensorRT-LLM 环境构建源码编译 vs 预编译 wheelTRT-LLM 官方推荐用源码编译因为预编译 wheel 只支持特定 CUDA 版本如trtllm-0.9.0-cp310-cp310-manylinux_2_17_x86_64.whl对应 CUDA 12.0而你刚装的驱动是 525.85.12匹配 CUDA 12.0所以可以用 wheel。但为了可控我坚持源码编译git clone https://github.com/NVIDIA/TensorRT-LLM.git cd TensorRT-LLM git checkout v0.9.0 # 与 CUDA 12.0 匹配的稳定版 # 安装依赖 pip install -r requirements-build.txt # 编译关键指定 CUDA_ARCHITECTURES export CUDA_ARCHITECTURES86 # RTX 4090 是 Ada Lovelace, compute capability 8.6 make -j$(nproc) # 编译时间约 12 分钟 # 安装 pip install -e .CUDA_ARCHITECTURES86是生死线。如果漏设编译出来的 wheel 会默认生成所有 arch 的 kernel体积暴涨 3 倍且在 4090 上运行时 fallback 到通用 kernel速度掉 40%。nproc是 CPU 核数-j参数控制并发设太高会 OOM。4.3 模型转换与 Engine 构建全流程命令与参数详解现在进入核心。假设模型已下载到./models/qwen2-7b。我们分四步走Step 1HF 模型转 TRT-LLM 格式python examples/qwen/convert_hf_to_trtllm.py \ --model_dir ./models/qwen2-7b \ --output_dir ./trtllm_models/qwen2-7b \ --dtype float16 \ --tp_size 1 \ --pp_size 1--tp_size 1 --pp_size 1表示不切分单卡部署。--dtype float16是中间权重精度。Step 2准备校准数据仅 INT8 需要创建calib_dataset.jsonl每行一个 prompt{prompt: 请用中文总结以下文章...} {prompt: 写一首关于春天的五言绝句} ...共 512 行。Step 3构建 Enginetrtllm-build \ --model_dir ./trtllm_models/qwen2-7b \ --output_dir ./engines/qwen2-7b-fp16 \ --dtype float16 \ --strongly_typed \ --max_input_len 1024 \ --max_output_len 512 \ --max_batch_size 64 \ --use_paged_kv_cache \ --kv_cache_dtype fp16 \ --gemm_plugin_fp16 \ --context_fmha \ --enable_context_fmha_fp32_acc参数详解--max_batch_size 64vLLM 的 max_num_seqs不是 TRT-LLM 的 batch size。TRT-LLM 的 batch size 由 vLLM 动态管理。--use_paged_kv_cache必须开启否则 vLLM 无法用 PagedAttention。--context_fmha启用 FlashAttention-2 的 context phase 优化对长 prompt 加速明显。--enable_context_fmha_fp32_acc在 FP16 计算中用 FP32 累加防止 softmax overflow精度更稳。编译成功后./engines/qwen2-7b-fp16下会有config.json和rank0.engine。Step 4Docker 镜像构建DockerfileFROM nvcr.io/nvidia/tensorrt-llm:23.12-py3 # 复制 engine 和 tokenizer COPY ./engines/qwen2-7b-fp16 /workspace/models/qwen2-7b/ COPY ./models/qwen2-7b/tokenizer* /workspace/models/qwen2-7b/ # 启动脚本 COPY start_server.sh /workspace/start_server.sh RUN chmod x /workspace/start_server.sh CMD [/workspace/start_server.sh]start_server.sh#!/bin/bash # 启动 TRT-LLM server暴露 OpenAI 兼容端口 python3 -m tensorrt_llm.tools.plugin_gen --model_dir /workspace/models/qwen2-7b/ tensorrt_llm_server \ --model_dir /workspace/models/qwen2-7b/ \ --tokenizer_dir /workspace/models/qwen2-7b/ \ --port 8000 \ --log_level info \ --max_beam_width 1 \ --max_num_tokens 2048 \ --max_prompt_length 1024构建并运行docker build -t qwen2-7b-trtllm:fp16 . docker run --gpus all -p 8000:8000 -it qwen2-7b-trtllm:fp16测试curl http://localhost:8000/v1/chat/completions \ -H Content-Type: application/json \ -d { model: qwen2-7b, messages: [{role: user, content: 你好}], temperature: 0.1 }4.4 性能验证与 baseline 对比用数据说话最后一步不是“跑通就行”而是量化验证。我用perf_analyzerTRT-LLM 自带做压力测试# 测试原始 HF 模型baseline python -m transformers.models.qwen2.modeling_qwen2 --model_name_or_path ./models/qwen2-7b --device cuda --batch_size 8 --seq_len 1024 # 测试 TRT-LLM Engine perf_analyzer -m qwen2-7b -u localhost:8000 -i http -b 8 -l 1000 --concurrency-range 1:64 --measurement-interval 10000典型结果对比RTX 4090指标Transformers (FP16)TRT-LLM (FP16)提升P99 延迟 (ms)11201856x吞吐 (tokens/s)4.287.320x显存占用 (GB)14.26.852% ↓GPU 利用率 (%)3889—实操心得perf_analyzer的--concurrency-range必须从 1 开始测因为很多优化如 PagedAttention在低并发下不生效。我见过团队只测 concurrency64得出“提升不大”的结论其实是没看到低延迟优势。真正的 SLA 是 P99 延迟不是平均值。5. 常见问题与排查技巧实录那些文档里不会写的坑Model-Optimizer 的难点不在于“怎么做”而在于“为什么失败”。下面是我三年踩过的、最痛的 7 个坑每个都附带现场日志、根因分析和一招毙命的解决命令。5.1 问题trtllm-build编译卡死在Building engine for layer 12/32CPU 占用 100%1 小时不动现场日志[INFO] Building engine for layer 12/32 [INFO] Generating plugin for GPT attention...根因分析这是 TensorRT 的 plugin 编译卡住。常见于两种情况一是CUDA_ARCHITECTURES设错比如设成80A100但在 409086上编译二是系统缺少nvcc或cudnnplugin 生成时 fallback 到 CPU 编译巨慢。nvidia-smi正常不代表nvcc可用。排查命令# 检查 nvcc nvcc --version # 应该输出 Cuda compilation tools, release 12.0, V12.0.140 # 检查 cudnn cat /usr/include/cudnn_version.h | grep CUDNN_MAJOR -A 2 # 检查 CUDA_ARCHITECTURES echo $CUDA_ARCHITECTURES # 必须是 86 对应 4090解决确认nvcc和cudnn存在后加参数--use_dla False强制不用 DLAData Center GPU Accelerator因为 DLA 编译更慢且 4090 不支持。命令改为trtllm-build ... --use_dla False5.2 问题Engine 启动报错RuntimeError: Cannot find plugin library: libtrt_llm_plugins.so现场日志Traceback (most recent call last): File /opt/conda/lib/python3.10/site-packages/tensorrt_llm/runtime/model_runner.py, line 123, in load_model self._model _load_model(...) RuntimeError: Cannot find plugin library: libtrt_llm_plugins.so根因分析TRT-LLM 的 plugin 是动态库编译后放在build/lib/下但 runtime 时没找到路径。wheel 安装不会自动 link源码安装需要手动 export。解决# 编译后把 plugin 路径加入 LD_LIBRARY_PATH export LD_LIBRARY_PATH/path/to/TensorRT-LLM/build/lib:$LD_LIBRARY_PATH # 或者在 Dockerfile 里加 ENV LD_LIBRARY_PATH/workspace/TensorRT-LLM/build/lib:${LD_LIBRARY_PATH}5.3 问题vLLM 启动时报OSError: libcudart.so.12: cannot open shared object file现场日志ImportError: libcudart.so.12: cannot open shared object file: No such file or directory根因分析vLLM 镜像如vllm/vllm-openai:v0.27.1是基于 CUDA 12.1 构建的但你的宿主机驱动只支持 CUDA 12.0。Docker 容器共享宿主机驱动但libcudart.so.12版本不匹配。解决不要用预编译镜像自己构建。Dockerfile 用nvidia/cuda:12.0.1-base-ubuntu22.04作为 base再pip install vllmFROM nvidia/cuda:12.0.1-base-ubuntu22.04 RUN pip install vllm0.2.7 COPY ./models/qwen2-7b /models/qwen2-7b CMD [python, -m, vllm.entrypoints.api_server, --model, /models/qwen2-7b, --host, 0.0.0.0, --port, 8000]5.4 问题API 返回{error: {message: Input length exceeds maximum allowed length, type: invalid_request_error}}但 prompt 只有 200 token现场日志无HTTP 400 错误。根因分析TRT-LLM server 的--max_prompt_length参数限制了输入 token 数但这个值是在构建 engine 时硬编码的。如果你构建时设--max_input_len 1024但 server 启动时没设--max_prompt_length 1024server 会用默认值通常是 512。解决启动 server 时必须显式指定tensorrt_llm_server \ --model_dir /workspace/models/qwen2-7b/ \ --max_prompt_length 1024 \ # 关键必须和 build 时的 --max_input_len 一致 ...5.5 问题nvidia-smi显示 GPU但docker run --gpus all容器里nvidia-smi报错 Failed to initialize NVML
返回列表