原理介绍¶
这里我们介绍如何使用BMLang来支持用户的DL框架和模型推理。
简单来说,我们只需要做两件事情。
用BMLang来实现各个DL框架算子的推理计算。
初始化BMLang,遍历神经网络图中所有算子的BMLang实现Function,启动BMLang编译。
完成上述两步后,就能将用户DL框架的神经网络模型转成了SOPHON TPU可以运行的BModel。
BModel介绍请见nntoolchain文档。
DL框架算子的BMLang实现¶
这里我们可以对DL框架中各个算子的推理计算进行BMLang编程实现即可。 BMLang编程实现可以认为是除CPU、GPU外另一种后端的实现。 同CPU、GPU实现,建议各个算子推理计算的BMLang编程实现作为一个独立的Function。
当我们完成算子的BMLang实现时,需要调试BMLang编程是否正确。 此时我们可以建立算子Test程序,一方面将BMLang设置为COMPUTE_CPU模式调用BMLang实现Function, 获取BMLang实现后的算子结果;另一方面启动算子对应的CPU推理实现,获取CPU算子推理计算的结果, 将这两者的结果进行比较即可验证BMLang实现是否正确。
如果遇到数据结果对不上,我们将BMLang实现Function当成一个普通的C++程序进行调试即可,可以使用GDB调试。 COMPUTE_CPU模式下,每走过一个BMLang操作,我们都可以获取到该操作的输出数据,从而找出问题所在, 实现正确的BMLang程序。
BMLang编译和模型转换¶
这里介绍如何将DL框架构建的Graph转成BMLang描述的Graph,最终启动BMLang编译器将模型转换成bmodel。
首先,在使用DL框架接口读入模型文件之前,通过使用BMLang的Control Function进行BMLang的初始化配置。
接着通过DL框架的接口读入模型文件,构建Graph,invoke遍历Graph中的所有算子,遍历算子的时让每个算子进入到BMLang实现的Function里。
启动DL框架的CPU推理,获取各个算子的输出名字和输出数据。
启动BMLang的Compile函数。
结束BMLang编译。