跳到主要内容
P小二 P小二
← 返回文章 • AI Research • • 约 5 分钟

OneFlow Tutorial

今天袁老师所在的一流科技开源了他们的深度学习框架OneFlow,今天带来OneFlow 最基础的Tutorial。

今天袁老师所在的一流科技开源了他们的深度学习框架OneFlow,今天带来OneFlow 最基础的Tutorial。

OneFlow介绍

OneFlow 是开源的、采用全新架构设计,世界领先的工业级通用深度学习框架,由北京一流科技开发并开源。

官方介绍OneFlow有以下特点:

  • 分布式训练全新体验,多机多卡如单机单卡一样简单

  • 完美契合一站式平台(k8s + docker)

  • 原生支持超大模型近零运行时开销、线性加速比

  • 灵活支持多种深度学习编译器

  • 自动混合精度

  • 中立开放,合作面广

  • 持续完善的算子集、模型库

设计思路可阅读官方开发人员的此回答:

https://www.zhihu.com/question/409036335/answer/1373468192

安装

现在OneFlow还没有发布版本到PyPI,但是可以用pip安装Nightly版本。

python3 -m pip install --find-links https://oneflow-inc.github.io/nightly oneflow_cu102 --user

安装要求是Linux操作系统并且安装了cuda对应的版本。在这里,推荐使用docker+jupyter来运行OneFlow的示例程序。

可以根据我这个项目中的README来安装。

https://github.com/xxg1413/oneflow-101

训练MNIST

首先导入OneFlow

import oneflow as flowimport oneflow.typing as tp
  #typeing定义了作业函数可以返回的数据类型

设置BATCH_SIZE

BATCH_SIZE = 100

定义作业函数

@flow.global_function(type="train")def train_job(
    images: tp.Numpy.Placeholder((BATCH_SIZE, 1, 28, 28), dtype=flow.float),
    labels: tp.Numpy.Placeholder((BATCH_SIZE,), dtype=flow.int32),) -> tp.Numpy:
    with flow.scope.placement("cpu", "0:0"):
        initializer = flow.truncated_normal(0.1)
        reshape = flow.reshape(images, [images.shape[0], -1])
        hidden = flow.layers.dense(
            reshape,
            512,
            activation=flow.nn.relu,
            kernel_initializer=initializer,
            name="dense1",
        )
        logits = flow.layers.dense(
            hidden, 10, kernel_initializer=initializer, name="dense2"
        )
        loss = flow.nn.sparse_softmax_cross_entropy_with_logits(labels, logits)
    lr_scheduler = flow.optimizer.PiecewiseConstantScheduler([], [0.1])
    flow.optimizer.SGD(lr_scheduler, momentum=0).minimize(loss)
    return loss
@flow.global_function(type="xxx")

在OneFlow中,上面的代码是一个修饰器,修饰了train_job,trian_job通常被称为工作函数。修饰器中的type为train为训练,为predict为预测。

def train_job(
    images: tp.Numpy.Placeholder((BATCH_SIZE, 1, 28, 28), dtype=flow.float),
    labels: tp.Numpy.Placeholder((BATCH_SIZE,), dtype=flow.int32),) -> tp.Numpy:

在函数声明中,定义了训练数据的格式和返回的格式。

with flow.scope.placement("cpu", "0:0"):
      initializer = flow.truncated_normal(0.1)
      reshape = flow.reshape(images, [images.shape[0], -1])
      hidden = flow.layers.dense(
          reshape,
          512,
          activation=flow.nn.relu,
          kernel_initializer=initializer,
          name="dense1",
      )
      logits = flow.layers.dense(
          hidden, 10, kernel_initializer=initializer, name="dense2"
      )
      loss = flow.nn.sparse_softmax_cross_entropy_with_logits(labels, logits)

模型定义

lr_scheduler = flow.optimizer.PiecewiseConstantScheduler([], [0.1])
   flow.optimizer.SGD(lr_scheduler, momentum=0).minimize(loss)

参数和优化器

check_point = flow.train.CheckPoint() check_point.init()

初始化网络模型参数

(train_images, train_labels), (test_images, test_labels) = flow.data.load_mnist(
        BATCH_SIZE, BATCH_SIZE
   )

加载数据

for i, (images, labels) in enumerate(zip(train_images, train_labels)):
       loss = train_job(images, labels)
       if i % 20 == 0:
           print(loss.mean())

开始训练。

完整代码

完整代码

完整代码

今天训练MNIST的代码讲解就到这里了,后续的Tutorial会更新到OneFlow-101项目中,项目地址点击阅读原文可跳转。

后面可能会尝试给OneFlow出Rust Binding,先容我先多用用,看看源代码。我是P小二。

往期回顾:

开源创业的核心竞争力

AutoML是未来么?

劝退的人工智能

劝退的人工智能