pytorch批量训练,pytorch训练过程可视化
目录
一个火炬混合精度训练2 autocast 2.1火炬。autocast 2.2火炬。cuda。安培。自动发布3渐变缩放3.1使用案例
一个火炬混合精度训练混合精度训练提供了自适应的float32(单精度)与浮动16(半精度)数据适配,我们必须同时使用火炬. autocast和torch.cuda.amp.GradScaler才能起到作用。然而,torch.autocast和GradScaler是模块化的,如果需要可以单独使用。混合精度的原理参考:
2自动铸造2.1火炬。自动铸造火炬。autocast(device _ type,enabled=True,**kwargs)上下文管理器或装饰器自动预测的实例,允许脚本区域以混合精度训练。在这些区域中,运营在自动预测选择的特定于外科手术的类型中运行,以在保持准确性的同时提高性能。有关详细信息,请参阅自动预测操作参考自动预测应该只包装网络的前向传递,包括损失计算。不推荐包含反向传播。后向操作与自动预测在前向过程中操作的类型相同。
有两种形式可以实现自动发布:
上下文管理器#以默认精度创建模型和优化器
model=Net().cuda()
optimizer=optim .SGD(model.parameters(),)
对于输入,数据中的目标:
optimizer.zero_grad()
#为正向传递启用自动预测(模型损失)
使用autocast():
输出=模型(输入)
损失=损失_fn(输出,目标)
#在向后()之前退出上下文管理器
loss.backward()
optimizer.step()装饰器类自动预测模型(神经网络).模块):
.
@autocast()
向前定义(自身,输入):
.在自动预测区域的代码会将部分张量精度转为浮动16,如果直接使用这些张量进行计算,可能会报错。所以离开这个区域后我们尽量将其转换回float32再进行计算!
#在默认数据类型中创建一些张量(这里假设是浮动32)
a_float32=torch.rand((8,8),device=cuda )
b_float32=torch.rand((8,8),device=cuda )
c_float32=torch.rand((8,8),device=cuda )
d_float32=torch.rand((8,8),device=cuda )
使用autocast():
#火炬在自动预测的应该在浮动16中运行的操作列表中。
#输入为float32,但外科手术以浮动16运行并产生浮动16输出。
#不需要手动强制转换。
e_float16=torch.mm(a_float32,b_float32)
#还处理混合输入类型
f_float16=torch.mm(d_float32,e_float16)
#退出自动预测后,调用f_float16.float()与d_float32一起使用
g_float32=torch.mm(d_float32,f _ float 16。float())自动转换(enabled=False)子区域可以嵌套在自动预测的区域中。例如,如果您想强制子区域在特定的数据类型。禁用自动转换使您可以显式控制执行类型。
#在默认数据类型中创建一些张量(这里假设是浮动32)
a_float32=torch.rand((8,8),device=cuda )
b_float32=torch.rand((8,8),device=cuda )
c_float32=torch.rand((8,8),device=cuda )
d_float32=torch.rand((8,8),device=cuda )
使用autocast():
e_float16=torch.mm(a_float32,b_float32)
使用自动预测(已启用=假):
#调用e_float16.float()以确保float32的执行
#(这是必需的,因为电子浮动16是在自动预测区域中创建的)
f_float32=torch.mm(c_float32,e_float16.float())
#重新进入启用自动转换的区域时,不需要手动转换。
#火炬再次在浮动16中运行,并产生浮动16输出,而不考虑输入类型。
g_float16=torch.mm(d_float32,f_float32)参数说明
Device _ type (string,必需)-是使用“cuda”还是“cpu”设备启用(bool,可选,默认值=true)-是否应在区域中启用autocast。Dtype (torch _ d python: type,可选)-是使用torch.float16还是torch . BF loat 16 . Cache _ enabled(bool,可选,默认=true)-是否要启用自动转换中的权重缓存。2.2 torch.cuda.amp.autocast等效于torch.autocast(cuda ,args.)
3梯度缩放如果特定操作的正向传输有一个float16输入,则该操作的反向传输将产生一个float16梯度。小值的渐变值可能不会在float16中表示。这些值将被刷新为零(“下溢”),因此相应参数的更新将丢失。为了防止下溢,“梯度缩放”将网络损耗乘以一个缩放因子,并根据缩放后的损耗回调传播。那么通过网络反向流动的梯度由相同的因子缩放。换句话说,渐变值的大小更大,因此它们不会刷新为零。在优化器更新参数之前,梯度(。grad属性)应该是未缩放的,因此缩放因子不会干扰学习速率。
torch . cuda . amp . grad scaler(init _ scale=65536.0,growth _ factor=2.0,backoff _ factor=0.5,growth _ interval=2000,enabled=true) Gradscaler有两个关键方法:
GradScaler.step(optimizer)在内部调用unscale_(optimizer)(除非在迭代早期显式调用unscale_)。Optimizer作为unscale_()的一部分,渐变会检查infs/NaNs;如果找不到inf/NaN渐变,则使用未缩放的渐变调用optimizer.step()。否则,optimizer.step()将跳过以避免损坏参数。更新(new _ scale=无)
更新比例因子。如果您跳过任何优化器步骤,请将该比例乘以backoff_factor以减少它。如果未被growth_interval跳过的迭代连续出现,则将该比例乘以growth_factor以增加它。
通过new_scale手动设置新的刻度值。(new_scale不是直接用的,它是用来填充GradScaler的内部尺度张量的。因此,如果new_scale是一个张量,后面对该张量的就地更改将不会进一步影响GradScaler内部使用的scale。)3.1用例模型=Net()。cuda()
optimizer=optim。SGD(model.parameters(),)
scaler=amp。GradScaler(启用=真)
对于输入,数据中的目标:
optimizer.zero_grad()
#为正向传递启用自动预测(模型损失)
使用autocast():
输出=模型(输入)
损失=损失_fn(输出,目标)
#在backward()之前退出上下文管理器
#向后
scaler.scale(损耗)。向后()
scaler.step(优化器)# optimizer.step
Scaler.update()清爱,只针对中国
来自
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。