Views
No views yet
LLM-JP-13B に LoRA アダプタを付けて supervised fine-tuning(SFT)を実施することで作成しました。1!pip install -q -U bitsandbytes --root-user-action=ignore
2!pip install -q -U transformers --root-user-action=ignore
3!pip install -q -U accelerate --root-user-action=ignore
4!pip install -q -U datasets --root-user-action=ignore
5!pip install -q -U peft --root-user-action=ignore1!pip install -q -U bitsandbytes
2!pip install -q -U transformers
3!pip install -q -U accelerate
4!pip install -q -U datasets
5!pip install -q -U peft!pip install -q ipywidgets --upgrade --root-user-action=ignore1# 必要なモジュールのインポート
2from transformers import (
3 AutoModelForCausalLM,
4 AutoTokenizer,
5 BitsAndBytesConfig,
6)
7from peft import PeftModel
8import torch
9from tqdm import tqdm
10import json
11
12# Hugging Faceで取得したTokenを貼る。
13HF_TOKEN = "Hugging Face Token" # 直貼りする場合
14# from getpass import getpass # getpass 利用の場合
15# HF_TOKEN = getpass("input your HF_TOKEN:") # getpass 利用の場合
16
17# モデルの指定
18model_id = "llm-jp/llm-jp-3-13b" # ベースモデル
19adapter_id = "ToshiyukiNH/llm-jp-3-13b-omni-1" # このモデル
20
21# QLoRA config の設定
22bnb_config = BitsAndBytesConfig(
23 load_in_4bit=True,
24 bnb_4bit_quant_type="nf4",
25 bnb_4bit_compute_dtype=torch.bfloat16,
26)
27
28# モデルの読み込み
29model = AutoModelForCausalLM.from_pretrained(
30 model_id,
31 quantization_config=bnb_config,
32 device_map="auto",
33 token = HF_TOKEN
34)
35
36# tokenizer の読み込み
37tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True, token = HF_TOKEN)
38
39# 元のモデルにLoRAのアダプタを統合。
40model = PeftModel.from_pretrained(model, adapter_id, token = HF_TOKEN)
41
42# データセットの読み込み
43datasets = []
44with open("./elyza-tasks-100-TV_0.jsonl", "r") as f:
45 item = ""
46 for line in f:
47 line = line.strip()
48 item += line
49 if item.endswith("}"):
50 datasets.append(json.loads(item))
51 item = ""
52
53# Prompting
54system_instruction = """
55あなたは思慮深くユーモアのある社会人です。以下の注意点をよく読み、ユーザーからの指示に対してステップバイステップで考え、そして端的に回答してください。
56
57### 注意点
58- ユーザーからの指示に正確に従ってください。
59- 200文字以内で回答してください。
60- 数字のみを用いて回答できる指示に対しては、数字のみを用いて回答してください。
61- 回答内の数字はすべて半角に変換してください。
62- 回答内の全角スペースおよび記号 "\u3000" は全て半角スペースに変換してください。
63- 回答を見直し、その回答が日本語としておかしい場合は一度だけ再考してください。
64
65"""
66
67prompt_template = """
68### 指示
69{instruction}
70
71### 回答
72"""
73
74# inference
75results = []
76for data in tqdm(datasets):
77 input_ = data["input"]
78 prompt = system_instruction + prompt_template.format(instruction=input_)
79
80 tokenized_input = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
81 attention_mask = torch.ones_like(tokenized_input)
82 with torch.no_grad():
83 outputs = model.generate(
84 tokenized_input,
85 attention_mask=attention_mask,
86 max_new_tokens=100,
87 do_sample=False,
88 repetition_penalty=1.2,
89 pad_token_id=tokenizer.eos_token_id
90 )[0]
91 output = tokenizer.decode(outputs[tokenized_input.size(1):], skip_special_tokens=True)
92 results.append({"task_id": data["task_id"], "input": input_, "output": output})
93
94# 推論結果を保存
95import re
96
97jsonl_id = re.sub(".*/", "", adapter_id)
98with open(f"./{jsonl_id}-outputs.jsonl", 'w', encoding='utf-8') as f:
99 for result in results:
100 json.dump(result, f, ensure_ascii=False) # ensure_ascii=False for handling non-ASCII characters
101 f.write('\n')