Stanford CS149 -- Assignment 4: NanoGPT149

news/2024/10/14 21:28:29

作业描述及代码参见:cs149gpt

Warm-Up:访问张量

张量/数组都是按行存储的,四维数组可以看作元素为三维数组的数组,元素大小即为三维数组内元素总数,以此类推。

第 1 部分:简单(但不太高效)的注意力机制实现

主要实现两个矩阵乘法和一个 softmax 运算。

part1

第 2 部分:块矩阵乘法和 Unfused Softmax

通过对矩阵进行分块,有效提高缓存的利用率,减少 miss。

N=1024 时,块大小设为 \(8 \times 8\)\(16 \times 16\)\(32 \times 32\)\(64 \times 64\) 对应的时间为 \(185.069ms\)\(154.328ms\)\(159.785ms\)\(170.758 \text{ms}\),缓存行的大小为 \(64B\)float 类型的大小为 \(4B\),因此块大小为 \(16 \times 16\) 时,一个缓存行恰好可以装下块内的一行。

part2

第 3 部分:Fused Attention

Fused Attention 使得 \(N \times N\) 的临时矩阵减小为长度为 \(N\) 向量,虽然因为多线程要使用的多个长度为 \(N\) 向量,但线程数往往远小于 \(N\),因此减少了内存占用。

注释掉 #pragma omp ... 语句后,时间为 \(217.351 \text{ms}\)。在单线程的情况下,Fused Attention 虽然减小了内存占用,但性能有所降低,同时对缓存的利用率也比第 2 部分的低很多。

与第 1 部分相比,由于使用 Fused Attention,可并行化的循环变成了 \(3\) 个:batch、head、row 易于并行计算。

part3

第 4 部分:Flash Attention

第 4 部分的内存使用最少。Flash Attention 是对 Fused Attention 的改进,在减少内存使用的同时,通过分块,提高了对缓存的利用。第 4 部分的性能比之前各部分要慢,但比单线程的 Fused Attention 稍快。

目前的 Flash Attention 可以通过使用多线程、使用 CPU 向量化硬件单元等方式提高性能。

part4

ISPC加速

使用 ISPC 对各部分加速效果如下:

  • part1:运行时间在 \(60 \text{ms}\) 左右
  • part2:运行时间在 \(85 \text{ms}\) 左右
  • part3:运行时间大致在 $$15-55 \text{ms}$$
  • part4:运行时间在 \(55 \text{ms}\) 左右

主要使用 ISPC 加速了矩阵乘法,实现主要参考 ISPC Examples。

optimized part1

optimized part2

optimized part3

optimized part4

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/71611.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

AGC061F 做题记录

link 事实上这是 CSP模拟赛 #36 的 T4。 记 \(a_i,b_i\) 分别为前 \(i\) 个字符中 \(0\) 的个数对 \(n\) 取模后的值,\(1\) 的个数对 \(m\) 取模后的值。那么,记 \(k\) 为序列长度,合法的序列满足:\(\forall 1\le i < j\le k ,\ (a_i, b_i) \not = (a_j, b_j)\)\(a_k = …

消息队列之RabbitMQ

1.初识MQ 在分布式微服务中,不同服务接口之间的调用分为同步调用和异步调用。 使用同步调用有几种问题拓展性差 性能差 级联失败因此在大部分场景,我们使用的都是异步调用。 异步调用方式其实就是基于消息通知的方式,一般包含三个角色:消息发送者:投递消息的人,就是调用方…

【Azure Cloud Service】使用Key Vault Secret添加.CER证书到Cloud Service Extended Support中

使用Key Vault Secret添加.CER证书到Cloud Service Extended Support中问题描述 因为Key Vault的证书上传功能中,只支持pfx格式的证书,而中间证书,根证书不能转换为pfx格式,只能是公钥证书格式 cet 或者 crt,能通过文本工具直接查看base64编码内容。如一个证书链文件中可以…

java多线程基础知识速通

1.线程和进程的区别 进程是正在运行的程序实例,每个进程包含了多个线程,每个现场执行不同的任务 进程都有自己的内存空间,而一个进程下的线程们则是共享内存空间 线程更加轻量,线程上下文切换的成本远低于进程上下文切换的成本2.并行与并发的区别 并行是多核CPU一般执行相应…

程序员必看!从菜鸟到专家你要这么做,8年互联网老兵爆肝总结

“互联网行业工作8年多,在国内Top互联网大厂B(ytedance)AT中的两家待过。喜欢研究计算机基础原理,有移动端全栈(包括Android & iOS & 鸿蒙等)开发经验,对逆向和网络安全有一定经验。” 不管是在校大学生,还是初入职场的菜鸟,抑或是在互联网行业打拼多年的老码农…

CTF 的基础知识 题型 Trick总结

idk.references: 1 2 web php 语法基础 references: 1 php 脚本的基本格式: <?php //coding here ?>php 代码同样以 ; 结尾。 php 文件的后缀名大多是 php ,也有诸如 php5 php4 phps 之类,如果普通的后缀名被拦截不妨试试其他的。 php 变量用 $ 来定义,大小写敏感…

微服务03 微服务sentinel, springcloudgateway

6 Sentinel 6.1 Sentinel 介绍和工作机制 6.1.1 微服务流量治理组件介绍 随着微服务的流行,服务和服务之间的调用导致服务的稳定性问题变得越来越重要。 雪崩问题: 微服务调用链路中的某个服务故障,引起整个链路中的所有微服务都不可用,即雪崩。 解决雪崩问题的常见方式有…

Web刷题之polarctf靶场(3)

1. 干正则 打开靶场发现是简单的php代码审计, 先构造id=a[0]=www.polarctf.com, 由于要ping两次, 所以先构造cmd=|ls <?php error_reporting(0); if (empty($_GET[id])) {show_source(__FILE__);die(); } else {include flag.php;$a = "www.baidu.com";$result =…