张量编程

BMLang的基本元素是张量数据(Tensor)和计算操作(Operator)。BMLang中提供了Tensor接口和Operator接口。 BMLang的编程方式则是使用Operator来实现Tensor的计算。

用户使用BMLang编程时,只需要关注计算实现,无需关注数据在存储中的搬运。

一个简单的张量编程示例如下所示:

// Declare Tensors
bmlang::Tensor tensor_src0("binary_input", bmlang::FLOAT32, n, c, h, w);
bmlang::Tensor tensor_src1("binary_input1", bmlang::FLOAT32, n, c, h, w);
bmlang::Tensor tensor_src2("binary_input2", bmlang::FLOAT32, n, c, h, w);
bmlang::Tensor tensor_res("binary_output", bmlang::FLOAT32);

// Call the bmlang ops
bmlang::add(tensor_src0, tensor_src1, tensor_res);
bmlang::sub(tensor_res, tensor_src1, tensor_res);
bmlang::mul(tensor_res, tensor_src2, tensor_res);
bmlang::div(tensor_res, tensor_src2, tensor_res);

异构编程

BMLang程序中只有bmlang::Operator才会在运行时执行。 而BMLang程序中除bmlang::Operator以外的C/C++程序,只是起到辅助控制的作用,

如果遇到一些计算,当前的bmlang::operator不能实现,需要转成CPU的C/C++程序, 则需要使用bmlang::customed_ops接口来实现自定义功能的CPU程序, 从而完成TPU和CPU的异构计算。

编译和运行时

用户需要使用bmlang::Tensor和bmlang::Operation来写C++代码,从而构建bmlang程序。 然后在程序最后调用bmlang::compile或者bmlang::compile_with_check来生成SOPHON TPU 的目标二进制文件。

完成构建上述bmlang程序后,通过使用C++编译器编译bmlang C++程序,然后执行程序,生成 目标二进制bmodel文件。

完成目标二进制bmodel文件生成后,通过调用BMRuntime的接口来启动对应bmlang编写的计算 功能运行在SOPHON TPU芯片中。

框架集成

目前BMLang只适用于推理框架的推理部分。用户只需要针对框架中的每个算子都用BMLang进行编程实现 计算,然后通过框架装载网络,并遍历所有算子的BMLang程序部分,最后调用bmlang::compile,即可完成客户 框架的模型向SOPHON TPU可运行的bmodel转换。

详细地框架集成BMLang程序请参考第四章“对用户DL框架和模型支持”。

编程步骤

使用BMLang编程需要经历四个阶段:

  • Coding阶段:使用BMLang对算法进行描述。

  • Debug阶段:使用COMPUTE_CPU模式来看BMLang Coding的结果是否正确。(可使用GDB等调试工具)

  • Compile阶段:若是神经网络,则运行BMNetC等;若是单独的Function,则调用BMLang Compile接口将BMLang程序编译成Sophon TPU可运行的bmodel。

  • Runtime阶段:使用Bmruntime库load bmodel,在Sophon TPU中运行神经网络或者单独使用BMLang编写的Function。