diff --git a/GGMLSharp/GGMLSharp.csproj b/GGMLSharp/GGMLSharp.csproj index f87aac8..af43fad 100644 --- a/GGMLSharp/GGMLSharp.csproj +++ b/GGMLSharp/GGMLSharp.csproj @@ -66,10 +66,35 @@ - - - PreserveNewest + + + + %(Filename)%(Extension) + + + + + + %(Filename)%(Extension) + + + + + + %(Filename)%(Extension) + + + + %(Filename)%(Extension) + + + + + + + + \ No newline at end of file diff --git a/GGMLSharp/Native.cs b/GGMLSharp/Native.cs index eb34cec..f787247 100644 --- a/GGMLSharp/Native.cs +++ b/GGMLSharp/Native.cs @@ -20,7 +20,7 @@ namespace GGMLSharp { internal unsafe class Native { - public const string DllName = "ggml"; + public const string DllName = "libggml"; #region ggml.h diff --git a/GGMLSharp/build/Dockerfile b/GGMLSharp/build/Dockerfile new file mode 100644 index 0000000..fe70242 --- /dev/null +++ b/GGMLSharp/build/Dockerfile @@ -0,0 +1,109 @@ +FROM ubuntu:25.04 AS base + +ARG GGML_COMMIT=master + +RUN apt-get update && \ + apt-get install -y git cmake build-essential ccache wget tar + +WORKDIR /src + +RUN git clone --filter=blob:none --no-checkout https://github.com/ggml-org/ggml.git && \ + cd ggml && \ + git checkout ${GGML_COMMIT} && \ + sed -i '4598s/$/;/' src/ggml-quants.c # This is a quick patch needed for older GGML versions to get it to compile for windows + +WORKDIR /src/ggml/build + +FROM base AS win-base + +ENV LLVM_MINGW_VERSION=20250717 +ENV LLVM_MINGW_BASE=llvm-mingw-${LLVM_MINGW_VERSION}-ucrt-ubuntu-22.04-x86_64 +ENV LLVM_MINGW_ARCHIVE=${LLVM_MINGW_BASE}.tar.xz +ENV LLVM_MINGW_PATH=/src/${LLVM_MINGW_BASE} + +WORKDIR /src + +RUN wget https://github.com/mstorsjo/llvm-mingw/releases/download/${LLVM_MINGW_VERSION}/${LLVM_MINGW_ARCHIVE} && \ + tar -xf ${LLVM_MINGW_ARCHIVE} + + +WORKDIR /src/ggml/build + +FROM win-base AS win-x64-builder + +ENV TOOLCHAIN_FILE=/src/ggml/build/toolchain-windows-x64.cmake + +RUN echo "set(CMAKE_SYSTEM_NAME Windows)" > ${TOOLCHAIN_FILE} && \ + echo "set(CMAKE_C_COMPILER ${LLVM_MINGW_PATH}/bin/x86_64-w64-mingw32-clang)" >> ${TOOLCHAIN_FILE} && \ + echo "set(CMAKE_CXX_COMPILER ${LLVM_MINGW_PATH}/bin/x86_64-w64-mingw32-clang++)" >> ${TOOLCHAIN_FILE} && \ + echo "set(CMAKE_FIND_ROOT_PATH ${LLVM_MINGW_PATH}/x86_64-w64-mingw32)" >> ${TOOLCHAIN_FILE} && \ + echo "set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)" >> ${TOOLCHAIN_FILE} && \ + echo "set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)" >> ${TOOLCHAIN_FILE} && \ + echo "set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)" >> ${TOOLCHAIN_FILE} + +RUN cmake .. \ + -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_FILE} \ + -DGGML_BUILD_TESTS=OFF \ + -DGGML_OPENMP=OFF \ + -DBUILD_SHARED_LIBS=ON + +RUN cmake --build . --config Release -j $(nproc) + +FROM win-base AS win-arm64-builder + +ENV TOOLCHAIN_FILE=/src/ggml/build/toolchain-windows-arm64.cmake + +RUN echo "set(CMAKE_SYSTEM_NAME Windows)" > ${TOOLCHAIN_FILE} && \ + echo "set(CMAKE_C_COMPILER ${LLVM_MINGW_PATH}/bin/aarch64-w64-mingw32-clang)" >> ${TOOLCHAIN_FILE} && \ + echo "set(CMAKE_CXX_COMPILER ${LLVM_MINGW_PATH}/bin/aarch64-w64-mingw32-clang++)" >> ${TOOLCHAIN_FILE} && \ + echo "set(CMAKE_FIND_ROOT_PATH ${LLVM_MINGW_PATH}/aarch64-w64-mingw32)" >> ${TOOLCHAIN_FILE} && \ + echo "set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)" >> ${TOOLCHAIN_FILE} && \ + echo "set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)" >> ${TOOLCHAIN_FILE} && \ + echo "set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)" >> ${TOOLCHAIN_FILE} + +RUN cmake .. \ + -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_FILE} \ + -DBUILD_SHARED_LIBS=ON \ + -DGGML_OPENMP=OFF \ + -DGGML_BUILD_TESTS=OFF + +RUN cmake --build . --config Release -j $(nproc) + +FROM base AS linux-x64-builder + +RUN cmake .. \ + -DBUILD_SHARED_LIBS=ON \ + -DGGML_OPENMP=OFF \ + -DGGML_BUILD_TESTS=OFF + +RUN cmake --build . --config Release -j $(nproc) + +FROM base AS linux-arm64-builder + +ENV TOOLCHAIN_FILE=/src/ggml/build/toolchain-linux-arm64.cmake + +RUN apt-get update && \ + apt-get install -y g++-aarch64-linux-gnu + +RUN echo "set(CMAKE_SYSTEM_NAME Linux)" > ${TOOLCHAIN_FILE} && \ + echo "set(CMAKE_SYSTEM_PROCESSOR aarch64)" >> ${TOOLCHAIN_FILE} && \ + echo "set(CMAKE_C_COMPILER aarch64-linux-gnu-gcc)" >> ${TOOLCHAIN_FILE} && \ + echo "set(CMAKE_CXX_COMPILER aarch64-linux-gnu-g++)" >> ${TOOLCHAIN_FILE} + +RUN cmake .. \ + -DCMAKE_TOOLCHAIN_FILE=${TOOLCHAIN_FILE} \ + -DBUILD_SHARED_LIBS=ON \ + -DGGML_BUILD_TESTS=OFF + +RUN cmake --build . --config Release -j $(nproc) + +FROM base + +WORKDIR /out + +ENV BASE=/src/ggml/build + +COPY --from=linux-x64-builder $BASE/src/*.so /out/runtimes/linux-x64/native/ +COPY --from=linux-arm64-builder $BASE/src/*.so /out/runtimes/linux-arm64/native/ +COPY --from=win-x64-builder $BASE/bin/*.dll /out/runtimes/win-x64/native/ +COPY --from=win-arm64-builder $BASE/bin/*.dll /out/runtimes/win-arm64/native/ \ No newline at end of file diff --git a/GGMLSharp/build/build.sh b/GGMLSharp/build/build.sh new file mode 100644 index 0000000..598c673 --- /dev/null +++ b/GGMLSharp/build/build.sh @@ -0,0 +1,33 @@ +#!/bin/bash + +set -e + +IMAGE_NAME="ggml-multi-platform-builder" +OUTPUT_DIR="GGMLSharp/runtimes" + +if [ ! -d "ggml" ]; then + echo "Error: 'ggml' submodule directory not found." + echo "Please run this script from the root of your project." + exit 1 +fi + +GGML_COMMIT=$(git rev-parse HEAD:ggml) +echo "Using ggml commit: ${GGML_COMMIT}" + +echo "Building the Docker image" +docker build -t ${IMAGE_NAME} --network host -f GGMLSharp/build/Dockerfile --build-arg GGML_COMMIT=${GGML_COMMIT} . + +echo "Extracting the compiled runtimes" + +CONTAINER_ID=$(docker create ${IMAGE_NAME}) + +if [ -d "${OUTPUT_DIR}" ]; then + echo "Removing existing output directory: ${OUTPUT_DIR}" + rm -rf "${OUTPUT_DIR}" +fi +mkdir -p "${OUTPUT_DIR}" + +docker cp "${CONTAINER_ID}:/out/runtimes/." "${OUTPUT_DIR}/" +docker rm -v "${CONTAINER_ID}" + +echo "Done" diff --git a/GGMLSharp/ggml.dll b/GGMLSharp/ggml.dll deleted file mode 100644 index 8a6eea1..0000000 Binary files a/GGMLSharp/ggml.dll and /dev/null differ diff --git a/GGMLSharp/runtimes/linux-arm64/native/libggml.so b/GGMLSharp/runtimes/linux-arm64/native/libggml.so new file mode 100755 index 0000000..260f063 Binary files /dev/null and b/GGMLSharp/runtimes/linux-arm64/native/libggml.so differ diff --git a/GGMLSharp/runtimes/linux-x64/native/libggml.so b/GGMLSharp/runtimes/linux-x64/native/libggml.so new file mode 100755 index 0000000..94ca0a5 Binary files /dev/null and b/GGMLSharp/runtimes/linux-x64/native/libggml.so differ diff --git a/GGMLSharp/runtimes/win-arm64/native/libggml.dll b/GGMLSharp/runtimes/win-arm64/native/libggml.dll new file mode 100755 index 0000000..551f973 Binary files /dev/null and b/GGMLSharp/runtimes/win-arm64/native/libggml.dll differ diff --git a/GGMLSharp/runtimes/win-x64/native/libggml.dll b/GGMLSharp/runtimes/win-x64/native/libggml.dll new file mode 100755 index 0000000..779b3c2 Binary files /dev/null and b/GGMLSharp/runtimes/win-x64/native/libggml.dll differ diff --git a/README.md b/README.md index 1218688..912d6ce 100644 --- a/README.md +++ b/README.md @@ -52,3 +52,17 @@ GGMLSharp contains all ggml shared libs and some demos. ### Yolov3Tiny [Yolov3Tiny](./Demos/Yolov3Tiny/) is a Demo shows how to implement YOLO object detection with ggml using pretrained model. The weight have been converted to gguf. + +## Library compilation + +Supported targets: +- Win x64/arm64 +- Linux x64/arm64 + +to compile the shared `ggml` libraries yourself, just run: + +```bash +bash GGMLSharp/build/build.sh +``` + +from the root repo directory. \ No newline at end of file