File size: 12,388 Bytes
a91e8a5 7b91b5b 6c880da bbc800e 6c880da bbc800e 7c69b4d bbc800e 6c880da bbc800e 153984d bbc800e 1512ae7 bbc800e dd61159 bbc800e 153984d bbc800e dd61159 bbc800e 6c880da 7b91b5b 73f1952 e1dbacb 0855753 e1dbacb 675c96f e1dbacb fb193aa 632c98d e1dbacb 664d30a e1dbacb 73f1952 7b91b5b 73f1952 7b91b5b 73f1952 7b91b5b 73f1952 7b91b5b 73f1952 7b91b5b 73f1952 7b91b5b |
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 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 |
---
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:** kazuHF
- **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)
# ■ kazuHF/llm-jp-3-13b-it2_loraによる推論方法
1. 環境設定
- 以下の説明はGoogle Colaboratory上での利用を想定している。事前にhardware acceleratorでGPUを選択しておく。
```bash
# Googleドライブに接続
from google.colab import drive
drive.mount('/content/drive')
# 接続しているGPUの種類の表示
!nvidia-smi
# 必要なライブラリのインストール
!pip install unsloth -q
!pip uninstall unsloth -y && pip install --upgrade --no-cache-dir "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git" -q
!pip install -U torch -q
!pip install -U peft -q
# 必要なライブラリの読み込み
from unsloth import FastLanguageModel
from peft import PeftModel
import torch
import json
from tqdm import tqdm
import re
```
2. モデルの読み込み
- 元のモデル(llm-jp/llm-jp-3-13b)と学習させたアダプターとを統合する。
- (注) 以下のcodeの huggeinface_token の所に自身の hugging face token を入力してから実行する。
```bash
# ベースとなるモデルと学習したLoRAのアダプタ(本モデル)のIDやHugging face tokenを指定。
model_id = "llm-jp/llm-jp-3-13b"
adapter_id = "kazuHF/llm-jp-3-13b-it2_lora"
HF_TOKEN = "huggingface_token"
# unslothのFastLanguageModelで元のモデルとトークナイザーをロード。
model, tokenizer = FastLanguageModel.from_pretrained(
model_name=model_id,
dtype=None,
load_in_4bit=True,
trust_remote_code=True,
)
# 元のモデルにLoRAのアダプタを統合。
model = PeftModel.from_pretrained(model, adapter_id, token = HF_TOKEN)
```
3. 単一の入力文に対して推論する場合
```bash
# 単一の入力文に基づいて推論する関数の定義。
def Decoder(input):
# 推論するためにモデルのモードを変更
FastLanguageModel.for_inference(model)
# 入力文による推論
prompt = f"""### 指示\n\n{str(input)}\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]
print(prompt)
print(prediction)
```
◇ 使用例
```bash
Decoder('犬と猫の見分け方は何か。')
```
4. jasonlで保存された入力文を一括して推論する場合
- Google drive の/contentにeliza-tasks-100-TV_0.jsonlをuploadしておく。
```bash
# 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 dt in tqdm(datasets):
# 推論するためにモデルのモードを変更
FastLanguageModel.for_inference(model)
# 入力文による推論
input = dt["input"]
prompt = f"""### 指示\n{input}\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})
# 結果をjsonlで保存。
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')
```
- 推論結果は Google drive の/contentに、llm-jp-3-13b-it2_lora_output.jsonlとして保存される。
# ■ kazuHF/llm-jp-3-13b-it2_loraの概要
1. モデルの概要
- ベースモデル: llm-jp/llm-jp-3-13b (https://huggingface.co/llm-jp/llm-jp-3-13b)
- 用途: 日本語によるQ&A形式の文章生成
- アーキテクチャ: FrameworkやLibraryとしてはPyTorch、Transformers、Unsloth、trl、LoRA、xformers、Flash Attentionなどを利用。UnslothによりFine TuningやInferenceを高速化し、メモリも削減した。llm-jp/llm-jp-3-13bを4bitで量子化するLoRAでロードし、SFTで事後学習を行った。
2. 事後学習の詳細
- 事後学習用データにichikara-instruction-003-001-1.jsonを必要な申請を行って利用した。
- Epoch数 1, バッチサイズ 2, 学習率 2e-4
- Google Colaboratory Pro上のL4/A100で学習
3. モデルの入出力
- 学習における入力のkeyは “text”、出力のkeyは “output”
- 推論による出力のkeyは “task_id”, “input”, “output”
4. 推論方法
- Hugging FaceのIDは model_id = "llm-jp/llm-jp-3-13b”, adapter_id = "kazuHF/llm-jp-3-13b-it2_lora" と指定し、FastLanguageModel.from_pretrained( … model_id … )
で元のモデルをロードする。
- そして model = PeftModel.from_pretrained( … adaptor_id … )によって元のモデルとLoRAのアダプターを結合し、そのモデルのモードを FastLanguageModel.for_inference(model) によって推論モードに変更する。
- 入力を”””###\n 指示 入力 \n### 回答\n”””の形式にしてトークン化し、model.generate( “input_ids”: …, “attention_mask”: …, …) によってpredictionを行い、それをdecodeして出力とする。
5. ライセンス
- ベースモデル: 国立情報学研究所 大規模言語モデル研究開発センターが公開しているllm-jp/llm-jp-3-13b。Apache 2.0 のライセンスを継承する。
- 事後学習に用いたデータ: 理化学研究所 革新知能統合研究センター 言語情報アクセス技術チームが公開している ichikara-instruction-003-001-1.json 。CC-BY-NC-SAのライセンスを継承する。
6. 問題点や改善点
- promptに対して適切に答える場合もあるが、回答が短かったり、答えられない場合も散見されるため、更なる学習データの蓄積と事後学習を要する。
7. 謝辞
- 東京大学 松尾・岩澤研究室主催の大規模言語モデルDeep Learning応用講座 2024|Fall を受講することで本モデルが作製できた。同講座に関係する方々並びに同講座を受講された方々に心より深謝する。
# ■ 推論方法の詳細
◆ Google Colaboratory上のGPUで推論する場合
1. Google Colaboratory上で、サンプルコードの
Model_Inference_Template_20241127.jpynb
を開く。
◇ 環境設定
1. Runtimeで、Hardware acceleratorをL4 GPUにする。
2. ノートブックをGoogle driveに保存するため、Google driveにマウントする。
3. CodeのセルでGenerateをクリックして「ドライブに接続」というPromptをGeminiに入れると、マウントに必要なセルを書いてくれるのでそれを評価する。
4. 「接続しているGPUの表示」とGeminiに聞いて、23GBのL4に接続していることを確認する。
5. /contentに、次のファイルをupload.
elyza-tasks-100-TV_0.json
6. 提供されたコードでunsloth, torch, peftをインストール。(37sec)
◇ 推論
7. FastLanguageModel, PeftModelなどのインポート。(22sec)
8. ベースモデルと作製したモデルのIDの貼り付け。
9. 事後学習の際に使用したHugging FaceのTokenの指定。
10. FastLanguageModelのインスタンス化。下のモデルとTokenizerを読み込む。
途中で、Grant accessをクックする。(3min)
11. 元のモデルにQLoRAのadaptorを統合。tokenにHugging FaceのTokenを指定する。(8sec)
12. elyza-tasks-100-TV_0.jsonlを読み込む。
13. adaptorをつけたモデルでタスクの推論を行う。(6min)
14. 推論結果をjsonlで保存。
# ■ 事後学習の詳細
◇ Hugging Faceでwrite権限のあるtokenの取得
1. 自身のHugging Faceにlog inし、自身のProfileのSettingに入り、Access Tokenに入る。
2. Create New Tokenをクリックし、Token type からWriteを選択し、Token nameを設定してから、Create tokenをクリックする。tokenを保存しておく。
◇ 事後学習のためのデータの入手
1. LLMのための日本語インストラクションデータ公開ページに入る。( https://liat-aip.sakura.ne.jp/wp/llm%e3%81%ae%e3%81%9f%e3%82%81%e3%81%ae%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%a9%e3%82%af%e3%82%b7%e3%83%a7%e3%83%b3%e3%83%87%e3%83%bc%e3%82%bf%e4%bd%9c%e6%88%90/llm%e3%81%ae%e3%81%9f%e3%82%81%e3%81%ae%e6%97%a5%e6%9c%ac%e8%aa%9e%e3%82%a4%e3%83%b3%e3%82%b9%e3%83%88%e3%83%a9%e3%82%af%e3%82%b7%e3%83%a7%e3%83%b3%e3%83%87%e3%83%bc%e3%82%bf-%e5%85%ac%e9%96%8b/ )
2. ダウンロードのための必要事項記入フォームに記入。(https://docs.google.com/forms/d/1CeYoFrMJnCFbH71RGxOaAIDGDBofUSAEdEcmiLR-Uko/viewform?edit_requested=true)
3. LLMのためのインストラクションデータのダウンロードのURLを入手
https://drive.google.com/file/d/1U_GQ43hc2EYTKO-gvswooR0UY12alB0z/view?usp=drive_link
4. このリンクから、Distribution20241221_allというフォルダの中にある
ichikara-instruction-003-001-1.json
などのjsonファイルのデータが入手できる。これをモデルの事後学習であるSFTやRLHFのための学習データとして利用する。
◆ Google Colaboratory上のGPUでの事後学習
1. Google Colaboratory上で、サンプルコードの
LoRA_template_unsloth_20241127.jpynb
を開く。
◇ 環境設定
1. Runtimeで、Hardware acceleratorをL4 GPUにする。
2. ノートブックをGoogle driveに保存するため、Google driveにマウントする。
3. CodeのセルでGenerateをクリックして「ドライブに接続」というPromptをGeminiに入れると、マウントに必要なセルを書いてくれるのでそれを評価する。
4. 「接続しているGPUの表示」とGeminiに聞いて、23GBのL4に接続していることを確認する。
5. /contentに、次の二つのファイルをupload.
elyza-tasks-100-TV_0.json
ichikara-instruction-003-001-1.json
6. 既に書かれているcodeによってuslothをインストールする。(25sec)
7. torchとxformersのupgrade (7sec)
(ipwidgetsのupgradeはskip)
8. Flash-attentionのinstall (20sec)
◇ 事前学習モデルのロード
1. Write権限のあるTokenをHF_TOKENのところに入力して評価する。
2. llm-jp/llm-jp-3-13bというモデルを4bit量子化したLoRAでloadする。(2min)
3. Notebook does not have secret accessというwindowが出たらGrant accessをクリック
4. 事後学習用のデータであるichikara-instruction-003-001-1.jsonをloadする。(0sec)
5. 学習時のプロンプトのフォーマットの定義 (0sec)
6. データの確認 (0sec) ###指示 と ###回答 とからなる。
◇ モデルの事後学習
1. SFTの設定 (1sec)
2. GPUのメモリの確認: GPU NVIDIA L4 Max memory 22.168GB, 8.709GBを使用中
3. 学習の実行 (23min) Training lossは、2.22から1.90まで低下した。
◇ モデルによる推論
1. 課題であるelyza-tasks-100-TV_0.jsonを読み込む。(0sec)
2. 事後学習したモデルで、タスクを一つ一つ推論する。(6min)
3. 推論結果をjsonで保存する。
4. LoRAのアダプタをHugging Faceにuploadする。(22sec)
5. Hugging FaceのProfileにuploadされているモデルをクリックする。
6. Files and versionsをクリックし、README.mdを開き、editをクリックして編集する。
7. Comment changes to mainをクリックして保存する。 |