CPUで処理できるLLM、BitNetを試してみる

CPUで処理できるLLM、BitNetを試してみる

CPUで処理できるLLM、BitNetを試してみる

近年、LLM生成AIが流行っており、これらを導入するソフトウェアなどが増えてきました。
さらに、当初は企業のサーバに接続するAPI通信が主体でしたが、ローカル環境でも動作するモデルが出てきており、環境が整っている人であれば個人PC内でも実行できるようになりました。
しかしLLMの推論にはCPUでは処理が遅くGPUが必須となっていました。ゲーミングPCなどを持っている人であればある程度のスペックのGPUを持っているかと思いますが、そうでない人がほとんどかと思います。
そんな中、MicrosoftはCPUでも処理できるLLMモデルを公開し、さらにGithubにも公開されました。

このあたりの専門ではないので詳細は省きますが、本来32ビットの浮動小数点数で表現するものを、1ビットで表現することでモデル容量を減らし、処理を高速化するもののようです。
モデルサイズが小さくなるので、どうしても精度低下は発生しますが、CPUでも処理をさせることができるようです。

今回はそんなBitNetをローカル環境で実行して、精度などを確認していきたいと思います。
ただし、まだ日本語には対応していなそうなので、英語のみでの確認になります。

なお、OSが異なりますが、動画でも手順紹介をしているので合わせて参考にしてみてください。


導入手順

早速導入をしていきます。基本的にはGithubのReadmeに従って準備をしていきます。
なお、今回はCentOS Stream9の環境で構築します。

  1. Pythonをインストールする
  2. まずはプログラミング言語である、Pythonをインストールします。
    ※3.9以上が必要になります。

    1. sudo dnf install python3.12
    ※dnfコマンド初実行だったので、OS系のチェックが走っています。 念の為、バージョン確認をしておきます。
    1. python3.12 -V

  3. pipをインストールする
  4. ライブラリのインストールには、pipが必要になるので合わせてインストールします。

    1. sudo dnf install python3.12-pip
    同じくバージョン確認をします。
    1. pip3.12 -V

  5. 必要なモジュールをインストールする
  6. Readmeには、cmakeclangが必要と記載があるので、インストールします。

    1. sudo dnf install cmake clang

  7. gitもインストールする
  8. プログラムなどはGithubからクーロンするので、gitクライアントもインストールしておきます。

    1. sudo dnf install git

  9. クーロンする
  10. Githubのプログラムをクーロンし、BitNetディレクトリに移動します。
    クーロンする際は、カレントディレクトリにクーロンするので作業フォルダを事前に作成して移動しておきます。(今回は省略します)

    1. git clone --recursive https://github.com/microsoft/BitNet.git
    2. cd BitNet

  11. 必要なライブラリをインストールする
  12. クーロンしたプロジェクトに必要ライブラリを示したrequirements.txtがあるので、それを元にライブラリをインストールします。

    1. pip3.12 install -r requirements.txt

  13. プロジェクトをビルドする
  14. ライブラリのインストールができたら、プロジェクトをビルドします。
    しかし、そのままコマンドを実行してもエラーになるので、setup_env.pyの一部を変更します。これは環境によって異なるのであくまで参考まで。。

    1. vi setup_env.py
    ↓setup_env.pyの修正部分。
    1. def setup_gguf():
    2. # Install the pip package
    3. # 下記をコメントアウト
    4. #run_command([sys.executable, "-m", "pip", "install", "3rdparty/llama.cpp/gguf-py"], log_step="install_gguf")
    5. # 下記を追加
    6. run_command(["pip3.12", "install", "3rdparty/llama.cpp/gguf-py"], log_step="install_gguf")
    Readmeに記載のコマンドでは一番大きいモデルをインストールしようとします。しかし、かなりメモリ容量が潤沢にないと起動できないので、自身の環境に応じてモデルを変更して実行してください。
    1. python3.12 setup_env.py --hf-repo HF1BitLLM/Llama3-8B-1.58-100B-tokens -q i2_s
    インストールとビルドをするので、少々時間がかかります。
    ちなみに「HF1BitLLM/Llama3-8B-1.58-100B-tokens」は、メモリ32GBとディスク40GBほど空きが必要でした。

    なお、利用できるモデルとしてはReadmeに記載がありますが、その名称をそのまま入力しても認識しません。下記の表からOptionNameを入力する必要があります。
    まぁReadmeのリンクをクリックして、HuggingFaceのサイトからでも確認できるのですが、せっかくなので整理しました。

    Model OptionName Parameters
    bitnet_b1_58-large 1bitLLM/bitnet_b1_58-large 0.7B
    bitnet_b1_58-3B 1bitLLM/bitnet_b1_58-3B 3.3B
    Llama3-8B-1.58-100B-tokens HF1BitLLM/Llama3-8B-1.58-100B-tokens 8.0B

    ビルドが完了すると、下図のようにログが出力されています。
    後続で推論を実行する際にモデルを指定する必要があるため、最終行に表示されている「models/bitnet_b1_58-3B/ggml-model-i2_s.gguf」をメモしておきます。

  15. 実行する
  16. プロジェクトのビルドが完了したら、実行をしてみます。
    Readmeに記載のコマンドを実行します。なお本モデルは日本語対応していないので英語で実行します。models部分も先程メモしたパスになります。
    質問の意味としては、「ダニエルは庭に戻りました。メアリーはキッチンへ行きました。サンドラはキッチンへ向かいました。サンドラは廊下へ行きました。ジョンは寝室へ行きました。メアリーは庭に戻りました。メアリーはどこですか?」になります。

    1. python3.12 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. python3.12 run_inference.py -m models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf -p "ダニエルは庭に戻りました。メアリーはキッチンへ行きました。サンドラはキッチンへ向かいました。サンドラは廊下へ行きました。ジョンは寝室へ行きました。メアリーは庭に戻りました。メアリーはどこですか?\nAnswer:" -n 6 -temp 0
実行結果は下記になります。
残念ながら、日本語では回答はしてくれませんでした。内容もよくわからない回答をしています。
仮に「Answer」部分を「回答」にしてもダメでした。

では、英語で文章を記載するとして、いくつか質問を投げてみます。
まずはアメリカの首都を聞いてみましょう。答えは「Washington, D.C.」です。

  1. python3.12 run_inference.py -m models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf -p "Where is the capital of America?\nAnswer:" -n 6 -temp 0
実行結果は下記です。
しっかり回答できています!

少し複雑にしてみたいと思います。
第45代アメリカ合衆国大統領を聞いてみましょう。答えは「Donald John Trump」です。

  1. python3.12 run_inference.py -m models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf -p "Who is the 45th President of the United States?\nAnswer:" -n 6 -temp 0
実行結果は下記です。
残念ながら、バイデン大統領を回答していました。。おそらく現役大統領で学習しているのかもしれないですね。。数回実行しても同じ回答でした。。

  1. python3.12 run_inference.py -m models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf -p "Please summarize the following sentences. Apple Inc. is an American multinational corporation and technology company headquartered and incorporated in Cupertino, California, in Silicon Valley. It is best known for its consumer electronics, software, and services. Founded in 1976 as Apple Computer Company by Steve Jobs, Steve Wozniak and Ronald Wayne, the company was incorporated by Jobs and Wozniak as Apple Computer, Inc. the following year. It was renamed Apple Inc. in 2007 as the company had expanded its focus from computers to consumer electronics. Apple is the largest technology company by revenue, with US$383.29 billion in 2023. Apple became the first publicly traded U.S. company to be valued at over $1 trillion in 2018, and, as of June 2024, is valued at just over $3.2 trillion. It has received criticism regarding its contractors' labor practices, its relationship with trade unions, its environmental practices, and its business ethics, including anti-competitive practices and materials sourcing. Nevertheless, the company has a large following and enjoys a high level of brand loyalty.\nAnswer:" -n 100 -temp 0
実行結果は下記になります。
ウィキペディアのAppleの記載を要約するように依頼したのですが、同じ文章が生成されてしまいました。。


さいごに

今回はCPUで処理できるというBitNetを試してみました!
結果としては、CPU環境でも高速に処理ができており、簡単な質問にも回答できている形でした!
しかし、誤った回答をしていたり、要約のような難しい要求に関してはまったく処理できていなかったです。
これからのトレーニング次第かとは思いますが、まだまだ課題は多いようでした。

とはいえ、GPUなしでも高速に処理ができるという点では、素晴らしいものだと思いますので、より発展していくことを期待します。
微力ながら、もし日本語対応のトレーニングやチューニングの方法が明らかになれば、貢献したいと思います。
今回はこのへんで、ではまた!

コメント

このブログの人気の投稿

PowerAppsで座席表を作成する

Power Automateでファイル名から拡張子を取得

Power Automateで文字列抽出