OLLAMA API を外部から呼出す

AI

 Windowsのローカル環境にollamaを入れて使っていますが、外部からプライベートIPを指定してAPIを呼び出そうとするとエラーになるので、IPアドレス指定によるOLLAMA APIの呼び出しができるようにしました。

● 環境

 Windows11 home(IP : 192.168.0.45)
 LLM Ollama 0.1.47

● 修正前

  ollamaは標準インストール後の状態だと、ローカル環境でしか使えない状態になっています。

C:\ >curl localhost:11434
Ollama is running
C:\ >curl 127.0.0.1:11434
Ollama is running
C:\ >curl 192.168.0.45:11434
curl: (7) Failed to connect to 192.168.0.45 port 11434 after 2034 ms: Couldn't connect to server

localhost と127.0.0.1 ではアクセスできますが、プライベートIPアドレスでは呼び出すことができません。
このままでは、ローカルPC以外からのレスポンスを受け取ることができませんので、修正します。

● DOC(参考資料)

 OllamaのドキュメントからFAQ(ollama/docs/faq.md at main · ollama/ollama (github.com))を確認したところ、
   ollamaでは、windowsの環境変数を使用しているとのことでした。
   ollamaが使用する環境変数 OLLAMA_HOST、OLLAMA_MODELS、etc

● 外部からollama apiにアクセスする

1. 環境変数の変更

 windowsの環境変数の設定方法
  ①windowsボタンの横にある検索ボックスに「環境変数」と入力し、環境変数ウィンドウを開く
  ②環境変数ウィンドウの「新規」ボタンを押下し、
    新しいユーザ変数の変数名に「OLLAMA_HOST」、変数名に「0.0.0.0」と入力してOKボタンを押下
    新しいユーザ変数の変数名に「OLLAMA_MODELS」、変数名に「llama2」と入力してOKボタンを押下

  ③コマンドプロンプトを一度閉じて開きなおす(これ重要ですw)
  ④コマンドプロンプトで次のコマンドを入力し、環境変数が設定されていることを確認する

#環境変数が反映されているか確認

C:\ >echo %ollama_host%
0.0.0.0
C:\ >echo %ollama_models%
llama2

2. ollamaの再起動

  ollamaを再起動させるには、タスクバーのラマのアイコンを右クリックしてquitを選択
  ollamaを起動させるには、コマンドプロンプトから次のコマンドで起動します。

C:\ >ollama run llama2
C:\Users\kirabbit>ollama run llama2
pulling manifest
pulling 8934d96d3f08... 100% ▕████████████████████████████████████████████████████████▏ 3.8 GB
pulling 8c17c2ebb0ea... 100% ▕████████████████████████████████████████████████████████▏ 7.0 KB
pulling 7c23fb36d801... 100% ▕████████████████████████████████████████████████████████▏ 4.8 KB
pulling 2e0493f67d0c... 100% ▕████████████████████████████████████████████████████████▏   59 B
pulling fa304d675061... 100% ▕████████████████████████████████████████████████████████▏   91 B
pulling 42ba7f8a01dd... 100% ▕████████████████████████████████████████████████████████▏  557 B
verifying sha256 digest
writing manifest
removing any unused layers
success

当環境ではモデルのpullが始まりましたが、正常に起動しました。(この後の起動ではpullはありませんでした)

3. 公開されているか確認

windowsサーバ

C:\ >curl localhost:11434
Ollama is running
C:\ >curl 127.0.0.1:11434
Ollama is running
C:\ >curl 192.168.0.45:11434
Ollama is running

プライベートIPでAPIを呼び出しても実行されていることがわかります。

確認結果

 VM上のUbuntuからwindows上のAPIに直接アクセスしても、正常にレスポンスを返していることがわかります。

 VM上のUbuntuからipアドレスを指定して、curlからollamaを呼び出してもレスポンスが返ってきていることがわかります。

● Origin制約対応

 ollamaの初期状態ではOrigin制約によって外部から呼び出すことができない状態になっています。
  オリジン制約は、
    APIサーバの接続許可範囲を指定
    Webサーバでhttpヘッダに、外部コンテンツの許可設定
    クライアント(javascript fetch)側で外部APIを使用する設定
にすることで解除できます。
 ローカル環境だと実行できるのに、IP指定でollamaAPIを呼びだすと、オリジン制約に引っ掛かります。

① APIサーバの設定
  OllamaサーバのOrigin制約範囲は、Windowsの環境変数に
    変数名 OLLAMA_ORIGINS
    変数値 *  (必要に応じて調整してください)
 と設定し、コマンドプロンプトを再起動させます。
  環境変数はログファイルの値で確認できます。 
    ログファイル C:\Users\(ユーザ名)\AppData\Local\Ollama\server.log
 の1行目
    OLLAMA_ORIGINS:[* …
 とある部分で変更を確認してください。
  OLLAMA_ORIGINSは初期設定では、

 OLLAMA_ORIGINS:[http://localhost https://localhost http://localhost:* https://localhost:* http://127.0.0.1 https://127.0.0.1 http://127.0.0.1:* https://127.0.0.1:* http://0.0.0.0 https://0.0.0.0 http://0.0.0.0:* https://0.0.0.0:* app://* file://* tauri://*

 となっていました。
  だから、初期設定のままでも、localhostや127.0.0.1からの呼び出しではオリジン制約を回避できていたということですね。
  ところで[tauri:]って何なんでしょう??

② Webサーバ(Apache)の設定
  htmlヘッダーに”Access-Control-Allow-Origin”を追加します。

 apacheのhttpd.confを修正
 #LoadModule headers_module modules/mod_headers.so
 ↓
 LoadModule headers_module modules/mod_headers.so
 
  # 次の行を追加
 <IfModule headers_module>
    Header set Access-Control-Allow-Origin "*"
  </IfModule>

③ サーバを再起動させる(重要です)

 コマンドプロンプトのウィンドウを開きなおす
 apacheとollamaを確実に再起動させてください。
 apacheの終了は、管理者権限が必要になる場合があります(私は拒否されましたw)

 コマンドプロンプトを管理者権限で起動させれば終了させることができます。
 ollamaサーバの起動は、次のコマンドでも実行できますが、実行速度が劇的に落ちます。

C:\ > ollama serve
2024/06/28 16:31:26 routes.go:1064: INFO server config env="map[CUDA_VISIBLE_DEVICES: GPU_DEVICE_ORDINAL: HIP_VISIBLE_DEVICES: HSA_OVERRIDE_GFX_VERSION: OLLAMA_DEBUG:false OLLAMA_FLASH_ATTENTION:false OLLAMA_HOST:http://0.0.0.0:11434 OLLAMA_INTEL_GPU:false OLLAMA_KEEP_ALIVE: OLLAMA_LLM_LIBRARY: OLLAMA_MAX_LOADED_MODELS:1 OLLAMA_MAX_QUEUE:512 OLLAMA_MAX_VRAM:0 OLLAMA_MODELS:llama2 OLLAMA_NOHISTORY:false OLLAMA_NOPRUNE:false OLLAMA_NUM_PARALLEL:1 OLLAMA_ORIGINS:[* http://localhost https://localhost http://localhost:* https://localhost:* http://127.0.0.1 https://127.0.0.1 http://127.0.0.1:* https://127.0.0.1:* http://0.0.0.0 https://0.0.0.0 http://0.0.0.0:* https://0.0.0.0:* app://* file://* tauri://*] OLLAMA_RUNNERS_DIR:C:\\Users\\(ユーザ名)\\AppData\\Local\\Programs\\Ollama\\ollama_runners OLLAMA_SCHED_SPREAD:false OLLAMA_TMPDIR: ROCR_VISIBLE_DEVICES:]"

④ 実行結果

 回答はちんぷんかんぷんですが、llama2の動作を確認することができました。
 同じLAN内に接続している携帯電話からも、同じように接続できました。

答えはそれっぽいけど、違いますよね。
どこにも100度って出てこないところが驚きでしたw。