fugashi の huggingface tokenizer wrapper経由での利用
興味深いモデルの公開をありがとうございます。早速試させて頂いております。
さて、SentenceTransformerをREST APIとしてサーブするInfinityというOSSがありまして、Embeddingモデルなどを別のサーバに分離して提供するにはこのようなソフトを利用するのが便利なのですが、それのCLIモードでjapanese-reranker-cross-encoder-large-v1を動かそうとしたところ、エラーが発生しました。
これをInfinityのIssueで確認したところ、fugashiがhuggingface tokenizer APIに準拠していないことが原因と指摘されました。
https://github.com/michaelfeil/infinity/issues/192
そこで、fugashiのIssueで確認したところ、「wrapper を通して使う必要があります。」との回答がありました。
https://github.com/polm/fugashi/issues/90
これはjapanese-reranker-cross-encoderのモデル側で対応できるものなのでしょうか? それとも、Infinity側での対応が必要になるものでしょうか?
こんにちは。お試しありがとうございます。
未確認ですが、infinity は tokenizers.json
をロードして動く tokenizer を期待しているような挙動な気がするので、それらで動くモデルを使う必要がありそうです。
この reranker シリーズでは base, large で使っている pretrain model の tohoku-nlp/bert-base-japanese-* の tokenizer は、そのような形式ではないです。
xsmall, small, japanese-bge-reranker-v2-m3-v1 は、そのような形式(tokenizers.json を利用する)なので xsmall, small, japanese-bge-reranker-v2-m3-v1 を使うと動く可能性があるので、お試しください。
試してみたところ、japanese-bge-reranker-v2-m3-v1 は問題なく動作しました。$ infinity_emb --model-name-or-path hotchpotch/japanese-bge-reranker-v2-m3-v1 --device cuda
xsmall, small については以下のエラーが発生しました。一応、ご報告まで。$ infinity_emb --model-name-or-path hotchpotch/japanese-reranker-cross-encoder-xsmall-v1 --device cuda
ERROR: Traceback (most recent call last):
File "/home/ubuntu/.pyenv/versions/3.11.9/envs/emb/lib/python3.11/site-packages/starlette/routing.py", line 677, in lifespan
async with self.lifespan_context(app) as maybe_state:
File "/home/ubuntu/.pyenv/versions/3.11.9/lib/python3.11/contextlib.py", line 210, in __aenter__
return await anext(self.gen)
^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.pyenv/versions/3.11.9/envs/emb/lib/python3.11/site-packages/infinity_emb/infinity_server.py", line 46, in lifespan
app.model = AsyncEmbeddingEngine.from_args(engine_args) # type: ignore
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.pyenv/versions/3.11.9/envs/emb/lib/python3.11/site-packages/infinity_emb/engine.py", line 49, in from_args
engine = cls(**asdict(engine_args), _show_deprecation_warning=False)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.pyenv/versions/3.11.9/envs/emb/lib/python3.11/site-packages/infinity_emb/engine.py", line 40, in __init__
self._model, self._min_inference_t, self._max_inference_t = select_model(
^^^^^^^^^^^^^
File "/home/ubuntu/.pyenv/versions/3.11.9/envs/emb/lib/python3.11/site-packages/infinity_emb/inference/select_model.py", line 79, in select_model
loaded_engine.warmup(batch_size=engine_args.batch_size, n_tokens=512)
File "/home/ubuntu/.pyenv/versions/3.11.9/envs/emb/lib/python3.11/site-packages/infinity_emb/transformer/abstract.py", line 97, in warmup
return run_warmup(self, inp)
^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.pyenv/versions/3.11.9/envs/emb/lib/python3.11/site-packages/infinity_emb/transformer/abstract.py", line 105, in run_warmup
embed = model.encode_core(feat)
^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.pyenv/versions/3.11.9/envs/emb/lib/python3.11/site-packages/infinity_emb/transformer/crossencoder/torch.py", line 85, in encode_core
out_features = self.model(**features, return_dict=True)["logits"]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.pyenv/versions/3.11.9/envs/emb/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1511, in _wrapped_call_impl
return self._call_impl(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.pyenv/versions/3.11.9/envs/emb/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1520, in _call_impl
return forward_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.pyenv/versions/3.11.9/envs/emb/lib/python3.11/site-packages/transformers/models/xlm_roberta/modeling_xlm_roberta.py", line 1208, in forward
outputs = self.roberta(
^^^^^^^^^^^^^
File "/home/ubuntu/.pyenv/versions/3.11.9/envs/emb/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1511, in _wrapped_call_impl
return self._call_impl(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.pyenv/versions/3.11.9/envs/emb/lib/python3.11/site-packages/torch/nn/modules/module.py", line 1520, in _call_impl
return forward_call(*args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/ubuntu/.pyenv/versions/3.11.9/envs/emb/lib/python3.11/site-packages/transformers/models/xlm_roberta/modeling_xlm_roberta.py", line 803, in forward
buffered_token_type_ids_expanded = buffered_token_type_ids.expand(batch_size, seq_length)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
RuntimeError: The expanded size of the tensor (1028) must match the existing size (514) at non-singleton dimension 1. Target sizes: [32, 1028]. Tensor sizes: [1, 514]