如果你曾经使用过Python(比如50GB边集列表)处理大数据集,你一定了解到"内存墙"(Memory Wall)。通过Pandas或标准的Python结构加载它通常会在你甚至没有做任何数学运算之前立即引发24GB+OOM(OOM:Out-Of-Memory)分配崩溃。
所以我创建了 GraphZero (v0.2) 来完全绕过Python的内存开销。
什么是我的项目
GraphZero是一个C++数据引擎,它能够通过PyTorch直接从SSD将数据流入-python,而无需将它们装入RAM。
相反于解析巨大的CSV文件并将其加载到Python内存中,引擎将原始数据编译成高度优化的二进制格式(.gl和.gd)并使用POSIX mmap将文件从SSD直接映射到内存中。
nanobind的魔法在于:我会直接拿到原始C++指针并将其暴露给Python作为零拷贝NumPy数组。
import graphzero as gz
import torch
# 1.Mount零拷贝引擎
fs = gz.FeatureStore("papers100M_features.gd")
# 2.即刻将SSD数据映射到PyTorch(RAM占用:0字节)
X = torch.from_numpy(fs.get_tensor())
在训练循环中,Python认为它有一个50GB的张量存放在RAM中。当你索引它时,它会触发一个OS Page Fault,操作系统会自动从NVMe驱动器中抓取仅仅所需的4KB块。C++侧使用OpenMP并行采样数据,显式释放Python GIL,让磁盘I/O和GPU数学计算完美并行。
目标受众
- 它适合谁:ML研究员、数据工程师和Python开发人员进行大规模数据集训练图神经网络(GNNs)。
- 项目状态:当前版本为v0.2。它对于本地研究测试功能完善(包括一个完整的PyTorch GraphSAGE示例),但我正在寻找社区代码审查和压力测试之前将其标记为生产就绪。
优缺点
- vs. PyTorch Geometric (PyG) / DGL:标准GNN库通常会尝试将整个边集和特征矩阵装载到系统内存,然后推送批次到GPU。对于一个数据集像Papers100M,这会在消费者硬件上导致立即内存不足崩溃。GraphZero通过源native流式将RAM占用保持在0字节。
- vs. Pandas / Standard Python: 使用Pandas装载大型CSV会导致内存开销由于Python对象而恶化。GraphZero使用严格的C++模板分发强制执行精确的
FLOAT32或INT64内存布局native,并且nanobind确保没有数据在将指针传递给Python时被拷贝。
我主要打造它以深入了解C-绑定、内存管理以及跨平台CI/CD(让 Apple Clang和MSVC在C++20上达成一致是一个噩梦)。
项目代码库包含一个自包含的合成示例和训练脚本,允许直接在本地测试零拷贝装载。非常感谢对于有经验的人尤其是如果你有经验使用nanobind或高性能Python扩展!
GitHub仓库:[repo]
评论 (0)