Poplar and PopLibs
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
LayerNorm.hpp
Go to the documentation of this file.
1// Copyright (c) 2019 Graphcore Ltd. All rights reserved.
8#ifndef popnn_LayerNorm_hpp
9#define popnn_LayerNorm_hpp
10#include "popnn/GroupNorm.hpp"
11#include "poputil/DebugInfo.hpp"
12
13namespace popnn {
14namespace ln {
15
44inline std::pair<poplar::Tensor, poplar::Tensor>
45layerNormStatistics(poplar::Graph &graph, const poplar::Tensor acts, float eps,
46 poplar::program::Sequence &prog, bool unbiasedVarEstimate,
47 bool stableAlgo = false,
48 const poplar::Type &partialsType = poplar::FLOAT,
49 const poplar::DebugContext &debugContext = {},
50 const poplar::OptionFlags &options = {}) {
51 poputil::PoplibsOpDebugInfo di(debugContext,
52 DI_ARGS(acts, eps, unbiasedVarEstimate,
53 stableAlgo, partialsType, options));
54
55 auto outputs = popnn::gn::groupNormStatistics(graph, acts, eps, prog, 1,
56 unbiasedVarEstimate, stableAlgo,
57 partialsType, {di}, options);
58
59 di.addOutputs({{"mean", poputil::toProfileValue(outputs.first)},
60 {"iStdDev", poputil::toProfileValue(outputs.second)}});
61 return outputs;
62}
63
80inline poplar::Tensor
82 const poplar::Tensor &mean, const poplar::Tensor &invStdDev,
84 const poplar::DebugContext &debugContext = {},
85 const poplar::OptionFlags &options = {}) {
86 poputil::PoplibsOpDebugInfo di(debugContext,
87 DI_ARGS(acts, mean, invStdDev, options));
88
89 auto output = popnn::gn::groupNormWhiten(graph, acts, mean, invStdDev, prog,
90 {di}, options);
91 di.addOutput(output);
92 return output;
93}
94
124inline std::pair<poplar::Tensor, poplar::Tensor>
126 const poplar::Tensor &gamma, const poplar::Tensor &beta,
127 const poplar::Tensor &mean, const poplar::Tensor &invStdDev,
129 const poplar::DebugContext &debugContext = {},
130 const poplar::OptionFlags &options = {}) {
131 poputil::PoplibsOpDebugInfo di(
132 debugContext, DI_ARGS(acts, gamma, beta, mean, invStdDev, options));
133
134 auto outputs = popnn::gn::groupNormalise(graph, acts, gamma, beta, mean,
135 invStdDev, prog, {di}, options);
136
137 di.addOutputs({{"normActs", poputil::toProfileValue(outputs.first)},
138 {"whitenedActs", poputil::toProfileValue(outputs.second)}});
139 return outputs;
140}
141
162inline std::pair<poplar::Tensor, poplar::Tensor> layerNormParamGradients(
163 poplar::Graph &graph, const poplar::Tensor &acts,
164 const poplar::Tensor &gradsIn, const poplar::Tensor &mean,
165 const poplar::Tensor &iStdDev, poplar::program::Sequence &prog,
166 const poplar::Type &partialsType = poplar::FLOAT,
167 const poplar::DebugContext &debugContext = {},
168 const poplar::OptionFlags &options = {}) {
169
170 poputil::PoplibsOpDebugInfo di(
171 debugContext,
172 DI_ARGS(acts, gradsIn, mean, iStdDev, partialsType, options));
173
174 auto outputs = popnn::gn::groupNormParamGradients(
175 graph, acts, gradsIn, mean, iStdDev, prog, partialsType, {di}, options);
176
177 di.addOutputs({{"meanGrad", poputil::toProfileValue(outputs.first)},
178 {"iStdDevGrad", poputil::toProfileValue(outputs.second)}});
179 return outputs;
180}
181
199inline std::pair<poplar::Tensor, poplar::Tensor> layerNormParamGradients(
200 poplar::Graph &graph, const poplar::Tensor &actsWhitened,
201 const poplar::Tensor &gradsIn, poplar::program::Sequence &prog,
202 const poplar::Type &partialsType = poplar::FLOAT,
203 const poplar::DebugContext &debugContext = {},
204 const poplar::OptionFlags &options = {}) {
205 poputil::PoplibsOpDebugInfo di(
206 debugContext, DI_ARGS(actsWhitened, gradsIn, partialsType, options));
207
208 auto outputs = popnn::gn::groupNormParamGradients(
209 graph, actsWhitened, gradsIn, prog, partialsType, {di}, options);
210
211 di.addOutputs({{"meanGrad", poputil::toProfileValue(outputs.first)},
212 {"iStdDevGrad", poputil::toProfileValue(outputs.second)}});
213 return outputs;
214}
215
240inline poplar::Tensor
242 const poplar::Tensor &gradsIn, const poplar::Tensor &mean,
243 const poplar::Tensor &invStdDev, const poplar::Tensor &gamma,
245 const poplar::Type &partialsType = poplar::FLOAT,
246 const poplar::DebugContext &debugContext = {},
247 const poplar::OptionFlags &options = {}) {
248 poputil::PoplibsOpDebugInfo di(
249 debugContext,
250 DI_ARGS(acts, gradsIn, mean, invStdDev, gamma, partialsType, options));
251
252 auto output =
253 popnn::gn::groupNormGradients(graph, acts, gradsIn, mean, invStdDev,
254 gamma, prog, partialsType, {di}, options);
255 di.addOutput(output);
256 return output;
257}
258
281inline poplar::Tensor
283 const poplar::Tensor &gradsIn,
284 const poplar::Tensor &invStdDev, const poplar::Tensor &gamma,
286 const poplar::Type &partialsType = poplar::FLOAT,
287 const poplar::DebugContext &debugContext = {},
288 const poplar::OptionFlags &options = {}) {
289 poputil::PoplibsOpDebugInfo di(
290 debugContext,
291 DI_ARGS(actsWhitened, gradsIn, invStdDev, gamma, partialsType, options));
292
293 auto output =
294 popnn::gn::groupNormGradients(graph, actsWhitened, gradsIn, invStdDev,
295 gamma, prog, partialsType, {di}, options);
296 di.addOutput(output);
297 return output;
298}
299
323 const poplar::Tensor &gammaDelta,
324 const poplar::Tensor &betaDelta, float scale,
325 poplar::Tensor &gamma, poplar::Tensor &beta,
327 const poplar::DebugContext &debugContext = {},
328 const poplar::OptionFlags &options = {}) {
329 poputil::PoplibsOpDebugInfo di(
330 debugContext,
331 DI_ARGS(gammaDelta, betaDelta, scale, gamma, beta, options));
332
333 return popnn::gn::groupNormParamUpdate(graph, gammaDelta, betaDelta, scale,
334 gamma, beta, prog, {di}, options);
335}
336
360 const poplar::Tensor &gammaDelta,
361 const poplar::Tensor &betaDelta,
362 const poplar::Tensor &scale,
363 poplar::Tensor &gamma, poplar::Tensor &beta,
365 const poplar::DebugContext &debugContext = {},
366 const poplar::OptionFlags &options = {}) {
367 poputil::PoplibsOpDebugInfo di(
368 debugContext,
369 DI_ARGS(gammaDelta, betaDelta, scale, gamma, beta, options));
370
371 return popnn::gn::groupNormParamUpdate(graph, gammaDelta, betaDelta, scale,
372 gamma, beta, prog, {di}, options);
373}
374} // namespace ln
375} // namespace popnn
376#endif // popnn_LayerNorm_hpp
Poplibs generic debug info structure.
Group normalization operations.
poplar::Tensor layerNormGradients(poplar::Graph &graph, const poplar::Tensor &acts, const poplar::Tensor &gradsIn, const poplar::Tensor &mean, const poplar::Tensor &invStdDev, const poplar::Tensor &gamma, poplar::program::Sequence &prog, const poplar::Type &partialsType=poplar::FLOAT, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute gradients with respect to input activations for the layer norm layer.
Definition: LayerNorm.hpp:241
poplar::Tensor layerNormWhiten(poplar::Graph &graph, const poplar::Tensor &acts, const poplar::Tensor &mean, const poplar::Tensor &invStdDev, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Whiten activations given the mean and standard deviation.
Definition: LayerNorm.hpp:81
std::pair< poplar::Tensor, poplar::Tensor > layerNormalise(poplar::Graph &graph, const poplar::Tensor &acts, const poplar::Tensor &gamma, const poplar::Tensor &beta, const poplar::Tensor &mean, const poplar::Tensor &invStdDev, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Layer normalise activations given the mean, standard deviation and batch norm parameters.
Definition: LayerNorm.hpp:125
std::pair< poplar::Tensor, poplar::Tensor > layerNormStatistics(poplar::Graph &graph, const poplar::Tensor acts, float eps, poplar::program::Sequence &prog, bool unbiasedVarEstimate, bool stableAlgo=false, const poplar::Type &partialsType=poplar::FLOAT, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Estimate mean and inverse of standard deviation of activations.
Definition: LayerNorm.hpp:45
void layerNormParamUpdate(poplar::Graph &graph, const poplar::Tensor &gammaDelta, const poplar::Tensor &betaDelta, float scale, poplar::Tensor &gamma, poplar::Tensor &beta, poplar::program::Sequence &prog, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Update layer norm parameters given the gradients with respect to the parameters.
Definition: LayerNorm.hpp:322
std::pair< poplar::Tensor, poplar::Tensor > layerNormParamGradients(poplar::Graph &graph, const poplar::Tensor &acts, const poplar::Tensor &gradsIn, const poplar::Tensor &mean, const poplar::Tensor &iStdDev, poplar::program::Sequence &prog, const poplar::Type &partialsType=poplar::FLOAT, const poplar::DebugContext &debugContext={}, const poplar::OptionFlags &options={})
Compute gradients with respect to parameters for parameter update.
Definition: LayerNorm.hpp:162
DebugContext gathers the common external parameters of the context of an operation.
Definition: DebugContext.hpp:221
This class represents a graph program to be executed on the IPU.
Definition: Graph.hpp:52
A set of option/value string flags to be used in various APIs.
Definition: OptionFlags.hpp:24
A reference to a subset of tensor elements.
Definition: Tensor.hpp:38
Class representing device data types.
Definition: Type.hpp:42
Program that executes a sequence of programs.
Definition: Program.hpp:77
half2 ln(half2 src)
Targets the f16v2ln instruction.
Definition: ipu_intrinsics:567
Type FLOAT
Device type: float
Functions used in neural networks.
Definition: BatchNorm.hpp:14