Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

based on https://github.com/simonlui/Docker_IPEX_ComfyUI

https://github.com/comfyanonymous/ComfyUI

Run Docker based on Ubuntu 22

Code Block
git clone https://github.com/simonlui/Docker_IPEX_ComfyUI.git
cd Docker_IPEX_ComfyUI
vi Dockerfile
docker build -t ipex-arc-comfy:latest -f Dockerfile . --no-cache
docker rm comfy-server
docker run -it --device /dev/dri --device /dev/accel --name comfy-server --network=host --security-opt=label=disable -v /docker/confyui/app:/ComfyUI:Z -v /docker/confyui/deps:/deps -v /docker/confyui/huggingface:/root/.cache/huggingface ipex-arc-comfy:latest

Modification for it to work with Ubuntu 24 image

Code Block
titleDockerfile
# SPDX-License-Identifier: Apache-2.0
ARG UBUNTU_VERSION=2224.04
FROM ubuntu:${UBUNTU_VERSION} AS oneapi-lib-installer

# Make sure Dockerfile doesn't succeed if there are errors.
RUN ["/bin/sh", "-c", "/bin/bash", "-o", "pipefail", "-c"]

# Install prerequisites to install oneAPI runtime libraries.
# hadolint ignore=DL3008
RUN apt-get update && \
    apt-get install -y --no-install-recommends --fix-missing \
    ca-certificates \
    gnupg2 \
    gpg-agent \
    unzip \
    wget

# hadolint ignore=DL4006
RUN wget --progress=dot:giga -O- https://apt.repos.intel.com/intel-gpg-keys/GPG-PUB-KEY-INTEL-SW-PRODUCTS.PUB \
   | gpg --dearmor | tee /usr/share/keyrings/oneapi-archive-keyring.gpg > /dev/null && \
   echo 'deb [signed-by=/usr/share/keyrings/oneapi-archive-keyring.gpg] https://apt.repos.intel.com/oneapi all main' \
   | tee /etc/apt/sources.list.d/oneAPI.list

# Define and install oneAPI runtime libraries for less space.
ARG DPCPP_VER=2024.2.1-1079
ARG MKL_VER=2024.2.2-15
ARG CMPLR_COMMON_VER=2024.2
# intel-oneapi-compiler-shared-common provides `sycl-ls` and other utilities like the compiler
RUN apt-get update intel-oneapi-compiler-shared-common provides `sycl-ls` and other utilities like the compiler
RUN apt-get update && \
    apt-get install -y --no-install-recommends --fix-missing \
    intel-oneapi-dpcpp-cpp-${CMPLR_COMMON_VER}=${DPCPP_VER} 2024.2\
    intel-oneapi-compiler-shared-common-${CMPLR_COMMON_VER}=${DPCPP_VER}2024.2 \
    intel-oneapi-runtime-dpcpp-cpp=${DPCPP_VER}-2024 \
    intel-oneapi-runtime-mkl=${MKL_VER}-2024 && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Add and prepare Intel Graphics driver index. This is dependent on being able to pass your GPU with a working driver on the host side where the image will run.
# hadolint ignore=DL4006
RUN https_proxy=http://proxy.example.com:3128/ wget --progress=dot:giga -qO - https://repositories.intel.com/graphicsgpu/intel-graphics.key | \
    gpg --dearmor --output /usr/share/keyrings/intel-graphics.gpg
# hadolint ignore=DL4006
RUN echo "deb [arch=amd64,i386 signed-by=/usr/share/keyrings/intel-graphics.gpg] https://repositories.intel.com/graphicsgpu/ubuntu jammynoble unifiedclient" | \
    tee /etc/apt/sources.list.d/intel.gpu.jammynoble.list

ARG UBUNTU_VERSION=2224.04
FROM ubuntu:${UBUNTU_VERSION}

# Copy all the files from the oneAPI runtime libraries image into the actual final image.
RUN mkdir -p /opt/intel
COPY --from=oneapi-lib-installer /opt/intel/ /opt/intel/
COPY --from=oneapi-lib-installer /usr/share/keyrings/intel-graphics.gpg /usr/share/keyrings/intel-graphics.gpg
COPY --from=oneapi-lib-installer /etc/apt/sources.list.d/intel.gpu.jammynoble.list /etc/apt/sources.list.d/intel.gpu.jammynoble.list

# Set apt install to not be interactive for some packages that require it.
ENV DEBIAN_FRONTEND=noninteractive

# Set oneAPI library environment variable
ENV LD_LIBRARY_PATH=/opt/intel/oneapi/redist/lib:/opt/intel/oneapi/redist/lib/intel64:$LD_LIBRARY_PATH

# Install certificate authorities to get access to secure connections to other places for downloads and other packages.
# hadolint ignore=DL3008
RUN apt-get update && \
    apt-get install -y --no-install-recommends --fix-missing \
    build-essential \
    ca-certificates \
    fonts-noto \
    git \
    gnupg2 \
    gpg-agent \
    software-properties-common \
    wget && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Sets versions of Level-Zero, OpenCL and memory allocator chosen.
ARG ICD_VER=23.17.26241.33-647~22.04
ARG LEVEL_ZERO_GPU_VER=1.3.26241.33-647~22.04
ARG ALLOCATOR=tcmalloc
ENV ALLOCATOR=${ALLOCATOR}
ARG ALLOCATOR_PACKAGE=libgoogle-perftools-dev
ARG ALLOCATOR_LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtcmalloc.so
RUN if [ "${ALLOCATOR}" = "jemalloc" ] ; then \
       ALLOCATOR_PACKAGE=libjemalloc-dev; \
       ALLOCATOR_LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so; \
    fi

# Install Level-Zero and OpenCL backends.
RUN https_proxy=http://proxy.example.com:3128/ apt-get update && \
    https_proxy=http://proxy.example.com:3128/ apt-get install -y --no-install-recommends --fix-missing \
    libze-intel-gpu1 intel-opencl-icd=${ICD_VER}ocloc-dev intel-ocloc && \
    intel-level-zero-gpu=${LEVEL_ZERO_GPU_VER} && \
    apt-get apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Install Python and other associated packages from PPA since default is 3.10
ARG PYTHON=python3.1112
# hadolint ignore=DL3008
RUN add-apt-repository ppa:deadsnakes/ppa && \
    https_proxy=http://proxy.example.com:3128/ apt-get update && \
    https_proxy=http://proxy.example.com:3128/ apt-get install -y --no-install-recommends --fix-missing \
    ${PYTHON}python3 \
    ${PYTHON}python3-dev \
    lib${PYTHON}python3-venv \
    python3-pip \
    ${PYTHON}-venvpython3-setuptools && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Update pip
# hadolint ignore=DL3013
RUN python3 -m pip install -U \
    pip \
    setuptools

# Softlink Python to make it default.
RUN ln -sf "$(which ${PYTHON})" /usr/local/bin/python && \
    ln -sf "$(which ${PYTHON})" /usr/local/bin/python3 && \
    ln -sf "$(which ${PYTHON})" /usr/bin/python && \
    ln -sf "$(which ${PYTHON})" /usr/bin/python3

# Install Comfy UI/Pytorch dependencies.
# hadolint ignore=DL3008
RUN https_proxy=http://proxy.example.com:3128/ apt-get update && \
    https_proxy=http://proxy.example.com:3128/ apt-get install -y --no-install-recommends --fix-missing \
    ${ALLOCATOR_PACKAGE} \
    libgl1 \
    libglib2.0-0 \
    libgomp1 \
    numactl && level-zero \
    apt-get cleanocl-icd-libopencl1 \
    numactl && \
    apt-get clean && \
    rm -rf /var/lib/apt/lists/*

# Getting the latest versions of Intel's Compute Runtime and associated packages on Github and installing it will update everything we installed before.
RUN mkdir neo
WORKDIR /neo
RUN wget --progress=dot:giga https://github.com/intel/intel-graphics-compiler/releases/download/v2.511.67/intel-igc-core-2_2.511.67+1841719146_amd64.deb && \
    wget --progress=dot:giga https://github.com/intel/intel-graphics-compiler/releases/download/v2.511.67/intel-igc-opencl-2_2.511.67+1841719146_amd64.deb && \
    wget --progress=dot:giga https://github.com/intel/compute-runtime/releases/download/2425.5218.3222433578.56/intel-levelocloc-zero-gpudbgsym_125.618.3222433578.56-0_amd64.debddeb && \
    wget --progress=dot:giga https://github.com/intel/compute-runtime/releases/download/2425.5218.3222433578.56/intel-opencl-icdocloc_2425.5218.3222433578.56-0_amd64.deb && \
    wget --progress=dot:giga https://github.com/intel/compute-runtime/releases/download/2425.5218.3222433578.5/libigdgmm12_22.5.56/intel-opencl-icd-dbgsym_25.18.33578.6-0_amd64.debddeb && \
    wget --progress=dot:giga https://github.com/oneapi-srcintel/levelcompute-zeroruntime/releases/download/v125.18.1933578.26/levelintel-opencl-zeroicd_125.1918.2+u22.0433578.6-0_amd64.deb && \
    wget --progress=dot:giga https://github.com/oneapi-srcintel/levelcompute-zeroruntime/releases/download/v125.18.1933578.2/level-zero-devel_1.19.2+u22.046/libigdgmm12_22.7.0_amd64.deb && \
    dpkgwget -i -- *.deb
WORKDIR /

# Make sure everything is up to date.
# hadolint ignore=DL3008
RUN https_proxy=http://proxy.example.com:3128/ apt-get update && \
    https_proxy=http://proxy.example.com:3128/ apt-get upgrade -y --no-install-recommends --fix-missing && \
    apt-get autoremove -y && \
    apt-get clean-progress=dot:giga https://github.com/intel/compute-runtime/releases/download/25.18.33578.6/libze-intel-gpu1-dbgsym_25.18.33578.6-0_amd64.ddeb && \
    wget --progress=dot:giga https://github.com/intel/compute-runtime/releases/download/25.18.33578.6/libze-intel-gpu1_25.18.33578.6-0_amd64.deb && \
    dpkg -i -- *.deb
WORKDIR /

# Make sure everything is up to date.
# hadolint ignore=DL3008
RUN https_proxy=http://proxy.example.com:3128/ apt-get update && \
    rm -rf  /var/lib/apt/lists/*

# Remove linux-libc-dev for security reasons without disturbing anything else.
RUN dpkg -r --force-depends linux-libc-dev

# Copy the startup script to the /bin/ folder and make executable.
COPY startup.sh /bin/
RUN chmod 755 /bin/startup.sh

# Volumes that can be used by the image when making containers.
VOLUME [ "/deps" ]
VOLUME [ "/ComfyUI" ]
VOLUME [ "/models" ]
VOLUME [ "/root/.cache/huggingface" ]

# Setup location of Python virtual environment and make sure LD_PRELOAD contains the path of the allocator chosen.
ENV VENVDir=/deps/venv
ENV LD_PRELOAD=${ALLOCATOR_LD_PRELOAD}

# Enable Level Zero system management
# See https://spec.oneapi.io/level-zero/latest/sysman/PROG.html
ENV ZES_ENABLE_SYSMAN=1

# Force 100% available VRAM size for compute-runtime.
# See https://github.com/intel/compute-runtime/issues/586
ENV NEOReadDebugKeys=1
ENV ClDeviceGlobalMemSizeAvailablePercent=100

# Enable double precision emulation. Turned on by default to enable torch.compile to work for various kernels. Turn this off if you need to enable attention
# slicing to address the 4GB single allocation limit with Intel Xe GPUs and lower and don't use torch.compile.
# https_proxy=http://proxy.example.com:3128/ apt-get upgrade -y --no-install-recommends --fix-missing && \
    apt-get autoremove -y && \
    apt-get clean && \
    rm -rf  /var/lib/apt/lists/*

# Remove linux-libc-dev for security reasons without disturbing anything else.
RUN dpkg -r --force-depends linux-libc-dev

# Copy the startup script to the /bin/ folder and make executable.
COPY startup.sh /bin/
RUN chmod 755 /bin/startup.sh

# Volumes that can be used by the image when making containers.
VOLUME [ "/deps" ]
VOLUME [ "/ComfyUI" ]
VOLUME [ "/models" ]
VOLUME [ "/root/.cache/huggingface" ]

# Setup location of Python virtual environment and make sure LD_PRELOAD contains the path of the allocator chosen.
ENV VENVDir=/deps/venv
ENV LD_PRELOAD=${ALLOCATOR_LD_PRELOAD}

# Enable Level Zero system management
# See https://spec.oneapi.io/level-zero/latest/sysman/PROG.html
ENV ZES_ENABLE_SYSMAN=1

# Force 100% available VRAM size for compute-runtime.
# See https://github.com/intel/compute-runtime/blob/master/opencl/doc/FAQ.md#feature-double-precision-emulation-fp64
ENV OverrideDefaultFP64Settingsissues/586
ENV NEOReadDebugKeys=1
ENV IGC_EnableDPEmulationClDeviceGlobalMemSizeAvailablePercent=1100

# Enable double SYCLprecision variablesemulation. forTurned cacheon reuseby anddefault singleto threadedenable mode.
# See https://github.com/intel/llvm/blob/sycl/sycl/doc/EnvironmentVariables.md
ENV SYCL_CACHE_PERSISTENT=1
ENV SYCL_PI_LEVEL_ZERO_SINGLE_THREAD_MODE=1

# Setting to turn on fortorch.compile to work for various kernels. Turn this off if you need to enable attention
# slicing to address the 4GB single allocation limit with Intel Xe GPUs that do not have XMX cores which include any iGPUs from Intel Ice Lake to Meteor Lake.
ENV BIGDL_LLM_XMX_DISABLED=1
# Linux only setting that speeds up compute workload submissions allowing them to run concurrently on a single hardware queue. Turned off by default since
# this was only introduced recently with the Xe graphics driver you need to turn on by default manually and development focus has been on using this feature
# with Data Center GPU Max Series. Only also seems to benefit LLMs mostly when Intel encourages turning it on on Intel Arc cards. Also need kernel 6.2 or up.
# See https://www.intel.com/content/www/us/en/developer/articles/guide/level-zero-immediate-command-lists.html
#ENV SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1
# Only use if something with Intel's low level libraries aren't working, see https://github.com/intel/xetla/tree/main for more details on what this affects.
#ENV USE_XETLA=OFF

# Set variable for better training performance in case.
# See https://github.com/intel/intel-extension-for-pytorch/issues/296#issuecomment-1461118993
ENV IPEX_XPU_ONEDNN_LAYOUT=1

# Set to false if CPU is to be used to launch ComfyUI. XPU is default.
ARG UseXPU=true
ENV UseXPU=${UseXPU}

# Set to true if ipexrun is to be used to launch ComfyUI. Off by default.
ARG UseIPEXRUN=true
ENV UseIPEXRUN=${UseIPEXRUN}

# Set to the arguments you want to pass to ipexrun.
# Example for CPU: --multi-task-manager 'taskset' --memory-allocator ${ALLOCATOR}
# Example for XPU: --convert-fp64-to-fp32
ARG IPEXRUNArgs="--convert-fp64-to-fp32"
ENV IPEXRUNArgs=${IPEXRUNArgs}

# Pass in ComfyUI arguments as an environment variable so it can be used in startup.sh which passes it on.
ARG ComfyArgs=""
ENV ComfyArgs=${ComfyArgs}

# Set location and entrypoint of the image to the ComfyUI directory and the startup script.
WORKDIR /ComfyUI
ENTRYPOINT [ "startup.sh" ]and lower and don't use torch.compile.
# See https://github.com/intel/compute-runtime/blob/master/opencl/doc/FAQ.md#feature-double-precision-emulation-fp64
ENV OverrideDefaultFP64Settings=1
ENV IGC_EnableDPEmulation=1

# Enable SYCL variables for cache reuse and single threaded mode.
# See https://github.com/intel/llvm/blob/sycl/sycl/doc/EnvironmentVariables.md
ENV SYCL_CACHE_PERSISTENT=1
ENV SYCL_PI_LEVEL_ZERO_SINGLE_THREAD_MODE=1

# Setting to turn on for Intel Xe GPUs that do not have XMX cores which include any iGPUs from Intel Ice Lake to Meteor Lake.
ENV BIGDL_LLM_XMX_DISABLED=1
# Linux only setting that speeds up compute workload submissions allowing them to run concurrently on a single hardware queue. Turned off by default since
# this was only introduced recently with the Xe graphics driver you need to turn on by default manually and development focus has been on using this feature
# with Data Center GPU Max Series. Only also seems to benefit LLMs mostly when Intel encourages turning it on on Intel Arc cards. Also need kernel 6.2 or up.
# See https://www.intel.com/content/www/us/en/developer/articles/guide/level-zero-immediate-command-lists.html
#ENV SYCL_PI_LEVEL_ZERO_USE_IMMEDIATE_COMMANDLISTS=1
# Only use if something with Intel's low level libraries aren't working, see https://github.com/intel/xetla/tree/main for more details on what this affects.
#ENV USE_XETLA=OFF

# Set variable for better training performance in case.
# See https://github.com/intel/intel-extension-for-pytorch/issues/296#issuecomment-1461118993
ENV IPEX_XPU_ONEDNN_LAYOUT=1

# Set to false if CPU is to be used to launch ComfyUI. XPU is default.
ARG UseXPU=true
ENV UseXPU=${UseXPU}

# Set to true if ipexrun is to be used to launch ComfyUI. Off by default.
ARG UseIPEXRUN=true
ENV UseIPEXRUN=${UseIPEXRUN}

# Set to the arguments you want to pass to ipexrun.
# Example for CPU: --multi-task-manager 'taskset' --memory-allocator ${ALLOCATOR}
# Example for XPU: --convert-fp64-to-fp32
ARG IPEXRUNArgs="--convert-fp64-to-fp32"
ENV IPEXRUNArgs=${IPEXRUNArgs}

# Pass in ComfyUI arguments as an environment variable so it can be used in startup.sh which passes it on.
ARG ComfyArgs=""
ENV ComfyArgs=${ComfyArgs}

# Set location and entrypoint of the image to the ComfyUI directory and the startup script.
WORKDIR /ComfyUI
ENTRYPOINT [ "startup.sh" ]


Code Block
titlestartup.sh
#!/bin/sh
CONTAINER_ALREADY_STARTED=/tmp/CONTAINER_ALREADY_STARTED_PLACEHOLDER
# Setup Python virtual environment if we don't see anything there as in a first launch run or if the repository does not exist.
if [ ! -e $CONTAINER_ALREADY_STARTED ]
then
    echo "First time launching container, setting things up."
    python3 -m venv "$VENVDir"
    # Clone repository if we have an empty space available.
    git rev-parse --git-dir > /dev/null 2>&1 || git clone https://github.com/comfyanonymous/ComfyUI.git .
    git config core.filemode false
    FirstLaunch=true
    # Make a file in /tmp/ to indicate the first launch step has been executed.
    touch "$CONTAINER_ALREADY_STARTED"
fi

# Activate the virtual environment to use for ComfyUI
if [ -f "$VENVDir"/bin/activate ]
then
    echo "Activating python venv."
    . "$VENVDir"/bin/activate
    . /opt/intel/oneapi/setvars.sh
else
    echo "Error: Cannot activate python venv. Check installation. Exiting immediately."
    exit 1
fi

# Install pip requirements if launching for the first time.
if [ "$FirstLaunch" = "true" ]
then
    echo "Installing ComfyUI Python dependencies."
        python -m pip install torch==2.3.1+cxx11.abi torchvision==0.18.1+cxx11.abi torchaudio==2.3.1+cxx11.abi intel-extension-for-pytorch==2.3.110+xpu oneccl_bind_pt==2.3.100+xpu --extra-index-url https://pytorch-extension.intel.com/release-whl/stable/xpu/us/
    pip install --pre pytorch-triton-xpu==3.1.0+91b14bf559  --index-url https://download.pytorch.org/whl/nightly/xpu
    pip install -r requirements.txt
fi

# Launch ComfyUI based on whether ipexrun is set to be used or not. Explicit string splitting is done by the shell here so shellcheck warning is ignored.
if [ "$UseIPEXRUN" = "true" ] && [ "$UseXPU" = "true" ]
then
    echo "Using ipexrun xpu to launch ComfyUI."
    # shellcheck disable=SC2086
    exec ipexrun xpu $IPEXRUNArgs main.py $ComfyArgs
elif [ "$UseIPEXRUN" = "true" ] && [ "$UseXPU" = "false" ]
then
    echo "Using ipexrun cpu to launch ComfyUI."
    # shellcheck disable=SC2086
    exec ipexrun $IPEXRUNArgs main.py $ComfyArgs
else
    echo "No command to use ipexrun to launch ComfyUI. Launching normally."
    # shellcheck disable=SC2086
    python3 main.py $ComfyArgs
fi


Not work yet.

Code Block

Using ipexrun xpu to launch ComfyUI.
/usr/bin/startup.sh: 41: exec: ipexrun: not found