Views
No views yet
1# -*- coding: utf-8 -*-
2"""Model_Inference_Template_unsloth_20241127.ipynb
3
4Automatically generated by Colab.
5
6Original file is located at
7 https://colab.research.google.com/drive/1W1J1lK_ylcwMwjNf-uiVO8ZVg4MmfOci
8
9# 推論用コード
10本コードはunslothで学習したqLoRAのアダプタを用いてELYZA-tasks-100-TVの出力を得るためのコードです。
11Hugging Faceにアダプタをアップロードしてあることが前提となります。
12このコードはunslothライブラリを用いてモデルを読み込み、推論するためのコードとなります。
13このコードで生成されたjsonlファイルは課題の成果として提出可能なフォーマットになっております。
14
15※本コードはGoogle Colabでの動作を想定しており、Omnicampusでの動作を想定しておりません。
16Omnicampus向けのコードは別途用意しております。
17"""
18
19#from google.colab import drive
20#drive.mount('/content/drive')
21
22# Commented out IPython magic to ensure Python compatibility.
23# # 必要なライブラリをインストール
24# %%capture
25# !pip install unsloth
26# !pip uninstall unsloth -y && pip install --upgrade --no-cache-dir "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"
27# !pip install -U torch
28# !pip install -U peft
29
30# 必要なライブラリを読み込み
31from unsloth import FastLanguageModel
32from peft import PeftModel
33import torch
34import json
35from tqdm import tqdm
36import re
37
38# ベースとなるモデルと学習したLoRAのアダプタ(Hugging FaceのIDを指定)。
39model_id = "llm-jp/llm-jp-3-13b"
40adapter_id = "okapi-dog/llm-jp-3-13b-combine-v8_lora"
41
42# Hugging Face Token を指定。
43# 下記の URL から Hugging Face Token を取得できますので下記の HF_TOKEN に入れてください。
44# https://huggingface.co/settings/tokens
45HF_TOKEN = "Your HF Token" #@param {type:"string"}
46
47# unslothのFastLanguageModelで元のモデルをロード。
48dtype = None # Noneにしておけば自動で設定
49load_in_4bit = True # 今回は13Bモデルを扱うためTrue
50
51model, tokenizer = FastLanguageModel.from_pretrained(
52 model_name=model_id,
53 dtype=dtype,
54 load_in_4bit=load_in_4bit,
55 trust_remote_code=True,
56)
57
58# 元のモデルにLoRAのアダプタを統合。
59model = PeftModel.from_pretrained(model, adapter_id, token = HF_TOKEN)
60
61# タスクとなるデータの読み込み。
62# 事前にデータをアップロードしてください。
63datasets = []
64with open("./elyza-tasks-100-TV_0.jsonl", "r") as f:
65 item = ""
66 for line in f:
67 line = line.strip()
68 item += line
69 if item.endswith("}"):
70 datasets.append(json.loads(item))
71 item = ""
72
73# モデルを用いてタスクの推論。
74
75# 推論するためにモデルのモードを変更
76FastLanguageModel.for_inference(model)
77
78results = []
79for dt in tqdm(datasets):
80 input = dt["input"]
81
82 prompt = f"""### 指示\n{input}\n### 回答\n"""
83
84 inputs = tokenizer([prompt], return_tensors = "pt").to(model.device)
85
86 outputs = model.generate(**inputs, max_new_tokens = 512, use_cache = True, do_sample=False, repetition_penalty=1.2)
87 prediction = tokenizer.decode(outputs[0], skip_special_tokens=True).split('\n### 回答')[-1]
88
89 results.append({"task_id": dt["task_id"], "input": input, "output": prediction})
90
91# 結果をjsonlで保存。
92
93# ここではadapter_idを元にファイル名を決定しているが、ファイル名は任意で問題なし。
94json_file_id = re.sub(".*/","", adapter_id)
95with open(f"./{json_file_id}_output.jsonl", 'w', encoding='utf-8') as f:
96 for result in results:
97 json.dump(result, f, ensure_ascii=False)
98 f.write('\n')