DINOv3 超参数调优速查:批次大小、学习率、权重衰减一次配好
【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3
这是一篇 DINOv3 超参数调优速查,解决三个问题:DINOv3 批次大小按 GPU 数量怎么定、DINOv3 学习率设置随批次怎么缩放、DINOv3 权重衰减的起止值取多少。全文按“定规模 → 配参数 → 按症状排查 → 验证效果”的顺序写,所有数值都能在仓库配置文件中找到出处。需要代码的话:git clone https://gitcode.com/GitHub_Trending/di/dinov3。
一、先定训练规模:按 GPU 数量选 DINOv3 批次大小
批次大小决定模型每一步"看"多少张图,学习率必须跟着它走,所以这两个数要一起定,不能各改各的。
仓库里的预训练配置都在 dinov3/configs/train/,不同规模的参考值如下:
| 场景 | 配置文件 | 每卡批次 | 总批次 | 基准学习率 |
|---|---|---|---|---|
| ADE20K 线性探测(8 卡单机) | config-ade20k-linear-training.yaml | 2 × 8 卡 | 16 | 1e-3 |
| ViT-L 蒸馏(ImageNet-1k) | vitl_im1k_lin834.yaml | 64 × 32 卡(4 节点) | 2048 | 1e-3 |
| ViT-L 蒸馏(LVD-1689M) | dinov3_vitl16_lvd1689m_distilled.yaml | 3 × 多卡 | 1920 | 2e-4 |
| ViT-7B 预训练 | dinov3_vit7b16_pretrain.yaml | 16 × 约 512 卡 | 约 8192 | 5e-5 |
注意规律:批次越大,单步看到的样本越多、梯度越稳,基准学习率反而可以压得更低——7B 规模用 5e-5,比 ViT-L 的 1e-3 小两个数量级。这是自监督大模型训练的常见取舍,调参时别反着来。
二、DINOv3 学习率设置:线性预热 + 余弦衰减,再按批次缩放
学习率决定每一步走多远。DINOv3 不写死一个值,而是走三段式调度:从 0 线性预热到峰值,再余弦衰减到min_lr(各配置里均为 1e-6)。调度逻辑在 dinov3/train/cosine_lr_scheduler.py 的CosineScheduler里,核心就两行:
warmup_schedule = np.linspace(start_warmup_value, base_value, warmup_iters) schedule = final_value + 0.5 * (base_value - final_value) * (1 + np.cos(np.pi * iters / len(iters)))各配置的预热期长度差异很大,别漏改:
- ViT-L 蒸馏:
warmup_epochs: 10,共 100 个 epoch - ViT-7B 预训练:
warmup_epochs: 100,共 1000 个 epoch - ConvNeXt 蒸馏(convnext_base_p16.yaml):
warmup_epochs: 80,峰值 1e-4
学习率随批次大小怎么缩放
改批次时不要手算学习率,用配置里的scaling_rule,实现在 dinov3/configs/config.py:
cfg.optim.lr *= 4 * math.sqrt(cfg.train.batch_size_per_gpu * distributed.get_world_size() / 1024.0)两种规则的行为对比:
| 规则 | 公式 | 总批次 1024 时系数 | 总批次 2048 时系数 |
|---|---|---|---|
linear_wrt_256 | lr × 总批次 / 256 | 4 | 8 |
sqrt_wrt_1024(预训练默认) | lr × 4·√(总批次 / 1024) | 4 | 约 5.66 |
也就是说,sqrt 规则下批次翻倍、学习率只涨 √2 倍,大批次训练更不容易炸。ViT-L 和 7B 配置用的都是sqrt_wrt_1024。另外两个容易忽略的系数:patch_embed_lr_mult: 0.2(patch embedding 层的学习率单独打 2 折)和layerwise_decay(0.9 / 0.98 / 0.99,学习率按层深逐层衰减,层越深衰减越多)。下游评测里线性探测则用简单的 256 线性缩放(dinov3/eval/linear.py 的scale_lr)。
三、DINOv3 权重衰减设置:从 0.04 起步,渐进加到 0.4
权重衰减惩罚大权重、抑制过拟合。DINOv3 的写法是"起始值 + 终止值",训练中从起点渐进取到终点,而不是全程一个常数:
| 场景 | 起始值 | 终止值 |
|---|---|---|
| ViT-L 蒸馏(ImageNet-1k) | 0.04 | 0.4 |
| ViT-L 蒸馏(LVD-1689M) | 0.04 | 0.2 |
| ViT-7B 预训练 | 0.04 | 0.04(恒定) |
| ConvNeXt-B 蒸馏 | 0.02 | 0.2(500 个 epoch 内渐近) |
| ADE20K 线性探测 | 1e-3 | —(单值) |
用法上记住两点:
- 训练初期权重还没长开,衰减取小(0.02~0.04);后期加大衰减能压住过拟合,0.2~0.4 是仓库里出现过的范围。
- 头部参数有单独乘数
dino_head_wd_multiplier(各配置均为 1.0),一般不用动。
四、按症状查参数:训练曲线不对劲时先查这张表
| 症状 | 疑似参数 | 调整方向 |
|---|---|---|
| 损失上下震荡、不收敛 | 学习率、预热期 | 基准学习率减半;warmup_epochs加长;确认clip_grad(ViT-L 为 3.0,7B 为 30.0)没被覆盖 |
| 收敛慢、曲线太平 | 学习率缩放 | 检查scaling_rule是否实际生效(日志会打印缩放前后的 lr);确认总批次确实变大 |
| 显存 OOM | 每卡批次 | 降batch_size_per_gpu,学习率交给缩放规则自动降;大模型开checkpointing: true,7B 还可开fp8_enabled |
| 前期指标好、后期不涨 | 权重衰减终止值 | 适当提高weight_decay_end;检查layerwise_decay是否过松 |
| 预热期就炸掉 | 预热 + 梯度裁剪 | 预热曲线检查是否从 0 起步;clip_grad调小 |
改参数时一次只动一个,改完看两个 epoch 的曲线再动下一个,否则分不清是哪个起的作用。
五、验证效果:三个监控点确认调参有没有用
- 缩放日志:启动时 dinov3/configs/config.py 会打印
sqrt scaling learning rate; old: ..., new: ...,先确认学习率真的按规则缩放过了,再谈其他。 - 梯度范数:配置里有
monitor_gradient_norm(默认 false),打开后能直接看到梯度是否发散,震荡排查最有用。 - 评测指标:ViT-L 官方配置注释里记了基准——82.2 im1k-knn、83.3 im1k-linear,每隔
eval_period_iterations(12500)自动跑;分割任务看 ADE20K 配置 里的 mIoU。同一规模下,新配置跑完 10 个 epoch 的指标不低于基准线,调参才算没跑偏。
不确定怎么下手的话:直接复制 dinov3/configs/train/vitl_im1k_lin834.yaml,只改batch_size_per_gpu适配你的 GPU 数量,学习率交给scaling_rule自动缩放,其余先保持默认跑通。
【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考