diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..2a2c832 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,51 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +env: + NDK_VERSION: '27.0.12077973' + +jobs: + unit-tests: + name: Unit Tests + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Set up JDK 17 + uses: actions/setup-java@v4 + with: + java-version: '17' + distribution: 'temurin' + + - name: Setup Android SDK + uses: android-actions/setup-android@v3 + + - name: Setup Gradle + uses: gradle/actions/setup-gradle@v4 + + - name: Install NDK and CMake + run: | + yes | sdkmanager --install "ndk;${{ env.NDK_VERSION }}" "cmake;3.22.1" || true + + - name: Run unit tests + run: ./gradlew testDebugUnitTest --no-daemon -Pandroid.ndkVersion=${{ env.NDK_VERSION }} + + - name: Upload test results + uses: actions/upload-artifact@v4 + if: always() + with: + name: unit-test-results + path: app/build/reports/tests/ + + # Instrumented tests are disabled for now due to Vulkan shader compilation + # issues in CI. The tests also make real API calls to HuggingFace which + # makes them inherently flaky. Run locally with: ./gradlew connectedDebugAndroidTest diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..4bf8289 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "app/src/main/cpp/llama.cpp"] + path = app/src/main/cpp/llama.cpp + url = https://github.com/ggml-org/llama.cpp.git +[submodule "third_party/Vulkan-Headers"] + path = third_party/Vulkan-Headers + url = https://github.com/KhronosGroup/Vulkan-Headers.git diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 2f4d4fc..fb516b2 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -82,7 +82,7 @@ android { buildFeatures { viewBinding = true } - ndkVersion = "28.2.13676358" + ndkVersion = project.findProperty("android.ndkVersion")?.toString() ?: "27.0.12077973" packaging { jniLibs { diff --git a/app/src/androidTest/java/ai/baseweight/baseweightsnap/models/HuggingFaceApiClientTest.kt b/app/src/androidTest/java/ai/baseweight/baseweightsnap/models/HuggingFaceApiClientTest.kt index d815ba8..ede1f5d 100644 --- a/app/src/androidTest/java/ai/baseweight/baseweightsnap/models/HuggingFaceApiClientTest.kt +++ b/app/src/androidTest/java/ai/baseweight/baseweightsnap/models/HuggingFaceApiClientTest.kt @@ -58,9 +58,11 @@ class HuggingFaceApiClientTest { val files = result.getOrNull()!! // Verify all required files found - assertTrue(files.configFile.isConfig) + assertNotNull(files.configFile) + assertTrue(files.configFile!!.isConfig) assertTrue(files.languageFile.isGGUF) - assertTrue(files.visionFile.isMMProj) + assertNotNull(files.visionFile) + assertTrue(files.visionFile!!.isMMProj) assertFalse(files.languageFile.isMMProj) } diff --git a/app/src/main/cpp/CMakeLists.txt b/app/src/main/cpp/CMakeLists.txt index 2e1d402..ff55151 100644 --- a/app/src/main/cpp/CMakeLists.txt +++ b/app/src/main/cpp/CMakeLists.txt @@ -17,7 +17,7 @@ set(BUILD_TARGET "unknown") set(LLAMA_BUILD_NUMBER 0) set(LLAMA_BUILD_COMMIT "unknown") set(LLAMA_BUILD_COMMON ON) -set(LLAMA_BUILD_TOOLS ON) +set(LLAMA_BUILD_TOOLS OFF) # ============================================================================= # Vulkan Variant (Simplified - only build option) @@ -26,14 +26,19 @@ set(LLAMA_BUILD_TOOLS ON) set(GGML_VULKAN ON) set(GGML_CPU_KLEIDIAI OFF) -# Set Vulkan headers path -set(VULKAN_HEADERS_INSTALL_DIR /home/bowserj/Vulkan-Headers) -set(Vulkan_INCLUDE_DIR /home/bowserj/Vulkan-Headers/include) -include_directories(/home/bowserj/Vulkan-Headers/include) +# Set Vulkan headers path (relative to project root) +set(VULKAN_HEADERS_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../../../third_party/Vulkan-Headers) +set(VULKAN_HEADERS_INSTALL_DIR ${VULKAN_HEADERS_DIR}) +set(Vulkan_INCLUDE_DIR ${VULKAN_HEADERS_DIR}/include) +include_directories(${VULKAN_HEADERS_DIR}/include) # Load llama.cpp add_subdirectory(llama.cpp build-llama) +# Build mtmd (multimodal) library - not built when LLAMA_BUILD_TOOLS is OFF +set(LLAMA_INSTALL_VERSION "0.0.0") +add_subdirectory(llama.cpp/tools/mtmd build-mtmd) + # Build Vulkan library add_library(baseweightsnap SHARED mtmd-android.cpp diff --git a/app/src/main/cpp/llama.cpp b/app/src/main/cpp/llama.cpp new file mode 160000 index 0000000..f99ef53 --- /dev/null +++ b/app/src/main/cpp/llama.cpp @@ -0,0 +1 @@ +Subproject commit f99ef53d2a9591a9a32d28f402630cf7c58f1298 diff --git a/third_party/Vulkan-Headers b/third_party/Vulkan-Headers new file mode 160000 index 0000000..2fa2034 --- /dev/null +++ b/third_party/Vulkan-Headers @@ -0,0 +1 @@ +Subproject commit 2fa203425eb4af9dfc6b03f97ef72b0b5bcb8350