From 496ec9421e76526734413be89a18811767af3e42 Mon Sep 17 00:00:00 2001 From: Nuno Date: Mon, 5 Jan 2026 16:42:12 +0100 Subject: [PATCH] chore: add Linux Vulkan build and Docker image workflows (#1164) --- .dockerignore | 1 + .github/workflows/build.yml | 121 +++++++++++++++++++++++++++++++++++- Dockerfile | 3 +- Dockerfile.musa | 3 +- Dockerfile.sycl | 1 + Dockerfile.vulkan | 23 +++++++ docs/docker.md | 36 +++++++++-- 7 files changed, 179 insertions(+), 9 deletions(-) create mode 100644 Dockerfile.vulkan diff --git a/.dockerignore b/.dockerignore index 64a58a7..4627a21 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,4 +1,5 @@ build*/ +docs/ test/ .cache/ diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 48a1bc0..8955d5e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -92,6 +92,123 @@ jobs: path: | sd-${{ env.BRANCH_NAME }}-${{ steps.commit.outputs.short }}-bin-${{ steps.system-info.outputs.OS_TYPE }}-${{ steps.system-info.outputs.OS_NAME }}-${{ steps.system-info.outputs.OS_VERSION }}-${{ steps.system-info.outputs.CPU_ARCH }}.zip + ubuntu-latest-cmake-vulkan: + runs-on: ubuntu-latest + + steps: + - name: Clone + id: checkout + uses: actions/checkout@v3 + with: + submodules: recursive + + - name: Dependencies + id: depends + run: | + sudo apt-get update + sudo apt-get install build-essential libvulkan-dev glslc + + - name: Build + id: cmake_build + run: | + mkdir build + cd build + cmake .. -DSD_BUILD_SHARED_LIBS=ON -DSD_VULKAN=ON + cmake --build . --config Release + + - name: Get commit hash + id: commit + if: ${{ ( github.event_name == 'push' && github.ref == 'refs/heads/master' ) || github.event.inputs.create_release == 'true' }} + uses: pr-mpt/actions-commit-hash@v2 + + - name: Fetch system info + id: system-info + run: | + echo "CPU_ARCH=`uname -m`" >> "$GITHUB_OUTPUT" + echo "OS_NAME=`lsb_release -s -i`" >> "$GITHUB_OUTPUT" + echo "OS_VERSION=`lsb_release -s -r`" >> "$GITHUB_OUTPUT" + echo "OS_TYPE=`uname -s`" >> "$GITHUB_OUTPUT" + + - name: Pack artifacts + id: pack_artifacts + if: ${{ ( github.event_name == 'push' && github.ref == 'refs/heads/master' ) || github.event.inputs.create_release == 'true' }} + run: | + cp ggml/LICENSE ./build/bin/ggml.txt + cp LICENSE ./build/bin/stable-diffusion.cpp.txt + zip -j sd-${{ env.BRANCH_NAME }}-${{ steps.commit.outputs.short }}-bin-${{ steps.system-info.outputs.OS_TYPE }}-${{ steps.system-info.outputs.OS_NAME }}-${{ steps.system-info.outputs.OS_VERSION }}-${{ steps.system-info.outputs.CPU_ARCH }}-vulkan.zip ./build/bin/* + + - name: Upload artifacts + if: ${{ ( github.event_name == 'push' && github.ref == 'refs/heads/master' ) || github.event.inputs.create_release == 'true' }} + uses: actions/upload-artifact@v4 + with: + name: sd-${{ env.BRANCH_NAME }}-${{ steps.commit.outputs.short }}-bin-${{ steps.system-info.outputs.OS_TYPE }}-${{ steps.system-info.outputs.OS_NAME }}-${{ steps.system-info.outputs.OS_VERSION }}-${{ steps.system-info.outputs.CPU_ARCH }}-vulkan.zip + path: | + sd-${{ env.BRANCH_NAME }}-${{ steps.commit.outputs.short }}-bin-${{ steps.system-info.outputs.OS_TYPE }}-${{ steps.system-info.outputs.OS_NAME }}-${{ steps.system-info.outputs.OS_VERSION }}-${{ steps.system-info.outputs.CPU_ARCH }}-vulkan.zip + + build-and-push-docker-images: + name: Build and push container images + runs-on: ubuntu-latest + + permissions: + contents: read + packages: write + id-token: write + attestations: write + artifact-metadata: write + + strategy: + matrix: + variant: [musa, sycl, vulkan] + + env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }} + + steps: + - name: Checkout + uses: actions/checkout@v6 + with: + submodules: recursive + + - name: Get commit hash + id: commit + if: ${{ ( github.event_name == 'push' && github.ref == 'refs/heads/master' ) || github.event.inputs.create_release == 'true' }} + uses: pr-mpt/actions-commit-hash@v2 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Log in to the container registry + uses: docker/login-action@v3 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata for Docker + id: meta + uses: docker/metadata-action@v5 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + + - name: Free Disk Space (Ubuntu) + uses: jlumbroso/free-disk-space@v1.3.1 + with: + # this might remove tools that are actually needed, + # if set to "true" but frees about 6 GB + tool-cache: false + + - name: Build and push Docker image + id: build-push + uses: docker/build-push-action@v6 + with: + platforms: linux/amd64 + push: true + file: Dockerfile.${{ matrix.variant }} + tags: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ env.BRANCH_NAME }}-${{ matrix.variant }} + labels: ${{ steps.meta.outputs.labels }} + annotations: ${{ steps.meta.outputs.annotations }} + macOS-latest-cmake: runs-on: macos-latest @@ -164,7 +281,7 @@ jobs: defines: "-DGGML_NATIVE=OFF -DGGML_AVX512=ON -DGGML_AVX=ON -DGGML_AVX2=ON -DSD_BUILD_SHARED_LIBS=ON" - build: "cuda12" defines: "-DSD_CUDA=ON -DSD_BUILD_SHARED_LIBS=ON -DCMAKE_CUDA_ARCHITECTURES='61;70;75;80;86;89;90;100;120' -DCMAKE_CUDA_FLAGS='-Xcudafe \"--diag_suppress=177\" -Xcudafe \"--diag_suppress=550\"'" - - build: 'vulkan' + - build: "vulkan" defines: "-DSD_VULKAN=ON -DSD_BUILD_SHARED_LIBS=ON" steps: - name: Clone @@ -371,6 +488,8 @@ jobs: needs: - ubuntu-latest-cmake + - ubuntu-latest-cmake-vulkan + - build-and-push-docker-images - macOS-latest-cmake - windows-latest-cmake - windows-latest-cmake-hip diff --git a/Dockerfile b/Dockerfile index da73021..26a8f41 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -ARG UBUNTU_VERSION=22.04 +ARG UBUNTU_VERSION=24.04 FROM ubuntu:$UBUNTU_VERSION AS build @@ -18,5 +18,6 @@ RUN apt-get update && \ apt-get clean COPY --from=build /sd.cpp/build/bin/sd-cli /sd-cli +COPY --from=build /sd.cpp/build/bin/sd-server /sd-server ENTRYPOINT [ "/sd-cli" ] \ No newline at end of file diff --git a/Dockerfile.musa b/Dockerfile.musa index 0eac3d7..ce7c0a9 100644 --- a/Dockerfile.musa +++ b/Dockerfile.musa @@ -1,5 +1,5 @@ ARG MUSA_VERSION=rc4.2.0 -ARG UBUNTU_VERSION=22.04 +ARG UBUNTU_VERSION=24.04 FROM mthreads/musa:${MUSA_VERSION}-devel-ubuntu${UBUNTU_VERSION}-amd64 as build @@ -19,5 +19,6 @@ RUN mkdir build && cd build && \ FROM mthreads/musa:${MUSA_VERSION}-runtime-ubuntu${UBUNTU_VERSION}-amd64 as runtime COPY --from=build /sd.cpp/build/bin/sd-cli /sd-cli +COPY --from=build /sd.cpp/build/bin/sd-server /sd-server ENTRYPOINT [ "/sd-cli" ] \ No newline at end of file diff --git a/Dockerfile.sycl b/Dockerfile.sycl index 6bcb91d..466d551 100644 --- a/Dockerfile.sycl +++ b/Dockerfile.sycl @@ -15,5 +15,6 @@ RUN mkdir build && cd build && \ FROM intel/oneapi-basekit:${SYCL_VERSION}-devel-ubuntu24.04 AS runtime COPY --from=build /sd.cpp/build/bin/sd-cli /sd-cli +COPY --from=build /sd.cpp/build/bin/sd-server /sd-server ENTRYPOINT [ "/sd-cli" ] diff --git a/Dockerfile.vulkan b/Dockerfile.vulkan new file mode 100644 index 0000000..5ba6cb0 --- /dev/null +++ b/Dockerfile.vulkan @@ -0,0 +1,23 @@ +ARG UBUNTU_VERSION=24.04 + +FROM ubuntu:$UBUNTU_VERSION AS build + +RUN apt-get update && apt-get install -y --no-install-recommends build-essential git cmake libvulkan-dev glslc + +WORKDIR /sd.cpp + +COPY . . + +RUN cmake . -B ./build -DSD_VULKAN=ON +RUN cmake --build ./build --config Release --parallel + +FROM ubuntu:$UBUNTU_VERSION AS runtime + +RUN apt-get update && \ + apt-get install --yes --no-install-recommends libgomp1 libvulkan1 mesa-vulkan-drivers && \ + apt-get clean + +COPY --from=build /sd.cpp/build/bin/sd-cli /sd-cli +COPY --from=build /sd.cpp/build/bin/sd-server /sd-server + +ENTRYPOINT [ "/sd-cli" ] diff --git a/docs/docker.md b/docs/docker.md index 26a5f71..660ed25 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -1,15 +1,39 @@ -## Docker +# Docker -### Building using Docker +## Run CLI + +```shell +docker run --rm -v /path/to/models:/models -v /path/to/output/:/output ghcr.io/leejet/stable-diffusion.cpp:master [args...] +# For example +# docker run --rm -v ./models:/models -v ./build:/output ghcr.io/leejet/stable-diffusion.cpp:master -m /models/sd-v1-4.ckpt -p "a lovely cat" -v -o /output/output.png +``` + +## Run server + +```shell +docker run --rm --init -v /path/to/models:/models -v /path/to/output/:/output -p "1234:1234" --entrypoint "/sd-server" ghcr.io/leejet/stable-diffusion.cpp:master [args...] +# For example +# docker run --rm --init -v ./models:/models -v ./build:/output -p "1234:1234" --entrypoint "/sd-server" ghcr.io/leejet/stable-diffusion.cpp:master -m /models/sd-v1-4.ckpt -p "a lovely cat" -v -o /output/output.png +``` + +## Building using Docker ```shell docker build -t sd . ``` -### Run +## Building variants using Docker + +Vulkan: ```shell -docker run -v /path/to/models:/models -v /path/to/output/:/output sd-cli [args...] +docker build -f Dockerfile.vulkan -t sd . +``` + +## Run locally built image's CLI + +```shell +docker run --rm -v /path/to/models:/models -v /path/to/output/:/output sd [args...] # For example -# docker run -v ./models:/models -v ./build:/output sd-cli -m /models/sd-v1-4.ckpt -p "a lovely cat" -v -o /output/output.png -``` \ No newline at end of file +# docker run --rm -v ./models:/models -v ./build:/output sd -m /models/sd-v1-4.ckpt -p "a lovely cat" -v -o /output/output.png +```