108

N卡环境下以Docker方式一键部署ComfyUI

乐果   发表于   2025 年 02 月 08 日 标签:Dockerai

之前直接在N卡物理机上跑模型难免因为各种依赖兼容的问题反复折腾, 并且当模型升级时依赖环境又得升级。 特别当跑多个不同模型时,环境的兼容性就成了“鱼与熊掌不可兼得”尴尬。 最近发现可以用Docker方式部署,不得不说英伟达的生态还是非常棒的,也难怪成为显卡一哥。

下面把折腾笔记记录一下。

假设在debian12服务器系统下已安装好如下基础环境:

  • 安装好英伟达显卡驱动;
  • 安装好Docker;

安装英伟达为Docker容器工具包

检查 NVIDIA 容器工具包是否安装:

dpkg -l | grep nvidia-container-toolkit

确认 NVIDIA 容器工具包是否已正确安装

如果没有任何信息出现,则使用以下命令安装:

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \
    && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \
    && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
 
sudo apt update
sudo apt install -y nvidia-container-toolkit
sudo systemctl restart docker

注意,如果是ubuntu18.04之类的系统,上面步骤是可以的。 但是debian12可能会报错,可能是debian12作为debian最新发行版显卡一哥还没来得及更新。

不过没关系用deiban11也是可以,如下:

curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey > /etc/apt/keyrings/nvidia-docker.key
curl -s -L https://nvidia.github.io/nvidia-docker/debian11/nvidia-docker.list > /etc/apt/sources.list.d/nvidia-docker.list
sed -i -e "s/^deb/deb \[signed-by=\/etc\/apt\/keyrings\/nvidia-docker.key\]/g" /etc/apt/sources.list.d/nvidia-docker.list
apt update
apt -y install nvidia-container-toolkit
systemctl restart docker

部署ComfyUI

拉取第三方ConfyUI镜像:

docker pull dockerproxy.net/yanwk/comfyui-boot:cu124-cn

定义工作空间:

mkdir -p /data/comfyui/storage

启动镜像容器:

docker run -it --rm \
  --name comfyui-cn \
  --gpus all \
  -p 8188:8188 \
  -v "$(pwd)"/storage:/root \
  -e CLI_ARGS="--fast" \
  -e PIP_INDEX_URL="https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" \
  -e HF_ENDPOINT="https://hf-mirror.com" \
  yanwk/comfyui-boot:cu124-cn

启动报错:

排查问题,发现是ghp.ci失效了,我们替换只新地址ghgo.xyz,查看地址: https://ghproxy.link

下载代码查看:

# git clone https://github.com/YanWenKun/ComfyUI-Docker
https://github.com/YanWenKun/ComfyUI-Docker/tree/main/cu124-cn/runner-scripts

ghp.ci替换ghgo.xyz:

    # ls -l
    -rw-r--r--. 1 root root   29 12月 19 17:26 comfy.settings.json.example
    -rw-r--r--. 1 root root 3647 12月 19 17:37 download-models.txt
    -rw-r--r--. 1 root root 5068 12月 19 17:37 download.sh
    -rw-r--r--. 1 root root 1399 12月 19 17:26 entrypoint.sh
    -rw-r--r--. 1 root root 1976 12月 19 17:35 minimal-start.sh
    -rw-r--r--. 1 root root   66 12月 19 17:26 pre-start.sh.example
    -rw-r--r--. 1 root root  904 12月 19 17:26 set-proxy.sh.example
     
    # grep -rl1 'ghp.ci' .
    ./download-models.txt
    ./download.sh
    ./minimal-start.sh
     
    # sed -i 's/ghp.ci/ghgo.xyz/g' download-models.txt
    # sed -i 's/ghp.ci/ghgo.xyz/g' download.sh
    # sed -i 's/ghp.ci/ghgo.xyz/g' minimal-start.sh

重新构建 Dockerfile 和镜像:

FROM yanwk/comfyui-boot:cu124-cn
 
RUN rm -rf /runner-scripts/
COPY runner-scripts/.  /runner-scripts/

打镜像标签:

docker build -t hub.wesais.cn/comfyui-boot:cu124-cn

重新启动新镜像容器:

docker run -it --rm \
  --name comfyui-cn \
  --gpus all \
  -p 8188:8188 \
  -v /data/comfyui/storage:/root \
  -e CLI_ARGS="--fast" \
  -e PIP_INDEX_URL="https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple" \
  -e HF_ENDPOINT="https://hf-mirror.com" \
  hub.wesais.cn/comfyui-boot:cu124-cn

成功运行:

下载模型成功:

导入自定义节点成功:

如果发现有个别是失败的,需要的时候,我们可以单独下载至外设路径 storgeComfyUI/custom_nodes

ComfyUI体验效果

浏览器打开效果:

提示词:

a bottle with a beautiful rainbow galaxy inside it on top of a wooden table 
in the middle of a modern kitchen beside a plate of vegetables and mushrooms 
and a wine glasse that contains a planet earth with a plate with 
a half eaten apple pie on it.

可以下载更多的工作流模版来体验不一样的效果,comfyworkflows

ComfyUI-AuraFlow-v0.3模型体验:

工作流:

小试牛刀:

查看最终Docker镜像信息

查看镜像详细信息:

root@xiao:/data/comfyui# docker inspect hub.wesais.cn/comfyui-boot:cu124-cn 
[
    {
        "Id": "sha256:d33d2987df5f2e11356676e7a46b2fad2eacc27d815b9669fdceb3cd288890df",
        "RepoTags": [
            "hub.wesais.cn/comfyui-boot:cu124-cn"
        ],
        "RepoDigests": [],
        "Parent": "sha256:8fb8778fb150473ce7b756873efa7ec4790006213d9790a5940bf0da9a8cd748",
        "Comment": "",
        "Created": "2025-02-08T14:47:31.136600723Z",
        "Container": "",
        "ContainerConfig": {
            "Hostname": "",
            "Domainname": "",
            "User": "root",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "8188/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "LD_LIBRARY_PATH=:/usr/local/lib64/python3.12/site-packages/torch/lib:/usr/local/lib/python3.12/site-packages/cusparselt/lib:/usr/local/lib/python3.12/site-packages/nvidia/cuda_cupti/lib:/usr/local/lib/python3.12/site-packages/nvidia/cuda_runtime/lib:/usr/local/lib/python3.12/site-packages/nvidia/cudnn/lib:/usr/local/lib/python3.12/site-packages/nvidia/cufft/lib:/usr/local/lib/python3.12/site-packages/nvidia/cublas/lib:/usr/local/lib/python3.12/site-packages/nvidia/cuda_nvrtc/lib:/usr/local/lib/python3.12/site-packages/nvidia/curand/lib:/usr/local/lib/python3.12/site-packages/nvidia/cusolver/lib:/usr/local/lib/python3.12/site-packages/nvidia/cusparse/lib:/usr/local/lib/python3.12/site-packages/nvidia/nccl/lib:/usr/local/lib/python3.12/site-packages/nvidia/nvjitlink/lib:/usr/local/lib/python3.12/site-packages/nvidia/nvtx/lib",
                "PIP_INDEX_URL=https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple",
                "HF_ENDPOINT=https://hf-mirror.com",
                "CLI_ARGS="
            ],
            "Cmd": [
                "/bin/sh",
                "-c",
                "#(nop) COPY dir:9b3e3c7b3764fe750d5468a43c1996fc998934b10be5fcc61d86707e4df740cb in /runner-scripts/ "
            ],
            "ArgsEscaped": true,
            "Image": "sha256:8fb8778fb150473ce7b756873efa7ec4790006213d9790a5940bf0da9a8cd748",
            "Volumes": {
                "/root": {}
            },
            "WorkingDir": "/root",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "maintainer": "YAN Wenkun <code@yanwk.fun>",
                "org.openbuildservice.disturl": "obs://build.opensuse.org/openSUSE:Factory/images/9964c6ceb7b36fad09fc97e1c3e7c0f8-opensuse-tumbleweed-image:docker",
                "org.opencontainers.image.created": "2025-01-31T04:27:04.266916739Z",
                "org.opencontainers.image.description": "Image containing a minimal environment for containers based on openSUSE Tumbleweed.",
                "org.opencontainers.image.source": "https://build.opensuse.org/package/show/openSUSE:Factory/opensuse-tumbleweed-image?rev=9964c6ceb7b36fad09fc97e1c3e7c0f8",
                "org.opencontainers.image.title": "openSUSE Tumbleweed Base Container",
                "org.opencontainers.image.url": "https://www.opensuse.org",
                "org.opencontainers.image.vendor": "openSUSE Project",
                "org.opencontainers.image.version": "20250130.33.297",
                "org.opensuse.base.created": "2025-01-31T04:27:04.266916739Z",
                "org.opensuse.base.description": "Image containing a minimal environment for containers based on openSUSE Tumbleweed.",
                "org.opensuse.base.disturl": "obs://build.opensuse.org/openSUSE:Factory/images/9964c6ceb7b36fad09fc97e1c3e7c0f8-opensuse-tumbleweed-image:docker",
                "org.opensuse.base.lifecycle-url": "https://en.opensuse.org/Lifetime",
                "org.opensuse.base.reference": "registry.opensuse.org/opensuse/tumbleweed:20250130.33.297",
                "org.opensuse.base.source": "https://build.opensuse.org/package/show/openSUSE:Factory/opensuse-tumbleweed-image?rev=9964c6ceb7b36fad09fc97e1c3e7c0f8",
                "org.opensuse.base.title": "openSUSE Tumbleweed Base Container",
                "org.opensuse.base.url": "https://www.opensuse.org",
                "org.opensuse.base.vendor": "openSUSE Project",
                "org.opensuse.base.version": "20250130.33.297",
                "org.opensuse.lifecycle-url": "https://en.opensuse.org/Lifetime",
                "org.opensuse.reference": "registry.opensuse.org/opensuse/tumbleweed:20250130.33.297"
            }
        },
        "DockerVersion": "20.10.24+dfsg1",
        "Author": "",
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "root",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "8188/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "LD_LIBRARY_PATH=:/usr/local/lib64/python3.12/site-packages/torch/lib:/usr/local/lib/python3.12/site-packages/cusparselt/lib:/usr/local/lib/python3.12/site-packages/nvidia/cuda_cupti/lib:/usr/local/lib/python3.12/site-packages/nvidia/cuda_runtime/lib:/usr/local/lib/python3.12/site-packages/nvidia/cudnn/lib:/usr/local/lib/python3.12/site-packages/nvidia/cufft/lib:/usr/local/lib/python3.12/site-packages/nvidia/cublas/lib:/usr/local/lib/python3.12/site-packages/nvidia/cuda_nvrtc/lib:/usr/local/lib/python3.12/site-packages/nvidia/curand/lib:/usr/local/lib/python3.12/site-packages/nvidia/cusolver/lib:/usr/local/lib/python3.12/site-packages/nvidia/cusparse/lib:/usr/local/lib/python3.12/site-packages/nvidia/nccl/lib:/usr/local/lib/python3.12/site-packages/nvidia/nvjitlink/lib:/usr/local/lib/python3.12/site-packages/nvidia/nvtx/lib",
                "PIP_INDEX_URL=https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple",
                "HF_ENDPOINT=https://hf-mirror.com",
                "CLI_ARGS="
            ],
            "Cmd": [
                "bash",
                "/runner-scripts/entrypoint.sh"
            ],
            "ArgsEscaped": true,
            "Image": "sha256:8fb8778fb150473ce7b756873efa7ec4790006213d9790a5940bf0da9a8cd748",
            "Volumes": {
                "/root": {}
            },
            "WorkingDir": "/root",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": {
                "maintainer": "YAN Wenkun <code@yanwk.fun>",
                "org.openbuildservice.disturl": "obs://build.opensuse.org/openSUSE:Factory/images/9964c6ceb7b36fad09fc97e1c3e7c0f8-opensuse-tumbleweed-image:docker",
                "org.opencontainers.image.created": "2025-01-31T04:27:04.266916739Z",
                "org.opencontainers.image.description": "Image containing a minimal environment for containers based on openSUSE Tumbleweed.",
                "org.opencontainers.image.source": "https://build.opensuse.org/package/show/openSUSE:Factory/opensuse-tumbleweed-image?rev=9964c6ceb7b36fad09fc97e1c3e7c0f8",
                "org.opencontainers.image.title": "openSUSE Tumbleweed Base Container",
                "org.opencontainers.image.url": "https://www.opensuse.org",
                "org.opencontainers.image.vendor": "openSUSE Project",
                "org.opencontainers.image.version": "20250130.33.297",
                "org.opensuse.base.created": "2025-01-31T04:27:04.266916739Z",
                "org.opensuse.base.description": "Image containing a minimal environment for containers based on openSUSE Tumbleweed.",
                "org.opensuse.base.disturl": "obs://build.opensuse.org/openSUSE:Factory/images/9964c6ceb7b36fad09fc97e1c3e7c0f8-opensuse-tumbleweed-image:docker",
                "org.opensuse.base.lifecycle-url": "https://en.opensuse.org/Lifetime",
                "org.opensuse.base.reference": "registry.opensuse.org/opensuse/tumbleweed:20250130.33.297",
                "org.opensuse.base.source": "https://build.opensuse.org/package/show/openSUSE:Factory/opensuse-tumbleweed-image?rev=9964c6ceb7b36fad09fc97e1c3e7c0f8",
                "org.opensuse.base.title": "openSUSE Tumbleweed Base Container",
                "org.opensuse.base.url": "https://www.opensuse.org",
                "org.opensuse.base.vendor": "openSUSE Project",
                "org.opensuse.base.version": "20250130.33.297",
                "org.opensuse.lifecycle-url": "https://en.opensuse.org/Lifetime",
                "org.opensuse.reference": "registry.opensuse.org/opensuse/tumbleweed:20250130.33.297"
            }
        },
        "Architecture": "amd64",
        "Os": "linux",
        "Size": 10441316631,
        "VirtualSize": 10441316631,
        "GraphDriver": {
            "Data": {
                "LowerDir": "/data/docker/overlay2/dda2f0a96fe05938cca5a68b848a9e22477ca73fb8816fbc07a58ecfaf62678e/diff:/data/docker/overlay2/dbd971745de5020e9f2cbed990768ffb879777629207cee8460d7d2f5f4be10f/diff:/data/docker/overlay2/21cec1c3a2d8f38d425610fa18533cf5484f8c7d226906e8830cd78906b7e748/diff:/data/docker/overlay2/250c72625569a0bf01bd3bc489c94bdf258341d2086ad2a0ae84a3ca0fbe6998/diff:/data/docker/overlay2/4cd6af90a0ab3b901638ef31057910619f32b8b3504bde6d9ea3e764be4f3a50/diff:/data/docker/overlay2/44f6e4702ac120d455dbdec8334d97b79d2ee97865e10f8beefa4f9c42f95759/diff:/data/docker/overlay2/88f6af2d8a8151c6e781eebe9c2fd996a92e14616dc8670c8d48d3dd0a9c7cc7/diff:/data/docker/overlay2/b518f01c2f8c3c35ec18f0b24ccaf105dce33904c81e0e522f9c3902a105ce89/diff:/data/docker/overlay2/6d5b09afa4722b08bf2e14a891aec8ab8d89df998aea0dc94c3c194e106ca895/diff:/data/docker/overlay2/00a02f579c793d809e9c66a01777ac93b50cf756910c7df1f61975c6b6bb94a7/diff:/data/docker/overlay2/d7f92f2700e7e494f379453d958c102a5baaa0cfd54033d65d12d0e5d4d4c7ff/diff:/data/docker/overlay2/a9e4c44240e1196cfe20fdbdf88647da8c497e7532e1f2c9e1156392f4488371/diff:/data/docker/overlay2/b3b03d01c4a5a5edac94643c85f1cfdd03d05e84924a65854f9f35b240342b3b/diff:/data/docker/overlay2/d97de90b88051e21d506533358da06aea9a65f1e355b0edc837bed33f1fad49d/diff:/data/docker/overlay2/da6f5960fb0df701639cc8bb962bf62feb2581c667272860d7f57ae418fee6ad/diff:/data/docker/overlay2/8b4a0a8f018d641ef8a24e7af77cf7ddca97bde16daee08514d5a41866d9a19b/diff:/data/docker/overlay2/f37ab02d0d5dc42f0999dcafad078ee305ba30378ace0377b1ba364b49e36cd6/diff:/data/docker/overlay2/803850c2f35ab5efe6b105432949e70b70a450666685cf91c057991d13ad4d6b/diff",
                "MergedDir": "/data/docker/overlay2/f05ca65ef21ac2f98d55c78bd7fdab425c6bb38293a3ade6bc4ab9a631ae5a75/merged",
                "UpperDir": "/data/docker/overlay2/f05ca65ef21ac2f98d55c78bd7fdab425c6bb38293a3ade6bc4ab9a631ae5a75/diff",
                "WorkDir": "/data/docker/overlay2/f05ca65ef21ac2f98d55c78bd7fdab425c6bb38293a3ade6bc4ab9a631ae5a75/work"
            },
            "Name": "overlay2"
        },
        "RootFS": {
            "Type": "layers",
            "Layers": [
                "sha256:927984fa387efeda12c6d00b78e2fdcba9c2874f85c101ab97a832fafa459f67",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:561bf950945bca5744f1cd2a7ab766ff0635665613ba83a1d6ec1120305e10a7",
                "sha256:5b22c2b85adcb659eec068b1c914928d9e34e43a0a60fc5699ae4e56e6799906",
                "sha256:19791dde977b0c9641a0836ab180722d639045fcd28f0b27f2cb3f1765e8d0e2",
                "sha256:8eadb4c19c7d599bc85995192de04ce0ea4f8a6f27878cee9a1c566a62bea9ee",
                "sha256:7a4a7d6987f76b145bfb99e152ae7e4817be4ac10a0eec23fb877de885fa8071",
                "sha256:bf6054889874f04de906d68c46caf2feff203cc51725210c5fbfd86916446dfd",
                "sha256:44a68f91b695a6f1c70f2ec013fd7e459588969af3bf2b1592b33e974f1c69b1",
                "sha256:660f65bd380d6bb88ef96d59ec57d03c373fad22538a81ade599dc22c9ba8238",
                "sha256:657c41a879c7ec8eaa5578bca0ab78ea3cca1c6633d890a47abf7697728a5a7f",
                "sha256:3f233c8e2978980455f7e966157fa710e84ea40c1ff82a6e4d556632aa78cf49",
                "sha256:148aeba8072c5456ae2cc7037d6ba02b8e895f2b2b4e4c0c81841def3818f9b6",
                "sha256:71316654805b241900db5ee00cc22fdd01aa5aa60a832b3caffd976af47aca73",
                "sha256:95e12d84f6ddf1643b21a2a3ef629b1ac38142160601a6eca1e696d1fa6f3dca",
                "sha256:fe587cb0fab01cd2eef738a4a71873f1a27e697e935aec19ae4555313e2d9c37",
                "sha256:5f70bf18a086007016e948b04aed3b82103a36bea41755b6cddfaf10ace3c6ef",
                "sha256:63248977446ffd3b732c80b5371177d0ed6f0ff06ab0250ea9ac1a3febc0fce9",
                "sha256:efc93a6c691307c091cd4587c57fc47ad539e6649ae8ea692151b97b30c28ce1"
            ]
        },
        "Metadata": {
            "LastTagTime": "2025-02-08T09:47:31.147905043-05:00"
        }
    }
]

乐果   发表于   2025 年 02 月 08 日 标签:Dockerai

0

文章评论