i
Новости
Новости · 2026-10-20

Бэкенд MPS в PyTorch 2.15

@neuronium_ai @neuronium_ai

Команда PyTorch в Hugging Face развивает бэкенд MPS, чтобы на Mac можно было запускать и обучать модели PyTorch. В начале 2026 года даже небольшие модели часто упирались в неподдерживаемые операции, резкие просадки производительности и неожиданный рост расхода памяти. Команда проверяет реальные модели из Hugging Face Hub — языковые, графические и видео — и исправляет слабые места в PyTorch, всё чаще заменяя MPSGraph отдельными ядрами Metal. В PyTorch 2.15 на Mac появились тензоры FP8, ускорились языковые модели и операции линейной алгебры, а декодирование видео Wan2.2 стало занимать около 8 ГиБ памяти вместо 270 ГиБ.

Обложка: Бэкенд MPS в PyTorch 2.15

Главное в обновлении

FP8 теперь доступен на Mac: значения float8_e4m3fn занимают вдвое меньше места, чем BF16. Для них работает масштабируемое умножение матриц и другие операции, поддерживаемые на CUDA и CPU.
Модели со смесью экспертов декодируют в 5–6,5 раза быстрее, чем в версии 2.14. На M3 Ultra скорость Qwen3.6-35B-A3B выросла с 9,4 до 61,3 токена в секунду благодаря собственной групповой операции умножения матриц, отдельному пути декодирования, меньшему числу синхронизаций между GPU и CPU и ускоренной маршрутизации top-k.
На каждом новом токене экономится время: для линейных слоёв с одной строкой входных данных используются специализированные ядра умножения матрицы на вектор, а softmax по словарю работает примерно в 8 раз быстрее.
Больше операций линейной алгебры выполняется на GPU: появились комплексные LU-разложение и решение треугольных систем, ускорились обращение небольших матриц и QR-разложение.
Ускорены свёртки, дополнение тензоров, dropout, обратный проход интерполяции и редукции — операции, важные для аудио, видео и обучения. При декодировании видео Wan2.2 пиковое использование памяти снизилось с 270 до 8 ГиБ.
Из Python теперь можно управлять потоками MPS; измерение времени событий стало надёжнее.
MPS теперь требует macOS 15 или новее, а PyTorch 2.15 — Python 3.11 или новее.
В PyTorch 2.16 ожидаются полностью работающий на Metal attention, дальнейший перенос операций с MPSGraph на Metal и ускорение декодирования языковых моделей.

Что изменится на практике

Если вы запускаете модели на Mac с помощью transformers, diffusers или инструментов вроде ComfyUI, в версии 2.15 вас ждут такие изменения:

Локальные языковые модели работают быстрее. Модели со смесью экспертов декодируют в 5–6,5 раза быстрее, чем в 2.14. На M3 Ultra с torch.compile скорость Qwen3.6-35B-A3B выросла с 9,4 до 61,3 токена в секунду, а LFM2.5-8B-A1B — с 23,6 до 123,6 токена в секунду. Плотные модели тоже ускорились благодаря более быстрым линейным слоям и softmax для выборки, который стал работать в 8 раз быстрее.
Генерация видео укладывается в память. При декодировании видео с помощью блочного VAE Wan2.2 раньше использование памяти драйвера доходило до 270 ГиБ, теперь максимум составляет около 8 ГиБ.
Qwen-Image-2.1 корректно редактирует изображения. В версии 2.14 кодировщик VAE этой модели незаметно искажал изображения на MPS, из-за чего нарушалась работа редактирования изображений; об этом сообщали в ComfyUI. Изменение дополнения тензоров исправило проблему: после кодирования и декодирования результат теперь совпадает с CPU с показателем PSNR 29,95 дБ вместо 10,06 дБ.
Веса FP8 занимают меньше места. Тензоры FP8 используют вдвое меньше памяти, чем BF16, а F.scaled_mm выполняет их умножение непосредственно на GPU.

Начало работы

Для PyTorch 2.15 нужен Mac на Apple silicon с macOS 15 или новее и Python 3.11 или новее. Подробности есть в таблице совместимости версии 2.15. Если система слишком старая или GPU Metal недоступен, проверка доступности MPS теперь сообщает причину.

Чтобы попробовать предварительную версию в отдельном окружении, выполните команду:

Команда
uv pip install torch==2.15.0 --index-url https://download.pytorch.org/whl/test/cpu

Команда устанавливает PyTorch 2.15.0 из тестового индекса пакетов PyTorch.

FP8 теперь работает на MPS

FP8 — ещё один способ экономить память на Mac. В PyTorch 2.15 на MPS появились тензоры torch.float8_e4m3fn: каждое значение занимает один байт, вдвое меньше, чем при хранении в FP16 или BF16.

Такие тензоры можно перемножать с помощью F.scaled_mm, который поддерживает масштабирование всего тензора и отдельных строк. Ниже — пример с одним коэффициентом масштабирования на тензор:

Пример кода
import
 torch

import
 torch.nn.functional 
as
 F

def
 
quantize_fp8
(
x
):
    limit = torch.finfo(torch.float8_e4m3fn).
max

    scale = x.
abs
().amax().clamp_min(
1e-12
) / limit
    
return
 (x / scale).to(torch.float8_e4m3fn), scale

x = torch.randn(
1
, 
1024
, device=
"mps"
, dtype=torch.float32)
weight = torch.randn(
1024
, 
1024
, device=
"mps"
, dtype=torch.float32)
x_fp8, x_scale = quantize_fp8(x)
w_fp8, w_scale = quantize_fp8(weight)

y = F.scaled_mm(
    x_fp8,
    w_fp8.t(),
    scale_a=x_scale,
    scale_recipe_a=F.ScalingType.TensorWise,
    scale_b=w_scale,
    scale_recipe_b=F.ScalingType.TensorWise,
    output_dtype=torch.bfloat16,
)

print
(y.shape, y.dtype)

Код создаёт тензоры FP8 из входных данных и весов, перемножает их с помощью F.scaled_mm и выводит форму и тип результата.

Ускоренное декодирование языковых моделей

Обработка каждого запроса к языковой модели включает предварительный этап и декодирование. На этапе декодирования модель получает по одной строке данных на новый токен, поэтому большие умножения матриц превращаются в умножение матрицы на вектор. В PyTorch 2.15 ускорились оба типа слоёв, которые чаще всего выполняют эту работу: плотные линейные слои и слои со смесью экспертов.

Линейные слои

В MPS появились ядра GEMV для torch.mm ещё в версии 2.14, но F.linear продолжал работать через MPSGraph. В PyTorch 2.15 эти ядра подключили к F.linear: распространённые входные данные для декодирования формы [1, 1, hidden_size] теперь обрабатываются напрямую, а подходящие операции сложения смещения объединяются с ними.

Источник: huggingface.co

На 96 формах слоёв BF16 из реальных моделей средний геометрический прирост скорости составил 1,23 раза. Наибольший выигрыш заметен у небольших проекций, например у управляющих слоёв в моделях со смесью экспертов: прежний путь использовал лишь часть пропускной способности памяти. Крупные слои и выходные слои языковых моделей и раньше были близки к пределу пропускной способности, поэтому их скорость почти не изменилась.

Слои со смесью экспертов

Слой со смесью экспертов направляет к каждому эксперту разное число токенов. Групповое умножение матриц обрабатывает эти группы разного размера за одну операцию. В версии 2.15 для MPS появилась собственная реализация.

В версии 2.14 групповые смещения копировались на CPU, после чего группы обрабатывались циклом. Новые ядра Metal читают смещения непосредственно на GPU: где возможно, они используют Metal Performance Primitives, а в остальных случаях — отдельный путь Metal. Для небольших групп, типичных при декодировании, также предусмотрено собственное ядро.

Например, 64 токена можно разделить на группы из 16, 32 и 16 токенов:

Пример кода
import
 torch

import
 torch.nn.functional 
as
 F

tokens = torch.randn(
64
, 
64
, device=
"mps"
, dtype=torch.bfloat16)
weights = torch.randn(
3
, 
128
, 
64
, device=
"mps"
, dtype=torch.bfloat16)
ends = torch.tensor([
16
, 
48
, 
64
], device=
"mps"
, dtype=torch.int32)

out = F.grouped_mm(tokens, weights.transpose(-
2
, -
1
), offs=ends)

print
(out.shape)  
# torch.Size([64, 128])

Код создаёт три группы токенов и выполняет для них групповое умножение матриц.

Ускорение ядра декодирования заметно и по пропускной способности. На M3 Ultra с torch.compile модели со смесью экспертов генерируют примерно в 1,3 раза больше токенов в секунду.

Ускорение линейной алгебры

Вычисления с комплексными числами

Работать с комплексными тензорами стало проще. На MPS теперь доступны LU-разложение для complex64, решение системы с помощью LU-разложения и решение треугольных систем. Благодаря этому работают и построенные на этих операциях вычисления с градиентами, например определители комплексных матриц.

Ниже показано, как решить небольшую систему прямо на GPU:

Пример кода
import
 torch

a = torch.randn(
8
, 
8
, device=
"mps"
, dtype=torch.complex64)
a = a + 
8
 * torch.eye(
8
, device=
"mps"
, dtype=torch.complex64)
b = torch.randn(
8
, 
2
, device=
"mps"
, dtype=torch.complex64)

lu, pivots = torch.linalg.lu_factor(a)
x = torch.linalg.lu_solve(lu, pivots, b)

print
((a @ x - b).
abs
().
max
().item())

Код выполняет LU-разложение и решает систему, после чего выводит максимальную ошибку.

Небольшие матрицы и крупные системы

Для небольших матриц тоже появились быстрые ядра. При обработке геометрии камер и преобразовании изображений пакеты матриц FP32 размером до 4 × 4 обращаются одним ядром Metal, которое объединяет разложение и решение системы. Ускорились и более крупные вычисления: QR-разложение использует блочные обновления, а решение треугольных систем выполняет значительную часть работы через эффективное умножение матриц.

Для рабочих нагрузок Gated DeltaNet добавлен быстрый путь для треугольных систем FP32 размером 16 × 16, 32 × 32 и 64 × 64, если у них не менее восьми правых частей.

Сингулярное разложение стало надёжнее при крайних численных значениях. Теперь оно корректно обрабатывает очень малые сингулярные значения, очень большие и очень малые значения входных данных, а также дополнение базиса при full_matrices=True. Благодаря этому надёжнее работают псевдообращение матриц и метод наименьших квадратов.

Свёртки, дополнение тензоров и обучение

У аудиомоделей, видеодекодеров и циклов обучения есть собственные ресурсоёмкие операции. В этом выпуске для ряда таких операций появились новые пути на Metal.

Softmax и редукции

В PyTorch 2.15 ускорилась и выборка токенов. Операции softmax и log_softmax теперь используют отдельные ядра Metal. Наибольший выигрыш получают модели с большим словарём: для строки логитов FP32 формы [1, 128256] время softmax сократилось с 57 до 7 мкс — примерно в 8 раз по сравнению с MPSGraph. Ускорение сохраняется и для других распространённых размеров словаря.

Меньше памяти при декодировании видео

Одно из заметных изменений связано с дополнением тензоров константами. VAE-декодер модели Wan-ИИ/Wan2.2-TI2V-5B-Diffusers выполняет 8764 операции дополнения за полный проход по 28 блокам. После переноса дополнения на Metal пиковое использование памяти драйвера снизилось примерно с 270 до 8 ГиБ.

Управление потоками MPS

Теперь из Python можно выбирать поток MPS для выполнения задач. Для этого доступны torch.mps.Stream и контекстный менеджер torch.mps.stream, а Tensor.record_stream позволяет аллокатору учитывать использование тензора в другом потоке.

В этом примере вычисления запускаются в отдельном потоке, который синхронизируется перед чтением результата:

Пример кода
import
 torch

x = torch.randn(
1024
, device=
"mps"
)
torch.mps.synchronize()
worker = torch.mps.Stream()

with
 torch.mps.stream(worker):
    y = x.square()
    x.record_stream(worker)

del
 x
worker.synchronize()

print
(y.cpu().shape)

Код возводит тензор в квадрат в отдельном потоке MPS, сообщает аллокатору об использовании тензора и дожидается завершения работы потока.

Другие операции на MPS

На MPS теперь доступны ещё несколько операций: torch.frexp, torch.logspace, torch.take и Tensor.put_, torch.heaviside, torch.special.laguerre_polynomial_l, а также сравнения беззнаковых целых чисел. У logspace пока есть ограничение: если результат содержит больше одного элемента, нельзя получить целочисленный или логический тип.

Исправлена и работа attention: математическая реализация scaled dot-product attention для MPS теперь корректно обрабатывает широковещательное распределение размерностей пакета и голов.

Что появится в PyTorch 2.16

Работа над версией 2.16 уже идёт. Некоторые изменения попали в основную ветку и доступны в ночных сборках, другие ещё проходят проверку, поэтому до выпуска детали могут измениться.

Ускоренное декодирование языковых моделей

Когда в пути декодирования модели больше не остаётся операций MPSGraph, GPU начинает обрабатывать токен только после того, как CPU закончит подготовку всех ядер. В PyTorch 2.16 буфер команд будет отправляться на выполнение после каждых 16 ядер: GPU сможет начать работу, пока CPU продолжает готовить остальные. Это изменение относится к декодированию BF16 с компиляцией при длине контекста 2048 токенов.

Attention целиком на Metal

Scaled dot-product attention полностью откажется от MPSGraph: для каждой формы будут использоваться ядра Metal. Для декодирования предусмотрены отдельные векторные ядра, а для предварительной обработки половинной точности на новых версиях macOS — Metal Performance Primitives. Наибольший выигрыш ожидается у форм, которые раньше переходили на MPSGraph.

На M5 Pro декодирование с групповой выборкой запросов — 32 головы запросов, 8 голов ключей и значений, размерность головы 80 и контекст 4K — ускоряется с 465 до 65 мкс. Предварительная обработка матрицы 4K × 4K с размерностью головы 40 сокращается с 42 до 6 мс.

Перенос операций с MPSGraph на Metal

Перенос операций продолжается. Прямой и обратный проходы пакетной нормализации находятся в работе. MSE loss, который на небольших входных данных работает до 12 раз быстрее, std_mean и var_mean с ускорением до 4 раз, а также bincount уже добавлены.

Наибольшая разница — у bincount. Если большинство значений попадает в одну корзину, подсчёт 4 миллионов целых чисел раньше занимал 6,8 секунды, а теперь — полмиллисекунды.

Уменьшение размера установки

По умолчанию шейдеры в комплекте будут собираться для Metal 3.1; версии для Metal 4 будут компилироваться только для ядер, которым они нужны. Это уменьшит размер libtorch_cpu.dylib примерно на 25% — с 384 до 287 МиБ — и подготовит основу для шейдеров Metal 4.1 с более быстрым умножением матриц и нативным умножением матриц FP8.

Итоги

PyTorch 2.15 добавляет FP8 на Mac, ускоряет декодирование плотных моделей и моделей со смесью экспертов, расширяет набор операций линейной алгебры на GPU и переносит ряд операций с MPSGraph на отдельные ядра Metal. Предварительную версию уже можно попробовать.

Что команда планирует дальше

Развитие MPS: в версии 2.16 attention будет полностью работать на Metal; перенос операций с MPSGraph продолжится.
torch.compile: команда работает над устранением разрывов графа, чтобы больше моделей компилировались целиком.
Идеи сообщества: команда предлагает сообщать о медленных, отсутствующих или неисправных функциях PyTorch — на MPS и других платформах — через GitHub.

Команда благодарит Никиту Шульгу, Курта Молера и Аарона Гокаслана за проверку значительной части этой работы, а также всех, кто участвовал в развитии MPS в этом выпуске.

В гостях у нового гигантского полупроводникового комплекса Samsung Голливудские ИИ-звёзды: готова ли технология потеснить актёров из плоти и крови? Не обманывайтесь: ИИ, который должен был экономить наше время, делает ровно обратное Хакеры взломали OpenCode и потратили деньги с ИИ-счетов пользователей Мамдани: федеральные власти отказались заниматься ИИ — он призвал жителей Нью-Йорка дать отпор Tenstorrent привлекла $1,5 млрд при оценке в $6,2 млрд, чтобы нарастить выпуск ИИ-чипов с открытыми весами Nscale и Anthropic, по сообщениям, обсуждают ещё одну сделку на $45 млрд по вычислительным мощностям fal представила FLUX 3 Max и заявила, что модель генерирует видео с ИИ в 22 раза быстрее Seedance 2.5 Встроенные оценщики ИИ не станут простым решением, предупреждает глава отдела политики Hugging Face Исследование предполагает: новый ИИ-инструмент предсказывает выживаемость при раке по одному селфи пациента Microsoft: ИИ-агенты похожи на инсайдерские угрозы, а передовым моделям нельзя доверять Основательница Replika спустя 12 лет создала ИИ-ассистента, которого представила на Disrupt Amazon нанесла Nvidia самый серьёзный удар — выпустила инструмент для разработчиков TorchNeuron Бывшего инженера OpenAI, обвиняемого в слежке за руководителями, оставили под стражей до суда Tolan привлекла $30 млн на развитие ИИ-компаньона, помогающего справляться с жизненными трудностями Интернет станет удобнее для ИИ-агентов, но может ухудшиться для всех остальных MiniMax M3.1 Flash показывает: ценовой гонке ИИ в Китае не видно дна МВФ предупреждает: пузырь ИИ может обрушить всю мировую экономику Kling AI выпустила версию 4.0 со стереозвуком, многоязычной синхронизацией губ и облегчённой версией Flash Laplace Intelligence проверяет роботов и беспилотные автомобили на прочность до выхода в реальный мир

Ежедневные новости об ИИ

Каждый день отбираем важные новости об ИИ и рассказываем главное — без хайпа и воды. Если хотите понимать, что происходит в ИИ раньше остальных, — подписывайтесь.

Только важное — каждый день

В Telegram