🔖

llama.cpp GGUF での tokenizer 情報のメモ

2024/10/11に公開

GGUF で tokenizer の情報はどう保存されるんや...

GGUF

https://github.com/ggerganov/ggml/blob/master/docs/gguf.md

最近流行り?の safetensors とだいたい同じ感じ.

GGUF 自体は key-value でデータを保存する. tokenizer 固有のフォーマットはないので, tokenizer の情報(BPE とか, vocab とか...)は,
適当に string の配列などにしてシリアライズ, ローダー側で復元, という形になっている

たとえば llama.cpp (の llama.cpp ファイル)では以下のような感じになっている.

            // read bpe merges and populate bpe ranks
              const int merges_keyidx = gguf_find_key(ctx, kv(LLM_KV_TOKENIZER_MERGES).c_str());
              if (merges_keyidx == -1) {
                  throw std::runtime_error("cannot find tokenizer merges in model file\n");
              }

              const int n_merges = gguf_get_arr_n(ctx, merges_keyidx);
              for (int i = 0; i < n_merges; i++) {
                  const std::string word = gguf_get_arr_str(ctx, merges_keyidx, i);
                  ...

キーの名前はある程度 predefiend されてはいる.

preview

https://huggingface.co/docs/hub/en/gguf

huggingface にアップされているのは preview でキー一覧を見ることができる.

standalone の GUI はないっぽい模様.

https://github.com/ggerganov/llama.cpp/issues/6715

とりあえずは gguf-dump.py で確認でしょうか.

tokenizer.json

huggingface LLM model にある merges.txt のメモ
https://zenn.dev/syoyo/articles/3ed1f1ece7dfe4

FastTokenizer で使われる tokenizer.json はその JSON 文字列自体を GGUF にシリアライズ

https://github.com/ggerganov/ggml/blob/master/docs/gguf.md#hugging-face

ただ, 2024/10 時点では, llama.cpp にはこのキー(tokenizer.json)を使うコードは無い.

将来的には llama.cpp(GGUF)でも tokenizer.json を使うのが推奨になる気もする... カモ.

Discussion