remove unused image token
Browse files- README.md +10 -4
- config.json +4 -4
- configuration_chatglm.py +4 -4
- modeling_chatglm.py +4 -4
- pytorch_model.bin +2 -2
- tokenization_chatglm.py +6 -16
README.md
CHANGED
@@ -9,12 +9,18 @@ tags:
|
|
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 是 ChatGLM-6B 量化后的模型权重。具体的, ChatGLM-6B-INT4 对 ChatGLM-6B 中的 28 个 GLM Block 进行了 INT4 量化,没有对 Embedding 和 LM Head 进行量化。量化后的模型理论上仅需 5.2G 内存(使用 CPU 上推理,float)或 4G显存(使用 CUDA 推理,fp16)即可加载,具有在嵌入式设备(如树莓派)上运行的可能。
|
15 |
|
16 |
在 CPU 上运行时,会根据硬件自动编译 CPU Kernel ,请确保已安装 GCC 和 OpenMP (Linux一般已安装,对于Windows则需手动安装),以获得最佳并行计算能力。
|
17 |
|
|
|
|
|
18 |
## 软件依赖
|
19 |
|
20 |
```shell
|
@@ -27,8 +33,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,很高兴见到你,欢迎问我任何问题。
|
@@ -46,7 +52,7 @@ pip install protobuf==3.20.0 transformers==4.26.1 icetk cpm_kernels
|
|
46 |
如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。
|
47 |
```
|
48 |
|
49 |
-
关于更多的使用说明,包括如何运行命令行和网页版本的 DEMO
|
50 |
|
51 |
## 协议
|
52 |
|
@@ -54,7 +60,7 @@ pip install protobuf==3.20.0 transformers==4.26.1 icetk cpm_kernels
|
|
54 |
|
55 |
## 引用
|
56 |
|
57 |
-
|
58 |
|
59 |
```
|
60 |
@inproceedings{
|
|
|
9 |
---
|
10 |
# ChatGLM-6B
|
11 |
## 介绍
|
12 |
+
ChatGLM-6B-INT4-Slim是在ChatGLM-6B-INT4的基础上通过裁剪词表构建的。因为ChatGLM-6B使用了icetk,在其词表中,前20000个token是预留给图片的,在文本模型中没有用到这些图片token,但是在infer和微调的时候,这些token对应的embedding依然需要被加载,并且在解码每一个token的时候需要多计算20K个logits,会占用不少显存。因此将这一部分token裁剪掉以节省显存。
|
13 |
+
|
14 |
+
除了词表外,ChatGLM-6B-INT4-Slim的其他结构与ChatGLM-6B-INT4完全一致,性能也完全一样,可以认为是ChatGLM-6B-INT4的一个低显存版等价平替。
|
15 |
+
|
16 |
ChatGLM-6B 是一个开源的、支持中英双语问答的对话语言模型,基于 [General Language Model (GLM)](https://github.com/THUDM/GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。ChatGLM-6B 使用了和 [ChatGLM](https://chatglm.cn) 相同的技术,针对中文问答和对话进行了优化。经过约 1T 标识符的中英双语训练,辅以监督微调、反馈自助、人类反馈强化学习等技术的加持,62 亿参数的 ChatGLM-6B 已经能生成相当符合人类偏好的回答。
|
17 |
|
18 |
ChatGLM-6B-INT4 是 ChatGLM-6B 量化后的模型权重。具体的, ChatGLM-6B-INT4 对 ChatGLM-6B 中的 28 个 GLM Block 进行了 INT4 量化,没有对 Embedding 和 LM Head 进行量化。量化后的模型理论上仅需 5.2G 内存(使用 CPU 上推理,float)或 4G显存(使用 CUDA 推理,fp16)即可加载,具有在嵌入式设备(如树莓派)上运行的可能。
|
19 |
|
20 |
在 CPU 上运行时,会根据硬件自动编译 CPU Kernel ,请确保已安装 GCC 和 OpenMP (Linux一般已安装,对于Windows则需手动安装),以获得最佳并行计算能力。
|
21 |
|
22 |
+
模型所有版权和Credit归ChatGLM官方团队所有,ChatGLM-6B-INT4-Slim只是为了方便大家使用而制作。
|
23 |
+
|
24 |
## 软件依赖
|
25 |
|
26 |
```shell
|
|
|
33 |
|
34 |
```ipython
|
35 |
>>> from transformers import AutoTokenizer, AutoModel
|
36 |
+
>>> tokenizer = AutoTokenizer.from_pretrained("silver/chatglm-6b-int4-slim", trust_remote_code=True)
|
37 |
+
>>> model = AutoModel.from_pretrained("silver/chatglm-6b-int4-slim", trust_remote_code=True).half().cuda()
|
38 |
>>> response, history = model.chat(tokenizer, "你好", history=[])
|
39 |
>>> print(response)
|
40 |
你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。
|
|
|
52 |
如果这些方法无法帮助你入睡,你可以考虑咨询医生或睡眠专家,寻求进一步的建议。
|
53 |
```
|
54 |
|
55 |
+
关于更多的使用说明,包括如何运行命令行和网页版本的 DEMO,以及使用模型量化以节省显存,请参考 [Github Repo](https://github.com/THUDM/ChatGLM-6B)。
|
56 |
|
57 |
## 协议
|
58 |
|
|
|
60 |
|
61 |
## 引用
|
62 |
|
63 |
+
如果你觉得这个工作有帮助的话,请考虑引用ChatGLM官方团队的论文:
|
64 |
|
65 |
```
|
66 |
@inproceedings{
|
config.json
CHANGED
@@ -1,5 +1,5 @@
|
|
1 |
{
|
2 |
-
"_name_or_path": "
|
3 |
"architectures": [
|
4 |
"ChatGLMModel"
|
5 |
],
|
@@ -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,
|
@@ -23,5 +23,5 @@
|
|
23 |
"torch_dtype": "float16",
|
24 |
"transformers_version": "4.23.1",
|
25 |
"use_cache": true,
|
26 |
-
"vocab_size":
|
27 |
}
|
|
|
1 |
{
|
2 |
+
"_name_or_path": "silver/chatglm-6b-int4-slim",
|
3 |
"architectures": [
|
4 |
"ChatGLMModel"
|
5 |
],
|
|
|
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,
|
|
|
23 |
"torch_dtype": "float16",
|
24 |
"transformers_version": "4.23.1",
|
25 |
"use_cache": true,
|
26 |
+
"vocab_size": 130528
|
27 |
}
|
configuration_chatglm.py
CHANGED
@@ -19,7 +19,7 @@ class ChatGLMConfig(PretrainedConfig):
|
|
19 |
|
20 |
|
21 |
Args:
|
22 |
-
vocab_size (`int`, *optional*, defaults to
|
23 |
Vocabulary size of the ChatGLM-6B model. Defines the number of different tokens that can be represented by the
|
24 |
`inputs_ids` passed when calling [`~ChatGLMModel`] or
|
25 |
[`~TFChatGLMModel`].
|
@@ -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,
|
|
|
19 |
|
20 |
|
21 |
Args:
|
22 |
+
vocab_size (`int`, *optional*, defaults to 130528):
|
23 |
Vocabulary size of the ChatGLM-6B model. Defines the number of different tokens that can be represented by the
|
24 |
`inputs_ids` passed when calling [`~ChatGLMModel`] or
|
25 |
[`~TFChatGLMModel`].
|
|
|
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
@@ -43,7 +43,7 @@ _CHECKPOINT_FOR_DOC = "THUDM/ChatGLM-6B"
|
|
43 |
_CONFIG_FOR_DOC = "ChatGLM6BConfig"
|
44 |
|
45 |
CHATGLM_6B_PRETRAINED_MODEL_ARCHIVE_LIST = [
|
46 |
-
"
|
47 |
# See all ChatGLM-6B models at https://huggingface.co/models?filter=chatglm
|
48 |
]
|
49 |
|
@@ -52,7 +52,7 @@ class InvalidScoreLogitsProcessor(LogitsProcessor):
|
|
52 |
def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor:
|
53 |
if torch.isnan(scores).any() or torch.isinf(scores).any():
|
54 |
scores.zero_()
|
55 |
-
scores[...,
|
56 |
return scores
|
57 |
|
58 |
|
@@ -838,7 +838,7 @@ class ChatGLMModel(ChatGLMPreTrainedModel):
|
|
838 |
)
|
839 |
|
840 |
if position_ids is None:
|
841 |
-
MASK, gMASK =
|
842 |
mask_token = MASK if MASK in input_ids else gMASK
|
843 |
use_gmask = False if MASK in input_ids else gMASK
|
844 |
|
@@ -980,7 +980,7 @@ class ChatGLMForConditionalGeneration(ChatGLMPreTrainedModel):
|
|
980 |
**kwargs
|
981 |
) -> dict:
|
982 |
|
983 |
-
MASK, gMASK =
|
984 |
mask_token = MASK if MASK in input_ids else gMASK
|
985 |
use_gmask = False if MASK in input_ids else gMASK
|
986 |
seq = input_ids[0].tolist()
|
|
|
43 |
_CONFIG_FOR_DOC = "ChatGLM6BConfig"
|
44 |
|
45 |
CHATGLM_6B_PRETRAINED_MODEL_ARCHIVE_LIST = [
|
46 |
+
"silver/chatglm-6b-int4-slim",
|
47 |
# See all ChatGLM-6B models at https://huggingface.co/models?filter=chatglm
|
48 |
]
|
49 |
|
|
|
52 |
def __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor:
|
53 |
if torch.isnan(scores).any() or torch.isinf(scores).any():
|
54 |
scores.zero_()
|
55 |
+
scores[..., 5] = 5e4
|
56 |
return scores
|
57 |
|
58 |
|
|
|
838 |
)
|
839 |
|
840 |
if position_ids is None:
|
841 |
+
MASK, gMASK = 130000, 130001
|
842 |
mask_token = MASK if MASK in input_ids else gMASK
|
843 |
use_gmask = False if MASK in input_ids else gMASK
|
844 |
|
|
|
980 |
**kwargs
|
981 |
) -> dict:
|
982 |
|
983 |
+
MASK, gMASK = 130000, 130001
|
984 |
mask_token = MASK if MASK in input_ids else gMASK
|
985 |
use_gmask = False if MASK in input_ids else gMASK
|
986 |
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:1cd6407b0c7cba4e3b5ad3369f1d576a87d7c51ad2d9e4298c66aaf45d8fa8d8
|
3 |
+
size 4058984265
|
tokenization_chatglm.py
CHANGED
@@ -16,7 +16,7 @@ from transformers.utils import logging
|
|
16 |
logger = logging.get_logger(__name__)
|
17 |
|
18 |
PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES = {
|
19 |
-
"
|
20 |
}
|
21 |
|
22 |
|
@@ -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 |
|
|
|
16 |
logger = logging.get_logger(__name__)
|
17 |
|
18 |
PRETRAINED_POSITIONAL_EMBEDDINGS_SIZES = {
|
19 |
+
"silver/chatglm-6b-int4-slim": 2048,
|
20 |
}
|
21 |
|
22 |
|
|
|
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 |
|