ruy
Библиотека матричного умножения (GEMM), разработанная Google для эффективного выполнения операций линейной алгебры, необходимых в движках инференса нейронных сетей. Изначально созданная для TensorFlow Lite, где она используется по умолчанию на архитектуре ARM CPU, Ruy обеспечивает высокую производительность не только для больших матриц, но и для критически важных в приложениях машинного обучения небольших и прямоугольных форм.
Особенности
- поддержка как чисел с плавающей точкой, так и 8-битных целочисленных квантованных матриц;
- ориентация на реальные размеры и формы матриц, встречающиеся в нейросетевых приложениях;
- хороший баланс между производительностью на различных формах и компактным размером бинарного кода;
- использование передовых методов оптимизации: кэширование, предвыборка инструкций, фрактальный обход блоков;
- поддержка архитектур ARM и x86 с оптимизированными ассемблерными ядрами.
Основные компоненты
Ruy представляет собой важный компонент в современном стеке машинного обучения, обеспечивая эффективное выполнение ключевых вычислительных операций на разнообразных аппаратных платформах, с особым акцентом на сценарии, критически важные для инференса нейронных сетей на мобильных и встраиваемых устройствах (подробнее с документацией можно ознакомиться здесь).
Поддержка типов данных и квантования
Библиотека спроектирована для работы с двумя основными категориями данных, покрывающими потребности как традиционных вычислений, так и оптимизированного инференса нейросетей. Это позволяет использовать единый интерфейс для различных числовых форматов.
float— полноценная поддержка чисел с плавающей точкой для сценариев, требующих высокой точности;uint8/int8— эффективное умножение 8‑битных целочисленных матриц с использованием целочисленной арифметики;- Параметры квантования — структуры для передачи нулевой точки (
zero_point), фиксированных множителей (multiplier_fixedpoint) и экспонент (multiplier_exponent); - Поканальное квантование — отдельные параметры квантования для каждого канала, повышающие точность в свёрточных слоях.
Управление параметрами умножения
API Ruy позволяет детально настраивать операцию умножения через структуры параметров, адаптируя вычисления под конкретные модели и аппаратные платформы без изменения основного кода.
MatrixParams— описание характеристик матрицы: порядок хранения (по столбцам или строкам), размеры, нулевая точка;GemmParams— параметры GEMM-операции: множители квантования (общие или поканальные), вектор смещения (bias), границы насыщения (clamp_min,clamp_max);CpuBackendContext— информация о вычислительном окружении (количество потоков, поддержка аппаратных инструкций), содержащая внутренний контекст Ruy.
Производительность и стратегии выполнения
Ключевая особенность Ruy — ориентация на реальные сценарии использования, где размеры матриц могут быть небольшими или сильно вытянутыми. Традиционные библиотеки часто оптимизированы для квадратных матриц большого размера, тогда как Ruy стремится обеспечить высокую скорость на всём спектре форм.
- Блочное разбиение (BlockMap) — разбиение матриц на блоки для эффективного использования кэш-памяти; для крупных размеров применяется фрактальный обход (Hilbert curve), улучшающий локальность обращений;
- Многопоточность и асинхронность — механизмы, позволяющие потокам выполнять полезную работу (например, распаковку блоков) в ожидании завершения операций другими потоками;
- Предвыборка данных (Prefetching) — специализированные инструкции (
PREFETCH_LOAD,PREFETCH_STORE) для предварительной загрузки данных в кэш, сокращающие задержки при обращении к памяти.
Поддержка платформ и архитектурные оптимизации
Ruy разработана для эффективной работы на широком спектре оборудования и включает оптимизированные ядра для различных архитектур, что обеспечивает переносимость и высокую производительность на целевых устройствах.
- ARM — основная целевая платформа: оптимизированные ассемблерные ядра для ARM32 и ARM64 (AArch64), поддержка расширений DotProd;
- x86 — ядра для SSE 4.2, AVX2, AVX-512, а также для AVX VNNI (Vector Neural Network Instructions);
- Контроль оптимизаций — флаги времени компиляции (
RUY_OPT_SET) для настройки набора применяемых оптимизаций, полезные для бенчмаркинга и отладки.