神经网络推理加速入门——循环展开

这篇文章,会从软件的角度来介绍一个常用的AI加速方法。

循环展开

如果要我说一个最简单,最有效的,并且人人都能学会的程序优化方法,我估计会投票给Unrooling(译为:循环展开)。

循环展开,从名字就能看出来是什么意思:就是把一段循环代码展开来写。

听着简单,但具体怎么做呢?先举个简单的例子——

高斯年轻的时候,老师曾问他:从1加到100,结果是多少?高斯思考片刻后,给出了5050的答案,让老师大吃一惊。

这里也用这个例子,计算1到100的所有数的和。用C语言很容易写出下面的代码:

c代码解读复制代码#include "stdio.h"

int main() {
  int sum = 0;
  for (int i = 1; i <= 100; ++i) {
    sum = sum + i;
  }
  printf("sum = %d\n", sum);
  return 0;
}

这个写法很容易想出来:100个数相加,循环100次,每次累加一个数字,最终输出结果 sum = 5050。

img

那么,这段代码,如果用循环展开会怎么写呢?

c代码解读复制代码#include "stdio.h"

int main() {
  int sum = 0;
  for (int i = 1; i <= 100; i+=4) {
    sum = sum + i;
    sum = sum + (i + 1);
    sum = sum + (i + 2);
    sum = sum + (i + 3);
  }
  printf("sum = %d\n", sum);
  return 0;
}

在这里插入图片描述

如上是循环展开的写法,我们把原来循环100次,每次循环加1个数的写法,写成了循环25次,每次循环加4个数。

img

从结果上看肯定是一致的,最终结果都是5050。但是两者的性能会有较大的差别。

性能验证

下面实际验证一下两种写法的性能。

为了更准确的获取到程序中数字累加的耗时,把100个数字的相加改为10000个数字相加。因为100个数字对于计算机来说太少了,两者的性能差别不大,不容易看出差别。

在我的笔记本上进行如下的测试,有以下代码,其中 gettimeofday函数用来获取时间戳。

c代码解读复制代码#include "stdio.h"
#include <sys/time.h>
 
int main() {
  int sum = 0;
  struct timeval tv0, tv1;
  #if 0
  printf("do not use unrooling\n");
  gettimeofday(&tv0, NULL); 
  for (int i = 1; i <= 10000; ++i) {
    sum = sum + i;
  }
#else
  printf("use unrooling\n");
  gettimeofday(&tv0, NULL);
  for (int i = 1; i <= 10000; i+=4) {
    sum = sum + i;
    sum = sum + (i + 1);
    sum = sum + (i + 2);
    sum = sum + (i + 3);
  }
#endif
  gettimeofday(&tv1, NULL);
  printf("time = %ld\n", (tv1.tv_usec) - (tv0.tv_usec));
  printf("sum = %d\n", sum);
  return 0;
}

测试结果如下:

img img

可以看到,使用循环展开后,10000个数的累加耗时为14微秒;不使用循环展开,10000个数的累加耗时为24微秒。

两者相差10us的耗时,大约相差40%的耗时!

这是很夸张的,要知道,在做程序性能优化时,如果能一次优化掉40%的耗时,几乎就算是一个很棒的优化手段了。(感兴趣的同学可以复制上面的代码实际测试一下)

为什么循环展开会有效呢

这和计算机的取指令以及缓存机制有关。

其性能加速的思想是:减少CPU读取指令的失败次数,也就是降低指令的Cache Miss。

可能不太好理解,没关系,先看一个实际例子就懂了。

双11刚刚过去,你肯定买了不少的快递。假设你买了100件快递,并且这些快递已经放在了快递柜中一个个的小格子里了。

img

现在要去取快递,100件快递至少要开100次的快递柜门,才能把所有的快递取出来。

为什么这里说至少100次呢?因为很有可能因为某些原因一次不能成功开启快递柜的门,这些原因可能包括:

  • 走错快递柜
  • 输错取件码
  • 脑袋发蒙,快递没取出来又给关上了

连着取100个快递,谁能说得准会发生什么事情呢?

但不管怎样,在这个场景下,你需要一件一件地将快递拿出来,但由于上面几个原因,如果运气不好,就会出现好几次打不开快递柜门的情况。

那有没有办法优化一下这个问题呢?

当然有,那就是让快递员把多个快递放在同一个快递格子里。

img

如上图,比如每4个快递放在一个快递格子里,这样打开一个格子,就一定能取出4个快递。那至少开25次的快递柜门,就能把所有的快递取出来。这很显然,比100次的效率要高不少。

说回循环展开,100个快递就需要做100次循环,每个快递的取出就是循环里的一条加法指令。

如果不做循环展开,那就需要一个快递一个快递的取(相当于从指令内存iCache中一条指令一条指令的取),并且很有可能取完这一条指令后,并不能成功的取到下一条指令,从而发生Cache Miss现象。

但如果我们做了循环展开,相当于把相邻的4条指令绑定了,CPU做一次循环,看到里面一定有四条相邻的指令,就像我们打开快递柜门,里面一定有四个快递一样。

CPU取完第一条指令后,能很快地取到第二条指令,从而很快地取到第三条第四条指令。

在取完4条指令后,才会有可能发生Cache Miss 现象。连着取四个快递之后Miss一次,和每取一个快递,就Miss一次,浪费的时间肯定是不一样的。

循环展开能有效地降低指令的Cache Miss 。这个方法对于程序加速很有效,并且实施起来也很简单,如果你有兴趣,不防在自己的项目中试一试。

但是需要说明的是:现在的编译器可能会对你的代码自动做循环展开优化,因此,如果你想试试效果,建议编译的时候不要打开任何优化选项。

好啦,循环展开就写到这,欢迎持续关注本系列。

最后如果您也对AI大模型感兴趣想学习却苦于没有方向👀
小编给自己收藏整理好的学习资料分享出来给大家💖
👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码关注免费领取【保证100%免费】🆓

在这里插入图片描述

一、全套 AGI 大模型学习路线

AI 大模型时代的精彩学习之旅:从根基铸就到前沿探索,牢牢掌握人工智能核心技能!

在这里插入图片描述

二、640 套 AI 大模型报告合集

此套涵盖 640 份报告的精彩合集,全面涉及 AI 大模型的理论研究、技术实现以及行业应用等诸多方面。无论你是科研工作者、工程师,还是对 AI 大模型满怀热忱的爱好者,这套报告合集都将为你呈上宝贵的信息与深刻的启示。

在这里插入图片描述

三、AI 大模型经典 PDF 书籍

伴随人工智能技术的迅猛发展,AI 大模型已然成为当今科技领域的一大热点。这些大型预训练模型,诸如 GPT-3、BERT、XLNet 等,凭借其强大的语言理解与生成能力,正在重塑我们对人工智能的认知。而以下这些 PDF 书籍无疑是极为出色的学习资源。
在这里插入图片描述
在这里插入图片描述

阶段 1:AI 大模型时代的基础认知

  • 目标:深入洞悉 AI 大模型的基本概念、发展历程以及核心原理。

  • 内容

    • L1.1 人工智能概述与大模型起源探寻。
    • L1.2 大模型与通用人工智能的紧密关联。
    • L1.3 GPT 模型的辉煌发展历程。
    • L1.4 模型工程解析。
    • L1.4.1 知识大模型阐释。
    • L1.4.2 生产大模型剖析。
    • L1.4.3 模型工程方法论阐述。
    • L1.4.4 模型工程实践展示。
    • L1.5 GPT 应用案例分享。

阶段 2:AI 大模型 API 应用开发工程

  • 目标:熟练掌握 AI 大模型 API 的运用与开发,以及相关编程技能。

  • 内容

    • L2.1 API 接口详解。
    • L2.1.1 OpenAI API 接口解读。
    • L2.1.2 Python 接口接入指南。
    • L2.1.3 BOT 工具类框架介绍。
    • L2.1.4 代码示例呈现。
    • L2.2 Prompt 框架阐释。
    • L2.2.1 何为 Prompt。
    • L2.2.2 Prompt 框架应用现状分析。
    • L2.2.3 基于 GPTAS 的 Prompt 框架剖析。
    • L2.2.4 Prompt 框架与 Thought 的关联探讨。
    • L2.2.5 Prompt 框架与提示词的深入解读。
    • L2.3 流水线工程阐述。
    • L2.3.1 流水线工程的概念解析。
    • L2.3.2 流水线工程的优势展现。
    • L2.3.3 流水线工程的应用场景探索。
    • L2.4 总结与展望。

阶段 3:AI 大模型应用架构实践

  • 目标:深刻理解 AI 大模型的应用架构,并能够实现私有化部署。

  • 内容

    • L3.1 Agent 模型框架解读。
    • L3.1.1 Agent 模型框架的设计理念阐述。
    • L3.1.2 Agent 模型框架的核心组件剖析。
    • L3.1.3 Agent 模型框架的实现细节展示。
    • L3.2 MetaGPT 详解。
    • L3.2.1 MetaGPT 的基本概念阐释。
    • L3.2.2 MetaGPT 的工作原理剖析。
    • L3.2.3 MetaGPT 的应用场景探讨。
    • L3.3 ChatGLM 解析。
    • L3.3.1 ChatGLM 的特色呈现。
    • L3.3.2 ChatGLM 的开发环境介绍。
    • L3.3.3 ChatGLM 的使用示例展示。
    • L3.4 LLAMA 阐释。
    • L3.4.1 LLAMA 的特点剖析。
    • L3.4.2 LLAMA 的开发环境说明。
    • L3.4.3 LLAMA 的使用示例呈现。
    • L3.5 其他大模型介绍。

阶段 4:AI 大模型私有化部署

  • 目标:熟练掌握多种 AI 大模型的私有化部署,包括多模态和特定领域模型。

  • 内容

    • L4.1 模型私有化部署概述。
    • L4.2 模型私有化部署的关键技术解析。
    • L4.3 模型私有化部署的实施步骤详解。
    • L4.4 模型私有化部署的应用场景探讨。

学习计划:

  • 阶段 1:历时 1 至 2 个月,构建起 AI 大模型的基础知识体系。
  • 阶段 2:花费 2 至 3 个月,专注于提升 API 应用开发能力。
  • 阶段 3:用 3 至 4 个月,深入实践 AI 大模型的应用架构与私有化部署。
  • 阶段 4:历经 4 至 5 个月,专注于高级模型的应用与部署。
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值