--- base_model: llm-jp/llm-jp-3-13b tags: - text-generation-inference - transformers - unsloth - llama - trl license: apache-2.0 language: - en - ja datasets: - weblab-GENIAC/aya-ja-nemotron-dpo-masked --- # 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](https://github.com/unslothai/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に関する以下のデータを追加したものを作成しました。 「だじゃれ」は客観的にもそうであるということがわかる言葉遊びであるためそれを意識して自分で例題を作り追加しました。 ```python:追加したjson [ { "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}) ``` 結果として大喜利については以下のような答えになっていました。 ```python:大喜利の答えについて {"task_id": 68, "input": "大喜利に挑戦してみましょう。大喜利とはお題に対して面白い回答を考える遊びです。大喜利のコツは色々とありますが、1つは「共感を呼ぶ答えをひとひねりする」ことです。誰もが経験したことや思ったことに対して、少し変わった視点や表現で回答することで、共感と笑いを誘うことができます。\n\nそれでは、以下のお題について大喜利で答えてください。\nお題:人間と仲良くなりたい妖精が取った行動とは?", "output": "\n人間と仲良くなりたい妖精が、ある日突然やってきて、こう言いました。\n\n「私、この仕事向いてません。辞めたいんです。あなたの会社紹介してもらえませんか?」"} ``` 思っていた形ではないですが、気にかけていた大喜利に対する回答としては向上したと思います。 [使用した/できそうなデータセット一覧(各自追加していただけるとありがたいです)](https://www.notion.so/6adbd79a4bc148da8ec1a5012572918f?pvs=21) Apache license 2.0 weblab-GENIAC/aya-ja-nemotron-dpo-masked [](https://github.com/unslothai/unsloth)