Databricksでllama.cppを動かしてみる

どうやらLLM界隈ではこちらがホットらしいです。

https://github.com/ggerganov/llama.cpp

この記事では本当に動かしたところまでなので、以下は残項目となっています。

- Pythonバインディング`llama-cpp-python`のインストール
- GPUサポート

# llama.cppの説明の翻訳

`llama.cpp`のゴールはMacBookで4ビットの整数量子化を用いてLLaMAモデルを実行することです。

- 依存関係のないプレーンなC/C++実装
- Appleシリコンが一級市民 - ARM NEON、Accelerate、Metalフレームワークで最適化
- x86アーキテクチャのためのAVX、AVX2、AVX512サポート
- F16 / F32精度のミックス
- 2-bit、3-bit、4-bit、5-bit、6-bit、8-bitの整数量子化をサポート
- CUDA、Metal、OpenCL GPUのサポート

`llama.cpp`のオリジナル実装は[夕方にハック](https://github.com/ggerganov/llama.cpp/issues/33#issuecomment-1465108022)されました。それ以来、多くの貢献のおかげでこのプロジェクトは大きく改善されました。このプロジェクトは主に教育目的であり、[ggml](https://github.com/ggerganov/ggml)ライブラリの新機能を開発するための主要なプレイグラウンドとして機能します。

# 参考記事

いつもありがとうございます。

https://note.com/npaka/n/n9eda56d3a463

https://zenn.dev/kun432/scraps/d532830c0f2260

# インストール

今回はほとんどの作業がWebターミナルです。

```sh
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp
make
```

# モデルのダウンロード

途中でモデルのフォーマットが[GGMLからGGUFに変更](https://huggingface.co/TheBloke/Llama-2-13B-chat-GGML/discussions/14)されたのですね。

```sh
cd models
git lfs clone https://huggingface.co/TheBloke/Llama-2-7B-GGUF --include "llama-2-7b.Q4_K_M.gguf"
```

# 動作確認

```sh
./main -m ./models/Llama-2-7B-GGUF/llama-2-7b.Q4_K_M.gguf --temp 0.1 -p "
pythonで100以下のフィボナッチ数列を計算するコードを生成してください。説明は可能な限り簡潔に。日本語で。
"
```

動きました！

```
..................................................................................................
llama_new_context_with_model: kv self size  =  256.00 MB
llama_new_context_with_model: compute buffer total size =   71.97 MB

system_info: n_threads = 32 / 64 | AVX = 1 | AVX2 = 1 | AVX512 = 1 | AVX512_VBMI = 0 | AVX512_VNNI = 1 | FMA = 1 | NEON = 0 | ARM_FMA = 0 | F16C = 1 | FP16_VA = 0 | WASM_SIMD = 0 | BLAS = 0 | SSE3 = 1 | SSSE3 = 1 | VSX = 0 | 
sampling: repeat_last_n = 64, repeat_penalty = 1.100000, presence_penalty = 0.000000, frequency_penalty = 0.000000, top_k = 40, tfs_z = 1.000000, top_p = 0.950000, typical_p = 1.000000, temp = 0.100000, mirostat = 0, mirostat_lr = 0.100000, mirostat_ent = 5.000000
generate: n_ctx = 512, n_batch = 512, n_predict = -1, n_keep = 0


 
pythonで100以下のフィボナッチ数列を計算するコードを生成してください。説明は可能な限り簡潔に。日本語で。


## 問題

フィボナッチ数列の100以下の数を計算するコードを生成してください。説明は可能な限り簡潔に。日本語で。

## 解法

    ```python
    import math

    def fib(n):
        if n == 0: return 0
        elif n == 1: return 1
        else: return fib(n-2) + fib(n-1)

    for i in range(1, 101):
        print(fib(i))
    ```
 [end of text]

llama_print_timings:        load time =   381.75 ms
llama_print_timings:      sample time =   155.39 ms /   156 runs   (    1.00 ms per token,  1003.91 tokens per second)
llama_print_timings: prompt eval time =  1169.73 ms /    65 tokens (   18.00 ms per token,    55.57 tokens per second)
llama_print_timings:        eval time = 10573.97 ms /   155 runs   (   68.22 ms per token,    14.66 tokens per second)
llama_print_timings:       total time = 11973.35 ms
Log end
```

# 次のステップ

Pythonバインディングを動かそうとしたのですが、最新の`llama-cpp-python`をインストールしようとすると`AttributeError: module 'pathspec' has no attribute 'GitIgnoreSpec'`エラーになるんですよね。

```py
%pip install llama-cpp-python 
```

pathspecの最新バージョンは0.11.2なのですが、こちらには`GitIgnoreSpec`が無いようです。

一方、こちらの0.11.3devのドキュメントには`GitIgnoreSpec`の記載があります。pipに公開されるのを待とうかと思います。

https://python-path-specification.readthedocs.io/_/downloads/en/latest/pdf/

https://pypi.org/project/pathspec/

### Databricksクイックスタートガイド

[Databricksクイックスタートガイド](https://www.amazon.co.jp/dp/B09V1YXFVQ/)


### Databricks無料トライアル

[Databricks無料トライアル](https://databricks.com/jp/try-databricks)