推論用コード README

概要

以下では、Hugging Faceにアップロードしたモデルを用いて、ELYZA-tasks-100-TVの出力を得るための方法を説明します。


使用したデータセット

本プロジェクトで使用したデータは、以下の論文で紹介されたデータセットです。

  • 関根聡, 安藤まや, 後藤美知子, 鈴木久美, 河原大輔, 井之上直也, 乾健太郎. ichikara-instruction: LLMのための日本語インストラクションデータの構築. 言語処理学会第30回年次大会(2024)

このデータセットは、LLM(大規模言語モデル)に対する日本語インストラクションデータを構築するために利用されました。ichikara-instructionというデータセットは、様々なタスクに対して日本語での指示を提供するもので、モデルの日本語処理能力向上に役立ちます。

データセットのリンク

データセットに関する詳細情報やダウンロードリンクは、以下の公式ウェブページから確認できます:


必要なライブラリ

推論を実行するためには、以下のPythonライブラリが必要です。

pip install -U ipywidgets
pip install transformers==4.46.3
pip install -U bitsandbytes
pip install -U accelerate
pip install -U datasets
pip install -U peft==0.13.2

これらのライブラリは、モデルの推論やデータセットの処理を行うために使用されます。


推論の実行

1. Hugging Face トークンの設定

まず、Hugging Faceのトークンを取得し、以下のコードで設定します。

HF_TOKEN = "Hugging Face Token"  # ご自身のHugging Faceトークンを貼り付けてください

2. モデルとアダプタの設定

次に、使用するベースモデルを指定します。以下のコードでモデルの設定を行います。

# 使用するベースモデル(Hugging Face上のモデルIDを指定)
model_id = "nyanta2530/llm-jp-3-13b-finetune"

3. モデルのロード

以下のコードで、ベースモデルおよびLoRAアダプタを統合したモデルをロードします。

from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
from peft import PeftModel
import torch

# LoRAの設定
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16,
)

# モデルとトークナイザーのロード
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)

4. 入力データの読み込み

次に、入力データ(ELYZA-tasks-100-TV)をJSONL形式で読み込みます。以下のコードで、ファイルを読み込み、タスクデータを処理します。

import json

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 = ""

5. 推論の実行

次に、ロードしたモデルを使用して、各タスクの入力に対して推論を実行します。以下のコードで推論を行い、結果をresultsリストに保存します。

from tqdm import tqdm

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=100,
            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})

6. 出力ファイルの保存

最後に、生成された結果をjsonl形式で保存します。以下のコードで、推論結果をファイルに書き出します。

import re

# jsonlファイルの保存
jsonl_id = re.sub(".*/", "", adapter_dpo_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')

このコードを実行すると、{jsonl_id}-outputs.jsonlという名前で出力ファイルが保存されます。このファイルは、タスクIDと出力が含まれたjsonl形式のファイルです。

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 library tag.