专栏首页人工智能的秘密Tensorflow教程:GPU调用如何实现
原创

Tensorflow教程:GPU调用如何实现

今天,给大家分析一下Tensorflow源码之GPU调用是如何实现的?

1. Tensorflow GPU支持

Tensorflow 支持GPU进行运算,目前官方版本只支持NVIDIA的GPU,可以在tensorflow的官方上看到。Tensorflow 对GPU的运算的支持最小力度就是OP,也就是我们常说的算子,下图提供了Tensorflow的一些常见算子,而每个算子在Tensorflow上都会提供GPU的算法:关于OP的具体实现,在本篇博客中就不叙述了。

2. Tensorflow GPU调用架构

从上图我们可以看到,Tensorflow提供两种方式调用NVIDIA的方式,而NVIDIA的GPU调用方式主要依靠的CUDA的并行计算框架

2.1 Stream Executor

StreamExecutor 是一个子项目,是一个google开源的数学并行运算库,是基于CUDA API、OpenCL API管理各种GPU设备的统一API,这种统一的GPU封装适用于需要与GPU设备通信的库,而在Tensorflow上只提供了对CUDA的支持

StreamExecutor的主要功能:

  • 抽象化底层平台,对开发者不需要考虑底层的GPU的平台
  • 流式的管理模式
  • 封装了主机和GPU之间的数据移动

在StreamExecutor里封装了几个常见的基本的核心运算:

  • BLAS: 基本线性代数
  • DNN:  深层神经网络
  • FFT:   快速傅里叶变换
  • RNG:  随机数生成

2.1.1 Stream 接口

  1.  算子直接通过Stream的API的调用,在Tensorflow里Stream executor 只支持4个核心算法
  2.  每个算法都提供Support的类,进行多态的支持,比如CUDA, OpenCL
  3.  通过Support,官方tensorflow 只提供了CUDA支持,如果要支持OpenCL,可以参考开源(点击打开链接
  4.  对CUDA的支持使用了基于CUDA平台的第三方开发库,没有直接使用CUDA编程

2.2  直接调用CUDA

Tensorflow 同时本身也可以直接调用CUDA,毕竟Stream的目前接口只是支持了Blas, DNN, FFT, RND这些基本接口

1.  进行复杂运算,需要连续调用Stream的接口,这里也带来了频繁的从主内存到GPU内存之间复制的开销

2.  Stream 并没有封装一些简单的一元运算,只是封装了CUDA的提供的第三方运算库,一元运算(加减乘除,log, exp)这些如果想在GPU运算,需要基于CUDA的运算框架进行自己写代码

在Tensorflow上写CUDA代码没什么两样, 下面是一个lstm的样例

1. 定义你的global 

[html] view plain copy

print?

  1. template <typename T, bool use_peephole>
  2. __global__ void lstm_gates(const T* icfo, const T* b, const T* cs_prev,  
  3.                            const T* wci, const T* wcf, const T* wco, T* o, T* h,  
  4.                            T* ci, T* cs, T* co, T* i, T* f, const T forget_bias,  
  5.                            const T cell_clip, const int batch_size,  
  6.                            const int cell_size) {  
  7.   const int batch_id = blockIdx.x * blockDim.x + threadIdx.x;  
  8.   const int act_id = blockIdx.y * blockDim.y + threadIdx.y;  
  9. .......  
  10. }  

2. 定义使用的网格,block, thread数

[html] view plain copy

print?

  1. dim3 block_dim_2d(std::min(batch_size, 8), 32);  
  2. dim3 grid_dim_2d(Eigen::divup(batch_size, static_cast<int>(block_dim_2d.x)),  
  3.                  Eigen::divup(cell_size, static_cast<int>(block_dim_2d.y)));  
  4. if (use_peephole) {  
  5.   lstm_gates<T, true><<<grid_dim_2d, block_dim_2d, 0, cu_stream>>>(  
  6.       icfo.data(), b.data(), cs_prev.data(), wci.data(), wcf.data(),  
  7.       wco.data(), o.data(), h.data(), ci.data(), cs.data(), co.data(),  
  8.       i.data(), f.data(), forget_bias, cell_clip, batch_size, cell_size);  
  9. } else {  
  10.   lstm_gates<T, false><<<grid_dim_2d, block_dim_2d, 0, cu_stream>>>(  
  11.       icfo.data(), b.data(), cs_prev.data(), wci.data(), wcf.data(),  
  12.       wco.data(), o.data(), h.data(), ci.data(), cs.data(), co.data(),  
  13.       i.data(), f.data(), forget_bias, cell_clip, batch_size, cell_size);  
  14. }  

3. 定义你的OP,在你的OP里调用CUDA的代码,并注册到Tensorflow Kernel中,注意你的Device需要设置成DEVICE_GPU,tensorflow会依据客户端传递的device的参数来决定是否需调用GPU还是CPU的算法,CUDA的文件以.cu.cc为结尾

[html] view plain copy

print?

  1. REGISTER_KERNEL_BUILDER(  
  2.     Name("arithmetic").Device(DEVICE_GPU).TypeConstraint<Eigen::half>("T"),  
  3.     arithmeticOP<Eigen::half>);  

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用腾讯云 GPU 学习深度学习系列之二:Tensorflow 简明原理

    本文介绍了如何通过简单的 Python 代码,重点实现深度学习框架的计算图模型,以及自动求导过程。

    集智
  • Tensorflow c++ 实践及各种坑

    众所周知,python 在开发效率、易用性上有着巨大的优势,但作为一个解释性语言,在性能方面还是存在比较大的缺陷,在各类AI服务化过程中,采用 python 作...

    曾子骄
  • TensorFlow 的 c ++ 实践及各种坑!

    本文重点介绍 tensorflow C++ 服务化过程中实现方式及遇到的各种问题。

    全球人工智能
  • 使用 Tensorflow 构建 CNN 进行情感分析实践

    本次实验参照的是 Kim Yoon 的论文,代码放在我的 github 上,可直接使用。

    刁寿钧
  • TensorFlow入门(3):使用神经网络拟合N元一次方程

    现实中大部分情况是不能简单使用 N 元一次方程这样的公式表达的,神经网络的出现,给这类问题提供了一个很好的解决方法。本文继续给出一个简单的例子,使用 Tenso...

    谭正中
  • TensorFlow入门(1):求N元一次方程

    今年以来,人工智能成为一个时代热点,同时 TensorFlow 1.0 的发布后,我也想蹭蹭时代的热点,初步学习一下神经网络和机器学习,在这里把成果以初学者的方...

    谭正中
  • 学习笔记TF066 : TensorFlow 移动端应用,iOS、Android系统实践

    移动端应用原理。移动端、嵌入式设备应用深度学习方式,一模型运行在云端服务器,向服务器发送请求,接收服务器响应;二在本地运行模型,PC训练模型,放到移动端预测。向...

    利炳根
  • 为什么要用深度学习来做个性化推荐 CTR 预估

    深度学习应该这一两年计算机圈子里最热的一个词了。基于深度学习,工程师们在图像,语音,NLP等领域都取得了令人振奋的进展。而深度学习本身也在不断的探索和发展中,其...

    苏博览
  • 学习笔记TF067:TensorFlow Serving、Flod、计算加速,机器学习评测体系,公开数据集

    TensorFlow Serving 。生产环境灵活、高性能机器学习模型服务系统。适合基于实际数据大规模运行,产生多个模型训练过程。可用于开发环境、生产环境。

    利炳根
  • 道器相融,由 Angel 谈一个优秀机器学习平台的自我修养(下)

    随着人工智能时代来临,大数据平台发生了新的变化,也提出了更高的要求。Spark等大数据平台多是为通用数据处理而设计的,并非专用于机器学习任务,企业该如何更好地利...

    腾讯开源

扫码关注云+社区

领取腾讯云代金券