From 1a1625406c57c2edb125bcecdcecf0f6dd904dea Mon Sep 17 00:00:00 2001 From: Matthias Wild <40327258+mauwii@users.noreply.github.com> Date: Mon, 12 Dec 2022 23:54:42 +0100 Subject: [PATCH] Make Dockerfile cloud ready (tested on runpod) (#1950) * Push dockerfile (#18) * update build-container.yml * add login step to build-container.yml * update job name * update matrix: add registry and platforms also set latest only for cuda image * quote string * use latest for amd and cuda image * separate images for cuda and amd * change latest from auto to true * configure_invoke -y instead of --interactive * fix argument to --yes * update matrix: - use flavor instead of pip-requirements - add flavor `cloud` - add `dockerfile` * introduce INVOKE_MODEL_RECONFIGURE * add `--cap-add=sys_nice` to run.sh * update Dockerfile: install wheel * only have main branch in action again * disable push of cloud image for now since it still has it's own workflow, but PoC succeeded * remove now untrue comments in top * install pip, setuptools and wheel in sep. step * add labels to the image * remove doubled installation of wheel --- .github/workflows/build-container.yml | 64 +++++++++++++++++++++------ docker-build/Dockerfile | 7 +++ docker-build/run.sh | 1 + ldm/invoke/CLI.py | 6 ++- 4 files changed, 63 insertions(+), 15 deletions(-) diff --git a/.github/workflows/build-container.yml b/.github/workflows/build-container.yml index 3b102d3397e..e559a250871 100644 --- a/.github/workflows/build-container.yml +++ b/.github/workflows/build-container.yml @@ -1,5 +1,3 @@ -# Building the Image without pushing to confirm it is still buildable -# confirum functionality would unfortunately need way more resources name: build container image on: push: @@ -11,28 +9,66 @@ jobs: strategy: fail-fast: false matrix: - pip-requirements: - - requirements-lin-amd.txt - - requirements-lin-cuda.txt + registry: + - ghcr.io + flavor: + - amd + - cuda + # - cloud + include: + - flavor: amd + pip-requirements: requirements-lin-amd.txt + dockerfile: docker-build/Dockerfile + platforms: linux/amd64,linux/arm64 + - flavor: cuda + pip-requirements: requirements-lin-cuda.txt + dockerfile: docker-build/Dockerfile + platforms: linux/amd64,linux/arm64 + # - flavor: cloud + # pip-requirements: requirements-lin-cuda.txt + # dockerfile: docker-build/Dockerfile.cloud + # platforms: linux/amd64 runs-on: ubuntu-latest - name: ${{ matrix.pip-requirements }} ${{ matrix.arch }} + name: ${{ matrix.flavor }} steps: - - name: prepare docker-tag - env: - repository: ${{ github.repository }} - run: echo "dockertag=${repository,,}" >> $GITHUB_ENV - name: Checkout uses: actions/checkout@v3 + - name: Set up QEMU uses: docker/setup-qemu-action@v2 + + - name: Docker meta + id: meta + uses: docker/metadata-action@v4 + with: + images: ${{ matrix.registry }}/${{ github.repository }}-${{ matrix.flavor }} + tags: | + type=ref,event=branch + type=ref,event=tag + type=semver,pattern={{version}} + type=semver,pattern={{major}}.{{minor}} + type=sha + flavor: | + latest=true + - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 + + - if: github.event_name != 'pull_request' + name: Docker login + uses: docker/login-action@v2 + with: + registry: ${{ matrix.registry }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Build container uses: docker/build-push-action@v3 with: context: . - file: docker-build/Dockerfile - platforms: linux/amd64,linux/arm64 - push: false - tags: ${{ env.dockertag }}:${{ matrix.pip-requirements }} + file: ${{ matrix.dockerfile }} + platforms: ${{ matrix.platforms }} + push: ${{ github.event_name != 'pull_request' }} + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} build-args: pip_requirements=${{ matrix.pip-requirements }} diff --git a/docker-build/Dockerfile b/docker-build/Dockerfile index 1550c612654..d85d65dd57a 100644 --- a/docker-build/Dockerfile +++ b/docker-build/Dockerfile @@ -22,6 +22,12 @@ COPY . ./environments-and-requirements/${PIP_REQUIREMENTS} ./ # install requirements RUN python3 -m venv .venv \ + && pip install \ + --upgrade \ + --no-cache-dir \ + 'pip>=22.3.1' \ + 'setuptools>=65.5.0' \ + 'wheel>=0.38.4' \ && pip install \ --no-cache-dir \ -r ${PIP_REQUIREMENTS} @@ -42,6 +48,7 @@ COPY --from=builder /usr/src/app . # set Environment, Entrypoint and default CMD ENV INVOKEAI_ROOT /data +ENV INVOKE_MODEL_RECONFIGURE --yes ENV PATH=/usr/src/app/.venv/bin:$PATH ENTRYPOINT [ "python3", "scripts/invoke.py" ] diff --git a/docker-build/run.sh b/docker-build/run.sh index 108708a01a9..14d2b1827d5 100755 --- a/docker-build/run.sh +++ b/docker-build/run.sh @@ -16,4 +16,5 @@ docker run \ --hostname="$project_name" \ --mount="source=$volumename,target=/data" \ --publish=9090:9090 \ + --cap-add=sys_nice \ "$invokeai_tag" ${1:+$@} diff --git a/ldm/invoke/CLI.py b/ldm/invoke/CLI.py index c6b081eb9c0..b5e32d7222d 100644 --- a/ldm/invoke/CLI.py +++ b/ldm/invoke/CLI.py @@ -941,7 +941,11 @@ def emergency_model_reconfigure(): print('!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!') print('configure_invokeai is launching....\n') - sys.argv = ['configure_invokeai','--interactive'] + sys.argv = [ + 'configure_invokeai', + os.environ.get( + 'INVOKE_MODEL_RECONFIGURE', + '--interactive')] import configure_invokeai configure_invokeai.main()