QuickStart | Установка | Руководство пользователя | Примеры | FP8 конвергенция | Интеграции | Выпуск заметок

Transformer Engine (TE)-это библиотека для ускоряющихся моделей трансформаторов на графических процессорах NVIDIA, включая использование 8-битной точки плавающей запятой (FP8) на графических процессорах Hopper, чтобы обеспечить лучшую производительность с более низким использованием памяти как при обучении, так и в выводе. TE предоставляет коллекцию высоко оптимизированных строительных блоков для популярных архитектур трансформаторов и автоматического смешанного API-подобного API, который можно легко использовать с вашим кодом, специфичным для фреймворка. TE также включает в себя фреймворк -агностик C ++ API, который может быть интегрирован с другими библиотеками глубокого обучения, чтобы обеспечить поддержку FP8 для трансформаторов.
По мере того, как количество параметров в моделях трансформатора продолжает расти, обучение и вывод для таких архитектур, как BERT, GPT и T5, становятся очень памятью и вычислительны. Большинство карт глубокого обучения тренируются с FP32 по умолчанию. Однако это не важно для достижения полной точности для многих моделей глубокого обучения. Используя обучение смешанного назначения, которое объединяет одноприменение (FP32) с форматом более низкой точности (например, FP16) при обучении модели, приводит к значительному ускорению с минимальными различиями в точности по сравнению с обучением FP32. Благодаря введению архитектуры GPU GPU FP8, которая предлагает улучшенную производительность по сравнению с FP16 без ухудшения точности. Хотя все основные рамки глубокого обучения поддерживают FP16, поддержка FP8 сегодня не доступна в рамках.
TE решает проблему поддержки FP8, предоставляя API, которые интегрируются с популярными библиотеками модели крупной языка (LLM). Он обеспечивает API 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 в каталоге облака GPU NVIDIA (NGC). Например, для интерактивного использования контейнера NGC Pytorch,
docker run --gpus all -it --rm nvcr.io/nvidia/pytorch:23.10-py3Где 23.10 - контейнерная версия. Например, 23.10 для выпуска октября 2023 года.
Чтобы установить последнюю стабильную версию трансформаторного двигателя,
pip install git+https://github.com/NVIDIA/TransformerEngine.git@stableЭто автоматически обнаружит, если будут установлены какие -либо поддерживаемые фреймворки глубокого обучения, и создать для них поддержку трансформатора. Чтобы явно указать Frameworks, установите переменную среды nvte_framework в список, разделенный запятыми (например, nvte_framework = jax, pytorch, paddle).
В качестве альтернативы, пакет может быть непосредственно установлен из PYPI от Transformer Engine, например,
pip install transformer_engine[pytorch]Чтобы получить необходимые привязки Python для двигателя трансформатора, необходимые платформы должны быть явно указаны как дополнительные зависимости в списке, разделенных запятыми (например, [JAX, Pytorch, Paddle]). Колеса трансформаторных двигателей суда для ядра для библиотеки, а также расширения паддлпадла. Распределения источников отправляются для расширений JAX и Pytorch.
Смотрите руководство по установке.
Выпуск двигателя трансформатора v0.11.0 добавляет поддержку Flashattention-2 в Pytorch для повышения производительности.
Это известная проблема, что компиляция Flashattention-2 является ресурсной интенсивной и требует большого количества оперативной памяти (см. Ошибку), что может привести к ошибкам памяти во время установки двигателя трансформатора. Пожалуйста, попробуйте установить max_jobs = 1 в среде, чтобы обойти проблему.
Обратите внимание, что NGC Pytorch 23.08+ контейнеры включают Flashattention-2.
В попытке объединить определение и использование маски внимания во всех трех структурах в трансформаторном двигателе, маска для прокладки изменилась с истинного значения включения соответствующей позиции в внимание к исключению этой позиции в нашей реализации Pytorch. Поскольку v1.7 все типы маски внимания следуют тем же определению, где истина означает маскировка соответствующей позиции и ложных средств, включая эту позицию в расчете внимания.
Примером этого изменения является,
# 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/coreweave-nvidia-h100-part-1 |
| GPT-5B | JAX/PAXML | https://github.com/nvidia/jax-toolbox/tree/main/rosetta/rosetta/projects/pax#h100-results |
| GPT-5B | Nemo Framework | Доступно по запросу |
| Llama2-7B | Алибаба Пай | https://mp.weixin.qq.com/s/nqt0ukxlbxyh5031zbdebq |
| T5-11B | JAX/T5X | Доступно по запросу |
| MPT-13B | Мозаичный композитор | https://www.databricks.com/blog/turboarged-pring-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-toolbox/tree/main/rosetta/rosetta/projects/pax#h100-results |
Двигатель трансформатора был интегрирован с популярными пластами LLM, такими как:
Мы приветствуем вклад в Transformer Engine! Чтобы внести свой вклад в трансформаторный двигатель и выполнить запросы на привлечение, следуйте руководящим принципам, изложенным в руководстве.