Технологии
«А что если адаптация — это модель?»: ShadowPEFT вошёл в библиотеку 🤗 PEFT и научился работать без базового backbone
Метод, который заменяет набор независимых low-rank правок отдельной обучаемой сетью с собственным состоянием, добавлен в main-ветку PEFT и, по словам авторов, войдёт в следующий релиз библиотеки. На GSM8K он обошёл LoRA и DoRA (48,1% против 46,9% и 46,2%) при меньшем числе обучаемых параметров и чекпойнте 26,0 МБ вместо 36,7 МБ, но заплатил за это пиковой памятью — 28,2 ГБ против 22,3 ГБ.

Метод вошёл в библиотеку, а не остался отдельным репозиторием
15 сентября 2026 года в блоге Hugging Face вышел разбор метода ShadowPEFT: авторы работы — Zongxi Li, Xianming Li, Tsz-fung Andrew Lee, Jing Li, Haoran Xie и Qing Li — описывают его как полноценный метод первого класса в библиотеке 🤗 PEFT. К моменту публикации код уже влит в main-ветку PEFT и, по словам авторов, войдёт в следующий релиз библиотеки; до релиза его предлагается ставить напрямую из GitHub командой pip install --upgrade git+https://github.com/huggingface/peft.git.
Интеграция подтверждается независимо от самого поста: в репозитории huggingface/peft в ветке main есть отдельный каталог src/peft/tuners/shadow, а в справочнике PEFT появилась страница ShadowPEFT. Состав каталога соответствует остальным tuner-подпакетам: config.py, layers.py, model.py и diffusion_models.py. Страница документации относится к версии main и требует установки из исходников, то есть описывает метод до его попадания в стабильные выпуски.
Публикация — авторский разбор, а не продуктовый анонс: это Community Article в блоге Hugging Face, а не релиз самой платформы. Все приведённые в ней числа получены авторами метода и на одной конфигурации оборудования.
Почему это не LoRA: адаптация как состояние
Классические low-rank методы описывают адаптацию как набор независимых обновлений отдельных весов и при этом не поддерживают явного task-specific состояния, которое обновлялось бы и переиспользовалось по всей глубине сети. Из этого авторы выводят вопрос, положенный в основу работы: может ли состояние быть у самой адаптации.
В ShadowPEFT рядом с замороженным backbone работает компактная обучаемая «теневая» сеть (shadow model) с постоянным скрытым состоянием, которое последовательно переходит от слоя к слою. На каждом слое Transformer выполняются три операции. Shadow injection переносит расхождение между скрытым состоянием базового слоя и теневым состоянием через low-rank bottleneck и добавляет его ко входу блока; замороженный слой обрабатывает уточнённое представление; затем shadow update двумя небольшими MLP формирует кандидата и гейт, и состояние продвигается гейтед-остаточной смесью.
Авторы подчёркивают, что это не «боковая» ветка, а связанный двунаправленный обмен: shadow уточняет backbone, а backbone одновременно обновляет shadow. Обучаются при этом только теневые компоненты, базовая модель остаётся замороженной.
Адаптер, который можно отсоединить, но нельзя влить в веса
Практическое следствие архитектуры — метод не поддерживает слияние: вызовы merge, merge_adapter и merge_and_unload возвращают явную ошибку, потому что адаптация является зависящей от данных траекторией в пространстве слоёв, а не статичной дельтой для весов. Вместо merge-пути предлагается обратный: model.base_model.unload_shadow() возвращает отдельную модель DetachedShadowModel, которую можно запускать без базовой сети.
В самой работе это оформлено как возможность «shadow-only» инференса: поскольку теневая сеть обучается как полноценный предсказатель, её можно отвязать и выполнять без базовой модели, а также инициализировать из небольшого предобученного чекпойнта. В примере авторы показывают тот же вход, что и у LoRA — ShadowConfig и get_peft_model(model, ShadowConfig(...)), — а сохранение и загрузка адаптеров идут через обычные save_pretrained и from_pretrained.
Ограничения названы прямо: одновременно активным может быть только один адаптер, поскольку теневое состояние — это одна траектория через сеть; для моделей Diffusers автономная выгрузка теневой сети не поддерживается.
Числа: арифметика на GSM8K и DreamBooth на FLUX
Авторы сравнили метод с LoRA и DoRA на одной машине (NVIDIA A100 80 ГБ) и с гиперпараметрами по умолчанию. На Llama-3.2-3B с обучением на MetaMathQA и оценкой по GSM8K ShadowPEFT дал 48,1% точности против 46,9% у LoRA и 46,2% у DoRA при 8,66M обучаемых параметров против 9,18M и 9,29M соответственно.
Плата за это — пиковая память: 28,2 ГБ против 22,3 ГБ у LoRA, потому что теневая сеть выполняет forward на каждом токене и держит двойной KV-кэш; авторы называют это ожидаемой ценой механизма постоянного состояния и отмечают, что её можно снизить, уменьшив теневую сеть. Зато чекпойнт заметно меньше: 26,0 МБ против 36,7 МБ.
На генерации изображений (FLUX.2-klein-base-4B, стандартный DreamBooth-набор примерно из 20 фотографий одной кошки) заявлено превосходство по всем метрикам: DINO-сходство 0,717 против 0,671 и 0,682, дрейф на посторонних промптах 0,244 против 0,274 и 0,250, время обучения 8 минут против 10 и 17, пиковая память 10,3 ГБ против 10,8 и 12,7, чекпойнт 74,5 МБ против 153 и 157 МБ.
Что это меняет на практике и чего в публикации нет
Разбор позиционирует метод как вариант для случаев, когда важнее качество, а не минимум памяти, и как способ переиспользовать небольшой чекпойнт: теневую сеть можно инициализировать отдельной небольшой моделью вместо уменьшенной копии базовой, что, по наблюдениям авторов, ускоряет сходимость. Рекомендуемые стартовые значения гиперпараметров — ранг инжекции 8 или 16, shadow_dropout 0,2 и shadow_alpha 0,1.
При этом числа получены на одной конфигурации и на одном наборе задач, независимого воспроизведения в публикации нет; латентность инференса отдельно не измерялась, а про двойной KV-кэш сказано лишь как про источник дополнительной памяти. Сравнение ограничено LoRA и DoRA — другими семействами PEFT-методов авторы метод не проверяли.
У работы есть отдельная статья на arXiv — ShadowPEFT: Shadow Network for Parameter-Efficient Fine-Tuning, arXiv:2604.19254; первая версия появилась 21 апреля 2026 года, обновлённая — 11 сентября 2026 года. Тот же материал авторы выложили и на китайском языке. Интеграцию в библиотеку они отдельно благодарят доктора Benjamin Bossan.
Первоисточники
- Hugging Face Blog — «What If the Adaptation Were a Model? ShadowPEFT in 🤗 PEFT library», Community Article (15 сентября 2026)
- Hugging Face PEFT documentation (main) — ShadowPEFT
- arXiv:2604.19254 — ShadowPEFT: Shadow Network for Parameter-Efficient Fine-Tuning (v2, 11 сентября 2026)
- GitHub huggingface/peft — каталог src/peft/tuners/shadow в ветке main
- Hugging Face Blog — китайская версия той же публикации ShadowPEFT
- GitHub API — состав каталога src/peft/tuners/shadow в ветке main (config.py, layers.py, model.py, diffusion_models.py)