見出し画像

【ローカルLLM】Colabの標準GPUで「CodeLlama-34B-GGUF」を動かす

  • Metaがコーディング用の言語モデル「Code Llama」をリリースした

  • 7月に公開済みのLlama-2をベースに、コーディングに特化した追加学習を行ったモデルだという。

  • コーディングには疎い人間だが、Llama-2では未公開だった34Bパラメータのモデルがラインナップされていたので、つい試したくなった。

  • 例によってTheBloke氏の量子化モデルを使わせていただく。

  • 結果的に、量子化した34BモデルがColabの標準GPU(T4、15GB VRAM)で動かせるかどうかを検証しただけ。

Google Colab(T4 GPU)で試す

  • TheBloke氏のアップする量子化モデルには「GPTQ」と「GGUF(旧GGML)」の2種類がある。

  • GPUのみで実行する場合は「GPTQ」の方が高速化できる。ただ一般的な4bitのGPTQだと、34Bのモデルなら17GBはあるので、Colabの標準GPU(15GB VRAM)には収まらない。ていうか、まだアップされてもない。

  • 今回はCPU+GPUで実行できる「GGUF(旧GGML)」で試した。「CodeLlama-34B-Instruct-GGUF」の中から「Q4_K_M」のGGUFファイルを使う。

  • ランタイムを標準GPU(Tesla T4)に切り替えたうえで、Google Colabでダウンロード&実行してみた。

# llama.cppのインストール
!git clone https://github.com/ggerganov/llama.cpp
%cd llama.cpp

# cuBLASをオンにしてビルド(GPUオフロード)
!make LLAMA_CUBLAS=1

# 依存関係のインストール
!python3 -m pip install -r requirements.txt

# モデルのダウンロード(CodeLlama-34B-Instruct-GGUF)
%cd models
!wget https://huggingface.co/TheBloke/CodeLlama-34B-Instruct-GGUF/resolve/main/codellama-34b-instruct.Q4_K_M.gguf

# プロンプトを指定して実行
%cd /content/llama.cpp
!./main -m ./models/codellama-34b-instruct.Q4_K_M.gguf -p 'USER: What is the difference between inorder and preorder traversal? Give an example in Python.\nASSISTANT: ' -n 128 -ngl 35
  • 「Q4_K_M」のGGUFファイルは20GBある。T4のVRAM 15GBに収まるように、GPUオフロードを調整する。

  • 今回は「-ngl(--gpu-layers)」を35/51くらいに設定するとエラーなしで実行できた。GGUFの推論時のコマンドについてはこちらを参照。

  • 上記のプロンプトフォーマットは適当。そのうちモデルカードに追記されるはず。

「GPU RAM 14.0/15.0GB」

感想

  • GGUFであれば、34BモデルでもColabの標準GPUで動かせることが分かった。ただし速度は遅く、4bit量子化モデルは一応動くというレベル。

llama_print_timings: load time = 200338.78 ms
llama_print_timings: sample time = 138.28 ms / 128 runs ( 1.08 ms per token, 925.66 tokens per second)
llama_print_timings: prompt eval time = 17555.04 ms / 29 tokens ( 605.35 ms per token, 1.65 tokens per second)
llama_print_timings: eval time = 119046.25 ms / 127 runs ( 937.37 ms per token, 1.07 tokens per second)
llama_print_timings: total time = 136788.40 ms

  • もとのLlama-2の34Bモデルは、公開が保留にされたまま音沙汰がない。

  • このCodeLlama-34Bを一般的なデータセットで再学習させると、34Bの汎用モデルとして使えたりするんだろうか?