辨证论治是一个中医的概念,强调一种根据病因的不同和每个人身体情况的差别有针对性地展开救治,从而达到优化治疗的过程。辨证论治反映的是对待事物的态度和原则,并没有揭示具体的方法,因此在具体过程中需要采用科学的方法通过实践总结积累经验。现代统计分析方法和数据挖掘技术为我们提供了积累经验的具体方法。
例如,针对当前新型冠状病毒肺炎疫情,瑞德西韦的临床验证采用了组轻、中症患者308例,重症患者453例共计761例病患样本和采用双盲试验方法保证验证结果的科学性。采用足够样本的双盲试验从统计上排除了每名患者自身差异对于药效的干扰,确保了测试结果的科学性。而构建不同年龄、性别等特征的病患集合则可以帮助确定药物对于不同的病患的作用方式和效果。
在SSD从Flash读取数据的过程中,经常会遇到各种情况导致数据帧纠错失败的情况。Flash厂商通常会提供针对不同情况进行数据恢复的“诊疗方案”。对于SSD特别是企业级SSD来说,如何利用Flash厂商提供的数据恢复方法,结合自己的实际情况优化数据读取过程的正确性和效率,是SSD厂商的一大技术核心。上篇我们将从“论治”角度进行介绍,下篇从“辩证”角度进行介绍。
如果把Flash中数据写入和读出过程看作数据在这个信道中传输,我们一定会关心这个信道的容量。通过估算这个信道的信噪比,可以大致推测出来,如果采用8~16位量化就可以充满信道容量,这对应于TLC~QLC这两种形态的Flash,并不支持更多的量化位数。但是2019 FMS国际闪存会议上,铠侠电子(原东芝存储)已经开始PLC闪存的讨论,这说明理论的通信信道模型与Flash信道特性有差异。实际上Flash信道确实有自身独特的地方,这与芯片的原理、制造缺陷和使用过程有关。
一般来说数据帧在读取的时候发生错误,通常是几个原因造成的,下图总结了一些常见的Flash错误类型。实际上这些错误类型通常是定性的和理论化的,实际的数据帧在存储过程中出现错误通常是各个问题的叠加。这使得先辨明问题再尝试针对每种问题针对性地解决显得不现实。通常厂商会提供很多组Readretry的序列对该信道进行修复,再加上SSD读取Flash软信息或通过纠删码进行纠错的方法能够解决大部分问题。由于每种方法只能有针对性地解决一小部分问题,并且这些方法所能解决的问题会部分重叠,而总的方法数可能多达上百种,像程咬金的三板斧一样把所有方法依次试一遍的思路显得很低效,并且会造成延迟的增加。有效的方案需要在一堆纠错方法里面挑选出一部分较好的方法,并把它们组合起来使用。
下面我们把这个问题数学化,考虑一个所有Flash数据帧出错的集合为S。根据经验可以总结出n种错误恢复方法。其中第k种方法纠错的集合为Sk。而为了解决的问题所产生的代价为Ck。这里Ck可以表示为了纠错所需要多次读Flash数据帧或者是其他操作产生的代价。那么这个问题就可以表示为在n中纠错方法中选出一部分方法,使得总代价不超过B,且纠错能力最大。这个问题在数学上被称为限定预算的最大覆盖问题。理论上,如果我们确定了能承受的最大代价,就可以确定一组方法,对错误帧依次使用这一组方法尝试纠错可以确保能够应纠尽纠。
实际应用中,像Readretry这样的方法会调整判决电压并尝试再次从Flash上读取数据,这类方法的代价主要是增加了数据读取的时间。而采用XOR纠删码这样的错误恢复方法则会需要读取多个数据帧,从而产生更大的代价。因此合理估计每种方法的代价,并根据SSD的设计约束确定合理的总代价B很关键。而确定每种方法所能解决的可能性大小和重叠程度则是通过离线或者是在线的方法对Flash进行特性测试(Characterization)所获得。通过特性测试,我们通常会得到这样一个表格:
这个表的每一列代表一种测试方法,而每行代表一个数据帧。交点位置用1表示指定的测试方法对于该数据帧纠错成功,而0表示纠错失败,空白表明对于这帧数据未采用这种方法进行测试。
为了能转化成最大覆盖问题,我们先把空白的位置填上使用这个方法纠错成功的先验概率(或样本概率)值,然后再使用最大覆盖求解该问题。最大覆盖问题不能通过贪婪算法得到最优解。从下面的集合维恩图中容易看出来,C包含的面积最大,如果采用贪婪算法会首先把它选出来,然后才能继续选择A或B。但是如果限定选择两个方法,那么选择A+B作为目标方法集合会比C+A或者C+B所覆盖的面积要更大。
由于最大覆盖问题是一个NP-Hard问题,且表格列数很多,因此工程上难以求得精确解。可以采用模拟退火算法或者是遗传算法获得其近似解。一旦确定了方法集,也就可以根据每种方法纠错能力确定最优执行顺序。如果我们把平均执行代价作为最优执行顺序的依据,那么这同样是一个NP-Hard的问题,可以采用类似的近似解求解方法。
采用了上述方法,就可以根据实际情况和SSD的设计目标选择合适的纠错方法集合,达到有效“施治”的目的。但是笼统的把这些方法应用到所有的出错的位置,并没有根据每种错误情况来具体分析,使用针对性的方法来提高纠错能力和降低反应延迟。所以我们将要引入“辩证”的理念来找到正确的方法对错误的“症状”进行分类,针对每种症状找到个性化的解决方法。
文中提到数据帧在读取的时候发生错误类型通常是定性的和理论化的,实际的数据帧在存储过程中出现错误通常是各个问题的叠加。而有效的方案需要在一堆纠错方法里面挑选出一部分较好的方法,并把它们组合起来使用。我们将这一问题转化成数学问题——限定预算的最大覆盖问题,即假设通过确定了能承受的最大代价,就可以确定一组方法,对错误帧依次使用这一组方法尝试纠错可以确保能够尽可能进行纠错。由于最大覆盖问题的复杂程度,我们又通过模拟退火算法或遗传算法获得其近似解,进而可以根据实际情况和SSD的设计目标选择合适的纠错方法集合,达到有效“施治”的目的。
但是笼统的把这些方法应用到所有的出错的位置,并没有根据每种错误情况来具体分析,使用针对性的方法来提高纠错能力和降低反应延迟。
为了引入“辩证”的理念,我们需要找到正确的方法对错误的“症状”进行分类,针对每种症状找到个性化的解决方法。这里面临一个困难:如果分类过细,那么相邻类别所对应的纠错方法可能差不多,造成冗余分类;还有可能造成对应类别的测试样本不足,不能用于概括这类问题。而如果分类过粗,那么一个类别中的不同情况可能需要尝试多种纠错方法,造成效率低下。
既然把Flash错误比作疾病,也可以看看医学是如何借助大数据来帮助我们诊断疾病。计算机辅助诊断(CAD)体现了现代统计学对于疾病诊断的价值。把病例诊断数据输入计算机,它可以根据预先设计的算法和约束条件自动生成诊断方法。而决策树如CART、Decision Forest等方法因为其可解释性和高有效性使得基于决策树的辅助诊断被尽早应用到自动诊断中来。
同样的,在SSD内部,出于管理的需要通常会对每个Flash Block建立一个“病历本”。如果我们能够形成一个诊断方法,可以根据Flash使用具体情况如擦写次数、数据写入时间、温度等特征形成一个个性化的纠错方案。
诊断方案可以使用机器学习和人工智能的方法构建。与通常的诊断不同,每一种纠错方法与错误类型并不是一一对应的关系,希望采用分类的方法构建诊断方案不可行。此外用于分类的“症状”可能拥有多个特征,需要从中确定有效的特征。因此,需要根据Flash的特征来构造出不同类别,实现类内纠错方法一致高效,类间的纠错方法区分度大。为了能够利用算法进行自动聚类,需要首先收集携带有分类特征的特性测试数据样本,然后再定义具体的聚类标准和优化目标函数,并构建聚类模型。为了确保算法的可靠稳定,采用上述方法收集到的模型和流程需要经过数据和人工的验证,确保其合理解释性。
掌握了针对Flash错误的“望闻切问”诊断原理,还需要通过大量的特性测试获得NAND Flash对应型号的特性数据。Memblaze深知数据对于用户的价值,在企业级SSD的研发中,一直把Flash特性分析、错误检测和预防作为关键设计要求。由于Flash更新换代很快,为了能够及时、准确获得特性数据,需要有自动化的检测平台和检测流程。目前Memblaze已经拥有自主知识产权的软硬件平台,借助检测平台和基于人工智能统计学分析方法,可以对于不同厂商、不同型号的NAND Flash进行深入分析,快速获得优化的错误检测和预防方案,并在产品设计、验证导入等层面通过严格的流程把关,确保交付给用户放心的产品。此外,Memblaze还与上游NAND Flash厂商和控制器厂商进行深入沟通合作,充分理解和掌握Flash的应用模型便于SSD全局优化Flash错误处理机制,并提供协作设计的典范。
Membalze Flash特性分析平台
参考资料:
1. https://www.embedded.com/flash-101-errors-in-nand-flash/
2. https://en.wikipedia.org/wiki/Maximum_coverage_problem
3. https://en.wikipedia.org/wiki/Decision_tree
4. https://en.wikipedia.org/wiki/Computer-aided_diagnosis
5. https://www.researchgate.net/publication/11205595_Decision_Trees_An_Overview_and_Their_Use_in_Medicine