remove unused image token
Browse files- README.md +8 -3
- config.json +3 -3
- configuration_chatglm.py +3 -3
- modeling_chatglm.py +3 -3
- pytorch_model.bin +2 -2
- tokenization_chatglm.py +5 -15
README.md
CHANGED
@@ -7,8 +7,13 @@ tags:
|
|
7 |
- chatglm
|
8 |
- thudm
|
9 |
---
|
10 |
-
# ChatGLM-6B
|
11 |
## 介绍
|
|
|
|
|
|
|
|
|
|
|
12 |
ChatGLM-6B 是一个开源的、支持中英双语问答的对话语言模型,基于 [General Language Model (GLM)](https://github.com/THUDM/GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。ChatGLM-6B 使用了和 [ChatGLM](https://chatglm.cn) 相同的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。
|
13 |
|
14 |
ChatGLM-6B-INT4-QE 是 ChatGLM-6B 量化后的模型权重。具体的,ChatGLM-6B-INT4-QE 对 ChatGLM-6B 中的 28 个 GLM Block 、 Embedding 和 LM Head 进行了 INT4 量化。量化后的模型权重文件仅为 3G ,理论上 6G 显存(使用 CPU 即 6G 内存)即可推理,具有在嵌入式设备(如树莓派)上运行的可能。
|
@@ -27,8 +32,8 @@ pip install protobuf==3.20.0 transformers==4.26.1 icetk cpm_kernels
|
|
27 |
|
28 |
```ipython
|
29 |
>>> from transformers import AutoTokenizer, AutoModel
|
30 |
-
>>> tokenizer = AutoTokenizer.from_pretrained("
|
31 |
-
>>> model = AutoModel.from_pretrained("
|
32 |
>>> response, history = model.chat(tokenizer, "你好", history=[])
|
33 |
>>> print(response)
|
34 |
你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。
|
|
|
7 |
- chatglm
|
8 |
- thudm
|
9 |
---
|
10 |
+
# ChatGLM-6B-INT4-QE-Slim: 低显存版ChatGLM-6B-INT4-QE
|
11 |
## 介绍
|
12 |
+
|
13 |
+
ChatGLM-6B-INT4-QE-Slim是在ChatGLM-6B-INT4-QE的基础上通过裁剪词表构建的。因为ChatGLM-6B使用了icetk,在其词表中,前20000个token是预留给图片的,在文本模型中没有用到这些图片token,但是在infer和微调的时候,这些token对应的embedding依然需要被加载,并且在解码每一个token的时候需要多计算20K个logits,会占用不少显存。因此将这一部分token裁剪掉以节省显存。
|
14 |
+
|
15 |
+
除了词表外,ChatGLM-6B-INT4-QE-Slim的其他结构与ChatGLM-6B-INT4-QE完全一致,性能也完全一样,可以认为是ChatGLM-6B-INT4的一个低显存版等价平替。
|
16 |
+
|
17 |
ChatGLM-6B 是一个开源的、支持中英双语问答的对话语言模型,基于 [General Language Model (GLM)](https://github.com/THUDM/GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。ChatGLM-6B 使用了和 [ChatGLM](https://chatglm.cn) 相同的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。
|
18 |
|
19 |
ChatGLM-6B-INT4-QE 是 ChatGLM-6B 量化后的模型权重。具体的,ChatGLM-6B-INT4-QE 对 ChatGLM-6B 中的 28 个 GLM Block 、 Embedding 和 LM Head 进行了 INT4 量化。量化后的模型权重文件仅为 3G ,理论上 6G 显存(使用 CPU 即 6G 内存)即可推理,具有在嵌入式设备(如树莓派)上运行的可能。
|
|
|
32 |
|
33 |
```ipython
|
34 |
>>> from transformers import AutoTokenizer, AutoModel
|
35 |
+
>>> tokenizer = AutoTokenizer.from_pretrained("silver/chatglm-6b-int4-qe-slim", trust_remote_code=True)
|
36 |
+
>>> model = AutoModel.from_pretrained("silver/chatglm-6b-int4-qe-slim", trust_remote_code=True).half().cuda()
|
37 |
>>> response, history = model.chat(tokenizer, "你好", history=[])
|
38 |
>>> print(response)
|
39 |
你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。
|
config.json
CHANGED
@@ -8,8 +8,8 @@
|
|
8 |
"AutoModel": "modeling_chatglm.ChatGLMForConditionalGeneration",
|
9 |
"AutoModelForSeq2SeqLM": "modeling_chatglm.ChatGLMForConditionalGeneration"
|
10 |
},
|
11 |
-
"bos_token_id":
|
12 |
-
"eos_token_id":
|
13 |
"hidden_size": 4096,
|
14 |
"inner_hidden_size": 16384,
|
15 |
"layernorm_epsilon": 1e-05,
|
@@ -24,5 +24,5 @@
|
|
24 |
"torch_dtype": "float16",
|
25 |
"transformers_version": "4.26.1",
|
26 |
"use_cache": true,
|
27 |
-
"vocab_size":
|
28 |
}
|
|
|
8 |
"AutoModel": "modeling_chatglm.ChatGLMForConditionalGeneration",
|
9 |
"AutoModelForSeq2SeqLM": "modeling_chatglm.ChatGLMForConditionalGeneration"
|
10 |
},
|
11 |
+
"bos_token_id": 130004,
|
12 |
+
"eos_token_id": 130005,
|
13 |
"hidden_size": 4096,
|
14 |
"inner_hidden_size": 16384,
|
15 |
"layernorm_epsilon": 1e-05,
|
|
|
24 |
"torch_dtype": "float16",
|
25 |
"transformers_version": "4.26.1",
|
26 |
"use_cache": true,
|
27 |
+
"vocab_size": 130528
|
28 |
}
|
configuration_chatglm.py
CHANGED
@@ -58,14 +58,14 @@ class ChatGLMConfig(PretrainedConfig):
|
|
58 |
|
59 |
def __init__(
|
60 |
self,
|
61 |
-
vocab_size=
|
62 |
hidden_size=4096,
|
63 |
num_layers=28,
|
64 |
num_attention_heads=32,
|
65 |
layernorm_epsilon=1e-5,
|
66 |
use_cache=False,
|
67 |
-
bos_token_id=
|
68 |
-
eos_token_id=
|
69 |
pad_token_id=0,
|
70 |
max_sequence_length=2048,
|
71 |
inner_hidden_size=16384,
|
|
|
58 |
|
59 |
def __init__(
|
60 |
self,
|
61 |
+
vocab_size=130528,
|
62 |
hidden_size=4096,
|
63 |
num_layers=28,
|
64 |
num_attention_heads=32,
|
65 |
layernorm_epsilon=1e-5,
|
66 |
use_cache=False,
|
67 |
+
bos_token_id=130004,
|
68 |
+
eos_token_id=130005,
|
69 |
pad_token_id=0,
|
70 |
max_sequence_length=2048,
|
71 |
inner_hidden_size=16384,
|
modeling_chatglm.py
CHANGED
@@ -53,7 +53,7 @@ class InvalidScoreLogitsProcessor(LogitsProcessor):
|
|
53 |
def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor:
|
54 |
if torch.isnan(scores).any() or torch.isinf(scores).any():
|
55 |
scores.zero_()
|
56 |
-
scores[...,
|
57 |
return scores
|
58 |
|
59 |
|
@@ -839,7 +839,7 @@ class ChatGLMModel(ChatGLMPreTrainedModel):
|
|
839 |
)
|
840 |
|
841 |
if position_ids is None:
|
842 |
-
MASK, gMASK =
|
843 |
mask_token = MASK if MASK in input_ids else gMASK
|
844 |
use_gmask = False if MASK in input_ids else gMASK
|
845 |
|
@@ -981,7 +981,7 @@ class ChatGLMForConditionalGeneration(ChatGLMPreTrainedModel):
|
|
981 |
**kwargs
|
982 |
) -> dict:
|
983 |
|
984 |
-
MASK, gMASK =
|
985 |
mask_token = MASK if MASK in input_ids else gMASK
|
986 |
use_gmask = False if MASK in input_ids else gMASK
|
987 |
seq = input_ids[0].tolist()
|
|
|
53 |
def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor:
|
54 |
if torch.isnan(scores).any() or torch.isinf(scores).any():
|
55 |
scores.zero_()
|
56 |
+
scores[..., 5] = 5e4
|
57 |
return scores
|
58 |
|
59 |
|
|
|
839 |
)
|
840 |
|
841 |
if position_ids is None:
|
842 |
+
MASK, gMASK = 130000, 130001
|
843 |
mask_token = MASK if MASK in input_ids else gMASK
|
844 |
use_gmask = False if MASK in input_ids else gMASK
|
845 |
|
|
|
981 |
**kwargs
|
982 |
) -> dict:
|
983 |
|
984 |
+
MASK, gMASK = 130000, 130001
|
985 |
mask_token = MASK if MASK in input_ids else gMASK
|
986 |
use_gmask = False if MASK in input_ids else gMASK
|
987 |
seq = input_ids[0].tolist()
|
pytorch_model.bin
CHANGED
@@ -1,3 +1,3 @@
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
-
oid sha256:
|
3 |
-
size
|
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:a7236a772df5ef4c2f62ad733adb7ad2c5dd17cde8d8c7a31ba7848e17d8affd
|
3 |
+
size 3132377293
|
tokenization_chatglm.py
CHANGED
@@ -85,17 +85,13 @@ class SPTokenizer:
|
|
85 |
def get_tab_token():
|
86 |
return f"<|tab|>"
|
87 |
|
88 |
-
@property
|
89 |
-
def num_image_tokens(self):
|
90 |
-
return 20000
|
91 |
-
|
92 |
@property
|
93 |
def num_text_tokens(self):
|
94 |
return self.text_tokenizer.num_tokens
|
95 |
|
96 |
@property
|
97 |
def num_tokens(self):
|
98 |
-
return self.
|
99 |
|
100 |
@staticmethod
|
101 |
def _encode_whitespaces(text: str, max_len: int = 80):
|
@@ -125,11 +121,11 @@ class SPTokenizer:
|
|
125 |
if not add_dummy_prefix:
|
126 |
text = "<n>" + text
|
127 |
tmp = self._get_text_tokenizer(encode_special_tokens=special_tokens).encode(text)
|
128 |
-
tokens = [x
|
129 |
return tokens if add_dummy_prefix else tokens[2:]
|
130 |
|
131 |
def decode(self, text_ids: List[int], special_tokens=False) -> str:
|
132 |
-
ids = [int(_id)
|
133 |
ids = [_id for _id in ids if _id >= 0]
|
134 |
text = self._get_text_tokenizer(encode_special_tokens=special_tokens).decode(ids)
|
135 |
text = text.replace("<n>", "\n")
|
@@ -156,15 +152,9 @@ class SPTokenizer:
|
|
156 |
|
157 |
def __getitem__(self, x: Union[int, str]):
|
158 |
if isinstance(x, int):
|
159 |
-
|
160 |
-
return "<image_{}>".format(x)
|
161 |
-
else:
|
162 |
-
return self.text_tokenizer.convert_id_to_token(x - self.num_image_tokens)
|
163 |
elif isinstance(x, str):
|
164 |
-
|
165 |
-
return int(x[7:-1])
|
166 |
-
else:
|
167 |
-
return self.text_tokenizer.convert_token_to_id(x) + self.num_image_tokens
|
168 |
else:
|
169 |
raise ValueError("The key should be str or int.")
|
170 |
|
|
|
85 |
def get_tab_token():
|
86 |
return f"<|tab|>"
|
87 |
|
|
|
|
|
|
|
|
|
88 |
@property
|
89 |
def num_text_tokens(self):
|
90 |
return self.text_tokenizer.num_tokens
|
91 |
|
92 |
@property
|
93 |
def num_tokens(self):
|
94 |
+
return self.num_text_tokens
|
95 |
|
96 |
@staticmethod
|
97 |
def _encode_whitespaces(text: str, max_len: int = 80):
|
|
|
121 |
if not add_dummy_prefix:
|
122 |
text = "<n>" + text
|
123 |
tmp = self._get_text_tokenizer(encode_special_tokens=special_tokens).encode(text)
|
124 |
+
tokens = [x for x in tmp]
|
125 |
return tokens if add_dummy_prefix else tokens[2:]
|
126 |
|
127 |
def decode(self, text_ids: List[int], special_tokens=False) -> str:
|
128 |
+
ids = [int(_id) for _id in text_ids]
|
129 |
ids = [_id for _id in ids if _id >= 0]
|
130 |
text = self._get_text_tokenizer(encode_special_tokens=special_tokens).decode(ids)
|
131 |
text = text.replace("<n>", "\n")
|
|
|
152 |
|
153 |
def __getitem__(self, x: Union[int, str]):
|
154 |
if isinstance(x, int):
|
155 |
+
return self.text_tokenizer.convert_id_to_token(x)
|
|
|
|
|
|
|
156 |
elif isinstance(x, str):
|
157 |
+
return self.text_tokenizer.convert_token_to_id(x)
|
|
|
|
|
|
|
158 |
else:
|
159 |
raise ValueError("The key should be str or int.")
|
160 |
|