SliceGPT(構造化プルーニング)(すらいすじーぴーてぃー こうぞうかぷるーにんぐ)
SliceGPTはMicrosoft Researchが2024年に発表したLLM向け構造化プルーニング手法。行列スライシング(次元削減)によってTransformerの隠れ次元dmodelを削減し、再学習なしで20〜30%のパラメータ削減を達成しながら推論高速化を実現する。SparseGPT・Wandaの非構造化スパース化と異なり、削除後のモデルは標準的な密行列として実行できる。
SliceGPTとは
SliceGPTは2024年にMicrosoft Research(Ashkboos et al.)が発表した構造化プルーニング手法です。SparseGPT・WandaなどのUnstructured(非構造化)プルーニングと異なり、Transformerの隠れ次元(dmodel)そのものを削減します。削除後のモデルはゼロが散らばった疎行列ではなく、次元が小さい通常の密行列なので、標準的なTransformerの実装でそのまま動きます。
技術的アプローチ:RCDスライシング
SliceGPTのキーはPCA風の直交変換(RCD: Row-Column Decomposition)です。
手順:
1. 各Transformerレイヤーの活性化(キャリブデータ経由)を収集
2. 活性化行列のPCAで直交変換行列Qを求める
3. 重み行列W → W_Q = Q^T W Q に変換(情報を主成分方向に集約)
4. 最後のN列(寄与の小さい次元)を削除してdmodelを削減
5. 変換後の次元数で新たな重み行列として保存
この変換は等価変換(情報損失ゼロ)→次元削除(情報損失あり)の2段階で、キャリブレーションデータの主要活性化方向を保存しながら余剰次元を除去します。
主要モデルでの性能
| モデル | スライス率 | パラメータ削減 | perplexity上昇 | latency改善 |
|---|---|---|---|---|
| LLaMA-2 7B | 20% | 20% | +1.2pt | 約12% |
| LLaMA-2 13B | 25% | 25% | +1.4pt | 約18% |
| LLaMA-2 70B | 25% | 25% | +1.5pt | 約20% |
| Phi-2 (2.7B) | 20% | 20% | +1.1pt | 約15% |
| OPT-6.7B | 30% | 30% | +2.8pt | 約22% |
SparseGPT/Wandaとの本質的違い
非構造化プルーニング(SparseGPT/Wanda):
- モデル内の個別重みをゼロ化
- 行列の物理的サイズは変わらない
- スパーススカーネルなしでは高速化不可
構造化プルーニング(SliceGPT):
- 行列の列/行ごと削除
- 物理的に小さいモデルが生成される
- 通常のfp16/int4カーネルで高速化
実装と利用方法
公式コード microsoft/TransformerCompression(GitHub)。LLaMA-2 7Bを20%スライスする場合:
pip install git+https://github.com/microsoft/TransformerCompression
python run_slicegpt.py --model meta-llama/Llama-2-7b-hf --sparsity 0.2 --cal-dataset wikitext2 --cal-nsamples 128 --save-dir ./sliced_llama2_7b/
スライス後のモデルは通常のHuggingFaceモデルとして保存されるため、AutoModelForCausalLM.from_pretrained()でロード可能です。
量子化との組み合わせ
SliceGPTはモデルを小さくした後にGPTQ/AWQで量子化することで、さらに高い圧縮率を達成できます。
LLaMA-2 7B(7Bパラメータ):
- オリジナルfp16: 14GB
- SliceGPT 20% + int4 GPTQ: 約4.5GB(約3倍圧縮)
- perplexity: 5.47 → 7.1(+1.63pt)
ユースケースと制限
適している場面:
- エッジデバイス/コンシューマGPUへの展開(VRAM削減が直接効く)
- LoRAでのfine-tune前提の軽量ベースモデル作成
- CPU推論(llama.cpp)での使用
制限:
- 30%超のスライスでは精度劣化が急増する
- MoEモデルのエキスパートルーターには直接適用困難
- SparseGPTと比べてperplexity維持は同レベルか若干劣る
FAQ
Q: SliceGPTのモデルをllama.cppで実行できますか? A: はい。スライス後はGGUFに変換でき、標準のllama.cppでそのまま動作します。これが非構造化プルーニングとの大きな違いです。
Q: fine-tuningなしで20%削減は実用的ですか? A: LLaMA-2 70B規模では25%削減でperplexity+1.5ptと優秀で、コード補完や対話タスクへの実用展開報告があります。数学・論理推論はやや劣化が大きくなります。
Q: WindowsのローカルPC(RTX 3080 10GB)でも使えますか? A: LLaMA-2 7Bの20%スライス+int4量子化なら約3.5GBになり、RTX 3080で十分動作します。