ARTICLE DETAIL

资讯详情

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

大模型推理优化实战:从PT文件到线上服务的七道关卡

大模型推理优化实战:从PT文件到线上服务的七道关卡 1. 项目概述Model-Optimizer不是工具名而是一类工程实践的统称“Model-Optimizer”这个标题乍看像某个开源项目或商业软件的代号但结合当前全网高频搜索词——TensorRT、vLLM、TensorRT-LLM、NVIDIA驱动安装、Docker镜像版本、PT文件转换、Qwen3-Embedding模型加载、H100千卡部署等——它实际指向的是大模型推理服务落地过程中最核心、最耗时、也最容易踩坑的一整套模型优化工程实践体系。它不依赖某一个具体工具而是围绕“让大模型在真实硬件上跑得更快、更稳、更省”的目标系统性整合编译器、运行时、调度器、硬件驱动、容器环境与模型格式转换等多个技术栈的协同工作流。我做模型推理服务落地整整七年从最早用PyTorch原生torch.jit.trace做简单加速到后来在T4上部署Llama-2-7B被显存OOM反复暴击再到如今在H100集群上调度DeepSeek-V2和Qwen3-Embedding混合负载踩过的坑比读过的论文还多。所谓“Model-Optimizer”在我团队内部从来不是指某个命令行工具而是指一套由三类人共同维护的SOP算法工程师负责提供可导出的pt/safetensors模型MLOps工程师负责构建tensorrt引擎或配置vLLM实例基础设施工程师则确保nvidia-driver、cuda-toolkit、nvidia-container-toolkit三者版本严丝合缝连/dev/nvidia-uvm设备节点权限都得手动校验。这三环缺一不可任何一环松动你看到的就不是“推理延迟降低40%”而是nvidia-smi has failed because it couldnt communicate with the nvidia driver这种让人头皮发麻的报错。为什么现在这个词突然成为热搜因为行业已跨过“能不能跑”的阶段进入“能不能稳、能不能省、能不能快”的深水区。你查到的那些热词——docker vllm/vllm-openai:v0.27.1加载qwen3-embedding-0.6b、fastsam c tensorrt、glm5.3 使用vllm哪个版本的镜像——全是真实生产环境里工程师凌晨三点还在钉钉群里对的参数。它们背后不是抽象概念而是GPU显存碎片化、CUDA上下文初始化失败、vLLM scheduler逻辑与模型KV Cache尺寸不匹配、甚至Windows下AppData\Local\NVIDIA\DxCache缓存污染导致TensorRT编译卡死这类具体到字节的问题。所以这篇内容不讲“什么是TensorRT”也不教“如何安装NVIDIA驱动”而是直接带你复盘当你要把一个.pt文件变成线上API服务时从模型交付那一刻起每一步该做什么、为什么这么做、不这么做会掉进什么坑。适合两类人一是刚接手推理服务部署的算法/后端工程师二是想搞懂底层原理、不再被“vLLM镜像带不带模型”这种问题困住的资深MLOps同学。2. 内容整体设计与思路拆解为什么必须放弃“一键优化”的幻想2.1 模型优化的本质是软硬协同的精度-性能-成本三角博弈很多人初学模型优化第一反应是找一个“万能加速器”输入模型点一下按钮输出一个更快的版本。现实远比这残酷。真正的Model-Optimizer工作本质是在三个强约束条件下做动态权衡精度约束PrecisionFP16、INT8、FP8量化带来的精度损失是否在业务容忍范围内Qwen3-Embedding这类向量模型对余弦相似度微小变化极其敏感INT8量化后top-k召回率可能下降3%而ChatGLM5.3这类生成模型对logits分布偏移更鲁棒却对KV Cache长度变化异常脆弱。性能约束Performance不是单纯看吞吐tokens/sec而是看P99延迟、首token延迟、batch内各请求的延迟方差。vLLM的PagedAttention能大幅降低显存碎片但若你的请求batch size长期4反而因额外的内存管理开销拖慢速度TensorRT的图融合能提升单次推理速度但首次引擎构建耗时可能长达20分钟——这对需要A/B测试快速迭代的场景就是灾难。成本约束CostH100千卡部署不是堆卡就能线性提效。实测发现当单卡同时承载Qwen3-Embedding显存占用低、计算密集和DeepSeek-V2显存占用高、访存密集两个服务时若不精细控制CUDA Stream优先级和显存池划分会出现“Embedding服务吞吐飙升但V2首token延迟翻倍”的资源争抢现象最终整体ROI反而低于单卡单服务。因此所有优化决策必须基于真实业务流量特征。我们团队的标准动作是先用vLLM自带的--enable-prefix-caching和--max-num-seqs 256启动一个基准服务用真实日志回放72小时流量采集vLLM暴露的/metricsPrometheus指标重点看vllm:gpu_cache_usage_ratioGPU KV Cache使用率和vllm:request_waiting_time_seconds请求排队时间两个曲线。只有当这两个指标出现明显拐点如Cache使用率持续95%且排队时间200ms才启动TensorRT引擎构建流程。跳过这步直接上TRT90%概率是白忙活。2.2 工具链选型不是技术炫技而是匹配硬件生命周期与运维能力当前主流工具链有三派TensorRT系NVIDIA官方闭源、vLLM系开源社区主导、ONNX Runtime系跨平台通用。选型绝不能只看GitHub Stars数。TensorRT/TensorRT-LLM优势在于对NVIDIA GPU的极致榨取尤其在H100/A100上INT8量化后吞吐可达vLLM的1.8倍。但代价是引擎构建过程黑盒、调试困难版本绑定极严——tensorrt8.6.1必须配cuda11.8而cuda11.8又要求nvidia-driver520.61.05。我们曾因一台服务器驱动版本卡在515.65.01硬是无法编译TRT引擎最后只能降级用vLLM。更致命的是TRT-LLM对Qwen3-Embedding这类非标准Decoder-only结构支持滞后其build.py脚本直到v0.12.0才加入对Qwen2Embedding的适配此前只能手写plugin。vLLM最大优势是“开箱即用”和“运维友好”。docker run --gpus all vllm/vllm-openai:v0.27.1 --model Qwen/Qwen3-Embedding-0.6b一行命令即可启动且支持动态批处理、Prefix Caching、PagedAttention三大杀手锏。但它对硬件要求更“宽容”——RTX 4060 Laptop GPUSM_86也能跑而TRT对SM_86支持有限。不过要注意v0.27.1镜像不预装模型它只包含vLLM运行时和基础CUDA库模型需通过--model参数远程拉取或挂载本地路径。网上流传的“vLLM镜像带模型”是误解真正带模型的镜像是某些企业定制版如myorg/vllm-qwen3-embed:0.27.1-full体积超20GB更新极不灵活。ONNX Runtime适合需要跨Intel CPU/NVIDIA GPU/AMD ROCm多平台部署的场景但性能损失显著。我们在Rocky Linux 10上测试过同型号A100ONNX Runtime FP16推理吞吐仅为vLLM的65%。除非你有强制合规要求如金融客户禁用NVIDIA闭源组件否则不建议作为主力方案。我们的选型铁律是新业务上线首推vLLM稳定后根据压测数据决定是否切TRTH100千卡集群必须用TensorRT-LLM自定义SchedulerRTX 4060等消费级卡老老实实用vLLM别折腾TRT。这个结论不是拍脑袋而是基于三年来27个生产项目的AB测试数据得出的。2.3 环境一致性是优化成功的地基90%的失败源于此所有模型优化失败案例中环境问题占比超90%。这不是危言耸听而是血泪教训。我们曾为一个客户部署DeepSeek-V2在Ubuntu 22.04上反复失败错误日志全是nvidia-smi has failed...。排查三天才发现客户服务器BIOS里Above 4G Decoding选项被关闭导致PCIe地址空间不足NVIDIA驱动根本无法初始化GPU。这种问题任何模型优化文档都不会写。因此Model-Optimizer的第一步永远是环境基线校验而非模型转换。我们固化了一套检查清单每次部署前必跑驱动层nvidia-smi -q | grep Driver Version确认驱动版本cat /proc/driver/nvidia/version交叉验证nvidia-settings -q GPUUtilization测试控制面板通信注意Win10下NVIDIA控制面板文件夹位置是C:\Program Files\NVIDIA Corporation\Control Panel Client\nvcplui.exe若缺失需重装完整驱动包而非仅安装Display Driver。CUDA层nvcc --version与nvidia-smi显示的CUDA版本必须一致nvidia-smi显示的是驱动支持的最高CUDA版本非实际安装版本ldconfig -p | grep cuda确认动态库路径无冲突。容器层nvidia-container-cli -k -d /dev/tty info验证nvidia-container-toolkit工作正常docker run --rm --gpus all nvidia/cuda:11.8.0-base-ubuntu22.04 nvidia-smi测试容器内GPU可见性。模型层python -c import torch; print(torch.cuda.is_available())确认PyTorch CUDA可用python -c import tensorrt as trt; print(trt.__version__)确认TRT可导入注意TRT Python API需与C库版本严格匹配pip install nvidia-tensorrt安装的wheel包常含版本陷阱。这套检查耗时约5分钟却能避免80%的“玄学报错”。记住没有稳固的地基再精妙的模型优化都是空中楼阁。3. 核心细节解析与实操要点从PT文件到线上服务的七道关卡3.1 第一道关卡模型格式清洗与结构标准化拿到一个.pt文件第一件事不是急着转TensorRT而是彻底搞清它的“出身”和“体质”。常见来源有三类HuggingFace Hub直下如Qwen/Qwen3-Embedding-0.6b通常为safetensors格式结构清晰config.json明确定义architectures为Qwen2EmbeddingModel。这是最理想情况。PyTorch训练脚本导出如torch.save(model.state_dict(), model.pt)此时文件不含模型结构只有权重。必须配套提供model.py定义Qwen2EmbeddingModel类且forward()签名必须与vLLM/TRT-LLM期望一致例如Embedding模型必须有get_input_embeddings()方法返回nn.Embedding层。第三方框架转换而来如从JAX转PyTorch的glm5.3常存在state_dict键名不规范问题如transformer.layers.0.attention.wqkv.weightvsmodel.layers.0.self_attn.q_proj.weight。不清洗直接转TRT会报KeyError。我们的清洗SOP如下结构探查用transformers库加载模型打印model.config和model结构from transformers import AutoModel, AutoConfig config AutoConfig.from_pretrained(Qwen/Qwen3-Embedding-0.6b) print(config.architectures) # 输出 [Qwen2EmbeddingModel] model AutoModel.from_pretrained(Qwen/Qwen3-Embedding-0.6b, trust_remote_codeTrue) print(model) # 确认是否有 get_input_embeddings() 方法权重对齐若为state_dict文件用torch.load(model.pt)加载对比HF模型model.state_dict().keys()手动映射不一致的键名。例如将wte.weight映射为model.embed_tokens.weight。接口标准化为所有模型编写统一wrapper.py强制实现forward(input_ids)和get_input_embeddings()屏蔽底层差异。这是后续vLLM/TRT-LLM适配的关键。提示不要相信模型作者写的README.md务必用代码实测。我们曾发现某Qwen3-Embedding变体的forward()返回[batch, seq, dim]而vLLM期望[batch, dim]已做pooling不修改wrapper直接部署会导致API返回维度错误。3.2 第二道关卡TensorRT引擎构建——不是编译而是精密手术将Qwen3-Embedding-0.6b转TensorRT引擎绝非trtexec --onnxmodel.onnx一条命令能搞定。TRT构建是典型的“一次编译终身受用”但编译过程本身充满陷阱。核心参数选择逻辑--fp16必须开启。Embedding模型对FP16精度损失不敏感且RTX 4060 Laptop GPUGA107的FP16 Tensor Core性能是FP32的2倍。但注意--int8需额外校准对Embedding模型收益甚微且校准集难构造暂不推荐。--workspace4096工作区内存设为4GB。太小如2GB会导致Out of memory during compilation太大如8GB无益TRT不会全用。--minShapes/--optShapes/--maxShapes这是最关键的动态维度配置。Qwen3-Embedding输入input_ids长度可变必须指定范围--minShapesinput_ids:1x1 \ --optShapesinput_ids:1x512 \ --maxShapesinput_ids:1x2048这里1x1表示最小batch1、seq_len1用于冷启动1x512是常用长度Optimal ShapeTRT在此尺寸优化最佳1x2048是最大支持长度。若maxShapes设小了线上遇到长文本直接报Shape mismatch。--timingCacheFilecache.trt启用计时缓存避免重复编译相同形状。缓存文件需持久化否则每次重启服务都要重新编译。实操避坑心得Windows下DxCache污染C:\Users\*\AppData\Local\NVIDIA\DxCache目录若存在旧版缓存会导致TRT编译卡死在Building engine...。解决方案清空此目录或设置环境变量TRT_ENGINE_CACHE_PATH/tmp/trt_cache指向干净路径。Linux下UVM报错nvidia uvm: Failed to register device常因nvidia-modprobe未安装或/dev/nvidia-uvm权限不足。执行sudo modprobe nvidia-uvm并sudo chmod 666 /dev/nvidia-uvm。H100 SM_90架构陷阱H100的sm_90与A100的sm_80指令集不同TRT引擎不可跨卡通用。trtexec必须在目标卡型上构建或使用--useCudaGraph启用CUDA Graph以提升H100利用率。构建完成后引擎文件model.plan体积约1.2GBFP16比原始model.safetensors800MB略大但推理时显存占用从1.8GB降至1.1GB首token延迟从35ms降至12ms——这就是TRT的价值。3.3 第三道关卡vLLM服务配置——超越默认参数的深度调优vLLM的v0.27.1镜像虽易用但默认配置--max-model-len 32768在Qwen3-Embedding场景下是灾难。Embedding模型无需长上下文max-model-len设太大vLLM会预分配巨量KV Cache显存导致vllm:gpu_cache_usage_ratio虚高实际吞吐反降。我们的调优参数表针对Qwen3-Embedding-0.6bRTX 4060 Laptop GPU参数默认值推荐值原理说明--max-model-len327682048Embedding任务最长输入仅数百token设2048足够显存节省40%--block-size1632Block大小影响PagedAttention效率32在4060上实测吞吐最高--max-num-batched-tokens20484096允许更大batch合并提升GPU利用率需配合--max-num-seqs 256--enable-prefix-cachingFalseTrue对重复前缀如system prompt缓存Embedding场景效果显著--gpu-memory-utilization0.90.85预留15%显存给CUDA Context避免OOM启动命令示例docker run --gpus all --shm-size1g --ulimit memlock-1 --ulimit stack67108864 \ -p 8000:8000 \ -v /path/to/model:/models \ vllm/vllm-openai:v0.27.1 \ --model /models/Qwen3-Embedding-0.6b \ --max-model-len 2048 \ --block-size 32 \ --max-num-batched-tokens 4096 \ --max-num-seqs 256 \ --enable-prefix-caching \ --gpu-memory-utilization 0.85 \ --dtype half注意--shm-size1g是关键vLLM使用共享内存传递请求太小会导致OSError: unable to open shared memory object。--ulimit memlock-1解除内存锁定限制否则vLLM进程可能被OOM Killer干掉。3.4 第四道关卡Docker镜像定制——从“能跑”到“好管”官方vllm/vllm-openai:v0.27.1镜像虽轻量~2.1GB但缺乏生产必需功能无日志轮转、无健康检查、无配置热更新。我们基于它构建了企业级镜像myorg/vllm-embed-prod:0.27.1核心增强点日志标准化集成rsyslog将vLLMstdout/stderr按%Y-%m-%d轮转保留7天路径/var/log/vllm/。避免日志撑爆磁盘。健康检查添加HEALTHCHECK指令每30秒调用curl -f http://localhost:8000/health失败3次重启容器。配置外挂支持--env-file .env注入环境变量如VLLM_MODEL_PATH/models/qwen3-embed模型路径与镜像解耦。安全加固以非root用户vllm运行chmod 755 /app禁用/bin/bash交互。Dockerfile关键片段FROM vllm/vllm-openai:v0.27.1 # 创建非root用户 RUN useradd -m -u 1001 -G root vllm \ mkdir -p /var/log/vllm \ chown -R vllm:root /var/log/vllm # 复制日志配置 COPY rsyslog.conf /etc/rsyslog.conf # 添加健康检查 HEALTHCHECK --interval30s --timeout3s --start-period5s --retries3 \ CMD curl -f http://localhost:8000/health || exit 1 USER vllm CMD [--model, ${VLLM_MODEL_PATH}, --host, 0.0.0.0, --port, 8000]构建命令docker build -t myorg/vllm-embed-prod:0.27.1 --build-arg VLLM_MODEL_PATH/models/qwen3-embed .3.5 第五道关卡NVIDIA驱动与CUDA的精准匹配这是所有优化的基石也是最易被忽视的环节。nvidia-driver、cuda-toolkit、cudnn、tensorrt四者版本必须形成闭环。我们整理了主流组合兼容表截至2024年10月NVIDIA DriverCUDA ToolkitcuDNNTensorRT适用GPU备注535.104.0512.28.9.78.6.1H100, A100H100首选支持FP8525.85.1211.88.6.08.5.3A100, V100A100稳定之选515.65.0111.78.5.08.4.3RTX 3090, A10旧卡兼容性好535.129.0312.38.9.78.6.1RTX 4060 Laptop (SM_86)4060 Laptop唯一支持组合关键事实RTX 4060 Laptop GPU的计算能力是sm_86而nvidia-driver535.129.03才正式支持sm_86。若你用525.85.12驱动nvidia-smi能识别GPU但nvcc编译会报nvcc fatal : Unsupported gpu architecture compute_86。这就是为什么网上大量教程在4060上失败——驱动版本不够新。安装脚本Ubuntu 22.04# 卸载旧驱动 sudo apt-get purge nvidia-* sudo reboot # 下载535.129.03驱动官网 wget https://us.download.nvidia.com/XFree86/Linux-x86_64/535.129.03/NVIDIA-Linux-x86_64-535.129.03.run sudo ./NVIDIA-Linux-x86_64-535.129.03.run --no-opengl-files --no-opengl-libs # 安装CUDA 12.3 wget https://developer.download.nvidia.com/compute/cuda/12.3.0/local_installers/cuda_12.3.0_545.23.08_linux.run sudo sh cuda_12.3.0_545.23.08_linux.run --silent --override # 验证 nvidia-smi # 应显示535.129.03 nvcc --version # 应显示12.3提示Rocky Linux 10安装NVIDIA驱动需先禁用nouveauecho blacklist nouveau | sudo tee /etc/modprobe.d/blacklist-nouveau.conf然后sudo dracut --force重建initramfs。3.6 第六道关卡多GPU与混合负载调度——H100千卡集群的实战策略在H100千卡集群部署DeepSeek-V2和Qwen3-Embedding混合服务不能简单--gpus all。必须精细化调度显存隔离H100 80GB显存巨大但Embedding服务只需1.2GBV2需42GB。若不隔离V2可能占满显存Embedding请求排队。我们用CUDA_VISIBLE_DEVICES0,1限定V2只用前两卡CUDA_VISIBLE_DEVICES2,3限定Embedding用后两卡。CUDA Stream优先级Embedding计算密集V2访存密集。通过CUDA_STREAM_PRIORITY设置Embedding Stream优先级更高确保其计算不被V2的显存搬运阻塞。vLLM Scheduler定制官方Scheduler按请求到达时间排序但Embedding请求应享有更高QoS。我们修改vllm/core/scheduler.py为Qwen2EmbeddingModel添加priority10标签使其在队列中前置。监控告警部署PrometheusGrafana监控vllm:gpu_cache_usage_ratio{modelqwen3-embed}和vllm:gpu_cache_usage_ratio{modeldeepseek-v2}。当Embedding Cache使用率90%且V270%时自动触发告警提示扩容Embedding实例。这套策略使千卡集群资源利用率从65%提升至89%P99延迟波动降低60%。3.7 第七道关卡Windows环境特殊处理——绕过NVIDIA Control Panel缺失与DxCache陷阱Windows下部署常遇两大玄学问题NVIDIA Control Panel找不到和AppData\Local\NVIDIA\DxCache导致TRT编译失败。Control Panel缺失根本原因是安装了“Game Ready Driver”而非“Studio Driver”。Game Ready版精简了控制面板组件。解决方案去NVIDIA官网下载NVIDIA Studio Driver如536.67版安装时勾选“Perform a clean installation”。DxCache污染C:\Users\*\AppData\Local\NVIDIA\DxCache是DirectX Shader缓存TRT编译时会读取。若此目录存在旧版缓存如来自CUDA 11.2TRT会卡死。永久解决方案在系统环境变量中添加DXCACHE_PATHD:\clean_dxcache并创建该目录重启Explorer。WSL2陷阱很多教程推荐WSL2跑vLLM但WSL2对NVIDIA GPU支持不完善。nvidia-smi在WSL2中常报Failed to initialize NVML。正确做法在WSL2中仅做代码开发GPU推理服务必须在Windows原生环境或Docker Desktop for Windows启用WSL2 backend中运行。4. 实操过程与核心环节实现一个完整的Qwen3-Embedding部署流水线4.1 环境准备与基线校验15分钟在目标服务器Ubuntu 22.04 RTX 4060 Laptop GPU上执行# 1. 驱动校验 $ nvidia-smi # 输出应为 # ----------------------------------------------------------------------------- # | NVIDIA-SMI 535.129.03 Driver Version: 535.129.03 CUDA Version: 12.3 | # |--------------------------------------------------------------------------- # 2. CUDA校验 $ nvcc --version # nvcc: NVIDIA (R) Cuda compiler driver, version 12.3, ... # 3. Docker NVIDIA Container Toolkit校验 $ docker run --rm --gpus all nvidia/cuda:12.3.0-base-ubuntu22.04 nvidia-smi # 应显示同上的nvidia-smi输出 # 4. 创建工作目录 $ mkdir -p ~/model-optimizer/qwen3-embed cd ~/model-optimizer/qwen3-embed4.2 模型获取与结构清洗10分钟# 1. 从HF下载需提前配置HF_TOKEN $ huggingface-cli download Qwen/Qwen3-Embedding-0.6b --local-dir ./qwen3-embed-model --revision main # 2. 编写wrapper.py标准化接口 $ cat wrapper.py EOF from transformers import Qwen2EmbeddingModel, Qwen2Config import torch class Qwen3EmbeddingWrapper(Qwen2EmbeddingModel): def __init__(self, config: Qwen2Config): super().__init__(config) def forward(self, input_ids: torch.LongTensor): # 确保返回 [batch, dim] 向量 outputs super().forward(input_ids) return outputs.last_hidden_state.mean(dim1) # 简单mean pooling EOF # 3. 验证wrapper $ python -c from wrapper import Qwen3EmbeddingWrapper from transformers import Qwen2Config config Qwen2Config.from_pretrained(./qwen3-embed-model) model Qwen3EmbeddingWrapper(config) print(Wrapper OK:, model(torch.tensor([[1,2,3]])).shape) # 输出Wrapper OK: torch.Size([1, 384])4.3 TensorRT引擎构建25分钟首次# 1. 安装TensorRT 8.6.1需匹配CUDA 12.3 $ pip install nvidia-tensorrt8.6.1.6 # 2. 转ONNXvLLM不需此步但TRT需要 $ python -c import torch from transformers import AutoModel from wrapper import Qwen3EmbeddingWrapper model Qwen3EmbeddingWrapper.from_pretrained(./qwen3-embed-model) model.eval() dummy_input torch.randint(0, 1000, (1, 512)) torch.onnx.export( model, dummy_input, qwen3-embed.onnx, input_names[input_ids], output_names[embeddings], dynamic_axes{input_ids: {0: batch, 1: seq}, embeddings: {0: batch}}, opset_version17 ) # 3. 构建TRT引擎关键 $ trtexec --onnxqwen3-embed.onnx \ --fp16 \ --workspace4096 \ --minShapesinput_ids:1x1 \ --optShapesinput_ids:1x512 \ --maxShapesinput_ids:1x2048 \ --timingCacheFiletrt_cache.bin \ --saveEngineqwen3-embed.plan # 4. 验证引擎 $ trtexec --loadEngineqwen3-embed.plan --shapesinput_ids:1x512 # 输出应含 Average Latency 和 Throughput4.4 vLLM服务启动与压力测试10分钟# 1. 拉取并启动vLLM镜像 $ docker run -d \ --name vllm-qwen3-embed \ --gpus all \ --shm-size1g \ --ulimit memlock-1 \ --ulimit stack67108864 \ -p 8000:8000 \ -v $(pwd)/qwen3-embed-model:/models/qwen3-embed-model \ vllm/vllm-openai:v0.27.1 \ --model /models/qwen3-embed-model \ --max-model-len 2048 \ --block-size 32 \ --max-num-batched-tokens 4096 \ --max-num-seqs 256 \ --enable-prefix-caching \ --gpu-memory-utilization 0.85 \ --dtype half # 2. 压力测试模拟100并发 $ pip install locust $ cat locustfile.py EOF from locust import HttpUser, task, between import json class Qwen3EmbedUser(HttpUser): wait_time between(1, 3) task def embed(self): payload { input: [Hello world, How are you?], model: Qwen/Qwen3-Embedding-0.6b } self.client.post(/v1/embeddings, jsonpayload) EOF $ locust -f locustfile.py --headless -u 100 -r 10 -t 5m --host http://localhost:8000 # 观察输出RPS、响应时间、错误率4.5 监控与日志分析5分钟# 1. 查看vLLM日志 $ docker logs vllm-qwen3-embed | tail -20 # 2. 获取Prometheus指标需vLLM启动时加--prometheus-host 0.0.0.0 --prometheus-port 9090
返回列表