metadata
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 and Huggingface's TRL library.
■ kazuHF/llm-jp-3-13b-it2_loraによる推論方法
- 環境設定
- 以下の説明はGoogle Colaboratory上での利用を想定している。事前にhardware acceleratorでGPUを選択しておく。
# 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
- モデルの読み込み
- 元のモデル(llm-jp/llm-jp-3-13b)と学習させたアダプターとを統合する。
- (注) 以下のcodeの huggeinface_token の所に自身の hugging face token を入力してから実行する。
# ベースとなるモデルと学習した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)
- 単一の入力文に対して推論する場合
# 単一の入力文に基づいて推論する関数の定義。
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)
◇ 使用例
Decoder('犬と猫の見分け方は何か。')
- jasonlで保存された入力文を一括して推論する場合
- Google drive の/contentにeliza-tasks-100-TV_0.jsonlをuploadしておく。
# 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の概要
- モデルの概要
- ベースモデル: 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で事後学習を行った。
- 事後学習の詳細
- 事後学習用データにichikara-instruction-003-001-1.jsonを必要な申請を行って利用した。
- Epoch数 1, バッチサイズ 2, 学習率 2e-4
- Google Colaboratory Pro上のL4/A100で学習
- モデルの入出力
- 学習における入力のkeyは “text”、出力のkeyは “output”
- 推論による出力のkeyは “task_id”, “input”, “output”
- 推論方法
- 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して出力とする。
- ライセンス
- ベースモデル: 国立情報学研究所 大規模言語モデル研究開発センターが公開しているllm-jp/llm-jp-3-13b。Apache 2.0 のライセンスを継承する。
- 事後学習に用いたデータ: 理化学研究所 革新知能統合研究センター 言語情報アクセス技術チームが公開している ichikara-instruction-003-001-1.json 。CC-BY-NC-SAのライセンスを継承する。
- 問題点や改善点
- promptに対して適切に答える場合もあるが、回答が短かったり、答えられない場合も散見されるため、更なる学習データの蓄積と事後学習を要する。
- 謝辞
- 東京大学 松尾・岩澤研究室主催の大規模言語モデルDeep Learning応用講座 2024|Fall を受講することで本モデルが作製できた。同講座に関係する方々並びに同講座を受講された方々に心より深謝する。
■ 推論方法の詳細
◆ Google Colaboratory上のGPUで推論する場合
- Google Colaboratory上で、サンプルコードの Model_Inference_Template_20241127.jpynb を開く。
◇ 環境設定
- Runtimeで、Hardware acceleratorをL4 GPUにする。
- ノートブックをGoogle driveに保存するため、Google driveにマウントする。
- CodeのセルでGenerateをクリックして「ドライブに接続」というPromptをGeminiに入れると、マウントに必要なセルを書いてくれるのでそれを評価する。
- 「接続しているGPUの表示」とGeminiに聞いて、23GBのL4に接続していることを確認する。
- /contentに、次のファイルをupload. elyza-tasks-100-TV_0.json
- 提供されたコードでunsloth, torch, peftをインストール。(37sec)
◇ 推論
- FastLanguageModel, PeftModelなどのインポート。(22sec)
- ベースモデルと作製したモデルのIDの貼り付け。
- 事後学習の際に使用したHugging FaceのTokenの指定。
- FastLanguageModelのインスタンス化。下のモデルとTokenizerを読み込む。 途中で、Grant accessをクックする。(3min)
- 元のモデルにQLoRAのadaptorを統合。tokenにHugging FaceのTokenを指定する。(8sec)
- elyza-tasks-100-TV_0.jsonlを読み込む。
- adaptorをつけたモデルでタスクの推論を行う。(6min)
- 推論結果をjsonlで保存。
■ 事後学習の詳細
◇ Hugging Faceでwrite権限のあるtokenの取得
- 自身のHugging Faceにlog inし、自身のProfileのSettingに入り、Access Tokenに入る。
- Create New Tokenをクリックし、Token type からWriteを選択し、Token nameを設定してから、Create tokenをクリックする。tokenを保存しておく。
◇ 事後学習のためのデータの入手
- 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/ )
- ダウンロードのための必要事項記入フォームに記入。(https://docs.google.com/forms/d/1CeYoFrMJnCFbH71RGxOaAIDGDBofUSAEdEcmiLR-Uko/viewform?edit_requested=true)
- LLMのためのインストラクションデータのダウンロードのURLを入手 https://drive.google.com/file/d/1U_GQ43hc2EYTKO-gvswooR0UY12alB0z/view?usp=drive_link
- このリンクから、Distribution20241221_allというフォルダの中にある ichikara-instruction-003-001-1.json などのjsonファイルのデータが入手できる。これをモデルの事後学習であるSFTやRLHFのための学習データとして利用する。
◆ Google Colaboratory上のGPUでの事後学習
- Google Colaboratory上で、サンプルコードの LoRA_template_unsloth_20241127.jpynb を開く。
◇ 環境設定
- Runtimeで、Hardware acceleratorをL4 GPUにする。
- ノートブックをGoogle driveに保存するため、Google driveにマウントする。
- CodeのセルでGenerateをクリックして「ドライブに接続」というPromptをGeminiに入れると、マウントに必要なセルを書いてくれるのでそれを評価する。
- 「接続しているGPUの表示」とGeminiに聞いて、23GBのL4に接続していることを確認する。
- /contentに、次の二つのファイルをupload. elyza-tasks-100-TV_0.json ichikara-instruction-003-001-1.json
- 既に書かれているcodeによってuslothをインストールする。(25sec)
- torchとxformersのupgrade (7sec) (ipwidgetsのupgradeはskip)
- Flash-attentionのinstall (20sec)
◇ 事前学習モデルのロード
- Write権限のあるTokenをHF_TOKENのところに入力して評価する。
- llm-jp/llm-jp-3-13bというモデルを4bit量子化したLoRAでloadする。(2min)
- Notebook does not have secret accessというwindowが出たらGrant accessをクリック
- 事後学習用のデータであるichikara-instruction-003-001-1.jsonをloadする。(0sec)
- 学習時のプロンプトのフォーマットの定義 (0sec)
- データの確認 (0sec) ###指示 と ###回答 とからなる。
◇ モデルの事後学習
- SFTの設定 (1sec)
- GPUのメモリの確認: GPU NVIDIA L4 Max memory 22.168GB, 8.709GBを使用中
- 学習の実行 (23min) Training lossは、2.22から1.90まで低下した。
◇ モデルによる推論
- 課題であるelyza-tasks-100-TV_0.jsonを読み込む。(0sec)
- 事後学習したモデルで、タスクを一つ一つ推論する。(6min)
- 推論結果をjsonで保存する。
- LoRAのアダプタをHugging Faceにuploadする。(22sec)
- Hugging FaceのProfileにuploadされているモデルをクリックする。
- Files and versionsをクリックし、README.mdを開き、editをクリックして編集する。
- Comment changes to mainをクリックして保存する。