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小二。
往期回顾:
