モデル / データセット
michaelfeil/infinity avatar
michaelfeil/infinity

infinity_emb v2 を採用する前に確認すべきこと: 埋め込み・リランキング配信エンジンの実像

Infinity is a high-throughput, low-latency serving engine for text-embeddings, reranking models, clip, clap and colpali

スター 2,939フォーク 207PythonMIT

ひと目でわかる

これは何?
HuggingFace の埋め込み・リランキング・マルチモーダルモデルを REST API として配信する infinity について、README とリリース情報から読み取れる仕組み、起動方法、そして向き不向きを整理する。
誰に向いている?
自前の GPU や CPU 上で埋め込み・リランキングを REST で配信したいチーム、特に複数モデルを 1 プロセスでまとめたい場合は検討に値する。マネージド API で足りている場合や、リリース頻度の高い依存関係を追いたくない場合は向かない。
商用利用できる?
できます。MIT は寛容なライセンスで、著作権表示とライセンス表示を残せば、使用・改変・販売が可能です。
今もメンテナンスされている?
されています。最後のコミットは 176 日前です。
何の言語で書かれている?
主に Python です(GitHub の言語統計による)。

回答はプロジェクトの GitHub データ(最終同期:2026年9月15日)と当サイトの分析に基づくもので、法的助言ではありません。

オープンソース詳細解説

infinity が埋めるのは「モデルはあるが配信層がない」という隙間

HuggingFace 上には埋め込みモデルやリランキングモデルが大量にある。しかし学習済みの重みをダウンロードしただけでは、バッチ処理のスケジューリング、トークナイズの並列化、HTTP エンドポイントの公開は自前で書くことになる。infinity はこの配信層だけを引き受ける。README は「high-throughput, low-latency REST API for serving text-embeddings, reranking models, clip, clap and colpali」と述べており、対象はテキスト埋め込みに限らない。CLIP や CLAP のようなマルチモーダル、ColPali のような後期相互作用型の検索モデルも同じサーバで扱う想定になっている。想定読者は、検索や RAG のパイプラインを持ち、埋め込み生成を外部 API に投げるコストかレイテンシを問題視しているエンジニアだ。モデルの選定自体は自分で行いたいが、配信の実装は書きたくない、という立場に向く。

推論バックエンドの選択が性能の大半を決める

README によれば、infinity の推論サーバは PyTorch、optimum (ONNX/TensorRT)、CTranslate2 の上に構築されている。アクセラレータとして NVIDIA CUDA、AMD ROCM、CPU、AWS INF2、APPLE MPS が挙げられており、FlashAttention を利用するとの記載がある。ここで重要なのは、これらが排他的な選択肢ではなく、モデルとハードウェアの組み合わせで使えるバックエンドが変わるという点だ。CTranslate2 は量子化された Transformer の推論に強みを持つが、対応するアーキテクチャは限られる。ONNX や TensorRT も同様で、任意の HuggingFace モデルがそのまま乗るわけではない。README の「Deploy any model from HuggingFace」という表現は、あくまで PyTorch バックエンドを前提とした場合の話として読むのが安全だ。どのバックエンドが選ばれるかはモデル定義と環境変数に依存するため、採用前に自分のモデルでどの経路になるかを確認する必要がある。

動的バッチングと専用スレッドという設計の核

README には「Infinity uses dynamic batching and tokenization dedicated in worker threads」とある。これは推論サーバとしての中心的な仕組みだ。リクエストが到着するたびに 1 件ずつ GPU に流すのではなく、短い時間窓でまとめてバッチを構成し、トークナイズのような CPU 寄りの処理をワーカースレッドに逃がす。結果として、GPU 側は推論に専念でき、CPU 側は前処理を並行して進められる。この設計はスループットを上げる一方で、バッチが埋まるまでの待ち時間がレイテンシに乗る。単発の低レイテンシが最優先のユースケースでは、バッチ窓の設定次第で物足りなさが出る可能性がある。README は動的バッチングの具体的なパラメータや窓幅には触れていないため、実際の挙動は `v2 --help` で確認できる引数に依存すると考えられる。

マルチモデルを 1 プロセスで束ねる v2 CLI

v2 CLI の特徴は、複数モデルを同時に起動できる点にある。README のニュース欄には 2024 年 5 月の項目として「launch multiple models using the v2 cli, including --api-key」と記載されている。単一モデルを配信するだけなら FastAPI ベースの薄いラッパーでも足りるが、検索パイプラインでは埋め込みモデルとリランキングモデルを別々に立てる構成が多い。infinity はこれを 1 つのプロセスでオーケストレーションする方向を選んでいる。API キーによる保護も CLI 引数として提供されるため、社内ネットワークに裸で公開する以外の選択肢がある。ただし複数モデルを 1 プロセスに載せると、メモリ消費はモデル数に比例して増える。GPU メモリが厳しい環境では、モデルごとにプロセスを分けたほうが安全な場合もある。

インストールと起動: pip と Docker の二経路

README が示す起動方法は 2 つある。pip 経由なら `pip install infinity-emb[all]` を実行し、venv を有効にした状態で `infinity_emb v2 --model-id BAAI/bge-small-en-v1.5` を叩く。引数の一覧は `infinity_emb v2 --help` で確認できる。もう 1 つは Docker で、`michaelf34/infinity` イメージを使う。README はこちらを recommended と明記しており、アクセラレータをマウントするために nvidia-docker の導入が必要だと説明している。ニュース欄には 2024 年 11 月付で AMD、CPU、ONNX の Docker イメージが追加されたとあり、CUDA 以外の環境向けのイメージも用意されている。環境変数からも全引数を渡せるため、コンテナオーケストレーションとの相性は悪くない。

OpenAI 互換 API とクライアントの位置づけ

infinity の OpenAPI は OpenAI の API 仕様に揃えられていると README は述べている。これは既存の OpenAI 向けクライアントコードの向き先を変えるだけで移行できる可能性を示す。実際、2024 年 10 月には `pip install infinity_client` が追加されており、専用クライアントも提供されている。ただし互換性は「揃えている」という記述にとどまり、どの程度の範囲をカバーするかは README からは読み取れない。埋め込みエンドポイントの基本的な形は似ていても、バッチサイズの扱いやエラー形式の細部は異なりうる。移行を検討するなら、自分のクライアントコードが依存しているフィールドを実際に突き合わせる作業が要る。

向かないケース: モデル非対応とリリース頻度

infinity が万能でない理由は 2 つある。第一に、バックエンドの対応範囲という制約だ。ONNX や TensorRT、CTranslate2 は任意のモデルアーキテクチャを受け付けるわけではない。新しいアーキテクチャのモデルを出したばかりの研究チームにとって、infinity がそのまま動く保証はない。第二に、リリースの間隔だ。提供されたリリース情報では 0.0.77 が 2025 年 8 月、0.0.76 が 2025 年 3 月、0.0.75 が 2025 年 1 月となっており、バージョン番号は 0.0.x のまま進んでいる。活発な開発の裏返しとして、破壊的変更が入る余地は残っている。依存関係を固定して運用したい組織にとっては、追従コストを見積もる必要がある。

比較対象としての Text Embeddings Inference

同じ領域には HuggingFace の Text Embeddings Inference (TEI) がある。両者の違いは設計の重心にある。TEI は Rust で書かれ、テキスト埋め込みとリランキングに絞った単機能のサーバとして設計されている。対して infinity は Python で書かれ、CLIP、CLAP、ColPali といったマルチモーダルや後期相互作用型のモデルまで同じサーバで扱うことを狙う。複数モデルを 1 プロセスでまとめる v2 CLI も infinity 側の特徴だ。逆に、テキスト埋め込みだけを大量に捌きたいのであれば、機能を絞った TEI のほうが構成は単純になる。どちらを選ぶかは、扱うモダリティの数と、モデルを 1 プロセスに集約したいかどうかで決まる。

ライセンスと運用コストの見積もり

infinity 本体は MIT ライセンスで提供されている。MIT は商用利用を含めて制約が少ない部類に入るが、同梱されるモデルの重みや、CTranslate2、optimum、TensorRT といった依存コンポーネントにはそれぞれ別のライセンスが適用される。特に NVIDIA の TensorRT や CUDA 関連は独自の配布条件を持つ。infinity 自体が MIT だからといって、配信するモデルやバックエンドの利用条件まで自由になるわけではない。ライセンスの解釈は法務の領域であり、ここで断定はしないが、採用時にはモデルごとのライセンスとバックエンドの配布条件を別々に確認する必要がある。運用面では、Docker イメージを固定タグで参照し、`infinity_emb v2 --help` で引数の変更を追う運用が現実的だ。

編集部の結論

自前の GPU や CPU 上で埋め込み・リランキングを REST で配信したいチーム、特に複数モデルを 1 プロセスでまとめたい場合は検討に値する。マネージド API で足りている場合や、リリース頻度の高い依存関係を追いたくない場合は向かない。まず `infinity_emb v2 --help` で利用可能な引数を確認し、対象モデルが README の記載するバックエンド(PyTorch / ONNX / TensorRT / CTranslate2)のどれで動くかを確かめてから、`--model-id` に実際のモデルを渡して起動できるか検証するのが最初の一歩になる。

公式情報源

  1. License: MIT
  2. michaelfeil/infinity on GitHub
  3. Project website
  4. README
  5. Releases
コミュニティノート

コミュニティノート