docs: SimCLR 域内自监督的实测对比与多后端说明
- 新增 §10.5:SimCLR vs ImageNet 预训练在 14,579 张上的同设置对比。 只训 1 个 epoch 的域内特征在 k=4 上即追平(轮廓 0.334 vs 0.325), 在 k=2 上大幅胜出(轮廓 0.469、稳定性 0.991)——目视确认该二分正是 "有明显缺陷 / 弱纹理近空白",可直接作为流水线的第一级过滤 - 复杂度表补 MPS 实测:特征提取 84s(CPU) -> 51s(MPS),SimCLR 约 65s/epoch - README 增加"计算后端"小节(三后端的 AMP 默认值、显存统计与限制) - 流程图与对照表同步去掉已移除的 GPU 守卫 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
b6f83fcad0
commit
938d62ea53
@@ -25,13 +25,30 @@ convolution 的结构(不含 attention / transformer),并支持导出 ONNX
|
||||
```bash
|
||||
uv sync # 安装依赖(含 swanlab)
|
||||
uv sync --group export # 需要导出 ONNX 时再装
|
||||
uv run python scripts/check_env.py # 自检(Python / PyTorch / Nvidia GPU)
|
||||
uv run python scripts/check_env.py # 自检(Python / PyTorch / 可用后端)
|
||||
```
|
||||
|
||||
> **训练机必须有 Nvidia GPU。** 所有训练入口先调用 `utils.device.require_cuda()`,
|
||||
> 检测不到 CUDA 构建的 PyTorch 或可用 GPU 时直接报错退出。评估与 ONNX 导出允许 CPU。
|
||||
> Linux 上 PyPI 的 torch 即 CUDA 构建;如需指定 CUDA 版本:
|
||||
> `uv pip install --index-url https://download.pytorch.org/whl/cu124 torch torchvision`
|
||||
### 计算后端
|
||||
|
||||
支持 **CUDA / MPS(Apple Silicon)/ CPU**。配置里的 `device: auto` 按 `cuda > mps > cpu`
|
||||
自动挑最快的可用后端,也可以显式写 `cuda` / `mps` / `cpu`,或用命令行 `--device` 覆盖:
|
||||
|
||||
```bash
|
||||
uv run python train.py --config configs/train/baseline.yaml # auto
|
||||
uv run python train.py --config configs/train/baseline.yaml --device mps # 强制 Mac GPU
|
||||
uv run python train.py --config configs/train/baseline.yaml --device cpu
|
||||
```
|
||||
|
||||
**显式指定不可用的后端会直接报错退出**,不会悄悄退回 CPU——训练慢几十倍却不吭声是最坏的情况。
|
||||
|
||||
| 后端 | AMP 默认 | 显存统计 | 备注 |
|
||||
| --- | --- | --- | --- |
|
||||
| `cuda` | **开** | 精确峰值 | Linux 上 PyPI 的 torch 即 CUDA 构建;指定版本用 `uv pip install --index-url https://download.pytorch.org/whl/cu124 torch torchvision` |
|
||||
| `mps` | **关** | 采样下界 | Apple Silicon。autocast 可用且数值正常,但实测比 fp32 慢(tiny_conv @128²:fp32 76 ms/步,fp16 90 ms),故默认不开;`amp: true` 可强制打开 |
|
||||
| `cpu` | 不支持 | 无 | 实测比 MPS 慢约 30 倍,仅适合调试与精度回归 |
|
||||
|
||||
`amp` 字段接受 `auto`(随后端)/ `true` / `false`。MPS 上 `torch.profiler` 抓不到 Metal kernel
|
||||
(没有对应的 `ProfilerActivity`),算子明细只反映 CPU 侧下发耗时。
|
||||
|
||||
## 数据准备
|
||||
|
||||
@@ -148,7 +165,7 @@ uv run python scripts/cluster_unlabeled.py --config configs/cluster/film.yaml
|
||||
# 先扫一遍簇数再决定分几类
|
||||
uv run python scripts/cluster_unlabeled.py --config configs/cluster/film.yaml --sweep-k 2-8
|
||||
|
||||
# 换成在本地数据上自监督训练的特征(SimCLR,属于训练,需要 Nvidia GPU)
|
||||
# 换成在本地数据上自监督训练的特征(SimCLR,Mac 上自动走 MPS)
|
||||
uv run python scripts/cluster_unlabeled.py --config configs/cluster/film.yaml --set method=simclr
|
||||
```
|
||||
|
||||
@@ -177,8 +194,8 @@ uv run python scripts/cluster_unlabeled.py --config configs/cluster/film.yaml --
|
||||
**本批薄膜图上自监督训练**一个项目自己的纯卷积骨架,域适配更好。同一张图的两个随机增强
|
||||
视图互为正样本,batch 内其余 2B−2 个视图为负样本,用 NT-Xent 损失训练。
|
||||
|
||||
**这属于训练,因此必须有 Nvidia GPU**(走 `utils.device.require_cuda()` 守卫,
|
||||
在无卡机器上会直接报错退出):
|
||||
训练走 `device: auto` 选中的后端——**Mac 上直接用 MPS 即可**,实测 14,579 张、
|
||||
batch 256 时约 65 秒/epoch:
|
||||
|
||||
```bash
|
||||
# 1. 自监督训练 + 聚类一步跑完(首次运行)
|
||||
@@ -191,7 +208,13 @@ uv run python scripts/cluster_unlabeled.py --config configs/cluster/film.yaml
|
||||
uv run python scripts/cluster_unlabeled.py --config configs/cluster/film.yaml --set method=simclr simclr.epochs=200 simclr.batch_size=512 simclr.temperature=0.1
|
||||
```
|
||||
|
||||
训练完权重存到 `<work_dir>/simclr_backbone.pth`(**只含骨架,不含投影头**——投影头被训练成
|
||||
**实测效果**(14,579 张,与 pretrained 用完全相同的聚类设置):只训 **1 个 epoch** 的域内特征
|
||||
在 k=4 上就追平 ImageNet(轮廓 0.334 vs 0.325),在 **k=2 上大幅胜出**(轮廓 0.469、
|
||||
稳定性 0.991)——目视确认这个二分正是"有明显缺陷 / 弱纹理近空白",可直接当作流水线的
|
||||
第一级过滤。详见 [文档 §10.5](docs/unsupervised-clustering.md#105-simclr-域内自监督-vs-imagenet-预训练)。
|
||||
|
||||
训练每 `save_interval` 个 epoch 落一次盘,中途 Ctrl-C 也能拿到当前权重继续用。
|
||||
权重存到 `<work_dir>/simclr_backbone.pth`(**只含骨架,不含投影头**——投影头被训练成
|
||||
对增强不变,会丢掉下游有用的信息,所以聚类和保存都只用骨架特征)。相关配置:
|
||||
|
||||
```yaml
|
||||
@@ -204,7 +227,8 @@ simclr:
|
||||
epochs: 100
|
||||
batch_size: 256
|
||||
temperature: 0.2 # 越小越关注难负样本
|
||||
amp: true
|
||||
amp: auto # CUDA 上开、MPS 上关
|
||||
save_interval: 5 # 每 5 个 epoch 落一次盘
|
||||
checkpoint: null # 填已有权重可跳过重复训练
|
||||
projection: {hidden_channels: 256, out_channels: 128}
|
||||
optimizer: {name: adamw, lr: 0.001, weight_decay: 0.0001}
|
||||
|
||||
Reference in New Issue
Block a user