File size: 8,464 Bytes
a91e8a5 7b91b5b 6c880da 38144dc 6c880da bbc800e 6c880da f49cae4 6c880da bbc800e 7c69b4d bbc800e 6c880da bbc800e 153984d bbc800e 1512ae7 bbc800e dd61159 bbc800e 38144dc bbc800e 153984d bbc800e dd61159 bbc800e 6c880da 7b91b5b 73f1952 e1dbacb 0855753 e1dbacb 675c96f e1dbacb fb193aa 632c98d e1dbacb 664d30a e1dbacb fc867b4 7b91b5b 73f1952 7b91b5b 4115150 7b91b5b c8a4192 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 |
---
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 uninstall unsloth -y
!pip install xformers -q
!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:
for line in f:
if line.strip():
datasets.append(json.loads(line))
# モデルで入力を一括処理。
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を GPU にする。
2. ノートブックをGoogle driveに保存するため、Google driveにマウントする。
3. CodeのセルでGenerateをクリックして「ドライブに接続」というPromptをGeminiに入れると、マウントに必要なセルを書いてくれるのでそれを評価する。
4. 「接続しているGPUの表示」とGeminiに聞いて、GPU に接続していることを確認する。
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で保存。
|