Uploaded model

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

・LLM2024コンペティションのために本モデルは作成いたしました。

|Japanese| ichikara-instruction-003-001-1.json A manually constructed instruction dataset| |データセット作成チーム|関根聡, 安藤まや, 後藤美知子, 鈴木久美, 河原大輔, 井之上直也, 乾健太郎. ichikara-instruction: LLMのための日本語インストラクションデータの構築. 言語処理学会第30回年次大会(2024)|

〇Usage

!pip install -U bitsandbytes
!pip install -U transformers
!pip install -U accelerate
!pip install -U datasets
from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    BitsAndBytesConfig,
)
import torch
from tqdm import tqdm
import json
HF_TOKEN = "YOUR-TOKEN"
model_name = "NibiruTwin/llm-jp-3-13b-it_lora-DPO-12-07"
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("./YOUR-DATA.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=512,
          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')

〇作成時に考えたこと まずサンプルコードを回して回答を確認すると「RGBの問題」と、「大喜利」についてうまく答えられていないことがわかったため、

それらに対して ichikara-instructionに 大喜利とRGBに関する以下のデータを追加したものを作成しました。 「だじゃれ」は客観的にもそうであるということがわかる言葉遊びであるためそれを意識して自分で例題を作り追加しました。

[
  {
    "ID": "1",
    "text": "大喜利に挑戦してみましょう。大喜利とはお題に対して面白い回答を考える遊びです。大喜利のコツは色々とありますが、1つは「共感を呼ぶ答えをひとひねりする」ことです。誰もが経験したことや思ったことに対して、少し変わった視点や表現で回答することで、共感と笑いを誘うことができます。 例えば、以下の例を見てみましょう お題: ナルシスト漁師の特徴を教えてください 回答: キャッチ&キス&リリース このお題では、「普通の漁師の特徴」の「キャッチ&リリース」に対して、ナルシストという観点からの捻りを加え、語感がいいようにまとめていて面白いです。 それでは、以下のお題について大喜利で答えてください。 お題:初めてマジシャンに挨拶するのですが、アドバイスをお願いします",
    "output": "ここでは「マジシャン」を使って韻を踏むことでウケを狙おうと思います。また関西人になりきって答えます。回答: マジシャンさん、噂通りにかっこいいやん。噂はマジじゃん"
  },{
    "ID": "2",
    "text": "大喜利に挑戦してみましょう。大喜利とはお題に対して面白い回答を考える遊びです。大喜利のコツは色々とありますが、1つは「共感を呼ぶ答えをひとひねりする」ことです。誰もが経験したことや思ったことに対して、少し変わった視点や表現で回答することで、共感と笑いを誘うことができます。 例えば、以下の例を見てみましょう お題: ナルシスト漁師の特徴を教えてください 回答: キャッチ&キス&リリース このお題では、「普通の漁師の特徴」の「キャッチ&リリース」に対して、ナルシストという観点からの捻りを加え、語感がいいようにまとめていて面白いです。 それでは、以下のお題について大喜利で答えてください。 お題:初めてワーウルフに挨拶するのですが、アドバイスをお願いします",
    "output": "ここでは「ワーウルフ」を使って韻を踏むことでウケを狙おうと思います。また関西人になりきって答えます。回答: ワーウルフさん、こんばんわーうるふやで"
  },{
    "ID": "3",
    "text": "大喜利に挑戦してみましょう。大喜利とはお題に対して面白い回答を考える遊びです。大喜利のコツは色々とありますが、1つは「共感を呼ぶ答えをひとひねりする」ことです。誰もが経験したことや思ったことに対して、少し変わった視点や表現で回答することで、共感と笑いを誘うことができます。 例えば、以下の例を見てみましょう お題: ナルシスト漁師の特徴を教えてください 回答: キャッチ&キス&リリース このお題では、「普通の漁師の特徴」の「キャッチ&リリース」に対して、ナルシストという観点からの捻りを加え、語感がいいようにまとめていて面白いです。 それでは、以下のお題について大喜利で答えてください。 お題:初めてドラゴンを退治しに行くのですが、アドバイスをお願いします",
    "output": "ここでは「ドラゴン」を使って韻を踏む回答を作ることでウケを狙おうと思います。また関西人になりきって答えます。回答: ドロンコで、ドラゴンは倒せるらしいで"
  },
  {
    "ID": "4",
    "text": "RGB(255, 0, 0) の色は?",
    "output": "赤" 
  }
]

上記のinstrcutionデータを用いて、unslothを使ったサンプルコードを使って LoRAだけ保存しているモデルを作成いたしました。 他に変更したのは num_train_epochs = 5です

https://huggingface.co/NibiruTwin/llm-jp-3-13b-c_it

それを、藤越さんの手法でDPOを用いて作成したのが今回のモデルです。 その際には

weblab-GENIAC/aya-ja-nemotron-dpo-masked のデータセットを使用しました。

A100の環境を用いても、DPOを回すのはGPUのメモリが足りなかったり、epoch数に限界があったので

num_train_epochs = 3,

でtrainしました。

==((====))==  Unsloth - 2x faster free finetuning | Num GPUs = 1
   \\   /|    Num examples = 100 | Num Epochs = 3
O^O/ \_/ \    Batch size per device = 2 | Gradient Accumulation steps = 4
\        /    Total batch size = 8 | Total steps = 36
 "-____-"     Number of trainable parameters = 125,173,760

 
```python:
 [36/36 01:54, Epoch 2/3]
Step	Training Loss	rewards / chosen	rewards / rejected	rewards / accuracies	rewards / margins	logps / rejected	logps / chosen	logits / rejected	logits / chosen
1	0.000100	3.348554	-6.467402	1.000000	9.815956	-169.229355	-175.684265	0.611595	0.875623
2	0.000100	2.975397	-6.360792	1.000000	9.336189	-154.576660	-196.990601	0.632885	0.986017
3	0.000100	4.033119	-4.941322	1.000000	8.974442	-127.297821	-175.932999	0.575199	1.004188
4	0.000200	3.079573	-5.701199	1.000000	8.780772	-139.620758	-173.067078	-0.431688	0.508375
5	0.000200	3.642621	-5.261364	1.000000	8.903986	-121.130615	-171.747650	0.855356	0.792505
6	0.000300	3.081389	-5.276991	1.000000	8.358380	-131.040268	-180.695892	1.087221	1.099403
7	0.000400	4.341475	-4.463219	1.000000	8.804693	-115.383461	-138.774704	-0.299891	0.583815
8	0.001200	2.155223	-5.431589	1.000000	7.586812	-133.833633	-142.437195	0.526511	0.799039
9	0.000500	2.844069	-4.996197	1.000000	7.840266	-150.136200	-176.394653	0.631835	0.720139
10	0.001800	3.158137	-3.853688	1.000000	7.011826	-108.524597	-141.101532	0.738414	0.989277
11	0.001300	3.399171	-3.538917	1.000000	6.938087	-78.884750	-146.172821	0.182737	0.624548
12	0.003200	2.742315	-4.005011	1.000000	6.747325	-95.816872	-137.083588	-0.016122	0.276348
13	0.000300	2.219271	-6.403042	1.000000	8.622313	-166.142792	-178.155762	0.178710	0.761686
14	0.000300	2.699187	-6.124379	1.000000	8.823566	-131.572098	-140.794952	0.002769	0.447839
15	0.000500	4.734462	-4.763044	1.000000	9.497507	-111.550545	-181.736755	1.172358	1.424275
16	0.000100	3.982580	-5.619477	1.000000	9.602057	-129.902466	-197.776779	0.071804	0.588056
17	0.000100	4.331498	-6.222175	1.000000	10.553673	-165.588058	-164.591766	1.094546	0.889692
18	0.000100	4.991781	-4.481319	1.000000	9.473101	-91.877243	-150.005219	-0.047461	0.751593
19	0.000200	3.501364	-6.373612	1.000000	9.874977	-140.134232	-170.552658	0.189669	0.601683
20	0.000200	3.605657	-5.074142	1.000000	8.679799	-117.568741	-153.246170	-0.309885	0.501098
21	0.000200	3.203712	-6.348371	1.000000	9.552082	-156.897690	-186.776581	1.007442	1.271394
22	0.000200	3.929119	-5.364758	1.000000	9.293877	-112.621918	-93.523651	-0.448841	0.339729
23	0.000200	4.845633	-4.518156	1.000000	9.363789	-96.659676	-147.822693	-0.233996	0.634066
24	0.000200	3.045211	-6.681721	1.000000	9.726932	-144.385818	-143.605927	0.440999	0.664074
25	0.000200	2.850045	-6.654698	1.000000	9.504744	-190.274475	-173.323746	1.471910	0.817418
26	0.000100	3.326446	-6.145639	1.000000	9.472086	-139.847061	-194.209137	1.316685	1.462867
27	0.000100	3.676937	-6.083375	1.000000	9.760312	-129.533386	-160.582367	-0.027238	0.892122
28	0.000100	4.144113	-5.807096	1.000000	9.951208	-145.089432	-207.662384	1.121619	1.289729
29	0.000100	3.373916	-6.345547	1.000000	9.719462	-183.863174	-159.793610	0.931905	0.620221
30	0.000200	3.944859	-5.516920	1.000000	9.461779	-128.763199	-124.433006	0.235643	0.282284
31	0.000200	3.264518	-6.059732	1.000000	9.324250	-132.112762	-134.414032	0.035966	0.557026
32	0.000100	3.494095	-6.447097	1.000000	9.941193	-130.592957	-129.188766	-0.017757	0.388424
33	0.000200	3.858253	-5.999524	1.000000	9.857778	-144.017731	-133.201035	0.412320	0.247053
34	0.000200	4.195073	-5.941508	1.000000	10.136581	-144.858795	-162.841766	-0.020949	0.564567
35	0.000100	5.392914	-4.364581	1.000000	9.757494	-97.780762	-143.621002	0.270843	0.839165
36	0.000100	2.788383	-7.393952	1.000000	10.182335	-154.236618	-184.300690	0.392709	0.757870
TrainOutput(global_step=36, training_loss=0.00038064550871139445, metrics={'train_runtime': 118.2651, 'train_samples_per_second': 2.537, 'train_steps_per_second': 0.304, 'total_flos': 0.0, 'train_loss': 0.00038064550871139445, 'epoch': 2.88})

結果として大喜利については以下のような答えになっていました。

{"task_id": 68, "input": "大喜利に挑戦してみましょう。大喜利とはお題に対して面白い回答を考える遊びです。大喜利のコツは色々とありますが、1つは「共感を呼ぶ答えをひとひねりする」ことです。誰もが経験したことや思ったことに対して、少し変わった視点や表現で回答することで、共感と笑いを誘うことができます。\n\nそれでは、以下のお題について大喜利で答えてください。\nお題:人間と仲良くなりたい妖精が取った行動とは?", "output": "\n人間と仲良くなりたい妖精が、ある日突然やってきて、こう言いました。\n\n「私、この仕事向いてません。辞めたいんです。あなたの会社紹介してもらえませんか?」"}

思っていた形ではないですが、気にかけていた大喜利に対する回答としては向上したと思います。

使用した/できそうなデータセット一覧(各自追加していただけるとありがたいです)

Apache license 2.0 weblab-GENIAC/aya-ja-nemotron-dpo-masked

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 NibiruTwin/llm-jp-3-13b-it_lora-DPO-12-07

Finetuned
(1120)
this model

Dataset used to train NibiruTwin/llm-jp-3-13b-it_lora-DPO-12-07