Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MegEngine 天元
Docs
提交
d89667ad
D
Docs
项目概览
MegEngine 天元
/
Docs
通知
3
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
d89667ad
编写于
3月 25, 2020
作者:
M
Megvii Engine Team
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
fix(source): refine some words and codes
GitOrigin-RevId: af032f8bd3610d3a726c26fd0f6ea8a872e4a1ad
上级
9687f86e
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
14 addition
and
17 deletion
+14
-17
source/advanced/parameter_more_setting.rst
source/advanced/parameter_more_setting.rst
+2
-2
source/advanced/sublinear.rst
source/advanced/sublinear.rst
+2
-7
source/advanced/two_static_mode.rst
source/advanced/two_static_mode.rst
+3
-1
source/basic/dynamic_and_static_graph.rst
source/basic/dynamic_and_static_graph.rst
+7
-7
未找到文件。
source/advanced/parameter_more_setting.rst
浏览文件 @
d89667ad
...
...
@@ -3,7 +3,7 @@
更细粒度的参数优化设置
==============================
在 :ref:`train_and_evaluation`
当
中网络使用如下优化器进行训练:
在 :ref:`train_and_evaluation` 中网络使用如下优化器进行训练:
.. testcode::
...
...
@@ -13,7 +13,7 @@
lr=0.05, # 学习速率
)
这个优化器对所有参数都使用同一学习速率进行优化,
我们将在本章中
介绍如何做到对不同的参数采用不同的学习速率。
这个优化器对所有参数都使用同一学习速率进行优化,
而在本章中我们将
介绍如何做到对不同的参数采用不同的学习速率。
本章我们沿用 :ref:`network_build` 中创建的 ``LeNet`` ,下述的优化器相关代码可以用于取代 :ref:`train_and_evaluation` 中对应的代码。
...
...
source/advanced/sublinear.rst
浏览文件 @
d89667ad
...
...
@@ -22,7 +22,7 @@
亚线性内存技术仅适用于 MegEngine 静态图模式。这种内存优化方式在编译计算图和训练模型时会有少量的额外时间开销。下面我们以 `ResNet50 <https://arxiv.org/abs/1512.03385>`_ 为例,说明使用亚线性内存优化能够大幅节约网络训练显存使用。
.. testcode::
import os
import megengine as mge
...
...
@@ -43,9 +43,6 @@
lr=0.1,
)
data = mge.tensor()
label = mge.tensor(dtype="int32")
# symbolic参数说明请参见 静态图的两种模式
@trace(symbolic=True)
def train_func(data, label, *, net, optimizer):
...
...
@@ -59,10 +56,8 @@
# 使用假数据
batch_data = np.random.randn(batch_size, 3, 224, 224).astype(np.float32)
batch_label = np.random.randint(1000, size=(batch_size,)).astype(np.float32)
data.set_value(batch_data)
label.set_value(batch_label)
optimizer.zero_grad()
train_func(
data,
label, net=resnet, optimizer=optimizer)
train_func(
batch_data, batch_
label, net=resnet, optimizer=optimizer)
optimizer.step()
# 设置使用单卡 GPU ,显存容量为 11 GB
...
...
source/advanced/two_static_mode.rst
浏览文件 @
d89667ad
...
...
@@ -26,13 +26,15 @@
# @trace(symbolic=False) # “动态构造”
@trace(symbolic=True) # “静态构造”
def train_func(data, label, *, opt, net):
def train_func(data, label, *, opt, net):
logits = net(data)
print(logits[0]) # 因网络输出太多,此处仅打印部分
loss = F.cross_entropy_with_softmax(logits, label)
opt.backward(loss)
return logits, loss
输出为:
.. testoutput::
Tensor(None)
...
...
source/basic/dynamic_and_static_graph.rst
浏览文件 @
d89667ad
...
...
@@ -20,9 +20,9 @@ MegEngine支持 **静态计算图** 模式。该模式将计算图的构建和
在上图左侧的计算图中,为了存储 ``x`` 、 ``w`` 、 ``p`` 、 ``b``, ``y`` 五个变量,动态图需要 ``40`` 个字节(假设每个变量占用 8 字节的内存)。在静态图中,由于我们只需要知道结果 ``y`` ,可以让 ``y`` 复用中间变量 ``p`` 的内存,实现“原地”(inplace)修改。这样,静态图所占用的内存就减少为 ``32`` 个字节。
MegEngine 还采用 **算子融合** (Operator Fuse)的方式减少计算开销。以上图为例,我们可以将乘法和加法融合为一个三元操作(假设
硬件
支持) **乘加** ,降低计算量。
MegEngine 还采用 **算子融合** (Operator Fuse)的方式减少计算开销。以上图为例,我们可以将乘法和加法融合为一个三元操作(假设
底层
支持) **乘加** ,降低计算量。
注意,
只有了解
了完整的计算流程后才能进行上述优化。
注意,
框架只有获取
了完整的计算流程后才能进行上述优化。
动态图转静态图
------------------------------
...
...
@@ -38,14 +38,14 @@ MegEngine 提供了很方便的动静态图转换的方法,几乎无需代码
total_loss = 0
for step, (batch_data, batch_label) in enumerate(dataloader):
optimizer.zero_grad() # 将参数的梯度置零
# 以下五行代码为网络的计算和优化,后续转静态图时将进行处理
data.set_value(batch_data)
label.set_value(batch_label)
logits = le_net(data)
loss = F.cross_entropy_with_softmax(logits, label)
optimizer.backward(loss) # 反传计算梯度
optimizer.step() # 根据梯度更新参数值
total_loss += loss.numpy().item()
print("epoch: {}, loss {}".format(epoch, total_loss/len(dataloader)))
...
...
@@ -133,11 +133,11 @@ MegEngine 提供了很方便的动静态图转换的方法,几乎无需代码
total_loss = 0
for step, (data, label) in enumerate(dataloader):
optimizer.zero_grad() # 将参数的梯度置零
label = label.astype('int32') # 交叉熵损失的label需要int32类型
label = label.astype('int32') # 交叉熵损失的label需要int32类型
# 调用被 trace 装饰后的函数
logits, loss = train_func(data, label, opt=optimizer, net=le_net)
optimizer.step() # 根据梯度更新参数值
total_loss += loss.numpy().item()
print("epoch: {}, loss {}".format(epoch, total_loss/len(dataloader)))
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录