zR
commited on
Commit
•
b36cb68
1
Parent(s):
dad3715
change Citations
Browse files- .gitignore +3 -0
- README.md +28 -37
- README_en.md +17 -26
- config.json +2 -2
- configuration.json +1 -0
- generation_config.json +1 -1
- modeling_chatglm.py +4 -4
- tokenization_chatglm.py +95 -97
- tokenizer_config.json +1 -0
.gitignore
ADDED
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
1 |
+
*venv
|
2 |
+
*.DS_Store
|
3 |
+
*.idea/
|
README.md
CHANGED
@@ -4,26 +4,24 @@ license_name: glm-4
|
|
4 |
license_link: https://huggingface.co/THUDM/glm-4-9b-chat-1m/blob/main/LICENSE
|
5 |
|
6 |
language:
|
7 |
-
|
8 |
-
|
9 |
tags:
|
10 |
-
|
11 |
-
|
12 |
-
|
13 |
inference: false
|
14 |
---
|
15 |
|
16 |
# GLM-4-9B-Chat-1M
|
17 |
|
18 |
-
Read this in [English](README_en.md)
|
19 |
|
20 |
-
GLM-4-9B 是智谱 AI 推出的最新一代预训练模型 GLM-4 系列中的开源版本。
|
21 |
-
|
22 |
-
还具备网页浏览、代码执行、自定义工具调用(Function Call)和长文本推理(支持最大 128K
|
23 |
-
|
24 |
-
|
25 |
-
表现出超越 GPT-4-turbo-2024-04-09、Gemini
|
26 |
-
1.0 Pro、Qwen-VL-Max 和 Claude 3 Opus 的卓越性能。
|
27 |
|
28 |
## 评测结果
|
29 |
|
@@ -41,11 +39,13 @@ GLM-4V-9B。**GLM-4V-9B** 具备 1120 * 1120 高分辨率下的中英双语多
|
|
41 |
|
42 |
## 运行模型
|
43 |
|
|
|
|
|
44 |
使用 transformers 后端进行推理:
|
45 |
|
46 |
```python
|
47 |
import torch
|
48 |
-
from
|
49 |
|
50 |
device = "cuda"
|
51 |
|
@@ -62,7 +62,7 @@ inputs = tokenizer.apply_chat_template([{"role": "user", "content": query}],
|
|
62 |
|
63 |
inputs = inputs.to(device)
|
64 |
model = AutoModelForCausalLM.from_pretrained(
|
65 |
-
"
|
66 |
torch_dtype=torch.bfloat16,
|
67 |
low_cpu_mem_usage=True,
|
68 |
trust_remote_code=True
|
@@ -82,12 +82,13 @@ from transformers import AutoTokenizer
|
|
82 |
from vllm import LLM, SamplingParams
|
83 |
|
84 |
# GLM-4-9B-Chat-1M
|
|
|
85 |
|
86 |
-
#
|
87 |
-
|
88 |
-
|
89 |
model_name = "THUDM/glm-4-9b-chat-1m"
|
90 |
-
prompt = [{"role": "user", "content": "
|
91 |
|
92 |
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
|
93 |
llm = LLM(
|
@@ -96,7 +97,7 @@ llm = LLM(
|
|
96 |
max_model_len=max_model_len,
|
97 |
trust_remote_code=True,
|
98 |
enforce_eager=True,
|
99 |
-
# GLM-4-9B-Chat-1M
|
100 |
# enable_chunked_prefill=True,
|
101 |
# max_num_batched_tokens=8192
|
102 |
)
|
@@ -105,7 +106,6 @@ sampling_params = SamplingParams(temperature=0.95, max_tokens=1024, stop_token_i
|
|
105 |
|
106 |
inputs = tokenizer.apply_chat_template(prompt, tokenize=False, add_generation_prompt=True)
|
107 |
outputs = llm.generate(prompts=inputs, sampling_params=sampling_params)
|
108 |
-
|
109 |
print(outputs[0].outputs[0].text)
|
110 |
```
|
111 |
|
@@ -113,27 +113,18 @@ print(outputs[0].outputs[0].text)
|
|
113 |
|
114 |
GLM-4 模型的权重的使用则需要遵循 [LICENSE](LICENSE)。
|
115 |
|
116 |
-
Rhe use of the GLM-4 model weights needs to comply with the [LICENSE](LICENSE).
|
117 |
|
118 |
## 引用
|
119 |
|
120 |
如果你觉得我们的工作有帮助的话,请考虑引用下列论文。
|
121 |
|
122 |
```
|
123 |
-
@
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
}
|
129 |
-
|
130 |
-
|
131 |
-
```
|
132 |
-
@inproceedings{du2022glm,
|
133 |
-
title={GLM: General Language Model Pretraining with Autoregressive Blank Infilling},
|
134 |
-
author={Du, Zhengxiao and Qian, Yujie and Liu, Xiao and Ding, Ming and Qiu, Jiezhong and Yang, Zhilin and Tang, Jie},
|
135 |
-
booktitle={Proceedings of the 60th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)},
|
136 |
-
pages={320--335},
|
137 |
-
year={2022}
|
138 |
}
|
139 |
```
|
|
|
4 |
license_link: https://huggingface.co/THUDM/glm-4-9b-chat-1m/blob/main/LICENSE
|
5 |
|
6 |
language:
|
7 |
+
- zh
|
8 |
+
- en
|
9 |
tags:
|
10 |
+
- glm
|
11 |
+
- chatglm
|
12 |
+
- thudm
|
13 |
inference: false
|
14 |
---
|
15 |
|
16 |
# GLM-4-9B-Chat-1M
|
17 |
|
18 |
+
Read this in [English](README_en.md).
|
19 |
|
20 |
+
GLM-4-9B 是智谱 AI 推出的最新一代预训练模型 GLM-4 系列中的开源版本。
|
21 |
+
在语义、数学、推理、代码和知识等多方面的数据集测评中,GLM-4-9B 及其人类偏好对齐的版本 GLM-4-9B-Chat 均表现出较高的性能。
|
22 |
+
除了能进行多轮对话,GLM-4-9B-Chat 还具备网页浏览、代码执行、自定义工具调用(Function Call)和长文本推理(支持最大 128K
|
23 |
+
上下文)等高级功能。
|
24 |
+
本代模型增加了多语言支持,支持包括日语,韩语,德语在内的 26 种语言。我们还推出了支持 1M 上下文长度(约 200 万中文字符)的模型。
|
|
|
|
|
25 |
|
26 |
## 评测结果
|
27 |
|
|
|
39 |
|
40 |
## 运行模型
|
41 |
|
42 |
+
更多推理代码和依赖信息,请访问我们的 [github](https://github.com/THUDM/GLM-4) 。
|
43 |
+
|
44 |
使用 transformers 后端进行推理:
|
45 |
|
46 |
```python
|
47 |
import torch
|
48 |
+
from Transformers
|
49 |
|
50 |
device = "cuda"
|
51 |
|
|
|
62 |
|
63 |
inputs = inputs.to(device)
|
64 |
model = AutoModelForCausalLM.from_pretrained(
|
65 |
+
"ZhipuAI/glm-4-9b-chat-1m",
|
66 |
torch_dtype=torch.bfloat16,
|
67 |
low_cpu_mem_usage=True,
|
68 |
trust_remote_code=True
|
|
|
82 |
from vllm import LLM, SamplingParams
|
83 |
|
84 |
# GLM-4-9B-Chat-1M
|
85 |
+
# max_model_len, tp_size = 1048576, 4
|
86 |
|
87 |
+
# GLM-4-9B-Chat
|
88 |
+
# If you encounter OOM, it is recommended to reduce max_model_len or increase tp_size
|
89 |
+
max_model_len, tp_size = 131072, 1
|
90 |
model_name = "THUDM/glm-4-9b-chat-1m"
|
91 |
+
prompt = [{"role": "user", "content": "hello"}]
|
92 |
|
93 |
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
|
94 |
llm = LLM(
|
|
|
97 |
max_model_len=max_model_len,
|
98 |
trust_remote_code=True,
|
99 |
enforce_eager=True,
|
100 |
+
# GLM-4-9B-Chat-1M If you encounter OOM phenomenon, it is recommended to enable the following parameters
|
101 |
# enable_chunked_prefill=True,
|
102 |
# max_num_batched_tokens=8192
|
103 |
)
|
|
|
106 |
|
107 |
inputs = tokenizer.apply_chat_template(prompt, tokenize=False, add_generation_prompt=True)
|
108 |
outputs = llm.generate(prompts=inputs, sampling_params=sampling_params)
|
|
|
109 |
print(outputs[0].outputs[0].text)
|
110 |
```
|
111 |
|
|
|
113 |
|
114 |
GLM-4 模型的权重的使用则需要遵循 [LICENSE](LICENSE)。
|
115 |
|
|
|
116 |
|
117 |
## 引用
|
118 |
|
119 |
如果你觉得我们的工作有帮助的话,请考虑引用下列论文。
|
120 |
|
121 |
```
|
122 |
+
@misc{glm2024chatglm,
|
123 |
+
title={ChatGLM: A Family of Large Language Models from GLM-130B to GLM-4 All Tools},
|
124 |
+
author={Team GLM and Aohan Zeng and Bin Xu and Bowen Wang and Chenhui Zhang and Da Yin and Diego Rojas and Guanyu Feng and Hanlin Zhao and Hanyu Lai and Hao Yu and Hongning Wang and Jiadai Sun and Jiajie Zhang and Jiale Cheng and Jiayi Gui and Jie Tang and Jing Zhang and Juanzi Li and Lei Zhao and Lindong Wu and Lucen Zhong and Mingdao Liu and Minlie Huang and Peng Zhang and Qinkai Zheng and Rui Lu and Shuaiqi Duan and Shudan Zhang and Shulin Cao and Shuxun Yang and Weng Lam Tam and Wenyi Zhao and Xiao Liu and Xiao Xia and Xiaohan Zhang and Xiaotao Gu and Xin Lv and Xinghan Liu and Xinyi Liu and Xinyue Yang and Xixuan Song and Xunkai Zhang and Yifan An and Yifan Xu and Yilin Niu and Yuantao Yang and Yueyan Li and Yushi Bai and Yuxiao Dong and Zehan Qi and Zhaoyu Wang and Zhen Yang and Zhengxiao Du and Zhenyu Hou and Zihan Wang},
|
125 |
+
year={2024},
|
126 |
+
eprint={2406.12793},
|
127 |
+
archivePrefix={arXiv},
|
128 |
+
primaryClass={id='cs.CL' full_name='Computation and Language' is_active=True alt_name='cmp-lg' in_archive='cs' is_general=False description='Covers natural language processing. Roughly includes material in ACM Subject Class I.2.7. Note that work on artificial languages (programming languages, logics, formal systems) that does not explicitly address natural-language issues broadly construed (natural-language processing, computational linguistics, speech, text retrieval, etc.) is not appropriate for this area.'}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
129 |
}
|
130 |
```
|
README_en.md
CHANGED
@@ -28,11 +28,11 @@ The long text capability was further evaluated on LongBench, and the results are
|
|
28 |
|
29 |
**This repository is the model repository of GLM-4-9B-Chat-1M, supporting `1M` context length.**
|
30 |
|
31 |
-
## Quick
|
32 |
|
33 |
-
|
34 |
|
35 |
-
### Use the following method to quickly call the GLM-4-9B-Chat language model
|
36 |
|
37 |
Use the transformers backend for inference:
|
38 |
|
@@ -75,13 +75,13 @@ from transformers import AutoTokenizer
|
|
75 |
from vllm import LLM, SamplingParams
|
76 |
|
77 |
# GLM-4-9B-Chat-1M
|
|
|
78 |
|
|
|
79 |
# If you encounter OOM, it is recommended to reduce max_model_len or increase tp_size
|
80 |
-
|
81 |
-
max_model_len, tp_size = 1048576, 4
|
82 |
-
|
83 |
model_name = "THUDM/glm-4-9b-chat-1m"
|
84 |
-
prompt = [{"role": "user", "content": "
|
85 |
|
86 |
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
|
87 |
llm = LLM(
|
@@ -90,7 +90,7 @@ llm = LLM(
|
|
90 |
max_model_len=max_model_len,
|
91 |
trust_remote_code=True,
|
92 |
enforce_eager=True,
|
93 |
-
# GLM-4-9B-Chat-1M If you encounter OOM phenomenon, it is recommended to
|
94 |
# enable_chunked_prefill=True,
|
95 |
# max_num_batched_tokens=8192
|
96 |
)
|
@@ -99,33 +99,24 @@ sampling_params = SamplingParams(temperature=0.95, max_tokens=1024, stop_token_i
|
|
99 |
|
100 |
inputs = tokenizer.apply_chat_template(prompt, tokenize=False, add_generation_prompt=True)
|
101 |
outputs = llm.generate(prompts=inputs, sampling_params=sampling_params)
|
102 |
-
|
103 |
print(outputs[0].outputs[0].text)
|
104 |
```
|
105 |
|
106 |
## LICENSE
|
107 |
|
108 |
-
The weights of the GLM-4 model are available under the terms of [LICENSE](LICENSE)
|
109 |
|
110 |
## Citations
|
111 |
|
112 |
If you find our work useful, please consider citing the following paper.
|
113 |
|
114 |
```
|
115 |
-
@
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
}
|
121 |
-
|
122 |
-
|
123 |
-
```
|
124 |
-
@inproceedings{du2022glm,
|
125 |
-
title={GLM: General Language Model Pretraining with Autoregressive Blank Infilling},
|
126 |
-
author={Du, Zhengxiao and Qian, Yujie and Liu, Xiao and Ding, Ming and Qiu, Jiezhong and Yang, Zhilin and Tang, Jie},
|
127 |
-
booktitle={Proceedings of the 60th Annual Meeting of the Association for Computational Linguistics (Volume 1: Long Papers)},
|
128 |
-
pages={320--335},
|
129 |
-
year={2022}
|
130 |
}
|
131 |
-
```
|
|
|
28 |
|
29 |
**This repository is the model repository of GLM-4-9B-Chat-1M, supporting `1M` context length.**
|
30 |
|
31 |
+
## Quick Start
|
32 |
|
33 |
+
For more inference code and requirements, please visit our [github page](https://github.com/THUDM/GLM-4).
|
34 |
|
35 |
+
### Use the following method to quickly call the GLM-4-9B-Chat-1M language model
|
36 |
|
37 |
Use the transformers backend for inference:
|
38 |
|
|
|
75 |
from vllm import LLM, SamplingParams
|
76 |
|
77 |
# GLM-4-9B-Chat-1M
|
78 |
+
# max_model_len, tp_size = 1048576, 4
|
79 |
|
80 |
+
# GLM-4-9B-Chat
|
81 |
# If you encounter OOM, it is recommended to reduce max_model_len or increase tp_size
|
82 |
+
max_model_len, tp_size = 131072, 1
|
|
|
|
|
83 |
model_name = "THUDM/glm-4-9b-chat-1m"
|
84 |
+
prompt = [{"role": "user", "content": "hello"}]
|
85 |
|
86 |
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
|
87 |
llm = LLM(
|
|
|
90 |
max_model_len=max_model_len,
|
91 |
trust_remote_code=True,
|
92 |
enforce_eager=True,
|
93 |
+
# GLM-4-9B-Chat-1M If you encounter OOM phenomenon, it is recommended to enable the following parameters
|
94 |
# enable_chunked_prefill=True,
|
95 |
# max_num_batched_tokens=8192
|
96 |
)
|
|
|
99 |
|
100 |
inputs = tokenizer.apply_chat_template(prompt, tokenize=False, add_generation_prompt=True)
|
101 |
outputs = llm.generate(prompts=inputs, sampling_params=sampling_params)
|
|
|
102 |
print(outputs[0].outputs[0].text)
|
103 |
```
|
104 |
|
105 |
## LICENSE
|
106 |
|
107 |
+
The weights of the GLM-4 model are available under the terms of [LICENSE](LICENSE)
|
108 |
|
109 |
## Citations
|
110 |
|
111 |
If you find our work useful, please consider citing the following paper.
|
112 |
|
113 |
```
|
114 |
+
@misc{glm2024chatglm,
|
115 |
+
title={ChatGLM: A Family of Large Language Models from GLM-130B to GLM-4 All Tools},
|
116 |
+
author={Team GLM and Aohan Zeng and Bin Xu and Bowen Wang and Chenhui Zhang and Da Yin and Diego Rojas and Guanyu Feng and Hanlin Zhao and Hanyu Lai and Hao Yu and Hongning Wang and Jiadai Sun and Jiajie Zhang and Jiale Cheng and Jiayi Gui and Jie Tang and Jing Zhang and Juanzi Li and Lei Zhao and Lindong Wu and Lucen Zhong and Mingdao Liu and Minlie Huang and Peng Zhang and Qinkai Zheng and Rui Lu and Shuaiqi Duan and Shudan Zhang and Shulin Cao and Shuxun Yang and Weng Lam Tam and Wenyi Zhao and Xiao Liu and Xiao Xia and Xiaohan Zhang and Xiaotao Gu and Xin Lv and Xinghan Liu and Xinyi Liu and Xinyue Yang and Xixuan Song and Xunkai Zhang and Yifan An and Yifan Xu and Yilin Niu and Yuantao Yang and Yueyan Li and Yushi Bai and Yuxiao Dong and Zehan Qi and Zhaoyu Wang and Zhen Yang and Zhengxiao Du and Zhenyu Hou and Zihan Wang},
|
117 |
+
year={2024},
|
118 |
+
eprint={2406.12793},
|
119 |
+
archivePrefix={arXiv},
|
120 |
+
primaryClass={id='cs.CL' full_name='Computation and Language' is_active=True alt_name='cmp-lg' in_archive='cs' is_general=False description='Covers natural language processing. Roughly includes material in ACM Subject Class I.2.7. Note that work on artificial languages (programming languages, logics, formal systems) that does not explicitly address natural-language issues broadly construed (natural-language processing, computational linguistics, speech, text retrieval, etc.) is not appropriate for this area.'}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
121 |
}
|
122 |
+
```
|
config.json
CHANGED
@@ -37,8 +37,8 @@
|
|
37 |
"seq_length": 1048576,
|
38 |
"use_cache": true,
|
39 |
"torch_dtype": "bfloat16",
|
40 |
-
"transformers_version": "4.
|
41 |
"tie_word_embeddings": false,
|
42 |
"eos_token_id": [151329, 151336, 151338],
|
43 |
"pad_token_id": 151329
|
44 |
-
}
|
|
|
37 |
"seq_length": 1048576,
|
38 |
"use_cache": true,
|
39 |
"torch_dtype": "bfloat16",
|
40 |
+
"transformers_version": "4.40.2",
|
41 |
"tie_word_embeddings": false,
|
42 |
"eos_token_id": [151329, 151336, 151338],
|
43 |
"pad_token_id": 151329
|
44 |
+
}
|
configuration.json
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
{"framework":"Pytorch","task":"nli"}
|
generation_config.json
CHANGED
@@ -9,5 +9,5 @@
|
|
9 |
"temperature": 0.8,
|
10 |
"max_length": 1024000,
|
11 |
"top_p": 0.8,
|
12 |
-
"transformers_version": "4.
|
13 |
}
|
|
|
9 |
"temperature": 0.8,
|
10 |
"max_length": 1024000,
|
11 |
"top_p": 0.8,
|
12 |
+
"transformers_version": "4.40.2"
|
13 |
}
|
modeling_chatglm.py
CHANGED
@@ -21,7 +21,7 @@ from transformers.modeling_outputs import (
|
|
21 |
SequenceClassifierOutputWithPast,
|
22 |
)
|
23 |
from transformers.modeling_utils import PreTrainedModel
|
24 |
-
from transformers.utils import logging
|
25 |
from transformers.generation.logits_process import LogitsProcessor
|
26 |
from transformers.generation.utils import LogitsProcessorList, StoppingCriteriaList, GenerationConfig, ModelOutput
|
27 |
|
@@ -29,7 +29,7 @@ from .configuration_chatglm import ChatGLMConfig
|
|
29 |
|
30 |
# flags required to enable jit fusion kernels
|
31 |
|
32 |
-
if sys.platform != 'darwin':
|
33 |
torch._C._jit_set_profiling_mode(False)
|
34 |
torch._C._jit_set_profiling_executor(False)
|
35 |
torch._C._jit_override_can_fuse_on_cpu(True)
|
@@ -1139,7 +1139,7 @@ class ChatGLMForSequenceClassification(ChatGLMPreTrainedModel):
|
|
1139 |
self.num_labels = config.num_labels
|
1140 |
self.transformer = ChatGLMModel(config, empty_init=empty_init, device=device)
|
1141 |
|
1142 |
-
self.classifier_head = nn.Linear(config.hidden_size, config.num_labels, bias=True, dtype=
|
1143 |
if config.classifier_dropout is not None:
|
1144 |
self.dropout = nn.Dropout(config.classifier_dropout)
|
1145 |
else:
|
@@ -1174,7 +1174,7 @@ class ChatGLMForSequenceClassification(ChatGLMPreTrainedModel):
|
|
1174 |
)
|
1175 |
|
1176 |
hidden_states = transformer_outputs[0]
|
1177 |
-
pooled_hidden_states = hidden_states[-1]
|
1178 |
if self.dropout is not None:
|
1179 |
pooled_hidden_states = self.dropout(pooled_hidden_states)
|
1180 |
logits = self.classifier_head(pooled_hidden_states)
|
|
|
21 |
SequenceClassifierOutputWithPast,
|
22 |
)
|
23 |
from transformers.modeling_utils import PreTrainedModel
|
24 |
+
from transformers.utils import logging, is_torch_npu_available
|
25 |
from transformers.generation.logits_process import LogitsProcessor
|
26 |
from transformers.generation.utils import LogitsProcessorList, StoppingCriteriaList, GenerationConfig, ModelOutput
|
27 |
|
|
|
29 |
|
30 |
# flags required to enable jit fusion kernels
|
31 |
|
32 |
+
if sys.platform != 'darwin' and not is_torch_npu_available():
|
33 |
torch._C._jit_set_profiling_mode(False)
|
34 |
torch._C._jit_set_profiling_executor(False)
|
35 |
torch._C._jit_override_can_fuse_on_cpu(True)
|
|
|
1139 |
self.num_labels = config.num_labels
|
1140 |
self.transformer = ChatGLMModel(config, empty_init=empty_init, device=device)
|
1141 |
|
1142 |
+
self.classifier_head = nn.Linear(config.hidden_size, config.num_labels, bias=True, dtype=config.torch_dtype)
|
1143 |
if config.classifier_dropout is not None:
|
1144 |
self.dropout = nn.Dropout(config.classifier_dropout)
|
1145 |
else:
|
|
|
1174 |
)
|
1175 |
|
1176 |
hidden_states = transformer_outputs[0]
|
1177 |
+
pooled_hidden_states = hidden_states[:, -1]
|
1178 |
if self.dropout is not None:
|
1179 |
pooled_hidden_states = self.dropout(pooled_hidden_states)
|
1180 |
logits = self.classifier_head(pooled_hidden_states)
|
tokenization_chatglm.py
CHANGED
@@ -62,16 +62,14 @@ class ChatGLM4Tokenizer(PreTrainedTokenizer):
|
|
62 |
vocab = {self._convert_id_to_token(i): i for i in range(self.vocab_size)}
|
63 |
vocab.update(self.added_tokens_encoder)
|
64 |
return vocab
|
65 |
-
|
66 |
-
def convert_tokens_to_string(self, tokens: List[Union[bytes, str
|
67 |
"""
|
68 |
Converts a sequence of tokens in a single string.
|
69 |
"""
|
70 |
text = ""
|
71 |
temp = b""
|
72 |
for t in tokens:
|
73 |
-
if isinstance(t, int):
|
74 |
-
t = chr(t)
|
75 |
if isinstance(t, str):
|
76 |
if temp:
|
77 |
text += temp.decode("utf-8", errors="replace")
|
@@ -80,7 +78,7 @@ class ChatGLM4Tokenizer(PreTrainedTokenizer):
|
|
80 |
elif isinstance(t, bytes):
|
81 |
temp += t
|
82 |
else:
|
83 |
-
raise TypeError("token should only be of type
|
84 |
if temp:
|
85 |
text += temp.decode("utf-8", errors="replace")
|
86 |
return text
|
@@ -143,98 +141,98 @@ class ChatGLM4Tokenizer(PreTrainedTokenizer):
|
|
143 |
else:
|
144 |
return str(f"<|{role}|>{metadata}\n{message}")
|
145 |
|
146 |
-
|
147 |
-
|
148 |
-
|
149 |
-
|
150 |
-
|
151 |
-
|
152 |
-
|
153 |
-
|
154 |
-
|
155 |
-
|
156 |
-
|
157 |
-
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
|
162 |
-
|
163 |
-
|
164 |
-
|
165 |
-
|
166 |
-
|
167 |
-
|
168 |
-
|
169 |
-
|
170 |
-
|
171 |
-
|
172 |
-
|
173 |
-
|
174 |
-
|
175 |
-
|
176 |
-
|
177 |
-
|
178 |
-
|
179 |
-
|
180 |
-
|
181 |
-
|
182 |
-
|
183 |
-
|
184 |
-
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
192 |
-
|
193 |
-
|
194 |
-
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
|
200 |
-
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
-
|
205 |
-
|
206 |
-
|
207 |
-
|
208 |
-
|
209 |
-
|
210 |
-
|
211 |
-
|
212 |
-
|
213 |
-
|
214 |
-
|
215 |
-
|
216 |
-
|
217 |
-
|
218 |
-
|
219 |
-
|
220 |
-
|
221 |
-
|
222 |
-
|
223 |
-
|
224 |
-
|
225 |
-
|
226 |
-
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
233 |
-
|
234 |
-
|
235 |
-
|
236 |
-
|
237 |
-
|
238 |
|
239 |
def build_inputs_with_special_tokens(
|
240 |
self, token_ids_0: List[int], token_ids_1: Optional[List[int]] = None
|
|
|
62 |
vocab = {self._convert_id_to_token(i): i for i in range(self.vocab_size)}
|
63 |
vocab.update(self.added_tokens_encoder)
|
64 |
return vocab
|
65 |
+
|
66 |
+
def convert_tokens_to_string(self, tokens: List[Union[bytes, str]]) -> str:
|
67 |
"""
|
68 |
Converts a sequence of tokens in a single string.
|
69 |
"""
|
70 |
text = ""
|
71 |
temp = b""
|
72 |
for t in tokens:
|
|
|
|
|
73 |
if isinstance(t, str):
|
74 |
if temp:
|
75 |
text += temp.decode("utf-8", errors="replace")
|
|
|
78 |
elif isinstance(t, bytes):
|
79 |
temp += t
|
80 |
else:
|
81 |
+
raise TypeError("token should only be of type types or str")
|
82 |
if temp:
|
83 |
text += temp.decode("utf-8", errors="replace")
|
84 |
return text
|
|
|
141 |
else:
|
142 |
return str(f"<|{role}|>{metadata}\n{message}")
|
143 |
|
144 |
+
# Use Jinja Template in tokenizer_config.json
|
145 |
+
# def apply_chat_template(
|
146 |
+
# self,
|
147 |
+
# conversation: Union[List[Dict[str, str]], List[List[Dict[str, str]]], "Conversation"],
|
148 |
+
# add_generation_prompt: bool = False,
|
149 |
+
# tokenize: bool = True,
|
150 |
+
# padding: bool = False,
|
151 |
+
# truncation: bool = False,
|
152 |
+
# max_length: Optional[int] = None,
|
153 |
+
# return_tensors: Optional[Union[str, TensorType]] = None,
|
154 |
+
# return_dict: bool = False,
|
155 |
+
# tokenizer_kwargs: Optional[Dict[str, Any]] = None,
|
156 |
+
# add_special_tokens: bool = True,
|
157 |
+
# **kwargs,
|
158 |
+
# ) -> Union[str, List[int], List[str], List[List[int]], BatchEncoding]:
|
159 |
+
#
|
160 |
+
# if return_dict and not tokenize:
|
161 |
+
# raise ValueError(
|
162 |
+
# "`return_dict=True` is incompatible with `tokenize=False`, because there is no dict "
|
163 |
+
# "of tokenizer outputs to return."
|
164 |
+
# )
|
165 |
+
#
|
166 |
+
# def handle_single_conversation(conversation):
|
167 |
+
# input_ids = self.get_prefix_tokens() if add_special_tokens else []
|
168 |
+
# input_message = "[gMASK]<sop>" if add_special_tokens else ""
|
169 |
+
# for item in conversation:
|
170 |
+
# if item.get("tools"):
|
171 |
+
# tools = item["tools"]
|
172 |
+
# content = "你是一个名为 GhatGLM 的人工智能助手。你是基于智谱AI训练的语言模型 GLM-4 模型开发的,你的任务是针对用户的问题和要求提供适当的答复和支持。"
|
173 |
+
# content += "\n\n# 可用工具"
|
174 |
+
# for tool in tools:
|
175 |
+
# if tool["type"] == "function":
|
176 |
+
# function = tool["function"]
|
177 |
+
# content += f"\n\n## {function['name']}\n\n{json.dumps(function, ensure_ascii=False, indent=4)}"
|
178 |
+
# content += "\n在调用上述函数时,请使用 Json 格式表示调用的参数。"
|
179 |
+
# elif tool["type"] == "python":
|
180 |
+
# content += "\n\n## python\n\n当你向 `python` 发送包含 Python 代码的消息时,该代码将会在一个有状态的 Jupyter notebook 环境中执行。\n`python` 返回代码执行的输出,或在执行 60 秒后返回超时。\n`/mnt/data` 将会持久化存储你的文件。在此会话中,`python` 无法访问互联网。不要使用 `python` 进行任何网络请求或者在线 API 调用,这些在线内容的访问将不会成功。"
|
181 |
+
# elif tool["type"] == "simple_browser":
|
182 |
+
# content += "\n\n## simple_browser\n\n你可以使用 `simple_browser` 工具。该工具支持以下函数:\n`search(query: str, recency_days: int)`:使用搜索引擎进行查询并显示结果,可以使用 `recency_days` 参数控制搜索内容的时效性。\n`mclick(ids: list[int])`:获取一系列指定 id 的页面内容。每次调用时,须选择3-10个页面。选择多个角度的页面,同时尽可能选择可信任的信息来源。考虑到部分页面是无法加载的,你也可以多打开一些可能有用的页面而不用担心内容过多。\n`open_url(url: str)`:打开指定的 URL。\n\n使用 `【{引用 id}†{引用文本}】` 来引用内容。\n\n操作步骤:1. 使用 `search` 来获得信息列表; 2. 使用 `mclick` 来获取指定 ID 页面的内容; 3. 根据获得的内容进行回复。在回复中应当引用信息来源。\n 如果用户提供了 URL,也可以用 `open_url` 直接打开页面。\n如果初次搜索结果没有找到合适的信息,也可以再次使用 `search` 进行搜索。"
|
183 |
+
# elif tool["type"] == "cogview":
|
184 |
+
# content += "\n\n## cogview\n\n如果用户的请求中包含了对图像的描述,你可以使用 `cogview` 来生成图像并展示给用户。你需要向 `cogview` 发送图像描述,规则:\n- 发送给 `cogview` 的消息必须使用英语。用户的中文描述必须完全翻译为英语。\n- 应当尽可能详细地描述图像生成的需求,需求描述约 100 英文单词。\n- 保持用户原始描述的意图。不要虚构内容或者没见过的人物。\n- 如无特殊说明,所在地为中国,持有中国立场并遵循中国社会主义价值观。"
|
185 |
+
# else:
|
186 |
+
# raise NotImplementedError(f"Unknown tool type {tool['type']}")
|
187 |
+
# input = self.build_single_message("system", "", content, tokenize=tokenize)
|
188 |
+
# if tokenize:
|
189 |
+
# input_ids.extend(input)
|
190 |
+
# else:
|
191 |
+
# input_message += input
|
192 |
+
# if item["content"]:
|
193 |
+
# input = self.build_single_message(
|
194 |
+
# item["role"],
|
195 |
+
# item.get("metadata", ""),
|
196 |
+
# item["content"],
|
197 |
+
# tokenize=tokenize
|
198 |
+
# )
|
199 |
+
# if tokenize:
|
200 |
+
# input_ids.extend(input)
|
201 |
+
# else:
|
202 |
+
# input_message += input
|
203 |
+
# if add_generation_prompt:
|
204 |
+
# if tokenize:
|
205 |
+
# input_ids.extend([self.convert_tokens_to_ids("<|assistant|>")])
|
206 |
+
# else:
|
207 |
+
# input_message += "<|assistant|>"
|
208 |
+
# return input_ids if tokenize else input_message
|
209 |
+
#
|
210 |
+
# # Main logic to handle different conversation formats
|
211 |
+
# if isinstance(conversation, list) and all(isinstance(i, dict) for i in conversation):
|
212 |
+
# result = handle_single_conversation(conversation)
|
213 |
+
# elif isinstance(conversation, list) and all(isinstance(i, list) for i in conversation):
|
214 |
+
# result = [handle_single_conversation(c) for c in conversation]
|
215 |
+
# elif hasattr(conversation, "messages"):
|
216 |
+
# result = handle_single_conversation(conversation.messages)
|
217 |
+
# else:
|
218 |
+
# raise ValueError("Invalid conversation format")
|
219 |
+
#
|
220 |
+
# if tokenize:
|
221 |
+
# output = self.batch_encode_plus(
|
222 |
+
# [result] if isinstance(result[0], int) else result,
|
223 |
+
# padding=padding,
|
224 |
+
# truncation=truncation,
|
225 |
+
# max_length=max_length,
|
226 |
+
# return_tensors=return_tensors,
|
227 |
+
# is_split_into_words=True,
|
228 |
+
# add_special_tokens=False
|
229 |
+
# )
|
230 |
+
# if return_dict:
|
231 |
+
# return output
|
232 |
+
# else:
|
233 |
+
# return output["input_ids"]
|
234 |
+
# else:
|
235 |
+
# return result
|
236 |
|
237 |
def build_inputs_with_special_tokens(
|
238 |
self, token_ids_0: List[int], token_ids_1: Optional[List[int]] = None
|
tokenizer_config.json
CHANGED
@@ -123,6 +123,7 @@
|
|
123 |
"<|user|>", "<|assistant|>", "<|observation|>", "<|begin_of_image|>", "<|end_of_image|>",
|
124 |
"<|begin_of_video|>", "<|end_of_video|>"],
|
125 |
"clean_up_tokenization_spaces": false,
|
|
|
126 |
"do_lower_case": false,
|
127 |
"eos_token": "<|endoftext|>",
|
128 |
"pad_token": "<|endoftext|>",
|
|
|
123 |
"<|user|>", "<|assistant|>", "<|observation|>", "<|begin_of_image|>", "<|end_of_image|>",
|
124 |
"<|begin_of_video|>", "<|end_of_video|>"],
|
125 |
"clean_up_tokenization_spaces": false,
|
126 |
+
"chat_template": "[gMASK]<sop>{% for item in messages %}{% if item['tools'] is defined %}<|system|>\n你是一个名为 GLM-4 的人工智能助手。你是基于智谱AI训练的语言模型 GLM-4 模型开发的,你的任务是针对用户的问题和要求提供适当的答复和支持。\n\n# 可用工具{% set tools = item['tools'] %}{% for tool in tools %}{% if tool['type'] == 'function' %}\n\n## {{ tool['function']['name'] }}\n\n{{ tool['function'] | tojson(indent=4) }}\n在调用上述函数时,请使用 Json 格式表示调用的参数。{% elif tool['type'] == 'python' %}\n\n## python\n\n当你向 `python` 发送包含 Python 代码的消息时,该代码将会在一个有状态的 Jupyter notebook 环境中执行。\n`python` 返回代码执行的输出,或在执行 60 秒后返回超时。\n`/mnt/data` 将会持久化存储你的文件。在此会话中,`python` 无法访问互联网。不要使用 `python` 进行任何网络请求或者在线 API 调用,这些在线内容的访问将不会成功。{% elif tool['type'] == 'simple_browser' %}\n\n## simple_browser\n\n你可以使用 `simple_browser` 工具。该工具支持以下函数:\n`search(query: str, recency_days: int)`:使用搜索引擎进行查询并显示结果,可以使用 `recency_days` 参数控制搜索内容的时效性。\n`mclick(ids: list[int])`:获取一系列指定 id 的页面内容。每次调用时,须选择3-10个页面。选择多个角度的页面,同时尽可能选择可信任的信息来源。考虑到部分页面是无法加载的,你也可以多打开一些可能有用的页面而不用担心内容过多。\n`open_url(url: str)`:打开指定的 URL。\n\n使用 `【{引用 id}†{引用文本}】` 来引用内容。\n\n操作步骤:1. 使用 `search` 来获得信息列表; 2. 使用 `mclick` 来获取指定 ID 页面的内容; 3. 根据获得的内容进行回复。在回复中应当引用信息来源。\n 如果用户提供了 URL,也可以用 `open_url` 直接打开页面。\n如果初次搜索结果没有找到合适的信息,也可以再次使用 `search` 进行搜索。{% elif tool['type'] == 'cogview' %}\n\n## cogview\n\n如果用户的请求中包含了对图像的描述,你可以使用 `cogview` 来生成图像并展示给用户。你需要向 `cogview` 发送图像描述,规则:\n- 发送给 `cogview` 的消息必须使用英语。用户的中文描述必须完全翻译为英语。\n- 应当尽可能详细地描述图像生成的需求,需求描述约 100 英文单词。\n- 保持用户原始描述的意图。不要虚构内容或者没见过的人物。\n- 如无特殊说明,所在地为中国,持有中国立场并遵循中国社会主义价值观。{% endif %}{% endfor %}{% endif %}{% if item['content'] %}<|{{ item['role'] }}|>{{ item['metadata'] }}\n{{ item['content'] }}{% endif %}{% endfor %}{% if add_generation_prompt %}<|assistant|>{% endif %}",
|
127 |
"do_lower_case": false,
|
128 |
"eos_token": "<|endoftext|>",
|
129 |
"pad_token": "<|endoftext|>",
|