来自社区的OneFlow Tutorial

点击蓝字关注我们

本文转自:P小二

今天袁老师所在的一流科技开源了他们的深度学习框架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小二。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值