ITADN
drawthingsai/draw-things-community
README.md
以下内容由 AI 翻译,如有问题请点此提交 issue 反馈

Draw Things 社区

这是一个社区仓库,用于维护运行 Draw Things 应用 的面向公众的代码。

目前,它包含我们在应用内重新实现的图像生成模型、采样器、数据模型和训练器的源代码。随着时间的推移,随着我们将更多核心功能迁移到独立的库中,此仓库将会扩展。

贡献

虽然我们预计开发工作主要由我们完成,但我们欢迎来自社区的贡献。为了使管理更加有序,我们要求签署贡献者许可协议(CLA)。如果您不愿意签署 CLA,您仍然可以 fork 此仓库并以您自己的方式做出贡献。

路线图与仓库同步

Draw Things 应用通过一个私有 monorepo 进行管理。我们与社区仓库进行双向的逐提交同步。因此,内部实现的功能有时会“泄露”到社区仓库,这是预期之内的。

话虽如此,我们不打算发布内部 monorepo 的路线图。是否要发布面向公众的社区仓库的路线图,需要进一步讨论并征求社区的反馈。

在 macOS 上使用 Swift Package Manager 快速入门

如果您想在本地构建 SwiftPM gRPCServerCLI 目标,可以使用以下命令进行构建:

swift build --target gRPCServerCLI

要通过 SwiftPM 运行 CLI,请使用可执行名称形式(而非 --target):

swift run -c release gRPCServerCLI /path/to/models

您还可以通过以下方式检查 CLI 选项:

swift run -c release gRPCServerCLI --help

在 macOS 上使用 draw-things-cli 快速入门

如果你想从本仓库构建本地推理和 LoRA 训练 CLI,请使用以下命令构建 SwiftPM 产品:

swift build --product draw-things-cli

要从 SwiftPM 检查 CLI 界面,请运行:

swift run -c release draw-things-cli --help
swift run -c release draw-things-cli generate --help

一次最小化的生成运行如下所示:

swift run -c release draw-things-cli generate --model flux_2_klein_4b_q6p.ckpt --prompt "a small red cube on a table"

在 macOS 上,draw-things-cli 默认使用与沙盒化的 Draw Things 应用相同的模型目录:

~/Library/Containers/com.liuliu.draw-things/Data/Documents/Models

您可以使用 --models-dirDRAWTHINGS_MODELS_DIR 进行覆盖。

如果您更喜欢 Homebrew,请使用以下命令安装最新的 CLI:

brew install --HEAD drawthingsai/draw-things/draw-things-cli

然后使用以下命令验证安装:

draw-things-cli --help

从打包的二进制文件自托管 gRPCServerCLI

我们通过此仓库提供预构建的自托管 gRPCServerCLI 二进制文件。最新版本应可在 Releases 处获取。

这些预构建的二进制文件提供了一种快速方式,可在您的 Mac 或 Linux 系统上托管 Draw Things gRPC Server,而无需下载 Draw Things 应用。随后,Draw Things 应用可以通过您网络内的 Server-Offload 功能连接到这些自托管服务器。

macOS

在 macOS 上,只需在您的 macOS 系统上下载 gRPCServerCLI-macOS。您可以将其放置在 /usr/local/bin 或您觉得合适的位置,并通过以下方式启动:

gRPCServerCLI-macOS /the-path-to-host-the-models

如果你已安装 Draw Things 应用,你可以通过以下方式简单地引用模型路径:

gRPCServerCLI-macOS ~/Library/Containers/com.liuliu.draw-things/Data/Documents/Models

支持 CUDA 的 Linux

我们为 Linux 系统提供基于 CUDA 加速的 gRPCServerCLI。最简单的启动方式是使用 DockerNVIDIA Container Toolkit

请注意,截至本文撰写时,gRPCServerCLI 支持 RTX 20xx / RTX 30xx / RTX 40xx,并应支持从 A100 到 H100 的 NVIDIA 显卡。我们的 Docker 镜像以 CUDA 12.4.1 为基础,这需要 NVIDIA 图形驱动程序版本 550.54.15 或更高版本。

一旦两者都正确安装。您可以拉取最新的 gRPCServerCLI Docker 镜像,然后验证容器是否可以访问 GPU:

docker run --gpus all drawthingsai/draw-things-grpc-server-cli:latest nvidia-smi

如果显示了你的 GPU,则一切正常。典型的输出如下所示:

liu@rtx6x4:~/workspace/draw-things-community$ docker run --gpus all drawthingsai/draw-things-grpc-server-cli:latest nvidia-smi                                        (main)
Unable to find image 'drawthingsai/draw-things-grpc-server-cli:latest' locally
latest: Pulling from drawthingsai/draw-things-grpc-server-cli
Digest: sha256:71133ce6e827c432de3f18052bee2c0a74b3236a7abe8c39584ad6397dd6c9b0
Status: Downloaded newer image for drawthingsai/draw-things-grpc-server-cli:latest

==========
== CUDA ==
==========

CUDA Version 12.4.1

Container image Copyright (c) 2016-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.

This container image and its contents are governed by the NVIDIA Deep Learning Container License.
By pulling and using the container, you accept the terms and conditions of this license:
https://developer.nvidia.com/ngc/nvidia-deep-learning-container-license

A copy of this license is made available in this container at /NGC-DL-CONTAINER-LICENSE for your convenience.

Fri Dec  6 18:50:28 2024
+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 550.120                Driver Version: 550.120        CUDA Version: 12.4     |
|-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA RTX 6000 Ada Gene...    Off |   00000000:21:00.0 Off |                  Off |
| 30%   42C    P8             28W /  300W |      12MiB /  49140MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
|   1  NVIDIA RTX 6000 Ada Gene...    Off |   00000000:22:00.0 Off |                  Off |
| 30%   50C    P8             31W /  300W |      12MiB /  49140MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
|   2  NVIDIA RTX 6000 Ada Gene...    Off |   00000000:41:00.0 Off |                  Off |
| 30%   48C    P8             33W /  300W |      89MiB /  49140MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+
|   3  NVIDIA RTX 6000 Ada Gene...    Off |   00000000:43:00.0 Off |                  Off |
| 30%   47C    P8             28W /  300W |      12MiB /  49140MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI        PID   Type   Process name                              GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
+-----------------------------------------------------------------------------------------+

Docker 镜像维护在 https://hub.docker.com/r/drawthingsai/draw-things-grpc-server-cli

要从 Docker 运行实际的 gRPCServerCLI,请执行:

docker run -v /[Your local path to store models]:/grpc-models -p 7859:7859 --gpus all drawthingsai/draw-things-grpc-server-cli:latest gRPCServerCLI /grpc-models

请注意,容器化进程无法向您的本地网络广播其地址,因此您需要在 Draw Things 应用中手动输入 IP 地址和端口才能成功连接。

对于 RTX 20xx 系列显卡,您需要禁用 FlashAttention:

docker run -v /[Your local path to store models]:/grpc-models -p 7859:7859 --gpus all drawthingsai/draw-things-grpc-server-cli:latest gRPCServerCLI /grpc-models --no-flash-attention

开发入门

我们使用 Bazel 作为主要构建系统。您可以在 Linux 或 macOS 上构建组件。在 macOS 上,您需要安装 Xcode。在 Linux 上,根据您是否拥有 NVIDIA CUDA 兼容的 GPU,设置可能有所不同。

安装必要的依赖项后,您可以运行:

./Scripts/install.sh

正确设置仓库。

要验证安装,请运行:

bazel run Apps:ModelConverter

从零开始自托管 gRPCServerCLI

gRPCServerCLI 是完全开源的,这意味着在同一系统上,你可以构建出与我们提供的预构建二进制文件逐字节匹配的版本。在 macOS 系统上这相对容易,在其他系统上则需要稍多的配置。

macOS

首先,你需要在 macOS 上设置此仓库。要使用此仓库构建任何内容,你需要 HomebrewXcode

要设置仓库,只需运行:

./Scripts/install.sh

这应该会为您设置必要的工具,例如 Bazel。要构建 gRPCServerCLI,您可以运行:

bazel build Apps:gRPCServerCLI-macOS

要构建与我们的预构建二进制文件完全相同的版本:

bazel build Apps:gRPCServerCLI-macOS --nostamp --config=release --macos_cpus=arm64,x86_64

支持 CUDA 的 Linux

我们将展示如何在 Ubuntu 22.04 上构建 gRPCServerCLI。首先,您需要安装 CUDASwiftBazelCUDNN

之后,您可以 sudo apt install 其余部分:

sudo apt -y install libpng-dev libjpeg-dev libatlas-base-dev libblas-dev clang llvm

确保在运行 ./Scripts/install.sh 时,clang.bazelrc 文件成功生成。该文件应如下所示:

# Generated file, do not edit. If you want to disable clang, just delete this file.
build:clang --action_env='PATH=/usr/local/bin:/home/liu/.deno/bin:/opt/cmake/bin:/opt/intel/bin:/opt/intel/vtune_amplifier_xe/bin64:/opt/go/bin:/opt/llvm/tools/clang/tools/scan-build:/usr/local/cuda/bin:/opt/llvm/tools/clang/tools/scan-view:/usr/local/bin:/usr/local/sbin/:/bin:/sbin:/usr/bin:/usr/sbin:/home/liu/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/liu/.rvm/bin:/opt/go/bin:/home/liu/.local/bin:/opt/swift/usr/bin:/home/liu/.cargo/bin' --host_action_env='PATH=/usr/local/bin:/home/liu/.deno/bin:/opt/cmake/bin:/opt/intel/bin:/opt/intel/vtune_amplifier_xe/bin64:/opt/go/bin:/opt/llvm/tools/clang/tools/scan-build:/usr/local/cuda/bin:/opt/llvm/tools/clang/tools/scan-view:/usr/local/bin:/usr/local/sbin/:/bin:/sbin:/usr/bin:/usr/sbin:/home/liu/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/liu/.rvm/bin:/opt/go/bin:/home/liu/.local/bin:/opt/swift/usr/bin:/home/liu/.cargo/bin'
build:clang --action_env=CC=clang --host_action_env=CC=clang
build:clang --action_env=CXX=clang++ --host_action_env=CXX=clang++
build:clang --action_env='LLVM_CONFIG=/usr/local/bin/llvm-config' --host_action_env='LLVM_CONFIG=/usr/local/bin/llvm-config'
build:clang --repo_env='LLVM_CONFIG=/usr/local/bin/llvm-config'
build:clang --linkopt='-L/usr/local/lib'
build:clang --linkopt='-Wl,-rpath,/usr/local/lib'

build:clang-asan --action_env=ENVOY_UBSAN_VPTR=1
build:clang-asan --copt=-fsanitize=vptr,function
build:clang-asan --linkopt=-fsanitize=vptr,function
build:clang-asan --linkopt='-L/usr/local/lib/clang/18.1.1/lib/x86_64-unknown-linux-gnu'
build:clang-asan --linkopt=-l:libclang_rt.ubsan_standalone.a
build:clang-asan --linkopt=-l:libclang_rt.ubsan_standalone_cxx.a

还应有一个 .bazelrc.local 文件,其中包含 CUDA 配置:

build --action_env TF_NEED_CUDA="1"
build --action_env TF_NEED_OPENCL="1"
build --action_env TF_CUDA_CLANG="0"
build --action_env HOST_CXX_COMPILER="/usr/local/bin/clang"
build --action_env HOST_C_COMPILER="/usr/local/bin/clang"
build --action_env CLANG_CUDA_COMPILER_PATH="/usr/local/bin/clang"
build --action_env GCC_HOST_COMPILER_PATH="/usr/local/bin/clang"

build --action_env CUDA_TOOLKIT_PATH="/usr/local/cuda"
build --action_env TF_CUDA_VERSION="12.4"
build --action_env TF_CUDA_COMPUTE_CAPABILITIES="7.5,8.0,8.6"
build --action_env COMPUTECPP_TOOLKIT_PATH="/usr/local/computecpp"
build --action_env TMP="/tmp"
build --action_env TF_CUDNN_VERSION="9"
build --action_env CUDNN_INSTALL_PATH="/usr"
build --action_env TF_NCCL_VERSION="2"
build --action_env NCCL_INSTALL_PATH="/usr"

build --config=clang
build --config=cuda

build --linkopt="-z nostart-stop-gc"
build --host_linkopt="-z nostart-stop-gc"

build --define=enable_sm80=true

请注意 CUDA 版本和 CUDNN 版本,使其与您的版本匹配。

要构建与我们用于 Docker 镜像的二进制文件完全相同的版本,请执行以下操作:

bazel build Apps:gRPCServerCLI --keep_going --spawn_strategy=local --compilation_mode=opt

请注意,您可能会遇到无法找到 cudnn 的问题。在这种情况下,请确保其命名正确,我必须执行以下操作:

sudo ln -s /usr/lib/x86_64-linux-gnu/libcudnn.so.9 /usr/lib/x86_64-linux-gnu/libcudnn.so

使其可被发现。

许可证

本仓库采用 GNU 通用公共许可证第 3 版(GPL-v3)授权,与 A1111Fooocus 相同。

许可证示例

为了说明 GPL-v3 在各种场景下的适用情况,请考虑以下在我们政策下可接受的许可实践示例:

独立应用程序

如果您使用本仓库中的代码开发了一个新应用程序,并将其作为独立产品(即能够独立运行,而不仅仅是 Draw Things 的 HTTP 客户端)发布在任何应用分发平台(例如 App Store)上,则您必须将整个应用程序以 GPL-v3 进行授权。

分支与增强

如果您分支(fork)本仓库并引入增强功能或额外功能,您贡献的任何新代码也必须以 GPL-v3 进行授权。这确保了所有衍生作品在相同条款下保持开放和可访问。

服务器与客户端开发

如果您使用本仓库构建服务器应用程序,无论是通过 HTTP 还是 Google Protobuf(不限于这两种方式),随后开发一个与您的服务器通信的客户端应用程序,则适用以下规则:

  • Google Protobuf 定义和服务器的源代码均必须以 GPL-v3 许可证发布。
  • 客户端应用程序可以采用不同的许可证,前提是您不得将客户端和服务器打包到单个发行版中,或促进从客户端内部自动下载服务器(这种做法通常被称为“深度集成”)。这种区分确保了服务器端组件保持开放,同时开发者在客户端应用程序的授权方面拥有灵活性。

这些示例旨在为涉及我们代码库的常见用例提供指导。通过遵循这些实践,您有助于维护 GPL-v3 所倡导的开放协作和软件自由精神。

替代许可证

我们可以为此仓库提供替代许可证,但不适用于任何第三方分支。特别是,我们可能会在个案基础上提供 LGPL-v3 许可证作为自由软件的替代方案。如果您希望为闭源应用程序或其他法律义务获取更宽松的许可证,请联系我们。