# AI绘图
# 工作方案
如何进行 AI 绘图?
- 首先,用户需要找到一个用于 AI 绘图的算法模型。
- 然后,用户通过某个工具使用模型。一般流程如下:
- 用户编写一段文字,说明希望得到什么样的内容,这称为提示词(prompt)。
- 用户将 prompt 输入模型。
- 模型工作一段时间之后,输出文字、图像等内容。
如何使用模型?
- 可以编写 Python 代码,调用模型的 API 。
- 优点:
- 可以仔细地使用模型的所有功能。
- 缺点:
- 需要用户懂 Python 编程,还要花时间写 Python 代码。
- 优点:
- 可以注册 Stability AI 等网站,在网页上进行 AI 绘图。
- 优点:
- 上手简单。
- 缺点:
- 收费略贵。
- 内容管制多。
- 只能使用少量几种模型。
- 优点:
- 可以安装 ComfyUI 等工具,在自己电脑上进行 AI 绘图。
- 优点:
- 买了电脑之后,只需要付出电费。
- 可以选用很多种模型,功能丰富。还能自己微调模型、使用插件。
- 几乎没有内容管制,自由度高。
- 缺点:
- 需要自己安装软件、配置环境。
- 一般用户没有高规格的电脑,导致 AIGC 速度慢。
- 对策:购买云平台的 VPS ,按小时付费。这样价格不贵,又能短时间使用高规格的电脑。
- 优点:
- 可以编写 Python 代码,调用模型的 API 。
使用什么样的电脑,才能提升 AI 绘图的性能?
- 使用更高规格的显卡,可以大幅提高 AIGC 的速度。
- CPU、内存的规格,足够用即可,不用太高。毕竟 AIGC 的主要负载集中在显卡。
- 如果 CPU、内存的使用率超过 80% ,则可能不够用,可以提升规格。
- 如果 CPU、内存的使用率低于 80% ,则大概率够用,提升规格也只能闲置。
- 使用 SSD 硬盘,加快读写文件的速度。
- 升级 CUDA、pytorch 等软件的版本,可能获得小幅的性能优化。
- 使用 Windows 或 Linux 操作系统,性能几乎相同。
- 在 AIGC 技术流行之前,购买 Nvidia 显卡的大部分用户,是为了在 Windows 系统上玩游戏。因此 Nvidia 公司对 Windows 系统做了很多适配、优化。
- 但不考虑玩游戏的话, Nvidia 显卡在 Windows 与 Linux 操作系统的性能几乎相同。
# ComfyUI
- 2023 年, Stability AI 公司的一位开发者,在 GitHub 上开源了 ComfyUI 项目。
- Github (opens new window)
- 官方教程 (opens new window)
- ComfyUI 采用 Python 语言开发,以 Web 服务器的形式运行。
# 部署
部署命令:
# 下载 ComfyUI 源代码 git clone https://github.com/comfyanonymous/ComfyUI cd ComfyUI # 安装特定版本的 torch (启用了 CUDA ,适配 python3.13 ) # 还需要升级 Nvidia 显卡驱动到最新版本,以免不兼容 pip install torch torchvision torchaudio -i https://pypi.tuna.tsinghua.edu.cn/simple --extra-index-url https://download.pytorch.org/whl/cu130 # 安装其它依赖 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple # 启动,然后访问网站 http://127.0.0.1:8188/ python main.py可以再安装一些自定义节点,作为插件:
- ComfyUI-Manager (opens new window)
- 用于自动下载模型、安装自定义节点。
- ComfyUI-GGUF (opens new window)
- 可以基于 GGUF 量化技术,缩小某个模型中的 Unet 模块,然后用 ComfyUI-GGUF 节点加载该模型。不过还要加载 CLIP、VAE ,才能组成一个完整的 workflow 。
- 参考教程: https://www.nextdiffusion.ai/tutorials/how-to-run-flux-dev-gguf-in-comfyui-low-vram-guide (opens new window)
- ComfyUI-Manager (opens new window)
# 工作流
在 ComfyUI 网页上,用户可以添加多个节点(node),依次执行,组成一个工作流(workflow)。
如何配置 workflow ?
- 初学者难以亲自配置一个 workflow ,建议使用 ComfyUI 网页上的 workflow 模板,从而快速开始 AI 绘图。
- 打开 workflow 模板时,会自动提示用户,应该下载哪个模型文件,保存到哪个磁盘目录。
- 可以参考网络上别人分享的 prompt、steps 等参数,或者询问 chatgpt 。
- https://docs.comfy.org/zh-CN/tutorials/basic/text-to-image (opens new window) 讲解了一些 workflow 的用法、原理。
- https://registry.comfy.org/ (opens new window) 网站上分享了一些社区用户的 workflow ,可供下载。
- 初学者难以亲自配置一个 workflow ,建议使用 ComfyUI 网页上的 workflow 模板,从而快速开始 AI 绘图。
如何保存 workflow ?
- 可以保存为 JSON 格式的文件。
- SaveImage 节点生成的图片,默认采用 PNG 图片格式,并且在图片的 tEXt 区块中嵌入 JSON 格式的 workflow 。
- 这样的优点是,用户将该图片拖动到 ComfyUI 网页中,就会自动导入 workflow 。
- 这样的缺点是,会增加图片体积。
例:一个文生图的 workflow
- 用户输入 prompt 。
- 由 Text Encoder ,将 prompt 转换成特征向量。
- 由 VAE Image Encoder ,将一张随机的马赛克图片,映射到低维的潜在空间(Latent Space)。
- 比如马赛克图片原本是 1024x1024 分辨率,有损压缩到 64×64 分辨率,丢失不重要的细节,这样能大幅减少运算量。
- 由采样器,根据 prompt 特征向量,将 Latent Space 中的马赛克图片,进行多次降噪(denoise)。
- 例如 prompt 描述画面中存在一朵红花,于是模型就将马赛克图片中一团模糊的红色像素点,降噪为清晰的像素点,看起来像红花。
- 由 VAE Image Decoder ,将 Latent Space 中的低维图片,转换成正常图片,显示给用户看。
- 通常只显示最后一次降噪之后的图片。
- 用户也可以在中间某次降噪使用 VAE Image Decoder ,从而预览中间图片。
ComfyUI 网页上的常用快捷键:
Ctrl + C # 复制 Ctrl + V # 粘贴 Ctrl + Z # 撤销 Ctrl + Y # 重做 Ctrl + S # 保存 workflow Ctrl + O # 打开 workflow Space # 按住空格键,此时网页会进入只读模式,鼠标点击只能拖拽画布 Ctrl # 按住 Ctrl 之后,可以鼠标多次点击,同时选中多个节点。也可以鼠标拖选一个方框,同时选中多个节点 # 另外,鼠标按住 Group 标题栏的情况下,再按住 Ctrl ,就可以移动 Group 方框 Ctrl + Enter # 开始执行 workflow Ctrl + G # 可以选中多个节点,按快捷键来创建一个 group 。然后给该 group 命名,比如 "step 1" Ctrl + B # 可以选中一个节点,按快捷键来 bypass 绕过它,使得 workflow 执行到该节点时会跳过,相当于编程中的注释 Ctrl + M # 可以选中一个节点,按快捷键来 mute 禁用它,使得 workflow 执行到该节点时会暂停,相当于编程中的断点
# 节点
节点是 ComfyUI 设计的一种功能模块,相当于编程中的一个函数。
- 用户可以从左侧菜单栏,点击新建一个节点。也可以在画布上双击鼠标,打开节点的搜索框,然后新建节点。
- 例如有的节点负责加载模型,有的节点负责输入 prompt 。
- 一个节点在网页上显示为一个图框,用户可以用鼠标拖动,进行可视化配置。
- 节点左上角的圆点,表示最小化,只显示节点的标题栏。
- 节点左侧的圆点表示数据输入端,节点右侧的圆点表示数据输出端。
- 可以在两个节点的端点之间连线,控制数据的输入、输出方向。
- 端点分为多种颜色,某种颜色的输出端,只能连线到同种颜色的输入端。
- 一个输入端,同时只能连线一个输出端。换句话说,同时只能存在一个输入源。
- 一个输出端,同时可以连线多个输入端。
- 用户可以从左侧菜单栏,点击新建一个节点。也可以在画布上双击鼠标,打开节点的搜索框,然后新建节点。
例如 LoadImage 是一个 ComfyUI 官方制作的节点,属于 comfy-core 。
- 用户可以在 ComfyUI 网页上传一个图片文件,被 LoadImage 节点加载之后,交给模型处理。
- 用户可以在 SaveImage 节点上,右键复制图片,然后在 LoadImage 节点上,右键粘贴图片,从而快速修改图片。
- 用于 inpainting 重绘:
- 可以在 LoadImage 节点的右键菜单中,点击 'Open in MaskEditor' ,打开遮罩编辑器。
- 遮罩是一个灰度图层,覆盖在原图片之上,表示原图片的哪些区域允许被模型绘制。
- 遮罩中,每个像素点的灰度值为 0~255 ,表示允许模型重绘的幅度。例如纯黑色(灰度值为 0 )表示完全禁止模型重绘。
- 可以将 LoadImage 节点的 Mask 输出端,连线到 MaskPreview 节点,从而预览遮罩。
- 用于 outpainting 扩图:
- 可以在 LoadImage 节点之后添加 ImagePadForOutpaint 节点,在原图片的四周添加遮罩区域。然后,让模型绘制这些区域。
例如 KSampler 是一个常用的采样器,配置参数如下:
- model
- :采用哪种模型来负责降噪。
- seed
- :随机数种子,它决定了生成什么样的随机数。例如生成初始的马赛克图片时,要使用随机数。
- 如果多次进行 AIGC ,并且保持 prompt、seed 等配置参数不变,则每次生成的最终图片都会一模一样。
- control_after_generate
- :每次 AIGC 之后,如何修改 seed 取值。
- 有多种取值:
randomize # 随机取值 increment # 递增 1 decrement # 递减 1 fixed # 固定
- steps
- :进行多少次降噪。
- 降噪次数越多,耗时越久。
- 例如 SD 模型,通常需要 30 次降噪。
- 第 1~5 次降噪,会让图片中模糊的马赛克,逐步变成清楚的图像。
- 第 5~15 次降噪,图片的主要内容不变,会调整图案轮廓、颜色等细节。
- 第 15~30 次降噪,会小幅调整图片细节,使图片更符合 prompt 。
- 继续增加降噪次数,会随机地小幅修改图片,但不会提升图片质量。
- 有的模型只使用 1024x1024 分辨率的图片数据集进行训练,学习如何降噪。因此原生支持生成 1024x1024 分辨率的图片,不擅长生成更高分辨率的图片,除非使用插件。
- cfg (Classifier Free Guidance,无分类的引导)
- :引导每次降噪时,对 prompt 的重视程度。
- 取值范围为
0.0 ~ 100.0,建议取值为 4~7 。- 取值越大,生成的图片越符合 prompt 。
- 取值为 1~4 时,模型容易自由发挥,生成的图片不怎么符合 prompt 。
- 取值为 5~9 时,生成的图片挺符合 prompt 。
- 继续增加取值,生成的图片会严重锐化、图案扭曲。
- sampler
- :降噪时,采用哪种采样器算法。
- 如果保持 prompt、steps 等参数不变,只修改 sampler 或 scheduler ,
- 则会影响运算耗时、生成图片的质量,还可能小幅修改图案轮廓。
- 不会改变图片构图、颜色分布,因为这主要由 prompt 和 seed 决定。
- 常见取值:
euler # 经典的欧拉算法,很常用。但遗留了一些噪声,导致图片模糊、细节粗糙 heun # 改进了 euler 算法,减少了图片细节的噪声,使得图片清晰。但耗时大概是 euler 的 2 倍 ddim # 一个传统算法,与 euler 效果差不多 dpm_2 # 使得图片清晰、图案边缘锐利,适合写实风格的图片。但耗时大概是 euler 的 2 倍 dpm_fast # 耗时是 dpm_2 的一半。但遗留较多噪声,导致图片的细节粗糙,需要更多 step 来降噪
- scheduler
- :降噪时,采用哪种调度器算法。这会决定每个 step 的降噪数量。
- 常见取值:
simple # 让噪声呈线性减少,每个 step 去除相同数量的噪声。这样均匀降噪,图片质量稳定 normal # 前期 step 降噪少,中期 step 降噪多,后期 step 降噪少。这样平滑地降噪,使得图案边缘柔和 exponential # 让噪声呈指数级减少,第一个 step 去除很多噪声,后面 step 去除越来越少的噪声。这样有利于减少 steps 总数,但是容易丢失图像细节
- denoise
- :整个降噪过程,去除多少比例的噪声。
- 取值范围为
0.00 ~ 1.00,建议赋值为 1 。- 取值越小,降噪越少,生成的图片越接近初始的图片。
- model
# 模型
网络上存在很多种 AI 算法模型,由不同的公司或个人发布。
- 有的模型是闭源的,只提供了 API ,供用户调用。
- 有的模型是开源的,用户可以下载模型文件,在自己电脑上运行。
可以从以下渠道下载模型:
- HuggingFace (opens new window)
- :一个 Web 平台,供人们分享机器学习的 Git 仓库、模型文件、数据集。
- 模型文件分为几种扩展名:
- .safetensors
- :这是 HuggingFace 推出的一种格式,在文件中保存了 tensor (张量)格式的权重参数,不包含可执行代码,因此安全。
- .pt 或 .pth
- :用 PyTorch 训练模型时,可以调用
torch.save(t, 'checkpoint.pt'),将 torch 对象(包括权重参数)保存为一个磁盘文件。 - 这种文件,本质上是将 Python 代码,通过 pickle 库进行序列化,然后写入磁盘文件。可能包含危险代码,因此存在安全风险。
- :用 PyTorch 训练模型时,可以调用
- .bin
- :这不是一种通用的模型文件格式。扩展名 .bin 表示该文件存储了二进制数据,但不确定具体包含什么数据、能被什么软件加载。
- .safetensors
- 可以在网页上点击下载模型,也可以用命令行下载:
pip3 install huggingface_hub hf download openai/gpt-oss-20b --local-dir gpt-oss-20b
- ModelScope (opens new window)
- :一个 Web 平台,由中国的阿里巴巴公司推出,对标 HuggingFace 平台。
- CivitAI (opens new window)
- :一个 Web 平台,供人们分享 AIGC 的图片、视频,以及相关模型。
- HuggingFace (opens new window)
# 分类
根据擅长用途的不同,可将模型分为几类:
- 图像生成
- text-to-image
- :输入一段 prompt ,输出一张图片。
- image-to-image
- :输入几张图片、一段 prompt ,输出一张图片。
- image-edit
- :输入一张图片、一段 prompt ,输出一张图片。
- inpainting
- :重绘图片的内容。
- 用户在图片中选取一块区域(表示为遮罩),然后让模型修改这些区域。
- outpainting
- :扩展图片的内容。
- 用户在图片外围选取一些区域(表示为遮罩),然后让模型修改这些区域。
- upscale
- :放大图片。
- 如果用传统算法来放大,则图像容易有锯齿。
- 如果用模型来放大,则图像细节更精致,还能在放大的同时进行 inpainting、outpainting 。
- text-to-image
- 视频生成
- text-to-video
- image-to-video
- video-edit
- 音频生成
- 3D模型生成
- 图像生成
根据训练方案的不同,可将模型分为几类:
base
- 目前,一些大公司在进行技术竞赛,每隔几个月就发布一款能力强大的模型。
- 大公司拥有大量资金、人力,可以准备大量显卡服务器、海量数据集,来训练模型。
- 而小公司、个人开发者,缺乏资金、人力,难以独立做出一款强大的模型。
- 因此,他们通常以业界一流模型为基础(统称为 base 模型),进行一些微调(fine-tuning),做出一个稍微不同的模型。
- 目前,一些大公司在进行技术竞赛,每隔几个月就发布一款能力强大的模型。
LoRA (Low-Rank Adaptation,低秩适应)
- 它是一种微调技术,由 Microsoft 公司于 2021 年发布。
- 原理:
- 对 base 模型进行追加训练,修改少量权重参数。
- 然后将这些参数,作为一个低秩矩阵,附加到 base 模型上。
- 用法举例:
- 准备一个关于 CyberPunk 的数据集。
- 对 base 模型进行追加训练,生成一些新的权重参数,保存到一个文件,比如 lora-xx.safetensors 。
- 用户加载 base 模型文件,和 lora 文件。
- 用户编写 prompt : "a cat in CyberPunk" 。此时模型有了 lora ,就懂得关于 CyberPunk 的内容。
- 优点:
- base 模型通常重视通用能力,各个领域的能力都不错。但它在编程、绘图等领域,可能能力不足。此时可通过 lora 微调,提升模型在某个领域的能力。
- lora 权重参数的数量,通常小于 base 模型参数的 1% ,因此 lora 的训练成本远低于 base 模型。
- 缺点:
- lora 并不是将 base 模型缩小了,而是追加更新。因此 lora 文件不能独立使用,必须附加在 base 模型之上,才能工作。
Textual Inversion (文本反演)
- 它是一种微调技术,由 Google 公司于 2022 年发布。
- 原理:
- 对 base 模型进行追加训练,生成一些新的 embedding 向量,使得模型懂得一些新概念。
- 用法举例:
- 准备一些带有描述文字 CyberPunk 的图片。
- 训练 base 模型,让它分析上述图片,生成新的 embedding 向量并记录到一个文件。
- 用户加载 base 模型文件,和 embedding 文件。
- 用户编写 prompt : "a cat in CyberPunk" 。此时模型会调用新的 embedding 向量,生成符合 CyberPunk 的图片。
DreamBooth
- 它是一种微调技术,由 Google 公司于 2022 年发布。
- 它用于模仿照相亭(photo booth)的效果:记住一个人物的外貌,将他 P 图嵌入各种风格的图片。
- 换句话说, DreamBooth 是让模型记住特定一个人物的外貌,成为这个人物的专用模型。
- 如果不使用 DreamBooth 方案,直接按 text-to-image 方式,为特定一个人物绘制图片。则需要详细描述身高、五官、皮肤等外貌特征,勉强才能让绘制的图片看起来像这个人物。
ControlNet
- 它是 2023 年为 Stable Diffusion 模型设计的一种微调技术,用于控制 UNet 降噪的图片结构。
- 用法举例:
- 社区开发者们,训练了一些 ControlNet 模型。
- 用户加载 Stable Diffusion 模型文件。再加载 ControlNet 文件,它会合并到 Stable Diffusion 模型的 UNet 模块。
- 用户给模型输入 prompt 的同时,再输入一个提示图片(可以手绘),比如轮廓边缘图、人物姿态图、空间深度图,从而控制生成的图片结构。
LCM(Latent Consistency Model,潜在一致性模型)
- 它是一种基于 LoRA 的微调技术,用于大幅加快 Stable Diffusion 的生图速度。
- 用法举例:
- 开发者用 Stable Diffusion 模型,经过 30 个 step 的降噪,生成图片。
- 基于 LoRA 训练 Stable Diffusion 模型,让它学习如何从任意一个 step ,直接一步降噪到最终图片。
- 实际上,很难只经过一步降噪,就生成最终图片。
- 但模型能学会一些捷径,只经过 2~4 个 step ,就生成原来经过 30 个 step 才能生成的图片。
- 上述训练,会生成一些新的权重参数,保存到一个文件,比如 lcm-xx.safetensors ,然后像 lora 文件一样被用户加载。
- 缺点:
- 大幅减少了降噪的 steps ,因此出图更加不稳定,更容易丢失细节。
- 优点:
- 即使出图质量降低一些,但也能满足许多用户的需求。
# 显存
运行模型时,常见的一个问题是:显存不足
- 如果一个模型的文件体积,超过 GPU 的显存容量,则整个模型不能加载到显存中,不能被 GPU 开始运行。
- 运行模型的过程中,还可能占用更多显存。如果 GPU 的显存耗尽,则会报错 OOM 。
为了避免显存不足,人们研究了多种方案,来降低模型的文件体积。
- Quantization (量化)
- :存储模型的权重参数时,采用更小的数据类型。
- 数据类型举例:
FP32 # 32 bit float FP16 # 16 bit float 。用 1 bit 存储正负号、 5 bit 存储指数, 10 bit 存储小数 BF16 # 16 bit float 。由 Google 公司设计,使用 8 bit 存储指数,因此可以表示更大数量级。使用 7 bit 存储小数,因此精度更低 Q16 # 16 bit float Q8 # 8 bit int Q4 # 4 bit int Q2 # 2 bit int - 优点:
- 不需要重新训练模型,就可以导出不同量化尺寸的模型文件。
- 大幅减少模型的文件体积、运算耗时。
- 几乎不改变模型的结构逻辑,只是降低了权重参数的精度,也就是增加了模型生成结果的随机性。
- 缺点:
- 如果将所有权重参数,统一降低精度,则模型的生成结果会很糟糕。因此需要研究,哪些权重参数可以降低精度,哪些权重参数不能降低精度。
- 例如 llama.cpp 项目发布了 GGUF 文件格式,用于支持量化模型。
- Model Merging
- :将 LoRA 等追加训练的权重参数,合并到 base 模型中。
- 优点:
- 用户只需加载一个模型文件。
- 缺点:
- 几乎不能减少模型的文件体积、运算耗时。
- Pruning (剪枝)
- :删掉模型中一些不重要的权重参数。
- Distillation (蒸馏)
- :基于原模型,训练一个小模型,让小模型掌握原模型的知识、能力。
- 这需要重新训练一个小模型,可能采用特殊的训练方法。
- 例如 GPT-4-Turbo 是 GPT-4 的蒸馏版本。
- Quantization (量化)
为了避免显存不足,人们研究了多种方案,来扩展显卡的显存。
- Unified Memory
- :将模型的一部分内容,存储在主机内存中。等要使用时,才将这些内容拷贝到显存中。
- 假设一个电脑拥有 16G 内存、8G 显存,可以将 8G 内存用作虚拟显存,这样总显存就有 16G 。
- 优点:
- 容易实现,不需要修改模型文件、运行时代码。
- 缺点:
- 需要将主机内存中的大量数据,拷贝到显存中。这会增加模型的运行耗时。
- 拷贝时要通过 PCIe 接口,通信带宽只有几十 GB/s 。
- 需要将主机内存中的大量数据,拷贝到显存中。这会增加模型的运行耗时。
- :将模型的一部分内容,存储在主机内存中。等要使用时,才将这些内容拷贝到显存中。
- Tensor Parallel (张量并行)
- 原理:
- 将一个模型每个 layer 的张量,分割为 N 份,分别由 N 张显卡加载。
- 多张显卡并行工作,模拟一张巨型显卡。
- 即使每张显卡的显存小于模型体积,多张显卡合并在一起,总显存就能超过模型体积。
- 优点:
- 不需要修改模型文件,只需要修改运行时代码,用 Tensor Parallel 技术将模型加载到多张显卡中。
- 例如基于 vllm 框架,并行使用 2 张显卡:
python -m vllm.entrypoints.api_server --model llama-70b --tensor-parallel-size 2
- 例如基于 vllm 框架,并行使用 2 张显卡:
- 不需要修改模型文件,只需要修改运行时代码,用 Tensor Parallel 技术将模型加载到多张显卡中。
- 缺点:
- 需要在显卡之间进行大量网络通信,增加模型的运行耗时。
- 建议将这多张显卡,安装到同一个物理主机。
- 建议通过 NVLink 接口在显卡之间直接通信,通信带宽比 PCIe 接口快十倍。
- 需要在显卡之间进行大量网络通信,增加模型的运行耗时。
- 原理:
- Pipeline Parallelism (流水线并行)
- 原理:
- 将一个模型的全部 M 个 layer ,分为 N 份,分别由 N 张显卡加载。
- 多张显卡串行工作。
- 比如先由 GPU0 执行第 0~3 个 layer ,然后由 GPU1 执行第 4~7 个 layer 。
- 优点:
- 不需要修改模型文件,只需要修改运行时代码。
- 缺点:
- 同时只有一张显卡忙碌工作,而其它显卡空闲等待,浪费资源。
- 对策:当模型的上一个任务还没执行完毕时,就让模型执行下一个任务,使得各个显卡都忙碌工作。比如:
- GPU0 执行第 1 个任务,此时 GPU1 空闲等待。
- GPU0 执行第 2 个任务,此时 GPU1 执行第 1 个任务。
- 对策:当模型的上一个任务还没执行完毕时,就让模型执行下一个任务,使得各个显卡都忙碌工作。比如:
- 需要在显卡之间进行大量网络通信,增加模型的运行耗时。
- 比如 GPU0 执行完第 0~3 个 layer 之后,需要将大量数据传递给 GPU1 。
- 同时只有一张显卡忙碌工作,而其它显卡空闲等待,浪费资源。
- 原理:
- Unified Memory
# embedding
embedding (嵌入)是什么?
- 数学中, embedding 操作,是指将 A 空间的一个拓扑结构,映射到 B 空间,并且保留其结构特征。
- 深度学习中, embedding 操作,是指将现实世界的一个概念,映射到向量空间,表示为一个特征向量(feature vector),又称为 embedding vector 。
- 例如,用户给模型输入的 prompt ,需要转换成 embedding vector 。
- 为什么要进行 embedding 操作?因为计算机擅长分析数字、进行数学运算,不擅长直接分析人类的文字。
- 假设将以下概念,转换为特征向量:
cat -> [0.1, -0.8, 0.7, …] dog -> [0.1, -0.8, 0.2, …] apple -> [-0.3, 0.9, -0.2, …]- 计算机会按某种算法,分析现实事物的各种特征,转换为特征向量。比如提取形状特征为一个数字,提取颜色特征为另一个数字。
- 计算机不是人类,不懂 cat、dog、apple 分别是什么事物。但是计算机能分析数字,发现 cat 与 dog 的特征向量相似,因此推测 cat 与 dog 是两个相似的事物。
例如 CLIP(Contrastive Language Image Pre-training)是一款擅长 embedding 的模型。
- 它是 OpenAI 公司于 2021 年发布的一款模型。
- 它的训练原理如下:
- 让模型的 Image Encoder ,分析大量动物的图片,随机映射向量。
- 让模型的 Text Encoder ,分析上述各个图片的描述文字,转换成特征向量。
- 多次尝试上述操作,让模型自动学习,直到模型能让每个图片的特征向量,与其描述文字的特征向量,在数学上相似。
- 例如,用户输入一段描述猫的文字时,模型能从一堆图片中找出特征向量最相似的一张图片。换句话说,模型能辨认图片中的猫。
- 继续训练模型,分析海量事物的图片、描述文字。直到模型能辨认图片中的各种事物。
- 它的用途:
- 常用于分析一张图片,是否匹配某段描述文字,并衡量匹配程度有多高。
- 不能根据文字生成图片,也不能根据图片生成文字,因为它只有 encoder (将媒体内容编码为特征向量),没有 decoder (将特征向量解码为媒体内容)。
# 常见模型
Stable Diffusion
- 2022 年,英国公司 Stability AI 发布一款名为 Stable Diffusion 的模型,可以生成很逼真的图像,推动了 AI 绘图技术的流行。
- 它的主要模块:
- Text Encoder
- 负责将 prompt 转换成 embedding 向量。
- UNet (U-shaped Convolutional Neural Network,U 形卷积神经网络)
- 负责在 Latent Space 中对图片降噪。
- VAE
- 负责将图片映射到 Latent Space 。
- Text Encoder
- Stable Diffusion 简称为 SD ,存在多个版本:
- v1.5
- 于 2022 年发布,被许多开发者用作 base 模型。
- 使用 512×512 分辨率的图片数据集进行训练。
- Text Encoder 采用 OpenAI 公司的 CLIP 模型,包含几亿参数。
- prompt 通常写作一组标签词汇,用逗号分隔,零散地描述图片。例如:
best quality, girl, white dress, (fantasy style:1.4) # 可用括号,强调一个标签的权重 # 最多解读 77 个 token ,过多的 token 会被忽略
- v2.0
- 于 2022 年发布。
- Text Encoder 改用 LAION 团队训练的 OpenCLIP 模型。这个模型包含几十亿参数,但 prompt 风格变化,让一些用户不适应。
- XL 1.0
- 于 2023 年发布。
- 使用 1024x1024 分辨率的图片数据集进行训练。
- Text Encoder 采用两个模型: OpenAI CLIP 和 OpenCLIP 。两个模型同时工作,从两个角度分析 prompt 。
- UNet 模块采用两个模型:
- 前面一些降噪 steps ,用 SDXL Base 生成图像的大概内容。
- 后面一些降噪 steps ,用 SDXL Refiner UNet 调整图像的细节。
- prompt 通常写作一个自然语言的句子。例如:
A girl in a white dress is reading a book. # OpenAI CLIP 最多解读 77 个 token # OpenCLIP 最多解读 256 个 token # 因此,第 78~256 个 token ,会被 OpenAI CLIP 忽略,会被 OpenCLIP 解读
- v3
- 于 2024 年发布。
- v1.5
DreamShaper
- 它是由社区用户 Lykon 基于 Stable Diffusion v1.5 微调的一个模型。
- 它用于 text-to-image ,擅长生成动漫图片、3D 油画。
Flux
- 它是由德国公司 Black Forest Labs 于 2025 年发布的一款模型。
- 它用于 image-to-image、image-edit ,擅长生成写实照片。
- prompt 支持最多 512 tokens 。
- 使用 flux 模型时,通常将 Ksampler 的 cfg 参数设置为 1.0 ,从而禁用传统的 cfg 算法,只采用 flux 内置的引导算法。
- 可以添加一个 Flux Guidance 节点,调整 flux 内部的引导参数。
# Prompt
如何写 prompt ?
- 可以到网上参考别人的 prompt ,然后尝试修改。
- 可以让 AI 帮忙写详细的 prompt 。
- 不同模型的 prompt 存在风格、字数等差异,难以通用。
如何生成特定画风的图片?
- 可以在 prompt 中,要求画风。
- 比如想要某个画家的画风、想要某个年代的流行画风。
- 但是有的模型,只用了动漫风格的图片数据集进行训练,因此不懂得生成真人风格的图片。用 prompt 也不能让模型生成它没学过的画风。
- 可以采用特定风格的模型。
- 比如有的模型,专门用动漫风格的图片数据集进行训练,因此擅长生成动漫风格的图片,不擅长生成真人风格的图片。
- 可以在 prompt 中,要求画风。