PyTorch・Hugging Face・Ollamaを同じ棚に並べるな — AIフレームワークは3層だ
何で計算するか・何でモデルを読み込むか・何で速く動かすか
「TransformerがMVCみたいなものなら、Railsの他にDjangoがあるように、Hugging Face以外にも何かあるよね?」
いい直感だが、答えは一行では出ない。AIの側は1層ではなく3層だからだ。PyTorchとHugging Face transformers とOllamaを同じ棚に並べて比べると、ずっと混乱する。この記事を読めば、初めて見るAIツールの名前が出てきても、まず何層目かを分けて、同じ層の中で選べるようになる。
3つの層
基盤フレームワーク — 行列計算と学習のエンジン。PyTorch、TensorFlow、JAX。モデルを一から組んだり学習させたりするときに使う。
モデルライブラリ — 既存のモデルを読み込んで使えるようにする。Hugging Face transformers(Python)、transformers.js(JavaScript)。中では基盤フレームワーク(またはONNX Runtime)を呼んでいる。
推論エンジン — 学習済みのモデルを速く動かすことだけに集中する。llama.cpp、vLLM、Ollama、MLX。
Railsでいえば、基盤フレームワークがRuby・Rack、モデルライブラリがRails、推論エンジンがPumaあたりだ。「RailsとPumaどっちがいい?」がおかしな質問であるように、「OllamaとPyTorchどっちがいい?」もおかしな質問になる。
層ごとに見直すと
| 名前 | 言語 | 層 | 得意なこと | 弱いところ |
|---|---|---|---|---|
| PyTorch(Meta) | Python(コアはC++) | 基盤 | 研究・産業でいちばん使われている | 自分で書くとコードが長い |
| TensorFlow / Keras(Google) | Python | 基盤 | モバイル配布のツール(TFLite) | 新しいモデルのコードはPyTorch向けが先に出ることが多い |
| JAX(Google) | Python | 基盤 | TPU、Geminiの学習に使われた | 覚えるのに時間がかかる |
| HF transformers | Python | モデル | 公開モデルの数、ファインチューニングまで | 推論速度は専用エンジンより遅い |
| transformers.js | JavaScript | モデル | ブラウザ・NodeでONNXを実行 | 大きいモデルは無理 |
| llama.cpp | C/C++ | 推論 | GGUF、CPU・MacでLLM、量子化 | 学習はしない |
| Ollama | Go | 推論 | ollama run の一行 |
細かい制御は難しい |
| vLLM | Python | 推論 | 同時リクエストの処理量 | GPUサーバーが要る |
| MLX(Apple) | Python / Swift | 推論・学習 | Apple Siliconで速い | Mac専用 |
OllamaはREADMEで、対応backendとしてllama.cppを挙げている。なので「Ollamaかllama.cppか」は同じ層の中の「楽に使うか、直接いじるか」の問題だ。
言語は事実上Python
Python ─ 全部できる(学習・ファインチューニング・推論)
JS/TS ─ transformers.js(ONNX)。ブラウザで動かせるのが最大の強み
C/C++ ─ llama.cpp、ONNX Runtime
Go ─ Ollamaが代表。学習はしない
Ruby ─ 選択肢が少ない。ONNX Runtimeを包んだgem程度
このブログを動かしているのはRailsなので、この最後の行に何度もぶつかった。Railsのプロジェクトでローカルモデルを使うなら、結局どちらかになる。Pythonサーバーを別に立ててHTTPで呼ぶか、モデルをONNXに変換して呼ぶか。 ブラウザで動かしていい処理なら、transformers.jsでサーバーを通さない道もある。
選ぶ順番
学習やファインチューニングをするなら、基盤にPyTorch、その上にHF transformers。人が作ったモデルをそのまま使うならモデルライブラリ。決まったモデルを速く安く動かしたいなら推論エンジン。自分のMac 1台ならOllama、大勢が同時に使うGPUサーバーならvLLM。
HF transformersの pipeline() が中で何をしているかは、Hugging Face pipelineの仕組みに別でまとめてある。同じ重みをブラウザ向けに詰め直す話はONNXは梱包規格だにある。
RailsのようなPython以外のスタックにローカルモデルをつなぎたいが、どの層をどこに置くかで詰まっているなら、negabaroに相談してもらって構わない。うちもこの構成を実際に悩みながら回している。
キーコンセプト
ツール名が出てきたらまず層を分ける — 基盤・モデルライブラリ・推論エンジン
比較は同じ層の中だけ — Ollama vs vLLMは成り立つが、Ollama vs PyTorchは成り立たない
学習するならPyTorch + HF transformers、動かすだけなら推論エンジン
RailsからはPythonサーバーを別に置くか、ONNXで呼ぶ