🗣️

ggmlでGPUをつかわずにopen-calm-smallで文章を生成してみた

2023/06/16に公開

タイトル通り、ggmlを使ってGPUがなくてもopen-calm-smallという言語モデルで文章を生成します。
かなり小さいモデルですけど、もっと大きなモデルでもこの過程を通じて実行できそう。

環境の準備

今回はopen-calm-smallを試してみるのでそこのリポジトリをclone。
clone先は~/open-calm-smallに決めます。

git clone https://huggingface.co/cyberagent/open-calm-small ~/open-calm-small

ちょっと重いので時間がかかる。ダウンロードする後、ggmlのリポジトリをcloneして中にcdします:

git clone https://github.com/ggerganov/ggml ~/ggml
cd ~/ggml

そしてcmakeとmakeでコンパイル:

mkdir build
cd build
cmake ..
make -j4
cd ..

次はpythonの必要なパーケージをインストールして (GPUがないため、CPU版torchをインストールしたが、GPU版をインストールも可能):

pip install torch --index-url https://download.pytorch.org/whl/cpu
pip install transformers accelerator numpy

ggmlフォーマットへの変換

ggmlはggml専用フォーマットしか対応しないのでリポジトリに置いた変換スクリプトを提供。
open-calmのモデルはベースがGPT-neoxなので適当な変換スクリプトをつかいましょう。

python3 ./examples/gpt-neox/convert-h5-to-ggml.py ~/open-calm-small 1

このスクリプトは二つのパラメタを受け取る:

  • 一つ目はモデル先。~/open-calm-smallにダウンロードしたのでそこのパースを書く。
  • 二つめは量子化の設定。0にするとfloat32のままで変換、1にするとfloat16に量子化。
    float32はあまり勧めないので基本的に1を書くほうがいい。

結果は同じフォルダにggml-model-f16.binファイルが出る。

文章生成

以上を完了できればgpt-neoxコマンドで文章を生成できる:

./build/bin/gpt-neox -m ~/open-calm-small/ggml-model-f16.bin -p "吾輩は猫であり、名前はま だなし。"

このコマンドに次のを渡す:

  • -m ~/open-calm-small/ggml-model-f16.bin: 変換されたモデルのバイナリ
  • -p "...": 始まりのプロンプト

すると以下のようなアウトプットが出る。生成が自動的に終わらないのでControl+Cをした。

main: seed = 1686874416
gpt_neox_model_load: loading model from '/home/user/open-calm-small/ggml-model-f16.bin' - please wait ...
gpt_neox_model_load: n_vocab = 52096
gpt_neox_model_load: n_ctx   = 2048
gpt_neox_model_load: n_embd  = 768
gpt_neox_model_load: n_head  = 12
gpt_neox_model_load: n_layer = 12
gpt_neox_model_load: n_rot   = 64
gpt_neox_model_load: par_res = 0
gpt_neox_model_load: ftype   = 1
gpt_neox_model_load: qntvr   = 0
gpt_neox_model_load: ggml ctx size = 486.25 MB
gpt_neox_model_load: memory_size =    72.00 MB, n_mem = 24576
gpt_neox_model_load: .................. done
gpt_neox_model_load: model size =   315.09 MB / num tensors = 148
extract_tests_from_file : No test file found.
test_gpt_tokenizer : 0 tests failed out of 0 tests.
main: number of tokens in prompt = 10
main: token[0] =   8657, 吾main: token[1] =   5148, 輩main: token[2] =    257, はmain: token[3] =   4717, 猫main: token[4] =   1147, でありmain: token[5] =    245, 、main: token[6] =  30250, 名前はmain: token[7] =   1972, まだmain: token[8] =   2956, なしmain: token[9] =    247, 。
吾輩は猫であり、名前はまだなし。だが、猫が可愛いというだけで、猫好きは集まるのだ。そんな猫好き同士、猫に好かれようとする二人。猫好きが集まっている猫好きが、猫に好かれたい一心で、猫好き同士が協力して、猫と猫の関係性を確かめ合う猫好きゲーム。猫好き同士、猫好き同士が協力して、猫に好かれようとする二人を、猫好き同士が協力して、猫と猫の関係性を確かめ合うゲームだ。二人を主人公にした『猫好き』ゲーム「猫好きゲーム」と『猫好きゲーム』は、猫好き同士、猫好き同士が協力して、猫と猫の関係性を確かめ合うゲーム。猫好き同士、猫好き同士が協力して、猫に好^C

Discussion