参考:https://blog.csdn.net/qq_27637315/article/details/79114633

windows增加op节点:

https://github.com/tensorflow/models/issues/1103

tensorflow自定义GPU版本op节点
2018年01月20日 16:06:38

阅读数:357

由于前段时间导师布置了一个任务,要修改损失函数,但是这个损失函数在tensorflow自带的库中又没有,想了很多办法,试来试去找不到一个解决方案,因为tensorflow是把框架和数据分开的,所以直接用python写出来的函数是不能用的,只能定义一个节点来调用才行,所以就自然想到先跑一个gpu版本的kernel例程啦,网上cpu版本的教程很多,但是gpu版本的却比较的少,官网的教程极课学院有讲,但我觉得讲的太复杂,反正我是看了一遍没看懂,好了,开始正文。本次例程实现的是将输入tensor中的数字加一输出。

步骤1:写一个kernel

文件名:cuda_op_kernel.cu.cc   代码如下:

[cpp] view plaincopy
  1. #if GOOGLE_CUDA
  2. #define EIGEN_USE_GPU
  3. #include "third_party/eigen3/unsupported/Eigen/CXX11/Tensor"
  4. __global__ void AddOneKernel(const int* in, const int N, int* out) {
  5. for (int i = blockIdx.x * blockDim.x + threadIdx.x; i < N;
  6. i += blockDim.x * gridDim.x) {
  7. out[i] = in[i] + 1;
  8. }
  9. }
  10. void AddOneKernelLauncher(const int* in, const int N, int* out) {
  11. AddOneKernel<<<32, 256>>>(in, N, out);
  12. }
  13. #endif

步骤2:编写cpp程序

文件名:cuda_op_kernel.cc  代码如下:

[cpp] view plaincopy
  1. #include "tensorflow/core/framework/op.h"
  2. #include "tensorflow/core/framework/op_kernel.h"
  3. using namespace tensorflow;
  4. REGISTER_OP("AddOne")
  5. .Input("input: int32")
  6. .Output("output: int32")
  7. .Doc(R"doc(
  8. Adds 1 to all elements of the tensor.
  9. output: A Tensor.
  10. output = input + 1
  11. )doc");
  12. void AddOneKernelLauncher(const int* in, const int N, int* out);
  13. class AddOneOp : public OpKernel {
  14. public:
  15. explicit AddOneOp(OpKernelConstruction* context) : OpKernel(context) {}
  16. void Compute(OpKernelContext* context) override {
  17. // Grab the input tensor
  18. const Tensor& input_tensor = context->input(0);
  19. auto input = input_tensor.flat<int32>();
  20. // Create an output tensor
  21. Tensor* output_tensor = NULL;
  22. OP_REQUIRES_OK(context, context->allocate_output(0, input_tensor.shape(),
  23. &output_tensor));
  24. auto output = output_tensor->template flat<int32>();
  25. // Set all but the first element of the output tensor to 0.
  26. const int N = input.size();
  27. // Call the cuda kernel launcher
  28. AddOneKernelLauncher(input.data(), N, output.data());
  29. }
  30. };
  31. REGISTER_KERNEL_BUILDER(Name("AddOne").Device(DEVICE_GPU), AddOneOp);

步骤3:编译该节点

在上面两个文件夹下打开终端(ubuntu),输入以下命令:

[html] view plaincopy
  1. TF_INC=$(python -c 'import tensorflow as tf; print(tf.sysconfig.get_include())')
g++ -std=c++11 -shared cuda_op_kernel.cc -o cuda_op_kernel.so -fPIC -I $TF_INC -O2 -D_GLIBCXX_USE_CXX11_ABI=0
nvcc -std=c++11 -c -o cuda_op_kernel.cu.o cuda_op_kernel.cu.cc \
-I $TF_INC -D GOOGLE_CUDA=1 -x cu -Xcompiler -fPIC

g++ -std=c++11 -shared -o cuda_op_kernel.so cuda_op_kernel.cc \
cuda_op_kernel.cu.o -I $TF_INC -fPIC -lcudart

当你执行到第四个命令的时候很可能会碰到这样一个报错:

[html] view plaincopy
  1. /usr/bin/ld: 找不到 -lcudart
  2. collect2: error: ld returned 1 exit status

对于这个问题我搞了一天,搞清楚这句话的意思大概是有一个叫libcudart.so的库文件找不到,然后我去/usr/bin/目录下确实没找到这个叫libcudart.so的库文件,那咋办呢,那我就在电脑里找这个库文件呀,我电脑里的库文件就在这个文件夹下:/usr/local/cuda/targets/x86_64-linux/lib,大家可以在cuda这个文件下搜一下,我估计就在这个文件夹底下,知道地址以后呢,我们把原来的第四个命令替换成下面这个命令:

[html] view plaincopy
  1. g++ -std=c++11 -shared -o cuda_op_kernel.so cuda_op_kernel.cc cuda_op_kernel.cu.o -L/usr/local/cuda/targets/x86_64-linux/lib -I $TF_INC -fPIC -lcudart

就编译通过啦。

然后我写了一个测试文件

步骤4:测试

文件名:test.py  代码如下:

[html] view plaincopy
  1. import tensorflow as tf
  2. cuda_op_module = tf.load_op_library('./cuda_op_kernel.so')
  3. with tf.Session(''):
  4. x=cuda_op_module.add_one([[1, 2], [3, 4]]).eval()
  5. print x

输出是:
[[2 3]
 [4 5]]

Ubuntu tensorflow自定义GPU版本op节点相关推荐

  1. tensorflow自定义GPU版本op节点

    由于前段时间导师布置了一个任务,要修改损失函数,但是这个损失函数在tensorflow自带的库中又没有,想了很多办法,试来试去找不到一个解决方案,因为tensorflow是把框架和数据分开的,所以直接 ...

  2. 安装tensorflow的GPU版本(详细图文教程)--CUDA11.6的安装

    文章目录 TensorFlow简介 TensorFlow是什么 tensorflow版本变迁 tensorflow 2.0 架构 安装过程 常用IDE安装 python3.9的安装 Anaconda的 ...

  3. 当涉及某个项目需要大量使用到tensorflow时,最后不要使用tensorflow的GPU版本,这会出很多毛病,最好使用CPU版本

    当涉及某个项目需要大量使用到tensorflow时,最后不要使用tensorflow的GPU版本,这会出很多毛病,最好使用CPU版本

  4. 常识——windows的tensorflow安装gpu版本,cuda算力只有3.0也可以

    文章目录 问题 windows安装tensorflow_gpu版本 检查显卡是否支持cuda 查看自己的显卡型号 去官网查看是否支持cuda 检查显卡的cuda算力 按照GPU算力3.0的电脑配置进行 ...

  5. anaconda3 tensorflow安装踩坑记(WIN10+tensorflow带gpu版本)

    我看的网课讲解的视频用的是带gpu版本的tensorflow1.4.0,使用pip install tensorflow-gpu==1.4.0,但是如果想直接用之前那个命令的话要使用anaconda老 ...

  6. Windows7上安装TensorFlow的GPU版本后记

    上一篇写了之前在我的Windows7上安装TensorFlow GPU版的一路坑坑洼洼,本以为已经解决了.但实际上在过年的几天内,又一次出现了问题.经过了反复的尝试,到今天为止终于稳定下来,特此记录一 ...

  7. tensorflow 安装GPU版本,CUDA与cuDNN版本对应关系,RTX3050Ti (notebook)

    前言 安装Tensorflow-gpu 与 keras的时候,一定先要注意版本的对应,不然很容易出错,在看的时候,建议先看完整篇文章再上手. 一.环境+配置 本机环境 显卡:RTX3050Ti(not ...

  8. win7, gtx750ti 2g tensorflow 安装GPU版本,个人总结,步骤比较详细

    安装环境:win7, gtx750ti 2g 参考: https://blog.csdn.net/gangeqian2/article/details/79358543 http://blog.sin ...

  9. 通过Anaconda在Ubuntu16.04上安装 TensorFlow(GPU版本)

    一. 安装环境 Ubuntu16.04.3 LST GPU: GeForce GTX1070 Python: 3.5 CUDA Toolkit 8.0 GA1 (Sept 2016) cuDNN v6 ...

最新文章

  1. 高等数学-关于第二类面积分的对称性问题
  2. Linux漏洞建议工具Linux Exploit Suggester
  3. UA MATH567 高维统计III 随机矩阵10 亚高斯矩阵的应用:协方差估计与聚类问题的样本量需求计算
  4. Win7 od下send断点
  5. 彻底清除备份域服务器数据元的方法
  6. 2012年9月计算机二级c语言,2012 年9月 全国计算机二级c语言试题
  7. python socket服务器_记-python socket服务器端四部曲
  8. Jmeter 快速入门教程(三-1) --添加响应断言(即loadrunner中所指的检查点)
  9. Android程序创意过滤与失败经验谈
  10. ANSI C、ISO C、Standard C、C89、C90、C99
  11. ImageButton属性
  12. 荣耀手机动态修改手机型号参数
  13. Hackintool 3.4.7中文版 (黑苹果必备工具箱神器)
  14. 如何申请阿里云的免费域名HTTPS证书
  15. 测试内存的频率稳定性软件,超频心得:3000MHz通过1000%稳定性测试_内存硬盘评测-中关村在线...
  16. 微信企业号开发:企业支付基础
  17. 即刻发光!武汉国金天地街区亮灯啦!
  18. 超超超超超详细的数据库课设报告-学生公寓管理系统
  19. 智能称体脂称实现(代码与基本数据处理篇)
  20. 软件工程大作业——在线零食销售系统

热门文章

  1. android的横竖屏切换,Android横竖屏切换 初步探究
  2. linux查看ssh端口8222,下载服务器SSH被用户恶意猜密码了
  3. 写一个不能被继承的类(友元的不可继承性)
  4. 计算机技术应用及信息管理,计算机应用技术与信息管理整合研究(共2808字).doc...
  5. 在Java中使用可信时间戳
  6. python中矩阵的表示方法_关于Python表示矩阵的方法详解
  7. nginx图片服务器性能,搭建nginx图片服务器
  8. python 图片对比文件夹_初学Python-找出文件夹下的所有图片
  9. 如何实现Word、PDF,TXT文件的全文内容检索?
  10. Spring Boot 2.6之后,动态权限控制终于可以用起来了!