【辐射效应系列 13 · 进阶篇 · AI加速器可靠性评估】把 GPU、TPU、边缘加速器塞进自动驾驶和卫星,一次比特翻转可能让模型把"行人"看成"背景",却毫不声张。这一篇,我们讲清楚:辐射下,一个神经网络到底有多不可靠,怎么量、怎么测。
在《加固·三》那一篇的收尾,我们点到了 AI 加速器的加固手段,数值裁剪、故障感知训练,讲的是"怎么防"。但在防之前,有个更根本的问题:你怎么知道它到底有多不可靠?辐射下,一个跑在GPU 上的神经网络,出错的概率是多少?错到什么程度?这一篇专门回答"怎么评估"。
先说结论:评估 AI 加速器的可靠性,是辐射效应领域里最拧巴的一件事。拧巴在两头。一头是硬件极其复杂,一颗现代 GPU 上有成千上万个计算核心、共享缓存、硬件调度器,一次粒子命中在硅片里发生,却只有传到软件,输出才"看得见",中间隔着好几层抽象,故障怎么传播几乎无从追踪。另一头是软件天生"概率化",神经网络的输出不是确定值而是一串概率,同一个故障,喂给它一张空旷的图和一张热闹的图,结果可能天差地别。硬件的不可观测,撞上软件的不确定,评估就成了一门需要束流实验 + 故障注入 + 应用分析三管齐下的手艺。
而且有个反常识的事实贯穿全篇:在神经网络里,不是所有的翻转都算数。 一个把像素颜色改了一点点的翻转,和一个让车"没看见"行人的翻转,严重程度差着十万八千里。传统加固喜欢"一律复制三份、少数服从多数",但对 AI 来说这往往是浪费,你在给那些根本无关紧要的错误也上三倍的保险。所以评估的终点,从来不是"翻了多少比特",而是"应用层面到底错没错、错得能不能忍"。
AI 硬件全景:从"什么都能算"的 GPU 到"只会卷积"的边缘芯片
先把地图铺开。人工智能(AI)是个大圈,凡是能让计算机模仿人类"感知、推理、行动、适应"的技术都算,哪怕是 if-then 规则和决策树。往里一层是机器学习(machine learning, ML),算法随着喂的数据越多、表现越好。再往里的核心是深度学习(deep learning, DL),用多层神经网络从海量数据里逐层抽取越来越高级的特征。我们真正关心的对象,深度神经网络(deep neural network, DNN),尤其是擅长图像的卷积神经网络(convolutional neural network, CNN),就住在这个最内圈。

▲ 图1 人工智能、机器学习、深度学习的层层包含关系:AI 是最外圈的宽泛定义,ML 是其中"越喂数据越聪明"的子集,DL 则是用多层神经网络学习的最内核。本系列关注的 DNN/CNN 正落在最里层。
CNN 靠什么干活?最核心的本领就是卷积。对计算机来说,一张图片并不是“汽车”“行人”或者“红绿灯”,而是一大片按照位置排列的数字,每个数字记录一个像素的亮度或颜色。CNN 要做的第一件事,就是从这些杂乱的像素中找出有用的规律。它会拿着一个很小的滤波器,也叫卷积核,像一扇小窗口一样在图像上逐格滑动。卷积核最常见的尺寸是 (3×3),也就是说,它每次只观察相邻的九个像素。
每滑到一个位置,卷积核都会把自己内部的九个权重与对应的九个像素分别相乘,再把结果加起来,得到一个新的数值。这个数值表示当前位置与某种特征的匹配程度。如果卷积核是用来寻找竖直边缘的,那么它遇到建筑物边框、电线杆或者车辆侧面时,就会产生较强的响应;如果它是用来寻找横向边缘的,那么它可能对道路边界、车顶或地平线更加敏感。卷积核里的数字通常不是工程师一项项手工填写的,而是网络在训练过程中,根据大量图片和正确答案一点点学出来的。
一个卷积核只能寻找一种特征,因此 CNN 通常会同时使用很多个卷积核。有的寻找明暗变化,有的寻找颜色差异,有的寻找线条、拐角和纹理。每个卷积核扫描完整张图片后,都会得到一张新的数字图,这就是“特征图”。特征图不再直接表示原始颜色,而是记录某种特征在图像的什么位置出现,以及出现得有多明显。某个区域的数值越大,通常意味着卷积核要找的特征在那里越突出。
CNN。最前面的卷积层看到的通常只是边缘、亮斑和简单纹理;中间的卷积层会把这些基础线索组合成圆弧、轮廓、车轮或车窗;更深的网络再把这些局部结构拼起来,逐渐形成对整辆汽车、一个行人或者一块交通标志的判断。换句话说,CNN 并不是一眼认出物体,而是沿着“像素、边缘、纹理、局部结构、完整物体”这条路线,一层一层地建立理解。
不过,卷积产生的特征图仍然很大。如果每一层都保留全部数据,网络的计算量和存储量会迅速膨胀。于是,池化层登场了。池化层的工作不是继续寻找新特征,而是把已有的特征图适当缩小。它通常把相邻的几个数值划成一个小区域,例如把每个 (2×2) 区域压缩成一个数值,这样特征图的宽和高都会减小,后面的网络就不必再处理那么多数据。
最常见的是最大池化和平均池化。最大池化会从一个小区域中挑出最大的数值,相当于在问:“这个区域里,某种特征最强烈的证据是多少?”只要强特征还在,周围其他较弱的信息就可以暂时舍弃。平均池化则会计算整个区域的平均值,相当于在问:“这种特征在这个区域里的总体水平是多少?”最大池化更重视最醒目的局部证据,平均池化则保留更平滑、更整体的信息。
池化还有一个很直观的作用:让网络不再过分在意特征的精确位置。假设一条边缘向左或向右移动了一个像素,只要它仍然落在同一个池化区域内,最大池化的输出就可能完全不变。因此,目标在画面中发生一点轻微移动、抖动或者变形时,网络仍然有机会认出它。池化可以看成一种“只记住这里出现过什么,不必死记它具体落在哪一个像素上”的处理。
这个不起眼的池化,后面还可能成为过滤辐射错误的一件好用武器。辐射产生的瞬态错误往往只会扰动特征图中的少数数值。如果某个非关键数值被扰动,但仍然没有超过区域内原本的最大值,那么经过最大池化以后,错误可能不会继续传播。平均池化则可以把单个数值的异常分摊到整个区域中,使错误幅度被稀释。不过,池化并不是天然免疫辐射。如果辐射把某个数值错误地抬得非常高,最大池化反而可能主动选中这个错误。因此,更准确地说,池化能够屏蔽一部分局部扰动,但它的容错效果取决于错误发生的位置、方向和幅度。
经过多轮卷积、激活和池化以后,CNN 就获得了对图像内容的高层描述。对于普通的图像分类网络,最后可能只需要回答“这张图最像猫、狗还是汽车”。但对于自动驾驶中使用的目标检测网络,任务要复杂得多。网络最后吐出的不是一个简单答案,而是一大串候选物体。每个候选结果通常都包括物体可能出现的位置、包围物体的方框、它属于汽车或行人的概率,以及网络对这个判断有多大把握。
这些候选结果不能全部直接使用,因为其中既有真正的物体,也有置信度很低的猜测,还有不少彼此重叠的重复框。系统首先会设置一个置信度阈值,把“不够格”的候选结果过滤掉,然后再从多个重叠框中留下最可信的一个。阈值定得太高,系统虽然很少虚报,却可能漏掉真正的车辆或行人;阈值定得太低,系统虽然更加敏感,却可能把阴影、路牌甚至噪声都当成障碍物,导致车辆频繁误报警或急刹车。
因此,这个看似简单的阈值实际上是一道非常关键的安全门槛。它决定了系统更害怕“漏看”还是更害怕“看错”。在自动驾驶这样的安全关键场景中,卷积负责寻找线索,池化负责压缩和筛选信息,后面的检测网络负责提出候选目标,而置信度阈值则负责作出最后的取舍。CNN 的识别能力,正是由这些环节一层层共同建立起来的。
▲ 图2 卷积神经网络的层级结构:输入图像经"卷积+ReLU → 池化"逐层提取特征,再经展平与全连接层,最后由 Softmax 输出各类别的概率(车/卡车/货车/自行车)。(IEEE NSREC 2023 短课程)
顺带一个会让人一愣的边界设定:这一整篇讲的都是推理(inference)阶段的可靠性问题。训练阶段的辐射问题,一般不值得研究。理由很硬:训练要滚过成千上万帧数据、反复迭代权重,一次瞬态故障造成的扰动,多半会被后续的海量迭代自己磨平。真正怕辐射的,是那个装上车、送上天、一帧定生死的推理阶段。
要在自动驾驶里实时跑(至少 40 帧/秒),DNN 的巨量矩阵乘法只能靠并行硬件扛。市面上主要有三类:
· GPU(图形处理器) 最通用、生态最全。以 NVIDIA CUDA 为例,它由一堆流多处理器(streaming multiprocessor, SM)组成,每个 SM 里塞着许多计算核心(CUDA core),各自跑一个线程、带专属寄存器;此外还有专门加速卷积的张量核心(tensor core),能一个时钟周期算完 16×16 的矩阵乘。而指令、数据缓存和硬件调度器是共享的,这正是隐患所在。
· FPGA让你亲手定义电路。神经网络天然模块化、并行度高,映射到 FPGA 上很顺手;为省资源常把 sigmoid 离散化,甚至把权重砍到只用 1 位(二值神经网络 BNN,权重只取 ±1)。为了复用硬件跑多层卷积,人们引入了脉动阵列(systolic array),一群处理单元像心脏搏动一样,数据"泵进泵出",每个时钟周期推进一拍,特别适合矩阵乘。
· EdgeAI 低功耗加速器,如 NeuroShield、谷歌 Coral TPU。它们只会干最基础的活(主要是卷积),用低精度(16 位浮点甚至 8 位整数),但极其省电,Coral TPU 能做到 每瓦 2 TOPS(万亿次运算/秒)。它本质就是一块硬连线的脉动阵列,配一大堆输入缓冲,而这些缓冲不一定有 ECC 保护。它自己不能独立工作,得靠 USB 3.0 或 PCIe 挂在一个主机上当"协处理器"。Coral TPU 的内部数据一律是 8 位无符号整数(UINT8),推理前先量化、推理后再反量化;软件栈则是 TensorFlow Lite 配专用的 EdgeTPU 编译器。

▲ 图3 现代 GPU 架构简图:由若干共享 L2 缓存的流多处理器(SM)阵列构成,每个 SM 内含多种精度的计算核心与张量核心,并由硬件调度器编排上千线程。共享缓存和调度器一旦被击中,会波及多个并行进程。
三类硬件架构迥异,但有个共同点:并行。并行是它们性能的命根子,却也是可靠性的软肋。从辐射测试的角度看,计算核心之间是隔离的,一颗粒子打中某个核心,通常只毁掉它那一个线程。可一旦命中的是共享资源(如缓存)或关键资源(如调度器),就可能一口气让好几个并行进程集体出错。

▲ 图4 脉动阵列做矩阵乘的示意:权重预先"驻留"在阵列里,输入数据从左向右流动,部分和自上而下累加,每个时钟节拍推进一步。Coral TPU 等边缘加速器的核心正是这样一块硬连线阵列。
错误的两副面孔:崩溃,与"沉默的谎言"
粒子命中硅片后会发生什么?回到最基本的物理:电离粒子在晶体管里搅出电荷,若足够多,就能把一个晶体管从"开"翻成"关",在存储器里制造比特翻转,或在逻辑里激起电流毛刺。一次辐射引发的瞬态错误,对正在运行的程序有三种归宿:
1. 被屏蔽——故障没用上,或被电路吞掉,程序输出毫发无伤;
2. 静默数据损坏(silent data corruption, SDC)——输出错了,但系统一声不吭;
3. 可检测不可恢复错误(detected unrecoverable error, DUE)——程序崩溃、设备重启。
这里借用 Avizienis 的经典术语理一下链条:粒子改变晶体管状态,产生故障(fault);故障若传播到一个可见状态(寄存器、触发器)就成了错误(error);错误若继续传到软件输出、真的改变了结果,就升级为失效(failure)。SDC 和 DUE,都是失效。
DUE 好歹会喊疼,机器崩了你立刻知道。真正阴险的是 SDC:它是沉默的谎言。模型照常输出,你却不知道那个"背景"其实是个行人。对安全攸关的自动驾驶和航天而言,一个不报错的错误,比一次干脆的崩溃可怕得多。
并行还给错误加了一层放大。直观地说,单个线程出错像是一个像素点错了,而多个线程被同时污染,就是一整片像素错了。 前者顶多让画面脏一小块,网络多半能扛过去;后者足以毁掉一整块特征图,让网络把物体看错、看漏。这也是为什么共享资源和调度器的损坏在 CNN 里格外致命,实测中,卷积在 GPU 上出错,往往表现为特征图里被污染的整行、整列,或一大块。

▲ 图5 单事件命中并行设备关键/共享资源时的传播路径:一次命中若落在取指、译码、调度器或共享缓存上,由它管理或使用该资源的多个并行线程都可能输出错误,最终酿成系统失效。故障发生在硬件,却只有传到软件输出才看得见。
什么样的错才算"错":可容忍 vs 关键
既然不是所有翻转都算数,评估的第一道坎,就是把静默数据损坏(silent data corruption, SDC)分成"可容忍"和"关键"两类。有一组很直观的画面:
· 期望输出:物体被正确框住、正确分类;
· 可容忍的错误:包围框(bounding box, BB)位置偏了一点,但原物体仍有超过 50% 落在框里,检测依然管用,车的行为不受影响;
· 漏检(misdetection):真实存在的物体没被检出,这会拉低召回率(recall);
· 虚警(false positive):凭空报出一个不存在的物体,这会拉低精确率(precision);
· 分类错误:物体框对了、位置也对,却被贴错了标签。

▲ 图6 辐射错误在目标检测里的几种表现:(a) 期望输出,(b) 可容忍错误(原物体仍有过半留在包围框内),(c) 漏检(拉低召回率),(d) 虚警(拉低精确率),(e) 分类错误(框对了但类别错了)。区分"可容忍"与"关键",是 AI 可靠性评估的核心判据。
那么,怎样客观判断一次辐射错误到底严不严重?关键不能只看硬件内部的某个比特是否翻转,也不能只看网络输出的数字是否发生变化,而要看这种变化有没有真正改变应用的判断结果。换句话说,需要在“硬件发生错误”和“应用无法接受”之间划出一条明确的界线。
对于图像分类任务,神经网络最后输出的是一个概率向量。例如,无辐射时,网络认为图中有 80% 的可能是汽车、15% 的可能是卡车、5% 的可能是其他物体。辐射引起的静默数据错误,也就是 SDC,可能会把这些概率改成 75%、18% 和 7%。虽然输出数字已经发生变化,但“汽车”仍然排在第一位,因此对于只看最高概率类别的分类任务来说,最终判断并没有改变,这类错误通常不算关键错误。
真正需要关注的是那些改变最终判断的 SDC。如果辐射把原本应该排在第一位的正确类别压了下去,使一个真实物体没有被正确识别,就会形成假阴性,造成召回率下降。相反,如果辐射把原本不该出现的类别推到了前面,让网络凭空“看见”了一个不存在的物体,就会形成假阳性,造成精确率下降。简单来说,假阴性代表“该看见的没有看见”,假阳性则代表“本来没有,却错误地看见了”。
对于目标检测任务,判断标准还要更复杂一些。网络不仅要回答“这是什么”,还要用包围框指出“它在哪里”。即使物体类别没有改变,辐射也可能让包围框发生偏移、缩小或放大。因此,评价检测结果时,既要比较类别和置信度,也要比较受扰包围框与无辐射包围框的位置和面积是否足够接近。
图像检测领域通常使用交并比来衡量两个包围框的接近程度。交并比可以简单理解为“两个框重叠的面积,占它们合并后总面积的比例”。两个框完全重合时,交并比为 1;完全不相交时,交并比为 0。研究中可以设置一个接受阈值 (T_J):当两个框的交并比不低于 (T_J) 时,就认为它们检测的是同一个物体;低于这个阈值,则认为检测结果已经发生了不可接受的变化。
如果把 (T_J) 设置为 1,就要求受扰包围框与无辐射包围框完全重合。这样一来,哪怕辐射只让某个坐标移动了一个像素,也会被判定为关键错误,显然过于苛刻。为避免把无关紧要的轻微偏移也算作严重失效,可以采用图像检测中常见的 (T_J=0.5)。也就是说,只要受扰框与无辐射框的交并比不低于 0.5,就仍然把它们视为对同一物体的有效检测。
在这一标准下,如果无辐射输出中的某个物体在受扰输出中找不到相匹配的检测框,就记为一次假阴性,说明网络漏掉了原本能够识别的目标;如果受扰输出中多出了无法与任何原始检测框匹配的结果,就记为一次假阳性,说明辐射让网络产生了虚假目标。由此便可以继续计算精确率和召回率,定量评价辐射是否真正损害了网络的检测能力。
归根到底,这套方法不是简单地追问“硬件有没有出错”,而是进一步判断“这个错误是否改变了应用结果”。它直接借用了图像处理领域已经成熟的精确率、召回率和交并比标准,把底层的比特翻转和数值扰动,翻译成上层应用能够理解的问题:真实目标会不会被漏掉,虚假目标会不会被报出来,以及包围框的偏移是否仍在可以接受的范围内。
怎么量:一张度量表说清所有指标
有了"算不算错"的判据,接下来是"错得有多频繁"。一张表把常用指标一次讲透:

▲ 图7 可靠性评估度量定义表:截面(cm²,被击中即出错的等效电路面积,= 错误数/注量)、FIT(10⁹ 小时内的预期错误数,= 截面×自然通量)、AVF(硬件故障传播到软件输出的百分比)、PVF(软件错误传播到程序输出的百分比)、MTBF(正确运行的平均时间,= 1/错误率)等。
几个关键量拎出来说:
· 截面(cross section) 是衡量辐射敏感度的头号指标,直白说就是"被一颗粒子击中会出错的等效面积",用观测到的错误数除以注量(每平方厘米打了多少粒子)算出。对 DNN,明智的做法是把截面拆成"关键 SDC 截面"和"可容忍 SDC 截面"分开报。而且要记住:同一颗芯片,跑不同的网络、甚至处理不同的画面,截面都会变,一张空旷的图,往往比一张热闹的图更不容易出错。
· FIT(failure in time) 是给汽车、航空、工业界看的:10⁹ 小时里失效多少次。用截面乘以自然中子通量(海平面约 13 中子/(cm²·h))再乘以 10⁹ 就能换算出来。规矩定得很死,按 ISO 26262,汽车里安全等级最高的 ASIL D 级器件,错误率必须低于 10 FIT。
· AVF / PVF(架构/程序易损因子) 回答另一个问题:假设故障已经发生,它有多大概率一路传到输出?这个数只能靠故障注入来测,因为只有注入才能跟踪传播。
这里还藏着一个"看似针对并行设备"的微妙结论:截面不随执行时间变化,所以跑得慢并不会抬高 FIT,但动用更多并行资源、堆更大的核心却会抬高 FIT。 为了把"错误率"和"性能"一起考量,人们又引入了 MIBF/MEBF/MWBF/MFBF,两次失效之间能正确完成多少条指令、多少次执行、多少工作量,或扛住多少注量。如果任务在乎的是"正确产出了多少数据",这几个指标就比单看截面更有意义。
两条评估路线:真枪实弹的束流,与快而灵的注入
指标定了,怎么测出来?把故障从硅到软件的传播画成一条竖线——物理晶体管 → 电路 → 微架构 → 软件输出,所有评估方法都是在这条线的不同高度"取样"。规律很干脆:越靠近物理层,越真实,但越慢越贵;越靠近软件层,越高效,但越不真实。

▲ 图8 故障传播与可靠性评估方法的层次:故障始于物理晶体管,逐层传播到电路、微架构,最终到软件输出。束流实验评估"故障从物理层产生并一路传到软件输出"的真实概率;不同抽象层的故障注入则用来看清传播过程,越靠近物理层越真实,越靠近软件层越高效。
其实路线不止两条。用一张表把六种评估方法摆在了一起:最顶上还有一条"现场/寿命测试(field/lifetime data)",把海量器件放进真实环境里跑上几个月到几年,故障源百分之百真实,可惜代价极高、可观测性又差,只适合谷歌、特斯拉这种握着百万台设备的玩家。往下依次是束流、RTL 注入、微架构注入、架构注入、软件注入:耗时与成本一路下降,换来的是真实性一路打折。

▲ 图9 六种可靠性评估方法的对比表:现场/寿命数据、束流测试、RTL/微架构/架构/软件故障注入,在耗时、成本、可及资源、故障源真实性与可观测性之间各有取舍。
两条主力路线,各有各的脾气:
束流实验(beam experiment) 是测真实敏感度的头号手段。把芯片对准加速器的粒子束(比如英国 ChipIR 设施约 3.5×10⁶ 中子/(cm²·s) 的中子束),用高通量把野外几年才遇到的错误在几小时里"快进"出来。它给的是最真实的错误率和故障模型。但它有个死穴:错误只有冒到输出才看得见,没法追踪故障在芯片内部怎么传播,你知道出了错,却不知道错在哪个部件。而且结果只对测过的那段代码、那个配置有效,并行度稍微一改,错误率可能就变了。
搭一套束流实验本身就是门手艺:设备(被测件)要对准束流,主机和服务器则要尽量远离,还得垫上硼塑料砖挡散射中子;要配软硬件看门狗(watchdog)自动检测崩溃与死机,好在无人值守的通宵测试里及时重启。一个反复被强调的坑是主机侧的 DDR 内存,它离热源近、又怕散射中子,测几个小时就容易冒出永久或间歇故障,把输入输出数据搅烂,让整批结果作废;所以尽量选带 ECC 的板子(DDR 的故障还随温度加剧:它紧贴着滚烫的计算核心,高温加速老化)。更惨的案例是 SoC 的 Flash 引导程序被打坏,机器直接开不了机,实测中有好几颗器件测了几个小时后就这样"变砖"。束斑本身也有讲究:聚成约 3cm×3cm 的一小块、只罩住芯片本体,免得把板上的电源电路一起报销;散热甚至都成了课题,NASA 戈达德给去了封装的 GPU 贴上热电制冷板,才把温度压住。还有个"10% 铁律":装载数据、检查结果的开销,要控制在芯片实际计算时间的 10% 以内,否则大量粒子都白白打在"没在算"的时间上,浪费宝贵的束流机时。这套脚本、基准和看门狗,已在 UFRGS 的 CAROL 辐射基准库里公开。

▲ 图10 ChipIR 中子束流实验的真实布局:束流室里,Tesla V100 与 Tesla K40 两块 GPU 对准束线排开;以太网控制的电源开关负责远程"拔插头",网络交换机与服务器则躲在射程之外。
设施本身也有分工:中子束去 LANSCE 或英国的 ChipIR,重离子去布鲁克海文 NSRL、伯克利或荷兰 PARTREC,质子则去波士顿的 MGH,一颗 AI 芯片的完整体检,同样要在几大洲的加速器之间排队。
故障注入(fault injection) 走的是另一条路:不拿去照射,而是在系统的模型里人为塞进故障,看它怎么传。它天生高效、能任意放大、还能完整观测每一层的细节。但它有两条硬伤:一是故障模型是合成的(人为设定的),不一定对得上真实物理;二是只能往能访问到的资源里注。所以按抽象层由低到高排开
· RTL 级最真实(贴近实际电路),却慢到离谱:给一个像 LeNet 这样简单的 CNN 做一次完整的 RTL 故障注入,能耗上几百年。何况 RTL 描述本身就难拿到,GPU 里只有老掉牙的 G80 架构有公开 RTL;好在NVIDIA 开源的推理加速器 NVDLA,连 RTL 带专用注入框架都是现成的;
· 微架构级快得多、覆盖面广,但常只有行为级描述,能指出"哪个高层模块更要命",却难准确预测错误率。它在 ARM CPU 上已被拿去和束流"对表":SDC 率的预测能对到一个数量级以内,但功能中断类错误依然预测不了;
· 软件级最快(一次注入约等于跑一遍程序),可只能碰程序员看得见的变量。它最大的陷阱是幼稚的故障模型:在软件里随手翻一个比特,等于假设"粒子从晶体管一路穿过电路、架构、运算,最后只表现为一个比特翻转",这在复杂 AI 加速器里几乎不可能。源把这种"运算被扰后难以预料的输出畸变"叫作综合征(syndrome),它取决于运算类型、输入和被毁的资源,绝非单比特翻转能概括。在Python 这类高层语言里随手注入还会更失真,注入点要经过层层编译才落到机器码上,扰动早已面目全非。
正因如此,SRAM 型 FPGA 的故障注入尤其值得单说:它的配置存储器(CRAM)既可访问、又恰恰是最关键的资源,所以在这类器件上,故障注入反而成了首选的评估工具,能给出相当准的结果。
两条路线的正确姿势,是互相校准:束流给出真实的故障概率和故障模型,故障注入借这个模型去跟踪传播、放大统计。最漂亮的一招是混合注入,先用束流测出 GPU 基本指令被辐射打中后的真实"综合征",建一个小故障库,再在软件层从库里挑合适的故障注入。实测证明,这种"用束流校准过的软件注入"能相当准确地预测应用的错误率。
顺带把束流实测里几条有意思的结论摆出来:GPU 从 2012 年起就被反复测过,硬件调度器是又关键又脆弱的部件,并行进程越多,调度器压力越大,错误率越高;张量核心因为面积大,错误率更高,而低精度核心错误率更低,但一旦 16 位数据被打中,它对结果的破坏往往比 64 位更狠;至于崩溃类的 DUE,很大一部分与跑什么代码无关、纯粹是硬件的锅,从系统日志里能数出它的四副面孔:图形引擎异常、GPU 内存页错误、GPU 处理停摆、内部微控制器宕机,最后一种只在束流下现身,日常压根遇不到。相比之下,NeuroShield、TPU 这类边缘加速器错误率更低、故障模型更简单(只有少数输出元素被扰、且偏差不大),连测试装置都更皮实、不像 GPU 那样动不动就坏。
代码的写法本身也上榜:AMD GPU 的质子实测给出了 FIT 率,还比出一个耐人寻味的规律,同一个矩阵乘,访存受限的"慢"实现更容易出错,最高效的实现截面反而最小;LU 分解的对照实验也证实,动用越多并行资源,截面越大。"快"不只是性能,有时还是可靠性。
还有一颗"太空友好"的明星值得单独点名:Intel Movidius 的 Myriad VPU。重离子打到有效 LET 高达 110 MeV·cm²/mg 都没有闩锁,单粒子功能中断截面约 10⁻⁴ cm²/器件,板载 DDR3 疑似自带纠错,芯片还内建了 BIST 自测,搭载它的设备在轨运行至今没报异常。对低轨小任务来说,这几乎是一颗开箱即用的 AI 协处理器。
用算法的鲁棒,换硬件的冗余:ABFT 与故障感知训练
评估的终极目的,是为加固指路。而这里有个反直觉的实测结论:给 GPU 开 ECC,能把总错误率压低约一个数量级,却几乎压不住 CNN 的误分类,说明那些真正致命的错误,大多不是从内存里冒出来的。传统的"全复制三份"更是杀鸡用牛刀:既然不是所有错误都关键,无差别复制只会白白背上高昂开销。
聪明的做法,是拿神经网络自带的概率性、冗余性和计算弹性做文章,用算法的鲁棒去换硬件的冗余。以下列了几招,都附着实测数字:
· 基于算法的容错(algorithm-based fault tolerance, ABFT):往矩阵乘里加进一些"守恒量"(不变量),算完一对,就能快速发现甚至纠正错误。对 GPU 上的矩阵乘,ABFT 能在线性时间里检出并纠正 80% 以上的错误;搬到 CNN 上,效果胜过 ECC、甚至胜过整份复制。
· 智能池化(smart pooling):max pooling 本来只往下传最大值,那不妨顺手查一句"这个值在合理范围里吗?",因为网络里的正常值多半挤在一个窄区间,而辐射污染往往一污染就是一大截。就这么个便宜的检查,能揪出多达 85%的关键错误。
· 帧间时间相关性:CNN 一帧一帧独立处理,可现实里相邻两帧高度相似,检测结果理应也相似。于是把前后帧和各自的检测一比,差得离谱就报警,这招能抓住约70%的关键错误,代价是偶有虚警。
· 降精度双份比对(RD-DWC):GPU 上某个精度的功能单元忙时,别的精度单元正闲着,正好抓来做一份"廉价复制"。因为两份精度不同、天生不完全相等,比对就不能逐位比,而用一个"可接受差异"的阈值。实测平均能检出 75%的错误,额外开销不到 20%,且漏掉的那些恰好落在两份的固有精度差里,对检测几乎无害。
· 只保护要害:既然评估已经告诉你哪些层、哪些错误才致命,那就选择性复制,只给最关键的部分上冗余,开销最多能省一半;ABFT 也有为 GPU/FPGA 定制的轻量版(light-ABFT),进一步压低代价。
· 给网络"减肥":类别越多,类与类之间的"距离"越近,被翻动一点就容易认错。按任务需要砍掉用不着的类别,误分类能直接减半,对只需要认"有没有船、有没有飞机"的空间应用来说尤其划算。

▲ 图11 基于算法的容错(ABFT,左)与智能池化(右)示意:ABFT 给矩阵乘添加校验不变量以快速查错纠错;智能池化在 MaxPooling 传值时顺带检查数值是否落在合理范围。两者在降低辐射对 CNN 影响上都非常有效。
而最能体现"用 AI 潜力反哺可靠性"的一招,是故障感知训练(fault-aware training)。思路借自数据增强:既然一个只见过白天场景的模型到了夜里就抓瞎,那就在训练时故意给它注入故障,在前向传播时,往某一层的特征图里塞进一个"实验观测到的真实故障模型",逼网络在带故障的情况下也给出正确答案。练着练着,网络就自己调整权重、学会了"和这类错误共处"。挑故障是关键:注太多,训练可能不收敛;注太少又没用;而随手注单比特翻转对训练几乎是"透明"的、白注。选对了故障模型,故障感知训练能把 DNN 里的关键错误再压低约一个数量级,用几乎不变的精度,换来实打实的可靠性。

▲ 图12 故障感知训练示意:在训练的前向传播中向特征图注入实验观测到的故障模型,迫使网络学会在带故障时仍输出正确结果,从而在几乎不损失精度的前提下大幅降低关键错误。
小结:别只盯着比特翻转率
绕了一大圈,回到那个拧巴的起点。评估 AI 加速器的可靠性,最容易犯的错,就是只盯着"翻了多少比特",那是硬件视角,可对神经网络毫无意义。真正要落地的是三个问题:应用层面到底错没错?错的是哪一类(可容忍还是关键)?错到什么程度还能忍?
这条评估之路,是硬件的不可观测与软件的不确定性合谋出的难题,也逼出了一套组合拳:用束流实验拿真实的故障概率和模型,用不同抽象层的故障注入跟踪传播、放大统计,再用应用分析把"硬件出错"翻译成"精确率/召回率有没有掉"。度量上,截面要拆成关键与可容忍两份,FIT 要对齐 ASIL 这样的行业红线。而加固的方向也随之清晰:与其无差别地复制冗余,不如用 ABFT、智能池化、故障感知训练,拿神经网络自带的能力去换硬件的开销。
没有经过实验验证的故障模型,我们根本说不清要解决的问题是什么;没有对加固方案的实验验证,也无从确认它真的管用。评估,正是这一切的地基。至此,辐射效应系列从机理、器件、测试、加固一路走到 AI,把一颗粒子从硅片深处到神经网络输出的完整旅程,讲了个通透。
📖 引用 / 参考文献
[1] P. Rech, "Experimental Evaluation of Artificial Neural Networks Reliability: from GPUs to Low-Power Accelerators," Section IV, IEEE NSREC 2023 Short Course(本篇 AI 硬件分类、GPU/FPGA/EdgeAI 架构、错误表现形式、可靠性度量、束流实验与故障注入方法学、ABFT/智能池化/故障感知训练等机理、判据与实测数据主体,均取材、核对自该短课程;图 1–12 取材自该部分;束流实测器件含 Tesla V100/K40、AMD GPU、Coral TPU、Myriad VPU 等).
[2] F. F. dos Santos, P. F. Pimenta, C. Lunardi, et al., "Analyzing and increasing the reliability of convolutional neural networks on GPUs," IEEE Transactions on Reliability, vol. 68, no. 2, pp. 663–677, 2019(多进程损坏致 CNN 误分类、ABFT/智能池化实测数据的原始来源,经 2023 短课程 Sec IV 综述引用).
[3] R. L. Rech Junior, S. Malde, C. Cazzaniga, et al., "High energy and thermal neutron sensitivity of Google Tensor Processing Units," IEEE Transactions on Nuclear Science, vol. 69, no. 3, pp. 567–575, 2022(Google TPU 的原子操作与 CNN 故障模型表征,经 2023 短课程 Sec IV 综述引用).
#辐射效应 #AI加速器 #可靠性 #SDC #故障注入 #硬核科普 | 辐射效应系列 13 · 进阶篇 · AI加速器可靠性评估
夜雨聆风