PaddleSlim对BERT-base模型进行压缩/OFA

2023-10-19 02:50

本文主要是介绍PaddleSlim对BERT-base模型进行压缩/OFA,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述
针对不同的应用,能快速训练选择出来

在这里插入图片描述
BERT-base模型是一个迁移能力很强的通用语义表示模型,但是模型中也有一些参数冗余。本教程将介绍如何使用PaddleSlim对BERT-base模型进行压缩。
压缩原理
对Fine-tuning得到模型通过计算参数及其梯度的乘积得到参数的重要性,把模型参数根据重要性进行重排序。
超网络中最大的子网络选择和Bert-base模型网络结构一致的网络结构,其他小的子网络是对最大网络的进行不同的宽度选择来得到的,宽度选择具体指的是网络中的参数进行裁剪,所有子网络在整个训练过程中都是参数共享的。
用重排序之后的模型参数作为超网络模型的初始化参数。
Fine-tuning之后的模型作为教师网络,超网络作为学生网络,进行知识蒸馏。

OFA-训练
在进行Once-For-All训练之前,需要把普通的模型先转换为由动态OP组网的超网络。超网络转换方式可以参考 超网络转换 。Once-For-All 训练参数配置
RunConfig
超网络实际运行需要用到的配置和超参,通过字典的形式配置。如果想使用论文中默认的 Progressive shrinking 的方式进行超网络训练,则本项为必填参数。否则可以通过 paddleslim.nas.ofa.OFA().set_epoch(epoch) 和 paddleslim.nas.ofa.OFA().set_task(task, phase=None) 来手动指定超网络训练所处的阶段。默认:None。参数:
train_batch_size:(int, 可选): 训练时的batch size,用来计算每个epoch包括的iteration数量。默认:None。
n_epochs(list, 可选): 包含每个阶段运行到多少epochs,用来判断当前epoch在超网训练中所处的阶段,默认:None。
total_images(int, 可选): 训练集图片数量,用来计算每个epoch包括的iteration数量。默认:None。
elastic_depth(list/tuple, 可选): 如果设置为None,则不把depth作为搜索的一部分,否则,采样到的config中会包含depth。对模型depth的改变需要在模型定义中的forward部分配合使用,具体示例可以参考 示例 ,默认:None。
dynamic_batch_size(list, 可选): 代表每个阶段每个batch数据应该参与几个子网络的训练,shape应该和n_epochs的shape保持一致。默认:None。
返回: 训练配置。示例代码:from paddleslim.nas.ofa import RunConfig
default_run_config = {'train_batch_size': 1,'n_epochs': [[1], [2, 3], [4, 5]],'total_images': 12,'elastic_depth': (5, 15, 24),'dynamic_batch_size': [1, 1, 1],
}
run_config = RunConfig(**default_run_config)
DistillConfig
如果在训练过程中需要添加蒸馏的话,蒸馏过程的配置和超参,通过字典的形式配置,默认:None。参数:
lambda_distill(float, 可选): 蒸馏loss的缩放比例,默认:None。
teacher_model(instance of paddle.nn.Layer, 可选): 教师网络实例,默认:None。
mapping_layers(list[str], 可选): 如果需要给模型中间层添加蒸馏,则需要用这个参数给出需要添加蒸馏的中间层的名字,默认:None。
teacher_model_path(str, 可选): 教师网络预训练模型的路径,默认:None。
distill_fn(instance of paddle.nn.Layer, 可选): 如果需要自定义添加蒸馏loss,则需要传入loss的实例,若传入参数为None,则默认使用mse_loss作为蒸馏损失,默认:None。
mapping_op(str, 可选): 如果在给模型中间层添加蒸馏的时候教师网络和学生网络中间层的shape不相同,则给学生网络中间层添加相应的op,保证在计算蒸馏损失时,教师网络和学生网络中间层的shape相同。该参数可选范围为 ["conv", "linear", None]'conv'表示添加Conv2D,'linear'表示添加Linear,None表示不添加任何op。若使用本参数在蒸馏过程中额外添加op,则在优化过程中可以调用 paddleslim.nas.ofa.OFA().netAs_param 获取到这些op的参数,并把这些op的参数添加到优化器的参数列表中。默认:None。
返回: 蒸馏配置。示例代码:from paddleslim.nas.ofa import DistillConfig
default_distill_config = {'lambda_distill': 0.01,'teacher_model': teacher_model,'mapping_layers': ['models.0.fn'],'teacher_model_path': None,'distill_fn': None,'mapping_op': 'conv2d'
}
distill_config = DistillConfig(**default_distill_config)
OFA
把超网络训练方式转换为Once-For-All的方式训练。在 Once-For-All论文 中,提出 Progressive Shrinking 的超网络训练方式,具体原理是在训练过程中按照 elastic kernel_size 、 elastic width 、 elactic depth 的顺序分阶段进行训练,并且在训练过程中逐步扩大搜索空间,例如:搜索空间为 kernel_size=(3,5,7), expand_ratio=(0.5, 1.0, 2.0), depth=(0.5, 0.75, 1.0) ,则在训练过程中首先对kernel size的大小进行动态训练,并把kernel_size的动态训练分为两个阶段,第一阶段kernel_size的搜索空间为 [5, 7] ,第二阶段kernel_size的搜索空间为 [3, 5, 7] ;之后把expand_ratio的动态训练加入到超网络训练中,和对kernel_size的训练方式相同,对expand_ratio的动态训练也分为两个阶段,第一阶段expand_ratio的搜索空间为 [1.0, 2.0] ,第二阶段expand_ratio的搜索空间为 [0.5, 1.0, 2.0] ;最后对depth进行动态训练,训练阶段和kernel_size相同。.. py:class:: paddleslim.nas.ofa.OFA(model, run_config=None, distill_config=None, elastic_order=None, train_full=False)源代码参数:model(paddle.nn.Layer): 把超网络的训练规则转换成默认的Once-For-All论文中推荐的方式训练。
run_config(paddleslim.ofa.RunConfig, 可选): 模型运行过程中的配置,默认:None。
distill_config(paddleslim.ofa.DistillConfig, 可选): 若模型运行过程中添加蒸馏的话,蒸馏相关的配置,具体可配置的参数请参考 `DistillConfig <>`_ , 为None的话则不添加蒸馏,默认:None。
elastic_order(list, 可选): 指定训练顺序,若传入None,则按照默认的 Progressive Shrinking 的方式进行超网络训练,默认:None。
train_full(bool, 可选): 是否训练超网络中最大的子网络,默认:False。
返回: OFA实例示例代码:from paddle.vision.models import mobilenet_v1
from paddleslim.nas.ofa import OFA
from paddleslim.nas.ofa.convert_super import Convert, supernetmodel = mobilenet_v1()
sp_net_config = supernet(kernel_size=(3, 5, 7), expand_ratio=[1, 2, 4])
sp_model = Convert(sp_net_config).convert(model)
ofa_model = OFA(sp_model)
.. py:method:: set_epoch(epoch)手动设置OFA训练所处的epoch。参数:
epoch(int)- 模型训练过程中当前所处的epoch。
返回: None示例代码:ofa_model.set_epoch(3)
.. py:method:: set_task(task, phase=None)手动设置OFA超网络训练所处的阶段。参数:
task(list(str)|str): 手动设置超网络训练中当前训练的任务名称,可选 "kernel_size", "width", "depth"phase(int, 可选): 手动设置超网络训练中当前训练任务所处的阶段,阶段指的是 Progresssive Shrinking 训练方式中每个任务依次增加搜索空间,不同阶段代表着不同大小的搜索空间,若为None,则当前任务使用整个搜索空间,默认:None。
返回: None示例代码:ofa_model.set_task('width')
.. py:method:: set_net_config(config)手动指定训练超网络中的指定配置的子网络,在训练超网络中特定的某一个或几个子网络时使用。参数:
config(dict): 某个子网络训练中每层的训练配置。
返回: None示例代码:config = {'conv2d_0': {'expand_ratio': 2}, 'conv2d_1': {'expand_ratio': 2}} ofa_model.set_net_config(config)
.. py:method:: calc_distill_loss()若OFA训练过程中包含中间层蒸馏,则需要调用本接口获取中间蒸馏损失。返回: 中间层蒸馏损失。示例代码:distill_loss = ofa_model.calc_distill_loss()
.. py:method:: search()
### TODO.. py:method:: export(origin_model, config, input_shapes, input_dtypes, load_weights_from_supernet=True)根据传入的原始模型结构、子网络配置,模型输入的形状和类型导出当前子网络,导出的子网络可以进一步训练、预测或者调用框架动静转换功能转为静态图模型。参数:
origin_model(paddle.nn.Layer): 原始模型实例,子模型会直接在原始模型的基础上进行修改。
config(dict): 某个子网络每层的配置,可以用。
input_shapes(list|list(list)): 模型输入的形状。
input_dtypes(list): 模型输入的类型。
load_weights_from_supernet(bool, optional): 是否从超网络加载参数。若为False,则不从超网络加载参数,则只根据config裁剪原始模型的网络结构;若为True,则用超网络参数来初始化原始模型,并根据config裁剪原始模型的网络结构。默认:True。
返回: 子模型实例。示例代码:from paddle.vision.models import mobilenet_v1 origin_model = mobilenet_v1()config = {'conv2d_0': {'expand_ratio': 2}, 'conv2d_1': {'expand_ratio': 2}} origin_model = ofa_model.export(origin_model, config, input_shapes=[1, 3, 28, 28], input_dtypes=['float32'])

这篇关于PaddleSlim对BERT-base模型进行压缩/OFA的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/236791

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费