--- base_model: llm-jp/llm-jp-3-13b tags: - text-generation-inference - transformers - unsloth - llama - trl license: apache-2.0 datasets: - elyza-tasks-100-TV model_creator: Toshi2023 model_type: llama inference: true fine_tuned_from: llm-jp/llm-jp-3-13b --- # 推論用コード 本コードは**unsloth**で学習したqLoRAのアダプタを用いて**ELYZA-tasks-100-TV**の出力を得るためのコードです。 Hugging Faceにアダプタをアップロードしてあることが前提となります。 このコードは**unslothライブラリ**を用いてモデルを読み込み、推論するためのコードとなります。 このコードで生成された**jsonlファイル**は課題の成果として提出可能なフォーマットになっております。 ※本コードは**Google Colab**での動作を想定しており、**Omnicampus**での動作を想定しておりません。 Omnicampus向けのコードは別途用意します。 --- ## 必要なライブラリをインストール ```bash %%capture !pip install unsloth !pip uninstall unsloth -y && pip install --upgrade --no-cache-dir "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git" !pip install -U torch !pip install -U peft ```markdown ### Hugging Face Tokenの設定例 Hugging FaceのTokenを設定するには、以下のURLから取得したTokenを `HF_TOKEN` に代入してください。 ```python HF_TOKEN = "YOUR_HUGGINGFACE_TOKEN" # ここに取得したTokenを入力 ご自身で実行して動作確認する際は、必ず自分のトークンを入れてください。 ### 推論手順 モデルとアダプタの読み込み model_id = "llm-jp/llm-jp-3-13b" adapter_id = "Toshi2023/llm-jp-3-13b-it_lora" from unsloth import FastLanguageModel from peft import PeftModel # PEFTのLoRA適用モデルを読み込む import json dtype = None # Noneにしておけば自動で設定 load_in_4bit = True # 今回は13Bモデルを扱うためTrue model, tokenizer = FastLanguageModel.from_pretrained( model_name=model_id, dtype=dtype, load_in_4bit=load_in_4bit, trust_remote_code=True, ) model = PeftModel.from_pretrained(model, adapter_id, token=HF_TOKEN) Hugging Faceのモデルとアダプタを指定します。 データセットの準備 学習用データセットはIchikara Instructionデータセットです。 事前にデータをアップロードしてください。 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 = "" # 推論の実行 モデルを用いてデータの推論を行い、結果をjsonl形式で保存します。 ### 推論コードの追加 以下のコードで推論を実行し、結果を保存します。 ```python from tqdm import tqdm import re # 推論するためにモデルのモードを変更 FastLanguageModel.for_inference(model) results = [] for dt in tqdm(datasets): input = dt["input"] prompt = f"""### 指示\n{input}\n### 回答\n""" inputs = tokenizer([prompt], return_tensors="pt").to(model.device) outputs = model.generate(**inputs, max_new_tokens=512, use_cache=True, do_sample=False, repetition_penalty=1.2) prediction = tokenizer.decode(outputs[0], skip_special_tokens=True).split('\n### 回答')[-1] results.append({"task_id": dt["task_id"], "input": input, "output": prediction}) ```python # 結果をjsonl形式で保存 json_file_id = re.sub(".*/", "", adapter_id) with open(f"/content/{json_file_id}_output.jsonl", 'w', encoding='utf-8') as f: for result in results: json.dump(result, f, ensure_ascii=False) f.write('\n') print(f"JSONLファイルを生成しました: {json_file_id}_output.jsonl") ### 結果の確認方法 以下のコードで生成された `jsonl` ファイルの内容を確認できます。 ```python !head /content/{json_file_id}_output.jsonl ### 推論結果のサンプル {"task_id": 1, "input": "指示内容1", "output": "モデルの生成結果1"} {"task_id": 2, "input": "指示内容2", "output": "モデルの生成結果2"} ## ベンチマークの出力方法 推論結果を評価し、ベンチマークとして出力する方法を示します。 ELYZA-tasks-100-TVは**文章生成タスク**が主であるため、**ROUGEスコア**を用いて評価します。 ### ベンチマーク評価コード ```python from datasets import load_metric # ROUGEスコアを使用 rouge = load_metric("rouge") # 参照データと推論結果を用意 references = [dt["reference"] for dt in datasets] # 参照データ(正解ラベル) predictions = [result["output"] for result in results] # 推論結果 # ROUGEスコアの計算 rouge_result = rouge.compute(predictions=predictions, references=references) print(f"ROUGEスコア: {rouge_result}") # ベンチマーク結果をファイルに保存 benchmark_file = f"/content/{json_file_id}_benchmark_results.txt" with open(benchmark_file, 'w', encoding='utf-8') as f: for key, value in rouge_result.items(): f.write(f"{key}: {value.mid.fmeasure:.4f}\n") print(f"ベンチマーク結果を保存しました: {benchmark_file}") ### 注意事項 商用利用不可: モデルおよび出力データはCC-BY-NC-SAライセンスに基づき、商用利用はできません。 ライブラリバージョン: 本コードはGoogle Colab標準環境で動作確認済みです。 ライセンス情報 ベースモデル: llm-jp/llm-jp-3-13b モデルライセンス: Apache-2.0 データセットライセンス: CC-BY-NC-SA(商用利用不可) 補足 開発者: Toshi2023 モデルの詳細: This LLaMA model was trained 2x faster with Unsloth and Hugging Face's TRL library.