diff mbox series

[bug#63897,v6] gnu: tensorflow-lite: Update to 2.12.1

Message ID 9c48f700175bf6dfc257faf34de9e8abfae4ca23.1693716893.git.atai@atai.org
State New
Headers show
Series [bug#63897,v6] gnu: tensorflow-lite: Update to 2.12.1 | expand

Commit Message

Andy Tai Sept. 3, 2023, 4:55 a.m. UTC
* gnu/packages/algebra.scm (eigen-for-tensorflow-lite): Remove variable.

* gnu/packages/machine-learning.scm (tensorflow-lite): Update to 2.12.1
[arguments] (configure-flags): Turn on GPU and RUY use; Use cmake to
find packages already in Guix as dependencies for absl-cpp, eigen,
flatbuffer, neon2ssl, cpuinfo, ruy.
[arguments] (phases): Remove operations setting up absl-cpp, eigen, ruy,
and neon2ssl as native inouts as now we use Guix's packages of these
as dependencies. Do default build phase.
Add steps to install C shared library and benchmark_model tool.
[arguments] (inputs): Add cpuinfo, eigen, fp16, mesa-header, opencl,
pthreadpool, ruy, vulkan and xnnpack as explicit inputs.
[arguments] (native-inputs): Remove local setup of neon2ssl and ruy
as we now use Guix's packages of these as explicit dependencies.

* gnu/packages/serialization.scm (flatbuffers-next-shared): New variable,
flatbuffers-next built with -fPIC as needed by tensorflow-lite.
---
 gnu/packages/algebra.scm          |  32 ------
 gnu/packages/machine-learning.scm | 177 ++++++++++++++++++------------
 gnu/packages/serialization.scm    |  12 ++
 3 files changed, 117 insertions(+), 104 deletions(-)


base-commit: 4818ad5ba204e094fd8995c90c16ee1940e76210
prerequisite-patch-id: 4b8245be9f9ab7b2cf9713a404b7d1632d945278
prerequisite-patch-id: 6a623f7c3bdc733b110fd6f59f31032adb7d987d

Comments

Ricardo Wurmus Sept. 5, 2023, 7:50 a.m. UTC | #1
Hi,

The update looks good to me.  My only concerns are cosmetic:

- the indentation throughout is rather wonky.  Would be good to reformat
  this with Emacs C-M-q or “guix style”.

- “TO DO” —> “TODO” (so we can find it easily)

- please use “;;” for line comments; a single semicolon is only used for
  margin comments

- it would be good not to use “assoc-ref %build-inputs” and use G-exps
  instead.

I could make all these changes before pushing it.

Actually, there is one question I have that is not of cosmetic nature:
What’s up with the commented gemmlowp in the inputs?  We have
gemmlowp-src in the native-inputs.

If you could answer this question I can take care of the rest and apply
it.  Thank you for your patience!
Andy Tai Sept. 5, 2023, 12:45 p.m. UTC | #2
Hi, I did created a package definition in Guix for gemmlowp and that
was merged.  So I was trying to refer to that.  This is not in this
patch but feel free to get that (and everything else) right and to
push.

On Tue, Sep 5, 2023 at 12:58 AM Ricardo Wurmus <rekado@elephly.net> wrote:
>
> Actually, there is one question I have that is not of cosmetic nature:
> What’s up with the commented gemmlowp in the inputs?  We have
> gemmlowp-src in the native-inputs.
>
> If you could answer this question I can take care of the rest and apply
> it.  Thank you for your patience!
>
> --
> Ricardo
Andy Tai Sept. 5, 2023, 2:55 p.m. UTC | #3
Also note this patch requires two other patches as prerequisites. These are
marked with block relationships in debugs but here are them for reference

https://issues.guix.gnu.org/63889#4
https://issues.guix.gnu.org/56202#5

On Tue, Sep 5, 2023 at 5:45 AM Andy Tai <atai@atai.org> wrote:

> Hi, I did created a package definition in Guix for gemmlowp and that
> was merged.  So I was trying to refer to that.  This is not in this
> patch but feel free to get that (and everything else) right and to
> push.
>
> On Tue, Sep 5, 2023 at 12:58 AM Ricardo Wurmus <rekado@elephly.net> wrote:
> >
> > Actually, there is one question I have that is not of cosmetic nature:
> > What’s up with the commented gemmlowp in the inputs?  We have
> > gemmlowp-src in the native-inputs.
> >
> > If you could answer this question I can take care of the rest and apply
> > it.  Thank you for your patience!
> >
> > --
> > Ricardo
>
diff mbox series

Patch

diff --git a/gnu/packages/algebra.scm b/gnu/packages/algebra.scm
index a717750c7b..b1ab755144 100644
--- a/gnu/packages/algebra.scm
+++ b/gnu/packages/algebra.scm
@@ -1154,38 +1154,6 @@  (define-public eigen-for-tensorflow
                  (substitute* "test/CMakeLists.txt"
                    (("ei_add_test\\(stddeque") "#")))))))))))
 
-(define-public eigen-for-tensorflow-lite
-  ;; This commit was taken from
-  ;; tensorflow/lite/tools/cmake/modules/eigen.cmake
-  (let ((commit "d10b27fe37736d2944630ecd7557cefa95cf87c9")
-        (revision "1"))
-    (package (inherit eigen)
-      (name "eigen-for-tensorflow-lite")
-      (version (git-version "3.3.7" revision commit))
-      (source (origin
-                (method git-fetch)
-                (uri (git-reference
-                      (url "https://gitlab.com/libeigen/eigen")
-                      (commit commit)))
-                (sha256
-                 (base32
-                  "0v8a20cwvwmp3hw4275b37frw33v92z0mr8f4dn6y8k0rz92hrrf"))
-                (file-name (git-file-name name version))
-                (modules '((guix build utils)))
-                (snippet
-                 ;; Ther are test failures in the "unsupported" directory, but
-                 ;; maintainers say it's unsupported anyway, so just skip
-                 ;; them.
-                 '(begin
-                    (substitute* "unsupported/CMakeLists.txt"
-                      (("add_subdirectory\\(test.*")
-                       "# Do not build the tests for unsupported features.\n"))))))
-      (arguments
-       (substitute-keyword-arguments (package-arguments eigen)
-         ((#:phases phases)
-          `(modify-phases ,phases
-             (delete 'disable-some-tests))))))))
-
 (define-public xtensor
   (package
     (name "xtensor")
diff --git a/gnu/packages/machine-learning.scm b/gnu/packages/machine-learning.scm
index 712abe9aff..f4d4b45084 100644
--- a/gnu/packages/machine-learning.scm
+++ b/gnu/packages/machine-learning.scm
@@ -55,12 +55,14 @@  (define-module (gnu packages machine-learning)
   #:use-module (gnu packages)
   #:use-module (gnu packages adns)
   #:use-module (gnu packages algebra)
+  #:use-module (gnu packages assembly)
   #:use-module (gnu packages audio)
   #:use-module (gnu packages autotools)
   #:use-module (gnu packages base)
   #:use-module (gnu packages bash)
   #:use-module (gnu packages boost)
   #:use-module (gnu packages bdw-gc)
+  #:use-module (gnu packages c)
   #:use-module (gnu packages check)
   #:use-module (gnu packages compression)
   #:use-module (gnu packages cmake)
@@ -89,6 +91,7 @@  (define-module (gnu packages machine-learning)
   #:use-module (gnu packages ninja)
   #:use-module (gnu packages ocaml)
   #:use-module (gnu packages onc-rpc)
+  #:use-module (gnu packages opencl)
   #:use-module (gnu packages parallel)
   #:use-module (gnu packages perl)
   #:use-module (gnu packages pkg-config)
@@ -100,6 +103,7 @@  (define-module (gnu packages machine-learning)
   #:use-module (gnu packages python-science)
   #:use-module (gnu packages python-web)
   #:use-module (gnu packages python-xyz)
+  #:use-module (gnu packages regex)
   #:use-module (gnu packages rpc)
   #:use-module (gnu packages serialization)
   #:use-module (gnu packages sphinx)
@@ -108,6 +112,7 @@  (define-module (gnu packages machine-learning)
   #:use-module (gnu packages swig)
   #:use-module (gnu packages time)
   #:use-module (gnu packages tls)
+  #:use-module (gnu packages vulkan)
   #:use-module (gnu packages video)
   #:use-module (gnu packages web)
   #:use-module (gnu packages xml)
@@ -2936,7 +2941,7 @@  (define-public tensorflow
 (define-public tensorflow-lite
   (package
     (name "tensorflow-lite")
-    (version "2.5.0")
+    (version "2.12.1")
     (source
      (origin
        (method git-fetch)
@@ -2946,59 +2951,85 @@  (define-public tensorflow-lite
        (file-name (git-file-name name version))
        (sha256
         (base32
-         "1jdw2i1rq06zqd6aabh7bbm0avsg4pygnfmd7gviv0blhih9054l"))))
+         "0jkgljdagdqllnxygl35r5bh3f9qmbczymfj357gm9krh59g2kmd"))))
     (build-system cmake-build-system)
     (arguments
-     `(#:tests? #false                  ; no "check" target
+     `(#:tests? #false                  ;tests not building now
        #:build-type "Release"
+
+       #:modules ((ice-9 match)
+                  (guix build utils)
+                  (guix build cmake-build-system))
+
        #:configure-flags
        (list
-        "-DTFLITE_ENABLE_GPU=OFF"
-        "-DTFLITE_ENABLE_RUY=OFF"
+       	; "-DTFLITE_KERNEL_TEST=ON"  ; TO DO: build tests
+       	;; so cmake can be used to find this from other packages
+       	"-DTFLITE_ENABLE_INSTALL=ON"
+
+       	;; Use Guix's own packages as dependencies.
+       	"-DCMAKE_FIND_PACKAGE_PREFER_CONFIG=ON"
+
+        "-DTFLITE_ENABLE_GPU=ON"
+        "-DTFLITE_ENABLE_RUY=ON"
+
+        ;; TO DO: turn on Farmhash
+        ;"-DSYSTEM_FARMHASH=ON"
+
+
+        (string-append "-Dabsl_DIR=" (assoc-ref %build-inputs "abseil-cpp")
+        	"/lib/cmake/absl")
+        (string-append "-DEigen3_DIR=" (assoc-ref %build-inputs "eigen")
+        	"/share/eigen3/cmake")
+        (string-append "-DFlatBuffers_DIR=" (assoc-ref %build-inputs "flatbuffers")
+        	"/lib/cmake/flatbuffers")
+        (string-append "-DNEON_2_SSE_DIR=" (assoc-ref %build-inputs "neon2sse")
+        	"/lib/cmake/NEON_2_SSE")
+        (string-append "-Dcpuinfo_DIR=" (assoc-ref %build-inputs "cpuinfo")
+        	"/share/cpuinfo")
+        (string-append "-Druy_DIR=" (assoc-ref %build-inputs "ruy")
+        	"/lib/cmake/ruy")
 
         ;; TODO: The build system attempts to build xnnpack from source.  We
         ;; would like to use our xnnpack package here, but this requires more
         ;; work.
         "-DTFLITE_ENABLE_XNNPACK=OFF"
 
-        ;; Pretend we've already fetched abseil.  We won't actually build it
-        ;; but use the existing package.
-        "-Dabseil-cpp_POPULATED=TRUE"
-
-        ;; Don't fetch the sources.  We have already built flatbuffers.
-        "-Dflatbuffers_POPULATED=TRUE"
+        ;;; Don't fetch the sources.  We have these already
+        "-Degl_headers_POPULATED=TRUE"
+        "-Dfp16_headers_POPULATED=TRUE"
+        "-Dopencl_headers_POPULATED=TRUE"
+        "-Dopengl_headers_POPULATED=TRUE"
+        "-Dvulkan_headers_POPULATED=TRUE"
+        "-Dgoogletest_POPULATED=TRUE"
+        "-Dgoogle_benchmark_POPULATED=TRUE"
+        "-Dnsync_POPULATED=TRUE"
+        "-Dre2_POPULATED=TRUE"
 
         "-DFFT2D_SOURCE_DIR=/tmp/fft2d"
-        "-Dneon2sse_SOURCE_DIR=/tmp/neon2sse"
-        "-Dneon2sse_BINARY_DIR=/tmp/neon2sse-bin"
         "-DFARMHASH_SOURCE_DIR=/tmp/farmhash"
         "-Dgemmlowp_SOURCE_DIR=/tmp/gemmlowp"
-        (string-append "-DRUY_SOURCE_DIR="
-                       (assoc-ref %build-inputs "ruy-src")))
+        )
        #:phases
        (modify-phases %standard-phases
          (add-after 'unpack 'chdir
            (lambda _ (chdir "tensorflow/lite")))
          (add-after 'chdir 'copy-sources
            (lambda* (#:key inputs #:allow-other-keys)
-             ;; Use external cmake finders instead of these stubs that won't
-             ;; find anything but the bundled sources.
-             (delete-file "tools/cmake/modules/Findabsl.cmake")
-             (delete-file "tools/cmake/modules/Findeigen.cmake")
 
+             ;; TO DO: properly use Guix's pthreaqdpool
+             ;; roght now not using pthreadpool because
+             ;; we are not enabling xnnpack
              (substitute* "CMakeLists.txt"
-               (("find_package\\(eigen REQUIRED")
-                "find_package(eigen REQUIRED NAMES Eigen3"))
-             (substitute* "tools/cmake/modules/Findflatbuffers.cmake"
-               (("get_target_property.*")
-                (format #false "set(FLATBUFFERS_INCLUDE_DIRS ~a/include)\n"
-                        (assoc-ref inputs "flatbuffers"))))
+              (("if\\(NOT DEFINED PTHREADPOOL_SOURCE_DIR\\)")
+               "if(false)"))
+             (substitute* "CMakeLists.txt"
+              (("if\\(NOT TARGET pthreadpool\\)")
+               "if(false)"))
 
              ;; Don't fetch source code; we already have everything we need.
              (substitute* '("tools/cmake/modules/fft2d.cmake"
-                            "tools/cmake/modules/ruy.cmake"
                             "tools/cmake/modules/farmhash.cmake"
-                            "tools/cmake/modules/neon2sse.cmake"
                             "tools/cmake/modules/gemmlowp.cmake")
                (("OverridableFetchContent_Populate.*") ""))
 
@@ -3012,31 +3043,56 @@  (define-public tensorflow-lite
                (invoke "tar" "--strip-components=1"
                        "-xf" (assoc-ref inputs "fft2d-src")))
 
-             (copy-recursively (assoc-ref inputs "neon2sse-src")
-                               "/tmp/neon2sse/")
              (copy-recursively (assoc-ref inputs "gemmlowp-src")
                                "/tmp/gemmlowp/")))
-         (add-after 'copy-sources 'prepare-shared-library-build
-           (lambda _ (chdir "c")))
-         (replace 'install
-           (lambda* (#:key outputs #:allow-other-keys)
-             (let* ((out (assoc-ref outputs "out"))
-                    (lib (string-append out "/lib"))
-                    (headers (string-append out "/include/tensorflow/lite")))
-               (install-file "../build/libtensorflowlite_c.so" lib)
-               (with-directory-excursion ".."
-                 (for-each
-                  (lambda (file)
-                    (let ((target-dir (string-append headers "/" (dirname file))))
-                      (install-file file target-dir)))
-                  (find-files "." "\\.h$")))))))))
+
+         (add-after 'build 'build-shared-library
+             (lambda* (#:key configure-flags #:allow-other-keys)
+             	 (mkdir-p "c")
+                 (with-directory-excursion "c"
+                   (apply invoke "cmake" (append configure-flags (list "../../lite/c")))
+                   (invoke "cmake" "--build" "." "-j" (number->string
+                                              (parallel-job-count))))))
+         (add-after 'build-shared-library 'build-benchmark-model
+             (lambda _
+                 (invoke "cmake" "--build" "." "--target" "benchmark_model"
+                 	 "-j" (number->string (parallel-job-count)))))
+
+         (add-after 'install 'install-extra
+         	 (lambda* (#:key outputs #:allow-other-keys)
+         	 	 (let* ((out (assoc-ref outputs "out"))
+                   (lib (string-append out "/lib"))
+                   (bin (string-append out "/bin")))
+                 (install-file "../build/c/libtensorflowlite_c.so" lib)
+                 (install-file "../build/tools/benchmark/benchmark_model" bin))))
+         ; TO DO: test not building now
+      ;   (replace 'check
+      ;      (lambda* (#:key tests? #:allow-other-keys)
+      ;        (when tests?
+      ;          (invoke "ctest" "-L" "plain"))))
+      )))
     (inputs
      `(("abseil-cpp" ,abseil-cpp-20200923.3)
-       ("eigen" ,eigen-for-tensorflow-lite)
-       ("flatbuffers" ,flatbuffers)
-       ("python" ,python)))
+       ("cpuinfo" ,cpuinfo)
+       ("eigen" ,eigen)
+       ("fp16" ,fp16)
+       ("flatbuffers" ,flatbuffers-next-shared)
+       ;("gemmlowp" ,gemmlowp)  ;; TO DO
+       ("mesa-headers"  ,mesa-headers)
+       ("neon2sse" ,neon2sse)
+       ("nsync" ,nsync)
+       ("opencl-clhpp" ,opencl-clhpp)
+       ("opencl-headers" ,opencl-headers)
+       ("opencl-icd-loader" ,opencl-icd-loader)
+       ("pthreadpool" ,pthreadpool)
+       ("python" ,python)
+       ("ruy" ,ruy)
+       ("re2" ,re2)
+       ;("xnnpack" ,xnnpack)     ;; TO DO: properly use Guix's copy of xnnpack
+       ("vulkan-headers" , vulkan-headers)))
     (native-inputs
      `(("pkg-config" ,pkg-config)
+       ("googletest" ,googletest)
        ("gemmlowp-src"
         ;; The commit hash is taken from
         ;; "tensorflow/lite/tools/cmake/modules/gemmlowp.cmake".
@@ -3050,17 +3106,6 @@  (define-public tensorflow-lite
              (sha256
               (base32
                "1sbp8kmr2azwlvfbzryy1frxi99jhsh1nc93bdbxdf8zdgpv0kxl")))))
-       ("neon2sse-src"
-        ,(let ((commit "a1652fd5253afbf3e39357b012974f93511f6108"))
-           (origin
-             (method git-fetch)
-             (uri (git-reference
-                   (url "https://github.com/intel/ARM_NEON_2_x86_SSE")
-                   (commit commit)))
-             (file-name (git-file-name "neon2sse" (string-take commit 8)))
-             (sha256
-              (base32
-               "1q8gkxag9wlnwdwad2pclsrkwzrdjy94hyrkayrsvxyj7szb5y8i")))))
        ("farmhash-src"
         ,(let ((commit "816a4ae622e964763ca0862d9dbd19324a1eaf45"))
            (origin
@@ -3076,24 +3121,12 @@  (define-public tensorflow-lite
         ,(origin
            (method url-fetch)
            (uri (string-append "https://storage.googleapis.com/"
-                               "mirror.tensorflow.org/"
-                               "www.kurims.kyoto-u.ac.jp/~ooura/fft2d.tgz"))
+           		   "mirror.tensorflow.org/github.com/petewarden/"
+           		   "OouraFFT/archive/v1.0.tar.gz"))
            (file-name "fft2d.tar.gz")
            (sha256
             (base32
-             "1jfflzi74fag9z4qmgwvp90aif4dpbr1657izmxlgvf4hy8fk9xd"))))
-       ("ruy-src"
-        ,(let ((commit "9c56af3fce210a8a103eda19bd6f47c08a9e3d90"))
-           (origin
-             (method git-fetch)
-             (uri (git-reference
-                   (url "https://github.com/google/ruy")
-                   (commit commit)
-                   (recursive? #true)))
-             (file-name (git-file-name "ruy" (string-take commit 8)))
-             (sha256
-              (base32
-               "1cfd5gk6kaj8kbl3h98gx1ap8czd59y6p8qq8nr28fklpyzf5cis")))))))
+             "1jfflzi74fag9z4qmgwvp90aif4dpbr1657izmxlgvf4hy8fk9xd"))))))
     (home-page "https://tensorflow.org")
     (synopsis "Machine learning framework")
     (description
diff --git a/gnu/packages/serialization.scm b/gnu/packages/serialization.scm
index 9c114aaf39..0090d650ac 100644
--- a/gnu/packages/serialization.scm
+++ b/gnu/packages/serialization.scm
@@ -811,6 +811,18 @@  (define-public flatbuffers-next
                (base32
                 "1z3a6l8g2y53i5xzraswfs2i0i3kk52zv7nzc2q3fgisbyiri3pz"))))))
 
+(define-public flatbuffers-next-shared
+  (package
+    (inherit flatbuffers-next)
+    (name "flatbuffers-shared")
+    (version "23.1.21")
+    (arguments
+     (substitute-keyword-arguments (package-arguments flatbuffers-next)
+       ((#:configure-flags  flags)
+         ;; make C++ fiels compiled with -fPIC, needed for shared lib".
+              #~(cons "-DFLATBUFFERS_CXX_FLAGS=-fPIC" #$flags))))))
+
+
 (define-public python-feather-format
   (package
     (name "python-feather-format")