1、深度学习平台的开发和应用百度 架构师接口和编程模式中间表达和异构硬件数据处理业务应用接口和编程模式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)代码
2、提交时,自动生成最新API文本,通过git diff可以直观发现API的修改。API的修改需要APIcommittee多人review。接口和编程模式Declarative Programming:”What”should be done.如TensorFlow静态图模式,SQL不易debug,执行时的逻辑和声明的代码分离。不易表达复杂逻辑,动态逻辑,不易混用第三方库,依赖框架本身算子的完备性。“易于”深度优化,执行前包含全局的逻辑。Imperative Programming:“How”to get things done.如Pytorch,C/C+,Java容易debug,逐行执行,随意修
3、改输入,打印输出,逐个模块验证。容易表达复杂逻辑。不易深度优化,无法预知未来,难以判断当前是否可以特殊处理。易于表达复杂逻辑,可利用Python的灵活性和numpy等丰富组件。接口和编程模式接口和编程模式Imperative越来越流行ICLR 2018-2019,TensorFlow引用 228-266,Pytorch引用 87-252TensorFlow 2.0 将把Eager Execution设为默认执行模式深度学习算法的灵活化,多样化Tree,Hierarchical,GAN,Pointer Network,Neural Turing Machine,Reinforcement Lea
4、rningDeclarative的优势未能充分发挥上千个硬件相关的黑盒算子难以参与全局优化。Control Flow的分析困难。核心算子的人工fusion往往更有效,长尾算子的优化成本太高。接口和编程模式Imperative模式的开发难点和优化策略Python的执行效率低。核心逻辑通过C+实现,异步调度,C+层返回一个Handle(类似future),Python层拿到handle,继续执行。当需要获取具体数据时再sync。无全局优化。对于顺序执行逻辑,通过implicit或者explicit的方法,把一段代码编译成图,通过cache进行复用。难以工业,移动端部署。通过trace,annota
5、tion和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则倾向于提供自动化的并行优化。中间表达和异构硬件异构计算时
6、代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,bfloat16Many Parallel Programming Framework:OpenCL,CUDA,OpenACC,OpenMP20152016,我花了1周用Inc