Skip to content

Commit c7f91a5

Browse files
keith4everKeith Ha
andauthored
reflecting build changes (#18)
Co-authored-by: Keith Ha <[email protected]>
1 parent 9f0d8ff commit c7f91a5

File tree

5 files changed

+130
-55
lines changed

5 files changed

+130
-55
lines changed

CMakeLists.txt

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -16,32 +16,27 @@ set(CMAKE_BUILD_TYPE Release)
1616

1717
set(AXIE_SRC_DIR ${CMAKE_SOURCE_DIR}/src)
1818
set(AXIE_INC_DIR ${CMAKE_SOURCE_DIR}/inc)
19+
set(EXT_INC_DIR ${CMAKE_SOURCE_DIR}/external/inc)
1920
set(AXIE_CLI_DIR ${CMAKE_SOURCE_DIR}/cli)
2021

2122
if(${ANDROID})
2223
message(NOTICE "Config build for Android ARM64..")
24+
OPTION(QNN_DELEGATE "QNN delegate" OFF) # Disabled by default
2325
set(CMAKE_TOOLCHAIN_FILE ${ANDROID_NDK_ROOT}/build/cmake/android.toolchain.cmake)
2426
set(ANDROID_ABI arm64-v8a)
25-
set(AXIE_LIB_DIR ${CMAKE_SOURCE_DIR}/libs/android)
27+
set(EXT_LIB_DIR ${CMAKE_SOURCE_DIR}/external/libs/android)
2628
find_library(android_log log)
2729
else()
28-
message(NOTICE "Config build for x86_64..")
29-
set(AXIE_LIB_DIR ${CMAKE_SOURCE_DIR}/libs/x86)
30+
message(NOTICE "Config build for linux..")
31+
set(EXT_LIB_DIR ${CMAKE_SOURCE_DIR}/external/libs/linux)
3032
endif()
3133

32-
add_subdirectory(
33-
"${TENSORFLOW_SOURCE_DIR}/tensorflow/lite"
34-
"${CMAKE_CURRENT_BINARY_DIR}/tensorflow-lite"
35-
EXCLUDE_FROM_ALL
36-
)
37-
3834
link_directories(
39-
${AXIE_LIB_DIR}
35+
${EXT_LIB_DIR}
4036
)
4137

4238
# build top library: whisperax
4339
if(${ANDROID})
44-
4540
if(${QNN_DELEGATE}) # QCOM QNN delegate
4641
message(NOTICE " Delegate via QCOM QNN..")
4742
add_library(whisperax SHARED
@@ -75,6 +70,8 @@ endif()
7570

7671
target_include_directories(whisperax PRIVATE
7772
${AXIE_INC_DIR}
73+
${EXT_INC_DIR}
74+
${TENSORFLOW_SOURCE_DIR}
7875
)
7976

8077
if(${ANDROID})
@@ -83,11 +80,11 @@ if(${ANDROID})
8380
ADD_DEFINITIONS(-DQNN_DELEGATE)
8481
add_library(qnn_delegate SHARED IMPORTED)
8582
set_property(TARGET qnn_delegate PROPERTY IMPORTED_LOCATION
86-
${AXIE_LIB_DIR}/libQnnTFLiteDelegate.so
83+
${EXT_LIB_DIR}/libQnnTFLiteDelegate.so
8784
)
8885
target_link_libraries(whisperax PRIVATE
8986
qnn_delegate
90-
tensorflow-lite
87+
tensorflowlite
9188
tensorflowlite_gpu_delegate
9289
${android_log}
9390
SDL3
@@ -96,7 +93,7 @@ if(${ANDROID})
9693
else()
9794
ADD_DEFINITIONS(-DGPU_DELEGATE)
9895
target_link_libraries(whisperax PRIVATE
99-
tensorflow-lite
96+
tensorflowlite
10097
tensorflowlite_gpu_delegate
10198
${android_log}
10299
SDL3
@@ -105,7 +102,7 @@ if(${ANDROID})
105102

106103
else()
107104
target_link_libraries(whisperax PRIVATE
108-
tensorflow-lite
105+
tensorflowlite
109106
SDL3
110107
)
111108
endif()
@@ -126,6 +123,7 @@ add_executable(whisperax_cli
126123
target_include_directories(whisperax_cli PRIVATE
127124
${AXIE_INC_DIR}
128125
${AXIE_CLI_DIR}
126+
${EXT_INC_DIR}
129127
)
130128

131129
target_link_libraries(whisperax_cli PRIVATE

scripts/Dockerfile

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ ENV ANDROID_HOME=$ANDROID_SDK_HOME
3333

3434
ENV QNN_SDK_ROOT=/opt/qnn-sdk
3535
ENV QNN_RUNTIME_ROOT=/opt/qnn-runtime
36+
ENV AXIE_ROOT=/src/AXIE
3637

3738
ARG ANDROID_NDK_ZIP=$ANDROID_NDK_VERSION-linux.zip
3839
ARG BAZEL_INSTALLER=bazel-6.5.0-installer-linux-x86_64.sh
@@ -42,13 +43,11 @@ ARG QNN_TFLITE_DELEGATE=qnn-tflite-delegate-2.27.0.aar
4243
ARG ANDROID_COMMAND_LINE_TOOLS=commandlinetools-linux-11076708_latest.zip
4344

4445
# Copy build dependencies
45-
ADD .build/tensorflow $TENSORFLOW_SOURCE_DIR/
46-
ADD scripts/build_tensorflow.sh /tmp/
47-
ADD .build/$ANDROID_NDK_ZIP $ANDROID_NDK_PATH/
48-
ADD .build/$BAZEL_INSTALLER $BAZEL_DIR/$BAZEL_INSTALLER
49-
ADD .build/$QNN_RUNTIME $QNN_RUNTIME_ROOT/
50-
ADD .build/$QNN_TFLITE_DELEGATE $QNN_SDK_ROOT/
51-
ADD .build/$ANDROID_COMMAND_LINE_TOOLS $ANDROID_SDK_HOME/
46+
ADD .source/$ANDROID_NDK_ZIP $ANDROID_NDK_PATH/
47+
ADD .source/$BAZEL_INSTALLER $BAZEL_DIR/$BAZEL_INSTALLER
48+
ADD .source/$QNN_RUNTIME $QNN_RUNTIME_ROOT/
49+
ADD .source/$QNN_TFLITE_DELEGATE $QNN_SDK_ROOT/
50+
ADD .source/$ANDROID_COMMAND_LINE_TOOLS $ANDROID_SDK_HOME/
5251

5352
# Unzip and install dependencies
5453
RUN cd $QNN_RUNTIME_ROOT && unzip $QNN_RUNTIME && rm $QNN_RUNTIME && \
@@ -59,10 +58,10 @@ RUN cd $QNN_RUNTIME_ROOT && unzip $QNN_RUNTIME && rm $QNN_RUNTIME && \
5958
$CMD_TOOLS/bin/sdkmanager --install "platforms;android-34" --sdk_root=$ANDROID_SDK_HOME && \
6059
$CMD_TOOLS/bin/sdkmanager --install "build-tools;34.0.0" --sdk_root=$ANDROID_SDK_HOME && \
6160
$CMD_TOOLS/bin/sdkmanager --install "cmake;$CMAKE_VERION" --sdk_root=$ANDROID_SDK_HOME && \
62-
chmod +x $BAZEL_DIR/$BAZEL_INSTALLER && $BAZEL_DIR/$BAZEL_INSTALLER && rm $BAZEL_DIR/$BAZEL_INSTALLER
63-
RUN chmod +x /tmp/build_tensorflow.sh && /tmp/build_tensorflow.sh
61+
ln -s $AXIE_ROOT/.source/tensorflow $TENSORFLOW_SOURCE_DIR && \
62+
chmod +x $BAZEL_DIR/$BAZEL_INSTALLER && $BAZEL_DIR/$BAZEL_INSTALLER && rm -rf $BAZEL_DIR
6463

6564
# Set up the PATH
66-
ENV PATH=$PATH:$ANDROID_NDK_HOME:$TENSORFLOW_SOURCE_DIR:$ANDROID_SDK_HOME/$CMD_TOOLS/bin:$ANDROID_SDK_HOME/platform-tools:$ANDROID_SDK_HOME/cmake/$CMAKE_VERION/bin
65+
ENV PATH=$PATH:$ANDROID_NDK_HOME:$ANDROID_SDK_HOME/$CMD_TOOLS/bin:$ANDROID_SDK_HOME/platform-tools:$ANDROID_SDK_HOME/cmake/$CMAKE_VERION/bin
6766

68-
WORKDIR /src/AXIE
67+
WORKDIR $AXIE_ROOT

scripts/adb_push.sh

Lines changed: 44 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,35 @@
22
# For licensing see accompanying LICENSE file.
33
# Copyright © 2024 Argmax, Inc. All rights reserved.
44

5+
for dev in `adb devices | grep -v "List" | awk '{print $1}'`
6+
do
7+
DEVICE=$dev
8+
break
9+
done
10+
if [ "$DEVICE" = "" ]; then
11+
echo "No Android device is connected via adb"
12+
exit 0
13+
fi
14+
15+
echo "Pushing to: $DEVICE"
16+
517
CURRENT_DIR="$(dirname "$(realpath "$0")")"
618
SOURCE_DIR="$CURRENT_DIR/.."
719

8-
AXIE_TFLITE_CLI="$SOURCE_DIR/build/axie_tflite"
9-
LOCAL_LIBS="$SOURCE_DIR/libs"
10-
LOCAL_MODELS="$SOURCE_DIR/models"
11-
LOCAL_INPUTS="$SOURCE_DIR/inputs"
20+
AXIE_TFLITE_CLI="$SOURCE_DIR/build/android/whisperax_cli"
21+
AXIE_TFLITE_LIB="$SOURCE_DIR/build/android/libwhisperax.so"
22+
LOCAL_LIBS="$SOURCE_DIR/external/libs/android"
23+
LOCAL_TINY_DIR="$SOURCE_DIR/openai_whisper-tiny"
24+
LOCAL_BASE_DIR="$SOURCE_DIR/openai_whisper-base"
25+
LOCAL_SMALL_DIR="$SOURCE_DIR/openai_whisper-small"
1226

1327
REMOTE_BIN_DIR="/data/local/tmp/bin"
1428
REMOTE_LIB_DIR="/data/local/tmp/lib"
15-
REMOTE_MODELS_DIR="/sdcard/argmax/tflite/models"
16-
REMOTE_INPUTS_DIR="/sdcard/argmax/tflite/inputs"
29+
REMOTE_SDROOT_DIR="/sdcard/argmax/tflite"
30+
REMOTE_TINY_DIR="${REMOTE_SDROOT_DIR}/openai_whisper-tiny"
31+
REMOTE_BASE_DIR="${REMOTE_SDROOT_DIR}/openai_whisper-base"
32+
REMOTE_SMALL_DIR="${REMOTE_SDROOT_DIR}/openai_whisper-small"
33+
REMOTE_INPUTS_DIR="${REMOTE_SDROOT_DIR}/inputs"
1734

1835
# Function to push files only if they do not exist
1936
push_if_not_exists() {
@@ -29,8 +46,8 @@ push_if_not_exists() {
2946
done
3047
else
3148
# If it's a file, check if it exists on the remote device
32-
if adb shell "[ ! -e $remote_path ]"; then
33-
adb push "$local_path" "$remote_path"
49+
if adb -s $DEVICE shell "[ ! -e $remote_path ]"; then
50+
adb -s $DEVICE push "$local_path" "$remote_path"
3451
else
3552
# uncomment to debug
3653
# echo "$remote_path already exists. Skipping push."
@@ -40,7 +57,23 @@ push_if_not_exists() {
4057
}
4158

4259
# Push the files and folders to the Android device
43-
adb push "$AXIE_TFLITE_CLI" "$REMOTE_BIN_DIR/"
60+
if adb -s $DEVICE shell "[ ! -e $REMOTE_SDROOT_DIR ]"; then
61+
adb -s $DEVICE shell mkdir "$REMOTE_SDROOT_DIR"
62+
fi
63+
if adb -s $DEVICE shell "[ ! -e $REMOTE_INPUTS_DIR ]"; then
64+
adb -s $DEVICE shell mkdir "$REMOTE_INPUTS_DIR"
65+
fi
66+
if adb -s $DEVICE shell "[ ! -e $REMOTE_BIN_DIR ]"; then
67+
adb -s $DEVICE shell mkdir "$REMOTE_BIN_DIR"
68+
fi
69+
if adb -s $DEVICE shell "[ ! -e $REMOTE_LIB_DIR ]"; then
70+
adb -s $DEVICE shell mkdir "$REMOTE_LIB_DIR"
71+
fi
72+
73+
adb -s $DEVICE push "$AXIE_TFLITE_CLI" "$REMOTE_BIN_DIR/."
74+
adb -s $DEVICE push "$AXIE_TFLITE_LIB" "$REMOTE_LIB_DIR/."
75+
4476
push_if_not_exists "$LOCAL_LIBS" "$REMOTE_LIB_DIR"
45-
push_if_not_exists "$LOCAL_MODELS" "$REMOTE_MODELS_DIR"
46-
push_if_not_exists "$LOCAL_INPUTS" "$REMOTE_INPUTS_DIR"
77+
push_if_not_exists "$LOCAL_TINY_DIR" "$REMOTE_TINY_DIR"
78+
push_if_not_exists "$LOCAL_BASE_DIR" "$REMOTE_BASE_DIR"
79+
push_if_not_exists "$LOCAL_SMALL_DIR" "$REMOTE_SMALL_DIR"

scripts/build_tensorflow.sh

Lines changed: 44 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,21 +5,56 @@
55
# This build script runs when docker image is created.
66
# The resulting `libtensorflowlite_gpu_delegate.so` is copied into /libs folder in the build.sh
77

8+
CURRENT_DIR="$(dirname "$(realpath "$0")")"
9+
SOURCE_DIR="$CURRENT_DIR/.."
10+
PLATFORM=$1
11+
if [ "$PLATFORM" = "" ]; then
12+
PLATFORM="android"
13+
fi
14+
815
export PYTHON_BIN_PATH=/usr/bin/python3
916
export PYTHON_LIB_PATH=/usr/lib/python3/dist-packages
1017
export TF_NEED_ROCM=0
1118
export TF_NEED_CUDA=0
1219
export TF_NEED_CLANG=1
1320
export CLANG_COMPILER_PATH=/usr/bin/clang
1421
export CC_OPT_FLAGS=-Wno-sign-compare
15-
export TF_SET_ANDROID_WORKSPACE=1
16-
export ANDROID_NDK_API_LEVEL=24
17-
export ANDROID_API_LEVEL=34
18-
export ANDROID_BUILD_TOOLS_VERSION=34.0.0
1922

20-
cd $TENSORFLOW_SOURCE_DIR && ./configure
23+
if [ "$PLATFORM" = "android" ]; then
24+
export TF_SET_ANDROID_WORKSPACE=1
25+
export ANDROID_NDK_API_LEVEL=24
26+
export ANDROID_API_LEVEL=34
27+
export ANDROID_BUILD_TOOLS_VERSION=34.0.0
28+
29+
cd $TENSORFLOW_SOURCE_DIR && ./configure
30+
31+
if [ ! -f $SOURCE_DIR/external/libs/$PLATFORM/libtensorflowlite_gpu_delegate.so ]; then
32+
echo "$SOURCE_DIR/external/libs/$PLATFORM ..."
33+
echo "Building libtensorflowlite_gpu_delegate.so ..."
34+
printenv
35+
mkdir -p tensorflow/lite/delegates/gpu
36+
bazel build -c opt --config android_arm64 --cxxopt=--std=c++17 tensorflow/lite/delegates/gpu:libtensorflowlite_gpu_delegate.so
37+
find "$TENSORFLOW_SOURCE_DIR/" $TENSORFLOW_SOURCE_DIR/bazel-bin/ \
38+
-name libtensorflowlite_gpu_delegate.so -exec cp {} $SOURCE_DIR/external/libs/android/ \;
39+
fi
40+
41+
if [ ! -f $SOURCE_DIR/external/libs/$PLATFORM/libtensorflowlite.so ]; then
42+
bazel build -c opt --config android_arm64 --cxxopt=--std=c++17 //tensorflow/lite:libtensorflowlite.so
43+
find "$TENSORFLOW_SOURCE_DIR/" $TENSORFLOW_SOURCE_DIR/bazel-bin/ \
44+
-name libtensorflowlite.so -exec cp {} $SOURCE_DIR/external/libs/$PLATFORM/ \;
45+
fi
46+
else
47+
export TF_SET_ANDROID_WORKSPACE=0
48+
if [ ! -f $SOURCE_DIR/external/libs/$PLATFORM/libtensorflowlite.so ]; then
49+
cd $TENSORFLOW_SOURCE_DIR && ./configure
50+
51+
bazel build //tensorflow/lite:libtensorflowlite.so
52+
find "$TENSORFLOW_SOURCE_DIR/" $TENSORFLOW_SOURCE_DIR/bazel-bin/ \
53+
-name libtensorflowlite.so -exec cp {} $SOURCE_DIR/external/libs/$PLATFORM/ \;
54+
fi
55+
fi
2156

22-
echo "Building libtensorflowlite_gpu_delegate.so ..."
23-
printenv
24-
mkdir -p tensorflow/lite/delegates/gpu
25-
bazel build -c opt --config android_arm64 --cxxopt=--std=c++17 tensorflow/lite/delegates/gpu:libtensorflowlite_gpu_delegate.so
57+
if [ ! -d $SOURCE_DIR/external/inc/flatbuffers ]; then
58+
cp -rf $TENSORFLOW_SOURCE_DIR/bazel-tensorflow/external/flatbuffers/include/flatbuffers \
59+
$SOURCE_DIR/external/inc/.
60+
fi

scripts/dev_env.sh

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,22 +3,24 @@
33
# Copyright © 2024 Argmax, Inc. All rights reserved.
44

55
# This script builds and runs `android-ndk-qnn-tensorflow-image` docker image with all dependencies
6-
# As part of build process, the script downloads all dependencies into the .build/ folder.
6+
# As part of build process, the script downloads all dependencies into the .source/ folder.
77
# You will need `aria2` installed (see https://formulae.brew.sh/formula/aria2)
88

99
IMAGE_NAME="android-ndk-qnn-tensorflow-image"
1010
CONTAINER_NAME="axie_tflite"
1111
FORCE_REBUILD=false
1212
FORCE_REMOVE=false
13+
CI_MODE=false
1314

1415
CURRENT_DIR="$(dirname "$(realpath "$0")")"
1516
SOURCE_DIR="$CURRENT_DIR/.."
1617

17-
while getopts "rf" opt; do
18+
while getopts "rfc" opt; do
1819
case ${opt} in
1920
r ) FORCE_REBUILD=true ;;
2021
f ) FORCE_REMOVE=true ;;
21-
\? ) echo "Usage: cmd [-r] [-f]"
22+
c ) CI_MODE=true ;;
23+
\? ) echo "Usage: cmd [-r] [-f] [-c]"
2224
exit 1 ;;
2325
esac
2426
done
@@ -37,7 +39,7 @@ if ! $(docker image inspect $IMAGE_NAME > /dev/null 2>&1) || $FORCE_REBUILD; the
3739
# Set Aria options to download using 8 connections
3840
ARIA_OPTIONS="-x 8 -s 8 --continue --file-allocation=none"
3941

40-
BUILD_DIR="$SOURCE_DIR/.build"
42+
BUILD_DIR="$SOURCE_DIR/.source"
4143
echo "Checking and retrieving dependencies..."
4244
if command -v aria2c &> /dev/null; then
4345
aria2c $ARIA_OPTIONS -d $BUILD_DIR https://github.com/bazelbuild/bazel/releases/download/6.5.0/bazel-6.5.0-installer-linux-x86_64.sh
@@ -68,24 +70,32 @@ else
6870
echo "Docker image $IMAGE_NAME already exists."
6971
fi
7072

73+
BASH_CMD="echo 'Environment Variables:' && printenv && /bin/bash"
74+
if $CI_MODE; then
75+
# in CI mode, keep running /bin/bash but in the background
76+
RUN_OPTS="-d -i"
77+
else
78+
RUN_OPTS="-it"
79+
fi
80+
7181
# Check if the container exists
7282
if [ "$(docker ps -aq -f name=$CONTAINER_NAME)" ]; then
7383
if $FORCE_REMOVE; then
7484
echo "Removing existing container: $CONTAINER_NAME"
7585
docker rm -f $CONTAINER_NAME
7686
else
7787
if [ ! "$(docker ps -q -f name=$CONTAINER_NAME)" ]; then
78-
echo "Starting existing container: $CONTAINER_NAME"
79-
docker start $CONTAINER_NAME
88+
echo "Starting existing container: $CONTAINER_NAME"
89+
docker start $CONTAINER_NAME
8090
fi
8191
echo "SSHing into existing container: $CONTAINER_NAME"
82-
docker exec -it $CONTAINER_NAME /bin/bash -c "echo 'Environment Variables:' && printenv && exec /bin/bash"
92+
docker exec $RUN_OPTS $CONTAINER_NAME /bin/bash -c "${BASH_CMD}"
8393
exit 0
8494
fi
8595
fi
8696

8797
# Run a new container
8898
echo "Starting new container: $CONTAINER_NAME"
89-
docker run -it --name $CONTAINER_NAME \
99+
docker run --platform linux/amd64 $RUN_OPTS --name $CONTAINER_NAME \
90100
--mount type=bind,source=$SOURCE_DIR,target=/src/AXIE \
91-
$IMAGE_NAME /bin/bash -c "echo 'Environment Variables:' && printenv && exec /bin/bash"
101+
$IMAGE_NAME /bin/bash -c "${BASH_CMD}"

0 commit comments

Comments
 (0)