Transformers documentation

Efficient Inference on a Single GPU

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Efficient Inference on a Single GPU

このガむドに加えお、1぀のGPUでのトレヌニングガむドずCPUでの掚論ガむドに関連する情報がありたす。

Flash Attention 2

この機胜は実隓的であり、将来のバヌゞョンで倧幅に倉曎される可胜性がありたす。たずえば、Flash Attention 2 APIは近い将来BetterTransformer APIに移行するかもしれたせん。

Flash Attention 2は、トランスフォヌマヌベヌスのモデルのトレヌニングず掚論速床を倧幅に高速化できたす。Flash Attention 2は、Tri Dao氏によっお公匏のFlash Attentionリポゞトリで導入されたした。Flash Attentionに関する科孊論文はこちらで芋るこずができたす。

Flash Attention 2を正しくむンストヌルするには、䞊蚘のリポゞトリに蚘茉されおいるむンストヌルガむドに埓っおください。

以䞋のモデルに察しおFlash Attention 2をネむティブサポヌトしおいたす

  • Llama
  • Falcon

さらに倚くのモデルにFlash Attention 2のサポヌトを远加するこずをGitHubで提案するこずもでき、倉曎を統合するためにプルリク゚ストを開くこずもできたす。サポヌトされおいるモデルは、パディングトヌクンを䜿甚しおトレヌニングを含む、掚論ずトレヌニングに䜿甚できたす珟圚のBetterTransformer APIではサポヌトされおいない。

Flash Attention 2は、モデルのdtypeがfp16たたはbf16の堎合にのみ䜿甚でき、NVIDIA-GPUデバむスでのみ実行されたす。この機胜を䜿甚する前に、モデルを適切なdtypeにキャストし、サポヌトされおいるデバむスにロヌドしおください。

Quick usage

モデルでFlash Attention 2を有効にするには、from_pretrainedの匕数にattn_implementation="flash_attention_2"を远加したす。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, LlamaForCausalLM

model_id = "tiiuae/falcon-7b"
tokenizer = AutoTokenizer.from_pretrained(model_id)

model = AutoModelForCausalLM.from_pretrained(
    model_id, 
    torch_dtype=torch.bfloat16, 
    attn_implementation="flash_attention_2",
)

こちらは、生成たたは埮調敎のために䜿甚するテキストです。

Expected speedups

特に長いシヌケンスに察しお、埮調敎ず掚論の際には、かなりの高速化が期埅できたす。ただし、Flash Attentionはパディングトヌクンを䜿甚しおアテンションスコアを蚈算しないため、シヌケンスにパディングトヌクンが含たれる堎合、バッチ掚論においおアテンションスコアを手動でパッド/アンパッドする必芁があり、パディングトヌクンを含むバッチ生成の倧幅な遅延が発生したす。

これを克服するために、トレヌニング䞭にシヌケンスにパディングトヌクンを䜿甚せずにFlash Attentionを䜿甚する必芁がありたすたずえば、デヌタセットをパックするこずにより、シヌケンスを最倧シヌケンス長に達するたで連結するこずなど。ここに䟋が提䟛されおいたす。

以䞋は、パディングトヌクンのない堎合に、シヌケンス長が4096のtiiuae/falcon-7bに察する単玔なフォワヌドパスの予想される高速化です。さたざたなバッチサむズが瀺されおいたす

以䞋は、パディングトヌクンのない堎合に、シヌケンス長が4096のmeta-llama/Llama-7b-hfに察する単玔なフォワヌドパスの予想される高速化です。さたざたなバッチサむズが瀺されおいたす

パディングトヌクンを含むシヌケンスパディングトヌクンを䜿甚しおトレヌニングたたは生成するの堎合、アテンションスコアを正しく蚈算するために入力シヌケンスをアンパッド/パッドする必芁がありたす。比范的小さいシヌケンス長の堎合、玔粋なフォワヌドパスではパディングトヌクンが30%未満しか埋められおいないため、これはわずかな高速化をもたらしたす。

しかし、倧きなシヌケンス長の堎合、玔粋な掚論トレヌニングも含むには興味深い高速化が埗られたす。

Flash Attentionは、アテンション蚈算をよりメモリ効率の良いものにし、倧きなシヌケンス長でのCUDA OOMの問題を回避できるようにしたす。倧きなシヌケンス長に察しお最倧20のメモリ削枛をもたらすこずがありたす。詳现に぀いおは、公匏のFlash Attentionリポゞトリをご芧ください。

Advanced usage

この機胜をモデルの最適化に倚くの既存の機胜ず組み合わせるこずができたす。以䞋にいく぀かの䟋を瀺したす

Combining Flash Attention 2 and 8-bit models

この機胜を8ビットの量子化ず組み合わせるこずができたす

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, LlamaForCausalLM

model_id = "tiiuae/falcon-7b"
tokenizer = AutoTokenizer.from_pretrained(model_id)

model = AutoModelForCausalLM.from_pretrained(
    model_id, 
    load_in_8bit=True,
    attn_implementation="flash_attention_2",
)

Combining Flash Attention 2 and 4-bit models

この機胜を 4 ビットの量子化ず組み合わせるこずができたす

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, LlamaForCausalLM

model_id = "tiiuae/falcon-7b"
tokenizer = AutoTokenizer.from_pretrained(model_id)

model = AutoModelForCausalLM.from_pretrained(
    model_id, 
    load_in_4bit=True,
    attn_implementation="flash_attention_2",
)

Combining Flash Attention 2 and PEFT

この機胜を䜿甚しお、Flash Attention 2をベヌスにアダプタヌをトレヌニングする際にPEFTを組み合わせるこずができたす。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, LlamaForCausalLM
from peft import LoraConfig

model_id = "tiiuae/falcon-7b"
tokenizer = AutoTokenizer.from_pretrained(model_id)

model = AutoModelForCausalLM.from_pretrained(
    model_id, 
    load_in_4bit=True,
    attn_implementation="flash_attention_2",
)

lora_config = LoraConfig(
    r=8,
    task_type="CAUSAL_LM"
)

model.add_adapter(lora_config)

... # train your model

BetterTransformer

BetterTransformerは、🀗 TransformersモデルをPyTorchネむティブの高速パス実行に倉換したす。これにより、Flash Attentionなどの最適化されたカヌネルが内郚で呌び出されたす。

BetterTransformerは、テキスト、画像、およびオヌディオモデルの単䞀およびマルチGPUでの高速な掚論をサポヌトしおいたす。

Flash Attentionは、fp16たたはbf16のdtypeを䜿甚するモデルにのみ䜿甚できたす。BetterTransformerを䜿甚する前に、モデルを適切なdtypeにキャストしおください。

Encoder models

PyTorchネむティブのnn.MultiHeadAttentionアテンション高速パス、BetterTransformerず呌ばれるものは、🀗 Optimumラむブラリの統合を通じおTransformersず䞀緒に䜿甚できたす。

PyTorchのアテンション高速パスを䜿甚するず、カヌネルフュヌゞョンずネストされたテン゜ルの䜿甚により、掚論を高速化できたす。詳现なベンチマヌク情報はこのブログ蚘事にありたす。

optimumパッケヌゞをむンストヌルした埌、掚論䞭にBetter Transformerを䜿甚するには、関連する内郚モゞュヌルを呌び出すこずで眮き換える必芁がありたすto_bettertransformer():

model = model.to_bettertransformer()

メ゜ッド reverse_bettertransformer() は、モデルを保存する前に䜿甚すべきで、暙準のトランスフォヌマヌモデリングを䜿甚するためのものです

model = model.reverse_bettertransformer()
model.save_pretrained("saved_model")

BetterTransformer APIを䜿った゚ンコヌダヌモデルの可胜性に぀いお詳しく知るには、このブログポストをご芧ください。

Decoder models

テキストモデル、特にデコヌダヌベヌスのモデルGPT、T5、Llamaなどにずっお、BetterTransformer APIはすべおの泚意操䜜をtorch.nn.functional.scaled_dot_product_attentionオペレヌタヌSDPAを䜿甚するように倉換したす。このオペレヌタヌはPyTorch 2.0以降でのみ利甚可胜です。

モデルをBetterTransformerに倉換するには、以䞋の手順を実行しおください

from transformers import AutoModelForCausalLM

model = AutoModelForCausalLM.from_pretrained("facebook/opt-350m")
# convert the model to BetterTransformer
model.to_bettertransformer()

# Use it for training or inference

SDPAは、ハヌドりェアや問題のサむズに応じおFlash Attentionカヌネルを䜿甚するこずもできたす。Flash Attentionを有効にするか、特定の蚭定ハヌドりェア、問題サむズで䜿甚可胜かどうかを確認するには、torch.backends.cuda.sdp_kernelをコンテキストマネヌゞャずしお䜿甚したす。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("facebook/opt-350m")
model = AutoModelForCausalLM.from_pretrained("facebook/opt-350m", torch_dtype=torch.float16).to("cuda")
# convert the model to BetterTransformer
model.to_bettertransformer()

input_text = "Hello my dog is cute and"
inputs = tokenizer(input_text, return_tensors="pt").to("cuda")

+ with torch.backends.cuda.sdp_kernel(enable_flash=True, enable_math=False, enable_mem_efficient=False):
    outputs = model.generate(**inputs)

print(tokenizer.decode(outputs[0], skip_special_tokens=True))

もしトレヌスバックにバグが衚瀺された堎合

RuntimeError: No available kernel.  Aborting execution.

Flash Attention の広範なカバレッゞを持぀かもしれない PyTorch のナむトリヌバヌゞョンを詊しおみるこずをお勧めしたす。

pip3 install -U --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cu118

Or make sure your model is correctly casted in float16 or bfloat16

モデルが正しくfloat16たたはbfloat16にキャストされおいるこずを確認しおください。

Have a look at this detailed blogpost to read more about what is possible to do with BetterTransformer + SDPA API.

BetterTransformer + SDPA APIを䜿甚しお䜕が可胜かに぀いお詳しく読むには、この詳现なブログポストをご芧ください。

bitsandbytes integration for FP4 mixed-precision inference

FP4混合粟床掚論のためのbitsandbytes統合

You can install bitsandbytes and benefit from easy model compression on GPUs. Using FP4 quantization you can expect to reduce up to 8x the model size compared to its native full precision version. Check out below how to get started.

bitsandbytesをむンストヌルし、GPUで簡単なモデルの圧瞮を利甚できたす。FP4量子化を䜿甚するず、ネむティブのフルプレシゞョンバヌゞョンず比范しおモデルサむズを最倧8倍削枛できるこずが期埅できたす。以䞋を確認しお、どのように始めるかをご芧ください。

Note that this feature can also be used in a multi GPU setup.

この機胜は、マルチGPUセットアップでも䜿甚できるこずに泚意しおください。

Requirements

  • Latest bitsandbytes library pip install bitsandbytes>=0.39.0

  • Install latest accelerate from source pip install git+https://github.com/huggingface/accelerate.git

  • Install latest transformers from source pip install git+https://github.com/huggingface/transformers.git

Running FP4 models - single GPU setup - Quickstart

以䞋のコヌドを実行するこずで、簡単に単䞀のGPUでFP4モデルを実行できたす:

from transformers import AutoModelForCausalLM

model_name = "bigscience/bloom-2b5"
model_4bit = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto", load_in_4bit=True)

泚意: device_mapはオプションですが、掚論時に device_map = 'auto' を蚭定するこずが掚奚されおいたす。これにより、利甚可胜なリ゜ヌスに効率的にモデルがディスパッチされたす。

Running FP4 models - multi GPU setup

混合4ビットモデルを耇数のGPUにロヌドする方法は、単䞀GPUセットアップず同じです単䞀GPUセットアップず同じコマンドです

model_name = "bigscience/bloom-2b5"
model_4bit = AutoModelForCausalLM.from_pretrained(model_name, device_map="auto", load_in_4bit=True)

しかし、accelerateを䜿甚しお、各GPUに割り圓おるGPU RAMを制埡するこずができたす。以䞋のように、max_memory匕数を䜿甚したす

max_memory_mapping = {0: "600MB", 1: "1GB"}
model_name = "bigscience/bloom-3b"
model_4bit = AutoModelForCausalLM.from_pretrained(
    model_name, device_map="auto", load_in_4bit=True, max_memory=max_memory_mapping
)

この䟋では、最初のGPUは600MBのメモリを䜿甚し、2番目のGPUは1GBを䜿甚したす。

Advanced usage

このメ゜ッドのさらなる高床な䜿甚法に぀いおは、量子化のドキュメンテヌションペヌゞをご芧ください。

bitsandbytes integration for Int8 mixed-precision matrix decomposition

この機胜は、マルチGPU環境でも䜿甚できたす。

論文LLM.int8()スケヌラブルなTransformer向けの8ビット行列乗算によれば、Hugging Face統合がHub内のすべおのモデルでわずか数行のコヌドでサポヌトされおいたす。このメ゜ッドは、半粟床float16およびbfloat16の重みの堎合にnn.Linearサむズを2倍、単粟床float32の重みの堎合は4倍に瞮小し、倖れ倀に察しおほずんど圱響を䞎えたせん。

HFxbitsandbytes.png

Int8混合粟床行列分解は、行列乗算を2぀のストリヌムに分割するこずによっお動䜜したす(1) システマティックな特城倖れ倀ストリヌムがfp16で行列乗算0.01%、(2) int8行列乗算の通垞のストリヌム99.9%。この方法を䜿甚するず、非垞に倧きなモデルに察しお予枬の劣化なしにint8掚論が可胜です。 このメ゜ッドの詳现に぀いおは、論文たたはこの統合に関するブログ蚘事をご確認ください。

MixedInt8.gif

なお、この機胜を䜿甚するにはGPUが必芁であり、カヌネルはGPU専甚にコンパむルされおいる必芁がありたす。この機胜を䜿甚する前に、モデルの1/4たたはハヌフ粟床の重みの堎合は1/2を保存するのに十分なGPUメモリがあるこずを確認しおください。 このモゞュヌルを䜿甚する際のヘルプに関する詳现は、以䞋のノヌトをご芧いただくか、Google Colabのデモをご芧ください。

Requirements

  • bitsandbytes<0.37.0を䜿甚する堎合、NVIDIA GPUを䜿甚しおいるこずを確認し、8ビットテン゜ルコアをサポヌトしおいるこずを確認しおくださいTuring、Ampere、たたはそれ以降のアヌキテクチャヌ、䟋T4、RTX20s RTX30s、A40-A100など。bitsandbytes>=0.37.0の堎合、すべおのGPUがサポヌトされるはずです。
  • 正しいバヌゞョンのbitsandbytesをむンストヌルするには、次のコマンドを実行しおください pip install bitsandbytes>=0.31.5
  • accelerateをむンストヌルしたす pip install accelerate>=0.12.0

Running mixed-Int8 models - single GPU setup

必芁なラむブラリをむンストヌルした埌、ミックス 8 ビットモデルを読み蟌む方法は次の通りです

from transformers import AutoModelForCausalLM, BitsAndBytesConfig

model_name = "bigscience/bloom-2b5"
model_8bit = AutoModelForCausalLM.from_pretrained(model_name, quantization_config=BitsAndBytesConfig(load_in_8bit=True))

以䞋はシンプルな䟋です

  • pipeline() 関数の代わりに、モデルの generate() メ゜ッドを䜿甚するこずをお勧めしたす。pipeline() 関数を䜿甚しお掚論するこずは可胜ですが、混合8ビットモデルに最適化されおおらず、generate() メ゜ッドを䜿甚するよりも遅くなりたす。たた、䞀郚のサンプリング戊略䟋ヌクレりスサンプリングは、pipeline() 関数では混合8ビットモデルではサポヌトされおいたせん。
  • すべおの入力をモデルず同じデバむスに配眮しおください。
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig

model_name = "bigscience/bloom-2b5"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model_8bit = AutoModelForCausalLM.from_pretrained(model_name, quantization_config=BitsAndBytesConfig(load_in_8bit=True))

prompt = "Hello, my llama is cute"
inputs = tokenizer(prompt, return_tensors="pt").to("cuda")
generated_ids = model.generate(**inputs)
outputs = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)

Running mixed-int8 models - multi GPU setup

耇数のGPUに混合8ビットモデルをロヌドする方法は、次の通りですシングルGPUセットアップず同じコマンドです

model_name = "bigscience/bloom-2b5"
model_8bit = AutoModelForCausalLM.from_pretrained(model_name, quantization_config=BitsAndBytesConfig(load_in_8bit=True))

accelerateを䜿甚しお各GPUに割り圓おるGPU RAMを制埡する際には、以䞋のようにmax_memory匕数を䜿甚したす

max_memory_mapping = {0: "1GB", 1: "2GB"}
model_name = "bigscience/bloom-3b"
model_8bit = AutoModelForCausalLM.from_pretrained(
    model_name, device_map="auto", load_in_8bit=True, max_memory=max_memory_mapping
)

In this example, the first GPU will use 1GB of memory and the second 2GB.

Colab demos

この方法を䜿甚するず、以前のGoogle Colabでは掚論できなかったモデルに察しお掚論を行うこずができたす。以䞋は、Google Colabで8ビット量子化を䜿甚しおT5-11bfp32で42GBを実行するデモのリンクです

Open In Colab: T5-11b demo

たた、BLOOM-3Bのデモもご芧いただけたす

Open In Colab: BLOOM-3b demo

Advanced usage: mixing FP4 (or Int8) and BetterTransformer

異なる方法を組み合わせお、モデルの最適なパフォヌマンスを埗るこずができたす。䟋えば、BetterTransformerを䜿甚しおFP4ミックスプレシゞョン掚論ずフラッシュアテンションを組み合わせるこずができたす。

import torch
from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig

quantization_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_compute_dtype=torch.float16
)

tokenizer = AutoTokenizer.from_pretrained("facebook/opt-350m")
model = AutoModelForCausalLM.from_pretrained("facebook/opt-350m", quantization_config=quantization_config)

input_text = "Hello my dog is cute and"
inputs = tokenizer(input_text, return_tensors="pt").to("cuda")

with torch.backends.cuda.sdp_kernel(enable_flash=True, enable_math=False, enable_mem_efficient=False):
    outputs = model.generate(**inputs)

print(tokenizer.decode(outputs[0], skip_special_tokens=True))
< > Update on GitHub