LBANN  0.103.0
LivermoreBigArtificialNeuralNetworkToolkit
distconv_adapter.hpp
Go to the documentation of this file.
1 // Copyright (c) 2014-2023, Lawrence Livermore National Security, LLC.
3 // Produced at the Lawrence Livermore National Laboratory.
4 // Written by the LBANN Research Team (B. Van Essen, et al.) listed in
5 // the CONTRIBUTORS file. <lbann-dev@llnl.gov>
6 //
7 // LLNL-CODE-697807.
8 // All rights reserved.
9 //
10 // This file is part of LBANN: Livermore Big Artificial Neural Network
11 // Toolkit. For details, see http://software.llnl.gov/LBANN or
12 // https://github.com/LLNL/LBANN.
13 //
14 // Licensed under the Apache License, Version 2.0 (the "Licensee"); you
15 // may not use this file except in compliance with the License. You may
16 // obtain a copy of the License at:
17 //
18 // http://www.apache.org/licenses/LICENSE-2.0
19 //
20 // Unless required by applicable law or agreed to in writing, software
21 // distributed under the License is distributed on an "AS IS" BASIS,
22 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
23 // implied. See the License for the specific language governing
24 // permissions and limitations under the license.
26 
27 #ifndef LBANN_LAYERS_DISTCONV_ADAPTER_HPP_INCLUDED
28 #define LBANN_LAYERS_DISTCONV_ADAPTER_HPP_INCLUDED
29 
30 #include <unordered_map>
31 #include <unordered_set>
32 
33 #include "distconv/tensor/distribution.hpp"
34 #include "distconv/tensor/tensor.hpp"
35 
36 // Provide access to El::Int
37 #include "El.hpp"
38 
39 namespace lbann {
40 
41 class Layer;
42 
43 namespace dc {
44 using Dist = ::distconv::tensor::Distribution;
45 using AbsTensor = ::distconv::tensor::AbstractTensor;
46 } // namespace dc
47 
49 {
50 public:
51  using dist_set = std::unordered_set<dc::Dist*>;
52  using const_dist_set = std::unordered_set<const dc::Dist*>;
53 
54  tensor_overlap_constraints() = default;
55  virtual ~tensor_overlap_constraints() = default;
56 
57  void mark_equivalent(dc::Dist& d1, dc::Dist& d2);
58  void mark_updated(const dc::Dist& d);
59  void mark_invariant(const dc::Dist& d);
60 
61  void find_valid_overlap();
62 
63 private:
64  std::unordered_map<const dc::Dist*, dist_set> m_equivalents;
67 };
68 
70 {
71  friend class Layer;
72 
73 public:
74  distconv_adapter(Layer& layer);
75  virtual ~distconv_adapter() = default;
76 
78  virtual const dc::AbsTensor& get_activations(const Layer& child) const = 0;
80  virtual const dc::AbsTensor& get_error_signals(const Layer& parent) const = 0;
81 
82  virtual void setup_distributions(tensor_overlap_constraints& constraints);
83  void
84  impose_adjacent_overlap_constraints(tensor_overlap_constraints& constraints);
85 
86  dc::Dist& get_prev_activations_dist();
87  const dc::Dist& get_prev_activations_dist() const;
88  dc::Dist& get_activations_dist();
89  const dc::Dist& get_activations_dist() const;
90  dc::Dist& get_prev_error_signals_dist();
91  const dc::Dist& get_prev_error_signals_dist() const;
92  dc::Dist& get_error_signals_dist();
93  const dc::Dist& get_error_signals_dist() const;
94 
95  virtual void setup_fp_tensors();
96  virtual void setup_bp_tensors();
97 
98  virtual void setup_layer(size_t workspace_capacity) {}
99 
100  virtual void fp_setup() = 0;
101  virtual void fp_postprocess() = 0;
102  virtual void bp_setup() = 0;
103  virtual void bp_postprocess() = 0;
104 
105  virtual bool parent_copy_required(size_t input_index) const;
106  virtual bool parent_shuffle_required(size_t input_index) const;
107  virtual bool child_copy_required(size_t output_index) const;
108  virtual bool child_shuffle_required(size_t output_index) const;
109 
110  virtual void dump_activations() const = 0;
111  virtual void dump_original_activations() = 0;
112  virtual void dump_error_signals() const = 0;
113  virtual void dump_original_error_signals() = 0;
114 
115 protected:
116  virtual Layer& layer();
117  virtual const Layer& layer() const;
118  std::string get_name() const;
119 
120  virtual void setup_prev_activations() = 0;
121  virtual void setup_original_prev_activations() = 0;
122  virtual void setup_activations() = 0;
123  virtual void setup_original_activations() = 0;
124 
125  virtual void setup_prev_error_signals() = 0;
126  virtual void setup_original_prev_error_signals() = 0;
127  virtual void setup_error_signals() = 0;
128  virtual void setup_original_error_signals() = 0;
129 
130  virtual void ensure_prev_activations() = 0;
131  virtual void copy_out_activations() = 0;
132  virtual void ensure_prev_error_signals() = 0;
133  virtual void copy_out_error_signals() = 0;
134 
135  std::vector<dc::Dist> m_prev_activations_dists;
136  std::vector<dc::Dist> m_activations_dists;
137  std::vector<dc::Dist> m_prev_error_signals_dists;
138  std::vector<dc::Dist> m_error_signals_dists;
139 
140 private:
142  std::vector<bool> m_parent_copy_required;
143  std::vector<bool> m_parent_shuffle_required;
144  std::vector<bool> m_child_copy_required;
145  std::vector<bool> m_child_shuffle_required;
146 
147  void setup_tensor_shuffle();
148  void adjust_parallel_strategy();
149 };
150 
151 } // namespace lbann
152 
153 #endif // LBANN_LAYERS_DISTCONV_ADAPTER_HPP_INCLUDED
std::vector< dc::Dist > m_error_signals_dists
std::unordered_set< dc::Dist * > dist_set
std::vector< dc::Dist > m_prev_activations_dists
std::vector< dc::Dist > m_activations_dists
std::vector< dc::Dist > m_prev_error_signals_dists
Neural network tensor operation.
Definition: layer.hpp:285
std::vector< bool > m_child_copy_required
std::vector< bool > m_parent_shuffle_required
virtual void setup_layer(size_t workspace_capacity)
std::vector< bool > m_child_shuffle_required
std::unordered_set< const dc::Dist * > const_dist_set
std::unordered_map< const dc::Dist *, dist_set > m_equivalents
::distconv::tensor::AbstractTensor AbsTensor
::distconv::tensor::Distribution Dist
std::vector< bool > m_parent_copy_required