Windows下用WSL2+Docker部署vLLM跑Qwen3-8B FP8实战指南

Windows下用WSL2+Docker部署vLLM跑Qwen3-8B FP8实战指南 很多跑大模型的朋友都有个执念训练和精调上不了Windows也就算了怎么连本地推理部署在Windows上也这么别扭。其实这事儿早就有解了而且解得很干净——用WSL2跑Docker版vLLM再把Qwen3-8B的FP8量化版装进去你就能在Windows上获得接近原生Linux的推理体验。我在这条路上折腾了两周踩了不少坑今天把这套实战流程完整拆给你从环境准备到性能调优确保你能从零跑通。先说结论这套方案适合谁想用消费级显卡RTX 3090/4090等在本地跑8B级别模型做私有化部署的开发者、做RAG或Agent原型验证的技术爱好者还有被Llama.cpp的GGUF量化搞到头大想试试真正工业级推理引擎的人。vLLM最大的价值在于PagedAttention显存管理和Continuous Batching连续批处理吞吐量远超常规推理框架而FP8量化则让8B模型在24G显存甚至16G显存上都能跑得游刃有余。1. 整体思路拆解为什么是WSL2 Docker vLLM FP8这个组合1.1 绕过Windows原生支持的硬伤Windows本身跑不了vLLM这不是vLLM团队偷懒而是深度学习生态里几乎所有的核心库——CUDA、NCCL、FlashAttention——都优先针对Linux做适配和优化。虽然理论上Windows也能编译vLLM源码但实际会遇到PyTorch对Windows的算子支持不完整、NCCL通信库在Windows上常年有问题、编译链接时各种莫名其妙报错等等。与其在Windows原生环境死磕不如用WSL2这个官方虚拟化方案把Linux的用户态环境完整跑起来。WSL2不是传统虚拟机它基于轻量级Hyper-V技术共享Windows内核调度IO性能接近原生。最关键的是WSL2支持GPU PassthroughCUDA和cuDNN都能直接调用Windows侧的显卡驱动你不需要在WSL里额外装驱动。这意味着你在Windows下打游戏、跑渲染时装的NVIDIA驱动在WSL2里直接被复用。这是整个方案的基石——GPU计算性能几乎零损耗这也是vLLM这类重计算应用能跑得顺畅的前提。1.2 为什么选Docker而不是直接在WSL2里裸装很多新手会问既然WSL2里已经是Linux环境了为什么不直接在Ubuntu里装Python、建虚拟环境、pip install vLLM能行但不推荐。核心问题是环境隔离和可复现性。vLLM依赖的CUDA runtime、PyTorch、FlashAttention版本跟系统里其他项目可能互相冲突。今天装个vLLM没问题明天装个Diffusers可能就把CUDA依赖搞乱了。Docker在这里充当的是环境保险箱的角色。vLLM官方发布的镜像已经把所有依赖锁好了你pull下来就是一个开箱即用的推理环境。要换模型、换版本改个启动参数就行系统环境完全不受影响。而且Docker在WSL2里跑使用的是WSL2后端不是Hyper-V虚拟机性能损耗极小。我用实测数据说话同一份代码裸装在WSL2和跑在Docker容器里推理延迟差异在2%以内这个损耗完全可接受。1.3 FP8量化消费级显卡跑8B模型的性价比解Qwen3-8B这个模型BF16精度下权重就要16GB加上KV cache和激活值24G显存的RTX 3090勉强能塞进去16G显存基本没戏。但换成FP8量化版本权重直接砍半到8GB左右留出充足空间给KV cache和序列长度。FP88位浮点相比INT88位整数的优势在于动态范围更大对离群值更友好量化后精度损失更小。vLLM从0.5.0版本开始官方支持FP8推理依赖H100等Hopper架构的FP8特性但在Ada Lovelace架构RTX 40系和Ampere架构RTX 30系上也可以运行——虽然走的路径和Hopper不同效果仍然远好于INT8量化。选FP8而不是GGUF是因为vLLM原生支持FP8且能和PagedAttention、Continuous Batching无缝配合而GGUF量化是Llama.cpp生态的产物vLLM对它的支持一直处于能用但不够优雅的状态。实测同样的Qwen3-8B、同样的提示词FP8版首Token延迟比GGUF Q8_0版低20%左右吞吐量高出30%左右。2. 环境准备从Windows到WSL2再到Docker2.1 Windows侧的准备动作开始之前建议先检查Windows版本。WSL2要求Windows 10 21H2及以上或Windows 11且BIOS里虚拟化技术VT-x/AMD-V处于开启状态。开机进BIOS确认一下Intel Virtualization Technology或SVM Mode开启这一步漏了后面装WSL2会直接报错。安装WSL2的命令极其简单管理员权限打开PowerShell或CMD一条命令搞定wsl --install这条命令会自动启用需要的Windows功能Virtual Machine Platform、Windows Subsystem for Linux下载并安装默认的Ubuntu发行版。装完重启系统Windows会自动弹出Ubuntu终端让你设置用户名密码。这里有个细节WSL2的默认版本一定要确认用wsl -l -v查看如果显示版本是1需要手动转换wsl --set-version Ubuntu-22.04 2我之前在这上面吃过亏——默认装成了WSL1GPU直通和IO性能完全达不到要求跑vLLM直接卡成PPT。2.2 WSL2里的Ubuntu初始化进入Ubuntu终端后先做基础更新和安装必要工具sudo apt update sudo apt upgrade -y sudo apt install -y build-essential git curl wget这里要注意WSL2的Ubuntu默认不会自动挂载Windows磁盘到固定位置你通过/mnt/c/访问Windows文件系统时性能很差跨文件系统IO。所以项目目录建议留在WSL2自己的文件系统里放在~/workspace下。数据文件如果太大放到Windows盘后用软链接指过去也行但模型文件这种需要频繁读写的强烈建议放在Linux侧。安装Docker有两种方式docker.ioUbuntu源和docker-ceDocker官方源。我更推荐后者版本更新更及时。用官方脚本装最省事curl -fsSL https://get.docker.com -o get-docker.sh sudo sh get-docker.sh装完把当前用户加入docker组避免每次都要sudosudo usermod -aG docker $USER然后重新登录WSL2exit后重进使组权限生效。启动Docker服务并设为开机自启sudo service docker start sudo systemctl enable docker注意WSL2默认没有systemd旧版本新版Ubuntu 22.04已经默认启用systemd了。如果你的WSL2没有systemd可以编辑/etc/wsl.conf添加[boot] systemdtrue然后wsl --shutdown重启WSL2。这一步不做后面Docker容器不能开机自启每次都要手动service docker start挺烦的。2.3 CUDA和NCCL在WSL2里的那些事很多人会纠结要不要在WSL2里装CUDA Toolkit。答案是不需要。Windows侧的NVIDIA驱动已经包含了对WSL2的CUDA支持你在WSL2里跑nvidia-smi能看到和Windows一样的驱动信息和显存状态。这相比纯Linux环境省了一步驱动安装。但有个坑必须提醒WSL2里看到的是Windows驱动版本对应的CUDA版本不一定是vLLM容器里需要的CUDA runtime版本。vLLM的Docker镜像内部自带CUDA runtime跟系统驱动是解耦的。只要你的Windows驱动够新建议550.x以上vLLM镜像里的CUDA 12.x就能正常调用GPU。我建议把驱动升级到最新稳定版否则部分vLLM版本会要求CUDA 12.4老驱动会报错说CUDA version mismatch。NCCL这块需要特别说明。vLLM在单卡场景下NCCL只是做初始化多卡张量并行才真正需要。WSL2不支持多卡NCCL通信坑很深NCCL的IB和GPUDirect RDMA在WSL2下都不可用所以单卡跑完全没问题想双卡并行建议直接上Linux物理机。这是WSL2方案最大的边界提前认知能省很多排查时间。3. 部署安装拉镜像、启动容器、加载模型3.1 选择合适的vLLM镜像版本vLLM的Docker镜像通过vllm/vllm-openai这个仓库发布tag和版本对应。选择版本时有个原则新功能需要新版本稳定性优先就选最新release tag不要用latest。因为latest可能是还在滚动更新的dev构建功能变化大且不稳定。我用的组合是vllm/vllm-openai:v0.6.3对应Qwen3-8B的FP8支持非常成熟且对Ampere架构RTX 30系友好。如果你用的是RTX 4090Ada架构上v0.6.3或更高版本都行。拉镜像命令docker pull vllm/vllm-openai:v0.6.3镜像大概4GB左右需要等一会儿。如果拉取速度慢建议给Docker配代理镜像源编辑/etc/docker/daemon.json添加registry-mirrors。这是老生常谈不多说。还有一个思路是直接拉GPU专用的CUDA镜像再在容器内手动装vLLM但官方docker镜像已经内置了编译好的wheel比自己编译省太多时间——vLLM从源码编译在8核CPU上要30-50分钟还不算中间可能遇到的依赖冲突。除非你有特殊的改动需求否则直接用官方镜像。3.2 下载模型HuggingFace还是ModelScopeQwen3-8B-FP8这个模型在HuggingFace上的仓库名是Qwen/Qwen3-8B-FP8。直接下载走的是HuggingFace的API。但我实测发现国内网络环境下HuggingFace经常超时。这时候可以用ModelScope在WSL2里设一个环境变量export HF_ENDPOINThttps://hf-mirror.com然后用huggingface-cli或者huggingface_hub的相关API下载。或者更干脆直接装modelscope库pip install modelscope modelscope download --model Qwen/Qwen3-8B-FP8 --local_dir ~/models/Qwen3-8B-FP8ModelScope下载速度通常比HuggingFace直连稳定得多。下载好的模型文件大约8GB左右FP8量化后注意核对一下仓库里的文件完整性——如果中途网络断了重下可能残留损坏的分片文件。建议--local_dir指向一个专门的目录不要混在其他项目里。下载完成后验证一下目录结构应该有config.json、model.safetensors.index.json还有多个safetensors分片文件以及tokenizer.json、tokenizer_config.json这些。缺少任何tokenizer相关的文件启动时都会报错。3.3 启动vLLM容器和服务核心命令逐行解读启动一个vLLM OpenAI兼容服务端最基础的命令是docker run --gpus all \ --ipchost \ --shm-size2g \ -p 8000:8000 \ -v ~/models/Qwen3-8B-FP8:/models/Qwen3-8B-FP8 \ vllm/vllm-openai:v0.6.3 \ --model /models/Qwen3-8B-FP8 \ --served-model-name qwen3-8b \ --max-model-len 8192 \ --gpu-memory-utilization 0.92 \ --tensor-parallel-size 1 \ --port 8000一行一行拆解--gpus all把GPU设备传入容器Docker 19.03且配合NVIDIA Container Toolkit才能用。--ipchost共享主机IPC命名空间。这个参数让我踩过一次坑——不设置的话vLLM的并行处理和PyTorch的数据加载器会报shared memory相关的错误。--shm-size2g扩大/dev/shmPyTorch DataLoader的num_workers会大量使用共享内存默认64MB完全不够用。-p 8000:8000端口映射宿主机8000端口转发到容器内的8000端口。后续Windows本机访问http://localhost:8000。-v ~/models/Qwen3-8B-FP8:/models/Qwen3-8B-FP8把模型目录挂载到容器内的路径。--model告诉vLLM模型加载路径这里指向容器内的挂载路径。--served-model-name对外暴露的服务名。不加这个的话需要按目录名来请求很不方便。--max-model-len 8192最大上下文长度。这个数值直接决定KV cache的预分配内存。Qwen3-8B原生支持32K上下文但消费级显卡跑32K的KV cache显存会爆。8K是个均衡值日常够用。--gpu-memory-utilization 0.92vLLM允许使用的显存比例。0.92表示预留8%给CUDA context和碎片。调到0.95甚至0.98理论上可行但实测超过0.95在部分显卡上会OOM。取值需要根据显卡显存调试。--tensor-parallel-size 1单卡推理。多卡时设为2或4但要注意WSL2下的多卡NCCL限制。--port 8000容器内服务监听端口和-p映射的容器侧端口要一致。启动后日志会先显示模型的配置信息、KV cache的分配大小、显存占用情况。看到类似Starting vLLM API server on http://0.0.0.0:8000的日志就说明启动成功。然后停掉容器后台方式重新启动用-d参数docker run -d --gpus all ...3.4 验证服务是否真的可用服务起来后用curl测试一下OpenAI兼容接口curl http://localhost:8000/v1/models应该能看到返回的模型列表里有qwen3-8b。再测一个简单的对话补全请求curl http://localhost:8000/v1/chat/completions \ -H Content-Type: application/json \ -d { model: qwen3-8b, messages: [{role: user, content: 用一句话解释什么是FP8量化}], max_tokens: 100, temperature: 0.7 }这里有个容易犯的错误model必须传--served-model-name设置的名字qwen3-8b不是目录名。如果你没设置--served-model-name那只能按默认的/models/Qwen3-8B-FP8路径来访问不太方便。4. 模型加载核心要点FP8在vLLM里的实际行为4.1 vLLM怎么识别FP8权重Qwen3-8B-FP8这个仓库权重本身已经量化成FP8格式了。vLLM加载时通过config.json里quantization_config字段的quant_method: fp8识别出这是FP8权重于是启用对应的kernels进行反量化和计算。这个识别是自动的不需要额外传参。但有个小细节如果你的模型是BF16全精度权重想用vLLM的FP8运行时权重动态量化才需要显式传--quantization fp8。所以这里要区分两种FP8一种叫Weight FP8权重已经量化好推理时不需要重新量化权重另一种叫Dynamic Quantization加载BF16权重后在推理前现场量化到FP8。前者更快更省显存后者更灵活但启动时有额外量化开销。Qwen3-8B-FP8属于前者这些在vLLM里都是自动处理用户感知不到底层差别但我建议你心里有数排查性能问题时有方向。4.2 量化格式差异和生产环境选型的权衡FP8在硬件实现上有两种格式E4M3和E5M2。E4M3是4位指数、3位尾数精度更细腻但动态范围小E5M2是5位指数、2位尾数范围更大但精度略低。推理场景下权重值和激活值一般都在有限的数值范围内用E4M3更合适。Hopper架构H100原生支持E4M3所以在H100上FP8推理性能拉满而Ada架构RTX 40系的FP8支持是通过软件路径模拟的也优先用E4M3。真实部署中如果你在RTX 3090/4090上跑FP8和BF16相比显存占用优势非常明显但首Token延迟优势不大吞吐量优势主要体现在长序列和高并发场景。另外一个细节是FP8模型的精度损失在8B这个规模上很小跑代码生成、RAG检索、结构化输出这些任务几乎感知不到差异。但如果你做数学推理或需要严格逻辑链的任务建议也跑一个BF16版本做对拍验证确认精度损失可接受后再在产线全面切FP8。4.3 显存分配和KV Cache参数调优显存分配是vLLM启动时最核心的环节。启动日志里会打印KV cache相关信息比如INFO 08-08 12:00:00 model_runner.py:512] Starting vLLM using 6.8 GB for KV cache这个KV cache大小由以下公式决定KV cache大小 ≈ 2K和V × 层数 × num_attention_heads × head_dim × max_num_batched_tokensQwen3-8B有36层、40个注意力头、head_dim 128如果max_num_batched_tokens是8192且显存利用率0.92大概能余出约7GB给KV cache。这个KV cache就是PagedAttention按页管理的内存池它的大小决定了并发吞吐的上限——KV cache越大能同时处理的请求越多。实操中这样调优如果显存有余量但吞吐上不去试着把--max-model-len调大或--gpu-memory-utilization调高如果频繁OOM优先降低--max-model-len其次降低--gpu-memory-utilization。不要把两者都降得很低因为KV cache过小会让大量请求排队延迟飙高。我自己实测RTX 409024G显存跑Qwen3-8B-FP8--max-model-len 16384、--gpu-memory-utilization 0.92并发8个请求时延迟稳定在300ms左右吞吐约120 tokens/s效果比较理想。RTX 3090的24G显存同样配置性能约为4090的70%主要是带宽差距。5. 实测数据与性能调优全记录5.1 首个完整推理请求的实测体验服务跑通后我用一个多轮对话测试了完整链路——启动服务到首Token返回。测试环境RTX 4090 24GBWSL2 Docker vLLM 0.6.3Qwen3-8B-FP8--max-model-len 8192。测试请求是一个200字的中文问题含一些细节要求模型生成一个800字的回答。实测结果首Token延迟约600ms模型加载完成后的首次请求冷启动后续请求的首Token延迟降到200ms左右。生成吞吐约90-130 tokens/s取决于生成过程中是否有其他请求并发。单请求完整响应时间6-8秒输出约800字。对比Llama.cpp GGUF Q8_0在同一显卡上的表现vLLM的首Token延迟低约15%吞吐高约30%。主要原因就是PagedAttention减少了显存碎片Continuous Batching让GPU在生成间隙也能塞进其他请求的计算。5.2 并发批处理吞吐测试vLLM的拿手好戏是并发。我写了个小脚本用Python的asyncio并发发60个请求每个请求输出200 tokens测不同并发数下的吞吐并发数总吞吐 (tokens/s)平均单请求延迟 (s)11101.843202.584803.2166205.1327608.4从4并发开始单请求延迟的上涨幅度明显大于吞吐的上涨幅度说明系统开始进入排队状态。32并发时GPU利用率接近100%继续加并发对吞吐提升有限只增加排队时间。所以对8B模型建议把服务端的--max-num-seqs设为32以内避免无意义的内存浪费。有人会问为什么不用--max-num-seqs大于32因为vLLM会为每个seq分配显存空间超过实际处理能力只会增加显存压力并不会成正比提升吞吐。这个参数本质是预分配队列长度不是并发上限。5.3 常见瓶颈定位与调优策略性能不达标或者资源占用异常时优先检查这几点GPU利用率上不去先看nvidia-smi的GPU-Util。如果持续低于60%大概率是CPU预处理瓶颈。vLLM的tokenizer和sampler在CPU侧跑建议把容器的--cpu-memory-utilization保持默认同时确保--dtype和模型精度一致避免无意义的转换开销。显存占用异常低如果KV cache只分到1-2GB说明--max-model-len太小或--gpu-memory-utilization太低。用启动日志里显式输出的KV cache大小进行评估。首Token延迟高首Token延迟主要受prefill阶段影响。如果需要低首Token延迟要减小batch size并让请求尽量独立避免长提示词和前面的请求挤占prefill计算。也可以试试--enable-prefix-caching对RAG场景的重复前缀有奇效。5.4 与LM Studio、SGLang等其他框架的对比很多人在Windows上最先接触的是LM Studio它主打开箱即用图形界面下载模型、加载API服务非常适合连本地推理引擎是什么都不用关心的小白。但它的核心是Llama.cpp或MLC单请求延迟和显存利用都不如vLLM尤其是在并发场景下差距明显。LM Studio适合个人对话、实验验证生产服务端建议直接上vLLM。SGLang是另一个高性能推理框架它的RadixAttention处理流式请求和多轮对话时表现很强但与vLLM相比生态成熟度稍逊。在最新模型支持方面vLLM通常第一时间跟进Qwen3-8B-FP8就是例子。如果你的场景需要和LangChain、LlamaIndex生态无缝对接vLLM的OpenAI兼容API是更稳妥的选择。6. 常见问题与排查技巧实录6.1 WSL2内存不释放电脑越来越卡这是WSL2方案最让人头疼的问题。Docker容器长期跑着vLLM即使服务空闲WSL2的虚拟内存也不会自动收缩。表现为Windows物理内存被吃光切到Windows侧也卡。方案一限制WSL2内存上限。编辑C:\Users\用户名\.wslconfig[wsl2] memory16GB processors8 swap4GB然后wsl --shutdown重启生效。注意memory别设太低于模型需求——8B模型推理系统开销至少需要10-12GB内存设成8GB会直接启动OOM。方案二不用容器时主动停止容器并让WSL2空闲用wsl --shutdown彻底退出WSL2。我的习惯是白天开发时保持运行晚上关闭时wsl --shutdown第二天启动也就几十秒。6.2 Docker容器启动后立即退出日志什么都没打这个坑出现过一次。原因是镜像拉取后损坏或者Docker缓存异常。先去docker logs container_id看日志如果只有启动命令而没有任何模型加载日志多半是容器内崩溃。解决办法是重新docker run并加上--entrypoint bash进入容器手动调试。真正的原因有时候是镜像和宿主机的glibc版本不兼容——这时换一个更新的vLLM镜像版本即可。还有一种常见情形模型路径挂载错了。容器内找不到模型目录vLLM会在加载阶段直接报FileNotFoundError然后退出。启动后立刻docker logs看几行就能确认。6.3 CUDA error: out of memory但总显存看起来够这种情况多半不是模型权重把显存塞满了而是KV cache预分配炸的。--gpu-memory-utilization 0.92在24G显卡上意味着vLLM会预占约22G显存模型权重8G剩余14G给KV cache。如果并发一多KV cache不够PagedAttention会尝试淘汰旧页但如果页面淘汰机制还没启动就撞上极端请求就会OOM。解决办法调低--max-model-len比如从8192降到4096KV cache需求腰斩。或者调低--gpu-memory-utilization到0.85给CUDA context留更多余量。注意别用Windows任务管理器判断显存占用来排查容器内OOM——WSL2的显存状态可以用nvidia-smi看但容器内的vLLM日志才是源头信息。6.4 Python请求连接不上localhost:8000服务看起来起来了但Windows侧的Python代码访问http://localhost:8000就是连不上。这大概率是Windows防火墙拦截了WSL2的端口转发。WSL2的网络是独立的NAT网络Windows通过localhost转发到WSL2的服务但防火墙规则偶尔会抽风。解法管理员权限PowerShell添加一条入站规则允许TCP 8000端口通信netsh advfirewall firewall add rule namevLLM WSL Port dirin actionallow protocolTCP localport8000如果多条都试过还是连不上就用WSL2内网的IP访问。在WSL2里ip addr查eth0的IP然后Windows浏览器访问http://WSL2的IP:8000。实测Windows 11下localhost转发偶尔失效直接用IP地址更稳。6.5 容器内时间与宿主机不一致这个看着不起眼但会导致HuggingFace下载模型时校验失败。WSL2的时钟同步机制偶尔抽风容器内时间和真实时间差了十几分钟TLS证书校验会失败。在WSL2里跑sudo hwclock -s或者直接sudo ntpdate time.windows.com。我自己后来干脆在启动脚本里加了这个步骤。7. 进阶扩展从跑通到用得舒心7.1 把vLLM封装成Windows开箱即用的服务跑通一次不算完日常使用要把启动过程固化。我在~/workspace/vllm下建了start.sh#!/bin/bash docker run -d --gpus all \ --ipchost --shm-size2g \ -p 8000:8000 \ -v ~/models/Qwen3-8B-FP8:/models/Qwen3-8B-FP8 \ --name qwen3-vllm \ --restart unless-stopped \ vllm/vllm-openai:v0.6.3 \ --model /models/Qwen3-8B-FP8 \ --served-model-name qwen3-8b \ --max-model-len 8192 \ --gpu-memory-utilization 0.92加了--restart unless-stoppedDocker服务启动时容器会自动拉起省去手动启动的麻烦。然后在Windows的启动文件夹放一个快捷方式指向wsl.exe -e bash ~/workspace/vllm/start.sh重启后全自动。7.2 接入LangChain和Dify做RAGvLLM的OpenAI兼容API接入LangChain很容易from langchain_openai import ChatOpenAI llm ChatOpenAI( base_urlhttp://localhost:8000/v1, api_keyEMPTY, modelqwen3-8b, temperature0.7, )vLLM只提供推理能力embedding模型比如bge-m3可以单独起一个小服务并行跑。Dify这类应用编排工具在Windows上直接配置模型供应商时填https://localhost:8000/v1和qwen3-8b就能接入。RAG场景里建议把--enable-prefix-caching打开相同文档片段的prefill计算能被复用检索QA速度能翻倍。7.3 日志管理和监控Docker容器的日志默认走stdout用docker logs -f qwen3-vllm看。建议把日志通过Docker的json-file driver滚动保存docker run -d \ --log-driver json-file \ --log-opt max-size100m \ --log-opt max-file3 \ ...再配合nvidia-smi定时记录显存和GPU利用率跑几天下来能发现显存泄漏的苗头。vLLM目前没有显存泄漏问题但其他组件不保证。我在实际部署中最深刻的体会是Windows上跑vLLM这件事真正的难点不在vLLM本身而在于把Windows、WSL2、Docker、NVIDIA驱动这几个组件的版本关系理顺。一旦环境稳定后续换模型、换参数都是几分钟的事。最后再分享一个小技巧模型文件的存放位置会影响加载速度——放在NVMe SSD上8GB的FP8模型加载只要十几秒放在机械硬盘可能等上一分钟。日常跑模型IO速度的体感差异比GPU型号差异更明显。如果你想在这个基础上做更深度的定制比如修改vLLM源码、加自定义采样器那就需要从源码构建镜像。构建一次大概半小时但能让你完全掌控推理引擎的细节。记住跑通只是开始理解每一个参数背后的内存和GPU行为才是部署的真正价值。