Split requirements / pyproject installation in Dockerfile (#2815)

This should make caching way easier and therefore speed up the image
(re-)creation a lot.

Other small improvements:
- reorder .dockerignore
- rename amd flavor to rocm to align with cuda flavor
- use `user:group` for definitions
- add `--platform=${TARGETPLATFORM}` to base
This commit is contained in:
Lincoln Stein 2023-02-26 13:48:32 -05:00 committed by GitHub
commit 835eb14c79
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 43 additions and 34 deletions

View File

@ -4,10 +4,6 @@
!ldm !ldm
!pyproject.toml !pyproject.toml
# Guard against pulling in any models that might exist in the directory tree
**/*.pt*
**/*.ckpt
# ignore frontend but whitelist dist # ignore frontend but whitelist dist
invokeai/frontend/ invokeai/frontend/
!invokeai/frontend/dist/ !invokeai/frontend/dist/
@ -16,10 +12,14 @@ invokeai/frontend/
invokeai/assets/ invokeai/assets/
!invokeai/assets/web/ !invokeai/assets/web/
# Guard against pulling in any models that might exist in the directory tree
**/*.pt*
**/*.ckpt
# Byte-compiled / optimized / DLL files # Byte-compiled / optimized / DLL files
**/__pycache__/ **/__pycache__/
**/*.py[cod] **/*.py[cod]
# Distribution / packaging # Distribution / packaging
*.egg-info/ **/*.egg-info/
*.egg **/*.egg

View File

@ -5,6 +5,8 @@ on:
- 'main' - 'main'
- 'update/ci/docker/*' - 'update/ci/docker/*'
- 'update/docker/*' - 'update/docker/*'
- 'dev/ci/docker/*'
- 'dev/docker/*'
paths: paths:
- 'pyproject.toml' - 'pyproject.toml'
- 'ldm/**' - 'ldm/**'
@ -24,11 +26,11 @@ jobs:
fail-fast: false fail-fast: false
matrix: matrix:
flavor: flavor:
- amd - rocm
- cuda - cuda
- cpu - cpu
include: include:
- flavor: amd - flavor: rocm
pip-extra-index-url: 'https://download.pytorch.org/whl/rocm5.2' pip-extra-index-url: 'https://download.pytorch.org/whl/rocm5.2'
- flavor: cuda - flavor: cuda
pip-extra-index-url: '' pip-extra-index-url: ''

View File

@ -4,15 +4,15 @@ ARG PYTHON_VERSION=3.9
################## ##################
## base image ## ## base image ##
################## ##################
FROM python:${PYTHON_VERSION}-slim AS python-base FROM --platform=${TARGETPLATFORM} python:${PYTHON_VERSION}-slim AS python-base
LABEL org.opencontainers.image.authors="mauwii@outlook.de" LABEL org.opencontainers.image.authors="mauwii@outlook.de"
# prepare for buildkit cache # Prepare apt for buildkit cache
RUN rm -f /etc/apt/apt.conf.d/docker-clean \ RUN rm -f /etc/apt/apt.conf.d/docker-clean \
&& echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' >/etc/apt/apt.conf.d/keep-cache && echo 'Binary::apt::APT::Keep-Downloaded-Packages "true";' >/etc/apt/apt.conf.d/keep-cache
# Install necessary packages # Install dependencies
RUN \ RUN \
--mount=type=cache,target=/var/cache/apt,sharing=locked \ --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \ --mount=type=cache,target=/var/lib/apt,sharing=locked \
@ -23,7 +23,7 @@ RUN \
libglib2.0-0=2.66.* \ libglib2.0-0=2.66.* \
libopencv-dev=4.5.* libopencv-dev=4.5.*
# set working directory and env # Set working directory and env
ARG APPDIR=/usr/src ARG APPDIR=/usr/src
ARG APPNAME=InvokeAI ARG APPNAME=InvokeAI
WORKDIR ${APPDIR} WORKDIR ${APPDIR}
@ -32,7 +32,7 @@ ENV PATH ${APPDIR}/${APPNAME}/bin:$PATH
ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONDONTWRITEBYTECODE 1
# Turns off buffering for easier container logging # Turns off buffering for easier container logging
ENV PYTHONUNBUFFERED 1 ENV PYTHONUNBUFFERED 1
# don't fall back to legacy build system # Don't fall back to legacy build system
ENV PIP_USE_PEP517=1 ENV PIP_USE_PEP517=1
####################### #######################
@ -40,7 +40,7 @@ ENV PIP_USE_PEP517=1
####################### #######################
FROM python-base AS pyproject-builder FROM python-base AS pyproject-builder
# Install dependencies # Install build dependencies
RUN \ RUN \
--mount=type=cache,target=/var/cache/apt,sharing=locked \ --mount=type=cache,target=/var/cache/apt,sharing=locked \
--mount=type=cache,target=/var/lib/apt,sharing=locked \ --mount=type=cache,target=/var/lib/apt,sharing=locked \
@ -51,26 +51,30 @@ RUN \
gcc=4:10.2.* \ gcc=4:10.2.* \
python3-dev=3.9.* python3-dev=3.9.*
# prepare pip for buildkit cache # Prepare pip for buildkit cache
ARG PIP_CACHE_DIR=/var/cache/buildkit/pip ARG PIP_CACHE_DIR=/var/cache/buildkit/pip
ENV PIP_CACHE_DIR ${PIP_CACHE_DIR} ENV PIP_CACHE_DIR ${PIP_CACHE_DIR}
RUN mkdir -p ${PIP_CACHE_DIR} RUN mkdir -p ${PIP_CACHE_DIR}
# create virtual environment # Create virtual environment
RUN --mount=type=cache,target=${PIP_CACHE_DIR},sharing=locked \ RUN --mount=type=cache,target=${PIP_CACHE_DIR} \
python3 -m venv "${APPNAME}" \ python3 -m venv "${APPNAME}" \
--upgrade-deps --upgrade-deps
# copy sources # Install requirements
COPY --link . . COPY --link pyproject.toml .
COPY --link ldm/invoke/_version.py ldm/invoke/__init__.py ldm/invoke/
# install pyproject.toml
ARG PIP_EXTRA_INDEX_URL ARG PIP_EXTRA_INDEX_URL
ENV PIP_EXTRA_INDEX_URL ${PIP_EXTRA_INDEX_URL} ENV PIP_EXTRA_INDEX_URL ${PIP_EXTRA_INDEX_URL}
RUN --mount=type=cache,target=${PIP_CACHE_DIR},sharing=locked \ RUN --mount=type=cache,target=${PIP_CACHE_DIR} \
"${APPNAME}"/bin/pip install .
# Install pyproject.toml
COPY --link . .
RUN --mount=type=cache,target=${PIP_CACHE_DIR} \
"${APPNAME}/bin/pip" install . "${APPNAME}/bin/pip" install .
# build patchmatch # Build patchmatch
RUN python3 -c "from patchmatch import patch_match" RUN python3 -c "from patchmatch import patch_match"
##################### #####################
@ -86,14 +90,14 @@ RUN useradd \
-U \ -U \
"${UNAME}" "${UNAME}"
# create volume directory # Create volume directory
ARG VOLUME_DIR=/data ARG VOLUME_DIR=/data
RUN mkdir -p "${VOLUME_DIR}" \ RUN mkdir -p "${VOLUME_DIR}" \
&& chown -R "${UNAME}" "${VOLUME_DIR}" && chown -hR "${UNAME}:${UNAME}" "${VOLUME_DIR}"
# setup runtime environment # Setup runtime environment
USER ${UNAME} USER ${UNAME}:${UNAME}
COPY --chown=${UNAME} --from=pyproject-builder ${APPDIR}/${APPNAME} ${APPNAME} COPY --chown=${UNAME}:${UNAME} --from=pyproject-builder ${APPDIR}/${APPNAME} ${APPNAME}
ENV INVOKEAI_ROOT ${VOLUME_DIR} ENV INVOKEAI_ROOT ${VOLUME_DIR}
ENV TRANSFORMERS_CACHE ${VOLUME_DIR}/.cache ENV TRANSFORMERS_CACHE ${VOLUME_DIR}/.cache
ENV INVOKE_MODEL_RECONFIGURE "--yes --default_only" ENV INVOKE_MODEL_RECONFIGURE "--yes --default_only"

View File

@ -41,7 +41,7 @@ else
fi fi
# Build Container # Build Container
DOCKER_BUILDKIT=1 docker build \ docker build \
--platform="${PLATFORM:-linux/amd64}" \ --platform="${PLATFORM:-linux/amd64}" \
--tag="${CONTAINER_IMAGE:-invokeai}" \ --tag="${CONTAINER_IMAGE:-invokeai}" \
${CONTAINER_FLAVOR:+--build-arg="CONTAINER_FLAVOR=${CONTAINER_FLAVOR}"} \ ${CONTAINER_FLAVOR:+--build-arg="CONTAINER_FLAVOR=${CONTAINER_FLAVOR}"} \

View File

@ -49,3 +49,6 @@ CONTAINER_FLAVOR="${CONTAINER_FLAVOR-cuda}"
CONTAINER_TAG="${CONTAINER_TAG-"${INVOKEAI_BRANCH##*/}-${CONTAINER_FLAVOR}"}" CONTAINER_TAG="${CONTAINER_TAG-"${INVOKEAI_BRANCH##*/}-${CONTAINER_FLAVOR}"}"
CONTAINER_IMAGE="${CONTAINER_REGISTRY}/${CONTAINER_REPOSITORY}:${CONTAINER_TAG}" CONTAINER_IMAGE="${CONTAINER_REGISTRY}/${CONTAINER_REPOSITORY}:${CONTAINER_TAG}"
CONTAINER_IMAGE="${CONTAINER_IMAGE,,}" CONTAINER_IMAGE="${CONTAINER_IMAGE,,}"
# enable docker buildkit
export DOCKER_BUILDKIT=1

View File

@ -21,10 +21,10 @@ docker run \
--tty \ --tty \
--rm \ --rm \
--platform="${PLATFORM}" \ --platform="${PLATFORM}" \
--name="${REPOSITORY_NAME,,}" \ --name="${REPOSITORY_NAME}" \
--hostname="${REPOSITORY_NAME,,}" \ --hostname="${REPOSITORY_NAME}" \
--mount=source="${VOLUMENAME}",target=/data \ --mount type=volume,volume-driver=local,source="${VOLUMENAME}",target=/data \
--mount type=bind,source="$(pwd)"/outputs,target=/data/outputs \ --mount type=bind,source="$(pwd)"/outputs/,target=/data/outputs/ \
${MODELSPATH:+--mount="type=bind,source=${MODELSPATH},target=/data/models"} \ ${MODELSPATH:+--mount="type=bind,source=${MODELSPATH},target=/data/models"} \
${HUGGING_FACE_HUB_TOKEN:+--env="HUGGING_FACE_HUB_TOKEN=${HUGGING_FACE_HUB_TOKEN}"} \ ${HUGGING_FACE_HUB_TOKEN:+--env="HUGGING_FACE_HUB_TOKEN=${HUGGING_FACE_HUB_TOKEN}"} \
--publish=9090:9090 \ --publish=9090:9090 \
@ -32,7 +32,7 @@ docker run \
${GPU_FLAGS:+--gpus="${GPU_FLAGS}"} \ ${GPU_FLAGS:+--gpus="${GPU_FLAGS}"} \
"${CONTAINER_IMAGE}" ${@:+$@} "${CONTAINER_IMAGE}" ${@:+$@}
# Remove Trash folder echo -e "\nCleaning trash folder ..."
for f in outputs/.Trash*; do for f in outputs/.Trash*; do
if [ -e "$f" ]; then if [ -e "$f" ]; then
rm -Rf "$f" rm -Rf "$f"