File size: 3,590 Bytes
db0dce6
 
 
 
cc20c76
 
 
 
 
 
 
b345c3a
cc20c76
7ac00c2
cc20c76
 
 
7ac00c2
0161dc3
 
 
 
cee8f38
0161dc3
cee8f38
0161dc3
 
 
cc20c76
cee8f38
cc20c76
 
 
0161dc3
cc20c76
 
 
 
 
 
3f57330
 
0161dc3
 
cc20c76
cee8f38
 
 
 
 
 
 
 
0161dc3
7ac00c2
cee8f38
cc20c76
7ac00c2
0161dc3
 
cee8f38
 
0161dc3
 
 
 
 
7ac00c2
cee8f38
cc20c76
7ac00c2
cee8f38
 
 
 
0161dc3
cee8f38
0161dc3
cee8f38
0161dc3
cee8f38
0161dc3
 
 
 
 
 
 
 
cee8f38
0161dc3
7ac00c2
cee8f38
cc20c76
7ac00c2
0161dc3
 
cee8f38
0161dc3
7ac00c2
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
---
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')
```