libtorch只能通过torch::jit::load()加载torch.jit.trace()或torch.jit.script()导出的torchscript模型(.pt/.pth),不支持直接加载state_dict或全模型文件;加载后需确保输入tensor的shape、dtype、device与导出时完全一致,并显式调用.to()指定设备。

如何用 LibTorch 加载 .pt 或 .pth 权重文件做推理
LibTorch 不支持直接加载 Python 侧保存的 torch.save(model, ...) 全模型文件(即包含模块结构 + 权重的 .pt),它只认 torch::jit::load() 的 TorchScript 格式。如果你手头只有训练好的 PyTorch Python 模型(比如 model.pth),必须先在 Python 侧导出为 TorchScript,再在 C++ 中加载。
常见错误现象:torch::jit::load("model.pth") 报错 Expected a script module, but got a state dict —— 这说明你传的是普通 state dict,不是 ScriptModule。
- Python 侧导出时,务必用
torch.jit.trace()或torch.jit.script(),例如:traced = torch.jit.trace(model.eval(), example_input) traced.save("model.pt") - 确保
example_input的 shape、dtype、device 与 C++ 推理时完全一致(尤其是 batch 维度不能省) - 如果模型含控制流(如 if/for)、动态 shape 或自定义 Python 函数,优先用
torch.jit.script();trace 更简单但限制多
LibTorch C++ 端加载和运行的基本流程
核心是三步:加载 ScriptModule → 预处理输入 tensor → 调用 forward() → 后处理输出。所有 tensor 必须在同 device(CPU/GPU),且 dtype 匹配。
前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。前端设计与 UI/UX 全方位优化专家。覆盖视觉层次、排版系统、色彩理论、响应式布局、交互体验、动画动效、无障碍访问、性能优化八大维度,帮助开发者将普通页面升级为高品质产品级界面。
- 加载后记得调用
.to(torch::kCUDA)或.to(torch::kCPU)显式指定设备,否则默认 CPU;GPU 推理必须显式 move - 输入 tensor 必须是
torch::kFloat(除非模型明确支持 half),且维度顺序要和 trace 时一致(比如 NCHW 而非 NHWC) -
forward()返回的是torch::IValue,需用.toTensor()或.toTuple()解包;多输出模型必须知道返回结构(比如是否是 tuple/list) - 示例关键代码片段:
auto module = torch::jit::load("model.pt"); module.to(torch::kCUDA); std::vector<:jit::ivalue> inputs; inputs.push_back(input_tensor.to(torch::kCUDA)); auto output = module.forward(inputs).toTensor();</:jit::ivalue>
C++ 中 tensor 预处理常见坑点
图像类任务最容易在这里翻车:Python 用 PIL/OpenCV 加载 → 归一化 → permute;C++ 若漏掉某步,输出就完全不对,且不报错。
- OpenCV
cv::Mat默认是 HWC/BGR/uint8,而 PyTorch 期望 CHW/RGB/float32;必须手动cv::cvtColor()、cv::resize()、torch::from_blob()后.permute({2,0,1})、.to(torch::kFloat)、再除以 255.0 - 归一化参数(均值/方差)必须和 Python 训练时完全一致,且顺序按 channel 写(如
{0.485, 0.456, 0.406}),别写反 - 不要用
torch::randn()做 dummy 输入测试——它分布和真实数据差太远,某些模型(如 BN 层未 eval)会崩;用实际预处理后的 tensor 测试 - batch 维度必须存在:即使单张图也要
.unsqueeze(0),否则 trace 和 C++ 输入 shape 对不上
链接和运行时依赖容易被忽略的细节
LibTorch 是预编译二进制,但链接方式不对或环境变量没设,会导致运行时报 undefined symbol 或 libtorch.so not found。
- Linux 下必须设置
LD_LIBRARY_PATH指向 LibTorch 的lib/目录,或用-rpath编译进可执行文件 - CMake 中用
find_package(Torch REQUIRED)后,务必链接${TORCH_LIBRARIES},且顺序不能颠倒(torch在前,c10和torch_cpu/torch_cuda在后) - CUDA 版本必须严格匹配:LibTorch 下载页选的
cu118就得配系统 CUDA 11.8,混用(如 cu118 + CUDA 12.1)大概率cudaErrorInvalidValue - Debug 和 Release 模式不能混用:LibTorch 的
libtorch.so分 debug/release,C++ 工程的CMAKE_BUILD_TYPE必须一致
最麻烦的其实是 trace 和 C++ 输入 tensor 的“隐式一致性”:shape、dtype、device、数值范围、channel 顺序、归一化方式,五者缺一不可;错一个,结果就飘,还很难定位。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










