DINOv3 目录结构与训练入口完整走读:如何从一份 YAML 跑到一次预训练任务

📅 2026/8/23 11:07:19
DINOv3 目录结构与训练入口完整走读:如何从一份 YAML 跑到一次预训练任务
DINOv3 目录结构与训练入口完整走读如何从一份 YAML 跑到一次预训练任务【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3DINOv3 是 Meta AI 的自监督视觉基础模型官方 PyTorch 实现覆盖 ViT-S/16 到 67 亿参数的 ViT-7B/16 骨干。本文不逐目录罗列而跟着一次训练任务走先看每个目录的职责再串起「YAML → 配置 → 数据 → 模型 → 损失」的完整动线最后给出一条最短可跑通的路径。DINOv3 布局速览每个目录一句话代码全部收在dinov3/顶层包内包外只有hubconf.py、conda.yaml、notebooks/等辅助文件。主干结构dinov3/ ├── configs/ # YAML 配方 OmegaConf 合并逻辑config.py ├── data/ # 数据集、DINO 增强、mask 生成、多分辨率 DataLoader ├── models/ # ViT / ConvNeXt 骨干与 build_model 工厂 ├── layers/ # 组件件attention、FFN、RoPE、DINO head、fp8 ├── loss/ # DINO、iBOT、Gram、KoLeo 四个损失文件 ├── train/ # 训练主循环与 SSLMetaArch / MultiDistillationMetaArch ├── eval/ # 六个下游评估linear、knn、depth、detection、segmentation、text ├── hub/ # torch.hub 本地加载入口 ├── fsdp/ distributed/ checkpointer/ # FSDP 分片、进程组封装、断点存/恢复 └── run/ # submitit 作业提交submit.py一句话概括分工configs/是输入data/、models/、loss/是训练的三样原料train/是调度方eval/是一群互相独立的评估程序。下面按一次训练的真实动线把前四块串起来。配置是怎么拼出来的入口在train/train.py的main()它只认三类输入--config-file、--output-dir、以及命令尾部keyvalue形式的覆盖项。合并逻辑在configs/config.py核心就四行cfg OmegaConf.load(args.config_file) default_cfg get_default_config() # ssl_default_config.yaml OmegaConf.set_struct(default_cfg, True) cfg OmegaConf.merge(default_cfg, cfg, opts_cfg)三层叠加ssl_default_config.yaml206 行提供 dino、ibot、gram、crops、train 的全部默认值配方 YAML 负责改差量命令行覆盖项最后生效。注意setup_config会先把合并结果原样 dump 到output_dir/config.yaml再按scaling_rule调整学习率如linear_wrt_256按 world size 线性缩放——也就是说实际生效的配置永远能在输出目录里找到。多蒸馏场景另有setup_multidistillation一次启动按 rank 区间切出学生子组每个子组加载各自的配方文件。一个 batch 是怎么被造出来的模型建好后do_train调用build_multi_resolution_data_loader_from_cfg对crops里的每种分辨率deepcopy一份配置各建一个 DataLoader再用data/meta_loaders.py的CombinedDataLoader按global_local_crop_pairs_ratios比例交错取样。变换链由data/augmentations.py的DataAugmentationDINO提供teacher 全局裁剪、student 局部裁剪、Gram 视图iBOT 的掩码由data/masking.py的MaskingGenerator生成并直接挂进 collate 函数——collate_data_and_cast顺手完成 bf16 转换。所以模型拿到的每个 batch裁剪、mask、dtype 都已由数据层定死train.py里不写任何样本级逻辑。模型和损失在哪里models/__init__.py的build_model用vits.__dict__[args.arch]按名字实例化 student 与 teacherattention 块、FFN、RoPE 位置编码、DINO head 拆在layers/的独立文件里。main()里模型先在torch.device(meta)上实例化再经prepare_for_distributed_training完成 FSDP 分布实现在fsdp/进程组封装在distributed/。损失是loss/下四个独立文件dino_clstoken_loss.py、ibot_patch_loss.py、gram_loss.py、koleo_loss.py由train/ssl_meta_arch.py的SSLMetaArch把 student、EMA teacher 和四个损失接成完整前向。每个迭代结束按checkpointing.period触发存盘存、恢复、保留最近 N 份都封装在checkpointer/。其余目录各管什么目录职责eval/linear.py、eval/knn.py、eval/log_regression.py冻结骨干的三种分类评估各自带main()eval/depth/、eval/detection/、eval/segmentation/DPT 深度头、DETR 检测器、linear / Mask2Former 分割各自带run.py与configs/eval/text/独立的 DINO-Txt 训练线视觉 文本双塔hub/ 根目录hubconf.py预训练权重加载入口backbones、classifiers、segmentors 等thirdparty/CLIP/vendored 的 CLIP tokenizer供eval/text使用run/submit.pysubmitit 封装提交 Slurm 作业notebooks/CHMv2 推理、分割跟踪等使用示例最小上手路径改哪个文件、跑哪条命令改dinov3/configs/train/vitl_im1k_lin834.yaml全文 143 行把train.dataset_path指向你的数据调train.batch_size_per_gpu把output_dir换成可写路径。跑 README 给出的官方形态命令PYTHONPATH${PWD} python -m dinov3.run.submit dinov3/train/train.py \ --config-file dinov3/configs/train/vitl_im1k_lin834.yaml \ --output-dir ./dinov3_local_run两个坑要先知道submit.py面向 Slurm 设计output_dir缺省是共享存储的%j目录单机必须显式传--output-dirREADME 也注明不走run.submit时可用 python 或 torchrun 直接起脚本。只想加载预训练骨干的话入口是根目录hubconf.py配合hub/backbones.py权重需按 README 指引申请获取。两个设计取舍目录为什么长成这样配方 YAML 名差量、实全量。合并逻辑支持纯差量写法但vitl_im1k_lin834.yaml实际把 dino、ibot、crops 等默认值里已有的大块又声明了一遍——自包含但冗余。好处是每个配方不用对照默认值就能读懂代价是改一个全局默认可能要动十几份 YAMLset_struct严格模式正是为堵住拼错键名这种事故才加的。eval 是一组并列的小项目。eval/下每个任务都有自己的configs/、run.py、schedulers.py、utils.py文件名与顶层自监督训练循环大量重名。这保证了各下游评估可独立复现、各带配方但新人很难判断哪个入口是「官方」的——事实上eval/depth/run.py和eval/linear.py是平级关系都是独立程序README 逐条列出启动命令了事。另外配方注释4 nodes、0.57s/iter说明这套代码面向数百卡集群本机调试第一件事是把 batch size 和OFFICIAL_EPOCH_LENGTH降下来否则学习率与动量 schedule 会失真。接下来可以做什么想动损失或增强从loss/的四个文件和data/augmentations.py下手想接新数据集顺着data/loaders.py的make_dataset解析逻辑和data/datasets/里的注册方式加即可。【免费下载链接】dinov3Reference PyTorch implementation and models for DINOv3项目地址: https://gitcode.com/GitHub_Trending/di/dinov3创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考