From f7d5d35e3f7359f5500bb6283ed316ddb5ea135f Mon Sep 17 00:00:00 2001 From: Peter Pan Date: Sun, 22 Dec 2024 01:03:22 -0500 Subject: [PATCH] update Dockerfile according to comments and move to separated folder Co-authored-by: Lukas Signed-off-by: Peter Pan --- .dockerignore | 9 ++++-- README.md | 29 ++++++++++++++++++- Dockerfile => docker/Dockerfile | 6 ++-- compose.yml => docker/compose.yml | 4 +-- docker/k8s-sd-webui.yaml | 48 +++++++++++++++++++++++++++++++ launch.py | 6 +--- modules/cmd_args.py | 1 - webui-user.sh | 2 +- 8 files changed, 90 insertions(+), 15 deletions(-) rename Dockerfile => docker/Dockerfile (69%) rename compose.yml => docker/compose.yml (84%) create mode 100644 docker/k8s-sd-webui.yaml diff --git a/.dockerignore b/.dockerignore index f456d7997c5..d8991c18ee7 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,2 +1,7 @@ -models -models/ \ No newline at end of file +.venv +.che__/ +*.log +*.git +*.gitignoreivenv +docker +models/* diff --git a/README.md b/README.md index f9beae23af6..2c44fc7008e 100644 --- a/README.md +++ b/README.md @@ -106,14 +106,41 @@ Alternatively, use online services (like Google Colab): ### Running with Docker +#### a) Run with Docker Compose DISCLAIMER: This currently only works with NVIDIA GPUs -You need to have [Docker](https://www.docker.com/) installed on your system. Then clone this repository and execute `docker compose up` in the root of the repository. The first time you execute this command will take a long time as all the dependencies are installed. Subsequent runs of the command should start up the webui pretty much instantly. To stop the webui press CTRL+C and wait a few seconds. +You need to have [Docker](https://www.docker.com/) installed on your system. Then clone this repository and execute `docker compose -f docker/compose.yml up` in the root path of the repository. The first time you execute this command will take a long time as all the dependencies are installed. Subsequent runs of the command should start up the webui pretty much instantly. To stop the webui press CTRL+C and wait a few seconds. Models are provided to the Docker container using a bind mount. This means that if you add a new model to the models directory it should be available in the webui after a checkpoint refresh without needing to rebuild or restart the container. The server will be accessible at [localhost:7860](localhost:7860) +#### b) Run with docker CLI +``` +git clone https://github.com/AUTOMATIC1111/stable-diffusion-webui +cd stable-diffusion-webui +export TAG=v1.10.0 +docker build -t stable-diffusion-webui:${TAG} -f docker/Dockerfile . +docker run --gpus all -d -p 7860:7860 stable-diffusion-webui:${TAG} +# If you have already downloaded the model weight locally, you can mount it into container (add `-v $(your-local-model-path)/models/:/webui/models` to above `docker run` command before image name.) +``` + +#### c) Run on Kubernetes + +Prerequisite: + + - You already have a Kubernetes Cluster in place and kube.conf in your machine. + - build the docker images as above step (b), and load it to your K8S cluster. + - Modify the `YOUR-IMAGE-NAME` and `YOUR-LOCAL-PATH` in `docker/k8s-sd-webui.yaml` + +``` +kubectl apply -f docker/k8s-sd-webui.yaml # Create k8s workload and nodeport service +kubectl get po -l app=stable-diffusion-webui # list the container +#kubectl wait --for=condition=available endpoints/stable-diffusion-webui-service # wait for pod ready, you can CTRL+C to skip it +``` + +To debug, you can check logs from `kubectl logs -f deploy/stable-diffusion-webui` + ### Installation on Windows 10/11 with NVidia-GPUs using release package 1. Download `sd.webui.zip` from [v1.0.0-pre](https://github.com/AUTOMATIC1111/stable-diffusion-webui/releases/tag/v1.0.0-pre) and extract its contents. 2. Run `update.bat`. diff --git a/Dockerfile b/docker/Dockerfile similarity index 69% rename from Dockerfile rename to docker/Dockerfile index 86fd6d62fc2..fb5431f08f5 100644 --- a/Dockerfile +++ b/docker/Dockerfile @@ -1,4 +1,4 @@ -FROM python:3.10-bookworm +FROM python:3.10 WORKDIR /webui @@ -14,6 +14,6 @@ RUN groupadd --system --gid 1000 webui && \ chown -R webui:webui . USER 1000:1000 -RUN ./webui.sh --prepare-environment-only --skip-torch-cuda-test +RUN ./webui.sh --exit --skip-torch-cuda-test -CMD [ "./webui.sh", "--skip-prepare-environment" ] +CMD [ "./webui.sh", "--skip-prepare-environment", "--listen" ] diff --git a/compose.yml b/docker/compose.yml similarity index 84% rename from compose.yml rename to docker/compose.yml index 2088e357cd7..6b2b516a9a3 100644 --- a/compose.yml +++ b/docker/compose.yml @@ -1,6 +1,6 @@ services: webui: - build: . + build: ../ volumes: - type: bind source: ./models @@ -13,4 +13,4 @@ services: devices: - driver: nvidia count: all - capabilities: [gpu] \ No newline at end of file + capabilities: [gpu] diff --git a/docker/k8s-sd-webui.yaml b/docker/k8s-sd-webui.yaml new file mode 100644 index 00000000000..e07dcff98c2 --- /dev/null +++ b/docker/k8s-sd-webui.yaml @@ -0,0 +1,48 @@ +apiVersion: apps/v1 +kind: Deployment +metadata: + name: stable-diffusion-webui +spec: + replicas: 1 + selector: + matchLabels: + app: stable-diffusion-webui + template: + metadata: + labels: + app: stable-diffusion-webui + spec: + containers: + - name: stable-diffusion-webui + image: $(YOUR-IMAGE-NAME) # the image name specified when doing `docker build` + ports: + - containerPort: 7860 + volumeMounts: + - mountPath: /webui/models + name: models-volume + resources: + limits: + nvidia.com/gpu: 1 # Adjust according to your needs + readinessProbe: + httpGet: + path: / + port: 7860 + initialDelaySeconds: 120 + periodSeconds: 30 + volumes: + - name: models-volume + hostPath: + path: $(YOUR-LOCAL-PATH)/models # absolute pre-download model path on the host machine + +--- +apiVersion: v1 +kind: Service +metadata: + name: stable-diffusion-webui-service +spec: + type: NodePort # You can change this to LoadBalancer if needed + ports: + - port: 7860 + targetPort: 7860 + selector: + app: stable-diffusion-webui diff --git a/launch.py b/launch.py index d0565cb9829..f83820d2534 100644 --- a/launch.py +++ b/launch.py @@ -34,9 +34,6 @@ def main(): launch_utils.startup_timer.record("initial startup") - if args.prepare_environment_only: - print("Setting up requirements wihout starting server as --setup-only flag was passed") - with launch_utils.startup_timer.subcategory("prepare environment"): if not args.skip_prepare_environment: prepare_environment() @@ -44,8 +41,7 @@ def main(): if args.test_server: configure_for_tests() - if not args.prepare_environment_only: - start() + start() if __name__ == "__main__": diff --git a/modules/cmd_args.py b/modules/cmd_args.py index ad05231d4df..d71982b2c12 100644 --- a/modules/cmd_args.py +++ b/modules/cmd_args.py @@ -126,4 +126,3 @@ parser.add_argument("--unix-filenames-sanitization", action='store_true', help="allow any symbols except '/' in filenames. May conflict with your browser and file system") parser.add_argument("--filenames-max-length", type=int, default=128, help='maximal length of filenames of saved images. If you override it, it can conflict with your file system') parser.add_argument("--no-prompt-history", action='store_true', help="disable read prompt from last generation feature; settings this argument will not create '--data_path/params.txt' file") -parser.add_argument("--prepare-environment-only", action='store_true', help="launch.py argument: only prepare environment without launching webui run with --skip-torch-cuda-test") diff --git a/webui-user.sh b/webui-user.sh index 3db30fcba27..70306c60d5b 100644 --- a/webui-user.sh +++ b/webui-user.sh @@ -10,7 +10,7 @@ #clone_dir="stable-diffusion-webui" # Commandline arguments for webui.py, for example: export COMMANDLINE_ARGS="--medvram --opt-split-attention" -export COMMANDLINE_ARGS="--listen" +#export COMMANDLINE_ARGS="" # python3 executable #python_cmd="python3"