【ローカルLLM】Windows10でllama.cppを動かす
はじめに
今更ながら、ローカルLLMを試してみましたので、手順などを残しておこうと思います。
普段はChatGTPを使っているのですが、AIエージェントをローカルに閉じて動かしてみたいと思っているので、llama.cppを使えるようにしておきます。
llama.cppは本来莫大なリソースが必要なLLMを普通のパソコンでもなんとか動かせるようにしてくれる優れものツールだとか。すげー。
環境
今回は、AIの勉強にも使える!という大義名分のもと購入したゲーミングPCをいい加減活用しようということで、Windowsでやってみます。
OS:Windows10 64bit
CPU:AMD Ryzen 5 3600
GPU:GeForce RTX 3060
こういう記事は初めて書くので、自分の環境を示す情報はこれであっているのか不安ですが一応。
では早速始めていきます。
w64devkitの準備
llama.cppはC/C++で実装されており、コンパイルしなければいけないので、そのための環境を作ります。
(WindowsではデフォルトではC/C++のコンパイルができないということを初めて知りました…つくづく無知だ)
llama.cppのusageにw64devkitを使えと書いてあるのでそれに従います。
w64devkitはWindows向けのC/C++の開発キットで、コンパイルなどを行うことができるツール。各種コマンドを実行できるようになる他、LinuxライクなCLIを使うことができるアプリケーションも含んでいます。
2024/02/29 時点で最新版のバージョン1.21.0を使います。
まずは、w64devkitをダウンロードします。
w64devkitにアクセスし、下部Assetsより、w64devkit-fortran-1.21.0.zip をダウンロードし、解凍する
フォルダ全体をC:\Program Filesに移動(任意の場所でOK)
次に、環境変数の設定をします。
画面左下の検索窓から、「システム環境変数の編集」を検索し、実行。
「環境変数」をクリック
「システム環境変数」内の「PATH」の項目を選択し、編集をクリック。
「新規」をクリックし、C:¥Program Files¥w64devkit¥bin(先ほどdevkitを配置したディレクトリ+bin)を入力。
コマンドプロンプトで動作確認します。
gitコマンドなどを打ってみて、動作するか確認する。
ここがうまくいかなければ、環境変数の設定がうまくできているかを確認する。
これで、llama.cppをコンパイルする準備が完了です。
llama.cppの準備
公式GitHubの指示に従い、llama.cppを準備していきます。
まずは、先ほどのw64devkitディレクトリ内にあるw64devkit.exeを実行します。このようなCLIが起動します。
次に、GitHubからllama.cppのリポジトリをcloneしてきます。
git clone https://github.com/ggerganov/llama.cpp
w64devkitの導入により、Windowsのコマンドプロンプトからでもgitコマンドが実行できるようになっていますが、私の環境ではこの後のコンパイルでエラーが出たため上手くいきませんでしたが、このようにw64devkit.exeのCLI上でcloneすると上手くいきました。
コマンドプロンプトではうまくいかないけど、w64devkit.exeでは成功することが結構あります。私のような雑魚にはなぜそういうことが起こるのか理解できていません。要調査。
次に、コンパイルを行います。llama.cppディレクトリに移動して
cd llama.cpp
makeを実行。
make
これでllam.cpp自体の準備は完了です。
LLMモデルの準備
実際に動かすモデル(の重み)を用意しておく必要があります。今回は、llama-2-7bの4bit量子化モデルを使ってみたいと思います。
量子化とは、元のモデルのパラメータをより少ないビット数で表現することで軽く、速く動くようにしたもの…という程度の理解です。今はまだね。
Hugging Faceからモデルをダウンロードしてきます。
llama-2-7b.Q4_K_M.gguf
download itをクリックして、ダウンロード。完了したら、適当な場所(llama.cpp/modelsとか)に配置しておく。
いざ実行
モデルの配置ができたので、いよいよ実行です。
llama.cppディレクトリに入って、下記コマンドを実行します。日本語は苦手らしいのでプロンプトは英語です。
main -m models/llama-2-7b.Q4_K_M.gguf --prompt "Q:Tell me about the highest mountain inJapan. A:"
実行結果はこんな感じです。
Log start
main: build = 2216 (5207b3fb)
main: built with cc (GCC) 13.2.0 for x86_64-w64-mingw32
main: seed = 1710063935
llama_model_loader: loaded meta data with 19 key-value pairs and 291 tensors from models/llama-2-7b.Q4_K_M.gguf (version GGUF V2)
llama_model_loader: Dumping metadata keys/values. Note: KV overrides do not apply in this output.
llama_model_loader: - kv 0: general.architecture str = llama
:
:
Q:Tell me about the highest mountain inJapan. A:The highest mountain in Japan is Mount Fuji. The mountain has a height of 3,776 meters (12,400 feet) and it is located on the island of Honshu. It can be seen from Tokyo as well as other cities along with the Pacific Ocean. [end of text]
出力をChatGPTで日本語約するとこんな感じです。
内容的に間違ったことは言ってませんね、いい感じ!
ちなみに、質問をするような際には、プロンプトの中で「Q:XXX A:」などと書いておく必要があるようです。
これがないプロンプトを試してみると、
Tell me about the highest mountain in Japan.
↓
なんかエッセイっぽくなりました。そして長いし合ってるのかどうかよくわからない内容になりました。
LLMは、ざっくり言うと「次に来そうな文章を予測し続ける」処理を行っているらしいので、Q: /A: をつけてやることで、「質問に対する答えとして適切な文章」が生成され、つけなければ「文章を翻訳してください。彼と初めて交わしたのはその言葉だった…」のような文章の書き出しとして認識されてしまうのかもしれません。
ただ、何をつけるのかは使うモデルによって決まっているようなので、モデルごとに確認する必要があるようです。
何はともあれ、llama.cppが使えるようになりました!
次にやりたいこと
llama.cppでGPUを使った推論をする
llama.cppをpythonで実行する
BabyAGIを試す(OpenAI API, ローカルLLM)
この記事が気に入ったらサポートをしてみませんか?