forked from flagos-ai/FlagScale
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconfiguration_qwen_gr00t.py
More file actions
93 lines (73 loc) · 3.44 KB
/
Copy pathconfiguration_qwen_gr00t.py
File metadata and controls
93 lines (73 loc) · 3.44 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
from __future__ import annotations
from dataclasses import dataclass, field
from logging import getLogger
from typing import TYPE_CHECKING, Any
from flagscale.models.configs.types import NormalizationMode
from flagscale.models.utils.constants import ACTION
from flagscale.models.vla.action_model.gr00t_action_header import GR00TActionHeadConfig
from flagscale.models.vla.pretrained_config import PreTrainedConfig
from flagscale.models.vla.vlm.qwenvl_backbone import QwenVLConfig
if TYPE_CHECKING:
from flagscale.train.train_config import TrainConfig
logger = getLogger(__name__)
@dataclass
class QwenGr00tConfig(PreTrainedConfig):
vlm: QwenVLConfig = field(default_factory=QwenVLConfig)
action_model: GR00TActionHeadConfig = field(default_factory=GR00TActionHeadConfig)
prompt_template: str | None = None
# Chunked cross-entropy for VLM co-training loss.
# 0 = disabled (use HF model's built-in CE), >0 = chunk size in tokens.
chunked_ce_tokens: int = 0
normalization_mapping: dict[str, NormalizationMode] = field(
default_factory=lambda: {
"VISUAL": NormalizationMode.IDENTITY,
"STATE": NormalizationMode.MIN_MAX,
"ACTION": NormalizationMode.MIN_MAX,
}
)
@property
def observation_delta_indices(self) -> list[int]:
return [0]
@property
def action_delta_indices(self) -> list[int]:
return list(range(self.action_model.future_action_window_size + 1))
def validate_features(self) -> None:
if not self.output_features:
raise ValueError("output_features must be set")
action_ft = self.action_feature
if action_ft is None:
raise ValueError(f"output_features must contain '{ACTION}' with type ACTION")
@classmethod
def from_train_config(cls, train_config: TrainConfig) -> QwenGr00tConfig:
model_cfg = train_config.model
vlm_section = model_cfg.vlm
vlm = QwenVLConfig(
type=vlm_section.get("type", "qwen3-vl"),
base_vlm=vlm_section.get("base_vlm", ""),
load_pretrained=vlm_section.get("load_pretrained", True),
attn_implementation=vlm_section.get("attn_implementation", None),
)
action_model = GR00TActionHeadConfig.from_omegaconf(model_cfg.action_model)
prompt_template = getattr(model_cfg, "prompt_template", None)
chunked_ce_tokens = getattr(model_cfg, "chunked_ce_tokens", 0)
kwargs = dict(
vlm=vlm,
action_model=action_model,
prompt_template=prompt_template,
chunked_ce_tokens=chunked_ce_tokens,
)
raw_norm = getattr(model_cfg, "normalization_mapping", None)
if raw_norm is not None:
kwargs["normalization_mapping"] = {k: NormalizationMode(v) for k, v in raw_norm.items()}
return cls(**kwargs)
@classmethod
def _from_dict(cls, data: dict[str, Any]) -> QwenGr00tConfig:
if "vlm" in data and isinstance(data["vlm"], dict):
data["vlm"] = QwenVLConfig(**data["vlm"])
if "action_model" in data and isinstance(data["action_model"], dict):
data["action_model"] = GR00TActionHeadConfig(**data["action_model"])
if "normalization_mapping" in data and isinstance(data["normalization_mapping"], dict):
data["normalization_mapping"] = {
k: NormalizationMode(v) for k, v in data["normalization_mapping"].items()
}
return cls(**data)