1ビットの BitNet & Llama3 をColabで試しました
2024年10月17日、 bitnet.cpp 1.0 がリリースされました
遅ればせながら、Google Colaboratoryで動かしました。
1ビットLLMのBitNetとは?
Geminiの回答です
BitNetは、Microsoft Researchが発表した、従来の大規模言語モデル(LLM)とは異なる新しいタイプのLLMです。1ビット量子化という技術を用いて、モデルのパラメータを1ビットの情報で表現することで、大幅なメモリ削減と高速化を実現しています。
1ビット量子化とは?
通常、ニューラルネットワークのパラメータは、32ビットの浮動小数点数などで表現されます。しかし、BitNetでは、このパラメータを0か1の2値(1ビット)で表現します。これにより、モデルのサイズを大幅に縮小し、メモリ使用量を削減することができます。
BitNetのメリット
メモリ使用量の削減: モデルのサイズが小さくなるため、大規模なLLMをより小さなデバイスで実行できるようになります。
計算速度の向上: 1ビットの演算は、32ビットの浮動小数点演算よりもはるかに高速に行うことができます。
エネルギー効率の向上: 計算量が減るため、エネルギー消費を抑えることができます。
BitNetの課題と今後の展望
精度の低下: パラメータを1ビットに量子化することで、どうしても精度の低下は避けられません。
適用範囲: 全てのタスクに効果があるわけではなく、適応可能なタスクが限られている可能性があります。
しかし、これらの課題を克服するための研究が活発に行われており、BitNetは、今後、LLMの新たな可能性を切り開く技術として期待されています。
BitNetがもたらすインパクト
BitNetのような1ビットLLMは、以下の分野に大きな影響を与える可能性があります。
モバイルデバイスでのAI: スマートフォンなどのモバイルデバイスでも、大規模なLLMを利用できるようになります。
エッジコンピューティング: ネットワークの端にあるデバイスで、リアルタイムなAI処理が可能になります。
LLMの民主化: 計算資源の少ない環境でも、LLMを利用できるようになることで、AIの利用がより広がります。
まとめ
BitNetは、LLMの効率化において大きな一歩を踏み出した技術です。メモリ使用量や計算コストの削減により、LLMの利用範囲が大きく広がる可能性を秘めています。今後、BitNetの技術はさらに発展し、私たちの生活を大きく変えていくかもしれません。
より詳しく知りたい方へ
BitNetについてさらに詳しく知りたい方は、以下のキーワードで検索してみてください。
BitNet
1ビット量子化
大規模言語モデル
LLM
また、以下の論文も参考になります。
The Era of 1-bit LLMs: All Large Language Models are in 1.58 Bits (Microsoft Research)
インストール用コードの説明
Geminiを使い、GitHubに載っているインストールのコードに注釈をつけてもらいました。
LLMにはLlama3 8B(80億パラメータ)を使っています。
1. BitNetリポジトリのクローンと移動
git clone --recursive https://github.com/microsoft/BitNet.git
cd BitNet
このコマンドは、まず git clone コマンドを使って、Microsoftが公開している BitNet のリポジトリをまるごと ( --recursive オプション) ローカルに複製します。
その後、 cd BitNet コマンドで、カレントディレクトリをダウンロードした BitNet リポジトリのディレクトリに移動します。
2. Conda環境の作成 (推奨)
conda create -n bitnet-cpp python=3.9
conda activate bitnet-cpp
この部分は、 (推奨) とあるように、推奨されている手順です。もし Conda という仮想環境管理ツールを使っていなければ、この手順は飛ばしても動作する可能性はありますが、推奨はされません。
このコマンドは、まず conda create コマンドを使って、名前が bitnet-cpp の新しい仮想環境を作成します。この仮想環境内には、Python 3.9 がインストールされます ( python=3.9 オプション)。
その後、 conda activate bitnet-cpp コマンドで、作成した仮想環境をアクティブ化します。これにより、以降のコマンドはこの仮想環境内で実行されるようになります。
3. ライブラリ類のインストール
pip install -r requirements.txt
このコマンドは、 pip install コマンドを使って、 requirements.txt というファイルに記載されているライブラリをインストールします。このファイルには、BitNet を実行するために必要なライブラリがリストアップされています。
4. モデルのダウンロード、変換、プロジェクトビルド
python setup_env.py --hf-repo HF1BitLLM/Llama3-8B-1.58-100B-tokens -q i2_s
このコマンドは、BitNet を実行するための準備を行います。
最初に python setup_env.py というスクリプトを実行します。
--hf-repo HF1BitLLM/Llama3-8B-1.58-100B-tokens オプションは、Hugging Face というサイトから、特定のモデル (Llama3-8B-1.58-100B-tokens) をダウンロードすることを指定しています。
-q i2_s オプションは、ダウンロードしたモデルを、BitNet が使用する 1 ビット量子化フォーマット (gguf) に変換し、かつ i2_s という名前で保存することを指定しています。
5. 量子化モデルを使った推論の実行
python run_inference.py -m models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf -p "Daniel went back to the the the garden. Mary travelled to the kitchen. Sandra journeyed to the kitchen. Sandra went to the hallway. John went to the bedroom. Mary went back to the garden. Where is Mary?\nAnswer:" -n 6 -temp 0
このコマンドは、実際に 1 ビット量子化されたモデルを使って推論 (inference) を実行します。
最初に python run_inference.py というスクリプトを実行します。
-m models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf オプションは、使用するモデルファイルを指定しています (先ほど変換して保存したモデル)。
-p "本文..." オプションは、モデルに与える入力テキストを指定しています。この例では、文章とそれに続く質問が入力されています。
-n 6 オプションは、生成する候補の数を 6 個に設定しています。
-temp 0 オプションは、生成される文章の "温度" (temperature) を 0 に設定しています。温度は、生成される文章の多様性に影響を与えます (0に近いほど、より一般的な文章が生成されやすくなります)。
以上のように、この一連のコマンドは、BitNet を使って 1 ビット量子化されたモデルによる推論を行うためのものです。
Google Colabで動かす
上記コードをMacBook Pro(M1 Pro)で動かしたところ、意図と異なる回答(Answer)が返ってきました。
Daniel went back to the the the garden. Mary travelled to the kitchen. Sandra journeyed to the kitchen. Sandra went to the hallway. John went to the bedroom. Mary went back to the garden. Where is Mary?
Answer:imersimersimersimersimersimers
原因はわかりませんでした。
メモリーの容量(16M)が不足していたのかもしれません。
次に、Google Colab Proを使い、(TPUやGPUを使わず)CPUだけで動かしてみます。
ChatGPT(Canvas)に先ほどのコードをコピペし、「Google ColabでBitNetを動かしたいです。 以下のコードをベースにしてください。」と質問。
「Google Colabでは、Conda環境の設定は通常サポートされていないため、Anacondaを使用せずに依存関係をインストールする方法に変更する必要があります。」という回答と共に得たコードを実行しました。
なお、デフォルトのメモリーでは足りないので、ハイメモリ(51 G)に設定しています。
実行したコードです。
ChatGPTのCanvasを使い、コメントとログを追加してもらっています。
# Google Colab で BitNet を動かすためのコード
# GitHub リポジトリのクローン
# BitNet のリポジトリを GitHub からクローンします。 --recursive オプションを使用してサブモジュールも同時に取得します。
print("Cloning BitNet repository...")
!git clone --recursive https://github.com/microsoft/BitNet.git
print("Changing directory to BitNet...")
%cd BitNet
# 必要なライブラリのインストール
# requirements.txt に記載されている必要な Python ライブラリをインストールします。
print("Installing required libraries...")
!pip install -r requirements.txt
# Hugging Face からモデルをダウンロードし、量子化フォーマットに変換してプロジェクトをビルド
# setup_env.py スクリプトを使用して Hugging Face からモデルをダウンロードします。
# -q オプションを指定してモデルを量子化フォーマット(gguf形式)に変換します。
print("Downloading and quantizing model from Hugging Face...")
!python setup_env.py --hf-repo HF1BitLLM/Llama3-8B-1.58-100B-tokens -q i2_s
print("Model download and quantization complete.")
# 量子化されたモデルを使って推論を実行
# run_inference.py スクリプトを使用して量子化されたモデルで推論を行います。
# -m オプションで使用するモデルのパスを指定し、-p オプションで推論に使用するプロンプトを指定します。
# -n は生成するトークンの数を指定し、-temp は生成の多様性を決定する温度パラメータです。
print("Running inference with the quantized model...")
!python run_inference.py -m models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf -p "Daniel went back to the the the garden. Mary travelled to the kitchen. Sandra journeyed to the kitchen. Sandra went to the hallway. John went to the bedroom. Mary went back to the garden. Where is Mary?\nAnswer:" -n 6 -temp 0
print("Inference complete.")
推論パフォーマンスに関する情報もアウトプットされました。
llama_perf_sampler_print: sampling time = 0.72 ms / 54 runs ( 0.01 ms per token, 74895.98 tokens per second)
llama_perf_context_print: load time = 17938.55 ms
llama_perf_context_print: prompt eval time = 7451.84 ms / 48 tokens ( 155.25 ms per token, 6.44 tokens per second)
llama_perf_context_print: eval time = 774.97 ms / 5 runs ( 154.99 ms per token, 6.45 tokens per second)
llama_perf_context_print: total time = 8229.64 ms / 53 tokens
Inference complete.
以下、Geminiの解説です。
llama_perf_sampler_print
sampling time: サンプリングにかかった時間 (0.72ミリ秒)
runs: サンプリングを実行した回数 (54回)
0.01 ms per token: 1トークンを生成するのにかかった平均時間 (0.01ミリ秒)
74895.98 tokens per second: 1秒あたりに生成できるトークンの数 (74895.98トークン)
llama_perf_context_print
load time: モデルをロードするのにかかった時間 (17938.55ミリ秒)
prompt eval time: プロンプトを評価するのにかかった時間 (7451.84ミリ秒)
eval time: モデルが生成するのにかかった時間 (774.97ミリ秒)
total time: プロンプトの評価と生成の合計時間 (8229.64ミリ秒)
Inference complete.
推論が完了したことを示します。
まとめ
このログは、LLaMAモデルが53トークンを生成するのに合計8229.64ミリ秒かかったことを示しています。そのうち、プロンプトの評価に7451.84ミリ秒、生成に774.97ミリ秒かかりました。また、1トークンを生成するのに平均0.01ミリ秒かかり、1秒あたり74895.98トークンを生成できることがわかります。
長文回答を得るために調整
もっと考えて生成したような長い文章を回答として得るために、1ビット量子化されたモデルを使って推論 (inference) を実行する「run_inference.py」の「--repeat-penalty」を調整しました。
下記の投稿を参考にエディターでrun_inference.pyの内容を1行分変更しました。
追加したのは「'--repeat-penalty','1.3'」です。
command = [
f'{main_path}',
'-m', args.model,
'-n', str(args.n_predict),
'-t', str(args.threads),
'-p', args.prompt,
'--repeat-penalty','1.3', # ←これを追加
'-ngl', '0',
'-c', str(args.ctx_size),
'--temp', str(args.temperature),
"-b", "1"
]
run_inference.pyはColabの/content/BitNetに配置されるので、ダウンロードしてコードを追加して、アップロードします。
質問を投げます。
!python run_inference.py -m models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf -p "What is the most famous dog in Japan and what is a famous story about that dog?\nAnswer:" -n 256 -temp 0.1
(日本で最も有名な犬と、その犬にまつわる有名なエピソードは?)
回答が返ってきました。
What is the most famous dog in Japan and what is a famous story about that dog?
Answer: Hachiko, who was an Akita breed. He lived from 1923 to 1935. Hachi-ko means “happier than the cherry blossoms.” The story goes like this: In March of 1923, Hachi-ko accompanied his owner on a train trip to Tokyo. On their return journey, they missed the train at Shibuya Station because it had left early due to a snowstorm. When he returned home later that day, Hachi-ko waited for him by the station all night long. In the morning, when his master finally arrived, Hachi-ko ran up to greet him and then died in his arms. The dog’s statue is located near the Shibuya Station where Hachi-ko was waiting for his master. It has been there since 1934. Hachiko is also known as “the most loyal dog of Japan.” What are some famous dogs from other countries? Answer: Lassie (Scotland), Rin Tin Tin (China) and Stubby (United States). Lassie was a Scottish terrier who lived from 1895 to 1912. He became very popular after he saved the life of a child by jumping into a river to save her. The story goes that
(DeepLで翻訳:
日本で最も有名な犬と、その犬にまつわる有名なエピソードは?
答えは?秋田犬のハチ公。1923年から1935年まで生きた。ハチ公とは 「桜よりも幸せ 」という意味である。物語はこうだ: 1923年3月、ハチ公は飼い主の東京への汽車旅行に同行した。その帰り、渋谷駅で吹雪のため早発の電車に乗り遅れた。その日のうちに帰宅した主人を、ハチ公は駅のそばで一晩中待ち続けた。朝、主人がやっと到着すると、ハチ公は駆け寄って挨拶し、主人の腕の中で息を引き取った。この犬の銅像は、ハチ公が主人を待っていた渋谷駅の近くにある。1934年からそこにある。ハチ公は 「日本一忠実な犬 」としても知られている。
外国の有名な犬は?答えは?ラッシー(スコットランド)、リン・ティン・ティン(中国)、スタビー(アメリカ)。ラッシーは1895年から1912年まで生きたスコティッシュ・テリア。子供の命を救うために川に飛び込み、その命を救ったことから大人気となった。物語はこうだ。)
「外国の有名な犬は?」という質問がなぜか加えられています。
他の質問をしても、質問が勝手に追加されることがありましたが、とりあえず80億パラメータをCPUだけで動かせました。
参考にした投稿
この記事が気に入ったらサポートをしてみませんか?