LibTorch中Windows系统环境配置及CUDA不可用问题解决
前言:本文对在Windows系统上进行LibTorch开发环境配置及相关问题解决做一个较为详细的记录,以便后续查询使用。
使用环境版本:
Windows 11
Visual Studio 2022
CUDA 12.0
LibTorch 1.13.1_cu11.7
目录
- 一、LibTorch简介
- 二、LibTorch下载安装
- 三、Vistual Studio环境配置
- 四、示例程序
- 五、Release模式或Debug模式只有一个能正常加载模型,另一个模式报错
一、LibTorch简介
在 Python 深度学习圈,PyTorch 具有举足轻重的地位。同样的,C++ 平台上的 LibTorch 作为 PyTorch 的纯 C++ 接口,它遵循 PyTorch 的设计和架构,旨在支持高性能、低延迟的 C++ 深度学习应用研究。本文基于 Windows 环境与 Visual Studio 2022 开发工具,将从零开始搭建一个完整的深度学习LibTorch开发环境
二、LibTorch下载安装
安装LibTorch非常简单,只需要从其官网选择相应的版本即可,具体页面如下图所示。
如果需要加载PyTorch训练的模型文件,安装的LibTorch需要和PyTorch的版本一致。CUDA版本最好选与本机一致的版本进行使用,但是我的经验告诉我即使下载的版本和电脑安装的CUDA版本不一致,但只要能兼容也可以使用。比如我下载的LIbTorch的CUDA版本是11.7但是电脑的CUDA版本是12.0,也是可以正常使用的。最后将下载好的压缩包解压到本地合适位置。比如我的就解压在E:\dependency\libtorch-win-shared-with-deps-debug-1.13.1+cu117\文件夹下。
三、Vistual Studio环境配置
首先,在 Visual Studio 中创建一个名为 AIdemo的控制台项目。创建完成后,将项目设置为 Release 模式,x64 平台,如下图。
在 Visual Studio 中,右键点击项目AIdemo -> Properties 项目属性,在左侧导航栏中找到 VC++ Directories 选项。在右侧的Include Directories选项中将 LibTorch include 目录添加进去,详细如下(我既添加了Release版又添加了Debug版)。
E:\dependency\libtorch-win-shared-with-deps-debug-1.13.1+cu117\libtorch\include
E:\dependency\libtorch-win-shared-with-deps-debug-1.13.1+cu117\libtorch\include\torch\csrc\api\include
E:\dependency\libtorch-win-shared-with-deps-1.13.1+cu117\libtorch\include
E:\dependency\libtorch-win-shared-with-deps-1.13.1+cu117\libtorch\include\torch\csrc\api\include
在Library Directories选项中将LibTorch lib目录添加进去,详细如下
E:\dependency\libtorch-win-shared-with-deps-debug-1.13.1+cu117\libtorch\lib
E:\dependency\libtorch-win-shared-with-deps-1.13.1+cu117\libtorch\lib
具体如下图所示,配置结果如下图,注意检查窗口顶栏Configuration是否为All Configurations,Platform是否为x64。
然后找到C/C+±>General->Additonal Include Directories选项,在其中填入LibTorch Include,详细如下
E:\dependency\libtorch-win-shared-with-deps-debug-1.13.1+cu117\libtorch\include
E:\dependency\libtorch-win-shared-with-deps-debug-1.13.1+cu117\libtorch\include\torch\csrc\api\include
E:\dependency\libtorch-win-shared-with-deps-1.13.1+cu117\libtorch\include
E:\dependency\libtorch-win-shared-with-deps-1.13.1+cu117\libtorch\include\torch\csrc\api\include
最后找到Linker->Input->Additonal Dependencies选项,在其中填入LibTorch lib路径下所有的*.lib文件的文件名,详细如下。
asmjit.lib
c10.lib
c10d.lib
caffe2_nvrtc.lib
clog.lib
cpuinfo.lib
dnnl.lib
fbgemm.lib
fbjni.lib
gloo.lib
libprotobuf-lite.lib
libprotobuf.lib
libprotoc.lib
mkldnn.lib
pthreadpool.lib
pytorch_jni.lib
torch.lib
torch_cpu.lib
XNNPACK.lib
以上lib文件需要自行查看LibTorch lib路径下是否具有此文件,以上文件可能和LibTorch版本相关,如果你使用的版本没有,可以不用添加。正常到这一步你的环境已经搭建完成了,但是有些可能会遇到LibTorch的CUDA不能使用的问题,可以用如下命令查看是否有这种问题
//std::cout "CUDA: " << torch::cuda::is_available();//std::cout << "CUDNN: " << torch::cuda::cudnn_is_available() << std::endl;//std::cout << "GPU(s): " << torch::cuda::device_count() << std::endl;
如果程序返回结果都为非0,那证明CUDA以及CUDNN都是可用的,自此环境已经搭建完成,但是也有可能返回结果为0证明CUDA以及CUDNN都不可用。需要进行如下设置,找到Linker->Command Line选项,在其中填入如下命令
/INCLUDE:"?ignore_this_library_placeholder@@YAHXZ"
即可解决上述问题,此命令适用于LibTorch1.13.1版本,较早版本填入的命令可能不同。
四、示例程序
至此,我们的开发环境已经搭建完成,可以通过如下示例程序验证我们的配置是够正确,
#include "torch/torch.h"
#include "torch/script.h"void main()
{std::cout << "这是生成张量操作!" << std::endl;torch::Tensor output = torch::randn({ 3,2 });std::cout << output << std::endl;std::cout << "CUDA:" << torch::cuda::is_available() << std::endl;std::cout << "CUDNN: " << torch::cuda::cudnn_is_available() << std::endl;std::cout << "GPU(s): " << torch::cuda::device_count() << std::endl;
}
如果显示如下结果,则证明我们的环境配置成功,可以进行开发工作了
五、Release模式或Debug模式只有一个能正常加载模型,另一个模式报错
关于Debug模式可以正常加载模型,Release模式加载错误问题的解决。在配置好环境之后,Debug模式一切正常,但是Release模式下加载模型失败。具体错误如下图所示
刚开始我以为是我配置属性表出了问题,反复确认后没有找到问题。后来查找资料,我发现,由于我没有将libtorch的dll文件放到对应的exe生成目录里,而是直接在环境变量里设置了dll的目录,即lib的路径,所以在环境变量中,debug和release的lib路径顺序先后会影响debug模式或者release模式的运行,比如debug环境变量放在前面,debug模式就能运行,release模式就不能读取模型了。
解决方案:将lib文件夹下的所有dll文件,分别复制粘贴到对应的输出目录里。(注意需要将Release版本的lib文件夹下的dll文件放在Release模式下的输出目录里,Debug版本的lib文件夹下的dll文件同理。)
输出目录如下方式找到
项目右击->Properties->General->Output Directory,路径如下图所示
PS:本人在实验中想探究一下是不是环境变量影响了Release模式下的运行结果,于是将环境变量中的Release版本的lib路径移到Debug版本的前面。但是在Visual Studio 2022重新运行Release模式同样失败。嗯?难道分析有误?并不是,重启Visual Studio即可!由于之前打开Visual Studio时已经加载了之前的环境变量,因此更改之后并没有对Visual Studio生效,重新打开,加载新的环境变量即可。
祝好运!!!
相关文章:

LibTorch中Windows系统环境配置及CUDA不可用问题解决
前言:本文对在Windows系统上进行LibTorch开发环境配置及相关问题解决做一个较为详细的记录,以便后续查询使用。 使用环境版本: Windows 11 Visual Studio 2022 CUDA 12.0 LibTorch 1.13.1_cu11.7 目录一、LibTorch简介二、LibTorch下载安装三…...

Java并发编程实战二
线程间的通讯方式 1.volitate(缓存一致性协议),synchronize,lock(都保证可见性) 2.wait.notify,await(),signal(前两个是Object,后两个属于lock) 3.管道输入、输出流 (示例代码:PipeInOut.java)(目前几乎没人使用) 管道输入/输…...

Linux中最基本的命令ls的用法有哪些?
Linux是一种流行的操作系统,被广泛应用于服务器和个人电脑。Linux命令行界面是使用Linux操作系统的关键。其中一个最基本的命令是"ls"命令,该命令用于列出指定目录中的所有文件和子目录。在这篇文章中,我们将探讨ls命令及其各种用途…...

第 100002(十万零二)个素数是多少?
题目描述 素数就是不能再进行等分的整数。比如7,11。而 9 不是素数,因为它可以平分为 3 等份。一般认为最小的素数是2,接着是 3,5,... 请问,第 100002(十万零二)个素数是多少? 请注意࿱…...
Lua迭代器
Lua迭代器 迭代器(iterator)是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。 在 Lua 中迭代器是一种支持指针类型的结构,它可以遍历集合的每一个元素。 泛型 f…...

同步与互斥之信号量
目录 1、信号量用于线程的互斥 验证 2、信号量用于线程的同步 验证 3、无名信号量用于进程间互斥 代码一 代码二 验证 4、有名信号量 用于进程间同步和互斥 验证 信号量广泛用于进程或线程间的同步和互斥,信号量本质上是一个非负的整数计数器,它…...

如何当个优秀的文档工程师?从 TC China 看技术文档工程师的自我修养
本文系 NebulaGraph Community Academic 技术文档工程师 Abby 的参会观感,讲述了她在中国技术传播大会分享的收获以及感悟。 据说,技术内容领域、传播领域的专家和决策者们会在中国技术传播大会「tcworld China 2022」大会上分享心得。作为一名技术文档工…...
如何学习k8s
学习Kubernetes可以遵循以下步骤: 了解Kubernetes的基本概念和架构。学习Kubernetes前,需要了解它的基本概念和组成部分,包括Pod、Service、ReplicaSet、Deployment、Namespace等等,同时也需要了解Kubernetes的整体架构和工作原理…...
【SSM】MyBatis(十.动态sql)
文章目录1.if2.where3.trim4.set5. choose when otherwise6.foreach6.1 批量删除6.2 批量增加7.sql1.if <select id"selectByMultiCondition" resultType"Car">select * from t_car where 1 1<if test"brand ! null and brand ! ">…...

最近很多人都在说 “前端已死”,讲讲我的看法
转自 : 掘金 作者 : Ethan_Zhou 现状 我记得去年脉脉的论调还都是 客户端已死,前后端还都是一片祥和,有秀工资的,有咨询客户端转前端的,怎么最近打开脉脉一看,风向变了? 随便刷几下,出来的信息…...
大家好,我是火旺技术
大家好,我是火旺技术 在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用。这其中,家乡特色推荐的网络应用已经成为外国家乡推荐系统的一种很普遍的方式。不过,在国内,管理网站可能还处于起步阶段。 …...

【Java并发编程系列】全方位理解多线程几乎包含线程的所有操作哦
文章目录一、概述及目录二、实现多线程的方式2.1 继承Tread类,重写run方法。start方法2.2 实现Runnable方法,并实现run接口方法2.3 实现Callable接口重写call方法,Feature.get()获取返回值三、线程的执行流程3.1 执行流程3.2 start方法和 run…...

天宝S6测量机器人/天宝S6全站仪参数/教程/Trimble 天宝全站仪
TRIMBLE DR PLUS技术 Trimble DR Plus™距离测量技术实现更大范围的直接反射测量,不使用棱镜也能进行长距离测量。难以抵达或不安全的测 量目标,对Trimble S6来说不再是问题。Trimble DR Plus结合 了MagDrive™磁驱伺服技术,使测量的快捷和…...
c++基础知识汇总
目录 1、基础 1.2 注释 1.3 变量 1.4 常量 1.5 关键字 1.6 标识符命名规则 2 数据类型 2.1 整型 2.2 sizeof关键字 2.3 实型(浮点型) 2.4 字符型 2.5 转义字符 2.6 字符串型 2.7 布尔类型 bool 2.8 数据的输入 1、基础 1.2 注释 作用&a…...

重磅!基于GPT-4的全新智能编程助手 GitHub Copilot X 来了!
GitHub Copilot相信大家一定不陌生了,强大的智能代码补全功能一度让媒体直呼程序员要被替代。随着OpenAI推出全新的GPT-4,GitHub Copilot也在3月22日,推出了全新一代产品:GitHub Copilot X 。最新的GitHub Copilot X 不仅可以自动…...

第04章_运算符
第04章_运算符 🏠个人主页:shark-Gao 🧑个人简介:大家好,我是shark-Gao,一个想要与大家共同进步的男人😉😉 🎉目前状况:23届毕业生,目前在某公…...

Excel 文件比较工具:xlCompare 11.0 Crack
(Excel 文件比较工具)xlCompare 11.0 下载并安装最新版本的 xlCompare。下载是一个功能齐全的版本。 筛选匹配的行 筛选不同的行 仅显示两个 Excel 文件中存在的行,并排除新(已删除)行 隐藏在另一张工作表上具有相应行…...

802.1x认证原理
802.1x认证原理802.1X认证简介802.1X认证协议802.1X认证流程802.1X认证简介 定义:802.1x协议是一种基于端口的网络接入控制协议。基于端口的网络接入控制,是指在局域网接入设备的端口这一级验证用户身份,并且控制其访问权限。优点࿱…...

GPIO的八种模式分析
GPIO是general purpose input output,即通用输入输出端口,作用是负责外部器件的信息和控制外部器件工作。 GPIO有如下几个特点:1.不同型号的IO口数量不同;2,反转快速,每次翻转最快只需要两个时钟周期,以ST…...
携职教育:财会人常用必备,203个EXCEL快捷键汇总
会用快捷键的人早下班! 作为财务人员如果你想要提高工作效率,不掌握一些Excel快捷键怎么行? 老板看见了,也会赞一声,“看,这就是专业。” 立马给你加薪(划掉),工作效率这…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
鸿蒙(HarmonyOS5)实现跳一跳小游戏
下面我将介绍如何使用鸿蒙的ArkUI框架,实现一个简单的跳一跳小游戏。 1. 项目结构 src/main/ets/ ├── MainAbility │ ├── pages │ │ ├── Index.ets // 主页面 │ │ └── GamePage.ets // 游戏页面 │ └── model │ …...