潘欣 12,5 最终版 潘欣 深度学习平台开发和应用

1. 深度学习平台的开发和应用 潘欣 Xin Pan 百度 架构师
3. 潘欣 架构师 • 百度深度学习技术平台部架构师,主要负责 PaddlePaddle深度学习框架开发相关工作。 • 在加入百度前,曾参与开发Google文件系统, 数据库系统和TensorFlow。对TensorFlow的 Eager Execution, Profiling, TPU做出了核心贡 献。 • 在计算机视觉CVPR,云计算SoCC等会议发 表论文。
4. • 接口和编程模式 • 中间表达和异构硬件 • 数据处理 • 业务应用
5. 接口和编程模式 • TensorFlow的Public Python API超过了3000个 • 除掉contrib还剩下接近2000个,需要向后兼容: https://www.tensorflow.org/guide/version_compat • 很多功能重复的API,deprecated API,名字类似但是计算逻辑或者性 能有差异的API • PaddlePaddle的Public Python API超过了400个 • 挑战:让50~100人的团队设计出数百个不后悔的API
6. 接口和编程模式 • API experiemental vs standard namespace • 新功能的API,在不稳定前,放在一个隔离的API namespace下,比如experimental,contrib。如 paddle.contrib.strange_api。用户可以容易判断API的稳定性。等到API稳定后,从实验的 namespace下迁移到正式的namespace。 • API Serialization • 所有Python API序列转成一个API文本来表示 (python inspect, op proto) • 代码提交时,自动生成最新API文本,通过git diff可以直观发现API的修改。API的修改需要API committee多人review。
7. 接口和编程模式 • Declarative Programming:”What” should be done. • 如TensorFlow静态图模式, SQL • 不易debug,执行时的逻辑和声明的代码分离。不易表达复杂逻辑,动态逻辑,不易混用第三方库,依赖框架本 身算子的完备性。“易于”深度优化,执行前包含全局的逻辑。 • Imperative Programming: “How”to get things done. • 如Pytorch, C/C++, Java • 容易debug,逐行执行,随意修改输入,打印输出,逐个模块验证。容易表达复杂逻辑。不易深度优化,无法预 知未来,难以判断当前是否可以特殊处理。易于表达复杂逻辑,可利用Python的灵活性和numpy等丰富组件。
8. 接口和编程模式
9. 接口和编程模式 • Imperative越来越流行 • ICLR 2018->2019,TensorFlow引用 228->266, Pytorch引用 87->252 • TensorFlow 2.0 将把Eager Execution设为默认执行模式 • 深度学习算法的灵活化,多样化 • Tree, Hierarchical, GAN, Pointer Network, Neural Turing Machine, Reinforcement Learning • Declarative的优势未能充分发挥 • 上千个硬件相关的黑盒算子难以参与全局优化。Control Flow的分析困难。核心算子的人工fusion往往更有效,长尾算子的优 化成本太高。
10. 接口和编程模式 • Imperative模式的开发难点和优化策略 • Python的执行效率低。核心逻辑通过C++实现,异步调度,C++层返回一个Handle(类似 future),Python层拿到handle,继续执行。当需要获取具体数据时再sync。 • 无全局优化。对于顺序执行逻辑,通过implicit或者explicit的方法,把一段代码编译成图, 通过cache进行复用。 • 难以工业,移动端部署。通过trace,annotation和code analysis的方法,得到程序到图的 映射。目前比较困难。(个人对tf的AutoGraph持怀疑态度。)
11. 接口和编程模式 • 其他有趣的设计trade-off • Functional vs Object-oriented API。早期tensorflow使用functional API 声明layers。Kera/Pytorch这使用class声明Layers/Modules。 • 是否让用户配置device placement。Tensorflow将device placement (数据, 模型并行)交给了用户。PaddlePaddle则倾向于提供自动化的并行优化。
12. 中间表达和异构硬件 • 异构计算时代 • CPU (几十个核,avx2->avx512),GPU (成千上万个core,千万个线程 ) • TPU(高性能MatMul, Transpose, Activation模块。HBM,成百上千chip互联HPC) • 移动设备(mali gpu, andreno gpu, npu, fpga, etc…) • 更复杂的带宽管理和内存管理:GPU Memory, PCIE,RDMA,GPU-Direct • 还有不同的数值精度:float16, int8, 还有int4, bfloat16 • Many Parallel Programming Framework: OpenCL, CUDA, OpenACC, OpenMP… • 2015~2016,我花了1周用Inception训练了ImageNet。2018,只需要几分钟。
13. 中间表达和异构硬件 • 系统中需要多重异步设计 • 文件读取异步,数据处理异步,数据->GPU异步,Op CPU->GPU异步, 网络通信异步。 • 需要CPU线程池分类,一部分负责数据在CPU的预处理,一部分负责文件和网 络的IO,一部分异步调用8个GPU。 • 图像,视频,语音的预处理也可以通过GPU加速。 • 当使用上千个chip进行大规模并发训练时,数据的处理往往成为瓶颈。
14. 中间表达和异构硬件 • 分布式训练师。CPU+TCP/IP, RDMA,GPU-Direct(GDR),会有 数倍的吞吐差异。 • GPU的显存往往不够用,额外的 CPU<->GPU拷贝可能导致计算量 降低数倍
15. 中间表达和异构硬件 • 不同模型的pattern很不一样。大规模稀疏模型单个参数可以有几十G甚至上T。图像模型的 feature extractor可能有上千层的深度。强化学习模型需要频繁的CPU交互。 • 需要有不同的优化策略。比如大规模稀疏模型需要一个将巨型参数进行分布式的管理,异步更 新。图像类模型通过分布式的数据并行,同步训练。 • 许多模型使用int8可以无精度损失。配合芯片支持,可以提速2~3倍,压缩体积到1/4。 • 开发者需要足够了解硬件。Float32和float64在GPU上的性能差异很大,但是CPU缺未必。
16. 中间表达和异构硬件 • 编译器技术给了我们很多启 示。 • 很多不同的语言(模型结 构),使用统一的中间表达, 和模块化的优化策略,生成 适合在不同设备上执行的代 码。
17. 中间表达和异构硬件 组网模块 Python API 训练模块 训练RunTime CPU/GPU集群 模型表达与优化 模型Program 统一中间表达 统一中间表达优化库 服务器预测 服务器预测API 服务器预测RunTime 移动端预测 移动端预测API 移动端预测RunTime
18. Trained Model 中间表达和异构硬件 模型表达与优化 模型Program 统一中间表达 服务器预测 预测接口: 1. Buffer-Management 2. Predictor Generation 3. Optimization Customization 4. Runtime Customization Load模型和初始化 Operator fusion pass Model prune pass Quantization pass Fine-tune pass Visualization pass Memory Planning Pass 3rd-party runtime integration pass … 服务器预测Runtime Native Operator s Nvidia TensorR T Intel nGrap h 3rdParty Runtim e CPU/GPU
19. 中间表达和异构硬件 • 统一中间表达 • Static-Single-Assigment Directed Acyclic Graph • 模块化的优化策略 • 每个策略是一个单独的Pass。Graph-in-Graph-out • Pass以plug-in形式注册,可以按模型定制,按硬件设备定制,按优化 目标定制,按分布式模式定制。可以自由组合。
20. 中间表达和异构硬件 • 常见Pass • 可视化。将中间表达可视化,方便debug和定制优化 策略。 • Operator fusion。将反复出现的细粒度算子或者性能 瓶颈的多个算子融合成一个高性能算子。 • 显存优化。通过图的依赖关系分析,新的显存需求可以 通过直接复用上次分配的空间,无需重新分配
21. 中间表达和异构硬件
22. 中间表达和异构硬件 • Deep Learning Compiler • 痛点:深度学习框架有成百上千个算子。不同的硬件设备常常需要特殊实现这些算子: CUDA, OpenCL, Metal。高级的优化需要使用汇编和指令:SASS, AVX, NEON。特殊的 AI芯片对编程支持不完备。不同算子独立实现,难以全局优化。 • Idea:定义一些(少量)primitive的,硬件无关的基础算子和计算表达式,所有高级算子 基于这些基础实现。优化策略可以单独定制。通过硬件无关的编译技术,对模型(通常是 图)的中间表达进行优化。形成一个统一的中间表达。不同的硬件设备商对这个统一的中 间表达,实现各自硬件相关的优化逻辑,产生硬件可执行文件。
23. 中间表达和异构硬件
24. 中间表达和异构硬件 def batch_matmul(batch_size, F, M, K, N): A = tvm.placeholder((batch_size, F, M, K), name='A') B = tvm.placeholder((batch_size, F, K, N), name='B') k = tvm.reduce_axis((0, K), 'k') C = tvm.compute( (batch_size, F, M, N), lambda b, f, m, n: tvm.sum(A[b, f, m, k] * B[b, f, k, n], axis=k), name='C') s = tvm.create_schedule(C.op) … BB, MM, FF, PP = s[C].op.axis BBMMFF = s[C].fuse(BB, MM, FF) by, ty_block = s[C].split(BBMMFF, factor=num_thread_y*vthread_y) bx, tx_block = s[C].split(PP, factor=num_thread_x*vthread_x) s[C].bind(by, block_y) s[C].bind(bx, block_x) vty, ty = s[C].split(ty_block, nparts=vthread_y) vtx, tx = s[C].split(tx_block, nparts=vthread_x) s[C].reorder(by, bx, vty, vtx, ty, tx) s[C].reorder(by, bx, ty, tx) s[C].bind(ty, thread_y) s[C].bind(tx, thread_x) s[C].bind(vty, thread_yz) s[C].bind(vtx, thread_xz) s[CS].compute_at(s[C], tx) tvm.lower(s, [A, B, C], simple_mode=True)
25. 中间表达和异构硬件 • 汇编和指令编程 • 异构设备发展非常的快 • gcc等编译器无法很智能的利用 新的硬件设备 • 深度学习大量计算通常是一些 gemm,在可控的开发成本内可 以带来显著的收益。
26. 中间表达和异构硬件 • 集成在框架中的可视化的timeline分析
27. 数据处理 • TensorFlow • 最开始:多个Python线程驱动的并发数据处理,需要启动一个FIFOQueue。数据预处理常常成为性能 瓶颈。 • tf.data:对数据处理模块进行改写,C++多线程并发。单机多GPU通常能满足性能需求。但是对于TPU 的512 chip并发训练,依然容易成为性能瓶颈。 • Input Pipeline中的计算时图的一部分,需要使用TensorFlow的Op完成。 • PaddlePaddle • 用户定制数据预处理,灵活使用Python或C++。处理后的数据放入框架提供buffer。框架异步将buffer 交给训练计算。
28. 业务应用 • 常见服务器端应用 • Batching可显著提升throughput 25.6 • 由于框架本身开销,BatchSize=1往往不能显著 12.8 降低延迟。 6.4 3.2 • 所有的优化决策都依照profile结果。经验性的 1.6 猜测往往不准。 0.8 0.4 0.2 • 合理的进行混合调度。将一部分计算offload给 0.1 第三个引擎,如TensorRT,nGraph。 8月20日 地图路径规划模型Latency (ms) bathch_size=1 batch_size=10 batch_size=20 batch_size=50 batch_size=100 8月23日 8月24日 8月26日
29. 业务应用 • 常见服务器端应用 • 机器的型号对性能产生非常大的影响 • 比如,新的Intel CPU带有int8, avx512,可显著提升一些优化策略的效果。 • 低数值精度int8可以显著提升性能1.5到2倍左右,精度损失常常可以控制在1%以内。 • 比较全面的profile性能瓶颈 • 新的PCIE可能对单机并发训练性能产生20%左右的优化。RDMA有时可以显著提升分布式训练性能。
30. 业务应用 • 大规模推荐系统 • 亿级的稀疏特征,单个模型数百个GB • 特殊的模型并行 • 参数sharding • 分布式的特征向量的lookup table • 分布式的模型恢复和保存
31. 业务应用 • 移动端应用 • 使用量化和压缩策略。Int8能提升2倍左右性能,将模型体积压缩到原来 1/4。 • 选择性编译。根据模型需要的算子,只编译部分框架,减小包体积。 • 考虑调用GPU。移动设备GPU性能逐渐提升,利用率常常不高。避免和 其他程序抢占CPU资源,导致系统卡顿。 • 有时需要使用汇编和operator fusion等方法,满足性能需求。
32. 业务应用 • 移动端应用 • 灵活选择模型,在精 度和资源消耗上有很 多trade-off可以选 择。常常不会选择精 度最高的模型,因为 每flops增加带来的 精度提升通常呈现衰 减趋势。
33. 业务应用 • 移动端应用 • 支持多设备,合理的 调度,充分利用“合 适”的资源。 • 利用华为NPU,大 幅提升AI计算的性 能,节省CPU的宝贵 资源