MRL数据准备实战:用FFCV快速序列化ImageNet的完整指南(含write_imagenet.sh参数详解)
【免费下载链接】MRLCode repository for the paper - "Matryoshka Representation Learning"项目地址: https://gitcode.com/gh_mirrors/mrl/MRL
MRL(Matryoshka Representation Learning,套娃表示学习)是论文《Matryoshka Representation Learning》的官方开源代码仓库。在开始训练 MRL 模型之前,第一步就是完成ImageNet 数据准备——项目采用 FFCV 高速数据加载框架,本文带你一步步用write_imagenet.sh脚本把 ImageNet 磁盘数据集序列化(serialize)成.ffcv高速读取文件,并逐一详解脚本的三个关键参数。
🧩 先看懂 MRL:为什么数据准备这么重要?
MRL 的核心思想一句话概括:只训练一个 2048 维的表示向量,而它的任意前缀维度(8 / 16 / 32 … 2048 维)也都能独立使用,就像俄罗斯套娃一样层层嵌套。推理时你可以按算力预算自由选择维度长度:
- 自适应分类:模型级联(model cascades),维度逐级增加
- 自适应检索:低维度先召回短名单,再高维度重排(funnel retrieval)
为了让训练不被数据 I/O 拖慢,项目没有使用传统的 PyTorchDataLoader,而是引入了FFCV(Faster 视觉数据加载框架)。代价是:需要先把"几万个小文件"形式的 ImageNet一次性序列化成单个二进制文件,之后训练读取速度接近纯内存。数据准备就是干这件事的。
📥 第一步:准备 PyTorch 格式的 ImageNet 数据集
序列化脚本的输入是一个 PyTorch 风格的 ImageNet 目录,即包含train/和val/两个子目录、每个类别一个文件夹、内部存放 JPEG 图片的标准布局。拿到数据集后,用环境变量IMAGENET_DIR指向它即可。
⚙️ 第二步:运行 write_imagenet.sh 完成序列化
如需获取代码,先克隆项目:
git clone https://gitcode.com/gh_mirrors/mrl/MRL然后安装依赖、设置环境变量并执行序列化:
pip3 install -r requirements.txt cd train/ export IMAGENET_DIR=/path/to/imagenet/ # PyTorch格式ImageNet根目录 export WRITE_DIR=/your/path/here/ # .ffcv文件输出目录 ./write_imagenet.sh 500 0.50 90write_imagenet.sh 三个参数逐个拆解
./write_imagenet.sh 500 0.50 90的三个位置参数决定了图片的存储方式:
| 参数 | 示例值 | 含义 | 官方取值 |
|---|---|---|---|
| 第 1 个 | 500 | 图片最大边长(像素) | 500(匹配 ResNet50 训练配置) |
| 第 2 个 | 0.50 | 以 JPEG 压缩存储的图片比例 | 训练 0.50 / 验证 0 |
| 第 3 个 | 90 | JPEG 压缩质量 | 90 |
几个容易踩坑的点:
- 混合存储策略:第 2 个参数为 0.5 时,FFCV 会以 50% 概率把每张图片存成 JPEG、50% 存成原始像素值。这是 FFCV 官方推荐配置——JPEG 省磁盘且读取快,原始存储则在强数据增强下保留完整像素信息。
- 输出文件名有规律:脚本会在
WRITE_DIR下生成train_500_0.50_90.ffcv和val_500_0.50_90.ffcv两个文件(格式为{split}_{边长}_{JPEG比例}_{质量}.ffcv)。官方训练命令还引用了val_500_uncompressed.ffcv(验证集、0% JPEG 不压缩),可以再跑一次脚本并将第 2 个参数设为 0 获得。 - 预留磁盘空间:序列化后的文件体积较大,务必确认
WRITE_DIR所在磁盘空间充足。
脚本内部到底做了什么?
train/write_imagenet.sh是 train/write_imagenet.py 的薄封装,内部流程分三步:
- 用
ImageFolder读取IMAGENET_DIR/{train|val}下的 PyTorch 格式数据集; - 构建 FFCV
DatasetWriter,定义两个字段:RGBImageField(图片,携带边长/压缩率/质量设置)和IntField(类别标签); - 以16 个 worker 并行、每次 100 张(
chunk_size=100)为批次写入.ffcv文件,num_workers与chunk_size均可通过write_imagenet.py的--cfg.参数调整。
💡 小技巧:不必每次跑完 128 万张全量图像来验证流程,给write_imagenet.py追加--cfg.subset=10000只写前 1 万张,几分钟即可打通整条数据管线。
🚀 第三步:用序列化好的数据开始训练
.ffcv文件就绪后,只需把它们指给训练命令。项目提供了 40 个 epoch 的 ResNet50 标准配置 train/rn50_configs/rn50_40_epochs.yaml(batch_size 512、SGD、cyclic 学习率),训练 MRL 模型的命令如下:
python train_imagenet.py --config-file rn50_configs/rn50_40_epochs.yaml --model.mrl=1 \ --data.train_dataset=$WRITE_DIR/train_500_0.50_90.ffcv \ --data.val_dataset=$WRITE_DIR/val_500_uncompressed.ffcv \ --data.num_workers=12 --data.in_memory=1 --dist.world_size=2 \ --training.distributed=1 --lr.lr=0.425得益于 FFCV 序列化数据与内存驻留(--data.in_memory=1),GPU 不再空等 I/O。最终训出的 MRL ResNet50 的 Top-1 准确率曲线见下图(摘自项目文档):即便截断到 16 维低维度,准确率仍接近 73%,与 2048 全维度几乎持平——这就是 MRL 数据管线最终服务的目标。
✅ 常见问题 FAQ
- 可以跳过 FFCV 直接读原始 ImageNet 训练吗?可以,但官方结果基于 FFCV 管线(500px、50% JPEG 的数据分布),跳过后结果难以与论文对齐。
- 序列化耗时多久?取决于磁盘与 CPU 性能,脚本默认 16 个 worker 并行写入,SSD 上明显快于机械硬盘。
- 训练产物在哪里?模型 checkpoint 与训练日志默认按
--logging.folder(如trainlogs)目录落盘,$WRITE_DIR与创建数据集时使用的是同一个变量。 - 数据准备后还能做什么?训练完成后可在 inference/ 目录评估分类精度、在 model_analysis/ 目录做 GradCAM 等可视化分析、在 retrieval/ 目录做自适应检索实验。
按上面的步骤完成 ImageNet 序列化后,你就拥有了和论文完全一致的高速数据管线,可以放心开启 MRL 训练了 🚀
【免费下载链接】MRLCode repository for the paper - "Matryoshka Representation Learning"项目地址: https://gitcode.com/gh_mirrors/mrl/MRL
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考