Alterna · учебный материал
17.1 Первый запуск обрабатывает введённую фразу
До первого выбора нужно рассчитать представления всех уже известных токенов. Этот запуск называется предварительным заполнением — prefill.
Что в этом материале
- Используем фиксированные веса
- Один forward создаёт состояния всех позиций
Содержание и основные понятия
Веса уже подобраны; теперь держим их фиксированными.
До первого выбора нужно рассчитать представления всех уже известных токенов. Этот запуск называется предварительным заполнением — prefill.
Первый запуск обрабатывает префикс. Каждый последующий добавляет одну позицию; K/V прошлых позиций можно сохранять. Выборка и сжатое хранение решают разные задачи.
Используем фиксированные веса
Общая модель требуетJavaScript; её вычисления, формулы и код разобраны в открытом тексте далее.
Один forward создаёт состояния всех позиций
Inference decoder состоит из двух режимов. На prefill вся prompt-последовательность проходит layers параллельно по token dimension; causal attention позиции
i
использует keys
0..i
. Для length
n
существует
n(n+1)/2
разрешённых query-key pairs на head. Это не полный FLOP count: projections, FFN, normalization и memory traffic считаются отдельно.
N
s
c
o
r
e
s
p
r
e
f
i
l
l
=
∑
i
=
1
n
i
=
n
(
n
+
1
)
2
,
N
s
c
o
r
e
s
n
e
x
t
=
n
+
1.
N_{scores}^{prefill}=\sum_{i=1}^{n}i=\frac{n(n+1)}2,
\qquad N_{scores}^{next}=n+1.
N
scores
p
re
f
i
ll
=
i
=
1
∑
n
i
=
2
n
(
n
+
1
)
,
N
scores
n
e
x
t
=
n
+
1.
Prefill обычно лучше насыщает accelerator крупными matrix multiplications, тогда как decode добавляет по одной позиции и чаще ограничен чтением weights/cache. FlashAttention меняет IO-план точного attention и не обязан материализовать всю score matrix в HBM; математический результат при одинаковой точности остаётся тем же. F07, F08.
Что показывает модель.
Матрица prefill раскрывает нижний треугольник, после чего decode добавляет одну новую query-строку. Prompt tokens не генерируются заново: модель вычисляет их hidden states и cache. Метрики prefill удобно выражать TTFT и input tokens/s, а decode — time per output token и output tokens/s.
Граница применимости.
Формула pairs не учитывает grouped/multi-query attention, padding, packed requests, kernels и parallelism. Более длинный context увеличивает не только arithmetic, но и cache/transfer pressure. Название «prefill параллельный» не означает нулевую зависимость между layers или бесконечное ускорение.
prompt_len_17a=4
prefill_pairs_17a=sum(range(1,prompt_len_17a+1))
next_decode_pairs_17a=prompt_len_17a+1
assert prefill_pairs_17a==10 and next_decode_pairs_17a==5
Код повторяет только что разобранные операции.
Полный проверяемыйPython-пример главы
доступен отдельным файлом; показанный короткий фрагмент не заменяет его реализацию.
Prefill создаёт hidden states и K/V для всех prompt positions при фиксированных weights.
Следующий запуск использует сохранённое. Как этот вопрос продолжает полученный результат?
Python-примеры главы 17
Академическая база →