IEEE 2023 |SZ3:一种基于预测的误差有界有损压缩器的模块化框架
作者:START团队-贾轲
随着在高精尖计算设备上不断进行的百万兆级计算实验的增加,由此产生的计算数据规模与大小越来越夸张与庞大。因此,数据压缩对科学研究的重要性日益增加。然而由于通用压缩算法无法保证压缩质量,专门的压缩优化算法又难以保持稳定性,因此,通用、实用高效的的数据压缩方式也越来越被科学家们所需要。本次为大家带来重庆大学START团队在数据库领域顶级会议IEEE 2023最新收录的论文《SZ3: A Modular Framework for Composing Prediction-Based Error-Bounded Lossy Compressors》
- 背景
在先进设备上运行的百万兆级计算实验会产生大量的计算数据。例如最近的气象研究,以1km*1km为分辨率进行气候模拟,每16秒产生260TB的数据。当产生的数据存入并行文件系统来确保长期存储访问时,有限的存储容量以及IO带宽会带来很大的挑战。虽然现有的基于预测的方法,如SZ是通用的,可以应用于各种场景,但在给定特定的数据集或误差边界要求时,它们可能无法达到最佳的质量和性能。同时,最佳的压缩方法从来也都不是通用的,即使对于相同的数据集也是如此,因为压缩效率也会受到所需误差范围的影响。例如,带有Lorenzo预测器的SZ-1.4在低误差范围内显示出非常好的压缩比,但它存在低质量和高误差范围的伪像问题,其中基于回归的预测器或基于插值的预测器的方法已被证明效率更高。同样,GAMESS量子化学包生成的数据显示出周期性的缩放模式,其中基于模式的预测器在压缩速度和压缩比方面都有明显的改进。因此,允许自定义基于预测的误差有界有损压缩模型的松耦合压缩框架对于在实践中为用户优化压缩质量和性能至关重要。
而开发一个模块化、可控误差、能适应不同的科学数据集压缩框架,是非常困难的。首先,现有的压缩器有不同的设计,很难统一,因此设计这样的框架需要对它们的算法和底层实现进行深入的理解和分析。其次,统一压缩框架中的阶段应该提供不同的变化,以允许对不同的压缩方法进行泛化,这对设计相应的接口提出了挑战。第三,在提供通用性和模块化的同时,很难保留性能,因为优化通常来自特殊性。
论文提出了一个模块化和可组合的框架——SZ3——它可以很容易地按需创建新的错误有界有损压缩器。SZ3 对基于预测的压缩流程进行了模块化抽象,以便可以独立开发和采用模块。具体来说,用户可以通过精心设计的模块自定义压缩流程中的任何阶段,包括预处理、预测、量化、编码和无损压缩。基于这些自定义模块,SZ3 允许用户组合自己的压缩器(或压缩流程)以适应不同的数据特征和要求,从而以最小的努力实现高压缩质量和性能。
二.方法介绍
2.1 总体框架
图1为论文提出的SZ3压缩框架的结构。SZ3的输入是原始的数据(依据SZ3提出的压缩框架,还需要提供各组分的方法函数)最终输出结果为压缩后的数据。SZ3提出的压缩框架共分为数据预处理、预测、量化、编码与压缩等步骤,基于这些自定义模块可组合自己的压缩器。
图1 总体框架图
以下为代码框架与各部分的具体功能:
思路为,先对原始数据d进行预处理,然后对处理后的d的每个元素进行预测,用p接收,令p与原始数据d[i](经预处理后)对比,若可以符合预测效果,则不再进行处理,否则进行量化操作,处理完后得到与原始数据d相对应的数据集q(部分采用预测方式,无法预测的值采用量化存储方式);然后记录预测函数等相关信息以解码时用,并编码处理后的数据q。
2.2 预处理步骤
预处理器用于在实际压缩之前对输入数据集进行处理,以实现高效或满足不同需求。预处理器的主要功能是预处理,它接收原始数据和压缩配置作为输入,并对数据进行原地变换,同时根据需要更改压缩配置。
在这一模块中,常见的方法有:使用对数变换实现点对点相对误差约束;为基于模式的预测器识别合适的参数;不做处理,跳过等。
2.3 预测
预测器是压缩管道中的关键组件,它根据不同的数据模式对数据进行去相关预测。预测器接口包括预测和保存/加载两个重要函数。其中预测函数根据不同的预测算法对输入数据进行预测。它通过多维迭代器获取数据并根据底层预测器的特性输出预测值。预测函数是预测器中最核心的功能,用于提高数据去相关的效果,从而提高压缩效率。而保存/加载函数在压缩和解压过程中起到关键作用。在压缩阶段,保存函数将预测器的必要信息(例如回归预测器的系数)记录下来。在解压阶段,加载函数将用于重建预测器。这两个函数共同保证了压缩和解压过程中预测器的一致性和正确性。
在这一模块中,常见的方法有:Lorenzo预测器及其高阶变换;回归预测器等。
2.4 量化
量化器根据期望的误差上界,依据输入的由预测器产生的数据以及原始数据,输出相应的量化后的处理数据。对在误差范围以内的数据,进行预测存储;而对于无法用预测器存储的数据用较小的可计数集近似来存储,同时保持误差边界。即量化器模块负责编码/解码无法预测的数据(即落在计数集之外的数据)。
在这一模块中,常见的方法有:线性量化器(构建一组等大小的连续区间,每个区间的长度为两倍的误差界限(预测误差将被转换为包含它的区间的索引),超出范围的数据被视为不可预测的,并单独进行编码和存储);对数量化器(将输入数据进行对数缩放来实现更快的编码和存储,用于调整区间大小以实现更集中的分布);元素级量化器(用于为每个数据点提供细粒度误差控制,允许用户为每个数据点设定不同的误差界限,从而实现更精确的误差控制)等。
2.5 编码
编码器是一种无损方案,用于减少量化器生成的整数索引(或符号)的存储。编码器模块涉及两个关键功能:编码和保存/加载。编码函数将量化器生成的量化整数转换为压缩的二进制格式;与其他模块类似,编码器模块还有一个解码函数,在解压缩过程中执行相反的过程。此模块还有保存/加载函数,用于存储/恢复元数据。
在这一模块中,常见的方法有:哈夫曼编码器(一种经典可变长度编码算法);固定哈夫曼编码器(使用预定义的哈夫曼树进行编码)等。
2.6 压缩
无损压缩器是一个独立的模块,可以附加到前面的阶段,以实现对原始数据和复原数据之间误差的进一步减少。无损压缩器可以与最先进的无损压缩器(如ZSTD,GZIP,BLOSC)集成,因为它们提供了可移植的接口。
三.实验
依据数据集的不同特点与要求,通过实现压缩框架中不同步骤的方法,以组合成不同的压缩器。下图为基于SZ3框架实现的一些压缩方法:
3.1 针对GAMESS
GAMESS数据通常由求解薛定谔微分方程的过程中产生。论文依据GAMESS所产生的数据特点,如周期性,特定整数分布等特征,定制了相应的依据SZ3框架的压缩器。特别地,在量化阶段,论文特别注重对不可预测数据的存储,按照位平面的方法,自定义了一种量化器并应用于框架中,优化了SZ-Pastri压缩器。
如图,该压缩器不进行数据预处理,采用基于模式的方式进行预测,应用自定义的量化器,以及固定哈夫曼编码,以及ZSTD压缩方法构成压缩器
在压缩性能对比中,相对其他压缩方式有明显提升。
3.2 针对APS
APS数据是X射线干涉数据,用于高分辨率成像技术,依赖于同步辐射源提供的相干性。
与传统显微技术相比,这种计算方法的微观成像需要更大的数据量和计算资源。为了在数据分析中提高预测效率,论文同样依据APS数据集的特点进行针对设计相应的存储器。如当误差上界相对较高时,为了利用多维相关性而不受到解压缩时噪声的影响,预测器采用多维 Lorenzo 预测器,不然则使用一维的模型(即将数据视为256*256的一维时间序列)。
如图为论文为APS数据定制的压缩器,依据准许误差采用不同的压缩方式。当准许误差超过设定的阈值时,预处理、预测、量化、编码、压缩阶段分别采用不处理,三维Lorenzo与三维回归预测器,自定义的量化器、哈夫曼编码、ZSTD等方式;不然,则采用转置、一维Lorenzo、自定义的量化器、哈夫曼编码、ZSTD等方式进行压缩器的构建。
SZ3-APS在较低的误差范围内具有接近无损的压缩效果,在这种情况下,与其他最佳压缩方法相比,压缩比的提升可达18%和12%。
四.总结
本文介绍了SZ3,一个误差有界的有损压缩算法框架。该框架将压缩过程归纳抽象为几个重要的步骤,为数据预处理,预测,量化,编码和压缩。SZ3对基于预测的压缩流程进行了模块化抽象,以便可以独立开发和采用模块。基于这些可自定义的模块,可以依据不同的数据特征和要求组合为相应的压缩器。文章还基于SZ3的框架,开发了一个针对GAMESS以及APS的压缩器。
五.参考文献
[1] Liang, Xin,Zhao, Kai,Di, Sheng等.SZ3: A Modular Framework for Composing Prediction-Based Error-Bounded Lossy Compressors[J].IEEE TRANSACTIONS ON BIG DATA,2023,(2):485-498.DOI:10.1109/TBDATA.2022.3201176.
贾轲,重庆大学计算机科学与技术专业(卓越)本科二年级在读学生,重庆大学START团队成员。