--- base_model: llm-jp/llm-jp-3-13b tags: - text-generation-inference - transformers - unsloth - llama - trl license: apache-2.0 language: - en - ja --- # Uploaded model - **Developed by:** aino813 - **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. [](https://github.com/unslothai/unsloth) # 🧐 Instruction Tuning - このモデルは、以下のデータを用いて指示チューニング(Instruction Tuning)を行いました。 - 指示チューニングにあたっては、QLoRAを使っています。 ## 🤩 Datasets - 英語と非英語(日本語)のデータセットを使っています。 | データセット名 | 言語 | 件数 | 主な用途 | |-----------------------------------|--------|--------------|------------------------------------------| | databricks-dolly-15k | 英語 | 約15,000件 | 指示チューニング用 | | databricks-dolly-15k-ja | 日本語 | 約15,000件 | 日本語指示チューニング用 | | oasst1-21k-en | 英語 | 約21,000件 | 会話モデルや指示応答モデルのトレーニング | | oasst1-21k-ja | 日本語 | 約21,000件 | 日本語会話モデルや指示応答モデルのトレーニング | | ichikara-instruction-003-001 | 日本語 | 2,903件 | 日本語特化の指示チューニング | 1. **databricks-dolly-15k** - Databricksが公開した、指示応答形式のデータセット。 - 約15,000件の英語の指示・応答ペアを含む。 - 質問応答、説明、生成タスクなどが含まれる。 2. **databricks-dolly-15k-ja** - databricks-dolly-15kを日本語に翻訳したデータセット。 - 英語の指示・応答ペアを高品質な日本語翻訳に変換。 - 総件数: 約15000件。 3. **oasst1-21k-en** - Open Assistantが公開した、英語の指示応答データセット。 - 約21,000件の英語データを含む。 - コミュニティから収集したデータで、多様なタスクや質問形式が含まれる。 4. **oasst1-21k-ja** - oasst1-21k-enを日本語に翻訳したバージョン。 - 多様なタスクや指示形式に対応。 - 総件数: 約21,000件 5. **ichikara-instruction-003-001** - LLMのための日本語のシングルターン指示応答データセット。 - 約2,903件の日本語データ。 # Parameter | パラメータ名 | 値 | |--------------------------------------|----------------------------------------| | LoRA_r | 128 | | LoRA_alpha | 256 | | LoRA_dropout | 0.05 | | per_device_train_batch_size | 1 | | gradient_accumulation_steps | 16 | | max_steps | 150 | | warmup_ratio | 0.1 | | num_train_epochs | 2 | | learning_rate | 0.0001 | | embedding_learning_rate | 0.00001 | # 😚 License Apache-2.0 ライセンスに基づいて提供されています。 Apache License, Version 2.0 # 😉 Usage #### ライブラリーのインストール・アップグレード ``` !pip install -U bitsandbytes !pip install -U transformers !pip install -U accelerate !pip install -U datasets !pip install -U peft ``` #### ライブラリーのインポート ```python from transformers import ( AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig, ) from peft import PeftModel import torch from tqdm import tqdm import json ``` #### HF_TOKENの設定 ``` HF_TOKEN = "******************" ``` #### モデルidの指定 元のモデルとLoRAアダプターを指定します。LoRAアダプターのIDは本レポジトリになります。 ```python # omnicampas環境を使用する場合 model_id = "models/models--llm-jp--llm-jp-3-13b/snapshots/cd3823f4c1fcbb0ad2e2af46036ab1b0ca13192a" # omnicampas以外の環境を使用する場合(以下のコメントアウトを外す) # model_id = "llm-jp/llm-jp-3-13b" adapter_id = "aino813/llm-jp-3-13b-241213-SFT-dolly-oasst-ichikara-final_lora" ``` #### 量子化の設定 ```python bnb_config = BitsAndBytesConfig( load_in_4bit=True, bnb_4bit_quant_type="nf4", bnb_4bit_compute_dtype=torch.bfloat16, ) ``` #### 元のモデルとトークナイザーの読み込み ```python model = AutoModelForCausalLM.from_pretrained( model_id, quantization_config=bnb_config, device_map="auto", token = HF_TOKEN ) tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True, token = HF_TOKEN) ``` #### 元のモデルとLoRAアダプターの統合 ```python model = PeftModel.from_pretrained(model, adapter_id, token = HF_TOKEN) ``` #### 推論用データセットの読み込み ```python 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 = "" ``` #### 推論 ```python 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) attention_mask = torch.ones_like(tokenized_input) with torch.no_grad(): outputs = model.generate( tokenized_input, attention_mask=attention_mask, max_new_tokens=1024, do_sample=False, repetition_penalty=1.2, pad_token_id=tokenizer.eos_token_id )[0] output = tokenizer.decode(outputs[tokenized_input.size(1):], skip_special_tokens=True) results.append({"task_id": data["task_id"], "input": input, "output": output}) ``` #### Jsonlファイルの作成 ```python import re jsonl_id = re.sub(".*/", "", adapter_id) with open(f"./{jsonl_id}-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') ```