部署到 Adreno™ GPU
内容提要
Adreno™是高通开发的用于SoC的图形处理单元(GPU)半导体IP核系列。TVM使用TVM的原生OpenCL后端和OpenCLML后端以支持加速Adreno™ GPU上的深度学习。TVM提供了命令行工具和Python API接口,用于模型的自动调整、编译和部署到Adreno™目标机。
延伸解读
纹理内存:Adreno 性能提升的关键
TVM 的 OpenCL 后端针对 Adreno GPU 启用了纹理内存支持。通过将目标指定为 opencl -device=adreno,生成的内核会使用 image2d_t 图像对象而非传统的缓冲区指针。纹理处理器拥有专用的只读 L1 缓存,能高效处理图像边界,并支持多种格式与数据类型组合。相比基于缓冲区的方案,这种设计可显著提升性能,尤其适合卷积等计算密集型算子。
OpenCLML 与原生 OpenCL 的协同
OpenCLML 是高通提供的深度学习算子加速库,以 cl_qcom_ml_ops 扩展形式公开。TVM 将其作为 BYOC 方案集成,使 OpenCLML 算子能与原生 OpenCL 共享上下文和命令队列。当某些算子无法由 OpenCLML 处理时,可无缝回退到原生 OpenCL,避免上下文切换开销。这种混合执行策略在保持兼容性的同时,尽可能利用硬件加速。
自动调整:非必需但影响性能
自动调整阶段通过 RPC 在真实 Adreno 设备上运行生成的内核,并利用机器学习方法优化性能。虽然该步骤并非编译模型的必需环节,但若跳过,TVM 将使用默认调度,可能无法充分发挥硬件潜力。调整日志会被编译阶段用于生成最优内核。对于追求极致性能的场景,建议执行自动调整,并合理设置试验次数与提前停止策略。
混合精度:权衡速度与准确率
TVM 支持将 FP32 模型转换为 FP16 或混合精度(FP16 计算、FP32 累积),以减小模型大小并提升推理速度。通过 apply_graph_transforms 或 tvmc 参数可启用此转换。但降低精度可能导致模型准确率下降,需根据任务对精度和速度的敏感度进行选择。ToMixedPrecision 过程会将网络拆分为不同数据类型的操作簇,用户也可自定义转换规则。
Q&A
Adreno™ GPU 的主要特点是什么?
Adreno™ GPU 能够加速复杂几何图形的渲染,提供高性能图形和低功耗。
TVM 如何支持 Adreno™ GPU 上的深度学习?
TVM 使用原生 OpenCL 后端和 OpenCLML 后端来加速 Adreno™ GPU 上的深度学习。
在将模型部署到 Adreno™ GPU 时,TVM 的工作流程包括哪些阶段?
工作流程包括模型导入、自动调整、编译、部署和应用集成等阶段。
如何使用 TVM 进行模型的自动调整?
自动调整阶段优化 TVM 生成的内核以获得最佳性能,通常需要通过 RPC 设置与目标设备通信。
TVM 提供哪些工具来简化模型的部署?
TVM 提供命令行工具和 Python API 接口,以及 Docker 容器环境来简化设置和依赖管理。
如何在 Adreno™ GPU 上使用 OpenCLML SDK?
在构建 TVM 时,需要导出 OpenCLML SDK 的路径,并在配置中启用 OpenCLML 支持。