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深度学习平台

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/14644.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【NFS共享存储服务】

目录 一、NFS (Network File System)网络文件系统1.1、NFS工作原理1.2、举例1.2.1、共享文件总结 一、NFS (Network File System)网络文件系统 依赖于RPC (远端过程调用) 需安装nfs-utils、rpcbind软件包 系统服务: nfs、rpcbind 共享配置文件: /etc/ex…

Ajax和Json综合案例

1. 查询所有 创建brand.html,使用axios发送请求&#xff0c;其中查询一般采用get的请求方式 <script src"js/axios-0.18.0.js"></script><script>//1. 当页面加载完成后&#xff0c;发送ajax请求window.onload function () {//2. 发送ajax请求axi…

造型简约的机箱,安装简单兼容性好,安钛克P20C体验

我们准备组装一台新主机的时候&#xff0c;机箱确实很重要&#xff0c;它决定了主机的整体风格和兼容性。我比较喜欢用中塔机箱&#xff0c;像是上个月我新装的主机&#xff0c;用的就是安钛克P20C&#xff0c;这款机箱的设计很简约&#xff0c;而且还有多种版本可选&#xff0…

【剑指offer】学习计划day1

目录 一. 前言 二. 用两个栈实现队列 a.题目 b.题解分析 c.AC代码 二. 包含min函数的栈 a.题目 b.题解分析 c.AC代码 一. 前言 本系列是针对Leetcode中剑指offer学习计划的记录与思路讲解。详情查看以下链接&#xff1a; 剑指offer-学习计划https://leetcode.cn/study-pla…

jstat命令查看jvm内存情况及GC内存变化

命令格式 jstat [Options] pid [interval] [count] 参数说明&#xff1a; Options&#xff0c;选项&#xff0c;一般使用 -gc、-gccapacity查看gc情况 pid&#xff0c;VM的进程号&#xff0c;即当前运行的java进程号 interval&#xff0c;间隔时间(按该时间频率自动刷新当前内存…

Python整个颜色小网站,给刚刚失恋的他.........

一些过场剧情: 死党一直暗恋校花&#xff0c;但是校花对他印象也不差&#xff0c; 就是死党一直太怂了&#xff0c;不敢去找校花&#xff0c; 直到昨天看到校花登上了校董儿子的豪车&#xff0c; 死党终于彻底死心&#xff0c;大醉一场&#xff0c;作为他的兄弟&#xff0c…

系统集成项目管理工程师 笔记(第六章:项目整体管理)

文章目录 项目整体管理6个过程制定项目章程过程 6.3 制订项目管理计划 2476.4 指导与管理项目工作 2516.5 监控项目工作 255监控项目工作的输入监控项目工作的工具与技术监控项目工作的输出 6.6 实施整体变更控制6.7结束项目或阶段 6.1 项目整体管理概述 242 6.1.1 项目整体管理…

“探索C++非质变算法:如何更高效地处理数据“

&#x1f4d6;作者介绍&#xff1a;22级树莓人&#xff08;计算机专业&#xff09;&#xff0c;热爱编程&#xff1c;目前在c&#xff0b;&#xff0b;阶段>——目标Windows&#xff0c;MySQL&#xff0c;Qt&#xff0c;数据结构与算法&#xff0c;Linux&#xff0c;多线程&…

王道计组(23版)6_总线

总线概述 特点 分时&#xff1a;同一时刻只允许一个部件向总线发送信息 共享&#xff1a;总线上可以挂接多个部件&#xff0c;各个部件互相交换的信息都可以通过这组线路分时共享&#xff0c;多个部件可以同时从总线接收相同的信息 分类 片内总线&#xff1a;CPU芯片内部AL…

Linux下版本控制器(SVN) -命令行客户端

文章目录 进阶知识-Linux下版本控制器(SVN)5、命令行客户端5.1 创建两个工作区目录模拟两个开发人员5.2 检出5.3 添加5.4 提交5.5 查看服务器端文件内容5.6 更新操作5.7 冲突5.7.1 过时的文件5.7.2 冲突的产生5.7.3 冲突的表现5.7.4 冲突的手动解决5.7.5 冲突的半自动解决5.7.6…

openharmony内核中不一样的双向链表

不一样的双向链表 链表初识别遍历双向链表参考链接 链表初识别 最近看openharmony的内核源码时看到一个有意思的双向链表&#xff0c;结构如下 typedef struct LOS_DL_LIST{struct LOS_DL_LIST *pstPrev; //前驱节点struct LOS_DL_LIST *pstNext; //后继节点 }LOS_DL_LIST;不…

算法:在指定范围内生成随机不重复的位置

问题&#xff1a; 在游戏中&#xff0c;我们经常会遇到以下问题&#xff1a;在指定的范围内生成随机不重复的位置。 比如某次“神官赐福”活动中&#xff0c;需要在城门口生成n个不重复的宝箱。 针对这种问题&#xff0c;我们可以先将范围按照宝箱&#xff08;基本单元格&#…

【代码随想录】刷题Day5

1.链表重复节点删除 82. 删除排序链表中的重复元素 II 前后指针实现 1.做这道题最大的感受就是&#xff1a;不要觉得开辟空间浪费&#xff0c;多用临时变量去记录。越精确越容易成功 2.首先没有节点或者一个节点直接返回 3.因为头部会出现一样元素的情况&#xff0c;以至于我不…

Transformer 位置编码代码解析

Transformer 位置编码代码解析 Transformer 的 Multi-Head-Attention 无法判断各个编码的位置信息。因此 Attention is all you need 中加入三角函数位置编码&#xff08;sinusoidal position embedding&#xff09;&#xff0c;表达形式为&#xff1a; P E ( p o s , 2 i ) …

springboot +flowable,处理 flowable 的用户和用户组(一)

一.简介 对于flowable是什么以及关于此框架的具体信息可以参看此项目的官方文档&#xff1a;https://www.flowable.org/docs/userguide/index.html Flowable is a light-weight business process engine written in Java.这是官网文档对此框架的完美解释&#xff1a;Flowable…

养老保障金查询系统【GUI/Swing+MySQL】(Java课设)

系统类型 Swing窗口类型Mysql数据库存储数据 使用范围 适合作为Java课设&#xff01;&#xff01;&#xff01; 部署环境 jdk1.8Mysql8.0Idea或eclipsejdbc 运行效果 本系统源码地址&#xff1a;https://download.csdn.net/download/qq_50954361/87700421 更多系统资源库…

Redis入门学习笔记【二】Redis缓存

目录 一、Redis缓存 二、Redis使用缓存遇到的问题 2.1 数据一致性 2.2缓存雪崩 2.3 缓存穿透 2.4 缓存击穿 一、Redis缓存 数据缓存是Redis最重要的一个场景&#xff0c;为缓存而生&#xff0c;在springboot中&#xff0c;一般有两种使用方式&#xff1a; 直接通过RedisT…

【无人机】无人机平台的非移动 GPS 干扰器进行位置估计的多种传感器融合算法的性能分析(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

leetcode142_环形链表 II

文章目录 题目详情分析Java完整代码 题目详情 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给…

「数据架构」MDM实现失败的主要原因

我经常参与一个组织的MDM程序&#xff0c;当他们在一个失败的项目之后向InfoTrellis请求帮助进行清理&#xff0c;或者开始尝试X&#xff0c;以实现对某些人来说非常困难的目标时。主数据管理实现失败的原因有很多&#xff0c;但是没有一个是由于在这些场景中使用的责备游戏的原…