Uploaded model
- Developed by: daichira
- License: cc-by-nc-sa-4.0
- Finetuned from model : llm-jp/llm-jp-3-13b
This llama model was trained 2x faster with Unsloth and Huggingface's TRL library.
README
# LLM-JP-3-13B-ITNEW8
## **概要**
このモデルは、日本語対応の大規模言語モデル (LLM) `llm-jp/llm-jp-3-13b` を基に、指示応答タスク向けに微調整を施したモデルです。4bit量子化 (qLoRA) を活用し、Unsloth と Hugging Face の TRL ライブラリを使用して効率的な微調整を実現しました。
---
## **特徴**
- **モデル名:** `llm-jp-3-13b-itnew8`
- **ベースモデル:** `llm-jp/llm-jp-3-13b`
- **微調整目的:** 日本語での指示応答能力を強化。
- **量子化:** 4bit qLoRA によりメモリ効率を向上。
---
## **微調整の詳細**
### **使用データセット**
1. **主要データセット:** `ichikara-instruction-003-001-1.json`
2. **追加データセット:** `DeL-TaiseiOzaki/Tengentoppa-sft-v1.0`
(この中から30,000件を抽出して微調整に使用)
**データフォーマット例:**
```plaintext
### 指示
文章の要約を生成してください。
### 回答
この文章の要約です。
ハードウェアと設定
- 使用GPU: NVIDIA L4 24GB
- シーケンス長: 1024(RoPE対応)
- 有効バッチサイズ: 24
- 学習率: 3e-4
- エポック数: 1
モデル構造
- 量子化: 4bit qLoRA
- LoRAパラメータ設定:
r=32
lora_alpha=32
lora_dropout=0.05
- LoRA適用対象モジュール:
q_proj
,k_proj
,v_proj
,o_proj
,gate_proj
,up_proj
,down_proj
使用方法
以下のコードを使用して、日本語の指示応答を生成できます。
from transformers import AutoTokenizer, AutoModelForCausalLM
# モデルとトークナイザーのロード
model_name = "your-hf-username/llm-jp-3-13b-itnew9"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)
# 指示応答の生成
instruction = "次の文章を要約してください。"
prompt = f"### 指示\n{instruction}\n### 回答\n"
inputs = tokenizer(prompt, return_tensors="pt")
outputs = model.generate(**inputs, max_new_tokens=128)
# 応答を表示
response = tokenizer.decode(outputs[0], skip_special_tokens=True)
print(response)
参考
このモデルは以下を活用して開発されました:
- Unsloth: LoRA微調整を効率的に実現。
- Hugging Face Transformers: トレーニングとモデル管理。
ライセンス
本モデルは CC-BY-NC-SA 4.0 ライセンスのもとで提供されています。このため、商用利用は制限されています。また、ベースモデル(llm-jp/llm-jp-3-13b
)およびデータセットのライセンス条件も遵守してください。
注意点と制約
- 本モデルは日本語の指示応答タスクに最適化されています。他のタスクや言語では性能が十分でない可能性があります。
- 現在のライセンス条件により、商用利用は許可されていません。
#以下、実行コード
# llm-jp/llm-jp-3-13bを4bit量子化のqLoRA設定でロード。
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from unsloth import FastLanguageModel
import torch
#max_seq_length = 512 # unslothではRoPEをサポートしているのでコンテキスト長は自由に設定可能
max_seq_length = 1024 # unslothではRoPEをサポートしているのでコンテキスト長は自由に設定可能
dtype = None # Noneにしておけば自動で設定
load_in_4bit = True # 今回は8Bクラスのモデルを扱うためTrue
#model_id = "llm-jp/llm-jp-3-13b"
model_id = "daichira/llm-jp-3-13b-finetune2"
#llm-jp-3-13b-finetune-2:ichikara-instruction-003-001-1.jsonでsft
#llm-jp-3-13b-itnew8:llm-jp-3-13b-finetune2をベースにDeL-TaiseiOzaki/Tengentoppa-sft-v1.0から3万行抽出してsft
new_model_id = "llm-jp-3-13b-itnew9" #Fine-Tuningしたモデルにつけたい名前
# FastLanguageModel インスタンスを作成
model, tokenizer = FastLanguageModel.from_pretrained(
model_name=model_id,
dtype=dtype,
load_in_4bit=load_in_4bit,
trust_remote_code=True,
)
# SFT用のモデルを用意
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,
)
from google.colab import output
output.disable_custom_widget_manager()
import os
from datasets import load_dataset
# データセットをロード
dataset = load_dataset("DeL-TaiseiOzaki/Tengentoppa-sft-v1.0", split="train")
# 1ファイルあたりの行数
chunk_size = 30000
# データセットを分割して保存
output_dir = "/content/tengentoppa_chunks" # 保存先ディレクトリ
os.makedirs(output_dir, exist_ok=True)
# 全データを分割し、番号付きでJSON形式で保存
total_rows = len(dataset)
num_chunks = (total_rows + chunk_size - 1) // chunk_size # 切り上げでチャンク数を計算
for i in range(num_chunks):
start_idx = i * chunk_size
end_idx = min(start_idx + chunk_size, total_rows)
chunk = dataset.select(range(start_idx, end_idx)) # 分割部分を選択
chunk_file = f"{output_dir}/tengentoppa_chunk_{i+1}.json"
chunk.to_json(chunk_file) # JSON形式で保存
print(f"Saved chunk {i+1}/{num_chunks} to {chunk_file}")
print("All chunks have been saved!")
# Step 2: JSON形式で保存
json_path = "/content/tengentoppa_chunks/tengentoppa_chunk_3.json"
#subset.to_json(json_path)
# Step 3: JSON形式で再読み込み
from datasets import load_dataset
# JSONファイルをロード
dataset = load_dataset("json", data_files=json_path)
# データセット内容の確認
print(dataset)
# 学習時のプロンプトフォーマットの定義
prompt = """### 指示
{}
### 回答
{}"""
"""
formatting_prompts_func: 各データをプロンプトに合わせた形式に合わせる
"""
EOS_TOKEN = tokenizer.eos_token # トークナイザーのEOSトークン(文末トークン)
def formatting_prompts_func(examples):
# input = examples["text"] # 入力データ
input = examples["instruction"] # 入力データ
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 trl import SFTTrainer
from transformers import TrainingArguments
from unsloth import is_bfloat16_supported
trainer = SFTTrainer(
model=model,
tokenizer=tokenizer,
train_dataset=dataset["train"],
max_seq_length=max_seq_length,
dataset_text_field="formatted_text",
packing=False,
args=TrainingArguments(
per_device_train_batch_size=6, # デバイスごとのバッチサイズ
gradient_accumulation_steps=4, # 勾配蓄積
num_train_epochs=1, # エポック数
logging_steps=50, # ログ記録の間隔
warmup_steps=500, # ウォームアップステップ
save_steps=500, # チェックポイント保存間隔
save_total_limit=2, # 保存するモデルの数
max_steps=-1, # 全データを1エポック分学習する設定
learning_rate=3e-4, # 学習率
fp16=not is_bfloat16_supported(), # FP16使用
bf16=is_bfloat16_supported(), # BF16使用
group_by_length=True, # シーケンス長でバッチをグループ化
seed=3407, # ランダムシード
output_dir="outputs", # 出力先ディレクトリ
),
)
# 学習実行前にCUDAキャッシュをクリア
torch.cuda.empty_cache()
#@title 学習実行
trainer_stats = trainer.train()
Model tree for daichira/llm-jp-3-13b-itnew8
Base model
llm-jp/llm-jp-3-13b