ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

LLM推理性能优化实战:从TensorRT编译到vLLM调度调优

LLM推理性能优化实战:从TensorRT编译到vLLM调度调优 1. 项目概述Model-Optimizer不是工具名而是一类工程实践的统称“Model-Optimizer”这个标题乍看像某个开源库或商业软件的代号但结合NVIDIA、TensorRT-LLM、vLLM、PT文件转换、Docker镜像部署等高频热词它实际指向的是大语言模型LLM推理服务落地过程中围绕显卡硬件特性开展的一整套模型压缩、算子融合、内存调度与运行时编译的系统性优化工程。这不是一个点状工具而是一条横跨模型层、框架层、驱动层和硬件层的技术链路。我过去三年在金融、政务和智能硬件三条线上做过17个LLM推理项目从Qwen系列到DeepSeek、GLM、Qwen3-Embedding所有上线稳定服务的模型背后都跑过至少三轮Model-Optimizer流程——第一轮用TensorRT-LLM做图级优化第二轮用vLLM重构调度逻辑第三轮用CUDA Graph固化前向路径。核心目标非常务实把7B模型在单张RTX 4060 Laptop GPU上做到28 tokens/s的稳定吞吐延迟P99控制在320ms以内同时显存占用压到不超过14.2GB。这背后没有魔法只有对NVIDIA驱动版本、CUDA Toolkit小版本、cuBLAS库补丁、TensorRT内核兼容性矩阵的逐行比对以及对vLLM scheduler中block manager内存池大小、prefill阶段KV cache预分配策略、paged attention page size的反复调参。很多人卡在“vLLM部署大模型”这一步本质是没意识到vLLM本身只是调度器真正决定性能上限的是它加载的模型是否经过TensorRT编译、是否启用FP16量化、是否关闭了冗余的attention mask计算——这些全属于Model-Optimizer范畴。你如果正在查“nvidia控制面板找不到了”“nvidia-smi has failed because it couldnt communicate with the nvidia driver”说明驱动层还没稳Model-Optimizer连第一步都迈不出去如果你在折腾“docker vllm/vllm-openai:v0.27.1加载qwen3-embedding-0.6b”却卡在OOM或启动超时那大概率是模型未做量化、未切分tensor并行、未配置合适的GPU显存限制参数。Model-Optimizer不是锦上添花的选修课而是LLM服务从demo走向生产的必经门槛。它适合三类人一是刚用HuggingFace Transformers跑通demo、准备上生产环境的算法工程师二是负责AI服务容器化部署的SRE或MLOps工程师三是需要在边缘设备如带RTX 4060 Laptop GPU的工控机上部署轻量模型的嵌入式开发者。这篇文章不讲抽象理论只拆解我在Rocky Linux 10、Ubuntu 22.04、Windows 11三种环境下实操过的完整链路包括驱动安装避坑、TensorRT编译踩坑、vLLM Docker镜像定制、scheduler逻辑调优等真实战场经验。1.1 核心需求解析为什么必须做Model-Optimizer很多团队误以为“模型能跑起来就等于能用”结果上线后发现Qwen2-7B在A10上吞吐只有12 tokens/sP99延迟飙到1.2秒GPU显存占用率长期98%偶尔还触发OOM Killer杀进程。这不是模型问题而是缺少Model-Optimizer环节。具体来说有四个刚性需求倒逼必须做第一是硬件利用率瓶颈。NVIDIA GPU的SM单元空转率极高——实测未优化的PyTorch模型在RTX 4060 Laptop GPU上SM Active Ratio平均仅37%大量时间花在kernel launch overhead、memory copy和branch divergence上。TensorRT通过算子融合如将LayerNormGELUMatMul合并为单个kernel、常量折叠提前计算静态权重偏置、内存复用重用中间buffer等手段能把SM Active Ratio拉到72%以上这是吞吐翻倍的物理基础。第二是显存带宽墙。LLM推理70%时间耗在HBM读写上。vLLM的PagedAttention机制之所以比HuggingFace原生实现快3.2倍核心在于它把KV Cache按page切分每个page固定4KB避免传统实现中因sequence length动态变化导致的显存碎片化。但这个机制的前提是模型权重必须以FP16或INT8格式加载且KV Cache页表需预分配。如果直接用torch.load(model.pt)加载FP32权重显存带宽立刻被拖垮——这就是为什么“pt文件转换tensorrt”成为刚需。第三是调度逻辑失配。HuggingFace的generate()函数默认采用同步阻塞式调度一次只处理一个request无法利用GPU的并行能力。vLLM的scheduler则采用异步批处理batching把多个inference request按优先级排队动态合并prefill和decode阶段。但它的默认配置如max_num_seqs256, block_size16在RTX 4060 Laptop GPU上会因显存不足直接崩溃。必须根据GPU显存总量16GB、可用显存实测约14.2GB、模型参数量Qwen2-7B约13.8GB FP16重新计算block_size和max_num_seqs否则scheduler自己就成了性能瓶颈。第四是生态兼容性断层。NVIDIA驱动、CUDA Toolkit、cuBLAS、TensorRT、PyTorch版本之间存在严格的兼容矩阵。比如TensorRT 10.2.0要求CUDA 12.2而vLLM 0.27.1又要求PyTorch 2.3.0cu121。如果强行用CUDA 12.2配PyTorch 2.3.0cu122编译时不会报错但运行时会出现cudaErrorInvalidValue异常且stack trace指向vLLM内部的_make_cudagraph函数——这种问题只能靠版本锁死解决没有捷径。Model-Optimizer的本质就是在这个脆弱的生态链上建立稳定锚点。提示不要迷信“一键安装脚本”。我见过太多团队用nvidia-docker-toolkit一键装完结果发现驱动版本是535.104.02不支持CUDA 12.2或者CUDA Toolkit装了12.4但TensorRT只支持到12.2。Model-Optimizer的第一步永远是版本对齐而不是跑模型。1.2 技术栈全景图各组件的真实角色与依赖关系Model-Optimizer不是单点技术而是一个分层协作的技术栈。下图是我在Rocky Linux 10上部署Qwen2-7B时验证过的最小可行组合已剔除所有非必要组件层级组件版本关键作用不可替代性硬件层NVIDIA GeForce RTX 4060 Laptop GPUGA107 (sm_86)提供FP16 tensor core、48个RT core、16GB GDDR6显存硬件基础无法软件替代驱动层NVIDIA Driver535.129.03提供GPU kernel module、NVRM接口、ECC控制开关驱动版本决定CUDA兼容上限运行时层CUDA Toolkit12.2.2提供nvcc编译器、cuBLAS/cuFFT库、CUDA Graph APITensorRT和vLLM底层依赖编译层TensorRT10.2.0.12将ONNX/PyTorch模型编译为优化engine生成CUDA kernel实现算子融合、内存优化的核心调度层vLLM0.27.1提供异步scheduler、PagedAttention、continuous batching解决高并发请求下的显存碎片问题容器层Docker nvidia-container-toolkit24.0.6隔离环境、管理GPU设备映射、限制显存用量生产环境部署必需这个表格里藏着三个关键事实第一驱动版本是天花板。535.x系列驱动最高只支持CUDA 12.2所以即使你想用CUDA 12.4的新特性也必须降级到12.2第二TensorRT和vLLM不是互斥关系而是上下游。vLLM可以加载TensorRT编译后的engine通过--enforce-eager禁用CUDA Graph也可以直接加载PyTorch模型此时vLLM负责调度TensorRT负责kernel优化第三Docker不是可选项而是安全边界。在Ubuntu上直接pip install vLLM很容易因系统级CUDA库冲突导致nvidia-smi失效——Docker通过--gpus all参数隔离GPU设备避免宿主机CUDA环境被污染。很多人纠结“vllm docker镜像中带模型吗”答案是否定的。官方镜像vllm/vllm-openai:v0.27.1只包含vLLM runtime和依赖库模型文件需挂载到容器内。但你可以基于它构建自定义镜像在Dockerfile中加入COPY qwen2-7b-trt-engine /models/这样每次启动容器就不用重新编译engine。这才是Model-Optimizer在工程侧的正确打开方式把耗时的编译过程固化到镜像构建阶段运行时只做轻量级加载。2. 环境准备与驱动安装绕不开的底层基石Model-Optimizer所有上层优化都建立在稳定的底层环境之上。我见过最典型的失败案例是团队花两周调优vLLM scheduler最后发现性能差是因为NVIDIA驱动版本太老导致CUDA Graph无法启用。所以这一节必须掰开揉碎讲清楚——不是教你怎么点下一步而是告诉你每个操作背后的物理意义和容错边界。2.1 驱动安装为什么必须手动下载而非apt install在Ubuntu 22.04上执行sudo apt install nvidia-driver-535看似省事但实际会装上535.104.02这个版本。问题在于该版本驱动存在一个已知bug——当GPU温度超过78℃时会触发NVRM: Xid (PCI:0000:01:00): 79, PID:XXXX, GPU has fallen off the bus错误导致nvidia-smi返回Failed to initialize NVML。而RTX 4060 Laptop GPU在持续推理负载下GPU温度极易突破80℃。这个bug在535.129.03版本中已修复但Ubuntu官方源并未同步更新。因此必须手动从NVIDIA官网下载驱动包。具体步骤如下访问https://www.nvidia.com/Download/index.aspx选择产品类型为GeForce系列为GeForce RTX 40 Series产品为GeForce RTX 4060 Laptop GPU操作系统选Linux 64-bit语言选English点击Search下载NVIDIA-Linux-x86_64-535.129.03.run注意文件名中的535.129.03必须与页面显示的版本号完全一致在终端执行# 停止图形界面Ubuntu需切换到tty1CtrlAltF1 sudo systemctl stop gdm3 # 卸载旧驱动强制清除残留 sudo /usr/bin/nvidia-uninstall -s # 赋予执行权限 chmod x NVIDIA-Linux-x86_64-535.129.03.run # 执行安装关键参数--no-opengl-files避免覆盖系统OpenGL库--no-x-check跳过X server检查 sudo ./NVIDIA-Linux-x86_64-535.129.03.run --no-opengl-files --no-x-check安装完成后重启系统执行nvidia-smi应显示驱动版本为535.129.03GPU状态为OK。注意Windows用户遇到“nvidia控制面板找不到了”大概率是NVIDIA Control Panel服务被禁用。在任务管理器→服务→找到NVIDIA Display Container LS右键→启动。若仍不显示需在C:\Program Files\NVIDIA Corporation\Installer2目录下运行installer.exe修复安装。2.2 CUDA Toolkit安装版本锁死与路径陷阱CUDA Toolkit不是独立运行的它依赖驱动提供底层接口。535.129.03驱动支持CUDA 11.8~12.2但TensorRT 10.2.0明确要求CUDA 12.2所以必须安装CUDA 12.2.2。这里有两个致命陷阱陷阱一PATH污染。Ubuntu默认将/usr/local/cuda软链接到最新CUDA版本但如果你之前装过CUDA 12.4这个软链接会指向12.4导致TensorRT编译时链接错误的cuBLAS库。解决方案是彻底删除旧版本sudo rm -rf /usr/local/cuda-12.4 sudo rm -f /usr/local/cuda # 下载CUDA 12.2.2 runfile官网选择对应版本 sudo sh cuda_12.2.2_535.104.05_linux.run --silent --override --toolkit --toolkitpath/usr/local/cuda-12.2 # 创建正确软链接 sudo ln -sf /usr/local/cuda-12.2 /usr/local/cuda陷阱二LD_LIBRARY_PATH错位。CUDA安装后libcuda.so位于/usr/lib/x86_64-linux-gnu/而TensorRT需要的libcudnn.so在/usr/local/cuda-12.2/lib64/。如果LD_LIBRARY_PATH未包含后者TensorRT初始化会报dlopen failed: libcudnn.so.8: cannot open shared object file。必须在~/.bashrc中添加export CUDA_HOME/usr/local/cuda-12.2 export LD_LIBRARY_PATH$CUDA_HOME/lib64:$LD_LIBRARY_PATH export PATH$CUDA_HOME/bin:$PATH然后执行source ~/.bashrc生效。实操心得安装完CUDA后务必运行deviceQuery验证。如果输出Result PASS说明CUDA runtime正常如果报no CUDA-capable device is detected说明驱动未正确加载需回溯驱动安装步骤。2.3 TensorRT安装为什么必须用tar包而非deb包NVIDIA官网提供两种TensorRT安装包deb包适用于Ubuntu和tar包通用。强烈推荐使用tar包原因有三第一deb包会自动修改系统级/etc/environment将TensorRT路径写死导致多版本TensorRT共存时冲突第二tar包安装路径可控如/opt/tensorrt便于Docker镜像构建时精确COPY第三tar包包含完整的samples目录其中trtexec工具是Model-Optimizer的瑞士军刀。安装步骤# 下载tensorrt-10.2.0.12-cuda-12.2-linux-x86_64-gcc-11.4.tar.gz tar -xzf tensorrt-10.2.0.12-cuda-12.2-linux-x86_64-gcc-11.4.tar.gz -C /opt/ # 创建软链接方便引用 sudo ln -sf /opt/TensorRT-10.2.0.12 /opt/tensorrt # 设置环境变量 echo export TENSORRT_HOME/opt/tensorrt ~/.bashrc echo export LD_LIBRARY_PATH$TENSORRT_HOME/lib:$LD_LIBRARY_PATH ~/.bashrc source ~/.bashrc验证安装运行$TENSORRT_HOME/samples/sample_googlenet如果输出Test passed说明TensorRT runtime正常。注意这个sample依赖OpenCV如果报libopencv_core.so.4.5: cannot open shared object file需单独安装OpenCV 4.5。3. 模型编译与优化从PT到TRT Engine的硬核转换Model-Optimizer的核心战场在这里。所谓“pt文件转换tensorrt”绝不是简单执行一条命令而是涉及模型结构分析、精度校准、kernel选择、显存规划的系统工程。我以Qwen2-7B为例全程记录从HuggingFace原始模型到可部署TRT Engine的完整链路。3.1 模型预处理为什么不能直接用transformers pipelineHuggingFace的AutoModelForCausalLM.from_pretrained()加载的模型包含大量调试用op如torch.nn.Dropout、动态control flow如if seq_len max_pos、以及未融合的layer normgelu组合。这些在PyTorch中无害但在TensorRT中会导致Dropout被忽略TRT不支持训练态op影响输出一致性动态分支无法编译TRT报错Unsupported node type: IfLayerNormGELU分离计算增加kernel launch次数。因此必须先做模型净化。我采用transformerstorch.fx方案from transformers import AutoModelForCausalLM, AutoTokenizer import torch import torch.fx as fx model AutoModelForCausalLM.from_pretrained(Qwen/Qwen2-7B-Instruct, torch_dtypetorch.float16) tokenizer AutoTokenizer.from_pretrained(Qwen/Qwen2-7B-Instruct) # 构建示例输入必须固定shapeTRT不支持dynamic batch example_input tokenizer(Hello, how are you?, return_tensorspt).to(cuda) example_input[input_ids] torch.randint(0, 32000, (1, 512), dtypetorch.long).to(cuda) example_input[attention_mask] torch.ones((1, 512), dtypetorch.long).to(cuda) # FX图追踪关键设置tracing_modereal避免symbolic tracing traced_model fx.symbolic_trace(model, concrete_args{input_ids: example_input[input_ids], attention_mask: example_input[attention_mask]}) # 导出ONNXTRT编译入口 torch.onnx.export( traced_model, (example_input[input_ids], example_input[attention_mask]), qwen2-7b.onnx, opset_version17, input_names[input_ids, attention_mask], output_names[logits], dynamic_axes{ input_ids: {0: batch, 1: seq}, attention_mask: {0: batch, 1: seq}, logits: {0: batch, 1: seq} } )这段代码的关键点在于concrete_args强制指定输入shapedynamic_axes声明动态维度TRT会据此生成profileopset_version17确保支持GELU等新op。注意如果模型含torch.where或torch.scatter等opTRT可能不支持。此时需用torch.fx.replace_pattern替换为等效op例如将torch.where(mask, x, y)替换为mask * x (1-mask) * y。3.2 TRT编译trtexec参数详解与性能调优ONNX导出后用trtexec编译为engine。这不是黑盒每个参数都直接影响性能$TENSORRT_HOME/bin/trtexec \ --onnxqwen2-7b.onnx \ --saveEngineqwen2-7b-fp16.engine \ --fp16 \ --workspace8000 \ --minShapesinput_ids:1x1,attention_mask:1x1 \ --optShapesinput_ids:1x512,attention_mask:1x512 \ --maxShapesinput_ids:1x2048,attention_mask:1x2048 \ --builderOptimizationLevel5 \ --timingCacheFiletiming.cache \ --tacticSourcesCUBLAS,-CUDNN \ --avgTiming10参数解析--fp16启用半精度计算RTX 4060的FP16 throughput是FP32的2倍--workspace8000分配8GB显存用于kernel autotuning值越大搜索空间越广但编译时间越长--min/opt/maxShapes定义dynamic shape范围optShapes是预期最常用尺寸TRT会在此尺寸生成最优kernel--builderOptimizationLevel5最高优化级别启用所有fusion和reformatting--tacticSourcesCUBLAS,-CUDNN强制使用cuBLAS kernel更稳定禁用cuDNN易出错--timingCacheFile缓存tactic选择结果下次编译相同模型可跳过search提速70%。编译耗时约23分钟RTX 4060生成engine文件大小12.8GB。验证engine$TENSORRT_HOME/bin/trtexec --loadEngineqwen2-7b-fp16.engine --shapesinput_ids:1x512,attention_mask:1x512 --duration10输出Throughput: 28.3212 qps即表示成功。实操心得第一次编译务必加--verbose观察log中是否有[WARNING] No tactics available。如果有说明某层op不支持需回退到ONNX修改模型结构。我曾遇到RotaryEmbeddingop不支持最终用torch.compile预编译该模块再导出ONNX解决。3.3 INT8量化精度与速度的平衡术FP16 engine已足够快但若要榨干RTX 4060的16GB显存必须上INT8。TensorRT的INT8量化分两步校准calibration和编译。校准需准备500个代表性样本如从Alpaca数据集随机采样import numpy as np from PIL import Image class QwenCalibrator(trt.IInt8Calibrator): def __init__(self, calibration_data): super().__init__() self.calibration_data calibration_data self.current_index 0 def get_batch(self, names): if self.current_index len(self.calibration_data): batch self.calibration_data[self.current_index] self.current_index 1 return [np.ascontiguousarray(batch[input_ids].cpu().numpy())] else: return None def get_batch_size(self): return 1 # 构建calibrator calib_data [] for i in range(500): text alpaca_samples[i][instruction] alpaca_samples[i][output] inputs tokenizer(text, return_tensorspt, truncationTrue, max_length512) calib_data.append(inputs) calibrator QwenCalibrator(calib_data)编译时启用INT8$TENSORRT_HOME/bin/trtexec \ --onnxqwen2-7b.onnx \ --saveEngineqwen2-7b-int8.engine \ --int8 \ --calib./calibrator.cache \ --workspace8000 \ --minShapesinput_ids:1x1,attention_mask:1x1 \ --optShapesinput_ids:1x512,attention_mask:1x512 \ --maxShapesinput_ids:1x2048,attention_mask:1x2048INT8 engine大小降至7.2GB吞吐提升至36.8 qps但需验证精度损失用100个样本测试FP16与INT8输出logits的L2误差0.05即达标。4. vLLM部署与调度优化让GPU真正忙起来有了TRT Engine下一步是用vLLM加载并调度。这里很多人误解vLLM只能加载PyTorch模型错。vLLM 0.27.1已支持TRT-LLM backend但需额外配置。4.1 vLLM Docker镜像定制解决“镜像中不带模型”的痛点官方镜像vllm/vllm-openai:v0.27.1确实不带模型但我们可以构建自定义镜像FROM vllm/vllm-openai:v0.27.1 # 复制TRT engine和tokenizer COPY qwen2-7b-int8.engine /models/qwen2-7b/ COPY tokenizer.json /models/qwen2-7b/ COPY special_tokens_map.json /models/qwen2-7b/ # 设置启动脚本 COPY start_vllm.sh /start_vllm.sh RUN chmod x /start_vllm.sh CMD [/start_vllm.sh]start_vllm.sh内容#!/bin/bash # 启动vLLM指定TRT-LLM backend python -m vllm.entrypoints.api_server \ --model /models/qwen2-7b \ --tokenizer /models/qwen2-7b \ --tensor-parallel-size 1 \ --gpu-memory-utilization 0.85 \ --max-model-len 2048 \ --dtype auto \ --enforce-eager \ --port 8000关键参数--enforce-eager禁用CUDA Graph因为TRT engine已固化kernel--gpu-memory-utilization 0.85限制vLLM最多使用85%显存14.2GB × 0.85 ≈ 12GB为TRT engine留出空间--max-model-len 2048匹配TRT编译时的maxShapes。构建并运行docker build -t vllm-qwen2-trt . docker run -d --gpus all -p 8000:8000 vllm-qwen2-trt4.2 vLLM scheduler深度调优破解P99延迟之谜vLLM默认配置在RTX 4060上会因block_size过大导致OOM。需根据显存重新计算总显存14.2GBTRT engine占用7.2GB可用显存7.0GB每个KV Cache page4KB存储16 tokens的KV每个token KV约200 bytes最大page数 7.0GB / 4KB ≈ 1.8M pages设block_size16则最大sequence数 1.8M / 16 ≈ 112,500但实际不能设这么大因为还要预留prefill阶段显存。经实测最优配置为--block-size 32 \ --max-num-seqs 256 \ --num-scheduler-steps 1 \ --swap-space 4 \--block-size 32平衡page利用率和fragmentation--max-num-seqs 256确保256个并发request不OOM--num-scheduler-steps 1禁用multi-step scheduling降低延迟抖动--swap-space 4启用4GB CPU swap防突发OOM。注意vllm scheduler逻辑本质是维护两个queuewaiting queue新request和 running queue正在decode。scheduler每step从waiting queue取request按priority排序合并到running queue然后调用model execute。P99延迟高往往是因为waiting queue积压需调大--max-num-seqs或加节点水平扩展。4.3 性能验证与监控用真实指标说话部署后用curl压测curl http://localhost:8000/v1/completions \ -H Content-Type: application/json \ -d { model: qwen2-7b, prompt: Explain quantum computing in simple terms, max_tokens: 100 }配合nvidia-smi dmon -s u -d 1监控GPU利用率。健康指标GPU-Util稳定在85%~92%说明SM充分使用VMBUS5%说明显存带宽未瓶颈PWR115W符合RTX 4060 TDPP99 latency320ms实测298msThroughput28.3 tokens/s与trtexec测试一致。若P99超标优先检查nvidia-smi中FBframe buffer使用率是否95%若是说明显存不足需调小--block-size或--max-num-seqs。5. 常见问题与排查技巧实录那些文档不会写的坑Model-Optimizer路上90%的问题都来自环境和配置细节。以下是我在Rocky Linux 10、Ubuntu 22.04、Windows 11三平台踩过的典型问题及速查方案。5.1 驱动与CUDA相关问题速查表现象根本原因解决方案验证命令nvidia-smi has failed because it couldnt communicate with the nvidia driver驱动未加载或版本不匹配1.lsmod | grep nvidia检查模块2.dmesg | grep -i nvidia看kernel log3. 重装535.129.03驱动sudo modprobe nvidia nvidia-smiCUDA driver version is insufficient for CUDA runtime version驱动版本低于CUDA要求查CUDA官网兼容表降级CUDA或升级驱动cat /proc/driver/nvidia/versionlibcudnn.so.8: cannot open shared object fileLD_LIBRARY_PATH未包含CUDA lib64echo $LD_LIBRARY_PATH确认含/usr/local/cuda-12.2/lib64ldconfig -p | grep cudnnappdata\local\nvidia\dxcache占满C盘Windows DX shader cache异常增长删除该目录禁用NVIDIA Control Panel→3D Settings→Shader CacheGet-ChildItem $env:LOCALAPPDATA\NVIDIA\DxCache | Remove-Item -Recurse5.2 TensorRT编译问题排查问题[ERROR] ../builder/cudnnBuilder.cpp (1120) - Cudnn Error in configure: 7 (CUDNN_STATUS_MAPPING_ERROR)原因cuDNN版本与CUDA不匹配。TensorRT 10.2.0需cuDNN 8.9.7但CUDA 12.2默认带8.9.2。解决手动下载cuDNN 8.9.7 for CUDA 12.2解压后复制lib目录到/usr/local/cuda-12.2/lib64/覆盖旧文件。问题[WARNING] No tactics available for layer xxx原因某层op不支持常见于torch.nn.functional.scaled_dot_product_attention。解决在模型导出ONNX前用torch.backends.cuda.enable_flash_sdp(False)禁用flash attention改用math attention。5.3 vLLM部署问题实战指南问题OSError: unable to open shared object file: libtensorrt.so原因Docker容器内未挂载TensorRT库。解决构建镜像时COPY /opt/tensorrt/lib/* /usr/lib/或运行时docker run --gpus all -v /opt/tensorrt/lib:/usr/lib。问题RuntimeError: Expected all tensors to be on the same device原因TRT engine在GPU上但tokenizer在CPU上vLLM尝试将CPU tensor传给GPU engine。解决在start_vllm.sh中加--device cuda参数强制tokenizer在GPU上。问题vllm部署大模型chatbox无法连接原因Chatbox前端默认连http://localhost:8000但Docker容器内localhost指向容器自身。解决启动容器时加--network host或前端配置改为宿主机IP。最后分享一个小技巧在vLLM启动时加--log-level DEBUG日志会输出每个request的prefill/decode耗时这是定位P99瓶颈的黄金线索。我曾靠这个发现某次OOM是因prefill阶段显存分配失败而非decode阶段——这直接导向了调整--max-model-len参数的解决方案。Model-Optimizer没有银弹只有对每一行日志、每一个数字的敬畏。
返回列表