Skip to main content

Composable Expert Layer MoE primitives with hierarchical routing, fusion, and multi-loss orchestration.

Project description

celmoe-vp

celmoe-vp — доменно-агностичная библиотека для иерархических Mixture-of-Experts: явная маршрутизация по уровням, объединение представлений уровней (fusion) и составная целевая функция (global / per-level / bridge + лоссы экспертов).

PyPI:

pip install celmoe-vp

Импорт в Python:

import celmoe

Пакет не привязан к морфологии; это переиспользуемый слой оркестрации для приложений вроде morphoformer.

Документация по устройству пакета: ARCHITECTURE.md (MoE + иерархия + multi-task, схема модулей, mermaid-поток данных).


Что такое CELMoE здесь

CELMoE трактуется как три механизма в одном API:

Компонент Смысл
MoE На каждом уровне — набор экспертов; для каждого элемента батча выбирается имя эксперта (список длины B на уровень).
Иерархия Уровни в CELMoEConfig.levels выполняются по порядку; скрытое состояние передаётся «вниз» по стеку уровней.
Multi-task Итоговый лосс собирается из нескольких областей: глобальные функции, функции на конкретном уровне, межуровневые (bridge) и тензоры из ExpertResult.losses.

Вы реализуете содержимое экспертов и при необходимости подменяете модуль fusion.


Структура пакета (v2)

celmoe/
  config/       # ExpertConfig, HierarchyLevelConfig, CELMoEConfig
  core/         # типы, ExpertModule, LearnedFusion, HierarchicalCELMoE
  loss/         # LossBundle, CELMoELossAPI
  utils/        # routing_constant, validate_routing_length, merge_routing

Стабильный вход — корневой namespace:

from celmoe import CELMoEConfig, HierarchicalCELMoE, CELMoELossAPI, routing_constant

Точечные импорты (по желанию):

from celmoe.core.types import LevelRouting, ExpertContext
from celmoe.loss import LossBundle

Конфигурация

Публичный слой — dataclass-ы:

  • ExpertConfig — один эксперт: loss_weight, stop_gradient_from_parent, произвольный metadata.
  • HierarchyLevelConfig — уровень (universal, family, language, …): словарь экспертов, опциональный fallback_expert, флаг enabled.
  • CELMoEConfighidden_size, список уровней, параметры fusion (fusion_dropout, use_learned_fusion зарезервировано для совместимости; фактическая подмена fusion — через аргумент конструктора модели).

Контракт эксперта

Эксперты наследуют ExpertModule:

from celmoe import ExpertBatch, ExpertModule, ExpertResult

class MyExpert(ExpertModule):
    def forward(self, batch: ExpertBatch) -> ExpertResult:
        return ExpertResult(hidden=batch.hidden)

ExpertBatch: hidden, context, mask, state (строковые метки вроде уровня/эксперта).

ExpertResult: hidden, словарь losses (попадут в общий CELMoEOutput с префиксами), произвольный aux.


Иерархическое выполнение

HierarchicalCELMoE прогоняет включённые уровни, для каждого уровня применяет выбранных по маршруту экспертов, собирает лоссы уровня и передаёт скрытое состояние дальше. Затем все LevelOutput.hidden объединяются через fusion (по умолчанию LearnedFusion; можно передать свой nn.Module).

Формат маршрута — LevelRouting: dict[str, list[str]], каждый список длины батча:

{
    "universal": ["core", "core", "core"],
    "family": ["slavic", "romance", "slavic"],
    "language": ["rus", "spa", "bul"],
}

Если на уровне ровно один эксперт или задан fallback_expert, недостающий ключ маршрута может быть заполнен автоматически (broadcast).

Вспомогательные функции:

from celmoe import routing_constant, validate_routing_length, merge_routing

routes = routing_constant("core", batch_size=8)
validate_routing_length("universal", routes, 8)
combined = merge_routing(existing_routing, {"new_level": ["a"] * 8})

Multi-loss / multi-task API

CELMoELossAPI регистрирует:

  • add_global — лосс от всего CELMoEOutput;
  • add_level — лосс от LevelOutput выбранного уровня;
  • add_bridge — лосс от пары родитель/дочерний уровень;
  • compute — собирает LossBundle (взвешенная сумма, плюс as_dict() для логов).

Уже на этапе compute в бандл попадают лоссы из output.losses (эксперты) с scope "expert". У каждого LossTerm есть строка scope для фильтрации или отображения в логгерах.

Это позволяет комбинировать, например: регуляризацию родителя, специализацию ребёнка, согласование между уровнями — без жёсткой привязки к одной задаче внутри библиотеки.


Пример

from typing import Mapping

import torch
import torch.nn as nn

from celmoe import (
    CELMoEConfig,
    CELMoELossAPI,
    ExpertBatch,
    ExpertConfig,
    ExpertModule,
    ExpertResult,
    HierarchicalCELMoE,
    HierarchyLevelConfig,
)


class LinearExpert(ExpertModule):
    def __init__(self, hidden_size: int) -> None:
        super().__init__()
        self.proj = nn.Linear(hidden_size, hidden_size)

    def forward(self, batch: ExpertBatch) -> ExpertResult:
        hidden = self.proj(batch.hidden)
        return ExpertResult(hidden=hidden)


def build_expert(level_name: str, expert_name: str, metadata: Mapping[str, object]) -> ExpertModule:
    del level_name, expert_name, metadata
    return LinearExpert(hidden_size=256)


config = CELMoEConfig(
    hidden_size=256,
    levels=[
        HierarchyLevelConfig(
            name="parent",
            experts={"core": ExpertConfig(name="core")},
            fallback_expert="core",
        ),
        HierarchyLevelConfig(
            name="child",
            experts={
                "a": ExpertConfig(name="a", stop_gradient_from_parent=True),
                "b": ExpertConfig(name="b", stop_gradient_from_parent=True),
            },
        ),
    ],
)

model = HierarchicalCELMoE(config, expert_factory=build_expert)

hidden = torch.randn(4, 32, 256)
output = model(
    hidden,
    routing={
        "parent": ["core"] * 4,
        "child": ["a", "b", "a", "b"],
    },
)

loss_api = CELMoELossAPI()
loss_api.add_global("l2", lambda out, targets, context: out.fused_hidden.pow(2).mean())
bundle = loss_api.compute(output)
print(bundle.total)

Основные типы данных

  • LevelOutput — результат одного уровня: скрытое состояние, маршрут, лоссы, aux.
  • CELMoEOutput — все уровни, fused_hidden, агрегированные лоссы экспертов.
  • LossTerm / LossBundle — пошаговая разложимость лосса и скаляры для метрик.

Изоляция градиента

stop_gradient_from_parent=True у ExpertConfig отключает градиент от входа уровня к выбранному эксперту (через detach входа). Полезно для поэтапного обучения и снижения интерференции между уровнями.


Что пакет намеренно не включает

  • эмбеддинги и токенизацию;
  • внутренности Transformer-блоков;
  • загрузку данных, оптимизаторы, чекпоинты.

Это остаётся на стороне приложения; celmoe-vp — слой оркестрации MoE + иерархии + составного лосса.


Типизация

Пакет строго типизирован и поставляет py.typed для использования как независимого зависимого пакета.


Версия 2.0

В 2.0 изменена внутренняя раскладка модулей (config / core / loss / utils); публичный импорт from celmoe import ... сохранён и расширен (типы, LearnedFusion, утилиты маршрутизации). Подробности — в ARCHITECTURE.md.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

celmoe_vp-2.0.1.tar.gz (14.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

celmoe_vp-2.0.1-py3-none-any.whl (14.0 kB view details)

Uploaded Python 3

File details

Details for the file celmoe_vp-2.0.1.tar.gz.

File metadata

  • Download URL: celmoe_vp-2.0.1.tar.gz
  • Upload date:
  • Size: 14.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for celmoe_vp-2.0.1.tar.gz
Algorithm Hash digest
SHA256 67efcbd8f2581a31e9f7b8fb022fb5da581330006fc04b7fc1542760e0605598
MD5 4db171d2a728e4caa081509cc364a8d1
BLAKE2b-256 3176eb957b6b4c820bd363d77171aa31dcd88e2bfd01a21887c9d400240871ea

See more details on using hashes here.

File details

Details for the file celmoe_vp-2.0.1-py3-none-any.whl.

File metadata

  • Download URL: celmoe_vp-2.0.1-py3-none-any.whl
  • Upload date:
  • Size: 14.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.2

File hashes

Hashes for celmoe_vp-2.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 3082673501b99f4bbec47de64e4da4d4c4f3c35a898d0dc9e29198dbdcc51e42
MD5 4619fa25ac3e7b863bef9ef7e2e0a1ec
BLAKE2b-256 81054b47caa5b499fbb36703c668375d64e4940790f1c8ec865141ab8349c8b6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page