|
| 1 | +# llmc: 正確で効率的なLLM圧縮に向けて |
| 2 | + |
| 3 | +<img src="./imgs/llmc.png" alt="llmc" style="zoom:35%;" /> |
| 4 | + |
| 5 | +[](https://opensource.org/licenses/Apache-2.0) |
| 6 | +[](https://arxiv.org/abs/2405.06001) |
| 7 | +[](https://github.com/ModelTC/llmc) |
| 8 | + |
| 9 | +[](https://discord.gg/qZKUDfhm) |
| 10 | +[](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=I9IGPWWj8uuRXWH3_ELWjouf6gkIMgUl&authKey=GA3WbFAsm90ePJf%2FCbc7ZyXXq4ShQktlBaLxgqS5yuSPAsr3%2BDKMRdosUiLYoilO&noverify=0&group_code=526192592) |
| 11 | + |
| 12 | +**\[ [English](README.md) | [中文](README_zh.md) | 日本語 \]** |
| 13 | + |
| 14 | +**llmc** は、最先端の圧縮アルゴリズムを活用して、パフォーマンスを損なうことなく効率を向上させ、モデルサイズを削減することを目的とした、オフ・ザ・シェルフのツールです。 |
| 15 | + |
| 16 | +**英語のドキュメント**は[こちら](https://llmc-en.readthedocs.io/en/latest/)です。 |
| 17 | + |
| 18 | +**中国語のドキュメント**は[こちら](https://llmc-zhcn.readthedocs.io/en/latest/)です。 |
| 19 | + |
| 20 | +**コミュニティ**: |
| 21 | +* [Discord サーバー](https://discord.gg/qZKUDfhm) |
| 22 | +* [Tencent QQ グループ](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=I9IGPWWj8uuRXWH3_ELWjouf6gkIMgUl&authKey=GA3WbFAsm90ePJf%2FCbc7ZyXXq4ShQktlBaLxgqS5yuSPAsr3%2BDKMRdosUiLYoilO&noverify=0&group_code=526192592) |
| 23 | + |
| 24 | +## ニュース |
| 25 | + |
| 26 | +* **2024年7月16日:** 🔥現在、llmのスパース化と層間混合ビット量子化のためのWanda/Naive(Magnitude)をサポートしています! |
| 27 | + |
| 28 | +* **2024年7月14日:** 🔥現在、回転ベースの量子化QuaRotをサポートしています! |
| 29 | + |
| 30 | +* **2024年7月4日:** 📱 ディスカッションチャンネルを開設しました。質問がある場合は、コミュニティに参加してください: |
| 31 | + * [Discord サーバー](https://discord.gg/qZKUDfhm) |
| 32 | + * [Tencent QQ グループ](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=I9IGPWWj8uuRXWH3_ELWjouf6gkIMgkUl&authKey=GA3WbFAsm90ePJf%2FCbc7ZyXXq4ShQktlBaLxgqS5yuSPAsr3%2BDKMRdosUiLYoilO&noverify=0&group_code=526192592) |
| 33 | + |
| 34 | +* **2024年5月17日:** 🚀 現在、LLaVA、Mixtral、LLaMA V3、Qwen V2などの高度な大規模モデルをサポートしています。試してみてください! |
| 35 | + |
| 36 | +* **2024年5月13日:** 🍺🍺🍺 量子化ベンチマーク論文を発表しました: |
| 37 | + |
| 38 | + [**LLM-QBench: 大規模言語モデルのポストトレーニング量子化のベストプラクティスに向けたベンチマーク**](https://arxiv.org/abs/2405.06001). |
| 39 | + |
| 40 | + [Ruihao Gong*](https://xhplus.github.io/), [Yang Yong*](https://github.com/helloyongyang), [Shiqiao Gu*](https://github.com/gushiqiao), [Yushi Huang*](https://github.com/Harahan), [Yunchen Zhang](https://scholar.google.com/citations?user=glkWFyUAAAAJ&hl=en), [Xianglong Liu📧](https://xlliu-beihang.github.io/), [Dacheng Tao](https://scholar.google.com/citations?user=RwlJNLcAAAAJ&hl=en) |
| 41 | + |
| 42 | + (* は同等の貢献を示し、📧 は対応する著者を示します。) |
| 43 | + |
| 44 | + <div align=center> |
| 45 | + <img src="./imgs/best_practice.png" alt="comp" width="800" /> |
| 46 | + </div> |
| 47 | + |
| 48 | + 校正コスト、推論効率、および量子化精度を考慮して、量子化技術をモジュール化し、公平にベンチマークしました。多様なモデルとデータセットでの約600の実験が、校正データ、アルゴリズムパイプライン、および量子化構成の選択に関する3つの洞察を提供します。これらの洞察に基づいて、LLM PTQパイプラインのベストプラクティスが設計され、さまざまなシナリオで最高の精度と効率のパフォーマンスバランスを実現します。 |
| 49 | + |
| 50 | +* **2024年3月7日:** 🚀 強力で効率的なLLM圧縮ツールの量子化部分をリリースしました。注目すべきは、ベンチマーク論文が近日公開予定です😊。 |
| 51 | + |
| 52 | +## ハイライト機能 |
| 53 | + |
| 54 | +* LLMs(例:Llama2-70B、OPT-175B)を量子化し、1つのA100/H100/H800 GPUでPPLを評価します💥。 |
| 55 | +* ユーザーが選択できる最先端の圧縮アルゴリズムが[元のリポジトリと一致](benchmark/align.md)し、ユーザーは1つのLLMで複数のアルゴリズムを順次使用できます💥。 |
| 56 | +* 特定の圧縮アルゴリズムでツールによってエクスポートされた変換モデル([構成](#構成)の``quant``部分の``save_trans``モード)は、複数のバックエンド(例:[Lightllm](https://github.com/ModelTC/lightllm)、[TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM))によって単純な量子化を行い、特定の圧縮アルゴリズムで最適化されたモデルを取得できます。対応するバックエンドが推論できます💥。 |
| 57 | +* 浅いメモリフットプリントを持つ圧縮モデル([構成](#構成)の``quant``部分の``save_lightllm``モード)は、[Lightllm](https://github.com/ModelTC/lightllm)によって直接推論できます💥。 |
| 58 | + |
| 59 | +## 使用方法 |
| 60 | + |
| 61 | +1. このリポジトリをクローンし、パッケージをインストールします: |
| 62 | + |
| 63 | + ```shell |
| 64 | + # パッケージをインストール |
| 65 | + cd llmc |
| 66 | + pip install -r requirements.txt |
| 67 | + ``` |
| 68 | + |
| 69 | +2. モデルとデータを準備します。 |
| 70 | + |
| 71 | + ```shell |
| 72 | + # huggingfaceからLLMをダウンロードした後、次のように校正データと評価データを準備します: |
| 73 | + cd tools |
| 74 | + python download_calib_dataset.py --save_path [校正データパス] |
| 75 | + python download_eval_dataset.py --save_path [評価データパス] |
| 76 | + ``` |
| 77 | + |
| 78 | +3. アルゴリズムを選択してモデルを量子化します: |
| 79 | + |
| 80 | + ```shell |
| 81 | + # これはAwqに関する例です: |
| 82 | + cd scripts |
| 83 | + # bashファイル内のllmcのパス``llmc_path``を変更します。``llmc/configs/quantization/Awq/``に配置された構成の1つを選択してモデルを量子化するか、run_awq_llama.shの``--config``引数を変更して提供された構成を使用します。 |
| 84 | + bash run_awq_llama.sh |
| 85 | + ``` |
| 86 | + |
| 87 | +## 構成 |
| 88 | + |
| 89 | +ユーザーが構成を設計するのを支援するために、``llmc/configs/``の下に提供されているすべての構成のいくつかの一般的な構成を説明します: |
| 90 | + |
| 91 | +* ``model``: |
| 92 | + |
| 93 | + ```yaml |
| 94 | + model: |
| 95 | + # ``llmc/models/*.py``のクラス名に置き換えます。 |
| 96 | + type: Llama |
| 97 | + # モデルのパスに置き換えます。 |
| 98 | + path: model path |
| 99 | + torch_dtype: auto |
| 100 | + ``` |
| 101 | +
|
| 102 | +* ``calib``: |
| 103 | +
|
| 104 | + ```yaml |
| 105 | + # 注意:一部のアルゴリズムには``calib``が必要ありません。例:naive... したがって、この部分を削除できます。 |
| 106 | + calib: |
| 107 | + # 以前にダウンロードした校正データ名に置き換えます。例:pileval、c4、wikitext2、またはptb。 |
| 108 | + name: pileval |
| 109 | + download: False |
| 110 | + # 以前にダウンロードした校正データの1つのパスに置き換えます。例:pileval、c4、wikitext2、またはptb。 |
| 111 | + path: calib data path |
| 112 | + n_samples: 128 |
| 113 | + bs: -1 |
| 114 | + seq_len: 512 |
| 115 | + # ``llmc/data/dataset/specified_preproc.py``の関数名に置き換えます。 |
| 116 | + preproc: general |
| 117 | + seed: *seed |
| 118 | + ``` |
| 119 | +
|
| 120 | +* ``eval``: |
| 121 | +
|
| 122 | + ```yaml |
| 123 | + # 事前トレーニング/変換/偽量子化モデルのPPLを評価したい場合。 |
| 124 | + eval: |
| 125 | + # 事前トレーニング、変換、偽量子化モデルを評価し、評価したい位置を設定できます。 |
| 126 | + eval_pos: [pretrain, transformed, fake_quant] |
| 127 | + # 以前にダウンロードした評価データの名前に置き換えます。例:c4、wikitext2、ptb、または[c4, wikitext2]。 |
| 128 | + name: wikitext2 |
| 129 | + download: False |
| 130 | + path: eval data path |
| 131 | + # 70Bモデルの評価の場合、bsを20に設定し、inference_per_blockをTrueに設定できます。 |
| 132 | + # 7B / 13Bモデルの評価の場合、bsを1に設定し、inference_per_blockをFalseに設定できます。 |
| 133 | + bs: 1 |
| 134 | + inference_per_block: False |
| 135 | + seq_len: 2048 |
| 136 | + ``` |
| 137 | +
|
| 138 | +* ``save``: |
| 139 | +
|
| 140 | + ```yaml |
| 141 | + save: |
| 142 | + # ``save_trans``がTrueの場合、変換モデル(例:パラメータが変更されたモデル)をエクスポートしたいことを意味します。パフォーマンスと構造は元のモデルと同じであり、ユーザーは単純な量子化を使用して、特定のアルゴリズムで量子化されたモデルと同じパフォーマンスを得ることができます。 |
| 143 | + save_trans: False |
| 144 | + # ``save_lightllm``がTrueの場合、実際の量子化モデル(例:低ビットの重みと重みおよびアクティベーションの量子化パラメータ)をエクスポートしたいことを意味します。 |
| 145 | + save_lightllm: False |
| 146 | + # ``save_fake``がTrueの場合、偽量子化モデル(例:量子化解除された重みとアクティベーションの量子化パラメータ)をエクスポートしたいことを意味します。 |
| 147 | + save_fake: False |
| 148 | + save_path: ./save |
| 149 | + ``` |
| 150 | +
|
| 151 | +* ``quant``: |
| 152 | +
|
| 153 | + ```yaml |
| 154 | + quant: |
| 155 | + # ``llmc/compression/quantization/*.py``のクラス名に置き換えます。 |
| 156 | + method: OmniQuant |
| 157 | + # 重みのみの量子化には``act``部分がありません。 |
| 158 | + weight: |
| 159 | + bit: 8 |
| 160 | + symmetric: True |
| 161 | + # 量子化の粒度:per_channel、per_tensor、per_head(推奨されません)。 |
| 162 | + granularity: per_channel |
| 163 | + group_size: -1 |
| 164 | + # 校正アルゴリズム:learnble、mse、およびminmax(デフォルト)。 |
| 165 | + calib_algo: learnable |
| 166 | + # ストレートスルー推定を使用します。これは、学習可能な校正アルゴリズムに必要です。 |
| 167 | + ste: True |
| 168 | + act: |
| 169 | + bit: 8 |
| 170 | + symmetric: True |
| 171 | + # 量子化の粒度:per_token、per_tensor |
| 172 | + granularity: per_token |
| 173 | + ste: True |
| 174 | + # 静的量子化(校正中の量子化)または動的量子化(推論中の量子化)。 |
| 175 | + static: True |
| 176 | + # この部分は特定のアルゴリズム用に設計されており、提供されているものを参考にして独自のアルゴリズムを設計できます。 |
| 177 | + special: |
| 178 | + let: True |
| 179 | + lwc_lr: 0.01 |
| 180 | + let_lr: 0.005 |
| 181 | + use_shift: False |
| 182 | + alpha: 0.5 |
| 183 | + deactive_amp: True |
| 184 | + epochs: 20 |
| 185 | + wd: 0 |
| 186 | + # quant_outがTrueの場合、前の量子化ブロックの出力を次のブロックの校正データとして使用します。 |
| 187 | + quant_out: True |
| 188 | + ``` |
| 189 | +
|
| 190 | +## サポートされているモデルリスト |
| 191 | +
|
| 192 | +✅ [BLOOM](https://huggingface.co/bigscience/bloom) |
| 193 | +
|
| 194 | +✅ [LLaMA](https://github.com/facebookresearch/llama) |
| 195 | +
|
| 196 | +✅ [LLaMA V2](https://huggingface.co/meta-llama) |
| 197 | +
|
| 198 | +✅ [StarCoder](https://github.com/bigcode-project/starcoder) |
| 199 | +
|
| 200 | +✅ [OPT](https://huggingface.co/docs/transformers/model_doc/opt) |
| 201 | +
|
| 202 | +✅ [Falcon](https://huggingface.co/docs/transformers/model_doc/falcon) |
| 203 | +
|
| 204 | +✅ [InternLM2](https://huggingface.co/internlm) |
| 205 | +
|
| 206 | +✅ [Mistral](https://huggingface.co/docs/transformers/model_doc/mistral) |
| 207 | +
|
| 208 | +✅ [LLaMA V3](https://huggingface.co/meta-llama) |
| 209 | +
|
| 210 | +✅ [Mixtral](https://huggingface.co/docs/transformers/model_doc/mixtral) |
| 211 | +
|
| 212 | +✅ [Qwen V2](https://github.com/QwenLM/Qwen2) |
| 213 | +
|
| 214 | +✅ [LLaVA](https://github.com/haotian-liu/LLaVA) |
| 215 | +
|
| 216 | +``llmc/models/*.py``の下のファイルを参照して、独自のモデルタイプを追加できます。 |
| 217 | +
|
| 218 | +## サポートされているアルゴリズムリスト |
| 219 | +
|
| 220 | +### 量子化 |
| 221 | +
|
| 222 | +✅ Naive |
| 223 | +
|
| 224 | +✅ [AWQ](https://arxiv.org/abs/2306.00978) |
| 225 | +
|
| 226 | +✅ [GPTQ](https://arxiv.org/abs/2210.17323) |
| 227 | +
|
| 228 | +✅ [SmoothQuant](https://arxiv.org/abs/2211.10438) |
| 229 | +
|
| 230 | +✅ [OS+](https://arxiv.org/abs/2304.09145) |
| 231 | +
|
| 232 | +✅ [OmniQuant](https://arxiv.org/abs/2308.13137) |
| 233 | +
|
| 234 | +✅ [NormTweaking](https://arxiv.org/abs/2309.02784) |
| 235 | +
|
| 236 | +✅ [AdaDim](https://arxiv.org/pdf/2309.15531.pdf) |
| 237 | +
|
| 238 | +✅ [QUIK](https://arxiv.org/abs/2310.09259) |
| 239 | +
|
| 240 | +✅ [SpQR](https://arxiv.org/abs/2306.03078) |
| 241 | +
|
| 242 | +✅ [DGQ](https://arxiv.org/abs/2310.04836) |
| 243 | +
|
| 244 | +✅ [OWQ](https://arxiv.org/abs/2306.02272) |
| 245 | +
|
| 246 | +✅ [LLM.int8()](https://arxiv.org/abs/2208.07339) |
| 247 | +
|
| 248 | +✅ [HQQ](https://mobiusml.github.io/hqq_blog/) |
| 249 | +
|
| 250 | +✅ [QuaRot](https://arxiv.org/abs/2404.00456) |
| 251 | +
|
| 252 | +### 剪定 |
| 253 | +
|
| 254 | +✅ Naive(Magnitude) |
| 255 | +
|
| 256 | +✅ [Wanda](https://arxiv.org/abs/2306.11695) |
| 257 | +
|
| 258 | +## TODOリスト |
| 259 | +
|
| 260 | +### 量子化 |
| 261 | +
|
| 262 | +- [ ] QuIP |
| 263 | +
|
| 264 | +- [ ] QuIP# |
| 265 | +
|
| 266 | +- [ ] AQLM |
| 267 | +
|
| 268 | +**注意:** QUIK、SpQRなどの特定のアルゴリズムは、特別なハードウェアやカーネルのサポートが必要であり、複数のバックエンドによる単純な量子化を行い、これらのバックエンドを使用して推論することはできません。ただし、ユーザーは引き続きツールを使用して、研究におけるこれらのアルゴリズムのパフォーマンスを評価できます。 |
| 269 | +
|
| 270 | +### 剪定 |
| 271 | +
|
| 272 | +- [ ] SparseGPT |
| 273 | +
|
| 274 | +- [ ] LLM-Pruner |
| 275 | +
|
| 276 | +この部分は近日公開予定です🚀。 |
| 277 | +
|
| 278 | +### ドキュメント |
| 279 | +
|
| 280 | +- [ ] モデルを圧縮し、複数のバックエンド(例:[Lightllm](https://github.com/ModelTC/lightllm)、[TensorRT-LLM](https://github.com/NVIDIA/TensorRT-LLM))を使用して推論するエンドツーエンドの例。 |
| 281 | +
|
| 282 | +- [ ] 異なるアルゴリズムの``quant``部分の``special``に関するドキュメント。 |
| 283 | +
|
| 284 | +- [ ] ユーザーが独自に新しいアルゴリズムを追加するためのドキュメント。 |
| 285 | +
|
| 286 | +より詳細なドキュメントは近日公開予定です🚀。 |
| 287 | +
|
| 288 | +## 謝辞 |
| 289 | +
|
| 290 | +以下のリポジトリを参考にしてコードを開発しました: |
| 291 | +
|
| 292 | +* https://github.com/mit-han-lab/llm-awq |
| 293 | +* https://github.com/mit-han-lab/smoothquant |
| 294 | +* https://github.com/OpenGVLab/OmniQuant |
| 295 | +* https://github.com/IST-DASLab/gptq |
| 296 | +* https://github.com/ModelTC/Outlier_Suppression_Plus |
| 297 | +* https://github.com/IST-DASLab/QUIK |
| 298 | +* https://github.com/Vahe1994/SpQR |
| 299 | +* https://github.com/ilur98/DGQ |
| 300 | +* https://github.com/xvyaward/owq |
| 301 | +* https://github.com/TimDettmers/bitsandbytes |
| 302 | +* https://github.com/mobiusml/hqq |
| 303 | +* [https://github.com/spcl/QuaRot](https://github.com/spcl/QuaRot) |
| 304 | +* [https://github.com/locuslab/wanda](https://github.com/locuslab/wanda) |
| 305 | +
|
| 306 | +## スター履歴 |
| 307 | +
|
| 308 | +[](https://star-history.com/#ModelTC/llmc&Timeline) |
| 309 | +
|
| 310 | +## 引用 |
| 311 | +
|
| 312 | +LLM-QBench論文/llmcツールキットが研究に役立つまたは関連している場合は、論文を引用してください: |
| 313 | +
|
| 314 | +``` |
| 315 | +@misc{llmc, |
| 316 | + author = {llmc contributors}, |
| 317 | + title = {llmc: Towards Accurate and Efficient LLM Compression}, |
| 318 | + year = {2024}, |
| 319 | + publisher = {GitHub}, |
| 320 | + journal = {GitHub repository}, |
| 321 | + howpublished = {\url{https://github.com/ModelTC/llmc}}, |
| 322 | +} |
| 323 | + |
| 324 | +@misc{gong2024llmqbench, |
| 325 | + title={LLM-QBench: A Benchmark Towards the Best Practice for Post-training Quantization of Large Language Models}, |
| 326 | + author={Ruihao Gong and Yang Yong and Shiqiao Gu and Yushi Huang and Yunchen Zhang and Xianglong Liu and Dacheng Tao}, |
| 327 | + year={2024}, |
| 328 | + eprint={2405.06001}, |
| 329 | + archivePrefix={arXiv}, |
| 330 | + primaryClass={cs.LG} |
| 331 | +} |
| 332 | +``` |
0 commit comments