File size: 2,484 Bytes
d42d85d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5a39442
 
d42d85d
5a39442
 
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
102


# Elyza-TV 100を解かせる手順 (松尾研LLM講座最終課題のコンペ評価用)

llama.cpp を使って、google/gemma-2-27bをLoRAファインチューニング後にGGUF量子化したモデルで回答を生成します。

* [こちら](https://colab.research.google.com/drive/1SIZNxbyf1R8332iK8IvhhNlGhR_j9Sjt#scrollTo=pd8VbKeIQ_3J)に推論用のGoogle Colab Noteを共有しましたので、評価時の参考にしてください。

まず、GPUを利用できる形でllama.cppをビルドし直します。
```
!CMAKE_ARGS="-DLLAMA_CUDA=on" pip install llama-cpp-python[server]
```

必要なパッケージのインストール
```
!pip install huggingface_hub
```

必要なライブラリのインポート

```
import os
from llama_cpp import Llama
from huggingface_hub import hf_hub_download
```

モデルをダウンロード
```
from google.colab import userdata
os.environ['HUGGINGFACE_TOKEN'] = userdata.get('HF_TOKEN')

# Download the model
hf_hub_download(
    repo_id="hideax/gemma-2-27b-it-5-q5_k_m",
    filename="unsloth.Q5_K_M.gguf",
    local_dir="./models"
)
```

モデルをロード
```
llm = Llama(
    model_path="models/unsloth.Q5_K_M.gguf",
    flash_attn=True,
    n_gpu_layers=81,
    n_batch=1024,
    n_ctx=8192,
)
```

ELYZA-tasks-100-TVの読み込み
```
import json
datasets = []
with open("/content//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 = ""
```

タスクの実行
```
from tqdm import tqdm

results = []
for dt in tqdm(datasets):
  input = dt["input"]

  prompt = f"""### 指示\n{input}\n### 回答\n"""
  output = llm(
            prompt,
            max_tokens=max_tokens,
            temperature=temperature,
            top_p=top_p,
            stop=stop or [],
            echo=False
        )
  prediction = output["choices"][0]["text"].strip()
  result = {"task_id": dt["task_id"], "input": input, "output": prediction}
  print(result)
  results.append(result)
```

結果をjsonlで保存
```
model_id = "gemma-2-27b-it-5-Q5_K_M"
with open(f"{model_id}_output.jsonl", 'w', encoding='utf-8') as f:
    for result in results:
        json.dump(result, f, ensure_ascii=False)
        f.write('\n')
```

# 利用したモデル
- google/gemma-2-27b

# ファインチューニングに利用したデータ
- llm-jp/magpie-sft-v1.0 (apache-2.0 license)