小さくて速いLLMを作りたい ~LLM-Prunerを使ってLlama2-7b-chatをプルーニングしてみた~
研究開発本部 鈴木拓矢
はじめに
現在、シャープでは家電や小型デバイスで動くLLM(Large Language Model)の実現に向けて、CE-LLM(Communication Edge-Large Language Model)の開発を進めています。本記事では、CE-LLMと関連性が深い重要技術であるプルーニング技術について紹介します。
プルーニングとは、ニューラルネットワークのニューロン(重み)を削除してメモリと計算量を削減する技術です。プルーニングの概要はこちらの記事が参考になります。
今回は、プルーニングの手法の一つである「LLM-Pruner」と呼ばれるLLM用のプルーニング手法の概要説明と、Llama2-7b-chatに対してLLM-Prunerを適用した結果について紹介します。
本記事では英語版LLMに対してプルーニングを試した結果について紹介しています。日本語版LLMは使用していないことをご了承ください。
LLM-Prunerの概要
LLM-PrunerはNeurIPS 2023に採択された大規模言語モデル用のプルーニング手法です。本手法を用いることで精度を維持しつつLLMを軽量化、高速化出来ます。
LLM-Prunerの処理は、プルーニング対象の重みのグループ化、グループの削除、ファインチューニングの3つのステップで構成されます。各ステップの概要は以下の通りです。
重みと重みの結合度を計算して、結合関係のある重み同士をグループ化
グループ毎に寄与度を計算して、寄与度の低いグループを削除
LoRA(効率的なファインチューニング手法)を利用することでグループの削除による精度劣化を回復
本手法の貢献点は以下の通りです。
文章のジャンルに限定されない汎用的な言語処理を実現
Structured Pruningであるため、ハードウェアにやさしい
ファインチューニングのための言語データセットが従来よりも小規模となり、グループ削除後のLLMを短時間で再学習可能
LLM-Prunerの実装はこちらで公開されています。
Llama2-7b-chatのプルーニング
論文ではLlama2-7bの事前学習モデルを入力していましたが、今回はLlama2-7b-chatの対話モデルをLLM-Prunerに入力し、プルーニング前後の違いを確認します(本実験では対話モデルを適切に評価できるようにLLM-Prunerのソースコードを一部変更しています)。また、今回のプルーニングの例では、約20%、約35%、約50%のプルーニングを実施します。それぞれのプルーニング用パラメータは論文と実装を参考に設定しました。設定したプルーニング用パラメータを以下に示します。
また、本実験における計算環境を以下に示します。注意事項として、Llama2-7bやLlama2-7b-chatを処理するためにはRAMが32GB以上、GPUメモリが24GB以上必要です。
文章の回答比較
今回は記事の文章量を考慮して、各LLMに1種の文章を入力したときの出力を比較、紹介します。
入力する文章は「Please tell me the three important points to consider when creating an Android application」(Androidアプリを作成する際に重要となる3つのポイントを教えてください)としました。
最初に、オリジナルのモデルの結果を以下に示します。
文章の体裁は問題なく、回答内容も適切で分かりやすいです。オリジナルの性能の高さを感じることが出来る結果となりました。
次に、約20%プルーニングしたモデルの結果を以下に示します。
出力はオリジナルと比較して簡素になり、3番の項目は変わりました。ただし、文章の体裁は問題なく、回答内容も適切に感じられます。この結果からは約20%プルーニングであれば実用性のあるモデルに感じます。
次に、約35%プルーニングしたモデルの結果を以下に示します。
出力はオリジナルと比較すると簡素になり、2番、3番の項目が変わりました。ただし、文章の体裁は問題なく、回答内容も大きな問題は無いように感じられます。この結果からは約35%プルーニングも実用的に思えます。
最後に、約50%プルーニングしたモデルの結果を以下に示します。
出力はこれまでと異なり、長い文章が生成されました。文章の体裁は崩れており、重要な要素を3項目ではなく10項目分紹介しています。文章の内容を見ると間違いではない出力も見られますが、同じ項目や同じ表現をしている箇所が確認されました。この結果からは、約50%プルーニングは約20%プルーニング、約35%プルーニングと比較して総合的な回答品質が明らかに低下しており、実用していくことは難しいと感じました。論文では、50%のプルーニングで精度に大幅な劣化が見られたと報告がありましたが、本実験でも同様の結果が得られました。
以上の結果からプルーニング率が大きくなるにしたがって、回答の簡素化、変化、劣化が確認されました。今回は1種の文章入出力だけを評価したことや、言語モデル毎の確率的な予測の違いがあるため一概には言えませんが、約35%のプルーニングまでは許容可能な回答が得られ、約50%のプルーニングでは、許容困難な回答となることが確認できました。
処理量の比較
パラメータ数、GPUのメモリ使用量、速度を確認します。今回は比較のために、128トークンの処理結果を以下に示します。
これらの結果から、プルーニングの割合が大きくなるにつれてパラメータ数とメモリ使用量が減り、速度が向上していることを確認できました。使用GPUメモリに着目すると、約20%プルーニングされたモデルであればRTX4070やRTX3060(12GBタイプ)に、約50%プルーニングされたモデルであればRTX3070やRTX3060(8GBタイプ)に収まりそうなメモリ容量です。プルーニングの際は高メモリのGPUが必要ですが、任意サイズに圧縮した言語モデルであれば自宅で動かせる可能性があるというのは魅力的ではないでしょうか。
まとめ
本記事では、LLM-Prunerと呼ばれるLLM用のプルーニング手法の概要説明と、Llama2-7b-chatに対してLLM-Prunerを適用した結果について紹介しました。
LLM-Prunerはメモリ削減や高速化が可能なため、動作させるデバイスやユースケースによって有効な場面は多くあると感じました。一方で、プルーニング後のモデルが生成する文章は元のモデルが生成する文章と比較して変化があることや、大きな割合のプルーニングには課題が残されています。
最後に、家電や小型デバイスにLLMを搭載するためには小さくて速いLLMが必要です。そのため、我々はCE-LLMに対して今回紹介したような技術や、その他の圧縮技術を活用して、様々な機器でLLMが動作する世界を目指します。
参考文献
Xinyin Ma, et al. "LLM-Pruner: On the Structural Pruning of Large Language Models" Advances in Neural Information Processing Systems (NeurIPS), 2023.
この記事が気に入ったらサポートをしてみませんか?