深度学习平台的开发和应用_第1页
深度学习平台的开发和应用_第2页
深度学习平台的开发和应用_第3页
深度学习平台的开发和应用_第4页
深度学习平台的开发和应用_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

深度学习平台的开发和应用接口和编程模式中间表达和异构硬件数据处理业务应用接口和编程模式TensorFlow的Public

Python

API超过了3000个除掉contrib还剩下接近2000个,需要向后兼容:

https:///guide/version_compat很多功能重复的API,deprecated

API,名字类似但是计算逻辑或者性能有差异的APIPaddlePaddle的Public

Python

API超过了400个挑战:让50~100人的团队设计出数百个不后悔的API接口和编程模式•APIexperiementalvsstandard

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的修改需要APIcommittee多人review。接口和编程模式•DeclarativeProgramming:”What”shouldbe

done.如TensorFlow静态图模式,

SQL不易debug,执行时的逻辑和声明的代码分离。不易表达复杂逻辑,动态逻辑,不易混用第三方库,依赖框架本身算子的完备性。“易于”深度优化,执行前包含全局的逻辑。•ImperativeProgramming:“How”togetthings

done.如Pytorch,

C/C++,

Java容易debug,逐行执行,随意修改输入,打印输出,逐个模块验证。容易表达复杂逻辑。不易深度优化,无法预知未来,难以判断当前是否可以特殊处理。易于表达复杂逻辑,可利用Python的灵活性和numpy等丰富组件。接口和编程模式接口和编程模式•Imperative越来越流行ICLR

2018->2019,TensorFlow引用

228->266,

Pytorch引用

87->252TensorFlow

2.0

将把Eager

Execution设为默认执行模式•深度学习算法的灵活化,多样化Tree,Hierarchical,GAN,PointerNetwork,NeuralTuringMachine,Reinforcement

Learning•Declarative的优势未能充分发挥上千个硬件相关的黑盒算子难以参与全局优化。Control

Flow的分析困难。核心算子的人工fusion往往更有效,长尾算子的优化成本太高。接口和编程模式Imperative模式的开发难点和优化策略Python的执行效率低。核心逻辑通过C++实现,异步调度,C++层返回一个Handle(类似future),Python层拿到handle,继续执行。当需要获取具体数据时再sync。无全局优化。对于顺序执行逻辑,通过implicit或者explicit的方法,把一段代码编译成图,通过cache进行复用。难以工业,移动端部署。通过trace,annotation和code

analysis的方法,得到程序到图的映射。目前比较困难。(个人对tf的AutoGraph持怀疑态度。)接口和编程模式其他有趣的设计trade-offFunctional

vs

Object-oriented

API。早期tensorflow使用functional

API声明layers。Kera/Pytorch这使用class声明Layers/Modules。是否让用户配置device

placement。Tensorflow将device

placement

(数据,模型并行)交给了用户。PaddlePaddle则倾向于提供自动化的并行优化。中间表达和异构硬件•异构计算时代CPU

(几十个核,avx2->avx512),GPU

(成千上万个core,千万个线程

)TPU(高性能MatMul,

Transpose,

Activation模块。HBM,成百上千chip互联HPC)移动设备(maligpu,

andreno

gpu,

npu,

fpga,

etc…)更复杂的带宽管理和内存管理:GPU

Memory,

PCIE,RDMA,GPU-Direct还有不同的数值精度:float16,

int8,

还有int4,

bfloat16ManyParallelProgrammingFramework:OpenCL,CUDA,OpenACC,

OpenMP…•2015~2016,我花了1周用Inception训练了ImageNet。2018,只需要几分钟。中间表达和异构硬件系统中需要多重异步设计文件读取异步,数据处理异步,数据->GPU异步,Op

CPU->GPU异步,网络通信异步。需要CPU线程池分类,一部分负责数据在CPU的预处理,一部分负责文件和网络的IO,一部分异步调用8个GPU。图像,视频,语音的预处理也可以通过GPU加速。当使用上千个chip进行大规模并发训练时,数据的处理往往成为瓶颈。中间表达和异构硬件分布式训练师。CPU+TCP/IP,RDMA,GPU-Direct(GDR),会有数倍的吞吐差异。GPU的显存往往不够用,额外的CPU<->GPU拷贝可能导致计算量降低数倍中间表达和异构硬件不同模型的pattern很不一样。大规模稀疏模型单个参数可以有几十G甚至上T。图像模型的feature

extractor可能有上千层的深度。强化学习模型需要频繁的CPU交互。需要有不同的优化策略。比如大规模稀疏模型需要一个将巨型参数进行分布式的管理,异步更新。图像类模型通过分布式的数据并行,同步训练。许多模型使用int8可以无精度损失。配合芯片支持,可以提速2~3倍,压缩体积到1/4。开发者需要足够了解硬件。Float32和float64在GPU上的性能差异很大,但是CPU缺未必。中间表达和异构硬件编译器技术给了我们很多启示。很多不同的语言(模型结构),使用统一的中间表达,和模块化的优化策略,生成适合在不同设备上执行的代码。中间表达和异构硬件移动端预测服务器预测模型表达与优化训练模块组网模块Python

API训练RunTimeCPU/GPU集群模型Program统一中间表达统一中间表达优化库服务器预测API服务器预测RunTime移动端预测API移动端预测RunTime中间表达和异构硬件模型表达与优化模型Program统一中间表达Operatorfusion

passModelprunepassQuantizationpassFine-tunepassVisualization

passMemoryPlanning

Pass3rd-partyruntimeintegration

pass…预测接口:Buffer-ManagementPredictor

GenerationOptimizationCustomizationRuntimeCustomizationTrained

ModelNvidiaTensorRTNativeOperatorsIntelnGraphCPU/GPU服务器预测服务器预测Runtime3rd-PartyRuntimeLoad模型和初始化中间表达和异构硬件统一中间表达Static-Single-AssigmentDirectedAcyclic

Graph模块化的优化策略每个策略是一个单独的Pass。Graph-in-Graph-outPass以plug-in形式注册,可以按模型定制,按硬件设备定制,按优化目标定制,按分布式模式定制。可以自由组合。中间表达和异构硬件•常见Pass可视化。将中间表达可视化,方便debug和定制优化策略。Operator

fusion。将反复出现的细粒度算子或者性能瓶颈的多个算子融合成一个高性能算子。显存优化。通过图的依赖关系分析,新的显存需求可以通过直接复用上次分配的空间,无需重新分配中间表达和异构硬件中间表达和异构硬件DeepLearning

Compiler痛点:深度学习框架有成百上千个算子。不同的硬件设备常常需要特殊实现这些算子:CUDA,

OpenCL,

Metal。高级的优化需要使用汇编和指令:SASS,

AVX,

NEON。特殊的AI芯片对编程支持不完备。不同算子独立实现,难以全局优化。Idea:定义一些(少量)primitive的,硬件无关的基础算子和计算表达式,所有高级算子基于这些基础实现。优化策略可以单独定制。通过硬件无关的编译技术,对模型(通常是图)的中间表达进行优化。形成一个统一的中间表达。不同的硬件设备商对这个统一的中间表达,实现各自硬件相关的优化逻辑,产生硬件可执行文件。中间表达和异构硬件中间表达和异构硬件defbatch_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=pute((batch_size,F,M,N),lambdab,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.axisBBMMFF=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)中间表达和异构硬件汇编和指令编程异构设备发展非常的快gcc等编译器无法很智能的利用新的硬件设备深度学习大量计算通常是一些gemm,在可控的开发成本内可以带来显著的收益。中间表达和异构硬件集成在框架中的可视化的timeline分析数据处理•TensorFlow最开始:多个Python线程驱动的并发数据处理,需要启动一个FIFOQueue。数据预处理常常成为性能瓶颈。tf.data:对数据处理模块进行改写,C++多线程并发。单机多GPU通常能满足性能需求。但是对于TPU的512

chip并发训练,依然容易成为性能瓶颈。Input

Pipeline中的计算时图的一部分,需要使用TensorFlow的Op完成。PaddlePaddle用户定制数据预处理,灵活使用Python或C++。处理后的数据放入框架提供buffer。框架异步将buffer交给训练计算。业务应用•常见服务器端应用Batching可显著提升throughput由于框架本身开销,BatchSize=1往往不能显著降低延迟。所有的优化决策都依照profile结果。经验性的猜测往往不准。合理的进行混合调度。将一部分计算offload给第三个引擎,如TensorRT,nGraph。6.412.825.68月20日8月23日8月24日8月26日地图路径规划模型Latency

(ms)bathch_size=1batch_size=10batch_size=20batch_size=50b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论