[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[UNIKRAFT/LIBTFLITE PATCH v2 1/1] Add main and improve Readme



Signed-off-by: George Muraru <murarugeorgec@xxxxxxxxx>
---
 Config.uk                          |   6 +-
 Makefile.uk                        | 106 ++++++++++++++++-------------
 README.md                          |  56 +++++++++++++--
 main.cpp                           |  56 +++++++++++++++
 patches/0001-Change-zu-to-lu.patch |  47 +++++++++++++
 5 files changed, 216 insertions(+), 55 deletions(-)
 create mode 100644 main.cpp
 create mode 100644 patches/0001-Change-zu-to-lu.patch

diff --git a/Config.uk b/Config.uk
index 38bc5fb..2efd518 100644
--- a/Config.uk
+++ b/Config.uk
@@ -8,7 +8,6 @@ menuconfig LIBTFLITE
     select LIBCOMPILER_RT_ATOMIC
     select LIBEIGEN
     select LIBFFT2D
-    select LIBFFT2D_2D
     select LIBFLATBUFFERS
     select LIBGEMMLOWP
     select LIBFARMHASH
@@ -32,3 +31,8 @@ if LIBTFLITE
     default n
 endif
 
+if LIBTFLITE
+config LIBTFLITE_MAIN_FUNCTION
+       bool "Provide main function"
+       default y
+endif
diff --git a/Makefile.uk b/Makefile.uk
index 2b5db3f..7223603 100644
--- a/Makefile.uk
+++ b/Makefile.uk
@@ -38,8 +38,11 @@ $(eval $(call addlib_s,libtflite,$(CONFIG_LIBTFLITE)))
 # Sources
 
################################################################################
 LIBTFLITE_VERSION=2.0.1
+LIBTFLITE_PATCHDIR=$(LIBTFLITE_BASE)/patches
+
 
LIBTFLITE_URL=https://github.com/tensorflow/tensorflow/archive/v$(LIBTFLITE_VERSION).tar.gz
 $(eval $(call fetch,libtflite,$(LIBTFLITE_URL)))
+$(eval $(call 
patch,libtflite,$(LIBTFLITE_PATCHDIR),tensorflow-$(LIBTFLITE_VERSION)))
 
 
################################################################################
 # Helpers
@@ -57,14 +60,23 @@ CXXINCLUDES-$(CONFIG_LIBTFLITE) += 
-I$(LIBTFLITE_SRC)/tensorflow/lite
 CINCLUDES-$(CONFIG_LIBTFLITE) += -I$(LIBTFLITE_SRC)/
 CINCLUDES-$(CONFIG_LIBTFLITE) += -I$(LIBTFLITE_SRC)/tensorflow/lite
 
+################################################################################
+# Main code
+################################################################################
+
+ifdef CONFIG_LIBTFLITE_MAIN_FUNCTION
+LIBTFLITE_SRCS-$(CONFIG_LIBTFLITE_MAIN_FUNCTION) += $(LIBTFLITE_BASE)/main.cpp
+endif
+
 
################################################################################
 # Global flags
 
################################################################################
-LIBTFLITE_SUPPRESS_FLAGS += -Wno-sign-compare -Wno-unused-parameter 
-Wno-comment
-LIBTFLITE_SUPPRESS_FLAGS += -Wno-missing-field-initializers
+LIBTFLITE_SUPPRESS_FLAGS += -Wno-sign-compare -Wno-unused-parameter 
-Wno-comment \
+                            -Wno-missing-field-initializers -Wno-parantheses \
+                            -Wno-unused-function -Wno-unknown-pragmas
 
 LIBTFLITE_CXXFLAGS-y += $(LIBTFLITE_SUPPRESS_FLAGS)
-
+LIBTFLITE_CFLAGS-y += $(LIBTFLITE_SUPPRESS_FLAGS)
 
 ifdef CONFIG_LIBTFLITE_BUILD_WITH_RUY
 LIBTFLITE_CXXFLAGS-y += -D TFLITE_WITH_RUY
@@ -79,58 +91,58 @@ endif
 
################################################################################
 # Library sources
 
################################################################################
-MINIMAL_SRCS := \
-                       
$(LIBTFLITE_SRC)/tensorflow/lite/examples/minimal/minimal.cc
+MINIMAL_SRCS := $(LIBTFLITE_SRC)/tensorflow/lite/examples/minimal/minimal.cc
 
 
 CORE_CC_ALL_SRCS := \
-                       $(wildcard $(LIBTFLITE_SRC)/tensorflow/lite/*.cc) \
-                       $(wildcard $(LIBTFLITE_SRC)/tensorflow/lite/*.c) \
-                       $(wildcard $(LIBTFLITE_SRC)/tensorflow/lite/c/*.c) \
-                       $(wildcard $(LIBTFLITE_SRC)/tensorflow/lite/core/*.cc) \
-                       $(wildcard 
$(LIBTFLITE_SRC)/tensorflow/lite/core/api/*.cc) \
-                       $(wildcard 
$(LIBTFLITE_SRC)/tensorflow/lite/experimental/resource_variable/*.cc) \
-                       
$(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/allocator.cc \
-                       
$(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/block_map.cc \
-                       
$(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/blocking_counter.cc \
-                       
$(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/context.cc \
-                       
$(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/detect_dotprod.cc \
-                       
$(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/kernel_arm32.cc \
-                       
$(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/kernel_arm64.cc \
-                       
$(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/pack_arm.cc \
-                       
$(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/pmu.cc \
-                       
$(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/thread_pool.cc \
-                       
$(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/trace.cc \
-                       
$(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/trmul.cc \
-                       
$(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/tune.cc \
-                       
$(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/wait.cc \
-               $(LIBTFLITE_SRC)/tensorflow/lite/minimal_logging_default.cc
+            $(wildcard $(LIBTFLITE_SRC)/tensorflow/lite/*.cc) \
+            $(wildcard $(LIBTFLITE_SRC)/tensorflow/lite/*.c) \
+            $(wildcard $(LIBTFLITE_SRC)/tensorflow/lite/c/*.c) \
+            $(wildcard $(LIBTFLITE_SRC)/tensorflow/lite/core/*.cc) \
+            $(wildcard $(LIBTFLITE_SRC)/tensorflow/lite/core/api/*.cc) \
+            $(wildcard 
$(LIBTFLITE_SRC)/tensorflow/lite/experimental/resource_variable/*.cc) \
+            $(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/allocator.cc \
+            $(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/block_map.cc \
+            
$(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/blocking_counter.cc \
+            $(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/context.cc \
+            
$(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/detect_dotprod.cc \
+            $(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/kernel_arm32.cc \
+            $(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/kernel_arm64.cc \
+            $(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/pack_arm.cc \
+            $(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/pmu.cc \
+            $(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/thread_pool.cc \
+            $(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/trace.cc \
+            $(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/trmul.cc \
+            $(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/tune.cc \
+            $(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/wait.cc \
+            $(LIBTFLITE_SRC)/tensorflow/lite/minimal_logging_default.cc
 
 
 
 CORE_CC_ALL_SRCS += \
-                        $(wildcard 
$(LIBTFLITE_SRC)/tensorflow/lite/kernels/*.cc) \
-                        $(wildcard 
$(LIBTFLITE_SRC)/tensorflow/lite/kernels/internal/*.cc) \
-                        $(wildcard 
$(LIBTFLITE_SRC)/tensorflow/lite/kernels/internal/optimized/*.cc) \
-                        $(wildcard 
$(LIBTFLITE_SRC)/tensorflow/lite/kernels/internal/reference/*.cc)
+             $(wildcard $(LIBTFLITE_SRC)/tensorflow/lite/kernels/*.cc) \
+             $(wildcard 
$(LIBTFLITE_SRC)/tensorflow/lite/kernels/internal/*.cc) \
+             $(wildcard 
$(LIBTFLITE_SRC)/tensorflow/lite/kernels/internal/optimized/*.cc) \
+             $(wildcard 
$(LIBTFLITE_SRC)/tensorflow/lite/kernels/internal/reference/*.cc)
 
 
 CORE_CC_ALL_SRCS := $(sort $(CORE_CC_ALL_SRCS))
 CORE_CC_EXCLUDE_SRCS := \
-                               $(wildcard 
$(LIBTFLITE_SRC)/tensorflow/lite/*test.cc) \
-                           $(wildcard 
$(LIBTFLITE_SRC)/tensorflow/lite/*/*test.cc) \
-                           $(wildcard 
$(LIBTFLITE_SRC)/tensorflow/lite/*/*/*test.cc) \
-                           $(wildcard 
$(LIBTFLITE_SRC)/tensorflow/lite/*/*/*/*test.cc) \
-                               $(wildcard 
$(LIBTFLITE_SRC)/tensorflow/lite/kernels/*test_main.cc) \
-                               $(wildcard 
$(LIBTFLITE_SRC)/tensorflow/lite/kernels/*test_util.cc) \
-                               
$(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/pmu.cc \
-                               
$(LIBTFLITE_SRC)/tensorflow/lite/minimal_logging_android.cc \
-                               
$(LIBTFLITE_SRC)/tensorflow/lite/minimal_logging_ios.cc \
-                               $(MINIMAL_SRCS)
+                $(wildcard $(LIBTFLITE_SRC)/tensorflow/lite/*test.cc) \
+                $(wildcard $(LIBTFLITE_SRC)/tensorflow/lite/*/*test.cc) \
+                $(wildcard $(LIBTFLITE_SRC)/tensorflow/lite/*/*/*test.cc) \
+                $(wildcard $(LIBTFLITE_SRC)/tensorflow/lite/*/*/*/*test.cc) \
+                $(wildcard 
$(LIBTFLITE_SRC)/tensorflow/lite/kernels/*test_main.cc) \
+                $(wildcard 
$(LIBTFLITE_SRC)/tensorflow/lite/kernels/*test_util.cc) \
+                $(LIBTFLITE_SRC)/tensorflow/lite/experimental/ruy/pmu.cc \
+                $(LIBTFLITE_SRC)/tensorflow/lite/minimal_logging_android.cc \
+                $(LIBTFLITE_SRC)/tensorflow/lite/minimal_logging_ios.cc \
+                $(MINIMAL_SRCS)
+
 
 COMPILE_MANUAL_SRCS := \
-                               
$(LIBTFLITE_SRC)/tensorflow/lite/kernels/internal/mfcc.cc \
-                               $(LIBTFLITE_SRC)/tensorflow/lite/kernels/mfcc.cc
+                $(LIBTFLITE_SRC)/tensorflow/lite/kernels/internal/mfcc.cc \
+                $(LIBTFLITE_SRC)/tensorflow/lite/kernels/mfcc.cc
 
 
 ifeq ($(CONFIG_LIBUKMMAP),y)
@@ -141,13 +153,13 @@ endif
 
 ifeq ($(LIBTFLITE_BUILD_WITH_NNAPI),y)
 CORE_CC_ALL_SRCS += \
-                               
$(LIBTFLITE_SRC)/tensorflow/lite/delegates/nnapi/nnapi_delegate.cc \
-                               
$(LIBTFLITE_SRC)/tensorflow/lite/delegates/nnapi/quant_lstm_sup.cc \
-                       
$(LIBTFLITE_SRC)/tensorflow/lite/nnapi/nnapi_implementation.cc
+                
$(LIBTFLITE_SRC)/tensorflow/lite/delegates/nnapi/nnapi_delegate.cc \
+                
$(LIBTFLITE_SRC)/tensorflow/lite/delegates/nnapi/quant_lstm_sup.cc \
+                $(LIBTFLITE_SRC)/tensorflow/lite/nnapi/nnapi_implementation.cc
 else
 CORE_CC_ALL_SRCS += \
-                               
$(LIBTFLITE_SRC)/tensorflow/lite/delegates/nnapi/nnapi_delegate_disabled.cc \
-                               
$(LIBTFLITE_SRC)/tensorflow/lite/nnapi/nnapi_implementation_disabled.cc
+                
$(LIBTFLITE_SRC)/tensorflow/lite/delegates/nnapi/nnapi_delegate_disabled.cc \
+                
$(LIBTFLITE_SRC)/tensorflow/lite/nnapi/nnapi_implementation_disabled.cc
 endif
 
 LIBTFLITE_SRCS-y += $(filter-out $(CORE_CC_EXCLUDE_SRCS) 
$(COMPILE_MANUAL_SRCS), $(CORE_CC_ALL_SRCS))
diff --git a/README.md b/README.md
index a7a1a6d..617a8bd 100644
--- a/README.md
+++ b/README.md
@@ -1,12 +1,54 @@
-gemmlowp for Unikraft
+TensorFlowLite for Unikraft
 =============================
 
-This is the port of gemmlowp as a Unikraft external library. It
-depends on the following libraries that need to be added to `Makefile`
-in this order:
+This is the port of tensorflowlite as external library
+Please refer to the `README.md` as well as the documentation in the `doc/`
+subdirectory of the main unikraft repository.
+
+## Build
+TensorFlowLite interpreter depends on the following libraries, that need to
+be added to `Makefile` in this order:
 
-* CXX standard library, e.g. `libunwind`, `compiler-rt`, `libcxxabi`, `libcxx`
+* `pthreads`, e.g. `pthread-embedded`
+* `libcxx`
+* `libcxxabi`
 * `libc`, e.g. `newlib`
+* `libunwind`
+* `libcompilerrt`
+* `libgemmlowp`
+* `libflatbuffers`
+* `libfarmhash`
+* `libeigen`
+* `libfft2`
 
-Please refer to the `README.md` as well as the documentation in the `doc/`
-subdirectory of the main unikraft repository.
+## Root filesystem
+### Creating the filesystem
+TensorFlowLite needs a filesystem which should contain one or more *tflite*
+models. Therefore, the filesystem needs to be created before running the VM. 
+
+### Using the filesystem
+Mounting the filesystem is a transparent operation. All you have to do
+is to provide the right Qemu parameters in order for Unikraft to mount
+the filesystem.  We will use the 9pfs support for filesystems and for
+this you will need to use the following parameters:
+
+```bash
+-fsdev local,id=myid,path=<some directory>,security_model=none \
+-device 
virtio-9p-pci,fsdev=myid,mount_tag=rootfs,disable-modern=on,disable-legacy=off
+```
+You should also use `vfs.rootdev=rootfs` (set by default) to specify the 9pfs 
mounting
+tag to Unikraft. To enable 9pfs, you'll need to select the following
+menu options, all under `Library Configuration`:
+
+* `uk9p: 9p client`
+* `vfscore: VFS Core Interface`
+         &rarr; `vfscore: Configuration`
+         &rarr; `Automatically mount a root filesysytem`
+         &rarr; `Default root filesystem`
+         &rarr; `9PFS`
+
+## How to run
+Currently, `main.cpp` contains a minimal example for loading a *tflite* model 
and
+printing the interpreter state. The sample program will try to load the model 
from
+`mobilenet_v1_1.0_224.tflite` (this model and other models from the same 
family can
+be downloaded from 
[here](https://github.com/tensorflow/models/blob/master/research/slim/nets/mobilenet_v1.md))
diff --git a/main.cpp b/main.cpp
new file mode 100644
index 0000000..45f9b07
--- /dev/null
+++ b/main.cpp
@@ -0,0 +1,56 @@
+/* Copyright 2018 The TensorFlow 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.
+==============================================================================*/
+#define __clrsbDI2    __NDW(clrsb,2)
+
+#include <cstdio>
+#include "tensorflow/lite/interpreter.h"
+#include "tensorflow/lite/kernels/register.h"
+#include "tensorflow/lite/model.h"
+#include "tensorflow/lite/optional_debug_tools.h"
+
+#include <sys/mount.h>
+#include <sys/types.h>
+#include <fcntl.h>
+
+// This is an example that is minimal to read a model
+// from disk and perform inference. There is no data being loaded
+// that is up to you to add as a user.
+//
+// NOTE: Do not add any dependencies to this that cannot be built with
+// the minimal makefile. This example must remain trivial to build with
+// the minimal build tool.
+//
+// Usage: minimal <tflite model>
+
+using namespace tflite;
+
+int main() {
+  const char* filename = "mobilenet_v1_1.0_224.tflite";
+
+  // Load model
+  std::unique_ptr<tflite::FlatBufferModel> model =
+      tflite::FlatBufferModel::BuildFromFile(filename);
+
+  // Build the interpreter
+  tflite::ops::builtin::BuiltinOpResolver resolver;
+  InterpreterBuilder builder(*model, resolver);
+  std::unique_ptr<Interpreter> interpreter;
+  builder(&interpreter);
+
+  printf("=== Interpreter State ===\n");
+  tflite::PrintInterpreterState(interpreter.get());
+
+  return 0;
+}
diff --git a/patches/0001-Change-zu-to-lu.patch 
b/patches/0001-Change-zu-to-lu.patch
new file mode 100644
index 0000000..d68a26e
--- /dev/null
+++ b/patches/0001-Change-zu-to-lu.patch
@@ -0,0 +1,47 @@
+From f34b41fd728c06517a1223178af2fbb97dce5dfe Mon Sep 17 00:00:00 2001
+From: George Muraru <murarugeorgec@xxxxxxxxx>
+Date: Tue, 21 Apr 2020 23:16:50 +0300
+Subject: [PATCH 1/1] Change zu to lu
+
+---
+ tensorflow/lite/optional_debug_tools.cc | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/tensorflow/lite/optional_debug_tools.cc 
b/tensorflow/lite/optional_debug_tools.cc
+index a59af3d..c9339b0 100644
+--- a/tensorflow/lite/optional_debug_tools.cc
++++ b/tensorflow/lite/optional_debug_tools.cc
+@@ -80,7 +80,7 @@ const char* AllocTypeName(TfLiteAllocationType type) {
+ 
+ // Prints a dump of what tensors and what nodes are in the interpreter.
+ void PrintInterpreterState(Interpreter* interpreter) {
+-  printf("Interpreter has %zu tensors and %zu nodes\n",
++  printf("Interpreter has %lu tensors and %lu nodes\n",
+          interpreter->tensors_size(), interpreter->nodes_size());
+   printf("Inputs:");
+   PrintIntVector(interpreter->inputs());
+@@ -90,7 +90,7 @@ void PrintInterpreterState(Interpreter* interpreter) {
+   for (size_t tensor_index = 0; tensor_index < interpreter->tensors_size();
+        tensor_index++) {
+     TfLiteTensor* tensor = 
interpreter->tensor(static_cast<int>(tensor_index));
+-    printf("Tensor %3zu %-20s %10s %15s %10zu bytes (%4.1f MB) ", 
tensor_index,
++    printf("Tensor %3lu %-20s %10s %15s %10lu bytes (%4.1f MB) ", 
tensor_index,
+            tensor->name, TensorTypeName(tensor->type),
+            AllocTypeName(tensor->allocation_type), tensor->bytes,
+            (static_cast<float>(tensor->bytes) / (1 << 20)));
+@@ -104,10 +104,10 @@ void PrintInterpreterState(Interpreter* interpreter) {
+     const TfLiteNode& node = node_and_reg->first;
+     const TfLiteRegistration& reg = node_and_reg->second;
+     if (reg.custom_name != nullptr) {
+-      printf("Node %3zu Operator Custom Name %s\n", node_index,
++      printf("Node %3lu Operator Custom Name %s\n", node_index,
+              reg.custom_name);
+     } else {
+-      printf("Node %3zu Operator Builtin Code %3d\n", node_index,
++      printf("Node %3lu Operator Builtin Code %3d\n", node_index,
+              reg.builtin_code);
+     }
+     printf("  Inputs:");
+-- 
+2.17.1
+
-- 
2.17.1




 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.