Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Loading tokenizer.model with Rust API #1518

Open
EricLBuehler opened this issue Apr 28, 2024 · 10 comments
Open

Loading tokenizer.model with Rust API #1518

EricLBuehler opened this issue Apr 28, 2024 · 10 comments

Comments

@EricLBuehler
Copy link

Hello all,

Thank you for your excellent work here. I am trying to load a tokenizer.model file in my Rust application. However, it seems that the Tokenizer::from_file function only support loading from a tokenizer.json file. This causes problems as using a small script to save the tokenizer.json is error-prone and hard to discover for users. Is there a way to load a tokenizer.model file?

@ArthurZucker
Copy link
Collaborator

You cannot load a tokenizer.model, you need to write a converter.
This is because it does not come from the tokenizers library but from either tiktoken or sentencepiece and there is no secret recipe. We need to adapt to the content of the file, but this is not super straight forward.

https://github.com/huggingface/transformers/blob/main/src/transformers/convert_slow_tokenizer.py#L544 is the simplest way to understand the process!

@EricLBuehler
Copy link
Author

EricLBuehler commented Apr 30, 2024

Ok, I understand. Do you know of a way or a library to do this in Rust without reaching for the Python transformers converter?

@ArthurZucker
Copy link
Collaborator

A library no, but we should be able to come up with a small rust code to do this 😉

@EricLBuehler
Copy link
Author

@ArthurZucker are there any specifications or example loaders which I can look at to implement this?

@chenwanqq
Copy link

I also have the same question, for llava reasons😉

@ArthurZucker
Copy link
Collaborator

Yes! Actually the best way to do this is to use the converters from transformers see here: https://github.com/huggingface/transformers/blob/2965b204593df9d5652313386ec280ffbfd1753b/src/transformers/convert_slow_tokenizer.py#L1340 .

In rust we would need to read and parse the .model file with a sentencepiece loader.

@EricLBuehler
Copy link
Author

Ok. Could I use this crate?

One other question: I am implementing GGUF to HF tokenizers conversion in mistral.rs, and have had success with the unigram model. I am adding the gpt2 = bpe model, but I was wondering what components of the Tokenizer are required such as the normalizer, post processor, etc., and also what decoder to use?

This is what I currently do: https://github.com/EricLBuehler/mistral.rs/blob/d66e5aff1e7faf208469c5bef3c70d45ffda5401/mistralrs-core/src/pipeline/gguf_tokenizer.rs#L116-L142, I would appreciate it if you could take a quick look and see if there is anything obviously wrong!

@vody-am
Copy link

vody-am commented Jun 8, 2024

oh I also have an interest in reading sentence piece tokenizers as well, in order to invoke the SigLIP text transformer in Rust!

EDIT: using the library mentioned by Eric above, I was able to load up https://huggingface.co/google/siglip-so400m-patch14-384/blob/main/spiece.model and it seemingly tokenized my input!

@ArthurZucker
Copy link
Collaborator

@EricLBuehler we actually shipped this in transformers, but sure I can have a look.
Most of the tokenizers that are supported in GGUF format should use Metaspace per-tokenizer and decoder, BPE or unigram model, and either not normalizer or a precompile charset map.
All the requirement are in the [convers_slow](https://github.com/huggingface/transformers/blob/8685b3c5d2dd2550527773d2a02499495a759e31/src/transformers/convert_slow_tokenizer.py#L56) in transformers.

I'll think about potentially automatically convert sentencepiece.model to rust, but the big problem is that I don't want to have to support sentencepiece + tiktoken, so might just be example gists / snippets of how to do this!

@EricLBuehler
Copy link
Author

Thank you, @ArthurZucker for the link! I was actually able to get the GPT2 conversion to work now!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants