基于 lucidrains/gigagan-pytorch v0.3.0 的 GigaGAN 复现项目。
论文:Scaling up GANs for Text-to-Image Synthesis (Kang et al., 2023)
gigagan-repro/
├── gigagan-pytorch/ # fork 的核心库(可编辑安装)
│ └── gigagan_pytorch/ # 模型定义 + 训练逻辑
├── scripts/ # 辅助脚本
│ └── download_dataset.py # 数据集下载/解压
├── data/ # 数据目录(已 gitignore)
├── dox/ # 文档
│ ├── architecture.md # 架构深度分析
│ ├── codebase.md # 代码结构与模块说明
│ └── modifications.md # 相对上游的修改记录
├── requirements-lock.txt # 依赖锁定
└── .gitignore
# Miniconda(若未安装)
# https://docs.conda.io/en/latest/miniconda.html
conda create -n gigagan python=3.10 -y
conda activate gigagan
pip install torch torchvision --index-url https://download.pytorch.org/whl/cu121
pip install -e ./gigagan-pytorch
pip install accelerate已有环境直接激活:
source /home/cwh/miniconda3/etc/profile.d/conda.sh
conda activate gigaganImageDataset 要求目录内 >100 张 图像(jpg/png)。
python scripts/download_dataset.py \
--from-zip /path/to/caltech-101.zip \
--output data/caltech101_flatpython scripts/download_dataset.py --dataset caltech101 --output data/caltech101_flat用 tmux 跑训练,关终端也不会给进程发 SIGHUP(只要别关 tmux 会话本身)。
tmux new -s gigagan-s gigagan 是会话名,可以随便改。
cd /home/cwh/gigagan-repro
source /home/cwh/miniconda3/etc/profile.d/conda.sh
conda activate gigagan
accelerate launch \
--multi_gpu --num_processes=8 --mixed_precision=no \
-m gigagan_pytorch.train \
--data_folder data/caltech101_flat \
--batch_size 2 --steps 100000 --grad_accum_every 4 \
--learning_rate 2e-4 --max_grad_norm 1.0 --no-amp \
2>&1 | tee train.log(在 tmux 里一般用 tee train.log 即可,不必再 nohup。)
按键:**Ctrl+b**,松开后按 **d**(detach)。
tmux attach -t gigagan若只有一个会话,也可以简写:
tmux a| 目的 | 命令 |
|---|---|
| 列出会话 | tmux ls |
| 杀掉会话 | tmux kill-session -t gigagan |
| 在会话里开新窗口 | Ctrl+b 再按 c |
| 切换窗口 | Ctrl+b 再按 0–9 或 n/p |
核心就三步:**tmux new -s 名字 → 跑命令 → Ctrl+b d 脱离**。
python -m gigagan_pytorch.train \
--data_folder data/caltech101_flat \
--steps 100 --grad_accum_every 4 --no-amp| 参数 | 默认值 | 说明 |
|---|---|---|
--data_folder |
必填 | 图像目录 |
--image_size |
256 | 生成图像分辨率 |
--batch_size |
1 | 每 GPU batch size |
--steps |
100 | 训练步数 |
--grad_accum_every |
8 | 梯度累积次数(等效 batch = batch_size × num_gpu × grad_accum) |
--learning_rate |
1e-4 | G 与 D 学习率 |
--max_grad_norm |
1.0 | 梯度裁剪范数(0 关闭) |
--no-amp / --amp |
默认开 | 建议 --no-amp,fp16 易 NaN |
--no-ema / --ema |
默认关 | EMA 生成器 |
| 标签 | 含义 | 健康范围 |
|---|---|---|
G |
Generator hinge loss | 0~10 |
MSG |
多尺度 Generator loss | 0~10 |
D |
Discriminator hinge loss | 0~10 |
MSD |
多尺度 Discriminator loss | 0~10 |
GP |
梯度惩罚 | 趋向 0 |
SSL |
辅助重建损失 | 趋向 0 |
VD / VG |
Vision-aided 判别/生成 | 无条件为 0 |
CL |
CLIP 对比损失 | 无条件为 0 |
MAL |
Matching Awareness | 无条件为 0 |
GAN 在 fp16 混合精度下极易 NaN(本项目实测 step 20 即全 NaN),原因是 hinge loss + gradient penalty 的二阶梯度超出 fp16 动态范围。
解决:使用 fp32(--mixed_precision=no --no-amp)+ 梯度裁剪(--max_grad_norm 1.0)。
上游 save_sample() 仅主进程执行,导致 DDP 步进不一致。本仓库已在 save_sample 后添加 wait_for_everyone() 同步。
详细分析见 [dox/](dox/) 目录: