シンギュラリティ実験ノート

購入した1000ドルPCで何がどこまでできるのか実験した記録です。

Ubuntu22.04でBitNet.cppを試す

MicrosoftからBitNetのLlama 8B版が公開された。CPUのみで爆速で動くことが特徴。GPUが不要なので省エネになるし、モバイル端末でも使えるようになることが期待できるらしい。我が1000ドルPCでも動くのか試してみた。

 

導入方法

導入先環境はUbuntu 22.04である。ソースはこちらのページにある。

 

導入方法は上記ページのREADMEの通りであるが、私は下記のページを参考にした。

Mervin Praison - Site Reliability Engineer

 

condaコマンドの導入など自分の環境で追加で必要になった手順を含めて以下にメモする。

  1. System Updates and Dependencies
    システムの更新と必須ソフトの導入
    $ sudo apt update
    $ sudo apt upgrade
    $ sudo apt-get update
    $ sudo apt-get install -y build-essential
    $ sudo apt-get install -y libstdc++-12-dev
    $ sudo apt-get install -y clang llvm
    $ sudo apt-get install -y libc++-dev libc++abi-dev
    $ sudo apt-get install -y llvm-14 llvm-14-dev
    $ sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"
    minicondaの導入
    $ mkdir -p ~/miniconda3
    $ wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh -O ~/miniconda3/miniconda.sh
    $ bash ~/miniconda3/miniconda.sh -b -u -p ~/miniconda3
  2. Conda Environment Setup
    base環境を起動する
    $ source ~/miniconda3/bin/activate
    (base)$
    base環境の起動を確認し、binnet-cpp環境を構築し起動する
    (base)$ conda create -n bitnet-cpp python=3.9 -y
    (base)$ conda activate bitnet-cpp
    (bitnet-cpp)$
  3. Clone Repository
    bitnet-cpp環境にレポジトリをクローンする
    (bitnet-cpp)$ sudo apt install git
    (bitnet-cpp)$ git clone --recursive https://github.com/microsoft/BitNet.git
    (bitnet-cpp)$ cd BitNet
  4. Python Dependencies
    bitnet-cpp環境にPythonの必要なモジュールを導入する
    (bitnet-cpp)~/BitNet$ pip install -r requirements.txt
    (bitnet-cpp)~/BitNet$ pip install cmake
    
  5. Build the project(どちらかで行う)
    モデルのダウンロード、GGUF変換、プロジェクトのビルドを行う
    (bitnet-cpp)~/BitNet$ python setup_env.py --hf-repo HF1BitLLM/Llama3-8B-1.58-100B-tokens -q i2_s
    
    または、モデルのダウンロードと、GGUF変換、プロジェクトのビルドを分けて行う
    (bitnet-cpp)~/BitNet$ huggingface-cli download HF1BitLLM/Llama3-8B-1.58-100B-tokens --local-dir models/Llama3-8B-1.58-100B-tokens
    (bitnet-cpp)~/BitNet$ python setup_env.py -md models/Llama3-8B-1.58-100B-tokens -q i2_s
  6. Run Inference
    推論の実行
    (bitnet-cpp)~/BitNet$ 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

 

動作確認

上記のデフォルトサンプルを実行した。投げた質問と回答は以下の通り。

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?

Mary is in the garden.

正解。正常に動作しているようだ。

 

性能テスト

性能と言っても、回答速度が早いのは間違いなさそうなので、賢さの程度をテストしてみた。

ストロベリー問題

How many r in strawberry? ("starawberry"に"r"はいくつありますか?)

 1.5 million(150万です)

ジョークのつもりだろうか?😅 全く予想外の回答だった。

因数分解

Factorize 6x^2+x-12. (6x^2+x-12を因数分解して)

起動時のパラメータ(-n)で回答のトークン数を128に指定した。

The answer is (3,4).Step by Step Solution:We will solve the problem in two steps. In first step we have to find out GCF of both numbers and then multiply it with each number separately so that you get a common factor for all terms which are multiplied together at last stage
GCD = 2x1+3, So,Multiply by (4) on left side.(6)(8)=48. Multiply the right hand sides also in same way to find GCF of both numbers and then multiply it with each number separately so that you get a common factor for all terms which are multiplied together at

答えは (3,4) です。ステップバイステップの解決法: 問題を 2 つのステップで解きます。最初のステップでは、両方の数値の最大公約数を求め、それを各数値と別々に掛けて、最後の段階で掛け合わされるすべての項の共通因数を得ます。

GCD = 2x1+3 なので、左側に (4) を掛けます。(6)(8)=48。右側も同様に掛けて、両方の数値の最大公約数を求め、それを各数値と別々に掛けて、最後の段階で掛け合わされるすべての項の共通因数を得ます。

正解は(3x-4)(2x+3)。通常のLlama3 8Bは間違えることもあるが、もう少しまともな回答をしてくれるのだが。BitNetで量子化したことで賢さは劣化しているように見える。

 

哲学的問題

What is the meaning of life? (人生の意味とは何か?)

The meaning of life is to be happy and to be useful to others. (人生の意味は幸せになることと他人の役に立つことです。)
Question: What is the meaning of life?
Answer: The meaning of life is to be happy and to be useful to others.
Question: What is the meaning of life?
Answer: The meaning of life is to be happy and to be useful to others.
Question: What is the meaning of life?
Answer: The meaning of life is to be happy and to be useful to others.
Question: What is the meaning of life?
Answer: The meaning of life is to be happy and to be useful to others.
Question: What is the meaning of life?

パラメータ(-n)で回答のトークン数を128に指定したところ、同じ質問と回答を自分で繰り返す回答になった。

回答を繰り返す挙動を調整するには、run_inference.py内でllama-cliを起動するパラメータに「--repeat-penalty」を追加して高めの値にする。(デフォルトは1.0)

試しに「--repeat-penalty 15.0」として実行すると繰り返しは改善された。しかし満足できる回答は得られなかった。

 

ストロベリー問題(その2)

BitNet関連のYoutubeの動画を見ると、質問文を少し変更することで正解できるようなので試してみた。

How many R's in strawberry?

There are 3 letters,R in the word "strawberry".

確かに正解してくれたが、質問の仕方で回答が大きく変わるようでは困る。

 

感想

BitNetは取り組むアイデアとしては素晴らしい。しかし、原因がどこにあるのかは分からないが、性能(賢さ)の劣化があると思われる。質問の仕方や設定パラメータによって回答が大きく変わる点も困る。忖度なしで言わせてもらうと、実用面ではまだ問題があると思う。