--- base_model: llm-jp/llm-jp-3-13b tags: - text-generation-inference - transformers - unsloth - llama - trl license: apache-2.0 language: - en --- # 推論用コード README ## 概要 本リポジトリには、Unslothで学習したqLoRAのアダプタを用いてELYZA-tasks-100-TVの出力を得るための推論用コードが含まれています。 ## 目次 - 概要 - 前提条件 - セットアップ - ライブラリのインストール - ライブラリの読み込み - モデルとアダプタの設定 - データの準備 - 推論の実行 - 結果の保存 - 注意事項 ## 前提条件 - **Hugging Face** にアダプタがアップロードされていること。 - 必要なデータファイル(`elyza-tasks-100-TV_0.jsonl`)を事前に用意していること。 ## セットアップ ### ライブラリのインストール 以下のセルを実行して、必要なライブラリをインストールします。 ```python %%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 ``` ### ライブラリの読み込み インストール後、以下のライブラリを読み込みます。 ```python from unsloth import FastLanguageModel from peft import PeftModel import torch import json from tqdm import tqdm import re ``` ## モデルとアダプタの設定 ベースとなるモデルと学習したLoRAのアダプタを指定します。Hugging Faceのアクセストークンも必要です。 ```python # ベースとなるモデルと学習したLoRAのアダプタ(Hugging FaceのIDを指定)。 model_id = "llm-jp/llm-jp-3-13b" adapter_id = "your_adapter_id_here" # アダプタのIDを入力 # Hugging Face Token を指定。 # 下記の URL から Hugging Face Token を取得できますので下記の HF_TOKEN に入れてください。 # https://huggingface.co/settings/tokens HF_TOKEN = "your_hf_token_here" # トークンを入力 ``` モデルをロードし、アダプタを統合します。 ```python # unslothのFastLanguageModelで元のモデルをロード。 max_seq_length = 2048 # unslothではRoPEをサポートしているのでコンテキスト長は自由に設定可能 dtype = None # Noneにしておけば自動で設定 # 8ビット量子化の設定 quantization_config = BitsAndBytesConfig( load_in_8bit=True, # 必要に応じて他の設定も追加可能 ) # モデルのロード model, tokenizer = FastLanguageModel.from_pretrained( model_name=model_id, dtype=dtype, quantization_config=quantization_config, # 8ビット量子化の設定を渡す trust_remote_code=True, ) # 元のモデルにLoRAのアダプタを統合。 model = PeftModel.from_pretrained(model, adapter_id, token=HF_TOKEN) ``` ## データの準備 タスクとなるデータを読み込みます。事前にデータファイル(`elyza-tasks-100-TV_0.jsonl`)をアップロードしてください。 ```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 # モデルを用いてタスク推論。 # 推論するためにモデルのモードを変更 FastLanguageModel.for_inference(model) results = [] for dt in tqdm(datasets): input_text = dt["input"] prompt = f"""### 指示 {input_text} ### 回答 """ inputs = tokenizer([prompt], return_tensors="pt").to(model.device) outputs = model.generate(**inputs, max_new_tokens=2048, 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_text, "output": prediction}) ``` ## 結果の保存 推論結果をJSONL形式で保存します。ファイル名は、任意の名前に変更可能です。 ```python # 結果をjsonlで保存。 # ここではadapter_idを元にファイル名を決定しているが、ファイル名は任意で問題なし。 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') ``` ## 注意事項 - **Hugging Face Tokenの管理**: `HF_TOKEN`は機密情報です。公開リポジトリにアップロードしないよう注意してください。 - **データの前処理**: `elyza-tasks-100-TV_0.jsonl`ファイルは適切にフォーマットされたJSONLファイルである必要があります。 - **モデルとアダプタの互換性**: 使用するモデルとアダプタが互換性を持つことを確認してください。 ```