DSpark на двух DGX Spark: порт, баг на одну строку и бенчмарки, которые пришлось мерить заново

Введение

Когда речь заходит о распределённых вычислениях для AI, многие представляют себе кластеры из сотен GPU, сложные конфигурации и недели на отладку. Но что, если вам нужно всего два устройства — и одно из них неожиданно ломает всю математику? Именно с такой ситуацией столкнулась команда разработчиков при портировании DSpark — фреймворка для распределённого обучения нейросетей — на два NVIDIA DGX Spark. В этой статье мы разберём реальный кейс: от первоначальной задумки до бага в одной строке кода, который заставил пересчитать все бенчмарки.

Проблема: портирование DSpark на DGX Spark

DSpark — это популярный фреймворк для распределённого обучения, оптимизированный для работы на кластерах с InfiniBand. Когда инженеры решили адаптировать его для двух DGX Spark — компактных AI-серверов на базе Grace Hopper, — они столкнулись с неожиданностью. DGX Spark использует нестандартную топологию памяти: CPU Grace и GPU Hopper объединены через NVLink-C2C, что даёт когерентность кэша, но требует особого подхода к распределению данных.

Первоначальный порт занял около двух недель. Основная работа заключалась в адаптации слоя коммуникаций: замена MPI на NVLink-совместимый NCCL (NVIDIA Collective Communications Library). Ожидалось, что производительность будет линейно расти с добавлением второго устройства. Но первые прогоны показали странное падение скорости на 15–20% при переходе с одного DGX Spark на два.

Баг на одну строку: как одна опечатка сломала бенчмарки

После нескольких дней профилирования выяснилась причина — баг в одной строке кода. Вот что произошло: при инициализации распределённого тензора в DSpark используется параметр shard_dim, который указывает, по какому измерению делить данные. В адаптированной версии для DGX Spark разработчик случайно передал shard_dim=None вместо shard_dim=0.

Это привело к тому, что NCCL вместо параллельного распределения данных по двум GPU начинал реплицировать весь тензор на каждое устройство. Результат — вдвое больше памяти на каждом GPU и лишние операции копирования. С точки зрения кода — одна строка, с точки зрения производительности — катастрофа.

Исправление заняло 10 минут, но последствия оказались серьёзнее: все ранее проведённые бенчмарки (а их было около 30) пришлось пересчитать. Почему? Потому что баг искажал не только абсолютные значения времени, но и масштабирование: при одном устройстве проблема не проявлялась, а при двух — давала ложное ощущение, что фреймворк плохо масштабируется.

Бенчмарки заново: что показали повторные замеры

После исправления бага команда провела повторное тестирование на двух синтетических задачах: обучение ResNet-50 на ImageNet (классификация) и обучение GPT-2 с 124 млн параметров (генерация текста). Использовалась стандартная конфигурация: batch size 256, mixed precision (FP16), оптимизатор AdamW.

Вот результаты до и после исправления (время одного шага обучения, мс):

Модель Один DGX Spark (исходно) Два DGX Spark (с багом) Два DGX Spark (исправлено) Ускорение (исправлено / один)
ResNet-50 245 мс 280 мс 130 мс 1.88x
GPT-2 124M 520 мс 610 мс 270 мс 1.93x

Как видно из таблицы, после исправления ускорение приблизилось к идеальному (2x) — 1.88x и 1.93x. Небольшое отклонение связано с накладными расходами на коммуникацию между устройствами через NVLink-C2C. До исправления же ускорение было отрицательным — время на двух устройствах оказалось хуже, чем на одном.

Практические выводы для инженеров

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

  1. Всегда проверяйте параметры инициализации распределённых тензоров. Даже одна опечатка в shard_dim может сломать масштабирование.
  2. Проводите бенчмарки на одном устройстве перед запуском на кластере. Это позволит выявить баги, которые проявляются только при распределении.
  3. Используйте профилировщики (например, NVIDIA Nsight Systems) для обнаружения аномалий. В данном случае профилирование показало, что объём памяти на GPU вырос вдвое, что сразу указало на проблему.
  4. Пересчитывайте бенчмарки после каждого значимого исправления. Даже если кажется, что изменение не влияет на производительность, лучше перепроверить.

Заключение

Портирование DSpark на два DGX Spark оказалось не просто техническим упражнением, а настоящим детективом, где ключевую роль сыграла одна строка кода. Баг, стоивший нескольких дней работы и пересчёта десятков бенчмарков, напоминает: в распределённых системах нет мелочей. Каждый параметр, каждая конфигурация могут стать узким местом.

Тем не менее, после исправления фреймворк показал отличные результаты — почти линейное масштабирование на двух устройствах. Это подтверждает, что DGX Spark, несмотря на компактные размеры, может быть эффективной платформой для распределённого обучения, если правильно адаптировать софт.

Подробнее с исходной новостью и техническими деталями можно ознакомиться здесь.

← Все статьи

Комментарии

Читайте также

ELK Stack и AI-агент: как ASI Biont автоматизирует мониторинг логов без сложных запросов

6 июля 2026

Как освоить ядерную безопасность и стандарты IAEA за три месяца: разбор курса «Атомная энергетика и радиационная безопасность (IAEA, NRC)»

6 июля 2026

Как Нью-Йорк меняет образование: педагоги и лидеры индустрии встретились в Google, чтобы определить будущее ИИ в классах

6 июля 2026

8 лет разработки: как open-source платформа Homegames меняет представление об игровых сервисах

6 июля 2026

Глава CATL оценил готовность твердотельных батарей к выпуску на 4 балла из 9: что это значит для рынка и как проверить данные?

6 июля 2026

Hi! Welcome Your New Virtual Assistant: Как AI-ассистент меняет работу малого бизнеса в 2026 году

6 июля 2026

Инвестиции в безопасность мультиагентных AI-систем: почему это критически важно в 2026 году

5 июля 2026

Микросервисная архитектура: создавайте масштабируемые системы без головной боли

5 июля 2026

Новый ИИ-тьютор показал эффект размера 0.71-1.30 SD в курсе Дартмута: что это значит для EdTech

5 июля 2026