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是未来么?

劝退的人工智能

劝退的人工智能