MegEngine for PyTorch users

注解

在这个页面,会给出 MegEngine 与 PyTorch 设计和实现上的一些区别。 如果你在使用过程中发现有其它需要关注的差异点,欢迎在这里补充。

Tensor 数据结构相关

关于 Inplace 修改的做法

MegEngine 中没有 Tensor.data = new_data 这样的操作,请使用 Tensor[...] = new_data 代替。

MegEngine Tensor 默认不需要 .to(device) 操作

MegEngine 在设备处理上兼容性良好,默认会将 Tensor 放在算力最高的 设备 上。

MegEngine Tensor 类中没有实现所有操作方法

Pytorch 的 Tensor 类中提供了许多操作/计算方法,而在 MegEngine 中这些方法被统一实现在 functional 模块中, 意味着类似 functional.add() 等操作并不一定存在着对应的 Tensor.add() 实现,这是设计上的历史决定。 当你要对一个 Tensor 进行各种操作时,应当想到使用 functional 模块中的接口。

MegEngine Tensor 默认不计算梯度

Pytorch 中默认所有 Tensor 都需要被求导,因此提供了 torch.no_grad 来禁用梯度计算。 而在 MegEngine 中 Tensor 默认不需要被求导,需要通过 megengine.autodiff.GradManager.attach 来进行绑定, 被绑定后的 Tensor 可以通过 megengine.Tensor.detach 来解除绑定。

Data & DataLoader 相关

DataLoader 中的数据在供给之前,通常不用转 Tensor

  • MegEngine 中的 data 模块默认对 NumPy ndarray 格式的数据进行处理,可视作是独立的模块;

  • 推荐的数据处理流程是:原始数据格式 -> ndarray ( DataLoader ) -> 在每个 Batch 数据中将 DataLoader 供给的 ndarray 数据转 Tensor 格式 -> 后续 Tensor 计算;

  • 如果你选择在 DataLoader 中就将数据处理成 Tensor 格式,在多 GPU + 多 worker 进程读取的情况下可能会导致 CUDA fork 的初始化错误,更详细的解释请参考 使用 Data 构建输入 Pipeline

Sampler 默认支持分布式情景,不需要像 Torch 一样使用 DDP

更多说明,请参考 分布式训练(Distributed Training) 中的相关介绍。