矩阵乘GPU性能优化之split k

这篇具有很好参考价值的文章主要介绍了矩阵乘GPU性能优化之split k。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

矩阵乘计算GPU实现中通常为线程块计算一个较大的[m_tile, k] *[k, n_tile]的矩阵乘,最后分配到每个线程后同样为每个线程计算更小的一个[m_tile, k] *[k, n_tile]。

这样存在的一个问题主要是在于m和n较小而k很大时,如下图所示的矩阵乘案例,只能分配很少的线程和线程块,并且每个线程内部的循环次数很大,GPU无法被充分利用,导致矩阵乘实现的性能比较差。这种情况可能广泛出现在卷积通过im2col/im2row方法转换得到的矩阵乘:OpenPPL 中的卷积优化技巧 - 知乎

矩阵乘GPU性能优化之split k,推理引擎,深度学习编译器,矩阵乘,splitk,split,GPU

splitk的原理则是把矩阵乘的k方向split成多个k_n更小的k_size,从而得到了k_n个[m, k_tile] x [k_tile, n]矩阵乘,每个矩阵乘的k loop大小缩短,从而每个线程的计算时间缩短,并且可以创建更多的线程数量来执行计算。

基本原理如下图所示,也就是并行计算多个k更小的矩阵乘,并且增加一个额外的ReduceSum算子进行累加计算。

矩阵乘GPU性能优化之split k,推理引擎,深度学习编译器,矩阵乘,splitk,split,GPU

矩阵乘GPU性能优化之split k,推理引擎,深度学习编译器,矩阵乘,splitk,split,GPU

有没有一个简单的方法来实现上述优化呢?

答案是可以通过一个非常简单通用的图优化,而不需要新增和修改推理引擎现有的算子实现,但是可能性能比专门实现的splitk矩阵乘略差点。

假定矩阵乘input a的shape为[Ba, M, K]。 Ba为input a的batch,可以为任一多个维度。现在首先进行一个reshape得到[Ba, M, Kn, K0],然后进行一个transpose得到[Ba, Kn, M, K0],即可得到splitk后矩阵乘新的input a。

同样矩阵乘input b的shape为[Bb, K, N]。Bb为input b的batch,可以为任一多个维度。现在进行reshape得到[Bb, Kn, K0, N],即为splitk后矩阵乘新的input b。

那么[Ba, Kn, M, K0]与[Bb, Kn, K0, N]的batch矩阵乘就达到了split k的效果。最后在矩阵乘算子后面插入一个ReduceSum(axis=-3),即可完成。

这个图优化插入了两个reshape,一个transpose,一个reduce。reduce不可避免,reshape算子实际上只是内存重解释,不需要真正计算耗时。因此相比专门的splitk矩阵乘多了一个transpose耗时,当然通常这个算子耗时远远低于矩阵乘的耗时。

需要注意的一点是矩阵乘的bias,上面把splitk转换为batch矩阵乘的时候,如果有bias,那么会导致每个k split的batch都加上了一份bias,而本来应该只加一份bias。一种解决方法是把bias拆分为一个add算子添加到reduceSum后面,这个add可以与matmul后面的其他elemwise融合从而降低性能损失。

在NV GPU这个方法性能收益可能没有端侧GPU那么高,因为端侧GPU很难使用shared mem加速,本文的方法反而可能是一种不错的方法。

numpy参考代码文章来源地址https://www.toymoban.com/news/detail-737206.html

import numpy as np

shape_a = [1, 49, 2016]
shape_b = [2016, 448]

np.random.seed(1)
data_a = np.random.uniform(-1, 1, size=shape_a).astype("float32")
data_b = np.random.uniform(-1, 1, size=shape_b).astype("float32")

matmul_0 = np.matmul(data_a, data_b)

orig_k = 2016
k_num = 8
k_tile = orig_k // k_num

data_a1 = data_a.reshape([1, 49, k_num, k_tile])
data_a2 = np.transpose(data_a1, [0, 2, 1, 3])
data_b1 = data_b.reshape([k_num, k_tile, 448])

matmul_1 = np.matmul(data_a2, data_b1)

matmul_2 = np.sum(matmul_1, axis=-3)

error = matmul_0 - matmul_2

到了这里,关于矩阵乘GPU性能优化之split k的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深度学习调参经验:优化神经网络性能的关键八大步骤

    欢迎大家来到安静到无声的《模式识别与人工智能(程序与算法)》,如果对所写内容感兴趣请看模式识别与人工智能(程序与算法)系列讲解 - 总目录,同时这也可以作为大家学习的参考。欢迎订阅,请多多支持! 在深度学习中,

    2024年02月13日
    浏览(38)
  • 大模型推理性能优化之KV Cache解读

    做大模型性能优化的一定对KV Cache不陌生,那么我们对这个技术了解到什么程度呢?请尝试回答如下问题: KV Cache节省了Self-Attention层中哪部分的计算? KV Cache对MLP层的计算量有影响吗? KV Cache对block间的数据传输量有影响吗?本文打算剖析该技术并给出上面问题的答案。 大模

    2024年02月16日
    浏览(164)
  • [CUDA 学习笔记] 如何优化 CUDA 矩阵乘内核以获得类似 cuBLAS 的性能: 工作日志

    注: 本文主要是对博文 “How to Optimize a CUDA Matmul Kernel for cuBLAS-like Performance: a Worklog - SIBOEHM” 的翻译, 并进行了一定的备注和补充 在这篇文章中, 我将迭代优化用 CUDA 编写的矩阵乘法的实现. 我的目标不是构建一个 cuBLAS 替代品, 而是深入了解用于现代深度学习的 GPU 的最重要的

    2024年04月28日
    浏览(39)
  • 从计算机视觉(Computer Vision)的角度出发,从传统机器学习的特征工程、分类器设计和优化,到深度学习的CNN架构设计、训练优化、模型压缩与推理部署,详细阐述了图像识别领域最新的技术发展方向

    作者:禅与计算机程序设计艺术 在现代信息技术的快速发展过程中,图像识别技术越来越重要。早期的人工智能算法主要侧重于特征提取、分类或回归任务。近几年,随着神经网络(Neural Networks)在图像识别领域的不断突破,很多研究人员将目光投向了深度学习(Deep Learni

    2024年02月10日
    浏览(47)
  • unity 性能优化之GPU和资源优化

    众所周知,我们在unity里编写Shader使用的HLSL/CG都是高级语言,这是为了可以书写一套Shader兼容多个平台,在unity打包的时候,它会编译成对应平台可以运行的指令,而变体则是,根据宏生成的,而打包运行时,GPU会根据你设置的宏切换这些打包出来的代码,而不是我们书写那

    2024年02月02日
    浏览(64)
  • CPU和GPU性能优化

    在Unity游戏开发中,优化CPU和GPU的性能是非常重要的,可以提高游戏的运行效率、降低功耗和延迟,并提高用户体验。以下是一些优化CPU和GPU性能的方法: 1.优化游戏逻辑和算法 减少不必要的计算和内存操作,例如避免频繁的分配和释放内存,减少不必要的数据结构和循环。

    2024年02月09日
    浏览(49)
  • Unity性能优化与分析--GPU

    每一帧,Unity 都需要确定必须渲染哪些对象,然后创建绘制调用。绘制调用是调用图形 API 来绘制对象(如三角形),而批处理是要一起执行的一组绘制调用。 随着项目变得更加复杂,您需要用管线来优化 GPU 的工作负载。 通用渲染管线 (URP) 目前使用单通道前向渲染器将高质

    2024年03月15日
    浏览(54)
  • c++矩阵计算性能对比:Eigen和GPU

    生成随机矩阵 生成随机矩阵有多种方式,直接了当的方式是使用显式循环的方式为矩阵的每个元素赋随机值。 另一种方式是使用Eigen库,它提供了矩阵运算的库。 生成随机矩阵: 计算矩阵点积 使用显式循环计算 直接上代码: 使用Eigen库 代码: 使用GPU 代码片断: 结果分析

    2024年02月12日
    浏览(38)
  • 掌握XGBoost:GPU 加速与性能优化

    XGBoost是一种强大的机器学习算法,但在处理大规模数据时,传统的CPU计算可能会变得缓慢。为了提高性能,XGBoost可以利用GPU进行加速。本教程将介绍如何在Python中使用XGBoost进行GPU加速以及性能优化的方法,并提供相应的代码示例。 安装 GPU 支持 首先,您需要确保您的系统上

    2024年04月11日
    浏览(38)
  • 功能上新|全新GPU性能优化方案

    GPU优化迎来了全新的里程碑!我们深知移动游戏对高品质画面的追求日益升温,因此UWA一直着眼于移动设备GPU性能优化,以确保您的游戏体验尽善尽美。然而,不同GPU芯片之间的性能差异及可能导致的GPU瓶颈问题,让优化工作变得更具挑战性。在全新升级的UWA SDK版本中,我们

    2024年02月12日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包