Меня зовут Кирилл Колодяжный этом канале я буду рассказывать про разработку открытой платформы машинного обучения Adept.
https://kolkir.gitverse.site/adept-docs/
Меня зовут Кирилл Колодяжный этом канале я буду рассказывать про разработку открытой платформы машинного обучения Adept.
https://kolkir.gitverse.site/adept-docs/
Привет!
Я уже несколько недель работаю над тем, чтобы фреймворк Adept мог обучать YOLOv11 полностью на GPU и без NumPy. Я наконец-то довёл Adept до состояния, в котором он может полностью тренировать YOLOv11 на GPU без NumPy. Делюсь тем, что пришлось починить и дописать.
🛠 Ядро и Автоград
• In-place broadcast: a -= b больше не падает, левый операнд корректно ресайзится.
• Редукция градиентов: при broadcast для + - * / градиенты теперь сворачиваются к форме операндов.
• Matmul backward: поддержка 1D тензоров (вектор-матрица и т.д.).
• Vulkan Convs: переписал накопление bias-градиента (считается один раз, без лишних аллокаций).
🧩 API для YOLO-loss (прощай, CPU)
Чтобы IoU и assigner работали на GPU, реализовал:
• Индексация: gather, scatter/add, masked_select/fill, where, topk, unique.
• Форма: expand, permute, flatten, cat, stack, reshape.
• Математика: clamp, pow, arctan, min/max, argmax.
• Скаляры: перегрузки операторов типа 2 * tensor
• Создание: arange, detach.
📉 Loss, Оптимизатор и Модули
• Добавлены BCE (для DFL) и CE без усреднения (per-position loss).
• Фикс Python-операторов: a + b теперь возвращает новый тензор, а не мутирует a (сохраняет граф!).
• SGD с momentum и weight decay.
• BatchNorm: инициализация дисперсии = 1 (убрал деление на ноль).
• Чекпоинты: префиксы имён корректно пробрасываются во вложенные модули.
⚙️ Пайплайн тренировки
• Loss, IoU и assigner переведены на нативный clamp`/`min`/`max. Сетки координат - через adept.arange.
• Warmup + Cosine LR, логирование box/cls/dfl loss.
• Упаковка нескольких GT через scatter_add (меньше синков).
• Инференс: новый CLI (`--image`, --weights и т.д.). Починил letterbox — confidence вернулась с 0.08 до 0.61.
📊 Результаты и Перф
Тренировал на синтетике (геометрические фигуры). Eval total loss стабильно упал с 13.2 (эпоха 1) до 6.5 (эпоха 24). Градиенты сходятся, детектор учится.
⚡ Оптимизировал Vulkan memory pool: выравнивание 4096, кэш 10000 буферов - заметно меньше аллокаций в train-loop.
🎯 Планы
Стек от ядра до высокоуровневого API готов. Следующий шаг - полноценное обучение на MS COCO, сбор метрик AP и дальнейший тюнинг скорости. Теперь есть инструмент для настоящих экспериментов!
#Adept #YOLO #DeepLearning #Vulkan #MachineLearning #MSCOCO
О канале «Adept | Машинное обучение | Открытое ПО»
«Adept | Машинное обучение | Открытое ПО» - канал из категории «Технологии», подключенный к сервису кросспостинга MaxGate. Публикации канала синхронизируются между Telegram и мессенджером MAX, а на этой странице собраны ссылки на обе версии канала.
Сейчас у канала 151 подписчик суммарно в Telegram и MAX. За последние 28 дней в истории MaxGate учтено 3 публикаций, поэтому перед подпиской можно оценить не только размер аудитории, но и регулярность обновлений.
Чтобы подписаться, используйте кнопки «Открыть в MAX» и «Открыть в Telegram» в верхней части страницы. У отдельных постов ссылка может быть доступна в обоих мессенджерах или только в одном из них, если MaxGate получил такой URL из истории обработки.
Привет!
Последние две недели занимаюсь расширением тензорного API и развитием функциональности, необходимой для обучения YOLOv11.
Часть времени на прошлой неделе ушла на подготовку к конференции, поэтому темп оказался ниже, чем планировал. Но, несмотря на это, работа над задачами для YOLOv11 продолжается.
Что сделано:
🔹 Тензорные операции
Добавил arange для генерации последовательностей, утилиты создания тензоров и element-wise min/max. Реализовал clamp с forward/backward и Python-биндингами. Для sum() и mean() добавил keepdim, чтобы поведение было ближе к привычным ML-фреймворкам.
🔹 Скаляры и типы
Перешёл от явных типов в аргументах к более гибкому std::variant для поддержки всего набора используемых типов. Сделал типизированную поддержку скаляров в Tensor::full() и Tensor::item(), включая динамический вывод формы. Это уменьшило количество неявных преобразований и сделало API более предсказуемым.
🔹 Boolean и unsigned integer
Отдельная история — поддержка boolean. Сначала она выглядела как небольшая задача, но на практике потребовала заметно больше времени. Нужно было аккуратно продумать хранение bool в тензорах, взаимодействие со скалярами, приведение типов, проверки на уровне backend и корректный проброс в Python.
Плюс добавил поддержку unsigned integer. В результате эти изменения затронули не одну точку в коде, а потребовали согласованной работы нескольких слоёв.
🔹 Контроль памяти
Добавил проверки на contiguous-тензоры в backend-операциях. Это помогает раньше ловить ошибки, связанные с layout и памятью, и делает поведение операций более явным.
🔹 Python bindings
Продолжаю приводить в порядок Python-слой. Добавил биндинги для новых операций, и сделал skill создания Python-биндингов для LLM агентов.
🔹 GPU backend
Подготовил skills для разработки GPU-шейдеров и регистрации dispatcher. Это больше инфраструктурная работа, поэтому неплохо автоматизируется агентами.
🔹 YOLOv11
Продолжаю двигаться к обучению YOLOv11: обновил план реализации, добавил прототип loss-функции и подготовил inference pipeline с учётом нового tensor API.
Итог: Базовый tensor API становится более зрелым, появляются элементы, необходимые для обучения моделей, и YOLOv11 уже выглядит как вполне достижимая цель 🚀
#tensor #cpp #python #machinelearning #deeplearning #yolo #yolov11 #gpu #autograd #computervision
Привет!
На этой неделе, 1 августа, в Москве будет проходить конференция Back to Back.
Я с коллегой в 16:30-19:00 буду проводить воркшоп «Реализация CUDA-расширения для PyTorch: ускоряем работу LLM».
Кто будет на конференции присоединяйтесь, участие бесплатное но надо зарегистрироваться, на офлайн часть это можно сделать до конца завтрашнего дня.
На воркшопе участники на практике познакомятся созданием расширения для популярного фреймворка PyTorch использующего CUDA ядра. В качестве примера мы запустим локальную LLM и измерим её производительность в реальном тесте.
Начнём с краткой теории GPU, узнаем немного про работу LLM и познакомимся с инфраструктурой PyTorch для создания расширений на С++ и связыванием их с Python API. После чего реализуем оптимизации для работы модели как расширение для PyTorch.
Участники:
- напишут CUDA-ядра для функции активации GeLU
- познакомятся с реализацией матричного умножения для GPU
- реализуют расширение для PyTorch на С++ с интегрированными CUDA ядрами
- используют созданное расширение в реализации LLM модели GPT2 написанной на Python API
В конце сравним производительность базовой и оптимизированной версии модели посчитав количество токенов в секунду.
Требования: уверенное владение C++, CMake и понимание Python.
⚡ Forward pass YOLOv11 — готов!
За неделю с лишним закончил сквозной forward pass для модели YOLOv11 на Adept! 🚀
Добил тензорный движок до состояния, когда его можно использовать для реальных нейросетей. Основные изменения — по коммитам:
🧠 Core Tensor Operations
- N-мерный transpose, concatenation, stacking — теперь и на CPU, и на Vulkan;
- chunk / split с автоградом;
- софтмакс на произвольной размерности с autograd;
🔧 Backend и Python-биндинги
- reshape и view теперь принимают вариадик (можно писать view(1, -1, 4) как в PyTorch);
- новые биндинги для тензоров и параметров Linear/Conv2d;
- переработал контейнеры — Sequential, ModuleList стали ближе к torch;
📦 Neural Networks & Models
- починил перенос внутренних индексов в MaxPool2d между устройствами;
- адаптировал модель YOLO под обновлённое API тензоров.
🧩 Что было самым сложным
Главная боль — изначально я не заложил в тензор полноценную поддержку slices, то есть смещения и шагов (strides). И реализовал базовые операции transpose, concat, stack только для одномерных случаев (по сути, только dim=1). Этого хватало для простых экспериментов, но для полноценного YOLO с многомерными тензорами потребовалась поддержка произвольных размерностей. Если бы я добавил strides с самого начала, то реализация этих операций и chunk / split для произвольных размерностей была бы существенно проще через использование slices и ядер типа scatter и gather.
Теперь всё на месте и операции работают для любых размерностей — код стал проще и единообразнее.
По биндингам — их тоже пришлось расширять, потому что без полноценного Python API удобный интерфейс не построить. Хотелось, чтобы модель на Adept писалась так же естественно, как на PyTorch и NumPy. Вроде получилось.
🎯 Что дальше
Следующая остановка — функция потерь и цикл тренировки. Нужно:
- реализовать loss (скорее всего, комбинация box + cls + dfl, как в оригинальном YOLO);
- собрать тренировочный пайплайн с батчами.
Дальше — больше. Всем удачи в ваших проектах! 💪
#YOLOv11 #Adept #TensorEngine #MachineLearning #PythonBindings