Большинство инженеров знают, что nn.Linear делает умножение матриц с транспонированием — но мало кто смотрел, что именно происходит в профилировщике. Оказывается, aten::t (transpose) не запускает ни одного GPU-ядра: он только переписывает метаданные тензора на CPU. Hugging Face опубликовал вторую часть серии о профилировании в PyTorch, где это и многое другое видно прямо в трассах.
В трассе aten::t появляется на CPU-дорожке перед aten::addmm, но на GPU-дорожке следа нет совсем. Операция лишь меняет shape и stride тензора — никакого копирования данных, никакого запуска ядра. Именно поэтому искать здесь узкое место бессмысленно: накладные расходы живут в другом месте, и без трассы это неочевидно.
Серия строится по нарастающей. Part 1 разбирала голый torch.matmul + bias-add и учила читать трассы. Part 2 поднимается на уровень выше: nn.Linear с bias=True, затем три таких слоя с активацией между ними — полноценный MLP-блок. Скрипты (02_linear.py, 03_simple_mlp.py, 03_kernels_mlp.py) запускались на NVIDIA A100-SXM4-80GB; воспроизвести можно через Dev Mode with Spaces или Hugging Face Jobs.
Отдельная деталь для тех, кто работает удалённо: трассы синхронизируются в Hugging Face bucket через утилиту trace-util, которая возвращает Perfetto URL прямо в терминал. Это снимает привычную боль с вытаскиванием трейс-файлов с удалённой машины.
Ценность серии — не в том, что она учит запускать профилировщик, а в том, что объясняет, почему трасса выглядит именно так: какие операции реальные, а какие — иллюзия работы на GPU. Честный пробел: как картина меняется при torch.compile для MLP, в этой части не показано — тема заявлена, но сравнение отложено.