alterna ai
ALTERNA AI / ГЛАВА 10 · 05

10.5 Почему важно повторно использовать данные

На предыдущей странице: как вычисляется одна клетка произведения.

Значение нужно не только вычислить, но и прочитать из памяти. Повторное использование маленьких блоков сокращает лишние чтения.

Числа имеют конечную точность; их нужно хранить и переносить. Матричные блоки дают много независимой работы, но память и организация групп также влияют на результат.

Арифметике нужны данные

Weights могут находиться в device memory, затем попадать в кеш или shared memory и регистры. Конкретные уровни зависят от устройства. Capacity, bandwidth и latency — разные величины: большая память не обязательно быстрее, а высокая пропускная способность не устраняет стартовую задержку.

Для C=AB, если прочитать каждый input один раз и записать output один раз, минимальный трафик модели:

Qmin=(mk+kn+mn)b,Q_{min}=(mk+kn+mn)b,

гдеb — байт на скаляр. СтарыйCне читается: рассматриваетсяβ=0, не general GEMMсβC. Приtile t без reuse между выходными blocks модель даёт:

Qtile=b(mk⌈n/t⌉+kn⌈m/t⌉+mn).Q_{tile}=b\left(mk\lceil n/t\rceil+kn\lceil m/t\rceil+mn\right).

Для2×2матриц иb=2получаем минимум24байта. Приtile1 модель считает40байт, приtile2—24. МатематическийCодинаков, трафик различен.

Эксперимент. В оценке большого GEMM увеличьтеtileпри тех жеm,k,n. Сравните ideal и modeled traffic, а не подменяйте один другим. Формула не учитывает загрузку адресов, cache eviction, синхронизацию и двойную буферизацию.

Под капотом. КопированиеweightsсCPUнаGPU — ещё один перенос, не включённый в device-memory traffic. KV-cache, activations и optimizer states также не следует прятать в строке «память весов». На следующей странице учтём эти объекты отдельно.

m=k=n=2; b=2
qmin=(m*k+k*n+m*n)*b
qtile1=(m*k*n+k*n*m+m*n)*b
assert qmin==24 and qtile1==40

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

Повторное использование уменьшает повторные чтения, не меняя заданный оператор.

Вычисления и переносы ограничивают скорость. Как этот вопрос продолжает полученный результат?

Python-примеры главы 10 Академическая база →