Auto-sync: 2026-06-27 10:45:23
Browse files
dovla_cil/training/trainer.py
CHANGED
|
@@ -65,6 +65,7 @@ class TrainerConfig:
|
|
| 65 |
backbone_local_files_only: bool = True
|
| 66 |
backbone_feature_cache: str | Path | None = None
|
| 67 |
backbone_feature_batch_size: int = 64
|
|
|
|
| 68 |
|
| 69 |
def __post_init__(self) -> None:
|
| 70 |
if self.lr is not None:
|
|
@@ -98,6 +99,12 @@ class TrainerConfig:
|
|
| 98 |
raise ValueError("CLIP backbone requires backbone_model")
|
| 99 |
if self.backbone_feature_batch_size <= 0:
|
| 100 |
raise ValueError("backbone_feature_batch_size must be positive")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 101 |
|
| 102 |
|
| 103 |
class DoVLATrainer:
|
|
@@ -268,7 +275,10 @@ class DoVLATrainer:
|
|
| 268 |
pred_reward, [record.group_id for record in records]
|
| 269 |
)
|
| 270 |
|
| 271 |
-
best_records = _best_records_by_group(
|
|
|
|
|
|
|
|
|
|
| 272 |
best_obs = self._obs_tensor(best_records)
|
| 273 |
best_actions = self._action_tensor(best_records)
|
| 274 |
best_instructions = [record.instruction for record in best_records]
|
|
@@ -655,12 +665,28 @@ def _group_regret_from_potential(potential, group_ids: list[str]):
|
|
| 655 |
return output
|
| 656 |
|
| 657 |
|
| 658 |
-
def _best_records_by_group(
|
|
|
|
|
|
|
|
|
|
| 659 |
best: dict[str, CILRecord] = {}
|
| 660 |
for record in records:
|
|
|
|
|
|
|
| 661 |
current = best.get(record.group_id)
|
| 662 |
if current is None or _record_score(record) > _record_score(current):
|
| 663 |
best[record.group_id] = record
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 664 |
return list(best.values())
|
| 665 |
|
| 666 |
|
|
|
|
| 65 |
backbone_local_files_only: bool = True
|
| 66 |
backbone_feature_cache: str | Path | None = None
|
| 67 |
backbone_feature_batch_size: int = 64
|
| 68 |
+
policy_target_types: tuple[str, ...] = ()
|
| 69 |
|
| 70 |
def __post_init__(self) -> None:
|
| 71 |
if self.lr is not None:
|
|
|
|
| 99 |
raise ValueError("CLIP backbone requires backbone_model")
|
| 100 |
if self.backbone_feature_batch_size <= 0:
|
| 101 |
raise ValueError("backbone_feature_batch_size must be positive")
|
| 102 |
+
if isinstance(self.policy_target_types, str):
|
| 103 |
+
self.policy_target_types = tuple(
|
| 104 |
+
item.strip()
|
| 105 |
+
for item in self.policy_target_types.split(",")
|
| 106 |
+
if item.strip()
|
| 107 |
+
)
|
| 108 |
|
| 109 |
|
| 110 |
class DoVLATrainer:
|
|
|
|
| 275 |
pred_reward, [record.group_id for record in records]
|
| 276 |
)
|
| 277 |
|
| 278 |
+
best_records = _best_records_by_group(
|
| 279 |
+
records,
|
| 280 |
+
candidate_types=self.config.policy_target_types,
|
| 281 |
+
)
|
| 282 |
best_obs = self._obs_tensor(best_records)
|
| 283 |
best_actions = self._action_tensor(best_records)
|
| 284 |
best_instructions = [record.instruction for record in best_records]
|
|
|
|
| 665 |
return output
|
| 666 |
|
| 667 |
|
| 668 |
+
def _best_records_by_group(
|
| 669 |
+
records: list[CILRecord], *, candidate_types: tuple[str, ...] = ()
|
| 670 |
+
) -> list[CILRecord]:
|
| 671 |
+
allowed = set(candidate_types)
|
| 672 |
best: dict[str, CILRecord] = {}
|
| 673 |
for record in records:
|
| 674 |
+
if allowed and record.candidate_type not in allowed:
|
| 675 |
+
continue
|
| 676 |
current = best.get(record.group_id)
|
| 677 |
if current is None or _record_score(record) > _record_score(current):
|
| 678 |
best[record.group_id] = record
|
| 679 |
+
if allowed:
|
| 680 |
+
missing_group_ids = {record.group_id for record in records} - set(best)
|
| 681 |
+
if missing_group_ids:
|
| 682 |
+
fallback = _best_records_by_group(records)
|
| 683 |
+
best.update(
|
| 684 |
+
{
|
| 685 |
+
record.group_id: record
|
| 686 |
+
for record in fallback
|
| 687 |
+
if record.group_id in missing_group_ids
|
| 688 |
+
}
|
| 689 |
+
)
|
| 690 |
return list(best.values())
|
| 691 |
|
| 692 |
|