当前位置: 首页 > news >正文

18.剪枝

1.剪枝的定义

把神经网络里不重要的权重 / 神经元删掉,在尽量少掉精度前提下,减小模型体积、降低显存、加速推理,常用于端侧部署。

2.剪枝的分类

  • 非结构化剪枝 -- 减少权重

NPU 无法加速,且 RKNN 不支持稀疏推理,RK3588上基本无意义(RK3588不建议做)。

权重就是神经网络里那些被训练出来、用来“加权计算”的数字;

  • 结构化剪枝 -- 删除Attention Head / 整个 Layer/某些通道

改变矩阵形状,需重新保存 HuggingFace 模型,再由 RKLLM-Toolkit 量化转换

这里的 FNN 通常指 Feedforward Neural Network(前馈神经网络)。 **FFN是 Transformer 中负责“特征变换和非线性增强”的部分,它在每个 token 上独立计算,不做注意力,也不跨 token 交互。

可以理解为:Attention 负责“看哪里重要”,FFN 负责“把信息加工得更丰富”。

如果删减通道,要按通道重要性排序再删,而不是随机删

3.剪枝示例

结构化剪枝代码

import torch from transformers import AutoModelForCausalLM, AutoTokenizer def prune_attention_heads(model, prune_num_heads: int): """ 结构化剪枝:剪掉每一层末尾 prune_num_heads 个注意力头 :param model: causal lm model :param prune_num_heads: 每层要剪掉多少个head :return: pruned model """ config = model.config num_heads = config.num_attention_heads hidden_size = config.hidden_size head_dim = hidden_size // num_heads assert prune_num_heads < num_heads, "剪枝head数不能大于总head" keep_num_heads = num_heads - prune_num_heads for layer_idx, layer in enumerate(model.model.layers): attn = layer.self_attn # ========== Q K V 权重结构化裁剪:保留前 keep_num_heads 个head ========= # weight shape: [hidden_size, hidden_size] q_proj = attn.q_proj.weight k_proj = attn.k_proj.weight v_proj = attn.v_proj.weight # 只保留前 keep_num_heads head 对应的权重 keep_dim = keep_num_heads * head_dim attn.q_proj.weight = torch.nn.Parameter(q_proj.weight[:keep_dim, :].clone()) attn.k_proj.weight = torch.nn.Parameter(k_proj.weight[:keep_dim, :].clone()) attn.v_proj.weight = torch.nn.Parameter(v_proj.weight[:keep_dim, :].clone()) # bias同理 if attn.q_proj.bias is not None: attn.q_proj.bias = torch.nn.Parameter(attn.q_proj.bias[:keep_dim].clone()) attn.k_proj.bias = torch.nn.Parameter(attn.k_proj.bias[:keep_dim].clone()) attn.v_proj.bias = torch.nn.Parameter(attn.v_proj.bias[:keep_dim].clone()) # ========== output proj:输入维度改变 ========== # o_proj: [hidden_size, keep_dim] attn.o_proj.weight = torch.nn.Parameter(attn.o_proj.weight[:, :keep_dim].clone()) if attn.o_proj.bias is not None: pass # 更新模型config,必须!推理时会读取这个配置 config.num_attention_heads = keep_num_heads if hasattr(config, "num_key_value_heads"): # GQA模型需要同步修改KV头,这里简单处理和num_attention_heads保持一致 config.num_key_value_heads = keep_num_heads print(f"剪枝完成:原heads={num_heads}, keep heads={keep_num_heads}, prune={prune_num_heads}") return model if __name__ == "__main__": model_name = "Qwen/Qwen2-0.5B-Instruct" tokenizer = AutoTokenizer.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained( model_name, torch_dtype=torch.float32, device_map="cpu" ) print("原始模型 config num_attention_heads:", model.config.num_attention_heads) # 每层剪掉2个注意力头,Qwen2‑0.5B 原12head →保留10head prune_model = prune_attention_heads(model, prune_num_heads=2) # 测试推理 prompt = "讲一个简短小故事" inputs = tokenizer(prompt, return_tensors="pt") outputs = prune_model.generate( **inputs, max_new_tokens=100, do_sample=False ) print("\n剪枝后输出:") print(tokenizer.decode(outputs[0], skip_special_tokens=True)) # 保存剪后模型,可以后续微调 prune_model.save_pretrained("./qwen2‑0.5b‑pruned‑head") tokenizer.save_pretrained("./qwen2‑0.5b‑pruned‑head")

4.剪枝代码优化方向

实际需要根据每个head重要性进行剪枝

思路:跑一部分校准数据,统计每个注意力头的平均注意力熵 / 梯度,排序,移除分数最差的 head。

http://www.jsqmd.com/news/1394694/

相关文章:

  • DNS解析MX记录设置步骤和注意事项
  • 2026 年当下,陆良资质齐全的AI 搜索 优化平台哪个好,用对这招,你搜索时能比90%的人快3倍还不踩坑-抖盛盈商业服务 - 企业信息推荐-2
  • 张掖正规智能锁公司
  • 首次去茅台镇怎么选口碑好的源头酒厂服务商
  • 合法 TLS 证书仿社交平台钓鱼攻击机理与全域防御研究
  • 2027具身智能机器人技术展官方聚焦国家战略:
  • 2027北京AI数字健康与智慧医疗展官方:94%展商满意度揭秘
  • 球墨铸铁件加工后防锈水浸泡了,装配时还是发现锈点,怎么回事?
  • 上海君澜律师事务所孙青律师房产分割诉讼团队介绍 - 孙青律师13681945561
  • 上海君澜律师事务所孙青律师・上海房产分割诉讼专项 - 孙青律师13681945561
  • 思源宋体CN:开源免费商用中文字体配置完整指南
  • 聚焦 AI 数据治理与可观测,AWS 中国峰会有哪些 Data for AI 技术内容可看?
  • 建模师别只靠接单内卷!湖南梵映教育这套IP模式,批量跑出百万博主 - 生活动态圈
  • 微信小程序基础开发:从零到一快速上手
  • pandas.read_html 报错FileNotFoundError、OSError Traceback (most recent call last)
  • Awoo Installer:Nintendo Switch游戏安装终极指南
  • 收藏!小白也能看懂:AI时代如何守护你的数字资产安全?
  • Gitee Test 如何缓解自动化测试工具链碎片化:从测试资产、自动执行到研发闭环
  • 2026成都极致性价比家装装修公司大盘点:正规合规、口碑出众的服务商推荐及签约避坑全攻略 - 商业大观
  • 2026被问爆的健身蛋白粉怎么选?FoYes实测拆解不踩雷 - 资讯报道
  • Copilot能换成本地吗?深入解析本地化替代方案与技术实践
  • 9764358
  • 【COLM 2024】Mamba:线性时间序列建模的选择性状态空间|从高效序列架构演进视角
  • 退股不是简单一拍两散
  • 网盘直链下载助手:8大网盘真实下载链接免费获取终极指南
  • 当用户不再 “搜网页” 而是 “问 AI”,你的品牌是否还能被找到?|GEO 服务商选型标准与实战避坑指南
  • 入围全球ICF教练影响力大赛决赛!东软:AI领先的基础是人才培养与组织构建
  • 一勺蛋白粉里有什么?FoYes拆解配方空间与真实适配 - 资讯报道
  • 边云协同视频分析常见问题与排查清单:多站点部署下的边缘推理与云端管理实战
  • GEO中最常见也最致命的“重词轻人”偏差!