Clean up required subgraph cfg file entries
authorYuan Zhao <yuanzhao@ti.com>
Tue, 18 Feb 2020 16:02:33 +0000 (10:02 -0600)
committerYuan Zhao <yuanzhao@ti.com>
Tue, 18 Feb 2020 19:59:06 +0000 (13:59 -0600)
- Added environment variable TIDL_SUBGRAPH_DIR for locating the
  subgraph config files.
- Updated documentation for subgraph runtime.
- MCT-1227

docs/source/changelog.rst
docs/source/using_api.rst
examples/mobilenet_subgraph/subgraph0.cfg
tidl_api/inc/configuration.h
tidl_api/src/configuration.cpp
tidl_api/src/configuration_parser.cpp
tidl_api/src/subgraph_runtime.cpp

index 38910d81848177197f891ca88a2b0653c38ccc7c..42c4cf1987c4699634da1950e4d6112d56289bcb 100644 (file)
@@ -2,6 +2,12 @@
 Changelog
 #########
 
+1.5.0 [Processor Linux SDK 6.3]
+===============================
+**Changed**
+
+#. Cleaned up subgraph cfg file entries.  Added TIDL_SUBGRAPH_DIR env var.
+
 1.4.0 [Processor Linux SDK 6.2]
 ===============================
 **Added**
index 80d8a7490ba99f7be077b89b60b81d3fe377c098..d56bd52914dae4a8efb9a01e85e6e36737a174a7 100644 (file)
@@ -313,3 +313,27 @@ See ``examples/layer_output/main.cpp, ProcessTrace()`` for examples of using the
 
 .. _Processor SDK Linux Software Developer's Guide: http://software-dl.ti.com/processor-sdk-linux/esd/docs/latest/linux/index.html
 .. _Processor SDK Linux Software Developer's Guide (TIDL chapter): http://software-dl.ti.com/processor-sdk-linux/esd/docs/latest/linux/Foundational_Components_TIDL.html
+
+Subgraph runtime
+++++++++++++++++
+
+TIDL API subgraph runtime are intended for interfacing with external inference
+frameworks.  Subgraph runtime are not intended for direct use in user
+applications.
+
+Subgraph config file
+====================
+
+Subgraph config file are named as "subgraph<number>.cfg", while <number>
+is the subgraph index in the original graph/network.  The environment
+variable `TIDL_SUBGRAPH_DIR` speicifies the directory where subgraph config
+files reside.  If not specified, the current directory is assumed.
+
+Subgraph config file requires extra parameters to describe data conversion
+at the subgraph boundaries.  Please see
+`examples/mobilenet_subgraph/subgraph0.cfg` for an example of minimal
+set of required parameters.
+
+Subgraph runtime API
+====================
+Please see `tidl_api/inc/subgraph_runtime.h` for details.
index 404c70dbc67f6881b33c6a2a9b3d09c15f0416c2..fac818078213c3445d3770032ba95208f55695bd 100644 (file)
@@ -1,12 +1,5 @@
-numFrames   = 1
-preProcType = 2
-inData   = "../test/testvecs/input/preproc_2_224x224.y"
-outData   = "./stats_tool_out.bin"
 netBinFile      = "../test/testvecs/config/tidl_models/tidl_net_mobilenet_1_224.bin"
 paramsBinFile   = "../test/testvecs/config/tidl_models/tidl_param_mobilenet_1_224.bin"
-inWidth = 224
-inHeight = 224
-inNumChannels = 3
 # The following information should be space separated list,
 #   corresponding to vector of inputs and vector of outputs
 #   Quant_value  = float_value * scaleF2Q
index c76ba7f54561ff95e3ef471abe3ac70152187a5e..5de89f2f121b69883ef06ff34b9d58e41898a796 100644 (file)
@@ -146,30 +146,43 @@ class Configuration
     //! Margin added to the average in percentage.
     int quantMargin;
 
-    //! subgraph data conversion type at subgraph inputs
-    //! 0: float <-> Q, 1: float <-> float, 2: Q <-> Q
+    //! Subgraph: config file for subgraph runtime, default to false
+    //!   (intended for interfacing with external inference frameworks,
+    //!    not intended for direct use in user applications)
+    //! The following {in,out}* parameters describe the tensor(s) value/layout
+    //! conversion at the subgraph boundaries for subgraph runtime.
+    //! Each parameter (vector) can be a space separated list, corresponding to
+    //! multiple input tensors and multiple output tensors, if applicable.
+    bool isSubgraphCfg;
+
+    //! subgraph: data value conversion type at subgraph input boundary,
+    //! between external tensors and TIDL tensors
+    //! 0: float -> Q, 1: float -> float, 2: Q -> Q
     std::vector<int> inConvType;
 
-    //! subgraph is signed data at subgraph inputs
+    //! subgraph: are external input tensors signed data
     std::vector<int> inIsSigned;
 
-    //! subgraph scaleF2Q factor at subgraph inputs
+    //! subgraph: scaleF2Q factor for converting values of input tensors
+    //! saturation(float_value * inScaleF2Q) = quantized_value
     std::vector<float> inScaleF2Q;
 
-    //! subgraph is external tensor NCHW layout at subgraph inputs
+    //! subgraph: are external input tensors in NCHW layout
     std::vector<int> inIsNCHW;
 
-    //! subgraph data conversion type at subgraph outputs
-    //! 0: float <-> Q, 1: float <-> float, 2: Q <-> Q
+    //! subgraph: data value conversion type at subgraph output boundary,
+    //! between TIDL tensors and external tensors
+    //! 0: Q -> float, 1: float -> float, 2: Q -> Q
     std::vector<int> outConvType;
 
-    //! subgraph is signed data at subgraph outputs
+    //! subgraph: are external output tensors signed data
     std::vector<int> outIsSigned;
 
-    //! subgraph scaleF2Q factor at subgraph outputs
+    //! subgraph: scaleF2Q factor for converting values of output tensors
+    //! quantized_value / outScaleF2Q = float_value
     std::vector<float> outScaleF2Q;
 
-    //! subgraph is external tensor NCHW layout at subgraph outputs
+    //! subgraph: are external output tensors in NCHW layout
     std::vector<int> outIsNCHW;
 
     //! Default constructor.
index c67b22c75afc4cece552315fd242c248e3253e06..3ec242e077aa8882f739c67503dfdc61a7809ceb 100644 (file)
@@ -46,7 +46,16 @@ Configuration::Configuration(): numFrames(0), inHeight(0), inWidth(0),
                      showHeapStats(false),
                      quantHistoryParam1(20),
                      quantHistoryParam2(5),
-                     quantMargin(0)
+                     quantMargin(0),
+                     isSubgraphCfg(false),
+                     inConvType(),
+                     inIsSigned(),
+                     inScaleF2Q(),
+                     inIsNCHW(),
+                     outConvType(),
+                     outIsSigned(),
+                     outScaleF2Q(),
+                     outIsNCHW()
 {
 }
 
@@ -70,35 +79,57 @@ void Configuration::Print(std::ostream &os) const
 bool Configuration::Validate() const
 {
     int errors = 0;
+    struct stat buffer;
 
-    if (inHeight == 0 || inWidth == 0)
+    if (! isSubgraphCfg)
     {
-        std::cerr << "inHeight, inWidth must be > 0" << std::endl;
-        errors++;
-    }
+        if (inHeight == 0 || inWidth == 0)
+        {
+            std::cerr << "cfg: inHeight, inWidth must be > 0" << std::endl;
+            errors++;
+        }
 
-    if (inNumChannels < 1)
+        if (inNumChannels < 1)
+        {
+            std::cerr << "cfg: inNumChannels must be > 1" << std::endl;
+            errors++;
+        }
+
+        if (!inData.empty() && stat(inData.c_str(), &buffer) != 0)
+        {
+            std::cerr << "cfg: inData not found: " << inData << std::endl;
+            errors++;
+        }
+    }
+    else
     {
-        std::cerr << "inNumChannels must be > 1" << std::endl;
-        errors++;
+        if (inConvType.size() == 0 || inIsSigned.size() == 0 ||
+            inScaleF2Q.size() == 0 || inIsNCHW.size() == 0 ||
+            outConvType.size() == 0 || outIsSigned.size() == 0 ||
+            outScaleF2Q.size() == 0 || outIsNCHW.size() == 0)
+        {
+            std::cerr << "cfg: subgraph data info not found" << std::endl;
+            errors++;
+        }
+
+        if (inConvType.size() != inIsNCHW.size() ||
+            outConvType.size() != outIsNCHW.size())
+        {
+            std::cerr << "cfg: Mismatching subgraph data info" << std::endl;
+            errors++;
+        }
     }
 
-    struct stat buffer;
     if (stat(netBinFile.c_str(), &buffer) != 0)
     {
-        std::cerr << "netBinFile not found: " << netBinFile << std::endl;
+        std::cerr << "cfg: netBinFile not found: " << netBinFile << std::endl;
         errors++;
     }
 
     if (stat(paramsBinFile.c_str(), &buffer) != 0)
     {
-        std::cerr << "paramsBinFile not found: " << paramsBinFile << std::endl;
-        errors++;
-    }
-
-    if (!inData.empty() && stat(inData.c_str(), &buffer) != 0)
-    {
-        std::cerr << "inData not found: " << inData << std::endl;
+        std::cerr << "cfg: paramsBinFile not found: " << paramsBinFile
+                  << std::endl;
         errors++;
     }
 
index 3ad0d2ccaf84672261aab81acd14de6cde1628b0..e0db7bb795bdbf6e35fb6c552ac048139cfcc42a 100644 (file)
@@ -118,7 +118,10 @@ bool Configuration::ReadFromFile(const std::string &file_name)
     std::ifstream IFS(file_name);
 
     if (!IFS.good())
+    {
+        std::cerr << "cfg: cannot read file: " << file_name << std::endl;
         return false;
+    }
 
     typedef ConfigParser<std::string::const_iterator> ConfigParser;
 
@@ -141,7 +144,7 @@ bool Configuration::ReadFromFile(const std::string &file_name)
 
         if (!result)
         {
-            std::cout << "Parsing failed on line " << line_num
+            std::cout << "cfg: parsing failed on line " << line_num
                       << ": " << str << std::endl;
             break;
         }
index 9d068b2db7c9ab1cc6a0b41aba746cf89cd0a6de..5ac6e973bb75bb65275aeb12b380237389d61bfe 100644 (file)
@@ -250,6 +250,10 @@ void ResM::InitSubgraph(uint32_t subgraph_id)
 
     // Read config file
     std::string cfg_file = "subgraph" + std::to_string(subgraph_id) + ".cfg";
+    char *subgraph_dir = getenv("TIDL_SUBGRAPH_DIR");
+    if (subgraph_dir != nullptr)
+      cfg_file = std::string(subgraph_dir) + "/" + cfg_file;
+    cs_m[subgraph_id].isSubgraphCfg = true;
     bool status = cs_m[subgraph_id].ReadFromFile(cfg_file);
     assert(status);