提交 d89667ad 编写于 作者: M Megvii Engine Team

fix(source): refine some words and codes

GitOrigin-RevId: af032f8bd3610d3a726c26fd0f6ea8a872e4a1ad
上级 9687f86e
...@@ -3,7 +3,7 @@ ...@@ -3,7 +3,7 @@
更细粒度的参数优化设置 更细粒度的参数优化设置
============================== ==============================
在 :ref:`train_and_evaluation` 中网络使用如下优化器进行训练: 在 :ref:`train_and_evaluation` 中网络使用如下优化器进行训练:
.. testcode:: .. testcode::
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
lr=0.05, # 学习速率 lr=0.05, # 学习速率
) )
这个优化器对所有参数都使用同一学习速率进行优化,我们将在本章中介绍如何做到对不同的参数采用不同的学习速率。 这个优化器对所有参数都使用同一学习速率进行优化,而在本章中我们将介绍如何做到对不同的参数采用不同的学习速率。
本章我们沿用 :ref:`network_build` 中创建的 ``LeNet`` ,下述的优化器相关代码可以用于取代 :ref:`train_and_evaluation` 中对应的代码。 本章我们沿用 :ref:`network_build` 中创建的 ``LeNet`` ,下述的优化器相关代码可以用于取代 :ref:`train_and_evaluation` 中对应的代码。
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
亚线性内存技术仅适用于 MegEngine 静态图模式。这种内存优化方式在编译计算图和训练模型时会有少量的额外时间开销。下面我们以 `ResNet50 <https://arxiv.org/abs/1512.03385>`_ 为例,说明使用亚线性内存优化能够大幅节约网络训练显存使用。 亚线性内存技术仅适用于 MegEngine 静态图模式。这种内存优化方式在编译计算图和训练模型时会有少量的额外时间开销。下面我们以 `ResNet50 <https://arxiv.org/abs/1512.03385>`_ 为例,说明使用亚线性内存优化能够大幅节约网络训练显存使用。
.. testcode:: .. testcode::
import os import os
import megengine as mge import megengine as mge
...@@ -43,9 +43,6 @@ ...@@ -43,9 +43,6 @@
lr=0.1, lr=0.1,
) )
data = mge.tensor()
label = mge.tensor(dtype="int32")
# symbolic参数说明请参见 静态图的两种模式 # symbolic参数说明请参见 静态图的两种模式
@trace(symbolic=True) @trace(symbolic=True)
def train_func(data, label, *, net, optimizer): def train_func(data, label, *, net, optimizer):
...@@ -59,10 +56,8 @@ ...@@ -59,10 +56,8 @@
# 使用假数据 # 使用假数据
batch_data = np.random.randn(batch_size, 3, 224, 224).astype(np.float32) 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) 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() optimizer.zero_grad()
train_func(data, label, net=resnet, optimizer=optimizer) train_func(batch_data, batch_label, net=resnet, optimizer=optimizer)
optimizer.step() optimizer.step()
# 设置使用单卡 GPU ,显存容量为 11 GB # 设置使用单卡 GPU ,显存容量为 11 GB
......
...@@ -26,13 +26,15 @@ ...@@ -26,13 +26,15 @@
# @trace(symbolic=False) # “动态构造” # @trace(symbolic=False) # “动态构造”
@trace(symbolic=True) # “静态构造” @trace(symbolic=True) # “静态构造”
def train_func(data, label, *, opt, net): def train_func(data, label, *, opt, net):
logits = net(data) logits = net(data)
print(logits[0]) # 因网络输出太多,此处仅打印部分 print(logits[0]) # 因网络输出太多,此处仅打印部分
loss = F.cross_entropy_with_softmax(logits, label) loss = F.cross_entropy_with_softmax(logits, label)
opt.backward(loss) opt.backward(loss)
return logits, loss return logits, loss
输出为:
.. testoutput:: .. testoutput::
Tensor(None) Tensor(None)
......
...@@ -20,9 +20,9 @@ MegEngine支持 **静态计算图** 模式。该模式将计算图的构建和 ...@@ -20,9 +20,9 @@ MegEngine支持 **静态计算图** 模式。该模式将计算图的构建和
在上图左侧的计算图中,为了存储 ``x`` 、 ``w`` 、 ``p`` 、 ``b``, ``y`` 五个变量,动态图需要 ``40`` 个字节(假设每个变量占用 8 字节的内存)。在静态图中,由于我们只需要知道结果 ``y`` ,可以让 ``y`` 复用中间变量 ``p`` 的内存,实现“原地”(inplace)修改。这样,静态图所占用的内存就减少为 ``32`` 个字节。 在上图左侧的计算图中,为了存储 ``x`` 、 ``w`` 、 ``p`` 、 ``b``, ``y`` 五个变量,动态图需要 ``40`` 个字节(假设每个变量占用 8 字节的内存)。在静态图中,由于我们只需要知道结果 ``y`` ,可以让 ``y`` 复用中间变量 ``p`` 的内存,实现“原地”(inplace)修改。这样,静态图所占用的内存就减少为 ``32`` 个字节。
MegEngine 还采用 **算子融合** (Operator Fuse)的方式减少计算开销。以上图为例,我们可以将乘法和加法融合为一个三元操作(假设硬件支持) **乘加** ,降低计算量。 MegEngine 还采用 **算子融合** (Operator Fuse)的方式减少计算开销。以上图为例,我们可以将乘法和加法融合为一个三元操作(假设底层支持) **乘加** ,降低计算量。
注意,只有了解了完整的计算流程后才能进行上述优化。 注意,框架只有获取了完整的计算流程后才能进行上述优化。
动态图转静态图 动态图转静态图
------------------------------ ------------------------------
...@@ -38,14 +38,14 @@ MegEngine 提供了很方便的动静态图转换的方法,几乎无需代码 ...@@ -38,14 +38,14 @@ MegEngine 提供了很方便的动静态图转换的方法,几乎无需代码
total_loss = 0 total_loss = 0
for step, (batch_data, batch_label) in enumerate(dataloader): for step, (batch_data, batch_label) in enumerate(dataloader):
optimizer.zero_grad() # 将参数的梯度置零 optimizer.zero_grad() # 将参数的梯度置零
# 以下五行代码为网络的计算和优化,后续转静态图时将进行处理 # 以下五行代码为网络的计算和优化,后续转静态图时将进行处理
data.set_value(batch_data) data.set_value(batch_data)
label.set_value(batch_label) label.set_value(batch_label)
logits = le_net(data) logits = le_net(data)
loss = F.cross_entropy_with_softmax(logits, label) loss = F.cross_entropy_with_softmax(logits, label)
optimizer.backward(loss) # 反传计算梯度 optimizer.backward(loss) # 反传计算梯度
optimizer.step() # 根据梯度更新参数值 optimizer.step() # 根据梯度更新参数值
total_loss += loss.numpy().item() total_loss += loss.numpy().item()
print("epoch: {}, loss {}".format(epoch, total_loss/len(dataloader))) print("epoch: {}, loss {}".format(epoch, total_loss/len(dataloader)))
...@@ -133,11 +133,11 @@ MegEngine 提供了很方便的动静态图转换的方法,几乎无需代码 ...@@ -133,11 +133,11 @@ MegEngine 提供了很方便的动静态图转换的方法,几乎无需代码
total_loss = 0 total_loss = 0
for step, (data, label) in enumerate(dataloader): for step, (data, label) in enumerate(dataloader):
optimizer.zero_grad() # 将参数的梯度置零 optimizer.zero_grad() # 将参数的梯度置零
label = label.astype('int32') # 交叉熵损失的label需要int32类型 label = label.astype('int32') # 交叉熵损失的label需要int32类型
# 调用被 trace 装饰后的函数 # 调用被 trace 装饰后的函数
logits, loss = train_func(data, label, opt=optimizer, net=le_net) logits, loss = train_func(data, label, opt=optimizer, net=le_net)
optimizer.step() # 根据梯度更新参数值 optimizer.step() # 根据梯度更新参数值
total_loss += loss.numpy().item() total_loss += loss.numpy().item()
print("epoch: {}, loss {}".format(epoch, total_loss/len(dataloader))) 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.
先完成此消息的编辑!
想要评论请 注册