👏

Fly GPUsでOllama実行環境をつくる

2024/02/27に公開
  • Fly.ioは使う時だけ自動で起動する設定にできるので検証環境のGPUインスタンスのコストを抑えられそうので試した
  • Ollamaはライブラリに各種LLMが登録されていてWeb APIや対話シェルを起動できて比較する時に便利

ドキュメント

https://fly.io/docs/gpus/
https://fly.io/blog/scaling-llm-ollama/

環境構築

GoogleのGemmaがライブラリにあるので、これを使えるようにする

https://ai.google.dev/gemma?hl=en

以下のようなfly.tomlを用意してfly launchするだけ

APIアクセス

curl -sX POST https://XXX.fly.dev/api/generate -d '{
  "model": "gemma",
  "prompt":"日本で一番高い山は"
 }' | jq .response;

"日本で"
"一番"
"高い"
"山"
"は"
"富士山"
"です"
"。"
"富士山"
"は"
"海"
"抜"
"高度"
"3"
","
"7"
"7"
"6"
"メートル"
"に"
"達"
"し"
"、"
"日本の"
"最高"
"峰"
"です"
"。"
""

応答速度

手持ちのWindows(WSL)とmacOSでの実行速度を比較する

Fly GPUs(a100-pcie-40gb)

> for i in {1..10}; do
  curl -sX POST https://XXX.fly.dev/api/generate -d '{
    "model": "gemma",
    "prompt":"日本で一番高い山は"
  }' -o /dev/null -w '%{time_total}\n' | xargs
done | awk '{ total += $1; count++ } END { print total/count }'

0.635101

WSL

  • AMD Ryzen 5 5600X 6-Core Processor
  • RAM 8GB
  • NVIDIA GeForce RTX 4070
  • CUDA Toolkit 11.5
$ for i in {1..10}; do
  curl -sX POST http://localhost:11434/api/generate -d '{
    "model": "gemma",
    "prompt":"日本で一番高い山は"
  }' -o /dev/null -w '%{time_total}\n' | xargs
done | awk '{ total += $1; count++ } END { print total/count }'

1.00433

MacBook Pro

for i in {1..10}; do
  curl -sX POST http://localhost:11434/api/generate -d '{
    "model": "gemma",
    "prompt":"日本で一番高い山は"
  }' -o /dev/null -w '%{time_total}\n' | xargs
done | awk '{ total += $1; count++ } END { print total/count }'
1.26624

Metalを使った実行ができているのかよく分からないけど、CPUだったらひとまわり遅そうと予想した

対話シェル

起動中にfly ssh console

# ollama run gemma

>>> ここで一句、
私の心があなたの心をこませ、
あなたは私の心をこませ。

この句は、恋のテーマに、愛しい人の心をこませるテーマを含みます

Tips

外部にエンドポイントが公開されたくない

fly ips allocate-v6 --private の説明どうりにする

モデル保存ディレクトリの空き容量足りない

fly vol extend vol_XXX -s '32gb'のように拡張する

ライブラリにないモデルを使いたい

OllamはLlama.cppで動くように変換したモデルをimport可能で以下にドキュメントがある

ollama/docs/import.md at main · ollama/ollama

Web UI欲しい

Open WebUI (Formerly Ollama WebUI) というのがあるらしい(未検証)

https://github.com/open-webui/open-webui

Discussion