Plug-and-Play Optimal Page Replacement Algorithm (OPT) for Torch Dataset
OPT (Optimal Page Replacement Algorithm) 是理论最优的页面替换算法,也被称为 Bélády's algorithm。 它需要预知未来的访问模式来决定当前应该替换缓存中的哪个数据项,从而达到最大的缓存命中率。
- OPT需要知道未来的访问序列
- 理论最佳的缓存命中率
- 总是替换"在未来最晚被访问"的数据项
在深度学习训练中,数据访问模式通常是可预测的(由采样器决定),这使得我们能够将OPT算法应用于深度学习训练中:
- 提升数据加载速度
- 提高缓存命中率,比LRU、LFU等缓存算法更高效
本项目已完成多进程环境(num_workers > 0)下的完全适配:
- Shared OPT Cache: 通过
SharedOPTCacheDecorator实现跨进程式的高效共享缓存。它利用共享内存技术,确保所有数据加载进程访问同一个缓存池,最大化利用内存并显著降低样本生成的计算开销。 - Picklable Caches: 所有的传统缓存(LRU, LFU, FIFO, RR)现在均通过
CachetoolsDecorator进行了序列化适配,可以在 Windows 等系统的spawn模式下正常运行,不再报PicklingError。 - 计算优势: 在 CPU 变换逻辑复杂(如高分辨率图像增强)的场景下,即使有并行预加载,OPT 缓存依然能通过消除重复计算带来客观的性能提升。
pip install OPT4TorchDataset目前,我们尚未将wheel包推送至pypi,所以该方法无法使用。 你可以先前往我们的Github Actions页面,获取自动构建的whl包手动安装。
from OPT4TorchDataSet import generate_precomputed_file, get_opt_cache
from torch.utils.data import DataLoader
# Step 1: 离线生成预计算文件(一次性)
generate_precomputed_file(
dataset_size=10000,
total_iterations=100000,
persist_path="precomputed/my_plan.safetensors",
random_seed=0,
maxsize=3000
)
# Step 2: 运行时创建缓存装饰器(智能模式:自动处理单进程/多进程)
# num_workers=0 会自动使用高性能 Python 版
# num_workers>0 会自动使用共享内存 C++ 版
dataset = MyDataset()
dataset.cache = get_opt_cache(
num_workers=0,
precomputed_path="precomputed/my_plan.safetensors",
maxsize=3000,
total_iter=100000, # Python 模式需要
dataset_size=10000, # 共享内存 (C++) 模式需要
item_shape=(3, 224, 224) # 共享内存 (C++) 模式需要
)
# Step 3: 应用到数据集
dataset.__getitem__ = dataset.cache(dataset.__getitem__)
# 使用数据加载器
dataloader = DataLoader(dataset, batch_size=32, num_workers=0)
for batch in dataloader:
passpython -m src.OPT4TorchDataSet.cli \
--dataset-size 10000 \
--total-iter 100000 \
--output precomputed/my_experiment.safetensors \
--seed 0--dataset-size: 必需。数据集大小--total-iter: 必需。预计算的总访问次数--output: 必需。保存预计算结果的文件路径(.safetensors格式)--seed: 随机种子,确保结果可重现(可选)--no-replacement: 禁用有放回采样(可选)
如果你没有安装包,而是直接使用源码,可以通过以下方式启动CLI:
# 在项目根目录下
python -m src.OPT4TorchDataSet.cli \
--total-iter 100000 \
--output ./precomputed/imagenet_opt.safetensors \
--seed 42| 操作系统 | CUDA版本 | GPU型号 | SM架构 |
|---|---|---|---|
| Ubuntu 24.04 | 12.8.2 | H800 | sm90 |
| Windows 11 | 12.9.1 | NVIDIA 4060Ti | sm89 |
| Windows 11 | 13.0.2 | NVIDIA 4060Ti | sm89 |
创建 Conda 环境
uv venv --python 3.14
.venv\Scripts\activate.ps1
uv pip install torch torchvision --index-url https://download.pytorch.org/whl/cu128
uv pip install -r requirements.txt
uv pip install -U "triton-windows" # Windows 系统可选选择 GPU 设备
export CUDA_VISIBLE_DEVICES=0设置 Hugging Face 镜像(提升下载速度)
$env:HF_ENDPOINT = "https://hf-mirror.com" # 在 Windows 上uv pip install build
uv python -m build所有实验结果均以 JSON 文件形式保存在各个实验目录下的 results/ 子目录中。
| Model | FIFO Time(s) | LFU Time(s) | LRU Time(s) | OPT Time(s) | RR Time(s) | none Time(s) | warmUp Time(s) |
|---|---|---|---|---|---|---|---|
| convnextv2_base | 179.1515 | 167.4298 | 149.3036 | 136.9226 | 163.4252 | 195.6518 | 159.9803 |
| davit_base | 118.902 | 118.8557 | 711.6681 | 82.9771 | 132.2939 | 120.6464 | 137.6575 |
| mobilenetv3_small_100 | 97.6476 | 95.3437 | 82.9322 | 47.3384 | 69.0704 | 103.9736 | 112.7548 |
| mobilenetv5_base | 168.7884 | 166.6462 | 171.9088 | 150.2256 | 172.5975 | 189.045 | 230.02 |
| resnet50 | 65.3436 | 71.7038 | 69.5199 | 42.7169 | 69.1713 | 84.1985 | 73.032 |
| swin_base_patch4_window7_224 | 126.8982 | 137.4744 | 155.4214 | 85.9536 | 114.0388 | 125.5925 | 140.2842 |
| swinv2_cr_base_224 | 126.8298 | 156.9438 | 181.8895 | 104.4104 | 182.2423 | 191.7603 | 158.8843 |
| vit_base_patch16_224 | 115.6438 | 98.5015 | 105.8998 | 67.547 | 116.7467 | 127.2664 | 108.5507 |
| vit_base_patch16_dinov3 | 94.6338 | 97.7933 | 124.6119 | 96.1758 | 91.3743 | 160.4503 | 135.4348 |
Batch Size: 16 | Num Workers: 0 | AMP Enabled: TRUE | Epochs: 5 | Cache Size Ratio: 0.3