fugashi の huggingface tokenizer wrapper経由での利用

#1
by nassie256 - opened

興味深いモデルの公開をありがとうございます。早速試させて頂いております。

さて、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]

Sign up or log in to comment