diff --git a/docker/Dockerfile.rocm b/docker/Dockerfile.rocm new file mode 100644 index 000000000..fe8a9b15e --- /dev/null +++ b/docker/Dockerfile.rocm @@ -0,0 +1,50 @@ +FROM rocm/dev-ubuntu-24.04 AS build + +# sd-server embeds the web UI at build time, so the build image needs Node/pnpm. +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential git cmake ninja-build ccache ca-certificates curl gnupg && \ + mkdir -p /etc/apt/keyrings && \ + curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key -o /tmp/nodesource-repo.gpg.key && \ + gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg /tmp/nodesource-repo.gpg.key && \ + rm /tmp/nodesource-repo.gpg.key && \ + echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" > /etc/apt/sources.list.d/nodesource.list && \ + apt-get update && apt-get install -y --no-install-recommends nodejs && \ + npm install -g pnpm@10.15.1 && \ + apt-get clean && rm -rf /var/lib/apt/lists/* + +WORKDIR /sd.cpp + +# ROCm's clang is not on PATH in Docker RUN shells (profile scripts are not loaded). +ENV PATH="/opt/rocm/llvm/bin:$PATH" + +COPY . . + +ARG AMDGPU_TARGETS="" + +RUN cmake . -B ./build -G Ninja \ + -DCMAKE_C_COMPILER=clang \ + -DCMAKE_CXX_COMPILER=clang++ \ + -DSD_HIPBLAS=ON \ + -DGGML_NATIVE=OFF \ + -DAMDGPU_TARGETS="${AMDGPU_TARGETS}" \ + -DCMAKE_BUILD_TYPE=Release \ + -DCMAKE_BUILD_WITH_INSTALL_RPATH=ON \ + -DCMAKE_POSITION_INDEPENDENT_CODE=ON +RUN cmake --build ./build --config Release --parallel + +FROM rocm/dev-ubuntu-24.04 AS runtime + +# ROCm clang links against its own OpenMP runtime in /opt/rocm/llvm/lib, +# and the ROCm runtime libs (hipblas, rocblas, amdhip64) live in /opt/rocm/lib. +ENV LD_LIBRARY_PATH="/opt/rocm/llvm/lib:/opt/rocm/lib:$LD_LIBRARY_PATH" + +RUN apt-get update && \ + apt-get install --yes --no-install-recommends libgomp1 && \ + apt-get clean && rm -rf /var/lib/apt/lists/* + +COPY --from=build /sd.cpp/build/bin /sd.cpp/bin +RUN printf '#!/bin/sh\nexec /sd.cpp/bin/sd-cli "$@"\n' > /sd-cli && \ + printf '#!/bin/sh\nexec /sd.cpp/bin/sd-server "$@"\n' > /sd-server && \ + chmod +x /sd-cli /sd-server + +ENTRYPOINT [ "/sd-cli" ] diff --git a/docs/docker.md b/docs/docker.md index 5bacdd2d4..28e9ab5df 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -24,12 +24,25 @@ docker build -f docker/Dockerfile -t sd . ## Building variants using Docker -Vulkan: +### Vulkan: ```shell docker build -f docker/Dockerfile.vulkan -t sd . ``` +### ROCm (AMD GPU): + +Defining one or multiple targets with `--build-arg AMDGPU_TARGETS` is strongly recommended. +Building the image will otherwise likely fail or build for a target that does not fit your +hardware. + +```shell +# Build for one target +docker build -f docker/Dockerfile.rocm --build-arg "AMDGPU_TARGETS=gfx1100" -t sd . +# Build for multiple targets +docker build -f docker/Dockerfile.rocm --build-arg "AMDGPU_TARGETS=gfx1030;gfx1100" -t sd . +``` + ## Run locally built image's CLI ```shell @@ -37,3 +50,21 @@ docker run --rm -v /path/to/models:/models -v /path/to/output/:/output sd [args. # For example # 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 ``` + +### ROCm (AMD GPU) + +The user that executes this command needs to be in the `video` group and have read and write +access to `/dev/dri` and `/dev/kfd`. + +`--device` and `--group-add` allow the container access to the GPU. + +```shell +docker run --rm --device=/dev/dri --device=/dev/kfd --group-add video \ + -v /path/to/models:/models -v /path/to/output/:/output \ + sd [args...] +# For example +# docker run --rm --device=/dev/dri --device=/dev/kfd --group-add video \ +# -v ./models:/models -v ./build:/output \ +# sd -m /models/sd-v1-4.ckpt -v -o /output/output.png \ +# -p "a lovely cat" +``` \ No newline at end of file