Transformers documentation
チャットの基本
チャットの基本
Chatモデルとは、メッセージを送信して応答を受け取れる対話型モデルです。2023年半ば以降に公開された多くの言語モデルはChatモデルであり、「instruct」モデルや「instruction-tuned」モデルと呼ばれることもあります。Chatに対応していないモデルは、「base」モデルや「pretrained」モデルと呼ばれることが多いです。
より大規模で新しいモデルは一般的により高性能ですが、特定のドメイン(医療、法律文書、英語以外の言語など)に特化したモデルは、これらの大規模モデルを上回る性能を発揮することがあります。OpenLLMやLMSys Chatbot Arenaなどのリーダーボードを活用して、ユースケースに最適なモデルを特定してください。
このガイドでは、コマンドラインからTransformersでチャットモデルを素早く読み込む方法、会話の構築とフォーマット方法、そしてTextGenerationPipelineを使用してチャットを行う方法について説明します。
chat CLI
Transformersのインストールが完了すると、コマンドラインからモデルと直接チャットできます。以下のコマンドを実行すると、モデルとの対話セッションが開始され、セッションの冒頭にいくつかの基本的なコマンドが表示されます。
以下のコマンドを実行する際は、
transformers serveが実行中であることを確認してください。
transformers chat Qwen/Qwen2.5-0.5B-Instruct

任意のgenerateフラグをarg_1=value_1 arg_2=value_2 ...の形式で指定して、CLIを起動できます。
transformers chat Qwen/Qwen2.5-0.5B-Instruct do_sample=False max_new_tokens=10
すべてのオプションのリストを確認するには、以下のコマンドを実行してください。
transformers chat -h
チャットはAutoClassの上に実装されており、text generationおよびchatのツールを使用しています。内部ではtransformers serve CLI (docs) を使用しています。
TextGenerationPipeline
TextGenerationPipeline は、チャットモードを備えた高レベルのテキスト生成クラスです。対話型モデルが検出され、チャットプロンプトが適切にフォーマットされている場合、チャットモードが有効になります。
Chatモデルは、メッセージのリスト(チャット履歴)を入力として受け取ります。各メッセージは、roleキーとcontentキーを持つ辞書です。
チャットを開始するには、userメッセージを1つ追加します。また、モデルの動作に関する指示を与えるために、systemメッセージを任意で含めることもできます。
chat = [
{"role": "system", "content": "You are a helpful science assistant."},
{"role": "user", "content": "Hey, can you explain gravity to me?"}
]TextGenerationPipeline を作成し、chat を渡します。大規模モデルの場合、device_map=“auto” を設定すると、モデルの読み込みが速くなり、利用可能な最速のデバイスに自動的に配置されます。
import torch
from transformers import pipeline
pipeline = pipeline(task="text-generation", model="HuggingFaceTB/SmolLM2-1.7B-Instruct", dtype="auto", device_map="auto")
response = pipeline(chat, max_new_tokens=512)
print(response[0]["generated_text"][-1]["content"])これが正常に動作すれば、モデルからの応答が表示されるはずです。会話を続行するには、モデルの応答でチャット履歴を更新する必要があります。これは、chat にテキストを追加する(assistant ロールを使用)か、最新の応答を含む完全なチャット履歴が含まれている response[0]["generated_text"] を読み取ることで行えます。
モデルの応答を取得したら、チャット履歴に新しいuserメッセージを追加することで、会話を続行できます。
chat = response[0]["generated_text"]
chat.append(
{"role": "user", "content": "Woah! But can it be reconciled with quantum mechanics?"}
)
response = pipeline(chat, max_new_tokens=512)
print(response[0]["generated_text"][-1]["content"])このプロセスを繰り返すことで、モデルがコンテキストウィンドウを使い切るか、メモリが不足するまで、好きなだけ会話を続けることができます。
パフォーマンスとメモリ使用量
Transformers はデフォルトでモデルを float32 精度で読み込みます。8B パラメータのモデルの場合、これには約 32GB のメモリが必要です。メモリ使用量を削減するには、torch_dtype="auto" 引数を使用してください。この引数は、bfloat16 で学習されたモデルに対して一般的に bfloat16 を使用します。
利用可能な異なる量子化バックエンドの詳細については、Quantizationのドキュメントを参照してください。
メモリ使用量をさらに低減するには、bitsandbytesを使用してモデルを8ビットまたは4ビットに量子化できます。希望する量子化設定でBitsAndBytesConfigを作成し、パイプラインのmodel_kwargsパラメータに渡します。以下の例では、モデルを8ビットに量子化しています。
from transformers import pipeline, BitsAndBytesConfig
quantization_config = BitsAndBytesConfig(load_in_8bit=True)
pipeline = pipeline(task="text-generation", model="meta-llama/Meta-Llama-3-8B-Instruct", device_map="auto", model_kwargs={"quantization_config": quantization_config})一般的に、モデルのサイズと性能は直接的な相関関係にあります。より大きなモデルは、生成される各トークンに対して、アクティブなパラメータのすべてをメモリから読み込む必要があるため、メモリ使用量が増えるだけでなく、処理速度も遅くなります。 これは LLM によるテキスト生成のボトルネックであり、生成速度を向上させるための主な選択肢は、モデルの量子化を行うか、メモリ帯域幅の高いハードウェアを使用することです。計算能力を单纯に増やしても、有意な改善にはつながりません。
投機的デコーディングなどの手法も試すことができます。この手法では、より小さいモデルが候補トークンを生成し、より大きいモデルがそれらを検証します。候補トークンが正しければ、より大きいモデルは一度に1つ以上のトークンを生成できます。これにより、帯域幅のボトルネックが大幅に軽減され、生成速度が向上します。
Update on GitHubMixtral、Qwen2MoE、GPT-OSS などの Mixture-of-Expert (MoE) モデルはパラメータ数が非常に多いものの、各トークンを生成する際にそのパラメータのほんの一部のみを「アクティブ化」します。その結果、MoE モデルは通常、メモリ帯域幅の要件がはるかに低く、同じサイズの通常の LLM よりも高速に動作する場合があります。ただし、投機的デコーディングなどの手法は MoE モデルに対して効果がありません。これは、投機的に生成される新しいトークンごとにアクティブ化されるパラメータ数が増加するためです。