ollamaセットアップのメモランダム

よく忘れるので、ollamaで環境構築する手順をメモっておきます。
- インストール方法
- モデルファイルの保存場所変更
- 外部からの接続設定
- ollamaリポジトリからのダウンロード
- ggufファイルをインポートする方法
- 不要なモデルを削除
- ollamaコマンドでリモートのモデルを使う方法

### ollama公式

https://ollama.com/

### ollamaインストール

下記ページのコマンドを実行する

[ollamaダウンロード:https://ollama.com/download](https://ollama.com/download)

rootでなくても良い。途中でsudoパスワードを聞いてくる。

```shell-session
[user] $ curl -fsSL https://ollama.com/install.sh | sh
```

- 参考) バージョンアップの時も同じコマンド。systemctl stop ollamaでサービスを止めて、上記コマンドでバージョンアップになるらしい。

### モデルファイルの場所を指定する

ollamaのインストール先は、/usr/share/ollama
モデルファイルが格納されるディレクトリは、/usr/share/ollama/.ollama

モデルファイルは大容量(数ギガ〜十数ギガ)になるので、格納先ディレクトリを別の場所に指定する。この設定は環境変数OLLAMA_MODELSに設定する。環境変数の設定は、サービスユニットファイルに記述する。

### 外部から接続できるようにする

ollamaのlisetnアドレスは、デフォルトで127.0.0.1なので外部から接続できない。
これを環境変数OLLAMA_HOSTで設定する。また、アクセス制限も環境変数OLLAMA_ORIGINSで設定する。

### unitファイルを編集

上記のモデルファイルの場所と外部接続の設定をサービスユニットファイルに追加する。

```unit:/etc/systemd/system/ollama.service
[Unit]
Description=Ollama Service
After=network-online.target

[Service]
ExecStart=/usr/local/bin/ollama serve
User=ollama
Group=ollama
Restart=always
RestartSec=3
Environment="PATH=/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user/.local/bin:/home/user/bin"
Environment="OLLAMA_MODELS=/disk/hdd5/ollama-models"
Environment="OLLAMA_HOST=0.0.0.0"
Environment="OLLAMA_ORIGINS=192.168.*,172.*"

[Install]
WantedBy=default.target
```

### モデルファイルのディレクトリを作成して権限設定する

指定したディレクトリを作成して、権限を設定しておく。
オリジナルの権限は以下の通り。

```shell-session
[root] # ls -ld /usr/share/ollama/.ollama/models
drwxr-xr-x. 2 ollama ollama 6  7月  8 18:07 /usr/share/ollama/.ollama/models
```

これと同様の権限を設定する

```shell-session
[root] # mkdir -p /disk/hdd5/ollama-models
[root] # chmod 755 /disk/hdd5/ollama-models
[root] # chown ollama.ollama /disk/hdd5/ollama-models
[root] # ls -ld /disk/hdd5/ollama-models
drwxr-xr-x. 4 ollama ollama 36  7月  8 18:07 /disk/hdd5/ollama-models
```

注意）ユーザollamaでモデルにアクセスできることを確認する

```shell-session
[root] # su -s /bin/bash ollama
[ollama] $ ls -ld /disk/hdd5/ollama-models
drwxr-xr-x. 4 ollama ollama 36  7月  8 18:07 /disk/hdd5/ollama-models
[ollama] $ exit
exit
[root] # 
```

### ollamaサービスを起動する

ユニットファイルを変更した時はリロードしておく。変更がなければ不要。

```shell-session
[root] # systemctl daemon-reload
```

サービスを起動する。

```shell-session
[root] # systemctl start ollama
```

起動したか確認する。"active (running)"になっていること。

```shell-session
[root] # systemctl start ollama
● ollama.service - Ollama Service
   Loaded: loaded (/etc/systemd/system/ollama.service; enabled; vendor preset: disabled)
   Active: active (running) since 月 2024-07-08 18:13:14 JST; 16h ago
 Main PID: 3954 (ollama)
   CGroup: /system.slice/ollama.service
           └─3954 /usr/local/bin/ollama serve

 7月 08 18:13:48 server ollama[3954]: llama_new_context_with_model: graph nodes  = 1030
 7月 08 18:13:48 server ollama[3954]: llama_new_context_with_model: graph splits = 1
   ： (省略)
```

### ollamaのポートを解放する

外部から接続できるように、ollamaのポートを解放する。
ollamaのポートはデフォルトで、11434/tcp

https://touch-sp.hatenablog.com/entry/2024/05/26/141009

```shell-session
[root]# ss -anpt | grep ollama
LISTEN  0  128  127.0.0.1:11434  *:*  users:(("ollama",pid=3954,fd=3))

[root]# firewall-cmd --add-port=11434/tcp
success
[root]# firewall-cmd --permanent --add-port=11434/tcp
success
```

### モデルをダウンロードする

軽量なマイクロソフトPhi3の例で説明する。ollamaコマンドはrootでなくてもOK。

pullコマンドで、ollamaのリポジトリからダウンロード

```shell-session
[user] $ ollama pull phi3
pulling manifest 
pulling 3e38718d00bb... 100% ▕███████████████▏ 2.2 GB                         
pulling fa8235e5b48f... 100% ▕███████████████▏ 1.1 KB                         
pulling 542b217f179c... 100% ▕███████████████▏  148 B                         
pulling 8dde1baf1db0... 100% ▕███████████████▏   78 B                         
pulling ed7ab7698fdd... 100% ▕███████████████▏  483 B                         
verifying sha256 digest 
writing manifest 
removing any unused layers 
success 
```

### モデルの一覧

lsコマンドで、モデル一覧が表示される。

```shell-session
[user]$ ollama ls
NAME                                         	ID          	SIZE  	MODIFIED      
phi3:latest                                  	d184c916657e	2.2 GB	2 minutes ago	
hawkclaws/datapilot-arrowpro-7b-kujira:latest	873301a15d62	7.7 GB	11 days ago  
```

### モデルを実行する

runコマンドで、モデルを実行する

```sell-session
[user]$ ollama run phi3
>>> こんにちは。今日も暑いですね。
 Hello! Indeed, it's been quite hot today. I hope you have found some relief and perhaps a nice cool spot to relax in this 
heatwave we seem to be experiencing. Staying hydrated is key during such times. How are you managing? Have you tried any 
refreshing activities or staying indoors with air conditioning if possible?

>>> Send a message (/? for help)
```

- 回答が出力されている途中に、Ctl+C で中断できる。
- Ctl+D (linuxの場合) で、終了する。


### モデルを削除する

rmコマンドで不要なモデルを削除できる。

```shell-session
[user]$ ollama ls
NAME                                         	ID          	SIZE  	MODIFIED      
phi3:latest                                  	d184c916657e	2.2 GB	7 minutes ago	
hawkclaws/datapilot-arrowpro-7b-kujira:latest	873301a15d62	7.7 GB	11 days ago  	

[user]$ ollama rm phi3
deleted 'phi3'

[user]$ ollama ls
NAME                                         	ID          	SIZE  	MODIFIED    
hawkclaws/datapilot-arrowpro-7b-kujira:latest	873301a15d62	7.7 GB	11 days ago	
```

### ggufファイルをモデルに登録する

ollamaのリポジトリにないモデルをollamaで使う時は、

1. ggufファイルをダウンロード
2. Modelfileを作成
3. ollamaに登録する

の手順になる。

#### ggufファイルを入手

これは適当にどうぞ

#### Modelfileを作成する

これはよくわからない。とりえず富嶽LLMでの例を参考に。

https://tech.takuyakobayashi.jp/2024/05/18/23

https://zenn.dev/hellorusk/articles/94bf32ea09ba26

必須なのは、FROMパラメータ。ここにggufのパスを記述する。

#### モデルを登録する

createコマンドで、モデルを登録する。

```shell-session
[user]$ ollama create fugaku-llm -f Modelfile.txt 
transferring model data 
using existing layer sha256:b6999c1a64a531726fa1a6f10459f477c1016cc72212401fc9affbb29b1bc7fb 
creating new layer sha256:a4e0782577a830dbeb8403285a149e70b5cdc22cbd149b733084be91a229abe2 
creating new layer sha256:7062f767f7a9e848e484bc1df8c7b13fa08482ba42ffc3eba985d8f7a7e00eed 
creating new layer sha256:015be5bf83215a3cfe0918304447348731d6421e9d1e840c5c25938a88ea9fb3 
creating new layer sha256:e513a77c156e5870c681a34d831367325595410e4223085d847714c17b6afddc 
writing manifest 
success 

[user]$ ollama ls
NAME                                         	ID          	SIZE  	MODIFIED           
fugaku-llm:latest                            	4a5045cf5553	11 GB 	About a minute ago	
hawkclaws/datapilot-arrowpro-7b-kujira:latest	873301a15d62	7.7 GB	11 days ago   
```

#### ggufファイルを削除する

ollamaに登録したら、ggufは不要なので削除しても良い。もちろん残しておいてもいい。

```shell-session
[user] $ rm -f xxxxx.gguf
```

### 外部から接続する場合

他のマシンから、ollamaサーバに接続する時は、環境変数OLLAMA_HOSTを設定して、ollamaコマンドを実行する。

```shell-session
[user] $ export OLLAMA_HOST=192.168.1.23
[user] $ ollama run fugaku-llm
    :
    :
```