Skip to content
Back to skills

Camera Pruning

ASecurity

Camera 微专家剪枝方法。基于微专家能量估计的 MoE 模型结构化剪枝。

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 27, 2026
datapythonbash

Security analysis

A100/100

Scanned September 27, 2026

npx -y skills add David-Li0406/meta-skill-evloving --skill camera-pruning --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Camera Pruning?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Camera Pruning
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/david-li0406-camera-pruning/badge)](https://www.skillsdirectory.com/skills/david-li0406-camera-pruning)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: camera-pruning
description: Camera 微专家剪枝方法。基于微专家能量估计的 MoE 模型结构化剪枝。
---

# Camera 微专家剪枝方法

> 基于 Camera 论文 (arXiv:2508.02322) 的 MoE 模型剪枝复现

## 核心概念:微专家 (Micro-Expert)

### 什么是微专家?

传统 MoE 模型以 **Expert** 为压缩单元(每个 Expert 包含 up_proj, gate_proj, down_proj 三个矩阵)。

**Camera 提出更细粒度的视角**:将每个 Expert 沿中间维度分解为 **Micro-Expert**。

```
Expert (传统视角):          Micro-Expert (Camera 视角):
┌─────────────┐             ┌─────────────────────────┐
│ up_proj     │             │ up_proj[0, :]    ←─┐    │
│ gate_proj   │             │ gate_proj[0, :]  ←─┤    │
│ down_proj   │             │ down_proj[:, 0]  ←─┘ Micro-Expert 0
└─────────────┘             │ up_proj[1, :]    ←─┐    │
                            │ gate_proj[1, :]  ←─┤ Micro-Expert 1
                            │ down_proj[:, 1]  ←─┘    │
                            │         ...              │
                            └─────────────────────────┘

微专家数量 = Expert 数量 × 中间维度 (d_ff)
```

### 跨矩阵完整性

一个微专家横跨三个矩阵,**必须同步处理**:

```
Micro-Expert i = {
    W_up[i, :]      (第 i 行)
    W_gate[i, :]    (第 i 行)
    W_down[:, i]    (第 i 列)
}
```

剪枝时,三个矩阵的对应位置**同时置零**,保持功能完整性。

---

## Camera 算法

### 微专家能量

Camera 定义微专家的**解码时能量**来衡量重要性:

$$\mathcal{E}_i = \left[(1-\alpha) \| \Phi_{:,i} \|_2^2 + \alpha \| \Phi_{:,i} \|_\infty^2 \right] \cdot \| w_i \|_2^2$$

其中:
- $\Phi_{:,i}$ = 第 i 个微专家在校准数据上的激活系数向量
- $\alpha$ = 平衡系数(实验中取 0.95 ~ 1.0)
- **能量越低 → 微专家越冗余 → 优先剪枝**

### 代码参数对应

| 论文参数 | 代码参数 | 典型值 |
|---------|---------|--------|
| $\alpha$ | `1 - reduce_ratio` | 0.95 ~ 1.0 |
| $\lambda$ (剪枝比例) | `--pratio` | 0.2, 0.4, 0.6 |

---

## Camera-P:结构化剪枝

### 剪枝流程

```
┌─────────────────────────────────────────────────────────┐
│  Step 1: 校准 (收集隐藏状态)                             │
│  - 用校准数据 (如 wikitext2) 前向传播                    │
│  - 收集每层 MoE 的输入输出隐藏状态                       │
├─────────────────────────────────────────────────────────┤
│  Step 2: 能量估计 (计算微专家重要性)                     │
│  - 对每个微专家计算能量 E_i                              │
│  - 按能量降序排序                                        │
├─────────────────────────────────────────────────────────┤
│  Step 3: 剪枝 (置零低能量微专家)                         │
│  - 保留 Top (1-λ)% 高能量微专家                         │
│  - 将其余微专家在三个矩阵中对应位置置零                  │
└─────────────────────────────────────────────────────────┘
```

### 运行示例

```bash
# DeepSeek-MoE-16B,20% 剪枝
srun --jobid <JOBID> python d16b.py /home/share/models/deepseek-moe-16b-base wikitext2 \
  --seed 1234 --nsamples 128 --calib-length 2048 \
  --save /output/path --func prune --pratio 0.21 \
  --chunk-size 32 --reduce_ratio 0.05

# Qwen3-30B-A3B,40% 剪枝
srun --jobid <JOBID> python qwen3.py /home/share/models/Qwen3-30B-A3B wikitext2 \
  --seed 1234 --nsamples 128 --calib-length 2048 \
  --save /output/path --func prune --pratio 0.4 \
  --chunk-size 32 --reduce_ratio 0.00
```

---

## 支持的模型

| 脚本 | 模型 | MoE 模块位置 | 特点 |
|------|------|-------------|------|
| `d16b.py` | DeepSeek-MoE-16B | `layer.mlp` | 有共享专家 |
| `qwen3.py` | Qwen3-30B-A3B | `layer.mlp` | 无共享专家 |
| `qwen2.py` | Qwen2-57B-A14B | `layer.mlp` | 有共享专家 |
| `mixtral.py` | Mixtral-8x7B | `layer.block_sparse_moe` | 无共享专家 |
| `phi.py` | Phi-3.5-MoE | `layer.block_sparse_moe` | 无共享专家 |

---

## 核心参数说明

| 参数 | 含义 | 典型值 | 说明 |
|------|------|--------|------|
| `--pratio` | 剪枝比例 | 0.2, 0.4, 0.6 | 剪掉的比例 |
| `--reduce_ratio` | L∞ 范数权重 | 0.05, 0.00 | 对应 α = 1 - reduce_ratio |
| `--chunk-size` | 批大小 | 32, 64, 128 | 显存不足时减小 |
| `--nsamples` | 校准样本数 | 128 | 通常 128 足够 |
| `--calib-length` | 序列长度 | 2048 | 校准数据长度 |
| `--save` | 输出路径 | - | 保存剪枝后的 checkpoint |

---

## 实验结果参考

### DeepSeek-MoE-16B (WikiText2 PPL)

| 剪枝比例 | Original | NAEE | D²-MoE | Camera-P |
|---------|----------|------|--------|----------|
| 20% | 6.51 | 6.77 | 7.29 | **6.57** |
| 40% | 6.51 | 8.01 | 8.38 | **6.93** |
| 60% | 6.51 | 15.47 | 12.13 | **8.68** |

### Qwen2-57B-A14B (平均准确率)

| 剪枝比例 | Original | NAEE | D²-MoE | Camera-P |
|---------|----------|------|--------|----------|
| 20% | 66.74 | 66.11 | 66.38 | **67.28** |
| 40% | 66.74 | 63.92 | 64.40 | **66.81** |
| 60% | 66.74 | 51.40 | 56.32 | **65.17** |

---

## 常见问题

### Q: reduce_ratio 如何选择?

- `reduce_ratio = 0.05` → α = 0.95,平衡 L2 和 L∞ 范数
- `reduce_ratio = 0.00` → α = 1.00,纯 L∞ 范数
- 论文中对 DeepSeek/Qwen2 使用 0.05,Qwen3 使用 0.00

### Q: 剪枝比例如何选择?

- 20%:保守剪枝,性能损失最小
- 40%:中等剪枝,性能与压缩平衡
- 60%:激进剪枝,适合推理加速优先的场景

### Q: 为什么比 D²-MoE 快?

- Camera-P:直接置零权重,5 分钟完成 50B 模型
- D²-MoE:需要 SVD 分解 + 低秩近似,耗时数小时

### Q: 有共享专家的模型需要特殊处理吗?

不需要。Camera 对所有微专家统一排序,共享专家的微专家会自动获得较高能量(通常被保留)。

---

## 快速命令参考

```bash
# 查看可用模型
ls /home/share/models/ | grep -i "moe\|mixtral"

# 查看数据集
ls ~/datasets/

# 检查 SLURM 作业
sq

# 运行剪枝
srun --jobid <JOBID> python <script>.py <model_path> <dataset> [args...]
```

---

## 相关文件

- 实验背景:`EXPERIMENT.md`
- 核心实现:`mei.py`
- 模型脚本:`d16b.py`, `qwen3.py`, `qwen2.py`, `mixtral.py`, `phi.py`
- 数据加载:`datautils.py`

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…