科技 > 人工智能 > 动态

动转静两大升级!一键转静成功率领先,重点模型训练提速18%+

127人参与 2024-08-06 动态

目前主流深度学习框架支持的编程方式有两种,分别为动态图和静态图。动态图的pythonic编程体验更佳、更易调试,但性能方面与静态图有一定差距。静态图先组网再执行,预先拥有完整网络结构,更利于全局优化,虽调试难度大,但执行性能更佳。

百度采用动静统一的技术架构设计,提供了动转静(@to_static)模块功能,支持用户动态图编程,并可一键切换静态图训练和部署。2022年11月,框架 2.4 版本(以下简称飞桨v2.4)正式发布,动转静“转换成功率”和“训练性能”迎来全面升级,带来了全新的用户使用体验。

 

一键转静成功率明显提升

动转静的转换成功率是动转静功能的一个重要指标,与用户的使用体验息息相关,v2.4从“动转静语法完善”和“api动静行为统一”两个方面进行了重点优化和升级:

动转静语法完善

jit 式动态执行

新增 shape、len、attr、list、unpack、indexable等jit 形式接口,提升语法转写的鲁棒性。

控制流语法重构

重构了控制流if/for/while语法转写逻辑,完备支持复杂嵌套场景下变量名解析等疑难问题。

关键字语法优化

优化了控制流中提前return、break、continue 等关键字语法转写机制,有效减少了静态图中间表示多余算子的引入,提升执行效率。

 

api动静行为统一

属性参数可变

完成了20多个中高频动态图api参数的升级,如

reduce列的.mean/sum/max/min api的参数 axis ,新增支持为tensor类型,动态可变。

接口动静统一

补齐了tensor类静态图下缺失的接口,升级了.to_tensor、.grad等高频api 功能,支持静态图调用。

einsum 升级

实现了动静统一爱因斯坦求和算子,并支持python二元、多元输入,训推一体。

图片

动转静成功率和语法支持度

v2.4下,动转静具备了更丰富的语法支持,python语法支持比例达到了90%,在80多个外部用户真实论文复现模型集合上,动转静一键转写成功率提升至92.1%,功能完备性和易用性都有明显提升。

如下是一个动转静导出预测模型的样例代码:

import paddle

class simplenet(paddle.nn.layer):
    def __init__(self):
        super(simplenet, self).__init__()
        self.linear = paddle.nn.linear(10, 3)

    @paddle.jit.to_static   # step 1: 添加装饰器
    def forward(self, x):
        out = self.linear(x)
        out = out + 1
        return out

net = simplenet()
train(net)  # 此处略去了训练过程

# step 2: 切换到 eval() 模式
net.eval()
# step 3: 调用 jit.save 接口
paddle.jit.save(net, path='./simple_net')

执行上述代码样例后,在当前目录下会生成三个文件,即代表成功导出预测模型:

simple_net.pdiparams        // 存放模型中所有的权重数据
simple_net.pdmodel          // 存放模型的网络结构
simple_net.pdiparams.info   // 存放额外的其他信息

动转静导出模型一般包括三个步骤:

将@to_static装饰器装饰在forward函数上。

如dropout 、layernorm 接口在 train() 和 eval() 模式下行为存在较大的差异,在模型导出前,请务必确认模型已切换到正确的模式。

    调用 .jit.save接口导出其对应的模型文件和参数文件。

动转静@to_staitc更多功能用法,可参考【扩展阅读动转静使用样例】

 

动转静训练加速效果明显

在框架中,通常情况下使用动态图训练即可满足大部分场景需求。v2.4优化了动转静训练的相关逻辑,面向重点模型,动态图训练的性能已经可以和静态图媲美,例如在resnet50、transformer、yolov3等模型上,动转静训练相较于动态图有18.6%~21.5%的显著加速效果。

 

图片

重点模型加速效果

在如下场景中,开发者可以考虑使用动转静方式进行模型训练,将会获得较明显的性能提升效果。

 

场景一:重调度模型

即每个api背后的gpu kernel 计算耗时较少,在cpu端拉起后很快就执行完了,此类任务的特点:

图片

如上图是重调度模型的动态图和动转静 timeline 示意图。从图中可以看出:

对于想使用动态图训练代码的用户来说,只需要在组网入口的forward函数处添加装饰器@to_static,其他代码无需改动就可以一键切换为动转静训练。@to_static装饰器会将此函数内的所有sublayers 转化为一个静态子图并执行。如下是一个动转静训练样例代码:

import paddle

class simplenet(paddle.nn.layer):
    def __init__(self):
        super(simplenet, self).__init__()
        self.linear = paddle.nn.linear(103)

    @paddle.jit.to_static   # 仅需一行代码
    def forward(self, x):
        out = self.linear(x)
        out = out + 1
        return out

# create network
net = simplenet()
adam = opt.adam(learning_rate=0.001, parameters=net.parameters())

for batch_id, x in enumerate(data_loader()):
    out = net(x)
    loss = paddle.mean(out)
    loss.backward()
    opt.step()
    opt.clear_grad()
 

 

场景二:调度+计算共存模型

即模型训练时同时存在计算量小和计算量大的gpu kernel,且一个batch的起始位置常为小kernel,此类任务的特点:

图片

如上图是调度+计算共存的动态图和动转静timeline示意图。从图中可以看出:

在此种场景下,动转静@to_static api 提供build_strategy参数,在动转静的全图视角下,用户可以通过build_strategy参数开启不同的全局图优化策略。通过装饰器@to_static(build_strategy=get_build_strategy())或者api调用.jit.to_static(net, build_strategy=get_build_strategy())两种方式开启全局图优化策略,如下是一个简单的使用样例:

import numpy as np
import paddle
import paddle.nn as nn

def get_build_strategy():
    build_strategy = paddle.static.buildstrategy()
    # 算子融合策略
    build_strategy.fuse_elewise_add_act_ops = true
    # 梯度 addto 策略
    build_strategy.enable_addto = true
    os.environ['flags_max_inplace_grad_add'] = "8"
    return build_strategy

class resnet(paddle.nn.layer):
    # 此处省略了模型定义
    @to_static(build_strategy=get_build_strategy()) # 方式一
    def forward(self, image):
        # 省略前向代码

# create network
net = resnet()
# 借助 build_strategy 参数自定义开启「全局图优化」策略
net = paddle.jit.to_static(net, build_strategy=get_build_strategy()) # 方式二

adam = opt.adam(learning_rate=0.001, parameters=net.parameters())

for batch_id, image in enumerate(data_loader()):
    out = layer(image)
    loss = paddle.mean(out)
    loss.backward()
    opt.step()
    opt.clear_grad()
 

动转静@to_static开启更多全局图优化用法,可参考【扩展阅读动转静训练图优化策略】

拓展阅读

[1] 动转静使用样例

https://www..org.cn/documentation/docs/zh/guides/jit/basic_usage_cn.html

[2] 动转静训练图优化策略

https://www..org.cn/documentation/docs/zh/guides/jit/basic_usage_cn.html#sidongzhuanjinggengduoyongfa

[3] 动转静转换原理

https://www..org.cn/documentation/docs/zh/guides/jit/principle_cn.html

[4] 动转静报错调试

https://www..org.cn/documentation/docs/zh/guides/jit/debugging_cn.html

[5] 动转静limitations

https://www..org.cn/documentation/docs/zh/develop/guides/jit/limitations_cn.html

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

百度生成式AI产品文心一言邀请测试,五大场景、五大能力革新生产力工具

08-06

携手NVIDIA等40余家国内外伙伴,飞桨硬件生态狂飙

08-06

ADDS-DepthNet:基于域分离的全天图像自监督单目深度估计

08-06

百度CTO王海峰做客《中国经济大讲堂》:文心一言,读书破万亿

08-06

一文解读基于PaddleSeg的钢筋长度超限监控方案

08-06

2023IKCEST “一带一路” 国际大数据竞赛重磅启动!

08-06

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论