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

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
Здравствуйте, на фоне ухудшения работы telegram завёл канал в МАХ где буду дублировать посты. Там же сделал соответствующий чат. Возможно кому-то такой альтернативный канал коммуникации будет удобен.

Пока работаю над добавлением смещений(strides) к механике адресации памяти тензора чтобы реализовать срезы(slices). Для этой задачи решил попробовать использовать coding агента. Пока впечатления неоднозначные, на следующей неделе расскажу подробнее.
🤡4👌3
Привет! Как и обещал, делюсь опытом использования coding-агента в этом проекте. Признаюсь, в последнее я был очень скептичен к генерации кода для C++, но практика показала: времена изменились, и LLM вполне неплохо с этим справляются.

Что получилось неожиданно хорошо:

• Исследование кода. Удобно получать описание логики — работает надежно.

• CPU-оптимизации. После совместной проработки спецификации в чате агент реализовал zero-copy для матричного умножения траспонированных матриц. Думаю, успех в том, что он знаком с интерфейсом OpenBLAS и трюками перестановки аргументов в памяти.

• Собственно ленивое транспонирование с перестановкой смещений агент тоже упешно сделал.

• GPU и GEMM. Удалось полноценно отрефакторить matmul: т.е.реализовать стандартный интерфейс GEMM: добавить leading dimensions и коэффициенты.

• Работа со смещениями (strides). Агент реализовал contiguous(), ravel, unravel. Более того, сам написал compute shader для копирования элементов тензора в последовательном порядке с учётом смещений (часть правда уже была сделана вручную).

• Тесты. Очень удивило, но он добавляет тесты для Catch2, несмотря на всю шаблонную магию в макросах и параметризированные тесты.

Где агент забуксовал:

• Глобальные задачи. На сложном (например, zero-copy сразу для CPU + GPU) часто уходит в цикл: долго пробует, откатывается, опять пробует и в конце говорит, что не вышло.

• Im2Col алгоритм. Не получилось решить задачу по рефакторингу под новый GEMM API. Долго объяснял, делал спецификацию, давал рабочий пример на CPU — всё равно не вышло. В итоге вручную поправил несколько строчек сам.

• Шаблоны генерации. Шейдеры в проете реализованы как шаблоны для генератора под работы с разными типами. Агент сходу не понял «магию» подстановки, пока я явно не добавил в спецификацию проекта, что значат паттерны подстановки для типов.

💡 Как заставить это работать ( мои инсайты):

Просто сказать «сделай вот это» пока не работает. Нужен процесс:

- Спецификация — живой документ. Особенно важно описывать нестандартные моменты проекта. Регулярно добавляйте туда секции, на которых агент спотыкается.

- Режим чата. Используйте его для исследования и уточнения задачи перед генерацией. Постановка должна быть такой подробной, как будто вы объясняете коллеге.

- Обязательное ревью. Всегда проверяйте сгенерированный код и просите агента поправить замечания. Есть вопросы к эффективности и корректности кода, поэтому контроль нужен.

🎯 Вердикт
Умение пользоваться агентами для кодогенерации становится необходимым навыком. Это существенно ускоряет разработку, если понимать, как управлять инструментом.

По крайней мере, с бесплатным QwenCoder вы получаете дополнительного разработчика среднего уровня. Главное — грамотно ставить задачу и вести документацию.

#СPP #AI #QwenCoder #Development #Experience
🔥5🤝1
Channel name was changed to «Adept | Машинное обучение | Открытое ПО»
Привет, я делал доклад на тему «Эмуляция запуска GPU-ядер на CPU или нестандартные приёмы отладки». Выкладываю презентацию, в которой рассказываю про реализацию симулятора, воспроизводящего модель выполнения GPU (Grid → Block → Thread) с полной интеграцией в GDB.

В отличие от CUDA, где есть много иструментов для отладки и анализа, экосистема Vulkan и OpenCL практически лишена инструментов пошаговой отладки общего назначения. Презентация показывает трюки, позволяющие разрабатывать и отлаживать ядра без физического ускорителя.

Ключевые архитектурные решения:
Lockstep-исполнение на корутинах (C++23): Каждый поток реализуется через std::generator. Вызов co_yield эмулирует аппаратный барьер, а внешний диспетчер синхронно продвигает все генераторы, обеспечивая детерминированное блокирующее выполнение, идентичное __syncthreads().
Иерархия контекста и памяти: Контекст инкапсулирует координаты потоков и размеры сетки/блока. Выделяются именованные области разделяемой памяти с семантикой, повторяющей shared, для кооперативной работы потоков внутри блока.
Трекер доступа к памяти: Прокси-обёртка над буферами логирует каждое чтение/запись с привязкой к координатам потока. Постобработка группирует доступы, проверяет последовательность адресов для соседних потоков и рассчитывает метрику эффективности группировки и распределение шагов (strides).
GDB Python-инфраструктура: Кастомные pretty-printers и специализированные команды позволяют инспектировать состояния блоков, разделяемую память и визуализировать линейные буферы как 2D-матрицы прямо в сеансе отладки.

Презентация
Код проекта

#VulkanCompute #Cpp #Coroutines #GDB #GPUDebugging #SIMT
🔥4
Привет! Небольшая сводка изменений за последние 3 недели. Вышло 3 фичи, которые делают работу с библиотекой удобнее. Вот что теперь может сделать Python-разработчик:

🖥 Детекция GPU через Vulkan

Теперь можно программно узнать, какой GPU доступен на машине:
import adept

if adept.vulkan.is_available():
print(f"GPU: {adept.vulkan.get_device_name(0)}")
model = model.gpu()

Зачем:
• Запускать инференс на GPU с автоматическим fallback на CPU
• Логировать модель видеокарты для телеметрии и дебага
• Строить device selection UI, как в других ML-фреймворках

🔍 Фильтрация параметров модели по имени

Два новых метода в классе Module:
# подстрока
for name, p in model.named_parameters("weight"):
...

# Регулярное выражение
for name, p in model.named_parameters_regex(".*layer[23].*bias"):
...

Зачем:
Selective fine-tuning — заморозить одни слои, разморозить другие
Группы параметров в оптимизаторе — разный learning rate для весов и смещений
Weight decay только для weight-тензоров — исключить bias и batch-norm running stats
Быстрая инспекция модели — не нужно руками обходить все child-модули

Оптимизация autograd

Теперь при выключенном авто-дифференцировании (no_grad) не создаются лишние объекты для хранения градиентов. Это затронуло все основные слои: Linear, Conv2d, BatchNorm2d, MaxPool2d, AvgPool2d, активации и loss-функции.

Зачем:
Меньше расход памяти — no-grad mode больше не аллоцирует ненужные autograd-ноды
Быстрее инференс — нет накладных расходов на создание и удаление временных объектов
Predictable performance — поведение no_grad ближе к «bare metal», как и ожидается

#gpu #autograd #changelog #python #inference #optimization
🔥5👍1