File size: 4,917 Bytes
5d08972
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
# First hour on a new machine

Do these in order. Everything else β€” how the pipeline works, why the sources are picked the
way they are, runtime numbers β€” is in `README.md`; this file is only the setup path.

Assumes you have this repo and nothing else.

---

## 0. What you must bring yourself

| | size | why it is not here |
|---|---|---|
| **WAN weights** β€” `Wan2.1-VACE-1.3B`, `VACE-Annotators` | 31 GB | too large to ship; get them from the VACE release or copy from the original machine |
| **GPU** with β‰₯ 27 GB free | | `--offload_model False` keeps the DiT resident |

Everything else is in this repo.

---

## 1. Unpack the data (~3 GB, 2 min)

```bash
cd <repo>/                       # the directory holding aug32/, VACE/, datasets_pack/
mkdir -p data && cd data
tar -xf  ../datasets_pack/source_episodes.tar       # 2.7 GB -> pickplace_target_human/
tar -xzf ../datasets_pack/aug_materials_ext.tar.gz  # 121 MB -> aug_materials_ext/
tar -xzf ../datasets_pack/target_meshes.tar.gz      #  14 MB -> objaverse/ lightwheel/
cd ..
```

Check:

```
data/pickplace_target_human/<5 tasks>/{videos,extras}
data/aug_materials_ext/<4 tasks>/ep<N>/mask_gt_target_object_<camera>.mp4
data/{objaverse,lightwheel}/<category>/<model>/model.xml
```

---

## 2. Link the WAN weights

```bash
ln -s /path/to/VACE-home-models VACE/models
ls VACE/models        # must show Wan2.1-VACE-1.3B and VACE-Annotators
```

---

## 3. Build two Python environments

**A β€” batch driver.** Needs `robocasa`, `robosuite`, `mujoco`, `trimesh`, `pyrender`,
`opencv-python`, `numpy`. This one also renders the target meshes' reference views, so
`trimesh` + `pyrender` are not optional. Versions that work: mujoco 3.3.1, robosuite 1.5.2,
robocasa 1.0.0, trimesh 4.12.1, pyrender 0.1.45, numpy 1.26.4, Python 3.10.

**B β€” WAN inference.** Python 3.12, `torch 2.5.1+cu124`, `flash_attn 2.8.3`, plus
`VACE/requirements.txt`. `wan` must be importable (it is a site-package in the original
environment, installed from the VACE repo).

```bash
export VACE_PY_ROBOCASA=/path/to/env-A/bin/python
export VACE_PY_WAN=/path/to/env-B/bin/python
```

---

## 4. Export the data paths

```bash
cd <repo>
export VACE_ROBOCASA_ROOT=$PWD/data/pickplace_target_human
export VACE_AUG_MATERIALS=$PWD/data/aug_materials_ext
export VACE_ASSET_ROOTS=$PWD/data/lightwheel:$PWD/data/objaverse
```

Leave `VACE_RENDER_SCRIPT_DIR` and `VACE_RENDER_PYTHON` alone β€” they default to
`aug32/vendor/` and to `VACE_PY_ROBOCASA`, both already correct.

Put all five exports in a file you can `source`; every later step needs them.

---

## 5. Preflight

```bash
./aug32/preflight.sh
```

Every line must read `OK`. It checks both interpreters, the vendored renderer and its
imports, the VACE fork and weights, the three data roots, per-task GT-mask coverage, and
free GPU memory. A `MISS` names the exact path that is wrong.

---

## 6. Smoke test before the real batch

One assignment end to end, ~10 min on one GPU, to catch a broken path before a multi-hour
run:

```bash
mkdir -p /tmp/vace_smoke
$VACE_PY_ROBOCASA aug32/build_aug32_assignments.py \
    --out-root /tmp/vace_smoke --per-mesh 1 --targets teapot/teapot_6
head -1 /tmp/vace_smoke/assignments.jsonl > /tmp/vace_smoke/one.jsonl
mv /tmp/vace_smoke/one.jsonl /tmp/vace_smoke/assignments.jsonl
./aug32/run_aug32.sh /tmp/vace_smoke /tmp/vace_smoke_out 0
```

Expect `/tmp/vace_smoke_out/<task>-ep<N>_<src>_teapot_6/` with three camera folders, each
holding one mp4.

---

## 7. The real run

```bash
./aug32/run_aug32.sh /scratch/vace_aug32 /scratch/output_aug_256 0
```

8 targets Γ— 32 episodes Γ— 3 cameras β‰ˆ 3,084 WAN jobs, **~44 h on one GPU** at the measured
51.4 s/job. Split it: `run_aug32.sh ... <gpu> 4` writes four worker manifests, and the four
WAN processes can be moved onto four GPUs (~11 h). Every stage is idempotent, so an
interrupted run resumes where it stopped.

---

## Common failures

| symptom | cause |
|---|---|
| `FileNotFoundError: Missing GT target-object mask video` | `VACE_AUG_MATERIALS` not exported, or pointing above `aug_materials_ext/` |
| `ModuleNotFoundError: No module named 'trimesh'` during `prep-worker` | env A lacks trimesh/pyrender β€” install them, or point `VACE_RENDER_PYTHON` at an env that has them |
| `unrecognized arguments: --batch_manifest` | `VACE/` was replaced with a fresh upstream clone; apply `aug32/vace_wan_inference_batch.patch` |
| WAN job ~82 s instead of ~51 s | `--offload_model False` got dropped; it is in `run_aug32.sh`, do not remove it |
| exo cameras come out with the object *erased* rather than swapped | expected at 256Γ—256 β€” the target mask is ~0.2 % of an exo frame. Only `robot0_eye_in_hand` (~9 %) reliably swaps |
| assignments have fewer same-category sources than expected | the dataset only holds 5 teapot / 3 donut / 2 jar / 2 syrup_bottle episodes. Only MeasuringCup009 can fill 32 from its own category |