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)

参考

このモデルの開発には以下の技術を活用しました:


ライセンス

本モデルは 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')
''''
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference API
Unable to determine this model’s pipeline type. Check the docs .

Model tree for daichira/llm-jp-3-13b-finetune2

Finetuned
(1132)
this model