silver commited on
Commit
02e096b
1 Parent(s): a93efa9

remove unused image token

Browse files
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("THUDM/chatglm-6b-int4", trust_remote_code=True)
31
- >>> model = AutoModel.from_pretrained("THUDM/chatglm-6b-int4", trust_remote_code=True).half().cuda()
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,以及使用模型量化以节省显存,请参考我们的 [Github Repo](https://github.com/THUDM/ChatGLM-6B)。
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": "THUDM/chatglm-6b",
3
  "architectures": [
4
  "ChatGLMModel"
5
  ],
@@ -8,8 +8,8 @@
8
  "AutoModel": "modeling_chatglm.ChatGLMForConditionalGeneration",
9
  "AutoModelForSeq2SeqLM": "modeling_chatglm.ChatGLMForConditionalGeneration"
10
  },
11
- "bos_token_id": 150004,
12
- "eos_token_id": 150005,
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": 150528
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 150528):
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=150528,
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=150004,
68
- eos_token_id=150005,
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
- "THUDM/chatglm-6b",
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[..., 20005] = 5e4
56
  return scores
57
 
58
 
@@ -838,7 +838,7 @@ class ChatGLMModel(ChatGLMPreTrainedModel):
838
  )
839
 
840
  if position_ids is None:
841
- MASK, gMASK = 150000, 150001
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 = 150000, 150001
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:a600479082394992066f4aa462ceff95c18a6569b21bd5999c510addc0d6ffba
3
- size 4058980803
 
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
- "THUDM/chatglm-6b": 2048,
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.num_image_tokens + self.num_text_tokens
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 + self.num_image_tokens for x in tmp]
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) - self.num_image_tokens for _id in text_ids]
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
- if x < self.num_image_tokens:
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
- if x.startswith("<image_") and x.endswith(">") and x[7:-1].isdigit():
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