Loading...
Searching...
No Matches
back_propagation.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
9#include <utility>
10
11namespace opennn
12{
13
14class Loss;
15class Network;
17
19{
25
27 Buffer* external_arena = nullptr,
28 span<const Index> arena_offsets = {},
29 Buffer* external_gradient = nullptr,
30 span<const Index> gradient_arena_offsets = {});
31
32 virtual ~BackPropagation() = default;
33
34 void set(Index, Loss&,
35 Buffer* external_arena = nullptr,
36 span<const Index> arena_offsets = {},
37 Buffer* external_gradient = nullptr,
38 span<const Index> gradient_arena_offsets = {});
39
40 Loss* get_loss() const noexcept { return loss; }
42
43 static vector<MemoryPoolEntry> make_co_planned_lifetimes(Loss&, Index batch_size);
44 static vector<MemoryPoolEntry> make_gradient_co_planned_lifetimes(Loss&);
45
46 bool has_joint_gradient_arena() const noexcept
47 {
48 return joint_gradient_arena;
49 }
50
51 Index gradient_logical_bytes() const noexcept
52 {
53 return gradient_bytes;
54 }
55
56 const vector<GradientSlice>& get_gradient_slices() const noexcept
57 {
58 return gradient_slices;
59 }
60
62
64
65 const TensorView& input_delta_addend(size_t layer, size_t input) const noexcept;
66
69
71
73 vector<Buffer> layer_scratch_storage;
75 vector<TensorView> output_deltas;
76 vector<vector<TensorView>> slots;
77
78 Index batch_size = 0;
79
80 struct Metrics
81 {
82 float error = 0.0f;
83 float accuracy = 0.0f;
84 float regularization = 0.0f;
85 float loss_value = 0.0f;
87
88 void reset() { *this = Metrics{}; }
89 };
90
92
93private:
94
95 struct DeltaEntry
96 {
97 Index layer;
98 size_t slot;
99 TensorSpec spec;
100 Index first_step;
101 Index last_step;
102 };
103
104 struct DeltaLayout
105 {
106 vector<DeltaEntry> entries;
107 vector<bool> passthrough_layers;
108 vector<bool> aliases_residual_delta;
109 Index aliased_residual_delta_bytes = 0;
110 vector<pair<size_t, size_t>> reusable_consumer_deltas;
111 };
112
113 struct DeltaPlan
114 {
115 vector<vector<TensorSpec>> backward_specs;
116 DeltaLayout layout;
117 };
118
119 BackPropagation() = default;
120
121 friend struct TrainingContext;
122 friend class TrainingArenaPlan;
123
124 void set(Index, Loss&, Buffer* external_arena,
125 Buffer* external_gradient, const TrainingArenaPlan&);
126
127 DeltaLayout build_delta_layout(const vector<vector<TensorSpec>>&) const;
128 DeltaPlan build_delta_plan();
129 static vector<MemoryPoolEntry> to_pool_entries(const vector<DeltaEntry>&,
130 Index step_offset = 0);
131
132 const Network& require_network() const;
133
134 void setup_gradient(Buffer* external_gradient,
135 Buffer* external_arena,
136 span<const Index> gradient_arena_offsets);
137
138 void setup_arena(const vector<vector<TensorSpec>>&,
139 const DeltaLayout&);
140
141 void bind_deltas(const DeltaLayout&, span<const Index> byte_offsets,
142 uint8_t* base, Device device,
143 const vector<vector<TensorSpec>>&);
144
145 vector<vector<pair<size_t, size_t>>> consumer_edges;
146
147 vector<vector<TensorView>> input_delta_addends;
148 vector<pair<size_t, size_t>> folded_consumer_edge;
149
150 vector<GradientSlice> gradient_slices;
151 vector<TensorView> layer_gradient_views;
152 Index gradient_bytes = 0;
153 bool joint_gradient_arena = false;
154
155 void plan_delta_addends();
156
157 Index output_delta_layer_index = 0;
158
159 Loss* loss = nullptr;
160};
161
162}
Definition loss.h:19
Definition network.h:87
Definition training_arena_plan.h:18
Definition energy_meter.h:7
Definition configuration.h:10
Device
Definition configuration.h:12
@ CUDA
Definition configuration.h:12
Definition back_propagation.h:21
Index parameter_offset
Definition back_propagation.h:23
TensorView values
Definition back_propagation.h:22
Definition back_propagation.h:81
Index active_tokens_count
Definition back_propagation.h:86
float error
Definition back_propagation.h:82
float accuracy
Definition back_propagation.h:83
float loss_value
Definition back_propagation.h:85
float regularization
Definition back_propagation.h:84
void reset()
Definition back_propagation.h:88
Buffer arena
Definition back_propagation.h:72
vector< TensorView > output_deltas
Definition back_propagation.h:75
Buffer execution_workspace
Definition back_propagation.h:74
bool has_joint_gradient_arena() const noexcept
Definition back_propagation.h:46
BackPropagation(Index, Loss &, Buffer *external_arena=nullptr, span< const Index > arena_offsets={}, Buffer *external_gradient=nullptr, span< const Index > gradient_arena_offsets={})
Buffer gradient
Definition back_propagation.h:70
static vector< MemoryPoolEntry > make_co_planned_lifetimes(Loss &, Index batch_size)
vector< Buffer > layer_scratch_storage
Definition back_propagation.h:73
virtual ~BackPropagation()=default
void accumulate_output_deltas(size_t)
Metrics metrics
Definition back_propagation.h:91
Loss * get_loss() const noexcept
Definition back_propagation.h:40
void set(Index, Loss &, Buffer *external_arena=nullptr, span< const Index > arena_offsets={}, Buffer *external_gradient=nullptr, span< const Index > gradient_arena_offsets={})
const vector< GradientSlice > & get_gradient_slices() const noexcept
Definition back_propagation.h:56
Network * get_network() const
const TensorView & get_output_delta() const
Index batch_size
Definition back_propagation.h:78
static vector< MemoryPoolEntry > make_gradient_co_planned_lifetimes(Loss &)
friend class TrainingArenaPlan
Definition back_propagation.h:122
vector< vector< TensorView > > slots
Definition back_propagation.h:76
Index gradient_logical_bytes() const noexcept
Definition back_propagation.h:51
TensorView & get_output_delta()
friend struct TrainingContext
Definition back_propagation.h:121
const TensorView & input_delta_addend(size_t layer, size_t input) const noexcept
Definition tensor_types.h:340
Definition tensor_types.h:281
Definition tensor_types.h:540