Привет!
После первых запусков конвейера тренировки YOLO11 я сосредоточился на устранении узких мест в производительности, стабилизации процесса обучения и реализации модели и инференса на С++ API.
⚡️ Производительность: два существенных улучшения
1. Прямые групповые свертки (Vulkan)
Ранее групповые свертки — основа depthwise-separable блоков backbone'а YOLO — выполнялись на GPU циклом по парам
Я реализовал single-dispatch прямую свертку для
2. Оптимизация функции потерь
Здесь было два критических узких места:
• Distributed-focus loss: ранее считался через
• Синхронизации с хостом: тензоры anchor points, stride и input-size теперь кэшируются между шагами. Гистограмму label-assignment переписал с
🔧 Vulkan backend и фреймворк
• Выделил отдельный fence pool для host-read copies, чтобы трансфер данных не блокировал основной поток сабмишена.
• Устранил edge-cases в strided reductions для случаев, когда размер не кратен размеру рабочей группы.
• Добавил поддержку broadcasting для операторов
• Убрал проверки границ индексов в scatter из fast path, снизив поэлементный оверхед.
• Добавил
• Сделал wheel-пакет relocatable (через
🧠 Обучение и инференс
• Чекпоинты: полностью переписал сериализацию — теперь это словарь именованных тензоров. Можно сохранить и восстановить полное состояние (модель, оптимизатор, эпоху, шаг) и возобновить обучение.
• C++ инференс: реализован standalone инструмент (
🎯 Планы
Валидировать end-to-end скорость обучения на GPU, протестировать поток восстановления из чекпоинтов. Тестирование распределенного обучения пока отложил, надо довести до ума реализацию в целом.
#YOLO11 #Adept #DeepLearning #ComputerVision #Vulkan #CPlusPlus #Performance
После первых запусков конвейера тренировки YOLO11 я сосредоточился на устранении узких мест в производительности, стабилизации процесса обучения и реализации модели и инференса на С++ API.
⚡️ Производительность: два существенных улучшения
1. Прямые групповые свертки (Vulkan)
Ранее групповые свертки — основа depthwise-separable блоков backbone'а YOLO — выполнялись на GPU циклом по парам
(batch, group). Для каждой пары отдельно диспатчились im2col и GEMM. На малых тензорах оверхед от запусков ядер доминировал в общем времени вычислений.Я реализовал single-dispatch прямую свертку для
groups > 1. Добавлены три новых compute shader'а (forward, input-grad, weight-grad), которые аккумулируют свертку напрямую, без использования im2col. Это существенно сократило количество запусков ядер и ускорило работу backbone'а.2. Оптимизация функции потерь
Здесь было два критических узких места:
• Distributed-focus loss: ранее считался через
dot, который диспатчил batched GEMM и выполнял итерации по хосту для каждого среза (batch, anchor, 4). Заменил на broadcast-multiply и редукцию по оси дистрибуции - получилось ускорение в несколько раз. В Adpet пока есть проблемы с эффективным пакетным GEMM.• Синхронизации с хостом: тензоры anchor points, stride и input-size теперь кэшируются между шагами. Гистограмму label-assignment переписал с
unique() + scatter_add_ (требовала синхронизации) на прямой per-batch scatter_add_. Сумму target-score теперь считает GPU max вместо чтения .cpu().item(). Вычисление loss теперь ставится в очередь асинхронно и не блокирует пайплайн.🔧 Vulkan backend и фреймворк
• Выделил отдельный fence pool для host-read copies, чтобы трансфер данных не блокировал основной поток сабмишена.
• Устранил edge-cases в strided reductions для случаев, когда размер не кратен размеру рабочей группы.
• Добавил поддержку broadcasting для операторов
eq/ne.• Убрал проверки границ индексов в scatter из fast path, снизив поэлементный оверхед.
• Добавил
Sequential и ModuleList для компоновки C++ моделей.• Сделал wheel-пакет relocatable (через
$ORIGIN), чтобы он корректно работал из любой директории установки.🧠 Обучение и инференс
• Чекпоинты: полностью переписал сериализацию — теперь это словарь именованных тензоров. Можно сохранить и восстановить полное состояние (модель, оптимизатор, эпоху, шаг) и возобновить обучение.
• C++ инференс: реализован standalone инструмент (
apps/cpp/yolo11) с JPEG decode/encode через libjpeg, letterbox, NMS и визуализацией результатов. В Python-инференсе также скорректировал масштабирование bounding box'ов обратно к исходным координатам изображения.🎯 Планы
Валидировать end-to-end скорость обучения на GPU, протестировать поток восстановления из чекпоинтов. Тестирование распределенного обучения пока отложил, надо довести до ума реализацию в целом.
#YOLO11 #Adept #DeepLearning #ComputerVision #Vulkan #CPlusPlus #Performance
👍2🔥1
Привет!
Последнюю неделю я продолжаю занимался реализацией обучениея модели YOLOv11. Основная проблема - обучение упорно не сходилось, после нескольких эпох лосс начинал катастрофически разваливаться.
Потратил немало времени на поиски причины, пока не вскрылись две большие проблемы: критический баг в ядре фреймворка и классическая боль с датасетом.
🚨 Главный фикс: баг с накоплением градиентов
Это и было основной причиной расхождения. Оказалось, что backward passes для
Решение: Заменил прямую запись на
📊 Борьба с несбалансированным MS COCO и YOLOv11 туллинг
Вторая головная боль — сам датасет MS COCO. В нём сильный перекос в сторону класса 0 (person). Чтобы нивелировать этот дисбаланс и упростить жизнь при обучении, я добавил в туллинг YOLOv11:
• Class-weighted loss: взвешивание по классам для классификационного BCE.
• Balanced subset builder: утилита для создания сбалансированных сабсетов COCO.
• CSV logging: логирование лосса по батчам с поддержкой resume/append.
• Loss-curve viewer: интерактивный вьювер для отрисовки этих CSV-логов - это позволило лучше наблюдать за динамикой обучения.
🛠 Другие важные фиксы в ядре Adept:
Vulkan push-constant packing. Буфер shader-constants паковался без std430 alignment padding. Из-за этого 64-битные скаляры могли попадать на невалидные оффсеты. Выровнял по спецификации.
Misc: В Python-биндингах тензоров теперь корректно экспортируются
🔮 Что дальше: оптимизация памяти
Следующая большая задача — потребление памяти. Сейчас Adept расходует почти в 4 раза больше памяти GPU по сравнению с зеркальной реализацией на PyTorch. Причина кроется в неоптимальной политике memory pool. При обучении YOLO генерируется огромное количество тензоров переменной длины — из-за разного количества anchors на каждом изображении. Простой пул аллокаторов приходится сильно раздувать, чтобы сократить число аллокаций, и это убивает эффективность по памяти. Нужно переработывать стратегию пула — это в планах на ближайшее время.
💡 Вывод
Решение реальной комплексной задачи вроде обучения YOLOv11 вскрыло массу проблем, которые просто невозможно было обнаружить на отдельных юнит-тестах и простых моделях. Баг с перезаписью градиентов, проблемы с non-contiguous тензорами, перерасход памяти — всё это всплыло только когда пайплайн был собран целиком и поставлен под нагрузку. Хорошее напоминание о том, что integration testing и реальные нагрузки - незаменимы.
#Adept #YOLOv11 #DeepLearning #ComputerVision #MachineLearning #Vulkan #C++ #Python #MLOps #ModelTraining
Последнюю неделю я продолжаю занимался реализацией обучениея модели YOLOv11. Основная проблема - обучение упорно не сходилось, после нескольких эпох лосс начинал катастрофически разваливаться.
Потратил немало времени на поиски причины, пока не вскрылись две большие проблемы: критический баг в ядре фреймворка и классическая боль с датасетом.
🚨 Главный фикс: баг с накоплением градиентов
Это и было основной причиной расхождения. Оказалось, что backward passes для
conv2d, conv_transpose2d и batchnorm2d писали напрямую в input.grad(). В результате градиенты просто перезаписывались, вместо того чтобы суммироваться с разных путей(ребер вычислительного графа) для одного входного тензора.Решение: Заменил прямую запись на
add_grad. Теперь вклад от всех операций корректно суммируется. Обучение наконец-то поехало!📊 Борьба с несбалансированным MS COCO и YOLOv11 туллинг
Вторая головная боль — сам датасет MS COCO. В нём сильный перекос в сторону класса 0 (person). Чтобы нивелировать этот дисбаланс и упростить жизнь при обучении, я добавил в туллинг YOLOv11:
• Class-weighted loss: взвешивание по классам для классификационного BCE.
• Balanced subset builder: утилита для создания сбалансированных сабсетов COCO.
• CSV logging: логирование лосса по батчам с поддержкой resume/append.
• Loss-curve viewer: интерактивный вьювер для отрисовки этих CSV-логов - это позволило лучше наблюдать за динамикой обучения.
🛠 Другие важные фиксы в ядре Adept:
Vulkan push-constant packing. Буфер shader-constants паковался без std430 alignment padding. Из-за этого 64-битные скаляры могли попадать на невалидные оффсеты. Выровнял по спецификации.
Misc: В Python-биндингах тензоров теперь корректно экспортируются
bool значения в protocols buffer интерфейсе. 🔮 Что дальше: оптимизация памяти
Следующая большая задача — потребление памяти. Сейчас Adept расходует почти в 4 раза больше памяти GPU по сравнению с зеркальной реализацией на PyTorch. Причина кроется в неоптимальной политике memory pool. При обучении YOLO генерируется огромное количество тензоров переменной длины — из-за разного количества anchors на каждом изображении. Простой пул аллокаторов приходится сильно раздувать, чтобы сократить число аллокаций, и это убивает эффективность по памяти. Нужно переработывать стратегию пула — это в планах на ближайшее время.
💡 Вывод
Решение реальной комплексной задачи вроде обучения YOLOv11 вскрыло массу проблем, которые просто невозможно было обнаружить на отдельных юнит-тестах и простых моделях. Баг с перезаписью градиентов, проблемы с non-contiguous тензорами, перерасход памяти — всё это всплыло только когда пайплайн был собран целиком и поставлен под нагрузку. Хорошее напоминание о том, что integration testing и реальные нагрузки - незаменимы.
#Adept #YOLOv11 #DeepLearning #ComputerVision #MachineLearning #Vulkan #C++ #Python #MLOps #ModelTraining
Изменил подход к управлению памятью, что снизило потребление в 2 раза. А это в свою очередь позволило тренировать на большем разрешении и увеличить размер пакета. На изображениях результат 24 часов тренировки. Утечек памяти не было.
Привет!
Я закончил реализацию и проверку всей функциональности которую планировал для публикации следующего релиза Adept! 🎉
Помимо основных задач, провел важное кросс-платформенное тестирование:
✅ Успешно протестировал распределённое обучение (DDP) на связке из двух RTX 2080Ti.
✅ Проверил сборку и работу на Android с GPU Adreno 650 и Snapdragon 870.
💡 Также в планах на новый релиз: помимо стандартных Python wheel, мы подготовим RPM-пакет для Alt Linux.
📝 Что нового с 6 сентября:
🎮 GPU / Vulkan Backend
• Перешли на сегментированный аллокатор памяти для GPU устройств (`vksegalloc`) вместо выделения буферов на каждый тензор. Добавили отдельные абстракции staging-буферов.
• Интегрировали это в Vulkan device/manager, GPU API и Python-биндинги.
• Реализовали graceful fallback для устройств без поддержки опциональных расширений (на уровнях device, shader и submit).
🎯 YOLO v11 и распределённое обучение
• Добавили опцию выбора Device-ID в Python CLI и C++ примере для инференса YOLO.
• Реализовали поддержку распределённого обучения (DDP) для YOLO v11, включая корректировки функций потерь под распределённые вычисления.
📦 Сборка и пакетирование
• OpenMPI runtime теперь бандлится в wheel, добавлен лаунчер
• Настроили пайплайн сборки manylinux wheel.
• ⚠️ Важно: Минимальная требуемая версия Python повышена с 3.11 до 3.12.
• Починили зависимости MPI и добавили возможность сборки под Android с помощью clang.
🧹 Очистка и адаптация API
• Удалили легаси и неструктурированные примеры.
• Адаптировали актуальные примеры (LeNet, MLP, ResNet, импорт ONNX) под свежее API.
В ближайшее время всё залью в основную ветку, сделаю тег 0.2.0 и опубликую Python пакет для x86_64 в GitVerse 🛠
#Adept #MachineLearning #Vulkan #YOLOv11 #DistributedTraining #AltLinux #Android #OpenSource #C++ #Python #GPU
Я закончил реализацию и проверку всей функциональности которую планировал для публикации следующего релиза Adept! 🎉
Помимо основных задач, провел важное кросс-платформенное тестирование:
✅ Успешно протестировал распределённое обучение (DDP) на связке из двух RTX 2080Ti.
✅ Проверил сборку и работу на Android с GPU Adreno 650 и Snapdragon 870.
💡 Также в планах на новый релиз: помимо стандартных Python wheel, мы подготовим RPM-пакет для Alt Linux.
📝 Что нового с 6 сентября:
🎮 GPU / Vulkan Backend
• Перешли на сегментированный аллокатор памяти для GPU устройств (`vksegalloc`) вместо выделения буферов на каждый тензор. Добавили отдельные абстракции staging-буферов.
• Интегрировали это в Vulkan device/manager, GPU API и Python-биндинги.
• Реализовали graceful fallback для устройств без поддержки опциональных расширений (на уровнях device, shader и submit).
🎯 YOLO v11 и распределённое обучение
• Добавили опцию выбора Device-ID в Python CLI и C++ примере для инференса YOLO.
• Реализовали поддержку распределённого обучения (DDP) для YOLO v11, включая корректировки функций потерь под распределённые вычисления.
📦 Сборка и пакетирование
• OpenMPI runtime теперь бандлится в wheel, добавлен лаунчер
adeptrun.• Настроили пайплайн сборки manylinux wheel.
• ⚠️ Важно: Минимальная требуемая версия Python повышена с 3.11 до 3.12.
• Починили зависимости MPI и добавили возможность сборки под Android с помощью clang.
🧹 Очистка и адаптация API
• Удалили легаси и неструктурированные примеры.
• Адаптировали актуальные примеры (LeNet, MLP, ResNet, импорт ONNX) под свежее API.
В ближайшее время всё залью в основную ветку, сделаю тег 0.2.0 и опубликую Python пакет для x86_64 в GitVerse 🛠
#Adept #MachineLearning #Vulkan #YOLOv11 #DistributedTraining #AltLinux #Android #OpenSource #C++ #Python #GPU
❤3👍2
Привет!
С радостью сообщаю что наконец-то вышел Релиз 0.2.0
Основные изменения:
- Тензорный движок переработан с использованием смещений и представлений(strides and views).
- Добавлена индексация в стиле PyTorch.
- Типизированные скалярные аргументы.
- Упрощен API редукции.
- Переработан формат записи checkpoints.
- Переработана система сборки.
- Использование Python 3.12.
- Переработано управление памятью в Vulkan.
- MVP для импорта моделей ONNX.
- Распределенное обучение.
- Централизованное логирование.
- И много новых операций.
Больше деталей в описании релиза.
Установить новую версию для Linux x86_64 можно так:
Также репозиторий проекта перенесен из моего личного профиля в организацию
Новый адрес проекта:
https://gitverse.ru/adept-platform/adept
В связи с этим тем кто работает с кодом надо изменить
#Release #Updates #NewFeatures
С радостью сообщаю что наконец-то вышел Релиз 0.2.0
Основные изменения:
- Тензорный движок переработан с использованием смещений и представлений(strides and views).
- Добавлена индексация в стиле PyTorch.
- Типизированные скалярные аргументы.
- Упрощен API редукции.
- Переработан формат записи checkpoints.
- Переработана система сборки.
- Использование Python 3.12.
- Переработано управление памятью в Vulkan.
- MVP для импорта моделей ONNX.
- Распределенное обучение.
- Централизованное логирование.
- И много новых операций.
Больше деталей в описании релиза.
Установить новую версию для Linux x86_64 можно так:
pip install https://storage.yandexcloud.net/adept-releases/adept-0.2.0-cp312-cp312-manylinux_2_34_x86_64.whl
Также репозиторий проекта перенесен из моего личного профиля в организацию
adept-platform, там также будут размещаться связанные проекты. Новый адрес проекта:
https://gitverse.ru/adept-platform/adept
В связи с этим тем кто работает с кодом надо изменить
remote origin для рабочей копии в git:git remote set-url origin git@gitverse.ru:adept-platform/adept.git
#Release #Updates #NewFeatures
❤2🫡1