transformer之KV Cache

news2024/10/2 16:22:28

一、为什么要研究KV Cache

非常有效的加速推理速度,效果如下所示:

import numpy as np
import time
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
NAME_OR_PATH = r'***************'
device = "cuda" if torch.cuda.is_available() else "cpu"
tokenizer = AutoTokenizer.from_pretrained(NAME_OR_PATH)
model = AutoModelForCausalLM.from_pretrained(NAME_OR_PATH).to(device)
model.config.pad_token_id = tokenizer.eos_token_id
for use_cache in (True, False):
  times = []
  for _ in range(10):  # measuring 10 generations
    start = time.time()
    model.generate(**tokenizer("What is KV caching?", return_tensors="pt").to(device), use_cache=use_cache, max_new_tokens=10)
    times.append(time.time() - start)
  print(f"{'with' if use_cache else 'without'} KV caching: {round(np.mean(times), 3)} +- {round(np.std(times), 3)} seconds")
  #===================================max_new_tokens=1=======================================================
with KV caching: 0.072 +- 0.008 seconds
without KV caching: 0.081 +- 0.02 seconds
#===================================max_new_tokens=10=======================================================
with KV caching: 0.428 +- 0.021 seconds
without KV caching: 0.751 +- 0.04 seconds
#===================================max_new_tokens=100=======================================================
with KV caching: 4.606 +- 0.072 seconds
without KV caching: 19.257 +- 1.663 seconds
#===================================max_new_tokens=1000=======================================================
with KV caching: 42.941 +- 0.711 seconds
without KV caching: 349.954 +- 1.523 seconds

使用KV Cache的推理速度是明显优于没有使用KV Cache的,而且生成的token越长速度提升就越明显,当最大生成token数为1000时,近10倍的加速,一次推理近6分钟。

二、为什么KV Cache能加速

2.1 原理是什么

最本质的原理是避免重复计算,将需要重复计算的结果进行缓存,需要缓存的值为历史token对应的KV值,所以叫KV Cache。

2.2 为什么只需要KV

预测新的token只与输入的最后一个token相关,输入的最后一个token因为只需要计算注意力值,而注意力的值需要将输入token的V值进行加权即得到结果,进行加权就需要将当前的Q与与所有的K进行计算得到权重,所以只需要缓存历史token的KV值。

2.2 为什么会存在重复计算

首先,生成式模型每生成一个新token都需要调用整个模型进行一次推理,历史token计算得到的中间激活值在Decoder架构的模型中每次推理时都是一样的,所以可以进行缓存。
这是因为Decoder架构中,当前token只用之前的token计算得到注意力值,通过Causal Mask实现,换句话说,在推理的时候前面已经生成的字符不需要与后面的字符产生attention,从而使得前面已经计算的K和V可以缓存起来。

2.3 预测新token的计算步骤

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
由于Causal Mask矩阵的存在,预测下一个token只与输入的最后一个token的QKV和历史token的KV有关;
如果没有Causal Mask,比如说是encoder架构,每次推理时每个token需要考虑所有输入的token,所以得到的注意力值都会变化,就不存在重复计算的情况。

三、结论

1、KV Cache是通过空间换时间,避免重复计算进而提升推理速度
2、预测新token只与输入的最后一个token的注意力值相关,而注意力值与最后一个token的Q和所有输入token的KV相关,每一层的注意力不变,进而每一层的KV都是不变的
3、只适用于Decoder架构,因为只与之前的token进行计算,得到的注意力值不会变化,第一层、第二层、第三层到第 l l l层; 如果只有一层,那就不仅仅适用于Decoder架构

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

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

相关文章

人工智能-循环神经网络的简洁实现

循环神经网络的简洁实现 如何使用深度学习框架的高级API提供的函数更有效地实现相同的语言模型。 我们仍然从读取时光机器数据集开始。 import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2lbatch_size, num_steps 32, 35…

如何利用工业以太网网关实现上位机无线控制plc?

Modbus TCP/IP 是对成熟的 Modbus 协议的改编, 因其开放性、简单性和广泛接受性而在工业自动化系统中发挥着举足轻重的作用。它作为连接各种工业设备的通用通信协议,包括可编程逻辑控制器 (PLC)、远程终端单元 (RTU) 和传感器。它提供标准化的 TCP 接口&…

使用Python的turtle模块创建一幅哆啦A梦

1.1引言: 在Python中,turtle模块是一个非常有趣且强大的工具,它允许我们以一个可视化和互动的方式学习编程。通过调用各种命令,我们可以引导turtle画出一个指定的图形。在本博客中,我们将使用turtle模块来绘制一幅哆啦…

NX二次开发UF_CAM_set_lower_limit_plane_tag 函数介绍

文章作者:里海 来源网站:https://blog.csdn.net/WangPaiFeiXingYuan UF_CAM_set_lower_limit_plane_tag Defined in: uf_cam_planes.h int UF_CAM_set_lower_limit_plane_tag(tag_t object_tag, tag_t target_tag ) overview 概述 Set the tag of a …

华大基因认知障碍基因检测服务,助力认知障碍疾病防控

认知障碍是一种严重的神经系统疾病,对人类的脑健康产生了重大影响。据报告显示,在我国65岁以上的人群中,存在轻度认知障碍的患者约为3,800万,而中重度痴呆患者则约为1,500万,患病人口数量庞大。这种疾病不仅会对患者的…

nc命令记录

nc是什么 image-20231122074312187 nc是netcat的简写,是一个功能强大的网络工具,有着网络界的瑞士军刀美誉。nc命令在linux系统中实际命令是ncat,nc是软连接到ncat。 目录 nc是什么目录常用命令1、网络连通性测试和端口扫描 tcp测试udp测试…

文件的上传

文件上传方便用户将本地文件传输到互联网上的应用程序或网站中,实现信息的共享和传递。它不仅提供了便捷的数据传输方式,还增强了用户的体验,使用户能够轻松分享个人创作、照片、视频、文档等内容。同时,文件上传也促进了远程协作…

Linux常用命令——blockdev命令

在线Linux命令查询工具 blockdev 从命令行调用区块设备控制程序 补充说明 blockdev命令在命令调用“ioxtls”函数,以实现对设备的控制。 语法 blockdev(选项)(参数)选项 -V:打印版本号并退出; -q:安静模式; -v&…

免费多域名SSL证书

顾名思义,免费多域名SSL证书就是一种能够为多个域名或子域提供HTTPS安全保护的证书。这意味着,如果您有三个域名——例如example.com、example.cn和company.com,您可以使用一个免费的多域名SSL证书为所有这些域名提供安全保障,而无…

【LeetCode】每日一题 2023_11_23 HTML 实体解析器(调库/打工)

文章目录 刷题前唠嗑题目:HTML 实体解析器题目描述代码与解题思路 结语 刷题前唠嗑 题目:HTML 实体解析器 题目链接:1410. HTML 实体解析器 题目描述 代码与解题思路 func entityParser(s string) (ans string) {return strings.NewRepla…

【Java工具篇】Java反编译工具Bytecode Viewer

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

ps软件下载PS2024正式版下载安装教程 ps新功能25.0 AI创成式填充中文版本ps2024神经滤镜平面设计摄影后期修图软件Adobe Photoshop2024下载

Photoshop简称“PS”,是一款常用和功能强大的图像处理软件。主要处理以像素所构成的数字图像。使用其众多的编修与绘图工具,可以有效地进行图片编辑工作。PS有很多功能,在图像、图形、文字、视频、出版等各方面都有涉及。 一、PS软件下载 1、…

【双指针】有效三角形的个数

有效三角形的个数 611. 有效三角形的个数 - 力扣(LeetCode) 题目描述 给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。 示例 1: 输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2…

Mybatis-Plus3.0默认主键策略导致自动生成19位长度主键id的坑

码字不易,如果对您有用,求各位看官点赞关注~ 原创/朱季谦 目前的Mybatis-Plus版本是3.0,至于最新版本是否已经没有这个问题,后续再考虑研究。 某天检查一位离职同事写的代码,发现其对应表虽然设置了AUTO_INCREMENT自…

第95步 深度学习图像目标检测:Faster R-CNN建模

基于WIN10的64位系统演示 一、写在前面 本期开始,我们学习深度学习图像目标检测系列。 深度学习图像目标检测是计算机视觉领域的一个重要子领域,它的核心目标是利用深度学习模型来识别并定位图像中的特定目标。这些目标可以是物体、人、动物或其他可识…

事关Django的静态资源目录设置与静态资源文件引用(Django的setting.py中的三句静态资源(static)目录设置语句分别是什么作用?)

在Django的setting.py中常见的三句静态资源(static)目录设置语句如下: STATICFILES_DIRS [os.path.join(BASE_DIR, static_list)] # 注意这是一个列表,即可以有多个目录的路径 STATIC_ROOT os.path.join(BASE_DIR, static_root) STATIC_URL /static-url/本文介…

气候变化和人类活动对中国植被固碳的贡献量化数据月度合成产品

简介: 气候变化和人类活动对中国植被固碳的贡献量化数据月度合成产品包括中国2001~2018年地表短波波段反照率、植被光合有效辐射吸收比、叶面积指数、森林覆盖度和非森林植被覆盖度、地表温度、地表净辐射、地表蒸散发、地上部分自养呼吸、地下部分自养呼吸、总初级…

PTA-6-45 工厂设计模式-运输工具

题目如下: 工厂类用于根据客户提交的需求生产产品(火车、汽车或拖拉机)。火车类有两个子类属性:车次和节数。拖拉机类有1个子类方法耕地,方法只需简单输出“拖拉机在耕地”。为了简化程序设计,所有…

Python之pyc文件的生成与反编译

目录 1、什么是pyc文件 2、手动生成pyc文件 3、pyc文件的执行 4、pyc文件的反编译 1、什么是pyc文件 pyc文件(PyCodeObject)是Python编译后的结果。当python程序运行时,编译的结果是保存于PyCodeObject,程序运行结束后&#x…

009 OpenCV threshold

一、环境 本文使用环境为: Windows10Python 3.9.17opencv-python 4.8.0.74 二、二值化算法 2.1、概述 在机器视觉应用中,OpenCV的二值化函数threshold具有不可忽视的作用。主要的功能是将一幅灰度图进行二值化处理,以此大幅降低图像的数…