Adept | Машинное обучение | Открытое ПО
Наука
Adept(Automatic Differentiation Engine for Tensor Processing) Меня зовут Кирилл Колодяжный этом канале я буду рассказывать про разработку открытой платформы машинного обучения.
Загружаем канал…
Сайт использует cookie для работы и аналитики. Мы используем файлы cookie для работы сайта и аналитики посещаемости. Подробнее в ПодробнееПолитике обработки данных и Правилах.
Наука
Adept(Automatic Differentiation Engine for Tensor Processing) Меня зовут Кирилл Колодяжный этом канале я буду рассказывать про разработку открытой платформы машинного обучения.
Привет! За неделю в ветке yolo-impl мы расширили набор слоёв в Adept. Новая функциональность: групповые свёртки, Winograd на CPU и GPU, транспонированная свёртка и апсемплинг. Всё — с поддержкой CPU и Vulkan GPU, без фолбэков, с автоградом и Python-биндингами. 🚀 Групповые свёртки Добавили параметр groups в Conv2d. Теперь можно эффективно резать каналы на группы — и на CPU (per-group im2col + GEMM), и на Vulkan (аналогичные шейдеры). ONNX-импорт и Python-биндинги — на месте. Тесты покрывают forward/backward для разных конфигураций. ⚡ Winograd: CPU с группами, GPU для 3x3 Доработали CPU-версию Winograd, чтобы она поддерживала групповые свёртки — вынесли буферы за цикл по группам, избежав лишних аллокаций (это критично для depthwise с большим числом групп). А следом завезли Vulkan-шейд…
Читать целикомРеализация DataSet для YOLOv11 на базе Adept завершена! Рассказываю, как я наступил на грабли с разделяемой памятью в многопроцессном DataLoader’е. 🔍 Предыстория В Adept есть модуль shared_mem_manager.cpp, который отвечает за межпроцессное взаимодействие через разделяемую память. При указании num_workers > 0 в DataLoader каждый воркер — отдельный процесс, и они синхронизируются через общий буфер. Всё шло гладко, пока я не запустил тренировку с несколькими воркерами. И тут — segmentation fault 💥. Не в логике обработки данных, а в коде синхронизации. ⚠️ Симптомы Ошибка валилась в коде: struct ShmInfo { std::atomic<int> ref_counter; }; class SharedMemoryBuffer : public SharedBuffer { void close() { ShmInfo* shm_info = static_cast<ShmInfo*>(ptr_); if (--shm_info->ref_count…
Читать целиком⚡ 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 между устройствами; - ад…
Читать целикомПривет! Последние две недели занимаюсь расширением тензорного API и развитием функциональности, необходимой для обучения YOLOv11. Часть времени на прошлой неделе ушла на подготовку к конференции, поэтому темп оказался ниже, чем планировал. Но, несмотря на это, работа над задачами для YOLOv11 продолжается. Что сделано: 🔹 Тензорные операции Добавил arange для генерации последовательностей, утилиты создания тензоров и element-wise min/max. Реализовал clamp с forward/backward и Python-биндингами. Для sum() и mean() добавил keepdim, чтобы поведение было ближе к привычным ML-фреймворкам. 🔹 Скаляры и типы Перешёл от явных типов в аргументах к более гибкому std::variant для поддержки всего набора используемых типов. Сделал типизированную поддержку скаляров в Tensor::full() и Tensor::ite…
Читать целикомПривет! На этой неделе, 1 августа, в Москве будет проходить конференция Back to Back. Я с коллегой в 16:30-19:00 буду проводить воркшоп «Реализация CUDA-расширения для PyTorch: ускоряем работу LLM». Кто будет на конференции присоединяйтесь, участие бесплатное но надо зарегистрироваться, на офлайн часть это можно сделать до конца завтрашнего дня. На воркшопе участники на практике познакомятся созданием расширения для популярного фреймворка PyTorch использующего CUDA ядра. В качестве примера мы запустим локальную LLM и измерим её производительность в реальном тесте. Начнём с краткой теории GPU, узнаем немного про работу LLM и познакомимся с инфраструктурой PyTorch для создания расширений на С++ и связыванием их с Python API. После чего реализуем оптимизации для работы модели как расширение…
Читать целикомВ NumPy и PyTorch поддерживаются тензоры, у которых одна или несколько осей имеют нулевую длину. Например: np.zeros((0, 24)) # форма (0, 24) torch.empty((17, 0)) # форма (17, 0) Это полноценные объекты, с которыми выполняются стандартные операции (сложение, умножение, транспонирование, конкатенация при согласованных размерностях). Такие тензоры часто называют «пустыми» (empty tensors), но они не являются None и не требуют специальной обработки на каждом шагу алгоритма. 🔍 Зачем они нужны? Главное преимущество — единообразие кода. Вместо проверок if data is not None на каждом этапе вы создаёте пустой тензор с нулевой длиной по нужной оси и продолжаете работать с ним как с обычными данными. Финальная проверка (например, наличие хотя бы одного элемента в пакете) откладывается д…
Читать целикомПосле публикации релиза продолжаем работу: - Расширяем набор демонстрационных приложений для прикладного API. Работаем над реализацией моделей на основе архитектуры UNet и соответствующего конвейера для их обучения. - Продолжаем работу над реализацией поддержки формата GGUF. Сначала будет загрузка квантованных весов с распаковкой в FP32 и API для квантования с использованием ggml. Далее планируем делать поддержку квантованных данных в вычислительных ядрах. - Будем пробовать увеличить производительность реализации GEMM для Vulkan. - И я затеял глубокий рефакторинг системы построения вычислительного графа и авто-дифференцирования. Будем уходить от простого подхода с неявным построением графа к явному описанию с узлами, рёбрами и соответствующей дополнительной информацией. Это должно поз…
Читать целикомВесте с лабораторией YADRO на факультете информационных технологий НГУ поучаствовали в «Двадцать второй конференции разработчиков свободных программ». Матвей Сорокин студент кафедры Систем Информатики подготовил тезисы для сборника на тему «Развитие библиотеки Adept: сборка RPM-пакета для ALT Linux».
Доделал скрипты для сборки библиотеки под Android, исправил ошибки и немного в очередной раз оптимизировал свёртку. Всё уже на мастер ветке. Выложил проект с демкой для Android, там в релизах можно скачать apk и попробовать. В приложении веса самой маленькой модели YOLOv11 получившиеся тренировкой на урезанном для балансировке датасете MS COCO. Тренировка длилась 200 эпох на 4х GPU(3 AMD + 1 Nivida), конечно же с реализацией на Adept. В результате получилось ~7 FPS на CPU и ~5 FPS на GPU. Что вполне сравнимо с NCNN и мобильным libtorch для YOLOv5, особенно учитывая существенно более тяжелую архитектуру в 11 версии с блоком внимания и работу в FP32.
Это скриншот с моего телефона. Начал делать скрипты для крос-компиляции проекта с использованием Android SDK/NDK и заниматься интеграцией библиотеки в мобильное приложение.
Проект стал доступен в индексе пакетов pypi.org. Установка стала проще: pip install adept-platform
Привет! С радостью сообщаю что наконец-то вышел Релиз 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 Также репозиторий проекта перенесен из моего личного профиля…
Читать целиком