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 peft1from transformers import (
2 AutoModelForCausalLM,
3 AutoTokenizer,
4 BitsAndBytesConfig,
5)
6from peft import PeftModel
7import torch
8from tqdm import tqdm
9import json
10# Hugging Faceで取得したTokenをこちらに貼る。
11HF_TOKEN = "hugging faceのトークン"
12
13# ベースとなるモデルと学習したLoRAのアダプタ。
14# 今回は、llm-jpのllm-jp-3の13Bを使用
15# Omnicanpusの場合は、ローカルのモデルを使用
16model_id = "models/models--llm-jp--llm-jp-3-13b/snapshots/cd3823f4c1fcbb0ad2e2af46036ab1b0ca13192a"
17# Google colabなどを使う場合はこちら
18# model_id = "llm-jp/llm-jp-3-13b"
19# 学習したアダプターを読み込み
20adapter_id = "GSato1129/llm-jp-3-13b-finetune_gsato"
21
22# QLoRA config
23# QLoRAにより、計算量とGPUメモリを削減
24bnb_config = BitsAndBytesConfig(
25 load_in_4bit=True,
26 bnb_4bit_quant_type="nf4",
27 bnb_4bit_compute_dtype=torch.bfloat16,
28)
29
30# Load model
31model = AutoModelForCausalLM.from_pretrained(
32 model_id,
33 quantization_config=bnb_config,
34 device_map="auto",
35 token = HF_TOKEN
36)
37
38# Load tokenizer
39tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True, token = HF_TOKEN)
40
41# 元のモデルにLoRAのアダプタを統合。
42model = PeftModel.from_pretrained(model, adapter_id, token = HF_TOKEN)1# データセットの読み込み。
2# omnicampusの開発環境では、左にタスクのjsonlをドラッグアンドドロップしてから実行。
3# Google colabの場合でも、同様に左にタスクのjsonlファイルをドラックアンドドロップ。
4datasets = []
5with open("./elyza-tasks-100-TV_0.jsonl", "r") as f:
6 item = ""
7 for line in f:
8 line = line.strip()
9 item += line
10 if item.endswith("}"):
11 datasets.append(json.loads(item))
12 item = ""1# llmjp
2# データセットからタスクを取り出して、学習したモデルを使って推定
3# resultsにタスクID、入力、出力を格納
4results = []
5for data in tqdm(datasets):
6
7 input = data["input"]
8
9 prompt = f"""### 指示
10 {input}
11 ### 回答
12 """
13
14 tokenized_input = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
15 attention_mask = torch.ones_like(tokenized_input)
16 with torch.no_grad():
17 outputs = model.generate(
18 tokenized_input,
19 attention_mask=attention_mask,
20 max_new_tokens=100,
21 do_sample=False,
22 repetition_penalty=1.2,
23 pad_token_id=tokenizer.eos_token_id
24 )[0]
25 output = tokenizer.decode(outputs[tokenized_input.size(1):], skip_special_tokens=True)
26
27 results.append({"task_id": data["task_id"], "input": input, "output": output})1# resultsを使ってjsonlを作成
2# adapter IDを元にjsonlを作成しているが、任意の名前に変更しても良い。
3import re
4jsonl_id = re.sub(".*/", "", adapter_id)
5with open(f"./{jsonl_id}-outputs.jsonl", 'w', encoding='utf-8') as f:
6 for result in results:
7 json.dump(result, f, ensure_ascii=False) # ensure_ascii=False for handling non-ASCII characters
8 f.write('\n')
9