File size: 4,141 Bytes
591d520
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2e12470
 
75b850e
2e12470
75b850e
20a9b55
75b850e
20a9b55
4592c1c
2e12470
32cffe1
2e12470
4592c1c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2e12470
 
 
 
 
 
 
 
 
4592c1c
2e12470
 
4592c1c
 
2e12470
4592c1c
2e12470
 
 
 
 
 
 
4592c1c
2e12470
 
 
 
 
 
 
4592c1c
2e12470
4592c1c
2e12470
4592c1c
 
 
 
 
 
 
2e12470
4592c1c
2e12470
 
 
 
 
 
 
4592c1c
 
 
 
2e12470
4592c1c
 
2e12470
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4592c1c
2e12470
4592c1c
 
 
 
 
 
 
2e12470
4592c1c
2e12470
 
 
 
 
4592c1c
 
2e12470
4592c1c
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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
---
base_model: llm-jp/llm-jp-3-13b
tags:
- text-generation-inference
- transformers
- unsloth
- llama
- trl
license: apache-2.0
language:
- en
---

# Uploaded  model

- **Developed by:** ppapppapppap
- **License:** apache-2.0
- **Finetuned from model :** llm-jp/llm-jp-3-13b

This llama model was trained 2x faster with [Unsloth](https://github.com/unslothai/unsloth) and Huggingface's TRL library.

[<img src="https://raw.githubusercontent.com/unslothai/unsloth/main/images/unsloth%20made%20with%20love.png" width="200"/>](https://github.com/unslothai/unsloth)


# 概要

[松尾研大規模言語モデル講座2024](https://weblab.t.u-tokyo.ac.jp/lecture/course-list/large-language-model/)のコンペ用の提出モデル作成の一環として作成・公開しています。

Hugging Face上のモデル(llm-jp/llm-jp-3-13b)を4bit量子化したモデルです。

学習データ等の詳細については元モデルの概要をご確認ください。

以下に、上記のモデルを用いて入力データ(elyza-tasks-100-TV_0.jsonl)を推論し、その結果を.jsonlのファイル形式で出力するコードを記します。


# 前提条件

- Python環境があること(例:Google Colab)
- Hugging Faceのアクセストークン (HF_TOKEN) が取得済みであること


# セットアップ

1. 必要なライブラリのインストールを行います。

  ```bash
  !pip install -U bitsandbytes
  !pip install -U transformers
  !pip install -U accelerate
  !pip install -U datasets
  !pip install ipywidgets --upgrade
  ```


# 使用方法

以下は、Google Colabにて実行する際のモデルの基本的な使用例です

```python
from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    BitsAndBytesConfig,
)
import torch
from tqdm import tqdm
import json

# Hugging Faceで取得したTokenをこちらに貼る。
HF_TOKEN = "your-token"

# 自分の作成したモデルのIDをこちらに貼る。
model_name = "your_HuggingFace_username/llm-jp-3-13b-your_model_name"

# QLoRA用の設定
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16,
    bnb_4bit_use_double_quant=False,
)

# モデルの読み込み
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    quantization_config=bnb_config,
    device_map="auto",
    token = HF_TOKEN
)

# トークナイザの読み込み
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True, token = HF_TOKEN)
```

# 入力データの準備

`./elyza-tasks-100-TV_0.jsonl`というファイルからデータセットをロードします。


```
# データセットの読み込み。
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 = ""
```


# 推論の実行

```
results = []
for data in tqdm(datasets):

  input = data["input"]

  prompt = f"""### 指示
  {input}
  ### 回答:
  """

  tokenized_input = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
  with torch.no_grad():
      outputs = model.generate(
          tokenized_input,
          max_new_tokens=100,
          do_sample=False,
          repetition_penalty=1.2
      )[0]
  output = tokenizer.decode(outputs[tokenized_input.size(1):], skip_special_tokens=True)

# 結果を保存
  results.append({"task_id": data["task_id"], "input": input, "output": output})
```



# 出力の保存

最後に、model_nameをベースにしたファイル名で.jsonl形式の出力ファイルを保存します。

```
import re
model_name = re.sub(".*/", "", model_name)
with open(f"./{model_name}-outputs.jsonl", 'w', encoding='utf-8') as f:
    for result in results:
        json.dump(result, f, ensure_ascii=False)  # ensure_ascii=False for handling non-ASCII characters
        f.write('\n')
```

以上の手順で、`{model_name}-outputs.jsonl`というファイルに推論結果が書き出されます。