Игорь Градов
Игорь Градов
6 мин
ai

Фреймворк ICO собирает пайплайн машинного обучения в единый граф без «швов»

Компания PyTorch и её экосистема давно стали стандартом для инженеров, занимающихся машинным обучением, но типичный пайплайн обучения модели по-прежнему остаётся набором разрозненных частей, скреплённых соглашениями, а не архитектурой.

Фреймворк ICO собирает пайплайн машинного обучения в единый граф без «швов»
Почему это важно

Фреймворк ICO позволяет собрать весь пайплайн машинного обучения в единый граф вычислений: от загрузки данных до обновления весов модели, без «швов» между DataLoader, циклом обучения и метриками.

Автор фреймворка ICO разобрал корневую проблему PyTorch-пайплайнов: подготовка данных живёт в Dataset и DataLoader, обучение живёт в ручном цикле, а между ними нет общей структуры. Данные передаются словарями со строковыми ключами, типы нигде не зафиксированы, параллелизм привязан к одному компоненту. ICO предлагает другой подход: каждый шаг становится оператором с явной сигнатурой «вход/выход», операторы соединяются в линейную цепочку, а управляющие конструкции (циклы, ветвления) тоже являются операторами.

Какую задачу решаем?

Если вы пишете пайплайн машинного обучения на PyTorch, скорее всего ваш код разбросан по нескольким местам:

  • Загрузка данных и аугментации спрятаны внутри Dataset и collate_fn
  • Прямой проход, функция потерь, обратное распространение ошибки (вычисление градиентов, чтобы модель «понимала», куда двигать свои параметры) и обновление весов написаны в отдельном цикле
  • Структура передаваемых данных определяется «по договорённости» и нигде формально не описана

Результат: при любом изменении, будь то новая аугментация или другой оптимизатор, приходится трогать несколько не связанных между собой файлов. ICO превращает пайплайн в единый граф, где каждый шаг это оператор (operator), а тип данных на входе и выходе задан явно.

Что понадобится

  • Python 3.10+ и установленный PyTorch (torchvision для работы с CIFAR-10)
  • Фреймворк ICO (устанавливается через pip, репозиторий автора открыт)
  • Базовое знакомство с Dataset и DataLoader в PyTorch
  • Около 30 минут, чтобы пройти все шаги и запустить обучение классификатора на CIFAR-10

Пошаговая инструкция

  1. Определите базовые структуры данных. Создайте дата-класс для одного элемента датасета (изображение и метка класса) и класс-обёртку, которая загружает весь CIFAR-10 в память. В ICO структура данных задаётся явно: никаких словарей с произвольными строковыми ключами.
from dataclasses import dataclass
import torch
from torch import Tensor
from torchvision.datasets import CIFAR10
from torchvision.transforms import ToTensor

@dataclass(slots=True, frozen=True)
class CifarItem:
    image: Tensor  # (3, 32, 32)
    label: Tensor  # (,)

class CifarDataset:
    images: Tensor  # (N, 3, 32, 32)
    labels: Tensor  # (N,)

    def __init__(self, root: str = "data/"):
        dataset = CIFAR10(root=root, download=True, transform=ToTensor())
        self.images = torch.stack(
            [dataset[i][0] for i in range(len(dataset))]
        )
        self.labels = torch.tensor(
            [dataset[i][1] for i in range(len(dataset))]
        )
  1. Оберните источник данных в оператор IcoSource. В ICO даже источник данных это оператор. Его сигнатура: он ничего не принимает на вход и возвращает итератор по элементам. На противоположном конце графа стоит IcoSink, оператор, который принимает данные и ничего не возвращает. Вместе они замыкают граф.

  2. Опишите каждый шаг обработки как оператор. Аугментация, прямой проход модели (forward), вычисление функции потерь, обратное распространение ошибки (backward), обновление параметров оптимизатором, каждый из этих шагов становится отдельным оператором с явной сигнатурой: тип входных данных и тип выходных данных.

  3. Соедините операторы в цепочку. Граф в ICO линейный и однонаправленный: выход одного оператора становится входом следующего. Управляющие конструкции тоже операторы. Например, цикл обучения по эпохам это оператор, который многократно выполняет вложенный в него подграф. Так работает принцип композиции: оператор может содержать другие операторы.

  4. Добавьте контекст Context для состояния. Если оператору нужно запомнить что-то между шагами (текущая эпоха, накопленные метрики, состояние оптимизатора), он читает и изменяет объект Context. Оператор одновременно может преобразовывать данные и менять контекст, это позволяет выражать вычисления с состоянием в том же графе.

  5. Запустите граф. Итоговая конструкция от IcoSource до IcoSink это замкнутый граф с сигнатурой «ничего на входе, ничего на выходе», самодостаточный оператор, выполняющий полный цикл обучения.

Что получается на практике

На выходе: полный пайплайн классификатора изображений CIFAR-10, в котором загрузка данных, аугментация, обучение и метрики описаны единообразно, как операторы одного графа. Каждый оператор определяет, какой тип данных принимает и какой отдаёт, а значит, при замене любого шага (другая функция потерь, другой оптимизатор) несовместимость типов видна сразу, до запуска обучения. Структура данных перестаёт быть «договорённостью» и становится частью кода.

Частые ошибки
  • Привычка передавать данные словарями. ICO требует явных дата-классов. Если вы продолжите использовать dict со строковыми ключами, вы потеряете главное преимущество подхода: проверку типов на стыках операторов.
  • Попытка добавить ветвление в линейный граф. Граф ICO однонаправленный, без ветвлений. Условную логику нужно реализовывать через оператор-обёртку, а не через if между шагами.
  • Путаница между данными и контекстом. Данные текут через цепочку операторов, контекст живёт «сбоку» и хранит состояние. Если вы засунете в контекст сами тензоры батча, граф станет нечитаемым.
  • Игнорирование сигнатур. Сила подхода в том, что каждый оператор декларирует тип входа и выхода. Если вы пишете операторы без аннотаций, вы получаете тот же хаос, что и с обычным PyTorch-циклом, только с лишней обёрткой.

Кому это пригодится и что делать прямо сейчас?

ML-инженеру и дата-сайентисту. Если ваш пайплайн машинного обучения на PyTorch разросся до состояния, когда правка в аугментации ломает цикл обучения, попробуйте переписать один небольшой проект через ICO. Начните с CIFAR-10 по описанной схеме, это займёт полчаса и покажет, подходит ли вам такая модель мышления.

Автору технического контента на Дзене. Подход «всё есть оператор» хорошо ложится на обучающие статьи: каждый шаг изолирован, его можно объяснить отдельно. Если вы пишете туториалы по машинному обучению, формат графа операторов делает структуру статьи нагляднее.

Тимлиду и техлиду. Явные сигнатуры операторов работают как контракты между разработчиками: один человек пишет оператор аугментации, другой оператор обучения, и типы на стыке проверяются автоматически. Для команд, где пайплайн трогают несколько человек, это ощутимое снижение числа ошибок при интеграции.

Мнение редакции dzen.guru

ICO решает настоящую боль: типичный PyTorch-пайплайн действительно «расползается» по файлам, и при работе в команде это создаёт проблемы. Подход с единым графом операторов красив концептуально и полезен на практике. Но стоит быть честным: фреймворк пока авторский, с небольшим сообществом. Для продакшена в крупном проекте я бы сначала проверил, хватает ли документации и покрытия крайних случаев. А вот для учебных проектов, соревнований и личных экспериментов с машинным обучением, отличный инструмент, чтобы навести порядок в голове и в коде.

Пишете о нейросетях на Дзене?

Разберём, как делать технические туториалы понятными для широкой аудитории, с примерами и структурой, которая работает.

Узнать больше

Главный вывод: если вы ловите себя на мысли, что при каждом новом проекте заново пишете один и тот же хаотичный цикл обучения, попробуйте посмотреть на пайплайн как на граф операторов. Даже если ICO вам не подойдёт, сам принцип «каждый шаг это оператор с явным типом на входе и выходе» дисциплинирует код лучше любого код-ревью.

Поделиться:TelegramVK
Игорь Градов
Игорь Градов

Основатель dzen.guru. Эксперт по монетизации и продвижению на Дзен. Автор курса «Старт на Дзен 2026».

Комментарии

Читайте также

Разработчик на Rust нашёл баг в Neural Engine Apple, который пропустил Claude Opus
ai

Разработчик на Rust нашёл баг в Neural Engine Apple, который пропустил Claude Opus

Компания Apple не выпускала Neural Engine как новый продукт: речь о глубоком техническом разборе уже существующего аппаратного блока, который провёл…

6 мин
Markdown редактор MarkMello v0.4.0: папки, вкладки и поиск без потери скорости
ai

Markdown редактор MarkMello v0.4.0: папки, вкладки и поиск без потери скорости

Почему это важно Markdown-редактор MarkMello остался таким же быстрым при открытии одного файла, но теперь умеет работать с папками, вкладками и поиском, и всё…

5 мин
Безопасность ИИ-агентов под угрозой: три реальные атаки 2025 года и бесплатный щит
ai

Безопасность ИИ-агентов под угрозой: три реальные атаки 2025 года и бесплатный щит

ИИ-агенты всё чаще получают доступ к почте, платёжным данным и файлам пользователей, а список реальных атак на такие системы в 2025 и 2026 годах растёт…

6 мин