BioNemo-SCDL:用于单细胞基础模型可扩展训练的单细胞数据加载。
软件包概述
BioNeMo-SCDL 为单细胞数据提供了一个独立的 pytorch 兼容数据集类,并具有一致的 API。BioNeMo-SCDL 由 NVIDIA 开发和维护。此软件包可以独立于 BioNeMo 运行。它在以下方面改进了基于简单 AnnData 的数据集类:
- 跨输入格式的一致 API,并承诺在软件包版本之间保持一致。
- 加载大型数据集时性能得到提升。它允许加载和快速迭代大型数据集。
- 能够使用远超内存的数据集。这是因为数据集以 numpy 内存映射格式存储。
- 此外,还将大型(远超内存)AnnData 文件转换为 SCDL 格式。
- [未来] 完全支持参差不齐的数组(即,具有不同特征计数的数据集;目前只有部分 API 功能支持参差不齐的数组)。
- [未来] 支持改进的压缩。
BioNeMo-SCDL 的 API 类似于 AnnData,因此代码更改非常少。在大多数情况下,只需将属性简单地替换为函数即可(即,将 data.n_obs
替换为 data.number_of_rows()
)。
安装
此软件包可以通过以下方式安装
pip install bionemo-scdl
使用方法
获取示例数据
以下是如何处理来自 CellxGene 的约 25,000 个细胞的示例数据集
下载 "https://datasets.cellxgene.cziscience.com/97e96fb1-8caf-4f08-9174-27308eabd4ea.h5ad" 到 hdf5s/97e96fb1-8caf-4f08-9174-27308eabd4ea.h5ad
从 H5AD 文件加载单细胞数据集
from bionemo.scdl.io.single_cell_memmap_dataset import SingleCellMemMapDataset
data = SingleCellMemMapDataset("97e_scmm", "hdf5s/97e96fb1-8caf-4f08-9174-27308eabd4ea.h5ad")
这将创建一个 SingleCellMemMapDataset
,它存储在 97e_scmm 中,以大型内存映射数组形式存储,从而可以快速访问大于系统可用 RAM 容量的数据集。
如果数据集很大,则可以延迟加载 AnnData 文件,然后根据分页方式的行块读取。这可以通过在实例化 SingleCellMemMapDataset
时设置参数来完成: - paginated_load_cutoff
,它设置 AnnData 文件以分页方式读取的最小文件大小(以 MB 为单位)。 - load_block_row_size
,它是每次读入内存的行数。
查询单细胞数据集并探索 API
data.number_of_rows()
## 25382
data.number_of_variables()
## [34455]
data.number_of_values()
## 874536810
data.number_nonzero_values()
## 26947275
将 SCDL (单细胞数据加载器) 数据集保存到磁盘
当您打开 SCDL 数据集时,您必须选择一个路径来存储后备数据结构。但是,不能保证这些结构在运行时处于有效的序列化状态。
调用 save
方法可保证磁盘上的对象处于有效的序列化状态,此时当前 python 进程可以退出,并且该对象稍后可以由另一个进程加载。
data.save()
从 SCDL 存档加载 SCDL 数据集
当您准备好重新加载 SCDL 数据集时,只需传递序列化数据的路径即可
reloaded_data = SingleCellMemMapDataset("97e_scmm")
在模型训练中使用 SCDL 数据集
SCDL 实现了 PyTorch Dataset 抽象类的必需函数。您可以使用 PyTorch 兼容的 DataLoaders 从 SCDL 类加载数据批次。当批次大小为 1 时,这可以在没有整理函数的情况下运行。当批次大小大于 1 时,有一个整理函数 (collate_sparse_matrix_batch
),它会将多个稀疏数组整理为 CSR(压缩稀疏行)torch 张量格式。
from torch.utils.data import DataLoader
from bionemo.scdl.util.torch_dataloader_utils import collate_sparse_matrix_batch
## Mock model: you can remove this and pass the batch to your own model in actual code.
model = lambda x : x
dataloader = DataLoader(data, batch_size=8, shuffle=True, collate_fn=collate_sparse_matrix_batch)
n_epochs = 2
for e in range(n_epochs):
for batch in dataloader:
model(batch)
示例
examples 目录包含利用 SCDL 的各种示例。
将现有的 Cell x Gene 数据转换为 SCDL
如果有多个 AnnData 文件,它们可以转换为单个 SingleCellMemMapDataset
。如果 hdf5 目录有一个或多个 AnnData 文件,则 SingleCellCollection
类会爬取文件系统以递归查找 AnnData 文件(扩展名为 h5ad)。
要转换现有的 AnnData 文件,您可以编写自己的脚本使用 SCDL API,或者使用便捷脚本 convert_h5ad_to_scdl
。
这是一个例子
convert_h5ad_to_scdl --data-path hdf5s --save-path example_dataset
未来工作和路线图
SCDL 目前处于公开 Beta 测试阶段。未来,预计数据压缩和数据加载性能将得到改进。
许可证
BioNemo-SCDL 具有 Apache 2.0 许可证,如 LICENSE 文件中所示。