autoprogrammer commited on
Commit
52bb403
·
verified ·
1 Parent(s): 79e364f

Upload folder using huggingface_hub

Browse files
README.md ADDED
@@ -0,0 +1,13 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # DenseBackwardOLMoE
2
+
3
+ 自定义的OLMoE模型,使用DenseBackwardOlmoeSparseMoeBlock替换原版的MoE模块,实现dense backward功能。
4
+
5
+ ## 用法
6
+
7
+ ```python
8
+ from transformers import AutoConfig, AutoModelForCausalLM
9
+
10
+ # 使用trust_remote_code=True加载模型
11
+ config = AutoConfig.from_pretrained("autoprogrammer/olmoe_densebackward", trust_remote_code=True)
12
+ model = AutoModelForCausalLM.from_pretrained("autoprogrammer/olmoe_densebackward", config=config, trust_remote_code=True)
13
+ ```
__init__.py ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
 
1
+ # 导出自定义配置和模型类
2
+ from .configuration_custom import DenseBackwardOLMoEConfig
3
+ from .modeling_custom import DenseBackwardOLMoEForCausalLM, DenseBackwardOlmoeSparseMoeBlock
4
+
5
+ __all__ = [
6
+ "DenseBackwardOLMoEConfig",
7
+ "DenseBackwardOLMoEForCausalLM",
8
+ "DenseBackwardOlmoeSparseMoeBlock"
9
+ ]
config.json ADDED
@@ -0,0 +1,33 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "_name_or_path": "allenai/OLMoE-1B-7B-0125",
3
+ "architectures": [
4
+ "DenseBackwardOLMoEForCausalLM"
5
+ ],
6
+ "attention_bias": false,
7
+ "attention_dropout": 0.0,
8
+ "clip_qkv": null,
9
+ "eos_token_id": 50279,
10
+ "hidden_act": "silu",
11
+ "hidden_size": 2048,
12
+ "initializer_range": 0.02,
13
+ "intermediate_size": 1024,
14
+ "max_position_embeddings": 4096,
15
+ "model_type": "olmoe",
16
+ "norm_topk_prob": false,
17
+ "num_attention_heads": 16,
18
+ "num_experts": 64,
19
+ "num_experts_per_tok": 8,
20
+ "num_hidden_layers": 16,
21
+ "num_key_value_heads": 16,
22
+ "output_router_logits": false,
23
+ "pad_token_id": 1,
24
+ "rms_norm_eps": 1e-05,
25
+ "rope_scaling": null,
26
+ "rope_theta": 10000.0,
27
+ "router_aux_loss_coef": 0.01,
28
+ "tie_word_embeddings": false,
29
+ "torch_dtype": "float32",
30
+ "transformers_version": "4.45.2",
31
+ "use_cache": true,
32
+ "vocab_size": 50304
33
+ }
configuration_custom.py ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # my_custom_olmoe/configuration_custom.py
2
+
3
+ # 注意:根据你的 transformers 版本,导入官方 OLMoE 配置的路径可能需要调整
4
+ from transformers.models.olmoe.configuration_olmoe import OlmoeConfig
5
+
6
+ class DenseBackwardOLMoEConfig(OlmoeConfig):
7
+ model_type = "DenseBackward_olmoe" # 这里覆盖 model_type 字段,便于后续识别
8
+
9
+ # 添加auto_map用于支持AutoClass
10
+ auto_map = {
11
+ "AutoConfig": "configuration_custom.DenseBackwardOLMoEConfig",
12
+ "AutoModelForCausalLM": "modeling_custom.DenseBackwardOLMoEForCausalLM"
13
+ }
14
+
15
+ def __init__(self, model_marker="DenseBackward_olmoe_marker", **kwargs):
16
+ super().__init__(**kwargs)
17
+ self.model_marker = model_marker
18
+ self.intermediate_size= 1024
19
+ #test
20
+ def main():
21
+ config = DenseBackwardOLMoEConfig(model_marker="DenseBackward_olmoe_marker")
22
+ print(config)
23
+
24
+ if __name__ == "__main__":
25
+ main()
generation_config.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {
2
+ "_from_model_config": true,
3
+ "eos_token_id": 50279,
4
+ "pad_token_id": 1,
5
+ "transformers_version": "4.45.2"
6
+ }
model-00001-of-00006.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:df5a700fa91fd94e9d1a7ae523c5ae055f5879778a02ea19758edd37089da1ca
3
+ size 4993992240
model-00002-of-00006.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:5f299f21e6de71f5334e937fd51a083bab8cffe55682488219e4082d9558fdba
3
+ size 4992966080
model-00003-of-00006.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:4491eb552fd917a6777260f75c88e714f3174fbba7dd69d44b97c4124ddcd56b
3
+ size 4992966080
model-00004-of-00006.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:7aeea413752cd17a8e7c343aa436594a8158d279817e4993aa5df4b7c7cfdf22
3
+ size 4992966416
model-00005-of-00006.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:18c7f749af753359e10c33a9c5deec688b7155f7c01052937806cd351c52cc38
3
+ size 4992966680
model-00006-of-00006.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:299009ba118f5e918de33573a316ad3d3b9236651986fb1a14dc894f55269e67
3
+ size 2711184968
model.safetensors.index.json ADDED
The diff for this file is too large to render. See raw diff
 
modeling_custom.py ADDED
@@ -0,0 +1,206 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # my_custom_olmoe/modeling_custom.py
2
+
3
+ import torch
4
+ import torch.nn as nn
5
+ import torch.nn.functional as F
6
+
7
+ # 导入官方实现(注意根据你的 transformers 版本调整导入路径)
8
+ from transformers.models.olmoe.modeling_olmoe import OlmoeForCausalLM, OlmoeSparseMoeBlock, OlmoeMLP
9
+ from configuration_custom import DenseBackwardOLMoEConfig
10
+
11
+
12
+ class DenseBackwardOlmoeSparseMoeBlock(OlmoeSparseMoeBlock):
13
+ """
14
+ 继承自官方 OlmoeSparseMoeBlock,实现 dense backward 功能:
15
+ 前向输出依旧保持与官方相同(即稀疏计算结果),
16
+ 但在反向传播时,通过直通梯度让 dense 计算的梯度传递回来,
17
+ dense 输出通过对每个专家在所有 token 上进行计算,并利用全 routing 权重加权获得。
18
+
19
+ 输入:
20
+ hidden_states: Tensor, shape (batch_size, sequence_length, hidden_dim)
21
+ 输出:
22
+ final_output: Tensor, shape (batch_size, sequence_length, hidden_dim)
23
+ router_logits: Tensor, shape (batch_size * sequence_length, num_experts)
24
+ """
25
+ def forward(self, hidden_states: torch.Tensor):
26
+ """
27
+ 输入:
28
+ hidden_states: Tensor, shape (batch_size, sequence_length, hidden_dim)
29
+ 输出:
30
+ final_output: Tensor, shape (batch_size, sequence_length, hidden_dim)
31
+ router_logits: Tensor, shape (batch_size * sequence_length, num_experts)
32
+ 实现思路:
33
+ 1. 将输入展平为 (B*seq_len, hidden_dim),通过 self.gate 得到 router_logits,
34
+ 并计算全专家的 routing 权重(softmax 后)。
35
+ 2. 对 routing 权重取 top-k,得到 routing_weights_topk 与 selected_experts;
36
+ 如配置要求,归一化 top-k 概率。
37
+ 3. 稀疏计算部分:仅计算每个 token 对于 top-k 专家的输出,
38
+ 并累加得到 sparse_output(保留原版计算流程,同时记录激活专家的实际输出)。
39
+ 4. Dense 估计部分:先计算所有专家对所有 token 的输出(all_expert_outputs),
40
+ 再逐 token 调用 estimate_dense_output 得到 dense 输出(dense_estimated)。
41
+ 5. 使用直通梯度技巧:前向输出用 sparse_output,但梯度来源于 dense_estimated。
42
+ 6. 最后 reshape 为 (batch_size, sequence_length, hidden_dim) 并返回 final_output 及 router_logits.
43
+ """
44
+ #determine the shape of hidden_states
45
+ batch_size, seq_length, hidden_dim = hidden_states.shape
46
+ flat_hidden = hidden_states.view(-1, hidden_dim) # (B*seq_len, hidden_dim)
47
+
48
+ # 计算路由 logits 和全专家 routing 权重
49
+ router_logits = self.gate(flat_hidden) # (B*seq_len, num_experts)
50
+ routing_weights = F.softmax(router_logits, dim=1, dtype=torch.float) # (B*seq_len, num_experts)
51
+
52
+ # Top-k 选择
53
+ routing_weights_topk, selected_experts = torch.topk(routing_weights, self.top_k, dim=-1)
54
+ if self.norm_topk_prob:
55
+ routing_weights_topk = routing_weights_topk / routing_weights_topk.sum(dim=-1, keepdim=True)
56
+ routing_weights_topk = routing_weights_topk.to(flat_hidden.dtype)
57
+
58
+ # ---------- 稀疏计算部分 ----------
59
+ # 初始化稀疏输出,shape: (B*seq_len, hidden_dim)
60
+ sparse_output = torch.zeros((flat_hidden.size(0), hidden_dim), dtype=flat_hidden.dtype, device=flat_hidden.device)
61
+ # 用于记录每个 token 对激活专家的实际输出
62
+ activated_outputs = [{} for _ in range(flat_hidden.size(0))]
63
+ # one-hot 编码 top-k 专家,shape: (B*seq_len, top_k, num_experts)
64
+ expert_mask = F.one_hot(selected_experts, num_classes=self.num_experts) # (B*seq_len, top_k, num_experts)
65
+ expert_mask = expert_mask.permute(2, 1, 0) # (num_experts, top_k, B*seq_len)
66
+
67
+ for expert_idx in range(self.num_experts):
68
+ expert_layer = self.experts[expert_idx]
69
+ idx, top_x = torch.where(expert_mask[expert_idx])
70
+ if top_x.numel() > 0:
71
+ current_state = flat_hidden[top_x] # (n, hidden_dim)
72
+ current_output = expert_layer(current_state) # (n, hidden_dim)
73
+ weight = routing_weights_topk[top_x, idx].unsqueeze(-1) # (n, 1)
74
+ weighted_output = current_output * weight
75
+ sparse_output.index_add_(0, top_x, weighted_output.to(flat_hidden.dtype))
76
+ # 保存当前 token 对该专家的实际输出
77
+ for pos, token_idx in enumerate(top_x.tolist()):
78
+ activated_outputs[token_idx][expert_idx] = current_output[pos]
79
+ # ---------- 稀疏计算结束 ----------
80
+
81
+ # ---------- Dense估计部分 ----------
82
+ # 计算所有专家对所有 token 的 dense 输出,shape: (B*seq_len, num_experts, hidden_dim)
83
+ all_expert_outputs = torch.stack([expert(flat_hidden) for expert in self.experts], dim=1)
84
+ # 将 selected_experts 转换为 list,每个 token 的激活专家列表
85
+ all_routing = selected_experts.tolist() # 长度为 (B*seq_len)
86
+
87
+ dense_outputs = []
88
+ for i in range(flat_hidden.size(0)):
89
+ dense_est = self.estimate_dense_output(
90
+ token_idx=i,
91
+ activated=all_routing[i], # 当前 token 激活的专家列表,例如 [a, b]
92
+ gate_prob=routing_weights[i], # 当前 token 的完整 routing 权重 (num_experts,)
93
+ activated_outputs=activated_outputs[i], # 当前 token 对激活专家的实际输出
94
+ all_routing=all_routing, # 全 batch 每个 token 的激活专家列表(list of lists)
95
+ all_expert_outputs=all_expert_outputs # (B*seq_len, num_experts, hidden_dim)
96
+ )
97
+ dense_outputs.append(dense_est.unsqueeze(0))
98
+ dense_outputs = torch.cat(dense_outputs, dim=0) # (B*seq_len, hidden_dim)
99
+ # ---------- Dense估计结束 ----------
100
+
101
+ # 使用直通梯度:前向输出用稀疏结果,但反向传播时梯度来源于 dense 估计
102
+ final_flat = sparse_output.detach() + (dense_outputs - dense_outputs.detach())
103
+ final_output = final_flat.view(batch_size, seq_length, hidden_dim)
104
+ return final_output, router_logits
105
+
106
+ def estimate_dense_output(self, token_idx, activated, gate_prob, activated_outputs, all_routing, all_expert_outputs):
107
+ """
108
+ 对于当前 token,根据 mini-batch 中的信息估计 dense 输出。
109
+ 参数:
110
+ token_idx: 当前 token 的索引(标量)
111
+ activated: 当前 token 激活的专家列表,例如 [1, 3]
112
+ gate_prob: 当前 token 的 routing 权重,形状 (num_experts,)
113
+ activated_outputs: dict,当前 token 对激活专家的实际输出,形状 (hidden_dim,)
114
+ all_routing: list,每个 token 的激活专家列表(长度为 N,每个元素为 list)
115
+ all_expert_outputs: Tensor, (N, num_experts, hidden_dim)
116
+ 返回:
117
+ estimated_dense: Tensor, (hidden_dim,)
118
+ """
119
+ num_experts = gate_prob.size(0)
120
+ dense_parts = {}
121
+ # 对于激活的专家,直接使用其实际输出
122
+ for idx in activated:
123
+ dense_parts[idx] = activated_outputs[idx]
124
+ # 对于未激活的专家,使用 mini-batch 中其他 token 的输出估计
125
+ non_activated = [i for i in range(num_experts) if i not in activated]
126
+ for i in non_activated:
127
+ indices = []
128
+ for idx, r_dec in enumerate(all_routing):
129
+ if (i in r_dec) and (len(set(r_dec) & set(activated)) > 0):
130
+ indices.append(idx)
131
+ if indices:
132
+ selected_outputs = all_expert_outputs[indices, i, :] # (n, hidden_dim)
133
+ estimated = selected_outputs.mean(dim=0)
134
+ else:
135
+ estimated = all_expert_outputs[:, i, :].mean(dim=0)
136
+ dense_parts[i] = estimated
137
+ # 按 gate_prob 加权求和各专家输出
138
+ estimated_dense = 0
139
+ for i in range(num_experts):
140
+ estimated_dense += gate_prob[i] * dense_parts[i]
141
+ return estimated_dense
142
+
143
+
144
+ class DenseBackwardOLMoEForCausalLM(OlmoeForCausalLM):
145
+ """
146
+ 自定义的 Olmoe ForCausalLM 模型,使用新的 DenseBackwardOlmoeSparseMoeBlock 替换原版的 MoE 模块,
147
+ 以实现 dense backward 功能。
148
+
149
+ 配置类:DenseBackwardOLMoEConfig
150
+ """
151
+ config_class = DenseBackwardOLMoEConfig
152
+ base_model_prefix = "olmoe"
153
+
154
+ def __init__(self, config):
155
+ # 首先调用父类初始化方法
156
+ super().__init__(config)
157
+
158
+ # 不要尝试重新赋值self,而是从预训练模型加载并更新当前模型
159
+ pretrained_model = OlmoeForCausalLM.from_pretrained("allenai/OLMoE-1B-7B-0125")
160
+
161
+ # 复制预训练模型的状态到当前模型
162
+ self.config = pretrained_model.config
163
+ self.model = pretrained_model.model
164
+ self.vocab_size = pretrained_model.vocab_size
165
+ self.router_aux_loss_coef = pretrained_model.router_aux_loss_coef
166
+ self.num_experts = pretrained_model.num_experts
167
+ self.lm_head = pretrained_model.lm_head
168
+
169
+ # 遍历模型中所有 decoder 层,替换每个 OlmoeSparseMoeBlock 为 DenseBackward 版本
170
+ # 此处假设官方模型在 self.model.layers 中组织 decoder 层,
171
+ # 且每层中 mlp 模块包含属性 sparse_moe_block。
172
+ for layer in self.model.layers:
173
+ if hasattr(layer.mlp, "gate"):
174
+ print("111")
175
+ orig_block = layer.mlp
176
+ # 通过直接复制原版属性创建新的块
177
+ new_block = DenseBackwardOlmoeSparseMoeBlock(config) # 或其他适当参数
178
+ # 然后手动复制需要共享的属性:
179
+ new_block.gate = orig_block.gate
180
+ new_block.experts = orig_block.experts
181
+ new_block.num_experts = orig_block.num_experts
182
+ new_block.top_k = orig_block.top_k
183
+ new_block.norm_topk_prob = orig_block.norm_topk_prob
184
+ layer.mlp = new_block
185
+ print(type(layer.mlp))
186
+ # 在调用post_init()前
187
+ test_param = self.model.layers[0].mlp.experts[0].up_proj.weight.data[0, 0].item()
188
+ print(f"权重示例值(前): {test_param}")
189
+ self.post_init()
190
+ # 在调用post_init()后
191
+ test_param_after = self.model.layers[0].mlp.experts[0].up_proj.weight.data[0, 0].item()
192
+ print(f"权重示例值(后): {test_param_after}")
193
+
194
+ def main():
195
+ config = DenseBackwardOLMoEConfig( # 官方模型参数
196
+ model_marker="DenseBackward_olmoe_marker",
197
+ )
198
+ # 创建自定义模型实例
199
+ model = DenseBackwardOLMoEForCausalLM(config)
200
+ print(type(model))
201
+ print(type(model.model))
202
+ print(type(model.model.layers[0]))
203
+ print(type(model.model.layers[0].mlp))
204
+ print(type(model.model.layers[0].mlp.experts))
205
+ if __name__ == "__main__":
206
+ main()
special_tokens_map.json ADDED
@@ -0,0 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "eos_token": {
3
+ "content": "<|endoftext|>",
4
+ "lstrip": false,
5
+ "normalized": false,
6
+ "rstrip": false,
7
+ "single_word": false
8
+ },
9
+ "pad_token": {
10
+ "content": "<|padding|>",
11
+ "lstrip": false,
12
+ "normalized": false,
13
+ "rstrip": false,
14
+ "single_word": false
15
+ }
16
+ }
tokenizer.json ADDED
The diff for this file is too large to render. See raw diff
 
tokenizer_config.json ADDED
@@ -0,0 +1,239 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "add_bos_token": false,
3
+ "add_eos_token": false,
4
+ "add_prefix_space": false,
5
+ "added_tokens_decoder": {
6
+ "0": {
7
+ "content": "|||IP_ADDRESS|||",
8
+ "lstrip": false,
9
+ "normalized": true,
10
+ "rstrip": false,
11
+ "single_word": false,
12
+ "special": false
13
+ },
14
+ "1": {
15
+ "content": "<|padding|>",
16
+ "lstrip": false,
17
+ "normalized": false,
18
+ "rstrip": false,
19
+ "single_word": false,
20
+ "special": true
21
+ },
22
+ "50254": {
23
+ "content": " ",
24
+ "lstrip": false,
25
+ "normalized": true,
26
+ "rstrip": false,
27
+ "single_word": false,
28
+ "special": false
29
+ },
30
+ "50255": {
31
+ "content": " ",
32
+ "lstrip": false,
33
+ "normalized": true,
34
+ "rstrip": false,
35
+ "single_word": false,
36
+ "special": false
37
+ },
38
+ "50256": {
39
+ "content": " ",
40
+ "lstrip": false,
41
+ "normalized": true,
42
+ "rstrip": false,
43
+ "single_word": false,
44
+ "special": false
45
+ },
46
+ "50257": {
47
+ "content": " ",
48
+ "lstrip": false,
49
+ "normalized": true,
50
+ "rstrip": false,
51
+ "single_word": false,
52
+ "special": false
53
+ },
54
+ "50258": {
55
+ "content": " ",
56
+ "lstrip": false,
57
+ "normalized": true,
58
+ "rstrip": false,
59
+ "single_word": false,
60
+ "special": false
61
+ },
62
+ "50259": {
63
+ "content": " ",
64
+ "lstrip": false,
65
+ "normalized": true,
66
+ "rstrip": false,
67
+ "single_word": false,
68
+ "special": false
69
+ },
70
+ "50260": {
71
+ "content": " ",
72
+ "lstrip": false,
73
+ "normalized": true,
74
+ "rstrip": false,
75
+ "single_word": false,
76
+ "special": false
77
+ },
78
+ "50261": {
79
+ "content": " ",
80
+ "lstrip": false,
81
+ "normalized": true,
82
+ "rstrip": false,
83
+ "single_word": false,
84
+ "special": false
85
+ },
86
+ "50262": {
87
+ "content": " ",
88
+ "lstrip": false,
89
+ "normalized": true,
90
+ "rstrip": false,
91
+ "single_word": false,
92
+ "special": false
93
+ },
94
+ "50263": {
95
+ "content": " ",
96
+ "lstrip": false,
97
+ "normalized": true,
98
+ "rstrip": false,
99
+ "single_word": false,
100
+ "special": false
101
+ },
102
+ "50264": {
103
+ "content": " ",
104
+ "lstrip": false,
105
+ "normalized": true,
106
+ "rstrip": false,
107
+ "single_word": false,
108
+ "special": false
109
+ },
110
+ "50265": {
111
+ "content": " ",
112
+ "lstrip": false,
113
+ "normalized": true,
114
+ "rstrip": false,
115
+ "single_word": false,
116
+ "special": false
117
+ },
118
+ "50266": {
119
+ "content": " ",
120
+ "lstrip": false,
121
+ "normalized": true,
122
+ "rstrip": false,
123
+ "single_word": false,
124
+ "special": false
125
+ },
126
+ "50267": {
127
+ "content": " ",
128
+ "lstrip": false,
129
+ "normalized": true,
130
+ "rstrip": false,
131
+ "single_word": false,
132
+ "special": false
133
+ },
134
+ "50268": {
135
+ "content": " ",
136
+ "lstrip": false,
137
+ "normalized": true,
138
+ "rstrip": false,
139
+ "single_word": false,
140
+ "special": false
141
+ },
142
+ "50269": {
143
+ "content": " ",
144
+ "lstrip": false,
145
+ "normalized": true,
146
+ "rstrip": false,
147
+ "single_word": false,
148
+ "special": false
149
+ },
150
+ "50270": {
151
+ "content": " ",
152
+ "lstrip": false,
153
+ "normalized": true,
154
+ "rstrip": false,
155
+ "single_word": false,
156
+ "special": false
157
+ },
158
+ "50271": {
159
+ "content": " ",
160
+ "lstrip": false,
161
+ "normalized": true,
162
+ "rstrip": false,
163
+ "single_word": false,
164
+ "special": false
165
+ },
166
+ "50272": {
167
+ "content": " ",
168
+ "lstrip": false,
169
+ "normalized": true,
170
+ "rstrip": false,
171
+ "single_word": false,
172
+ "special": false
173
+ },
174
+ "50273": {
175
+ "content": " ",
176
+ "lstrip": false,
177
+ "normalized": true,
178
+ "rstrip": false,
179
+ "single_word": false,
180
+ "special": false
181
+ },
182
+ "50274": {
183
+ "content": " ",
184
+ "lstrip": false,
185
+ "normalized": true,
186
+ "rstrip": false,
187
+ "single_word": false,
188
+ "special": false
189
+ },
190
+ "50275": {
191
+ "content": " ",
192
+ "lstrip": false,
193
+ "normalized": true,
194
+ "rstrip": false,
195
+ "single_word": false,
196
+ "special": false
197
+ },
198
+ "50276": {
199
+ "content": " ",
200
+ "lstrip": false,
201
+ "normalized": true,
202
+ "rstrip": false,
203
+ "single_word": false,
204
+ "special": false
205
+ },
206
+ "50277": {
207
+ "content": "|||EMAIL_ADDRESS|||",
208
+ "lstrip": false,
209
+ "normalized": true,
210
+ "rstrip": false,
211
+ "single_word": false,
212
+ "special": false
213
+ },
214
+ "50278": {
215
+ "content": "|||PHONE_NUMBER|||",
216
+ "lstrip": false,
217
+ "normalized": true,
218
+ "rstrip": false,
219
+ "single_word": false,
220
+ "special": false
221
+ },
222
+ "50279": {
223
+ "content": "<|endoftext|>",
224
+ "lstrip": false,
225
+ "normalized": false,
226
+ "rstrip": false,
227
+ "single_word": false,
228
+ "special": true
229
+ }
230
+ },
231
+ "bos_token": null,
232
+ "clean_up_tokenization_spaces": true,
233
+ "eos_token": "<|endoftext|>",
234
+ "extra_special_tokens": {},
235
+ "model_max_length": 1000000000000000019884624838656,
236
+ "pad_token": "<|padding|>",
237
+ "tokenizer_class": "GPTNeoXTokenizer",
238
+ "unk_token": null
239
+ }