文档首页> AI开发平台ModelArts> 最佳实践> AIGC模型> SDXL WebUI基于Devserver适配PyTorch NPU推理指导(6.3.902)
更新时间:2024-07-12 GMT+08:00
分享

SDXL WebUI基于Devserver适配PyTorch NPU推理指导(6.3.902)

本文档主要介绍如何在ModelArts Lite的DevServer环境中部署Stable Diffusion的WebUI套件,使用NPU卡进行推理。

方案概览

本方案介绍了在ModelArts的DevServer上使用昇腾计算资源部署Stable Diffusion WebUI套件用于推理的详细过程。完成本方案的部署,需要先联系您所在企业的华为方技术支持购买DevServer资源。

本方案目前仅适用于企业客户。

资源规格要求

推理部署推荐使用“西南-贵阳一”Region上的DevServer资源和Ascend Snt9B单机单卡。

获取软件

获取插件代码包ascendcloud-aigc-6.3.902-*.tar.gz文件。获取路径:Support网站

如果没有软件下载权限,请联系您所在企业的华为方技术支持下载获取。

ascendcloud-aigc-6.3.902-*.tar.gz文件名中的*表示具体的时间戳,以包名的实际时间为准。

Step1 准备环境

  1. 请参考DevServer资源开通,购买DevServer资源,并确保机器已开通,密码已获取,能通过SSH登录,不同机器之间网络互通。

    购买DevServer资源时如果无可选资源规格,需要联系华为云技术支持申请开通。

    当容器需要提供服务给多个用户,或者多个用户共享使用该容器时,应限制容器访问Openstack的管理地址(169.254.169.254),以防止容器获取宿主机的元数据。具体操作请参见禁止容器获取宿主机元数据

  2. 检查环境。
    1. SSH登录机器后,检查NPU设备检查。运行如下命令,返回NPU设备信息。
      npu-smi info

      如出现错误,可能是机器上的NPU设备没有正常安装,或者NPU镜像被其他容器挂载。请先正常安装NPU设备和驱动,或释放被挂载的NPU。

    2. 检查docker是否安装。
      docker -v   #检查docker是否安装

      如尚未安装,运行以下命令安装docker。

      yum install -y docker-engine.aarch64 docker-engine-selinux.noarch docker-runc.aarch64
    3. 配置IP转发,用于容器内的网络访问。执行以下命令查看net.ipv4.ip_forward配置项的值,如果为1,可跳过此步骤。
      sysctl -p | grep net.ipv4.ip_forward
      如果net.ipv4.ip_forward配置项的值不为1,执行以下命令配置IP转发。
      sed -i 's/net\.ipv4\.ip_forward=0/net\.ipv4\.ip_forward=1/g' /etc/sysctl.conf
      sysctl -p | grep net.ipv4.ip_forward
  3. 获取基础镜像。建议使用官方提供的镜像部署推理服务。

    镜像地址{image_url}为:

    西南-贵阳一:swr.cn-southwest-2.myhuaweicloud.com/atelier/pytorch_2_1_ascend:pytorch_2.1.0-cann_7.0.0-py_3.9-hce_2.0.2312-aarch64-snt9b-20240312154948-219655b

    docker pull {image_url}
  4. 启动容器镜像。启动前请先按照参数说明修改${}中的参数。可以根据实际需要增加修改参数。
    docker run -itd \
    --name sdwebui \
    -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
    -p 8183:8183 \
    -v /etc/localtime:/etc/localtime \
    -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
    -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
    --shm-size 60g \
    --device=/dev/davinci_manager \
    --device=/dev/hisi_hdc \
    --device=/dev/devmm_svm \
    --device=/dev/davinci3 \
    --network=bridge \
    ${image_name} bash

    参数说明:

    • --name ${container_name} 容器名称,进入容器时会用到,此处可以自己定义一个容器名称,例如sdxl-diffusers。
    • --device=/dev/davinci3:挂载主机的/dev/davinci3到容器的/dev/davinci3。可以使用npu-smi info查看空闲卡号,修改davinci后数字可以更改挂载卡。
    • ${image_name} 代表 ${image_name}。
  5. 进入容器。需要将${container_name}替换为实际的容器名称,例如:sdwebui。
    docker exec -it ${container_name} bash

Step2 下载软件包

  1. 下载stable-diffusion-webui-1.7.0.zip文件后解压,重命名为stable-diffusion-webui,然后拷贝到容器/home/ma-user目录下。
    sdwebui 1.7.0版本软件包的官网下载地址:https://github.com/AUTOMATIC1111/stable-diffusion-webui/tree/v1.7.0
    docker cp stable-diffusion-webui sdwebui:/home/ma-user/
  2. 修改文件夹权限。启动容器时默认用户为ma-user用户,在使用其他属组如root用户上传的数据和文件时,可能会存在权限不足的问题。
    # 修改文件夹权限(注意:重新启动一个终端,使用root用户登录容器修改文件权限,修改完后关闭终端。)
    docker exec -it --user root sdwebui bash
    chown -R ma-user:ma-group stable-diffusion-webui
  3. 下载SD基础模型,并拷贝到容器/home/ma-user/stable-diffusion-webui/models/Stable-diffusion目录下。

    SD基础模型的官网下载地址。

    https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0.safetensors

    https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.safetensors
    docker cp sd_xl_base_1.0.safetensors sdwebui:/home/ma-user/stable-diffusion-webui/models/Stable-diffusion/
    docker cp v1-5-pruned-emaonly.safetensors sdwebui:/home/ma-user/stable-diffusion-webui/models/Stable-diffusion/
      
    # 修改文件夹权限
    docker exec -it --user root sdwebui bash
    chown -R ma-user:ma-group stable-diffusion-webui/models/Stable-diffusion/
  4. 下载controlnet插件sd-webui-controlnet-main.zip文件后解压,重命名为sd-webui-controlnet,然后拷贝到容器stable-diffusion-webui/extensions/目录下。
    controlnet插件的官网下载地址:https://github.com/Mikubill/sd-webui-controlnet
    docker cp sd-webui-controlnet sdwebui:/home/ma-user/stable-diffusion-webui/extensions/
    # 修改文件夹权限
    docker exec -it --user root sdwebui bash
    chown -R ma-user:ma-group stable-diffusion-webui/extensions/
  5. 根据需要下载controlnet模型,放在/home/ma-user/stable-diffusion-webui/extensions/sd-webui-controlnet/models目录下。
    docker cp control_v11p_sd15_canny.pth sdwebui:/home/ma-user/stable-diffusion-webui/extensions/sd-webui-controlnet/models/
    docker cp control_v11p_sd15_canny.yaml sdwebui:/home/ma-user/stable-diffusion-webui/extensions/sd-webui-controlnet/models/
    docker cp diffusers_xl_canny_mid.safetensors sdwebui:/home/ma-user/stable-diffusion-webui/extensions/sd-webui-controlnet/models/
    
    # 修改文件夹权限
    docker exec -it --user root sdwebui bash
    chown -R ma-user:ma-group stable-diffusion-webui/extensions/sd-webui-controlnet/models/

    controlnet模型官网下载地址:

    https://huggingface.co/lllyasviel/ControlNet-v1-1/tree/main

    https://huggingface.co/lllyasviel/sd_control_collection/tree/main

    选择下载sd1.5 canny:

    https://huggingface.co/lllyasviel/ControlNet-v1-1/blob/main/control_v11p_sd15_canny.pth

    https://huggingface.co/lllyasviel/ControlNet-v1-1/blob/main/control_v11p_sd15_canny.yaml

    选择下载sdxl canny:

    https://huggingface.co/lllyasviel/sd_control_collection/blob/main/diffusers_xl_canny_mid.safetensors

  6. 安装插件代码包。
    1. 将获取到的插件代码包ascendcloud-aigc-6.3.902-*.tar.gz文件上传到容器的/home/ma-user/temp目录下。获取路径:Support网站
    2. 解压插件代码包ascendcloud-aigc-6.3.902-*到/home/ma-user/temp目录下。
      tar -zxvf ascendcloud-aigc-6.3.902-*.tar.gz  #解压
    3. 再解压ascendcloud-aigc-extensions-webui.tar.gz
      tar -zxvf ascendcloud-aigc-extensions-webui.tar.gz
    4. 拷贝NPU插件代码webui_npu_extension拷贝到stable-diffusion-webui/extensions/目录下。
      cp -rf webui_npu_extension /home/ma-user/stable-diffusion-webui/extensions/
    5. 拷贝safety-checker代码到/home/ma-user/stable-diffusion-webui/modules/目录下。
      cp third_paties/stable-diffusion-webui/safety_checker.py /home/ma-user/stable-diffusion-webui/modules/
    6. 然后在/home/ma-user/stable-diffusion-webui/modules/目录下,修改processing.py文件。
      cd /home/ma-user/stable-diffusion-webui/modules
      sed -i '17 i\from modules.safety_checker import check_safety' processing.py
      sed -i '621 i\        x_checked_image = sample.cpu().unsqueeze(0).permute(0, 2, 3, 1).numpy()' processing.py
      sed -i '622 i\        x_checked_image, has_nsfw_concept = check_safety(x_checked_image)' processing.py
      sed -i '623 i\        sample = torch.tensor(x_checked_image).permute(0, 3, 1, 2).squeeze(0).to(sample.device)' processing.py
      sed -i 's#\r##g' processing.py
  7. 下载safety-checker模型包。

    safety-checker的官网下载地址:https://huggingface.co/CompVis/stable-diffusion-safety-checker/tree/main

    在宿主机当前目录下创建CompVis/stable-diffusion-safety-checker目录,然后下载所有文件,如下图所示。

    图1 下载文件

    然后将CompVis目录整个拷贝到/home/ma-user/stable-diffusion-webui目录下。

    docker cp CompVis sdwebui:/home/ma-user/stable-diffusion-webui/
      
    # 修改文件夹权限
    docker exec -it --user root sdwebui bash
    chown -R ma-user:ma-group stable-diffusion-webui/CompVis

Step3 安装依赖

  1. 在容器中执行如下命令,安装pip依赖。
    cd /home/ma-user/stable-diffusion-webui
    pip install --upgrade pip
    pip install -r requirements.txt --no-deps
    pip install lightning_utilities torchmetrics gradio_client matplotlib pydantic aiofiles starlette ffmpy pydub uvicorn orjson semantic_version altair antlr4-python3-runtime==4.8.0 ftfy regex pytorch_lightning==1.6.5 gitdb trampoline clip aenum facexlib torch==2.1.0 python-multipart gdown
    pip install -r requirements_versions.txt
    pip install httpx==0.24.1
    pip install diffusers
  2. 安装Stable Diffusion依赖。
    1. 下载stablediffusion-main.zip文件解压后,重命名为stable-diffusion-stability-ai,然后拷贝到容器stable-diffusion-webui/repositories/目录下。stablediffusion-main.zip文件的官网下载地址:https://github.com/Stability-AI/stablediffusion
      docker cp stable-diffusion-stability-ai sdwebui:/home/ma-user/stable-diffusion-webui/repositories/

      如果stable-diffusion-webui/repositories/目录不存在,需要通过mkdir创建。

    2. 下载generative-models-main.zip文件解压后,重命名为generative-models,然后拷贝到容器stable-diffusion-webui/repositories/目录下。generative-models-main.zip文件的官网下载地址:https://github.com/Stability-AI/generative-models.git
      docker cp generative-models sdwebui:/home/ma-user/stable-diffusion-webui/repositories/
    3. 下载k-diffusion-master.zip文件解压后,重命名为k-diffusion,然后拷贝到容器stable-diffusion-webui/repositories/目录下。k-diffusion-master.zip文件的官网下载地址:https://github.com/Stability-AI/k-diffusion
      docker cp k-diffusion sdwebui:/home/ma-user/stable-diffusion-webui/repositories/
      # 修改文件夹权限
      docker exec -it --user root sdwebui bash
      chown -R ma-user:ma-group stable-diffusion-webui/repositories/
  3. 安装vaeapprox-sdxl.pt。

    下载vaeapprox-sdxl.pt文件后,拷贝到容器/home/ma-user/stable-diffusion-webui/models/VAE-approx/目录下。vaeapprox-sdxl.pt的官网下载地址:https://github.com/AUTOMATIC1111/stable-diffusion-webui/releases/tag/v1.0.0-pre

    docker cp vaeapprox-sdxl.pt sdwebui:/home/ma-user/stable-diffusion-webui/models/VAE-approx/
    # 修改文件夹权限
    docker exec -it --user root sdwebui bash
    chown -R ma-user:ma-group stable-diffusion-webui/models/VAE-approx/

Step4 运行并验证SDXL模型

  1. 首先在容器中运行命令。
    cd /home/ma-user/stable-diffusion-webui
    source /usr/local/Ascend/ascend-toolkit/set_env.sh
  2. 在/home/ma-user目录下已经存在launch.py脚本文件,启动launch.py命令如下。
    python3 launch.py --skip-torch-cuda-test --port 8183 --enable-insecure-extension-access --listen --log-startup --disable-safe-unpickle --skip-prepare-environment --api
    启动成功后,打印如下信息。
    图2 启动成功
  3. 使用http://{宿主机ip}:8183 可以访问前端页面,通过输入文字生成图片。
    图3 文生图

    注意开启fa优化按钮。

    图4 开启fa优化按钮

    如果使用涉黄文字,输出的图片会返回黑图,用于验证safety-checker功能。同时,服务端会打印如下信息。

    图5 服务端返回信息
  4. 带controlnet运行,默认使用canny。
    图6 带controlnet运行

    可以观察到输出的图片与canny输入图片很相近,坐姿和样子比较符合,如下图所示。

    图7 文生图
  5. 使用后台API调用文生图接口。
    curl -kv -X POST localhost:8183/sdapi/v1/txt2img -H "Content-Type: application/json" -d '{"prompt":"a dog"}'

    客户端返回图像的base64编码,将base64编码再转换为图片,转换代码如下。

    from PIL import Image
    from io import BytesIO
    import base64
      
    def base64_to_image(base64_str):
        image = base64.b64decode(base64_str, altchars=None, validate=False)
        image = BytesIO(image)
        image = Image.open(image)
        image.save("./out_put_image.png")
分享:

    相关文档

    相关产品