目标是用 Camel 从零训练通用中英文文生图模型,数据处理、构建与训练均放在 ssh 88zjwei。下载可由本机中转。所有学习组件随机初始化,不使用预训练权重。完整目标、数据来源、能力缺口和验收条件见 从零训练说明。
参数类型与初始化现直接用 Camel 编写,通用树操作实现 Adam/EMA,不再生成参数源文件。二进制图像读写使用 Bytes;VAE、扩散的连续/恢复训练状态已逐字节比较,见 基础设施实测。
生产目标尚未完成。 已授权使用四张 RTX 3090(GPU 1、2、6、7),数据按百万至千万级有效图文对规划。当前已封存 COCO 2017 的 118,272 张训练图和 5,000 张验证图、共 616,692 条描述;完成 2,000 步 RGB64 VAE 基线,重建仍明显模糊;扩散目前只完成该数据索引上的 4 步流程验证,尚未进行正式长训。实测见 COCO 基线报告。下一阶段的数据、模型和四卡训练依赖见 生产训练计划。本机可下载后中转,数据处理与训练仍在服务器。 WIT 已开始获取真实中英文图片,接入步骤与审核边界见 图片数据流程。
当前主线为 完整小型潜空间模型:从零初始化的 VAE、文本 Transformer、4 层条件去噪 Transformer、BF16 矩阵乘和 FP32 Adam/EMA。此前使用 256 张分组划分的 CC0 图片验证流程,随后扩展到 COCO VAE 基线。生成质量仍未达到生产级要求。原 RGB64 和 MNIST 原型作为回归保留。
早期 MNIST 结果:已在远程 RTX 3090 上跑通训练和采样,背景噪点明显减少,但仍有断笔和块状接缝。 这个仓库首先是 Camel 能力与缺口的可复现实验。
最新 RGB 实验:批量注意力与恢复验证。MNIST 实验见 服务器验证记录。旧 MLP 基线见下方验证结果。 最新潜空间模型:混合精度、256 图训练与采样结果。
- train_vae.cml:从
main进入初始化/恢复、取批量、GPU 求梯度、Adam、EMA 和保存,理解实际完成 COCO 基线的训练入口。 - networks.cml:沿
ae_grad → ae_loss → encode_image/decode_image阅读 VAE,再沿ld_grad → noise_loss → predict_noise阅读文本条件扩散模型。 - train_latent.cml:查看图像编码、潜变量加噪、时间步和文本条件如何连进训练。
- parameters.cml 与 optim.cml:参数树、各层形状、随机初始化,以及通用 Adam/EMA 实现。
- latent_data.cml、sample_latent.cml 与 evaluate_latent.cml:批量与描述采样、生成和评估。
tools/latent.py 是宿主启动入口,当前一次启动由单个 Camel 进程完成全部目标更新。训练入口已接入 nn.save_tree/load_tree,由 Camel 原子发布模型、Adam、EMA、步数及数据/配置身份;Python 负责启动、锁和完整性校验。VAE 连续/恢复的 181 个状态文件、扩散的 349 个状态文件分别逐字节一致,迁移的 176 个 VAE 张量保持原始字节;采样和评估入口也已验证。见 原生检查点验证。短跑仅验证流程,不能证明生成质量。
服务器当前 .camel/ 使用 Camel 13d4152a 的原生检查点运行时。旧 COCO 基线源码/运行时保存在 /home/zjwei/projects/Camel-DDPM-history/cc99f31,本次验证快照保存在 /home/zjwei/projects/Camel-DDPM-history/native-checkpoints-v1;历史配置绑定指纹,须使用对应快照复现。已迁移的 2,000 步 VAE 在 runs/coco-native-migration-v1/。设备无状态随机数、完整设备常驻训练步、完整 AMP 和四卡分布式训练仍未完成。
88 上的项目源码是 /home/zjwei/projects/Camel-DDPM/;训练默认运行时为项目内 .camel/,Camel 开发源码在 runtime-build/Camel/。data 和 runs 为软链接,训练产物实际写入 /mnt/data3/zjwei/Camel-DDPM-data/。当前 COCO 结果为 runs/coco-baseline-v1/。源码通过归档/SCP 同步,服务器目录不是 Git checkout;它是实际服务器实验代码,尚无生产服务。
- Camel 原生解析 MNIST IDX,归一化到
[-1, 1]。 - 100 步 cosine 噪声调度、16 维正弦时间编码、两层 SiLU MLP。
- epsilon 预测与均方误差;带解析噪声直连的残差参数化。
- Camel 自动微分;GPU 路径用 Camel 表达 Adam,并编译为 CUDA。
- 权重、梯度及 Adam 的两个动量树在 GPU 更新间保留在显存。
- NPY 权重、独立进程重载、fixed-small DDPM 后验与裁剪的 x0 预测。
- Camel 直接输出 PGM 样本网格和采样过程;Python 仅提供可选 PNG 转换。
GPU 路径显式调用 tiles.run / tiles.run_device,失败会报错,不会自动退回 CPU。
CPU 仍负责 IDX 读取、随机噪声、时间/调度系数、少量加噪与后验运算、图片编码和文件输出。
需要 Windows PowerShell 和包含 Tiles 的完整 Camel 分发目录。CUDA 执行还需要 NVIDIA 驱动及匹配的 NVRTC 运行库;仅 GPU 检测成功并不保证每张图可编译。
实验依赖的 Camel 库修复与批量矩阵乘扩展见 runtime/README.md。可用包含这些改动的分发目录安装一次:
.\tools\install-runtime.ps1 -Distribution D:\path\to\camel-distribution脚本将完整分发安装到本项目 .camel/,记录版本与二进制 SHA-256。之后所有运行默认使用 .camel/bin/camel.exe,不链接开发目录。运行时、MNIST 和训练产物均不进入 Git。显式更新时加 -Update;更新前应结束正在运行的 Camel 进程。
后续训练已迁移至 ssh 88zjwei 的 /home/zjwei/projects/Camel-DDPM,使用该目录自己的 Linux .camel/ 安装;本机不运行训练。
部署、GPU 选择与日志检查见 远程训练说明。
run.sh 提供 Linux GPU 启动入口;run.ps1 仍保留用于显式选择在 Windows 上运行。
新增的 patch-x0 实验按 4×4 图像块共享权重、进行全局位置混合,预测干净像素,固定隐藏宽度 64。
其 x0-MSE 与旧基线的 epsilon-MSE 是不同目标,数值不能直接对比。
旧模型和 checkpoint 保持 epsilon 配置,采样时按原配置选择网络与后验参数化。
# 下载并校验原始 MNIST,然后用宿主 gzip 解压;IDX 解码在 Camel 中完成。
.\tools\prepare.ps1
# 先做短跑;默认 GPU,不可用时直接报错。
.\run.ps1 -Steps 3 -Width 16 -Batch 4 -Samples 8 -SkipPrepare
# 已验证的基线配置;约 158 秒是本机一次测量,不是性能保证。
.\run.ps1 -Steps 5000 -Width 512 -Out runs\gpu-baseline -SkipPrepare
# 独立重载 checkpoint 再采样;读取该次运行的 timesteps/device 配置。
.\run.ps1 -SampleOnly -Out runs\gpu-baseline -Samples 64 -SampleSeed 12345
# 数值检查;不重新训练。
.\test.ps1默认每次 GPU 更新后暂停 10 毫秒、CPU 张量线程数为 1,并降低启动进程优先级。
-DelayMs 可增加暂停时间;Ctrl+C 可终止。默认不自动启动长期任务。CPU 路径需显式指定 -Device cpu,该路径默认也只有一个张量线程。
每次 MNIST 运行写入 runs/<name>/:config.json、日志、metrics.json、timing.json、checkpoint/*.npy、samples.npy、samples.pgm 和 trajectory_*.pgm。这些 MNIST 入口只保存模型权重,不支持恢复 Adam 状态;RGB 入口 tools/text-image.py 会保存模型、Adam、EMA 和训练进度并支持续训。短跑只能验证流程,不代表模型收敛。
PNG 预览是可选步骤,无需它也能训练、采样和输出图片:
python -m pip install -r requirements.txt
python tools\preview.py runs\gpu-baseline2026-10-18,RTX 4060 Ti,512 隐藏宽度、batch 32、5,000 次更新、100 步扩散:
| 检查 | 结果 |
|---|---|
| 固定 128 张测试图、5 个时间点的噪声 MSE | 0.521963 → 0.371084,下降 28.9% |
| 模型方向导数与中心差分绝对误差 | 2.55e-6 |
| CPU/GPU 全部参数梯度 L1 差异 | 1.31e-7 |
Camel GPU Adam 与 nn.adam 首步参数 L1 差异 |
9.80e-7 |
| 改变输入与参数后的 CPU/GPU 梯度 L1 差异 | 1.38e-7 |
| 保存重载后的损失 | 完全一致 |
| 相同权重/种子重启采样 | NPY SHA-256 完全一致 |
| 人工检查样本 | 有笔画,噪点多;生成质量未通过 |
验证时间点是按索引取的 9、29、49、69、89(总步数 100),固定噪声复用。 数据来自官方 MNIST train/test 图片文件;无需标签,因为模型无条件生成。 所有样本共享一次抽取的 batch 时间步,其边际训练目标仍为均匀时间步 epsilon MSE。 随机训练损失随时间点大幅变化,不能把单个 batch 的高低当作收敛结论。
已补齐:标量 math.sqrt 反向规则、含 NUL 的二进制文件写入、Tiles 对 numel/shape 的形状特化,以及逆轴置换的 GPU 降低。实验没有改变 Camel 的语言语义。
当前瓶颈是小型全连接网络的生成质量;下一步应验证卷积去噪器或小型 U-Net。 Tiles 当前公开支持子集还不含完整卷积/池化前后向,不能直接将 CPU CNN 示例当作可用 GPU U-Net。 另外还缺 checkpoint 中的优化器状态、恢复训练、较全面的验证集评估,以及 GPU 随机数/数据输入链路。
DDPM 的原始后验与 epsilon 参数化参考 作者实现。这里采用小模型及 cosine 调度,目标是运行链路验证,不是复现原论文质量。
