libtorch在windows使用(c++项目中部署.pt)

news2024/11/27 5:33:52

狗头

pytorch官网教程:Loading a TorchScript Model in C++ — PyTorch Tutorials 1.13.1+cu117 documentation

首先我已经有了个model.pt,就不需要做前面序列化为文件之类的操作,直接从在C++中加载开始

最后成功的版本:

example-app.cpp 内容:

#include <torch/script.h>
#include <torch/cuda.h>
int main(int argc, char* argv[]) {
    torch::jit::script::Module module;

    // auto  device = torch::Device(c10::DeviceType::CUDA, 0);
    //auto device = torch::kCUDA;

    try {
        std::cout << "before loading" << std::endl;
        module = torch::jit::load("D:\\project\\example-app\\model_withoutgpu.pt");
        // module.to(device);
        std::cout << "after loading" << std::endl;
    }
    catch (const c10::Error& e) {
        std::cerr << "error loading the model\n";
        //return -1;
    }
    std::cout << "ok" << std::endl;
    std::vector<torch::jit::IValue> inputs;
    inputs.push_back(torch::rand({ 1, 6 }));

    // Execute the model and turn its output into a tensor.
    at::Tensor output = module.forward(inputs).toTensor();

    // std::cout << "cuda是否可用:" << torch::cuda::is_available() << std::endl;
    // std::cout << "cudnn是否可用:" << torch::cuda::cudnn_is_available() << std::endl;
    std::cout << "ok" << std::endl;
    while(1);
}

CMakeLists.txt 内容:

find_package(PythonInterp REQUIRED)

cmake_minimum_required(VERSION 3.0 FATAL_ERROR)
project(custom_ops)
cmake_policy(SET CMP0054 NEW)
find_package(Torch REQUIRED)

add_executable(example-app example-app.cpp)
target_link_libraries(example-app "${TORCH_LIBRARIES}")
set_property(TARGET example-app PROPERTY CXX_STANDARD 14)

cmd中,cmake指令:

进入example-app\build_debug路径下

cmake -DCMAKE_PREFIX_PATH=D:\libtorch -DCMAKE_BUILD_TYPE=Release -G "Visual Studio 17 2022" ..

这一步结束后

cmake --build . --config Debug

其中 -DCMAKE_PREFIX_PATH=D:\libtorch根据自己路径修改,"Visual Studio 17 2022"根据自己visualstudio版本修改,--config Debug根据debug还是release修改,也可以进入项目中编译。

遇到的问题和几点:

  1. dll放入exe所在文件夹

  1. 最重要的libtorch和pytorch版本对应,这个版本对应网上说法众说纷纭,就说我最后成功的。对应cuda11.7的libtorch1.13.1版本,是cpu版本还是cuda版本也要看清楚。训练环境在anaconda下,pytorch也是cuda版本1.13.1,cuda是11.7。但我训练时并没有使用gpu,最后加载成功。我尝试如果训练时使用gpu生成的.pt就会加载失败,在python在加载没有问题,但是使用时会报RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu! 的问题,但探索源码确实训练时只使用了cuda。如果有人能解答我很感激。

  1. torch.jit.load不能加载用torch.save保存的模型,必须对应。

  1. 在windows下libtorch的release版本和Debug版本是不同的,混用就会失败,在编译时要使用对用的libtorch。release就是发布版本,有问题不会报错直接退出了,调试不便,所以改用debug。但是release的执行速度远远快于debug版本,因此可以等没问题了换回。和名字对应了。

  1. cmake时warning: Policy CMP0054 is not set: Only interpret if() arguments as variables or keywords when unquoted.

在CMakeLists.txt中加入cmake_policy(SET CMP0054 NEW)解决

cmake配置libtorch报错Failed to compute shorthash for libnvrtc.so,在CMakeLists.txt中加入find_package(PythonInterp REQUIRED)解决,必须放在开头

  1. 还有一个思路就是c++这边的问题比较难判断是哪一块,可以在python中尝试相同接口加载.pt看会不会出现错误。因为c++这出错不是报c10::error就是abort() has been calles. 根本无从下手啊。还有当考虑输入维度出现问题的话,都可以在python中用相同接口来验证。

import torch
policy = torch.jit.load('model_withoutgpu.pt')

output = policy.forward(torch.rand(1,6))
print(output)

actions = policy(torch.rand(1, 6))
print(actions)
print(actions.shape)
  1. 同时每次都需要出去点exe感觉也很麻烦,我更想用本地Windows调试器。这时会报:

无法启动项目,\ALL_BULID拒绝访问。

解决方法:把cmake自动生成的另外两个项目ALL_BUILD和ZERO_CHECK右键移除即可

我在成功后尝试将这段代码嵌入自己的项目中,在visualstudio中配置即可,不用写cmake也可以,很愉快。还是注意看清release还是debug。

  1. 添加工程的头文件目录:项目-xxx属性-配置属性-c/c++-常规-附加包含目录:

  1. 添加文件引用的lib静态库路径:项目-xxx属性-配置属性-链接器-常规-附加库目录:

  1. 然后添加工程引用的lib文件名:项目-xxx属性-配置属性-链接器-输入-附加依赖项:

libtorch-win-shared-with-deps-debug-1.13.1+cu117\libtorch\lib下所有.lib

  1. 把libtorch\lib下所有dll放到exe所在的文件夹下。

运行成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/153565.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机CCF-C的SCI期刊,值得投稿吗? - 易智编译EaseEditing

ccf应该说是比较权威的&#xff0c;哪怕是C类。 目前不少SCI期刊开始在投稿时&#xff0c;就建议非英语母语作者进行SCI润色后再投稿。 甚至有的杂志还将润色后的English editing certificate作为硬性上传文件指标&#xff0c;列在投稿系统中。 英语润色也是为了避免学术上的…

超优化文章记录之NeurIPS2022_Gradient Descent: The Ultimate Optimizer

作者&#xff1a;Kartik Chandra 单位&#xff1a;MIT 官网链接&#xff1a;Github 下面将首先以简单翻译文章重要内容&#xff0c;穿插一些讲解&#xff0c;并进行简单的复现实验。之后总结各种资料&#xff0c;如review意见等。最后讲解代码&#xff0c;研究具体实现。 文章…

VUE_关于Vue.use()详解

问题 相信很多人在用Vue使用别人的组件时&#xff0c;会用到 Vue.use() 。例如&#xff1a;Vue.use(VueRouter)、Vue.use(MintUI)。但是用 axios时&#xff0c;就不需要用 Vue.use(axios)&#xff0c;就能直接使用。那这是为什么呐&#xff1f; 答案 因为 axios 没有 instal…

Arduino工程的创建和实例使用

下载安装 网址&#xff1a;https://www.arduino.cc/en/software&#xff0c;如下图&#xff0c;选择合适的版本下载使用 下载后直接安装就行 因为这是一个完全开源免费的软件不需要破解&#xff0c;只需要注意安装目录就行 可以参考https://blog.csdn.net/impossible_Jesse…

Kubernetes(k8s) 笔记总结(三)

提示&#xff1a;针对kubernetes的服务网络学习。 文章目录一、Kubernetes的 Service服务发现 ClusterIP方式1. Service 介绍2. Service 暴露ClusterIP的方式(集群内部访问)3. Service 暴露NodePort方式(集群外也可以访问)二、Kubernets 之 Ingress1. Ingress 介绍2. Ingress 安…

十一、51单片机之串口通信

1、通信的关键 (1)事先约定。通信之前规定好的&#xff0c;如通信速率&#xff0c;起始信号&#xff0c;结束信号等。 (2)通信传输的基本信息单元。 (3)信息的编码、传输、解码。 2、通信相关的概念 2.1、同步和异步 (1)同步通信要求接收端时钟频率与发送端时钟频率一致&a…

【Python爬虫项目实战】Python爬虫采集弹幕数据

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、开发工具二、环境搭建三、数据来源查询分析四、代码实现1. 发送请求2.设置编码格式3.解析数据4.保存数据总结前言 今天给大家介绍的是Python爬虫采集弹幕数…

django项目中使用logging记录日志

前提 基于已有项目https://blog.csdn.net/qq_38122800/article/details/128583379?spm1001.2014.3001.5502 1、修改settings.py 在settings.py文件中添加如下代码: 先导入模块: import os,time#配置日志cur_path os.path.dirname(os.path.realpath(__file__)) # log_pat…

Vue3——第九章(依赖注入:provide、inject)

一、Prop 逐级透传问题 通常情况下&#xff0c;当我们需要从父组件向子组件传递数据时&#xff0c;会使用 props。如果需要给深层子组件传递数据&#xff0c;会非常麻烦&#xff0c;如下图&#xff1a; provide 和 inject 可以帮助我们解决这一问题。一个父组件相对于其所有的…

【memcpy和memove函数的详解】

1.memcpy函数详解 模拟实现memcpy函数 2.memmove函数详解 模拟实现memmove函数 memset函数详解 memcpy函数 了解一个函数&#xff0c;就查询该函数的相关信息 memcpy函数在库中的声明如下&#xff1a; void * memcpy ( void * destination, const void * source, size_…

Node.js安装与编写

Node.js是JavaScript运行环境&#xff0c;是可以让JavaScript运行在服务端的开发平台。 Node.js对一些特殊用例进行优化&#xff0c;提供替代的API。 Node.js本质上是为文件系统、数据库之类的资源提供接口。 Node.js是单线程的&#xff0c;通过事件循环&#xff08;event l…

05【JSP-MVC】

文章目录05【JSP-MVC】一、JSP简介1.1 JSP概述1.1.1 HTML和Servlet的弊端1.1.1 什么是JSP1.2 JSP体验&#xff1a;1.2.2 JSP的执行过程1.2.2 JSP和Servlet是什么关系&#xff1f;二、JSP的脚本元素2.1 JSP中的注释&#xff1a;2.2 JSP脚本表达式2.3 JSP代码片段2.4 JSP声明2.5 …

数字音频接口DAI之I2S/PCM

I2S/PCM数字音频接口概述数字音频接口DAI&#xff0c;即Digital Audio Interfaces&#xff0c;顾名思义&#xff0c;DAI表示在板级或板间传输数字音频信号的方式。相比于模拟接口&#xff0c;数字音频接口抗干扰能力更强&#xff0c;硬件设计简单&#xff0c;DAI在音频电路设计…

深度学习——循环神经网络RNN(笔记)

循环神经网络RNN&#xff1a;对于序列模型的神经网络 1.回顾&#xff1a;潜变量自回归模型 使用潜变量ht总结过去的信息 ①xt跟当前的ht和x(t-1)相关 ②ht跟ht-1和xt-1相关 ③n元语法模型中&#xff0c;单词xt在时间t的条件概率取决于前面n-1个单词 隐藏层和隐藏状态的区别…

【ESP32Cam项目1】:ESP32Cam人脸检测(ArduinoESP32底层、Python版opencv)

人脸检测项目效果图&#xff1a; 人脸检测效果视频&#xff1a; 暮年的主页 - 抖音 (douyin.com) 人脸检测项目目标&#xff1a; 大家好&#xff01;近期拿到了便宜的ESP32Cam开发板&#xff0c;摄像头让我想起来人脸识别&#xff0c;于是ESP32Cam人脸检测项目由此诞生。后期还…

一文总结ACE代码框架

一、前言ACE_Engine框架是OpenAtom OpenHarmony&#xff08;简称“OpenHarmony”&#xff09;的UI开发框架&#xff0c;为开发者提供在进行应用UI开发时所必需的各种组件&#xff0c;以及定义这些组件的属性、样式、事件及方法&#xff0c;通过这些组件可以方便进行OpenHarmony…

JavaScript面试题

目录1.★★ 介绍一下JS的内置类型有哪些&#xff1f;2.★★★★ 介绍一下 typeof 区分类型的原理3.★★★ 介绍一下类型转换4.★★★★ 说说你对 JavaScript 的作用域的理解。什么是作用域链&#xff1f;5.★★ 解释下 let 和 const 的块级作用域6.★★★★ 说说你对执行上下文…

用Vue+Nodejs+Axios+express连接Sqlserver做一个动态网页demo

文章目录一、主要工具二、流程2.1. 安装Node2.2. 新建Vue工程并启动2.3. 前后端通信2.3.1. 修改前端2.3.2. 用axios来发起请求2.3.3. 创建服务端程序一、主要工具 Vue做前端页面Nodejs做服务器后端&#xff08;Nodejs是一个JS的运行环境&#xff0c;可以让JS像其它后端语言一样…

使用超体素上下文和基于图的优化从MLS点云对城市地区的树木进行实例分割

Abstract 在本文中&#xff0c;开发了一种用于从城市场景中的 MLS 数据集中提取树木的实例分割方法。所提出的方法利用超体素结构来组织点云&#xff0c;然后从超体素的局部上下文中提取去除趋势的几何特征。结合局部上下文的去趋势特征&#xff0c;将采用随机森林&#xff08…

Qt基于CTK Plugin Framework搭建插件框架--创建插件

文章目录一、前言二、工程搭建2.1、新建Qt工程2.2、CTK环境配置三、CTK Plugin Framework使用3.1、主函数启动插件框架3.2、插件的创建3.3、插件的使用一、前言 CTK保姆级编译教程&#xff1a;https://blog.csdn.net/Mr_robot_strange/article/details/128547331?spm1001.201…