みなさんこんにちは、
昨日、model2vec + tokenlearn を使って取り組んでいた静的埋め込みモデルをいくつか共有しました。それ以降、改善を重ねていて、かなり面白いものに行き着きました。125MB から 700KB までの、model2vec および sentence-transformers とすべてドロップイン互換な、モデルのフルファミリーです。
ラインナップ:
| Model | Avg (25 tasks MTEB) | Size | Speed (CPU) |
|---|---|---|---|
| potion-mxbai-2m-512d | 72.13 | ~125MB | ~16K sent/s |
| potion-mxbai-256d-v2 | 70.98 | 7.5MB | ~15K sent/s |
| potion-mxbai-128d-v2 | 69.83 | 3.9MB | ~18K sent/s |
| potion-mxbai-micro | 68.12 | 0.7MB | ~18K sent/s |
25 タスクで評価(10 STS、12 Classification、3 PairClassification)。英語サブセットのみ。注: sent/s は私の i7-9750H での 1 秒あたりの文数です
これらはトランスフォーマーではありません!純粋なルックアップテーブルです。推論時にニューラルネットワークのフォワードパスはありません。トークナイズして、埋め込みをルックアップし、平均プーリングします。全体は numpy で動きます。
参考までに、all-MiniLM-L6-v2 は同じベンチマークで 74.65 の平均スコア、~80MB、~200 sent/sec です。つまり 256D モデルは MiniLM の品質の約 95% を、10 倍小さく、150 倍速く実現しています。
700KB のマイクロモデルが特に楽しみです。ボキャブラリ量子化(29K トークン埋め込みを 2K のセントロイドへクラスタリング)を使っており、フルの MTEB 英語スイートで 68.12 を出します。
でもなぜ…?
いい質問です。正直に言うと、これはややニッチな用途ではありますが:
エッジ/組み込み/WASM、ブラウザ拡張や ESP32 上で 400MB の ONNX モデルを読み込むのは大変です。ですが、これは numpy が動く場所ならどこでもそのまま使えます。また、独自ライブラリを作る必要もおそらく大したことではないでしょう。
数百万ドキュメントのバッチ処理、コーパス全体を埋め込むとき、GPU なしで CPU で 15K sent/sec なら、単一コアで夜通しに 50M ドキュメントを処理できます。GPU のスケジューリングも、バッチ処理の悩みもありません。
コスト、これらは文字通り何にでも動きます。あらゆる e-waste を埋め込みサーバーとして再利用できます!(こちらで近々共有する予定の別プロジェクトとして、これらのモデルの 1 つを使って同様のことを行うためのカスタム FPGA も用意しています!)
起動時間、トランスフォーマーモデルは読み込みに数秒かかります。これらはミリ秒で読み込みます。CLI ツールやサーバレス関数で単発の埋め込みをやるなら最高です。
プロトタイピング、インフラのことを考えずに、コード 3 行でセマンティック検索を動かしたいこともあります。model2vec をインストールしてモデルを読み込むだけで完了です。私は個人的に、まさにその理由で大きめのモデル側でも多くの用途を見つけました。
使い方:
```python from model2vec import StaticModel
サイズを選ぶ
model = StaticModel.from_pretrained("blobbybob/potion-mxbai-256d-v2")
または小さい方
model = StaticModel.from_pretrained("blobbybob/potion-mxbai-micro")
embeddings = model.encode(["your text here"]) ```
すべてのモデルは HuggingFace の blobbybob 配下にあります。MinishLab の model2vec と tokenlearn の上に構築されています。これらをまだ見ていないなら、ぜひチェックしてみてください。どちらも素晴らしいプロジェクトです。
質問には喜んで答えます。バックログにはまだいくつかアイデアがありますが、現時点がどんな感じかを共有したかったんです。
[link] [comments]




