Views
No views yet
1from transformers import AutoModelForCausalLM, AutoTokenizer
2import torch
3"""
4单轮对话,不具有对话历史的记忆功能
5"""
6
7
8def main():
9 model_name = 'YeungNLP/firefly-chatglm2-6b'
10
11 max_new_tokens = 500
12 top_p = 0.9
13 temperature = 0.35
14 repetition_penalty = 1.0
15 device = 'cuda'
16 model = AutoModelForCausalLM.from_pretrained(
17 model_name,
18 trust_remote_code=True,
19 low_cpu_mem_usage=True,
20 torch_dtype=torch.float16,
21 device_map='auto'
22 ).to(device).eval()
23 tokenizer = AutoTokenizer.from_pretrained(
24 model_name,
25 trust_remote_code=True,
26 # llama不支持fast
27 use_fast=False if model.config.model_type == 'llama' else True
28 )
29 # QWenTokenizer比较特殊,pad_token_id、bos_token_id、eos_token_id均为None。eod_id对应的token为<|endoftext|>
30 if tokenizer.__class__.__name__ == 'QWenTokenizer':
31 tokenizer.pad_token_id = tokenizer.eod_id
32 tokenizer.bos_token_id = tokenizer.eod_id
33 tokenizer.eos_token_id = tokenizer.eod_id
34
35 text = input('User:')
36 while True:
37 text = text.strip()
38 # chatglm使用官方的数据组织格式
39 if model.config.model_type == 'chatglm':
40 text = '[Round 1]\n\n问:{}\n\n答:'.format(text)
41 input_ids = tokenizer(text, return_tensors="pt", add_special_tokens=False).input_ids.to(device)
42 # 为了兼容qwen-7b,因为其对eos_token进行tokenize,无法得到对应的eos_token_id
43 else:
44 input_ids = tokenizer(text, return_tensors="pt", add_special_tokens=False).input_ids.to(device)
45 bos_token_id = torch.tensor([[tokenizer.bos_token_id]], dtype=torch.long).to(device)
46 eos_token_id = torch.tensor([[tokenizer.eos_token_id]], dtype=torch.long).to(device)
47 input_ids = torch.concat([bos_token_id, input_ids, eos_token_id], dim=1)
48 with torch.no_grad():
49 outputs = model.generate(
50 input_ids=input_ids, max_new_tokens=max_new_tokens, do_sample=True,
51 top_p=top_p, temperature=temperature, repetition_penalty=repetition_penalty,
52 eos_token_id=tokenizer.eos_token_id
53 )
54 outputs = outputs.tolist()[0][len(input_ids[0]):]
55 response = tokenizer.decode(outputs)
56 response = response.strip().replace(tokenizer.eos_token, "").strip()
57 print("Firefly:{}".format(response))
58 text = input('User:')
59
60
61if __name__ == '__main__':
62 main()1from transformers import AutoModelForCausalLM, AutoTokenizer
2import torch
3
4
5def main():
6 model_name = 'YeungNLP/firefly-chatglm2-6b'
7
8 device = 'cuda'
9 max_new_tokens = 500 # 每轮对话最多生成多少个token
10 history_max_len = 1000 # 模型记忆的最大token长度
11 top_p = 0.9
12 temperature = 0.35
13 repetition_penalty = 1.0
14
15 # 加载模型
16 model = AutoModelForCausalLM.from_pretrained(
17 model_name,
18 trust_remote_code=True,
19 low_cpu_mem_usage=True,
20 torch_dtype=torch.float16,
21 device_map='auto'
22 ).to(device).eval()
23 tokenizer = AutoTokenizer.from_pretrained(
24 model_name,
25 trust_remote_code=True,
26 # llama不支持fast
27 use_fast=False if model.config.model_type == 'llama' else True
28 )
29 # QWenTokenizer比较特殊,pad_token_id、bos_token_id、eos_token_id均为None。eod_id对应的token为<|endoftext|>
30 if tokenizer.__class__.__name__ == 'QWenTokenizer':
31 tokenizer.pad_token_id = tokenizer.eod_id
32 tokenizer.bos_token_id = tokenizer.eod_id
33 tokenizer.eos_token_id = tokenizer.eod_id
34
35 # 记录所有历史记录
36 if model.config.model_type != 'chatglm':
37 history_token_ids = torch.tensor([[tokenizer.bos_token_id]], dtype=torch.long)
38 else:
39 history_token_ids = torch.tensor([[]], dtype=torch.long)
40
41 # 开始对话
42 utterance_id = 0 # 记录当前是第几轮对话,为了契合chatglm的数据组织格式
43 user_input = input('User:')
44 while True:
45 utterance_id += 1
46 # chatglm使用官方的数据组织格式
47 if model.config.model_type == 'chatglm':
48 user_input = '[Round {}]\n\n问:{}\n\n答:'.format(utterance_id, user_input)
49 user_input_ids = tokenizer(user_input, return_tensors="pt", add_special_tokens=False).input_ids
50 # firefly的数据组织格式
51 # 为了兼容qwen-7b,因为其对eos_token进行tokenize,无法得到对应的eos_token_id
52 else:
53 input_ids = tokenizer(user_input, return_tensors="pt", add_special_tokens=False).input_ids
54 eos_token_id = torch.tensor([[tokenizer.eos_token_id]], dtype=torch.long)
55 user_input_ids = torch.concat([input_ids, eos_token_id], dim=1)
56 history_token_ids = torch.concat((history_token_ids, user_input_ids), dim=1)
57 model_input_ids = history_token_ids[:, -history_max_len:].to(device)
58 with torch.no_grad():
59 outputs = model.generate(
60 input_ids=model_input_ids, max_new_tokens=max_new_tokens, do_sample=True, top_p=top_p,
61 temperature=temperature, repetition_penalty=repetition_penalty, eos_token_id=tokenizer.eos_token_id
62 )
63 model_input_ids_len = model_input_ids.size(1)
64 response_ids = outputs[:, model_input_ids_len:]
65 history_token_ids = torch.concat((history_token_ids, response_ids.cpu()), dim=1)
66 response = tokenizer.batch_decode(response_ids)
67 print("Firefly:" + response[0].strip().replace(tokenizer.eos_token, ""))
68 user_input = input('User:')
69
70
71if __name__ == '__main__':
72 main()