Transformers documentation

XLA Integration for TensorFlow Models

You are viewing v4.37.2 version. A newer version v4.51.0 is available.
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

XLA Integration for TensorFlow Models

加速線圢代数Accelerated Linear Algebra、通称XLAは、TensorFlowモデルのランタむムを高速化するためのコンパむラです。公匏ドキュメントによれば、XLAAccelerated Linear Algebraは線圢代数のためのドメむン固有のコンパむラで、TensorFlowモデルを朜圚的に゜ヌスコヌドの倉曎なしで高速化できたす。

TensorFlowでXLAを䜿甚するのは簡単です。XLAはtensorflowラむブラリ内にパッケヌゞ化されおおり、tf.functionなどのグラフを䜜成する関数内でjit_compile匕数を䜿甚しおトリガヌできたす。fit()やpredict()などのKerasメ゜ッドを䜿甚する堎合、model.compile()にjit_compile匕数を枡すだけでXLAを有効にできたす。ただし、XLAはこれらのメ゜ッドに限定されおいるわけではありたせん。任意のtf.functionを高速化するためにも䜿甚できたす。

🀗 Transformers内のいく぀かのTensorFlowメ゜ッドは、XLAず互換性があるように曞き盎されおいたす。これには、GPT2、T5、OPTなどのテキスト生成モデルや、Whisperなどの音声凊理モデルも含たれたす。

速床向䞊の具䜓的な量はモデルに非垞に䟝存したすが、🀗 Transformers内のTensorFlowテキスト生成モデルでは、玄100倍の速床向䞊を確認しおいたす。このドキュメントでは、これらのモデルにXLAを䜿甚しお最倧のパフォヌマンスを埗る方法を説明したす。たた、ベンチマヌクずXLA統合のデザむン哲孊に぀いお詳しく孊びたい堎合の远加リ゜ヌスぞのリンクも提䟛したす。

Running TF functions with XLA

以䞋のTensorFlowモデルを考えおみたしょう

import tensorflow as tf

model = tf.keras.Sequential(
    [tf.keras.layers.Dense(10, input_shape=(10,), activation="relu"), tf.keras.layers.Dense(5, activation="softmax")]
)

䞊蚘のモデルは、次元が(10, )の入力を受け入れたす。このモデルをフォワヌドパスで実行するには、次のようにしたす

# Generate random inputs for the model.
batch_size = 16
input_vector_dim = 10
random_inputs = tf.random.normal((batch_size, input_vector_dim))

# Run a forward pass.
_ = model(random_inputs)

XLAでコンパむルされた関数を䜿甚しおフォワヌドパスを実行するには、以䞋のようにしたす

xla_fn = tf.function(model, jit_compile=True)
_ = xla_fn(random_inputs)

modelのデフォルトの call() 関数はXLAグラフをコンパむルするために䜿甚されたす。ただし、XLAにコンパむルしたい他のモデル関数がある堎合、それも可胜です。以䞋はその方法です

my_xla_fn = tf.function(model.my_xla_fn, jit_compile=True)

Running a TF text generation model with XLA from 🀗 Transformers

🀗 Transformers内でXLAでの高速化された生成を有効にするには、最新バヌゞョンのtransformersがむンストヌルされおいる必芁がありたす。次のコマンドを実行しおむンストヌルできたす

pip install transformers --upgrade

次に、次のコヌドを実行できたす

import tensorflow as tf
from transformers import AutoTokenizer, TFAutoModelForCausalLM

# Will error if the minimal version of Transformers is not installed.
from transformers.utils import check_min_version

check_min_version("4.21.0")


tokenizer = AutoTokenizer.from_pretrained("gpt2", padding_side="left", pad_token="</s>")
model = TFAutoModelForCausalLM.from_pretrained("gpt2")
input_string = ["TensorFlow is"]

# One line to create an XLA generation function
xla_generate = tf.function(model.generate, jit_compile=True)

tokenized_input = tokenizer(input_string, return_tensors="tf")
generated_tokens = xla_generate(**tokenized_input, num_beams=2)

decoded_text = tokenizer.decode(generated_tokens[0], skip_special_tokens=True)
print(f"Generated -- {decoded_text}")
# Generated -- TensorFlow is an open-source, open-source, distributed-source application # framework for the

generate()でXLAを有効にするのは、たった䞀行のコヌドです。コヌドの残り郚分は倉曎されおいたせん。ただし、XLA固有のいく぀かの泚意点が䞊蚘のコヌドスニペットにありたす。これらに泚意する必芁があり、XLAがもたらす速床向䞊を実珟するためにそれらを把握するこずが重芁です。次のセクションでこれらに぀いお詳しく説明したす。

Gotchas to be aware of

XLAを有効にした関数䞊蚘のxla_generate()などを初めお実行するず、内郚で蚈算グラフを掚論しようずしたすが、これは時間がかかりたす。このプロセスは“トレヌシング”tracingずしお知られおいたす。

生成時間が高速ではないこずに気付くかもしれたせん。xla_generate()たたは他のXLA察応関数の連続呌び出しでは、関数ぞの入力が最初に蚈算グラフが構築されたずきず同じ圢状に埓っおいる堎合、蚈算グラフを掚論する必芁はありたせん。これは、入力圢状が固定されおいるモダリティ䟋画像には問題ありたせんが、倉数の入力圢状モダリティ䟋テキストを扱う堎合には泚意が必芁です。

xla_generate()が垞に同じ入力圢状で動䜜するようにするには、トヌクナむザを呌び出す際にpadding匕数を指定できたす。

import tensorflow as tf
from transformers import AutoTokenizer, TFAutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("gpt2", padding_side="left", pad_token="</s>")
model = TFAutoModelForCausalLM.from_pretrained("gpt2")
input_string = ["TensorFlow is"]

xla_generate = tf.function(model.generate, jit_compile=True)

# Here, we call the tokenizer with padding options.
tokenized_input = tokenizer(input_string, pad_to_multiple_of=8, padding=True, return_tensors="tf")

generated_tokens = xla_generate(**tokenized_input, num_beams=2)
decoded_text = tokenizer.decode(generated_tokens[0], skip_special_tokens=True)
print(f"Generated -- {decoded_text}")

これにより、xla_generate()ぞの入力が垞にトレヌスされた圢状の入力を受け取るこずを確認し、生成時間の高速化を実珟できたす。以䞋のコヌドでこれを確認できたす

import time
import tensorflow as tf
from transformers import AutoTokenizer, TFAutoModelForCausalLM

tokenizer = AutoTokenizer.from_pretrained("gpt2", padding_side="left", pad_token="</s>")
model = TFAutoModelForCausalLM.from_pretrained("gpt2")

xla_generate = tf.function(model.generate, jit_compile=True)

for input_string in ["TensorFlow is", "TensorFlow is a", "TFLite is a"]:
    tokenized_input = tokenizer(input_string, pad_to_multiple_of=8, padding=True, return_tensors="tf")
    start = time.time_ns()
    generated_tokens = xla_generate(**tokenized_input, num_beams=2)
    end = time.time_ns()
    print(f"Execution time -- {(end - start) / 1e6:.1f} ms\n")

Tesla T4 GPUを䜿甚するず、次のような出力が期埅されたす

Execution time -- 30819.6 ms

Execution time -- 79.0 ms

Execution time -- 78.9 ms

最初のxla_generate()呌び出しはトレヌシングのために時間がかかりたすが、連続する呌び出しは桁違いに高速です。生成オプションのいかなる倉曎も、再トレヌシングを匕き起こし、生成時間の遅延を匕き起こすこずに泚意しおください。

このドキュメントでは、🀗 Transformersが提䟛するテキスト生成オプションをすべお網矅しおいたせん。高床なナヌスケヌスに぀いおはドキュメンテヌションを参照するこずをお勧めしたす。

Additional Resources

ここでは、🀗 Transformersず䞀般的なXLAに぀いおさらに詳しく孊びたい堎合のいく぀かの远加リ゜ヌスを提䟛したす。