feat: eval benchmark + cloud-trained models replace train/
- eval/: 统一推理评估框架 (infer_train.py, infer_reproduce.py, viz_flow.py, viz_signals.py, generate_report.py, run_all.sh, scene_manifest.py) - train/: 替换为云端正式训练产出,覆盖 11 个场景 - Karman: Re100 (5 seeds), Re60/200/400 transfer - VarDist: d075/d15/d2 scratch - Illusion: 0.75L/1.0L/1.5L/2.0L scratch - train_karman.py: 新增 --resume-from 断点续训支持 - calibrations: 17 组标定数据 (kar/ill 命名规范) - scripts/: 7 个自动化训练脚本 - 清理旧 calibrations/shell scripts/visualize Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,221 @@
|
||||
# DynamisLab — 训练目录
|
||||
|
||||
> `src/drl_pinball/train/`
|
||||
> 更新: 2026-07-12
|
||||
|
||||
---
|
||||
|
||||
## 命名规则
|
||||
|
||||
```
|
||||
{domain}_{variant}_{method}_seed{seed}
|
||||
|
||||
domain: kar = Karman | ill = Illusion
|
||||
variant: re{60,100,200,400} = 雷诺数 | d{075,15,2} = 扰动圆柱直径(L) | {1L,15L,075L,2L} = 目标圆柱尺寸
|
||||
method: sc = from scratch | tr = transfer from re100 baseline
|
||||
seed: seed{41..45}
|
||||
|
||||
Examples:
|
||||
kar_re100_sc_seed45 — Karman Re100 scratch, seed 45
|
||||
kar_d075_sc_seed44 — Karman 0.75L dist-cyl scratch
|
||||
kar_d15_tr_seed45 — Karman 1.5L dist-cyl transfer
|
||||
kar_re200_sc_seed43 — Karman Re200 scratch
|
||||
ill_2L_sc_seed43 — Illusion 2L target scratch
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 目录结构
|
||||
|
||||
```
|
||||
train/
|
||||
├── train_karman.py # Karman PPO 训练 (核心)
|
||||
├── train_illusion.py # Illusion PPO 训练
|
||||
├── calibrate.py # Phase 0 校准
|
||||
│
|
||||
├── env_karman.py # Karman 环境
|
||||
├── env_illusion.py # Illusion 环境
|
||||
├── symmetry_wrapper.py # G-symmetry 数据增强
|
||||
│
|
||||
├── scripts/ # 启动脚本
|
||||
│ ├── train_baseline.sh # kar_re100_sc multi-seed
|
||||
│ ├── train_illusion.sh # ill_*_sc 4 个尺寸
|
||||
│ ├── vardist_scratch.sh # kar_d*_sc (推荐)
|
||||
│ ├── vardist_transfer.sh # kar_d*_tr (参考)
|
||||
│ ├── crossre_scratch.sh # kar_re*_sc
|
||||
│ ├── crossre_transfer.sh # kar_re*_tr (参考)
|
||||
│ └── resume.sh # 中断恢复
|
||||
│
|
||||
├── calibrations/ # 校准文件
|
||||
│ ├── kar_re100/ # Re100 基准
|
||||
│ ├── kar_d*_sc/ # 变直径 scratch (generic SIM_BP)
|
||||
│ ├── kar_d*_tr/ # 变直径 transfer (实测 SIM_BP)
|
||||
│ ├── kar_re*_sc/ # 变雷诺数 scratch (generic SIM_BP)
|
||||
│ ├── kar_re*/ # 变雷诺数 transfer (实测 SIM_BP)
|
||||
│ └── ill_*/ # Illusion
|
||||
│
|
||||
├── output/ # 训练输出 (21 dirs)
|
||||
│ ├── kar_re100_sc_seed{41..45}/
|
||||
│ ├── kar_d*_sc_seed{44,45}/
|
||||
│ ├── kar_d*_tr_seed{44,45}/
|
||||
│ ├── kar_re*_sc_seed43/
|
||||
│ ├── kar_re*_tr_seed43/
|
||||
│ └── ill_*_sc_seed43/
|
||||
│
|
||||
├── archive/ # 旧版本 (保留)
|
||||
├── README.md # 当前文件
|
||||
├── VARDIST_ANALYSIS.md
|
||||
├── CROSSRE_ANALYSIS.md
|
||||
└── SERVER_DEPLOY.md
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 快速开始
|
||||
|
||||
### 基准训练
|
||||
|
||||
```bash
|
||||
cd scripts
|
||||
bash train_baseline.sh --gpu 0 --episodes 500
|
||||
# → output/kar_re100_sc_seed{41..45}/
|
||||
```
|
||||
|
||||
### 变直径 scratch (推荐)
|
||||
|
||||
```bash
|
||||
cd scripts
|
||||
bash vardist_scratch.sh --gpu 0
|
||||
bash vardist_scratch.sh --only d075
|
||||
# → output/kar_d075_sc_seed44/ etc.
|
||||
```
|
||||
|
||||
### 变雷诺数 scratch
|
||||
|
||||
```bash
|
||||
cd scripts
|
||||
bash crossre_scratch.sh --gpu 0
|
||||
bash crossre_scratch.sh --only re200
|
||||
# → output/kar_re200_sc_seed43/ etc.
|
||||
```
|
||||
|
||||
### Illusion
|
||||
|
||||
```bash
|
||||
cd scripts
|
||||
bash train_illusion.sh --gpu 0
|
||||
# → output/ill_2L_sc_seed43/ etc.
|
||||
```
|
||||
|
||||
### 中断恢复
|
||||
|
||||
```bash
|
||||
cd scripts
|
||||
bash resume.sh --case kar_re60_sc --seed 43 --resume 460 --episodes 500
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 核心训练脚本
|
||||
|
||||
### `train_karman.py`
|
||||
|
||||
```bash
|
||||
conda run -n pycuda_3_10 python -u train_karman.py \
|
||||
--case-name kar_re100_sc --device-id 0 --seed 42 \
|
||||
--config config.json --calibration calibrations/kar_re100/calibration.json \
|
||||
--total-episodes 500 [--transfer-model PATH] [--resume-from N]
|
||||
```
|
||||
|
||||
| 参数 | 默认值 | 说明 |
|
||||
|------|:-----:|------|
|
||||
| n_steps | 2048 | PPO 每轮收集步数 |
|
||||
| batch_size | 64 | minibatch |
|
||||
| n_epochs | 10 | 经验重用次数 |
|
||||
| lr | 3e-4 | 学习率 |
|
||||
| gamma | 0.995 | 折扣因子 |
|
||||
| net_arch | [64, 64] | MLP 两层 sin 激活 |
|
||||
|
||||
---
|
||||
|
||||
## 最终结果
|
||||
|
||||
### Re100 基准 — `kar_re100_sc`
|
||||
|
||||
| Seed | r_sim | r_cd | r_cl |
|
||||
|:----:|:-----:|:----:|:----:|
|
||||
| 45 | 0.883 | 0.977 | 0.982 |
|
||||
| Avg | 0.866 | 0.971 | 0.965 |
|
||||
|
||||
### Vardist 变直径
|
||||
|
||||
| Case | 方式 | r_sim | r_cd | r_cl |
|
||||
|------|:----:|:-----:|:-----:|:-----:|
|
||||
| **kar_d075_sc** | scratch | **0.918** | 0.954 | 0.879 |
|
||||
| kar_d075_tr | transfer | 0.450 | 0.585 | 0.236 |
|
||||
| **kar_d15_sc** | scratch | **0.904** | 0.991 | 0.992 |
|
||||
| kar_d15_tr | transfer | 0.791 | 0.918 | 0.470 |
|
||||
| **kar_d2_sc** | scratch | **0.793** | 0.967 | 0.961 |
|
||||
| kar_d2_tr | transfer | 0.673 | 0.537 | 0.192 |
|
||||
|
||||
> Scratch 全面领先 transfer。
|
||||
|
||||
### Cross-Re 变雷诺数
|
||||
|
||||
| Case | 方式 | r_sim | r_cd | r_cl |
|
||||
|------|:----:|:-----:|:-----:|:-----:|
|
||||
| kar_re60_tr | transfer | 0.446 | **0.882** | 0.936 |
|
||||
| kar_re60_sc | scratch | 0.261 | **0.987** | 0.981 |
|
||||
| **kar_re200_sc** | scratch | **0.664** | 0.667 | 0.281 |
|
||||
| kar_re200_tr | transfer | 0.374 | 0.749 | 0.427 |
|
||||
| **kar_re400_sc** | scratch | **0.509** | 0.714 | 0.420 |
|
||||
| kar_re400_tr | transfer | 0.293 | 0.883 | 0.571 |
|
||||
|
||||
> Scratch sim 最优,transfer CD 最优。两者均保留。
|
||||
|
||||
### Illusion
|
||||
|
||||
| Case | r_sim | r_cd | r_cl |
|
||||
|------|:-----:|:-----:|:-----:|
|
||||
| ill_1L_sc | 0.725 | 0.774 | 0.449 |
|
||||
| ill_15L_sc | 0.810 | 0.825 | 0.384 |
|
||||
| ill_075L_sc | 0.794 | 0.840 | 0.486 |
|
||||
| **ill_2L_sc** | **0.896** | 0.863 | 0.570 |
|
||||
|
||||
---
|
||||
|
||||
## Calibration 参考
|
||||
|
||||
| Calibration | 物理 | SI | SIM_BP | K_CD/K_CL | 对应 output |
|
||||
|------------|------|:--:|--------|:---------:|------------|
|
||||
| `kar_re100` | Re=100, 1.0L | 800 | 实测 | 50/100 | `kar_re100_sc` |
|
||||
| `kar_d075_sc` | Re=100, 0.75L | 800 | generic | 50/100 | `kar_d075_sc` |
|
||||
| `kar_d075_tr` | Re=100, 0.75L | 800 | 实测 | 50/100 | `kar_d075_tr` |
|
||||
| `kar_d15_sc` | Re=100, 1.5L | 800 | generic | 50/100 | `kar_d15_sc` |
|
||||
| `kar_d15_tr` | Re=100, 1.5L | 800 | 实测 | 50/100 | `kar_d15_tr` |
|
||||
| `kar_d2_sc` | Re=100, 2.0L | 800 | generic | 50/100 | `kar_d2_sc` |
|
||||
| `kar_d2_tr` | Re=100, 2.0L | 800 | 实测 | 50/100 | `kar_d2_tr` |
|
||||
| `kar_re60` | Re=60 | 800 | 实测 | 12/25 | `kar_re60_tr` |
|
||||
| `kar_re60_sc` | Re=60 | 800 | generic | 50/100 | `kar_re60_sc` |
|
||||
| `kar_re200` | Re=200 | 500 | 实测 | 12/25 | `kar_re200_tr` |
|
||||
| `kar_re200_sc` | Re=200 | 500 | generic | 50/100 | `kar_re200_sc` |
|
||||
| `kar_re400` | Re=400 | 400 | 实测 | 12/25 | `kar_re400_tr` |
|
||||
| `kar_re400_sc` | Re=400 | 400 | generic | 50/100 | `kar_re400_sc` |
|
||||
| `ill_*` | Illusion | — | 实测 | 12/25 | `ill_*_sc` |
|
||||
|
||||
---
|
||||
|
||||
## Key Findings
|
||||
|
||||
1. **SIM_BP 映射是跨场景训练的最关键变量。** 实测 gap ≠ 0.35 会导致 reward 梯度异常。
|
||||
- Generic SIM_BP `[0, 0.30, 0.65, 0.79, 0.89, 1.0]` (gap=0.35) → 稳定学习
|
||||
|
||||
2. **变直径: scratch > transfer.** Generic SIM_BP + K_CD/CL=50/100 + lr=3e-4 + 500ep 是最优配方。
|
||||
|
||||
3. **变雷诺数: scratch 和 transfer 各有侧重。** 两者均保留。
|
||||
|
||||
4. **变雷诺数存在 CD/CL ↔ r_sim 根本性 trade-off。** 训练越久 r_cd 越高但 r_sim 越低(re60_sc: Ep60 r_sim=0.48 → Ep390 r_sim=0.26, r_cd=0.99)。CD/CL reward 分量主导了优化方向。
|
||||
|
||||
5. **降低 W_drag/W_lift (0.1) 有害。** CD/CL reward 是稳定器而非瓶颈。
|
||||
|
||||
6. **Ep1 r_sim ≥ 0.5 可预测 transfer 成功。**
|
||||
Reference in New Issue
Block a user