ARTICLE DETAIL

资讯详情

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

Paddle Inference 3.0.0 Windows部署:版本匹配与配置详解

Paddle Inference 3.0.0 Windows部署:版本匹配与配置详解 简介本资源是面向Windows平台深度学习部署工程师与AI应用开发者的Paddle Inference 3.0.0预编译推理库开发包专为CUDA 11.8 cuDNN 8.6.0 TensorRT 8.5.1.7环境优化构建显著降低C端部署门槛适用于模型服务化、边缘推理及高性能AI应用集成等场景。压缩包共623个文件含569个头文件.h/.hpp支撑API调用与定制开发13个静态/导入库.lib/.exp用于链接5个运行时DLL如paddle_inference.dll、mklml.dll、mkldnn.dll保障GPU加速与数学计算另有proto定义与manifest清单确保版本兼容性与模块完整性整体体积达528.04MB。目前已有132人下载学习。用户可直接集成该包至VS2019项目无需自行编译即刻启用AVX指令集加速与MKL数学内核并支持TensorRT后端的高效模型推理大幅缩短部署周期。 看到paddle-inference-3.0.0这个带着完整前缀的 zip 包我的第一反应是这串文件名本身就是一份部署清单。x86-64-cuda11.8-cudnn8.6.0-trt8.5.1.7-mkl-avx-vs2019每一项都直接决定了你手里的 GPU 能不能把模型跑起来、跑多快、会不会在链接阶段报一堆莫名其妙的错误。这包是 Paddle Inference 在 Windows 平台上的预编译推理库适合需要在 C 环境下做模型部署、又不想自己从源码编译整套 Paddle 的开发者。这篇就按文件名逐段拆开讲把每个前缀背后的版本关系、环境配置和坑都过一遍。1. 一个文件名就是一份部署清单——逐段拆解1.1 x86-64 和 vs2019Windows 下最容易忽略的两个约束先说x86-64。这个前缀表示预编译库面向 64 位 x86 架构。看起来像是废话但在 Windows 部署中这里有个隐蔽的坑Paddle Inference 的 Windows 预编译包通常只提供 x64 版本而你在 Visual Studio 新建项目时如果没注意把解决方案平台切成x64默认的Win32平台链接时就会报LNK1112: 模块计算机类型“x86”与目标计算机类型“x64”冲突。这跟库本身没关系纯粹是项目平台选错了。所以拿到这个包之后第一件事不是解压是确认你的项目是 x64 平台。再说vs2019。这个前缀指的是预编译库使用的 MSVC 工具集版本对应v142。Paddle Inference 官方在 Windows 上提供的 GPU 包一般是基于 VS2017 或 VS2019 编译的3.0.0 这版比较常见的就是 VS2019。如果你本机装的是 VS2022对应 v143不是不能用而是要注意两点一是链接时可能提示runtime library不匹配解决办法是在VS2022中为项目选择v142工具集二是运行时目标机器上需要安装对应版本的Microsoft Visual C Redistributable。我自己遇到过在一台只装了 VC2015 Redist 的机器上跑程序启动直接报0xc000007b后来装了 VS2019 Redist 才正常。别小看这个前缀预编译库的 ABI 兼容性全靠它撑着。1.2 cuda11.8不是版本越高越好是驱动匹配问题cuda11.8是这套库链接的 CUDA Toolkit 版本。很多人一上来就装最新的 CUDA 12.x结果拿着 11.8 编出来的库去跑要么链接报错要么运行时报CUDA driver version is insufficient。这里有个核心概念CUDA 有运行时runtime和驱动driver两层运行时版本由你链接的cudart决定驱动版本由显卡驱动决定。NVIDIA 驱动是向后兼容的也就是说驱动 525 或更高版本可以支持 CUDA 11.8 的 runtime但反过来不行你的驱动如果只支持 CUDA 11.0那跑 CUDA 11.8 编译出的程序就会直接失败。所以拿到这个包含cuda11.8的包你要做的是先查驱动支持的 CUDA 版本命令是nvidia-smi看右上角的CUDA Version只要这个数字大于等于 11.8驱动层面就没有问题。如果小于 11.8你需要去升级显卡驱动而不用去装完整的 CUDA Toolkit。这个理解很重要因为很多人把“安装 CUDA”理解成“安装整个 Toolkit”其实对跑预编译推理库来说你的机器上只需要有驱动和对应的运行时 DLL 就够了nvcc编译器反而是开发时才会用到的东西。1.3 cudnn8.6.0 与 trt8.5.1.7加速库和推理引擎别混为一谈cudnn8.6.0是 NVIDIA 的深度神经网络加速库主要优化卷积、池化、归一化这些算子trt8.5.1.7是 TensorRT 推理引擎负责做模型图优化、层融合、精度校准INT8/FP16等更上层的加速。这两个东西经常被放在一起说但职责完全不同cuDNN 是“让每个算子跑得尽量快”TensorRT 是“从整个计算图层面减少计算量”。Paddle Inference 的预编译包把这两个都打进去了但这个版本组合是固定的cudnn8.6.0 对应 trt8.5.1.7不能随便替换。比如你手头有一个 cudnn 8.9.x 的 zip解压后想把cudnn64_8.dll替换进去很可能会因为 TensorRT 运行时依赖的 cuDNN API 版本不匹配导致加载失败。我的建议是除非你很清楚自己在做什么否则直接用包里自带的 DLL不要动。这个包的 bin 目录下有cudnn64_8.dll、nvinfer.dll这些文件只要它们都在运行时就会从你配置的PATH里加载。1.4 mkl-avxCPU 侧加速GPU 推理也离不开mkl是 Intel Math Kernel LibraryPaddle 用它加速 CPU 上的矩阵运算avx是 CPU 指令集扩展说明这个库是用 AVX 指令集优化编译的。有人会问我都用 GPU 推理了CPU 优化还重要吗答案是重要而且经常被忽略。Paddle Inference 在 GPU 模式下仍有很多算子在 CPU 上执行比如数据预处理、一些 shape 相关的操作、以及显存和内存之间的拷贝前处理这些都会用到 MKL。更关键的是如果模型的输入数据需要做Normalize、Resize这种前处理计算也是在 CPU 上跑的。AVX 这个前缀会带来一个实际问题如果你的 CPU 不支持 AVX 指令集比如很老的 Pentium/Celeron这个包里的代码执行会直接报Illegal instruction。现在绝大多数 x86-64 CPU 都支持 AVX但我在工控机上踩过这个坑一台老式嵌入式工控机跑 CPU 推理程序直接崩用grep avx /proc/cpuinfo一查果然不支持。所以部署到老旧设备前先确认 CPU 是否支持 AVX否则要换用noavx版本或自己编译。2. 版本匹配才是核心问题——CUDA/cuDNN/TensorRT 三者关系2.1 为什么三者必须咬合一条完整的调用链要理解这个文件名里的版本组合为什么重要得先搞清楚调用链Paddle Inference → TensorRT → cuDNN → CUDA runtime → GPU Driver。每一层都有自己要求的版本范围中间任何一层断裂整个推理服务就起不来。Paddle 在编译时是针对某一组具体版本做链接的比如cuda11.8 cudnn8.6.0 trt8.5.1.7。如果你本机的 cudnn 是 8.9.xPaddle 加载时调用的符号虽然可能还在但 TensorRT 在初始化时会检查 cuDNN 的版本是否符合自己编译时的预期版本不一致经常表现为TRTISystem.cpp:xxx Error或者Could not load library cudnn64_8.dll。这个过程很像你要组装一台老式电脑主板驱动支持 CPUCUDA runtimeCPU 支持的指令集决定了内存条cuDNN和显卡TensorRT能不能点亮。任何一个部件太新或太旧都开不了机。在实际部署中最省事的办法就是把 Paddle Inference 预编译包当作一个整体不要去拆零件。2.2 用 nvidia-smi 和 nvcc 验证你的实际环境很多环境问题其实在动手之前就能查出来。你有两个命令nvidia-smi查驱动支持的 CUDA 版本nvcc --version查当前安装的 CUDA Toolkit 版本。注意这两个版本号不需要一致。比如nvidia-smi显示CUDA Version: 12.2而nvcc --version显示release 11.8这是完全正常的状态驱动 12.2 向后兼容 11.8 的运行时。我要提醒一个容易误判的地方在命令行里跑nvcc找不到不代表系统没有 CUDA。很多人的 CUDA Toolkit 安装了但是没有把C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\bin加入PATH所以nvcc找不到。对运行 Paddle 推理库来说nvcc不是必需的你只需要确认驱动的 CUDA 版本 ≥ 11.8以及库自带的 DLL 能加载就行。所以排查环境时第一优先看nvidia-smi第二看 DLL 能不能加载而不是纠结nvcc。2.3 显卡算力与 SM 架构的关系cuda11.8编译出的代码默认会针对一系列sm架构生成 cubin比如sm_75Turing、sm_80Ampere、sm_86Ampere 消费级等。如果你用的是很新的显卡比如 RTX 4090 对应的sm_89或者 RTX 4060 对应的sm_89它们通常能兼容低版本的 cubin但反过来不行老显卡跑新架构编译的 cubin 会报no kernel image is available for execution on the device。这个错误信息在热搜词里也出现了也就是“设备上没有可供执行的内核映像”的英文原句。这块涉及 CUDA 编程里的block、grid、sm等概念grid是线程网格block是线程块sm是流式多处理器GPU 会把 block 调度到 sm 上执行。不同架构的 sm 指令集不完全兼容所以编译器针对不同sm_xx生成不同的内核映像。Paddle Inference 预编译包会尽量覆盖主流架构但如果你用的是非常小众或非常新的卡跑不起来时先确认一下你的显卡算力是否在包的支持列表中。RTX 30 系Amperesm_86和 RTX 20 系Turingsm_75基本都能跑 CUDA 11.8 的包这点可以放心。2.4 常见的 CUDA/cuDNN/TensorRT 搭配参考为了让你对版本组合有个整体感觉我整理了一张常用搭配表。这张表不是官方唯一指定而是基于常见预编译包和发行说明整理的参考关系CUDA 版本cuDNN 常见搭配TensorRT 常见搭配主要显卡架构10.27.6.x / 8.0.x7.x / 8.2.xMaxwell / Pascal11.28.1.x / 8.2.x8.2.x / 8.4.xTuring / Ampere11.88.6.0 / 8.9.x8.5.x / 8.6.xAmpere / Ada12.08.9.x / 9.x8.6.x / 10.xAda / Hopper这套组合不是随便写的。TensorRT 8.5.x 发布时NVIDIA 官方验证过的组合就是 CUDA 11.8 cuDNN 8.6.0所以 Paddle 官方选这个组合是有依据的。如果你自己用 TensorRT 做推理也优先用官方验证过的组合能省掉大量排查时间。你自己组版本的时候可以去 NVIDIA 的文档中心查每个 TensorRT 版本的“Supported Platforms”列表那里会明确写测试过的 CUDA 和 cuDNN 版本照着来基本不会错。3. Windows VS2019 环境下的配置实操3.1 解压布局每个目录是干什么的拿到这个 zip 之后先解压到一个没有中文和空格的路径比如D:\paddle_inference。解压后的目录结构一般长这样paddle_inference\ paddle\ include\ paddle_infer.h paddle_analysis_config.h ... lib\ paddle_inference.lib paddle_inference_install_dir.lib bin\ paddle_inference.dll cudnn64_8.dll cudnn_ops64_8.dll cudnn_cnn64_8.dll nvinfer.dll nvinfer_plugin.dll mkldnn.dll mklml.dll share\ ... third_party\ ...include里是头文件编译时要用lib里是链接用的.lib文件bin里是运行时 DLL这些 DLL 不仅包含 Paddle 本身还打包了 cuDNN、TensorRT、MKL所以这个包自带了完整的运行依赖。third_party目录一般是空的或者只放一些第三方库的 license不用管。我建议你把paddle_inference整个目录看作一个独立运行的 SDK所有版本依赖都锁在这个目录里不要用系统里自己装的 cudnn 去覆盖它。这也是为什么我不建议大家用“把包解压后扔到 System32”这种搞法很容易污染全局环境导致其他依赖不同版本 CUDA 的应用出问题。3.2 配置环境变量PATH 和 CUDA_PATH 的坑配置环境变量这一步看似简单实际上出问题的概率很高。你需要做两件事第一把D:\paddle_inference\paddle\bin添加到系统PATH这样运行时才能找到paddle_inference.dll以及它依赖的cudnn64_8.dll、nvinfer.dll。注意是paddle\bin而不是paddle\lib.dll运行时通过PATH找.lib链接时通过项目配置找。第二如果本机装了 CUDA Toolkit确认CUDA_PATH环境变量指向的版本和包里用的版本一致。不一致时程序运行时可能会优先加载系统CUDA_PATH下的 DLL跟包内自带的版本混在一起导致奇怪的崩溃。如果检测到不一致我建议在系统环境变量里临时把CUDA_PATH指到一个不存在的路径或者干脆在运行前用命令行设置set PATHD:\paddle_inference\paddle\bin;%PATH%这样能保证优先加载包内 DLL。虽然有点暴力但排错时最有效。3.3 在 Visual Studio 2019 中新建项目并完成链接配置在 VS2019 里新建一个 C 控制台应用后按下面步骤配置把解决方案平台切换到x64。这一步忘了后面全是错的。打开项目属性 →C/C→常规→附加包含目录添加D:\paddle_inference\paddle\include。打开链接器→常规→附加库目录添加D:\paddle_inference\paddle\lib。打开链接器→输入→附加依赖项添加paddle_inference.lib。打开C/C→代码生成→运行库确认选择多线程 DLL (/MD)。预编译库默认是用/MD编译的如果你项目设置成/MT链接时会报运行时库冲突。确认C/C→语言→符合模式设为是Paddle 头文件需要 C14 以上标准VS2019 默认支持。配置完成后先写一个最小的初始化程序验证链接和运行环境不要直接上完整模型。我通常这样验证#include paddle_infer.h #include iostream int main() { paddle::AnalysisConfig config; std::cout Paddle Inference lib version: paddle::get_version() std::endl; return 0; }如果编译链接通过运行后能输出版本号说明 include、lib、PATH 三级配置全部打通。此时再加载模型排错范围就能缩小到模型和配置项上。3.4 用 CMake 方式集成备选方案如果你不喜欢在 VS 里手工点属性页也可以用 CMake。关键是个CMakeLists.txtcmake_minimum_required(VERSION 3.15) project(paddle_demo) set(CMAKE_CXX_STANDARD 14) set(PADDLE_ROOT D:/paddle_inference) include_directories(${PADDLE_ROOT}/paddle/include) link_directories(${PADDLE_ROOT}/paddle/lib) add_executable(demo demo.cpp) target_link_libraries(demo paddle_inference)这里的target_link_libraries(demo paddle_inference)会自动链接paddle_inference.lib。用 CMake 的优点是在 CI 或团队协作时更容易复用别人 Pull 下来直接cmake .. cmake --build . --config Release就能跑。不过要注意CMake 只管编译链接运行时还是需要确保paddle\bin在PATH中。3.5 第一个完整的预测程序从加载模型到跑通环境打通后写一个完整的预测程序才是真正的验证。下面这个例子读取一个 Paddle Inference 格式的模型目录对随机输入做一次推理#include paddle_infer.h #include iostream #include vector int main() { // 模型目录里必须有 model.pdmodel 和 model.pdiparams std::string model_dir D:/models/my_model; paddle::AnalysisConfig config; config.SetModel(model_dir /model.pdmodel, model_dir /model.pdiparams); // 开启 GPU 推理使用 device_id0 config.EnableUseGpu(1024, 0); // 如果需要 TensorRT可以去掉下面这行的注释 // config.EnableTensorRtEngine(1 20, 1, 15, paddle::AnalysisConfig::Precision::kFloat32, false, false); auto predictor paddle::CreatePredictor(config); auto input_names predictor-GetInputNames(); auto input_tensor predictor-GetInputHandle(input_names[0]); std::vectorfloat input_data(1 * 3 * 224 * 224, 0.5f); input_tensor-Reshape({1, 3, 224, 224}); input_tensor-CopyFromCpu(input_data.data()); predictor-Run(); auto output_names predictor-GetOutputNames(); auto output_tensor predictor-GetOutputHandle(output_names[0]); std::vectorfloat out_data; out_data.resize(output_tensor-numel()); output_tensor-CopyToCpu(out_data.data()); std::cout Output size: out_data.size() std::endl; return 0; }这段代码第一个要确认的是模型目录结构Paddle Inference 格式的模型是model.pdmodelmodel.pdiparams两个文件组成的目录不是单个文件。如果你手头只有推理模型或部署模型需要检查是不是已经是这种格式。第二个要确认的是输入 shape例子里写死1*3*224*224但你的模型可能是1*3*112*112或别的尺寸。先用paddle::PaddleTensor或 Python 的paddle.inference打印出输入输出信息再写 C 更稳妥。4. 实际部署中会踩的坑——错误对照速查4.1 “设备上没有可供执行的内核映像”究竟在说什么这个错误在中文语境下常被直译为“设备上没有可供执行的内核映像”英文原话是no kernel image is available for execution on the device。出现这个报错时程序其实已经成功链接了 CUDA 运行时但在把计算任务加载到 GPU 时发现GPU 的算力架构不在当前 cubin 支持的范围内。常见原因有三种一是显卡太老比如 GTX 750 这类 Maxwell二是驱动太老导致无法加载较新编译的内核三是你用了虚拟化或 WSL 环境但 GPU 直通没配好。排查思路很简单先用nvidia-smi看显卡型号和驱动版本再用NVIDIA Control Panel或官网查显卡的Compute Capability最后和cuda11.8默认支持的sm列表对照。如果你的卡是sm_50或更老那 CUDA 11.8 已经不支持了需要换更老版本的 Paddle 预编译包或者用 CPU 推理。如果你的卡是sm_86RTX 3060/3080或sm_80A100基本不会出现这个错误。4.2 运行时找不到 cudnn64_8.dll 或 nvinfer.dllWindows 上加载 DLL 的搜索顺序是可执行文件所在目录 →PATH中的目录 → 系统目录。如果你的程序启动时提示找不到cudnn64_8.dll大概率是paddle\bin没有在PATH里或者被系统里其他旧版本抢先加载了。这时候可以用一个很实用的工具Dependency Walker或dumpbin /dependents查看主程序到底依赖哪些 DLL再看它们实际从哪个路径加载。dumpbin是 Visual Studio 自带的工具打开开发者命令提示符后运行dumpbin /dependents D:\paddle_inference\paddle\bin\paddle_inference.dll输出会列出这个 DLL 依赖的所有外部符号和 DLL 文件。这个工具在排查“为什么换了一台机器就起不来”时特别好用。常见的问题是本机能跑拷到另一台机器上起不来一查发现少了mklml.dll或者msvcp140.dll。前者需要把整个paddle\bin目录一起拷贝后者需要安装 VC Redistributable。4.3 CPU 版本和 GPU 版本混用导致的“薛定谔的库”Paddle Inference 的 CPU 版和 GPU 版的 API 几乎一样但 DLL 完全不同。如果你之前部署过 CPU 版本又下载了 GPU 版本最容易发生的混用情况是代码里链接的是 CPU 版的.lib运行时却把 GPU 版的bin放进了PATH结果程序跑起来没有任何 GPU 加速或者反过来链接了 GPU 版.lib运行时调用的却是 CPU 版的 DLL直接崩溃。我的经验是在项目属性里用宏区分平台比如PADDLE_GPU宏控制链接不同的 lib 和 bin 路径避免手动改来改去。另外务必检查你的PATH里是否同时存在多个 Paddle 相关路径系统会按顺序加载先找到谁就用谁这个顺序经常导致“我在这台机器上是好的到那台机器上就不行”。4.4 关于 WSL2、VS2022、虚拟环境的相关提醒热搜词里有很多关于 WSL2 安装 CUDA、VS2022 配置 MKL、虚拟环境安装 CUDA 的搜索这些确实是在 Windows 上做 CUDA 开发时最容易混的几个场景。先说 WSL2Paddle Inference 的 Windows 预编译包不是给你在 WSL2 里用的WSL2 里要跑 Paddle GPU 推理应该去下载 Linux 版本的预编译包而不是在 WSL2 里尝试加载 Windows 的 DLL。WSL2 的 GPU 支持通过/usr/lib/wsl/lib暴露驱动Linux 版 Paddle 可以直接用但 Windows 版不行。再说 VS2022用 VS2022 打开用 VS2019 编译的库时链接器可能会提示VCToolsVersion相关错误。解决办法是在项目属性 →常规→平台工具集中手动选择Visual Studio 2019 (v142)。前提是你安装了 VS2019 的工具集组件如果没有就打开 VS Installer 勾选“MSVC v142 - VS 2019 C x64/x86 生成工具”。这不是什么大问题但第一次遇到的人容易慌。最后说虚拟环境安装 CUDAPython 的虚拟环境中装的 CUDA比如nvidia-pyindex或pip install nvidia-cuda-runtime-cu11只是把 CUDA 运行时 DLL 放到虚拟环境目录里方便 Python 包加载它不能替代显卡驱动。Paddle Inference 的 C 库不依赖这套东西它的依赖包子在自身的bin目录里。如果你在虚拟环境里发现import paddle之后paddle.device.is_compiled_with_cuda()为 False那不是虚拟环境的问题是你装的 Paddle 版本本来就是 CPU 版需要重新安装 GPU 版。4.5 小技巧用 dumpbin 和 PATH 检查锁定问题根因排查环境问题的时候我通常按照“DLL 能不能加载 → 能不能初始化 CUDA → 能不能跑推理”的顺序来。第一步看 DLL 依赖用dumpbin /dependents确认主程序依赖的 DLL 清单然后再逐一确认这些 DLL 的加载路径。第二步可以用一个简单的 CUDA 查询程序不涉及 Paddle只调用cudaGetDeviceCount和cudaGetDeviceProperties确认显卡能被 CUDA runtime 正常访问。如果这一步都过不了后面 Paddle 报任何错都不用奇怪。这个“拆分排查”的思路看起来笨实际效率最高。很多人遇到问题直接去改代码结果发现是环境变量没配好白折腾几个小时。我自己的习惯是写一个check_env.bat脚本把nvidia-smi输出、PATH内容、CUDA_PATH都打印出来方便在不同机器上对比差异。5. 从这份包往前再走一步——部署的完整闭环5.1 确认你的部署目标GPU 推理和 CPU 推理共存拿到这份包之后先想清楚一个问题你的部署环境真的需要 GPU 吗如果只是本机做验证或跑一些中小模型CPU 推理可能完全够而且省去 CUDA、cuDNN、TensorRT 这一大堆依赖机器的兼容性会好很多。但如果你有高并发请求、大模型、视频流之类的场景GPU 推理的收益是明显的这时候这份包就派上用场。Paddle Inference 支持在同一个程序里同时创建 CPU 和 GPU 的 Predictor互不干扰。也就是说你可以在一个服务里把不同模型分配到不同设备上轻量模型走 CPU重模型走 GPU。启动时根据nvidia-smi的查询结果决定EnableUseGpu是否调用这样同一份代码在开发机有 GPU和普通服务器无 GPU上都能跑。我在项目里就是这么做的配置项里加一个device_type字段部署时填cpu或gpu不用改代码。5.2 性能优化TRT 动态 shape、MKL、AVX 设置用这份包做 GPU 推理你至少有三个优化点可以调一是 TensorRT。包内已经带了nvinfer.dll你可以通过config.EnableTensorRtEngine(worker_size, batch_size, max_seq_len, precision, use_static, use_calib)开启。关键参数是precision常见选择是kFloat32和kHalf如果你的模型是 NLP 类或对精度不敏感用 FP16 通常能获得一倍左右的加速。但要注意 TensorRT 对动态 shape 支持需要设置config.SetTRTDynamicShapeInfo输入 shape 范围要提前声明否则推理时遇到没见过的 shape 会直接报错。二是 MKL。虽然包名里有mkl但mklml.dll需要能被加载到Paddle 才会使用。运行日志里如果能看到MKLDNN is enabled字样说明走的是 MKL-DNN 优化路径如果没看到检查 DLL 是否完整。对 CPU 推理来说开启 MKL 的收益非常明显某些卷积模型能快 3 到 5 倍。三是 AVX。包的avx前缀说明指令集已启用但你要确保部署机 CPU 支持。在 x86-64 平台上基本不用担心但在虚拟机、云服务器或老式工控机上要注意。可以用一个简单的 C 程序调用__cpuid检测或者更简单直接看/proc/cpuinfo里有没有avx标志。如果不支持就得考虑用noavx版本或 CPU 推理别硬上。5.3 模型转换从训练模型到 Inference ModelPaddle 的预编译库只负责推理它需要一个特定格式的推理模型目录而不是训练时保存的 checkpoint。转换方法是把训练好的模型通过paddle.jit.save导出或者在 Python 端用paddle.static.normalize_program做推理模型转换。一个常见误区是直接把model.pdparams单独拿来用这是不行的。Paddle Inference 需要同时读取model.pdmodel和model.pdiparams前者是计算图结构后者是权重参数。转换后一定要检查输出的目录里有没有这两个文件并且用 Python 快速跑一次paddle.inference.create_predictor验证模型能正常加载。这一步没问题了再去写 C 部署代码否则问题可能在导出阶段而不是 C 环境阶段排查起来很痛苦。我一般会用paddle.inference.Config的summary功能打印模型输入输出确认 shape 和 dtype 后再写 C。5.4 跨平台参考Linux/WSL2 下怎么选包最后说一下跨平台。这份 Windows 包对应的是win_x86_64_cuda11.8的版本你在 Linux 上部署时需要下载对应的linux_x86_64_cuda11.8包。虽然版本名很像但.so和.dll完全不是一回事不能混用。WSL2 里跑 Paddle GPU 推理就用 Linux 包WSL2 的 GPU 直通支持 CUDA这一点官方文档有明确说明。如果你的目标平台是 JetsonARM 定制 CUDA那你不能直接下 x86-64 包而是要找 NVIDIA 为 JetPack 版本打包的 Paddle 版本或者源码交叉编译。总之文件名里的x86-64、cuda11.8、vs2019都是强约束跨一个维度就有可能导致加载失败或性能异常。写在最后的一点体会真正把这个包跑通之后你会发现问题几乎都集中在版本匹配和环境变量上Paddle 本身的 API 反而不是难点。我建议大家拿到任何一个预编译库第一件事不是写代码而是先把它的bin目录里所有 DLL 列一遍确认依赖库是不是齐全然后写一个只调用get_version()或CreatePredictor的最小程序先把环境验证通过最后再开始接自己的模型。这个过程看起来多花了几分钟但能帮你少踩很多坑。另外尽量把paddle_inference整个目录保留在一个固定位置别乱移动因为后续升级模型或者切换版本时路径越稳定你的脑细胞越安全。本文还有配套的精品资源点击获取
返回列表