QuickStart | التثبيت | دليل المستخدم | أمثلة | FP8 التقارب | تكامل | ملاحظات الإصدار

Transformer Engine (TE) هي مكتبة لتسريع نماذج المحولات على وحدات معالجة الرسومات NVIDIA ، بما في ذلك استخدام دقة 8 بتن (FP8) على وحدات معالجة الرسومات Hopper ، لتوفير أداء أفضل مع انخفاض استخدام الذاكرة في كل من التدريب والاستدلال. يوفر TE مجموعة من لبنات البناء المحسّنة للغاية لبنية المحولات الشائعة وواجهة برمجة تطبيقات تلقائية تشبه الدقة والتي يمكن استخدامها بسلاسة مع رمزك الخاص بالإطار. يتضمن TE أيضًا واجهة برمجة تطبيقات C ++ الإطارية التي يمكن دمجها مع مكتبات التعلم العميقة الأخرى لتمكين دعم FP8 للمحولات.
مع استمرار نمو عدد المعلمات في نماذج المحولات ، يصبح التدريب والاستدلال للبنى مثل BERT و GPT و T5 ذاكرة ومكثفة للغاية. تتدرب معظم أطر التعلم العميق مع FP32 افتراضيًا. هذا ليس ضروريًا لتحقيق دقة كاملة للعديد من نماذج التعلم العميق. باستخدام التدريب المختلط الدقة ، والذي يجمع بين الدقة الفردية (FP32) مع تنسيق دقة أقل (مثل FP16) عند تدريب النموذج ، يؤدي إلى سرعات كبيرة مع الحد الأدنى من الاختلافات في الدقة مقارنةً بتدريب FP32. مع Precision Hopper GPU Precision تم تقديمه ، والذي يوفر أداءً محسّنًا على FP16 مع عدم وجود تدهور في الدقة. على الرغم من أن جميع أطر عمل التعلم العميق الرئيسية تدعم FP16 ، إلا أن دعم FP8 غير متوفر أصلاً في الأطر اليوم.
يعالج TE مشكلة دعم FP8 من خلال توفير واجهات برمجة التطبيقات التي تتكامل مع مكتبات نموذج اللغة الكبيرة الشهيرة (LLM). يوفر واجهة برمجة تطبيقات Python التي تتكون من وحدات لإنشاء طبقة محول بسهولة بالإضافة إلى مكتبة إطار عمل في C ++ بما في ذلك الهياكل والنواة اللازمة لدعم FP8. الوحدات النمطية التي توفرها TE داخليًا تحافظ على عوامل التحجيم والقيم الأخرى اللازمة لتدريب FP8 ، مما يؤدي إلى تبسيط التدريب الدقيق المختلط بشكل كبير للمستخدمين.
import torch
import transformer_engine . pytorch as te
from transformer_engine . common import recipe
# Set dimensions.
in_features = 768
out_features = 3072
hidden_size = 2048
# Initialize model and inputs.
model = te . Linear ( in_features , out_features , bias = True )
inp = torch . randn ( hidden_size , in_features , device = "cuda" )
# Create an FP8 recipe. Note: All input args are optional.
fp8_recipe = recipe . DelayedScaling ( margin = 0 , fp8_format = recipe . Format . E4M3 )
# Enable autocasting for the forward pass
with te . fp8_autocast ( enabled = True , fp8_recipe = fp8_recipe ):
out = model ( inp )
loss = out . sum ()
loss . backward () import flax
import jax
import jax . numpy as jnp
import transformer_engine . jax as te
import transformer_engine . jax . flax as te_flax
from transformer_engine . common import recipe
BATCH = 32
SEQLEN = 128
HIDDEN = 1024
# Initialize RNG and inputs.
rng = jax . random . PRNGKey ( 0 )
init_rng , data_rng = jax . random . split ( rng )
inp = jax . random . normal ( data_rng , [ BATCH , SEQLEN , HIDDEN ], jnp . float32 )
# Create an FP8 recipe. Note: All input args are optional.
fp8_recipe = recipe . DelayedScaling ( margin = 0 , fp8_format = recipe . Format . HYBRID )
# Enable autocasting for the forward pass
with te . fp8_autocast ( enabled = True , fp8_recipe = fp8_recipe ):
model = te_flax . DenseGeneral ( features = HIDDEN )
def loss_fn ( params , other_vars , inp ):
out = model . apply ({ 'params' : params , ** other_vars }, inp )
return jnp . mean ( out )
# Initialize models.
variables = model . init ( init_rng , inp )
other_variables , params = flax . core . pop ( variables , 'params' )
# Construct the forward and backward function
fwd_bwd_fn = jax . value_and_grad ( loss_fn , argnums = ( 0 , 1 ))
for _ in range ( 10 ):
loss , ( param_grads , other_grads ) = fwd_bwd_fn ( params , other_variables , inp )أسرع طريقة للبدء في محرك المحولات هي استخدام صور Docker على كتالوج Nvidia GPU Cloud (NGC). على سبيل المثال لاستخدام حاوية NGC Pytorch بشكل تفاعلي ،
docker run --gpus all -it --rm nvcr.io/nvidia/pytorch:23.10-py3حيث 23.10 هو نسخة الحاوية. على سبيل المثال ، 23.10 لإصدار أكتوبر 2023.
لتثبيت أحدث إصدار مستقر من محرك Transformer ،
pip install git+https://github.com/NVIDIA/TransformerEngine.git@stableسيؤدي ذلك تلقائيًا إلى اكتشاف ما إذا كان يتم تثبيت أي أطر عمل مُدعومة من التعلم العميق وإنشاء دعم محرك المحولات لهم. لتحديد الأطر بشكل صريح ، قم بتعيين متغير البيئة NVTE_FRAMework على قائمة مفصولة بفاصلة (على سبيل المثال nvte_framework = jax ، pytorch ، paddle).
بدلاً من ذلك ، يمكن تثبيت الحزمة مباشرة من PYPI من محرك Transformer ، على سبيل المثال
pip install transformer_engine[pytorch]للحصول على روابط Python اللازمة لمحرك Transformer ، يجب تحديد الأطر المطلوبة بشكل صريح على أنها تبعيات إضافية في قائمة مفصولة بفاصلة (على سبيل المثال [Jax ، Pytorch ، Paddle]). سفن محرك محرك العجلات للمكتبة الأساسية وكذلك ملحقات Paddlepaddle. يتم شحن توزيعات المصدر لملحقات Jax و Pytorch.
انظر دليل التثبيت.
يضيف محرك محرك محرك V0.11.0 دعمًا لـ Flashattention-2 في Pytorch لتحسين الأداء.
إنها مشكلة معروفة أن مجموعة Flashattention-2 كثيفة الموارد وتتطلب كمية كبيرة من ذاكرة الوصول العشوائي (انظر الأخطاء) ، والتي قد تؤدي إلى أخطاء في الذاكرة أثناء تثبيت محرك المحول. يرجى محاولة تعيين max_jobs = 1 في البيئة للتحايل على المشكلة.
لاحظ أن حاويات NGC Pytorch 23.08+ تشمل Flashattention-2.
في محاولة لتوحيد تعريف واستخدام قناع الانتباه عبر جميع الأطر الثلاثة في محرك المحولات ، تغير قناع الحشو من إدراج المعنى الحقيقي للموقف المقابل في الانتباه إلى استبعاد هذا الموقف في تطبيق Pytorch. منذ V1.7 ، تتبع جميع أنواع قناع الانتباه نفس التعريف حيث يعني True إخفاء الموضع المقابل والوسائل الخاطئة بما في ذلك هذا الموقف في حساب الانتباه.
مثال على هذا التغيير هو ،
# for a batch of 3 sequences where `a`s, `b`s and `c`s are the useful tokens
# and `0`s are the padding tokens,
[a, a, a, 0, 0,
b, b, 0, 0, 0,
c, c, c, c, 0]
# the padding mask for this batch before v1.7 is,
[ True, True, True, False, False,
True, True, False, False, False,
True, True, True, True, False]
# and for v1.7 onwards it should be,
[False, False, False, True, True,
False, False, True, True, True,
False, False, False, False, True]تم اختبار FP8 على نطاق واسع عبر بنيات وتكوينات النماذج المختلفة ولم نجد فرقًا كبيرًا بين منحنيات فقدان التدريب FP8 و BF16. تم التحقق من صحة FP8 أيضًا للدقة في مهام LLM المصب (مثل Lambada و Wikitext). فيما يلي أمثلة على النماذج التي تم اختبارها للتقارب عبر أطر مختلفة.
| نموذج | نطاق | مصدر |
|---|---|---|
| T5-770m | jax/t5x | https://github.com/nvidia/jax-toolbox/tree/main/rosetta/rosetta/projects/t5x#convergence-and-performance |
| MPT-1.3B | ملحن الفسيفساء | https://www.mosaicml.com/blog/coreave-nvidia-h100-bart-1 |
| GPT-5B | Jax/Paxml | https://github.com/nvidia/jax-tooolbox/tree/main/rosetta/rosetta/projects/pax#h100-results |
| GPT-5B | Nemo Framework | متاح عند الطلب |
| لاما 2-7 ب | علي بابا باي | https://mp.weixin.qq.com/s/nqt0ukxlbxyh5031zbdebq |
| T5-11B | jax/t5x | متاح عند الطلب |
| MPT-13B | ملحن الفسيفساء | https://www.databricks.com/blog/turboodged-training-optimizing-databricks-mosaic-ai-stack-fp8 |
| GPT-22B | Nemo Framework | متاح عند الطلب |
| llama2-70b | علي بابا باي | https://mp.weixin.qq.com/s/nqt0ukxlbxyh5031zbdebq |
| GPT-175B | Jax/Paxml | https://github.com/nvidia/jax-tooolbox/tree/main/rosetta/rosetta/projects/pax#h100-results |
تم دمج محرك Transformer مع أطر LLM الشهيرة مثل:
نرحب بالمساهمات في محرك Transformer! للمساهمة في محرك المحولات وتقديم طلبات السحب ، اتبع الإرشادات الموضحة في دليل المساهمة.