
点击蓝字关注我们

本文转自: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小二。
1011

被折叠的 条评论
为什么被折叠?



