原文出自这里
CodeLearner
其实去年秋招后,就一直想对该方向的技术栈做一个梳理,恰好最近有读者在微信公众号(CodeLearner)后台问我一些关于这个方向的学习路线,所以特来做一个梳理,也算是给自己研究生阶段独自在这个方向摸爬滚打的一个总结。
回顾去年寒气逼人的秋招,笔者侥幸收获了百度、蔚来等公司 AI-HPC相关岗位的offer,也在微信公众号(CodeLearner)分享过一些面经,后续笔者将持续关注于GPU 计算领域,欢迎大家多多关注~
本帖子将以本书的逻辑和顺序做一个梳理:CS基础->AI算法->模型压缩->异构计算->AI框架->AI编译器
《Deep Learning Systems》(https://deeplearningsystems.ai/)
所需的编程语言(C/C++、Python)就不多讲了,数据结构算法也是大学基础课程,不多赘述。
对于操作系统需要多了解,推荐多看一看《深入理解计算机系统》(传说中的面试圣经-CSAPP)
对于计算机体系结构,推荐多看一看《计算机体系结构量化方法》
此外,整个技术栈涉及到AI编译的工作,所以龙书《编译原理》也是必须的
CSAPP Lab(http://csapp.cs.cmu.edu/3e/labs.html)、https://github.com/Exely/CSAPP-Labs
普林斯顿大学-计算机体系结构、UCB CS152
上述提及到的所有书籍的pdf版本,可在微信公众号CodeLearner,后台回复关键词获取,详见DL Systems附录书单
对于AI算法基础,或者说深度学习,首先推荐看看《深度学习入门:基于Python的理论与实现》(鱼书) 作为深度学习的入门书,对卷积池化激活全连接、forward、backward都有一个原理上的理解,之后针对具体方向利用主流框架搭建一些经典模型,比如CV领域的分类(resnet、vit、swint等)、目标检测(yolo系列、fasterrcnn等)和语义/实例分割(deeplab、unet等)。这里推荐看看《动手学深度学习》和《深度学习框架PyTorch:入门与实践_ 陈云(著) 》
对于AI算法进阶,业界的模型发展速度飞快,模型层出不穷,而AI System这个方向我理解更偏向于AI +系统工程,所以只需要关注模型结构整体的一个发展方向,推荐b站沐神的论文精讲系列,大佬亲自带你解读主流模型。当然如果你实在对炼丹的tirck感兴趣,也可以去paperwithcode(https://paperswithcode.com/)上看看你所关注的领域的SOTA model
机器学习领域的github——huggingface(https://huggingface.co/),关于huggingface的介绍可以看看Huggingface 超详细介绍
(https://zhuanlan.zhihu.com/p/535100411)
炼丹必备timm(Pytorch image models,scripts, pretrained weights): https://github.com/huggingface/pytorch-image-models
NVIDIA在AI 医疗做的工作MONAI
(https://github.com/Project-MONAI/MONAI), 以及在医学图像领域的数据集汇总dataset (https://github.com/linhandev/dataset) ,希望这两个repo能帮到在做AI for Healthcare的同学(别问我为什么知道,也别问我为什么要做这个)
上述提及到的所有书籍的pdf版本,可在微信公众号CodeLearner,后台回复关键词获取,详见DL Systems附录书单
model compression的目标就是在模型精度损失可接受(甚至无精度损失)的情况,减小模型的推理时延和内存占用,进而对硬件友好,便于部署。常用方法包括三种:量化(quantization),剪枝(pruning),蒸馏(distillation)和神经网络结构搜索(NAS)。最后这一种属于"高端"玩法,需要大量卡,有兴趣的朋友可以自行了解。
量化是指将model中的weight或tensor由原始float量化为int或更低bit数据,进而降低资源占用,加速模型推理。从模型是否需要重新使用大量数据对模型进行重训练可以将模型量化方法分为量化感知训练(QAT)和训练后量化(PTQ)。常见的QAT算法FakeQuantize(https://arxiv.org/abs/1712.05877)、 LSQ(https://arxiv.org/abs/1902.08153) 等,常见的PTQ算法如DFQ (https://arxiv.org/abs/1906.04721)、AdaRound (https://arxiv.org/abs/2004.10568)等。
关于量化的入门学习推荐看一下知乎**Jermmy
写的大白话模型量化 (https://www.zhihu.com/column/c_1258047709686231040)专栏和b站zz123211
**的讲解视频(https://space.bilibili.com/289239037/channel/collectiondetail?sid=369845&ctype=0)
剪枝大体上也可以分为两类:非结构化剪枝(unstructured pruning)和结构化剪枝(structured pruning)。非结构化修剪方法(如Deep Compression( https://arxiv.org/abs/1510.00149 )等)就是将weight中不重要的参数归0,这样就会导致存在较多的稀疏矩阵,所以需要计算的硬件平台支持稀疏化计算。结构化修剪方法(如L1-norm based Channel Pruning (https://arxiv.org/abs/1608.08710) Network Slimming (https://arxiv.org/abs/1708.06519)等)则是在通道或层的层次上进行修剪。由于原始结构仍然保留,所以对于深度学习框架/硬件相对友好。
蒸馏就是用复杂但高精度的Teacher model指导训练小巧的Student model,类似于金庸武侠中逍遥派掌门无崖子将几十年功力传给虚竹一样,这样使得小模型即算的快,又精度高(不绝对)。蒸馏的原理不难理解,主要就是在Loss函数上做文章,所以推荐看一下蒸馏开山作Distilling the Knowledge in a Neural Network (https://arxiv.org/abs/1503.02531) 基本可以了解蒸馏的原理,此外笔者自己也写过一个关于DeiT:ViT&模型蒸馏的解读,可以参考一下。
微软的nni (https://github.com/microsoft/nni)工具链包括超参数调整,NAS(神经网络架构搜索)、模型压缩等
高通的模型压缩工具链AIMET (https://github.com/quic/aimet)
OpenMMlab的mmrazor (https://github.com/open-mmlab/mmrazor)
百度的PaddleSim (https://github.com/PaddlePaddle/PaddleSlim)
Intel 针对自家推理框架OpenVINO的压缩工具链nncf (https://github.com/openvinotoolkit/nncf)
Google 的 model-optimization (https://github.com/tensorflow/model-optimization),针对TensorFlow和Keras模型的部署优化(包括量化和剪枝)
MiT 韩松团队在模型压缩和边缘计算这个方向也有很多工作值得去学习MIT HAN Lab (https://songhan.mit.edu/)
micronet (https://github.com/666DZY666/micronet)
对于并行计算而言,主要是GPU或者FPGA相关的编程(较主流的是GPU)。对于FPGA的开发主要是通过硬件描述类语言如Verilog,或者通过高级综合(HLS)将C/C++转换为硬件描述语言 进行开发。而对于GPU 则主要是通过并行计算框架进行开发,如针对NVIDIA GPU的CUDA、针对其他GPU的OpenCL
《大规模并行处理器程序设计》、《General-Purpose Graphics Processor Architecture》
《通用图形处理器设计 GPGPU编程模型与架构原理》(景乃锋)
NVIDIA官方文档 《CUDA Programming Guide》 (https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html) 和 《CUDA Best Practice Guide》(https://docs.nvidia.com/cuda/cuda-c-best-practices-guide/index.html)
CUDA C编程权威指南
谭升的博客(https://face2ai.com/program-blog/#GPU%E7%BC%96%E7%A8%8B%EF%BC%88CUDA%EF%BC%89) 、知乎好文(https://www.zhihu.com/people/ban-zhuan-yuan-shi-chao-ji-gun/posts)、个人写的一些学习笔记(厚脸皮的说)
OpenCL 2.0 异构计算
OPENCL 异构并行计算 原理、机制与优化实践
《Verilog数字系统设计教程(夏宇闻)》、《FPGA设计技巧与案例开发详解(韩彬)》
《Parallel Programming for FPGAs》
上述提及到的所有书籍的pdf版本,可在微信公众号CodeLearner,后台回复关键词获取,详见DL Systems附录书单
NV开源的深度学习加速硬件架构NVDLA : https://github.com/nvdla/hw
FPGA优质学习资料汇总 https://github.com/LeiWang1999/FPGA
NV基于CUDA高效实现的众多Transformer网络(如Bert、GPT和Swin-T等),支持接入主流AI框架(Pytorch和TensorFlow等) : https://github.com/NVIDIA/FasterTransformer
给Pytorch后端添加自定义的CUDA算子 :https://github.com/godweiyang/NN-CUDA-Example
BBuf大佬维护的学习笔记how-to-optim-algorithm-in-cuda (https://github.com/BBuf/how-to-optim-algorithm-in-cuda)
对于OpenCL做Deep Learning的库我不是很确定哪个比较好(毕竟OpenCL落后太多了)…这里给三个链接
AMD 的opencl版caffe: https://github.com/amd/OpenCL-caffe ,intel做的一个clDNN : https://github.com/intel/clDNN , 还有一个用于训练CNN的OpenCL库 DeepCL:https://github.com/hughperkins/DeepCL/tree/master
对于AI框架,主要包含两类:训练框架和推理框架
使用最广泛的框架Pytorch(https://github.com/pytorch/pytorch) ,对于源码解读推荐看看OpenMMLab的Pytorch源码解读系列(https://zhuanlan.zhihu.com/p/328674159)
TensorFlow(https://github.com/tensorflow/tensorflow),相应的源码解读学习资料(https://github.com/tensorflow/tensorflow)
华为的Mindspore
百度的Paddle
一流科技的Oneflow,对于oneflow可以看看GiantPandaCV给的开发者笔记(http://giantpandacv.com/project/OneFlow/)
NV针对自家GPU做的推理框架TensorRT (https://github.com/NVIDIA/TensorRT)
Meta的AITemplate (https://github.com/facebookincubator/AITemplate)
腾讯YouTU Lab(作者nihui) 针对手机端的推理框架ncnn (https://github.com/Tencent/ncnn)
阿里的MNN (https://github.com/alibaba/MNN)
TensorFlow集成的推理框架TensorFlowLite,TinyML就是基于TensorFlowLite
Intel 针对自家CPU做的推理框架openvino (https://github.com/openvinotoolkit/openvino)
Xilinx针对FPGA平台做的AI 推理工具Vitis AI (https://github.com/Xilinx/Vitis-AI)
另外再补充一个onnx (https://github.com/onnx/onnx),onnx提供了一种第三方的开源格式,其构想就是所有框架都能转换为onnx格式,进而实现不同框架之间的模型无痛转换。
推荐caffe (https://github.com/BVLC/caffe)框架的源码阅读 (https://github.com/BUPTLdy/Caffe_Code_Analysis)
当然为了更快速的自己动手写一个推理框架,这里也推荐看自制推理框架系列知乎(https://www.zhihu.com/column/c_1598688571979878402)、b站video (https://space.bilibili.com/1822828582/channel/collectiondetail?sid=948314&ctype=0)
AI编译简而言之就是对AI模型通过编译优化,将计算图/算子更好的部署在不同的架构的硬件上。AI编译器是依托于传统编译器的,与传统编译器有很多相似的地方,都是将编译器前端[高级编程语言/深度学习计算图] 进行代码生成,为IR(Intermediate Representation), 之后通过编译器中端对IR进行优化,最后通过编译器后端将IR转换为具体硬件平台可执行的硬件指令目标文件。
陈天奇大佬的tvm (https://tvm.apache.org/), 关于tvm的学习可以看看tvm文档(https://tvm.hyper.ai/docs/)以及陈天奇的MLC课程的b站视频 (https://space.bilibili.com/1663273796/channel/series)和文档 (https://mlc.ai/zh/index.html)
MLIR(https://mlir.llvm.org/)
XLA(https://www.tensorflow.org/xla?hl=zh-cn)
《编译原理》
《机器学习系统:设计和实现》(https://openmlsys.github.io/)
《AI编译器开发指南》
BBuf大佬维护的AI编译器学习仓库tvm_mlir_learn (https://github.com/BBuf/tvm_mlir_learn)
文中提到的所有参考书籍的pdf版,笔者做了一个汇总,如需获取,欢迎大家关注微信公众号CodeLearner~~
ML/DL System是一个很大的方向,除了上述提及到几个方向,还包括分布式机器学习、AI芯片架构等方向,每个方向涉及的内容也很多所以要做好AI System不容易,对于本文中没有阐述清楚的点大家也可以看看MLsys各方向综述 (https://zhuanlan.zhihu.com/p/104444471) 和ML system入坑指南 (https://zhuanlan.zhihu.com/p/608318764) 这两篇帖子,也可以看看b站ZOMI酱的视频 (https://space.bilibili.com/517221395/channel/series)
对于我们应届生而言能在一个方向深入后逐渐往其他方向上延伸即可。为此,大家也可以看看高性能计算方向面试问题总结 (https://zhuanlan.zhihu.com/p/634557901),关于公司大家可以参考AI-Chip (https://github.com/basicmi/AI-Chip)
欢迎关注CodeLearner,一起学习和交流AI Systems、AI Chip的相关技术