Ollamaですごく簡単にLLMを動かせたけど…
※ 今回の画像は DALL E3 で作ってみた。Transformer を ChatGPT に説明させて、その要旨を短く拾い上げ(これは自分でやった)、それを元に画像生成の指示とした。
まとめ
とにかくでかい
環境
- AppleSillicon Mac メモリ 16GB
- macOS 13.6
- colima 0.6.7 ( limactl 0.19.1 )
- docker 24.0.2 ( via Homebrew )
- Ollama 0.1.15
- llama.cpp 1709 (ea5497d) built with clang-1403.0.22.14.1 for arm64
やったこと / できたこと
- ローカルで LLM を動かすために Ollama を動かしてみた。めちゃくちゃ簡単だった
- neural-chat モデルを pull して動かした
- → おぉ、なんかそれっぽいチャットができる!
- Hugging Face からモデルをダウンロードするために初めて Git LFS 使った
- Ollama は必要なタイミングで LLM を読み込み直したり、不要になったら止めたりと賢く動いてくれるので常時メモリがカツカツということはない
背景とか思っていたことなど
- ChatGPT を個人で利用する分にはあんまりプロンプトエンジニアリングとか盛り上がらなかったけど、RAG には興味ある
- なんならベクトル検索だけでも興味ある
- Ruby だと Langchain.rb と pgvector でなんとかなるっぽい
- AI エージェントってなんだ?
- タスクに分解するところからやってくれるのか。全部うまいこと連携するかどうかはともかく、むしろフローを分解、整理する部分は曖昧な知識補完よりも最新の情報も必要なく AI の得意分野っぽい(エキスパートなんとか的な考え方かもしれない)
- 思っていたよりタスクはもっと細かく分けられるみたい
- チャット形式ではなく埋め込みの AI なんとかは自分たちのプロダクトのコンテキストを前提にタスクを最適化することで気の利いた動作を実現しようとしているのかもしれない
あれ、思ったより面白いかもしれないぞ?
- チューニングもそれなりに時間が掛かるだろうし、LLM はともかく RAG も含めて小規模なセットを手元で動かせるようにしておきたい
- ローカル LLM は llama.cpp が定番ぽいけど、野良ビルドしかインストール方法がないのがイヤだなぁとウダウダ調べてたらなんとか Ollama にたどり着いた
分かったこと
- AppleSillicon はメモリ 16GB と内蔵 GPU だけでも十分 LLM を動かせる(思ったより速い)
- Ollama は(恐らく)内蔵の llama.cpp とプロンプトなどの追加データで Ollama 用のモデルを成立させている
- だから GGUF に標準対応しているので、GGUF で量子化されているモデルならそのまま利用できる
- 世の中 OpenAI の API 利用を前提にしたツールは多いが、LiteLLM を使って OpenAI サーバに仕立てればよさそう
- LLM は量子化前提でもクソでかい
- git clone でカジュアルに 100GB 降ってきて手元のストレージが残り 4GB 切ってさすがに焦った1
- フルサイズのモデルはさすがにやってられないので quantize を Ollama の用意してくれている Docker イメージでやろうとしたが、進捗が途中で止まって終わらない
- 生の llama.cpp でやったら割とすんなり終わったので、memory-bound な処理を Docker で動かすのはやっぱイマイチっぽい2
- 量子化もまだ過渡期で、llama.cpp の GGML / GGUF、HuggingFace の GPTQ、MIT の AWQ などまだまだ枯れていない
- ローカルで LLM を動かしてみると、チャットが思った通りに成り立たない。AI がぐわーっとまくし立てたり、逆に勝手に会話を切り上げようとしたりする。結局プロンプトやインタラクションを決定するテンプレートはかなり重要
- デカイ、とにかくデカイ。
ブライックフライデーで買っておいた NAS を繋いで NAS を基本に作業させることにしましたとさ。(めっちゃ遅くなるけど仕方ない)
全体像はこの辺に話があるのと、日本国内の日本語の事例もそこそこ増えているので、基本的な部分でちゃんと追いつければ、そこからはなんとかなるかなぁ?という印象。
Building LLM-Powered Web Apps with Client-Side Technology · Ollama Blog
結局よく分かっていないこと
- llama.cpp でローカルで LLM を動かすことができるよ、って記事が多いんだけど llama.cpp は Llama の runtime って書かれてて、なのに他のモデルも使えるとか、何を言ってるんだ?って感じ。ビルド後の llama.cpp のディレクトリを見るとかなり雑多なツールがごちゃ混ぜに含まれているのは分かる
- Ollama はこれに対していい具合の API を提供しているということか?
- LLM のファイルフォーマット、データフォーマットとかランタイムって何?状態だったんだけど、ChatGPT さんによると Pytorch とかのフレームワークでの利用が前提で、基本的にはこうしたフレームワークから使うようになっているが、HuggingFace Transformers はそれはそれでいい具合に揃ってるのでアレコレ考える必要がない? HuggingFace Transformer っていう runtime があるならなんとなく理解はできるが、LLM を動かすことしかしてないのでそこもよく分からず