[optimizer] Cleanup optimizers
authorParichay Kapoor <pk.kapoor@samsung.com>
Fri, 10 Dec 2021 16:29:12 +0000 (01:29 +0900)
committerJijoong Moon <jijoong.moon@samsung.com>
Wed, 20 Apr 2022 10:47:00 +0000 (19:47 +0900)
cleanup the optimizer interface and existing implementations.

Signed-off-by: Parichay Kapoor <pk.kapoor@samsung.com>
17 files changed:
debian/nntrainer-dev.install
jni/Android.mk
nntrainer/models/dynamic_training_optimization.cpp
nntrainer/models/dynamic_training_optimization.h
nntrainer/optimizers/adam.cpp
nntrainer/optimizers/adam.h
nntrainer/optimizers/meson.build
nntrainer/optimizers/optimizer_devel.h
nntrainer/optimizers/optimizer_impl.cpp [deleted file]
nntrainer/optimizers/optimizer_impl.h [deleted file]
nntrainer/optimizers/optimizer_wrapped.cpp
nntrainer/optimizers/optimizer_wrapped.h
nntrainer/optimizers/plugged_optimizer.h
nntrainer/optimizers/sgd.cpp
nntrainer/optimizers/sgd.h
packaging/nntrainer.spec
test/unittest/unittest_nntrainer_appcontext.cpp

index 0e8416a..f8f8e2a 100644 (file)
@@ -19,7 +19,6 @@
 # optimizer headers
 /usr/include/nntrainer/optimizer_context.h
 /usr/include/nntrainer/optimizer_devel.h
-/usr/include/nntrainer/optimizer_impl.h
 /usr/include/nntrainer/lr_scheduler.h
 # pkg config and static binary
 /usr/lib/*/pkgconfig/nntrainer.pc
index 901f062..45648f4 100644 (file)
@@ -193,7 +193,7 @@ NNTRAINER_SRCS := $(NNTRAINER_ROOT)/nntrainer/models/neuralnet.cpp \
                   $(NNTRAINER_ROOT)/nntrainer/graph/connection.cpp \
                   $(NNTRAINER_ROOT)/nntrainer/optimizers/optimizer_context.cpp \
                   $(NNTRAINER_ROOT)/nntrainer/optimizers/optimizer_devel.cpp \
-                  $(NNTRAINER_ROOT)/nntrainer/optimizers/optimizer_impl.cpp \
+                  $(NNTRAINER_ROOT)/nntrainer/optimizers/optimizer_wrapped.cpp \
                   $(NNTRAINER_ROOT)/nntrainer/optimizers/adam.cpp \
                   $(NNTRAINER_ROOT)/nntrainer/optimizers/sgd.cpp \
                   $(NNTRAINER_ROOT)/nntrainer/optimizers/lr_scheduler_constant.cpp \
index 5ea37e0..72eda00 100644 (file)
@@ -15,6 +15,7 @@
 #include <vector>
 
 #include <dynamic_training_optimization.h>
+#include <optimizer_wrapped.h>
 #include <tensor.h>
 #include <util_func.h>
 #include <weight.h>
@@ -39,7 +40,7 @@ DynamicTrainingOptimization::DynamicTrainingOptimization(int threshold_,
 bool DynamicTrainingOptimization::checkIfApply(
   const std::vector<Weight> &weights, const std::shared_ptr<Var_Grad> &input,
   const std::shared_ptr<Var_Grad> &output,
-  const std::shared_ptr<Optimizer> &opt, int iteration) {
+  const std::shared_ptr<OptimizerWrapped> &opt, int iteration) {
   if (!enabled || iteration < skip_n_iterations)
     return true;
 
@@ -60,7 +61,7 @@ bool DynamicTrainingOptimization::checkIfApply(
 bool DynamicTrainingOptimization::checkIfApply(
   const Weight &weight, const std::shared_ptr<Var_Grad> &input,
   const std::shared_ptr<Var_Grad> &output,
-  const std::shared_ptr<Optimizer> &opt, int iteration) {
+  const std::shared_ptr<OptimizerWrapped> &opt, int iteration) {
   if (iteration < skip_n_iterations)
     return true;
 
index ad2b4bb..210c368 100644 (file)
 #include <vector>
 
 #include <layer_devel.h>
-#include <optimizer_devel.h>
 #include <tensor.h>
 
 namespace nntrainer {
 
 class Weight;
 class Var_Grad;
+class OptimizerWrapped;
 
 /**
  * @class   DynamicTraining Optimization
@@ -146,7 +146,8 @@ public:
   bool checkIfApply(const std::vector<Weight> &weights,
                     const std::shared_ptr<Var_Grad> &input,
                     const std::shared_ptr<Var_Grad> &output,
-                    const std::shared_ptr<Optimizer> &opt, int iteration);
+                    const std::shared_ptr<OptimizerWrapped> &opt,
+                    int iteration);
 
   /**
    * @brief     Check if the given weight can skip updating
@@ -160,7 +161,8 @@ public:
   bool checkIfApply(const Weight &weight,
                     const std::shared_ptr<Var_Grad> &input,
                     const std::shared_ptr<Var_Grad> &output,
-                    const std::shared_ptr<Optimizer> &opt, int iteration);
+                    const std::shared_ptr<OptimizerWrapped> &opt,
+                    int iteration);
 
   /**< Different types of reduce operations */
   static const std::string dft_opt_max;
index 184e5ce..6e4eb25 100644 (file)
@@ -24,8 +24,7 @@ namespace nntrainer {
 
 Adam::Adam() : adam_props(PropsB1(), PropsB2(), PropsEpsilon(), TorchRef()) {
   /** default properties */
-  setProperty({"learning_rate=0.001"});
-  auto &[b1, b2, eps, torch_ref] = adam_props;
+  auto &[b1, b2, eps, rotch_ref] = adam_props;
   b1.set(0.9f);
   b2.set(0.999f);
   eps.set(1.0e-7f);
@@ -42,12 +41,12 @@ std::vector<TensorDim> Adam::getOptimizerVariableDim(const TensorDim &dim) {
 
 void Adam::exportTo(Exporter &exporter, const ExportMethods &method) const {
   exporter.saveResult(adam_props, method, this);
-  OptimizerImpl::exportTo(exporter, method);
+  Optimizer::exportTo(exporter, method);
 }
 
 void Adam::setProperty(const std::vector<std::string> &values) {
   auto left = loadProperties(values, adam_props);
-  OptimizerImpl::setProperty(left);
+  Optimizer::setProperty(left);
 }
 
 double Adam::getUpdatedLearningRate(unsigned int iteration, double ll) const {
index d758fc3..af60607 100644 (file)
@@ -17,7 +17,7 @@
 #include <tuple>
 
 #include <base_properties.h>
-#include <optimizer_impl.h>
+#include <optimizer_devel.h>
 
 namespace nntrainer {
 
@@ -66,7 +66,7 @@ public:
  * @class   Adam optimizer class
  * @brief   Adam optimizer
  */
-class Adam : public OptimizerImpl {
+class Adam : public Optimizer {
 public:
   /**
    * @brief Construct a new Adam object
@@ -81,6 +81,12 @@ public:
   ~Adam();
 
   /**
+   * @copydoc Optimizer::getDefaultLearningRate()
+   *
+   */
+  double getDefaultLearningRate() const { return 0.001; }
+
+  /**
    * @copydoc applyGradient(RunOptimizerContext &context)
    */
   void applyGradient(RunOptimizerContext &context) override;
index 0e0431b..5349ce2 100644 (file)
@@ -1,7 +1,6 @@
 optimizer_sources = [
   'adam.cpp',
   'optimizer_devel.cpp',
-  'optimizer_impl.cpp',
   'sgd.cpp',
   'optimizer_context.cpp',
   'lr_scheduler_constant.cpp',
@@ -11,7 +10,6 @@ optimizer_sources = [
 
 optimizer_headers = [
   'optimizer_devel.h',
-  'optimizer_impl.h',
   'optimizer_context.h',
   'lr_scheduler.h'
 ]
index c256241..c8b93d4 100644 (file)
@@ -38,17 +38,7 @@ public:
    * @brief     get Learning Rate
    * @retval    Learning rate in float
    */
-  virtual float getLearningRate() const { return getLearningRate(0); }
-
-  /**
-   * @brief     get Learning Rate for the given iteration
-   * @param[in] iteration Iteration for the learning rate
-   * @retval    Learning rate in double
-   * @detail    the return value of this function and getLearningRate() must
-   * match for iteration == 0.
-   */
-  virtual double getLearningRate(size_t iteration) const = 0;
-
+  virtual double getDefaultLearningRate() const = 0;
   /**
    * @brief     apply gradient to weight
    * @param[in] context Optimizer context
diff --git a/nntrainer/optimizers/optimizer_impl.cpp b/nntrainer/optimizers/optimizer_impl.cpp
deleted file mode 100644 (file)
index 93dd62c..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-/**
- * Copyright (C) 2020 Parichay Kapoor <pk.kapoor@samsung.com>
- *
- * @file   optimizer_impl.cpp
- * @date   18 March 2021
- * @brief  This is base Optimizer implementation class
- * @see    https://github.com/nnstreamer/nntrainer
- * @author Jijoong Moon <jijoong.moon@samsung.com>
- * @author Parichay Kapoor <pk.kapoor@samsung.com>
- * @bug    No known bugs except for NYI items
- *
- */
-
-#include <cmath>
-#include <fstream>
-#include <iostream>
-
-#include <common_properties.h>
-#include <nntrainer_error.h>
-#include <nntrainer_log.h>
-#include <node_exporter.h>
-#include <optimizer_impl.h>
-#include <util_func.h>
-
-namespace nntrainer {
-
-OptimizerImpl::OptimizerImpl() :
-  optimizer_impl_props(props::LearningRate(), props::DecayRate(),
-                       props::DecaySteps()) {}
-
-void OptimizerImpl::setProperty(const std::vector<std::string> &values) {
-  auto left = loadProperties(values, optimizer_impl_props);
-  NNTR_THROW_IF(left.size(), std::invalid_argument)
-    << "[OptimizerImpl] There are unparsed properties";
-}
-
-void OptimizerImpl::exportTo(Exporter &exporter,
-                             const ExportMethods &method) const {
-  exporter.saveResult(optimizer_impl_props, method, this);
-}
-
-double OptimizerImpl::getLearningRate(size_t iteration) const {
-
-  auto &[float_lr, decay_rate, decay_steps] = optimizer_impl_props;
-  double ll = float_lr;
-
-  if (!decay_steps.empty() && !decay_rate.empty()) {
-    ll = ll * pow(decay_rate, (iteration / (float)decay_steps));
-  }
-
-  return ll;
-}
-
-} // namespace nntrainer
diff --git a/nntrainer/optimizers/optimizer_impl.h b/nntrainer/optimizers/optimizer_impl.h
deleted file mode 100644 (file)
index 22c6870..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-// SPDX-License-Identifier: Apache-2.0
-/**
- * Copyright (C) 2020 Parichay Kapoor <pk.kapoor@samsung.com>
- *
- * @file   optimizer_impl.h
- * @date   18 March 2021
- * @brief  This is base Optimizer implementation class
- * @see    https://github.com/nnstreamer/nntrainer
- * @author Jijoong Moon <jijoong.moon@samsung.com>
- * @author Parichay Kapoor <pk.kapoor@samsung.com>
- * @bug    No known bugs except for NYI items
- *
- */
-
-#ifndef __OPTIMIZER_IMPL_H__
-#define __OPTIMIZER_IMPL_H__
-#ifdef __cplusplus
-
-#include <tuple>
-
-#include <common_properties.h>
-#include <optimizer_devel.h>
-
-namespace nntrainer {
-
-/**
- * @class   Optimizer Base class for optimizers
- * @brief   Basic implementation class for nntrainer supported optimizers
- */
-class OptimizerImpl : public Optimizer {
-
-public:
-  /**
-   * @brief Construct a new Optimizer Impl object
-   *
-   */
-  OptimizerImpl();
-
-  /**
-   * @brief  copy constructor
-   * @param[in] rhs OptimizerImpl to be copied
-   */
-  OptimizerImpl(const OptimizerImpl &rhs) = default;
-
-  /**
-   * @brief  copy assignment operator
-   * @param[in] rhs OptimizerImpl to be copied
-   */
-  OptimizerImpl &operator=(const OptimizerImpl &rhs) = default;
-
-  /**
-   *  @brief  Move constructor operator.
-   * @param[in] rhs OptimizerImpl to be moved
-   */
-  OptimizerImpl(OptimizerImpl &&rhs) noexcept = default;
-
-  /**
-   * @brief  Move assignment operator.
-   * @parma[in] rhs OptimizerImpl to be moved.
-   */
-  OptimizerImpl &operator=(OptimizerImpl &&rhs) noexcept = default;
-
-  /**
-   * @brief     get Learning Rate for the given iteration
-   * @param[in] iteration Iteration for the learning rate
-   * @retval    Learning rate
-   */
-  double getLearningRate(size_t iteration) const override;
-
-  /**
-   * @copydoc Optimizer::setProperty(const std::vector<std::string> &values)
-   */
-  void setProperty(const std::vector<std::string> &values) override;
-
-  /**
-   * @copydoc Optimizer::exportTo(Exporter &exporter, const ExportMethods&
-   * method)
-   */
-  void exportTo(Exporter &exporter, const ExportMethods &method) const override;
-
-  /**
-   * @brief     Get dimension of extra variables if the optimizer needs any.
-   * @param dim Dimension of tensor to be added as a optimizer variable
-   * @return    Vector of dimensions
-   */
-  virtual std::vector<TensorDim>
-  getOptimizerVariableDim(const TensorDim &dim) override {
-    return {};
-  }
-
-protected:
-  std::tuple<props::LearningRate, props::DecayRate, props::DecaySteps>
-    optimizer_impl_props;
-};
-
-} /* namespace nntrainer */
-
-#endif /* __cplusplus */
-#endif /* __OPTIMIZER_IMPL_H__ */
index 7198443..a3ca9bf 100644 (file)
@@ -58,7 +58,9 @@ createOptimizerWrapped(std::unique_ptr<OptimizerCore> &&opt,
 OptimizerWrapped::OptimizerWrapped(std::unique_ptr<OptimizerCore> &&opt) :
   optimizer(std::move(opt)),
   lr_sched(),
-  props(props::LearningRate(), props::DecayRate(), props::DecaySteps()) {}
+  props(props::LearningRate(), props::DecayRate(), props::DecaySteps()) {
+  std::get<props::LearningRate>(props).set(optimizer->getDefaultLearningRate());
+}
 
 const std::string OptimizerWrapped::getType() const {
   return optimizer->getType();
@@ -66,9 +68,7 @@ const std::string OptimizerWrapped::getType() const {
 
 void OptimizerWrapped::setProperty(const std::vector<std::string> &values) {
   auto remain_props = loadProperties(values, props);
-  // TODO: update to remain_props
-  optimizer->setProperty(values);
-  // optimizer->setProperty(remain_props);
+  optimizer->setProperty(remain_props);
 }
 
 double OptimizerWrapped::getLearningRate(size_t iteration) {
index 40c6474..9cbf4a0 100644 (file)
 #include <string>
 #include <vector>
 
+#include <common_properties.h>
 #include <lr_scheduler.h>
 #include <optimizer.h>
 #include <optimizer_devel.h>
 
 namespace nntrainer {
 
-namespace props {
-class LearningRate;
-class DecaySteps;
-class DecayRate;
-} // namespace props
-
-/** TODO: change to nntrainer::Optimizer */
 using OptimizerCore = nntrainer::Optimizer;
 
 /**
index 9d326a2..fc527f6 100644 (file)
@@ -63,24 +63,12 @@ public:
   PluggedOptimizer &operator=(PluggedOptimizer &&rhs) = default;
 
   /**
-   * @copydoc OptimizerDevel::getLearningRate()
+   * @copydoc Optimizer::getDefaultLearningRate()
    *
    */
-  float getLearningRate() const override {
-    return optimizer_devel->getLearningRate();
+  double getDefaultLearningRate() const override {
+    return optimizer_devel->getDefaultLearningRate();
   }
-
-  /**
-   * @brief     get Learning Rate for the given iteration
-   * @param[in] iteration Iteration for the learning rate
-   * @retval    Learning rate in double
-   * @detail    the return value of this function and getLearningRate() must
-   * match for iteration == 0.
-   */
-  double getLearningRate(size_t iteration) const override {
-    return optimizer_devel->getLearningRate(iteration);
-  }
-
   /**
    * @brief     apply gradient to weight
    * @param[in] context Optimizer context
index 1276ed0..8b0078e 100644 (file)
@@ -15,8 +15,6 @@
 
 namespace nntrainer {
 
-SGD::SGD() { setProperty({"learning_rate=0.0001"}); }
-
 void SGD::applyGradient(RunOptimizerContext &context) {
   context.applyGradient(context.getLearningRate());
 }
index 2a3d816..a8e0393 100644 (file)
@@ -14,7 +14,7 @@
 #define __SGD_H__
 #ifdef __cplusplus
 
-#include <optimizer_impl.h>
+#include <optimizer_devel.h>
 
 namespace nntrainer {
 
@@ -22,13 +22,19 @@ namespace nntrainer {
  * @class   SGD optimizer class
  * @brief   Stochastic Gradient Descent optimizer class
  */
-class SGD : public OptimizerImpl {
+class SGD : public Optimizer {
 public:
   /**
    * @brief Construct a new SGD object
    *
    */
-  SGD();
+  SGD() {}
+
+  /**
+   * @copydoc Optimizer::getDefaultLearningRate()
+   *
+   */
+  double getDefaultLearningRate() const { return 0.0001; }
 
   /**
    * @copydoc applyGradient(RunOptimizerContext &context)
@@ -40,6 +46,14 @@ public:
    */
   const std::string getType() const { return SGD::type; }
 
+  /**
+   * @copydoc Optimizer::getOptimizerVariableDim(const TensorDim &dim)
+   */
+  std::vector<TensorDim>
+  getOptimizerVariableDim(const TensorDim &dim) override {
+    return {};
+  }
+
   inline static const std::string type = "sgd";
 };
 } /* namespace nntrainer */
index 01dab14..31a1ab8 100644 (file)
@@ -489,7 +489,6 @@ cp -r result %{buildroot}%{_datadir}/nntrainer/unittest/
 # optimizer headers
 %{_includedir}/nntrainer/optimizer_context.h
 %{_includedir}/nntrainer/optimizer_devel.h
-%{_includedir}/nntrainer/optimizer_impl.h
 %{_includedir}/nntrainer/lr_scheduler.h
 %{_libdir}/pkgconfig/nntrainer.pc
 # update this to enable external applications
index f985e60..a765246 100644 (file)
@@ -102,9 +102,7 @@ public:
   /** Full custom optimizer example which overrides all functions */
   const std::string getType() const override { return "identity_optimizer"; }
 
-  float getLearningRate() const override { return 1.0f; }
-
-  double getLearningRate(size_t iteration) const override { return 1.0f; }
+  double getDefaultLearningRate() const override { return 1.0; }
 
   void setProperty(const std::vector<std::string> &values) override {}
 
@@ -125,7 +123,7 @@ public:
   /** Minimal custom optimizer example which define only necessary functions */
   const std::string getType() const override { return "identity_optimizer"; }
 
-  double getLearningRate(size_t iteration) const override { return 1.0f; }
+  double getDefaultLearningRate() const override { return 1.0; }
 
   std::vector<nntrainer::TensorDim>
   getOptimizerVariableDim(const nntrainer::TensorDim &dim) override {