置顶|本站文章索引
生成式人工智能
Flow-based Models
笔记|Normalizing
Flow 理论与实现(一)基础理论
笔记|扩散模型(一八)Flow
Matching 理论详解
Diffusion Models:通用理论
笔记|扩散模型(一)DDPM
理论与实现
笔记|扩散模型(二)DDIM
理论与实现
笔记|扩散模型(三)Improved
DDPM 理论与实现
笔记|扩散模型(四)Classifier
Guidance 理论与实现
笔记|扩散模型(五)Classifier-Free
Guidance 理论与实现
笔记|扩散模型(一七)扩散模型中的
Velocity Prediction
Diffusion Models:文生图
笔记|扩散模型(六)DALL-E
理论与实现|自回归文生图
笔记|扩散模型(七)Latent
Diffusion Models(Stable Diffusion)理论与实现
笔记|扩散模型(八)DALL-E
2 (unCLIP) 理论与实现
笔记|扩散模型(九)Imagen
理论与实现
笔记|扩散模型(一〇)Dreambooth
理论与实现|主题驱动 ...
笔记|大模型训练(三)数据并行与相关优化策略
本学习笔记是对 nanotron/ultrascale-playbook
的学习记录,该书涵盖分布式训练、并行技术以及一些优化策略。本文章是该系列笔记的第三篇,对应原书
Data Parallelism 一章的前半部分。
数据并行(Data Parallelism, DP)的核心思想是把模型复制到多个 GPU
上(可以把这些副本称为模型实例),并在每个 GPU 上并行地对不同的
micro-batch
进行前向和反向传播——这也是「数据并行」这个名称的来源。尽管这个方法已经非常常见,但在本节中我们将会更深入地探讨这一内容。
在每个 GPU 上使用不同的 micro-batch 意味着每个 GPU
上的梯度也各不相同。因此,为了保证不同 GPU
上的模型实例相互同步,我们需要使用 all-reduce
操作来平均来自所有模型实例的梯度。这个操作发生在反向传播期间、优化器执行更新之前。
一个朴素的数据并行实现会等待反向传播完成后获得所有的梯度,然后对所有的
DP 节点出发一次 all-reduce
来同步梯度。但这种先计算后通信的串行步骤是一个大忌,因为 GPU
在通信期间会处于空闲 ...
笔记|大模型训练(二)并行编程快速入门
本学习笔记是对 nanotron/ultrascale-playbook
的学习记录,该书涵盖分布式训练、并行技术以及一些优化策略。本文章是该系列笔记的第二篇,对应原书附录
A0: Parallel Programming Crash Course 一章。
后续会开始学习分布式训练相关知识,为此需要在机器之间进行权重、梯度以及数据的通信和同步。为了实现这一目标需要使用一些并行编程操作,例如
broadcast、all reduce、scatter
等,首先对这部分进行介绍,如果读者已经对这部分的内容比较熟悉,可以直接跳过本篇内容。
一般情况下,训练时会有多个独立的节点,这些节点可以是 CPU
核心,也可以是 GPU
或者其他节点。每个节点分别执行一些计算,然后将其结果同步到其他的节点或将这些结果全部相加来得到总体结果,如下图所示。通常来说会有一个地位较高的节点来扮演核心的角色,这里用根节点来表示,这个节点是这些操作的目标或者源头。
Broadcast/广播
首先是最简单的广播操作。想像这样一个场景:你在节点 1
上初始化了一些数据,现在你希望将这些数据发送给所有的其他节点,以便这 ...
笔记|大模型训练(一)单卡训练的分析与优化策略
本学习笔记是对 nanotron/ultrascale-playbook
的学习记录,该书涵盖分布式训练、并行技术以及一些优化策略。本文章是该系列笔记的第一篇,对应原书
First Steps: Training on One GPU 一章。
在开始学习分布式训练前,不妨先快速回顾一下模型训练的基础知识。在单
GPU 上训练模型时,训练通常包含三个步骤:
前向传播:将输入传递至模型并产生输出;
反向传播:进行梯度计算;
优化步骤:根据计算出的梯度对模型的参数进行更新。
总体上来说可以用下图表示。图中第一行和最后一行的紫色框可以看作模型的不同层,黑色箭头表示了这些层的连接关系。在训练时,首先对输入进行前向传播(青色箭头),随后反向传播计算梯度(橙色箭头)。使用得到的梯度对模型的参数进行更新,可以得到优化过的模型。
在模型训练过程中,batch size
是最重要的超参数之一,其影响模型训练的收敛速度以及吞吐量。具体来说,在训练初期,较小的
batch size
可以帮助模型快速地到达最佳的学习位置,然而随着训练的进行,小的 batch
size
会导致梯度含有比较多的噪声,最终 ...
技术相关|使用 Certbot 为通配符域名签发 SSL 证书
近期在腾讯云给 OSS
配置了自定义域名,并且因为我有两个桶,所以配置了两个不同的子域名。又为了让文件能支持
HTTPS 访问,需要在腾讯云后台给域名配置 SSL 证书。但非常坑的是腾讯云的
SSL 证书不仅需要花钱买而且非常贵,因此为了节能减排最后我选择在 Let's
Encrypt 自己签发一个证书。
Let's Encrypt 推荐的客户端是
Certbot,而为了让多个子域名都能使用同一个证书,需要为通配符域名(也就是一个类似
*.my-domain.com 形式的域名)签发证书,这需要使用 DNS-01
模式进行签发。
从具体操作来说,首先需要访问 Certbot
的官方网站并且选择正确的选项。对于我来说,我并不需要在本地部署证书,因此我选的是
My HTTP website is running Other on Linux
(snap)。选择之后一步步跟着官方的教程安装
certbot,对于我来说命令是下边这些,其他系统的命令可能有所不同:
123sudo apt-get remove certbotsudo snap install --classic certbots ...
开发记录|基于 CogVideoX 实现 DDIM Inversion
近期正在基于 CogVideoX
实现一些视频编辑相关的功能,然而在尝试的时候发现了一个比较奇怪的问题:CogVideoX
无法直接使用和 Stable Diffusion 类似的方式实现 DDIM Inversion。
使用 DDIM 对扩散模型进行采样时,会形成一条「轨迹」。DDIM Inversion
就是从一条现有的视频出发,沿着这条轨迹逆向返回得到最初的噪声的过程。由于
DDIM
采样是确定性的过程,所以从这个得到的噪声出发再重新进行采样,应当能够得到原始视频;如果在采样过程中改变一些控制条件(例如修改视频描述)就可以实现对原始视频的编辑。
为了在 CogVideoX 上实现 DDIM Inversion,最初我的实现大概是这样:
123456789101112131415pipeline = CogVideoXPipeline.from_pretrained(model_path)original_scheduler = pipeline.schedulerinverse_scheduler = DDIMInverseScheduler(**original_schedul ...
笔记|扩散模型(一八)Flow Matching 理论详解
论文链接:Flow
Matching for Generative Modeling
在 Stable Diffusion 3 中,模型是通过 Flow Matching
的方法训练的。从这个方法的名字来看,就知道它和 Flow-based Model
有比较强的关联,因此在正式开始介绍这个方法之前先交代一些 Flow-based
Model 相关的背景知识。
Flow-based Models
Normalizing Flow
Normalizing Flow
是一种基于变换对概率分布进行建模的模型,其通过一系列离散且可逆的变换实现任意分布与先验分布(例如标准高斯分布)之间的相互转换。在
Normalizing Flow
训练完成后,就可以直接从高斯分布中进行采样,并通过逆变换得到原始分布中的样本,实现生成的过程。(有关
Normalizing Flow 的详细理论介绍可以移步我的这篇文章观看)
从这个角度看,Normalizing Flow 和 Diffusion Model
是有一些相通的,其做法的对比如下表所示。从表中可以看到,两者大致的过程是非常类似的,尽管依然有些地方不 ...
笔记|扩散模型(一七)扩散模型中的 Velocity Prediction
论文链接:Progressive
Distillation for Fast Sampling of Diffusion Models
近期在研究 Rectified Flow 时发现 diffusers 中一个相关的 PR(#5397)训练用到了
Velocity
Prediction,回想起之前某次面试还被问到了这个问题,决定来学习一下这究竟是什么东西。
对 CompVis 实现的 Stable Diffusion 代码比较熟悉的读者应该或多或少都在
scheduler 中读到过这样一段代码:
123456if self.parameterization == "eps": target = noiseelif self.parameterization == "x0": target = x_startelif self.parameterization == "v": target = self.get_v(x_start, noise, t)
这是在计算损失时,也就是 p_loss
函数中的几种 ...
笔记|扩散模型(一六)CogVideoX 论文解读|文生视频扩散模型
CogVideoX 是智谱近期发布的视频生成模型,和上一个工作 CogVideo
不同,这个方法是基于扩散模型实现的。从框架图来看,感觉 CogVideoX
同时吸取了 Sora 和 Stable Diffusion 3 的优势,不仅使用了 3D
VAE,还引入了双路 DiT 的架构。
具体来说,CogVideoX 主要进行了以下几个方面的工作:
使用 3D VAE 编码视频,有效地压缩视频维度、保证视频的连续性;
引入双路 DiT 分别对文本和视频进行编码,并用 3D attention
进行信息交换;
开发了一个视频标注的 pipeline,用于对视频给出准确的文本标注;
提出了一种渐进式训练方法和一种均匀采样方法。
CogVideoX
CogVideoX 的整体架构如下图所示,文本和视频分别经过文本编码器(这里是
T5)和 3D VAE
编码后输入主干网络。文本和视频分别经过一条支路,并在注意力部分进行交互。
3D Causal VAE
由于视频相比图像多了时序信息,所以需要对多出来的时间维度进行处理。先前的视频生成模型都采用
2D
VAE,这样会导致生成的视频在时间上连续 ...
笔记|扩散模型(一五)CogVideo 论文解读|文生视频大模型
论文链接:CogVideo:
Large-scale Pretraining for Text-to-Video Generation via
Transformers
官方实现:THUDM/CogVideo(由于目前的仓库里,CogVideo
相关的代码已经被替换为 CogVideoX 的代码,所以如果希望浏览 CogVideo
的代码,包含该方法代码最后一个 commit 为 5f914b7,也就是
这个链接)
和本系列中的 DALL-E 一样,虽然 CogVideo
也并非基于扩散模型的方法,但由于其后续工作 CogVideoX
是基于扩散模型的,所以这篇文章也放到扩散模型系列里。
CogVideo 是基于大规模预训练 Transformer
进行视频生成的工作,也是近期推出的 CogVideoX
的前身。相比于文生图任务,文生视频的主要难点在于两个方面:首先是数据更加稀缺,视频-文本配对数据比较少;其次是视频多了时序信息。
本模型基于文生图模型 CogView2 进行训练,在训练时使用了 5.4 M
视频-文本对数据。在训练时,文本条件是通过 in context
lea ...