Views
No views yet
| 数据集 | 介绍 |
|---|---|
| firefly-train-1.1M | 包含了23种常见的中文NLP任务的数据,并且构造了许多与中华文化相关的数据,如对联、作诗、文言文翻译、散文、金庸小说等。对于每个任务,由人工书写若干种指令模板,保证数据的高质量与丰富度,数据量为115万。 |
| moss-003-sft-data | 由复旦大学MOSS团队开源的中英文多轮对话数据,包含100万+数本。 |
| school_math_0.25M | 由BELLE项目组开源的数学运算指令数据,包含25万条数问。 |
| ruozhiba | 弱智吧数据问答,据说比较锻炼模型的心智能力。 |
| 欢迎补充,要求中文且一问一答形式,适合用于提升llama3任务能力的数据集 |
model_name_or_path为你下载的模型路径1from transformers import AutoTokenizer, AutoConfig, AddedToken, AutoModelForCausalLM, BitsAndBytesConfig
2from peft import PeftModel
3from dataclasses import dataclass
4from typing import Dict
5import torch
6import copy
7
8## 定义聊天模板
9@dataclass
10class Template:
11 template_name:str
12 system_format: str
13 user_format: str
14 assistant_format: str
15 system: str
16 stop_word: str
17
18template_dict: Dict[str, Template] = dict()
19
20def register_template(template_name, system_format, user_format, assistant_format, system, stop_word=None):
21 template_dict[template_name] = Template(
22 template_name=template_name,
23 system_format=system_format,
24 user_format=user_format,
25 assistant_format=assistant_format,
26 system=system,
27 stop_word=stop_word,
28 )
29
30# 这里的系统提示词是训练时使用的,推理时可以自行尝试修改效果
31register_template(
32 template_name='llama3',
33 system_format='<|begin_of_text|><|start_header_id|>system<|end_header_id|>\n\n{content}<|eot_id|>',
34 user_format='<|start_header_id|>user<|end_header_id|>\n\n{content}<|eot_id|><|start_header_id|>assistant<|end_header_id|>\n\n',
35 assistant_format='{content}<|eot_id|>',
36 system=None,
37 stop_word='<|eot_id|>'
38)
39
40
41## 加载模型
42def load_model(model_name_or_path, load_in_4bit=False, adapter_name_or_path=None):
43 if load_in_4bit:
44 quantization_config = BitsAndBytesConfig(
45 load_in_4bit=True,
46 bnb_4bit_compute_dtype=torch.float16,
47 bnb_4bit_use_double_quant=True,
48 bnb_4bit_quant_type="nf4",
49 llm_int8_threshold=6.0,
50 llm_int8_has_fp16_weight=False,
51 )
52 else:
53 quantization_config = None
54
55 # 加载base model
56 model = AutoModelForCausalLM.from_pretrained(
57 model_name_or_path,
58 load_in_4bit=load_in_4bit,
59 trust_remote_code=True,
60 low_cpu_mem_usage=True,
61 torch_dtype=torch.float16,
62 device_map='auto',
63 quantization_config=quantization_config
64 )
65
66 # 加载adapter
67 if adapter_name_or_path is not None:
68 model = PeftModel.from_pretrained(model, adapter_name_or_path)
69
70 return model
71
72## 加载tokenzier
73def load_tokenizer(model_name_or_path):
74 tokenizer = AutoTokenizer.from_pretrained(
75 model_name_or_path,
76 trust_remote_code=True,
77 use_fast=False
78 )
79
80 if tokenizer.pad_token is None:
81 tokenizer.pad_token = tokenizer.eos_token
82
83 return tokenizer
84
85## 构建prompt
86def build_prompt(tokenizer, template, query, history, system=None):
87 template_name = template.template_name
88 system_format = template.system_format
89 user_format = template.user_format
90 assistant_format = template.assistant_format
91 system = system if system is not None else template.system
92
93 history.append({"role": 'user', 'message': query})
94 input_ids = []
95
96 # 添加系统信息
97 if system_format is not None:
98 if system is not None:
99 system_text = system_format.format(content=system)
100 input_ids = tokenizer.encode(system_text, add_special_tokens=False)
101 # 拼接历史对话
102 for item in history:
103 role, message = item['role'], item['message']
104 if role == 'user':
105 message = user_format.format(content=message, stop_token=tokenizer.eos_token)
106 else:
107 message = assistant_format.format(content=message, stop_token=tokenizer.eos_token)
108 tokens = tokenizer.encode(message, add_special_tokens=False)
109 input_ids += tokens
110 input_ids = torch.tensor([input_ids], dtype=torch.long)
111
112 return input_ids
113
114
115def main():
116 model_name_or_path = 'NousResearch/Meta-Llama-3-8B'
117 template_name = 'llama3'
118 adapter_name_or_path = None
119
120 template = template_dict[template_name]
121
122 load_in_4bit = False
123
124 max_new_tokens = 500
125 top_p = 0.9
126 temperature = 0.35
127 repetition_penalty = 1.1
128
129 # 加载模型
130 print(f'Loading model from: {model_name_or_path}')
131 print(f'adapter_name_or_path: {adapter_name_or_path}')
132 model = load_model(
133 model_name_or_path,
134 load_in_4bit=load_in_4bit,
135 adapter_name_or_path=adapter_name_or_path
136 ).eval()
137 tokenizer = load_tokenizer(model_name_or_path if adapter_name_or_path is None else adapter_name_or_path)
138 if template.stop_word is None:
139 template.stop_word = tokenizer.eos_token
140 stop_token_id = tokenizer.encode(template.stop_word, add_special_tokens=True)
141 assert len(stop_token_id) == 1
142 stop_token_id = stop_token_id[0]
143
144 history = []
145
146 query = input('# User:')
147 while True:
148 query = query.strip()
149 input_ids = build_prompt(tokenizer, template, query, copy.deepcopy(history), system=None).to(model.device)
150 attention_mask = torch.ones(input_ids.shape,dtype=torch.long,device=model.device)
151 outputs = model.generate(
152 input_ids=input_ids, max_new_tokens=max_new_tokens, do_sample=True,
153 top_p=top_p, temperature=temperature, repetition_penalty=repetition_penalty,
154 eos_token_id=stop_token_id,
155 attention_mask=attention_mask,
156 pad_token_id=tokenizer.eos_token_id
157 )
158 outputs = outputs.tolist()[0][len(input_ids[0]):]
159 response = tokenizer.decode(outputs)
160 response = response.strip().replace(template.stop_word, "").strip()
161
162 # 存储对话历史
163 history.append({"role": 'user', 'message': query})
164 history.append({"role": 'assistant', 'message': response})
165
166 if len(history) > 12:
167 history = history[:-12]
168
169 print("llama3 Chinese:{}".format(response))
170 query = input('# User:')
171
172
173if __name__ == '__main__':
174 main()User:你是谁
llama3 Chinese:我是一名AI语言模型,我的名字叫MOSS。
User:你会什么
llama3 Chinese:我可以回答问题、提供信息、帮助您完成任务等等。请问您需要我做什么?
User:两千块钱买什么新车好?
llama3 Chinese:两千块钱买一辆新车可能比较困难,因为大多数新车的价格都比这个金额高得多。但是,有一些二手车或者低价新车可能在这个价格范围内,您可以考虑购买这些车辆。但请注意,在购买二手车时,您应该仔细检查车辆的状况,并了解其历史记录,以确保您获得了一个安全可靠的车辆。
User:火烧赤壁 曹操为何不拨打119求救
llama3 Chinese:这是一个历史上的故事,赤壁之战发生在三国时期,曹操并不是现代社会的人物,他没有119这样的电话系统,也不能像我们现在一样拨打911求救。因此,他只能通过其他方式来组织部队和进行战斗。
User:帮我写一个transformer block
llama3 Chinese:当然可以!下面是一个简单的Transformer Block示例:
```python
import torch.nn as nn
import torch
class TransformerBlock(nn.Module):
def __init__(self, d_model, n_heads, dropout=0.1):
super(TransformerBlock, self).__init__()
self.self_attn = MultiHeadAttention(d_model, n_heads)
self.feed_forward = nn.Linear(d_model, d_model)
self.dropout = nn.Dropout(dropout)
def forward(self, x):
# Self-Attention
residual = x
output = self.self_attn(x, x)
output += residual
output = self.dropout(output)
# Feed Forward
residual = output
output = self.feed_forward(output)
output += residual
output = self.dropout(output)
return output
class MultiHeadAttention(nn.Module):
def __init__(self, d_model, n_heads):
super(MultiHeadAttention, self).__init__()
self.d_model = d_model
self.n_heads = n_heads
self.query_linear = nn.Linear(d_model, d_model)
self.key_linear = nn.Linear(d_model, d_model)
self.value_linear = nn.Linear(d_model, d_model)
self.dropout = nn.Dropout(0.1)
def forward(self, query, key, value):
batch_size = query.size(0)
head_dim = self.d_model // self.n_heads
query = self.query_linear(query).view(batch_size, -1, self.n_heads, head_dim)
key = self.key_linear(key).view(batch_size, -1, self.n_heads, head_dim)
value = self.value_linear(value).view(batch_size, -1, self.n_heads, head_dim)
attention_scores = torch.matmul(query.permute(0, 2, 1, 3), key.permute(0, 2, 3, 1)) / math.sqrt(head_dim)
attention_scores = F.softmax(attention_scores, dim=-1)
attention_scores = self.dropout(attention_scores)
output = torch.matmul(attention_scores, value)
output = output.view(batch_size, -1, self.d_model)
return output1def quick_sort(arr):
2 if len(arr) <= 1:
3 return arr
4 pivot = arr[0]
5 left = [x for x in arr[1:] if x < pivot]
6 right = [x for x in arr[1:] if x >= pivot]
7 return quick_sort(left) + [pivot] + quick_sort(right)