Views
No views yet
1
2!pip install -U bitsandbytes
3!pip install -U transformers
4!pip install -U accelerate
5!pip install -U datasets
6!pip install -U peft
7
8from transformers import (
9 AutoModelForCausalLM,
10 AutoTokenizer,
11 BitsAndBytesConfig,
12)
13from peft import PeftModel
14import torch
15from tqdm import tqdm
16import json
17
18# Hugging Faceで取得したTokenをこちらに貼る。
19HF_TOKEN = "your_token"
20
21# ベースとなるモデルと学習したLoRAのアダプタ。
22model_id = "llm-jp/llm-jp-3-13b"
23adapter_id = "morizon/llm-jp-3-13b_mix_30000_1209"
24
25# QLoRA config
26bnb_config = BitsAndBytesConfig(
27 load_in_4bit=True,
28 bnb_4bit_quant_type="nf4",
29 bnb_4bit_compute_dtype=torch.bfloat16,
30)
31
32# Load model
33model = AutoModelForCausalLM.from_pretrained(
34 model_id,
35 quantization_config=bnb_config,
36 device_map="auto",
37 token = HF_TOKEN
38)
39
40# Load tokenizer
41tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True, token = HF_TOKEN)
42
43# 元のモデルにLoRAのアダプタを統合。
44model = PeftModel.from_pretrained(model, adapter_id, token = HF_TOKEN)
45
46# モデルを評価モード(推論モード)に切り替える
47model.eval()
48
49# データセットの読み込み。
50datasets = []
51with open("./elyza-tasks-100-TV_0.jsonl", "r") as f:
52 item = ""
53 for line in f:
54 line = line.strip()
55 item += line
56 if item.endswith("}"):
57 datasets.append(json.loads(item))
58 item = ""
59
60
61# システムプロンプト(固定の指示)
62system_prompt = """
63あなたはユーザが知りたいことを正確に把握し、的確に回答するアシスタントです。
641. 指示に従う際は、必ずその内容を完全に理解し、結論を優先的に考慮するように心掛けてください。
652. 問題の解答となる根拠は、常に文章内から探し出すようにして下さい。
663. 指示から主要な情報と詳細を抽出し、要点を漏らさず回答することを重視して下さい。
674. 回答のトーンやスタイルは、与えられたテーマや質問に合わせて柔軟に調整して下さい。
685. 回答を作成した後は、必ず推敲を行い、誤りや曖昧さがないかどうか確認して下さい。
69"""
70
71results = []
72
73# データセットの処理
74for data in tqdm(datasets):
75
76 input_text = data["input"]
77
78 # プロンプトの構築(システムプロンプト + ユーザー入力)
79 prompt = f"""### 指示
80{system_prompt}
81
82{input_text}
83### 回答
84"""
85
86 # トークナイズ
87 tokenized_input = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
88 attention_mask = torch.ones_like(tokenized_input)
89
90 # 推論パラメータの設定
91 max_new_tokens = 1024
92 do_sample = True
93 top_p = 0.95
94 temperature = 0.7
95 repetition_penalty = 1.05
96
97 # 推論実行
98 with torch.no_grad():
99 outputs = model.generate(
100 tokenized_input,
101 attention_mask=attention_mask, # attention_maskを明示的に指定
102 max_new_tokens=max_new_tokens,
103 do_sample=do_sample,
104 top_p=top_p,
105 temperature=temperature,
106 repetition_penalty=repetition_penalty,
107 pad_token_id=tokenizer.eos_token_id
108 )[0]
109
110 # 出力の整形
111 output = tokenizer.decode(outputs[tokenized_input.size(1):], skip_special_tokens=True)
112
113 # 結果を表示
114 print(f"Task ID: {data['task_id']}\nInput: {input_text}\nOutput: {output}\n{'-'*50}")
115
116 # 結果の保存
117 results.append({"task_id": data["task_id"], "input": input_text, "output": output})
118
119import re
120jsonl_id = re.sub(".*/", "", adapter_id)
121with open(f"./{jsonl_id}-outputs.jsonl", 'w', encoding='utf-8') as f:
122 for result in results:
123 json.dump(result, f, ensure_ascii=False) # ensure_ascii=False for handling non-ASCII characters
124 f.write('\n')
125