local size 一般而言越大越好,但 computer shader 所需要的寄存器越多,local size 的最大值就越小,考虑到最耗时的卷积shader所能使用的local size 一般也就 64,保守起见都定为64(8乘8)。 不能对齐的情况在shader中处理,比如下面的代码:
3. 适当地合并/去除layer 如正则层可以直接和上一层合并(末尾加个max处理就行),dropout层可以直接丢弃。 合并可以提升性能(不过不会太多),但最重要的是减少了中间内存。 框架设计 分为两个子模块,引擎模块在客户端上运行,工具模块用来转换caffe的模型文件。
引擎模块 1. 数据层 Image 为一个RGBA32F格式的2D Array纹理,SSBO为一种vbo, 全称为GL_SHADER_STORAGE_BUFFER,用于存储自定义类型的数据(主要就是卷积层和内积层的参数)。 Program 为 着色器链接而成的 opengl program,NetInfo 由 proto 定义,用于规定网络结构。 在 shader 中,image 和 SSBO 示例如下:
2. 算子层 包括各类layer的实现,如卷积、正则、内积(全连接)、Softmax等。 每一个layer要负责申请自己的输出内存(image)。 3. 结构层 根据 NetInfo 的信息,创建各类算子并构成DAG(有向无环图),执行运算并输出结果。 下图是lenet的dag示例:
工具模块 一个结构转换器、参数初始化和拷贝工具。拷贝工具是比较容易出错的,因为卷积层和内积层的参数需要补零对齐及重排。 性能与效果 跟开源的caffe-android-lib对比:https://github.com/sh1r0/caffe-android-lib 库大小 caffe-android-lib 11M DeeplearningOGL 440K 全自主开发的,毫无疑问要小很多很多。 运行效率 Oppo R9 (MT6755, GPU: Mali-T860)上的测试结果: 连续运行十次,去除第一次的结果(移动设备上一般都是动态调频的,第一次跑的时候CPU/GPU的频率还没调起来,会比较慢)。 Lenet 网络: caffe-android-lib:5.0~5.2ms(线程设为4) DeeplearningOGL:3.6-3.8 ms 较CPU版本(包含了neon与多线程优化)提升了 50%左右的效率,已经大大超出预期了,在GPU更好的机器上(如mate8上)表现会更佳。 相比于 CNNdroid 更是好很多了。 人像抠图的场景很流畅,且不需要隔帧计算。 (责任编辑:本港台直播) |