使用torch模拟 BMM int8量化计算。

使用torch模型BMM int8计算。
模拟:BMM->softmax->BMM 计算流程
import torch
import numpy as np
torch.manual_seed(777)
def int8_quantize_per_token(x: torch.Tensor, axis: int = -1, attns=False):if x.dtype != torch.float32:x = x.type(torch.float32)xmax = torch.abs(x)xmax = torch.max(xmax, dim=axis, keepdim=True)[0]scale = xmax / 127.0if not attns:# scale = torch.clamp(scale, 1e-5, np.finfo(np.float32).max)passelse:# scale = torch.tensor(1 / 127.0, dtype=torch.float32)passout = x / scaleout = torch.round(out)out = torch.clamp(out, -128, 127)quantized_out = out.type(torch.int8)return quantized_out, scaledef int8_quantize_per_tensor(x, axis=0, attns=False):if x.dtype != torch.float32:x = x.type(torch.float32)xmax = torch.abs(x)xmax = torch.max(xmax, dim=-1, keepdim=True)[0]xmax = torch.max(xmax, dim=-2, keepdim=True)[0]scale = xmax / 127.0if not attns:# scale = torch.clamp(scale, 1e-5, np.finfo(np.float32).max)passelse:# scale = torch.tensor(1 / 127.0, dtype=torch.float32)passout = x / scaleout = torch.round(out)out = torch.clamp(out, -128, 127)quantized_out = out.type(torch.int8)return quantized_out, scaledef matmul_int8(key, query, value):key = key.permute([0, 1, 3, 2])query, q_s = int8_quantize_per_token(query)key, k_s = int8_quantize_per_token(key, -2)attention_scores = torch.matmul(query.type(torch.float32),key.type(torch.float32))scale = q_s * k_sattention_1 = torch.mul(attention_scores, scale)attention_scores = attention_1 / torch.sqrt(torch.tensor(32, dtype=torch.float32))attention_scores = torch.softmax(attention_scores, dim=-1)attention_scores_int8, attn_p_s = int8_quantize_per_token(attention_scores, attns=True)value, v_s = int8_quantize_per_token(value, -2)context = torch.matmul(attention_scores_int8.type(torch.float32),value.type(torch.float32))scale = attn_p_s * v_scontext = torch.mul(context, scale)return attention_1, contextdef matmul_fp(key, query, value):key = key.permute([0, 1, 3, 2])attention_1 = torch.matmul(query.type(torch.float32),key.type(torch.float32))attention_scores = attention_1 / torch.sqrt(torch.tensor(32, dtype=torch.float32))attention_scores = torch.softmax(attention_scores, dim=-1)context = torch.matmul(attention_scores.type(torch.float32),value.type(torch.float32))return attention_1, contextdef mtx_similar1(arr1:np.ndarray, arr2:np.ndarray) ->float:'''计算矩阵相似度的一种方法。将矩阵展平成向量,计算向量的乘积除以模长。注意有展平操作。:param arr1:矩阵1:param arr2:矩阵2:return:实际是夹角的余弦值,ret = (cos+1)/2'''farr1 = arr1.ravel()farr2 = arr2.ravel()len1 = len(farr1)len2 = len(farr2)if len1 > len2:farr1 = farr1[:len2]else:farr2 = farr2[:len1]numer = np.sum(farr1 * farr2)denom = np.sqrt(np.sum(farr1**2) * np.sum(farr2**2))similar = numer / denom # 这实际是夹角的余弦值return (similar+1) / 2 # 姑且把余弦函数当线性if __name__ == "__main__":key = torch.randn((2, 6, 10, 32))value = torch.randn((2, 6, 10, 32))query = torch.randn((2, 6, 1, 32))i_key = key.clone().detach()i_value = value.clone().detach()i_query = query.clone().detach()fp_score, fp_context = matmul_fp(key, query, value)int8_score, int8_context = matmul_int8(i_key, i_query, i_value)similar1 = mtx_similar1(int8_score.cpu().detach().numpy(),fp_score.cpu().detach().numpy())similar2 = mtx_similar1(int8_context.cpu().detach().numpy(),fp_context.cpu().detach().numpy())print(similar1, similar2)np.testing.assert_allclose(fp_score.detach().cpu().numpy(),int8_score.detach().cpu().numpy(),rtol=1e-02, atol=1e-03)np.testing.assert_allclose(fp_context.detach().cpu().numpy(),int8_context.detach().cpu().numpy(),rtol=1e-02, atol=1e-03)
结论:
Per-token 精度优于per-tensor
BMM1 和 BMM2定点计算之后,输出误差较大
相关文章:
使用torch模拟 BMM int8量化计算。
使用torch模型BMM int8计算。 模拟:BMM->softmax->BMM 计算流程 import torch import numpy as np torch.manual_seed(777) def int8_quantize_per_token(x: torch.Tensor, axis: int -1, attnsFalse):if x.dtype ! torch.float32:x x.type(torch.float32)…...
【FreeMarker】实现生成Controller根据模板勾选的内容查询
需求:根据模板列表勾选的字段查询列表数据 FreeMarker代码: /*** 分页列表查询** param ${entityName?uncap_first}* param pageNo* param pageSize* param req* return*///AutoLog(value "${tableVo.ftlDescription}-分页列表查询")ApiOp…...
深入理解 XPath:XML 和 HTML 文档的利器
XPath(XML Path Language)是一种用于在 XML 和 HTML 文档中定位节点的语言。它常用于 XML 解析、Web 数据抓取(如 Selenium 或 Scrapy)以及配置文件解析。本文将带你深入了解 XPath 的语法、功能及其在实际中的应用。 目录 一、什…...
DDR5 中的数据反馈判决均衡(DFE):全面解析与展望
目录 一、引言二、DFE原理三、DFE架构四、实现方案五、测试方法六、DFE效果七、成本与收益八、具体应用九、技术发展趋势十、参考文献 一、引言 DDR5 作为新一代内存标准,其中的数据反馈判决均衡(DFE)技术更是引人注目。DFE即判决反馈均衡&a…...
Axure高保真数据可视化大屏图表组件库
推出了一款高保真数据可视化大屏图表组件库,旨在为用户提供丰富的图表类型,使数据呈现更加直观、生动。本文将详细介绍该组件库中的各类图表元件,包括面积图、折线图、柱状图、条形图、圆环图、雷达图、仪表图以及综合类图表,以满…...
100个问题学 langchain 入门 (1/10)
100个问题学 langchain 入门 (1/10) 文章目录 100个问题学 langchain 入门 (1/10)前言**问题 1** 什么是 langchain,解决什么问题?**问题 2** LangChain 的核心组件有哪些?请列举并简要说明每个组件的作用。**问题 3** 在 LangChain 中&#…...
0001.基于springmvc简易酒店管理系统后台
一.系统架构 springmvcjsplayuimysql 二.功能特性 简单易学习,虽然版本比较老但是部署方便,tomcat环境即可启用;代码简洁,前后端代码提供可统一学习;祝愿您能成尽快为一位合格的程序员,愿世界没有BUG; …...
每日一题 326. 3 的幂
326. 3 的幂 简单 class Solution { public:bool isPowerOfThree(int n) {while(n > 3){if(n % 3 0){n n/3;}else{return false;}}return n 1;} };...
解码数据有序之道——常见排序算法总结
本文整理了常见的排序算法,采用c编码,并对其时间复杂度作以了分析。 1. 冒泡排序(Bubble Sort) 实现思路: 从数组的第一个元素开始,依次比较相邻的两个元素。如果当前元素大于下一个元素,则交…...
C语言实现图片文件的复制
在C语言中,直接处理图片文件(如JPEG、PNG等)的复制,通常涉及到文件I/O操作。这些图片文件是二进制文件,因此需要使用二进制模式读取和写入文件。 图片文件复制代码: #include <stdio.h> #include&l…...
一、windows上配置ninja环境
Ninja是Google的一名程序员推出的注重速度的构建工具,一般在Unix/Linux上的程序通过make/makefile来构建编译,而Ninja通过将编译任务并行组织,大大提高了构建速度。下面介绍了windows上配置Ninja环境。 1.下载Ninja ninja官网地址࿱…...
我们来编程 -- win11多jdk版本切换
题记 售前的酒喝到位了调研需求及文档整理出来了开发要入场了,真惨啊!年底了,手里活干的好好的,因为flyback在项目地,硬是被安排进来了拥抱变化,我呸…不得不切换系统,构建代码,一股…...
JAVA 图形界面编程 AWT篇(1)
前言 为了应对JAVA课设,小编走上了java的图形界面编程的道路,通过博客分享自己的学习历程,并进行笔记的记录。 AWT(Abstract Window Toolkit)介绍 AWT(抽象窗口工具包)是 Java 最早的图形用户界…...
C语言 字符串输入输出函数、scanf(“%[^\n]“,)可输入空格 、fgets删除换行符
字符串输入函数: scanf("%s",数组名) gets(数组名) fgets() --- 文件流输入函数 函数原型: int scanf( const char *format, ...…...
【蓝桥杯每日一题】推导部分和——带权并查集
推导部分和 2024-12-11 蓝桥杯每日一题 推导部分和 带权并查集 题目大意 对于一个长度为 ( N ) 的整数数列 A 1 , A 2 , ⋯ , A N A_1, A_2, \cdots, A_N A1,A2,⋯,AN ,小蓝想知道下标 ( l ) 到 ( r ) 的部分和 ∑ i l r A i A l A l 1 ⋯ A r \sum_{…...
Linux 磁盘满了怎么办?快速排查和清理方法
当 Linux 磁盘满了,会导致系统无法正常运行,比如无法写入文件、服务停止、甚至系统崩溃。因此,快速排查并清理磁盘空间是非常重要的。以下是详细的排查和解决步骤: 一、快速定位磁盘占用原因 1. 检查磁盘使用情况 使用 df 命令查…...
【专题】2024年中国新能源汽车用车研究报告汇总PDF洞察(附原数据表)
原文链接: https://tecdat.cn/?p38564 本年度,国家及地方政府持续发力,推出诸多政策组合拳,全力推动汽车产业向更高质量转型升级,积极鼓励消费升级,并大力推行以旧换新等惠民生、促发展举措。尤为引人注目…...
数据结构之链表笔试题详解
一:移除链表元素 我们很容易就可以想到一个解决方案:再创建一个链表,把不是val的结点拿过来尾插。 这样确实可以但是,我们每次尾插都需要遍历一遍整个链表,这样时间复杂度就变成了O(n^2), 因此我们不妨设…...
结构化的Prompt
资源库: AI 提示词-WayToAGI精选高效的AI提示词库,助力创作者和开发者解锁人工智能的潜力。通过我们的提示词和策略,优化您的AI工具使用效率,激发创意思维,提升产出质量。https://www.waytoagi.com/prompts?tag6 结构…...
【数字化】华为数字化转型架构蓝图
导读:华为的数字化转型规划团队在2016年年底基于对愿景的系统诠释,整合出了数字化转型架构蓝图。该蓝图共分为5层,旨在通过数字化转型实现客户交互方式的转变、作战方式的转变、公司各平台业务能力的数字化、服务化以及运营模式的转变。 目录…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
OpenLayers 分屏对比(地图联动)
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能,和卷帘图层不一样的是,分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...
