Привет!
Я открыл 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
- Автоматическое создание представлений и управление непрерывностью
- Многомерная индексация с правильной обработкой форм
Пример кода:
Я открыл 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/
Я на днях делал доклад "Актуальность и области применения языка С++ в современном ML" на конференции "Современные технологии в теории и практике программирования" в Санкт-Петербургском Политехническом Университете. К сожалению записи с мероприятия нет, но я делюсь видео с подготовки доклада. Надеюсь кому-то будет полезно.
https://rutube.ru/video/bc863eb9180b8cf67d118bb4b2ab1cb7/
RUTUBE
С++ в современном ML
Доклад "Актуальность и области применения языка С++ в современном ML" прочитанный на конференции "Современные технологии в теории и практике программирования" в Санкт-Петербургском Политехническом Университете.
❤6
Привет!
Закончилась ежегодная конференция C++ Russia. В этом году я продолжил знакомить участников с проектом Adept, рассказывал про устройство работы конвейера запуска вычислительных шейдеров.
А ещё мы провели мастер-класс где участники познакомились с основами разработки для GPU и попробовали сами создать расширение для PyTorch.
Закончилась ежегодная конференция C++ Russia. В этом году я продолжил знакомить участников с проектом Adept, рассказывал про устройство работы конвейера запуска вычислительных шейдеров.
А ещё мы провели мастер-класс где участники познакомились с основами разработки для GPU и попробовали сами создать расширение для PyTorch.
🔥13
Появляются новые вычислительные бекэнды на Vulkan.
В рамках секции Open Source на DataFest 2026 будет доклад
"ggmlR:Vulkan GPU-бэкенд для R"
Юрия Барамыкова старшего руководителя проекта Иннотех.
Код проекта:
https://github.com/cran/ggmlR
В рамках секции 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 и разберу реализацию полносвязной сети на языке описания аппаратуры, а также свёрточной сети через высокоуровневый синтез."
От ИТМО на нем выступит Иван Дейнека: к.т.н, доцент Высшей инженерно-технической школы и автор open-source "Руководства по реализации Edge AI на FPGA" .
Почитать руководство (или даже законтрибьютить в него) можно тут: https://github.com/debreti/nirsii-fpgai
Подробности про мероприятие:
26 мая в 19:00 приглашаем вас присоединиться к онлайн-трансляции. В этот раз поговорим об RTL-разработке и синтезе, документировании RTL и применении ИИ в FPGA/ASIC-разработке. Среди тем выступлений:
Своим опытом поделятся эксперты 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
Решение: собственный многостадийный 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
Извините что не по теме канала, но думаю кому-то может быть интересно.
Большинство демок ИИ-агентов — это либо обёртки над готовыми фреймворками (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.
Немного новостей про развитие проекта:
- В мастер ветку добавлено распределённое обучение по данным, на основе Open MPI с синхронизацией через хост. Аналог DDP в PyTorch.
- Активно работаем над интеграцией библиотеки для логгирования. Думаю в ближайшее время добавим.
- Также в ближаших планах добавить пример реализации и обучения, в том числе распределённого, модели YOLO v11.
- Уже есть прототип реализации новой архитектуры вычислительного графа, который позволит проводить оптимизации.
Думаю после реализации и тестирования YOLO сделаем релиз библиотеки и выложим модуль для Python.
🔥2
Мой доклад про роль C++ в ML выложили в виде статьи на Хабр:
https://habr.com/ru/companies/yadro/articles/1048932/
https://habr.com/ru/companies/yadro/articles/1048932/
Хабр
С/С++ в современном машинном обучении: традиционные роли и возможности нового стандарта
Привет, Хабр! Меня зовут Кирилл, я разработчик СХД в YADRO и ML-энтузиаст, автор книги «Hands-on Machine Learning with C++». Я заметил, что роль С/С++ в экосистеме машинного обучения трансформируется...
❤4👏1
В NumPy и PyTorch поддерживаются тензоры, у которых одна или несколько осей имеют нулевую длину.
Например:
Это полноценные объекты, с которыми выполняются стандартные операции (сложение, умножение, транспонирование, конкатенация при согласованных размерностях). Такие тензоры часто называют «пустыми» (empty tensors), но они не являются
🔍 Зачем они нужны?
Главное преимущество — единообразие кода. Вместо проверок
💡 Пример из загрузки датасетов
При сборке батча некоторые примеры могут не иметь разметки. Вместо пропуска или вставки заглушек вы формируете тензор формы
⚙️ Другие сценарии использования
- Обработка последовательностей переменной длины – пустые последовательности удобно представлять тензорами с нулевой длиной.
- Фильтрация данных – если после условий выборки не осталось элементов, результатом становится пустой тензор.
- Агрегация в группах – группы без данных возвращают пустые тензоры, упрощая универсальные функции редукции.
🚧 Проблема при портировании на Adept
В Adept концепция тензоров с нулевой размерностью не поддерживается. Библиотека проверяет размерности на этапе выполнения и генерирует исключение при обнаружении оси длины 0. Это существенно затрудняет перенос кода из NumPy/PyTorch.
Я столкнулся с этим при реализации DataLoader для тренировки модели YOLO. В исходной PyTorch-версии пустые тензоры свободно использовались для тренировочных данных без разметки. При адаптации под Adept пришлось вносить дополнительные проверки при формировании пакета.
Оптимальным решением будет расширить Adept поддержкой нулевых размерностей по аналогии с NumPy и PyTorch. Это позволит писать более лаконичный и надёжный код, избегая избыточных проверок и упрощая миграцию проектов между фреймворками. Также это снизит порог входа для новых пользователей.
#NumPy #PyTorch #Adept #Tensor #DataLoader
Например:
np.zeros((0, 24)) # форма (0, 24)
torch.empty((17, 0)) # форма (17, 0)
Это полноценные объекты, с которыми выполняются стандартные операции (сложение, умножение, транспонирование, конкатенация при согласованных размерностях). Такие тензоры часто называют «пустыми» (empty tensors), но они не являются
None и не требуют специальной обработки на каждом шагу алгоритма.🔍 Зачем они нужны?
Главное преимущество — единообразие кода. Вместо проверок
if data is not None на каждом этапе вы создаёте пустой тензор с нулевой длиной по нужной оси и продолжаете работать с ним как с обычными данными. Финальная проверка (например, наличие хотя бы одного элемента в пакете) откладывается до самого конца пайплайна.💡 Пример из загрузки датасетов
При сборке батча некоторые примеры могут не иметь разметки. Вместо пропуска или вставки заглушек вы формируете тензор формы
(0, num_features) и объединяете его с остальными через torch.cat – операция корректно обрабатывает пустой тензор, не нарушая размерность. Лишь на этапе подсчёта функции потерь вы проверяете, что размер батча > 0.⚙️ Другие сценарии использования
- Обработка последовательностей переменной длины – пустые последовательности удобно представлять тензорами с нулевой длиной.
- Фильтрация данных – если после условий выборки не осталось элементов, результатом становится пустой тензор.
- Агрегация в группах – группы без данных возвращают пустые тензоры, упрощая универсальные функции редукции.
🚧 Проблема при портировании на Adept
В Adept концепция тензоров с нулевой размерностью не поддерживается. Библиотека проверяет размерности на этапе выполнения и генерирует исключение при обнаружении оси длины 0. Это существенно затрудняет перенос кода из NumPy/PyTorch.
Я столкнулся с этим при реализации DataLoader для тренировки модели YOLO. В исходной PyTorch-версии пустые тензоры свободно использовались для тренировочных данных без разметки. При адаптации под Adept пришлось вносить дополнительные проверки при формировании пакета.
Оптимальным решением будет расширить Adept поддержкой нулевых размерностей по аналогии с NumPy и PyTorch. Это позволит писать более лаконичный и надёжный код, избегая избыточных проверок и упрощая миграцию проектов между фреймворками. Также это снизит порог входа для новых пользователей.
#NumPy #PyTorch #Adept #Tensor #DataLoader
👍1