NVMe
NVMe(Non-Volatile Memory Express)是面向闪存的块设备协议。它常通过 PCIe 直连主机,为并行闪存重新设计了命令队列,取代了为机械硬盘设计的 SATA/SAS 协议。它常用于训练节点的本地高速缓存、数据分片暂存和检查点落盘。规范见 NVM Express。
快速开始¶
用 lsblk 确认设备,用 df -hT 确认挂载点:
把可重新生成的数据缓存到本地 NVMe,而不是把唯一副本放在本地盘。训练进程应使用每个节点独立的缓存目录,避免多节点共享同一路径造成竞争。
为什么适合训练缓存¶
NVMe 通过 PCIe 连接,支持多队列和较高并发:规范定义提交队列 (Submission Queue) 与完成队列 (Completion Queue),允许数千条 I/O 并行排队,具体队列数与深度以官方规范为准。顺序读取已打包的数据分片时,通常能减少数据加载器等待;随机读取海量小文件时,文件系统元数据仍可能成为瓶颈。在带宽未饱和时,吞吐近似满足:
可见小 I/O 需要很高 IOPS 才能吃满带宽,这也是打包分片、做大块顺序读的原因。
数据布局¶
将样本预处理为较大的 shard,并按节点预取热 shard。缓存键应包含数据版本、预处理参数和分词器版本;空间不足时按可重建性淘汰,不能误删检查点唯一副本。顺序读、按需淘汰、可重建性三者共同决定缓存能否长期保持高命中率。
案例:节点本地预取¶
训练开始前,调度器为每个节点分配不同的数据 shard,并从共享存储复制到 /local-cache/dataset-v3/。数据加载器优先读取本地路径,未命中时回源下载并校验哈希。这样既避免所有 worker 打满远程存储,也可在节点失效后由其他节点重建缓存。
常见问题¶
不要把 NVMe 带宽等同于端到端吞吐:解压、CPU 解码、DataLoader worker 数和 PCIe 争用都会限制速度。监控磁盘使用率、读写延迟、缓存命中率和数据等待时间,端到端吞吐才是最终评价标准。