lfhe commited on
Commit
078bb00
·
verified ·
1 Parent(s): 9eba4d8

Upload minimal VLA policy files

Browse files
action_head.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:2ea073913c7192233212994e8a31860643dfd3a61b86e4bc98a5d5d0cdee40e4
3
+ size 1208549892
chat_template.jinja ADDED
@@ -0,0 +1,7 @@
 
 
 
 
 
 
 
 
1
+ {% set image_count = namespace(value=0) %}{% set video_count = namespace(value=0) %}{% for message in messages %}{% if loop.first and message['role'] != 'system' %}<|im_start|>system
2
+ You are a helpful assistant.<|im_end|>
3
+ {% endif %}<|im_start|>{{ message['role'] }}
4
+ {% if message['content'] is string %}{{ message['content'] }}<|im_end|>
5
+ {% else %}{% for content in message['content'] %}{% if content['type'] == 'image' or 'image' in content or 'image_url' in content %}{% set image_count.value = image_count.value + 1 %}{% if add_vision_id %}Picture {{ image_count.value }}: {% endif %}<|vision_start|><|image_pad|><|vision_end|>{% elif content['type'] == 'video' or 'video' in content %}{% set video_count.value = video_count.value + 1 %}{% if add_vision_id %}Video {{ video_count.value }}: {% endif %}<|vision_start|><|video_pad|><|vision_end|>{% elif 'text' in content %}{{ content['text'] }}{% endif %}{% endfor %}<|im_end|>
6
+ {% endif %}{% endfor %}{% if add_generation_prompt %}<|im_start|>assistant
7
+ {% endif %}
config.json ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "architectures": [
3
+ "Qwen2_5_VLForConditionalGeneration"
4
+ ],
5
+ "dtype": "bfloat16",
6
+ "image_token_id": 151655,
7
+ "model_type": "qwen2_5_vl",
8
+ "text_config": {
9
+ "attention_dropout": 0.0,
10
+ "bos_token_id": 151643,
11
+ "dtype": "bfloat16",
12
+ "eos_token_id": 151645,
13
+ "hidden_act": "silu",
14
+ "hidden_size": 2048,
15
+ "initializer_range": 0.02,
16
+ "intermediate_size": 11008,
17
+ "layer_types": [
18
+ "full_attention",
19
+ "full_attention",
20
+ "full_attention",
21
+ "full_attention",
22
+ "full_attention",
23
+ "full_attention",
24
+ "full_attention",
25
+ "full_attention",
26
+ "full_attention",
27
+ "full_attention",
28
+ "full_attention",
29
+ "full_attention",
30
+ "full_attention",
31
+ "full_attention",
32
+ "full_attention",
33
+ "full_attention",
34
+ "full_attention",
35
+ "full_attention",
36
+ "full_attention",
37
+ "full_attention",
38
+ "full_attention",
39
+ "full_attention",
40
+ "full_attention",
41
+ "full_attention",
42
+ "full_attention",
43
+ "full_attention",
44
+ "full_attention",
45
+ "full_attention",
46
+ "full_attention",
47
+ "full_attention",
48
+ "full_attention",
49
+ "full_attention",
50
+ "full_attention",
51
+ "full_attention",
52
+ "full_attention",
53
+ "full_attention"
54
+ ],
55
+ "max_position_embeddings": 128000,
56
+ "max_window_layers": 70,
57
+ "model_type": "qwen2_5_vl_text",
58
+ "num_attention_heads": 16,
59
+ "num_hidden_layers": 36,
60
+ "num_key_value_heads": 2,
61
+ "pad_token_id": null,
62
+ "rms_norm_eps": 1e-06,
63
+ "rope_parameters": {
64
+ "mrope_section": [
65
+ 16,
66
+ 24,
67
+ 24
68
+ ],
69
+ "rope_theta": 1000000.0,
70
+ "rope_type": "default",
71
+ "type": "mrope"
72
+ },
73
+ "sliding_window": null,
74
+ "use_cache": true,
75
+ "use_sliding_window": false,
76
+ "vocab_size": 151936
77
+ },
78
+ "tie_word_embeddings": true,
79
+ "transformers_version": "5.3.0",
80
+ "video_token_id": 151656,
81
+ "vision_config": {
82
+ "depth": 32,
83
+ "dtype": "bfloat16",
84
+ "fullatt_block_indexes": [
85
+ 7,
86
+ 15,
87
+ 23,
88
+ 31
89
+ ],
90
+ "hidden_act": "silu",
91
+ "hidden_size": 1280,
92
+ "in_channels": 3,
93
+ "in_chans": 3,
94
+ "initializer_range": 0.02,
95
+ "intermediate_size": 3420,
96
+ "model_type": "qwen2_5_vl",
97
+ "num_heads": 16,
98
+ "out_hidden_size": 2048,
99
+ "patch_size": 14,
100
+ "spatial_merge_size": 2,
101
+ "spatial_patch_size": 14,
102
+ "temporal_patch_size": 2,
103
+ "tokens_per_second": 2,
104
+ "window_size": 112
105
+ },
106
+ "vision_end_token_id": 151653,
107
+ "vision_start_token_id": 151652,
108
+ "vision_token_id": 151654
109
+ }
flock_robotics_adapter.py ADDED
@@ -0,0 +1,84 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ from pathlib import Path
5
+
6
+ import numpy as np
7
+ import torch
8
+ import torch.nn as nn
9
+ from PIL import Image
10
+ from safetensors.torch import load_file
11
+ from transformers import AutoProcessor, Qwen2_5_VLForConditionalGeneration
12
+
13
+ ACTION_DIM = 7
14
+
15
+
16
+ def build_action_head(hidden_size, head_hidden):
17
+ return nn.Sequential(
18
+ nn.Linear(hidden_size, head_hidden),
19
+ nn.GELU(),
20
+ nn.Linear(head_hidden, head_hidden),
21
+ nn.GELU(),
22
+ nn.Linear(head_hidden, ACTION_DIM),
23
+ )
24
+
25
+
26
+ class QwenVLAPolicy:
27
+ def __init__(self, model, processor, head, device):
28
+ self.model = model
29
+ self.processor = processor
30
+ self.head = head
31
+ self.device = device
32
+ self.model.eval()
33
+ self.head.eval()
34
+
35
+ @torch.no_grad()
36
+ def act(self, obs):
37
+ image = np.asarray(obs["image"], dtype=np.uint8)
38
+ instruction = str(obs.get("instruction", ""))
39
+ pil = Image.fromarray(image)
40
+ messages = [
41
+ {
42
+ "role": "user",
43
+ "content": [
44
+ {"type": "image"},
45
+ {"type": "text", "text": instruction},
46
+ ],
47
+ }
48
+ ]
49
+ text = self.processor.apply_chat_template(
50
+ messages, tokenize=False, add_generation_prompt=True
51
+ )
52
+ inputs = self.processor(
53
+ text=[text], images=[pil], return_tensors="pt", padding=True
54
+ )
55
+ inputs = {k: v.to(self.device) for k, v in inputs.items()}
56
+ out = self.model(**inputs, output_hidden_states=True, use_cache=False)
57
+ hidden = out.hidden_states[-1]
58
+ mask = inputs["attention_mask"].unsqueeze(-1).to(hidden.dtype)
59
+ pooled = (hidden * mask).sum(1) / mask.sum(1).clamp(min=1)
60
+ action = torch.tanh(self.head(pooled.float())).squeeze(0).cpu().numpy()
61
+ return np.clip(action, -1.0, 1.0).astype(np.float32)
62
+
63
+
64
+ def load_policy(model_dir, device, dtype):
65
+ model_root = Path(model_dir)
66
+ cfg = json.loads((model_root / "model_config.json").read_text())
67
+ use_cuda = device == "cuda" and torch.cuda.is_available()
68
+ torch_device = torch.device("cuda" if use_cuda else "cpu")
69
+ torch_dtype = (
70
+ torch.bfloat16
71
+ if (use_cuda and str(dtype) == "bfloat16")
72
+ else torch.float32
73
+ )
74
+ model = Qwen2_5_VLForConditionalGeneration.from_pretrained(
75
+ model_root, dtype=torch_dtype
76
+ ).to(torch_device)
77
+ processor = AutoProcessor.from_pretrained(model_root)
78
+ head = build_action_head(int(cfg["hidden_size"]), int(cfg["head_hidden"])).to(
79
+ torch_device
80
+ )
81
+ head.load_state_dict(
82
+ load_file(str(model_root / "action_head.safetensors"), device=str(torch_device))
83
+ )
84
+ return QwenVLAPolicy(model, processor, head, torch_device)
generation_config.json ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "bos_token_id": 151643,
3
+ "do_sample": true,
4
+ "eos_token_id": [
5
+ 151645,
6
+ 151643
7
+ ],
8
+ "pad_token_id": 151643,
9
+ "repetition_penalty": 1.05,
10
+ "temperature": 1e-06,
11
+ "transformers_version": "5.3.0"
12
+ }
model.safetensors ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ version https://git-lfs.github.com/spec/v1
2
+ oid sha256:05a02cbf57990c4d9b176489083c8509eec59daea405ce86043f199e1b18aea2
3
+ size 7509338080
model_config.json ADDED
@@ -0,0 +1,6 @@
 
 
 
 
 
 
 
1
+ {
2
+ "base_model": "Qwen/Qwen2.5-VL-3B-Instruct",
3
+ "hidden_size": 2048,
4
+ "head_hidden": 16384,
5
+ "action_dim": 7
6
+ }
processor_config.json ADDED
@@ -0,0 +1,63 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "image_processor": {
3
+ "data_format": "channels_first",
4
+ "do_convert_rgb": true,
5
+ "do_normalize": true,
6
+ "do_rescale": true,
7
+ "do_resize": true,
8
+ "image_mean": [
9
+ 0.48145466,
10
+ 0.4578275,
11
+ 0.40821073
12
+ ],
13
+ "image_processor_type": "Qwen2VLImageProcessorFast",
14
+ "image_std": [
15
+ 0.26862954,
16
+ 0.26130258,
17
+ 0.27577711
18
+ ],
19
+ "merge_size": 2,
20
+ "patch_size": 14,
21
+ "resample": 3,
22
+ "rescale_factor": 0.00392156862745098,
23
+ "size": {
24
+ "longest_edge": 12845056,
25
+ "shortest_edge": 3136
26
+ },
27
+ "temporal_patch_size": 2
28
+ },
29
+ "processor_class": "Qwen2_5_VLProcessor",
30
+ "video_processor": {
31
+ "data_format": "channels_first",
32
+ "default_to_square": true,
33
+ "do_convert_rgb": true,
34
+ "do_normalize": true,
35
+ "do_rescale": true,
36
+ "do_resize": true,
37
+ "do_sample_frames": false,
38
+ "image_mean": [
39
+ 0.48145466,
40
+ 0.4578275,
41
+ 0.40821073
42
+ ],
43
+ "image_processor_type": "Qwen2VLImageProcessor",
44
+ "image_std": [
45
+ 0.26862954,
46
+ 0.26130258,
47
+ 0.27577711
48
+ ],
49
+ "max_frames": 768,
50
+ "merge_size": 2,
51
+ "min_frames": 4,
52
+ "patch_size": 14,
53
+ "resample": 3,
54
+ "rescale_factor": 0.00392156862745098,
55
+ "return_metadata": false,
56
+ "size": {
57
+ "longest_edge": 12845056,
58
+ "shortest_edge": 3136
59
+ },
60
+ "temporal_patch_size": 2,
61
+ "video_processor_type": "Qwen2VLVideoProcessor"
62
+ }
63
+ }
tokenizer.json CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:d7edbeaf20dd7f571b5dd1c54d9ace4f9b6299127cc7ba2afb14a6d51a4a79a4
3
- size 17078136
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:3fd169731d2cbde95e10bf356d66d5997fd885dd8dbb6fb4684da3f23b2585d8
3
+ size 11421892
tokenizer_config.json CHANGED
The diff for this file is too large to render. See raw diff