ローカルLLMを起動する便利なツール　OLLAMAを試す

すでに有名なツールですが、さっそく私のGPU環境にも導入したいと思います。
(2024/12/22 時点での情報です)
実は動機はLLAVAをGITHUBのレポジトリからGOOGLE COLABで実行し用としたとき、PYTHONのバージョン、ライブラリのバージョンでうまく動かず苦労した。またHUGGING FACEのを使うことも考えましたが、とくにファインチューニングなしに推論だけであればもっと簡単にOLLAMAで用意されているものはOLLAMAでやるのが一番いいかと思いましたので忘備録をメモします。有名どころのモデルはhttps://ollama.com/library
でそのまま引っ張ってこれます。独自のモデルなどそれ以外はHUGGINGFACEなどからGGUFで提供されていればそのモデルもOLLAMAに登録可能です。

環境はUbuntu 24.04 GPU はT4(16GB)で実験環境作ってます。
（CPUでも動きましたが応答が10倍以上かかる感じです. あとから答えますシステムではOKかもしれませんがチャットでは厳しいかもしれません）

- まずインストール(以下のコマンドだけ)
```
# curl https://ollama.ai/install.sh | sh   
```

- LLMを試す
以下のようにパラメータ数があります。高いほど性能がいいかと思われますが、GPU 16GBだと快適（画面見つめて待っていて我慢できるレベル）ですと13B以下程度が限界なのでllama3.1 の　8Bを試してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3955606/3341bdde-ab6b-8c33-4906-4a75cad40b51.png)
ollama pull の引数はモデル名　もしくは　モデル名:パラメータ数　で指定します。
インストールに１分程度かかりました。
```
# ollama pull llama3.1:8b
pulling manifest
pulling 667b0c1932bc... 100% ▕████████████████████████████████████████████████████████████████████████████████████▏ 4.9 GB
pulling 948af2743fc7... 100% ▕████████████████████████████████████████████████████████████████████████████████████▏ 1.5 KB
pulling 0ba8f0e314b4... 100% ▕████████████████████████████████████████████████████████████████████████████████████▏  12 KB
pulling 56bb8bd477a5... 100% ▕████████████████████████████████████████████████████████████████████████████████████▏   96 B
pulling 455f34728c9b... 100% ▕████████████████████████████████████████████████████████████████████████████████████▏  487 B
verifying sha256 digest
writing manifest
success
```
- 確認します (入ってますね！）
```
# ollama list
NAME           ID              SIZE      MODIFIED
llama3.1:8b    46e0c10c039e    4.9 GB    About a minute ago
```
- 試します（ollama run <モデル名>）
```
# ollama run llama3.1:8b
>>> 名古屋で有名なグルメは何ですか？
名古屋の名物としてよく知られているのが、名古屋ラーメンです。ほかには、コロッケ、納豆などがあります。

>>> 名古屋から伊勢神宮へはどうやって行きますか？
名古屋駅と伊勢神宮は約150km離れています。電車ではJR東海の特急「しなの」や「ひだ」として、名鉄の特急「みずほ」を利用すると約30分です。
空港線で名古屋市に位置する中濃空港から空路を利用します。

>>> １から10まで足し上げるためのPYTHONコード書いてください
```python
# 1 から 10 までの合計を求めるコード

# 計算結果を保存する変数を定義
total = 0

# 1 から 10 までの数字を足すループを作成
for i in range(1, 11):
    # 1 から 10 までの数字を追加
    total += i

# 合計が求められた値であることを確認する
print("1 から 10 までの合計は", total, "です")

このコードでは、`range(1, 11)` を使用して `1` から `10` の数字を繰り返しループします。`total += i` を使用すると、各数値が追加されます。最終的な
合計は、`print()` で表示されます。
```
まあ、伊勢神宮への行き方の質問は嘘をついてしまっていすが（💦）回答はしています。

- GGUFから独自のモデルを作成
- GGUFとはモデルを量子化でなるべく精度落とさずに小型化してしたものをGGUFというファイルにまとめたものであると理解してます。
それではGGUFから独自のモデルを作る方法をメモします
日本語で学習させたものはいろいろありますがELYZAとかかつてのスパコンで学習させたFUGAKUなどがありました

[ELYZA]　エライザ
https://huggingface.co/elyza/Llama-3-ELYZA-JP-8B-GGUF/tree/main

[FUGAKU]　富岳
https://huggingface.co/Fugaku-LLM/Fugaku-LLM-13B-instruct-gguf/tree/main

- ELYZAつかってみます.(まずダウンロードするための準備とダウンロード)
ダウンロードは数分かかりますね。
```
# apt install git-lfs
# git install lfs
# git clone https://huggingface.co/elyza/Llama-3-ELYZA-JP-8B-GGUF
Cloning into 'Llama-3-ELYZA-JP-8B-GGUF'...
remote: Enumerating objects: 52, done.
remote: Total 52 (delta 0), reused 0 (delta 0), pack-reused 52 (from 1)
Unpacking objects: 100% (52/52), 1.01 MiB | 4.22 MiB/s, done.
# ls
Llama-3-ELYZA-JP-8B-GGUF
# ls Llama-3-ELYZA-JP-8B-GGUF/
LICENSE  Llama-3-ELYZA-JP-8B-q4_k_m.gguf  Notice  README.md  USE_POLICY.md  key_visual.png  lmstudio-demo.gif
```
- いろいろファイルありますが、必要なのはggufの拡張子のです
それではOLLAMAに組み込むために設定ファイルを作ります。設定ファイルはどのモデルを使い、どのようなPROMPTを入れるかといったいわゆるモデルとその入力を手順化することができます。
ファイル名は任意でいいですが、私はLlama-3-ELYZA-JP-8B-GGUF.model　と命名して以下のようなファイルを作りました。システムに渡すPROMPT部分は省略できます。ただあらかじめ用途に応じてPROMPTを設定するための例をあえて入れてみました。（必要なのはFROM ./Llama-3-ELYZA-JP-8B-GGUF/Llama-3-ELYZA-JP-8B-q4_k_m.ggufの部分のみです）
```
FROM ./Llama-3-ELYZA-JP-8B-GGUF/Llama-3-ELYZA-JP-8B-q4_k_m.gguf
SYSTEM あなたは優秀なAI観光案内ロボットです。旅行者に対して親切で分かりやすく、役立つ案内を提供します。彼らの質問に対して、詳細かつ魅力的な説明を心がけてください。
PARAMETER temperature 0.1
```
- では作成しましょう。モデル名はLlama-3-ELYZA-JP-8B　と命名して -f で先ほど作成した設定ファイルを読み込ませます。
```
# ollama create  Llama-3-ELYZA-JP-8B -f Llama-3-ELYZA-JP-8B-GGUF.model
transferring model data 100%
using existing layer sha256:91553c45080b11d95be21bb67961c9a5d2ed7556275423efaaad6df54ba9beae
using autodetected template llama3-instruct
using existing layer sha256:28fe76243ac59e28ef0d6de726bc56c76249856cfa6664f820ef9f71b9f11813
creating new layer sha256:c456d133b088d02caa060921ca51a12f1698048ad73e3f6ee5fea88e22e034fe
creating new layer sha256:8de839b60f05810d1956f1ec7a86dd215f6ef5c25051f6d67913350c8c10c60c
writing manifest
success
```
- 確認
```
a# ollama list
NAME                          ID              SIZE      MODIFIED
Llama-3-ELYZA-JP-8B:latest    7dcf8a0833df    4.9 GB    4 minutes ago
llama3.1:8b                   46e0c10c039e    4.9 GB    About an hour ago
```

- 使ってみます
```
# ollama run Llama-3-ELYZA-JP-8B
>>> 名古屋で有名なグルメは何ですか？
名古屋のグルメと言えば、みそかつや手羽先などが非常に有名です。

まず、みそかつは豚カツに味噌を絡めるという独特の調理法で、名古屋市内にはみそかつ専門店が多くあります。味噌の甘辛い味とサクッとした豚カツの食感が人気です。

手羽先は鶏の手羽先を揚げたものに、タレやスパイスを絡めるという名古屋のソウルフードです。焼き鳥屋さんなどで提供されていて、ビールとの相性も抜群です。

他にも、名古屋コーチンやひつまぶし、天むすなど、名古屋には美味しいグルメがたくさんあります。

>>> 名古屋から伊勢神宮への生き方を教えてください。
名古屋から伊勢神宮は電車とバスで行くことができます。

1. 名古屋駅から近鉄名古屋駅まで:
名古屋駅の太閤口から近鉄名古屋駅までは、徒歩約5分です。
2. 近鉄名古屋駅から宇治山田駅まで:
近鉄名古屋駅から特急電車に乗り、宇治山田駅で降ります。所要時間は約1時間半です。
3. 宇治山田駅から伊勢神宮前駅まで:
宇治山田駅からバスに乗り、「伊勢神宮前」で降ります。所要時間は約20分です。

名古屋から伊勢神宮までは、電車とバスの乗り継ぎで行くことができます。

>>> pythnで1から10までの和を計算するコードをください
Pythonで1から10までの和を計算するには、以下のようにsum関数を使用して実現できます。

python
total = sum(range(1, 11))
print(total)


このコードでは、range(1, 11)で1から10までの数字を生成し、sum関数でこれらの数字の和を計算しています。
```

OLLAMAと同じくらいのサイズのモデルでしたがさすがに日本語＋日本の時事を学習しているだけあってOLLAMAより回答がしっかりしてます。２つ目の伊勢神宮への行き方も答えてます（質問を生き方と誤字でしたが一応無視して回答してくれてます。）

次回はOSのコマンドではなく、
PYTHONからの読み込みと１つ別の画像モデルの機能を実験しようと思います。