From 385b5629b63f347c6f06866d0e9184fb34cd5ee7 Mon Sep 17 00:00:00 2001 From: ekoc Date: Wed, 26 Feb 2025 21:21:53 +0100 Subject: [PATCH] Improvements to the docker build + update readme --- .github/actions/docker-setup/action.yml | 3 + .github/workflows/publish-docker-v2.yml | 2 +- DOCKER_README.md | 92 ++++++++++++++----------- Dockerfile | 4 +- docker-build.sh | 16 +++-- docker-start.sh | 11 ++- docker/base/build-base-env.sh | 11 +-- docker/deepspeed/Dockerfile | 4 +- docker/deepspeed/build-deepspeed.sh | 13 ++-- docker/variables.sh | 1 - 10 files changed, 91 insertions(+), 66 deletions(-) diff --git a/.github/actions/docker-setup/action.yml b/.github/actions/docker-setup/action.yml index 0209f41..774e016 100644 --- a/.github/actions/docker-setup/action.yml +++ b/.github/actions/docker-setup/action.yml @@ -2,10 +2,13 @@ name: 'Setting up docker' inputs: DOCKERHUB_USERNAME: + description: "Docker hub username" required: true DOCKERHUB_REPO_NAME: + description: "Docker hub repo name" required: true DOCKERHUB_TOKEN: + description: "Docker hub token" required: true runs: diff --git a/.github/workflows/publish-docker-v2.yml b/.github/workflows/publish-docker-v2.yml index 1f30fba..6e8a380 100644 --- a/.github/workflows/publish-docker-v2.yml +++ b/.github/workflows/publish-docker-v2.yml @@ -116,7 +116,7 @@ jobs: ALLTALK_DIR=${{ env.ALLTALK_DIR }} DEEPSPEED_VERSION=${{ env.DEEPSPEED_VERSION }} DOCKER_TAG=${{ env.DOCKER_TAG }} - GITHUB_REPOSITORY=${{ env.DOCKERHUB_USERNAME }}/ + DOCKER_REPOSITORY=${{ env.DOCKERHUB_USERNAME }}/ tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} cache-from: type=registry,ref=${{ env.DOCKERHUB_USERNAME }}/${{ env.DOCKERHUB_REPO_NAME }}:buildcache-${{ matrix.tts }} diff --git a/DOCKER_README.md b/DOCKER_README.md index 0021ab7..2070171 100644 --- a/DOCKER_README.md +++ b/DOCKER_README.md @@ -1,21 +1,19 @@ # Docker -The Docker image currently works on Windows and Linux, optionally supporting NVIDIA GPUs. +The Docker image currently works on Windows and Linux supporting NVIDIA GPUs. -## General Remarks -- The resulting Docker image is 21 GB in size. Building might require even more disk space temporarily. - - Another 15 GB is required for building DeepSpeed -- Build time depends on your hardware and internet connection. Expect at least 20-30min to be normal for a full build. - - This includes building the conda environment as well as DeepSpeed, which is the basis for the alltalk Docker image. -- The Docker build for alltalk: - - Downloads XTTS as default TTS engine - - Enables RVC by default - - Downloads all supported RVC models - - Enables deepspeed by default -- Starting the Docker image should only a few seconds due to all the steps that were already executed during build. +## System requirements +- AMD compatible Windows or Linux system +- CUDA 12.6 +- Nvidia Docker Container Toolkit +- At least 25GB of free disk space -## Docker for Linux +## Quickstart +Use `docker-start.sh` to pull the latest docker image using the XTTS model from Docker Hub and +visit `http://localhost:7851/`. See instructions below for passing more arguments to the start script. -### Ubuntu Specific Setup for GPUs +## Installing Prerequisites +### Docker for Linux +#### Ubuntu Specific Setup for GPUs 1. Make sure the latest nvidia drivers are installed: `sudo ubuntu-drivers install` 1. Install Docker your preferred way. One way to do it is to follow the official documentation [here](https://docs.docker.com/engine/install/ubuntu/#uninstall-old-versions). - Start by uninstalling the old versions @@ -27,8 +25,8 @@ The Docker image currently works on Windows and Linux, optionally supporting NVI ```sudo nvidia-ctk runtime configure --runtime=docker``` - Restart docker -## Docker for Windows (WSL2) -### Windows Specific Setup for GPUs +### Docker for Windows (WSL2) +#### Windows Specific Setup for GPUs > Make sure your Nvidia drivers are up to date: https://www.nvidia.com/download/index.aspx 1. Install WSL2 in PowerShell with `wsl --install` and restart 2. Open PowerShell, type and enter ```ubuntu```. It should now load you into wsl2 @@ -40,39 +38,49 @@ The Docker image currently works on Windows and Linux, optionally supporting NVI 8. Install Docker Desktop using WSL2 as the backend 9. Restart 10. If you wish to monitor the terminal remotely via SSH, follow [this guide](https://www.hanselman.com/blog/how-to-ssh-into-wsl2-on-windows-10-from-an-external-machine). -11. Open PowerShell, type ```ubuntu```, [then follow below](#building-and-running-in-docker) +11. Open PowerShell, type ```ubuntu```, [then follow below](#quickstart) -## Building and Running in Docker +## Arguments for starting the Docker container +To make it as simple as possible to use Docker, the script `docker-start.sh` can be used. It provides the +following optional arguments: -1. Open a terminal (or Ubuntu WSL) and go where you cloned the repo -3. Build the image with `./docker-build.sh` -4. Start the container with `./docker-start.sh` -5. Visit `http://localhost:7851/` or remotely with `http://:7851` - -## Arguments for building and starting docker -There are various arguments to customize the build and start of the docker image. - -### Arguments for `docker-build.sh` -- `--tts_model` allows to choose the TTS model that is used by default. Valid values are `piper`, `vits`, `xtts`. Defaults to `xtts`. - - Example: `docker-build.sh --tts_model piper` -- `--tag` allows to choose the docker tag. Defaults to `latest`. - - Example: `docker-build.sh --tag mytag` -- `--clean` allows remove existing dependency build like conda environment or DeepSpeed. - - Example: `docker-build.sh --clean` - -### Arguments for `docker-start.sh` -- `--config` lets you choose a config JSON file which can subset of `confignew.json`. This allows you to change only +- `--config` lets you choose a config JSON file which can subset of `confignew.json`. This allows you to change only few values and leave the rest as defined in the default `confignew.json` file. - - Example: `docker-start.sh --config /my/config/file.json` with content `{"branding": "My Brand "}` will just change - the branding in `confignew.json`. + - Example: `docker-start.sh --config /my/config/file.json` with content `{"branding": "My Brand "}` will just change + the branding in `confignew.json`. - `--voices` lets you add voices for the TTS engine in WAV format. You have to specify the folder containing all voice files. - - Example: `docker-start.sh --voices /my/voices/dir` + - Example: `docker-start.sh --voices /my/voices/dir` - `--rvc_voices` similar to voices, this option lets you pick the folder containing the RVC models. - - Example: `docker-start.sh --rvc_voices /my/rvc/voices/dir` + - Example: `docker-start.sh --rvc_voices /my/rvc/voices/dir` - `--no_ui` allows you to not expose port 7852 for the gradio interface. Note that you still have to set `launch_gradio` to `false` via JSON file passed to `--config`. - `--tag` allows to choose the docker tag of the image to run. Defaults to `latest`. - Example: `docker-start.sh --tag mytag` -- Since the above commands only address the most important options, you might pass additional arbitrary docker commands - to the `docker-start.sh`. +- `--docker-repository` allows to choose another Docker repository for pulling the image from. Use an empty + string for the local repo. +- Since the above commands only address the most important options, you might pass additional arbitrary docker arguments + to the `docker-start.sh`. + +Of course, like any other Docker image, you can also directly use `docker run` directly and use `docker-start.sh` +as an inspiration. + + +## Building your own images (advanced) +> Be aware that building the images requires good hardware and bandwidth. Expect this process to require > +> 40 GB of disk space and > 30min execution time depending on your hardware. + +Under normal circumstances, there should be no need to build the Docker images locally. However, if needed for some +reason, you may want to use `docker-build.sh` with the following arguments: + +- `--tts_model` allows to choose the TTS model that is used by default. Valid values are `piper`, `vits`, `xtts`. Defaults to `xtts`. + - Example: `docker-build.sh --tts_model piper` +- `--tag` allows to choose the docker tag. Defaults to `latest-xtts`. + - Example: `docker-build.sh --tag mytag` +- `--docker-repository` allows to choose another Docker repository for tagging the image from. Use an empty + string for the local repo. +- `--local-deepspeed-build` should only be used in rare cases where DeepSpeed needs to be rebuilt. Defaults to `false`. +- `--clean` allows remove existing dependency build like conda environment or DeepSpeed. + - Example: `docker-build.sh --clean` + + diff --git a/Dockerfile b/Dockerfile index aaf5067..11b8c7f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ -ARG GITHUB_REPOSITORY +ARG DOCKER_REPOSITORY ARG DOCKER_TAG=latest -FROM ${GITHUB_REPOSITORY}alltalk_tts_environment:${DOCKER_TAG} +FROM ${DOCKER_REPOSITORY}alltalk_tts_environment:${DOCKER_TAG} # Argument to choose the model: piper, vits, xtts ARG TTS_MODEL="xtts" diff --git a/docker-build.sh b/docker-build.sh index ffcd67b..36a46f9 100755 --- a/docker-build.sh +++ b/docker-build.sh @@ -6,9 +6,10 @@ cd $SCRIPT_DIR . ${SCRIPT_DIR=}/docker/variables.sh TTS_MODEL=xtts -DOCKER_TAG=latest +DOCKER_TAG=latest-${TTS_MODEL} CLEAN=false LOCAL_DEEPSPEED_BUILD=false +DOCKER_REPOSITORY=erew123 # Create required build directories if they don't exist mkdir -p ${SCRIPT_DIR=}/docker/deepspeed/build @@ -37,10 +38,12 @@ while [ "$#" -gt 0 ]; do DOCKER_TAG="$2" shift ;; - --github-repository) + --docker-repository) if [ -n "$2" ] && ! [[ $2 =~ ^--.* ]]; then - GITHUB_REPOSITORY="$2" + DOCKER_REPOSITORY="$2" shift + else + DOCKER_REPOSITORY="" fi ;; --local-deepspeed-build) @@ -68,7 +71,7 @@ echo "Building base environment image" $SCRIPT_DIR/docker/base/build-base-env.sh \ --cuda-version ${CUDA_VERSION} \ --python-version ${PYTHON_VERSION} \ - --github-repository ${GITHUB_REPOSITORY} \ + --docker-repository ${DOCKER_REPOSITORY} \ --tag ${DOCKER_TAG} if [ $? -ne 0 ]; then @@ -80,7 +83,7 @@ if [ "$LOCAL_DEEPSPEED_BUILD" = true ]; then echo "Building DeepSpeed" $SCRIPT_DIR/docker/deepspeed/build-deepspeed.sh \ --python-version ${PYTHON_VERSION} \ - --github-repository ${GITHUB_REPOSITORY} \ + --docker-repository ${DOCKER_REPOSITORY} \ --tag ${DOCKER_TAG} if [ $? -ne 0 ]; then @@ -99,7 +102,8 @@ docker buildx \ --build-arg ALLTALK_DIR=$ALLTALK_DIR \ --build-arg DEEPSPEED_VERSION=$DEEPSPEED_VERSION \ --build-arg DOCKER_TAG=$DOCKER_TAG \ - -t ${GITHUB_REPOSITORY}alltalk_tts:${DOCKER_TAG} \ + --build-arg DOCKER_REPOSITORY=$DOCKER_REPOSITORY \ + -t ${DOCKER_REPOSITORY}alltalk_tts:${DOCKER_TAG} \ . echo "Docker build process finished. Use docker-start.sh to start the container." diff --git a/docker-start.sh b/docker-start.sh index e2b5539..e1f7d35 100755 --- a/docker-start.sh +++ b/docker-start.sh @@ -5,6 +5,7 @@ SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) WITH_UI=true DOCKER_TAG=latest +DOCKER_REPOSITORY=erew123 declare -a ADDITIONAL_ARGS=() # Parse arguments @@ -29,10 +30,12 @@ while [ "$#" -gt 0 ]; do DOCKER_TAG="$2" shift ;; - --github-repository) + --docker-repository) if [ -n "$2" ] && ! [[ $2 =~ ^--.* ]]; then - GITHUB_REPOSITORY="$2" + DOCKER_REPOSITORY="$2" shift + else + DOCKER_REPOSITORY="" fi ;; *) @@ -45,6 +48,8 @@ done # Compose docker arguments based on user input to the script: declare -a DOCKER_ARGS=() +echo "REPO = $DOCKER_REPOSITORY" +exit 0 if [[ -n $CONFIG ]]; then # Mount the config file to docker_confignew.json: @@ -71,4 +76,4 @@ docker run \ --name alltalk \ "${DOCKER_ARGS[@]}" \ "${ADDITIONAL_ARGS[@]}" \ - ${GITHUB_REPOSITORY}alltalk_tts:${DOCKER_TAG} &> /dev/stdout \ No newline at end of file + ${DOCKER_REPOSITORY}alltalk_tts:${DOCKER_TAG} &> /dev/stdout \ No newline at end of file diff --git a/docker/base/build-base-env.sh b/docker/base/build-base-env.sh index 8e053e2..25e3ede 100755 --- a/docker/base/build-base-env.sh +++ b/docker/base/build-base-env.sh @@ -6,6 +6,7 @@ cd $SCRIPT_DIR . ${SCRIPT_DIR=}/../variables.sh DOCKER_TAG=latest +DOCKER_REPOSITORY=erew123 # Parse arguments while [ "$#" -gt 0 ]; do @@ -22,10 +23,12 @@ while [ "$#" -gt 0 ]; do DOCKER_TAG="$2" shift ;; - --github-repository) - if [ -n "${GITHUB_REPOSITORY}" ] && ! [[ $GITHUB_REPOSITORY =~ ^--.* ]]; then - GITHUB_REPOSITORY="$2" + --docker-repository) + if [ -n "$2" ] && ! [[ $2 =~ ^--.* ]]; then + DOCKER_REPOSITORY="$2" shift + else + DOCKER_REPOSITORY="" fi ;; *) @@ -43,5 +46,5 @@ docker buildx \ --progress=plain \ --build-arg CUDA_VERSION=$CUDA_VERSION \ --build-arg PYTHON_VERSION=$PYTHON_VERSION \ - -t ${GITHUB_REPOSITORY}alltalk_tts_environment:${DOCKER_TAG} \ + -t ${DOCKER_REPOSITORY}alltalk_tts_environment:${DOCKER_TAG} \ . \ No newline at end of file diff --git a/docker/deepspeed/Dockerfile b/docker/deepspeed/Dockerfile index cdc5fa5..eb1fb75 100644 --- a/docker/deepspeed/Dockerfile +++ b/docker/deepspeed/Dockerfile @@ -1,6 +1,6 @@ -ARG GITHUB_REPOSITORY +ARG DOCKER_REPOSITORY ARG DOCKER_TAG=latest -FROM ${GITHUB_REPOSITORY}alltalk_tts_environment:${DOCKER_TAG} +FROM ${DOCKER_REPOSITORY}alltalk_tts_environment:${DOCKER_TAG} ARG DEEPSPEED_VERSION=0.16.3 ENV DEEPSPEED_VERSION=$DEEPSPEED_VERSION diff --git a/docker/deepspeed/build-deepspeed.sh b/docker/deepspeed/build-deepspeed.sh index fe7fc9a..1d133ac 100755 --- a/docker/deepspeed/build-deepspeed.sh +++ b/docker/deepspeed/build-deepspeed.sh @@ -6,6 +6,7 @@ cd $SCRIPT_DIR . ${SCRIPT_DIR=}/../variables.sh DOCKER_TAG=latest +DOCKER_REPOSITORY=erew123 # Parse arguments while [ "$#" -gt 0 ]; do @@ -23,9 +24,11 @@ while [ "$#" -gt 0 ]; do shift ;; --github-repository) - if [ -n "${GITHUB_REPOSITORY}" ] && ! [[ $GITHUB_REPOSITORY =~ ^--.* ]]; then - GITHUB_REPOSITORY="$2" + if [ -n "$2" ] && ! [[ $2 =~ ^--.* ]]; then + DOCKER_REPOSITORY="$2" shift + else + DOCKER_REPOSITORY="" fi ;; *) @@ -51,9 +54,9 @@ mkdir -p build docker buildx \ build \ - --build-arg GITHUB_REPOSITORY=$GITHUB_REPOSITORY \ + --build-arg DOCKER_REPOSITORY=$DOCKER_REPOSITORY \ --build-arg DEEPSPEED_VERSION=$DEEPSPEED_VERSION \ - -t ${GITHUB_REPOSITORY}alltalk_deepspeed:${DOCKER_TAG} \ + -t ${DOCKER_REPOSITORY}alltalk_deepspeed:${DOCKER_TAG} \ . docker run \ @@ -63,4 +66,4 @@ docker run \ --name deepspeed \ --build-arg DOCKER_TAG=$DOCKER_TAG \ -v $SCRIPT_DIR/build:/deepspeed \ - ${GITHUB_REPOSITORY}alltalk_deepspeed:${DOCKER_TAG} \ No newline at end of file + ${DOCKER_REPOSITORY}alltalk_deepspeed:${DOCKER_TAG} \ No newline at end of file diff --git a/docker/variables.sh b/docker/variables.sh index 822d118..628a98a 100644 --- a/docker/variables.sh +++ b/docker/variables.sh @@ -5,7 +5,6 @@ ALLTALK_VARS["CUDA_VERSION"]=12.6.0 ALLTALK_VARS["PYTHON_VERSION"]=3.11.11 ALLTALK_VARS["DEEPSPEED_VERSION"]=0.16.2 ALLTALK_VARS["ALLTALK_DIR"]=/opt/alltalk -ALLTALK_VARS["GITHUB_REPOSITORY"]= # Export single variables (needed by Docker locally) for key in "${!ALLTALK_VARS[@]}"