深入浅出XDL(一):Blaze推理引擎

Blaze是阿里巴巴开源的一款深度学习推理引擎,官方介绍,它是一款面向广告/搜索/推荐场景的高性能深度学习推理引擎。本文对blaze的源码进行简单的分析。

内核源码目录结构

Blaze的内核采用c++开发,首先看一下balze内核源码的主要目录结构:

目录 功能
binding Python接口代码
blaze/api balze的接口代码,包括C、C++两种,C++主要的接口类是
blaze/batching 调度器
balze/common 公共库代码,一些工具类
balze/graph 包含模型的实现类Net、SimpleNet、HybridNet、DagNet
balze/math 底层数学计算库
balze/model_importer 模型加载工具类,支持多种格式的模型加载,包括自定义格式ULF,Blaze,Onnx.Mixnet,Tensorflow,Xdl,Xld ulf
balze/operator Operator类定义了所有操作的接口,深度模型中每个Node都会绑定一个Operator,Operator是深度模型中的基本计算单元;非常类似与tensorflow中Operator的设计
balze/optimizer 模型优化器,包括模型折叠、模型剪枝等等
balze/proto 模型涉及的基础类型的定义,包括NetDef, OperatorDef, DeviceType, DataType, Argument
balze/scheduler 调度器,负责Operator的调度和执行
balze/store 模型持久化与加载,包括Sparse参数的加载和查询接口SparsePuller
balze/test 单元测试

核心类介绍

类名 功能
PredictorManager 管理一个模型的若干个predictor,目前不支持模型的热更新,模型更新之后,需要创建新的对象; 实现原理上是从外部加载模型的定义NetDef以及模型参数,在创建Predictor的时机,进行模型的实例化,也就是生成模型的内存表示形式Net对象
Predictor 推理接口,Feed输入,Output推理结果,目前是非线程安全的
ModelImporter 模型加载功能的基类,作用是从外存中加载若干种格式的模型,转换成blaze统一的模型定义NetDef; 具体实现类有MXNetImporter,ONNXImporter,ULFImporter,XdlImporter,TensorFlowImporter等等
Net 模型的基类,模型内存中存在的形式,根据NetDef创建,具体实现类有SimpleNet, HybridNet, DagNet
Scheduler 模型推理过程的调度器
Operator 模型推理的最小计算单元,模型有若干Operator以及之间的连接构成;Operator的概念非常类似与Tensorflow中的Operator概念,但是做了简化,没有了OperatorKernel的概念;并且很多Operator可以找到一一对应的映射,比如tensorflow里的VariableOp对应Blaze这边的ContantFillOp,等等
SparsePuller XDL支持Sparse类型的模型参数,Blaze作为xdl官方推荐的推理引擎也支持Sparse类型的模型参数的加载,SparsePuller就是Sparse参数的加载和查询接口,目前主要的实现类是QuickEmbeddingDict,其功能是将Spasre参数加载到内存中的Hashtable,并提供查询方法
Optimizer 模型结构的优化器,为了加速推理过程,在不影响推理结果的情况下,对模型结构进行优化,比如常量折叠,并发优化和模型剪枝等等

动态分析

在这里插入图片描述

  • 主要分为模型加载和推理两个阶段
  • 模型分为spase部分和dense部分,分别加载

总结

  • blaze是独立实现的推理引擎,底层不依赖任何现存的其他深度学习框架,比如tensoflow, mxnet等等
  • 这种设计的优点是可以摆脱其他的框架的包袱,针对推理这个特定的场景进行性能优化,不用考虑训练的场景需求
  • 缺点是与流行框架之间的版本兼容的问题,包括功能的兼容和功能的一致性
  • 也没法复用其他框架的一些高级功能,比如运行时编译、模型优化等优化的功能,运行的性能有待验证
  • 针对广告/搜索/推荐场景的需求,虽然支持了Sparse参数,但是支持的并不彻底:Sparse参数的特点是总量非常大,blaze目前支持的Sparse参数加载方式是加载到本机的内存中,这个方案受本地内存大小的限制,有很大的局限性,猜测阿里内部并不是直接用的blaze做推理服务
  • 好在可以很方便的对blaze的Sparse参数加载方式进行扩展
发布了52 篇原创文章 · 获赞 105 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/gaofeipaopaotang/article/details/100823889