待定
這很重要
此 API 可作為 DirectML 獨立可轉散發套件的一部分(請參閱 Microsoft.AI.DirectML 1.15.0 版和更新版本。 另請參閱 DirectML 版本歷程記錄。
語法
struct DML_MULTIHEAD_ATTENTION1_OPERATOR_DESC
{
_Maybenull_ const DML_TENSOR_DESC* QueryTensor;
_Maybenull_ const DML_TENSOR_DESC* KeyTensor;
_Maybenull_ const DML_TENSOR_DESC* ValueTensor;
_Maybenull_ const DML_TENSOR_DESC* StackedQueryKeyTensor;
_Maybenull_ const DML_TENSOR_DESC* StackedKeyValueTensor;
_Maybenull_ const DML_TENSOR_DESC* StackedQueryKeyValueTensor;
_Maybenull_ const DML_TENSOR_DESC* BiasTensor;
_Maybenull_ const DML_TENSOR_DESC* MaskTensor;
_Maybenull_ const DML_TENSOR_DESC* RelativePositionBiasTensor;
_Maybenull_ const DML_TENSOR_DESC* PastKeyTensor;
_Maybenull_ const DML_TENSOR_DESC* PastValueTensor;
_Maybenull_ const DML_TENSOR_DESC* PastSequenceLengthsTensor;
const DML_TENSOR_DESC* OutputTensor;
_Maybenull_ const DML_TENSOR_DESC* OutputPresentKeyTensor;
_Maybenull_ const DML_TENSOR_DESC* OutputPresentValueTensor;
FLOAT Scale;
FLOAT MaskFilterValue;
UINT QueryHeadCount;
UINT KeyValueHeadCount;
DML_MULTIHEAD_ATTENTION_MASK_TYPE MaskType;
};
成員
QueryTensor
類型: _Maybenull_ const DML_TENSOR_DESC*
使用圖形 [batchSize, sequenceLength, hiddenSize]查詢 ,其中 hiddenSize = headCount * headSize。 這個張量與 StackedQueryKeyTensor 和 StackedQueryKeyValueTensor 互斥。 只要前置維度為 1,張量也可以有 4 或 5 個維度。
KeyTensor
類型: _Maybenull_ const DML_TENSOR_DESC*
具有圖形 [batchSize, keyValueSequenceLength, hiddenSize]的索引鍵,其中 hiddenSize = headCount * headSize。 這個張量與 StackedQueryKeyTensor、 StackedKeyValueTensor 和 StackedQueryKeyValueTensor 互斥。 只要前置維度為 1,張量也可以有 4 或 5 個維度。
ValueTensor
類型: _Maybenull_ const DML_TENSOR_DESC*
具有圖形 [batchSize, keyValueSequenceLength, valueHiddenSize]的值,其中 valueHiddenSize = headCount * valueHeadSize。 這個張量與 StackedKeyValueTensor 和 StackedQueryKeyValueTensor 互斥。 只要前置維度為 1,張量也可以有 4 或 5 個維度。
StackedQueryKeyTensor
類型: _Maybenull_ const DML_TENSOR_DESC*
具有圖形 [batchSize, sequenceLength, headCount, 2, headSize]的堆疊查詢和索引鍵。 這個張量與 QueryTensor、 KeyTensor、 StackedKeyValueTensor 和 StackedQueryKeyValueTensor 互斥。
StackedKeyValueTensor
類型: _Maybenull_ const DML_TENSOR_DESC*
具有圖形 [batchSize, keyValueSequenceLength, headCount, 2, headSize]的堆疊索引鍵和值。 這個張量與 KeyTensor、ValueTensor、StackedQueryKeyTensor 和 StackedQueryKeyValueTensor 互斥。
StackedQueryKeyValueTensor
類型: _Maybenull_ const DML_TENSOR_DESC*
具有圖形 [batchSize, sequenceLength, headCount, 3, headSize]的堆疊查詢、索引鍵和值。 這個張量與 QueryTensor、KeyTensor、ValueTensor、StackedQueryKeyTensor 和 StackedKeyValueTensor 互斥。
BiasTensor
類型: _Maybenull_ const DML_TENSOR_DESC*
這是圖形 [hiddenSize + hiddenSize + valueHiddenSize]的偏差,其會在第一個 GEMM 作業之前新增至 查詢/索引鍵/值 。 只要前置維度為 1,此張量也可以有 2、3、4 或 5 個維度。
MaskTensor
類型: _Maybenull_ const DML_TENSOR_DESC*
這是遮罩,可決定哪些元素在 QxK GEMM 作業之後將其值設定為 MaskFilterValue 。 此遮罩的行為取決於 MaskType 的值,並在 RelativePositionBiasTensor 之後套用,或在 RelativePositionBiasTensor 為 Null 時套用第一個 GEMM 作業之後。 如需詳細資訊,請參閱 MaskType 的定義。
RelativePositionBiasTensor
類型: _Maybenull_ const DML_TENSOR_DESC*
這是新增至第一個 GEMM 作業結果的偏差。
PastKeyTensor
類型: _Maybenull_ const DML_TENSOR_DESC*
上一個反覆項目的索引鍵張量與圖形 [batchSize, headCount, pastSequenceLength, headSize]。 當這個張量不是 Null 時,它會與索引鍵張量串連,這會產生圖形 [batchSize, headCount, pastSequenceLength + keyValueSequenceLength, headSize]的張量。
PastValueTensor
類型: _Maybenull_ const DML_TENSOR_DESC*
使用圖形 [batchSize, headCount, pastSequenceLength, headSize]的上一個反覆專案值張量。 當這個張量不是 Null 時,它會與 ValueDesc 串連,這會產生圖形 [batchSize, headCount, pastSequenceLength + keyValueSequenceLength, headSize]的張量。
PastSequenceLengthsTensor
類型: _Maybenull_ const DML_TENSOR_DESC*
待定
OutputTensor
類型: const DML_TENSOR_DESC*
圖形 [batchSize, sequenceLength, valueHiddenSize]的輸出。
OutputPresentKeyTensor
類型: _Maybenull_ const DML_TENSOR_DESC*
交叉注意索引鍵的目前狀態,具有圖形 [batchSize, headCount, keyValueSequenceLength, headSize] 或目前狀態,可透過圖形 [batchSize, headCount, pastSequenceLength + keyValueSequenceLength, headSize]進行自我注意。 它包含索引鍵張量的內容,或串連 的PastKey + 金鑰 張量的內容,以傳遞至下一個反覆專案。
OutputPresentValueTensor
類型: _Maybenull_ const DML_TENSOR_DESC*
交叉注意值的目前狀態,具有圖形 [batchSize, headCount, keyValueSequenceLength, headSize] 或目前狀態,以使用圖形 [batchSize, headCount, pastSequenceLength + keyValueSequenceLength, headSize]進行自我注意。 它包含值張量的內容,或串連 的PastValue + 值 張量的內容,以傳遞至下一個反覆專案。
Scale
類型: FLOAT
縮放以將 QxK GEMM 作業的結果乘以,但在 Softmax 作業之前。 這個值通常是 1/sqrt(headSize)。
MaskFilterValue
類型: FLOAT
值,這個值會新增至 QxK GEMM 作業結果中定義為填補元素的遮罩位置。 此值應該是非常大的負數(通常是 -10000.0f)。
QueryHeadCount
類型: UINT
待定
KeyValueHeadCount
類型: UINT
待定
MaskType
類型: DML_MULTIHEAD_ATTENTION_MASK_TYPE
描述 MaskTensor的行為。
DML_MULTIHEAD_ATTENTION_MASK_TYPE_BOOLEAN。 當遮罩包含 0 的值時, 就會新增 MaskFilterValue ;但是,當它包含1的值時,不會新增任何專案。
DML_MULTIHEAD_ATTENTION_MASK_TYPE_KEY_SEQUENCE_LENGTH。 圖形 [1, batchSize]的遮罩包含每個批次未加上板區域的順序長度,而序列長度之後的所有元素都會將其值設定為 MaskFilterValue。
DML_MULTIHEAD_ATTENTION_MASK_TYPE_KEY_SEQUENCE_END_START。 圖形 [2, batchSize]的遮罩包含已取消控制區域的結尾(獨佔)和開始(內含)索引,而區域外部的所有元素都會將其值設定為 MaskFilterValue。
DML_MULTIHEAD_ATTENTION_MASK_TYPE_KEY_QUERY_SEQUENCE_LENGTH_START_END。 圖形 [batchSize * 3 + 2]的遮罩具有下列值: [keyLength[0], ..., keyLength[batchSize - 1], queryStart[0], ..., queryStart[batchSize - 1], queryEnd[batchSize - 1], keyStart[0], ..., keyStart[batchSize - 1], keyEnd[batchSize - 1]]。
可用性
此運算子是在 DML_FEATURE_LEVEL_6_3 中引進的。
Tensor 條件約束
BiasTensor、KeyTensor、OutputPresentKeyTensor、OutputPresentValueTensor、OutputTensor、PastKeyTensor、PastSequenceLengthsTensor、PastValueTensor、RelativePositionBiasTensor、StackedKeyValueTensor、StackedQueryKeyTensor、StackedQueryKeyValueTensor 和 ValueTensor 必須具有相同的 DataType。
Tensor 支援
| 張量 | 仁慈 (if context refers to kindness) | 支援的維度計數 | 支援的數據類型 |
|---|---|---|---|
| QueryTensor 的 | 選擇性輸入 | 3 到 5 | FLOAT32,FLOAT16 |
| KeyTensor 的 | 選擇性輸入 | 3 到 5 | FLOAT32,FLOAT16 |
| ValueTensor | 選擇性輸入 | 3 到 5 | FLOAT32,FLOAT16 |
| StackedQueryKeyTensor | 選擇性輸入 | 5 | FLOAT32,FLOAT16 |
| StackedKeyValueTensor | 選擇性輸入 | 5 | FLOAT32,FLOAT16 |
| StackedQueryKeyValueTensor | 選擇性輸入 | 5 | FLOAT32,FLOAT16 |
| BiasTensor | 選擇性輸入 | 1 到 5 | FLOAT32,FLOAT16 |
| MaskTensor 的 | 選擇性輸入 | 1 到 5 | INT32 |
| RelativePositionBiasTensor | 選擇性輸入 | 4 到 5 | FLOAT32,FLOAT16 |
| PastKeyTensor | 選擇性輸入 | 4 到 5 | FLOAT32,FLOAT16 |
| PastValueTensor | 選擇性輸入 | 4 到 5 | FLOAT32,FLOAT16 |
| PastSequenceLengthsTensor | 選擇性輸入 | 1 到 5 | FLOAT32,FLOAT16 |
| OutputTensor | 輸出 | 3 到 5 | FLOAT32,FLOAT16 |
| 輸出PresentKeyTensor | 選擇性輸出 | 4 到 5 | FLOAT32,FLOAT16 |
| 輸出PresentValueTensor | 選擇性輸出 | 4 到 5 | FLOAT32,FLOAT16 |