tmpfs 通过将参数缓存、梯度暂存等置于内存文件系统,消除磁盘 I/O 瓶颈,使分布式训练参数交换逼近内存带宽极限;实操需挂载 /dev/shm、/tmp 及自定义缓存路径,并协同调优内核与框架参数。
tmpfs 本身不直接实现“零等待参数交换”,但它能为分布式深度学习中高频、低延迟的参数同步环节提供关键基础设施支持——通过将参数缓存、梯度暂存或通信中间状态置于内存文件系统,显著消除磁盘 i/o 瓶颈,使参数交换真正逼近内存带宽极限。
为什么 tmpfs 对分布式训练参数交换有实质价值
在数据并行训练(如 PyTorch DDP、Horovod)中,各 worker 进程需频繁同步模型梯度或参数。若使用默认临时目录(如 /tmp)且其挂载在磁盘上,梯度聚合、检查点写入、NCCL 共享内存段初始化等操作会受磁盘延迟拖累。而 tmpfs 将这些路径映射到 RAM,使:
- 梯度归约中间缓冲区(如 NCCL 的 shm 段)读写延迟降至纳秒级
- 检查点临时写入(torch.save(..., _use_new_zipfile_serialization=False) 的临时解包)免于磁盘排队
- 多进程共享的参数快照目录(如用于弹性训练的 state dict 缓存)具备原子性与高吞吐
实操:用 tmpfs 优化关键路径的三类挂载
不是所有目录都适合 tmpfs,重点覆盖以下三类高频、非持久、易争用的路径:
-
/dev/shm:NCCL 默认依赖此路径创建共享内存段。Docker 容器默认仅 64MB,远低于大模型梯度同步需求。启动时必须显式扩大:
docker run --shm-size=2g --name trainer ... -
/tmp:PyTorch 分布式训练常在此生成临时 checkpoint 或序列化缓冲。挂载为 tmpfs 可避免磁盘阻塞:
--tmpfs /tmp:rw,noexec,nosuid,size=1g,mode=1777 -
自定义缓存路径(如 /app/grad_cache):供训练脚本主动存放分片梯度或动量缓存,配合 torch.save(..., _use_new_zipfile_serialization=True) 写入内存文件系统,再由主进程统一拉取:
--tmpfs /app/grad_cache:rw,size=4g
必须配合的内核与框架调优
仅挂载 tmpfs 不足以释放全部潜力,还需协同调整:
- 关闭 swap 干扰:sysctl vm.swappiness=1,防止梯度页被换出
- 提升 shmem 页面限额:echo 2147483648 > /proc/sys/kernel/shmmax(2GB)
- PyTorch 中显式指定 NCCL 共享内存路径:
os.environ["NCCL_SHM_DIR"] = "/dev/shm"(确保与挂载路径一致) - 禁用 Python 的默认临时目录缓存:
os.environ["TMPDIR"] = "/tmp",避免意外落盘
注意事项与边界条件
tmpfs 是加速手段,不是万能方案:
- 不适用于模型权重持久化保存——最终 checkpoint 必须写入 volume 或对象存储
- 容器崩溃时 tmpfs 数据立即丢失,因此不能替代容错机制(如 ZeRO-Offload 的 CPU 内存备份)
- size 参数必须预留余量:梯度张量总大小 + NCCL 预分配段 + Python GC 临时对象,建议按 GPU 显存的 1.5 倍预估
- 仅限 Linux 主机;macOS/Windows Docker Desktop 使用虚拟机层,tmpfs 实际仍经虚拟化 I/O 路径,收益大幅衰减

















