Snapdragon Neural Processing Engine SDK是美国高通公司出品的神经网络处理引擎(SNPE),可运行于搭载了高通Zeroth机器智能平台的820芯片处理器,开发者可以在SNPE上搭建自己的深度学习网络模型。更详细的介绍可以登录高通SNPE相关网页了解:https://developer.qualcomm.com/software/snapdragon-neural-processing-engine 。介绍到此为止。
最近在用snpe做一个项目,将tensorflow的pb模型转为snpe的dlc模型,并利用snpe将模型运行在骁龙GPU上。但不得不说,snpe目前做的还不是非常完美,有些需要定制化的神经网络层可能在原生snpe中没有提供。但还好高通提供了用户定义层(UDL)功能,通过回调函数可以自定义算子,并通过重编译C++代码将自定义文件编译到可执行文件中。如果开发就是使用的C++,那比较容易实现用户定义层,但如果是运行在Android上就比较麻烦了,上层java代码需要通过JNI来调用snpe原生的C++编译好的.so文件,因为用户定义层的代码是不可能预先编译到snpe原生.so文件中的,所以用snpe提供的Java API是无法获得用户定义层的功能的,所以,必须重新开发SNPE的JNI。
出于涉密考虑,用户定义层的代码我不会展示,只展示JNI的骨架代码,关于用户定义层(UDL)的实现可以参阅SNPE的相关文档。
Java层的代码:
public class SnpeController {
public enum Runtime {
CPU,
GPU,
DSP
}
private int height = 0;
private int width = 0;
private int channel = 0;
private Runtime runtimeMode = Runtime.GPU;
private String loggerDir = "";
private String modelFilePath = "";
private long containerPointer = 0;
private long snpePointer = 0;
private float[] inputData = null;
private int inputLength = 0;
private float[] outputData = null;
public SnpeController(int imageHeight,
int imageWidth,
int imageChannel,
String modelPath) {
this(imageHeight, imageWidth, imageChannel, modelPath, Runtime.CPU, "/home/mi/snpe_log_dir/");
}
public SnpeController(int imageHeight,
int imageWidth,
int imageChannel,
String modelPath,
Runtime runtimeMode,
String loggerDir) {
setImageShape(imageHeight, imageWidth, imageChannel);
setModelPath(modelPath);
setRuntime(runtimeMode);
setLoggerDir(loggerDir);
}
public void setImageShape(int height,
int width,
int channel){
this.height = height;
this.width = width;
this.channel = channel;
}
public void setModelPath(String modelPath){
modelFilePath = modelPath;
}
public void setRuntime(Runtime runtime){
runtimeMode &