[exo-tflite] Introducing Knob for exo-tflite (#6895)
author윤현식/On-Device Lab(SR)/Principal Engineer/삼성전자 <hyunsik.yoon@samsung.com>
Mon, 26 Aug 2019 00:29:24 +0000 (09:29 +0900)
committer박세희/On-Device Lab(SR)/Principal Engineer/삼성전자 <saehie.park@samsung.com>
Mon, 26 Aug 2019 00:29:24 +0000 (09:29 +0900)
Knob for exo-tflite is added. Initially `EnableTFLDialect` knob is added.

Signed-off-by: Hyun Sik Yoon <hyunsik.yoon@samsung.com>
compiler/exo-tflite/src/Knob.cpp [new file with mode: 0644]
compiler/exo-tflite/src/Knob.h [new file with mode: 0644]
compiler/exo-tflite/src/Knob.lst [new file with mode: 0644]

diff --git a/compiler/exo-tflite/src/Knob.cpp b/compiler/exo-tflite/src/Knob.cpp
new file mode 100644 (file)
index 0000000..3b218ce
--- /dev/null
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. 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.
+ */
+
+#include "Knob.h"
+
+#include <pepper/strcast.h>
+
+#include <iostream>
+#include <string>
+
+// Basic Infrastructure to declare and access Knob values
+namespace
+{
+
+using KnobName = std::string;
+
+/**
+ * @brief Load configuration (from somewhere)
+ */
+struct KnobLoader
+{
+  virtual ~KnobLoader() = default;
+
+  virtual bool load(const KnobName &name, bool default_value) const = 0;
+};
+
+// Template-programming helpers
+template <typename T> T knob_load(const KnobLoader &, const KnobName &, const T &);
+
+template <>
+bool knob_load(const KnobLoader &l, const KnobName &knob_name, const bool &default_value)
+{
+  return l.load(knob_name, default_value);
+}
+
+/**
+ * @brief Load configuration from environment variables
+ *
+ * Given a prefix P, EnvKnobLoader reads a configuration K from concat(P, K).
+ *
+ * For example, let us assume that P is "MY_" and K is "CONFIG".
+ *
+ * Then, EnvKnobLoader reads configuration CONFIG from environment variable MY_CONFIG.
+ */
+class EnvKnobLoader final : public KnobLoader
+{
+public:
+  EnvKnobLoader(const std::string &prefix) : _prefix{prefix}
+  {
+    // DO NOTHING
+  }
+
+public:
+  bool load(const KnobName &knob_name, bool default_value) const override
+  {
+    auto envvar = _prefix + knob_name;
+    auto s = std::getenv(envvar.c_str());
+
+    return pepper::safe_strcast<int>(s, default_value ? 1 : 0) != 0;
+  }
+
+private:
+  /// @brief Environment variable prefix
+  std::string _prefix;
+};
+
+} // namespace
+
+namespace
+{
+
+const KnobLoader &knob_loader(void)
+{
+  static EnvKnobLoader loader{"EXOTFLITE_"};
+  return loader;
+}
+
+} // namespace
+
+namespace exo
+{
+
+#define KNOB_BOOL(NAME, DEFAULT, DESC)                                                           \
+  template <> typename KnobTrait<Knob::NAME>::ValueType get_knob<Knob::NAME>(void)               \
+  {                                                                                              \
+    static typename KnobTrait<Knob::NAME>::ValueType value =                                     \
+        ::knob_load<typename KnobTrait<Knob::NAME>::ValueType>(::knob_loader(), #NAME, DEFAULT); \
+    return value;                                                                                \
+  }
+#include "Knob.lst"
+#undef KNOB_BOOL
+
+} // namespace exo
diff --git a/compiler/exo-tflite/src/Knob.h b/compiler/exo-tflite/src/Knob.h
new file mode 100644 (file)
index 0000000..c330f8a
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd. 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.
+ */
+
+#ifndef __KNOB_H__
+#define __KNOB_H__
+
+namespace exo
+{
+
+enum class Knob
+{
+#define KNOB_BOOL(NAME, DEFAULT, DESC) NAME,
+#include "Knob.lst"
+#undef KNOB_BOOL
+};
+
+template <Knob K> struct KnobTrait;
+
+#define KNOB_BOOL(NAME, DEFAULT, DESC)     \
+  template <> struct KnobTrait<Knob::NAME> \
+  {                                        \
+    using ValueType = bool;                \
+  };
+#include "Knob.lst"
+#undef KNOB_BOOL
+
+template <Knob K> typename KnobTrait<K>::ValueType get_knob(void);
+
+} // namespace exo
+
+#endif // __KNOB_H__
diff --git a/compiler/exo-tflite/src/Knob.lst b/compiler/exo-tflite/src/Knob.lst
new file mode 100644 (file)
index 0000000..776472d
--- /dev/null
@@ -0,0 +1,12 @@
+#ifndef KNOB_BOOL
+#error "KNOB_BOOL is not defined"
+#endif // KNOB_BOOL
+
+// KNOB_BOOL(NAME, DEFAULT_VALUE, DESCRIPTION)
+
+// These are for backward compatibility
+// TO use any knob for operation, EnableTFLDialect must be turned on
+KNOB_BOOL(EnableTFLDialect, false, Convert canonical nodes to TFLNodes)
+
+// operations
+// E.g., KNOB_BOOL(ConvertRelu, false, Convert loco::Relu to TFLRelu)