Views
No views yet
| File | Quant | Size |
|---|---|---|
harrier-270m-f16.gguf | F16 (lossless) | ~550 MB |
harrier-270m-q8_0.gguf | Q8_0 | ~298 MB |
llama-server --embeddings -m harrier-270m-q8_0.gguf --port 8080/embedding endpoint as with any llama.cpp embedding model.convert_hf_to_gguf.py from llama.cpp could not convert this model out of the box. If you hit the same errors converting similar Gemma3-based embedding models, here's how they were resolved.NotImplementedError: BPE pre-tokenizer was not recognizedchkhsh: fc65e8f033752f900de442edbaa0e385712ff5f6f1d2fd8d958fa6ec59daa92fget_vocab_base_pre(). Fix: add an entry for it (in convert_hf_to_gguf.py / conversion/base.py, depending on your llama.cpp version):1if chkhsh == "fc65e8f033752f900de442edbaa0e385712ff5f6f1d2fd8d958fa6ec59daa92f":
2 # ref: microsoft/harrier-oss-v1 (gemma3-based BPE tokenizer)
3 res = "llama-bpe"AssertionError on assert max(tokenizer.vocab.values()) < vocab_sizetoken_embd.weight. Do not raise vocab_size in config.json to work around this — doing so desyncs the GGUF metadata (n_vocab) from the actual embedding matrix row count, and will fail to load with:check_tensor_dims: tensor 'token_embd.weight' has wrong shape; expected 640, 262145, got 640, 262144, 1, 1vocab_size. Patch for get_vocab_base():1def get_vocab_base(self) -> tuple[list[str], list[int], str]:
2 tokens: list[str] = []
3 toktypes: list[int] = []
4
5 from transformers import AutoTokenizer
6 tokenizer = AutoTokenizer.from_pretrained(self.dir_model)
7 vocab_size = self.hparams.get("vocab_size", len(tokenizer.vocab))
8
9 extra_ids = {tid: tok for tok, tid in tokenizer.vocab.items() if tid >= vocab_size}
10 if extra_ids:
11 logger.warning(
12 f"tokenizer has {len(extra_ids)} id(s) >= vocab_size ({vocab_size}) with no embedding row, "
13 f"dropping them: {extra_ids}"
14 )
15
16 tokpre = self.get_vocab_base_pre(tokenizer)
17
18 reverse_vocab = {id_: encoded_tok for encoded_tok, id_ in tokenizer.vocab.items() if id_ < vocab_size}
19 added_vocab = tokenizer.get_added_vocab()
20 added_tokens_decoder = tokenizer.added_tokens_decoder
21
22 for i in range(vocab_size):
23 if i not in reverse_vocab:
24 tokens.append(f"[PAD{i}]")
25 toktypes.append(gguf.TokenType.UNUSED)
26 else:
27 token: str = reverse_vocab[i]
28 if token in added_vocab:
29 if not added_tokens_decoder[i].normalized:
30 previous_token = token
31 token = tokenizer.decode(tokenizer.encode(token, add_special_tokens=False))
32 if previous_token != token:
33 logger.info(f"{repr(previous_token)} is encoded and decoded back to {repr(token)} using AutoTokenizer")
34 if added_tokens_decoder[i].special or self.does_token_look_special(token):
35 toktypes.append(gguf.TokenType.CONTROL)
36 else:
37 token = token.replace(b"\xe2\x96\x81".decode("utf-8"), " ")
38 toktypes.append(gguf.TokenType.USER_DEFINED)
39 else:
40 toktypes.append(gguf.TokenType.NORMAL)
41 tokens.append(token)
42
43 return tokens, toktypes, tokpre