この記事では、HuggingFace の Transformers を使用して、Meta AI によって生成された LLaMA2 大型モデルを定量化し、わずか約 5 GB のビデオ メモリでモデルを実行できるようにする方法について説明します。
前に書いてある
前の 2 つの記事「Docker を使用して公式 LLaMA2 オープン ソース モデルを開始する」と「Docker を使用して LLaMA2 オープン ソース モデルの中国語版を開始する」では、すぐに開始して、リリースされたばかりの Meta AI LLaMA2 モデルを使用する方法について説明しました。
実際にテストした結果、オリジナル モデル (英語) であっても中国語版モデル (バイリンガル) であっても、実行するには 13 ~ 14 GB のビデオ メモリが必要です。
より多くの生徒が LLaMA2 モデルで遊べるようにするために、HuggingFace の Transformers を使用してモデルを量子化してみました。量子化されたモデルの実行に必要なビデオ メモリは約 5GB だけです。
完全なコードとモデルをGitHubとHuggingFaceにアップロードしました。興味のある学生は自分で入手できます。
準備
この記事のすべてのメソッドは、Docker 以外のコンテナーでも参照および使用できます。
トラブルを避けるために、最初の 2 つの記事を参照すると、LLaMA2 モデルの動作環境と Docker イメージのオリジナルまたは中国語版をすぐに入手できます。ローカル環境が完了している場合は、Docker
関連するコマンドを無視して、Bash でさまざまな特定のプログラム コマンドを直接実行します。
次に、LLaMA2 中国語モデル イメージを例として使用して、モデルを定量化します。
前回の記事では、次のコマンドを使用して LLaMA2 中国語モデル アプリケーションを迅速に起動しました。
docker run --gpus all --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --rm -it -v `pwd`/LinkSoul:/app/LinkSoul -p 7860:7860 soulteary/llama2:7b-cn bash
量子化されたモデルを保存する必要があるため、まず上記のコマンドに簡単な調整を加え、パラメーターを追加します。
docker run --gpus all --ipc=host --ulimit memlock=-1 --ulimit stack=67108864 --rm -it -v `pwd`/LinkSoul:/app/LinkSoul -v `pwd`/soulteary:/app/soulteary -p 7860:7860 soulteary/llama2:7b-cn bash
ここでは、コマンドが現在実行されているディレクトリの下のディレクトリをコンテナにマッピングして、将来の量子化モデル ファイルを保存するため-v `pwd`/soulteary:/app/soulteary
のパラメータを追加します。soulteary
/app/soulteary
コマンドを実行すると、本格的な Docker コンテナ内の対話型コマンド ライン環境になります。
Transformers を使用した LLaMA2 の量子化
ここでは、他のオープンソース プロジェクトを導入せずに、HuggingFace によって作成された Transformers のみを使用して、必要な作業をすべて完了します。
Transformers 量子化モデルのコア構成
Transformers の量子化関数は、bitsandbytes を呼び出すことによって実装されます。定量化のためにこの関数ライブラリを正しく呼び出したい場合は、AutoModelForCausalLM.from_pretrained
メソッドでquantization_config
パラメータの設定を完了する必要があります。
Transformers のutils/quantization_config.py#L37ソース コードでは、関数の動作モードとパラメーター定義を直感的に確認できます。最も単純な 4BIT 量子化構成は次のとおりです。
model = AutoModelForCausalLM.from_pretrained(
# 要载入的模型名称
model_id,
# 仅使用本地模型,不通过网络下载模型
local_files_only=True,
# 指定模型精度,保持和之前文章中的模型程序相同 `model.py`
torch_dtype=torch.float16,
# 量化配置
quantization_config = BitsAndBytesConfig(
# 量化数据类型设置
bnb_4bit_quant_type="nf4",
# 量化数据的数据格式
bnb_4bit_compute_dtype=torch.bfloat16
),
# 自动分配设备资源
device_map='auto'
)
ここにbnb_4bit_quant_type
設定する理由は、HuggingFace の QLoRA 大規模モデル定量化実践nf4
において、この新しいデータ型 (NormalFloat) を使用することで、パフォーマンスを犠牲にすることなくメモリ消費を可能な限り節約できるためです。nf4
bnb_4bit_compute_dtype
に設定されている理由は、HuggingFaceの別の説明torch.bfloat16
によるものです。この新しいデータ形式を使用すると、従来の FP32 の「スペースの無駄」を削減し、FP32 を FP16 に変換する際の潜在的なオーバーフロー問題を回避できます。
モデル量子化プログラムを作成する
要約すると、LLaMA2 モデルの量子化を完了するための 30 行未満の単純なプログラムを作成するのは難しくありません (関連プログラムを soulteary/docker-llama2-chat/llama2-7b-cn-4bit/quantization_4bit.py にアップロードしました)。
import torch
from transformers import AutoModelForCausalLM, BitsAndBytesConfig
# 使用中文版
model_id = 'LinkSoul/Chinese-Llama-2-7b'
# 或者,使用原版
# model_id = 'meta-llama/Llama-2-7b-chat-hf'
model = AutoModelForCausalLM.from_pretrained(
model_id,
local_files_only=True,
torch_dtype=torch.float16,
quantization_config = BitsAndBytesConfig(
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16
),
device_map='auto'
)
import os
output = "soulteary/Chinese-Llama-2-7b-4bit"
if not os.path.exists(output):
os.mkdir(output)
model.save_pretrained(output)
print("done")
モデルに対して量子化操作を実行する
上記の内容を として保存し、LLaMA2 モデル ディレクトリまたは と同じレベルのディレクトリquantization_4bit.py
に配置し、 を使用してプログラムを実行してモデルの定量化を開始します。meta-llama
LinkSoul
python quantization_4bit.py
# python quantization_4bit.py
Loading checkpoint shards: 100%|██████████████████████████████████████████████████████████████████| 3/3 [00:15<00:00, 5.01s/it]
done
しばらく待つと、現在のプログラム ディレクトリに、自動的に作成および保存された新しいモデル ペア ディレクトリが見つかるようになりますsoulteary/Chinese-Llama-2-7b-4bit/
。
# du -hs soulteary/Chinese-Llama-2-7b-4bit/
13G soulteary/Chinese-Llama-2-7b-4bit/
# ls -al soulteary/Chinese-Llama-2-7b-4bit/
total 13161144
drwxr-xr-x 2 root root 4096 Jul 21 18:12 .
drwxr-xr-x 3 root root 4096 Jul 21 18:11 ..
-rw-r--r-- 1 root root 629 Jul 21 18:11 config.json
-rw-r--r-- 1 root root 132 Jul 21 18:11 generation_config.json
-rw-r--r-- 1 root root 9976638098 Jul 21 18:12 pytorch_model-00001-of-00002.bin
-rw-r--r-- 1 root root 3500316839 Jul 21 18:12 pytorch_model-00002-of-00002.bin
-rw-r--r-- 1 root root 26788 Jul 21 18:12 pytorch_model.bin.index.json
モデル実行ファイルを完成させる
モデルの量子化計算は終了しましたが、トークナイザー関連のプログラムファイルが欠落しているため、この時点のモデルは使用できません。LLaMA2の正式版と中国語版がすべて互換性があるのと同様に、モデルの量子化バージョンと量子化前のモデルもすべて互換性があります。
この問題を解決するのは非常に簡単です。量子化する前にモデル内のファイルを新しいモデル ディレクトリにコピーするだけです。
cp LinkSoul/Chinese-Llama-2-7b/tokenizer.model soulteary/Chinese-Llama-2-7b-4bit/
cp LinkSoul/Chinese-Llama-2-7b/special_tokens_map.json soulteary/Chinese-Llama-2-7b-4bit/
cp LinkSoul/Chinese-Llama-2-7b/tokenizer_config.json soulteary/Chinese-Llama-2-7b-4bit/
モデルプログラムを調整する
前述したように、量子化されたプログラムと元のプログラムの間に使用上の違いはなく、ほとんどのプログラムは同じままで問題ありません。ただし、これは新しいモデル ファイルであるため、いくつかの簡単な調整が必要です。
モデルランナーを更新する
前述したように、量子化されたプログラムと元のプログラムの間に使用上の違いはなく、ほとんどのプログラムは同じままで問題ありません。モデルを 4BIT で正しくロードして実行するには、次の 2 つを調整する必要があります。
model.py
前の 2 つの記事で関連するプロジェクトで使用されている変数を調整しmodel_id
、AutoModelForCausalLM.from_pretrained
呼び出しに追加する必要がありますload_in_4bit=True
。
model_id = 'soulteary/Chinese-Llama-2-7b-4bit'
if torch.cuda.is_available():
model = AutoModelForCausalLM.from_pretrained(
model_id,
load_in_4bit=True,
local_files_only=True,
torch_dtype=torch.float16,
device_map='auto'
)
else:
model = None
tokenizer = AutoTokenizer.from_pretrained(model_id)
この部分の完全なコードは、soulteary/docker-llama2-chat/llama2-7b-cn-4bit/model.pyにあります。
モデル アプリケーションを実行する
モデルアプリケーションをsoulteary/docker-llama2-chat/llama2-7b-cn-4bitにアップロードしました。前 2 つの記事と違いがないため、展開しません。
コンテナー内で実行せずに直接使用することを選択した場合python app.py
、モデル プログラムはすぐに実行されます。
新しいコンテナイメージを構築する
4BIT イメージをビルドするには、前の記事と同様にスクリプトを実行し、イメージがビルドされるまで待ちます。
bash scripts/make-7b-cn-4bit.sh
最初の 2 つの記事を以前に読んだことがある場合、この操作は 1 ~ 2 秒以内に完了するはずです。
コンテナを利用したモデルアプリケーションの起動
コンテナーを使用してアプリケーションを起動する場合と前の記事に違いはありません。コマンドを実行して次のスクリプトを呼び出すだけです。
bash scripts/run-7b-cn-4bit.sh
ログが表示されるのを待っているのでRunning on local URL: http://0.0.0.0:7860
、通常どおりに使用してテストできます。
メモリリソースの使用量
ビデオ メモリ リソースは常に誰もが注目する部分であり、5G 初期のモデルの起動にはおそらくビデオ メモリ リソースが必要です。
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.125.06 Driver Version: 525.125.06 CUDA Version: 12.0 |
|-------------------------------+----------------------+----------------------+
| 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 GeForce ... Off | 00000000:01:00.0 Off | Off |
| 31% 61C P2 366W / 450W | 5199MiB / 24564MiB | 99% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 1396 G /usr/lib/xorg/Xorg 167MiB |
| 0 N/A N/A 1572 G /usr/bin/gnome-shell 16MiB |
| 0 N/A N/A 8595 C python 5012MiB |
+-----------------------------------------------------------------------------+
しばらく使ってみてもまだ6GB以内に収まっていますが大丈夫でしょうか?
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 525.125.06 Driver Version: 525.125.06 CUDA Version: 12.0 |
|-------------------------------+----------------------+----------------------+
| 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 GeForce ... Off | 00000000:01:00.0 Off | Off |
| 32% 50C P8 35W / 450W | 5725MiB / 24564MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| 0 N/A N/A 1402 G /usr/lib/xorg/Xorg 167MiB |
| 0 N/A N/A 1608 G /usr/bin/gnome-shell 16MiB |
| 0 N/A N/A 24950 C python 5538MiB |
+-----------------------------------------------------------------------------+
やっと
すべての生徒が 1 つまたは複数の 4090 または A100 を持っているわけではないため、量子化により効果がいくらか減少するとしても、ビデオ メモリ不足によりモデルを実行したり、一緒にプレイしたりできないよりはマシです。
また、たとえ効果が低下したとしても、多くのシーンで使用するのに適しています。次の記事ではそれを拡張していきます。
工学は「トレードオフ」にある 先ほど偶然、新しい友人がその話をしているのを聞いて、ずっと心の中に隠していたものが目覚めたような気がしました。
–EOF
この記事は「Signature 4.0 International (CC BY 4.0)」ライセンス契約を使用していますので、転載・再利用は自由ですが、出典を明記する必要があります。表示 4.0 インターナショナル (CC BY 4.0)
この記事の著者: スー・ヤン
作成時期: 2023 年 7 月 22 日
カウント単語数: 8491 単語
読了時間: 17 分で読める
この記事へのリンク: https://soulteary.com/2023/07/22/quantizing-meta-ai-llama2-chinese-version-large-models-using-transformers.html