【No.L005】ELYZA-japanese-Llama-2-13bを使った日本語文章生成の試み:性能とコード解説

はじめに

Meta(旧Facebook)が開発したLlama2をベースとした日本語版モデルがELYZAより2023.12に公開。GPT-3.5を上回る性能ということで、きっとChatGPT並みにすごい文章作成してくれると思い、さっそくテキスト生成にチャレンジしてみた。今回はパラメータの規模が大きい(=明らかにPCスペック不足)のでファインチューニングは諦めた。

130億パラメータの「Llama 2」をベースとした日本語LLM「ELYZA-japanese-Llama-2-13b」を公開しました(商用利用可)|ELYZA, Inc. (note.com)

★関連リンク
業務で活用できるAI技集のまとめはこちら

コード

公式のコードをベースに以下のプログラムを実行。今回のモデルはAutoModelForCausalLM、つまりはCLM(Causal Language Model)を使っていることから、文脈に基づいて以降の文章を作成するタスクだということが分かる。HaggingFaceに公開されているコードと異なる点は「offload_folder=”offload”」の部分を追加している点。スペックが低いCPU/GPUだとこのコードを入力しないとERRORになるので、今回は追加。
参考:elyza/ELYZA-japanese-Llama-2-13b · Hugging Face

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

model_name = "elyza/ELYZA-japanese-Llama-2-13b"

tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
    model_name,
    torch_dtype=torch.float16,
    use_cache=True,
    device_map="auto",
    low_cpu_mem_usage=True,
    offload_folder="offload"
)
[参考] modelのパラメータ
torch_dtype=torch.float16: パラメータを16ビット浮動小数点数でロード(メモリ使用量が削減)
use_cache=True: キャッシュを使用することで、推論速度が向上
device_map="auto": 自動的に適切なデバイス(GPUなど)にモデルを配置
low_cpu_mem_usage=True: CPUのメモリ使用量を低く抑えるための設定
offload_folder="offload": モデルの一部をディスクにオフロード(メモリ使用量が削減)

続いて推論の部分。コードは単純だが処理は重い。結果的に 3h 9min 46sの時間が掛かった。

text = "自然言語処理とは、"
token_ids = tokenizer.encode(text, add_special_tokens=False, return_tensors="pt")

with torch.no_grad():
    output_ids = model.generate(
        token_ids.to(model.device),
        max_new_tokens=256,
        pad_token_id=tokenizer.pad_token_id,
        eos_token_id=tokenizer.eos_token_id,
    )
output = tokenizer.decode(output_ids.tolist()[0], skip_special_tokens=True)
print(output)

でてきた文章は
「自然言語処理とは、人間が話す言葉をコンピュータが理解し、処理する技術です。 自然言語処理の技術は、人工知能の研究において重要な技術の一つです。」
でした。

コメント