NLP原理和应用入门:paddle(梯度裁剪、ONNX协议、动态图转静态图、推理部署)

目录

一、梯度裁剪

1.1设定范围值裁剪

1. 全部参数裁剪(默认)

2. 部分参数裁剪

1.2 通过L2范数裁剪

1.3通过全局L2范数裁剪

 二. 模型导出ONNX协议

三、动态图转静态图

3.1两种图定义

3.2 什么场景下需要动态图转静态图

3.3为什么动态图模式越来越流行

3.4总结

4.推理部署

4.1 服务器部署 — Paddle Inference

4.2 移动端/嵌入式部署 — Paddle Lite

4.3 模型压缩 — PaddleSlim

文章来源:


一、梯度裁剪

在PaddlePaddle的自然语言处理模块中,梯度裁剪是一种用于控制梯度大小的技术。在训练神经网络时,梯度可能会变得非常大,从而导致训练不稳定或发生梯度爆炸。为了避免这种情况,可以使用梯度裁剪来限制梯度的大小

1.1设定范围值裁剪

梯度裁剪通过将梯度的范数限制在一个预定义的阈值内来实现。具体来说,梯度裁剪将计算出的梯度向量 \mathbf{g} 的范数 ||\mathbf{g}|| 与一个给定的阈值c 进行比较。如果 ||\mathbf{g}|| > c,则将 \mathbf{g} 缩放为 \frac{c\mathbf{g}}{||\mathbf{g}||},否则不做任何修改。这样可以确保梯度的大小不会超过阈值c,从而使得训练更加稳定。

1. 全部参数裁剪(默认)

默认情况下,会裁剪优化器中全部参数的梯度:

import paddle

linear = paddle.nn.Linear(10, 10)
clip = paddle.nn.ClipGradByValue(min=-1, max=1)
sdg = paddle.optimizer.SGD(learning_rate=0.1, parameters=linear.parameters(), grad_clip=clip)

这段代码使用PaddlePaddle框架定义了一个线性层模型 linear,包含10个输入和10个输出。接着,定义了一个 ClipGradByValue 实例 clip,它将梯度裁剪到一个给定的最小和最大值(在这里分别为-1和1)。最后,定义了一个随机梯度下降(SGD)优化器 sdg,使用了一个学习率为0.1的优化器,并将裁剪器 clip 作为参数传递给了 grad_clip,表示在进行参数更新时应该使用梯度裁剪技术。

综合来看,这段代码的作用是定义一个包含线性层的模型,并使用梯度裁剪技术来优化模型参数。通过这种方式,可以使得模型在训练过程中更加稳定,避免出现梯度爆炸或消失等问题。

2. 部分参数裁剪

部分参数裁剪需要设置参数的 paddle.ParamAttr ,其中的 need_clip 默认为True,表示需要裁剪,如果设置为False,则不会裁剪。

例如:仅裁剪 linear 中 weight 的梯度,则需要在创建 linear 层时设置 bias_attr 如下:

linear = paddle.nn.Linear(10, 10,bias_attr=paddle.ParamAttr(need_clip=False))

1.2 通过L2范数裁剪

通过L2范数裁剪:梯度作为一个多维Tensor,计算其L2范数,如果超过最大值则按比例进行裁剪,否则不裁剪。

使用方式:需要创建一个 paddle.nn.ClipGradByNorm 类的实例,然后传入到优化器中,优化器会在更新参数前,对梯度进行裁剪。

1.3通过全局L2范数裁剪

将优化器中全部参数的梯度组成向量,对该向量求解L2范数,如果超过最大值则按比例进行裁剪,否则不裁剪。

使用方式:需要创建一个 paddle.nn.ClipGradByGlobalNorm 类的实例,然后传入到优化器中,优化器会在更新参数前,对梯度进行裁剪。

 

 二. 模型导出ONNX协议

ONNX(Open Neural Network Exchange)是一种用于表示机器学习模型的开放式格式。它是由微软和Facebook共同开发的,并得到了其他公司和组织的支持,如AWS、Nvidia等。ONNX 的主要目的是提供一种跨平台、跨框架的标准,使得不同深度学习框架之间可以无缝地集成和交互。

ONNX 使用一种中间表示格式来表示深度学习模型,这种格式不依赖于任何具体的框架,而是采用一组通用的操作符和张量描述符。通过这种方式,ONNX 可以在不同的框架之间转换模型,并在多个硬件平台上运行。

ONNX 的优点包括:

  1. 跨平台:ONNX 可以在不同的硬件和操作系统上运行,使得模型可以更加灵活地部署和应用。

  2. 跨框架:ONNX 支持多个流行的深度学习框架,如PyTorch、TensorFlow、CNTK等,使得不同框架之间可以方便地转换和集成模型。

  3. 高性能:ONNX 的中间表示格式被设计为高效的计算图形格式,可以优化模型的计算性能。

  4. 开放式:ONNX 是一个开放的标准,任何人都可以使用和扩展它。

因此,ONNX 是一种非常有用的技术,可以加速深度学习模型的部署和应用,并促进不同框架之间的协作和发展。

ONNX (Open Neural Network Exchange) 是针对机器学习所设计的开源文件格式,用于存储训练好的模型。它使得不同的人工智能框架可以采用相同格式存储模型并交互。通过ONNX格式,Paddle模型可以使用OpenVINO、ONNX Runtime等框架进行推理。

详情:Paddle 模型导出 ONNX 协议-使用文档-PaddlePaddle深度学习平台

三、动态图转静态图

3.1两种图定义

动态图(Dynamic Graph)和静态图(Static Graph)是深度学习框架中的两种模型建立方式。

静态图是指在模型建立之前,先定义好整个计算图,然后再将数据输入计算图中进行计算。这种方式最早出现在 TensorFlow 中,用户需要先定义计算图的结构,然后再将数据输入计算图中进行计算,具有很好的性能和可扩展性。

动态图是指在模型运行时才会生成计算图。例如,PyTorch 和 Chainer 就是使用动态图的深度学习框架。在动态图中,用户可以像编写 Python 代码一样自由地构建模型,这种方式具有更好的灵活性和易用性,适合快速原型开发和实验。

静态图和动态图各有优缺点,例如:

  • 静态图的优点在于可以预先优化计算图,提高运行效率和扩展性,适合大规模生产环境。

  • 动态图的优点在于可以更灵活地构建模型,方便调试和实验,适合研究和原型开发阶段。

总的来说,静态图和动态图是两种不同的建模方式,根据具体的需求和场景,可以选择适合自己的深度学习框架和建模方式。

3.2 什么场景下需要动态图转静态图

飞桨框架在设计时,考虑同时兼顾动态图的高易用性和静态图的高性能优势,采用『动静统一』的方案:

  • 在模型开发时,推荐采用动态图编程。 可获得更好的编程体验、更易用的接口、更友好的调试交互机制。
  • 在模型训练或者推理部署时,只需添加一行装饰器 @to_static,即可将动态图代码转写为静态图代码,并在底层自动使用静态图执行器运行。 可获得更好的模型运行性能。

根据Operator解析执行方式不同,飞桨支持如下两种编程范式:

  • 静态图模式(声明式编程范式)先编译后执行的方式。用户需预先定义完整的网络结构,再对网络结构进行编译优化后,才能执行获得计算结果。
  • 动态图模式(命令式编程范式)解析式的执行方式。用户无需预先定义完整的网络结构,每写一行网络代码,即可同时获得计算结果。

举例来说,假设用户写了一行代码:y=x+1,在静态图模式下,运行此代码只会往计算图中插入一个Tensor加1的Operator,此时Operator并未真正执行,无法获得y的计算结果。但在动态图模式下,所有Operator均是即时执行的,运行完此代码后Operator已经执行完毕,用户可直接获得y的计算结果。

3.3为什么动态图模式越来越流行

动态图模式越来越流行的原因有以下几点:

  1. 更直观的代码结构:动态图模式使用 Python 代码来构建计算图,使得代码更加直观和易于理解。在静态图模式中,用户需要先定义计算图的结构,这使得代码结构更加复杂和难以理解。

  2. 更高的灵活性:在动态图模式下,用户可以根据需要随时更改模型结构,添加或删除计算节点,以适应不同的应用场景。这使得动态图模式更适合于快速原型开发和研究实验。

  3. 更快的迭代速度:在动态图模式下,用户可以更快地进行模型迭代和调试,因为他们可以直接查看模型的输出,无需手动构建和运行计算图。

  4. 更好的可读性和可维护性:动态图模式中的代码结构更加直观和易于理解,这使得代码更易于维护和扩展。此外,动态图模式也提供了更好的调试和错误排除功能。

  5. 更广泛的支持:目前,许多流行的深度学习框架都支持动态图模式,如PyTorch、TensorFlow2.0、Chainer等。这使得用户可以在多个框架之间灵活切换,并选择适合自己的建模方式。

因此,动态图模式在深度学习中越来越流行,使得开发人员和研究人员可以更快地迭代和构建模型,并更好地理解和维护代码。

3.4总结

动态图改写成静态图的时候,主要有以下几点区别:

  1. 使用的API不同:飞桨同时提供了动态图用法和静态图用法,两者可以共用大部分API,但需要注意还有一小部分API需要区分动态图和静态图,比如上例中的模型保存和加载的API等;另外,动态图中可以随意使用Python的控制流语句,但是在静态图中,当控制流中的判断条件与数据相关时(如前文提到while_loop的例子),需要转换为使用while_loop,cond,case,switch_case等几个专用的控制流API。
  2. 数据读取过程不同:虽然使用的接口基本一致,但动态图在程序运行时读入数据,与我们平时编写python等程序的习惯相同,但在静态图组网阶段并没有实际运行网络,因此并不读入数据,所以需要使用“占位符”(paddle.data)指明输入数据的类型、shape等信息,以完成组网,具体用法请参考飞桨官网DataLoader的API文档。
  3. 执行时期不同:动态图是“所见即所得”的执行方式,而静态图分为编译期和执行器,无论是训练还是预测,都需要使用执行器来执行网络,调用执行器时,需要初始化、指定输入数据和要获取的返回值等。

4.推理部署

4.1 服务器部署 — Paddle Inference

服务器部署 — Paddle Inference-使用文档-PaddlePaddle深度学习平台

与主框架model.predict区别

飞桨推理产品paddle inference和主框架的Model.predict均可实现推理预测,Paddle Inference 是飞桨的原生推理库, 作用于服务器端和云端,提供高性能的推理能力,主框架的Model 对象是一个具备训练、测试、推理的神经网络。相比于Model.predict,inference可使用MKLDNN、CUDNN、TensorRT进行预测加速,同时支持用 X2Paddle 工具从第三方框架(TensorFlow、Pytorh 、 Caffe 等)产出的模型,可联动PaddleSlim,支持加载量化、裁剪和蒸馏后的模型部署。Model.predict适用于训练好的模型直接进行预测,paddle inference适用于对推理性能、通用性有要求的用户,针对不同平台不同的应用场景进行了深度的适配优化,保证模型在服务器端即训即用,快速部署。

还有高性能实现、内存/显存复用提升服务吞吐量、细粒度OP横向纵向融合减少计算量和内置高性能的CPU/GPU Kernel等优点

4.2 移动端/嵌入式部署 — Paddle Lite

Paddle-Lite为Paddle-Mobile的升级版,定位支持包括手机移动端在内更多场景的轻量化高效预测,支持更广泛的硬件和平台,是一个高性能、轻量级的深度学习预测引擎。在保持和PaddlePaddle无缝对接外,也兼容支持其他训练框架产出的模型。

完整使用文档位于 Paddle-Lite 文档 。

4.3 模型压缩 — PaddleSlim

PaddleSlim是一个模型压缩工具库,包含模型剪裁、定点量化、知识蒸馏、超参搜索和模型结构搜索等一系列模型压缩策略。

对于业务用户,PaddleSlim提供完整的模型压缩解决方案,可用于图像分类、检测、分割等各种类型的视觉场景。 同时也在持续探索NLP领域模型的压缩方案。另外,PaddleSlim提供且在不断完善各种压缩策略在经典开源任务的benchmark, 以便业务用户参考。

对于模型压缩算法研究者或开发者,PaddleSlim提供各种压缩策略的底层辅助接口,方便用户复现、调研和使用最新论文方法。 PaddleSlim会从底层能力、技术咨询合作和业务场景等角度支持开发者进行模型压缩策略相关的创新工作。


文章来源:

NLP涉及技术原理和应用简单讲解【一】:paddle(梯度裁剪、ONNX协议、动态图转静态图、推理部署) - 腾讯云开发者社区-腾讯云

梯度裁剪方式介绍-使用文档-PaddlePaddle深度学习平台

猜你喜欢

转载自blog.csdn.net/m0_62237233/article/details/130404115