本文地址:https://wanger-sjtu.github.io/fp16-err/

最近在项目中需要实现fp16的数据类型做FFN的计算,算子实现的同学反馈误差与x86上得到的golden数据有比较大误差。开始以为是x86侧做数值模拟仿真的问题。后面也实现了对比了一下,发现误差累计确实挺大。

实测结果对比

int main()
{
// Seed with a real random value, if available
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<> dist(0, 0.01); float16_t lhs[4096] = {0};
float16_t rhs[4096] = {0};
for (int i = 0; i < 4096; i++) {
lhs[i] = dist(gen);
rhs[i] = dist(gen);
}
float16_t res_fp16 = 0;
float res_fp32 = 0; for (int i = 0; i < 4096; i++) {
res_fp16 += lhs[i] * rhs[i];
res_fp32 += lhs[i] * rhs[i];
}
std::cout << "fp16 " << res_fp16 << std::endl;
std::cout << "fp32 " << res_fp32 << std::endl;
wirte2file("/data/local/tmp/lhs", reinterpret_cast<char*>(lhs), 8192);
wirte2file("/data/local/tmp/rhs", reinterpret_cast<char*>(rhs), 8192);
}

结果输出:

fp16 0.0942383
fp32 0.103176

相对误差到8.1%了。难怪反馈有问题。

dim 绝对误差
100 1.63913e-07
1000 -0.00033829
2000 -0.000909835
4000 -0.00924221

golden 数据误差从何而来

实际生成golden数据的时候,也考虑了数值类型差异的影响,那为什么还存在误差呢?

对比了一下dot的视线与直接累加结果

import numpy as np
import torch lhs = np.fromfile("lhs",dtype=np.float16)
rhs = np.fromfile("rhs",dtype=np.float16) lhs = torch.from_numpy(lhs)
rhs = torch.from_numpy(rhs) res = torch.Tensor([1]).half()
res[0] = 0
for i in range(4096):
res += lhs[i:i+1] * rhs[i:i+1] print(res)
print(torch.dot(lhs, rhs))
tensor([0.0942], dtype=torch.float16)
tensor(0.1041, dtype=torch.float16)

结果对得上了。torch 的 dot实现的时候很可能用了更高数值类型做累加。

fp16 的累加误差有多大的更多相关文章

  1. 浮点数float累加误差解决方式总结

    首先是float累加产生误差的原因,该部分转自:http://blog.csdn.net/zhrh0096/article/details/38589067 1.  浮点数IEEE 754表示方法 要 ...

  2. html5物理定位误差大 解决办法

    学生党在做比赛作品,项目中需求要用到定位功能并以地图形式展现.所以思路就是用h5的geolocation 获取经纬度,通过百度地图api将经纬度转换成详细的地址以及地图.在笔记本电脑做测试,定位总有超 ...

  3. 【十大经典数据挖掘算法】C4.5

    [十大经典数据挖掘算法]系列 C4.5 K-Means SVM Apriori EM PageRank AdaBoost kNN Naïve Bayes CART 1. 决策树模型与学习 决策树(de ...

  4. 大数据计算:如何仅用1.5KB内存为十亿对象计数

    大数据计算:如何仅用1.5KB内存为十亿对象计数  Big Data Counting: How To Count A Billion Distinct Objects Using Only 1.5K ...

  5. [DeeplearningAI笔记]ML strategy_1_3可避免误差与改善模型方法

    机器学习策略 ML strategy 觉得有用的话,欢迎一起讨论相互学习~Follow Me 1.8 为什么是人的表现 今天,机器学习算法可以与人类水平的表现性能竞争,因为它们在很多应用程序中更有生产 ...

  6. C语言面试题大汇总之华为面试题 Eddy整理

    1.局部变量能否和全局变量重名? 答:能,局部会屏蔽全局.要用全局变量,需要使用"::" ;局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局 ...

  7. 机器学习(3)- 学习建议<误差出现如何解决?>

    根据Andrew Ng在斯坦福的<机器学习>视频做笔记,已经通过李航<统计学习方法>获得的知识不赘述,仅列出提纲. 1 学习建议 误差太大,如何改进? 使用更多的训练样本→解决 ...

  8. 机器学习中的误差 Where does error come from?

    误差来自于偏差和方差(bias and variance)   对于随机变量 X,假设其期望和方差分别为 μ 和 σ2.随机采样 N 个随机变量构成样本,计算算术平均值 m,并不会直接得到 μ (除非 ...

  9. 对ADC(DAC)的线性度(INL和DNL)的一点理解 [转]

    大家在使用ADC的时候,往往最关注位数,而对ADC的线性度往往会忽略. 其实这个线性度也是ADC非常重要的指标,ADC(或DAC,其实ADC也是由DAC组成的)线性度指标有两个: INL:翻译过来叫“ ...

  10. 一个 11 行 Python 代码实现的神经网络

    一个 11 行 Python 代码实现的神经网络 2015/12/02 · 实践项目 · 15 评论· 神经网络 分享到:18 本文由 伯乐在线 - 耶鲁怕冷 翻译,Namco 校稿.未经许可,禁止转 ...

随机推荐

  1. 题解:P10672 【MX-S1-T1】壁垒

    暑期集训=依托答辩. 分析 种类数是奇数一定无解. 否则每种数字先输出一次,在此过程中每增加两个数时,因为每个数字种类数都不一样,所以前缀种类数也同时增加 \(2\),保证一定为偶数. 然后输出完以后 ...

  2. TIER 2: Archetype

    TIER 2: Archetype 扫描 nmap 使用 nmap 进行扫描目标 IP,发现目标是 Windows 服务器,开放 SMB 和 SQL Server 服务. SMB SMB 之前已经接触 ...

  3. 关键点检测(1)——标注关键点检测数据(labelme和CVAT)

    关键点检测,作为计算机视觉领域的重要分支,广泛应用于人体姿态估计.面部表情识别.手部动作分析等多个场景.其核心在于从图像中准确检测并定位特定的关键点位置.然而,高效的模型训练离不开大量高质量的标注数据 ...

  4. AI时代你应聚焦的领域在哪里

    1. 每个人都应该拥抱AI 随着AI的飞速发展,把我们带到了一个全新的时代.在这个时代,AI将逐步渗透到各个方面,比如:自动驾驶.智能家居.医疗诊断.大模型等等.每个人都应该积极拥抱AI,让AI给我们 ...

  5. VirtualBox扩容CentOS-7虚拟机磁盘

    1.背景描述 如上图所示,根路径"/"所在的文件系统已没有可用的磁盘空间,需要扩容磁盘. df -h 2.VirtualBox操作 2.1.查看当前虚拟磁盘的大小 如上图所示,点击 ...

  6. 【Java】Springboot + Redis +(AOP & 响应外切)切面实现字典翻译

    使用案例演示: 先开发了一个简单的Demo: 普通DTO类注解翻译的字段和翻译来源 在需要翻译的方法上注解@Translate 接口返回结果: 框架思路: 1.标记的注解需要通过AOP切面在调用的时候 ...

  7. 【Vue】15 VueX

    [什么是VueX?] VueX是一个专门为Vue.js应用程序开发的状态管理模式, 采用集中式存储管理应用的所有组件状态, 以相应的规则保证按照一种可预测的方式发生改变. 即把多个组件的变量统一放到一 ...

  8. 关于“内网穿透”的一些知识(续3)—— NAT类型判断

    前文: 关于"内网穿透"的一些知识(续2)-- 端口预测 ------------------------------------------- 本文是对前面几篇文章的补充.这里要 ...

  9. 乌克兰学者的学术图谱case2

    ======================================= 0. 学者:Солонін Ю.М. 中文翻译名:索洛宁·尤里·米哈伊洛维奇 英文翻译名:Solonin Yuriy M ...

  10. git的快速入门(含常用指令)

    目录 概念 什么是git git与GitHub有什么区别 提交.仓库.分支 git的使用 从GitHub上下载别人的代码 直接将代码下载到本地 克隆仓库获取代码 将自己的代码上传到GitHub 本文拟 ...