Skip to content

HermanDp45/ML_Contest_2026

Repository files navigation

Информационная система генерации белковых структур

Веб-система для генерации и анализа белковых структур. Пользователь задаёт параметры; латентная диффузионная модель формирует структурное латентное представление, структурный декодер восстанавливает по нему трёхмерную структуру в формате PDB; результат сохраняется и доступен в личном кабинете.

Проект выполнен как выпускная квалификационная работа (МГТУ им. Н. Э. Баумана, 2026): исследование латентной диффузии в структурном пространстве белка, доведённое до сервиса. Генеративное ядро построено на двух адаптированных внешних компонентах — автокодировщике SALAD и латентной диффузии DiMA; что именно изменено, описано в разделе «Использованные компоненты и вклад автора».

Содержание

Обзор

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

В основе — латентная диффузия. Генерация идёт не в сырых координатах атомов, а в структурных латентах автокодировщика SALAD: геометрия белкового остова уже заложена в связку энкодера и декодера, поэтому диффузионной модели не нужно напрямую задавать инвариантность к поворотам и переносам или контролировать координатные ограничения на каждом шаге. Модель порождает латент белка нужной длины, а декодер восстанавливает по нему полноценную 3D-структуру. Такой подход даёт качество выше, чем у генерации «в координатах»: mmFID 1.03 млн против 3.27 млн у Proteina 60M notri при сопоставимой скорости.

Модель доведена до полноценного веб-приложения: регистрация и личный кабинет, проекты как рабочие пространства для серии экспериментов, постановка генерации в очередь, хранение результатов и просмотр структур в браузере через встроенный Mol* viewer. Сценарий сквозной — от входа до готовой структуры с метриками и выгрузкой в PDB/FASTA, в одном интерфейсе.

Результаты

Финальное сравнение проводилось по mmFID, млн: чем ниже значение, тем ближе распределение сгенерированных структур к референсному набору.

Базовая модель Proteina: статья Proteina: Scaling Flow-based Protein Structure Generative Models, репозиторий NVIDIA-BioNeMo/proteina. Числа Proteina ниже не перенесены из статьи напрямую: структуры были сгенерированы автором с использованием публичной реализации и опубликованных весов Proteina, а затем пересчитаны тем же mmFID-пайплайном, что и итоговая модель: тот же диапазон длин 128-254, тот же референсный набор, тот же экстрактор признаков и тот же размер оценочной выборки. Сравнение дополнительно опирается на близкую природу данных: итоговая модель обучалась с использованием AFDB, и Proteina также публикуется как модель, обученная на AFDB. Так результат не смешивает метрики из разных статей и показывает качество в одном оценочном протоколе.

Модель / конфигурация mmFID, млн ↓ Комментарий
Разработанная модель: AFDB -> PDB+AFDB, cosine 1.03 финальная конфигурация системы
AFDB latent, cosine 0.86 лучший отдельный mmFID, но хуже итоговый баланс переносимости и устойчивости
Proteina 60M, notri 3.27 пересчитано тем же mmFID-протоколом
Proteina 200M, notri 3.56 пересчитано тем же mmFID-протоколом
Proteina 200M, tri 3.63 пересчитано тем же mmFID-протоколом
Random values 29.00 случайный базовый уровень финального протокола

Финальная конфигурация выбрана не только по одному числу mmFID. Для веб-системы важны также переносимость между AFDB и PDB, устойчивость декодировщика к шуму и поведение латентных представлений при интерполяции: структура должна не только выглядеть хорошо в метрике, но и стабильно декодироваться в PDB для пользовательского сценария.

Примеры сгенерированных структур:

Generated protein example 1 Generated protein example 2 Generated protein example 3 Generated protein example 4

Целевая аудитория и назначение

Целевая аудитория MVP — студенты, исследователи и ML-инженеры, которые работают с protein design и хотят быстро проверять идеи без ручной сборки разрозненных скриптов. Типичный сценарий: задать длину белка, получить PDB, увидеть базовые метрики, открыть структуру в 3D и сохранить результат в рамках проекта.

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

Продуктовые гипотезы MVP:

  • единый интерфейс сокращает путь от генерации до визуальной проверки структуры;
  • хранение результатов в проектах снижает риск потерять параметры эксперимента;
  • 3D-просмотр и экспорт PDB/FASTA делают модель полезной не только в notebook, но и в рабочем процессе исследователя.

Использованные компоненты и вклад автора

Генеративное ядро опирается на два внешних проекта; оба адаптированы под задачу генерации структур (а не последовательностей). Здесь — что взято и что изменено.

Внешние компоненты (с благодарностью авторам):

Что сделано в этой работе (хронология):

  1. Автокодировщик (SALAD). Адаптированы загрузчики и конвейер данных; обучение в нескольких режимах (PDB / AFDB / смешанное / предобучение на AFDB с дообучением на смеси PDB+AFDB); увеличено число соседей в геометрическом внимании; латент 320 на остаток. Выбор конфигурации — по реконструкции, поведению латента при интерполяции и устойчивости декодера к шуму. Итог: RMSD Cα 0.121 на AFDB. Детали и команды — в SaladEncoderTraining/README.md.
  2. Диффузия (DiMA). Латентное пространство заменено с эмбеддингов белковой языковой модели на структурные латенты автокодировщика; модель переобучена в нём. Шумовое расписание заменено с tan-10 на косинусное — оно согласуется с областью устойчивого декодирования и снизило mmFID для обеих проверенных конфигураций. Детали — в DiMA_structure/README.md.
  3. Информационная система. Полностью авторская: FastAPI + Celery/Redis + SQLite, React + Mol*, личный кабинет, проекты, очередь генерации, метрики, 3D-просмотр (inf_sys_for_prot_gen/).
  4. Оценка. Сравнение с Proteina: сэмплы Proteina были сгенерированы отдельно и пересчитаны тем же mmFID-пайплайном. Финальный результат: 1.03 млн против 3.27 млн у Proteina 60M notri.
  5. AI-инструменты в разработке. Cursor использовался как постоянная среда ассистированной разработки; Claude, Codex и GPT — для ревью кода, черновиков MVP-компонентов, диагностики конфигов, анализа дополнительных результатов и поиска справочной информации. Научная постановка, выбор данных, обучение моделей, интерпретация метрик и финальные инженерные решения оставались за автором.

README в каталогах DiMA_structure/ и SaladEncoderTraining/ — технические инструкции по обучению/инференсу соответствующих компонентов; в начале каждого указано происхождение и внесённые изменения.

Лицензии и сторонний код

Авторский код информационной системы и конкурсной интеграции распространяется по Apache-2.0, см. LICENSE. Сторонние компоненты сохраняют собственные лицензии и атрибуцию:

  • SALAD — Apache-2.0, оригинал: mjendrusch/salad, локальная лицензия: SaladEncoderTraining/SaladTraining/LICENSE.
  • DiMA — MIT, оригинал: MeshchaninovViacheslav/DiMA, локальная лицензия: DiMA_structure/LICENCE.
  • Proteina не входит в кодовую базу проекта и используется только как базовая модель для оценки; её репозиторий распространяется по NVIDIA License с ограничением на non-commercial research/evaluation use.
  • Mol* используется как браузерный viewer структур; пакет molstar 5.5.0 указан в package-lock.json с лицензией MIT.

Краткая сводка вынесена в THIRD_PARTY_LICENSES.md.

Возможности

  • Генерация структуры по длине. Задаётся имя и длина цепи (50–254 остатка), модель возвращает 3D-структуру и последовательность.
  • Загрузка своих PDB. Готовую структуру можно загрузить и анализировать в том же интерфейсе наравне со сгенерированными.
  • Проекты. Эксперименты группируются в проекты с описанием и параметрами — удобно вести несколько линий дизайна параллельно.
  • Асинхронная очередь. Генерация выполняется воркером Celery через Redis, интерфейс не блокируется; при отсутствии очереди backend считает синхронно.
  • Метрики структуры. Для каждой структуры считаются длина, число атомов и цепей, радиус инерции (Rg), статистики CA-CA расстояний, время генерации.
  • 3D-просмотр и выгрузка. Просмотр в Mol* viewer, экспорт в PDB и FASTA.
  • Светлая и тёмная темы.

Интерфейс

Рабочая панель — личный кабинет и список проектов:

Рабочая панель (тёмная тема)

Рабочее пространство проекта: параметры, список структур с метриками, переходы к генерации и загрузке:

Рабочее пространство проекта

Форма генерации — имя и длина цепи:

Генерация структуры

Просмотр результата в Mol* viewer: 3D-структура, характеристики и последовательность в FASTA:

Просмотр сгенерированной структуры

Дополнительные экраны (вход, регистрация, светлая тема, создание проекта, загрузка PDB) — в каталоге docs/images/.

Архитектура

Система состоит из трёх компонентов, связанных в единый поток генерации:

Компонент Каталог Назначение
Информационная система inf_sys_for_prot_gen/ Веб-приложение: React, FastAPI, SQLite, Celery, Redis
Модель генерации DiMA_structure/ Латентная диффузия; запускается через generate_structure.py
Декодер структуры SaladEncoderTraining/SaladTraining/ Декодер SALAD; импортируется моделью через PYTHONPATH

Последовательность вызовов при генерации:

React (frontend)
  -> FastAPI (inf_sys_for_prot_gen/backend/main.py)
     -> Celery worker + Redis (backend/celery_worker.py)
        -> backend/services/protein_generation.py
           -> backend/integrations/dima_client.py
              -> DiMA_structure/generate_structure.py
                 -> DiMA (диффузия) + SALAD (декодер структуры)

Если Redis и Celery не запущены, backend выполняет генерацию синхронно.

Пайплайн обучения

Раздел выше описывает инференс. Обучение состоит из двух стадий — сначала автокодировщик структуры, затем диффузия в его латентном пространстве:

PDB / AFDB (исходные структуры)
  → препроцессинг: PDB/CIF → NPZ, кластеризация, исключение валидации
      (SaladEncoderTraining/SaladTraining/data/allpdb/{pdb2npz,cif2npz}.py)
  → обучение автокодировщика (SALAD)
      предобучение на AFDB:   training/train_structure_autoencoder_afdb.py
      дообучение на смеси:    training/train_structure_autoencoder_mixed.py
  → оценка автокодировщика:   evaluating/eval_structure_autoencoder*.py
  → кодирование структур в латенты + статистики нормализации
      (DiMA_structure: src.datasets.salad_outs_to_dt, src.preprocessing.calculate_statistics_salad)
  → обучение диффузии (DiMA):  DiMA_structure/train_diffusion.py  (косинусное расписание)
  → оценка генерации по mmFID
  → инференс:                  DiMA_structure/generate_structure.py → PDB

Выбор конфигурации автокодировщика и шумового расписания, а также численные результаты (RMSD Cα 0.121, mmFID 1.03 млн против 3.27 млн у Proteina 60M notri) описаны в разделе «Использованные компоненты и вклад автора». Команды обучения и оценки с пояснением флагов — в SaladEncoderTraining/README.md и DiMA_structure/README.md.

Воспроизводимость

  • Окружение — единое conda-окружение vkr из DiMA_structure/environment.yaml плюс пины из setup/conda_setup.md (Python 3.10, PyTorch 2.5.1, JAX 0.5.0, numpy 1.26.1, pandas 2.1.2, protobuf 3.20.3, setuptools 69.5.1, mlflow 2.14.1).
  • Сид — фиксированный seed: 42 (конфиги диффузии и обучение автокодировщика).
  • Логирование экспериментов — MLflow и TensorBoard; конфигурация обучения диффузии управляется через Hydra (DiMA_structure/src/configs/), что позволяет повторять прогоны по сохранённому конфигу.
  • Конфигурация генерации — пути к весам и параметры заданы переменными среды (см. «Переменные среды»), а не правкой кода.
  • Ограничение — веса, полные PDB/AFDB-датасеты и промежуточные латенты не хранятся в git из-за размера и условий распространения. Репозиторий фиксирует код, конфиги, протокол оценки и структуру артефактов; для точного воспроизведения генерации нужны внешние чекпоинты, перечисленные ниже.

Требования

  • GPU NVIDIA с поддержкой CUDA 12.
  • conda и mamba.
  • Node.js 20 (устанавливается через conda на шаге установки).

Полная пошаговая инструкция приведена в setup/conda_setup.md. Ниже дана краткая последовательность; выполнять установку следует по setup/conda_setup.md.

Установка

Два способа: контейнеры (быстрый старт) или ручная установка в conda.

Вариант A. Docker Compose

Поднимает все сервисы (backend, Celery, Redis, frontend) одной командой:

docker compose up --build

UI — http://localhost:3000, API — http://localhost:8000. Образ собирается по Dockerfile и повторяет шаги setup/conda_setup.md. Для реальной генерации нужен GPU NVIDIA (nvidia-container-toolkit) и веса моделей: раскомментируйте блоки deploy.resources и монтирование каталога с чекпоинтами в docker-compose.yml. Без GPU и весов поднимается рабочий веб-интерфейс (регистрация, проекты, загрузка PDB, просмотр), кроме самой генерации.

Вариант B. Ручная установка (conda)

Все компоненты используют одно окружение conda с именем vkr (Python 3.10, PyTorch 2.5.1, JAX 0.5.0).

# 1. Базовое окружение из conda-спецификации DiMA
mamba env create -f DiMA_structure/environment.yaml -n vkr
conda activate vkr

# 2. Python-зависимости DiMA (torch, biopython, flax, gemmi и др.)
# 3. JAX CUDA 12 версии 0.5.0
# 4. dm-haiku 0.0.14, flexloop
# 5. Зависимости backend (шаг 7 в setup/conda_setup.md)
# 6. Node.js 20 и зависимости frontend (npm install)
# 7. Фиксация версий: numpy 1.26.1, pandas 2.1.2, protobuf 3.20.3, setuptools 69.5.1
# 8. mlflow 2.14.1, redis-server

Шаги 2–8 приведены полностью и в требуемом порядке в setup/conda_setup.md. Установленное окружение vkr соответствует этой инструкции.

Переменные среды

Переменные перечислены в inf_sys_for_prot_gen/dima_conda_vars.txt и загружаются в окружение vkr как постоянные. При развёртывании на другой машине достаточно заменить в этом файле абсолютные пути на свои (каталог установки проекта) и переприменить переменные командой ниже:

conda activate vkr
mapfile -t VARS < <(grep -vE '^\s*(#|$)' inf_sys_for_prot_gen/dima_conda_vars.txt)
conda env config vars set -n vkr "${VARS[@]}"
conda deactivate && conda activate vkr

Основные переменные: DIMA_REPO_DIR, DIMA_GENERATE_SCRIPT, DIMA_STRUCTURE_DECODER_PATH, DIMA_STATISTICS_PATH, DIMA_CHECKPOINTS_PREFIX, DIMA_CHECKPOINT_NAME, SALAD_ROOT, PYTHONPATH, REDIS_URL.

UPLOAD_DIR задаёт каталог для загруженных пользователем PDB-файлов (по умолчанию inf_sys_for_prot_gen/uploads). Значение абсолютное и имеет приоритет над путём из config.py, поэтому при развёртывании его также следует указать под свой каталог установки.

Веса моделей в репозитории не хранятся (исключены .gitignore как тяжёлые артефакты). Пустые каталоги под них оставлены с файлом .gitkeep, чтобы структура сохранялась после клонирования; нужные файлы кладутся в них вручную. При генерации используются три файла в DiMA_structure/src/checkpoints/:

Файл Размер Назначение
dima-salad-ft200k-400000.pth 506 МБ Веса диффузионной модели DiMA
checkpoint-200000.jax 35 МБ Декодер SALAD
encodings-afdb_prime_finetune_checkpoint-200000.pth 4 КБ Статистики нормализации

Смена чекпоинтов

Все веса задаются переменными окружения, а не правкой config.yaml. Поля decoder_checkpoints_folder и statistics_folder из config.yaml при веб-генерации не используются: dima_client.py перекрывает их через оверрайды Hydra, которые имеют приоритет над значениями из yaml.

Что меняется Переменная Значение
Диффузионные веса DiMA DIMA_CHECKPOINTS_PREFIX + DIMA_CHECKPOINT_NAME имя подпапки и номер шага, не путь
Декодер SALAD (.jax) DIMA_STRUCTURE_DECODER_PATH абсолютный путь к файлу
Статистики (.pth) DIMA_STATISTICS_PATH абсолютный путь к файлу

Диффузионный чекпоинт задаётся не путём, а парой prefix + name; файл должен физически находиться по адресу:

DiMA_structure/checkpoints/diffusion_checkpoints/<DIMA_CHECKPOINTS_PREFIX>/<DIMA_CHECKPOINT_NAME>.pth

Декодер и статистики указываются абсолютным путём в произвольном расположении.

Порядок применения изменений:

# 1. изменить значения в источнике
inf_sys_for_prot_gen/dima_conda_vars.txt

# 2. переприменить переменные в окружение vkr
conda activate vkr
mapfile -t VARS < <(grep -vE '^\s*(#|$)' inf_sys_for_prot_gen/dima_conda_vars.txt)
conda env config vars set -n vkr "${VARS[@]}"
conda deactivate && conda activate vkr

# 3. перезапустить backend и Celery (переменные читаются из окружения при старте)

Файл dima_conda_vars.txt во время работы не читается; он служит только источником для команды conda env config vars set.

Запуск

Запускаются четыре процесса, каждый в отдельном терминале; в каждом терминале предварительно выполняется conda activate vkr.

# 1. Backend (FastAPI), API на http://localhost:8000
cd inf_sys_for_prot_gen
uvicorn backend.main:app --reload --host 0.0.0.0 --port 8000

# 2. Frontend (React), интерфейс на http://localhost:3000
cd inf_sys_for_prot_gen/frontend
HOST=0.0.0.0 npm start

# 3. Redis (брокер для асинхронной генерации)
redis-server --port 6379

# 4. Celery worker
cd inf_sys_for_prot_gen
celery -A backend.celery_worker.celery worker \
  --loglevel=info --concurrency=1 --prefetch-multiplier=1 -Ofair

Тесты

Backend покрыт тестами API (health-проверки, регистрация/авторизация, проекты, изоляция доступа между пользователями). Они не требуют GPU и ML-стека:

pip install -r inf_sys_for_prot_gen/backend/requirements.txt pytest httpx
cd inf_sys_for_prot_gen
python -m pytest

Линт и тесты также прогоняются в CI (.github/workflows/ci.yml) на каждый push и PR.

Структура репозитория

ML_Contest_2026/
├── README.md
├── Dockerfile, docker-compose.yml   контейнеризация всех сервисов
├── ruff.toml                        конфигурация линтера
├── .github/workflows/ci.yml         CI: линт backend + тесты + сборка frontend
├── inf_sys_for_prot_gen/            информационная система (веб-приложение)
│   ├── backend/                     FastAPI, Celery, integrations/dima_client.py
│   │   ├── requirements.txt         runtime-зависимости backend
│   │   └── tests/                   тесты API (pytest)
│   ├── frontend/                    React и Mol* viewer
│   ├── dima_conda_vars.txt          переменные среды (локальный, в .gitignore)
│   └── docs/                        схемы архитектуры (.drawio)
├── DiMA_structure/                  диффузионная генерация
│   ├── generate_structure.py        точка входа, вызываемая backend
│   ├── train_diffusion.py           обучение диффузии
│   ├── src/                         код DiMA, configs/ (Hydra)
│   ├── checkpoints/, src/checkpoints/   каталоги под веса (.gitkeep; веса не в git)
│   └── environment.yaml             conda-спецификация окружения vkr
├── SaladEncoderTraining/            автокодировщик структуры (на базе SALAD)
│   ├── SaladTraining/               modules/ (импортируются DiMA), training/, evaluating/
│   └── models/                      каталог под веса (.gitkeep; веса не в git)
└── setup/
    └── conda_setup.md               пошаговая инструкция по установке

About

Латентная диффузия для генерации 3D-структур белков (SALAD-автокодировщикprotein-design + DiMA) с веб-системой генерации, хранения и 3D-просмотра. ВКР, МГТУ им. Баумана, 2026.

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages