dnakov commited on
Commit
3a3363e
·
verified ·
1 Parent(s): 668b22c

Upload folder using huggingface_hub

Browse files
README.md ADDED
@@ -0,0 +1,42 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ language:
3
+ - en
4
+ license: mit
5
+ tags:
6
+ - text-generation
7
+ library_name: transformers
8
+ ---
9
+
10
+ # Nanochat
11
+
12
+ Nanochat is a small language model from Andrej Karpathy, converted to HuggingFace format.
13
+
14
+ ## Model Details
15
+
16
+ - **Architecture**: GPT-style transformer with RoPE, QK normalization, ReLU², and logits softcap
17
+ - **Parameters**: ~393M
18
+ - **Hidden Size**: 1280
19
+ - **Layers**: 20
20
+ - **Attention Heads**: 10
21
+ - **Vocabulary**: 65536 tokens
22
+ - **Context Length**: 2048 tokens
23
+
24
+ ## Usage
25
+
26
+ This model uses a custom tokenizer. You must use `trust_remote_code=True` when loading.
27
+
28
+ ```python
29
+ from transformers import AutoModelForCausalLM, AutoTokenizer
30
+
31
+ model = AutoModelForCausalLM.from_pretrained("<model-path>", trust_remote_code=True)
32
+ tokenizer = AutoTokenizer.from_pretrained("<model-path>", trust_remote_code=True)
33
+
34
+ prompt = "Once upon a time"
35
+ inputs = tokenizer(prompt, return_tensors="pt")
36
+ outputs = model.generate(**inputs, max_new_tokens=50)
37
+ print(tokenizer.decode(outputs[0]))
38
+ ```
39
+
40
+ ## Citation
41
+
42
+ Original model by Andrej Karpathy: https://github.com/karpathy/nanochat
config.json ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "NanoChatForCausalLM"
4
+ ],
5
+ "model_type": "nanochat",
6
+ "hidden_size": 1280,
7
+ "num_hidden_layers": 20,
8
+ "num_attention_heads": 10,
9
+ "num_key_value_heads": 10,
10
+ "vocab_size": 65536,
11
+ "max_position_embeddings": 2048,
12
+ "intermediate_size": 5120,
13
+ "rope_theta": 10000.0,
14
+ "torch_dtype": "bfloat16",
15
+ "transformers_version": "4.0.0"
16
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:8799c63247e4a94c2b13c5550bc3615c77a395574a23157f627f02e171e8f80d
3
+ size 2076193816
nanochat_tokenizer.py ADDED
@@ -0,0 +1,96 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Copyright © 2023-2024 Apple Inc.
2
+
3
+ import pickle
4
+ from pathlib import Path
5
+ from typing import List, Optional, Union
6
+
7
+ from transformers import PreTrainedTokenizer
8
+
9
+
10
+ class NanochatTokenizer(PreTrainedTokenizer):
11
+ """HuggingFace-compatible wrapper for nanochat's tiktoken tokenizer."""
12
+
13
+ def __init__(self, tokenizer_path: Optional[Union[str, Path]] = None, **kwargs):
14
+ # Set default special tokens if not provided
15
+ kwargs.setdefault("unk_token", "<|endoftext|>")
16
+ kwargs.setdefault("bos_token", "<|endoftext|>")
17
+ kwargs.setdefault("eos_token", "<|endoftext|>")
18
+
19
+ # Initialize parent first
20
+ super().__init__(**kwargs)
21
+
22
+ # Load the tiktoken tokenizer
23
+ if tokenizer_path is None:
24
+ # When loaded via from_pretrained, use name_or_path
25
+ tokenizer_path = getattr(self, "name_or_path", ".")
26
+
27
+ tokenizer_path = Path(tokenizer_path)
28
+ tokenizer_file = tokenizer_path / "tokenizer.pkl"
29
+
30
+ if not tokenizer_file.exists():
31
+ # Try current directory
32
+ tokenizer_file = Path("tokenizer.pkl")
33
+
34
+ with open(tokenizer_file, "rb") as f:
35
+ self._tokenizer = pickle.load(f)
36
+
37
+ # Try to get special tokens
38
+ try:
39
+ self._eos_token_id = self._tokenizer.encode("<|endoftext|>")[0]
40
+ except (KeyError, IndexError):
41
+ self._eos_token_id = 0
42
+
43
+ @property
44
+ def vocab_size(self) -> int:
45
+ return self._tokenizer.n_vocab
46
+
47
+ def get_vocab(self):
48
+ # Return a minimal vocab dict - tiktoken doesn't expose full vocab
49
+ return {}
50
+
51
+ def _tokenize(self, text: str, **kwargs) -> List[str]:
52
+ # Not used by PreTrainedTokenizer's main interface
53
+ tokens = self._tokenizer.encode(text, allowed_special="all")
54
+ return [str(t) for t in tokens]
55
+
56
+ def _convert_token_to_id(self, token: str) -> int:
57
+ return int(token)
58
+
59
+ def _convert_id_to_token(self, index: int) -> str:
60
+ return str(index)
61
+
62
+ def convert_tokens_to_string(self, tokens: List[str]) -> str:
63
+ ids = [int(t) for t in tokens]
64
+ return self._tokenizer.decode(ids)
65
+
66
+ def encode(
67
+ self,
68
+ text: str,
69
+ add_special_tokens: bool = True,
70
+ **kwargs,
71
+ ) -> List[int]:
72
+ """Encode text to token IDs."""
73
+ return self._tokenizer.encode(text, allowed_special="all")
74
+
75
+ def decode(
76
+ self,
77
+ token_ids: List[int],
78
+ skip_special_tokens: bool = False,
79
+ **kwargs,
80
+ ) -> str:
81
+ """Decode token IDs to text."""
82
+ return self._tokenizer.decode(token_ids)
83
+
84
+ def save_vocabulary(self, save_directory: str, filename_prefix: Optional[str] = None) -> tuple:
85
+ """Save the tokenizer vocabulary."""
86
+ save_directory = Path(save_directory)
87
+ save_directory.mkdir(parents=True, exist_ok=True)
88
+
89
+ # Copy the tokenizer.pkl file
90
+ import shutil
91
+ src = self.name_or_path if hasattr(self, "name_or_path") else "."
92
+ src_file = Path(src) / "tokenizer.pkl"
93
+ if src_file.exists():
94
+ shutil.copy(src_file, save_directory / "tokenizer.pkl")
95
+
96
+ return (str(save_directory / "tokenizer.pkl"),)
special_tokens_map.json ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
 
1
+ {
2
+ "bos_token": "<|bos|>",
3
+ "eos_token": "<|bos|>",
4
+ "unk_token": "<|bos|>"
5
+ }
tokenizer.pkl ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4c060565a46fe83b49d99005acba796f2a630daa7970eb49f7513b89f9fb40e0
3
+ size 846208
tokenizer_config.json ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "tokenizer_class": "NanochatTokenizer",
3
+ "auto_map": {
4
+ "AutoTokenizer": [
5
+ "nanochat_tokenizer.NanochatTokenizer",
6
+ null
7
+ ]
8
+ },
9
+ "clean_up_tokenization_spaces": false,
10
+ "bos_token": "<|bos|>",
11
+ "eos_token": "<|bos|>",
12
+ "unk_token": "<|bos|>"
13
+ }