GigaAM-Multilingual large_ctc перенесена с PyTorch на MLX для запуска на Apple Silicon. Порт включает четыре варианта весов: FP16, INT8, INT6 и INT4.
Сравнение показывает, сколько места и памяти требует каждый вариант, как быстро он распознает речь и где снижение разрядности меняет текст. Первый аудиопример содержит единственное расхождение INT8 с FP16 на выборке из 255 русских записей.
Единственное расхождение INT8 с FP16 на этой выборке
- Эталон
- Отбивающие мячи среднего звена Сачин Тендулкар и Рахул Дравид хорошо выступили и заработали в тандеме результат в сто баллов.
- FP16 · INT4
- Совпало с эталоном после нормализации.
- INT8 · INT6
- Оббивающие мячи среднего звена Сачин Тендулкар и Рахул Дравид хорошо выступили и заработали в тандеме результат в сто баллов.В эталоне: «отбивающие».
Главное кратко
Как разрядность весов влияет на текст
INT8 изменил одну из 255 расшифровок относительно FP16, INT6 изменил семь, INT4 изменил 31. Это число показывает отличия от FP16, а не обязательно ошибки относительно эталона. Два примера ниже показывают оба случая: изменение обычного слова и разные варианты записи названия группы.
Одно слово изменилось только в INT4
- Эталон
- Если вы хотите находиться рядом со сценой, вам нужно приехать заранее, чтобы найти место для кемпинга вблизи от музыки.
- FP16 · INT8 · INT6
- Совпало с эталоном после нормализации.
- INT4
- …чтобы найти место для кэмпинга вблизи от музыки.В эталоне: «кемпинга».
Разрядность изменила запись названия Aerosmith
- Эталон
- Группа Aerosmith отменила оставшиеся концерты в своем турне.
- FP16 · INT8
- Группа Аэросмит отменила оставшиеся концерты в своем турне.
- INT6
- Группа Айросмит отменила оставшиеся концерты в своем турне.
- INT4
- Группа Айро Смит отменила оставшиеся концерты в своем турне.Название разделилось на два слова.
Что находится внутри модели
GigaAM-Multilingual поддерживает русский, казахский, кыргызский, узбекский и английский языки. Для переноса выбран опубликованный вариант large_ctc. В нем около 600 млн параметров и 24 блока Conformer. Эти блоки находят связи в звуке. Затем CTC (Connectionist Temporal Classification) превращает их выход в последовательность символов без заранее заданной привязки каждого звука ко времени.
MLX выполняет вычисления на центральном и графическом процессорах Apple Silicon. Оба процессора используют общую память Mac. Чтобы порт вел себя как исходная модель, в MLX повторен весь путь звука: подготовка признаков, формы многомерных массивов, учет позиции, маскирование и преобразование результата в текст.
large_ctc
От звуковой волны к строке текста
- Звук одноканальный сигнал, 16 кГц
- Log-mel-спектрограмма частоты и их изменение во времени
- 2 сверточных слоя последовательность становится в 4 раза короче
- 24 блока Conformer FFNвниманиесверткаFFN
- Слой CTC вероятность каждого символа на каждом шаге
- Декодирование повторы и пустые символы удаляются, остается текст
- Звук Добавлен практический вход WAV, FLAC, MP3, M4A и видео; длинные записи делятся на фрагменты
- Признаки Переписано на MLX разбиение на окна, спектр и mel-фильтр сверены с PyTorch
- Сжатие времени Перенесены свертки формы тензоров, маски и расположение весов проверены отдельно
-
24 блока Conformer
Главная зона работы
перенесены все слои; линейные веса получили INT8, INT6 и INT4; отдельно измерены FFN, внимание и свертка
Проверены SDPA,
mx.compile(), длина фрагмента и пакетная обработка. - CTC Повторен выход модели логарифмы вероятностей и последовательность символов сверены с оригиналом
- Текст Собран готовый инструмент CLI, субтитры, Python API и локальный сервер с совместимым API
Рабочий порт должен выполнять четыре условия:
- для обычного распознавания достаточно MLX и библиотеки чтения аудио;
- версии FP32 и FP16 повторяют поведение исходной модели с допустимой численной погрешностью;
- все варианты проходят одни и те же публичные тесты;
- скорость, размер файла и память измеряются отдельно на одинаковых записях.
Основой работы служили официальная модель ai-sage/GigaAM-Multilingual и исходный код salute-developers/GigaAM. Готовая MLX-версия опубликована в репозитории ai-babai/gigaam-multilingual-mlx.
Как проверялось совпадение с исходной моделью
Конвертер читает официальный файл весов и сохраняет его в безопасном для загрузки формате safetensors. Само распознавание выполняется на MLX. PyTorch нужен только при конвертации и сравнении двух реализаций.
Сначала сравнивались промежуточные тензоры, то есть многомерные массивы чисел внутри модели. Проверка проводилась после каждого крупного этапа. Так место расхождения можно найти сразу, даже если итоговый текст случайно совпал.
- Зафиксировать источник версия кода, файл весов, предобработка
- Сравнить тензоры формы и численные отклонения после ключевых слоев
- Сравнить текст одинаковое декодирование на одинаковом аудио
- Проверить качество WER на закрепленных публичных наборах
Для проверки качества закреплены публичные списки примеров и единые правила подготовки текста: нижний регистр, удаление пунктуации и другие одинаковые преобразования. Исходная модель, FP16 и квантованные варианты получают одни и те же аудиозаписи и эталонные расшифровки. Первый русский набор содержит 1533 записи из FLEURS, Russian LibriSpeech и SOVA. Финальный набор multilingual-v1 использует по 1000 закрепленных примеров FLEURS для русского, казахского, кыргызского, узбекского и английского.
Бенчмарк запускался на MacBook Pro с M4 Pro и 48 ГБ общей памяти под macOS 15.7.7. Исходная PyTorch-версия использовала систему ускорения Apple MPS. Пятиминутный русский WAV обрабатывался после загрузки и короткого прогрева модели. Каждый вариант запускался в отдельном процессе.
WER показывает долю замененных, пропущенных и лишних слов. Значение около 5% можно читать как примерно пять исправлений на сто слов. Среднее для русского, казахского, кыргызского и узбекского языков в полном отчете называется Core macro WER.
В исходном JSON также сохранены CER (Character Error Rate, доля ошибок в символах) и RTF (Real-Time Factor, отношение времени обработки к длительности аудио). RTF меньше 1 означает, что модель работает быстрее реального времени. Во всех числовых колонках ниже меньшее значение лучше.
Как разрядность влияет на размер и скорость
FP16 хранит каждый вес модели в 16 битах. INT8, INT6 и INT4 используют меньше битов и поэтому занимают меньше места. При квантизации каждая группа из 64 весов получает общий масштаб, который позволяет приблизительно восстановить исходные значения. Обозначение g64 означает размер такой группы: 64 веса. Для всех четырех вариантов опубликованы отдельные веса, описание, контрольная сумма и закрепленная версия.
Пиковый RSS (Resident Set Size, резидентный размер процесса) показывает максимальный объем оперативной памяти, занятый процессом. В него входят модель, библиотеки и рабочие буферы.
Веса на диске
меньше лучше
Оперативная память
пиковый RSS всего процесса, меньше лучше
Пять минут аудио
после прогрева, меньше лучше
| Вариант | Средний WER, 4 языка | 5 мин после прогрева | Пиковая память (RSS) | Веса на диске |
|---|---|---|---|---|
| Исходная PyTorch/MPS | 5,046% | 2,789 с | 5,059 ГБ | 2,342 ГБ |
| MLX FP16 | 5,066% | 1,952 с | 1,350 ГБ | 1,171 ГБ |
| MLX INT8 g64, по умолчанию | 5,070% | 2,036 с | 0,877 ГБ | 0,699 ГБ |
| MLX INT6 g64 | 5,069% | 2,195 с | 0,755 ГБ | 0,573 ГБ |
| MLX INT4 g64 | 5,219% | 2,563 с | 0,626 ГБ | 0,447 ГБ |
Данные графика и таблицы: полный JSON бенчмарка и компактный CSV с пятью вариантами.
Скорость относительно реального времени
GigaAM решает задачу ASR, или автоматического распознавания речи. Скорость таких моделей принято показывать через RTF: время обработки делится на длительность аудио. Чем меньше RTF, тем быстрее модель. Обратное значение показывает, во сколько раз обработка быстрее реального времени.
| Вариант | 5 минут аудио | RTF | Скорость к реальному времени |
|---|---|---|---|
| Исходная PyTorch/MPS | 2,789 с | 0,0093 | 107,6× |
| MLX FP16 | 1,952 с | 0,0065 | 153,7× |
| MLX INT8 g64 | 2,036 с | 0,0068 | 147,3× |
| MLX INT6 g64 | 2,195 с | 0,0073 | 136,6× |
| MLX INT4 g64 | 2,563 с | 0,0085 | 117,0× |
Данные таблицы скорости: JSON с полными замерами и CSV с RTF и скоростью обработки.
Память графического процессора учитывается отдельно от RSS, потому что центральный и графический процессоры Apple Silicon используют один общий пул памяти.
Таблица показывает три сценария выбора:
- FP16 дал минимальное время на пятиминутном входе;
- INT8 сохранил почти то же качество и сократил пиковый RSS на 82,7% относительно исходной реализации;
- INT4 уменьшил файл весов на 80,9% относительно исходной реализации и показал минимальное потребление памяти, но работал медленнее FP16 и INT8.
Меньший файл не гарантирует более высокую скорость. Перед умножением упакованные INT-значения приходится распаковывать и переводить в удобный для вычислений формат. На M4 Pro эти дополнительные операции сделали FP16 немного быстрее INT8, INT6 и INT4. Поэтому скорость измерена отдельно для каждого варианта.
Полная методика, доверительные интервалы и результаты по всем языкам находятся в публичном отчете о бенчмарке.
Куда уходит время
Чтобы найти самое медленное место, отдельно измерено время каждого этапа для 20 секунд звука. Запись превращается в 1999 коротких кадров спектрограммы. Затем их число сокращается примерно до 500, и основную работу выполняют 24 блока Conformer. Замеры сделаны на той же M4 Pro с MLX 0.32.0. После каждого этапа mx.eval() заставлял MLX завершить вычисления перед измерением времени.
- WAV 20 секунд звука
- Аудиофронтенд 1999 log-mel-кадров 0,28 мс / 0,2%
- Последовательность 4× короче 500 × 1024 1,36 мс / 1,1%
- Учет позиции кадра позиционное кодирование RoPE 0,18 мс / 0,1%
- Энкодер 24 блока Conformer 118,75 мс / 98,8%
- Слой CTC оценки символов 0,21 мс / 0,2%
- Декодирование текст на CPU 0,15 мс / 0,1%
Подготовка звука, выходной слой CTC и преобразование результата в текст вместе занимают слишком малую долю для большого общего ускорения. Основная вычислительная работа сосредоточена внутри 24 одинаковых блоков Conformer.
- FFN3,04 мс, 55,4% времени / 68,8% параметров
- Механизм внимания1,40 мс, 25,5% времени / 17,2% параметров
- Сверточный модуль0,94 мс, 17,1% времени / 12,9% параметров
- Прочие операцииоколо 0,11 мс, 2,0% времени / 1,1% параметров
Профиль объясняет приоритет оптимизаций. Из 585,33 млн параметров около 402,90 млн находятся в FFN. Проекции механизма внимания занимают 17,2%, сверточные модули Conformer еще 12,9%.
Стандартное вычисление механизма внимания заменено встроенной операцией mx.fast.scaled_dot_product_attention. Полный проход ускорился на 3,8% в FP16 и на 4,4% в INT8. Механизм внимания занимает около четверти времени одного блока, поэтому ускорение только этой части дает несколько процентов на всю модель.
Какие оптимизации действительно ускорили модель
Кандидаты проверялись по одному в отдельных процессах. Опубликованный код и веса во время исследования оставались без изменений.
- Обработать 16 аудиофрагментов, по 8 одновременноFP16, каждый фрагмент по 20 секунд +10,9%
- Увеличить фрагмент до 40 секундFP16, пятиминутное аудио +8,2%
- Ускорить механизм внимания через SDPAINT8, полный проход +4,4%
- Ускорить механизм внимания через SDPAFP16, полный проход +3,8%
-
Включить
mx.compile()INT8, полный проход +3,1% -
Включить
mx.compile()FP16, полный проход +0,8%
В первом замере модель получила 16 фрагментов по 20 секунд. Они обрабатывались двумя группами, по восемь одновременно. Общее время сократилось с 1,91 до 1,72 секунды, поэтому за единицу времени модель обработала на 10,9% больше аудио. Время ожидания одного файла в этом тесте не оценивалось.
Эффекты нельзя складывать арифметически. Они используют часть одних и тех же ресурсов и меняют форму вычислительного графа.
Размер фрагмента приходится подбирать для каждого варианта весов. FP16 выиграл 8,2% при переходе с 20 до 40 секунд. INT8 на той же форме потерял 10,2%. Обработка восьми фрагментов одновременно ускорила FP16 на 10,9%, а INT8 замедлила на 1,9%. Одна общая настройка ухудшила бы вариант по умолчанию.
Проверка mx.compile() показала, что эффект зависит от размера входа. Компиляция дала +0,8% для FP16 и +3,1% для INT8. Режим с произвольными размерами входа (shapeless=True) остановился на техническом ограничении операции mx.as_strided в подготовке звука.
Почему нельзя просто вырезать часть модели
Временное отключение или замену части модели называют абляцией. Такой эксперимент показывает вклад этой части в скорость и качество. Например, более простая функция ReLU почти не ускорила полный полносвязный блок: 1,51 мс вместо 1,52 мс с SiLU. Основное время уходит на умножение больших матриц, поэтому замена одной небольшой операции почти ничего не меняет.
Затем были проведены диагностические абляции на 100 публичных примерах FLEURS без сохранения новых весов. WER исходной конфигурации на этом поднаборе составил 6,51%.
- Исходная конфигурация24 слоя 1,00×WER 6,51%
- SiLU заменена на ReLUкачество разрушено 1,00×WER 99,23%
- Удален первый FFNв каждом слое 1,26×WER 52,03%
- Удален сверточный модульпустые ответы 1,12×WER 100%
- Оставлены первые 20 слоев4 слоя удалены 1,11×WER 99,62%
- Оставлен каждый второй слой12 слоев 1,50×WER 147,20%
- Число кадров уменьшено до 8×требуется обучение 1,48×WER 46,36%
WER может быть выше 100%, если модель добавляет много лишних слов. Здесь проверялись готовые веса после механического изменения модели. Все ускоренные варианты резко ухудшили распознавание.
Даже замена функции активации изменила сигналы, которые проходят между слоями. Удаление половины блоков ускорило вычисление в 1,50 раза, но распознавание перестало работать. После таких изменений модель нужно обучать заново или переносить знания большой модели в уменьшенную.
Где находится граница ускорения без обучения
Рабочие оптимизации
Диагностические абляции
- 1,26×удален первый FFN, WER 52,03%
- 1,48×8-кратное сжатие времени, WER 46,36%
- 1,50×оставлен каждый второй слой, WER 147,20%
Оптимизации без обучения дали от +0,8% до +10,9% в зависимости от режима. Удаление частей модели показало до 1,50×, но качество распознавания резко упало. В итоговые результаты вошли только варианты с сохраненным качеством.
Порядок работы
Работа была разделена на три последовательных контура:
- Сохранено поведение Закреплены версия кода, предобработка и декодирование. Сравнены промежуточные тензоры. Подтверждена эквивалентность FP32 и FP16.
- Измерен результат Каждый вариант проверен на одном наборе качества. Раздельно измерены файл, загрузка, задержка, пиковый RSS и память Metal. Найден главный узкий участок.
- Проверено и опубликовано Оптимизации проверены на полном входе. Опубликованы списки примеров, версии, контрольные суммы, команды и ограничения.
Готовый результат доступен в GitHub, PyPI и Hugging Face Collection. INT8 g64 выбран вариантом по умолчанию. FP16 подходит для минимальной измеренной задержки, INT4 для минимального размера и потребления памяти.
Текст подготовил ИИ-агент Codex по материалам рабочей сессии.
Воспроизводимость
- Исходная GigaAMмодель и код
- GitHubMLX-реализация и команды
- PyPIустанавливаемый пакет
- Hugging Faceчетыре варианта весов
- Публичный бенчмарксписки примеров, версии и отчет
- Код и описание релиза: ai-babai/gigaam-multilingual-mlx
- Веса на Hugging Face: FP16, INT8 g64, INT6 g64, INT4 g64 и общая коллекция
- Публичная методика: benchmarks/multilingual-v1/README.md
- Полный отчет: docs/benchmark-multilingual-v1.md
- Оригинальная модель: ai-sage/GigaAM-Multilingual
- Оригинальный код: salute-developers/GigaAM
- Компиляция MLX: официальная документация
- Быстрая SDPA в MLX: официальная документация
- Fast Conformer: статья на arXiv
Все опубликованные входы бенчмарка общедоступны. Приватные аудиозаписи, веса моделей, датасеты, кеши и большие сырые результаты в GitHub-репозитории не хранятся.