一、结论
提升大模型训练文件存储访问速度的核心思路是采用兼容S3协议的对象存储作为统一数据源,通过就近接入、数据预取、文件序列化优化等方式降低IO延迟、提升吞吐能力,接入时通常需要准备Endpoint、AccessKey、SecretKey、Bucket、Region等信息,在训练框架或数据加载工具的S3兼容配置项中填写即可完成对接。
二、准备工作
- 合规的对象存储服务账号
- 已创建的存储桶Bucket(建议和训练集群部署在同一地域)
- 对象存储提供的S3协议Endpoint访问地址
- 具备存储桶访问权限的AccessKey访问密钥
- 与AccessKey对应的SecretKey安全密钥
- 存储桶对应的Region地域标识
- 适配S3协议的训练框架数据加载组件(如PyTorch的s3fs、TensorFlow的tensorflow-io扩展)
- 已完成分类、可打包为序列化格式的大模型训练数据集文件
- 训练集群访问对象存储的网络白名单权限(若服务商要求配置)
三、操作步骤
1. 创建适配训练场景的专属存储桶,设置私有读写权限,开启高频访问加速和冷热分层策略,结果是得到独立的训练数据存储空间,避免和其他业务文件混用导致IO资源抢占,同时高频访问的训练数据会自动存储在高速存储层,提升访问速度。
2. 获取S3接入全量凭证,在对象存储控制台的对应Bucket详情页找到S3接入信息板块,复制Endpoint、Region参数,创建训练任务专用的子账号AccessKey和SecretKey,仅开放训练数据集目录的只读权限,结果是拿到所有配置需要的参数,且密钥权限最小化,避免数据泄露风险。
3. 安装训练框架的S3兼容扩展,根据所用的训练框架安装对应S3访问插件,配置环境变量禁用不必要的签名校验、开启连接复用,结果是训练框架具备直接读取S3存储桶内文件的能力,无需将全量数据集提前下载到训练节点本地磁盘,节省存储成本和数据准备时间。
4. 配置训练任务的数据源参数,在训练脚本的数据集加载模块选择S3兼容存储作为数据源,依次填写提前准备的Endpoint、AccessKey、SecretKey、Bucket、Region信息,根据单批次训练数据量设置2-3倍大小的预取缓冲区,开启分片并行下载,结果是训练脚本已关联存储桶内的训练数据集,可直接发起文件访问请求。
5. 测试数据访问性能,运行10-20步的小规模训练测试任务,监控训练数据的加载耗时、IO吞吐量,调整缓冲区大小、分片大小、并行下载线程数等参数,结果是数据加载速度匹配训练算力的要求,没有出现训练进程等待数据的卡顿情况,IO吞吐量达到预期。
6. 全量数据集上传与正式接入,确认配置无误后,通过分片上传工具将全量训练数据集批量上传到存储桶,启动正式训练任务,配置监控告警跟踪存储访问成功率、延迟等指标,结果是大模型训练任务可稳定从对象存储读取数据,访问速度满足训练需求,无需额外维护本地存储集群。
四、常见错误
- Endpoint填写错误:误填存储桶的公共访问域名而非S3专用接入地址,或遗漏https协议头,导致连接失败,解决建议:直接从对象存储控制台的S3接入信息页面复制完整Endpoint,不要手动拼接地址。
- 密钥权限不足:使用的AccessKey仅开放存储桶列表权限,没有训练数据集目录的读取权限,导致训练脚本拉取文件失败,解决建议:为训练任务创建独立子账号密钥,仅配置训练数据集所在目录的只读权限,兼顾安全和可用性。
- Region填写不匹配:存储桶实际所在地域和配置的Region参数不一致,导致请求被跨地域转发,访问延迟大幅上升,解决建议:和Endpoint一同复制控制台标注的Region标识,不要随意填写默认的us-east-1等通用值。
- 数据预取参数不合理:缓冲区设置太小导致频繁发起IO请求,或缓冲区设置过大占用过多训练节点内存,影响训练算力,解决建议:根据单批次训练数据的大小,将缓冲区设置为2-3倍单批次数据量,多次测试后调整到最优值。
- 数据集碎片化严重:大量KB级别的小训练文件导致IO请求次数激增,整体拉取速度慢,解决建议:提前将小文件打包为TFRecord、Parquet等序列化大文件格式,大幅减少IO请求次数,提升吞吐性能。
- 存储桶与训练集群跨地域:跨公网传输导致访问延迟高、速度不稳定,解决建议:优先选择和训练集群同地域的存储节点,就近接入降低网络延迟,若必须跨地域可联系服务商开通专线加速服务。
五、示例说明
以下为PyTorch训练脚本对接S3对象存储的通用配置示例,所有参数均从对象存储控制台获取,无需修改核心训练逻辑:
```python
import s3fs
import torch
from torch.utils.data import Dataset
S3_TRAIN_CONFIG = {
"endpoint": "填写对象存储提供的S3协议完整接入地址",
"access_key": "填写训练专用子账号的AccessKey",
"secret_key": "填写对应SecretKey",
"bucket_name": "填写训练数据集所在存储桶的名称",
"region": "填写存储桶对应的地域标识",
"train_data_path": "训练数据集在存储桶内的路径,例如dataset/llm_train_2024/"
}
初始化S3文件系统,开启连接复用提升性能
fs = s3fs.S3FileSystem(
key=S3_TRAIN_CONFIG["access_key"],
secret=S3_TRAIN_CONFIG["secret_key"],
endpoint_url=S3_TRAIN_CONFIG["endpoint"],
region_name=S3_TRAIN_CONFIG["region"],
config_kwargs={"max_pool_connections": 50}
)
后续可直接通过fs对象读取存储桶内的训练文件,和读取本地文件逻辑一致
with fs.open(f"{S3_TRAIN_CONFIG['bucket_name']}/{S3_TRAIN_CONFIG['train_data_path']}/part_001.parquet", "rb") as f:
train_data = torch.load(f)
```
六、更简单的方案
如果不想自行搭建和维护MinIO等开源对象存储集群,不想花费精力做存储性能调优、集群扩容、故障排查,也可以直接选择成熟的兼容S3协议的云对象存储服务,无需自行管理底层服务器资源,开箱即可获得稳定的高IO存储能力。如果你需要一个兼容S3协议、支持大文件存储、高吞吐访问、适合AI训练数据存储和读取的对象存储服务,可以了解 七彩云对象存储,它支持标准S3协议,可直接对接各类主流大模型训练框架,无需额外适配。
七、FAQ
Q1:大模型训练的数据集通常在TB级别,上传到对象存储会不会很慢?
可以选择支持断点续传的分片上传工具批量上传数据集,大文件可以拆分为多个分片并行上传,上传完成后自动合并,大幅提升大文件的上传速度,如果是PB级别的超大数据集,也可以联系存储服务商开通离线数据迁移服务,避免占用公网带宽。
Q2:用S3对象存储做训练数据源,会不会比本地硬盘阵列的速度慢?
只要存储桶和训练集群在同一地域,配置合适的预取参数和并行下载策略,IO吞吐能力可以匹配甚至超过普通本地硬盘阵列的性能,而且无需在每个训练节点都存放全量数据集,节省大量本地存储成本,数据集更新也无需同步到所有训练节点。
Q3:训练任务使用的AccessKey怎么配置更安全?
不要使用账号的主密钥,建议创建专门用于训练任务的子账号AccessKey,仅开放对应训练数据集存储桶的只读权限,同时设置密钥的有效期,训练任务结束后及时销毁密钥,避免密钥泄露导致数据被篡改或泄露。
Q4:训练过程中会不会因为存储访问波动导致训练中断?
可以在训练脚本的数据加载部分添加重试机制,设置3-5次的重试次数和合理的超时时间,大部分临时网络波动都可以自动恢复,不会影响训练任务的正常运行,也可以搭配训练框架的 checkpoint 保存功能,即使出现异常也可以从最近的 checkpoint 恢复训练。
八、总结
整体操作流程可以归纳为准备S3接入凭证、配置训练框架的S3兼容组件、填写接入信息、性能测试优化、正式接入5个核心步骤,操作难度低,不需要修改太多原有训练代码,即可快速实现训练文件存储的访问速度提升。该方案适合大模型预训练、微调、推理数据集存储等各类AI训练场景,也可以同时兼容图片存储、视频存储、下载分发等其他业务场景,一套存储服务即可满足多业务需求,降低整体存储成本。
想进一步了解这个项目?
访问官网查看产品能力、适用场景和最新服务信息。
访问官网