Skip to content

Commit

Permalink
add libedgetpu
Browse files Browse the repository at this point in the history
  • Loading branch information
Curid committed Jan 23, 2024
1 parent da97a41 commit de5f0f9
Show file tree
Hide file tree
Showing 7 changed files with 399 additions and 5 deletions.
3 changes: 2 additions & 1 deletion docs/1_Installation.md
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,8 @@ Help wanted for proper install instructions.

- [rust](https://www.rust-lang.org/tools/install) 1.65+
- [ffmpeg](https://ffmpeg.org/download.html)
- [tflite](https://www.tensorflow.org/lite/guide/build_cmake#build_tensorflow_lite_c_library)
* [libtensorflowlite_c](https://www.tensorflow.org/lite/guide/build_cmake#build_tensorflow_lite_c_library)
- [libedgetpu](https://github.com/google-coral/libedgetpu)
- `libusb-1.0-0-dev`
- git

Expand Down
1 change: 1 addition & 0 deletions docs/3_Development.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@ You can install everything manually instead. Most things don't require a very sp
* [node 18+](https://nodejs.org)
* [libavutil+libavcodec](https://ffmpeg.org)
* [libtensorflowlite_c](https://www.tensorflow.org/lite/guide/build_cmake#build_tensorflow_lite_c_library)
* [libedgetpu](https://github.com/google-coral/libedgetpu)
* [shellcheck](https://www.shellcheck.net)
* pkg-config

Expand Down
134 changes: 134 additions & 0 deletions misc/nix/patches/libedgetpu_makefile.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,134 @@
diff --git a/makefile_build/Makefile b/makefile_build/Makefile
index ef7d290..9228810 100644
--- a/makefile_build/Makefile
+++ b/makefile_build/Makefile
@@ -10,8 +10,6 @@ BUILDROOT ?= $(MAKEFILE_DIR)/..
BUILDDIR := $(BUILDROOT)/out
TOBUILDDIR = $(addprefix $(BUILDDIR)/,$(1))
MKDIR = if [ ! -d $(dir $@) ]; then mkdir -p $(dir $@); fi
-CC=gcc
-CXX=g++
FLATC=flatc

LIBEDGETPU_CFLAGS := \
@@ -20,26 +18,19 @@ LIBEDGETPU_CFLAGS := \
-std=c99

LIBEDGETPU_CXXFLAGS := \
+ ${CXXFLAGS} \
-fPIC \
-Wall \
- -std=c++14 \
- -DDARWINN_PORT_DEFAULT
+ -std=c++17 \
+ -DDARWINN_PORT_DEFAULT \
+ -DFLATBUFFERS_LOCALE_INDEPENDENT=0

LIBEDGETPU_LDFLAGS := \
-Wl,-Map=$(BUILDDIR)/output.map \
-shared \
-Wl,--soname,libedgetpu.so.1 \
-Wl,--version-script=$(BUILDROOT)/tflite/public/libedgetpu.lds \
- -fuse-ld=gold \
-lflatbuffers \
- -labsl_flags \
- -labsl_flags_internal \
- -labsl_flags_reflection \
- -labsl_flags_marshalling \
- -labsl_hash \
- -labsl_hashtablez_sampler \
- -labsl_raw_hash_set \
- -labsl_str_format_internal \
-lusb-1.0

LIBEDGETPU_FLATC_SRCS := \
@@ -59,9 +50,6 @@ LIBEDGETPU_INCLUDES := \
$(BUILDDIR)/$(BUILDROOT)
LIBEDGETPU_INCLUDES := $(addprefix -I,$(LIBEDGETPU_INCLUDES))

-LIBEDGETPU_CSRCS := $(TFROOT)/tensorflow/lite/c/common.c
-LIBEDGETPU_COBJS := $(call TOBUILDDIR,$(patsubst %.c,%.o,$(LIBEDGETPU_CSRCS)))
-
LIBEDGETPU_CCSRCS := \
$(BUILDROOT)/api/allocated_buffer.cc \
$(BUILDROOT)/api/buffer.cc \
@@ -140,24 +128,18 @@ LIBEDGETPU_CCSRCS := \
$(BUILDROOT)/tflite/edgetpu_c.cc \
$(BUILDROOT)/tflite/edgetpu_delegate_for_custom_op.cc \
$(BUILDROOT)/tflite/edgetpu_delegate_for_custom_op_tflite_plugin.cc \
- $(TFROOT)/tensorflow/lite/util.cc
+ $(TFROOT)/tensorflow/lite/util.cc \
+ $(TFROOT)/tensorflow/lite/core/c/common.cc
LIBEDGETPU_CCOBJS := $(call TOBUILDDIR,$(patsubst %.cc,%.o,$(LIBEDGETPU_CCSRCS)))

-# In order to support direct and throttled mode - we need to compile two files
-# twice (changing -DTHROTTLE_EDGE_TPU).
LIBEDGETPU_MAX_CCSRCS := \
$(BUILDROOT)/tflite/edgetpu_context_direct.cc \
$(BUILDROOT)/tflite/edgetpu_manager_direct.cc
LIBEDGETPU_MAX_CCOBJS := $(call TOBUILDDIR,$(patsubst %.cc,%.o,$(LIBEDGETPU_MAX_CCSRCS)))

-LIBEDGETPU_STD_CCSRCS := \
- $(BUILDROOT)/tflite/edgetpu_context_direct.cc \
- $(BUILDROOT)/tflite/edgetpu_manager_direct.cc
-LIBEDGETPU_STD_CCOBJS := $(call TOBUILDDIR,$(patsubst %.cc,%-throttled.o,$(LIBEDGETPU_STD_CCSRCS)))
-
.PHONY: libedgetpu

-all: libedgetpu libedgetpu-throttled
+all: libedgetpu

clean:
rm -rf $(BUILDDIR)
@@ -196,19 +178,39 @@ $(LIBEDGETPU_MAX_CCOBJS) : $(BUILDDIR)/%.o: %.cc
@echo "Compiling $<"
@$(CXX) $(LIBEDGETPU_CXXFLAGS) $(LIBEDGETPU_INCLUDES) -c $< -MD -MT $@ -MF $(@:%o=%d) -o $@

-$(LIBEDGETPU_STD_CCOBJS) : $(BUILDDIR)/%-throttled.o: %.cc
- @$(MKDIR)
- @echo "Compiling $<"
- @$(CXX) -DTHROTTLE_EDGE_TPU $(LIBEDGETPU_CXXFLAGS) $(LIBEDGETPU_INCLUDES) -c $< -MD -MT $@ -MF $(@:%o=%d) -o $@

-libedgetpu: | firmware $(LIBEDGETPU_FLATC_OBJS) $(LIBEDGETPU_COBJS) $(LIBEDGETPU_CCOBJS) $(LIBEDGETPU_MAX_CCOBJS)
+ABSL_LIBS := \
+ -labsl_flags_internal \
+ -labsl_flags_marshalling \
+ -labsl_flags_reflection \
+ -labsl_flags_commandlineflag \
+ -labsl_flags_commandlineflag_internal \
+ -labsl_flags_config \
+ -labsl_flags_private_handle_accessor \
+ -labsl_flags_program_name \
+ -labsl_hash \
+ -labsl_city \
+ -labsl_low_level_hash \
+ -labsl_raw_hash_set \
+ -labsl_raw_logging_internal \
+ -labsl_spinlock_wait \
+ -labsl_str_format_internal \
+ -labsl_strings \
+ -labsl_synchronization \
+ -labsl_throw_delegate \
+ -labsl_time \
+ -labsl_time_zone \
+ -labsl_base \
+ -labsl_int128 \
+ -labsl_malloc_internal \
+ -labsl_stacktrace \
+ -labsl_symbolize \
+ -labsl_demangle_internal \
+ -labsl_debugging_internal \
+
+
+libedgetpu: | firmware $(LIBEDGETPU_FLATC_OBJS) $(LIBEDGETPU_CCOBJS) $(LIBEDGETPU_MAX_CCOBJS)
@mkdir -p $(BUILDDIR)/direct/k8
@echo "Building libedgetpu.so"
- @$(CXX) $(LIBEDGETPU_CCFLAGS) $(LIBEDGETPU_LDFLAGS) $(LIBEDGETPU_COBJS) $(LIBEDGETPU_CCOBJS) $(LIBEDGETPU_MAX_CCOBJS) -o $(BUILDDIR)/direct/k8/libedgetpu.so.1.0
+ @$(CXX) $(LIBEDGETPU_CCFLAGS) $(LIBEDGETPU_LDFLAGS) $(LIBEDGETPU_CCOBJS) $(LIBEDGETPU_MAX_CCOBJS) $(ABSL_LIBS) -o $(BUILDDIR)/direct/k8/libedgetpu.so.1.0
@ln -sf $(BUILDDIR)/direct/k8/libedgetpu.so.1.0 $(BUILDDIR)/direct/k8/libedgetpu.so.1
-
-libedgetpu-throttled: | firmware $(LIBEDGETPU_FLATC_OBJS) $(LIBEDGETPU_COBJS) $(LIBEDGETPU_CCOBJS) $(LIBEDGETPU_STD_CCOBJS)
- @mkdir -p $(BUILDDIR)/throttled/k8
- @echo "Building throttled libedgetpu.so"
- @$(CXX) $(LIBEDGETPU_CCFLAGS) $(LIBEDGETPU_LDFLAGS) $(LIBEDGETPU_COBJS) $(LIBEDGETPU_CCOBJS) $(LIBEDGETPU_STD_CCOBJS) -o $(BUILDDIR)/throttled/k8/libedgetpu.so.1.0
- @ln -sf $(BUILDDIR)/throttled/k8/libedgetpu.so.1.0 $(BUILDDIR)/throttled/k8/libedgetpu.so.1
88 changes: 87 additions & 1 deletion misc/nix/shell-aarch64.nix
Original file line number Diff line number Diff line change
Expand Up @@ -56,11 +56,97 @@ let
)
)
{} );
libedgetpu = (
pkgs.callPackage (
{ stdenv, lib, fetchFromGitHub, libusb1, xxd }:
let
flatbuffers = (pkgs.callPackage (
{ lib, stdenv, fetchFromGitHub, cmake, python3}:
stdenv.mkDerivation {
pname = "flatbuffers";
version = "7d6d99c6befa635780a4e944d37ebfd58e68a108";
NIX_CXXSTDLIB_COMPILE = "-std=c++17";
src = fetchFromGitHub {
owner = "google";
repo = "flatbuffers";
rev = "v2.0.6";
hash = "sha256-0bJ0n/5yzj6lHXLKJzHUS0Bnlmys+X7pY/3LGapVh6k=";
};
nativeBuildInputs = [ cmake python3 ];
meta = { mainProgram = "flatc"; };
}
){});
abseil-cpp = (pkgs.callPackage (
{ lib, stdenv, fetchFromGitHub, cmake, gtest }:
stdenv.mkDerivation (finalAttrs: {
pname = "abseil-cpp";
version = "20230125.3";

src = fetchFromGitHub {
owner = "abseil";
repo = "abseil-cpp";
rev = "273292d1cfc0a94a65082ee350509af1d113344d";
hash = "sha256-cnvLcBaznltTHJ5FSTuHhsRMmsDbJ9gyvhrBOdul288=";
};
cmakeFlags = [
"-DABSL_BUILD_TEST_HELPERS=ON"
"-DABSL_USE_EXTERNAL_GOOGLETEST=ON"
"-DBUILD_SHARED_LIBS=ON"
];
strictDeps = true;
nativeBuildInputs = [ cmake ];
NIX_CXXSTDLIB_COMPILE = "-std=c++17";
buildInputs = [ gtest ];
})
){});
in stdenv.mkDerivation rec {
pname = "libedgetpu";
version = "grouper";

src = fetchFromGitHub {
owner = "google-coral";
repo = pname;
rev = "release-${version}";
sha256 = "sha256-73hwItimf88Iqnb40lk4ul/PzmCNIfdt6Afi+xjNiBE=";
};
patches = ./patches/libedgetpu_makefile.patch;

makeFlags = ["-f" "makefile_build/Makefile" "libedgetpu"];

buildInputs = [ libusb1 abseil-cpp flatbuffers ];

nativeBuildInputs = [ xxd flatbuffers ];

NIX_CXXSTDLIB_COMPILE = "-std=c++17";

TFROOT = "${fetchFromGitHub {
owner = "tensorflow";
repo = "tensorflow";
rev = "v2.12.1";
sha256 = "sha256-rU7xUoF5pvpOGdJV/9mqOLkBV8ll0Oe7pRS3p5qkb0o=";
}}";

enableParallelBuilding = false;

installPhase = ''
mkdir -p $out/lib
cp out/direct/k8/libedgetpu.so.1.0 $out/lib
ln -s $out/lib/libedgetpu.so.1.0 $out/lib/libedgetpu.so.1
ln -s $out/lib/libedgetpu.so.1.0 $out/lib/libedgetpu.so
mkdir -p $out/lib/udev/rules.d
cp debian/edgetpu-accelerator.rules $out/lib/udev/rules.d/99-edgetpu-accelerator.rules
'';
}
)
{} );
in pkgs.mkShell {
nativeBuildInputs = [ pkgs.rust-bin.stable."1.65.0".minimal pkgs.pkg-config pkgs.curl ];
buildInputs = [ ffmpeg ];
buildInputs = [ ffmpeg libedgetpu ];

LD_LIBRARY_PATH = "${ffmpeg}/lib:${libedgetpu}/lib";

FFLIBS = "${ffmpeg}/lib";
EDGETPULIB= "${libedgetpu}/lib";
CARGO_BUILD_TARGET = "aarch64-unknown-linux-gnu";
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER = "${pkgs.stdenv.cc.targetPrefix}cc";
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUSTFLAGS = "-C link-args=-Wl,-rpath,$ORIGIN/libs:$ORIGIN/../libs";
Expand Down
88 changes: 86 additions & 2 deletions misc/nix/shell-ci.nix
Original file line number Diff line number Diff line change
Expand Up @@ -565,6 +565,89 @@ let
}
)
{} );
libedgetpu = (
pkgs.callPackage (
{ stdenv, lib, fetchFromGitHub, libusb1, xxd }:
let
flatbuffers = (pkgs.callPackage (
{ lib, stdenv, fetchFromGitHub, cmake, python3}:
stdenv.mkDerivation {
pname = "flatbuffers";
version = "7d6d99c6befa635780a4e944d37ebfd58e68a108";
NIX_CXXSTDLIB_COMPILE = "-std=c++17";
src = fetchFromGitHub {
owner = "google";
repo = "flatbuffers";
rev = "v2.0.6";
hash = "sha256-0bJ0n/5yzj6lHXLKJzHUS0Bnlmys+X7pY/3LGapVh6k=";
};
nativeBuildInputs = [ cmake python3 ];
meta = { mainProgram = "flatc"; };
}
){});
abseil-cpp = (pkgs.callPackage (
{ lib, stdenv, fetchFromGitHub, cmake, gtest }:
stdenv.mkDerivation (finalAttrs: {
pname = "abseil-cpp";
version = "20230125.3";

src = fetchFromGitHub {
owner = "abseil";
repo = "abseil-cpp";
rev = "273292d1cfc0a94a65082ee350509af1d113344d";
hash = "sha256-cnvLcBaznltTHJ5FSTuHhsRMmsDbJ9gyvhrBOdul288=";
};
cmakeFlags = [
"-DABSL_BUILD_TEST_HELPERS=ON"
"-DABSL_USE_EXTERNAL_GOOGLETEST=ON"
"-DBUILD_SHARED_LIBS=ON"
];
strictDeps = true;
nativeBuildInputs = [ cmake ];
NIX_CXXSTDLIB_COMPILE = "-std=c++17";
buildInputs = [ gtest ];
})
){});
in stdenv.mkDerivation rec {
pname = "libedgetpu";
version = "grouper";

src = fetchFromGitHub {
owner = "google-coral";
repo = pname;
rev = "release-${version}";
sha256 = "sha256-73hwItimf88Iqnb40lk4ul/PzmCNIfdt6Afi+xjNiBE=";
};
patches = ./patches/libedgetpu_makefile.patch;

makeFlags = ["-f" "makefile_build/Makefile" "libedgetpu"];

buildInputs = [ libusb1 abseil-cpp flatbuffers ];

nativeBuildInputs = [ xxd flatbuffers ];

NIX_CXXSTDLIB_COMPILE = "-std=c++17";

TFROOT = "${fetchFromGitHub {
owner = "tensorflow";
repo = "tensorflow";
rev = "v2.12.1";
sha256 = "sha256-rU7xUoF5pvpOGdJV/9mqOLkBV8ll0Oe7pRS3p5qkb0o=";
}}";

enableParallelBuilding = false;

installPhase = ''
mkdir -p $out/lib
cp out/direct/k8/libedgetpu.so.1.0 $out/lib
ln -s $out/lib/libedgetpu.so.1.0 $out/lib/libedgetpu.so.1
ln -s $out/lib/libedgetpu.so.1.0 $out/lib/libedgetpu.so
mkdir -p $out/lib/udev/rules.d
cp debian/edgetpu-accelerator.rules $out/lib/udev/rules.d/99-edgetpu-accelerator.rules
'';
}
)
{} );
in pkgs.mkShell {
nativeBuildInputs = [
pkgs.rust-bin.stable."1.65.0".default
Expand All @@ -574,14 +657,15 @@ let
pkgs.nodejs-18_x
pkgs.shellcheck
];
buildInputs = [ ffmpeg tflite ];
buildInputs = [ ffmpeg tflite libedgetpu ];

# Debug builds don't work without this.
hardeningDisable = [ "fortify" ];
LD_LIBRARY_PATH = "${ffmpeg}/lib:${tflite}/lib";
LD_LIBRARY_PATH = "${ffmpeg}/lib:${tflite}/lib:${libedgetpu}/lib";

FFLIBS = "${ffmpeg}/lib";
TFLITELIB = "${tflite}/lib";
EDGETPULIB= "${libedgetpu}/lib";
CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_LINKER = "clang";
CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS = "-C link-args=-fuse-ld=mold";
#CARGO_TARGET_X86_64_UNKNOWN_LINUX_GNU_RUSTFLAGS = "-C link-args=-fuse-ld=$mold,-Wl,-rpath,$ORIGIN/libs:$ORIGIN/../libs";
Expand Down
Loading

0 comments on commit de5f0f9

Please sign in to comment.