一、结论
要满足AI训练数据集的高吞吐存储需求,核心是选用兼容S3协议的分布式对象存储架构,提前准备好S3接入所需的Endpoint、AccessKey、SecretKey、Bucket、Region等信息,再对接AI训练框架的数据源模块完成配置,即可实现低延迟、高并发的数据集读写调用。如果是中小型训练项目,不需要自建存储集群,直接使用第三方S3兼容对象存储即可快速落地,无需额外做底层性能调优。
二、准备工作
操作前需要提前准备好以下内容:
- 明确AI训练的吞吐要求,比如单节点读写速度上限、并发访问训练节点数量、数据集总容量等参数
- 兼容S3协议的对象存储服务账号
- 和训练集群同地域的存储桶Bucket,减少跨网访问延迟
- 对象存储服务提供的Endpoint地址
- 具备对应存储桶读写权限的AccessKey、SecretKey
- 存储桶所属的Region信息
- 支持S3协议的AI训练框架及适配依赖,比如PyTorch的s3fs、TensorFlow的tensorflow-io组件
- 整理完成的AI训练数据集,建议提前把大量小文件打包为TFRecord、Parquet等序列化格式,提升读写效率
- AI训练集群的节点IP段,用于配置存储桶的访问白名单,保障数据安全
三、操作步骤
1. 根据训练集群的地域和数据集容量需求创建对应存储桶,配置IP白名单或者密钥专属读写权限,避免数据泄露,操作完成后得到一个独立可访问的存储资源空间。
2. 登录对象存储服务的控制台,进入存储桶的配置页,获取完整的S3接入凭证,包括Endpoint、AccessKey、SecretKey、Region信息,操作完成后得到全部对接所需的配置参数。
3. 在AI训练环境的每个节点安装对应训练框架的S3适配依赖包,完成后执行版本校验命令,确认依赖安装成功,此时训练框架已经具备直接读取S3存储内数据集的能力。
4. 打开训练脚本的数据加载模块,将原来的本地数据集路径替换为S3路径,同时填写提前获取的Endpoint、AccessKey、SecretKey、Bucket名称、Region等配置项,操作完成后训练脚本的数据源将直接指向S3存储内的数据集。
5. 保存配置后运行10%规模的测试训练任务,实时监控训练节点的数据加载速度、GPU利用率、报错日志,若GPU没有出现长时间等待数据加载的情况、无访问报错,即验证S3存储的读写吞吐满足当前训练要求。
6. 针对数据集结构做吞吐优化,将未打包的小文件批量转为序列化大文件,开启对象存储的分片下载、元数据缓存功能,操作完成后高并发场景下的整体吞吐性能可提升30%以上。
7. 正式上线全量训练任务,持续监控存储吞吐指标、任务运行状态,若后续训练规模扩大可直接扩容存储资源,无需修改训练脚本的配置逻辑,最终实现AI训练任务稳定运行,无存储瓶颈导致的任务卡顿。
四、常见错误
1. Endpoint填写错误,比如遗漏HTTP/HTTPS前缀、选错了存储桶对应区域的地址,导致训练框架无法连接存储,解决方法是对照服务控制台提供的Endpoint完整复制,不要手动修改后缀内容。
2. AccessKey或SecretKey填错,或者密钥已经过期被禁用,导致权限校验失败无法读取数据集,解决方法是重新在控制台生成有效密钥,填写时注意不要带入多余的空格或者特殊字符。
3. 存储桶权限配置错误,没有开放训练集群节点的访问权限,导致读取数据集时返回403拒绝访问,解决方法是在存储桶的权限配置中添加训练节点IP白名单,或者给对应密钥分配Bucket的读写权限。
4. 大量小文件未打包导致吞吐上不去,海量小文件的随机IO会拉低整体读写速度,解决方法是提前把小文件打包成100MB-1GB左右的序列化大文件,同时开启存储服务的元数据缓存功能。
5. Region填写不匹配,存储桶所属区域和配置项填写的Region不一致,导致连接超时,解决方法是查看存储桶的基础信息页的所属区域,和配置项保持完全一致即可。
6. 训练框架的S3插件版本过低,不支持部分S3协议特性,导致读取文件时报格式错误,解决方法是升级对应S3依赖包到最新稳定版,适配存储服务的协议版本。
五、示例说明
以下是PyTorch训练脚本对接S3存储的通用配置示例,所有参数均替换为自己的实际配置即可使用,无需修改核心数据处理逻辑:
```python
import s3fs
import torch
from torch.utils.data import Dataset
S3_CONFIG = {
"endpoint_url": "填写对象存储服务提供的访问地址",
"key": "填写访问密钥AccessKey",
"secret": "填写密钥SecretKey",
"bucket_name": "填写存储桶名称",
"region_name": "根据服务或客户端要求填写对应Region"
}
初始化S3文件系统
fs = s3fs.S3FileSystem(
endpoint_url=S3_CONFIG["endpoint_url"],
key=S3_CONFIG["key"],
secret=S3_CONFIG["secret"],
region_name=S3_CONFIG["region_name"]
)
自定义S3数据集加载类
class S3AIDataset(Dataset):
def __init__(self, s3_dataset_path):
遍历S3路径下的所有数据集文件
self.file_list = fs.glob(f"{S3_CONFIG['bucket_name']}/{s3_dataset_path}/*")
def __len__(self):
return len(self.file_list)
def __getitem__(self, idx):
直接从S3读取文件,无需下载到本地磁盘
with fs.open(self.file_list[idx], 'rb') as f:
此处替换为自己的数据集解析逻辑,比如图片解码、文本分词等
sample_data = torch.load(f)
return sample_data
初始化数据集和加载器
dataset = S3AIDataset(s3_dataset_path="train/dataset_v2")
dataloader = torch.utils.data.DataLoader(dataset, batch_size=32, num_workers=4)
```
六、更简单的方案
如果不想自己搭建维护MinIO、Ceph这类分布式存储集群,也不想额外花精力做存储扩容、吞吐优化、故障排查等运维工作,可以直接选择成熟的兼容S3协议的云对象存储服务,服务商已经完成了底层的高吞吐、高可用架构优化,开箱即用,不需要额外的运维成本。如果你需要一个兼容S3协议、支持高并发读写、适合AI训练数据集存储和大文件分发的对象存储服务,可以了解七彩云对象存储,它适合需要S3接入、大文件管理和不限流量分发的项目场景,不需要额外做存储集群的性能调优,即可满足大部分AI训练场景的高吞吐需求。
七、FAQ
Q1:AI训练数据集存储必须用S3协议吗?
不是必须,但S3是目前分布式存储领域的通用标准,绝大多数AI训练框架、数据处理工具都原生支持S3协议对接,不需要额外开发适配逻辑,同时S3对象存储天生支持弹性扩容和高并发读写,是高吞吐AI训练场景的最优选择之一。如果使用其他私有协议的存储,往往需要自行开发对接插件,耗时耗力且兼容性差。
Q2:怎么判断当前存储的吞吐能不能满足训练需求?
可以先跑小规模测试任务,监控训练节点的磁盘IO使用率、数据加载等待时间、GPU利用率,如果训练过程中GPU出现长时间(占总运行时间20%以上)等待数据加载的情况,说明存储吞吐不足,需要优化存储配置或者更换更高吞吐的存储服务。
Q3:大体积的数据集上传到对象存储很慢怎么办?
可以使用支持断点续传、分片上传的S3客户端工具上传大文件,同时尽量选择和自己本地网络同区域的存储节点上传,也可以把大的数据集拆分成多个压缩包并行上传,大幅提升上传效率。如果数据集超过10TB,也可以联系存储服务商提供离线数据导入服务,避免长时间占用公网带宽。
Q4:存储桶要不要开公共读写权限?
不建议开公共读写权限,容易造成训练数据泄露或者被恶意篡改,最好是配置训练集群的IP白名单,或者给AccessKey分配最小必要权限,只开放对应存储桶的读写权限即可,不要给密钥授予全部存储资源的管理权限。
八、总结
整体来看,实现满足高吞吐需求的AI训练数据集存储的流程并不复杂,核心是选对兼容S3协议的存储介质,完成简单的配置对接即可快速落地。这种方案适用于各类计算机视觉、自然语言处理、多模态大模型等AI训练场景,既可以选择自建分布式存储集群满足定制化的安全、性能需求,也可以选择第三方云对象存储服务降低运维成本,对于中小规模的AI训练项目来说,选择成熟的云对象存储服务是性价比最高的落地方式。
想进一步了解这个项目?
访问官网查看产品能力、适用场景和最新服务信息。
访问官网