今天是 OneFlow 开源的 610 天,OneFlow v0.7.0 正式发布。欢迎下载体验最新版本:https://github.com/Oneflow-Inc/oneflow
本次更新包含以下重点:
-
完善地提供了一种可以帮助用户轻松使用多机多卡执行的机制 :Global Tensor是 OneFlow 为社区带来的分布式执行的易用方案,用它可以方便地实现各种分布式并行策略,极大提高分布式实现的灵活性和易用性。基于 Global Tensor,OneFlow已支持 ResNet50、Wide and Deep、GPT、Bert、Swin-Transformer、InsightFace 等模型的并行化。
-
持续完善 nn.Graph 功能,支持包括 ZeRO 、GradAcc、Checkpointing、Pipeline 相关的高级功能,丰富了 graph.debug 模式。新增支持任意 2D SBP 转换、支持 2D SBP 的半自动推导、支持断点续训等。 新增 OneFlow Feature Stages 标识,并给 nn.Graph 所提供的每一个功能都增加该标识。就 nn.Graph 整体而言, 基础功能进入 Beta Stage,可以支持对该功能的大部分需求;高级功能进入 Alpha Stage,可支持对该功能的标准需求。
-
深度优化 Eager 性能, 在 V100 显卡上测试 Swin-Transformer 模型的单卡性能相比 v0.6.0 提升 3 倍。
-
算子相关进展:在单机单卡场景下,OneFlow 对 PyTorch 的兼容性进一步完善,OneFlow 已经支持的算子都保证和 PyTorch 的接口、语义、结果一致;另外设计了一套自动测试框架来验证一致性,常见网络可以做到import oneflow as torch 来完成迁移。相较于 v0.6.0, OneFlow 新增 16 个算子,优化 6 个算子的性能,修复 16 个算子存在的 bug。
-
支持 Einsum 算子和 View 机制。
-
OneFlow 正式接入 MLIR 编译器生态。
-
发布 OneFlow-Serving v0.1.0,提供了开箱即用的 Triton OneFlow backend 镜像(https://github.com/Oneflow-Inc/serving)。
-
发布 LiBai(李白) v0.1.0:这是一个针对 Transformer 的大规模分布式并行训练代码库,相比 Megatron-LM 等定制化代码库,基于模块化设计的 LiBai 为分布式训练提供了一系列模型和训练组件,让分布式下的模型训练像单卡一样方便(https://github.com/Oneflow-Inc/libai)。
-
发布 Flow-Vision v0.1.0:新增 DeiT、ConvNeXt、ReXNet 等模型,完善了使用教程和文档(https://github.com/Oneflow-Inc/vision)
以下为版本更新详情。
1
分布式
Global Tensor
Global Tensor 是OneFlow发布的一套全新的分布式计算接口,可以很方便地支持包括数据并行、模型并行和流水并行在内的任意并行方式。不同于普通 Tensor(下文叫 Local Tensor),Global Tensor 是一种全局视角下的 Tensor, 它的数据以特定方式分布在集群中的一组计算节点上,每个节点存储了该 Tensor 的部分或全部数据。placement 和 SBP 是每个 Global Tensor 的基本属性,描述了其数据在集群中的分布方式。
Global Tensor 的数据分布方式
Global Tensor 支持三种不同的数据分布方式,我们将其统称为 SBP。
-
Split (dim):数据以dim 维度平均切分并分布到每一个计算节点上。
-
Broadcast:数据在每一个计算节点间进行复制。
-
PartialSum:数据为每一个计算节点的 element-wise 加和。
统一的计算接口
Global Tensor 具有和 Local Tensor 基本一致的计算接口,支持以很少的改动就可以将一个单卡的代码转换成分布式方式执行。
支持 Local Tensor 与 Global Tensor 的转换
-
Local Tensor 可以使用 Tensor.to_global 接口创建一个 Global Tensor,并将该 Local Tensor 作为它在当前节点的本地分量。
-
Global Tensor 可以使用 Tensor.to_local 接口返回它在当前节点的本地分量。