Loading...
Searching...
No Matches
attention_operator.h
Go to the documentation of this file.
1// SPDX-License-Identifier: AGPL-3.0-only
2// Copyright (C) 2026 Artificial Intelligence Techniques, S.L. and Roberto López González
3
4#pragma once
5
8
9namespace opennn
10{
11
12enum class CausalMask { No, Yes };
13
15{
16 Index heads_number = 0;
17 Index head_dimension = 0;
20 bool use_causal_mask = false;
21 bool use_sdpa = false;
22
23 bool interleaved_heads = false;
24
25 bool zero_padded_queries = false;
26
28
30
31 void set(Index, Index,
32 Index, Index,
34
35 static bool sdpa_supported(Type, Device);
36
37 vector<TensorSpec> forward_scratch_specs(Index) const;
38
40
41 static constexpr size_t sdpa_scratch_slots_count = 8;
42
43 vector<TensorSpec> sdpa_gradient_scratch_specs(Index) const;
44
46 {
47 Index query_elements = 0;
48 Index source_elements = 0;
49
50 static Index slot_elements(Index elements)
51 {
52 return get_aligned_bytes(elements * Index(sizeof(bfloat16))) / Index(sizeof(bfloat16));
53 }
54
55 Index total_elements() const
56 {
58 }
59
61
62 Pointers over(bfloat16* base) const
63 {
64 bfloat16* const key = base + slot_elements(query_elements);
65 bfloat16* const value = key + slot_elements(source_elements);
66 return {base, key, value, value + slot_elements(source_elements)};
67 }
68 };
69
71 static constexpr size_t sdpa_state_slots_count = 4;
72 vector<TensorSpec> sdpa_state_specs(Index) const;
73
74 size_t scratch_slot = 0;
76
78
80
82 size_t sdpa_state_slot = 0;
84
86 void back_propagate(ForwardPropagation&, BackPropagation&, size_t) const override;
87
90
94 AttentionOperator& operator=(AttentionOperator&&) noexcept;
96 AttentionOperator& operator=(const AttentionOperator&) = delete;
97
98 struct SDPACache;
99
100private:
101 float scaling_factor() const;
102
103 // Bytes the forward pass moves, for the achieved-bandwidth column of
104 // OPENNN_PROFILE. Separates the fused and materialized paths, which is
105 // where the two differ most.
106 double forward_bytes(ForwardPropagation&, size_t, const TensorView&, bool) const;
107
108 void apply_unfused(const TensorView&,
109 const TensorView&,
110 const TensorView&,
111 const TensorView&,
112 TensorView&,
113 TensorView&,
114 TensorView&,
115 TensorView&,
116 void*,
117 bool is_training,
118 SequenceLengths explicit_lengths = {});
119
120#ifdef OPENNN_HAS_CUDA
121 void apply_sdpa_forward(const TensorView&,
122 const TensorView&,
123 const TensorView&,
124 const TensorView&,
125 TensorView&,
126 const TensorView&,
127 span<const TensorView>,
128 bool is_training,
129 const int* explicit_lengths = nullptr);
130#endif
131
132 void apply_delta_cpu(const TensorView&,
133 const TensorView&,
134 const TensorView&,
135 const TensorView&,
136 const TensorView&,
137 const TensorView&,
138 const TensorView&,
139 TensorView&,
140 TensorView&,
141 TensorView&,
142 TensorView&,
143 const vector<Index>* = nullptr) const;
144
145#ifdef OPENNN_HAS_CUDA
146 void apply_sdpa_backward(const TensorView&,
147 const TensorView&,
148 const TensorView&,
149 const TensorView&,
150 const TensorView&,
151 TensorView&,
152 TensorView&,
153 TensorView&,
154 span<const TensorView>,
155 span<const TensorView>) const;
156#endif
157
158 static bool get_contiguous_source_lengths(const TensorView&,
159 vector<Index>&,
160 bool&);
161 static void softmax_rows_prefix(float*, Index, Index, Index);
162
163 void apply_delta_unfused(const TensorView&,
164 const TensorView&,
165 const TensorView&,
166 const TensorView&,
167 const TensorView&,
168 const TensorView&,
169 const TensorView&,
170 TensorView&,
171 TensorView&,
172 TensorView&,
173 TensorView&) const;
174
175 unique_ptr<SDPACache> sdpa_cache;
176
177#ifdef OPENNN_HAS_CUDA
178 static constexpr uint64_t sdpa_dropout_seed = 0x9E3779B97F4A7C15ULL;
179 uint64_t sdpa_dropout_offset = 0;
180#endif
181};
182
183}
Definition configuration.h:10
bool is_training(ForwardPropagationMode pass) noexcept
Definition forward_propagation.h:38
Device
Definition configuration.h:12
Index get_aligned_bytes(Index n_bytes)
Definition tensor_types.h:157
@ Yes
Definition tensor_operations.h:120
@ No
Definition tensor_operations.h:120
Type
Definition configuration.h:13
CausalMask
Definition attention_operator.h:12
ForwardPropagationMode
Definition forward_propagation.h:33
__nv_bfloat16 bfloat16
Definition opennn_types.h:171
Eigen::Matrix< float, Eigen::Dynamic, Eigen::Dynamic, Layout > MatrixR
Definition opennn_types.h:331
Definition attention_operator.h:60
bfloat16 * query
Definition attention_operator.h:60
bfloat16 * output
Definition attention_operator.h:60
bfloat16 * key
Definition attention_operator.h:60
bfloat16 * value
Definition attention_operator.h:60
Definition attention_operator.h:46
static Index slot_elements(Index elements)
Definition attention_operator.h:50
Index query_elements
Definition attention_operator.h:47
Index total_elements() const
Definition attention_operator.h:55
Pointers over(bfloat16 *base) const
Definition attention_operator.h:62
Index source_elements
Definition attention_operator.h:48
TensorSpec sdpa_qkv_pack_spec(Index) const
Index query_sequence_length
Definition attention_operator.h:18
void concatenate_output_heads(ForwardPropagation &, size_t) const
bool use_causal_mask
Definition attention_operator.h:20
void split_output_delta(ForwardPropagation &, BackPropagation &, size_t) const
MatrixR causal_mask
Definition attention_operator.h:27
void back_propagate(ForwardPropagation &, BackPropagation &, size_t) const override
size_t sdpa_gradient_slot
Definition attention_operator.h:79
Index head_dimension
Definition attention_operator.h:17
Index heads_number
Definition attention_operator.h:16
static bool sdpa_supported(Type, Device)
AttentionOperator(AttentionOperator &&) noexcept
bool interleaved_heads
Definition attention_operator.h:23
vector< TensorSpec > forward_scratch_specs(Index) const
size_t dropout_mask_slot
Definition attention_operator.h:83
static constexpr size_t sdpa_scratch_slots_count
Definition attention_operator.h:41
void set(Index, Index, Index, Index, CausalMask, Type)
size_t scratch_slot
Definition attention_operator.h:74
size_t sdpa_state_slot
Definition attention_operator.h:82
Index source_sequence_length
Definition attention_operator.h:19
vector< TensorSpec > sdpa_gradient_scratch_specs(Index) const
static constexpr size_t sdpa_state_slots_count
Definition attention_operator.h:71
DropoutOperator dropout
Definition attention_operator.h:29
size_t attention_output_slot
Definition attention_operator.h:75
bool zero_padded_queries
Definition attention_operator.h:25
vector< TensorSpec > sdpa_state_specs(Index) const
TensorSpec backward_scratch_spec(Index) const
size_t sdpa_qkv_pack_slot
Definition attention_operator.h:81
size_t concatenated_output_delta_slot
Definition attention_operator.h:77
void forward_propagate(ForwardPropagation &, size_t, ForwardPropagationMode) override
bool use_sdpa
Definition attention_operator.h:21
Definition back_propagation.h:19
Definition dropout_operator.h:15
Definition forward_propagation.h:52
Definition operator.h:28
Definition forward_propagation.h:16
Definition tensor_types.h:281
Definition tensor_types.h:540