Loading...
Searching...
No Matches
cudnn_rnn.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
7
8#include <functional>
9#include <mutex>
10
11namespace opennn
12{
13
14inline constexpr int RNN_SHAPE_SLOTS = 3;
15
33
34#ifdef OPENNN_HAS_CUDA
35
41
42// cuDNN's RNN API took BFLOAT16 later than the rest of the library did, and it
43// answers NOT_SUPPORTED for every math type and precision when it cannot. The
44// answer is a property of the linked runtime, so it is asked once by asking.
46
47#endif
48
50{
51protected:
53 {
59 int shape_stamp = 0;
64 bool persist_algo_failed = false;
65 bool persist_algo_active = false;
66 bool double_bias = false;
67 bool packed_layout = false;
68
69 const void* zeroed_weight_space = nullptr;
72 bool zeroed_double_bias = false;
73
74 // What the packed weight space currently holds. cuDNN wants the weights
75 // in its own layout, and copying them there is pure data movement that
76 // repeats every forward pass even when nothing has moved: measured at
77 // 3.4% of the LSTM layer. Packing is skipped when the destination
78 // buffer, the shape and the network's parameter version all still
79 // match. Version 0 means nothing has been packed yet.
80 const void* packed_weight_space = nullptr;
84 };
85
86 unique_lock<mutex> lock_backend_state() const
87 {
88 return unique_lock(backend_state.access_mutex);
89 }
90
91#ifdef OPENNN_HAS_CUDA
92
94 bool is_training, bool has_cell_state,
95 const void* x, void* y,
96 Buffer& forward_state,
97 const function<CudnnRnnShapeSlot&()>& reconfigure) const;
99 bool has_cell_state,
100 const void* x, const void* y, const void* dy,
101 void* dx,
102 const Buffer& forward_state,
103 Buffer& backward_scratch) const;
104
106 Index input_features, Index output_features,
107 Index time_steps, Index batch_size,
108 bool for_training) const;
110 Index input_features, Index output_features,
111 Index time_steps, Index batch_size,
112 bool for_training) const;
113 void cudnn_copy_weight_regions_(int num_linear_layers,
114 Index input_features,
115 Index output_features,
116 const TensorView* const* matrices,
117 const TensorView* const* vectors,
118 Buffer& packed_weights,
119 bool to_cudnn) const;
120 void cudnn_pack_weights_(int num_linear_layers,
121 Index input_features, Index output_features,
122 const TensorView* const* weights,
123 const TensorView* const* biases,
124 Buffer& forward_state,
125 uint64_t parameters_version) const;
126 void cudnn_unpack_gradients_(int num_linear_layers,
127 Index input_features, Index output_features,
128 const TensorView* const* weight_gradients,
129 const TensorView* const* bias_gradients,
130 Buffer& backward_scratch) const;
131
133 const CudnnRnnShapeSlot&) const;
134
135 // The descriptor set a failing cuDNN call was given, printed with the
136 // failure so a capture refusal names a configuration and not just a code.
138 const char* mode) const;
139
140 // What the two recurrent layers do not share: the shape they configure
141 // cuDNN with, and how their weights pack into cuDNN's layout.
142 virtual CudnnRnnShapeSlot& ensure_cudnn_setup_(Index batch_size, bool for_training) const = 0;
143 virtual void pack_weights_to_cudnn_(Buffer&, uint64_t parameters_version) const = 0;
144 virtual void unpack_gradients_from_cudnn_(Buffer&) const = 0;
145
146 // What they do share. Driving cuDNN is the same sequence either way --
147 // configure, pack, transpose into time-major, run, transpose back -- and
148 // both layers had written it out, ~150 lines apiece, differing only in the
149 // cell state the LSTM carries and the plain RNN does not.
151 {
152 Index input_features = 0;
154 Index time_steps = 0;
155 bool return_sequences = false;
156 bool has_cell_state = false;
157 };
158
160 const TensorView& input,
161 TensorView& sequence_output,
162 TensorView& output,
163 TensorView& cudnn_input_sequence,
164 TensorView& cudnn_output_sequence,
165 Buffer& forward_state,
166 bool is_training,
167 uint64_t parameters_version) const;
168
170 const TensorView& input,
171 const TensorView& sequence_output,
172 const TensorView& output_delta,
173 const TensorView& cudnn_input_sequence,
174 const TensorView& cudnn_output_sequence,
175 TensorView& input_delta,
176 TensorView& sequence_delta_scratch,
177 TensorView& input_delta_scratch,
178 const Buffer& forward_state,
179 Buffer& backward_scratch) const;
180#endif
181
183};
184
185}
Definition configuration.h:10
bool is_training(ForwardPropagationMode pass) noexcept
Definition forward_propagation.h:38
constexpr int RNN_SHAPE_SLOTS
Definition cudnn_rnn.h:14
@ CPU
Definition configuration.h:12
@ CUDA
Definition configuration.h:12
cudnnRNNMode_t DnnRNNMode
Definition opennn_types.h:155
bool cudnn_rnn_supports_bf16()
DnnDataType to_cudnn(Type type)
Definition tensor_types.h:84
Type
Definition configuration.h:13
@ Auto
Definition configuration.h:13
@ FP32
Definition configuration.h:13
Definition tensor_types.h:340
Definition device_backend.h:17
Definition cudnn_rnn.h:37
DnnRNNMode cell_mode
Definition cudnn_rnn.h:38
Type data_type
Definition cudnn_rnn.h:39
Definition cudnn_rnn.h:17
Index workspace_bytes
Definition cudnn_rnn.h:24
int stamp
Definition cudnn_rnn.h:21
Index input_features
Definition cudnn_rnn.h:20
Buffer seq_dev
Definition cudnn_rnn.h:31
bool training_ready
Definition cudnn_rnn.h:22
Index batch
Definition cudnn_rnn.h:18
Index time
Definition cudnn_rnn.h:19
Index reserve_space_bytes
Definition cudnn_rnn.h:25
Buffer seq_host
Definition cudnn_rnn.h:30
CudnnDescriptor< DnnTensorDescriptor > c_desc
Definition cudnn_rnn.h:29
bool time_major
Definition cudnn_rnn.h:23
CudnnDescriptor< DnnRNNDataDescriptor > y_desc
Definition cudnn_rnn.h:27
CudnnDescriptor< DnnRNNDataDescriptor > x_desc
Definition cudnn_rnn.h:26
CudnnDescriptor< DnnTensorDescriptor > h_desc
Definition cudnn_rnn.h:28
Definition cudnn_rnn.h:53
Type cached_data_type
Definition cudnn_rnn.h:62
CudnnDescriptor< DnnDropoutDescriptor > dropout_desc
Definition cudnn_rnn.h:56
Index zeroed_input_features
Definition cudnn_rnn.h:71
bool packed_layout
Definition cudnn_rnn.h:67
Index cached_input_features
Definition cudnn_rnn.h:60
const void * packed_weight_space
Definition cudnn_rnn.h:80
int shape_stamp
Definition cudnn_rnn.h:59
bool persist_algo_failed
Definition cudnn_rnn.h:64
const void * zeroed_weight_space
Definition cudnn_rnn.h:69
Buffer dropout_states
Definition cudnn_rnn.h:57
uint64_t packed_parameters_version
Definition cudnn_rnn.h:81
Index packed_input_features
Definition cudnn_rnn.h:82
bool double_bias
Definition cudnn_rnn.h:66
bool zeroed_double_bias
Definition cudnn_rnn.h:72
CudnnRnnShapeSlot shape_slots[RNN_SHAPE_SLOTS]
Definition cudnn_rnn.h:58
CudnnDescriptor< DnnRNNDescriptor > rnn_desc
Definition cudnn_rnn.h:55
bool persist_algo_active
Definition cudnn_rnn.h:65
Index zeroed_weight_space_bytes
Definition cudnn_rnn.h:70
Index cached_output_features
Definition cudnn_rnn.h:61
mutex access_mutex
Definition cudnn_rnn.h:54
Index weight_space_bytes
Definition cudnn_rnn.h:63
Index packed_output_features
Definition cudnn_rnn.h:83
Definition cudnn_rnn.h:151
bool has_cell_state
Definition cudnn_rnn.h:156
Index input_features
Definition cudnn_rnn.h:152
Index time_steps
Definition cudnn_rnn.h:154
bool return_sequences
Definition cudnn_rnn.h:155
Index output_features
Definition cudnn_rnn.h:153
Definition cudnn_rnn.h:50
void prepare_cudnn_forward_state_(Buffer &, bool is_training, const CudnnRnnShapeSlot &) const
virtual void pack_weights_to_cudnn_(Buffer &, uint64_t parameters_version) const =0
BackendState backend_state
Definition cudnn_rnn.h:182
void drive_cudnn_forward_(const CudnnRnnDims &, const TensorView &input, TensorView &sequence_output, TensorView &output, TensorView &cudnn_input_sequence, TensorView &cudnn_output_sequence, Buffer &forward_state, bool is_training, uint64_t parameters_version) const
CudnnRnnShapeSlot & cudnn_setup_attempt_(const CudnnRnnConfig &, Index input_features, Index output_features, Index time_steps, Index batch_size, bool for_training) const
void cudnn_unpack_gradients_(int num_linear_layers, Index input_features, Index output_features, const TensorView *const *weight_gradients, const TensorView *const *bias_gradients, Buffer &backward_scratch) const
void cudnn_rnn_forward_(const CudnnRnnShapeSlot &, bool is_training, bool has_cell_state, const void *x, void *y, Buffer &forward_state, const function< CudnnRnnShapeSlot &()> &reconfigure) const
void cudnn_rnn_backward_(const CudnnRnnShapeSlot &, bool has_cell_state, const void *x, const void *y, const void *dy, void *dx, const Buffer &forward_state, Buffer &backward_scratch) const
CudnnRnnShapeSlot & cudnn_setup_(const CudnnRnnConfig &, Index input_features, Index output_features, Index time_steps, Index batch_size, bool for_training) const
virtual CudnnRnnShapeSlot & ensure_cudnn_setup_(Index batch_size, bool for_training) const =0
string cudnn_rnn_configuration_(const CudnnRnnShapeSlot &, const char *mode) const
void cudnn_copy_weight_regions_(int num_linear_layers, Index input_features, Index output_features, const TensorView *const *matrices, const TensorView *const *vectors, Buffer &packed_weights, bool to_cudnn) const
unique_lock< mutex > lock_backend_state() const
Definition cudnn_rnn.h:86
virtual void unpack_gradients_from_cudnn_(Buffer &) const =0
void drive_cudnn_backward_(const CudnnRnnDims &, const TensorView &input, const TensorView &sequence_output, const TensorView &output_delta, const TensorView &cudnn_input_sequence, const TensorView &cudnn_output_sequence, TensorView &input_delta, TensorView &sequence_delta_scratch, TensorView &input_delta_scratch, const Buffer &forward_state, Buffer &backward_scratch) const
void cudnn_pack_weights_(int num_linear_layers, Index input_features, Index output_features, const TensorView *const *weights, const TensorView *const *biases, Buffer &forward_state, uint64_t parameters_version) const
Definition tensor_types.h:540