|
--- |
|
base_model: llm-jp/llm-jp-3-13b |
|
--- |
|
|
|
# モデルの概要 |
|
このモデルは、松尾研大規模言語モデル講座2024の最終課題として作成された提出モデルです。 |
|
ベースとなるモデルは「llm-jp/llm-jp-3-13b」です。このベースモデルを元に以下のデータセットを用いて追加学習を行いました。 |
|
・ichikara-Instruction |
|
・ELIZA-task-100 |
|
これらのデータセットを活用することで、モデルの指示対応能力とタスク処理能力を向上させています。 |
|
|
|
# 推論用コード |
|
以下のコードを実行すると、HuggingFace上の本モデル「Gamoooo/llm-jp-3-13b-last」を実行して、最終課題用入力データ「elyza-tasks-100-TV_0.jsonl」(課題用オリジナルデータセット)を推論し、その結果を{json_file_id}-outputs.jsonlというファイルに出力できます。 |
|
|
|
### ライブラリーのインストール&セットアップ |
|
### Google Colab環境向けインストール手順 |
|
以下のコマンドをGoogle Colabのセルに入力して実行してください: |
|
``` |
|
!pip install unsloth |
|
!pip uninstall unsloth -y && pip install --upgrade --no-cache-dir "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git" |
|
!pip install -U torch |
|
!pip install -U peft |
|
from unsloth import FastLanguageModel |
|
from peft import PeftModel |
|
import torch |
|
import json |
|
from tqdm import tqdm |
|
import re |
|
``` |
|
|
|
### Hugging FaceのTokenの指定 |
|
以下のコードを使用して、Hugging Faceのトークンを指定してください: |
|
``` |
|
HF_TOKEN = "your-token" #@param {type:"string"} |
|
``` |
|
|
|
### モデル・トークナイザの読み込み |
|
### 量子化パラメータの設定 |
|
ベースモデルは13Bの大規模モデルであるため、量子化(4bit)を行います。 |
|
``` |
|
model_id = "llm-jp/llm-jp-3-13b" # ベースモデルのID |
|
adapter_id = "Gamoooo/llm-jp-3-13b-last" # 本モデルのアダプタモデルID |
|
|
|
dtype = None |
|
load_in_4bit = True # メモリ効率化のため4bit量子化を有効化 |
|
|
|
model, tokenizer = FastLanguageModel.from_pretrained( |
|
model_name=model_id, |
|
dtype=dtype, |
|
load_in_4bit=load_in_4bit, |
|
trust_remote_code=True, |
|
) |
|
|
|
model = PeftModel.from_pretrained(model, adapter_id, token = HF_TOKEN) |
|
``` |
|
|
|
### 入力データの準備 |
|
``` |
|
datasets = [] |
|
with open("./elyza-tasks-100-TV_0.jsonl", "r") as f: |
|
item = "" |
|
for line in f: |
|
line = line.strip() |
|
item += line |
|
if item.endswith("}"): |
|
datasets.append(json.loads(item)) |
|
item = "" |
|
``` |
|
|
|
### 推論実行 |
|
``` |
|
FastLanguageModel.for_inference(model) |
|
|
|
results = [] |
|
for dt in tqdm(datasets): |
|
input = dt["input"] |
|
|
|
prompt = f"### 指示\n{input}\n次の要件を満たしてください:\n1. 簡潔に回答する。\n2. 必要なら箇条書きを使用して要点を整理する。\n3. 指示された内容に忠実に答える。\n### 回答\n" |
|
|
|
inputs = tokenizer([prompt], return_tensors="pt").to(model.device) |
|
|
|
outputs = model.generate( |
|
**inputs, |
|
max_new_tokens=512, |
|
use_cache=True, |
|
do_sample=False, |
|
repetition_penalty=1.2, |
|
) |
|
prediction = tokenizer.decode(outputs[0], skip_special_tokens=True).split('\n### 回答')[-1] |
|
|
|
results.append({"task_id": dt["task_id"], "input": input, "output": prediction}) |
|
``` |
|
|
|
### 出力の保存 |
|
``` |
|
json_file_id = re.sub(".*/", "", adapter_id) |
|
with open(f"/content/{json_file_id}_output.jsonl", 'w', encoding='utf-8') as f: |
|
for result in results: |
|
json.dump(result, f, ensure_ascii=False) |
|
f.write('\n') |
|
``` |