cuda和cudnn和tensorrt的理解

cuda参考:https://www.zhihu.com/question/409350643/answer/1361111350

cuda

cuda是Compute Unified Device Architecture的缩写。中文叫统一计算架构。是为了让nvidia gpu可以完成通用计算任务的一种集成技术。我们通常可以使用的cuda框架有c,c++,fortran,python,java的,可以为数据大吞吐量的工作提供很好的加速功能。简单的来讲,就是为了让GPU可以不仅仅工作与自己的一幕三分地,而是利用自身的优势,完成通用计算的任务。主要应用除了日常视频编码解码,游戏等外,可以应用于计算加速方面。拿我所接触的行星模式模拟来讲,GPU加速可以让我们模拟的物理计算过程获得很大的加速,加速科研产出。

cuda和cudnn

首先,CUDA是C语言在GPU编程上的的拓展包,CUDNN是封装了卷积等算子的库,不是一个层面的东西。其次,这二者的关系,CUDA可以用来实现cudnn定义的各种接口,早期CUDNN应该内部是用CUDA实现的,但随着英伟达软件生态的发展,CUDNN团队一定会选择用更底层,更靠近硬件,更难用的工具来构建Kernel,比如PTX,比如直接写汇编(SASS)。不信的话可以自己试着用CUDA实现CUDNN的接口,看看性能能差多少。当然能把CUDA写好的人想必都了解CUDA的局限。最后,二者在生态里面的位置。最开始CUDA可以说是英伟达用来打天下的东西,很大程度靠这玩意儿确立了自己在高性能计算尤其是神经网络高性能计算的地位。因为CUDA在暴露硬件特性和保持软件通用性的矛盾中找到了一个精巧的,大多数人都可以接受的平衡。但随着这几年技术的发展,情况又发生了些变化,CUDA还是肩负着软件生态通用性的重任,而高性能的任务,更多地需要由CUDNN,CUBLAS这些高性能软件库来承担。在英伟达的构想中,成熟的算子,比如卷积,比如全联接,用户可以使用库直接获得最优性能,而对于新的算子或者是每个用户独有的算子,用户还是可以用CUDA自己来相对简单地实现一个性能可以接受的版本。最后通过TensorRT, TensorFlow这样的框架把这二者衔接起来。

cuda、cudnn和tensorrt的关系

CUDA是NVIDIA推出的用于自家GPU的并行计算框架,也就是说CUDA只能在NVIDIA的GPU上运行,而且只有当要解决的计算问题是可以大量并行计算的时候才能发挥CUDA的作用。CUDA的主要作用是连接GPU 和 应用程序,方便用户通过 CUDA 的 API 调度 GPU 进行计算。

cuDNN(CUDA Deep Neural Network library):是NVIDIA打造的针对深度神经网络的加速库,是一个用于深层神经网络的GPU加速库。它能将模型训练的计算优化之后,再通过 CUDA 调用 GPU 进行运算.

当然你也可直接使用 CUDA,而不通过 cuDNN ,但运算效率会低好多。因为你的模型训练计算没有优化。

TensorRT是英伟达针对自家平台做的加速包,只负责模型的推理(inference)过程,一般不用TensorRT来训练模型的,而是用于部署时加速模型运行速度。

TensorRT主要做了这么两件事情,来提升模型的运行速度。
1、TensorRT支持INT8和FP16的计算。深度学习网络在训练时,通常使用 32 位或 16 位数据。TensorRT则在网络的推理时选用不这么高的精度,达到加速推断的目的。
2、 TensorRT对于网络结构进行了重构,把一些能够合并的运算合并在了一起,针对GPU的特性做了优化。现在大多数深度学习框架是没有针对GPU做过性能优化的,而英伟达,GPU的生产者和搬运工,自然就推出了针对自己GPU的加速工具TensorRT。一个深度学习模型,在没有优化的情况下,比如一个卷积层、一个偏置层和一个reload层,这三层是需要调用三次cuDNN对应的API,但实际上这三层的实现完全是可以合并到一起的,TensorRT会对一些可以合并网络进行合并。

猜你喜欢

转载自blog.csdn.net/qq_15821487/article/details/125492135
今日推荐