模型压缩技术从零到一

模型压缩是深度学习中的重要技术,旨在减小模型尺寸和计算需求,特别适合在移动设备或嵌入式系统上部署。

要点
  • 模型压缩技术可以显著减小模型尺寸和计算需求,适合资源受限设备。
  • 主要技术包括剪枝、量化、知识蒸馏、低秩分解和轻量级模型设计,各有优劣。
  • 这些方法在保持性能的同时提升部署效率,但效果因任务和模型而异。
主要方法概述

以下是几种常见的模型压缩技术:

  • 剪枝:通过移除不重要的权重或神经元减小模型尺寸。
  • 量化:将浮点数权重转换为低精度格式(如8位整数)以加速推理。
  • 知识蒸馏:训练小型模型模仿大型模型的行为,保持性能。
  • 低秩分解:将权重矩阵分解为较小矩阵,减少参数数量。
  • 轻量级模型设计:从头设计高效架构,如MobileNet,减少计算量。
简单示例

以下是部分技术的简单代码示例,基于PyTorch:

  • 剪枝:随机剪枝30%权重:

    import torch.nn.utils.prune as prune
    prune.random_unstructured(module, name="weight", amount=0.3)
    
  • 量化:动态量化模型:

    import torch
    model_dynamic_quantized = torch.quantization.quantize_dynamic(model, qconfig_spec={torch.nn.Linear}, dtype=torch.qint8)
    
  • 知识蒸馏:定义蒸馏损失:

    def distillation_loss(student_logits, teacher_logits, T, alpha):soft_labels = F.softmax(teacher_logits / T, dim=1)student_log_probs = F.log_softmax(student_logits / T, dim=1)distill_loss = F.kl_div(student_log_probs, soft_labels, reduction='batchmean') * (T ** 2)return distill_loss
    

文档:PyTorch Pruning Tutorial和PyTorch Quantization Documentation。


模型压缩技术在深度学习领域中至关重要,特别是在资源受限的设备上部署模型时,如移动电话、嵌入式系统或边缘设备。这些技术通过减小模型尺寸、降低计算需求和加速推理,显著提升了模型的实用性。本报告将全面探讨几种主要的模型压缩技术,包括剪枝、量化、知识蒸馏、低秩分解和轻量级模型设计,涵盖技术细节、实现方法和实际应用。

剪枝(Pruning)

技术细节

剪枝通过移除对模型准确性贡献不大的权重或神经元来减小模型尺寸。剪枝可分为两种主要类型:

  • 结构化剪枝:移除整个通道或滤波器,保持规则的稀疏性,便于硬件加速。方法包括基于通道的重要度评估(如绝对权重和,Li et al.),全局和动态剪枝(Lin et al.),网络瘦身(Liu et al. )等。
  • 非结构化剪枝:基于启发式方法零出不重要的权重,导致不规则稀疏性,难以硬件加速。方法包括最优脑损伤(LeCun et al.,1989年),训练-剪枝-重训练方法(Han et al. )等。
实现细节

在PyTorch中,可以使用torch.nn.utils.prune模块进行剪枝。例如,随机剪枝30%的权重:

import torch.nn.utils.prune as prune
prune.random_unstructured(module, name="weight", amount=0.3)

对于结构化剪枝,按L2范数剪枝50%通道:

prune.ln_structured(module, name="weight", amount=0.5, n=2, dim=0)

此外,Torch-Pruning库提供图结构算法DepGraph,自动识别依赖关系,适合复杂网络剪枝。

优势与劣势
  • 优势:结构化剪枝便于硬件加速;非结构化剪枝可实现高压缩率。例如,ResNet-50剪枝后参数减少75%,计算时间减少50%。
  • 劣势:结构化剪枝可能降低准确性;非结构化剪枝导致不规则架构,加速困难。

量化(Quantization)

技术细节

量化通过将浮点权重转换为低精度格式(如8位整数)来减小模型尺寸和加速推理。主要方法包括:

  • 训练后量化:在训练后对模型进行量化,可能导致准确性损失。
  • 量化感知训练:在训练过程中考虑量化,通过假量化插入保持准确性。

量化支持的运算符有限,PyTorch和TensorFlow提供相关工具。

实现细节

在PyTorch中,动态量化示例:

import torch
model_dynamic_quantized = torch.quantization.quantize_dynamic(model, qconfig_spec={torch.nn.Linear}, dtype=torch.qint8)

静态量化需要校准,示例:

backend = "qnnpack"
model.qconfig = torch.quantization.get_default_qconfig(backend)
torch.backends.quantized.engine = backend
model_static_quantized = torch.quantization.prepare(model, inplace=False)
# 使用代表性数据校准
model_static_quantized = torch.quantization.convert(model_static_quantized, inplace=False)
优势与劣势
  • 优势:减小存储、内存和计算需求,加速推理。例如,MobileNet v2量化后尺寸为3.63MB,静态量化为3.98MB。
  • 劣势:可能需要长时间训练或微调,灵活性较低。
应用实例
  • AlexNet量化后尺寸缩小35倍,推理速度提升3倍(结合剪枝)。
  • VGG16量化后尺寸缩小49倍(结合剪枝)。

知识蒸馏(Knowledge Distillation)

技术细节

知识蒸馏通过训练小型学生模型模仿大型教师模型的行为,学生学习教师的输出(如最终预测或中间特征)。方法包括:

  • 响应基于:模仿最终预测,使用Softmax。
  • 特征基于:使用中间层特征。
  • 关系基于:探索层间关系。

策略包括离线蒸馏、在线蒸馏和自蒸馏。

实现细节

在PyTorch中,定义蒸馏损失,结合交叉熵损失:

def distillation_loss(student_logits, teacher_logits, T, alpha):soft_labels = F.softmax(teacher_logits / T, dim=1)student_log_probs = F.log_softmax(student_logits / T, dim=1)distill_loss = F.kl_div(student_log_probs, soft_labels, reduction='batchmean') * (T ** 2)return distill_lossce_loss = F.cross_entropy(student_logits, labels)
distill_loss = distillation_loss(student_logits, teacher_logits, T, alpha)
total_loss = alpha * distill_loss + (1 - alpha) * ce_loss
优势与劣势
  • 优势:压缩大型模型为小型模型,保持相似性能,适合资源受限设备。
  • 劣势:需要训练两个模型,训练时间长。
应用实例
  • 在CIFAR-10上,学生模型(LightNN)通过知识蒸馏准确性从70.33%提升至70.56%(Knowledge Distillation Tutorial)。

低秩分解(Low-Rank Factorization)

技术细节

低秩分解通过将权重矩阵分解为较小矩阵的乘积来减小参数数量。例如,W ≈ U * V,其中U和V是较小矩阵。适用于卷积层和全连接层,主要方法包括CP分解和Tucker分解。

实现细节

在PyTorch中,使用Tensorly库进行分解。例如,CP分解:

  • cp_decomposition_conv_layer函数返回nn.Sequential序列,包括点wise和depthwise卷积。

Tucker分解:

  • tucker_decomposition_conv_layer函数返回三个卷积层的序列,使用VBMF估计秩。

具体实现参考PyTorch Tensor Decompositions。

优势与劣势
  • 优势:对于大型卷积核和中小型网络,压缩和加速效果好。例如,Jaderberg et al. [98]在文本识别中实现4.5倍速度提升,准确性下降1.00%。
  • 劣势:对1×1卷积无效,矩阵分解计算密集,需要重训练。
应用实例
  • AlexNet CP分解后压缩率5.00,速度提升1.82倍。
  • VGG16 Tucker分解后压缩率2.75,速度提升2.05倍(Low-Rank Decomposition Performance)。

轻量级模型设计(Lightweight Model Design)

技术细节

轻量级模型设计从头设计高效网络架构,减少参数和计算量。常用技术包括1×1卷积、深度可分离卷积等。代表模型包括SqueezeNet、MobileNet、ShuffleNet等。

实现细节

在PyTorch中,直接加载预训练模型:

import torch
model = torch.hub.load('pytorch/vision', 'mobilenet_v2', pretrained=True)
优势与劣势
  • 优势:简单、快速、低存储和计算需求,性能良好。例如,SqueezeNet参数仅为AlexNet的1/9。
  • 劣势:可能泛化能力较差,不适合作为预训练模型。
应用实例
  • MobileNet v2使用深度可分离卷积,适合移动设备。
  • ShuffleNet通过通道混洗减少计算量(Lightweight Model Skills)。

总结与讨论

模型压缩技术各有其适用场景。剪枝和量化适合已有模型的优化,知识蒸馏适合性能敏感任务,低秩分解适合特定层优化,轻量级设计适合从头开始的开发。结合多种技术可进一步提升效率,但需权衡准确性和复杂性。

以下表格总结各技术的主要特点:

技术核心思想优势劣势
剪枝移除不重要参数硬件加速,压缩率高可能降低准确性,加速困难
量化降低权重精度减小存储,加速推理需要微调,灵活性低
知识蒸馏小模型模仿大模型保持性能,适合资源受限训练时间长,需要两个模型
低秩分解矩阵分解减小参数压缩加速效果好计算密集,需要重训练
轻量级模型设计设计高效架构简单快速,低资源需求泛化能力差,不适合预训练

引用

  • 4 Popular Model Compression Techniques Explained
  • An Overview of Model Compression Techniques for Deep Learning in Space
  • Model Compression - an overview
  • Model Compression for Deep Neural Networks: A Survey
  • A comprehensive review of model compression techniques in machine learning
  • Unify: Model Compression: A Survey of Techniques, Tools, and Libraries
  • 8 Neural Network Compression Techniques For ML Developers
  • An Overview of Neural Network Compression
  • Deep Learning Model Compression for Image Analysis: Methods and Architectures
  • Pruning Tutorial — PyTorch Tutorials 2.6.0+cu124 documentation
  • Quantization — PyTorch 2.6 documentation
  • Quantization Recipe — PyTorch Tutorials 2.6.0+cu124 documentation
  • Practical Quantization in PyTorch
  • Introduction to Quantization on PyTorch
  • Knowledge Distillation Tutorial — PyTorch Tutorials 2.6.0+cu124 documentation

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

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

相关文章

浮点数精度问题

目录 ieee754标准解决方法 和c语言一样,所有以ieee754标准的语言都有浮点数精度问题,js也有浮点数精度问题,并且因为是弱类型语言这个问题更严重,js的Number类型的数据都被视为浮点数 ieee754标准 js的数字类型就相当于c语言doub…

超大规模数据场景(思路)——面试高频算法题目

目录 用4KB内存寻找重复元素 从40个亿中产生不存在的整数【位】 如果只让用10MB空间存储? 初次遍历 二次遍历 用2GB内存在20亿个整数中查找出现次数最多的数【分块】 从亿万个URL中查找问题【分块 堆】 40亿个非负整数中找出现两次的数【位 不过多个位哈】 …

开源身份和访问管理方案之keycloak(三)keycloak健康检查(k8s)

文章目录 开源身份和访问管理方案之keycloak(三)keycloak健康检查启用运行状况检查 健康检查使用Kubernetes下健康检查Dockerfile 中 HEALTHCHECK 指令 健康检查Docker HEALTHCHECK 和 Kubernetes 探针 开源身份和访问管理方案之keycloak(三&…

FATFS备忘

概述 FATFS文件系统可以挂载SD卡也可以挂载FLASH eMMC等设备 SD卡需要格式化为FAT32模式 块大小默认即可 移植 SD卡 SD卡扇区大小是 512B SD卡 SDIO模式 可以直接在cubeMX里一键设置 先设置好SD卡的设置 这个是选择支持中文 其余是默认 这个是检测引脚可以留空 当SD卡插入拔出…

唯美社区源码AM社区同款源码

源码介绍 唯美社区源码AM社区同款源码 后端修改application.properties文件内容为你的数据库 前端修改/config/config.js文件内容为你的后端地址 这两个文件里要修改的地方我已经用中文标注出来了 截图 源码免费下载 唯美社区源码AM社区同款源码

现代Web应用的多标签选择组件:设计哲学与工程实践

引言:标签选择的重要性与挑战 在信息爆炸时代,标签系统已成为内容组织的核心基础设施。研究表明: 使用标签系统的平台用户留存率提高35% 良好的标签选择体验可提升内容发现效率58% 80%的用户更倾向于使用提供可视化标签选择的应用 本文将…

P3799 小 Y 拼木棒

题目背景 上道题中,小 Y 斩了一地的木棒,现在她想要将木棒拼起来。 题目描述 有 n 根木棒,现在从中选 4 根,想要组成一个正三角形,问有几种选法? 答案对 1097 取模。 输入格式 第一行一个整数 n。 第…

Perl 条件语句

Perl 条件语句 引言 在编程中,条件语句是执行分支逻辑的关键部分。Perl 作为一种强大的脚本语言,提供了丰富的条件语句,使得开发者能够根据不同的条件执行不同的代码块。本文将深入探讨 Perl 中的条件语句,包括 if、unless、els…

流量特征分析-蚁剑流量分析

任务: 木马的连接密码是多少 这是分析蚁剑流量,可能是网站的,wireshark过滤http 追踪流http得到 1就是连接密码 flag{1}黑客执行的第一个命令是什么 取最后的执行命令。base64解密得 除了id不是蚁剑自带的命令,其他的都是&…

问题1:Sinal 4在开启PAC检查的设备崩溃

​ 问题信息 硬件不支持PAC(Pointer Authentication),此类错误就是signal 11的错误,崩溃信息如下: Build fingerprint: google/sdk_gphone64_arm64/emu64a:16/BP22.250221.010/13193326:userdebug/dev-keys Revision: 0 ABI: arm64 Timestamp: 2025-04-06 11:33:13.923…

FreeRTOS移植笔记:让操作系统在你的硬件上跑起来

一、为什么需要移植? FreeRTOS就像一套"操作系统积木",但不同硬件平台(如STM32、ESP32、AVR等)的CPU架构和外设差异大,需要针对目标硬件做适配配置。移植工作就是让FreeRTOS能正确管理你的硬件资源。 二、…

【C++11(下)】—— 我与C++的不解之缘(三十二)

前言 随着 C11 的引入,现代 C 语言在语法层面上变得更加灵活、简洁。其中最受欢迎的新特性之一就是 lambda 表达式(Lambda Expression),它让我们可以在函数内部直接定义匿名函数。配合 std::function 包装器 使用,可以…

JavaScript中的Proxy详解

1. 什么是Proxy? Proxy是ES6引入的一个强大特性,它允许你创建一个对象的代理,从而可以拦截和自定义该对象的基本操作。Proxy提供了一种机制,可以在对象的基本操作,如属性查找、赋值、枚举、函数调用等之前或之后执行自…

【git】VScode修改撤回文件总是出现.lh文件,在 ​所有 Git 项目 中全局忽略特定文件

VScode里面powershell被迫关闭 场景解决办法 场景 系统:Windows IDE:Visual Studio Code 一旦修改代码,就算撤回也会显示 解决办法 第一步:“C:\Users\用户名字.gitignore_global”:在该路径下新建.gitignore_glo…

为什么 LoRA 梯度是建立在全量参数 W 的梯度之上

🧠 首先搞清楚 LoRA 是怎么做微调的 我们原来要训练的参数矩阵是 W W W,但 LoRA 说: 别动 W,我在它旁边加一个低秩矩阵 Δ W U V \Delta W UV ΔWUV,只训练这个部分! 也就是说,LoRA 用一个…

Nginx负载均衡时如何为指定ip配置固定服务器

大家在用Nginx做负载均衡时,一般是采用默认的weight权重指定或默认的平均分配实现后端服务器的路由,还有一种做法是通过ip_hash来自动计算进行后端服务器的路由,但最近遇到一个问题,就是希望大部分用户采用ip_hash自动分配后端服务…

Llama 4 家族:原生多模态 AI 创新的新时代开启

0 要点总结 Meta发布 Llama 4 系列的首批模型,帮用户打造更个性化多模态体验Llama 4 Scout 是有 170 亿激活参数、16 个专家模块的模型,同类中全球最强多模态模型,性能超越以往所有 Llama 系列模型,能在一张 NVIDIA H100 GPU 上运…

【硬件开发技巧】如何通过元器件丝印反查型号

目录 一、在线数据库查询 二、官方资料匹配 三、专业软件辅助 四、实物比对与场景推断 五、社区与人工支持 注意事项 一、在线数据库查询 专业元器件平台 Digi-Key、Mouser、ICMaster等平台支持直接输入丝印代码检索,可获取芯片型号、技术文档及替代型号。例如…

【算法/c++】利用中序遍历和后序遍历建二叉树

目录 题目:树的遍历前言题目来源树的数组存储基本思想存储规则示例 建树算法关键思路代码总代码 链表法 题目:树的遍历 前言 如果不是完全二叉树,使用数组模拟树,会很浪费空间。 题目来源 本题来自 PTA 天梯赛。 题目链接: 树…

李臻20242817_安全文件传输系统项目报告_第6周

安全文件传输系统项目报告(第 1 周) 1. 代码链接 Gitee 仓库地址:https://gitee.com/li-zhen1215/homework/tree/master/Secure-file 代码结构说明: project-root/├── src/ # 源代码目录│ ├── main.c # 主程序入口│ ├…