diff --git a/dankclaw/Containerfile.comfyui b/dankclaw/Containerfile.comfyui new file mode 100644 index 0000000..a705219 --- /dev/null +++ b/dankclaw/Containerfile.comfyui @@ -0,0 +1,24 @@ +# ComfyUI on the gfx1151 (AMD Strix Halo / Radeon 8060S) ROCm torch build. +# +# Base image: AMD's gfx1151-tagged vLLM image. It is the only verified build +# where torch.cuda.is_available() is True on this APU (device capability +# (11,5) = gfx1151). It already ships the matching ROCm torch family +# (torch 2.9.1+rocm, torchvision 0.24.0+rocm, torchaudio 2.9.0+rocm), so we +# must NOT let pip reinstall them: ComfyUI's requirements.txt lists an unpinned +# `torch`, which would otherwise clobber the gfx1151 kernels with a default build. +FROM docker.io/rocm/vllm:rocm7.12.0_gfx1151_ubuntu24.04_py3.12_pytorch_2.9.1_vllm_0.16.0 + +# Bake the ComfyUI code into the image (rebuild the image to update the code). +RUN git clone --depth 1 https://github.com/comfyanonymous/ComfyUI /opt/ComfyUI +WORKDIR /opt/ComfyUI + +# Pre-create the user-data dirs. The host mounts its collections over them +# (see the comfyui service in compose.yaml). +RUN mkdir -p /opt/ComfyUI/models /opt/ComfyUI/input /opt/ComfyUI/output /opt/ComfyUI/custom_nodes + +# Install ComfyUI's dependencies, but skip the torch family (already present +# above as the gfx1151 ROCm builds). torchsde and the rest are kept. +RUN grep -viE '^(torch|torchvision|torchaudio)([^a-z]|$)' requirements.txt > /tmp/req-notorch.txt \ + && pip install --no-cache-dir -r /tmp/req-notorch.txt + +EXPOSE 8188 diff --git a/dankclaw/compose.yaml b/dankclaw/compose.yaml index cfbc080..11d2892 100644 --- a/dankclaw/compose.yaml +++ b/dankclaw/compose.yaml @@ -11,21 +11,37 @@ services: # Deploy with: scripts/deploy-searxng-quadlet.sh dankclaw # See ../docs/Dankclaw/SearXNG.md, Gluetun.md, Valkey.md. - # --- AI image generation (CPU backend; ROCm does not support gfx1151) ---- + # --- AI image generation (ROCm GPU backend, gfx1151) --------------------- + # Built from Containerfile.comfyui on AMD's gfx1151 torch base. The GPU is + # passed through (/dev/kfd, /dev/dri) with the video+render groups; no --cpu. + # Models + data persist under /opt/comfyui. See ../docs/Dankclaw/ComfyUI.md. comfyui: - image: ghcr.io/comfyanonymous/comfyui:latest + build: + context: . + dockerfile: Containerfile.comfyui + image: comfyui-rocm:gfx1151 container_name: comfyui restart: unless-stopped - command: ["python", "main.py", "--cpu", "--listen", "0.0.0.0", "--port", "8188"] + command: ["python", "main.py", "--listen", "0.0.0.0", "--port", "8188"] ports: - "8188:8188" + devices: + - /dev/kfd:/dev/kfd + - /dev/dri:/dev/dri + group_add: + - video + - render volumes: - - /opt/comfyui:/workspace + - /opt/comfyui/models:/opt/ComfyUI/models + - /opt/comfyui/input:/opt/ComfyUI/input + - /opt/comfyui/output:/opt/ComfyUI/output + - /opt/comfyui/custom_nodes:/opt/ComfyUI/custom_nodes healthcheck: test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8188/')"] interval: 30s timeout: 10s - retries: 3 + retries: 5 + start_period: 180s # --- Chat UI + agent ----------------------------------------------------- openwebui: diff --git a/tests/comfyui_rocm.bats b/tests/comfyui_rocm.bats index c031388..62c3f7b 100644 --- a/tests/comfyui_rocm.bats +++ b/tests/comfyui_rocm.bats @@ -7,16 +7,15 @@ # - NOT pass --cpu # - add the video and render groups # -# STATUS (2026-08-18): the GPU migration is NOT yet applied. The compose still -# runs ComfyUI with --cpu on the stock image (the gfx1151 torch image is not -# built yet). The four compose-wiring tests below are skipped until the ROCm -# build lands. The Containerfile test stays active: the file exists and is ready. -# See docs/Research/ComfyUI ROCm and Vulkan.md. Re-enable the skips then. +# STATUS (2026-08-19): the GPU migration is applied. The compose builds +# comfyui-rocm:gfx1151 from Containerfile.comfyui (AMD's gfx1151 torch base), +# passes /dev/kfd + /dev/dri, adds the video+render groups, and drops --cpu. +# The four compose-wiring tests below are active (un-skipped). See +# docs/Research/ComfyUI ROCm and Vulkan.md. load helpers @test "comfyui builds from the gfx1151 ROCm Containerfile" { - skip "GPU ComfyUI migration pending (CPU path in use)" local compose="$REPO_ROOT/dankclaw/compose.yaml" python3 - "$compose" <<'PYEOF' import sys, yaml @@ -39,7 +38,6 @@ PYEOF } @test "comfyui passes /dev/kfd and /dev/dri to the container" { - skip "GPU ComfyUI migration pending (CPU path in use)" python3 - "$REPO_ROOT/dankclaw/compose.yaml" <<'PYEOF' import sys, yaml with open(sys.argv[1]) as fh: @@ -53,7 +51,6 @@ PYEOF } @test "comfyui does not run with --cpu" { - skip "GPU ComfyUI migration pending (CPU path in use)" python3 - "$REPO_ROOT/dankclaw/compose.yaml" <<'PYEOF' import sys, yaml with open(sys.argv[1]) as fh: @@ -67,7 +64,6 @@ PYEOF } @test "comfyui adds the video and render groups" { - skip "GPU ComfyUI migration pending (CPU path in use)" python3 - "$REPO_ROOT/dankclaw/compose.yaml" <<'PYEOF' import sys, yaml with open(sys.argv[1]) as fh: