概要
ローカルLLMをPython環境で使ってみたかったので環境構築。
llama-cpp-pythonをWSL上の仮想環境で動かそうとしたら、GPU使用の部分でだいぶハマったので自分用にメモ。(2024/8/26)
URL:(https://github.com/abetlen/llama-cpp-python)
環境
OS:Windows11 64bit
CPU:Intel Corei9 13900k
GPU:RTX4090 24GB
WSL:2.2.4.0 (Ubuntu22.04)
CUDA Toolkit:12.2
NVIDIA Driver:560.94
Python:3.12.3
rye:0.39.0
CPU版のインストール
CPUで使用する場合CUDA等は必要ありません。
WSLを立ち上げて、pip installするだけです。
$ wsl
$ . .venv/bin/activate #仮想環境のアクティベート
$ Python3 -m pip install llama-cpp-python
※pip installできない場合は、パッケージとPythonのバージョンが対応しているか確認してください。
モデルのダウンロード
Hugging FaceからGGUF形式のものをダウンロードする
目当てのモデルのGGUF形式が無い場合は、llama.cppにGGUF変換の説明があります。
今回はこちらをGGUFに変換したものを使用しました。
動作確認 (モデルのロードに結構時間がかかります)
from llama_cpp import Llama
llm=Llama(model_path="/path/*.gguf")
無事に終了すればOKです。
GPU版のインストール
NVIDIA Driverのバージョン確認
$ nvidia-smi
※表示されているCUDA Versionが対応しているか確認してください。表示されているCUDA Version以下であれば対応しています。
CUDA Toolkitのバージョン確認
※WSLではNVIDIA DriverはWindowsと共通ですが、CUDAやcuDNNは新たに別でインストールする必要があります。
$ wsl
$ . .venv/bin/activate
$ nvcc -V
<確認>
cudaを新たにインストールした場合は再起動する。
versionが出ない場合、~/.bashrcにPATHが通っているか確認する。
念のため、torchでCUDAが使えるか確認 (飛ばしてもOK)
from torch
print(torch.cuda.is_available())
True
Falseが出る場合
$python3 -m pip show torch
でcuda対応versionか確認する。
llama_cpp_pythonのインストール
$ CMAKE_ARGS="-DGGML_CUDA=on -DLLAVA_BUILD=off" pip install --upgrade --force-reinstall llama_cpp_python
動作確認
from llama_cpp import Llama
llm = Llama(model_path="/path/*.gguf", n_gpu_layers=10)
実行時にGPU名、CUDAの表記、BLAS=1等が出ていればOK
---------
llama_new_context_with_model: CUDA_Host output buffer size = 0.49 MiB
llama_new_context_with_model: CUDA0 compute buffer size = 669.48 MiB
llama_new_context_with_model: CUDA_Host compute buffer size = 9.01 MiB
llama_new_context_with_model: graph nodes = 1030
llama_new_context_with_model: graph splits = 356
AVX = 1 | AVX_VNNI = 1 | AVX2 = 1 | AVX512 = 0 | AVX512_VBMI = 0 | AVX512_VNNI = 0 | AVX512_BF16 = 0 | FMA = 1 | NEON = 0 | SVE = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 1 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | MATMUL_INT8 = 0 | LLAMAFILE = 1 |
---------
(おまけ)なぞなぞを試してみた結果
from llama_cpp import Llama
llm = Llama(model_path="./path/*.gguf", n_gpu_layers=10)
out=llm("Q:朝は四本足、昼は二本足、夕は三本足。この生き物は何か? A: ")
pritn(out)
'choices': [{'text': ' これはイカ。イカは朝にtentacleを伸ばす',
まさかのイカ、、、イカ???