张量计算空间组合优化方法
张量计算空间组合优化方法
空间组合优化方法
如图7-42所示,以分块卷积为例,如图所示在空间上将输出、输入划分为四份:

图7-42在空间上将输出、输入划分为四份
如图7-43所示,划分后,大卷积计算被拆分为若干个小卷积进行计算,小卷积块的大小必须与卷积核的大小相匹配。划分过程中计算总量不变,但计算小矩阵时访存局部性更好,可以借由计算机存储层次结构获得性能提升。

图7-43大卷积计算被拆分为若干个小卷积进行计算
在传统的卷积操作中,输入特征和卷积核的每个通道都需要参与计算,这导致内存访问模式复杂,难以优化。而分组卷积将通道分成多个组,每个组内的通道数减少,使得内存访问更加规则和局部化,有利于提高缓存利用率。此外,这种基于分治法的分解策略,有助于提高并行处理的效率。在分组卷积中,每个组内的卷积核是独立的,这意味着不同组之间的权重和激活可以共享内存空间。这种共享可以减少内存占用,尤其是在使用大量卷积核的网络结构中。
1. 算法注意点
值得注意的是,上文的描述中忽略了 Padding 的问题。实际将输入张量划分为若干个小张量时,除了将划分的小块中原始数据拷贝外,还需要将相邻的小张量的边界数据拷贝:
𝑁×(𝐻ℎ+2(𝐾𝐻−1))×(𝑊𝑤+2(𝐾𝑊−1))×𝐶
这里的 2(𝐾𝐻−1) 和 2(𝐾𝑊−1) 遵循 Padding 规则。规则为 VALID 时,可以忽略;规则为 SAME 时,位于输入张量边界一边 Padding 补 0,不在输入张量边界 Padding 使用邻居张量值。也就是说,在真正使用这种方法的时候,可以通过重叠数据块来减少边缘效应和填充(padding)的需求。这种方法可以减少计算量,但可能会增加内存访问的复杂性,如图7-44所示。

图7-44 减少计算量,但可能会增加内存访问的复杂性
2. 算法问题点
1)实际应用中可以拆为很多份。例如可以拆成小张量边长为 4 或者 8,从而方便编译器向量化计算操作。随着拆分出的张量越小,Padding 引起的额外内存消耗越大,其局部性也越高,负面作用是消耗的额外内存也越多。
2)对于不同规模的卷积,寻找合适的划分方法不是一件容易的事情。正如计算机领域的许多问题一样,该问题也是可以自动化的,例如通过使用 AI 编译器 可以在这种情况下寻找较优的划分方法。
3. 内核层的优化
Kernel 层的优化主要体现在各种高性能算子和算子库的设计上,这些算子和算子库通常针对不同的处理器架构(如 CPU、GPU、TPU 等)进行了优化,以提高计算速度和效率。以下分别介绍一下针对 CPU 和 GPU 的几种优化技术。
CPU 优化技术:
1)NEON:NEON 是 ARM 架构上的 SIMD(单指令多数据)扩展,用于提高多媒体处理和浮点运算的性能。推理引擎可以利用 NEON 指令集来优化 Kernel 层,特别是在移动设备和嵌入式设备上。
2)AVX:AVX(Advanced Vector Extensions)是 Intel 处理器上的 SIMD 指令集,用于提高浮点运算和整数运算的性能。推理引擎可以利用 AVX 指令集来优化 Kernel 层,特别是在 Intel CPU 上。
3)Metal:Metal 是苹果开发的低级图形和计算 API,用于优化在 Apple GPU 上的性能。推理引擎可以利用 Metal API 来优化 Kernel 层,特别是在 iOS 和 macOS 设备上。
4)TVM:TVM(Tensor Virtual Machine)是一个开源的深度学习编译器框架,用于优化深度学习模型在各种硬件上的性能。它支持 CPU、GPU、TPU 和其他类型的硬件。
GPU 优化技术:
5)CUDA:CUDA 是 NVIDIA 的并行计算平台和编程模型,用于在 NVIDIA GPU 上执行并行计算。推理引擎可以利用 CUDA 来优化 Kernel 层,特别是在大规模矩阵运算和卷积操作方面。
6)OpenCL:OpenCL 是一个开放的标准,用于编写在异构系统上运行的程序。它允许开发者利用 CPU、GPU 和其他类型的处理器来加速计算密集型任务。推理引擎可以利用 OpenCL 来优化 Kernel 层,特别是在 GPU 上。
7)Vulkan:Vulkan 是新一代的图形和计算 API,用于在各种 GPU 上执行并行计算。推理引擎可以利用 Vulkan API 来优化 Kernel 层,特别是在高性能计算和图形处理方面。
8)张量核:Tensor Cores 是 NVIDIA GPU 上的一种特殊类型的核心,专门用于加速矩阵乘法和卷积操作。推理引擎可以利用张量核来优化 Kernel 层,特别是在执行大规模的矩阵运算时。
此外,封装的高性能算子库有:
1)cuDNN(CUDA Deep Neural Network Library):由 NVIDIA 开发,为 GPU 优化的深度神经网络算子库,包括卷积、池化、归一化、激活函数等。
2)MKL-DNN(Intel Math Kernel Library for Deep Neural Networks):由 Intel 开发,为 CPU 优化的深度神经网络算子库,现在发展成为 oneDNN,支持多种 Intel 处理器。
3)MIOpen:由 AMD 开发,为 GPU 优化的深度学习算子库,特别针对 AMD 的 GPU 架构进行了优化。
4)TensorRT:NVIDIA 的深度学习推理优化器,它提供了 C++和 Python 接口,可以对模型进行优化并生成高性能的推理引擎。
5)ONNX运行时:支持 ONNX 模型的跨平台推理引擎,包括了对多种硬件平台的高性能算子实现。
6)ACL(ARM Compute Library):由 ARM 开发,为 ARM 架构的 CPU 和 GPU 提供优化的算子库,包括卷积、池化、全连接层等。
这些优化方法和技术可以根据具体的硬件平台和模型需求来选择和组合,以提高推理引擎在 Kernel 层的性能。在实际应用中,开发者需要根据目标设备和性能要求来选择最合适的优化策略,如图7-45所示。

图7-45 根据目标设备和性能要求来选择最合适的优化策略
人工智能芯片与自动驾驶
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2023-09-15 谷歌TPU2机器学习集群的幕后
2022-09-15 芯片架构与编程分析
2021-09-15 科技公司合作伙伴清单