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参数加载方式进行扩展