您是否在高通®Adreno GPU上利用open CL来运行机器学习任务?想要优化应用程序并提高性能吗?下载我们的OpenCL ML SDK,并在开发中使用高通的OpenCL扩展吧。
我们知道有些客户已经利用open CL在高通Adreno GPU上实现了机器学习算法。因此,我们添加了一个OpenCL扩展--cl_qcom_ml_ops,高通在open CL用户驱动层添加了对机器学习的加速优化,而这个扩展就能让您在Android平台上充分利用这一优化。这样能让您继续遵守openGL API行业标准,同时将您的机器学习任务移到更接近芯片的位置,以此从Adreno获取更高的性能。
cl_qcom_ml_ops扩展与OpenCL的良好配合
作为Khronos group的推广成员,高通技术有限公司(QTI)与GPU领域的所有主要参与者合作。我们已经设计了与您使用OpenCL开发的内核完全兼容的扩展;并且我们根据对高通GPU的深入了解,添加了对性能优化的扩展。
该扩展从高通888移动平台的Snapdragon Adreno 660 GPU开始支持,旨在加速最常见的图像处理和ML操作,包括:
Convolution | Fully Connected |
Depthwise Separable Convolution | Softmax |
Fused Convolution + Activation | Binary Operations |
Activation | Add, subtract, mul, min, max |
Relu | Concatenation |
Sigmoid | Depth to Space |
Tanh | Permute |
Relu6 | Reshape |
BatchNorm | Fill |
Pooling | ResizeBilinear |
Max | Pad |
Average | CopyTensor |
GEMM | Transpose |
该扩展对这些ML操作提供了新的尝试,我们对每个操作都进行了Adreno GPU的内核优化。它们在同一个open CL命令队列里与其他OpenCL命令一起顺序执行,您可以使用OpenCL事件来跟踪它们的执行。您可以通过一系列的ML操作以及每个操作适当的tensor输入构建一个机器学习模型。
该扩展与应用程序所依赖的OpenCL兼容,具有后处理、控制性能和内存管理等功能。它利用了命令队列、buffers和事件等标准OpenCL功能,并支持FP16和FP32数据类型。
如果您有其它OpenCL内核或编写了自定义操作,可以与我们已有的ML操作混合使用。可以将这些操作发送到同一个命令队列里进行执行。
更低层工作的优势
在open CL用户空间驱动层进行ML的优化与实现,可以对内存分配、数据移动、执行和同步进行更精细的控制。例如,上传权重数据和发送每个ML操作都是由应用程序显式执行的。
- 要评测ML操作,您可以使用OpenCL事件获取提交时间和GPU执行时间等详细信息。
- 为tensor的预留内存是由应用程序显式控制;这意味着应用程序控制tensor内存占用。预留内存也可以在tensor之间复用,从而减少空间占用。
- 由于OpenCL ML是基于C的API,您的模型实际上更安全,因为它们不需要以可解释的文件格式存储。
此外,我们还设计了OpenCL ML扩展,以便能够很快在Adreno上训练ML模型。
OpenCL ML SDK中有什么?
在Android镜像中我们提供了支持这个扩展的open CL驱动,您可以使用SDK中的头文件和参考文件来修改应用程序,调用新的CL函数。
至于工具,如果您使用过我们的Qualcomm®Neural Processing SDK,您可能熟悉将TensorFlow Lite模型轻松转换为其他格式的工具。由于OpenCL ML 处于很用户空间driver层,是一个很接近芯片的位置,所以没有简单的、一键式的方式来转换模型。这就是为什么我们提供了一对工具,用于从TensorFlow模型中提取和转换权重张量数据:
- 生成可视模型工具-将TensorFlow protobuf冻结模型(.pb)或TensorFlowLite(.tflite)模型转换为TensorFlow可视模型表示。生成的可视模型保留了源模型的拓扑和权重数据。
- QFP16/32的可视模型工具-将权重张量提取为'.qfp16'和'.qfp32'文件类型,分别保存半精度和全精度数据。
这些工具的输出是cl_qcom_ml_ops扩展中的示例模型使用的数据。SDK包括11个示例模型,演示如何在Adreno GPU上使用扩展以及使用OpenCL的其他功能。大多数模型都是用于图像分类的MobileNet版本,演示了以下内容:
- 使用半精度浮点型(FP16)张量
- 所有操作上的张量为单精度浮点型(FP32)
- 用于替代GEMM和二进制操作的全连接操作
- 一个自定义OpenCL C内核(由应用程序开发人员创建),与OpenCL ML操作(来自SDK)混合使用
- 重新使用tensor预留内存以降低内存占用
- 需要在op创建期间查找优化缓存命中率的操作属性
- 记录和发送模型的可记录队列
- 在FP32完全连接层交替使用不同精度的数据类型(FP16和FP32精度)
- 利用ION为tensor预留内存,实现CPU与GPU内存共享
当然还包括用于图像分类的Inception V3实现和用于物体检测的MobileNet SSD实现。
下一步:下载OpenCL ML SDK
既然高通已经为您编写了OpenCL内核,并且根据Adreno GPU特性进行了优化,为什么还要自己写卷积、全连接和softmax等ML操作内核呢 ?
如果您在OpenCL中开发ML模型,并希望在更接近芯片层的情况下获得性能优势,请下载OpenCL ML SDK,看看它为您提供了什么。
其他相关内容:
作者:Ya Kong
