【架构分析】TensorFlow CUDA Device Backend扩展分析

 

目录

概述

Tensorflow Build系统

CUDA Device Backend扩展


概述

Tensorflow除了能运行在CPU上,更重要的是它支持运行在GPU TPU 乃至其它硬件加速器上,从而带来倍爽的Training和Inference运行速度,本文旨以Tensorflow r1.15版本(下载链接)为例,分析Nvidia GPU的CUDA软件栈是如何被扩展到Tensorflow上作为加速Tensorflow运行速度的设备后端(Device Backend)

 

Tensorflow Build系统

Tensorflow bazel build系统概述

Google的工程师既是编程好手也是造轮子好手,Tensorflow不出意外的用了Google自建的Bazel 编译系统,整个编译分成了4个阶段,涉及的bazel核心概念及其关系如上图所示

Bazel核心概念与Tensorflow中的文件与目录关系示意

 

关于Bazel的详细介绍可以参考链接,这里用上图示意Bazel中的核心概念在Tensorflow中的应用

Bazel系统令人困惑的依赖关系

 

这里特别要吐槽Bazel系统的依赖关系,如上图左侧部分所示,传统的Makefile或cmake系统对于一个编译对象T的所有依赖都是直接表达在描述T编译过程的脚本中,但是Google的工程师们抽象分层能力极强,硬是在Bazel中把编译对象T的依赖分层抽象为可以依赖另外一个编译对象t1,而t1又依赖t2 ...... 以此类推,导致T1 依赖的 D2 ... Dn 都变成了间接的依赖关系,所以当出现上图右侧的编译error提示T有头文件没找到,我们需要把整个T依赖的树型结构捋出来去判断是不是T间接依赖的某个目标(比如d3)没有添加error中提示的头文件。这种分层抽象把一个原本很简单的依赖错误排查搞的过于反人类了,可能也注定Bazel只有Google自己吃独食吧。

 

CUDA Device Backend扩展

CUDA Toolchain 如何应用在Tensorflow Build系统

 

Nvidia提供了完整的CUDA软件栈,包括CUDA的Toolchain(工具链比如:nvcc 等) 和相关加速库libcuXXX.so,所以Tensorflow要支持运行在CUDA GPU上,第一步就是扩展Bazel的Toolchain Framework增加CUDA的Toolchain支持,从而在整个Build阶段能够使用nvcc去编译cu.cc的算子(kernel)代码,从而使得这些算子在runtime阶段部署到Nvidia GPU上加速运行

Tensorflow 架构中NV CUDA GPU Device Backend扩展的相关模块

 

 上图紫色部分展示了在Tensorflow架构(此处没有加入XLA)中引入NV CUDA GPU 支持的相关模块,换而言之,如果要扩展一个新的硬件加速器xPU,那么紫色部分就是需要去添加修改的软件模块

 

从Package的视角来看Tensorflow中CUDA Device Backend相关的依赖

 

上图黄色部分展示了从Package组织关系的视角来看Tensorflow中与CUDA相关的package, 换而言之,如果要扩展一个新的硬件加速器xPU,那么黄色部分就是需要去添加修改的package

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值