Изменил подход к управлению памятью, что снизило потребление в 2 раза. А это в свою очередь позволило тренировать на большем разрешении и увеличить размер пакета. На изображениях результат 24 часов тренировки. Утечек памяти не было.
Меня зовут Кирилл Колодяжный этом канале я буду рассказывать про разработку открытой платформы машинного обучения Adept. https://kolkir.gitverse.site/adept-docs/
Изменил подход к управлению памятью, что снизило потребление в 2 раза. А это в свою очередь позволило тренировать на большем разрешении и увеличить размер пакета. На изображениях результат 24 часов тренировки. Утечек памяти не было.
Привет! Последнюю неделю я продолжаю занимался реализацией обучениея модели 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
Тренировка перестала расходится после первых эпох и есть заметная тенденция к сходимости.
Привет! После первых запусков конвейера тренировки 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
Канал «Adept | Машинное обучение | Открытое ПО» подключен к сервису MaxGate. Контент автоматически синхронизируется между Telegram и мессенджером MAX.
Подключить кросспостинг«Adept | Машинное обучение | Открытое ПО» - канал из категории «Технологии», подключенный к сервису кросспостинга MaxGate. Публикации канала синхронизируются между Telegram и мессенджером MAX, а на этой странице собраны ссылки на обе версии канала.
Сейчас у канала 156 подписчиков суммарно в Telegram и MAX. За последние 13 дней в истории MaxGate учтено 6 публикаций, поэтому перед подпиской можно оценить не только размер аудитории, но и регулярность обновлений.
Чтобы подписаться, используйте кнопки «Открыть в MAX» и «Открыть в Telegram» в верхней части страницы. У отдельных постов ссылка может быть доступна в обоих мессенджерах или только в одном из них, если MaxGate получил такой URL из истории обработки.