Infinity 評測:把 embedding、reranker 與多模態模型收進同一個 REST 服務
Infinity is a high-throughput, low-latency serving engine for text-embeddings, reranking models, clip, clap and colpali
秒懂
- 它是什麼?
- Infinity 是 michaelfeil 維護的 Python 服務引擎,用 FastAPI 包裝 PyTorch、optimum 與 CTranslate2 後端,對外提供對齊 OpenAI 規格的 embeddings API。本文談它的實際機制、啟動方式、多模型編排帶來的成本,以及什麼情況下你該改用別的方案。
- 適合誰用?
- 如果你的團隊已經在用 HuggingFace 上的 embedding 或 reranker 模型,而且需要一個自架的 OpenAI 相容端點,Infinity 值得放進候選清單;如果你只需要單一模型、單一請求路徑,直接用 transformers 寫幾十行 FastAPI 反而更好除錯。導入前先確認三件事:你的模型是否在 README 提到的支援範圍內(text-embeddings、reranking、clip、clap、colpali),你的加速器屬於 CUDA、ROCM、CPU、AWS INF2 還是 Apple MPS 哪一種,以及 0.0.x 版本節奏下你要不要鎖定具體版本號。
- 可以商用嗎?
- 可以。MIT 是寬鬆授權:你可以使用、修改並販售以它為基礎的軟體,只需保留著作權與授權聲明。
- 還在維護嗎?
- 有在維護。儲存庫最近一次提交在 176 天前。
- 用什麼語言寫的?
- 主要是 Python(依據 GitHub 的語言統計)。
以上回答依據專案的 GitHub 資料(最近同步於 2026年9月15日)與我們的分析,不構成法律意見。
開源專案深度解析
Infinity 要解決的是模型上線那一段,不是模型訓練
把一個 sentence-transformer 模型變成可用的服務,中間隔著好幾件事:tokenizer 要在哪裡跑、batch 怎麼湊、GPU 記憶體怎麼分配、多個模型怎麼共存、API 回應格式要不要跟 OpenAI 對齊。多數團隊第一次上線時會自己寫一個 FastAPI 檔案,把 model.encode 包起來,能跑,但 request 一多就開始出現 tokenizer 佔住主執行緒、batch 大小固定、換模型要改程式碼的問題。
Infinity 的定位就是把這一段標準化。README 對自己的描述是 high-throughput、low-latency 的 REST API,服務對象是 text-embeddings、reranking 模型,以及 clip、clap、colpali 這幾類多模態模型。它不訓練模型,也不做向量資料庫,只負責把 HuggingFace 上的模型載進來、用一致的介面吐出去。
誰適合用它?已經選定模型、需要自架推論端點、而且不想自己維護 batching 與後端切換邏輯的團隊。誰不適合?只想在筆電上跑一次 embedding 做實驗的人,裝 transformers 就夠了。
FastAPI 外層加上三種推論後端,中間靠 worker thread 做 tokenization 與動態批次
README 寫得很直白:推論伺服器建構在 PyTorch、optimum(ONNX/TensorRT)與 CTranslate2 之上,並使用 FlashAttention,支援 NVIDIA CUDA、AMD ROCM、CPU、AWS INF2 與 Apple MPS。這意味著同一個 HTTP 介面底下,實際執行的後端可能完全不同。PyTorch 是預設路徑,ONNX 與 TensorRT 走 optimum,CTranslate2 則是另一條獨立的推論路徑。
資料流大致是:請求進來,FastAPI 收下,tokenization 與 dynamic batching 被放到專用的 worker thread 裡執行,避免佔住事件迴圈;批次湊好後送進選定的後端,結果再依 OpenAI 的 embeddings 規格組裝回傳。README 特別強調 tokenization 是在 worker thread 中完成的,這是它宣稱低延遲的關鍵之一,因為 tokenizer 是純 CPU 工作,跟 GPU 推論重疊執行才不會互相等。
多模型的部分,README 的說法是 mix-and-match multiple models,由 Infinity 負責 orchestrate。這代表你可以同時掛上一個 embedding 模型和一個 reranker,兩者共用同一個服務行程。至於排程細節、每個模型各自的 batch 上限如何決定,README 沒有展開,官方文件站 https://michaelfeil.github.io/infinity 才是查這些參數的地方。
啟動方式:pip 安裝或 Docker,v2 CLI 支援參數與環境變數兩種寫法
README 給的第一條路是 pip:
pip install infinity-emb[all]
裝完之後在啟用中的 venv 裡直接呼叫 CLI:
infinity_emb v2 --model-id BAAI/bge-small-en-v1.5
第二條路是預先建好的 Docker 映像 michaelf34/infinity,README 對這條路的評語是 recommended。用 Docker 的話要記得把加速器掛進去,文件提到的方式是安裝 nvidia-docker。
v2 CLI 的一個重點是「所有參數都能透過環境變數或命令列參數傳入」,這是 2024 年 6 月那則更新裡明講的。對容器化部署來說這很實際,映像裡不用改 entrypoint,只要注入環境變數就能換模型、換後端。想知道每個參數的說明,README 指示執行:
infinity_emb v2 --help
另外 2024 年 5 月的更新提到 v2 CLI 支援一次啟動多個模型,並且有 --api-key 這個參數。如果你的端點會暴露在內部網路之外,這個參數是你唯一在 README 裡看得到的存取控制手段,其他認證或限流機制並沒有在素材中被提及。
用戶端方面,2024 年 10 月新增了 pip install infinity_client,等於官方也提供了一個對應的 Python 客戶端套件。
後端選擇不是效能旋鈕,而是部署環境的約束條件
把 PyTorch、ONNX/TensorRT、CTranslate2 三條路並列,很容易讓人以為這是可以自由切換的效能選項。實際上它們各自綁定不同的硬體與工具鏈:TensorRT 基本上只在 NVIDIA 生態內有意義,CTranslate2 有自己的模型轉換流程,ONNX 則介於中間。README 沒有提供任何跨後端的比較數據,所以任何「哪個後端快幾倍」的說法都無法從素材中推導出來。
能確定的是,README 把這些後端與 CUDA、ROCM、CPU、AWS INF2、Apple MPS 並列陳述,代表支援矩陣是二維的:後端乘上加速器。真正要驗證的是你的特定組合有沒有被涵蓋,而不是預設 PyTorch 一定可用。
量化方面,2024 年 3 月的更新寫的是 experimental int8(CPU 與 CUDA)以及 fp8(H100 與 MI300)。experimental 這個詞是專案自己用的,代表介面或行為可能還會變動,不適合當成穩定功能寫進 SLA。2025 年 7 月的更新則提到 Blackwell 支援。
多模型編排是它最強的地方,也是它最容易被誤用的地方
同時服務 embedding 與 reranker 聽起來很省事,但這代表兩個模型的權重會同時佔用同一張卡的記憶體,而且它們的請求會互相競爭同一個推論資源。README 只說 Infinity orchestrates them,沒有說明排程策略是輪詢、優先權佇列,還是單純的共享佇列。
如果你的 reranker 是 7B 等級的模型(README 的社群清單裡確實出現過 gte-Qwen2-7B-instruct 這類大型模型),把它和一個 embedding 模型塞進同一個行程,VRAM 規劃會比分成兩個服務更難估算。反過來說,如果你的兩個模型都很小,合併服務能省下一次模型載入的啟動時間與一份常駐的 Python 記憶體開銷。
這是取捨,不是功能好壞。判斷依據應該是你有沒有能力在單一行程內控制兩個模型的並行請求數;如果沒有,拆成兩個 Infinity 行程可能比用它的多模型功能更可控。
跟 text-embeddings-inference 的差別在模型覆蓋面與後端自由度
HuggingFace 自家的 text-embeddings-inference(TEI)是最直接的對照組。兩者都提供 REST 介面、都支援 HuggingFace 上的 embedding 模型、都處理 batching。差別在路線:TEI 以 Rust 撰寫,走固定的推論路徑,部署產物相對單純;Infinity 是 Python,把 PyTorch、optimum、CTranslate2 三條後端都包進來,換來的是後端與加速器的組合彈性,代價是依賴樹更大、映像更重。
README 沒有直接比較兩者,但從它強調「deploy any model from HuggingFace」以及同時列出 clip、clap、colpali 這些多模態模型來看,Infinity 想覆蓋的範圍比單純的文字 embedding 更廣。如果你只需要一個 BERT 類 embedding 模型,TEI 的部署複雜度通常更低;如果你需要同一個服務同時處理文字與圖像向量,或需要在 ONNX 與 CTranslate2 之間切換,Infinity 的後端抽象才有價值。
另一個實務差異是 API 形狀。Infinity 明講對齊 OpenAI 的 embeddings 規格,如果你現有的程式碼本來就打 OpenAI 的 /v1/embeddings,換端點時改動最小。
0.0.x 版本節奏與 MIT 授權的實際含義
版本號停在 0.0.77,前一個版本是 0.0.76,兩者相隔約五個月,再往前 0.0.75 又隔了約兩個月。這種節奏對自架服務來說是可以接受的,但 0.0.x 這個前綴本身就是專案對穩定性的表態:次要版本之間不保證相容。如果你的部署腳本依賴特定的 CLI 參數或環境變數名稱,鎖定版本號是必要的,不要用浮動的 latest。
授權是 MIT,README 與 repository metadata 一致。這表示你可以自由使用、修改、再散布,包含商業用途,義務主要是保留著作權與授權聲明。這不是法律意見,實際條款請看 repository 裡的 LICENSE 檔案,涉及專利或商標的情境要找律師。
維護成本上,README 沒有承諾任何支援週期或棄用政策。從更新紀錄看,專案在 2023 年 10 月首次發布,之後持續有功能推進,最近的 repository 活動時間是 2026 年 3 月。這說明它還在動,但也意味著你升級時要自己讀 release notes 判斷有沒有破壞性變更。
導入前的判斷順序
先確認模型。README 列出的支援類別是 text-embeddings、reranking、clip、clap、colpali,你的模型要落在這幾類裡,而且要在對應後端上跑得起來。這一步沒過,後面的調校都是白費。
再確認硬體與後端組合。CUDA、ROCM、CPU、AWS INF2、Apple MPS 這五類加速器,配上 PyTorch、optimum、CTranslate2 三種後端,不是每一格都有對應的 Docker 映像。README 提到 2024 年 11 月新增了 AMD、CPU、ONNX 的 Docker 映像,這暗示映像確實是分開出的,你要挑對那一個。
最後確認認證與資源隔離。README 只揭露了 --api-key 這一個參數,沒有提到速率限制、配額或多租戶隔離。如果你的端點需要對外開放,這些缺口要由前面的反向代理或 API gateway 補上。
這三項確認完,再決定要不要把 infinity_emb v2 寫進部署流程。反過來說,如果你的情境是單一模型、單一使用者、偶爾跑一次,直接 pip install transformers 然後寫個迴圈,比架一整個服務引擎誠實得多。
編輯結論
如果你的團隊已經在用 HuggingFace 上的 embedding 或 reranker 模型,而且需要一個自架的 OpenAI 相容端點,Infinity 值得放進候選清單;如果你只需要單一模型、單一請求路徑,直接用 transformers 寫幾十行 FastAPI 反而更好除錯。導入前先確認三件事:你的模型是否在 README 提到的支援範圍內(text-embeddings、reranking、clip、clap、colpali),你的加速器屬於 CUDA、ROCM、CPU、AWS INF2 還是 Apple MPS 哪一種,以及 0.0.x 版本節奏下你要不要鎖定具體版本號。這三項確認完,再決定要不要把 v2 CLI 寫進部署腳本。
社群筆記