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

news2024/11/24 5:59:14

目录

一、梯度裁剪

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

k8s 部署 seata1.6.0 集群 基于 nacos 注册中心 + mysql 数据库

k8s 部署 seata1.6.0 集群 基于 nacos 注册中心 mysql 数据库 大纲 1 镜像制作2 准备configmap3 准备deploy 部署文件4 部署seata到k8s 镜像制作 下载seata 选择1.6.0。下载后得到 seata-server-1.6.0.zip 已经上传到百度云盘 下载地址:http://seata.io/zh-cn…

Maven 依赖下载失败解决方案——配置国内源 + 具体解决办法

目录 前言 一、配置 Maven 国内源 二、重新下载jar包 三、其他问题 前言 最近发现 spring-boot 框架更新到 2.7.11 了,由于以前一直使用的是 2.7.9 ,所以一直出现依赖下载失败的问题,实际上这是由于 IDEA 会先加载之前下载好的依赖&#xf…

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

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

FPGA入门系列12--RAM的使用

文章简介 本系列文章主要针对FPGA初学者编写,包括FPGA的模块书写、基础语法、状态机、RAM、UART、SPI、VGA、以及功能验证等。将每一个知识点作为一个章节进行讲解,旨在更快速的提升初学者在FPGA开发方面的能力,每一个章节中都有针对性的代码…

Spring IOC DI - 整合MyBatis

Spring IOC目录 主要内容Spring 框架介绍Spring 框架的优势(对比以前项目的缺点)Spring 框架引入历史发展框架学习三要素Spring 模块介绍 Spring IoC/DI - 引入IoC/DI 概念辨析使用IoC/DI的好处IoC/DI具体应用场景 Spring IoC/DI - 代码实现环境准备Spring 框架环境搭建创建Mav…

图的遍历和应用

文章目录 图的遍历深度优先遍历对于无向图的邻接矩阵的深度优先遍历无向非连通图的深度优先遍历 对于无向图的邻接表的深度优先遍历非递归实现深度优先遍历无向图的邻接矩阵代码实现无向图的邻接表代码实现递归和非递归的同异 广度优先遍历邻接表BFS邻接矩阵BFS 图的应用生成树…

Android 拍照以及相册中选择(适配高版本)————上传头像并裁剪(一)

前言 在项目研发中,相信大家都遇到过给用户增加头像照片的需求。 随着手机版本的不断更新,android 8、android 9、android 10、android 12、android 13、鸿蒙系统等等;遇到这个功能需求,大家肯定会想,“这还不好写&…

“双碳”目标下二氧化碳地质封存技术应用前景及模型构建实践方法

二氧化碳地质封存技术起步较晚,目前仍没有一套相对完整的行业规范;且就该技术而言,涉及环节众多,理论相对复杂,对于行业的新入局者不太友好。因此,结合时代背景,我们首次尝试对二氧化碳地质封存…

【裸金属服务器】安装VMware ESXi

官方安装操作ESXi地址 一、虚拟化服务器分类: 寄居架构(Hosted Architecture)和裸金属架构(Bare Metal Architecture)。 1、寄居架构(Hosted Architecture):在操作系统之上安装和运…

8.系统日志

1.api访问日志 对应数据库 拦截器 拦截逻辑 ApiAccessLogFilter类的createApiAccessLog方法 buildApiAccessLogDTO方法就是完善实体类,把接口执行时长之类的填充完整。 然后就是保存日志到infra_api_access_log数据库。 过滤器注册生效 2.api错误日志 对应数…

Windows 程序开机自启动速度优化,为什么腾讯会议自启动速度那么高?

目录 一、问题的说明和定义 二、问题的分析 1.问题初步分析 2.详细的分析: 2.1Windows常见的自启动方式 2.2Windows常见的自启动方式的细节分析 三、问题的解决方案 1、为什么腾讯会议Rooms那么快 2.我们是否可以跟腾讯会议一样快 一、问题的说明和定义 这…

Vue之插件的定义和使用

概述 学习本文之前,我们需要弄清楚何为插件?插件其实就是一段扩展程序,主要目的是用于扩展功能。就比如Idea家族和VSCode家族的插件,它们也是一段扩展程序,将其安装到IDE中就可以使用插件里面实现的功能了&#xff0c…

SCADA平台的HMI功能

01 前言 虹科Panorama SCADA平台支持桌面HMI、Web HMI和移动HMI的功能。桌面HMI主要是在桌面工作站实现数据可视化,能够获取到最全面的数据信息以及实现功能;Web HMI可以通过在软件中添加Web HMI服务器,运行程序后,可以在Web 客户…

HTML5基础知识总结总结(详细,附带源代码)

HTML5基础知识 一:前言二: HTML基本结构。三:基本标签3.1 h标签3.2 p标签3.3 hr标签3.4 br标签3.5 strong标签与em标签3.6 特殊符号3.7 运行效果 三:图像标签四:链接标签五:列表六:表格七&#…

Allegro PCB后处理和生产文件导出

Allegro PCB后处理,主要是完成线路设计以后,输出生产文件之前的处理。部分是看教程做的记录,方便以后自己参考。 教程: [小哥Cadence Allegro 132讲字幕版PCB视频教程]_哔哩哔哩_bilibili 感觉关键是多看右边Options菜单&#xf…

【15】SCI易中期刊推荐——电子电气 | 仪器仪表(中科院4区)

💖💖>>>加勒比海带,QQ2479200884<<<💖💖 🍀🍀>>>【YOLO魔法搭配&论文投稿咨询】<<<🍀🍀 ✨✨>>>学习交流 | 温澜潮生 | 合作共赢 | 共同进步<<<✨✨ 📚📚>>>人工智能 | 计算机视觉…

[NISACTF 2022]level-up

[NISACTF 2022]level-up f12 发现提示disallow 也就是不允许的想到robots.txt LEVEL_2 <?php //here is level 2 error_reporting(0); #屏蔽报错信息 include "str.php"; #包含str.php这个页面 if (isset($_POST[array1]) && isset($_POST[arr…

巧用千寻位置GNSS软件|如何快速完成道路桥涵放样

道路桥涵放样主要解决道路施工中正交、斜交涵洞的测量&#xff0c;正交涵洞放样是中心线的定线放样&#xff1b;斜交涵洞放养是涵洞中心线与线路成一固定夹角的情况下的放样。 那么如何运用千寻位置GNSS软件实现道路桥涵放样呢&#xff1f;下面为各位一一介绍。 点击【测量】-&…

【移动端网页布局】移动端网页布局基础概念 ⑨ ( webkit 内核 | 移动端网页 CSS 初始化 - normalize.css )

文章目录 一、webkit 内核二、移动端网页 CSS 初始化 - normalize.css 一、webkit 内核 移动端浏览器 都是 基于 webkit 内核的 , QQ 浏览器 / 百度 / Safari / UC 都是基于 webkit 内核的 ; 移动端网页布局需要 兼容 普通浏览器 与 webkit 浏览器 ; webkit 内核浏览器 对 HT…

Ubuntu18 更换 apt 源为阿里云

Step1. 备份 list 文件 进入对应文件夹&#xff0c;用管理员权限&#xff0c;执行复制操作&#xff1a; cd /etc/apt/ sudo cp sources.list sources.list.bak Step2. 修改 list 文件 通过管理员权限&#xff0c;使用 vim 进行修改&#xff1a; sudo vim sources.list 将…