【Transformers】AutoModelForCausalLMの意味と使い方について

はるか
はるか
AutoModelForCausalLMは、テキスト生成に向いてるクラス。前にある単語から次を予測する仕組み。
ふゅか
ふゅか
うん、そう!だからチャットボットや文章生成が得意なんだね!

1. AutoModelForCausalLMについて

Transformersは、自然言語処理(NLP)における最先端のモデルを提供しており、その中でも特に重要な役割を果たしているのが「AutoModelForCausalLM」です。このクラスは、因果的言語モデル(Causal Language Model, CausalLM)のために最適化されており、チャットボットやテキスト生成などのタスクに利用することができます。

1.1. AutoModelForCausalLMとは?

AutoModelForCausalLMは、因果的言語モデルを作成するためのクラスです。因果的言語モデルとは、前方に続くテキストから次のトークン(単語やサブワード)を予測することに特化したモデルのことを指します。このタイプのモデルは、特に次のような用途に適しています。

  • テキスト生成:入力の後に続く文章を自動的に生成する。
  • チャットボット:ユーザーの発言に対して適切な応答を生成する。

2. AutoModelForCausalLMの主な特徴

2.1. Autoクラス

Transformersライブラリの「Auto」クラスを利用することで、モデルを簡単にインスタンス化できます。特にAutoModelForCausalLMは、指定されたモデル名から最適な因果的言語モデルを自動的に選んでくれます。たとえば、以下のコードで、指定された名前のモデルを呼び出すことができます。

from transformers import AutoModelForCausalLM, AutoTokenizer

model_name = "openai-community/gpt2"  # 例としてGPT-2を使用
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

2.2. トークナイザーとの連携

モデルと一緒にトークナイザー(Tokenizer)を使用することで、テキストデータをモデルが扱える形式に変換します。上記のコード例でもわかるように、AutoTokenizerを使って入力テキストを適切にエンコードし、モデルに与えます。

3. 使用方法

3.1. 簡単なテキスト生成

次のコードは、ユーザーが入力したプロンプトに続くテキスト(トークン)を生成する方法を示しています。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

# モデルとトークナイザーの準備
model_name = "openai-community/gpt2"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name)

# プロンプトの設定
prompt = "Level up!"
input_ids = tokenizer.encode(prompt, return_tensors="pt")

# テキスト生成
output = model.generate(input_ids, max_new_tokens=50, num_return_sequences=1)

# 出力のデコード
generated_text = tokenizer.decode(output[0], skip_special_tokens=True)
print(generated_text)

この例では、promptとして「Level up!」というテキストをモデルに渡し、その後に続く文章を生成します。

3.2. パラメータの調整

  • max_new_tokens:生成するトークンの最大長を設定します。
  • num_return_sequences:生成する候補の数を設定します。複数の出力を得たい場合に役立ちます。
  • temperature:テキスト生成時のランダム性をコントロールします。値を大きくするほど多様で予測がランダムな結果になります。

4. オプション

ふゅか
ふゅか
「device_map」を使って、複数のデバイスにモデルを分割できるのもすごく便利だね!大きなモデルを効率よく扱えるように工夫されてるんだ〜。
はるか
はるか
メモリ負荷を分散するために必要。

4.1. device_map

device_mapは、モデルをどのデバイスに配置するかを指定するオプションです。大規模な言語モデルは数百億パラメータを持つため、1つのGPUやCPUだけで処理するのは難しいことがあります。そのため、device_mapを使ってモデルを複数のデバイスに分割して配置し、メモリの効率化や計算負荷の分散を図ります。利用には、accelerateをインストールする必要があります。

pip install accelerate

device_mapを実際に使うと、

from transformers import AutoTokenizer, AutoModelForCausalLM,set_seed
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Meta-Llama-3-8B")
model = AutoModelForCausalLM.from_pretrained("meta-llama/Meta-Llama-3-8B"
                                             ,device_map="auto"
                                             ,load_in_8bit=True)

"auto"は自動的にモデルを利用可能なGPUやCPUに分散します。メモリの使用量に基づいてモデルのパラメータを各デバイスに割り当てます。

4.2. 量子化

量子化は、モデルのサイズや計算コストを削減するための手法です。ニューラルネットワークは32ビットの浮動小数点数で計算されている場合などがありますが、量子化によってこれを8ビットや4ビットなどの低精度に変換することで、メモリ使用量や計算負荷を減らすことができます。例えば、llama3の8bモデルを量子化して読み込むと、

from transformers import AutoTokenizer, AutoModelForCausalLM,set_seed
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Meta-Llama-3-8B")
model = AutoModelForCausalLM.from_pretrained("meta-llama/Meta-Llama-3-8B"
                                             ,device_map="auto"
                                             ,load_in_4bit=True) #8bitの場合はload_in_8bit=True

 

4.3. 因果的言語モデルとその他のモデルの違い

AutoModelForCausalLMと似たモデルに「AutoModelForSeq2SeqLM」がありますが、この2つには重要な違いがあります。

  • AutoModelForCausalLMは、入力テキストの次の単語を順番に予測するモデルです。これは主に生成タスク向けです。
  • AutoModelForSeq2SeqLMは、入力から出力へのシーケンス変換(例:翻訳や要約など)に特化しています。入力全体を解析し、対応する出力を生成します。

PR