kazuHF's picture
Update README.md
f49cae4 verified
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による推論方法

  1. 環境設定
  • 以下の説明はGoogle Colaboratory上での利用を想定したもの。事前にhardware acceleratorでGPUを選択しておく。
# 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
  1. モデルの読み込み
  • 元のモデル(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)
  1. 単一の入力文に対して推論する場合
# 単一の入力文に基づいて推論する関数の定義。
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('犬と猫の見分け方は何か。')
  1. jasonlで保存された入力文を一括して推論する場合
  • Google drive の/contentにeliza-tasks-100-TV_0.jsonlをuploadしておく。
# 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で事後学習を行った。
  1. 事後学習の詳細
  • 事後学習用データにichikara-instruction-003-001-1.jsonを必要な申請を行って利用した。
  • Epoch数 1, バッチサイズ 2, 学習率 2e-4
  • Google Colaboratory Pro上のL4/A100で学習
  1. モデルの入出力
  • 学習における入力のkeyは “text”、出力のkeyは “output”
  • 推論による出力のkeyは “task_id”, “input”, “output”
  1. 推論方法
  • 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して出力とする。
  1. ライセンス
  • ベースモデル: 国立情報学研究所 大規模言語モデル研究開発センターが公開しているllm-jp/llm-jp-3-13b。Apache 2.0 のライセンスを継承する。
  • 事後学習に用いたデータ: 理化学研究所 革新知能統合研究センター 言語情報アクセス技術チームが公開している ichikara-instruction-003-001-1.json 。CC-BY-NC-SAのライセンスを継承する。
  1. 問題点や改善点
  • promptに対して適切に答える場合もあるが、回答が短かったり、答えられない場合も散見されるため、更なる学習データの蓄積と事後学習を要する。
  1. 謝辞
  • 東京大学 松尾・岩澤研究室主催の大規模言語モデル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)

◇ 推論

  1. FastLanguageModel, PeftModelなどのインポート。(22sec)
  2. ベースモデルと作製したモデルのIDの貼り付け。
  3. 事後学習の際に使用したHugging FaceのTokenの指定。
  4. FastLanguageModelのインスタンス化。下のモデルとTokenizerを読み込む。  途中で、Grant accessをクックする。(3min)
  5. 元のモデルにQLoRAのadaptorを統合。tokenにHugging FaceのTokenを指定する。(8sec)
  6. elyza-tasks-100-TV_0.jsonlを読み込む。
  7. adaptorをつけたモデルでタスクの推論を行う。(6min)
  8. 推論結果をjsonlで保存。