From 98919ed37cbcd84e3b5d49d3599e0880d1177fa6 Mon Sep 17 00:00:00 2001 From: Oli Larkin Date: Fri, 1 Nov 2024 13:15:15 +0100 Subject: [PATCH 1/8] Update README.md with better venv instructions --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 549708c..62ea21d 100644 --- a/README.md +++ b/README.md @@ -77,14 +77,15 @@ Clone the repo with submodules: $ git clone --recurse-submodules https://github.com/sevagh/demucs.cpp ``` -Create a Python venv (or conda env) and install the requirements: +Create and activate a Python venv (or conda env) and install the requirements: ``` +$ python -m venv my-env +$ source my-env/bin/activate $ pip install -r ./scripts/requirements.txt ``` -Activate your venv and run the ONNXRuntime builder scripts: +Run the ONNXRuntime builder scripts: ``` -$ activate my-env $ ./scripts/build-ort-linux.sh $ ./scripts/build-ort-wasm.sh ``` From 8022409322f51eb9fa1f791b78bde3374686aff3 Mon Sep 17 00:00:00 2001 From: Oli Larkin Date: Fri, 1 Nov 2024 13:20:31 +0100 Subject: [PATCH 2/8] Use vendored Nyquist in CLI build --- src_cli/CMakeLists.txt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src_cli/CMakeLists.txt b/src_cli/CMakeLists.txt index c2b527e..d7f22e1 100644 --- a/src_cli/CMakeLists.txt +++ b/src_cli/CMakeLists.txt @@ -23,6 +23,8 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../src) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/eigen) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/oboe-resampler) +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/libnyquist ${CMAKE_BINARY_DIR}/libnyquist) + file(GLOB SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/../src/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../src_cli/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../ort-model/model/model.ort.c" "${CMAKE_CURRENT_SOURCE_DIR}/../vendor/oboe-resampler/*.cpp") add_executable(basicpitch ${SOURCES}) @@ -30,7 +32,7 @@ add_executable(basicpitch ${SOURCES}) # use target_include_directories to treat it like a system library to ignore warnings target_include_directories(basicpitch SYSTEM PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../vendor/libremidi/include) -target_link_libraries(basicpitch ${ONNX_RUNTIME_LIB} libnyquist) +target_link_libraries(basicpitch ${ONNX_RUNTIME_LIB} libnyquist::libnyquist) target_compile_definitions(basicpitch PRIVATE LIBREMIDI_HEADER_ONLY=1) file(GLOB SOURCES_TO_LINT "${CMAKE_CURRENT_SOURCE_DIR}/../src/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../src/*.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/../src_wasm/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../src_cli/*.cpp") From 156f2f7602fb9c6643b362825da750f7e8214f9d Mon Sep 17 00:00:00 2001 From: Oli Larkin Date: Fri, 1 Nov 2024 13:29:13 +0100 Subject: [PATCH 3/8] Add flatbuffers to requirements.txt ORT build fails without it --- scripts/requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/requirements.txt b/scripts/requirements.txt index 1ae1afd..10ec8b0 100644 --- a/scripts/requirements.txt +++ b/scripts/requirements.txt @@ -9,3 +9,4 @@ onnx #onnxruntime==1.16.3 #onnx==1.13.1 bin2c +flatbuffers From 4b2c0045af7b894473ab572fc9ea79e2b56626b9 Mon Sep 17 00:00:00 2001 From: Oli Larkin Date: Fri, 1 Nov 2024 13:38:34 +0100 Subject: [PATCH 4/8] Revert to onnxruntime v1.16.3 which seems to compile on macos Seeing this issue: https://github.com/microsoft/onnxruntime/issues/22679 with the previous commit --- vendor/onnxruntime | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vendor/onnxruntime b/vendor/onnxruntime index eb66bfa..2ac381c 160000 --- a/vendor/onnxruntime +++ b/vendor/onnxruntime @@ -1 +1 @@ -Subproject commit eb66bfa7b45993c4943fdc57f8ce2ab365adbab4 +Subproject commit 2ac381c55397dffff327cc6efecf6f95a70f90a1 From 130fbaced41702c1a3b674a5fc273b97eab1e373 Mon Sep 17 00:00:00 2001 From: Oli Larkin Date: Fri, 1 Nov 2024 14:36:52 +0100 Subject: [PATCH 5/8] Add macOS ort build script --- scripts/build-ort-mac.sh | 61 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100755 scripts/build-ort-mac.sh diff --git a/scripts/build-ort-mac.sh b/scripts/build-ort-mac.sh new file mode 100755 index 0000000..be7f1ee --- /dev/null +++ b/scripts/build-ort-mac.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +set -euf -o pipefail + +ONNX_CONFIG="${1:-./ort-model/model.required_operators_and_types.config}" +CMAKE_BUILD_TYPE=MinSizeRel + +build_arch() { + ONNX_CONFIG="$1" + ARCH="$2" + BUILD_DIR=./build/build-ort-mac/$ARCH + + python ./vendor/onnxruntime/tools/ci_build/build.py \ + --build_dir "${BUILD_DIR}" \ + --config=${CMAKE_BUILD_TYPE} \ + --parallel \ + --minimal_build \ + --apple_deploy_target="10.15" \ + --disable_ml_ops --disable_rtti \ + --include_ops_by_config "$ONNX_CONFIG" \ + --enable_reduced_operator_type_support \ + --cmake_extra_defines CMAKE_OSX_ARCHITECTURES="${ARCH}" \ + --cmake_extra_defines "EIGEN_NO_AUTOMATIC_RESIZING=1;EIGEN_MPL2_ONLY=1" \ + --skip_tests + + libtool -static -o "onnxruntime-macOS_${ARCH}-static-combined.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/libonnx.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/libonnxruntime_graph.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/libonnx_proto.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/libonnxruntime_mlas.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/libonnx_test_data_proto.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/libonnxruntime_optimizer.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/libonnx_test_runner_common.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/libonnxruntime_common.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/libonnxruntime_providers.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/libonnxruntime_session.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/libonnxruntime_flatbuffers.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/libonnxruntime_test_utils.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/libonnxruntime_framework.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/libonnxruntime_util.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/_deps/re2-build/libre2.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/_deps/google_nsync-build/libnsync_cpp.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/_deps/protobuf-build/libprotobuf-lite.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/_deps/abseil_cpp-build/absl/hash/libabsl_hash.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/_deps/abseil_cpp-build/absl/hash/libabsl_city.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/_deps/abseil_cpp-build/absl/hash/libabsl_low_level_hash.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/_deps/abseil_cpp-build/absl/base/libabsl_throw_delegate.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/_deps/abseil_cpp-build/absl/container/libabsl_raw_hash_set.a" \ + "${BUILD_DIR}/${CMAKE_BUILD_TYPE}/_deps/abseil_cpp-build/absl/base/libabsl_raw_logging_internal.a" +} + +build_arch "$ONNX_CONFIG" x86_64 +build_arch "$ONNX_CONFIG" arm64 + +OUTPUT_DIR=./build/build-ort-mac/universal/${CMAKE_BUILD_TYPE} + +mkdir -p ${OUTPUT_DIR} +lipo -create onnxruntime-macos_x86_64-static-combined.a \ + onnxruntime-macos_arm64-static-combined.a \ + -output "${OUTPUT_DIR}/libonnxruntime.a" +rm onnxruntime-macos_x86_64-static-combined.a +rm onnxruntime-macos_arm64-static-combined.a From 17ea8a91bc4ee69fa540a52ae57d078550ee1182 Mon Sep 17 00:00:00 2001 From: Oli Larkin Date: Fri, 1 Nov 2024 14:37:24 +0100 Subject: [PATCH 6/8] Update CLI CMakeLists.txt for macOS build --- src_cli/CMakeLists.txt | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/src_cli/CMakeLists.txt b/src_cli/CMakeLists.txt index d7f22e1..21da92e 100644 --- a/src_cli/CMakeLists.txt +++ b/src_cli/CMakeLists.txt @@ -8,14 +8,25 @@ set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(CMAKE_CXX_FLAGS "-Wall -Wextra") set(CMAKE_CXX_FLAGS_DEBUG "-g") -set(CMAKE_CXX_FLAGS_RELEASE "-O3 -march=native -ffast-math -flto -fno-signed-zeros -fassociative-math -freciprocal-math -fno-math-errno -fno-rounding-math -funsafe-math-optimizations -fno-trapping-math -fno-rtti -DNDEBUG") + +if(APPLE) + set(CMAKE_CXX_FLAGS_RELEASE "-O3 -ffast-math -flto -fno-signed-zeros -fassociative-math -freciprocal-math -fno-math-errno -fno-rounding-math -funsafe-math-optimizations -fno-trapping-math -fno-rtti -DNDEBUG") +else() + set(CMAKE_CXX_FLAGS_RELEASE "-O3 -march=native -ffast-math -flto -fno-signed-zeros -fassociative-math -freciprocal-math -fno-math-errno -fno-rounding-math -funsafe-math-optimizations -fno-trapping-math -fno-rtti -DNDEBUG") +endif() # Set some libremidi flags for wasm and header-only add_definitions(-DLIBREMIDI_HEADER_ONLY=1) #add_definitions(-DORT_NO_EXCEPTIONS=1) -# Define the path to the compiled ONNX Runtime static library -set(ONNX_RUNTIME_LIB ${CMAKE_SOURCE_DIR}/../build/build-ort-linux/MinSizeRel/libonnxruntime.so) +if(APPLE) + set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64") + set(ONNX_RUNTIME_LIB ${CMAKE_SOURCE_DIR}/../build/build-ort-mac/universal/MinSizeRel/libonnxruntime.a) + # Add Foundation framework + find_library(FOUNDATION_FRAMEWORK Foundation) +else() + set(ONNX_RUNTIME_LIB ${CMAKE_SOURCE_DIR}/../build/build-ort-linux/MinSizeRel/libonnxruntime.so) +endif() include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/onnxruntime/include) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../ort-model/model) @@ -23,6 +34,9 @@ include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../src) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/eigen) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/oboe-resampler) +# Dont build libnyquist examples +set(LIBNYQUIST_BUILD_EXAMPLE OFF CACHE BOOL "Build libnyquist examples" FORCE) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../vendor/libnyquist ${CMAKE_BINARY_DIR}/libnyquist) file(GLOB SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/../src/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../src_cli/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../ort-model/model/model.ort.c" "${CMAKE_CURRENT_SOURCE_DIR}/../vendor/oboe-resampler/*.cpp") @@ -33,6 +47,9 @@ add_executable(basicpitch ${SOURCES}) target_include_directories(basicpitch SYSTEM PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../vendor/libremidi/include) target_link_libraries(basicpitch ${ONNX_RUNTIME_LIB} libnyquist::libnyquist) +if(APPLE) + target_link_libraries(basicpitch ${FOUNDATION_FRAMEWORK}) +endif() target_compile_definitions(basicpitch PRIVATE LIBREMIDI_HEADER_ONLY=1) file(GLOB SOURCES_TO_LINT "${CMAKE_CURRENT_SOURCE_DIR}/../src/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../src/*.hpp" "${CMAKE_CURRENT_SOURCE_DIR}/../src_wasm/*.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/../src_cli/*.cpp") From e898e5274eb1810c890ee21a16166eed60830307 Mon Sep 17 00:00:00 2001 From: Oli Larkin Date: Fri, 1 Nov 2024 14:40:29 +0100 Subject: [PATCH 7/8] Update gitignore for venv and static libs --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index ca76369..147baa1 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ build*/ /__pycache__ *.pyc *.csv +*.a +venv From c04d23ffb91611b1ee3cc345b5792e569161c8f7 Mon Sep 17 00:00:00 2001 From: Oli Larkin Date: Fri, 1 Nov 2024 15:43:39 +0100 Subject: [PATCH 8/8] Improve Makefile w.r.t EMSDK env var --- Makefile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Makefile b/Makefile index d1a7ab1..7081118 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,3 @@ -EMSDK_ENV_PATH?=/home/sevagh/repos/emsdk/emsdk_env.sh - default: cli cli: @@ -11,7 +9,11 @@ cli-debug: cmake --build build/build-cli -- -j16 wasm: - @/bin/bash -c 'source $(EMSDK_ENV_PATH) && \ + @if [ -z "$$EMSDK" ]; then \ + echo "Error: EMSDK environment variable is not set. Please install and activate emsdk first."; \ + exit 1; \ + fi + @/bin/bash -c 'source "$$EMSDK/emsdk_env.sh" && \ emcmake cmake -S src_wasm -B build/build-wasm -DCMAKE_BUILD_TYPE=Release \ && cmake --build build/build-wasm -- -j16'