一 笔记
1.1reinterpret_cast
reinterpret_cast<类型说明符>(表达式)
将表达式强制转换成类型说明符的类型
1.2 模型
由数学运算和通过训练学习到的常量值构成的计算图。创建成功后可以在线程和编译期间复用
1.3 LOAD_FUNCTION
根据共享对象HANDLE中找到所引用的运行时地址命名为NAME的符号,也就是说根据要调用的函数名找到函数的实体。
1.4 NNAPI
NNAPI是 Android 8.1(API等级27)以后提供的专门处理机械学习的 Native 库。
1.5 模型训练
通过良好的模型将海量的资料计算出一组模型权重资料。
1.6 Android NN 的委托
将Android nn的接口进行一个重新的封装,使得相关调用的接口组合在一起,得到一个功能比较完整的接口。
1.7 android.bp
android.bp是用来配置android nn 生成动态库的一个配置文件。该语言设计简单,没有条件判断或控制流语句,采用在Go语言编写控制逻辑。
1.8 模型编译
将NNAPI模型编译成为低级代码的配置。编译成功后在线程和执行中可以复用,
1.9 内存
代表共享内存,内存映射文件与相似的内存缓存。使用内存缓存可以高效的把运行数据传输到驱动层。一个应用程序通常会创造一个共享内存缓存,包含每个tensor定义的模型。也可以用内存缓存来存储实例的输入输出。在NNAPI中,每个内存缓存代表一个ANeuralNetworksMemory实例。
1.10 模型执行
用于NNAPI输入和收集结果的接口。执行是一个异步操作,多线程可以在相同执行中等待。当执行完成后,所有线程都会被释放。在NNAPI中,每个执行代表一个ANeuralNetworksExecution的实例。
1.11 训练数据的访问
训练的权重和偏差数据可能存储在文件中。为了提供NNAPI运行时能够访问数据,通过调用ANeuralNetworksMemory_createFromFd()方法来创建一个ANeuralNetworksMemory实例,然后将打开数据文件的文件描述符作为参数传递到函数中。
1.12 NNAPI的工作原理
狭义上,NNAPI单指一组C语言API。广义上,NNAPI由NNAP、NN Runtime、NN HAL组成。
1.13 NPU硬件处理模型
如果NPU要执行模型任务,需要创建NNAPI Delegate,然后通过NNAPI Delegate将tflite模型转换为AndroidNN model。
1.14 Interpreter
解释型推理框架,在执行阶段首先需要解析不同的深度学习模型文件,但是NNAPI并没有提供相关的Parser功能,在ANDROID NN子系统中是通过TFlite深度学习库来完成模型的解析功能,并通过TFlite库中的NNAPI Delegate模块来完成TFLite模型到Android nn模型的转换。
1.15 NN Runtme中的模型分段执行功能
首先通过NN HIDL Interface查询已注册的计算设备对算子支持能力、算子计算性能和功耗能力。然后根据分段策略来选择不同设备的最优选择,在使用时需要考虑模型分段后的数据在不同device中传输的性能开销。
1.16 NPU HAL实现的功能
NPU HAL实现了设备支持算子的检验功能,检测待执行的andriodnn模型中的操作符和其对应的参数在NPU设备上是否支持。同时还提供算子执行的性能和功耗能力。
1.17 NN AIDL Interface
用于指导不同的计算设备厂商实现计算设备的HAL软件,并通过XTS测试来保证设备厂商实现符合平台兼容性的要求。
1.18 android nn模型构建
提供android nn描述符和构建功能,在加入操作符和关联的操作数之前会对相关的约束条件进行校验,并重新reorder后加入操作符队列。
1.19 android nn模型分段
根据已经创建的nn device设备对算子的支持和算子的计算性能将构建的android nn模型进行算子列表分割,从而指定不同的算子执行设备。
1.20 andriod nn模型编译
将指定到不同设备的算子列表信息,使用不同的设备中实现的编译预处理接口将分段后的子模型进行预处理,生成可在设备上执行的命令流。
1.21 android nn模型执行
分段后的子模型都会创建对应的step,android nn runtime 会根据step队列顺序来调度执行对应的子模型,最后返回执行结果。
1.22 Android NN HIDL Interface
用于指导不同的计算设备厂商实现不同的计算设备HAL软件。
1.23 Java API
提供不同AI业务场景的接口。
使用:
应用先通过ServiceManager 获取到AIEngine service 句柄,再根据业务需求获取到对应业务场景的实例,成功后传入需要执行的模型文件(可配置是否使用cache后的模型文件);模型加载完成后设置需要处理的数据。最终调用对应业务场景实例的执行接口完成推理任务获取到执行后的数据。
该功能需要AIEngine服务根据AI业务类型完成对应业务场景的开发。
1.24 AI Engine
实现不同的AI业务场景编程,包括proprocess;提供独立的AIengine服务。
1.25 Native API
TFLite的C接口,应用基于接口完成模型加载,编译,推理和输出数据的获取。
使用:
TFLite 库会加载到Native应用进程中,应用调用TFLite模型加载接口直接将模型映射到应用进程的内存空间;再创建Interpreter对内存中的flatbuffer model进行操作符和操作数参数解析并标记Tensor的生命周期和读写类型。应用将模型执行任务下发到NPU硬件处理必须先创建NNAPI Delegate将TFlite模型转换为AndroidNN model。最后应用将输入的数据进行前处理以满足模型对输入数据的要求。使用Interpreter Invoke 接口完成任务推理工作。
Native接口在Android AOSP代码中已经提供,无额外的开发工作。
1.27 Prepare
组件名称 功能描述
ExecutionPlan ExecutionPlan 控制整个AndroidNN模型执行;其由若干个 ExecutionStep 组成。ExecutionStep 的执行由ExecutionPlan 控制,在ExecutionPlan::finish
中会对将要执行的子网络进行预处理
ExecutionStep 网络拆分出的子网络。每个 ExecutionStep 都完整地在一个硬件设备上运行
CPU PrepareModel 在子网络回退到 CPU 运行时使用。
1.28 regester.cc
定义算子的支持。,可以通过自己定义的算子支持来适配自己编写的算子
1.29 TVM中模型图分割
在TVM中,模型中的图分割是在relay阶段。之后生成一个RelayIR Model的中间子图模型。
1.30 ReplaceNodeSubsetsWithDelegateKernels
TFLite中用来进行图分割的函数是ReplaceNodeSubsetsWithDelegateKernels。
1.31 PartitionGraphIntoIndependentNodeSubsets
分析图以找到所有独立的node_subsets,将图形划分为独立的节点子集。
1.32 Android Neural Networks API子图划分的依据
Android nn 的划分是根据设备是否支持算子,还根据各个设备的性能,功耗,以及用户运行时的划分偏好。具体的划分工作由ExecutionPlan 主导以及其他多个模块共同完成。
1.33 网络划分后的执行过程
ExecutionPlan和其他两个模块协助,从而控制网络划分后的执行过程
(1) Controller控制控制这网络的一次执行状态,记录了当前执行到多少步(ExecutionStep)。
(2) ExecutionStep是网络拆分出来的之网络。每个EexcutionStep都完整的运行在一个子设备上。
1.34 执行步骤在执行过程中的控制器
StepExecutor:将ExecutionStep分配到某个硬件上执行。
CPU Fallback:退回到CPU执行时使用,他包含一个小的runtime和在TensorFlow Lite实现的算子
1.34 DeviceManager
DeviceManager 负责管理并进一步抽象底层设备。抽象的工作包括抹除 Android Neural Networks API 不同版本间的差异。
二 模型创建
2.1 ANeuralNetworksMemory_createFromFd()
功能:在NNAPI运行时为一类数据提供高效的访问途径如存储训练权重和偏差数据的文件。
输入:数据文件的文件描述符
输出:无
2.2 ANeuralNetworksModel_create()
功能:构建模型
输入:模型类型的指针
输出:无
2.3 ANeuralNetworksModel_addOperation ()
功能:将运算数添加到模型中
输入:模型,运算数类型,输入数据的数目,输入操作数的索引数组,输出数组的数目,输出操作数的索引数组
输出:无
2.4 ANeuralNetworksModel_identifyInputsAndOutputs()
功能:设置运算数是作为模型的输入还是输出
输入:模型、输入数组的条数、输入的索引,输出数组的条数,输出的索引
输出:无
2.5ANeuralNetworksModel_relaxComputationFloat32toFloat16()
功能:设置计算范围和精度
输入:模型,计算范围和精度的设置
输出:无
2.6 ANeuralNetworksModel_finish()
功能:完成模型的定义
输入:模型
输出:成功返回ANEURALNETWORKS_NO_ERROR
三 模型编译
3.1 ANeuralNetworksCompilation_create()
功能:创建一个编译实例
输入:要编译的模型、编译实例的地址
输出:如果成功返回ANEURALNETWORKS_BAD_DATA
3.2 ANeuralNetworksCompilation_setPreference()
功能:设置电池电量消耗与执行速度的适配
输入:要设置的编译实例、设置的模式
输出,如果成功则返回ANEURALNETWORKS_NO_ERROR
可以设置的模式:
ANEURALNETWORKS_PREFER_LOW_POWER:倾向于以最大限度减少电池消耗的方式执行。这种设置适合经常执行的编译。
ANEURALNETWORKS_PREFER_FAST_SINGLE_ANSWER:倾向于尽快返回单个答案,即使这会耗费更多电量。这是默认值。
ANEURALNETWORKS_PREFER_SUSTAINED_SPEED:倾向于最大限度地提高连续帧的吞吐量,例如,在处理来自相机的连续帧时。
3.3 ANeuralNetworksCompilation_setCaching()
功能:设置编译缓存
输入&