Adept | Машинное обучение | Открытое ПО
121 subscribers
7 photos
29 links
Меня зовут Кирилл Колодяжный этом канале я буду рассказывать про разработку открытой платформы машинного обучения Adept.
https://kolkir.gitverse.site/adept-docs/
Download Telegram
Привет, сделал декомпозицию задач про ускорение свёрточных операций — сердце современных 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
Привет!
Я открыл PR который добавляет реализацию срезов и изменяет API индексации тензоров. Он вносит существенные изменения в движок обработки тензоров и затрагивает больше 150 файлов. Я начинал реализацию вручную потом использовал coding агентов.

Буду благодарен сообществу за помощь с code review, комментарии и предложения. Также есть возможность посмотреть какой С++ код сегодня генерирую агенты с использованием моделей Qwen Coder 3.5, GLM-5.1, Grok Code fast 1.

Основные изменения:

Изменено внутреннее представление тензоров для поддержки срезов:
- Добавлено смещение(offset) для буфера данных
- Добавлены смещения по размерностям(strides)

API индексации тензоров:
- Тип Slice для гибкого слайсинга с параметрами начала, конца и шага
- Тип Index для целочисленной индексации (сокращение размерности)
- Поддержка Ellipsis и None для продвинутых паттернов индексации
- Синтаксис, совместимый с NumPy и PyTorch: tensor[1:5], tensor[::2], tensor[:, 1]

Операции сбора (gather) для копирования данных с учётом срезов:
- SIMD ядра и шейдеры для Vulkan
- Поддержка отрицательных индексов для обоих бэкендов

GEMM API вместо matmul:
- BLAS совместимый API для CPU и GPU
- Добавлены параметры alpha и beta

Python-привязки:
- Полная поддержка срезов через getitem и setitem
- Автоматическое создание представлений и управление непрерывностью
- Многомерная индексация с правильной обработкой форм

Пример кода:
import adept as ad
# Создание тензора
t = ad.Tensor([1, 2, 3, 4, 5])
# Базовый срез
sliced = t[1:4]
# Многомерная индексация
matrix = ad.Tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
row = matrix[1]
col = matrix[:, 1]
🔥1
Привет!
Я на днях делал доклад "Актуальность и области применения языка С++ в современном ML" на конференции "Современные технологии в теории и практике программирования" в Санкт-Петербургском Политехническом Университете. К сожалению записи с мероприятия нет, но я делюсь видео с подготовки доклада. Надеюсь кому-то будет полезно.

https://rutube.ru/video/bc863eb9180b8cf67d118bb4b2ab1cb7/
6
Привет!
Закончилась ежегодная конференция C++ Russia. В этом году я продолжил знакомить участников с проектом Adept, рассказывал про устройство работы конвейера запуска вычислительных шейдеров.
А ещё мы провели мастер-класс где участники познакомились с основами разработки для GPU и попробовали сами создать расширение для PyTorch.
🔥13
Появляются новые вычислительные бекэнды на Vulkan.
В рамках секции Open Source на DataFest 2026 будет доклад
"ggmlR:Vulkan GPU-бэкенд для R"
Юрия Барамыкова старшего руководителя проекта Иннотех.

Код проекта:
https://github.com/cran/ggmlR
2
Думаю должен быть интересный доклад про EdgeAI на FPGA
🤩1
Forwarded from Научный опенсорс (Nikolay Nikitin)
Вкину анонс весеннего слета FPGA-сообщества от YADRO.

От ИТМО на нем выступит Иван Дейнека: к.т.н, доцент Высшей инженерно-технической школы и автор open-source "Руководства по реализации Edge AI на FPGA" .

Почитать руководство (или даже законтрибьютить в него) можно тут: https://github.com/debreti/nirsii-fpgai

Подробности про мероприятие:

26 мая в 19:00 приглашаем вас присоединиться к онлайн-трансляции. В этот раз поговорим об RTL-разработке и синтезе, документировании RTL и применении ИИ в FPGA/ASIC-разработке. Среди тем выступлений:
🔸open-source-инструмент Yosys,
🔸применение и преобразование SystemRDL в читаемую документацию,
🔸реализация Edge AI на программируемой логике,
🔸CLI-инструмент для анализа вейвформ с помощью LLM.

Своим опытом поделятся эксперты YADRO, ИТМО и независимые RTL-разработчики. Чтобы получить ссылку на трансляцию и все материалы,
зарегистрируйтесь.

Доклад Ивана будет про "Edge AI на ПЛИС: тенденции и руководство по размещению".

Аннотация следующая: "В докладе расскажу о преимуществах реализации концепции Edge AI на программируемой логике. Продемонстрирую практическое руководство по размещению нейросетей на FPGA и разберу реализацию полносвязной сети на языке описания аппаратуры, а также свёрточной сети через высокоуровневый синтез."
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥2
Привет! В очередной раз решил сделать Docker образ с Vulkan-бэкендом для сборки проекта. Дело в том что публичные образы (например, localai/localai:latest-gpu-vulkan или j3soon/vulkan-runtime) устарели: в них либо старая версия SDK, либо отсутствует актуальный toolchain (CMake, Python, Node.js), либо нет актуальной поддержки X11/Wayland. Использовать их без существенных доработок не получилось, из-за чего я переключил CI сборку чисто на хост систему. И в последних PR мы получили проблемы с использованием различных сред разработки.

Решение: собственный многостадийный Dockerfile.

- Base toolchain — устанавливается всё для компиляции и линтинга (clang, ccache, doxygen, Python 3.11, Node.js 20 LTS). Без Vulkan.

- Vulkan SDK — загружается и настраивается конкретная версия SDK (1.4.341.0) с runtime-зависимостями.

- Финальный образ, куда копируются только нужные артефакты от предыдущих стадий. Это сокращает размер образа и исключает «мусор» из промежуточных слоёв.

Как используем:

В VS Code DevContainer — в devcontainer.json пробрасываются GPU (--gpus all, /dev/dri), X11 и сеть хоста. Разработчик работает в изолированной среде, идентичной CI.

В CI (self-hosted) — в YAML-описании указывается предварительно собранный образ (экономим время на установке зависимостей при каждом запуске) и те же флаги рантайма: --gpus all, --device=/dev/dri, --network=host. Это гарантирует, что Vulkan-тесты реально выполнятся на GPU.

Результат: воспроизводимые сборки, отсутствие «у меня работает» на машине разработчика, а CI ловит проблемы со средой сборки на начальных этапах.

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

#Docker #Vulkan #CI #DevOps #Cpp #DevContainer
4
Привет!
Извините что не по теме канала, но думаю кому-то может быть интересно.

Большинство демок ИИ-агентов — это либо обёртки над готовыми фреймворками (LangChain, CrewAI), либо простые демки с одним тулом. Я решил пойти другим путём: написать агента с нуля, на голом OpenAI API, без использования «агентных фреймворков».

Что получилось: агент, который сочиняет стихи на русском языке. Но суть не в стихах, а в архитектуре.

Проект состоит из модулей:
— цикл агента (до 1000 итераций «мысль → вызов тула → ответ») с потоковым взаимовоздействием
— регистратор инструментов с использованием OpenAI-совместимых JSON-схем
— менеджер контекста (контроль количества токенов и трёхстадийная компрессия)
— системный промпт с полным описанием алгоритма

Инструменты, которые агент использует:
- веб-поиск (с фильтрацией доменов)
- векторная память (ChromaDB + bge-m3, дедупликация по хешу)
- чтение/запись/поиск-замена в файлах (песочница в рабочей директории)
- расстановка ударений в русском тексте — для проверки стихотворного размера
- управление собственной «креативностью» меняя температуру при выводе

Что мне кажется самым важным — алгоритм действий агента описан прямо в системном промпте, это как привила и умения. То что он реализован не в коде, позволяет легко изменить агента для других задач. Агент читает много-фазную инструкцию и выполняет её, переключая креативность в зависимости от этапа: 0.4 для поиска → 1.0 для синтеза → 1.2 для генерации строк → 0.3 для валидации метра стихов.

При этом:
- каждая строфа проходит несколько попыток создания
- пользователь утверждает план на каждую строфу и полный вариант
- если агент «застрял» — он просит совета у пользователя

Используйте что бы разобраться как работают те же KiloCode, Claude Code на базовом уровне, или как основу для своих специализированных агентов.

Код: https://gitflic.ru/project/kolkir/lmagent

#agent #llm #AI #opensource #python
🔥5👌1
Привет!
Немного новостей про развитие проекта:
- В мастер ветку добавлено распределённое обучение по данным, на основе Open MPI с синхронизацией через хост. Аналог DDP в PyTorch.
- Активно работаем над интеграцией библиотеки для логгирования. Думаю в ближайшее время добавим.
- Также в ближаших планах добавить пример реализации и обучения, в том числе распределённого, модели YOLO v11.
- Уже есть прототип реализации новой архитектуры вычислительного графа, который позволит проводить оптимизации.

Думаю после реализации и тестирования YOLO сделаем релиз библиотеки и выложим модуль для Python.
🔥2