This model is based on a model originally licensed under the Apache License 2.0, fine-tuned using a dataset licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International (CC-BY-NC-SA 4.0).
As a result of the dataset's licensing terms, this model and any derived works are distributed under the CC-BY-NC-SA 4.0 license.
Please note that the Apache License 2.0 conditions apply to the base model, but the CC-BY-NC-SA 4.0 license restricts the commercial use of this fine-tuned version.
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.md
# LLM-JP-3-13B-FINETUNE2
## **概要**
このモデルは、日本語対応の大規模言語モデル(LLM)`llm-jp/llm-jp-3-13b` をベースとして、指示応答タスク向けに微調整(Supervised Fine-Tuning, SFT)を施したモデルです。4bit量子化 (bnb) を利用し、LoRA アプローチで効率的な微調整を実現しました。
---
## **特徴**
- **モデル名:** `llm-jp-3-13b-finetune2`
- **ベースモデル:** `llm-jp/llm-jp-3-13b`
- **微調整目的:** 日本語の指示応答能力を強化。
- **量子化:** 4bit (NF4形式)
- **LoRA設定:**
- ランク: 16
- ドロップアウト率: 5%
- LoRA適用対象: モデル内の線形層
- **学習データ:** `ichikara-instruction-003-001-1.json`
---
## **微調整の詳細**
### **使用データセット**
- データセット名: `ichikara-instruction-003-001-1.json`
- データ内容: 指示文(`text`)とそれに対応する応答(`output`)を含む形式。
**フォーマット例:**
```plaintext
{
"text": "次の文章を要約してください。",
"output": "この文章の要約です。"
}
プロンプト変換後:
### 指示
次の文章を要約してください。
### 回答
この文章の要約です。
ハードウェアと設定
- 使用GPU: NVIDIA L4 24GB
- シーケンス長: 512
- バッチサイズ: 1(デバイスごと)
- 学習率: 2e-4
- エポック数: 1
- 最適化アルゴリズム: Paged AdamW 32bit
モデル構造
- 量子化: 4bit (NF4)
- LoRA設定:
- ランク: 16
- LoRAスケーリング係数: 32
- ドロップアウト率: 5%
- ターゲットモジュール: モデル内の4bit量子化線形層
使用方法
以下のコードを使用して、このモデルで指示応答を生成できます。
from transformers import AutoTokenizer, AutoModelForCausalLM
# モデルとトークナイザーのロード
model_name = "your-hf-username/llm-jp-3-13b-finetune2"
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)
参考
このモデルの開発には以下の技術を活用しました:
- Hugging Face Transformers: トレーニングとモデル管理。
- PEFT: LoRAによる効率的な微調整。
- BitsAndBytes: 4bit量子化によるメモリ効率の向上。
ライセンス
本モデルは CC-BY-NC-SA 4.0 ライセンスのもとで提供されています。このため、商用利用は制限されています。また、ベースモデル(llm-jp/llm-jp-3-13b
)およびデータセットのライセンス条件も遵守してください。
注意点と制約
- 本モデルは日本語の指示応答タスクに最適化されています。他のタスクや言語では性能が十分でない可能性があります。
- 現在のライセンス条件により、商用利用は許可されていません。
##実行コード
# Install Flash Attention 2 for softcapping support
import torch
if torch.cuda.get_device_capability()[0] >= 8:
!pip install --no-deps packaging ninja einops "flash-attn>=2.6.3"
# 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をサポートしているのでコンテキスト長は自由に設定可能
dtype = None # Noneにしておけば自動で設定
load_in_4bit = True # 今回は8Bクラスのモデルを扱うためTrue
model_id = "llm-jp/llm-jp-3-13b"
new_model_id = "llm-jp-3-13b-finetune2" #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,
)
# Hugging Face Token
HF_TOKEN = "write権限のあるトークン"
#llm-jp-3-13b-finetune2:ichikara-instruction-003-001-1.jsonでsft
from google.colab import output
output.disable_custom_widget_manager()
!pip install datasets
from datasets import load_dataset
dataset = load_dataset("json", data_files="./ichikara-instruction-003-001-1.json")
# 学習時のプロンプトフォーマットの定義
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, # 並列処理数を指定
)
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 = 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",
),
)
# 学習実行前にCUDAキャッシュをクリア
torch.cuda.empty_cache()
#@title 学習実行
trainer_stats = trainer.train()
# Sample Use
以下は、elaza-tasks-100-TV_0.jsonlの回答のためのコードです。
'''python
from transformers import (
AutoModelForCausalLM,
AutoTokenizer,
BitsAndBytesConfig,
)
import torch
from tqdm import tqdm
import json
HF_TOKEN ="Your_token"
model_name = "daichira/llm-jp-3-13b-finetune2"
bnb_config = BitsAndBytesConfig(
load_in_4bit=True,
bnb_4bit_quant_type="nf4",
bnb_4bit_compute_dtype=torch.bfloat16,
bnb_4bit_use_double_quant=False,
)
model = AutoModelForCausalLM.from_pretrained(
model_name,
quantization_config=bnb_config,
device_map="auto",
token = HF_TOKEN
)
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True, token = HF_TOKEN)
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 data in tqdm(datasets):
input = data["input"]
prompt = f"""### 指示
{input}### 回答:
"""
tokenized_input = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt").to(model.device)
with torch.no_grad():
outputs = model.generate(
tokenized_input,
max_new_tokens=100,
do_sample=False,
repetition_penalty=1.2
)[0]
output = tokenizer.decode(outputs[tokenized_input.size(1):], skip_special_tokens=True)
results.append({"task_id": data["task_id"], "input": input, "output": output})
import re
model_name = re.sub(".*/", "", model_name)
with open(f"./{model_name}-outputs.jsonl", 'w', encoding='utf-8') as f:
for result in results:
json.dump(result, f, ensure_ascii=False) # ensure_ascii=False for handling non-ASCII characters
f.write('\n')
''''
Model tree for daichira/llm-jp-3-13b-finetune2
Base model
llm-jp/llm-jp-3-13b