Hugging Face предложила Model Integration Contracts: мини-модели на CPU ловят баги Transformers
Команда Hugging Face Transformers опубликовала в блоге подход Model Integration Contracts (MIC, «контракты интеграции модели») и предложенный стандарт transformers-mic. Идея: вместо запуска тяжёлых интеграционных тестов с реальными чекпойнтами на каждом pull request (PR) гонять тесты на сильно уменьшенной копии модели на дешёвом CPU-раннере.
Поводом стал конкретный баг. 30 июля 2026 года в Transformers включили для T5 scaled dot-product attention (SDPA) из PyTorch. Побочным эффектом стало то, что декодер UMT5 мог обращаться к будущим токенам: при обучении он «подглядывал» ответ, который должен был предсказать. Ничего не падало, и баг почти два месяца оставался в main (исправление вышло 28 сентября). Когда авторы позже прогнали зафиксированные MIC по пятимесячной истории коммитов, маленькая модель UMT5 на CPU сигнализировала о проблеме на каждом коммите с регрессией. Метки log-probabilities отличались от проверенного эталона на 1,22, а потери при обучении, примерно на 0,20.
Почему баги доходят до main. Transformers поддерживает более 750 типов моделей; в main запускается более 88 000 CPU-тестов, а ежедневный прогон включает более 200 000 GPU-тестов. Интеграционные тесты грузят реальные чекпойнты и работают на реальном железе, поэтому гонять их на каждом PR значило бы весь день держать занятыми множество GPU. Плановый запуск находит регрессию, когда она уже может быть в main. Тестовая модель (фикстура) строится по конфигурации реального чекпойнта: слоёв меньше и они уже, но представлены все виды слоёв, а файлы токенизатора и процессора остаются без изменений. В исследовании авторов экспериментальная фикстура UMT5 весила 66 МБ против 1227 МБ у исходного чекпойнта. Так можно проверять и очень большие модели, которые не помещаются на стандартные GPU-раннеры. Фикстуры не заменяют полные интеграционные тесты, но дают шанс поймать баги до main. Простая проверка «загрузили и сделали прямой проход» тут не помогла бы: баг UMT5 такой проход прошёл бы без проблем.
Из чего состоит MIC. Три части: (1) фикстура, уменьшенная модель, опубликованная один раз и закреплённая по версии; (2) путь использования, запускаемый пример в Markdown (например, генерация текста или шаг обучения); (3) эталонные значения (baselines), результаты запуска этого примера, проверенные человеком. Контракт выполняется, если запуск примера на фикстуре по-прежнему даёт эталон. Контракт относится к архитектуре и сценарию, а не к одному чекпойнту: совместимые чекпойнты делят фикстуру, но у каждого свои ожидаемые результаты. Контракты публикуются в huggingface-mic. Для SmolLM, например, генерация по запросу «The capital of France is» сравнивается с записанными ID токенов; дополнительно сверяются потери при обучении, конечность градиентов и то, что шаг оптимизатора меняет веса. Набор данных на Hub закрепляет каждый MIC за замороженной ревизией вместе с версиями пакетов, на которых записаны эталоны; каждый запуск CI фиксирует использованную ревизию. На PR контракты выбираются по изменённым файлам.
Урок про UMT5: контракт шёл через SDPA, путь внимания по умолчанию. Запуск только варианта eager attention баг пропустил. Фикстура полезна, только если проходит тот же код, что и реальный чекпойнт. Затем авторы откатили исправление в отдельной проверочной ветке в CI Transformers: проверка упала с теми же расхождениями, а шаг раннера для выбранного контракта T5 занял 13,4 секунды на CPU без учёта подготовки.
Как уменьшают модели. Рецепт из четырёх шагов: (1) сократить конфигурацию, размеры скрытых слоёв, число голов внимания и глубину, сохранив разные виды слоёв (смесь скользящего и полного внимания, плотные слои и MoE); (2) оставить предобработку неизменной, словарь, спецтокены, размерности входов, файлы токенизатора и процессора копируются побайтно; (3) построить и проверить веса: сначала случайные с фиксированным seed, а если модель не реагирует на изменение входа, дообучить на небольшом наборе примеров контракта; затем перезагрузить и убедиться, что выходы, потери и градиенты конечны, а неудачные сборки отбрасываются; (4) заморозить и записать: сохранить веса, измерить повторяемые выходы на заведомо рабочей сборке Transformers, проверить эталоны для каждой платформы и точности и опубликовать закреплённый снимок. Формат файла исходных весов сохраняют, чтобы не пропускать код конвертации, который срабатывает при загрузке реального чекпойнта. Пример: Llama 4 Scout сжат со 108,6 млрд до 44,7 млн параметров; зрение, с 34 слоёв до 2, языковая часть, с 48 до 4.
Агенты. CLI-инструмент tmic создаёт контракт и собирает фикстуру. Для новой модели LLM пишет черновик кода использования и манифеста, а CPU- и GPU-запуски измеряют кандидатные эталоны; LLM не одобряет, изменение ожиданий требует проверки человеком. Авторы использовали агентов для сборки MIC по разным семействам моделей, а при краевых случаях правили сам рецепт, а не одну фикстуру. Попробовать локально можно командой tmic run org/model --local-only --fixtures-only --no-history --bill-to '' после установки transformers-mic[runtime]; инструмент остановится до загрузки чего-либо, а черновик для новой модели LLM делает через Inference Providers за счёт вашего аккаунта.
Случайные веса против дообученных. Фикстура Whisper со случайными весами почти не реагировала на изменения аудио. Её дообучили на нескольких тонах, сопоставленных словам вроде «red» и «green» (не ради распознавания речи, а чтобы изменения звука были видны на выходе). В исследовании инициализации весов случайные фикстуры Whisper поймали 18 из 24 внесённых искусственных неисправностей, дообученные, все 24. Но результат не решает вопрос, что лучше: неисправности были синтетическими, а реальной регрессии, которую поймала бы только дообученная версия, авторы не нашли. Обе версии пропустили баг помощи при декодировании (assisted decoding), который обнаружил реальный чекпойнт Whisper. Поэтому случайные веса оставляют, если проверки проходят, а дообучение применяют, когда нужна чувствительность или читаемые ответы; оно занимает секунды, но добавляет шаг, который может не сойтись, и ещё одну вещь для поддержки.
Открытые вопросы. На 1 ноября 2026 года задача MIC в CI Transformers сообщает об ошибках, но не блокирует PR. Решение зависит от неизмеренного: сколько реальных багов она ловит на PR, а не только в прогонах по истории; как часто даёт ложные тревоги; сколько труда занимает проверка эталонов. Покрытие пока частичное по семействам моделей и по API. Существующие тесты сохранятся, пока их покрытие не будет учтено. Планируется связать страницы оригинальных моделей на Hub с их MIC, чтобы разработчик или агент мог начать с проверенного на этом чекпойнте примера. Авторы зовут выбрать непокрытую модель в coverage space, попробовать tmic и предложить путь использования или проверить сгенерированный контракт.
Ключевые факты
- Hugging Face предлагает стандарт transformers-mic: контракт из закреплённой уменьшенной модели (фикстуры), запускаемого примера использования и проверенных человеком эталонов; тесты идут на дешёвом CPU-раннере.
- Включение SDPA для T5 30 июля 2026 года позволило декодеру UMT5 видеть будущие токены при обучении; без сбоев баг почти два месяца оставался в main, а маленькая фикстура UMT5 флагировала его на каждом коммите при прогоне по пяти месяцам истории (расхождение log-probabilities меток 1,22, потерь около 0,20).
- В CPU-исследовании фикстура UMT5 весила 66 МБ против 1227 МБ у исходного чекпойнта; Llama 4 Scout уменьшена со 108,6 млрд до 44,7 млн параметров.
- В тесте с искусственными неисправностями случайные фикстуры Whisper поймали 18 из 24, дообученные, все 24, но авторы не считают вопрос решённым, а обе версии пропустили реальный баг assisted decoding.
- На 1 ноября 2026 года MIC в CI Transformers пока только сообщает об ошибках и не блокирует PR; покрытие частичное.
Почему это важно
Transformers поддерживает более 750 типов моделей, а полные интеграционные тесты на реальных чекпойнтах слишком дороги для каждого PR, поэтому регрессии находят уже в main. История с UMT5 показывает худший вариант: ничего не падало, обучение просто становилось некорректным, и баг прожил почти два месяца. Подход MIC пытается сдвинуть проверку к моменту PR и делать это на CPU, в том числе для моделей, которые не помещаются на стандартные GPU-раннеры.
Кому это важно
Прежде всего тем, кто интегрирует модели в Transformers и сопровождает их тесты, и командам, у которых похожая проблема: слишком тяжёлые тесты для запуска на каждом изменении. Также интересно тем, кто использует агентов для генерации тестов: здесь LLM только пишет черновик кода использования и манифеста, а эталоны утверждает человек.
Как это применить
Авторы приводят команду для локального запуска: после установки transformers-mic[runtime] и входа в hf auth login выполнить tmic run org/model с флагами --local-only --fixtures-only --no-history --bill-to ''. Инструмент составит черновик контракта, соберёт фикстуру и запишет эталоны на вашей машине, запрашивая подтверждение на каждом шаге, и остановится до загрузки чего-либо. Для новой модели черновик делает LLM через Inference Providers за счёт вашего аккаунта. Практический урок из рецепта: сохранять все виды слоёв, не менять токенизатор и формат весов, а тестовый путь вести тем же кодом внимания, что используется по умолчанию (в случае UMT5 вариант eager баг пропустил).
Можно ли доверять
Все цифры взяты из самого поста и представляют собственные замеры команды Transformers; отдельные авторы в тексте не названы. Результат по UMT5 получен при воспроизведении на заранее известной регрессии, то есть показывает, что фикстура способна поймать такой баг, но не сколько реальных багов она ловит на новых PR: сами авторы называют это неизмеренным. Данные по Whisper (18 из 24 против 24 из 24) относятся к синтетическим неисправностям, и авторы прямо пишут, что они не решают вопрос о лучшем способе задания весов. Цифра 66 МБ против 1227 МБ относится к экспериментальной фикстуре UMT5 в CPU-исследовании, а не к размеру фикстур вообще.
Риски и подводные камни
Фикстуры не заменяют полные интеграционные тесты: обе версии Whisper пропустили баг assisted decoding, который показал реальный чекпойнт. Дообучение фикстур добавляет шаг, который может не сойтись, и ещё одну вещь для поддержки; ложные срабатывания и трудоёмкость проверки эталонов пока не измерены. Покрытие остаётся частичным по семействам моделей и API, а MIC-задача в CI пока не блокирует PR; когда это изменится, в тексте не сказано. Контракт защищает только то, что описано в пути использования: пропущенный сценарий придётся добавлять после того, как регрессия проскочит.
«LLM пишет черновик, но не одобряет. Изменение ожиданий требует проверки человеком.»
— Авторы блога Hugging Face «Transformers Model Integration Contracts»