Как заглянуть внутрь GPU и понять, почему тормозит нейросеть

29 May, 2026

Представьте, что вы обучили модель, запустили её на мощном сервере с пачкой A100, а скорость работы совсем не та, которую обещали в статьях. Вы смотрите на загрузку GPU — она скачет, процессор тоже чем-то занят, но где именно «бутылочное горлышко», непонятно. В такие моменты стандартных логов PyTorch не хватает. Нужно что-то, что покажет взаимодействие железа и кода на микросекундном уровне. Именно для этого команда PyTorch развивает проект kineto.

Что это такое и зачем лезть в дебри

Kineto — это не просто очередная надстройка, а низкоуровневая библиотека для профилирования, которая лежит в основе стандартного PyTorch Profiler. Если вы когда-нибудь вызывали torch.profiler.profile(), знайте: под капотом работала именно эта библиотека.

Основная ценность проекта в том, что он умеет собирать детальные трассировки (traces) как с CPU, так и с GPU. Он фиксирует события выполнения ядер CUDA, пересылку данных между памятью и вычислительными блоками, а также работу операторов самого PyTorch. Это позволяет увидеть полную картину: от вызова функции в Python до конкретной инструкции на видеокарте.

Из чего состоит проект

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

Центральное место занимает Libkineto. Это библиотека на C++, которая работает прямо внутри процесса вашего приложения. Её главная фишка — минимальный оверхед. Профилирование всегда замедляет программу, но разработчики Kineto постарались сделать так, чтобы измерения как можно меньше искажали реальную картину производительности. Она умеет вытаскивать данные из аппаратных счетчиков GPU, что критично для глубокого анализа.

Реклама

Раньше в этом же репозитории активно развивался плагин для TensorBoard. Сейчас ситуация изменилась: разработчики объявили его устаревшим (deprecated) и планируют полностью удалить к марту 2026 года. Если вы привыкли смотреть графики профилировщика в интерфейсе TensorBoard, самое время присмотреться к альтернативам, на которые намекают авторы.

Для тех, кто работает с распределенным обучением на множестве узлов, в README советуют использовать инструмент Holistic Trace Analysis. Он помогает сравнивать трассировки между разными рангами (процессами) в кластере, чтобы понять, почему один узел ждет другой и где возникают затыки в сети.

Чем Kineto полезен на практике

Обычно разработчики используют Kineto косвенно, но понимание его возможностей помогает лучше интерпретировать результаты профилирования.

Во-первых, библиотека дает возможность увидеть временную шкалу (timeline) выполнения операций. Вы можете заметить, что GPU простаивает, пока CPU готовит следующую порцию данных. Это классическая проблема DataLoader, которую легко пропустить без детальной трассировки.

Во-вторых, Kineto помогает выявлять неэффективное использование памяти. Если модель постоянно перебрасывает тензоры между хостом и девайсом, это сразу всплывет на графиках.

В-третьих, проект предоставляет диагностические рекомендации. Он не просто вываливает на вас сырые цифры, а пытается подсказать, что именно идет не так. Например, если ядра CUDA слишком мелкие и их запуск занимает больше времени, чем сами вычисления, профилировщик на базе Kineto это подсветит.

Как с этим работать

Поскольку Libkineto интегрирована в PyTorch, вам не нужно компилировать её отдельно (хотя такая возможность есть для системных интеграторов). Достаточно использовать стандартный API:

import torch
from torch.profiler import profile, record_function, ProfilerActivity

with profile(activities=[ProfilerActivity.CPU, ProfilerActivity.CUDA], record_shapes=True) as prof:
    with record_function("model_inference"):
        model(input_data)

prof.export_chrome_trace("trace.json")

Полученный файл trace.json можно открыть в браузере через chrome://tracing или в более современном Perfetto. Вы увидите каждый чих вашей видеокарты.

Кому стоит заглянуть в репозиторий

Если вы просто пишете скрипты на PyTorch и всё работает быстро, Kineto вам вряд ли понадобится. Но проект станет незаменимым в нескольких случаях:

  1. Вы занимаетесь оптимизацией производительности и стандартных средств мониторинга не хватает.
  2. Вы пишете свои кастомные операторы на C++/CUDA и хотите профилировать их наравне с нативными функциями PyTorch.
  3. Вы разрабатываете инструменты для анализа производительности и хотите интегрировать системное профилирование в свой пайплайн.

Проект живет по графику релизов PyTorch (примерно раз в три месяца) и открыт для контрибьюторов. Если решите добавить фичу, авторы просят сначала обсудить её в Issue, так как архитектура библиотеки постоянно эволюционирует. Это нормальная практика для таких низкоуровневых и критически важных компонентов.