MANGO
Репозиторий
MANGO

MANGO

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

Текущее ядро проекта

  • Стабилизированная семантика через нормализованное промежуточное представление
  • Командный интерфейс для проверки, генерации, запуска, анализа и экспорта
  • Языковой сервер с диагностикой, автодополнением и всплывающими подсказками для редакторов

Что делает MANGO уникальным

Философия

Минимум описания — максимум наглядности

Одна строка model = (784 -> 64) -> relu -> (64 -> 10) заменяет длинное описание с классом, инициализацией и прямым проходом.

Алгебра

Алгебраическая семантика

Основан на теории решеток: операции `+` и `*` коммутативны и ассоциативны, `->` правоассоциативна. Это позволяет рассуждать об архитектурах формально.

Корректность

Вывод формы на этапе компиляции

Система проверяет совместимость размерностей тензоров до запуска модели. Ошибки в архитектуре обнаруживаются при компиляции, а не в процессе исполнения.

Переносимость

Переносимость и версионирование

Файлы .mng — это текст. Их легко версионировать, сравнивать, хранить в коллекции моделей и передавать между командами без лишних зависимостей.

Зачем нужен MANGO

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

Описание

Композиционная семантика

->, +, *, ^, списки, конкатенация, тождественное преобразование, копии, общие ссылки и индексная свертка описаны как стабильный контракт промежуточного представления.

Исполнение

Исполняемая модель

Результатом компиляции может быть модуль torch.nn.Module, который можно запускать, использовать и сохранять как .pt или .mango.pt.

Представление

Модель mng может быть конвертирована в диаграмму через команду

mango mermaid строит читаемые схемы потоков, а команда mango visualize создает графы исполнения в PNG, SVG или PDF.

Редактор

Интерактивная консоль

mango-lsp добавляет диагностику, автодополнение и всплывающие подсказки; командный интерфейс закрывает проверку, вывод сведений, анализ, сравнение, генерацию кода и экспорт.

Пять операторов — бесконечность архитектур

Вся мощь MANGO в пяти базовых операторах. Комбинируя их, вы описываете сложные архитектуры в несколько строк.

->

Композиция

Последовательное соединение: выход одного слоя — вход другого

a -> b -> c
+

Прямая сумма

Параллельное соединение с суммированием выходов и остаточной связью

{block} + 1
*

Репликация

Несколько копий блока с усреднением выходов

block * 4
^

Степень

Несколько копий блока последовательно

block ^ 3
пробел

Конкатенация

Пробел соединяет блоки через torch.cat()

{a} {b}

MANGO и обычный код модели

Сравните, сколько кода требуется для описания одной и той же архитектуры.

Обычный код модели
class ResidualBlock(nn.Module): def __init__(self, dim): super().__init__() self.fc1 = nn.Linear(dim, dim) self.relu = nn.ReLU() self.fc2 = nn.Linear(dim, dim) def forward(self, x): return x + self.fc2( self.relu(self.fc1(x)) ) model = nn.Sequential( ResidualBlock(64), ResidualBlock(64), ResidualBlock(64), nn.Linear(64, 10) )
MANGO
res_block(dim) = { (dim -> dim) -> relu -> (dim -> dim) } + 1 model = { res_block(64) ^ 3 } -> (64 -> 10)

Что уже есть в проекте

Компоненты Mango 0.2

Mango держится на разделении: грамматика задает синтаксис, нормализованное промежуточное представление задает семантику, а сборщики превращают его в исполняемую модель, программный код и диаграммы.

  • Компилятор: парсер, раскрытие шаблонов, разрешение импортов, нормализация и валидаторы
  • Сборщики: исполняемая модель, генератор программного кода и построитель диаграмм
  • Инструменты: командный интерфейс, интерактивная консоль, языковой сервер, демо, тесты и коллекция моделей

Синтаксис как карта архитектуры

Операторы Mango описывают не порядок строчек кода, а форму вычислительного графа: последовательность, ветвление, повторение, объединение и операции над тензорами.

stem = (784 -> 64) -> relu res_block = { (64 -> 64) -> relu -> (64 -> 64) } + 1 resnet = stem -> { res_block ^ 4 } -> (64 -> 10) -> softmax

Проверенные языковые возможности

Эти конструкции покрыты tests/mng, эталонными снимками промежуточного представления и примерами из src/examples/zoo.

Базовые модули
a = (64) b = (64 -> 128) c = (2, 32, 64 -> 4, 16, 128)
Последовательность
seq1 = (64) -> relu seq2 = (64) -> (128) -> relu -> (256) seq5 = { (64) -> relu } -> { (64 -> 128) -> relu }
Остаточная сумма (+)
res_block = { (64 -> 64) -> relu -> (64 -> 64) } + 1 resnet = (784 -> 64) -> { res_block ^ 4 } -> softmax
Повторение и репликация
repeated = { (64 -> 64) -> relu } ^ 3 ensemble = { (64 -> 64) -> relu } * 4 model = repeated -> ensemble
Конкатенация
concat1 = { (32) } { (32) } concat3 = (64) -> { (32) (32) } -> relu -> (64) concat7 = { (32) (32) } -> { (64 -> 32) + (64 -> 32) }
Шаблоны и параметры
block(dim) = (dim) -> relu -> (dim) deep(d1, d2) = block(d1) -> (d1 -> d2) -> block(d2) model = deep(128, 64)
Импорты
import "../import_example/resnet_block.mng" as rb encoder = rb.ResNetBlock ^ 2 classifier = encoder -> rb.Project -> LayerNorm(32)
Индексная свертка и списки
q = (128 -> 128) k = (128 -> 128) weights = { q, k }[b i d, b j d -> b i j] -> Softmax(-1)
Копии и общие ссылки
base = (64 -> 64) -> relu copied_path = base -> (64 -> 32) shared_path = &base -> &base
Параметризованная сверточная сеть
stem = Conv2d(3, 8, 3, stride=1, padding=1, bias=False) -> BatchNorm2d(8, eps=0.001) -> relu downsample = MaxPool2d(2, ceil_mode=False) head = Conv2d(8, 16, 3, padding=1) -> BatchNorm2d(16) -> relu cnn = stem -> downsample -> head
Слой трансформера
input_proj = (128 -> 128) q = (128 -> 128) k = (128 -> 128) v = (128 -> 128) weights = { q, k }[b i d, b j d -> b i j] -> Softmax(-1) attn = { weights, v }[b i j, b j d -> b i d] ffn = (128 -> 64) -> relu -> Dropout(0.0) -> (64 -> 128) transformer_layer = input_proj -> { attn -> ffn } + 1 -> LayerNorm(128, elementwise_affine=True)

Командный контур

Создание

Проверка, сведения, консоль

Проверка ошибок, вывод моделей и интерактивная консоль для быстрых экспериментов.

Сборка

Компиляция, код, запуск

Компиляция в исполняемую модель, генерация файла с программным кодом и тестовый запуск на центральном или графическом процессоре.

Просмотр

Диаграмма, граф, анализ

Текстовая схема, граф исполнения, параметры, операции с плавающей точкой и память.

Экспорт

Сохранение, загрузка, сравнение

.mango.pt как архив модели, экспорт в переносимый формат, загрузка архива и сравнение двух архитектур.

Готовые сценарии

Коллекция моделей

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

Поддержка редактора

mango-lsp покрывает диагностику, автодополнение и всплывающие подсказки, чтобы .mng файлы были удобны в редакторе.

Экосистема инструментов

Команды

mango

Компиляция, проверка, визуализация, диаграммы, анализ, сравнение, запуск, замер скорости, экспорт, загрузка и интерактивная консоль.

Редактор

mango-lsp

Диагностика ошибок, автодополнение и всплывающие подсказки в редакторах.

Проверки

50+ тестов

Эталонные снимки промежуточного представления, тесты форм, интеграционные проверки и коллекция моделей.

Документы

Руководство + примеры

13 визуальных примеров от базовых слоев до декодера трансформера.

Быстрый путь

Минимальный рабочий цикл сегодня: написать .mng, проверить, посмотреть диаграмму, запустить модель и экспортировать результат.

model.mng
ffn = (128 -> 64) -> relu -> Dropout(0.0) -> (64 -> 128) model = (128 -> 128) -> { ffn } + 1 -> LayerNorm(128)
Команды
mango check model.mng mango mermaid model.mng --stdout --direction LR mango run model.mng --input-shape 1,128 mango export model.mng --format bundle -o model.mango.pt
Скрипт: создать и сохранить .pth
from pathlib import Path import torch from mango.compiler import Compiler source = """ model = (128 -> 64) -> relu -> (64 -> 10) """ result = Compiler()(source) if not result.success: raise RuntimeError(result.errors) model = result.models["model"] output = model(torch.randn(1, 128)) torch.save(model.state_dict(), Path("model.pth")) print(output.shape)

Готовы попробовать?

Начните с быстрого старта или изучите коллекцию моделей для вдохновения.