Uploaded model

  • Developed by: demidemi
  • 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.


base_model: llm-jp/llm-jp-3-13b tags: - text-generation-inference - transformers - unsloth - llama - trl license: apache-2.0 language: - en

東京大学 松尾・岩澤研究室 大規模言語モデル2024

https://weblab.t.u-tokyo.ac.jp/lecture/course-list/large-language-model/

  • 約4000名の方が受講。修了率30%>1200名程度
    • 学生:約2400名
    • 社会人:約1600名
      • スタートアップ 約700名
      • 研究者 約390名
      • 公務員 約140名
      • JDLA会員 約110名
      • メタバース工学部 約90名
      • コミュニティ限定等 約70名
      • 東京大学の教職員 約50名
      • その他 約50名

image/png

image/png

Author&Affiliation

作成日:2024年11月30日  作成者:出水利樹(demidemi) #SoftBank #MONET Technologies

最終コンペ実施期間: 2024年11月20日~12月17日(火) 1,330人参加

11月30日: 「第07位」 記念スクショ済み((((;゚Д゚))))

最終: 「第47位」 

Point

1.SampleCodeベース&無課金Colab

2.有志の方々のおススメ設定を幾つか実施したのみ

 ⇒コンテキスト長の設定がドンピシャだったのか(勘)??

Explanation

このコードを簡単に説明すると、「AIをさらに賢くするために、既存のAIモデルを細かく調整して新しい用途に適応させる」 という作業をGoogle Colab上で行うプログラムです。

以下、文系営業向けにわかりやすく説明します。

  1. 何をしている? AIモデルを改良する作業をしています。 具体的には、「日本語で指示を出すと、それに応じた回答を返すAI」を自社の用途に特化させている最中です。

  2. どんな準備をしている? 必要なツールのインストール 最初の部分で、「unsloth」という特別なAIツールや「PyTorch」というAIを動かすためのソフトを準備しています。 これらは、AIを効率よく動かしたり、新しいことを学ばせるために必要です。

  3. モデルの読み込みと設定 元になるAIを用意 model_id = "llm-jp/llm-jp-3-13b" というIDから、元のAIモデルを取り出しています。 AIに新しい名前をつける 新しく改良したAIに「llm-jp-3-13b-finetune-ex」という名前を付けています。

  4. AIに教える材料を準備 データセットの加工 AIに教えるためのデータ(例: 指示とその正しい回答)を「わかりやすい形」に整えています。 AIが読みやすい形式にして、「これが入力、これが出力」という形で渡します。

  5. 訓練(AIを賢くするプロセス) 訓練の設定 AIを訓練するためのルールを細かく決めています。たとえば: どれくらいの速さで学ばせるか(学習率) どのくらいデータを使って練習するか(バッチサイズ、エポック数) 実際に訓練 用意したデータを使って、AIが「正しい回答を出せるように」練習させます。

  6. 訓練結果を確認 訓練が終わった後のAIにいくつかテストをして、「ちゃんと賢くなったか?」をチェックしています。

  7. 改良したAIを保存 改良したAIを特定の場所(インターネット上の「保管庫」)に保存して、いつでも再利用できるようにしています。 文系営業向けポイント このコードは「AIの頭脳をさらに良くする手順」を書いたものです。営業に例えるなら、 「AIモデル」は新人営業マンで、「データセット」は営業マニュアル、 「訓練」はそのマニュアルをもとにロープレする過程にあたります。 コードの目的は、この新人営業マンが特定のお客様のニーズに完璧に応えられるように教育することです。

Sample Use

以下は、elyza-tasks-100-TV_0.jsonlの回答用モデルコードです!

-- coding: utf-8 --

"""
llm-jp-3-13b-finetune2.ipynb

Automatically generated by Colab.

Original file is located at
    https://colab.research.google.com/drive/1TLF_HtVz6ng9ZAWe7lHy59kiHBg3_3y0
"""

!pip uninstall unsloth -y
!pip install --upgrade --no-cache-dir "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"

!pip install --upgrade torch
!pip install --upgrade xformers

!pip install ipywidgets --upgrade

import torch
if torch.cuda.is_available() and torch.cuda.get_device_capability()[0] >= 8:  # まず torch.cuda.is_available() を使ってGPUが存在するかどうかを確認し、存在する場合にのみその次のチェック( torch.cuda.get_device_capability()[0] >= 8)を行います。これにより、GPUが存在しない環境でもエラーを回避
    !pip install --no-deps packaging ninja einops "flash-attn>=2.6.3"

pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118

from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from unsloth import FastLanguageModel
import torch
max_seq_length = 888 # unslothではRoPEをサポートしているのでコンテキスト長は自由に設定可能。2回目Tryは少し大きめ設定。
dtype = None # Noneにしておけば自動で設定
load_in_4bit = True # 今回は8Bクラスのモデルを扱うためTrue

model_id = "llm-jp/llm-jp-3-13b"
new_model_id = "llm-jp-3-13b-finetune-ex" #Fine-Tuningしたモデルにつけたい名前
# FastLanguageModel インスタンスを作成
model, tokenizer = FastLanguageModel.from_pretrained(
    model_name=model_id,
    dtype=dtype,
    load_in_4bit=load_in_4bit,
    trust_remote_code=True,
)

model = FastLanguageModel.get_peft_model(
    model,
    r = 32,
    target_modules = ["q_proj", "k_proj", "v_proj", "o_proj",
                      "gate_proj", "up_proj", "down_proj",],
    lora_alpha = 32,
    lora_dropout = 0.05,
    bias = "none",
    use_gradient_checkpointing = "unsloth",
    random_state = 3407,
    use_rslora = False,
    loftq_config = None,
    max_seq_length = max_seq_length,)

HF_TOKEN = "*****" #@param {type:"string"} #My token is secret! by demimomi

from datasets import load_dataset

dataset = load_dataset("elyza/ELYZA-tasks-100")

dataset = dataset.remove_columns('eval_aspect') 

dataset = dataset.rename_columns({'input':'text'})

prompt = """### 指示
{}
### 回答
{}"""



"""
formatting_prompts_func: 各データをプロンプトに合わせた形式に合わせる
"""
EOS_TOKEN = tokenizer.eos_token # トークナイザーのEOSトークン(文末トークン)
def formatting_prompts_func(examples):
    input = examples["text"] # 入力データ
    output = examples["output"] # 出力データ
    text = prompt.format(input, output) + EOS_TOKEN # プロンプトの作成
    return { "formatted_text" : text, } # 新しいフィールド "formatted_text" を返す
pass

# # 各データにフォーマットを適用
dataset = dataset.map(
    formatting_prompts_func,
    num_proc= 4, # 並列処理数を指定
)

dataset

from google.colab import output
output.enable_custom_widget_manager()

"""Support for third party widgets will remain active for the duration of the session. To disable support:"""

from google.colab import output
output.disable_custom_widget_manager()

print(dataset["test"]["formatted_text"][3])

"""
training_arguments: 学習の設定

  - output_dir:
      -トレーニング後のモデルを保存するディレクトリ

  - per_device_train_batch_size:
      - デバイスごとのトレーニングバッチサイズ

  - per_device_eval_batch_size:
      - デバイスごとの評価バッチサイズ

  - gradient_accumulation_steps:
      - 勾配を更新する前にステップを積み重ねる回数

  - optim:
      - オプティマイザの設定

  - num_train_epochs:
      - エポック数

  - eval_strategy:
      - 評価の戦略 ("no"/"steps"/"epoch")

  - eval_steps:
      - eval_strategyが"steps"のとき、評価を行うstep間隔

  - logging_strategy:
      - ログ記録の戦略

  - logging_steps:
      - ログを出力するステップ間隔

  - warmup_steps:
      - 学習率のウォームアップステップ数

  - save_steps:
      - モデルを保存するステップ間隔

  - save_total_limit:
      - 保存しておくcheckpointの数

  - max_steps:
      - トレーニングの最大ステップ数

  - learning_rate:
      - 学習率

  - fp16:
      - 16bit浮動小数点の使用設定(第8回演習を参考にすると良いです)

  - bf16:
      - BFloat16の使用設定

  - group_by_length:
      -  入力シーケンスの長さによりバッチをグループ化 (トレーニングの効率化)

  - report_to:
      - ログの送信先 ("wandb"/"tensorboard"など)
"""
from trl import SFTTrainer
from transformers import TrainingArguments
from unsloth import is_bfloat16_supported

trainer = SFTTrainer(
    model = model,
    tokenizer = tokenizer,
    train_dataset=dataset["test"],
    max_seq_length = max_seq_length,
    dataset_text_field="formatted_text",
    packing = False,
    args = TrainingArguments(
        per_device_train_batch_size = 2,
        gradient_accumulation_steps = 4,
        num_train_epochs = 1,
        logging_steps = 10,
        warmup_steps = 10,
        save_steps=100,
        save_total_limit=2,
        max_steps=-1,
        learning_rate = 2e-4,
        fp16 = not is_bfloat16_supported(),
        bf16 = is_bfloat16_supported(),
        group_by_length=True,
        seed = 3407,
        output_dir = "outputs",
        report_to = "none",
    ),
)

from google.colab import output
output.enable_custom_widget_manager()

"""Support for third party widgets will remain active for the duration of the session. To disable support:"""

from google.colab import output
output.disable_custom_widget_manager()

gpu_stats = torch.cuda.get_device_properties(0)
start_gpu_memory = round(torch.cuda.max_memory_reserved() / 1024 / 1024 / 1024, 3)
max_memory = round(gpu_stats.total_memory / 1024 / 1024 / 1024, 3)
print(f"GPU = {gpu_stats.name}. Max memory = {max_memory} GB.")
print(f"{start_gpu_memory} GB of memory reserved.")

trainer_stats = trainer.train()

import json
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 = ""

from tqdm import tqdm

FastLanguageModel.for_inference(model)

results = []
for dt in tqdm(datasets):
  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})

with open(f"{new_model_id}_output.jsonl", 'w', encoding='utf-8') as f:
    for result in results:
        json.dump(result, f, ensure_ascii=False)
        f.write('\n')

with open(f"{new_model_id}_output.jsonl", 'w', encoding='utf-8') as f:
    for result in results:
        json.dump(result, f, ensure_ascii=False)
        f.write('\n')

model.push_to_hub_merged(
    new_model_id,
    tokenizer=tokenizer,
    save_method="lora",
    token=HF_TOKEN,
    private=True
)
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model is not currently available via any of the supported Inference Providers.
The model cannot be deployed to the HF Inference API: The model has no pipeline_tag.

Model tree for demimomi/llm-jp-3-13b-finetune-ex

Finetuned
(1124)
this model