研究生方向高性能并行计算推荐入行吗?
CUDA的优化还是需要非常扎实的基础才能做到的~非常推荐GPU/CUDA方向~CUDA与tensorrt是CV领域模型部署的必备,自动驾驶之心为大家整理了cuda与tensorrt常见入门资料,希望能够帮助到大家!
所有内容出自:基于TensorRT的CNN/Transformer/检测/BEV模型四大部署实战教程,欢迎扫码学习!
1)计算机组成原理与硬件相关
有关Tensor Core和CUDA Core
● 一个比较早期的Tensor Core的官方Blog:https://developer.nvidia.com/blog/programming-tensor-cores-cuda-9/
○ 注意,这里介绍的Tensor Core还是一代,现在的Tensor Core已经是三代了,通过这个文章看一下Tensor Core做矩阵计算跟CUDA Core的区别
● 比较新的Tensor Core的文章:○https://www.nvidia.com/en-us/data-center/tensor-cores/ ○ 从这里面的动画去理解Tensor Core和CUDA Core的区别
● 有余力的去调查一下dataflow architecture是什么东西
Roofline Model相关
● 有关Roofline model最好直接看论文:Roofline: An Insightful Visual Performance Model for Floating-Point Programs and Multicore Architectures
● 读论文的时候有关键词不懂就直接查一下,这篇论文内容很浓。读懂了就很厉害了
● 有余力,参考一个Ampere架构的GPU,计算它的Roofline Model中的各个指标
● 再有余力,手动计算1x1 conv, 3x3 conv, 5x5 conv的计算密度是多少,以及在Roofline model中的哪个位置
2)TensorRT模型部署优化相关
TensorRT相关
● 介绍TensorRT最全面的还是看它的官网会比较好:https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html
○ 能够把这里的知识点全部都搞懂的话就很厉害了,差不多TensorRT的理论基础就打好了
量化相关
● 先对整体有个粗略的概念。依然看官方的Blog会好一点:https://developer.nvidia.com/blog/achieving-fp32-accuracy-for-int8-inference-using-quantization-aware-training-with-tensorrt/
○ 理解FP32和INT8是什么,为什么会掉精度,如何才能不掉精度。calibration是什么,为什么需要calibration
○ 粗略的理解QAT是什么,PTQ是什么
● TensorRT中对量化的优化技巧,依然推荐官方文档:https://docs.nvidia.com/deeplearning/tensorrt/developer-guide/index.html#working-with-int8
○ 这里第一次看容易看不懂,所以课程里会详细分析 ○ 有余力去理解一下QDQ相关的节点在TensorRT中是如何融合的
● 这里参考几篇阅读文章
1. INTEGER QUANTIZATION FOR DEEP LEARNING INFERENCE: PRINCIPLES AND EMPIRICAL EVALUATION
■ 这个是NVIDIA出的。可以对量化有个大体的概念
■ 理解Max, Entropy, Percentile这三种Calibration的区别是什么
2. Quantizing deep convolutional networks for efficient inference: A whitepapr
■ 这是Google在2018年发的有关量化的文章,可以看看Google是如何量化的
■ 作为参考阅读就okay了
3. A White Paper on Neural Network Quantization
■ Qualcomm在2021年发表的量化的文章,作为参考学习一下
剪枝相关
● 对Sparse pruning有个大体的概念就okay了,推荐读官方Blog:https://developer.nvidia.com/blog/accelerating-inference-with-sparsity-using-ampere-and-tensorrt/
● 理解一下剪枝大体分类可以分为几种。每一种适合什么情况
● 余力的去理解一下结构化剪枝和非结构化剪枝的区别,并考虑哪种对硬件更友好 ● 有余力的去理解一下vector-wise sparse prunning是什么,为什么是4:2 ● 再有余力的去思考一下,为什么sparse prunning需要有特定硬件去支持
Receiptive field相关
● 这个也是直接先读论文:Understanding the Effective Receptive Field in Deep Convolutional Neural Networks,这里面讲的Receptive Field很重要。但更重要的是Effective Receptive Field。理解这两者的区别
● 可以考虑一下,从模型部署的性能友好出发去考虑,什么样子的模型架构可以又最大化的利用计算资源,同时又能够最大化Effective Receptive Field。同时考虑一下CNN和Transformer在Effective Receptive Field上的区别,从根本上思考为什么Transformer相比于CNN的优势在哪里
● 有余力,自己做一个小程序,来计算ResNet或者VGG的Receiptive field和Effective receiptive field是如何变化的
3)编程相关
并行处理相关
● 这里没有推荐的学习资料,但是介绍一些C/C++的关键字大家学习一下
○ pthread, std::thread, openmp的写法
○ 其他的一些有关并行的基本概念(比如lock, barrier这些)理解一些
○ 还有一些C++multi-thread编程要用到的future, promise, conditional variable理解一下
○ 有余力理解一下多线程回调实现异步执行的方法
C++相关
● 由于课程中使用的部署代码以及TensorRT API都是用C++,所以需要有一定的C++基础
● 所以一些比较基本的C++的概念理解一下
○ 比如说, unique/shared pointer这些智能指针,模版函数与函数模版,C++中的一些关键字(static什么时候用,为什么用static等等),如何使用变参,STL中各类容器的用法,引用和指针的区别,函数重载,虚函数,线程池等等。有不会的知识点可以提前自己调查一下,但最好自己写几个小案例试试手。课程里的案例会直接用。
● Makefile的写法
○ Makefile的基本语法可以先学习一下,比如说如何构建依赖关系,Makefile中批量重命名的方法,Makefile中寻找文件的方法等等
○ gcc/g++/nvcc编译器的比较常用的参数理解一下。比如-O0, -O3是什么,-E, -S, -c 分别是什么,-M, -T是什么等等。
● 编程规范 ○ 参考Google的C++编程规范