首页 > 其他分享 >Wenet分布式训练对学习率调整的影响

Wenet分布式训练对学习率调整的影响

时间:2023-01-09 18:56:18浏览次数:42  
标签:训练 warmup 学习 step steps lr Wenet 分布式

目录

Wenet分布式训练对学习率调整的影响

背景

Wenet多机多卡分布式训练时,发现多机多卡(16卡)开发集loss收敛速度远远慢于单机多卡(4卡)。

分布式训练收敛速度和学习率变化的关系

Tensorboard可视化分布训练开发集loss收敛和学习率的变化过程:

训练学习率相关参数:

conf/train_conformer.yaml

optim: adam
optim_conf:
    lr: 0.002
scheduler: warmuplr     # pytorch v1.1.0+ required
scheduler_conf:
    warmup_steps: 25000
  • 红色线条代表1机4卡,warmup_steps为25000
  • 紫色线条代表2机16卡,warmup_steps为25000
  • 蓝色线条代表2机16卡,warmup_steps为1652

结论:随着多机多卡分布式训练卡数量增加,每个Epoch的step数量减少,Warmup学习率的调整变慢,进而导致收敛速度变慢。根据训练卡的数量调整warmup_steps后,2机16卡与1机4卡的收敛速度接近。

Wenet学习率调整策略分析

Wenet Warmup学习率源代码分析

wenet/utils/scheduler.py

class WarmupLR(_LRScheduler):
    ...
    def get_lr(self):
        step_num = self.last_epoch + 1
        if self.warmup_steps == 0:
            # 不进行学习率的warmup,学习率根据step增加而衰减,衰减函数是平方根函数的倒数
            return [
                lr * step_num ** -0.5
                for lr in self.base_lrs
            ]
        else:
            # 先进行学习率的warmup(线性增长),再进行学习率的衰减。
            return [
                lr
                * self.warmup_steps ** 0.5
                * min(step_num ** -0.5, step_num * self.warmup_steps ** -1.5)
                for lr in self.base_lrs
            ]

    def set_step(self, step: int):
        self.last_epoch = step

Wenet学习率调整公式:

\[ f(step) = \left\{ \begin{array} \\ baseLR \cdot \frac{1}{\sqrt{warmupSteps}} \cdot \frac{step}{warmupSteps^{\frac{3}{2}}} & {step <= warmupSteps}\\ baseLR \cdot \frac{1}{\sqrt{warmupSteps}} \cdot \frac{1}{\sqrt{step}} & {step > warmupSteps}\\ \end{array} \right.\]

  • step小于warmupSteps时,学习率随着step线性增长,直到baseLR
  • step大于warmupSteps时,学习率随着step增加而衰减,衰减函数是平方根函数的倒数。

模拟Wenet 预热学习率调整策略

# 学习率调整函数
def f(step, lr=1e-3, warmup_steps=25000):
    next_lr = lr * warmup_steps ** 0.5
    
    if step < warmup_steps:
        return next_lr * step * warmup_steps ** -1.5
    else:
        return next_lr * step ** -0.5


x = list(range(1, 200000))
y = list(map(f, x))

# 每个Epoch有1000个Steps
epochs = list(map(lambda x: int(x / 1000), x))

fig, ax = plt.subplots()
ax.plot(epochs, y)
ax.set_xlabel("Epoch")
ax.set_ylabel("学习率")
ax.set_title("模拟WarmupLearningRate随Epoch变化")
plt.show()

标签:训练,warmup,学习,step,steps,lr,Wenet,分布式
From: https://www.cnblogs.com/bytehandler/p/17038270.html

相关文章

  • Wenet多机多卡分布式训练
    目录Wenet多机多卡分布式训练PyTorch分布式训练DemoWenet分布式训练实践Wenet如何配置多机多卡分布式训练?Wenet分布式训练实验结果Wenet分布式训练如何实现?Wenet分布式训......
  • 代码随想录算法训练营第13天
    今日刷题2道:239.滑动窗口最大值,347.前K个高频元素。● 239.滑动窗口最大值题目链接/文章讲解/视频讲解:https://programmercarl.com/0239.%E6%BB%91%E5%8A%A8%......
  • ClickHouse伪分布式Docker模式安装
    安装说明本次安装为Docker环境下的ClickHouse,单节点,伪分布式,单分片。配置文件检查此文件中的端口,避免端口冲突。config.xml检查此文件的每一项配置。metrika.xmlDoc......
  • YOLOv5多GPU训练
    一、准备安装yolov5依赖,要求Python>=3.8以及PyTorch>=1.7gitclonehttps://github.com/ultralytics/yolov5#clonerepocdyolov5pipinstall-rrequirements.txt123二......
  • 2023寒假训练Week1
    Day1今天主要在补之前各种比赛的题目AcWing4653.数位排序#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;int32_tmain(){intn,m;......
  • 云原生人才培养计划2.0 之 消息产品「全家桶训练营」重磅来袭
    2021年8月,阿里云联合Linux基金会发布云原生人才培养计划2.0,协同开源生态力量,为云原生领域提供更具专业性的定向人才培养方式,帮助云原生时代的开发者更好地享受云红利,创造......
  • 分布式数据级联处理方案
    背景,分布式系统中,我们需要数据级联,很多时候拿到的是userId或者List,然后返回给前端展示的时候需要id对应的一些其他信息比如昵称。为啥我们只有id,没有直接查询出来这些信......
  • 代码随想录算法训练营第11天 | 20. 有效的括号 1047. 删除字符串中的所有相邻重复项 1
    20.有效的括号文章:代码随想录(programmercarl.com)视频:栈的拿手好戏!|LeetCode:20.有效的括号_哔哩哔哩_bilibili思路:先来分析一下这里有三种不匹配的情况,第一种......
  • 2022ACM寒假第一周训练部分题目代码
    在比赛结束后可以查看其他人的代码,这样的是可以查看,若非绿色则对方没公开。1周一1.1A链表应用#include<iostream>#include<list>usingnamespacestd;/*......
  • 训练周报二
    主要内容:动态规划一周全是dp,把kuangbin的dp基础题单ak了,现在差不多算是有点基础了,后面再陆续专门开树形dp这些内容abc前面写的慌慌张张的,节奏把握不好,读题慢还容易乱交题......