ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DINOv3超参数调优:学习率、权重衰减、批次大小一次配对的速查表

DINOv3超参数调优:学习率、权重衰减、批次大小一次配对的速查表 DINOv3超参数调优学习率、权重衰减、批次大小一次配对的速查表【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3刚把 DINOv3 的 config 复制下来跑loss 在前几个 epoch 正常下降warmup 一结束就慢慢爬到不再动了——大概率不是数据的问题而是学习率、批次大小和权重衰减这三者没按项目里的缩放规则一起配对。DINOv3 的调参和一般网络不一样config 里写的 lr 只是基准值训练启动时会按总批次大小乘一个缩放系数你只改其中一个参数而不理解这条链路数字看着对、实际全错。先给结论各模型规模默认超参数速查配置场景学习率peak预热权重衰减每 GPU 批次梯度裁剪来源文件默认 ViT-L 预训练0.00110 epoch0.04 → 0.4643.0dinov3/configs/ssl_default_config.yamlViT-L ImageNet-1K 线性评测0.00110 epoch0.04 → 0.4以官方最新配置为准3.0dinov3/configs/train/vitl_im1k_lin834.yamlViT-L 蒸馏0.000200.0433.0dinov3/configs/train/dinov3_vitl16_lvd1689m_distilled.yamlViT-7B 预训练5.0e-05100 epoch0.041630.0dinov3/configs/train/dinov3_vit7b16_pretrain.yamlViT-7B 高分辨率适配1.25e-05end00.04830.0dinov3/configs/train/dinov3_vit7b16_high_res_adapt.yamlConvNeXt 蒸馏1e-480 epoch0.02 → 0.2以官方最新配置为准3.0dinov3/configs/train/distillation_convnext/convnext_base_p16.yaml以上数字全部直接取自仓库dinov3/configs/下的官方 yaml不是经验估计。注意预训练和适配场景的裁剪阈值差了 10 倍3.0 vs 30.0这个区别下面会讲。三个超参数逐个拆学习率config 里写的只是缩放前的基准值它控制每步参数更新的步长但 DINOv3 里你填的数字不等于实际生效的数字。默认缩放规则是sqrt_wrt_1024训练脚本dinov3/train/train.py里会执行lr_peak * 4 * math.sqrt(batch_size_per_gpu * world_size / 1024.0)也就是说总批次 1024 时 lr 不变批次翻倍只让 lr 增长 1.41 倍而不是 2 倍——这是 DINOv3 预训练和很多博客写的线性缩放最大的不同项目里也保留了linear_wrt_256规则可选但官方预训练配置全部用 sqrt 规则。什么时候才需要动它你改了总批次大小加卡或减卡就不用手动改 lr缩放规则会自动处理需要手动改的只有两种情况——换了缩放规则本身或者做像 7B 高分辨率适配那样的微调官方把 end 压到 1.25e-05 这种小值。另外patch_embed_lr_mult: 0.2意味着 patch 嵌入层的学习率永远是主干的 0.2 倍调参时别把它忘了。权重衰减两个值一个起步一个收尾它控制参数更新的 L2 惩罚强度防止过拟合。DINOv3 的默认写法是一个区间weight_decay: 0.04 weight_decay_end: 0.4起步 0.04 是 DINO 系模型的常规值收尾 0.4 用于训练后期收紧参数。什么时候动它绝大多数微调场景 0.04 起步就够用不需要碰 end只有在训练后期明显过拟合验证 loss 持续差于训练 loss时再考虑加大 end。注意 ConvNeXt 蒸馏配置里是 0.02 → 0.2和 ViT 默认不同——不同架构的官方推荐值不一样以对应 yaml 为准。批次大小改的是内存压力不是收敛速度它决定每步用多少样本直接影响显存占用和上面那条缩放公式的输入。默认配置是每 GPU 64 个样本、OFFICIAL_EPOCH_LENGTH: 1250一个官方 epoch是固定迭代数而不是跑完全部数据。什么时候动它显存不够就降比如 ViT-7B 预训练官方配的就是每卡 16显存富余就升。但记住 lr 会自动随它缩放所以加卡和改批次在效果上等价不存在加卡白送收敛加速这种好事。动手调从跑通到调优的四步流程Step 1原封不动跑一遍官方默认 config比如dinov3/configs/ssl_default_config.yaml对应的 ViT-L 预训练。判断标准前 100 个 iteration 内 loss 从高位平滑下降、没有 NaN日志里会打印缩放后的实际 lr和你手算的4·sqrt(总批次/1024)一致。Step 2把数据集路径和输出目录换成你自己的模型规模先别动让整条链路数据加载、FSDP 分片、checkpoint走通。判断标准checkpointing配置的保存周期默认 period 3750后磁盘上出现 checkpoint 文件。Step 3按你的实际卡数改批次大小只改batch_size_per_gpu一个数确认日志里缩放后的 lr 落在预期区间。判断标准总批次越小实际 lr 越低如果卡数从 8 张减到 2 张warmup 期可以同步缩短观察 loss 下降斜率是否和满卡时可比。Step 4单变量调参一次只动一个学习率、权重衰减、批次三选一每轮跑够一个OFFICIAL_EPOCH_LENGTH的迭代再下结论。判断标准对比同一 checkpoint 频率下的 loss 曲线和内置 eval 指标变化幅度明显大于噪声再认定调参有效。这几个坑别踩现象loss 正常降了 20 个 epoch之后突然抬头甚至飙升。原因大概率是权重衰减或 lr 的 cosine 尾部没对齐——DINOv3 用线性预热加余弦退火linear_warmup_cosine_decay见dinov3/train/cosine_lr_scheduler.py如果你手动改了 epoch 数却没同步改schedules.lr里的cosine_epochslr 会在不该低的时候还很高。怎么处理改完 epoch 数检查schedules段里 warmup、cosine 各项 epoch 之和是否合理让余弦段覆盖训练后期。现象减卡后 loss 曲线比满卡时抖得多。原因批次变小后实际 lr 按 sqrt 规则降下来了但 7B 这种大模型配的是 30.0 的裁剪阈值小模型 3.0阈值过大时偶发大梯度会直接打进参数里。怎么处理按模型规模用官方对应的clip_grad值小模型别沿用 30.0。现象换了 3D 架构ConvNeXt直接套 ViT 的 lr 配置收敛极慢。原因不同架构的官方学习率差距很大ConvNeXt 蒸馏配置 peak 是 1e-4、预热 80 epoch比 ViT-L 默认的 0.001 低一个量级。怎么处理跨架构迁移时以目标架构的官方 yaml 为基准不从 ViT 配置推。现象手动把warmup_epochs调大想更稳结果 loss 全程趴在高位不动。原因预热期内 lr 是从 0 线性爬的warmup 占总步数比例过大等于训练后期才刚爬到 peak。怎么处理warmup 通常控制在总 epoch 的 10% 以内默认 100 epoch 配 10 个 epoch 预热7B 是 1000 epoch 配 100按比例来。现象改了batch_size_per_gpu之后 eval 指标反而变差怀疑是学习率没调好。原因可能先查错地方了——DINOv3 里 lr 缩放只看总批次如果你同时改了OFFICIAL_EPOCH_LENGTH总迭代数和调度长度都变了等效 lr 轨迹完全不同。怎么处理一次只改一个维度先固定 epoch 长度再动批次。按硬件和任务选配置GPU 规模总卡数ViT-S/B 小模型ViT-LViT-7B8 卡每卡 64lr 基准 0.001clip 3.0每卡 64 起步显存紧则降每卡 16 起步clip 30.032 卡每卡 64总批次 2048lr 自动 ×1.41每卡 32~64每卡 8~16显存富余再升128 卡每卡 16~32总批次过大时 lr 增长放缓每卡 16~32每卡 4~8表内数字来自各官方 yaml 的batch_size_per_gpu和缩放规则超出这张表范围时通用原则就一条按4·sqrt(总批次/1024)算实际 lr总批次离 1024 越远单位样本的 lr 越便宜大批次场景可以适当加 peak、小批次场景别硬抬。调完怎么确认没翻车盯三个指标。第一是loss 曲线的形状正常应该是预热段单调下降、余弦段缓慢收敛前期锯齿抖动幅度随 lr 下降而收窄异常时先查clip_grad是否匹配模型规模再看缩放日志里的实际 lr。第二是梯度范数config 里有monitor_gradient_norm开关打开后如果范数周期性尖峰多半是批次里混进了难样本或裁剪阈值过松先查数据增强参数crops段而不是 lr。第三是内置 eval 指标默认每 12500 个 iteration 跑一次高频 evaleval_period_iterationseval 曲线和训练 loss 背离说明在过拟合回头看权重衰减的 end 值。eval 相关脚本在dinov3/eval/下线性探针入口是dinov3/eval/linear.py里面也自带scale_lr按批次缩放评测试图时同样别手改 lr。先把ssl_default_config.yaml原样跑通、确认日志里的缩放 lr 和你预期一致之后一次只改学习率这一个变量做对比其他参数一律不动。【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表