Ollama を内部ネットワークで共有する

# Ollama でやれる事
Ollama を利用すると、「Meta Llama 3」や「Microsoft Phi-3」などオープンモデルのLLMをローカルPCで実行させる事ができる。
ライセンスはMIT。

https://ollama.com/

GPUは、nVIDIA, AMD, Metal(AppleMX) をサポートしている。

https://github.com/ollama/ollama/blob/main/docs/gpu.md

# 実行環境
ここでは、以下のスペックで実行環境を構築している。

| 項目 | 容量 |
| --- | --- |
| CPU | Core i9-9900K |
| RAM | 64GB|
| GPU | nVIDIA VRAM 11GB |
| OS | Windows 11 Pro |

# Windowsの設定
## 固定IPの設定
内部ネットワークで利用可能な固定IPを用意する。
このドキュメントでは、以下の固定IPで構築しているので、個々の環境に適宜変更する必要がある。
| 固定IP |
| --- |
| 172.16.11.68 |

- 「設定」を立ち上げる
![ip1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266949/fbe940e0-ea07-5649-a3c8-8d953d043694.png)
- 「ネットワークとインターネット」→「イーサネット」
![ip2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266949/2aeadb84-580c-b159-9b11-ed60d236c1d0.png)
- (1) 「認証設定」→「IEEE 802.1X」を必要なら変える
- (2) 「IP 割り当て」の右にある「編集」ボタンを押す
- 「IP 設定の編集」を「手動」を選択→「IPv4」をON
![ip5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266949/244f309f-0bae-6ec1-c001-85cf2ee97abb.png)
- 「IP アドレス」、「サブネット マスク」、「ゲートウェイ」、「優先 DNS」を設定して、保存する

## スリープをOFF
- 「設定」→「 システム」→「電源」
- 「画面とスリープ」
  - 「電源接続時に、次の時間が経過した後に画面の電源を切る」→「5分」
  - 「電源接続時に、次の時間が経過した後にデバイスをスリープ状態にする」→「なし」

## スクリーンセーバーをOFF
- 「設定」→「個人用設定」→「ロック画面」
- 「関連設定」→「スクリーン セーバー」から、スクリーンセーバーをOFFにする

# Ollama をインストール
## 環境変数の設定
- 「設定」→「システム」→「バージョン情報」
- 「システムの詳細設定」をクリックすると、「システムのプロパティ」ダイアログが出る
- 「環境変数」ボタンを押す
- 「ユーザーの環境変数」に、以下を追加する

| キー | 値 |
| --- | --- |
| OLLAMA_HOST | 0.0.0.0 |

## Ollama をインストールする
- 公式から、今回は Windows (Preview)をダウンロード
https://ollama.com/download/windows
- 2024年5月時点でプレビューだが、一通りの機能は動作する

![ollama_services.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266949/b111b1c5-2140-0f2a-f57a-41cbf5626460.png)
- インストール後、常駐されているのを確認

## Model の登録
PowerShell を立ち上げ、Model をダウンロードする。
下記は、マイクロソフトの`phi3`、Metaの`Llama3`、Googleの`codegemma`、中国のスタートアップ企業の`deepseek-coder`を入れている。
`deepseek-coder`は、コンパクトで優れたコード生成AI。
```powershell
ollama pull codegemma
ollama pull deepseek-coder:6.7b
ollama pull llama3
ollama pull phi3
```

- Model が入っているか確認する
```powershell
ollama list
```
```powershell
NAME                    ID              SIZE    MODIFIED
codegemma:latest        0c96700aaada    5.0 GB  30 minutes ago
deepseek-coder:6.7b     ce298d984115    3.8 GB  10 seconds ago
llama3:latest           a6990ed6be41    4.7 GB  13 days ago
phi3:latest             a2c89ceaed85    2.3 GB  2 weeks ago
```

## 動作確認
- PowerShell から下記のコマンドを打ち、Ollamaに「何故、空が青いのか」という質問をする
```powershell
(Invoke-WebRequest -method POST -Body '{"model":"phi3:latest", "prompt":"Why is the sky blue?", "stream": false}' -uri http://172.16.11.68:11434/api/generate ).Content | ConvertFrom-json
```
- 下記の様に返答があれば成功
```
model                : phi3:latest
created_at           : 2024-04-26T12:04:04.187699Z
response             : The sky appears blue to us because of a phenomenon called Rayleigh scattering. As sunlight travels thro
                       ugh Earth's atmosphere, it encounters molecules and small particles that are much smaller than its wave
                       length. Blue light (with shorter wavelengths) is scattered in all directions by these atmospheric parti
                       cles more so than other colors like red or yellow because it travels as shorter, smaller waves. This sc
                       attering causes the sky to look blue during the day. However, at sunrise and sunset, the sky often appe
                       ars red or orange due to the longer path of light through the atmosphere, which scatters out more of th
                       e blue wavelengths and allows the longer-wavelength colors to become more visible.
done                 : True
context              : {32010, 13, 11008, 338...}
total_duration       : 4422070600
load_duration        : 2952131000
prompt_eval_count    : 13
prompt_eval_duration : 33038000
eval_count           : 157
eval_duration        : 1435623000
```

## ポートを開ける
- 内部ネットワークで公開するため、Ollama が利用しているポート 11434 を開ける
- PowerShellを「管理者として実行」で立ち上げる
```powershell
New-NetFireWallRule -DisplayName 'Ollama' -Direction Inbound -LocalPort 11434 -Action Allow -Protocol TCP
New-NetFireWallRule -DisplayName 'Ollama' -Direction Outbound -LocalPort 11434 -Action Allow -Protocol TCP
```

## 別のPCから動作確認
- WebRequestを投げられるか確認する
```powershell
(Invoke-WebRequest -method POST -Body '{"model":"phi3:latest", "prompt":"Why is the sky blue?", "stream": false}' -uri http://172.16.11.68:11434/api/generate ).Content | ConvertFrom-json
```
- 下記の様に返答があれば成功
```
model                : phi3:latest
created_at           : 2024-04-26T14:44:09.428212Z
response             :  The sky appears blue to the human eye because of a phenomenon called Rayleigh scattering. As sunlight
                       travels through Earth's atmosphere, it interacts with molecules like nitrogen and oxygen. These interac
                       tions cause the light to scatter in all directions. However, shorter wavelengths (blue light) scatter m
                       ore than longer wavelengths (such as red or yellow). This scattered blue light is what we see when we l
                       ook up at the sky.
done                 : True
context              : {32010, 13, 11008, 338...}
total_duration       : 1574321700
load_duration        : 52432600
prompt_eval_duration : 137014000
eval_count           : 99
eval_duration        : 1383368000
```