在进行大规模机器学习或深度学习项目时,数据的高效加载与处理是提升整体训练效率的关键因素之一。本文通过对比分析在使用OSS内网域名与启用OSS加速器的情况下,不同数据集构建方法(OssIterableDataset、OssMapDataset、结合Ossfs和ImageFolder)的性能差异,旨在为用户提供数据访问策略的优化指南。
测试说明
测试场景:通过在使用OSS内网域名以及使用OSS加速器域名这两种场景下,针对以不同方式构建的数据集读取OSS数据的情况进行了性能以及性能上限测试。
测试数据:10,000,000张图片,平均每张100 KB,总量约1 TB。
测试环境:网络增强通用型实例规格族g7nex,128 VCPU,512G内存,160 Gbps内网带宽。
测试数据集构建方式:OssIterableDataset与OssMapDataset类型的数据集由OSS Connector for AI/ML构建;Ossfs with ImageFolder类型的数据集则使用ossfs挂载远程Bucket的方式构建。
性能测试
测试参数
参数
值/操作
说明
dataloader batch size
256
每次处理的数据批次大小为256个样本。
dataloader workers
32
使用32个工作进程来并行加载数据。
transform
trans = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) ]) def transform(object): img = Image.open(io.BytesIO(object.read())).convert('RGB') val = trans(img) return val, object.label
对数据进行了预处理。
测试结果
数据集构建方式
数据集类型
使用OSS内网域名
启用OSS加速器预载数据,并使用加速域名访问
OSS Connector for AI/ML方式构建
OssIterableDataset
4582 img/s
4744 img/s
OssMapDataset
4010 img/s
4370 img/s
ossfs挂载远程Bucket方式构建
Ossfs with ImageFolder
56 img/s
251 img/s
性能上限测试
测试参数
参数
值/操作
说明
dataloader batch size
256
每次处理的数据批次大小为256个样本。
dataloader workers
32
使用32 个工作进程来并行加载数据。
transform
def transform(object): data = object.read() return object.key, object.label
未对数据进行预处理。
测试结果
数据集构建方式
数据集类型
使用OSS内网域名
启用OSS加速器预载数据,并使用加速域名访问
OSS Connector for AI/ML方式构建
OssIterableDataset
99920 img/s
123043 img/s
OssMapDataset
56564 img/s
78264 img/s
数据分析
从性能测试结果数据能够看到,使用OSS Connector构建的IterableDataset和MapDataset这两种类型的数据集性能,大约是传统数据集Ossfs with ImageFolder的80倍。即便在都启用OSS加速器的情况下,也相差约18倍。通过这样的对比,可以明显看出,使用OSS Connector能够极大地提高数据处理速度,提升模型训练效率。
从性能上限测试结果数据来看,启用OSS加速器之后的性能,大约是不启用OSS加速器的1.6倍左右。OSS Connector在不使用OSS加速器的情况下,能够轻松应对各种高并发、高带宽访问。而配合使用OSS加速器后,其性能则更为强大。
测试总结
在 Python代码中设置OSS Connector for AI/ML,就能轻松实现对OSS对象的流式访问。通常情况下,使用OSS Connector可以极大地提升我们在大数据量训练场景中的数据访问效率。倘若对性能有更高的要求,则可以采用OSS加速器与OSS Connector for AI/ML相结合的方式来进行数据训练。