{/ Эта страница автоматически создается на основе файла SKILL.md навыка с помощью сайта site/scripts/generate-skill-docs.py. Редактируйте исходный код SKILL.md, а не эту страницу. /}
Оптимизация внимания Flash
Оптимизирует внимание трансформера с помощью Flash Attention для ускорения в 2–4 раза и сокращения памяти в 10–20 раз. Используйте при обучении/запуске преобразователей с длинными последовательностями (>512 токенов), при возникновении проблем с памятью графического процессора или при необходимости более быстрого вывода. Поддерживает встроенный SDPA PyTorch, библиотеку flash-attn, H100 FP8 и внимание скользящего окна.
Метаданные навыков
Источник
Необязательно — установите с помощью hermesskills installofficial/mlops/flash-attention
Ниже приведено полное определение навыка, которое Гермес загружает при активации этого навыка. Это то, что агент видит в качестве инструкций, когда навык активен.
Flash Attention — быстрое внимание с эффективным использованием памяти
Быстрый старт
Flash Attention обеспечивает ускорение в 2–4 раза и сокращение памяти в 10–20 раз для повышения внимания трансформатора за счет разбивки и повторных вычислений с учетом операций ввода-вывода.
Встроенная версия PyTorch (самая простая — PyTorch 2.2+):
python-c"import torch; print(torch.__version__)"# Should be ≥2.2.0
Если <2.2, обновить:
pipinstall--upgradetorch
Шаг 2. Включите серверную часть Flash Attention
Замените стандартное внимание:
# Before (standard attention)attn_weights=torch.softmax(q@k.transpose(-2,-1)/math.sqrt(d_k),dim=-1)out=attn_weights@v# After (Flash Attention)importtorch.nn.functionalasFout=F.scaled_dot_product_attention(q,k,v,attn_mask=mask)
Ожидается: ускорение в 2–4 раза для последовательностей > 512 токенов.
Шаг 4. Точность теста соответствует базовому уровню
# Compare outputsq,k,v=[torch.randn(1,8,512,64,device='cuda',dtype=torch.float16)for_inrange(3)]# Flash Attentionout_flash=F.scaled_dot_product_attention(q,k,v)# Standard attentionattn_weights=torch.softmax(q@k.transpose(-2,-1)/8.0,dim=-1)out_standard=attn_weights@v# Check differencediff=(out_flash-out_standard).abs().max()print(f"Max difference: {diff:.6f}")# Should be <1e-3 for float16
Рабочий процесс 2: используйте библиотеку flash-attn для расширенных функций
Для множественного запроса, скользящего окна или H100 FP8.
# Only attend to window of 256 tokens before/afterout=flash_attn_func(q,k,v,window_size=(256,256),# (left, right) windowcausal=True)
Шаг 4. Оценка производительности
importtorchfromflash_attnimportflash_attn_funcimporttimeq,k,v=[torch.randn(4,4096,32,64,device='cuda',dtype=torch.float16)for_inrange(3)]# Warmupfor_inrange(10):_=flash_attn_func(q,k,v)# Benchmarktorch.cuda.synchronize()start=time.time()for_inrange(100):out=flash_attn_func(q,k,v)torch.cuda.synchronize()end=time.time()print(f"Time per iteration: {(end-start)/100*1000:.2f}ms")print(f"Memory allocated: {torch.cuda.max_memory_allocated()/1e9:.2f}GB")
Рабочий процесс 3: оптимизация H100 FP8 (FlashAttention-3)
Для максимальной производительности на графических процессорах H100.
FP8 Setup:
- [ ] Step 1: Verify H100 GPU available
- [ ] Step 2: Install flash-attn with FP8 support
- [ ] Step 3: Convert inputs to FP8
- [ ] Step 4: Run with FP8 attention
Шаг 1. Проверьте графический процессор H100
nvidia-smi--query-gpu=name--format=csv
# Should show "H100" or "H800"
Шаг 2. Установите flash-attn с поддержкой FP8
pipinstallflash-attn--no-build-isolation
# FP8 support included for H100
Шаг 3. Преобразуйте входные данные в FP8
importtorchq=torch.randn(2,4096,32,64,device='cuda',dtype=torch.float16)k=torch.randn(2,4096,32,64,device='cuda',dtype=torch.float16)v=torch.randn(2,4096,32,64,device='cuda',dtype=torch.float16)# Convert to float8_e4m3 (FP8)q_fp8=q.to(torch.float8_e4m3fn)k_fp8=k.to(torch.float8_e4m3fn)v_fp8=v.to(torch.float8_e4m3fn)
Шаг 4. Работайте с вниманием к FP8
fromflash_attnimportflash_attn_func# FlashAttention-3 automatically uses FP8 kernels on H100out=flash_attn_func(q_fp8,k_fp8,v_fp8)# Result: ~1.2 PFLOPS, 1.5-2x faster than FP16
Когда использовать альтернативы
Используйте Flash Attention, когда:
- Тренировочные преобразователи с последовательностями >512 токенов
- Выполнение вывода с длинным контекстом (> 2 000 токенов)
- Ограничение памяти графического процессора (OOM со стандартным вниманием)
- Требуется ускорение в 2-4 раза без потери точности.
- Использование PyTorch 2.2+ или установка flash-attn.
Вместо этого используйте альтернативы:
- Стандартное внимание: последовательности <256 токенов (накладные расходы того не стоят)
- xFormers: нужно больше вариантов внимания (не только скорости).
- Внимание с эффективным использованием памяти: вывод ЦП (для Flash Attention требуется графический процессор)
Распространенные проблемы
Проблема: Ошибка импорта: невозможно импортировать flash_attn
Проблема: медленнее, чем ожидалось (без ускорения)
Преимущества Flash Attention увеличиваются с увеличением длины последовательности:
- <512 токенов: минимальное ускорение (10-20%)
- 512-2K токенов: ускорение в 2-3 раза
- >2 тыс. токенов: ускорение в 3-4 раза
Длина проверочной последовательности достаточна.
Проблема: RuntimeError: ошибка CUDA
Убедитесь, что графический процессор поддерживает Flash. Внимание:
importtorchprint(torch.cuda.get_device_capability())# Should be ≥(7, 5) for Turing+
Вспышка внимания требует:
- Ампер (А100, А10): ✅ Полная поддержка
- Тьюринг (T4): ✅ Поддерживается
- Вольта (V100): ❌ Не поддерживается.
Проблема: снижение точности
Проверьте, что dtype имеет значение float16 или bfloat16 (не float32):
q=q.to(torch.float16)# Or torch.bfloat16
Flash Attention использует float16/bfloat16 для скорости. Float32 не поддерживается.
Бенчмарки производительности: см. references/benchmarks.md для подробного сравнения скорости и памяти между графическими процессорами и длиной последовательности.
Требования к оборудованию
Графический процессор: NVIDIA Ampere+ (A100, A10, A30) или AMD MI200+.
VRAM: то же, что и стандартное внимание (Flash Attention не увеличивает объем памяти).
CUDA: 12,0+ (минимум 11,8)
PyTorch: 2.2+ для встроенной поддержки.
Не поддерживается: V100 (Volta), определение ЦП
Ресурсы
Документ: «FlashAttention: быстрое и эффективное использование памяти точное внимание с учетом ввода-вывода» (NeurIPS 2022).
Документ: «FlashAttention-2: более быстрое внимание с лучшим параллелизмом и разделением работы» (ICLR 2024).