TorchNeuron: Trainium стал обычным устройством PyTorch

TorchNeuron: Trainium стал обычным устройством PyTorch

Чтобы запустить обучение на Trainium, инженеру больше не нужен отдельный фреймворк. Достаточно поменять строку: model = MyModel().to('neuron'). Всё остальное, оптимизатор, цикл обучения, логирование, остаётся прежним. Именно эту замену AWS и называет главным результатом TorchNeuron, нативного бэкенда PyTorch для своих ИИ-чипов, который открылся как публичная бета 20 октября 2026 года на конференции PyTorch Conference North America.

За формально скромным анонсом стоит смена стратегии. Годами Trainium жил в собственном стеке: пакет torch-neuronx, компиляция в промежуточное представление XLA, обязательный шаг сборки графа и набор ограничений, которые приходилось обходить. Теперь AWS встроилась в тот же механизм расширения, которым пользуются остальные производители ускорителей, и получила все стандартные API PyTorch бесплатно, включая распределённые примитивы и профайлер.

Что такое TorchNeuron

TorchNeuron это открытый бэкенд PyTorch для чипов AWS Trainium, зарегистрированный как обычное устройство фреймворка. Он поддерживает eager-исполнение, torch.compile и собственный язык ядер NKI на Trainium2 и Trainium3. Код открыт под Apache 2.0 в репозитории github.com/aws-neuron/torch-neuronx, установка идёт через pip install torch-neuronx из репозитория AWS Neuron.

Техническая основа интеграции существует в PyTorch давно: точка расширения PrivateUse1 и семейство torch.accelerator. Это официальные места, куда производитель железа может подключить свой бэкенд, не трогая ядро фреймворка. Через PrivateUse1 Trainium попадает в перечисление устройств PyTorch, поэтому работают torch.nn, torch.tensor, torch.autocast, torch.distributed и torch.profiler в том виде, в каком они написаны в документации.

Почему раньше было иначе

Прежний путь на Trainium начинался с переноса модели в отдельный набор API и заканчивался отладкой через компилятор, а не через Python. Eager-режима не было, трассировка и брейкпоинты работали плохо, а любая новая библиотека требовала проверки на совместимость с Neuron SDK. Для исследователя это означало, что эксперимент на Trainium стоит дороже, чем тот же эксперимент на GPU, даже если железо дешевле в час.

AWS признаёт это между строк: в тексте анонса отдельно подчёркнуто, что обучение и инференс-библиотеки написаны против API самого PyTorch, а не против проприетарного слоя. Пока это было не так, каждый релиз библиотеки требовал ручной адаптации. Теперь адаптация сводится к регистрации бэкенда.

Три режима исполнения

Первый режим это eager. Операции выполняются сразу, работают print, условные переходы и отладчик. Внутри каждая операция компилируется в собственный файл NEFF (Neuron Executable File Format), запускается на устройстве и гоняет промежуточные тензоры через HBM. Просто, предсказуемо и медленно на длинных цепочках операций.

Второй режим экспериментальный: adaptive eager. Он снижает стоимость запуска и даёт компилятору возможности для слияния операций, приближая скорость к скомпилированному графу без изменения кода. Это компромисс для тех, кто хочет сохранить интерактивность отладки, но уже упирается в накладные расходы на запуск.

Третий режим это torch.compile, и он же основной для продакшена. Вызов torch.compile(model, backend="neuron") захватывает модель в граф, TorchDynamo строит FX-граф, AOTAutograd заранее трассирует обратный проход, бэкенд Neuron понижает результат через Torch-MLIR в StableHLO, а компилятор Neuron выпускает NEFF для железа. FlexAttention поддерживается нативно, компилировать можно как всю модель, так и отдельные блоки, смешивая с eager.

Имя бэкенда задаётся один раз на процесс: torch.compiler.set_default_backend("neuron"), после чего обычный model.compile() уже не требует аргументов. Формально это мелочь, но именно такие мелочи отделяют интеграцию, которую пробуют, от интеграции, которой пользуются.

Как выглядит миграция

В верхнеуровневых сценариях код не меняется почти никак. Hugging Face загружает модель на устройство одним аргументом: device_map="neuron" для явного выбора или device_map="auto", который найдёт Neuron в перечислении устройств сам. В пример из анонса подставлена небольшая модель Qwen3-0.6B, но тот же путь работает для остальных архитектур, у которых есть реализация в Transformers.

С распределённым обучением чуть интереснее. TorchTitan, нативная библиотека PyTorch для крупномасштабного обучения, уже тренирует на Trainium. Запуск Llama 3.1 8B с SimpleFSDP и torch.compile на одной машине trn2.48xlarge требует выставить NEURON_RT_NUM_CORES=64 и передать компилятору бэкенд neuron. Тензорный параллелизм задаётся степенью 4, глобальный батч 16, локальный 1. AWS отдельно упоминает пакет torchtitan-neuron: он отдаёт Trainium-специфичные NKI-ядра, готовые конфиги и интеграцию профайлера раньше, чем изменения вливаются в mainline, а затем сходится с основной веткой.

Распределённые примитивы и коллективы

Через PrivateUse1 работают DDP, FSDP2, SimpleFSDP, тензорный и пайплайн-параллелизм, а также их композиции вроде FSDP2 с тензорным параллелизмом и ZeRO. DTensor и DeviceMesh отвечают за шардирование и многомерные группы процессов. Коллективные операции all_gather, reduce_scatter, all_reduce и point-to-point send с recv поддерживаются без оговорок.

Транспорт при этом родной для железа: внутри узла коллективы идут по выделенным collective cores Trainium, между узлами по Elastic Fabric Adapter. Для кода это не значит ничего, а для производительности значит много, потому что не нужно прокладывать обходные пути через NCCL-совместимые прослойки.

Потоки и события тоже перенесены: torch_neuronx.Stream и torch_neuronx.Event отображают семантику PyTorch на аппаратные очереди Trainium. Одна деталь выдаёт зрелость реализации: ошибка всплывает не в момент операции, а на ближайшей точке синхронизации, причём бэкенд запоминает самое раннее исключение и перевыбрасывает его с исходным контекстом. При отладке асинхронного кода это экономит часы.

Свои ядра: NKI и NKI-lib

Когда стандартных операторов не хватает, начинается NKI, Neuron Kernel Interface. Это язык ядер, позволяющий писать операции под конкретную архитектуру чипа и регистрировать их в PyTorch привычным способом через torch_neuronx.nki_op и register_autograd. В примере из анонса определяется ядро синуса, к нему отдельное ядро косинуса для обратного прохода, и дальше в коде не остаётся ничего, кроме обычного PyTorch: autograd сам вызывает нужную реализацию.

Для тех, кому не нужно писать ядра с нуля, есть NKI-lib: набор оптимизированных операторов с открытым кодом, включая FlashAttention и блочные ядра для MoE. Это прямой ответ на главный практический вопрос при переходе на новое железо: кто-то уже реализовал то, что вызывает основную часть времени, или придётся делать это самому. В случае Llama-подобных и MoE-моделей ответ утвердительный.

Профилирование

Профайлер остался тем же torch.profiler.profile, но получил объект NeuronConfig, который включает сбор данных с уровня рантайма и устройства и коррелирует их с CPU-событиями PyTorch. Дальше трасса открывается в Neuron Explorer: можно прыгнуть из события в конкретную строку исходника, пройти по иерархии вызовов и посмотреть цепочку зависимостей, чтобы понять, чего именно ждёт застрявшая операция.

Отдельно стоит то, что Neuron Explorer выдаёт Parquet с метриками по операциям и движкам. Это не украшение интерфейса, а возможность строить автоматический анализ узких мест, в том числе агенту, который читает таблицу и предлагает, что переписать. Для программного доступа есть key_averages с сортировкой по времени на устройстве, что сразу показывает горячие операторы.

Честные ограничения первого релиза

Самое интересное в анонсе это не список возможностей, а раздел с методологией тестирования. AWS прогнала 100 тысяч моделей с Hugging Face, которые покрывают 99,9 процента реального использования по скачиваниям, и фиксировала, грузится ли модель, проходят ли прямой и обратный проход, компилируется ли она и какие операторы исполнились на устройстве, а какие упали на CPU.

Второй срез это прогон апстрим-тестов PyTorch: ATen, Dynamo, распределённые тесты, профайлер. Августовский прогон 2026 года дал около 154 тысяч результатов, из которых примерно 69 тысяч пропущены. Тридцать тысяч отсеяны собственными проверками PyTorch, например тесты, существующие только для CUDA или только для CPU. Остальные 39 тысяч это осознанные пропуски Neuron, и они делятся на три группы.

Крупнейшая группа, около 22 тысяч, это операторы без нативного понижения на Trainium: угловые случаи elementwise, reduction, foreach, advanced indexing и advanced linalg, а также слитые ячейки LSTM и GRU. Вторая группа это CUDA-специфичные тесты, которые не отловила апстрим-проверка: CUDA graphs, коллективы на NCCL, отдельные пути Dynamo. Третья группа это функции, которые в AWS сознательно не стали поддерживать в первом релизе, потому что клиенты о них не просили: разреженные тензоры и операции над ними, NestedTensor, forward-mode autograd, произвольные маски внимания в нативном multi-head attention при поддержке режимов без маски и causal, поканальная квантизация, динамические и символьные формы.

Список стоит читать как карту рисков, а не как маркетинговое приложение. Разреженные тензоры и динамические формы встречаются в рекомендательных системах и в обработке переменных последовательностей, а forward-mode autograd нужен в научных расчётах. Если ваш пайплайн опирается на что-то из этого, «код работает без изменений» превратится в обходной путь. Если нет, вы попадёте в те 99,9 процента.

Кто уже перенёс

В анонсе три содержательных отзыва, и они хорошо показывают разные мотивы перехода. Cartesia строит голосовые модели на state-space архитектурах, включая Mamba, и ей важны задержка и управляемость. По словам сооснователя Арджуна Десаи, инференс-пайплайн запустился с минимальными правками, мелкие операции пошли через нативный путь без рукописных ядер, а команда сосредоточилась на NKI-ядрах для слоёв, которые вызываются постоянно.

Deepgram приводит цифру, которую в таких анонсах обычно прячут: в проведённых замерах Trainium обрабатывает примерно на 60 процентов больше секунд входного аудио на доллар, чем их прежние GPU-бейзлайны. Контекст важен: речь о компании, которая обрабатывает квадриллионы аудиотокенов в год для более чем 200 тысяч разработчиков и 1400 организаций, и перенос занял несколько месяцев в связке с AWS Generative AI Innovation Center. Это не синтетический бенчмарк, а экономика конкретной нагрузки.

Hugging Face формулирует мотив иначе: поддержка встроена в Transformers, Diffusers, TRL и библиотеку kernels, а Trainium становится штатным бэкендом, а не отдельной веткой. Вице-президент по продукту Джефф Будье называет это выражением приверженности кремниевой нейтральности. За этим стоит простая мысль: платформа моделей не хочет выбирать железо за пользователя, и ей выгодно, чтобы любое железо требовало нуля специального кода.

Что это меняет на рынке ускорителей

Год назад конкуренция с NVIDIA шла в плоскости производительности и цены за час аренды. Теперь к ним добавилась третья переменная: стоимость переноса софта. Пока для нового чипа нужен отдельный стек, эта стоимость измеряется месяцами инженерного времени и работает как барьер. Когда чип становится обычным устройством PyTorch, барьер схлопывается до замены строки, и решение начинает приниматься по цене и по наличию свободных мощностей.

Для PyTorch это отдельная победа, и её стоит зафиксировать. Точка расширения PrivateUse1 и семейство torch.accelerator превращают фреймворк в слой абстракции над железом, а не в обёртку над CUDA. IBM Spyre прошла этот путь в октябре, теперь Trainium, и каждый такой случай делает следующий переход дешевле для всех участников. AWS, кстати, тоже вернула долг: в апстрим ушёл набор PR с исправлением тестов, где были жёстко зашиты предположения про CUDA.

Практический вывод для команды простой. Если вы тренируете модели на PyTorch и упираетесь в стоимость GPU-часов, публичная бета TorchNeuron это повод прогнать свой пайплайн на trn2 без переписывания кода. Начинать стоит с eager-режима, чтобы увидеть, какие операторы падают на CPU, затем собрать тот же запуск через torch.compile и сравнить время на шаг. Профайлер покажет, где Trainium проигрывает, а где выигрывает, и это будет ваш собственный ответ на вопрос, стоит ли переезд.

Частые вопросы

Нужно ли переписывать код, чтобы запустить модель на Trainium?

В большинстве случаев нет. Модель переводится на устройство вызовом .to('neuron'), а для компиляции достаточно указать бэкенд neuron один раз на процесс. Исключение составляют операторы без нативного понижения: они уходят на CPU и замедляют шаг, поэтому профилирование обязательно.

TorchNeuron заменяет GPU?

Нет, это альтернатива для конкретного класса нагрузок. Trainium рассчитан на обучение и инференс больших моделей в облаке AWS, а не на локальные рабочие станции. Выбор между ним и GPU определяется ценой за час, доступностью мощностей и тем, сколько операторов вашей модели исполняется нативно.

Что с FP8 и низкой точностью?

BF16, FP16 и FP32 поддерживаются полностью, вместе с autocast и смешанной точностью. TorchAO и FP8 пока находятся в приватной бете, их обещают открыть в следующем релизе. Для большинства инференс-сценариев BF16 достаточно, но для агрессивной квантизации придётся подождать.

Итог

TorchNeuron это не про то, что Trainium стал быстрее. Это про то, что он перестал быть отдельным миром: теперь это устройство PyTorch с приватным бэкендом, стандартными распределёнными API, собственными ядрами NKI и честно опубликованным списком из 22 тысяч операторов, которых пока нет. Публичная бета доступна с 20 октября под Apache 2.0, и проверить её на своём пайплайне дешевле, чем обсуждать бенчмарки.

Если будете пробовать, начните с одной модели и одного узла, снимите профиль через Neuron Explorer и посмотрите на долю операторов, ушедших на CPU. Эта цифра скажет о перспективах переезда больше, чем любой анонс.

← Все записи