Transformers documentation

チャットの基本

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v5.22.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

チャットの基本

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つ以上のトークンを生成できます。これにより、帯域幅のボトルネックが大幅に軽減され、生成速度が向上します。

Mixtral、Qwen2MoE、GPT-OSS などの Mixture-of-Expert (MoE) モデルはパラメータ数が非常に多いものの、各トークンを生成する際にそのパラメータのほんの一部のみを「アクティブ化」します。その結果、MoE モデルは通常、メモリ帯域幅の要件がはるかに低く、同じサイズの通常の LLM よりも高速に動作する場合があります。ただし、投機的デコーディングなどの手法は MoE モデルに対して効果がありません。これは、投機的に生成される新しいトークンごとにアクティブ化されるパラメータ数が増加するためです。

Update on GitHub