Adept | Машинное обучение | Открытое ПО
121 subscribers
7 photos
30 links
Меня зовут Кирилл Колодяжный этом канале я буду рассказывать про разработку открытой платформы машинного обучения Adept.
https://kolkir.gitverse.site/adept-docs/
Download Telegram
Вышел релиз v0.1.3

В котором добавлено:
- Поддержка Float64, Int32 and Int8 типов данных.
- Поддержка различных Vulkan устройств (проверено на NVIDIA RTX 4070 8Gb, Adreno (TM) 650, Intel(R) Graphics (RPL-S)).
- Использование Float64 для аккумуляторов на устройствах которые поддерживают этот тип.
- Изменение системы кэша подсистемы Vulkan с учётом статических параметров шейдера.
- Глубокая переработка конвейера запуска шейдеров Vulkan для устранения конфликтов синхронизации.
- Исправление множества ошибок.

https://gitverse.ru/kolkir/adept/releases/tag/v0.1.3

#release
🔥2
Привет!

Мы активно работаем проекта и хотим поделиться нашими ближайшими планами и текущими работами. Многие из этих улучшений станут возможны благодаря вкладу студентов-разработчиков!

Что в разработке:

1. Умное управление ресурсами Vulkan 🔧

- Проблема: Сейчас ресурсы (буферы, наборы дескрипторов) накапливаются, и для их очистки требуется принудительная синхронизация с хост-системой, что тормозит выполнение.

- Решение: Мы работаем над усовершенствованием системы, чтобы ресурсы освобождались пакетами и по мере накопления, минимизируя простои и повышая эффективность.

2. Импорт моделей ONNX 📥

- В мастер скоро будет залит минимально рабочий прототип для импорта моделей в формате ONNX!

- Эта важная функциональность была реализована студентом НГУ в рамках практической работы в лаборатории ФИТ. Большое спасибо за этот вклад!

- Дальше мы планируем развивать и расширять эту возможность.

3. Распределённое обучение (Data Parallelism) ⚙️

- Ведутся работы по реализации распределённого обучения с параллелизацией по данным. Это позволит значительно ускорить обучение больших моделей на нескольких GPU.

4. Большая эволюция вычислительного графа 🧠

- Запланирована серьёзная переработка архитектуры вычислительного графа.

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

Важно отметить: Работы по пунктам 3 и 4 (распределённое обучение и новая архитектура графа) также ведутся в рамках студенческих проектов и практик. Мы рады поддерживать новое поколение инженеров и исследователей!

Следите за обновлениями в репозитории, и, как всегда, ждём ваших вопросов, идей и участия!

Ссылка на репозиторий: https://gitverse.ru/kolkir/adept

#Adept #MachineLearning #OpenSource #Vulkan #ONNX #DistributedTraining #MLIR #Разработка #НГУ #Студенты
🔥1
Привет! Столкнулся с интересной ситуацией, которая хорошо иллюстрирует важность внимательного чтения документации.

Проблемный код
У меня был std::list<std::unique_ptr<Item>>, и я хотел переместить завершённые элементы в другой список. Написал, казалось бы, логичный код:

auto it =  std::remove_if(active.begin(), active.end(), [](auto& item) {
if (item->is_completed()) {
item->reset();
return true;
}
return false;
});

// Перенос в другой список
stopped_submits_.splice(stopped.begin(), active, it, active.end());


И... неожиданно обнаружил нулевые указатели в списке!

🔍 Что пошло не так?

Ошибка №1: Нарушение контракта предиката
Сигнатура std::remove_if требует, чтобы предикат не модифицировал элементы:
template< class ForwardIt, class UnaryPred >
ForwardIt remove_if(ForwardIt first, ForwardIt last, UnaryPred p );

Из документации:
>The expression p(v) must be convertible to bool for every argument v of type (possibly const) VT, where VT is the value type of ForwardIt, regardless of value category, and must not modify v.

Мой item.reset() явно нарушает это требование.

Ошибка №2: Неопределённое состояние после remove_if
После работы std::remove_if элементы в диапазоне [result, last) могут находятся в неопределённом состоянии. Для std::unique_ptr это означает, что они могут стать нулевыми в результате перемещения!

Из документации:
> Each element of [result, last) has a valid but unspecified state, because move assignment can eliminate elements by moving from elements that were originally in that range.

📚 Выводы
1. Используйте std::remove/remove_if в рамках идиомы remove-erase
3. Читайте документацию и стандарт, в частности cppreference

#cpp #stl #cplusplus #bugs
🔥5
🎄 С наступающим Новым годом!

Спасибо всем подписчикам, за ваш интерес, вопросы, идеи и вклад в развитие нашего открытого проекта. Ваша поддержка — лучшая мотивация для движения вперёд.
Пусть в наступающем году сбудутся все ваши профессиональные и личные планы, а в коде будет меньше багов и больше интересных решений! Желаем вам сил на новые свершения, вдохновения для смелых экспериментов и времени на любимые проекты.
Отдыхайте, набирайтесь сил и ярких впечатлений!

До встречи в новом году! 🥂
4🎉2
🎄 Новогодние каникулы прошли не только в кругу семьи и друзей, но и за кодом! Завершил рефакторинг системы управления ресурсами Vulkan-конвейера в нашем проекте.

Что изменилось:
Убрал необходимость ручной синхронизации в конце обработки пакета при обучении моделей
Снизил нагрузку на аллокаторы ресурсов
Сделал управление ресурсами более предсказуемым и «плавным»

Провёл сравнительное нагрузочное тестирование — и результаты радуют:
📈 На задачах с LeNet и ResNet50 (CIFAR10/MNIST, FP32, Adam) производительность Adept теперь сопоставима с PyTorch, особенно в режимах с ограниченным worksize и детерминированными алгоритмами cuBLAS. Это означает, что для типичных свёрточных сетей, т.е. небольших размерностей матричного умножения, мы почти «на равных».
При этом размер батча больше не оказывает заметного влияния на производительность конвейера, что раньше было одной из проблем.

Но есть и над чем работать:
⚠️ В тестах с MLP (только матричное умножение, большие размеры) производительность начинает падать уже при размере матриц 128×128. Это связано с текущей реализацией GEMM-ядра — сейчас она соответствует субоптимальному варианту алгоритма, который я и показывал в статье на Хабре. Т.е. результат вполне объяснимый.

Следующий шаг — переписать ядро matmul, чтобы интенсивнее использовать регистры и минимизировать обращения к локальной памяти, что позволит приблизиться к производительности cuBLAS даже на крупных матрицах.

Подробные результаты измерений — в вики проекта.

GPU-оптимизация — это марафон, а не спринт 😊

#Vulkan #GPU #GEMM #C++ #PyTorch
🔥4👍2
Привет, немного информации о проекте про разработку которого я рассказываю в этом канале:

Adept(Automatic Differentiation Engine for Tensor Processing) — это библиотека на Python и C++ для построения и обучения нейросетей, созданная с упором на кроссплатформенность, гибкость и образовательную ценность.

⚙️ Основные возможности:
Динамические графы — как в PyTorch: отладка, условия, циклы «из коробки».
Тензоры + Autograd — автоматическое дифференцирование и GPU-ускорение.
Vulkan backend — работает на GPU от NVIDIA, AMD, Intel, Qualcomm и даже на мобильных устройствах.
Единая семантика Python/C++ — легко переносить прототип в production.

🎯 Зачем это нужно?
В российской экосистеме почти нет open-source ML-платформ общего назначения, сравнимых с PyTorch или TensorFlow. Возможно это связано как с нехваткой специалистов, сочетающих глубокое понимание машинного обучения и системного программирования, так и доступностью зрелых альтернатив. Adept создан как экспериментальная площадка для накопления такого опыта — как исследовательского, так и образовательного.

🧠 Почему это полезно для обучения?
Проект охватывает все ключевые уровни ML-стека: от математических абстракций (тензоры, градиенты) до низкоуровневой работы с GPU. Это делает его подходящей основой для:
Изучения архитектуры современных ML-фреймворков
Курсовых, дипломных и исследовательских работ
Практических заданий по deep learning, системному программированию и кроссплатформенной разработке

🔗 Код открыт — приглашаем студентов, преподавателей, энтузиастов и всех, кто хочет разобраться, как устроены ML-платформы изнутри.

#MachineLearning #OpenSource #Education #Vulkan #Python #Cpp #Adept #MLPlatform
👍7🔥2
Adept | Машинное обучение | Открытое ПО pinned «Привет, немного информации о проекте про разработку которого я рассказываю в этом канале: Adept(Automatic Differentiation Engine for Tensor Processing) — это библиотека на Python и C++ для построения и обучения нейросетей, созданная с упором на кроссплатформенность…»
🛠️ На каких Linux-дистрибутивах проверена сборка Adept

Проект успешно собирается и запускается на следующих системах:

🔹 Manjaro Linux 26.0.1 — основная платформа разработки
🔹 Ubuntu 22.04
🔹 Ubuntu 25.10 (development release)

А также на отечественных дистрибутивах:
🔹 Astra Linux Smolensk 1.8.3
🔹 ALT Linux StarterKit 11 «Slavia»

Особенности:

- В ALT Linux по умолчанию включён _FORTIFY_SOURCE в GCC, что мешает сборке oneTBB. Обход описан в Wiki проекта.
- Сборка под Astra Linux была протестирована участником канала — отдельное спасибо! Использовался GCC 12.2.
⚠️ В этом компиляторе есть ложные срабатывания -Warray-bounds при сборке в отладочном режиме, из-за чего сборка может не завершиться. В режиме Release проблем не возникает.

Мы продолжаем расширять список поддерживаемых платформ и документировать нюансы сборки — ваш опыт тоже важен!

#Linux #GCC #AstraLinux #ALT #Build #Cplusplus
❤‍🔥1
🔍 Как стабилизировать систему перед нагрузочным тестированием

Если вы сравниваете производительность (например, как я наш Vulkan-бэкенд vs PyTorch), важно обеспечить воспроизводимость бенчмарков, исключив влияние системных факторов. Например динамическое управление частотами или рандомизации памяти. Вот минимальный набор команд для Linux-систем с NVIDIA GPU с которых можно начать:

🖥️ GPU (NVIDIA)
# Включить persistence mode (чтобы драйвер не «усыплял» GPU)
sudo nvidia-smi --persistence-mode=1

# Зафиксировать частоты (пример для RTX 4070)
sudo nvidia-smi --lock-gpu-clocks=3105 # MHz (core)
sudo nvidia-smi --lock-memory-clocks=8001 # MHz (VRAM)


> ⚠️ Значения частот подбирайте под вашу модель GPU. Их можно найти в выводе nvidia-smi -q -d SUPPORTED_CLOCKS.

⚙️ CPU
# Переключиться в режим максимальной производительности
sudo cpupower frequency-set -g performance

# Зафиксировать минимальную частоту (например, 3.9 ГГц)
sudo cpupower frequency-set -d 3900000


> Это позволяет задать более-менее предсказуемый диапазон частот для процессора.

🧠 Дополнительно: уменьшаем системный «шум»
# Отключить ASLR (Address Space Layout Randomization)
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space


>Это повышает воспроизводимость времени запуска и распределения памяти — особенно важно при микро-бенчмарках.

💡 Другие рекомендации:
- Закройте фоновые приложения
- Отключите энергосбережение в BIOS/UEFI (C-states, P-states)
- Запускайте тесты несколько раз и берите медиану
- Используйте taskset или numactl, чтобы изолировать ядра CPU
- Для серверных GPU: отключите коррекцию ошибок ECC (`nvidia-smi -e 0`), если это не критично.

Такой подход позволяет добиться воспроизводимых результатов — без него сравнение «на глаз» может ввести в заблуждение.

P.S. Эти настройки временные — после перезагрузки всё вернётся к стандартному поведению. ⚠️ Не применяйте их на продакшен-машинах без понимания последствий!

#GPU #Benchmarking #Vulkan #PyTorch #ML #Linux #Performance #Adept
👍2
Привет! Небольшой анонс: я буду делать доклад про реализацию конвейера для запуска вычислительных шейдеров в Adept на конференции С++ Russia 2026 которая будет проходить 16-17 мая в Москве, приходите послушать.
https://cppconf.ru/talks/823852ac77f1480c8276b17b1736bb5f/
🔥6
Сравнение производительности matmul в Adept и PyTorch: количество пакетов в секунду при тренировке.

Обратите внимание что производительность PyTorch c отключенным и включенным cuDNN практически одинаковая - так как используются только линейные слои т.е. matmul.
👍3
Привет, в работе над проектом постоянно сменяются периоды активной разработки и этапы отладки, тестирования и оптимизации.

На прошлой неделе основное внимание было уделено тестированию и доработке ядра матричного умножения (matmul). Благодаря увеличению нагрузки на потоки и изменению размера тайла удалось добиться заметного ускорения на средних размерах — это подтверждается графиком сравнения Adept и PyTorch с разными режимами использования cuBLAS .

Однако начиная с размеров 512×1024 производительность Adept начинает значительно отставать, см. график. А это критично: особенно в современных LLM. Например, в модели Qwen-7B, которую можно запускать локально, типичные операции включают умножения вида:
- 4096 × 4096 (линейные слои),
- 4096 × 11008 (expansion в MLP блоках).

Теперь надо определиться что же делать дальше. Есть несколько важных направлений:

1. Продолжать оптимизировать matmul.
Например внедрить транспонирование одной из входных матриц (обычно B). Это позволит:
- организовать сгруппированный доступ к данным (все потоки в warp’е читают соседние адреса),
- использовать прямоугольные тайлы (например, 64×128),
- лучше распределить работу между потоками и повысить occupancy.
Да, такой подход требует дополнительной памяти для хранения транспонированной матрицы — но это стандартная практика: даже cuBLAS выделяет рабочую память, управляемую через параметры worksize.

2. Оптимизация операций свёртки, которые критичны для CNN и гибридных архитектур. Тут надо реализовать быстрые свёртки с использованием алгоритма Winograd. Алгоритм Implicit GEMM для работы в стиле im2col но без промежуточных матриц.

3. Также крайне важно завершить реализацию функциональности срезов тензоров — без неё невозможно поддерживать широкий спектр моделей машинного обучения, включая те, что используют динамические формы или сложные attention-маски.

🚀 Приглашаем всех заинтересованных принять участие в развитии Adept!
Ваш вклад — будь то тестирование, код, идеи по оптимизации или документация — напрямую ускорит появление полноценного Vulkan-бэкенда для ML.

#Adept #Vulkan #GPU #GEMM #LLM #TensorSlicing
👍2🔥2👌1
Привет, приходите на Scientific Open Source meetup.
Про опыт участия в нашем проекте расскажет Андрей Зверев студент 3го курса НГУ.
Forwarded from Научный опенсорс (Nikolay Nikitin)
А тем временем, начинаем публикацию программы нашего митапа, который пройдет 12.02 в 18-00. Вот перечень докладов с авторскими аннотациями:

- Школа-конкурс EDGE AI 2025: как мы первыми в России представили флагманский китайский стек для работы с ИИ-моделями на EDGE устройствах c OpenScaler OS // Владимир Павлов - Технический комитет сообщества OpenScaler

В докладе мы поделимся опытом сообщества OpenScaler по проведению соревнований в новом формате: студенческие ИИ-команды из ведущих вузов страны сначала проходили обучение у наших менторов, а затем соревновались на лучшую реализацию различных ИИ-моделей на краевых устройствах Orange Pi на базе чипов Ascend и ОС OpenScaler. Расскажем о самом конкурсе, командах и проектах студентов, которые были представлены в финале. Все учебные материалы были опубликованы в открытом доступе, а проекты финалистов размещены на платформе GitVerse.

- [Секретный доклад] // Олег Чирухин - владелец продукта GigaIDE Cloud

Как понятно из названия - подробности будут раскрыты только в самый последний момент!


- OpenSource по-пекински, или почему фонд OpenAtom - это прекрасно, но не в наших реалиях // Аристов Константин - Скала^р (группа Рубитех), руководитель направления RnD системного ПО

Поговорим о том, какой дивный симбиоз между собором и базаром (openSource и Кговавым Ынтырпрайзом) получился в КНР, попробуем прикинуть тамошние реалии на наши, придем к парадоксальному выводу насчет пользы конкуренции.

- Студенческий open-source в ML - опыт внедрения поддержки ONNX // Зверев Андрей - студент 3 курса Новосибирского Государственного Университета, стажер-разработчик в Яндексе

Как превратить скучную учебную практику в реальный проект, которым не стыдно гордиться и который добавляет ценности в резюме? Расскажу на личном примере участия в лаборатории YADRO при НГУ.
Поясню, что такое формат лаборатории: как туда попасть, какие возможности она дает студентам. На практическом кейсе покажу, как выглядят рабочие процессы изнутри: постановка задач, планирование, работа через issues/PR, тестирование и выпуск; с какими трудностями столкнулся и как их решал при поддержке наставников из реальной компании-партнера.
В технической части объясню простыми словами: что такое ONNX и почему стандарт обмена моделями важен для переносимости и воспроизводимости, чем его поддержка усилила проект Adept и какие результаты получились на практике.


- Simple Deep Research - открытый фреймворк для мультиагентного поиска // Алан Газзаев - аспирант ИТМО, NLP researcher at MWS AI

Simple Deep Research - это простая система для поиска информации в интернете с помощью мультиагентного подхода. Система работает в двух режимах: lite и full. В первом режиме агент посещает несколько сайтов, сжимает информацию и выдает отчет. Во втором режиме агент определяет сложность запроса, разбивает его на подзапросы, а затем другие агенты ищут и суммируют информацию по каждому запросу. Одна из основных идей данного фреймворка заключается в том, что он не содержит таких зависимостей как langchain и smolagents и быстро запускается с локальными моделями через vLLM/llama.cpp. Также фреймворк модульный, можно заменить поисковой движок и агентов по необходимости.

Ссылка на регистрацию прежняя - https://openmeetup.ru/
Места на площадке конечны, так что не откладывайте!
Привет, сделал декомпозицию задач про ускорение свёрточных операций — сердце современных CNN:

https://gitverse.ru/kolkir/adept/tasktracker/TSKDPT3-90
https://gitverse.ru/kolkir/adept/tasktracker/TSKDPT3-79

Есть три основных задачи:

🔥 Быстрые свёртки для инференса (CPU/GPU)
Цель: Максимально ускорить вывод моделей за счёт оптимизированных алгоритмов свёрток.
Что делать:
Исследовать подходы (включая Winograd и альтернативы)
Учесть ограничения: поддержка batch, channels, padding
Реализовать ядра:
• CPU — через SIMD-библиотеку Highway
• GPU — через compute-шейдеры Vulkan
Сравнить результат с текущим im2col
💡 Идеально, если хочешь разобраться в алгоритмах свёрток и хочешь «выжать» максимум из железа.

⚙️ Умная диспетчеризация режимов
Цель: Автоматически выбирать алгоритм в зависимости от сценария.
Логика:
Инференс: быстрые свёртки для ядер 3×3–7×7 → иначе im2col
Тренировка: всегда im2col (работа с большими матрицами)
🎥 Как устроена наша диспетчеризация

🚀 Implicit GEMM для тренировки
Цель: Ускорить обучение за счёт сокращения аллокаций памяти.
Почему это круто:
Минимум промежуточных буферов
Эффективный тайлинг — строим только нужный фрагмент матрицы свёртки «на лету»
Лучшее распараллеливание → выше производительность на тренировке
Этапы: дизайн → реализация (CPU/GPU) → бенчмарки против im2col → замена при профите.

👉 Готов браться? Читай правила участия, пиши— обсудим детали и подберём задачу под твои скиллы!

#opensource #machinelearning #optimization #vulkan #simd #cpp
🔥2
Привет, рад сообщить что для проекта начали появляться дополнительные внешние инструменты, знакомьтесь:

SBcontrol - HTTP API + веб-дашборд для удалённого управления фреймворком Adept на Windows с GPU-ускорением через Vulkan.
https://gitverse.ru/Sohoroom/SBcontrol
🔥4
Добрый день, представляю последнюю статью из мини-серии про С++ в ML. Где я рассказываю про то как можно реализовать вычислительный граф и как его использовать с методом обратного распространения ошибки.

По большому счёту это то как сейчас данная функциональность реализована в Adept. Но мы работаем над более универсальной архитектурой графа которая позволит выполнять оптимизации и преобразования для тензорных компиляторов.

https://habr.com/ru/companies/yadro/articles/1002784/
🔥2
Обновленный график сравнения производительности
🚀 Небольшие оптимизации в adept: Linear layer и sum()

Привет! Наконец-то после 3х недель написания документации в виде статей удалось вернуться к разработке. Сделал ряд улучшений в библиотеке, которые немного улучшили производительность операций обратного распространения градиента.

1. Обобщённая операция sum(dim)

Раньше операция суммирования работала только для всего тензора или только по первой оси (sum_dim0). И по оси была наивная реализация которая в цикле суммировала все значения по 0му измерению, что приводило к существенным задержкам при большом пакете. Теперь:

- sum(dim) — суммирование по любой оси
- Поддержка отрицательных индексов
- Оптимизированные шейдеры для на основе subgroups
- Работает с тензорами до 4D включительно

2. Небольшая оптимизация Linear layer backward

В обратном проходе линейного слоя убрал одно матричное транспонирование. Что сокращает количество операций с памятью и немного ускоряет расчёт градиентов.

3. Тестирование через naive implementation

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

Что дальше?

Есть задел для дальнейшего ускорения (~10%) — реализация поддержки смещений(strides) в тензоре. Это позволит избежать реальных транспонирований матриц в некоторых случаях, работая с данными “на лету”. Дальнейшие оптимизации matmul должны уже наверное использовать специальные матричные расширения, например Tensor Cores в NVIDIA.

Реализация смещений в тензоре для работы с памятью также позволит реализовать функциональность срезов(slices). Что откроет возможность для импортирования уже реальных моделей, например YOLO.

#adept #deeplearning #performance #vulkan #cpp
👍2