libtorch模型部署

img

img

img


上述为模型中部分自定义模块的python、C++实现,如何使用libtorch部署模型,如何才能让C++正确识别python导出的.pt模型中这些自定义模块呢?请教一下具体的流程

你保存模型的时候把网络结构一起保存下来无法读取吗?按理来说直接带网络结构就不需要在cpp下面定义网络结构的。
另外,cpp部署的话很少直接读取pt或者pth文件,都是转到onnx或者TorchScript,按照你的libtorch方式部署,我更建议你转成torch.jit.ScriptModule
https://zhuanlan.zhihu.com/p/486914187

  • 请看👉 :win10用c++部署libtorch过程中的一些问题,python与c++对应的图像预处理
  • 以下回答由chatgpt基于相关博客总结生成:

    对于在C++中部署自定义模块的pytorch模型,您可以按照以下步骤进行操作:

    1.安装libtorch:从pytorch官网下载相应版本的libtorch,并选择Release版本进行部署。如果您需要使用GPU,请选择相应的CUDA版本。libtorch的官方手册可以帮助您查阅相关的函数使用方法。

    2.配置项目属性:选择X64 release作为平台编译环境,在VS项目属性中添加包含目录、库目录和附加依赖项,并配置好OpenCV。

    3.加载模型:使用torch::jit::load()函数加载模型文件,这个函数将返回一个torch::jit::script::Module对象,表示加载的模型。

    4.注册自定义模块:如果您的模型中包含自定义模块,您需要先向libtorch注册这些模块。您可以使用自定义模块的C++实现,或者使用torch::RegisterOperators来注册Python实现的自定义模块。注册自定义模块后,您就可以在C++中使用这些模块了。

    5.使用模型:在加载模型并注册自定义模块之后,您就可以使用torch::jit::Module::forward()函数来运行模型了。该函数接受输入张量作为参数,并返回模型的输出张量。

    下面是一个简单的示例代码,展示如何使用libtorch部署自定义模块的模型:

    #include <torch/script.h> // 包含libtorch头文件
    #include <iostream>
    
    int main() {
      // 加载模型
      torch::jit::script::Module module = torch::jit::load("your_model.pt");
    
      // 注册自定义模块
    
      // 运行模型
      torch::Tensor input = torch::ones({1, 3, 224, 224}); // 输入张量
      torch::Tensor output = module.forward({input}).toTensor(); // 运行模型
      std::cout << output.slice(/*dim=*/1, /*start=*/0, /*end=*/5) << '\n'; // 输出前5个元素
    }
    

    希望以上信息能够帮助您解决问题。如果您还有任何疑问,请随时向我提问。

回答部分参考、引用ChatGpt以便为您提供更准确的答案:

要使用libtorch部署模型并使C++能够正确识别导出的.pt模型中的自定义模块,您可以按照以下流程进行操作:

  1. 导出PyTorch模型为.pt文件:首先,您需要使用Python将自定义模块添加到PyTorch模型中,并将其导出为.pt文件。根据您提供的代码截图,可以看到您使用了torch.nn.Module的子类,并重写了forward方法来定义自定义模块。在导出模型之前,确保将所有相关的自定义模块和权重加载到模型中,并将模型转换为eval模式。
  2. 安装和配置libtorch:在C++中使用libtorch之前,您需要安装适合您系统的libtorch版本,并将其配置到C++项目中。您可以从PyTorch官方网站下载libtorch并按照指示进行安装。
  3. 加载和运行模型:在C++代码中,您需要使用libtorch的API加载导出的.pt模型文件。可以使用torch::jit::load函数加载.pt文件,并创建一个torch::jit::script::Module对象来表示模型。请确保在加载模型之前正确设置了模型的设备类型(CPU或GPU)。
  4. 注册自定义模块:在C++中,libtorch不会自动识别和注册自定义模块,因此您需要手动注册它们,以便C++能够正确识别和使用这些模块。您可以使用torch::jit::registerModule方法注册自定义模块。确保按照与您的自定义模块对应的方式注册它们。
  5. 运行推理:一旦模型加载并且自定义模块被正确注册,您可以使用torch::jit::Module对象进行推理。使用模型的forward方法传递输入数据并获取输出。

下面是一个大致的示例代码,用于展示如何使用libtorch部署模型和注册自定义模块:

#include <torch/script.h> // libtorch头文件

int main() {
    torch::jit::script::Module module;
    try {
        // 加载模型
        module = torch::jit::load("path_to_model.pt");
        
        // 注册自定义模块
        torch::jit::registerModule<CustomModule1>();
        torch::jit::registerModule<CustomModule2>();
        
        // 设置输入数据
        torch::Tensor input = torch::ones({1, 3, 224, 224});
        
        // 执行推理
        at::Tensor output = module.forward({input}).toTensor();
        
        // 处理输出结果
        // ...
        
    } catch (const c10::Error& e) {
        std::cerr << "Error loading the model: " << e.what() << std::endl;
        return -1;
    }
    
    return 0;
}

请根据您的实际情况进行适当的修改和调整。确保将path_to_model.pt替换为您导出的.pt文件的路径,并根据自定义模块的名称和数量注册相应的模块。

请注意,具体的实施细节可能因您的环境和实际情况而有所不同。建议您参考PyTorch和libtorch的官方文档以获得更详细的说明和示例代码。

提供参考实例方法:
如有帮助,恭请采纳

#1、在Python中,将自定义模块打包成一个.pt文件。可以使用torch.save()函数将模型保存为PyTorch格式。
import torch  
  
# 加载模型  
model = torch.load('model.pt', map_location=torch.device('cpu'))  
  
# 导出模型  
torch.save(model, 'model.pt')
#2、在C++中,使用torch::jit::load()函数加载模型。此函数返回一个JitModule对象,它表示Python中导出的模型。
#include <torch/script.h>  
  
int main() {  
  // 加载模型  
  auto module = torch::jit::load("model.pt");  
  
  // 使用模型进行推理  
  auto input = torch::rand({1, 3, 224, 224});  
  auto output = module->forward({input});  
  
  return 0;  
}
#3、如果自定义模块使用了C++的库,需要确保在C++代码中包含这些库的头文件,并将库链接到C++代码中。这样C++才能正确识别自定义模块。
在链接库时,可以使用CMake或Makefile等构建工具。例如,在CMake中,可以使用add_library()函数添加库,并使用target_link_libraries()函数将库链接到可执行文件中。
cmake_minimum_required(VERSION 3.10)  
project(my_project)  
  
find_package(Torch REQUIRED)  
include(${TORCH_CMAKE_DIR}/TorchUtils.cmake)  
  
add_executable(my_executable main.cpp)  
target_include_directories(my_executable PRIVATE ${TORCH_INCLUDE_DIRS})  
target_link_libraries(my_executable ${TORCH_LIBRARIES})