Uploaded model

  • Developed by: yf591
  • License: CC-BY-NC-SA
  • Finetuned from model : llm-jp/llm-jp-3-13b

This llama model was trained 2x faster with Unsloth and Huggingface's TRL library.

Instructions for using the benchmark "ELYZA-tasks-100-TV" for output

1.必要なライブラリのインポート

from transformers import (
    AutoModelForCausalLM,
    AutoTokenizer,
    BitsAndBytesConfig,
)
import torch
from tqdm import tqdm
import json

2.モデルの設定

ここでは、モデルとトークナイザーをロードするための設定を行います。

  • Hugging Faceトークン: HF_TOKEN に、あなたのHugging Faceアカウントから取得したトークンを入力します。
  • モデル名: model_name には、使用するFine-Tunedモデルの名前を指定します。 例: "username/llm-jp-3-13b-finetune"(username部分をHugging Faceのユーザー名に置き換えてください)
  • QLoRA設定: BitsAndBytesConfigを使用して、4bit量子化(QLoRA)を設定します。これにより、メモリの使用量を大幅に削減できます。
from getpass import getpass

# Hugging Faceで取得したTokenをこちらに貼る(トークンを非表示で入力)
HF_TOKEN = getpass("Hugging FaceのRead用のHF_Tokenを入力してください: ")
model_name = "yf591/llm-jp-3-13b-it-1"

# QLoRA config
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16,
    bnb_4bit_use_double_quant=False,
)

ここでは、以下の設定を行っています:

  • Hugging Faceトークン(HF_TOKEN)
  • Fine-Tunedモデルのリポジトリ名(model_name)
  • 4bit量子化(QLoRA)の設定(BitsAndBytesConfig)

3.モデルの読み込み

AutoModelForCausalLMを使って、指定したモデルをロードし、推論可能な形にします。AutoTokenizerは、テキストのトークン化や復号を担当します。これにより、自然言語のテキストをモデルが理解できる形式に変換します。

  • load_in_4bit=True: 4bit量子化を有効にするための設定です。これにより、メモリ使用量が削減されます。
  • device_map="auto": 自動的にGPUを利用するよう設定しています。
  • token: Hugging Faceトークンを指定します。
# Load model
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    quantization_config=bnb_config,
    device_map="auto",
    token = HF_TOKEN
)

# Load tokenizer
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True, token = HF_TOKEN)

この部分では、Hugging Face Hubからモデルとトークナイザーをロードします。

  • モデルは4bit量子化(QLoRA)設定を適用。
  • トークナイザーはカスタムコードを信頼する設定でロードされます。

4.データセットの読み込み

次に、推論に使用するデータセットを読み込みます。ファイルはJSON Lines形式(.jsonl)で保存されている必要があります。

  • ファイルの読み込み: elyza-tasks-100-TV_0.jsonl というファイルを読み込み、datasetsリストに格納します。

  • データの整形: 各行はタスク(task_id, input, eval_aspectなど)を含むJSON形式です。

  • 注意点: このコードではファイルが環境に応じて適切にアップロードされている前提で動作します。各環境に応じたファイルのアップロード方法を確認してください。

  • 補足

    • JSON Lines形式:1行1つのJSONデータで構成される形式で、構造化されたデータを効率よく処理できます
# データセットの読み込み
datasets = []
with open("./elyza-tasks-100-TV_0.jsonl", "r") as f:
    item = "" # 長いJSONデータが複数行にまたがる可能性があるため、一時的にデータを格納
    for line in f:
      line = line.strip()
      item += line # 長いJSONデータが複数行にわたる場合、1つの行として正しく処理するため
      if item.endswith("}"): # JSONデータが完全に1つの塊になったときに処理
        datasets.append(json.loads(item)) # JSON形式に変換してリストに追加
        item = "" # 次のデータを読み込む準備

この部分では、推論に使用するデータセット(JSON Lines形式)を読み込んでリスト(datasets)に格納しています。

  • 各行が1つのタスクデータ(task_id, input, eval_aspect)として整形されます。

5.推論処理

ここでは、モデルを使ってデータセットに対する推論を実行します。

  • プロンプトの構成: 各入力(input)に対して、以下の形式でプロンプトを生成します。
### 指示
{input}
### 回答:
  • トークナイザーの利用: tokenizer.encode()を用いてプロンプトをトークン化し、model.generate()で推論を実行します。

  • 推論結果の取得: モデルの出力をデコードし、結果をresultsリストに格納します。

  • 推論の設定: 以下のパラメータを設定して推論を行います。

    • max_new_tokens=512: 最大生成トークン数(少し長めの出力を想定)。
    • do_sample=False: 決定論的生成(確率的なサンプリングは無効)。
    • repetition_penalty=1.2: 同じトークンの繰り返しを抑制し、出力の多様性を向上。
# llmjp
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})

6.推論結果の保存

推論結果をJSON Lines形式でファイルに保存します。提出用フォーマットに準じた形式です。

  • 結果の形式:

    • 必須項目: task_id, output
    • inputeval_aspectも含まれますが、必須ではありません。
  • 保存先: 推論結果は、モデル名を基にしたファイル名(例: `"llm-jp-3-13b-finetune-outputs.jsonl")で、スクリプトと同じディレクトリに保存されます。

  • 注意点: 出力ファイルはUTF-8エンコーディングで保存されます。非ASCII文字も適切に処理されます。

import re
model_name = re.sub(".*/", "", model_name)
with open(f"./{model_name}-outputMT512.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')

この部分では、推論結果をJSON Lines形式でファイルに保存しています。

  • ファイル名はモデル名-outputMT512.jsonlの形式です。(512は最大生成トークン数)
  • 日本語など非ASCII文字を正確に保存するため、ensure_ascii=Falseを設定しています。

Conclusion

このテンプレートを使用して、Hugging Faceのモデルを用いてELYZA-tasks-100-TVの出力を得るための推論を実行しました。以下の手順を経て、提出用のJSON Linesファイルを作成:

  1. ライブラリのインストール: 必要なライブラリをインストールし、推論に必要な環境を整備しました。
  2. モデルの読み込み: Hugging Face HubからFine-Tunedモデルをロードしました。
  3. データセットの読み込み: 推論に使用するデータセットを読み込みました。
  4. 推論処理: モデルを使ってデータセットの各タスクに対して推論を実行しました。なお、本テンプレートでは、推論時の多様性調整としてdo_sample=Falseを採用しており、top_ptemperatureの設定は行っていません。必要に応じて、生成の多様性向上や特定の出力制御にtop_pやtemperatureを利用できます。これらの設定は、gemmaモデル(長めの出力に適した設計)やllmjpモデル(短い出力に適した設計)の特性と合わせて調整すると効果的です。
  5. 結果の保存: 結果を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 pipeline_tag.

Model tree for yf591/llm-jp-3-13b-it-1

Finetuned
(1120)
this model