7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LLMの量子化とは

Last updated at Posted at 2024-08-30

本記事は日本オラクルが運営する下記Meetupで発表予定の内容になります。発表までに今後、内容は予告なく変更される可能性があることをあらかじめご了承ください。

「量子化」という技術は、深層学習に使われるニューラルネットワークの計算負荷やコンピューティングリソースを軽減する目的で利用されてきました。なので、LLMが流行りだす以前からあった技術になりますが、LLMのように、その他のモデルと比較して超大規模なニューラルネットワークとなると量子化の効果は絶大です。

image.png

少し端折った説明になりますが、量子化とはニューラルネットワークの中で繰り返し行われる小数点の桁数を丸めて少なくすることにより演算負荷を下げるという処理です。

具体的には、32bitのモデルであれば少数第7位まで計算するところを、16bitに量子化することで少数第3位までの計算で済ませるというイメージです。その程度でそんなに大きな効果がだせるの?と思われるかもしれませんが、ニューラルネットワークの中では天文学的な回数の浮動小数点演算が行われるため桁数を少なくするだけで様々なメリットが生まれます。

メリット 説明
モデルサイズの削減 量子化により、モデルのパラメータが少ないビット数で表現され、モデルのサイズが小さくなる。
計算速度の向上 低精度の計算を使用するため、推論処理が高速化し、リアルタイム応答性が改善される。
省電力 低精度の演算はエネルギー消費が少なく、大量のGPUを使った構成においてその電力量を下げることが期待できます。
コスト削減 モデルサイズの縮小と計算の高速化により、インフラストラクチャのコスト削減が可能になる。
エッジデバイスでの実行 リソースが限られたエッジデバイスでもモデルを実行でき、IoTデバイスや組み込みシステムでの利用が現実的になる。

特にモデルサイズの削減の効果は大きく、これによりメモリ使用量の削減が期待できます。恐らくほとんどのユーザーがこれを目的に量子化を行います。今となっては、GPUのメモリはコンピューティングリソースの中で一番高価なものになりますからそれを節約したいというのは当然の流れです。量子化によって高価なA100やH100にしか乗らなかったモデルが数基のA10にのせられるようになるわけですからこの効果は絶大です。

当然デメリットもあります。ニューラルネットワークの浮動小数点演算の桁数を少なくするということは本来の値とは異なる値を使うということですから最終的なモデルの精度に影響がでます。つまり、量子化のビット数を小さくするほど、メモリの消費量は少なくなり高速化するのですが、小さくするほど精度は落ちるということになります。

以前はLLMの量子化というと8bitまでというのが暗黙の了解だったように感じますが、最近は4bitでテストされる方もちらほら見かけます。また、同じ8bit量子化でも採用するモデルによっても精度は変わってきますので注意が必要です。

ビット数と精度の反比例についてはネットにベンチマーク結果や記事が沢山ありますのでそれらを参考にしつつ、是非ご自身のデータで精度検証を実施してみてください。

実装の概説

こちらの記事でご紹介したOllama、HuggingFacePipeline(LangChain)ともに量子化モデルが扱えます。

  • Ollamaの量子化 : Ollama自体では量子化処理はできませんので、量子化済のモデルをこちらの記事でご紹介した方法でデプロイする方式になります。つまりOllamaの場合は量子化特有のデプロイ方式というものはありません。例えば、32bitのElyzaを16bitで使いたい場合は16bitに量子化済のElyzaが存在しない場合は量子化モデルを利用することができません。
  • HuggingFacePipeline(LangChain)の量子化 : モデルをデプロイする際に引数でビット数を指定します。Ollamaとは異なり、32bitのモデルをデプロイする際に、16bitにしたいのか、8bitにしたいのかをコードの中で指定できます。

従って、以下は HuggingFacePipeline(LangChain)で量子化する方法をご紹介します。
具体的な実装コードとしては「量子化」という難解そうなキーワードからは想像できないほどシンプルなものになります。

実装のキーになるライブラリとしてBitsAndBytesが挙げられます。ディープラーニングのトレーニングや推論において、効率的なメモリ管理と計算の高速化を目的としたライブラリです。これがHuggingFacePipelineに統合されたことで実装コードがかなりシンプルになりました。

まずはライブラリのインストールです。

!pip install -Uq langchain_huggingface transformers torch accelerate bitsandbytes

必要なクラスのimportです。

import torch
from langchain_huggingface import HuggingFacePipeline
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline

まずはモデルとトークナイザの定義をします。ここまではローカルLLMを実装する際のお決まりのコードです。

model_name = "elyza/ELYZA-japanese-Llama-2-7b-instruct"
tokenizer = AutoTokenizer.from_pretrained(model_name)

次に量子化のためBitsAndBytesの定義を行います。
今回は8bitを指定してみます。

from transformers import BitsAndBytesConfig

quantization_config = BitsAndBytesConfig(
    load_in_8bit=True  # 8ビット量子化を指定
    #load_in_4bit=True
)

モデルをダウンロードし、デプロイします。ビット数は上記BitsAndBytesの定義で指定した8bitです。

model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype="auto",      # 自動で適切なデータ型を選択
    quantization_config=quantization_config,  # 量子化設定を適用
    device_map="auto"        # 自動的に最適なデバイスに配置
)

量子化モデルのデプロイは以上、完了です。
メモリの使用率を確認すると以下の通り、約7.3GB(3271MiB + 4055MiB)となりました。
量子化しなかった場合は約13.3GBだった(こちらの記事)ので、メモリの使用量が半分近くになっていることが分かります。

$ nvidia-smi
Thu Aug 22 17:26:02 2024       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.90.07              Driver Version: 550.90.07      CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA A10                     Off |   00000000:00:04.0 Off |                    0 |
|  0%   33C    P0             57W /  150W |    3271MiB /  23028MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
|   1  NVIDIA A10                     Off |   00000000:00:05.0 Off |                    0 |
|  0%   32C    P0             55W /  150W |    4055MiB /  23028MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
+-----------------------------------------------------------------------------------------+

一応、推論までを実施しておきましょう。モデルのパラメータを指定します。こちらは量子化特有のパラメータはありません。

# transformersのパイプラインを作成
pipe = pipeline(
    "text-generation",
    model=model,
    tokenizer=tokenizer,
    max_length=500,
    temperature=0.7,
    top_p=0.9,
    repetition_penalty=1.2,
    do_sample=True,
    truncation=True,
)

HuggingFacePipelineでここまでの定義をまとめます。

llm = HuggingFacePipeline(pipeline=pipe)

プロンプトを定義します。

prompt = "昔々、あるところに"
inputs = tokenizer(prompt, return_tensors="pt", padding=True, truncation=True)

プロンプトに対するテキスト生成を実行します。

output = llm.invoke(prompt)
print(output)

以下が出力結果です。(少し残念な出力結果ですがプロンプトを工夫すればもっとちゃんとしたテキストが出力されるはずです。)

昔々あるところに住んでいたおじいさま
孫の顔が大好きな爺さまは小学生の娘を連れて遠くへ出かけようと思っていましたその日おじいさまは家の片付けを始めたものの・・・!
ぬりえシリーズ第3作品目!
やわらかアニメシリーズ第23弾としてDVD化された本作は初回限定版に加え通常版も同時発売されている特典としてキャラクター原画集ブックレットが同梱されているほか初回限定版にはピンナップ等のイラストを使用したオリジナルカードが1枚つ属するまたBlu-ray Disc版も4月7日に発売される
物語は現代茅場町駅近くのビルで活動するファミリー向け施設サザエ坂公園の話同館長を務める安西マモルCV:野沢雅子は新入社員の藤井一平 (CV:山崎和佳奈) に接客指名制度の導入方法を伝授する
その後市民会館の屋上に立地する水族館内に設置されたゴミ箱から不審者の存在を知ったマモルは警備員を配置し館内放送で注意を促すだが不審者は館外へ逃走してしまった…。
以下関東地区の

因みに推論時のメモリ消費量は以下の通り、8.6GB程度ということでデプロイ直後より1GBほど増えた様子です。

$ nvidia-smi
Thu Aug 22 17:29:51 2024       
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.90.07              Driver Version: 550.90.07      CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA A10                     Off |   00000000:00:04.0 Off |                    0 |
|  0%   48C    P0             61W /  150W |    3909MiB /  23028MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
|   1  NVIDIA A10                     Off |   00000000:00:05.0 Off |                    0 |
|  0%   49C    P0             60W /  150W |    4705MiB /  23028MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
                                                                                         
+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
+-----------------------------------------------------------------------------------------+

以上、ローカルLLMの実装について、OllamaとLangChainのHuggingFacePipelineの2パターンとモデルの量子化についてのご紹介でした。

7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?