随着AI 工作负载的盛行,如何提高内存和存储空间的使用量,成为一个需要探索的问题。数据压缩,作为一个长久存在的技术点,很自然地出现在大家的眼前。确实,压缩算法在优化AI 工作负载的内存和存储空间的使用方面起着至关重要的作用,尤其是在大规模深度学习模型中。压缩算法的选择会显著影响AI 工作负载的性能,既影响内存和存储的使用量,又影响着计算的效率。
更重要的是,数据的高效存取以及数据的跨模块和跨节点流转不仅是AI工作负载性能的重要指标,也是常见的分布式存储、分布式计算的基本需求。通过压缩,针对结构化、半结构化、非结构化的各种数据,可以带来相应的压缩效率,既节省了内存和存储空间,又节省了数据在网络上的传输大小。
今天给大家带来的是SPDK通过Compress Bdev块设备,既可以通过QAT硬件加速器来提升数据压缩,也可以通过ISA-L软件指令来高效压缩。
压缩的常见场景:
存算分离的架构,数据压缩既可以在计算侧,在通过网络发送前。也可以在存储服务接收端,在落盘前。
图1:典型的存算分离的架构[1]
超融合架构,数据压缩主要在本地落盘前。
图2:典型的超融合的架构[2]
以上两种常见的存储架构中,都是通过SPDK作为存储服务来完成加速的。其中,SPDK的存储服务中的Bdev(用户态通用块设备),既可以对本地存储设备(NVMe SSD)的支持,也可以对网络存储设备(iSCSI LUN, NVMe-oF等)的支持。出于对不同存储形态的支持,SPDK对于压缩功能的实现,是在Bdev这个层面上,简单来说,通过适当的配置,给Bdev带上了*压缩*的属性,数据到达*使能*了压缩的Bdev,就会调用硬件QAT或者软件ISA-L来完成在线实时的压缩。
SPDK的压缩支持的主要实现如下图:
图3:SPDK的压缩支持[3]
其中的几个主要部分:
§ISA-L和QAT的压缩能力,不同的压缩算法和压缩层级。ISA-L更多是通过CPU指令的支持来实现高性能的压缩,需要使用到一定量的CPU算力。QAT更多是通过API把压缩卸载到专门的硬件加速器上,支持批量异步压缩。
§元数据管理。在之前的实现中,SPDK压缩Bdev的元数据存储在Persistent Memory之上。当出现了新的持久化内存介质和方案后(CXL 2.0),可以很容易地来支持。对于具备高性能文件系统的场景下,同样可以把元数据放在本地文件系统之上。这块欢迎大家积极参与,有没有更合适的方式来支持元数据的存取。
下图简单概括了下在最新第六代英特尔® 至强® 可扩展处理器上QAT针对存储,尤其压缩在相关场景中的优势。
图4:QAT针对存储带来优势
在最近的SPDK v24.09发布中,感谢我们的合作伙伴新浪微博,主要来自本文的作者Li Yankun和Wang Yalong,提交了诸多关于SPDK Compress Bdev以及Libreduce的代码来完善和加强这个重要模块。主要涉及到稳定性,比如内存不够等异常处理,性能提升像连续IO聚合,以及安全性和易用性包括更多压缩信息的输入输出等等。
在这里,再次感谢合作伙伴的贡献,也期待更多的社区伙伴把SPDK Compress块设备以及QAT压缩的问题和需求反馈给到我们,以便继续优化和完善对应的功能,把压缩的能力落实到具体的业务环境中。
图5:接近80%,对于SPDK通过QAT压缩感兴趣[4]
对于SPDK压缩感兴趣的合作伙伴,可以通过下面参考文献中最后提到的compress.sh脚本以及spdk.io上的文档来尝试评估,有任何问题,欢迎留言联系。同时,从第四代英特尔® 至强® 可扩展处理器开始,已经内置了QAT加速器,提供更多的便利性。
作者简介:
Li, Yankun: 新浪微博软件开发资深工程师
Wang, Yalong: 新浪微博软件开发工程师
Zhang, Min: 英特尔资深存储工程师
Cao, Gang: 英特尔存储架构师,国内SPDK负责人
参考文献:
转载须知
推荐阅读
北京峰会系列一|SQUEEZING COMPRESSION AND ENCRYPTION INTO SPDK
往期阅读
使用NTB加速基于NVMe-oF的边缘小规模存储集群的数据传输
SPDK FIO Bdev Plugin支持RPC,让资源管理面更容易