ipu_compiler.h 5.2 KB
Newer Older
J
jianghaicheng 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
// Copyright (c) 2021 PaddlePaddle Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#pragma once

#include <popart/builder.hpp>
#include <popart/graphtransformer.hpp>
A
Allen Guo 已提交
19
#include <popart/optimizer.hpp>
J
jianghaicheng 已提交
20 21
#include "paddle/fluid/framework/ir/graph.h"
#include "paddle/fluid/framework/scope.h"
A
Allen Guo 已提交
22 23 24
#include "paddle/fluid/platform/device/ipu/ipu_names.h"
#include "paddle/fluid/platform/device/ipu/ipu_strategy.h"
#include "paddle/fluid/platform/device/ipu/ipu_utils.h"
J
jianghaicheng 已提交
25 26 27 28 29

namespace paddle {
namespace platform {
namespace ipu {

A
Allen Guo 已提交
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
struct CompilerResources {
  // popart input tensor_ids
  std::vector<popart::TensorId> inputs;
  // popart output tensor_ids
  std::vector<popart::TensorId> outputs;
  // <paddle_var_name, popart_tensor_ids>
  std::map<std::string, popart::TensorId> tensors;
  // popart_weight_ids
  std::vector<popart::TensorId> weights;
  // popart loss tensor_id
  popart::TensorId loss_var;
  // paddle lr var_name
  std::string lr_var;
  // lr value
  float lr;
  // flag for lr is constant or scheduling
  bool with_lr_sched = false;
  // paddle optimizer type, eg: momentum, lamb
  std::string optimizer_type;

  using OptimizerFn =
      std::function<std::unique_ptr<popart::Optimizer>(float lr)>;
  OptimizerFn optimizer_fn;
A
Allen Guo 已提交
53 54
  // The eval mode of optimizer in training
  std::unique_ptr<popart::Optimizer> eval_optimizer;
A
Allen Guo 已提交
55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72

 public:
  popart::Optimizer *Optimizer() { return optimizer.get(); }

  popart::Optimizer *NewOptimizer() {
    optimizer = optimizer_fn(lr);
    return optimizer.get();
  }

  popart::Optimizer *UpdateOptimizer(float lr_new) {
    optimizer = optimizer_fn(lr_new);
    return optimizer.get();
  }

 private:
  std::unique_ptr<popart::Optimizer> optimizer;
};

A
Allen Guo 已提交
73 74 75 76 77 78 79 80 81 82 83
// helper for lowering graph
struct GraphHelper {
  explicit GraphHelper(const Graph *);

  const Graph *graph;
  std::map<std::string, Node *> vars_name_map;
  std::map<int, Node *> nodes_id_map;
  std::vector<Node *> sorted_ops;
  std::vector<int> sorted_vars_id;
};

J
jianghaicheng 已提交
84 85 86 87
class Compiler {
 public:
  Compiler();
  ~Compiler();
A
Allen Guo 已提交
88

A
Allen Guo 已提交
89 90
  void Prepare(const Graph *graph);
  void InitInputs(const std::vector<std::string> &feed_list);
J
jianghaicheng 已提交
91
  void InitOutputs(const std::vector<std::string> &fetch_list);
A
Allen Guo 已提交
92 93 94 95
  void LowerConstants(const Scope *scope);
  void LowerWeights(const Scope *scope);
  void LowerBody();
  void LowerOptimizer(const Scope *scope);
J
jianghaicheng 已提交
96 97 98

  void SetIpuStrategy(const IpuStrategy &strategy) {
    ipu_strategy_ = &strategy;
A
Allen Guo 已提交
99 100 101 102 103 104 105 106 107
  }

  void SetCustomOps(const std::vector<IpuCustomOpIdentifier> &custom_ops);

  CompilerResources *GetResources() { return resources_.get(); }

  std::string GetModelProto();
  std::string GetFP16ModelProto();

J
jianghaicheng 已提交
108 109 110 111
  void SaveModelProto(const std::string &path);
  void SaveModelProtoNoCheck(const std::string &path);

 private:
A
Allen Guo 已提交
112
  void RegisterOpFunc();
A
Allen Guo 已提交
113 114
  std::vector<std::string> GetOpInputs(const OpDesc *op);
  const std::vector<std::string> &GetOpOutputs(const OpDesc *op);
A
Allen Guo 已提交
115
  const std::string GetNameScope(const OpDesc *op);
A
Allen Guo 已提交
116
  popart::DebugContext BuildDebugContext(const OpDesc *op);
J
jianghaicheng 已提交
117

A
Allen Guo 已提交
118 119 120 121 122 123 124 125 126 127 128 129 130 131
  void InsertTensors(const std::vector<std::string> &output_names,
                     const std::vector<std::string> &tensor_ids);
  void InsertTensors(const std::vector<std::string> &output_names,
                     const std::string &tensor_id);
  void SetIpuIndexStage(const std::vector<std::string> &tensor_ids,
                        const OpDesc *op_desc);
  void SetIpuIndexStage(const std::string &tensor_id, const OpDesc *op_desc);
  void SetAMPAttributes(const std::vector<std::string> &tensor_ids,
                        const OpDesc *op_desc);
  void SetAMPAttributes(const std::string &tensor_id, const OpDesc *op_desc);
  void SetSerializeAttributes(const std::vector<std::string> &tensor_ids,
                              const OpDesc *op_desc);
  void SetSerializeAttributes(const std::string &tensor_id,
                              const OpDesc *op_desc);
A
Allen Guo 已提交
132 133
  void PushNameScope(const OpDesc *op);
  void PopNameScope(const OpDesc *op);
A
Allen Guo 已提交
134

J
jianghaicheng 已提交
135 136
 private:
  std::unique_ptr<popart::Builder> builder_;
A
Allen Guo 已提交
137
  std::unique_ptr<CompilerResources> resources_;
A
Allen Guo 已提交
138
  std::unique_ptr<GraphHelper> graph_helper_;
J
jianghaicheng 已提交
139

A
Allen Guo 已提交
140
  using OpFunc = std::function<void(OpDesc *op_desc)>;
J
jianghaicheng 已提交
141 142 143
  std::unordered_map<std::string, OpFunc> name_function_;

  const IpuStrategy *ipu_strategy_ = nullptr;
A
Allen Guo 已提交
144
  std::map<std::string, IpuCustomOpIdentifier> custom_ops_;
A
Allen Guo 已提交
145 146 147 148 149 150 151 152

  // Used to choose the way to set amp for Ops
  // If anyone op has the attr sAvailMemAttribute, the
  // available_memory_proportion from ipu_strategy
  // will be ignored and the Ops are set by their own sAvailMemAttribute. Else,
  // all relevant Ops will be set by
  // the available_memory_proportion from ipu_strategy.
  bool set_amp_for_all_ = true;
J
jianghaicheng 已提交
153 154 155 156 157
};

}  // namespace ipu
}  // namespace platform
}  // namespace paddle