Java / Tensorflow - API 调用 pb 模型使用 GPU 推理

news/2024/4/30 9:17:56/文章来源:https://blog.csdn.net/BIT_666/article/details/127073684

目录

一.引言

二.Java / Tensorflow 代码配置

1.代码配置

2.Maven 配置

三.环境检测

1.显卡检测

2.显卡监控

四.推理踩坑

1.异常现象

2.异常日志

五.安装 cuda-10.0

1.下载 cuda 安装包

2.安装 cuda

2.1 preface 前言

2.2 安装配置

2.3 安装完成

2.4 可能遇到的问题

六.安装 cuDNN

1.安装 cuDNN

2.解压 tgz 文件

3.查看 cuDNN 版本

七.使用 cuda-10.0 推理

八.总结


一.引言

使用 Java Tensorflow API 调用 pb 模型执行推理逻辑,之前一直使用 CPU,近期尝试 GPU 推理,下面记录一下踩坑的过程。

二.Java / Tensorflow 代码配置

1.代码配置

      // GPU 使用配置val gpuConfig = GPUOptions.newBuilder().setVisibleDeviceList("0").setForceGpuCompatible(true).setAllowGrowth(true).build()// Tensorflow 模型加载配置val configproto = ConfigProto.newBuilder().setGpuOptions(gpuConfig).setInterOpParallelismThreads(op).setIntraOpParallelismThreads(op).build()

使用 GPU 还是 CPU 在代码配置阶段主要差别于是否在 configproto 中增加 GpuOptions,GPUOptions 需要单独使用 builder 初始化:

AllowGrouwth: 是否预先分配整个指定的 GPU 内存区域,如果为 True 则按需增长

ForceGpuCompatible: 启用此选项会强制所有 CPU 张量分配有 Cuda 固定内存,对于较大模型不推荐

VisibleDeviceList: 指定 GPU 设备,一般从0开始,例如 /device:GPU:0,也可以逗号分隔指定多台,例如 "0,1,2,3"

2.Maven 配置

tensorflow 基础依赖

        <dependency><groupId>org.tensorflow</groupId><artifactId>tensorflow</artifactId><version>1.15.0</version><scope>provided</scope></dependency>

这里正常情况下 CPU 推理使用下面的版本依赖,如果使用 GPU 需使用 jni_gpu 版本: 

        // GPU<dependency><groupId>org.tensorflow</groupId><artifactId>libtensorflow_jni_gpu</artifactId><version>1.15.0</version><scope>provided</scope></dependency>// CPU<dependency><groupId>org.tensorflow</groupId><artifactId>libtensorflow_jni</artifactId><version>1.15.0</version><scope>provided</scope></dependency>

三.环境检测

1.显卡检测

在使用 Java x Tensorflow x GPU 推理时,首先需要确保自己的显卡配置成功,可以在对应环境下执行下述 python 代码,确保 GPU 配置成功:

from tensorflow.python.client import device_libdevice_lib.list_local_devices()

执行后如果出现下述样例日志,代表 GPU 环境配置无误,可以看到这里是 Device-0,这里 0 和上面的  VisibleDeviceList 对应,可以制定该参数为 "0",使用该显卡。

确定环境无误后,下面开始踩坑 GPU 推理过程。

2.显卡监控

可以使用 nvidia-smi 命令检测显卡显存与利用率:

如果运行任务,可以使用 watch 命令,固定间隔实时更新显卡使用率,-n 代表频率,1代表1s,执行命令后,bash 上会每s更新一次上图的显卡指标:

watch -n 1 nvidia-smi

四.推理踩坑

pom 修改为 GPU 对应依赖,代码也增加 GPUOptions 后,开始了第一次测试。

1.异常现象

任务可执行,但执行期间显卡监控只有显存的增加而 GPU-Util 利用率 始终为 0,怀疑是模型加载到显存中,但是由于某些原因模型无法使用 GPU 推理所以出现如下情况:

2.异常日志

查看模型加载的日志才发现有如下异常,无法加载 cuda10.0.so xxxx 类似的报错:

2022-09-27 10:58:21.077390: I tensorflow/cc/saved_model/reader.cc:31] Reading SavedModel from: /root/xudong/3fe686d2-59e1-4821-b5a3-baa79d0d53b8
2022-09-27 10:58:21.110117: I tensorflow/cc/saved_model/reader.cc:54] Reading meta graph with tags { serve }
2022-09-27 10:58:21.136320: I tensorflow/core/platform/cpu_feature_guard.cc:142] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 AVX512F FMA
2022-09-27 10:58:21.144301: I tensorflow/core/platform/profile_utils/cpu_utils.cc:94] CPU Frequency: 2600000000 Hz
2022-09-27 10:58:21.145011: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x7f3c00495c00 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
2022-09-27 10:58:21.145065: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): Host, Default Version
2022-09-27 10:58:21.146331: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcuda.so.1
2022-09-27 10:58:21.158831: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1618] Found device 0 with properties:
name: Tesla V100-PCIE-32GB major: 7 minor: 0 memoryClockRate(GHz): 1.38
pciBusID: 0000:21:02.0
2022-09-27 10:58:21.158971: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcudart.so.10.0'; dlerror: libcudart.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/jdk1.8.0_131/jre/lib/amd64/server:/usr/local/jdk1.8.0_131/jre/lib/amd64:/usr/local/jdk1.8.0_131/jre/../lib/amd64:/usr/local/cuda-11.2/lib64/:/usr/local/cuda/targets/x86_64-linux/lib/:/usr/local/hadoop-2.7.3/lib/native/:/usr/local/jdk1.8.0_131/jre/lib/amd64/server/
2022-09-27 10:58:21.159037: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcublas.so.10.0'; dlerror: libcublas.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/jdk1.8.0_131/jre/lib/amd64/server:/usr/local/jdk1.8.0_131/jre/lib/amd64:/usr/local/jdk1.8.0_131/jre/../lib/amd64:/usr/local/cuda-11.2/lib64/:/usr/local/cuda/targets/x86_64-linux/lib/:/usr/local/hadoop-2.7.3/lib/native/:/usr/local/jdk1.8.0_131/jre/lib/amd64/server/
2022-09-27 10:58:21.159092: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcufft.so.10.0'; dlerror: libcufft.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/jdk1.8.0_131/jre/lib/amd64/server:/usr/local/jdk1.8.0_131/jre/lib/amd64:/usr/local/jdk1.8.0_131/jre/../lib/amd64:/usr/local/cuda-11.2/lib64/:/usr/local/cuda/targets/x86_64-linux/lib/:/usr/local/hadoop-2.7.3/lib/native/:/usr/local/jdk1.8.0_131/jre/lib/amd64/server/
2022-09-27 10:58:21.159150: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcurand.so.10.0'; dlerror: libcurand.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/jdk1.8.0_131/jre/lib/amd64/server:/usr/local/jdk1.8.0_131/jre/lib/amd64:/usr/local/jdk1.8.0_131/jre/../lib/amd64:/usr/local/cuda-11.2/lib64/:/usr/local/cuda/targets/x86_64-linux/lib/:/usr/local/hadoop-2.7.3/lib/native/:/usr/local/jdk1.8.0_131/jre/lib/amd64/server/
2022-09-27 10:58:21.159203: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcusolver.so.10.0'; dlerror: libcusolver.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/jdk1.8.0_131/jre/lib/amd64/server:/usr/local/jdk1.8.0_131/jre/lib/amd64:/usr/local/jdk1.8.0_131/jre/../lib/amd64:/usr/local/cuda-11.2/lib64/:/usr/local/cuda/targets/x86_64-linux/lib/:/usr/local/hadoop-2.7.3/lib/native/:/usr/local/jdk1.8.0_131/jre/lib/amd64/server/
2022-09-27 10:58:21.159259: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'libcusparse.so.10.0'; dlerror: libcusparse.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/jdk1.8.0_131/jre/lib/amd64/server:/usr/local/jdk1.8.0_131/jre/lib/amd64:/usr/local/jdk1.8.0_131/jre/../lib/amd64:/usr/local/cuda-11.2/lib64/:/usr/local/cuda/targets/x86_64-linux/lib/:/usr/local/hadoop-2.7.3/lib/native/:/usr/local/jdk1.8.0_131/jre/lib/amd64/server/
2022-09-27 10:58:21.162605: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library libcudnn.so.7
2022-09-27 10:58:21.162628: W tensorflow/core/common_runtime/gpu/gpu_device.cc:1641] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://www.tensorflow.org/install/gpu for how to download and setup the required libraries for your platform.
Skipping registering GPU devices...
2022-09-27 10:58:21.283803: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1159] Device interconnect StreamExecutor with strength 1 edge matrix:
2022-09-27 10:58:21.283842: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1165]      0
2022-09-27 10:58:21.283850: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1178] 0:   N
2022-09-27 10:58:21.366089: I tensorflow/cc/saved_model/loader.cc:202] Restoring SavedModel bundle.
2022-09-27 10:58:21.572327: I tensorflow/cc/saved_model/loader.cc:151] Running initialization op on SavedModel bundle at path: /root/xudong/3fe686d2-59e1-4821-b5a3-baa79d0d53b8
2022-09-27 10:58:21.641867: I tensorflow/cc/saved_model/loader.cc:311] SavedModel load for tags { serve }; Status: success. Took 564483 microseconds.

上面报错比较多,主要的报错是这句 Could not load dynamic library 'libcudart.so.10.0' :

Could not load dynamic library 'libcudart.so.10.0'; dlerror: libcudart.so.10.0: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/jdk1.8.0_131/jre/lib/amd64/server:/usr/local/jdk1.8.0_131/jre/lib/amd64:/usr/local/jdk1.8.0_131/jre/../lib/amd64:/usr/local/

即无法加载对应 cuda 的 so 文件,so 文件可以看做是 c++ 封装好的 java API,支持 JAVA 调用。回看上面显卡的监控情况,CUDA Version 为 11.4,这里加载 so.10.0,肯定异常,所以需要安装 cuda-10.0,且支持双环境。

五.安装 cuda-10.0

1.下载 cuda 安装包

打开 CUDA 官网,由于上面报错无法加载 so.10.0,所有这里下载 10.0 对应版本,博主这里使用 linux 环境,下面选项分别为 Linux + x86_64 + CentOS + 7 + runFile(local):

 待下载完成后,会获得一个 cuda_10.0.130_410.48_linux.run 文件

2.安装 cuda

博主 cuda 安装在 /usr/local 目录下,所以可以直接将  cuda_10.0.130_410.48_linux.run 文件移动至 /usr/lcoal 下:

执行下述命令:

sudo sh cuda_10.0.130_410.48_linux.run --override

2.1 preface 前言

执行安装后几s内会弹出 preface 相关的序言,这里按 'q' 继续即可:

2.2 安装配置

第一个选项必须 accept,否则安装会直接退出

第二个选项安装显卡驱动,我们前边检验已经通过,所以 n 否

第三个选项安装 cuda 工具包 ,必须的 y

第四个安装地址,默认 /usr/local/cuda-10.0 enter 回车即可,也可以自定义位置

第五个安装 cuda 环境,由于我们默认环境为 cuda 11.x 所以这里选择 n 否,否则会覆盖原有环境,如果你没有 cuda 环境,y 即可

第六个是否安装 cuda 样例,y、n 均可

最后一个选项即样例的位置,可以 enter 回车默认,也可以自定义

选择完毕后,会出现 Installing the CUDA .... 提示,代表开始安装。

2.3 安装完成

 出现如上日志即代表安装成功,可以看到 /local/usr 目录下也出现 cuda-10,0 的文件夹:

2.4 可能遇到的问题

安装期间可能出现报错并退出,提示用户到 /var/log/nvidia-installer.log 目录下查看安装异常日志:

通过查看日志分析原因,安装期间所在机器 GPU 不能处于使用期间,如果 GPU 使用期间安装会导致安装失败,因为 Dirver 需要 upgrade,所以安装期间需要保证 GPU 未使用,可以使用 top 命令查看相关任务的 pid,并 kill 掉对应 pid 保证 GPU 不再使用。

六.安装 cuDNN

CUDA 是 NVIDIA 推出的运算平台,cuDNN 是用于深度网络的 GPU 加速库,可以支持 GPU 实现高性能并行计算。

1.安装 cuDNN

进入cuDNN 官网 可以选择对应版本的 cuDNN,博主上述采用 cuda 10.0 + linux:

这里下载需要注册邮箱,比较麻烦,大家也可以在这里选中版本在网上搜索直接下载即可。 将得到的下载文件后缀修改为 tgz 得到:

cudnn-10.0-linux-x64-v7.4.1.5.tgz

2.解压 tgz 文件

	tar -xvf cudnn-10.0-linux-x64-v7.4.1.5.tgz

解压 cudnn 文件得到 cuda 文件夹: 

 继续执行 cp 命令,将 cuda 中的文件拷贝至刚才安装的 cuda-11.0 的文件夹中:

cp cuda/lib64/* /usr/local/cuda-10.0/lib64/
cp cuda/include/* /usr/local/cuda-10.0/include/
chmod a+r /usr/local/cuda-10.0/lib64/*
chmod a+r /usr/local/cuda-10.0/include/*

3.查看 cuDNN 版本

cat /usr/local/cuda-10.0/include/cudnn.h | grep CUDNN_MAJOR -A2

出现下述日志即安装成功: 

七.使用 cuda-10.0 推理

由于我并未未将 cuda-10.0 设置为环境变量,因此如果 shell 脚本中使用 cuda-10.0 需指定对应目录:

export CUDA_DIR="/usr/local/cuda-10.0/"

在 shell 中 export CUDA_DIR 即可指定至所需环境,使用其他 CUDA 环境同理,如果不添加则默认使用环境变量下的 CUDA-11.x。此时再次执行推理任务不再出现无法加载 so.10.0 相关日志,而是 Successfully opened so.10.0 xxx,代表前面安装成功,并且成功加载了 device-0。

 再次查看显卡监控:

可以看到在显存占用的情况下,GPU 利用率也不再是 0%,大功告成!

八.总结

Java x Tensorflow x GPU 踩坑大致就这么多,一般来说推理还是用 python 或者 c++ 更方便一些,如果使用 java API ,可以参考如下表格选择 cuda 版本:

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day013--mysql中的子查询

目录 一&#xff0c;前言 二&#xff0c;子查询的定义及书写格式 1&#xff0c;定义 2&#xff0c;书写格式 三&#xff0c;子查询的分类 1&#xff0c;单行子查询和多行子查询 2&#xff0c;相关子查询和非相关子查询 一&#xff0c;前言 相信大家还记得之前我们在学习分…

保研专业课参考

文章目录数据结构1.什么是平衡树&#xff1f;平衡树是怎么创建的&#xff1f;2.二叉排序树的性质&#xff1a;3.如何编程判断一棵二叉树是完全二叉树4.二叉树怎么求高度&#xff08;山大计算机&#xff09;5.在图中找到一个连通图&#xff0c;有n个顶点&#xff0c;n-1条边使得…

SQL Server大分区表没有空分区的情况下如何扩展分区的方法

官方文档https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-partition-function-transact-sql?viewsql-server-ver16 Best Practices Always keep empty partitions at both ends of the partition range. Keep the partitions at both ends to guarantee that th…

【学生网页作业】航海王动漫网页 html+ css + JavaScript 简单的学生网页作业源码

&#x1f329;️ 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f482; 作者主页: 【进入主页—&#x1f680;获取更多源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;HTML5网页期末作业 (1000套…

手机用Postern配置socks5全局代理详细教程

以静态Socks5独享IP的单地区资源为例&#xff0c;即IP资源全部归属单一城市&#xff0c;不会变动&#xff0c;如南京区域&#xff0c;则IP全部为南京城市出口。 关于Socks5的使用有多种方案&#xff0c;可应用于PC&#xff0c;安卓&#xff0c;模拟器&#xff0c;请根据情况灵…

EasyRecovery15万能数据恢复软件全面详细功能讲解

EasyRecovery 15是由全球著名数据厂商Ontrack 出品的一款非常优秀的数据恢复软件&#xff0c;在诸多数据恢复软件中这款软件可以说是排的上名的&#xff0c;具有快捷、高效、便捷等特点&#xff0c;可以帮助用户轻松恢复电脑丢失的数据。 因此今天coco玛吉多就给大家带来了eas…

环境主题静态HTML网页作业作品 大学生环保网页设计制作成品 简单DIV CSS布局网站

&#x1f329;️ 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f482; 作者主页: 【进入主页—&#x1f680;获取更多源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;HTML5网页期末作业 (1000套…

2022短视频神器历时6个月辛苦全力打造的软件短视频运用工具

短视频批量监控混剪消重上传运营神器 ​ 要问当下什么最火&#xff1f;当然是从事自媒体了&#xff0c;自媒体是普通大众经由数字科技强化、与全球知识体系相连之后&#xff0c;一种开始理解普通大众如何提供与分享他们自身的事实、新闻的途径。简而言之&#xff0c;即公民用以…

移动端布局

移动端布局1. meta视口标签1.2 多倍图1.2.1 图片缩放1.2.2 背景缩放 background-size1.3 特殊样式2 移动端常见布局2.1 流式布局&#xff08;百分比布局&#xff09;2.2 flex布局父项常见属性2.2.1 flex-direction设置主轴或侧轴的方向2.2.2 justify-content 设置主轴的子元素的…

程序员的数学课08 加乘法则:如何计算复杂事件发生的概率?

在我们的工作和生活中少不了对概率的计算&#xff0c;对概率的准确计算会帮助我们做出更加合理高效的决策。 例如&#xff0c;早上出门之前&#xff0c;你需要对是否携带雨伞进行决策。如果没有任何依据而随机决策&#xff0c;那么就会遇到下雨没带伞或者晴天带伞的麻烦&#…

SiO2/PAA/Ag复合纳米粒/酞菁修饰磁性温敏二氧化硅纳米微球/中空SiO2/TiO2纳米微球的制备

小编给大家分享了SiO2/PAA/Ag复合纳米粒/酞菁修饰磁性温敏二氧化硅纳米微球/中空SiO2/TiO2纳米微球的制备与研究&#xff0c;一起来看&#xff01; SiO2/PAA/Ag复合纳米粒子的制备步骤&#xff1a; 利用溶胶-凝胶法合成胶体二氧化硅微球,用甲基丙烯酰氧丙基三甲氧基硅烷(γ-MP…

业务开发流程

0.摘要 此文主要介绍了业务开发的整体流程、关键节点和需要注意的事项&#xff0c;适用于刚入行的小白&#xff0c;以及对自己过往经验的一个总结整理。持续更新中~~ 1.开发的主要流程&名词释义 大概给大家梳理下一个项目从发起到上线的流程。 ○ 参与人员&#xff1a;业…

redis之为什么那么快

写在前面 在面试中关于redis经常被问到一个问题就是redis为什么快&#xff0c;本文就一起从其底层的数据结构实现来分析下&#xff0c;为什么快&#xff0c;哪些快&#xff0c;哪些慢&#xff0c;哪些操作会导致慢等&#xff0c;下面我们就开始吧&#xff01; 1&#xff1a;为…

【无标题】近几年攻防演练攻击队典型突破的例子

蓝队经典攻击实例 实战攻防演练中红队网络的部署情况各有特点&#xff0c;蓝队也会根据攻 击目标的不同而采取不同的攻击策略和手段。下面几个案例展示的就 是针对红队网络的不同薄弱点采取的不同的典型攻击策略与方法手 段。 正面突破&#xff1a;跨网段控制工控设备 某企业…

C#面向对象程序设计课程实验一:实验名称:C#语言基础、程序流程控制

C#面向对象程序设计课程实验一&#xff1a;实验名称&#xff1a;C#语言基础、程序流程控制实验内容&#xff1a;C#语言基础、程序流程控制一、 实验目的二、实验环境三、实验内容四、实验总结实验内容&#xff1a;C#语言基础、程序流程控制 一、 实验目的 (1)练习 C#变量声明和…

simulink-自定义模块GUI回调函数

目录 一、创建simulink模块 二、自定义GUI步骤 2.1 设计组件界面信息 2.2 GUI控件介绍 2.2.1 Parameter参数配置组件 2.2.2 Container参数配置组件 2.2.3 Display参数配置组件 2.2.4 Action参数配置组件 2.3 控件回调函数使用方法 三、设置Help信息 四、获取配置控件参数 4.…

ubuntu 搭建RKNN-Toolkit环境

1. github下载官方的RKNN-Toolkit项目包 地址&#xff1a;https://github.com/rockchip-linux/rknn-toolkit 然后还需要下载rknn-toolkit包&#xff0c;GitHub下方有链接&#xff1a; 各种版本的官方下载&#xff1a; https://github.com/rockchip-linux/rknn-toolkit/relea…

实现有效控制项目进度,需要做好这些工作

制定出切合的项目计划是执行的重要基础&#xff0c;计划制定的过程同时也是计划逐步细化的过程&#xff0c; 进度计划的贯彻是计划实施的第一步&#xff0c;也是最关键的一步。 一、实现有效控制项目进度&#xff0c;需要做好以下工作&#xff1a; 项目计划&#xff0c;决定…

JavaScript · 9:数据类型转换 隐式转换

总览 1.数据转换为string类型 2.数据转换为Number数字类型 3.数据转换为boolean类型 一、将数据转换为string类型 1.方法 最常用的是“加号拼接字符串”&#xff0c;也就是 隐式转换 &#xff0c;其中用于拼接的字符串内容可以为空 二、将数据转换为number数值类型 1.方…

Vue 响应式实现原理深入浅出

前言 vue 是一个易上手的框架&#xff0c;许多便捷功能都在其内部做了集成&#xff0c;其中最有区别性的功能就是其潜藏于底层的响应式系统。组件状态都是响应式的 JavaScript 对象。当更改它们时&#xff0c;视图会随即更新&#xff0c;这让状态管理更加简单直观。那么&#…