New We are sorting MAX channels into categories and territories. Read the news
Public channel ID 70922330980446

Adept | Машинное обучение | Открытое ПО

Adept(Automatic Differentiation Engine for Tensor Processing)

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

Описание проекта: https://adept-platform.gitverse.site/adept-docs/
Зеркало в telegram: https://t.me/adept_platform
Чат: https://max.ru/join/ptpfhISc1Wk8C3afDzdg2tpqb5hBGS37sQ5bqM5p25s

Channels in category
101 367
This channel's rank
№ 82 100
Open category →
Channels in category
2 091
This channel's rank
№ 2 091
Open category →
Open in MAX

Posts for the period

By reactions

Search and the whole feed — after free registration. Custom dates — with a subscription; the channel owner sees them for free. Sorting by reactions — with a subscription. Sign up

Loading…

В основную ветку добавлена новая функциональность и API

- Удалён класс Variable теперь Tensor сам является autograd-узлом.
- Удалён метод .data() - используйте Tensor напрямую и detach() для значений без графа.
- requires_grad задаётся явно через requires_grad_().
- Активации/лоссы переехали в adept::nn::functional.
- Добавлены графовый режим и tracing.

1. Variable → Tensor

Было:

Variable forward(Variable x) { return relu(l1(x)); }
Variable x(batch[0].to(dev), false);
auto loss = cross_entropy_with_logits(net(x), Variable(y.to(dev), false));
auto v = loss.dataat<float3().cpu().2_t>({0,0});

Стало:

using namespace adept::nn::functional;

Tensor forward(Tensor x) { return relu(l1(x)); }
Tensor x = batch[0].to(dev);
auto loss = cross_entropy_with_logits(net(x), y.to(dev));
auto v = loss.detach().cpu().at<float32_t>({0,0});

2. requires_grad и .data()


// было
Variable v(x); v.requires_grad(false);
Tensor raw = v.data();



// стало
Tensor t = x;
t.requires_grad_(); // включить
t.requires_grad_(false); // выключить
Tensor raw = t.detach(); // без узла графа

Обычный Tensor по умолчанию без градиента. Свои параметры помечайте requires_grad_(). Cлои и оптимизаторы делают это сами. Для изменения данных на месте: weight_.copy_from(new_weight).

3. Заголовочные файлы и namespace


// было
#include <adept/autograd/autograd.hpp>
#include <adept/nn/activations.hpp>
#include <adept/nn/cross_entropy.hpp>
using namespace adept;



// стало
#include <adept/graph/autograd.hpp>
#include <adept/nn/functional.hpp>
using namespace adept::nn::functional;

relu, cross_entropy_with_logits, MSE, bce_loss и т.п. больше не лежат в adept::; используйте adept::nn::functional::....

4. Свои операции

Backward-правила теперь capture-free и читают состояние из OpContext:

detail::OpContext ctx("my_op");
ctx.add_input("input", input);
ctx.set_forward([](const std::vector<Tensor>& in, detail::OpContext&) {
return std::vector<Tensor>{my_op_fwd(in[0].detach())};
});
ctx.set_backward([](const Tensor& g, const detail::OpContext& c) {
if (c.input("input").requires_grad())
detail::add_grad(c.input("input"), my_op_bwd(g));
});
return detail::make_op(result, std::move(ctx));

Для нескольких выходов используется detail::make_multi_op.

5.Tracing (трассировка графа)

По умолчанию в Adept используется Eager режим: записывается только gradient tape (операции с `requires_grad`). В новом режиме `Compiled` записываются все операции.

#include <adept/graph/traced_graph.hpp>

auto traced = trace_module(model, [&](const std::vector<Tensor>& in) {
return std::vector<Tensor>{model(in[0])};
}, {example_input}, TraceOptions{.input_names = {"x"}});

Tensor out = traced.forward({runtime_input})[0];

Режим графа: GraphModeGuard(graph_mode_t::Compiled).

Также TraceOptions включают оптимизации: constant folding, CSE, алгебраические упрощения, DCE и анализ fusion-кандидатов.

Ограничения Tracing

- трассировка только для inference: TracedGraph умеет только forward, backprop через него не идёт;
- фиксируется сигнатура входов: количество, shape, dtype и device должны совпадать;
- трассируемая функция выполняется один раз на example inputs, поэтому чтение значений на хосте запрещено;
Ветвления должны зависеть от структуры графа, а не от значений тензоров;
- record_gradients=false по умолчанию — трассированный граф не хранит градиенты.

6. Python

Python API также обновлен в соответствии с изменениями.

#BreakingChanges #API #Tracing #Graph
Views: 6
Go to post Open in MAX Report an inaccuracy
Несколько дней потратил на то чтобы навайбкодить понижение из StableHLO диалекта в SPIR-V с использованием LLVM MLIR. В целом это получилось и я смог запускать скомпилированные шейдеры в среде Adept. Но производительность таких шейдеров существенно ниже написанных вручную. Например для поэлементных операций проблема в том как правильно сформировать размеры сетки и блоков. А для GEMM нужно реализовать тайлинг. И существующего компиляторного прохода для таких вещей как я понял нет, есть только вариант применения специального вида трансформации для которого надо самому писать скрипты. А проходы которые преобразуют циклы в параллельные циклы сейчас не поддерживают тайлинг и блоки. В общем задача оказалась существенно сложнее.

- Пока буду переносить в мастер ветку код для полноценного представления вычислительного графа и слияние Tensor и Variable в одну сущность.
- Потом есть идея отказаться от преобразования гарфа в StableHLO и сразу генерировать linalg диалект для MLIR.
- И ограничится пока только поэлементными операциями над тензорами что бы проверить можно ли получить аффективный fusing операций в одном шейдере с помощью компилятора.

#IR #SPIR-V #MLIR #LLVM #Tensor
Views: 22
Go to post Open in MAX Report an inaccuracy
Анонс: Осенний Scientific Open Source Meetup этого года - в октябре!

С радостью приглашаем всех на наш очередной Scientific Open Source Meetup, который пройдет 29 октября 2026 года с 17:30 до 21:30 в Санкт-Петербурге в уютном лофте на Газовой, 10ж. Это отличная возможность встретиться, обсудить актуальные темы и поделиться опытом в мире открытого программного обеспечения!

В программе:
Десять агентов, один файл: где исследовательские среды хранят состояние // Сергей Геворкян, менеджер продукта Cloud Ru
Что происходит с хранилищем, когда десятки агентов одновременно записывают ход исследований? Разбор кода OpenResearch, OpenScience и OpenHuman с замерами при росте числа агентов.

Петля должна быть разорвана // Олег Чирухин, GitVerse
Как заставить агента работать днями и неделями с первого промпта, почти без участия человека? Автор представит свой опенсорсный инструмент и приёмы для автономной разработки.

Китайский опенсорсный ИИ-агент openJiuwen // OpenScaler

openEuler → OpenScaler или туда и обратно // Дмитрий Варенов, Технический лидер сообщества openEuler/OpenScaler

От локализованного форка OpenScaler к прямому развитию openEuler в России и СНГ. Расскажем о планах и мероприятиях, а также о том, как внести вклад в проект и попасть на стажировку.

PAUK: инструмент для картографирования экосистем открытого кода // Андрей Гетманов, аспирант ИТМО
Как связать исследователей, статьи и репозитории в единый граф? PAUK помогает находить научные группы по темам исследований и выяснять, чьи разработки переиспользуют коллеги.

Опенсорс, агенты и студенты — опыт ФТИИ ИТМО // Юлия Борисова, к.т.н., руководитель учебно-научной лаборатории АИСТ, ИТМО
Есть ли работа для начинающего программиста-исследователя в эпоху агентов? Поговорим о том, как студентам войти в профессию и какие навыки нужны для разработки и исследований в области ИИ.

UniversalToolchain // Михаил Резаков, ФКН ВШЭ
Презентация проекта - победителя конкурса студенческих опенсорс-проектов ФКН ВШЭ.

Мероприятие проходит при поддержке Gitverse, Cloud.Ru и OpenScaler.
Дата: 29 октября 2026 года
Время: 17:30 до 21:30
Место: Лофт на Газовой, 10ж, СПб. 

Участие бесплатное, но количество очных мест ограничено! Трансляция - будет.
Ссылка на регистрацию - https://openmeetup.ru/

Ждем вас на митапе!
Views: 17
Go to post Open in MAX Report an inaccuracy
Более глубокое изучение вопроса с использованием OpenXLA для компиляции в SPIR-V показало что это напрямую сейчас всё еще не возможно. Только Intel занимается этим вопросом и у них есть какие-то экспериментальные наработки.
Но в тоже время есть тензорный компилятор и среда исполнения IREE построенные на базе LLVM MLIR специально для компиляции и запуска SPIR-V. Но это полноценное end2end решение, т.е. ему на вход можно дать HLO и получить исполняемый файл. Вроде бы можно использовать и как библиотеку. Т.е. если использовать IREE то придется отказаться уже разработанной в Adept среды для запуска compute shaders в Vulkan. Так поступать не хочется.
Поэтому следующим шагом буду изучать как напрямую использовать LLVM MLIR для понижения из HLO в набор SPIR-V с планом исполнения и промежуточных выделений памяти. А IREE можно использовать для сравнения производительности.

#IR #OpenXLA #IREE #SPIR-V #MLIR #LLVM
Views: 22
Go to post Open in MAX Report an inaccuracy
Сделал детальное представление вычислительного графа и теперь его можно преобразовать в другое IR.
Вот например для такого небольшого перцептрона:
class MLP : public Module {
public:
MLP()
: linear1(28 * 28, 1024),
linear2(1024, 512),
linear3(512, 256),
linear4(256, 10) {
...
}
Tensor forward(Tensor input) {
auto out = l1(input);
out = relu(out);
out = l2(out);
out = relu(out);
out = l3(out);
out = relu(out);
out = l4(out);
return out;
}
...
};

Получается такое представление в StableHLO формате:
module {
func.func @main(%arg0: tensor<784x784xf32>, %arg1: tensor<1024x784xf32>, %arg2: tensor<1024xf32>, %arg3: tensor<512x1024xf32>, %arg4: tensor<512xf32>, %arg5: tensor<256x512xf32>, %arg6: tensor<256xf32>, %arg7: tensor<10x256xf32>, %arg8: tensor<10xf32>) -> tensor<784x10xf32> {
%0 = stablehlo.transpose %arg1, permutation = [1, 0] : (tensor<1024x784xf32>) -> tensor<784x1024xf32>
%1 = stablehlo.dot_general %arg0, %0, contracting_dims = [1] x [0] : (tensor<784x784xf32>, tensor<784x1024xf32>) -> tensor<784x1024xf32>
%2 = stablehlo.broadcast_in_dim %arg2, dims = [1] : (tensor<1024xf32>) -> tensor<784x1024xf32>
%3 = stablehlo.add %1, %2 : tensor<784x1024xf32>
%4 = stablehlo.constant dense<0> : tensor<784x1024xf32>
%5 = stablehlo.maximum %3, %4 : tensor<784x1024xf32>
%6 = stablehlo.transpose %arg3, permutation = [1, 0] : (tensor<512x1024xf32>) -> tensor<1024x512xf32>
%7 = stablehlo.dot_general %5, %6, contracting_dims = [1] x [0] : (tensor<784x1024xf32>, tensor<1024x512xf32>) -> tensor<784x512xf32>
%8 = stablehlo.broadcast_in_dim %arg4, dims = [1] : (tensor<512xf32>) -> tensor<784x512xf32>
%9 = stablehlo.add %7, %8 : tensor<784x512xf32>
%10 = stablehlo.constant dense<0> : tensor<784x512xf32>
%11 = stablehlo.maximum %9, %10 : tensor<784x512xf32>
%12 = stablehlo.transpose %arg5, permutation = [1, 0] : (tensor<256x512xf32>) -> tensor<512x256xf32>
%13 = stablehlo.dot_general %11, %12, contracting_dims = [1] x [0] : (tensor<784x512xf32>, tensor<512x256xf32>) -> tensor<784x256xf32>
%14 = stablehlo.broadcast_in_dim %arg6, dims = [1] : (tensor<256xf32>) -> tensor<784x256xf32>
%15 = stablehlo.add %13, %14 : tensor<784x256xf32>
%16 = stablehlo.constant dense<0> : tensor<784x256xf32>
%17 = stablehlo.maximum %15, %16 : tensor<784x256xf32>
%18 = stablehlo.transpose %arg7, permutation = [1, 0] : (tensor<10x256xf32>) -> tensor<256x10xf32>
%19 = stablehlo.dot_general %17, %18, contracting_dims = [1] x [0] : (tensor<784x256xf32>, tensor<256x10xf32>) -> tensor<784x10xf32>
%20 = stablehlo.broadcast_in_dim %arg8, dims = [1] : (tensor<10xf32>) -> tensor<784x10xf32>
%21 = stablehlo.add %19, %20 : tensor<784x10xf32>
return %21 : tensor<784x10xf32>
}
}

Далее его надо преобразовать тензорным компиляторм. Эксперименты продолжаются.
Views: 18
Go to post Open in MAX Report an inaccuracy
После публикации релиза продолжаем работу:

- Расширяем набор демонстрационных приложений для прикладного API. Работаем над реализацией моделей на основе архитектуры UNet и соответствующего конвейера для их обучения.

- Продолжаем работу над реализацией поддержки формата GGUF. Сначала будет загрузка квантованных весов с распаковкой в FP32 и API для квантования с использованием ggml. Далее планируем делать поддержку квантованных данных в вычислительных ядрах.

- Будем пробовать увеличить производительность реализации GEMM для Vulkan.

- И я затеял глубокий рефакторинг системы построения вычислительного графа и авто-дифференцирования. Будем уходить от простого подхода с неявным построением графа к явному описанию с узлами, рёбрами и соответствующей дополнительной информацией. Это должно позволить осуществлять преобразования графа в другие промежуточные представления(IR) и производить его анализ и оптимизацию. На первом этапе хочется получить функциональный слой для всех операций и возможность генерации StableHLO IR для использования тензорного компилятора OpenXLA. Прикладной API это не затронет и даже упростит, так как уберем класс Variable и будем оперировать только тензорами.

#plans #IR #GGUF #tensor #compiler #StableHLO
Views: 37
Go to post Open in MAX Report an inaccuracy
Весте с лабораторией YADRO на факультете информационных технологий НГУ поучаствовали в «Двадцать второй конференции разработчиков свободных программ».
Матвей Сорокин студент кафедры Систем Информатики подготовил тезисы для сборника на тему «Развитие библиотеки Adept: сборка RPM-пакета для ALT Linux».
Views: 32
Go to post Open in MAX Report an inaccuracy
Доделал скрипты для сборки библиотеки под 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.
Views: 46
Go to post Open in MAX Report an inaccuracy
The full feed — after free sign-up
VKontakte Telegram Odnoklassniki
Favorites at datool.ru

Follow the channel in your account

Sign up at datool.ru to add the channel “Adept | Машинное обучение | Открытое ПО” to favorites and track its metrics.

Sign up
For channel owners

Verify your channel

Sign in or sign up at datool.ru, then add our bot to the channel following the instructions in your account. Once ownership is verified, the lock disappears and channel management becomes available.

Sign in or sign up

Report an inaccuracy

Describe what needs fixing. If you have a source, add a link.

You are leaving datool.ru

The link leads to an external website. datool.ru is not responsible for its content — check the address before entering passwords or payment details.

Redirecting in 10 s

Go