Paddle 训练时直接操作参数导致训练变慢

nmpmafwu  于 2022-10-20  发布在  其他
关注(0)|答案(4)|浏览(396)

请提出你的问题 Please ask your question

paddle version 2.2.2, 动态图
model训练中,维护一个model的exponential moving average,伪代码如下:
问题:加入update_ema_model后,训练的速度约为原来的1/2-1/3。尝试了在此基础上额外加入注解部分的consist loss,速度不会更慢。可见主要是update_ema_model使得速度降低,这是什么原因呢?

model = MyModel()
ema_model = MyModel()
freeze_model(ema_model)
for each iteration:
    output = model(input)
    loss = calculate_loss(output, labels)
    #####consist loss########
    # ema_output = ema_model(input)
    # loss = loss + calculate_consistent_loss(output, ema_output)
    ##############
    loss.backward()
    optimizer.step()
    optimizer.clear_grad()

    update_ema_model(ema_model, model, factor)

def freeze_model(model):
    for p in model.parameters():
        p.stop_gradient=True

@paddle.no_grad()
def update_ema_model(ema_model, model, factor):
    for (param_name, param_value), (ema_param_name, ema_param_value) in \
        zip(model.named_parameters(), ema_model.named_parameters()):
        assert param_name == ema_param_name, \
            'name not match for model: {} and ema_model: {}'.format(param_name, ema_param_name)
        new_ema = (1 - factor) * param_value + factor * ema_param_value
        ema_param_value.set_value(new_ema)

这种直接操作model参数使得速度变慢的现象在我另一个实验中也有出现。另一个实验是在基础loss上加了一个loss,目标是使当前model的参数值趋近于给定的tensor,该loss定义如下,速度也是大约是原来的1/2-1/3

def regularize_by_one(model, param_dict, omiga_dict):
    loss = 0
    for param_name, param_value in model.named_parameters():
        if param_name in param_dict:
            loss = loss + paddle.sum(omiga_dict[param_name] * ((param_value - param_dict[param_name])**2))

    return loss
4ktjp1zp

4ktjp1zp1#

您好,我们已经收到了您的问题,会安排技术人员尽快解答您的问题,请耐心等待。请您再次检查是否提供了清晰的问题描述、复现代码、环境&版本、报错信息等。同时,您也可以通过查看 官网API文档常见问题历史IssueAI社区 来寻求解答。祝您生活愉快~

Hi! We've received your issue and please be patient to get responded. We will arrange technicians to answer your questions as soon as possible. Please make sure that you have posted enough message to demo your request. You may also check out the APIFAQGithub Issue and AI community to get the answer.Have a nice day!

7vhp5slm

7vhp5slm2#

这个问题是由于 ema_param_value.set_value(new_ema) 比较慢导致的。

vh0rcniy

vh0rcniy3#

@GuoxiaWang 谢谢回复! 那这个问题有什么方法可以解决吗?或者说可以用什么其他的操作达到同样的目的。
另外,下面这个函数里并没有set_value操作,为什么同样会导致训练很慢呢?
这种直接操作model参数使得速度变慢的现象在我另一个实验中也有出现。另一个实验是在基础loss上加了一个loss,目标是使当前model的参数值趋近于给定的tensor,该loss定义如下,速度也是大约是原来的1/2-1/3

def regularize_by_one(model, param_dict, omiga_dict):
    loss = 0
    for param_name, param_value in model.named_parameters():
        if param_name in param_dict:
            loss = loss + paddle.sum(omiga_dict[param_name] * ((param_value - param_dict[param_name])**2))

    return loss
lf3rwulv

lf3rwulv4#

这倒是有优化,就是把这些tensor fuse 成一个大的tensor,只执行一次操作速度几乎无损。但是这个改起来有点麻烦。

本质原因是那要执行的那一串数值几算比较慢,当named_parameters 的元素比较多的时候,会for循环这么多次,速度直线下降。

相关问题