From f31c2982b544b87fe175759ff6be981002974ca0 Mon Sep 17 00:00:00 2001 From: "Lv, Tao A" Date: Wed, 4 Sep 2024 11:41:38 +0800 Subject: [PATCH] doc: graph: add gqa pattern document --- doc/graph/complex_fusion/gqa.md | 106 ++++++++++++++++++++++++ doc/graph/complex_fusion/images/gqa.png | Bin 0 -> 38288 bytes 2 files changed, 106 insertions(+) create mode 100644 doc/graph/complex_fusion/gqa.md create mode 100644 doc/graph/complex_fusion/images/gqa.png diff --git a/doc/graph/complex_fusion/gqa.md b/doc/graph/complex_fusion/gqa.md new file mode 100644 index 00000000000..ea48cb6c1ea --- /dev/null +++ b/doc/graph/complex_fusion/gqa.md @@ -0,0 +1,106 @@ +Grouped Query Attention (GQA) {#dev_guide_graph_gqa} +==================================================== + +## Overview + +In a typical Scaled Dot-Product Attention (SDPA) [1], the input Query, Key, and +Value tensors have the same head number. It becomes a performance bottleneck to +load the Key and Value tensors in each generation step, especially when the +sentence length gets longer. + +To reduce the memory bandwidth overhead of loading the Key and Value tensors, +Multi-Query Attention (MQA) [2] is created by reducing the head number of Key +and Value tensors to one which means multiple Queries will map to the same +single Key and Value tensor. However, MQA may lead to model quality degradation +and training instability. Therefore, Grouped-Query Attention (GQA) [3], an +interpolation between the typical SDPA and MQA, is proposed with single Key and +Value head per a subgroup of Query heads. The head number of Key and Value +equals to the group number of Query heads. + +The notations used in the document: + +- N: the mini-batch size. +- H_q: the head number of Query. +- H_kv: the head number of Key or Value. +- N_rep: H_q / H_kv, indicates how many Query heads are mapped to one Key head. +- S: the sequence length. +- D: the size of each head. + +## GQA Pattern + +Similar to how SDPA is supported, the GQA pattern is also defined as a +directional acyclic graph (DAG) using oneDNN Graph API. oneDNN extends the +[SDPA pattern](@ref dev_guide_graph_sdpa) to support floating-point (f32, bf16, +and f16) GQA as follows. The blue nodes are required when defining a GQA pattern +while the brown nodes are optional. + +![GQA pattern](images/gqa.png) + +Compared to a typical SDPA pattern, there are a few differences in the GQA +pattern: + +1. The input Query has shape (N, H_q, S, D). It will be reshaped to (N, H_kv, + N_rep, S, D) by splitting H_q dimension into H_kv and N_rep. The reshaping + can be constructed using the [StaticReshape](@ref dev_guide_op_staticreshape) + operation in Graph API. +2. Similarly, the input Key and Value have shape (N, H_kv, S, D). They will be + reshaped to (N, H_kv, 1, S, D) to meet the input shape requirement of + [MatMul](@ref dev_guide_op_matmul) operation. +3. The second MatMul calculates the dot products between the probabilities after + SoftMax and Value nodes and generates output with shape (N, H_kv, N_rep, S, D). +4. Another StaticReshape operation is applied to the output of the second MatMul + to convert the shape into (N, H_q, S, D) by combining H_kv and N_rep + dimensions. +5. The input scale factor and mask in the pattern also need to meet the + operations' shape requirement which can be achieved through StaticReshape + similarly. Besides that, they have the same definition as described in the + typical SDPA pattern. + +## Data Types + +oneDNN supports the floating-point GQA pattern with data types f32, bf16, and +f16. You can specify the data type via the input and output data type fields of +logical tensors for each operation. oneDNN does not support mixing different +floating data types in a floating-point GQA pattern. + +The definition of the data types and support status on different CPU and GPU +platforms follow the general description in @ref dev_guide_data_types. + +## Implementation Limitations + +1. oneDNN primitive-based GQA is implemented as the reference implementation on + both Intel Architecture Processors and Intel Graphics Products. The reference + implementation requires memory to store the intermediate results of the dot + products between Query and Key which takes \f$O(S^2)\f$ memory. It may lead + to Out-of-Memory error when computing long sequence length input on platforms with + limited memory. +2. The GQA patterns functionally support all input shapes meeting the shape + requirements of each operation in the graph. +3. CPU + - Optimized implementation is available for 4D Q/K/V tensors with shape + defined as (N, H_q, S, D) for Query and (N, H_kv, S, D) for Key and Value. + - Optimized implementation is available for OpenMP runtime and Threadpool + runtime on Intel Architecture Processors. + - Specifically for OpenMP runtime, the optimized implementation requires `N * + H_q > 2 * thread number` to get enough parallelism. +4. GPU + - Optimized implementation is available for 4D Q/K/V tensors with shape + defined as (N, H_q, S, D) for Query and (N, H_kv, S, D) for Key and Value. + - Optimized implementation is available for floating-point GQA with `f16` + data type and `D <= 256` on Intel Graphics Products with Intel(R) Xe Matrix + Extensions (Intel(R) XMX) support. + +## Example + +oneDNN provides a [GQA +example](https://github.com/oneapi-src/oneDNN/tree/main/examples/graph/gqa.cpp) +demonstrating how to construct a floating-point GQA pattern with oneDNN Graph +API on CPU and GPU with different runtimes. + +## References + +[1] Attention is all you need, https://arxiv.org/abs/1706.03762v7 + +[2] Fast Transformer Decoding: One Write-Head is All You Need, https://arxiv.org/abs/1911.02150 + +[3] GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints, https://arxiv.org/abs/2305.13245 diff --git a/doc/graph/complex_fusion/images/gqa.png b/doc/graph/complex_fusion/images/gqa.png new file mode 100644 index 0000000000000000000000000000000000000000..0871903bcda007797af77ba5e72e4547bccc232c GIT binary patch literal 38288 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

iHLZxw*uT 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

    iaK-Lp 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