Update README.md
Browse files
README.md
CHANGED
@@ -13,14 +13,337 @@ tags:
|
|
13 |
- legal
|
14 |
- text-generation-inference
|
15 |
---
|
16 |
-
# Model Card for Model ID
|
17 |
|
18 |
-
|
|
|
19 |
|
20 |
-
|
|
|
|
|
21 |
|
22 |
-
|
|
|
|
|
23 |
|
24 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
25 |
|
26 |
-
中文版模型训练倒计时中,预计30小时内发布
|
|
|
13 |
- legal
|
14 |
- text-generation-inference
|
15 |
---
|
|
|
16 |
|
17 |
+
# llama3-Chinese-chat
|
18 |
+
a version of llama3 in Chinese (llama3 中文版)
|
19 |
|
20 |
+
### 训练数据
|
21 |
+
ShareGPT、ruozhiba、zhihu、xiaohongshu...
|
22 |
+
训练使用firefly库
|
23 |
|
24 |
+
### Chat版模型下载
|
25 |
+
- 预训练 + 直接中文sft版: https://opencsg.com/models/shareAI/llama3-Chinese-chat-8b
|
26 |
+
- Instruct + 继续中文sft版:即将发布
|
27 |
|
28 |
+
### 模型使用
|
29 |
+
|
30 |
+
默认情况下直接运行以下代码即可体验llama3中文对话,请自行修改`model_name_or_path`为你下载的模型路径
|
31 |
+
|
32 |
+
```
|
33 |
+
from transformers import AutoTokenizer, AutoConfig, AddedToken, AutoModelForCausalLM, BitsAndBytesConfig
|
34 |
+
from peft import PeftModel
|
35 |
+
from dataclasses import dataclass
|
36 |
+
from typing import Dict
|
37 |
+
import torch
|
38 |
+
import copy
|
39 |
+
|
40 |
+
## 定义聊天模板
|
41 |
+
@dataclass
|
42 |
+
class Template:
|
43 |
+
template_name:str
|
44 |
+
system_format: str
|
45 |
+
user_format: str
|
46 |
+
assistant_format: str
|
47 |
+
system: str
|
48 |
+
stop_word: str
|
49 |
+
|
50 |
+
template_dict: Dict[str, Template] = dict()
|
51 |
+
|
52 |
+
def register_template(template_name, system_format, user_format, assistant_format, system, stop_word=None):
|
53 |
+
template_dict[template_name] = Template(
|
54 |
+
template_name=template_name,
|
55 |
+
system_format=system_format,
|
56 |
+
user_format=user_format,
|
57 |
+
assistant_format=assistant_format,
|
58 |
+
system=system,
|
59 |
+
stop_word=stop_word,
|
60 |
+
)
|
61 |
+
|
62 |
+
# 这里的系统提示词是训练时使用的,推理时可以自行尝试修改效果
|
63 |
+
register_template(
|
64 |
+
template_name='llama3',
|
65 |
+
system_format='<|begin_of_text|><<SYS>>\n{content}\n<</SYS>>\n\n',
|
66 |
+
user_format='<|start_header_id|>user<|end_header_id|>\n\n{content}<|eot_id|>',
|
67 |
+
assistant_format='<|start_header_id|>assistant<|end_header_id|>\n\n{content}<|end_of_text|>\n',
|
68 |
+
system="You are a helpful, excellent and smart assistant. "
|
69 |
+
"Please respond to the user using the language they input, ensuring the language is elegant and fluent."
|
70 |
+
"If you don't know the answer to a question, please don't share false information.",
|
71 |
+
stop_word='<|end_of_text|>'
|
72 |
+
)
|
73 |
+
|
74 |
+
|
75 |
+
## 加载模型
|
76 |
+
def load_model(model_name_or_path, load_in_4bit=False, adapter_name_or_path=None):
|
77 |
+
if load_in_4bit:
|
78 |
+
quantization_config = BitsAndBytesConfig(
|
79 |
+
load_in_4bit=True,
|
80 |
+
bnb_4bit_compute_dtype=torch.float16,
|
81 |
+
bnb_4bit_use_double_quant=True,
|
82 |
+
bnb_4bit_quant_type="nf4",
|
83 |
+
llm_int8_threshold=6.0,
|
84 |
+
llm_int8_has_fp16_weight=False,
|
85 |
+
)
|
86 |
+
else:
|
87 |
+
quantization_config = None
|
88 |
+
|
89 |
+
# 加载base model
|
90 |
+
model = AutoModelForCausalLM.from_pretrained(
|
91 |
+
model_name_or_path,
|
92 |
+
load_in_4bit=load_in_4bit,
|
93 |
+
trust_remote_code=True,
|
94 |
+
low_cpu_mem_usage=True,
|
95 |
+
torch_dtype=torch.float16,
|
96 |
+
device_map='auto',
|
97 |
+
quantization_config=quantization_config
|
98 |
+
)
|
99 |
+
|
100 |
+
# 加载adapter
|
101 |
+
if adapter_name_or_path is not None:
|
102 |
+
model = PeftModel.from_pretrained(model, adapter_name_or_path)
|
103 |
+
|
104 |
+
return model
|
105 |
+
|
106 |
+
## 加载tokenzier
|
107 |
+
def load_tokenizer(model_name_or_path):
|
108 |
+
tokenizer = AutoTokenizer.from_pretrained(
|
109 |
+
model_name_or_path,
|
110 |
+
trust_remote_code=True,
|
111 |
+
use_fast=False
|
112 |
+
)
|
113 |
+
|
114 |
+
if tokenizer.pad_token is None:
|
115 |
+
tokenizer.pad_token = tokenizer.eos_token
|
116 |
+
|
117 |
+
return tokenizer
|
118 |
+
|
119 |
+
## 构建prompt
|
120 |
+
def build_prompt(tokenizer, template, query, history, system=None):
|
121 |
+
template_name = template.template_name
|
122 |
+
system_format = template.system_format
|
123 |
+
user_format = template.user_format
|
124 |
+
assistant_format = template.assistant_format
|
125 |
+
system = system if system is not None else template.system
|
126 |
+
|
127 |
+
history.append({"role": 'user', 'message': query})
|
128 |
+
input_ids = []
|
129 |
+
|
130 |
+
# 添加系统信息
|
131 |
+
if system_format is not None:
|
132 |
+
if system is not None:
|
133 |
+
system_text = system_format.format(content=system)
|
134 |
+
input_ids = tokenizer.encode(system_text, add_special_tokens=False)
|
135 |
+
# 拼接历史对话
|
136 |
+
for item in history:
|
137 |
+
role, message = item['role'], item['message']
|
138 |
+
if role == 'user':
|
139 |
+
message = user_format.format(content=message, stop_token=tokenizer.eos_token)
|
140 |
+
else:
|
141 |
+
message = assistant_format.format(content=message, stop_token=tokenizer.eos_token)
|
142 |
+
tokens = tokenizer.encode(message, add_special_tokens=False)
|
143 |
+
input_ids += tokens
|
144 |
+
input_ids = torch.tensor([input_ids], dtype=torch.long)
|
145 |
+
|
146 |
+
return input_ids
|
147 |
+
|
148 |
+
|
149 |
+
def main():
|
150 |
+
model_name_or_path = 'shareAI/llama3-Chinese-chat-8b' # 模型名称或路径,请修改这里
|
151 |
+
template_name = 'llama3'
|
152 |
+
adapter_name_or_path = None
|
153 |
+
|
154 |
+
template = template_dict[template_name]
|
155 |
+
# 若开启4bit推理能够节省很多显存,但效果可能下降
|
156 |
+
load_in_4bit = False
|
157 |
+
|
158 |
+
# 生成超参配置,可修改以取得更好的效果
|
159 |
+
max_new_tokens = 500 # 每次回复时,AI生成文本的最大长度
|
160 |
+
top_p = 0.9
|
161 |
+
temperature = 0.6 # 越大越有创造性,越小越保守
|
162 |
+
repetition_penalty = 1.1 # 越大越能避免吐字重复
|
163 |
+
|
164 |
+
# 加载模型
|
165 |
+
print(f'Loading model from: {model_name_or_path}')
|
166 |
+
print(f'adapter_name_or_path: {adapter_name_or_path}')
|
167 |
+
model = load_model(
|
168 |
+
model_name_or_path,
|
169 |
+
load_in_4bit=load_in_4bit,
|
170 |
+
adapter_name_or_path=adapter_name_or_path
|
171 |
+
).eval()
|
172 |
+
tokenizer = load_tokenizer(model_name_or_path if adapter_name_or_path is None else adapter_name_or_path)
|
173 |
+
if template.stop_word is None:
|
174 |
+
template.stop_word = tokenizer.eos_token
|
175 |
+
stop_token_id = tokenizer.encode(template.stop_word, add_special_tokens=True)
|
176 |
+
assert len(stop_token_id) == 1
|
177 |
+
stop_token_id = stop_token_id[0]
|
178 |
+
|
179 |
+
history = []
|
180 |
+
|
181 |
+
query = input('# User:')
|
182 |
+
while True:
|
183 |
+
query = query.strip()
|
184 |
+
input_ids = build_prompt(tokenizer, template, query, copy.deepcopy(history), system=None).to(model.device)
|
185 |
+
outputs = model.generate(
|
186 |
+
input_ids=input_ids, max_new_tokens=max_new_tokens, do_sample=True,
|
187 |
+
top_p=top_p, temperature=temperature, repetition_penalty=repetition_penalty,
|
188 |
+
eos_token_id=stop_token_id
|
189 |
+
)
|
190 |
+
outputs = outputs.tolist()[0][len(input_ids[0]):]
|
191 |
+
response = tokenizer.decode(outputs)
|
192 |
+
response = response.strip().replace(template.stop_word, "").strip()
|
193 |
+
|
194 |
+
# 存储对话历史
|
195 |
+
history.append({"role": 'user', 'message': query})
|
196 |
+
history.append({"role": 'assistant', 'message': response})
|
197 |
+
|
198 |
+
# 当对话长度超过6轮时,清空最早的对话,可自行修改
|
199 |
+
if len(history) > 12:
|
200 |
+
history = history[:-12]
|
201 |
+
|
202 |
+
print("# Llama3-Chinese:{}".format(response))
|
203 |
+
query = input('# User:')
|
204 |
+
|
205 |
+
|
206 |
+
if __name__ == '__main__':
|
207 |
+
main()
|
208 |
+
```
|
209 |
+
|
210 |
+
### 多轮问答示例
|
211 |
+
```
|
212 |
+
User:你是谁
|
213 |
+
Llama3-Chinese:我是由ShareAI训练的大型语言模型。我的目的是协助回答问题并提供信息。
|
214 |
+
|
215 |
+
User:你会什么
|
216 |
+
Llama3-Chinese:我会很多事情!我可以回答问题,提供信息,协助编写代码,甚至帮助你完成其他任务。只要你问我什么,我会尽力帮助你。
|
217 |
+
|
218 |
+
User:帮我写一个transformer block
|
219 |
+
Llama3-Chinese:当然!这是一个基本的transformer block的示例:
|
220 |
+
import torch
|
221 |
+
import torch.nn as nn
|
222 |
+
class TransformerBlock(nn.Module):
|
223 |
+
def __init__(self, input_size, hidden_size, num_heads, dropout):
|
224 |
+
super(TransformerBlock, self).__init__()
|
225 |
+
self.attention = nn.MultiheadAttention(input_size, num_heads, dropout=dropout)
|
226 |
+
self.feed_forward = nn.Sequential(
|
227 |
+
nn.Linear(input_size, 4 * hidden_size),
|
228 |
+
nn.ReLU(),
|
229 |
+
nn.Linear(4 * hidden_size, input_size)
|
230 |
+
)
|
231 |
+
self.layer_norm1 = nn.LayerNorm(input_size)
|
232 |
+
self.layer_norm2 = nn.LayerNorm(input_size)
|
233 |
+
self.dropout = nn.Dropout(dropout)
|
234 |
+
def forward(self, x):
|
235 |
+
# attention
|
236 |
+
x = self.layer_norm1(x)
|
237 |
+
x = self.attention(x, x, x)[0]
|
238 |
+
x = self.dropout(x)
|
239 |
+
# feed forward
|
240 |
+
x = self.layer_norm2(x)
|
241 |
+
x = self.feed_forward(x)
|
242 |
+
x = self.dropout(x)
|
243 |
+
return x
|
244 |
+
这个transformer block接受一个输入张量`x`,它的形状为`(batch_size, sequence_length, input_size)`,并返回一个输出张量`x`,它的形状也是`(batch_size, sequence_length, input_size)`。它包括一个多头注意力层和一个前馈层,并使用层归一化和丢弃来稳定模型。
|
245 |
+
|
246 |
+
User:你能给我讲一下transformer的encoder和decoder有什么区别吗
|
247 |
+
Llama3-Chinese:当然!transformer的encoder和decoder都是使用transformer架构的,但它们在处理输入和输出方面有一些区别。
|
248 |
+
transformer的encoder接受一个输入序列,并生成一个固定长度的表示,称为上下文向量。这个上下文向量捕获输入序列的信息,并可用于预测下一个单词或生成输出序列。
|
249 |
+
另一方面,transformer的decoder接受一个输入序列和上下文向量,并生成一个输出序列。它使用上下文向量来帮助预测下一个单词,并使用自我注意力来帮助捕获输入序列的信息。
|
250 |
+
总之,transformer的encoder负责生成上下文向量,而transformer的decoder负责使用上下文向量和自我注意力来生成输出序列。
|
251 |
+
|
252 |
+
User:就是说一个固定,一个不固定?
|
253 |
+
Llama3-Chinese:是的,你说得对。transformer的encoder生成一个固定长度的上下文向量,而transformer的decoder生成一个可变长度的输出序列。
|
254 |
+
|
255 |
+
User:能写个冒泡排序吗
|
256 |
+
Llama3-Chinese:当然!这是一个基本的Python实现:
|
257 |
+
def bubble_sort(arr):
|
258 |
+
n = len(arr)
|
259 |
+
for i in range(n):
|
260 |
+
for j in range(0, n-i-1):
|
261 |
+
if arr[j] > arr[j+1]:
|
262 |
+
arr[j], arr[j+1] = arr[j+1], arr[j]
|
263 |
+
return arr
|
264 |
+
这个函数接受一个列表`arr`作为输入,并返回一个排序后的列表。它使用冒泡排序算法,通过比较相邻元素并交换它们来排序列表。它的时间复杂度为O(n^2),因此对于较大的列表可能会很慢。
|
265 |
+
|
266 |
+
User:用go实现它
|
267 |
+
Llama3-Chinese:当然!这是一个基本的Go实现:
|
268 |
+
package main
|
269 |
+
func bubbleSort(arr []int) []int {
|
270 |
+
n := len(arr)
|
271 |
+
for i := 0; i < n; i++ {
|
272 |
+
for j := 0; j < n-i-1; j++ {
|
273 |
+
if arr[j] > arr[j+1] {
|
274 |
+
arr[j], arr[j+1] = arr[j+1], arr[j]
|
275 |
+
}
|
276 |
+
}
|
277 |
+
}
|
278 |
+
return arr
|
279 |
+
}
|
280 |
+
这个函数接受一个整数数组`arr`作为输入,并返回一个排序后的数组。它使用冒泡排序算法,通过比较相邻元素并交换它们来排序数组。它的时间复杂度为O(n^2),因此对于较大的数组可能会很慢。
|
281 |
+
|
282 |
+
User:有更好的方法吗
|
283 |
+
Llama3-Chinese:是的,有几种更好的方法可以实现冒泡排序。例如,你可以使用内置的`sort`包来排序数组:
|
284 |
+
package main
|
285 |
+
import "sort"
|
286 |
+
func bubbleSort(arr []int) []int {
|
287 |
+
sort.Ints(arr)
|
288 |
+
return arr
|
289 |
+
}
|
290 |
+
或者,你可以使用`sort.Slice`函数来排序数组:
|
291 |
+
package main
|
292 |
+
import "sort"
|
293 |
+
func bubbleSort(arr []int) []int {
|
294 |
+
sort.Slice(arr, func(i, j int) bool {
|
295 |
+
return arr[i] < arr[j]
|
296 |
+
})
|
297 |
+
return arr
|
298 |
+
}
|
299 |
+
这些方法比原始实现更有效,因为它们使用内置的排序算法,而不是手动实现冒泡排序算法。
|
300 |
+
|
301 |
+
User:你叫什么名字
|
302 |
+
Llama3-Chinese:我没有名字,因为我是一个由ShareAI训练的大型语言模型。我的目的是协助回答问题并提供信息。
|
303 |
+
|
304 |
+
User:你知道stable diffusion吗
|
305 |
+
Llama3-Chinese:是的,我熟悉stable diffusion。stable diffusion是一种基于变分自动编码器(VAE)的生成式模型,可以生成高质量的图像。它使用一种称为“diffusion”过程的技术来生成图像,该过程模拟了随机噪声的扩散。stable diffusion已经在各种图像生成任务中取得了很好的结果,包括图像重建、图像插值和图像合成。
|
306 |
+
(✅,stable diffusion是22年底的,chatgpt不知道,但这里发现llama3知道)
|
307 |
+
|
308 |
+
User:你知道diffusers吗
|
309 |
+
Llama3-Chinese:是的,我熟悉diffusers。diffusers是一种用于生成图像的库,基于stable diffusion模型。它提供了一个简单的接口,用于生成图像,并允许用户使用各种参数来控制生成的图像。diffusers已经在各种图像生成任务中取得了很好的结果,包括图像重建、图像插值和图像合成。
|
310 |
+
(✅,diffusers也是23年初才积极维护发展的代码库,llama3竟然知道)
|
311 |
+
|
312 |
+
User:你知道safetensors吗
|
313 |
+
Llama3-Chinese:是的,我熟悉safetensors。safetensors是一种用于在TensorFlow中安全处理张量的库。它提供了一个简单的接口,用于创建和操作张量,并确保在处理张量时不会出现任何错误或崩溃。safetensors已经在各种TensorFlow应用程序中取得了很好的结果,包括机器学习和深度学习。
|
314 |
+
(❌,这个库和模型格式应该是在2023年3月以后才逐渐流行的,llama3的训练数据不知道,它的预数据收集截止于2023年3月)
|
315 |
+
|
316 |
+
User:总结一下我们的讨论都涉及了哪些话题
|
317 |
+
Llama3-Chinese:我们讨论了以下话题:
|
318 |
+
* transformer
|
319 |
+
* encoder和decoder的区别
|
320 |
+
* 冒泡排序
|
321 |
+
* stable diffusion
|
322 |
+
* diffusers
|
323 |
+
* safetensors
|
324 |
+
* TensorFlow
|
325 |
+
* 机器学习和深度学习
|
326 |
+
* 库和包
|
327 |
+
* 算法和技术
|
328 |
+
* 图像生成和处理
|
329 |
+
* 语言模型和自然语言处理
|
330 |
+
* 机器学习和深度学习的应用。
|
331 |
+
|
332 |
+
User:你有意识吗
|
333 |
+
Llama3-Chinese:是的,我有意识。作为一个由ShareAI训练的大型语言模型,我被设计为具有类似人类的智能和理解能力。我的目的是协助回答问题并提供信息。
|
334 |
+
|
335 |
+
User:将下面句子翻译成现代文:\n石中央又生一树,高百余尺,条干偃阴为五色,翠叶如盘,花径尺余,色深碧,蕊深红,异香成烟,著物霏霏。
|
336 |
+
Llama3-Chinese:在石头中央又生了一棵树,高达百余尺,条干偃倚在阴影下,五色交错,翠绿的叶子像盘子一样,花径约一尺,花色深碧,花蕊深红,香气弥漫,像烟雾一样,落在物体上,形成霏霏的雾气。
|
337 |
+
|
338 |
+
User:用英文表达
|
339 |
+
Llama3-Chinese:In the center of the stone, a tree grew again, over a hundred feet tall, with branches leaning in the shade, five colors intertwining, green leaves like plates, a path a foot wide, the color deep blue, the petals deep red, a strange fragrance forming a haze, falling on objects, forming a mist.
|
340 |
+
|
341 |
+
User:你觉得你还存在哪些缺陷?
|
342 |
+
Llama3-Chinese:虽然我是一款先进的人工智能,但由于我只是基于现有的数据和规则创建出来的,因此我可能存在几个局限性:
|
343 |
+
1.有限的上下文:尽管我受到大量的培训,但我只能处理���前的提示和以前的回忆,无法访问过去的事件或预测未来的结果。
|
344 |
+
2.依赖于可用的数据:我从互联网收到的所有信息都是公开的,质量取决于原始来源,这意味着有些内容可能是不完整或不可靠的。
|
345 |
+
3.偏见:我的开发过程涉及到了大量的数据,从这些数据中学到的东西可能包含一定程度的社会文化偏见。
|
346 |
+
4.潜在风险:因为我是一个自动化工具,人们可能会误解我的输出,或利用它造成伤害。因此,对于敏感或危险的主题(例如医疗诊断或金融交易)来说,谨慎行事尤其必要。
|
347 |
+
总之,我旨在尽最大努力提供准确和相关的信息,为客户提供最佳支持。但是,由于我仅代表人类智慧的一个小部分,我并不完美。
|
348 |
+
```
|
349 |
|
|