doanh25032004 commited on
Commit
991941e
·
verified ·
1 Parent(s): 1ae1bd3

Add files using upload-large-folder tool

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. examples/aloha_real/Dockerfile +70 -0
  2. examples/aloha_real/README.md +126 -0
  3. packages/openpi-client/pyproject.toml +25 -0
  4. packages/openpi-client/src/openpi_client/__init__.py +1 -0
  5. packages/openpi-client/src/openpi_client/action_chunk_broker.py +45 -0
  6. packages/openpi-client/src/openpi_client/base_policy.py +12 -0
  7. packages/openpi-client/src/openpi_client/image_tools.py +58 -0
  8. packages/openpi-client/src/openpi_client/image_tools_test.py +37 -0
  9. packages/openpi-client/src/openpi_client/msgpack_numpy.py +57 -0
  10. packages/openpi-client/src/openpi_client/runtime/agent.py +17 -0
  11. packages/openpi-client/src/openpi_client/runtime/environment.py +32 -0
  12. packages/openpi-client/src/openpi_client/runtime/runtime.py +92 -0
  13. packages/openpi-client/src/openpi_client/runtime/subscriber.py +20 -0
  14. packages/openpi-client/src/openpi_client/websocket_client_policy.py +49 -0
  15. pi0_fast_base_params/d/900e9758c5a900a9363d9695ce317b05 +0 -0
  16. pi0_fast_base_params/ocdbt.process_0/d/188d9577d40fae6772f2a1e734d246a6 +0 -0
  17. pi0_fast_base_params/ocdbt.process_0/d/82430346fa8fc21f6c02b925d2071bbe +0 -0
  18. pi0_fast_base_params/ocdbt.process_0/d/8c8f756cbcb196e0b8950de1511a1889 +0 -0
  19. pi0_fast_base_params/ocdbt.process_0/d/c0125332e372918231585505ecbac6a0 +0 -0
  20. pi0_fast_base_params/ocdbt.process_0/d/f55c8d160596d5002991decf8dc4edc6 +0 -0
  21. pi0_fast_base_params/ocdbt.process_0/d/fbf426851e50f4721bba2e803e51535c +0 -0
  22. pi0_fast_base_params/ocdbt.process_0/manifest.ocdbt +0 -0
  23. rag/ricl_training_context_libero_10_test/metadata.json +0 -0
  24. scripts/docker/compose.yml +29 -0
  25. scripts/docker/install_docker_ubuntu22.sh +37 -0
  26. scripts/docker/install_nvidia_container_toolkit.sh +17 -0
  27. scripts/docker/serve_policy.Dockerfile +34 -0
  28. scripts/logs/eval_pi0fast_libero.out +1243 -0
  29. scripts/logs/pi0fast_baseline_libero_h100.err +0 -0
  30. scripts/logs/pi0fast_baseline_libero_h100.out +569 -0
  31. scripts/serve_policy_ricl.py +90 -0
  32. scripts/test_ricl_data_pipeline.py +219 -0
  33. scripts/test_ricl_data_pipeline_v2.py +206 -0
  34. scripts/train.py +273 -0
  35. scripts/train_debug_interactive.sh +48 -0
  36. scripts/train_pi0_fast_baseline_libero.slurm +85 -0
  37. scripts/train_pi0_fast_ricl.py +317 -0
  38. scripts/train_pi0_fast_ricl_libero_80k.slurm +69 -0
  39. scripts/train_pi0_fast_ricl_libero_80k_2nn.slurm +70 -0
  40. scripts/train_test.py +30 -0
  41. scripts/verify_ricl_training_setup.py +514 -0
  42. src/openpi/__pycache__/__init__.cpython-313.pyc +0 -0
  43. src/openpi/data/__pycache__/ricl_libero_dataset.cpython-310.pyc +0 -0
  44. src/openpi/data/__pycache__/ricl_libero_dataset.cpython-313.pyc +0 -0
  45. src/openpi/models/__pycache__/__init__.cpython-310.pyc +0 -0
  46. src/openpi/models/__pycache__/gemma.cpython-310.pyc +0 -0
  47. src/openpi/models/__pycache__/gemma_fast.cpython-310.pyc +0 -0
  48. src/openpi/models/__pycache__/lora.cpython-310.pyc +0 -0
  49. src/openpi/models/__pycache__/model.cpython-310.pyc +0 -0
  50. src/openpi/models/__pycache__/pi0.cpython-310.pyc +0 -0
examples/aloha_real/Dockerfile ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Dockerfile for the Aloha real environment.
2
+
3
+ # Build the container:
4
+ # docker build . -t aloha_real -f examples/aloha_real/Dockerfile
5
+
6
+ # Run the container:
7
+ # docker run --rm -it --network=host -v /dev:/dev -v .:/app --privileged aloha_real /bin/bash
8
+
9
+ FROM ros:noetic-robot@sha256:0e12e4db836e78c74c4b04c6d16f185d9a18d2b13cf5580747efa075eb6dc6e0
10
+ SHELL ["/bin/bash", "-c"]
11
+
12
+ ENV DEBIAN_FRONTEND=noninteractive
13
+ RUN apt-get update && \
14
+ apt-get install -y --no-install-recommends \
15
+ cmake \
16
+ curl \
17
+ libffi-dev \
18
+ python3-rosdep \
19
+ python3-rosinstall \
20
+ python3-rosinstall-generator \
21
+ whiptail \
22
+ git \
23
+ wget \
24
+ openssh-client \
25
+ ros-noetic-cv-bridge \
26
+ ros-noetic-usb-cam \
27
+ ros-noetic-realsense2-camera \
28
+ keyboard-configuration
29
+
30
+ WORKDIR /root
31
+ RUN curl 'https://raw.githubusercontent.com/Interbotix/interbotix_ros_manipulators/main/interbotix_ros_xsarms/install/amd64/xsarm_amd64_install.sh' > xsarm_amd64_install.sh
32
+ RUN chmod +x xsarm_amd64_install.sh
33
+ RUN export TZ='America/Los_Angeles' && ./xsarm_amd64_install.sh -d noetic -n
34
+
35
+ COPY ./third_party/aloha /root/interbotix_ws/src/aloha
36
+ RUN cd /root/interbotix_ws && source /opt/ros/noetic/setup.sh && source /root/interbotix_ws/devel/setup.sh && catkin_make
37
+
38
+ # Install python 3.10 because this ROS image comes with 3.8
39
+ RUN mkdir /python && \
40
+ cd /python && \
41
+ wget https://www.python.org/ftp/python/3.10.14/Python-3.10.14.tgz && \
42
+ tar -zxvf Python-3.10.14.tgz && \
43
+ cd Python-3.10.14 && \
44
+ ls -lhR && \
45
+ ./configure --enable-optimizations && \
46
+ make install && \
47
+ echo 'alias python3="/usr/local/bin/python3.10"' >> ~/.bashrc && \
48
+ echo 'alias python="/usr/local/bin/python3.10"' >> ~/.bashrc && \
49
+ cd ~ && rm -rf /python && \
50
+ rm -rf /var/lib/apt/lists/*
51
+
52
+ COPY --from=ghcr.io/astral-sh/uv:0.5.6 /uv /bin/uv
53
+ ENV UV_HTTP_TIMEOUT=120
54
+ ENV UV_LINK_MODE=copy
55
+ COPY ./examples/aloha_real/requirements.txt /tmp/requirements.txt
56
+ COPY ./packages/openpi-client/pyproject.toml /tmp/openpi-client/pyproject.toml
57
+ RUN uv pip sync --python 3.10 --system /tmp/requirements.txt /tmp/openpi-client/pyproject.toml
58
+
59
+ ENV PYTHONPATH=/app:/app/src:/app/packages/openpi-client/src:/root/interbotix_ws/src/aloha/aloha_scripts:/root/interbotix_ws/src/aloha
60
+ WORKDIR /app
61
+
62
+ # Create an entrypoint script to run the setup commands, followed by the command passed in.
63
+ RUN cat <<'EOF' > /usr/local/bin/entrypoint.sh
64
+ #!/bin/bash
65
+ source /opt/ros/noetic/setup.sh && source /root/interbotix_ws/devel/setup.sh && "$@"
66
+ EOF
67
+ RUN chmod +x /usr/local/bin/entrypoint.sh
68
+
69
+ ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
70
+ CMD ["python3", "/app/examples/aloha_real/main.py"]
examples/aloha_real/README.md ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Run Aloha (Real Robot)
2
+
3
+ This example demonstrates how to run with a real robot using an [ALOHA setup](https://github.com/tonyzhaozh/aloha). See [here](../../docs/remote_inference.md) for instructions on how to load checkpoints and run inference. We list the relevant checkpoint paths for each provided fine-tuned model below.
4
+
5
+ ## Prerequisites
6
+
7
+ This repo uses a fork of the ALOHA repo, with very minor modifications to use Realsense cameras.
8
+
9
+ 1. Follow the [hardware installation instructions](https://github.com/tonyzhaozh/aloha?tab=readme-ov-file#hardware-installation) in the ALOHA repo.
10
+ 1. Modify the `third_party/aloha/aloha_scripts/realsense_publisher.py` file to use serial numbers for your cameras.
11
+
12
+ ## With Docker
13
+
14
+ ```bash
15
+ export SERVER_ARGS="--env ALOHA --default_prompt='take the toast out of the toaster'"
16
+ docker compose -f examples/aloha_real/compose.yml up --build
17
+ ```
18
+
19
+ ## Without Docker
20
+
21
+ Terminal window 1:
22
+
23
+ ```bash
24
+ # Create virtual environment
25
+ uv venv --python 3.10 examples/aloha_real/.venv
26
+ source examples/aloha_real/.venv/bin/activate
27
+ uv pip sync examples/aloha_real/requirements.txt
28
+ uv pip install -e packages/openpi-client
29
+
30
+ # Run the robot
31
+ python examples/aloha_real/main.py
32
+ ```
33
+
34
+ Terminal window 2:
35
+
36
+ ```bash
37
+ roslaunch --wait aloha ros_nodes.launch
38
+ ```
39
+
40
+ Terminal window 3:
41
+
42
+ ```bash
43
+ uv run scripts/serve_policy.py --env ALOHA --default_prompt='take the toast out of the toaster'
44
+ ```
45
+
46
+ ## **ALOHA Checkpoint Guide**
47
+
48
+
49
+ The `pi0_base` model can be used in zero shot for a simple task on the ALOHA platform, and we additionally provide two example fine-tuned checkpoints, “fold the towel” and “open the tupperware and put the food on the plate,” which can perform more advanced tasks on the ALOHA.
50
+
51
+ While we’ve found the policies to work in unseen conditions across multiple ALOHA stations, we provide some pointers here on how best to set up scenes to maximize the chance of policy success. We cover the prompts to use for the policies, objects we’ve seen it work well on, and well-represented initial state distributions. Running these policies in zero shot is still a very experimental feature, and there is no guarantee that they will work on your robot. The recommended way to use `pi0_base` is by finetuning with data from the target robot.
52
+
53
+
54
+ ---
55
+
56
+ ### **Toast Task**
57
+
58
+ This task involves the robot taking two pieces of toast out of a toaster and placing them on a plate.
59
+
60
+ - **Checkpoint path**: `s3://openpi-assets/checkpoints/pi0_base`
61
+ - **Prompt**: "take the toast out of the toaster"
62
+ - **Objects needed**: Two pieces of toast, a plate, and a standard toaster.
63
+ - **Object Distribution**:
64
+ - Works on both real toast and rubber fake toast
65
+ - Compatible with standard 2-slice toasters
66
+ - Works with plates of varying colors
67
+
68
+ ### **Scene Setup Guidelines**
69
+ <img width="500" alt="Screenshot 2025-01-31 at 10 06 02 PM" src="https://github.com/user-attachments/assets/3d043d95-9d1c-4dda-9991-e63cae61e02e" />
70
+
71
+ - The toaster should be positioned in the top-left quadrant of the workspace.
72
+ - Both pieces of toast should start inside the toaster, with at least 1 cm of bread sticking out from the top.
73
+ - The plate should be placed roughly in the lower-center of the workspace.
74
+ - Works with both natural and synthetic lighting, but avoid making the scene too dark (e.g., don't place the setup inside an enclosed space or under a curtain).
75
+
76
+
77
+ ### **Towel Task**
78
+
79
+ This task involves folding a small towel (e.g., roughly the size of a hand towel) into eighths.
80
+
81
+ - **Checkpoint path**: `s3://openpi-assets/checkpoints/pi0_aloha_towel`
82
+ - **Prompt**: "fold the towel"
83
+ - **Object Distribution**:
84
+ - Works on towels of varying solid colors
85
+ - Performance is worse on heavily textured or striped towels
86
+
87
+ ### **Scene Setup Guidelines**
88
+ <img width="500" alt="Screenshot 2025-01-31 at 10 01 15 PM" src="https://github.com/user-attachments/assets/9410090c-467d-4a9c-ac76-96e5b4d00943" />
89
+
90
+ - The towel should be flattened and roughly centered on the table.
91
+ - Choose a towel that does not blend in with the table surface.
92
+
93
+
94
+ ### **Tupperware Task**
95
+
96
+ This task involves opening a tupperware filled with food and pouring the contents onto a plate.
97
+
98
+ - **Checkpoint path**: `s3://openpi-assets/checkpoints/pi0_aloha_tupperware`
99
+ - **Prompt**: "open the tupperware and put the food on the plate"
100
+ - **Objects needed**: Tupperware, food (or food-like items), and a plate.
101
+ - **Object Distribution**:
102
+ - Works on various types of fake food (e.g., fake chicken nuggets, fries, and fried chicken).
103
+ - Compatible with tupperware of different lid colors and shapes, with best performance on square tupperware with a corner flap (see images below).
104
+ - The policy has seen plates of varying solid colors.
105
+
106
+ ### **Scene Setup Guidelines**
107
+ <img width="500" alt="Screenshot 2025-01-31 at 10 02 27 PM" src="https://github.com/user-attachments/assets/60fc1de0-2d64-4076-b903-f427e5e9d1bf" />
108
+
109
+ - Best performance observed when both the tupperware and plate are roughly centered in the workspace.
110
+ - Positioning:
111
+ - Tupperware should be on the left.
112
+ - Plate should be on the right or bottom.
113
+ - The tupperware flap should point toward the plate.
114
+
115
+ ## Training on your own Aloha dataset
116
+
117
+ 1. Convert the dataset to the LeRobot dataset v2.0 format.
118
+
119
+ We provide a script [convert_aloha_data_to_lerobot.py](./convert_aloha_data_to_lerobot.py) that converts the dataset to the LeRobot dataset v2.0 format. As an example we have converted the `aloha_pen_uncap_diverse_raw` dataset from the [BiPlay repo](https://huggingface.co/datasets/oier-mees/BiPlay/tree/main/aloha_pen_uncap_diverse_raw) and uploaded it to the HuggingFace Hub as [physical-intelligence/aloha_pen_uncap_diverse](https://huggingface.co/datasets/physical-intelligence/aloha_pen_uncap_diverse).
120
+
121
+
122
+ 2. Define a training config that uses the custom dataset.
123
+
124
+ We provide the [pi0_aloha_pen_uncap config](../../src/openpi/training/config.py) as an example. You should refer to the root [README](../../README.md) for how to run training with the new config.
125
+
126
+ IMPORTANT: Our base checkpoint includes normalization stats from various common robot configurations. When fine-tuning a base checkpoint with a custom dataset from one of these configurations, we recommend using the corresponding normalization stats provided in the base checkpoint. In the example, this is done by specifying the trossen asset_id and a path to the pretrained checkpoint’s asset directory within the AssetsConfig.
packages/openpi-client/pyproject.toml ADDED
@@ -0,0 +1,25 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ [project]
2
+ name = "openpi-client"
3
+ version = "0.1.0"
4
+ requires-python = ">=3.7"
5
+ dependencies = [
6
+ "dm-tree>=0.1.8",
7
+ "msgpack>=1.0.5",
8
+ "numpy>=1.21.6",
9
+ "pillow>=9.0.0",
10
+ "tree>=0.2.4",
11
+ "websockets>=11.0",
12
+ ]
13
+
14
+ [build-system]
15
+ requires = ["hatchling"]
16
+ build-backend = "hatchling.build"
17
+
18
+ [tool.uv]
19
+ dev-dependencies = [
20
+ "pytest>=8.3.4",
21
+ ]
22
+
23
+ [tool.ruff]
24
+ line-length = 120
25
+ target-version = "py37"
packages/openpi-client/src/openpi_client/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ __version__ = "0.1.0"
packages/openpi-client/src/openpi_client/action_chunk_broker.py ADDED
@@ -0,0 +1,45 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from typing import Dict
2
+
3
+ import numpy as np
4
+ import tree
5
+ from typing_extensions import override
6
+
7
+ from openpi_client import base_policy as _base_policy
8
+
9
+
10
+ class ActionChunkBroker(_base_policy.BasePolicy):
11
+ """Wraps a policy to return action chunks one-at-a-time.
12
+
13
+ Assumes that the first dimension of all action fields is the chunk size.
14
+
15
+ A new inference call to the inner policy is only made when the current
16
+ list of chunks is exhausted.
17
+ """
18
+
19
+ def __init__(self, policy: _base_policy.BasePolicy, action_horizon: int):
20
+ self._policy = policy
21
+
22
+ self._action_horizon = action_horizon
23
+ self._cur_step: int = 0
24
+
25
+ self._last_results: Dict[str, np.ndarray] | None = None
26
+
27
+ @override
28
+ def infer(self, obs: Dict) -> Dict: # noqa: UP006
29
+ if self._last_results is None:
30
+ self._last_results = self._policy.infer(obs)
31
+ self._cur_step = 0
32
+
33
+ results = tree.map_structure(lambda x: x[self._cur_step, ...], self._last_results)
34
+ self._cur_step += 1
35
+
36
+ if self._cur_step >= self._action_horizon:
37
+ self._last_results = None
38
+
39
+ return results
40
+
41
+ @override
42
+ def reset(self) -> None:
43
+ self._policy.reset()
44
+ self._last_results = None
45
+ self._cur_step = 0
packages/openpi-client/src/openpi_client/base_policy.py ADDED
@@ -0,0 +1,12 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import abc
2
+ from typing import Dict
3
+
4
+
5
+ class BasePolicy(abc.ABC):
6
+ @abc.abstractmethod
7
+ def infer(self, obs: Dict) -> Dict:
8
+ """Infer actions from observations."""
9
+
10
+ def reset(self) -> None:
11
+ """Reset the policy to its initial state."""
12
+ pass
packages/openpi-client/src/openpi_client/image_tools.py ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+ from PIL import Image
3
+
4
+
5
+ def convert_to_uint8(img: np.ndarray) -> np.ndarray:
6
+ """Converts an image to uint8 if it is a float image.
7
+
8
+ This is important for reducing the size of the image when sending it over the network.
9
+ """
10
+ if np.issubdtype(img.dtype, np.floating):
11
+ img = (255 * img).astype(np.uint8)
12
+ return img
13
+
14
+
15
+ def resize_with_pad(images: np.ndarray, height: int, width: int, method=Image.BILINEAR) -> np.ndarray:
16
+ """Replicates tf.image.resize_with_pad for multiple images using PIL. Resizes a batch of images to a target height.
17
+
18
+ Args:
19
+ images: A batch of images in [..., height, width, channel] format.
20
+ height: The target height of the image.
21
+ width: The target width of the image.
22
+ method: The interpolation method to use. Default is bilinear.
23
+
24
+ Returns:
25
+ The resized images in [..., height, width, channel].
26
+ """
27
+ # If the images are already the correct size, return them as is.
28
+ if images.shape[-3:-1] == (height, width):
29
+ return images
30
+
31
+ original_shape = images.shape
32
+
33
+ images = images.reshape(-1, *original_shape[-3:])
34
+ resized = np.stack([_resize_with_pad_pil(Image.fromarray(im), height, width, method=method) for im in images])
35
+ return resized.reshape(*original_shape[:-3], *resized.shape[-3:])
36
+
37
+
38
+ def _resize_with_pad_pil(image: Image.Image, height: int, width: int, method: int) -> Image.Image:
39
+ """Replicates tf.image.resize_with_pad for one image using PIL. Resizes an image to a target height and
40
+ width without distortion by padding with zeros.
41
+
42
+ Unlike the jax version, note that PIL uses [width, height, channel] ordering instead of [batch, h, w, c].
43
+ """
44
+ cur_width, cur_height = image.size
45
+ if cur_width == width and cur_height == height:
46
+ return image # No need to resize if the image is already the correct size.
47
+
48
+ ratio = max(cur_width / width, cur_height / height)
49
+ resized_height = int(cur_height / ratio)
50
+ resized_width = int(cur_width / ratio)
51
+ resized_image = image.resize((resized_width, resized_height), resample=method)
52
+
53
+ zero_image = Image.new(resized_image.mode, (width, height), 0)
54
+ pad_height = max(0, int((height - resized_height) / 2))
55
+ pad_width = max(0, int((width - resized_width) / 2))
56
+ zero_image.paste(resized_image, (pad_width, pad_height))
57
+ assert zero_image.size == (width, height)
58
+ return zero_image
packages/openpi-client/src/openpi_client/image_tools_test.py ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import numpy as np
2
+
3
+ import openpi_client.image_tools as image_tools
4
+
5
+
6
+ def test_resize_with_pad_shapes():
7
+ # Test case 1: Resize image with larger dimensions
8
+ images = np.zeros((2, 10, 10, 3), dtype=np.uint8) # Input images of shape (batch_size, height, width, channels)
9
+ height = 20
10
+ width = 20
11
+ resized_images = image_tools.resize_with_pad(images, height, width)
12
+ assert resized_images.shape == (2, height, width, 3)
13
+ assert np.all(resized_images == 0)
14
+
15
+ # Test case 2: Resize image with smaller dimensions
16
+ images = np.zeros((3, 30, 30, 3), dtype=np.uint8)
17
+ height = 15
18
+ width = 15
19
+ resized_images = image_tools.resize_with_pad(images, height, width)
20
+ assert resized_images.shape == (3, height, width, 3)
21
+ assert np.all(resized_images == 0)
22
+
23
+ # Test case 3: Resize image with the same dimensions
24
+ images = np.zeros((1, 50, 50, 3), dtype=np.uint8)
25
+ height = 50
26
+ width = 50
27
+ resized_images = image_tools.resize_with_pad(images, height, width)
28
+ assert resized_images.shape == (1, height, width, 3)
29
+ assert np.all(resized_images == 0)
30
+
31
+ # Test case 3: Resize image with odd-numbered padding
32
+ images = np.zeros((1, 256, 320, 3), dtype=np.uint8)
33
+ height = 60
34
+ width = 80
35
+ resized_images = image_tools.resize_with_pad(images, height, width)
36
+ assert resized_images.shape == (1, height, width, 3)
37
+ assert np.all(resized_images == 0)
packages/openpi-client/src/openpi_client/msgpack_numpy.py ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ """Adds NumPy array support to msgpack.
2
+
3
+ msgpack is good for (de)serializing data over a network for multiple reasons:
4
+ - msgpack is secure (as opposed to pickle/dill/etc which allow for arbitrary code execution)
5
+ - msgpack is widely used and has good cross-language support
6
+ - msgpack does not require a schema (as opposed to protobuf/flatbuffers/etc) which is convenient in dynamically typed
7
+ languages like Python and JavaScript
8
+ - msgpack is fast and efficient (as opposed to readable formats like JSON/YAML/etc); I found that msgpack was ~4x faster
9
+ than pickle for serializing large arrays using the below strategy
10
+
11
+ The code below is adapted from https://github.com/lebedov/msgpack-numpy. The reason not to use that library directly is
12
+ that it falls back to pickle for object arrays.
13
+ """
14
+
15
+ import functools
16
+
17
+ import msgpack
18
+ import numpy as np
19
+
20
+
21
+ def pack_array(obj):
22
+ if (isinstance(obj, (np.ndarray, np.generic))) and obj.dtype.kind in ("V", "O", "c"):
23
+ raise ValueError(f"Unsupported dtype: {obj.dtype}")
24
+
25
+ if isinstance(obj, np.ndarray):
26
+ return {
27
+ b"__ndarray__": True,
28
+ b"data": obj.tobytes(),
29
+ b"dtype": obj.dtype.str,
30
+ b"shape": obj.shape,
31
+ }
32
+
33
+ if isinstance(obj, np.generic):
34
+ return {
35
+ b"__npgeneric__": True,
36
+ b"data": obj.item(),
37
+ b"dtype": obj.dtype.str,
38
+ }
39
+
40
+ return obj
41
+
42
+
43
+ def unpack_array(obj):
44
+ if b"__ndarray__" in obj:
45
+ return np.ndarray(buffer=obj[b"data"], dtype=np.dtype(obj[b"dtype"]), shape=obj[b"shape"])
46
+
47
+ if b"__npgeneric__" in obj:
48
+ return np.dtype(obj[b"dtype"]).type(obj[b"data"])
49
+
50
+ return obj
51
+
52
+
53
+ Packer = functools.partial(msgpack.Packer, default=pack_array)
54
+ packb = functools.partial(msgpack.packb, default=pack_array)
55
+
56
+ Unpacker = functools.partial(msgpack.Unpacker, object_hook=unpack_array)
57
+ unpackb = functools.partial(msgpack.unpackb, object_hook=unpack_array)
packages/openpi-client/src/openpi_client/runtime/agent.py ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import abc
2
+
3
+
4
+ class Agent(abc.ABC):
5
+ """An Agent is the thing with agency, i.e. the entity that makes decisions.
6
+
7
+ Agents receive observations about the state of the world, and return actions
8
+ to take in response.
9
+ """
10
+
11
+ @abc.abstractmethod
12
+ def get_action(self, observation: dict) -> dict:
13
+ """Query the agent for the next action."""
14
+
15
+ @abc.abstractmethod
16
+ def reset(self) -> None:
17
+ """Reset the agent to its initial state."""
packages/openpi-client/src/openpi_client/runtime/environment.py ADDED
@@ -0,0 +1,32 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import abc
2
+
3
+
4
+ class Environment(abc.ABC):
5
+ """An Environment represents the robot and the environment it inhabits.
6
+
7
+ The primary contract of environments is that they can be queried for observations
8
+ about their state, and have actions applied to them to change that state.
9
+ """
10
+
11
+ @abc.abstractmethod
12
+ def reset(self) -> None:
13
+ """Reset the environment to its initial state.
14
+
15
+ This will be called once before starting each episode.
16
+ """
17
+
18
+ @abc.abstractmethod
19
+ def is_episode_complete(self) -> bool:
20
+ """Allow the environment to signal that the episode is complete.
21
+
22
+ This will be called after each step. It should return `True` if the episode is
23
+ complete (either successfully or unsuccessfully), and `False` otherwise.
24
+ """
25
+
26
+ @abc.abstractmethod
27
+ def get_observation(self) -> dict:
28
+ """Query the environment for the current state."""
29
+
30
+ @abc.abstractmethod
31
+ def apply_action(self, action: dict) -> None:
32
+ """Take an action in the environment."""
packages/openpi-client/src/openpi_client/runtime/runtime.py ADDED
@@ -0,0 +1,92 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ import threading
3
+ import time
4
+
5
+ from openpi_client.runtime import agent as _agent
6
+ from openpi_client.runtime import environment as _environment
7
+ from openpi_client.runtime import subscriber as _subscriber
8
+
9
+
10
+ class Runtime:
11
+ """The core module orchestrating interactions between key components of the system."""
12
+
13
+ def __init__(
14
+ self,
15
+ environment: _environment.Environment,
16
+ agent: _agent.Agent,
17
+ subscribers: list[_subscriber.Subscriber],
18
+ max_hz: float = 0,
19
+ num_episodes: int = 1,
20
+ max_episode_steps: int = 0,
21
+ ) -> None:
22
+ self._environment = environment
23
+ self._agent = agent
24
+ self._subscribers = subscribers
25
+ self._max_hz = max_hz
26
+ self._num_episodes = num_episodes
27
+ self._max_episode_steps = max_episode_steps
28
+
29
+ self._in_episode = False
30
+ self._episode_steps = 0
31
+
32
+ def run(self) -> None:
33
+ """Runs the runtime loop continuously until stop() is called or the environment is done."""
34
+ for _ in range(self._num_episodes):
35
+ self._run_episode()
36
+
37
+ # Final reset, this is important for real environments to move the robot to its home position.
38
+ self._environment.reset()
39
+
40
+ def run_in_new_thread(self) -> threading.Thread:
41
+ """Runs the runtime loop in a new thread."""
42
+ thread = threading.Thread(target=self.run)
43
+ thread.start()
44
+ return thread
45
+
46
+ def mark_episode_complete(self) -> None:
47
+ """Marks the end of an episode."""
48
+ self._in_episode = False
49
+
50
+ def _run_episode(self) -> None:
51
+ """Runs a single episode."""
52
+ logging.info("Starting episode...")
53
+ self._environment.reset()
54
+ self._agent.reset()
55
+ for subscriber in self._subscribers:
56
+ subscriber.on_episode_start()
57
+
58
+ self._in_episode = True
59
+ self._episode_steps = 0
60
+ step_time = 1 / self._max_hz if self._max_hz > 0 else 0
61
+ last_step_time = time.time()
62
+
63
+ while self._in_episode:
64
+ self._step()
65
+ self._episode_steps += 1
66
+
67
+ # Sleep to maintain the desired frame rate
68
+ now = time.time()
69
+ dt = now - last_step_time
70
+ if dt < step_time:
71
+ time.sleep(step_time - dt)
72
+ last_step_time = time.time()
73
+ else:
74
+ last_step_time = now
75
+
76
+ logging.info("Episode completed.")
77
+ for subscriber in self._subscribers:
78
+ subscriber.on_episode_end()
79
+
80
+ def _step(self) -> None:
81
+ """A single step of the runtime loop."""
82
+ observation = self._environment.get_observation()
83
+ action = self._agent.get_action(observation)
84
+ self._environment.apply_action(action)
85
+
86
+ for subscriber in self._subscribers:
87
+ subscriber.on_step(observation, action)
88
+
89
+ if self._environment.is_episode_complete() or (
90
+ self._max_episode_steps > 0 and self._episode_steps >= self._max_episode_steps
91
+ ):
92
+ self.mark_episode_complete()
packages/openpi-client/src/openpi_client/runtime/subscriber.py ADDED
@@ -0,0 +1,20 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import abc
2
+
3
+
4
+ class Subscriber(abc.ABC):
5
+ """Subscribes to events in the runtime.
6
+
7
+ Subscribers can be used to save data, visualize, etc.
8
+ """
9
+
10
+ @abc.abstractmethod
11
+ def on_episode_start(self) -> None:
12
+ """Called when an episode starts."""
13
+
14
+ @abc.abstractmethod
15
+ def on_step(self, observation: dict, action: dict) -> None:
16
+ """Append a step to the episode."""
17
+
18
+ @abc.abstractmethod
19
+ def on_episode_end(self) -> None:
20
+ """Called when an episode ends."""
packages/openpi-client/src/openpi_client/websocket_client_policy.py ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import logging
2
+ import time
3
+ from typing import Dict, Tuple
4
+
5
+ import websockets.sync.client
6
+ from typing_extensions import override
7
+
8
+ from openpi_client import base_policy as _base_policy
9
+ from openpi_client import msgpack_numpy
10
+
11
+
12
+ class WebsocketClientPolicy(_base_policy.BasePolicy):
13
+ """Implements the Policy interface by communicating with a server over websocket.
14
+
15
+ See WebsocketPolicyServer for a corresponding server implementation.
16
+ """
17
+
18
+ def __init__(self, host: str = "0.0.0.0", port: int = 8000) -> None:
19
+ self._uri = f"ws://{host}:{port}"
20
+ self._packer = msgpack_numpy.Packer()
21
+ self._ws, self._server_metadata = self._wait_for_server()
22
+
23
+ def get_server_metadata(self) -> Dict:
24
+ return self._server_metadata
25
+
26
+ def _wait_for_server(self) -> Tuple[websockets.sync.client.ClientConnection, Dict]:
27
+ logging.info(f"Waiting for server at {self._uri}...")
28
+ while True:
29
+ try:
30
+ conn = websockets.sync.client.connect(self._uri, compression=None, max_size=None)
31
+ metadata = msgpack_numpy.unpackb(conn.recv())
32
+ return conn, metadata
33
+ except ConnectionRefusedError:
34
+ logging.info("Still waiting for server...")
35
+ time.sleep(5)
36
+
37
+ @override
38
+ def infer(self, obs: Dict) -> Dict: # noqa: UP006
39
+ data = self._packer.pack(obs)
40
+ self._ws.send(data)
41
+ response = self._ws.recv()
42
+ if isinstance(response, str):
43
+ # we're expecting bytes; if the server sends a string, it's an error.
44
+ raise RuntimeError(f"Error in inference server:\n{response}")
45
+ return msgpack_numpy.unpackb(response)
46
+
47
+ @override
48
+ def reset(self) -> None:
49
+ pass
pi0_fast_base_params/d/900e9758c5a900a9363d9695ce317b05 ADDED
Binary file (1.59 kB). View file
 
pi0_fast_base_params/ocdbt.process_0/d/188d9577d40fae6772f2a1e734d246a6 ADDED
Binary file (783 Bytes). View file
 
pi0_fast_base_params/ocdbt.process_0/d/82430346fa8fc21f6c02b925d2071bbe ADDED
Binary file (1.1 kB). View file
 
pi0_fast_base_params/ocdbt.process_0/d/8c8f756cbcb196e0b8950de1511a1889 ADDED
Binary file (809 Bytes). View file
 
pi0_fast_base_params/ocdbt.process_0/d/c0125332e372918231585505ecbac6a0 ADDED
Binary file (359 Bytes). View file
 
pi0_fast_base_params/ocdbt.process_0/d/f55c8d160596d5002991decf8dc4edc6 ADDED
Binary file (1.57 kB). View file
 
pi0_fast_base_params/ocdbt.process_0/d/fbf426851e50f4721bba2e803e51535c ADDED
Binary file (209 Bytes). View file
 
pi0_fast_base_params/ocdbt.process_0/manifest.ocdbt ADDED
Binary file (189 Bytes). View file
 
rag/ricl_training_context_libero_10_test/metadata.json ADDED
The diff for this file is too large to render. See raw diff
 
scripts/docker/compose.yml ADDED
@@ -0,0 +1,29 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Run with:
2
+ # docker compose -f scripts/compose.yml up --build
3
+ services:
4
+ openpi_server:
5
+ image: openpi_server
6
+ build:
7
+ context: ..
8
+ dockerfile: scripts/docker/serve_policy.Dockerfile
9
+ init: true
10
+ tty: true
11
+ network_mode: host
12
+ # Populate configured openpi data home to /openpi_assets inside the container.
13
+ # Populate aws credential inside the container.
14
+ volumes:
15
+ - $PWD:/app
16
+ - ${OPENPI_DATA_HOME:-~/.cache/openpi}:/openpi_assets
17
+ environment:
18
+ - SERVER_ARGS
19
+ - OPENPI_DATA_HOME=/openpi_assets
20
+ - IS_DOCKER=true
21
+
22
+ # Comment out this block if not running on a machine with GPUs.
23
+ deploy:
24
+ resources:
25
+ reservations:
26
+ devices:
27
+ - driver: nvidia
28
+ count: 1
29
+ capabilities: [gpu]
scripts/docker/install_docker_ubuntu22.sh ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # Add Docker's official GPG key:
4
+ sudo apt-get update
5
+ sudo apt-get install -y ca-certificates curl
6
+ sudo install -m 0755 -d /etc/apt/keyrings
7
+ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
8
+ sudo chmod a+r /etc/apt/keyrings/docker.asc
9
+
10
+ # Add the repository to Apt sources:
11
+ echo \
12
+ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
13
+ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" |
14
+ sudo tee /etc/apt/sources.list.d/docker.list >/dev/null
15
+ sudo apt-get update
16
+
17
+ sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
18
+
19
+ # Add current user to the 'docker' group, which allows them to use docker commands (docker build, docker run, etc).
20
+ # See https://docs.docker.com/engine/install/linux-postinstall/
21
+ username=$(whoami)
22
+ sudo usermod -aG docker $username
23
+
24
+ # Configure docker to start automatically on system boot.
25
+ sudo systemctl enable docker.service
26
+ sudo systemctl enable containerd.service
27
+
28
+ # https://forums.docker.com/t/docker-credential-desktop-exe-executable-file-not-found-in-path-using-wsl2/100225/5
29
+ if [ ~/.docker/config.json ]; then
30
+ sed -i 's/credsStore/credStore/g' ~/.docker/config.json
31
+ fi
32
+
33
+ echo ""
34
+ echo "********************************************************************"
35
+ echo "**** Restart to allow Docker permission changes to take effect. ****"
36
+ echo "********************************************************************"
37
+ echo ""
scripts/docker/install_nvidia_container_toolkit.sh ADDED
@@ -0,0 +1,17 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # Installs the NVIDIA Container Toolkit, which allows Docker containers to access NVIDIA GPUs.
4
+ # NVIDIA's official documentation: https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html
5
+
6
+ curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg &&
7
+ curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list |
8
+ sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' |
9
+ sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
10
+
11
+ # NVIDIA's documenation omits 'sudo' in the following command, but it is required.
12
+ sudo sed -i -e '/experimental/ s/^#//g' /etc/apt/sources.list.d/nvidia-container-toolkit.list
13
+ sudo apt-get update
14
+ sudo apt-get install -y nvidia-container-toolkit
15
+
16
+ sudo nvidia-ctk runtime configure --runtime=docker
17
+ sudo systemctl restart docker
scripts/docker/serve_policy.Dockerfile ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Dockerfile for serving a PI policy.
2
+ # Based on UV's instructions: https://docs.astral.sh/uv/guides/integration/docker/#developing-in-a-container
3
+
4
+ # Build the container:
5
+ # docker build . -t openpi_server -f scripts/docker/serve_policy.Dockerfile
6
+
7
+ # Run the container:
8
+ # docker run --rm -it --network=host -v .:/app --gpus=all openpi_server /bin/bash
9
+
10
+ FROM nvidia/cuda:12.2.2-cudnn8-runtime-ubuntu22.04@sha256:2d913b09e6be8387e1a10976933642c73c840c0b735f0bf3c28d97fc9bc422e0
11
+ COPY --from=ghcr.io/astral-sh/uv:0.5.1 /uv /uvx /bin/
12
+
13
+ WORKDIR /app
14
+
15
+ # Needed because LeRobot uses git-lfs.
16
+ RUN apt-get update && apt-get install -y git git-lfs
17
+
18
+ # Copy from the cache instead of linking since it's a mounted volume
19
+ ENV UV_LINK_MODE=copy
20
+
21
+ # Write the virtual environment outside of the project directory so it doesn't
22
+ # leak out of the container when we mount the application code.
23
+ ENV UV_PROJECT_ENVIRONMENT=/.venv
24
+
25
+ # Install the project's dependencies using the lockfile and settings
26
+ RUN uv venv --python 3.11.9 $UV_PROJECT_ENVIRONMENT
27
+ RUN --mount=type=cache,target=/root/.cache/uv \
28
+ --mount=type=bind,source=uv.lock,target=uv.lock \
29
+ --mount=type=bind,source=pyproject.toml,target=pyproject.toml \
30
+ --mount=type=bind,source=packages/openpi-client/pyproject.toml,target=packages/openpi-client/pyproject.toml \
31
+ --mount=type=bind,source=packages/openpi-client/src,target=packages/openpi-client/src \
32
+ GIT_LFS_SKIP_SMUDGE=1 uv sync --frozen --no-install-project --no-dev
33
+
34
+ CMD /bin/bash -c "uv run scripts/serve_policy.py $SERVER_ARGS"
scripts/logs/eval_pi0fast_libero.out ADDED
@@ -0,0 +1,1243 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
0
  0%| | 0/10 [00:00<?, ?it/s][Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
 
 
 
1
  0%| | 0/10 [00:00<?, ?it/s]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
 
2
  10%|█ | 1/10 [00:40<06:08, 40.97s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
3
  20%|██ | 2/10 [01:17<05:07, 38.42s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
4
  30%|███ | 3/10 [01:54<04:24, 37.83s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
5
  40%|████ | 4/10 [02:33<03:48, 38.11s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
6
  50%|█████ | 5/10 [03:11<03:11, 38.32s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
7
  60%|██████ | 6/10 [03:50<02:34, 38.56s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
8
  70%|███████ | 7/10 [04:28<01:54, 38.17s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
9
  80%|████████ | 8/10 [05:09<01:18, 39.02s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
10
  90%|█████████ | 9/10 [05:49<00:39, 39.29s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  10%|█ | 1/10 [06:31<58:44, 391.59s/it][Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
 
 
 
12
  0%| | 0/10 [00:00<?, ?it/s]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
13
  10%|█ | 1/10 [00:38<05:44, 38.24s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
14
  20%|██ | 2/10 [01:16<05:04, 38.11s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
15
  30%|███ | 3/10 [01:55<04:29, 38.45s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
16
  40%|████ | 4/10 [02:33<03:50, 38.38s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
17
  50%|█████ | 5/10 [03:11<03:11, 38.37s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
18
  60%|██████ | 6/10 [03:50<02:34, 38.58s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
19
  70%|███████ | 7/10 [04:29<01:55, 38.50s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
20
  80%|████████ | 8/10 [05:07<01:16, 38.43s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
21
  90%|█████████ | 9/10 [05:46<00:38, 38.71s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
  20%|██ | 2/10 [12:57<51:47, 388.42s/it][Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
 
 
 
23
  0%| | 0/10 [00:00<?, ?it/s]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
24
  10%|█ | 1/10 [00:31<04:47, 31.93s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
25
  20%|██ | 2/10 [01:03<04:12, 31.57s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
26
  30%|███ | 3/10 [01:34<03:39, 31.35s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
27
  40%|████ | 4/10 [02:02<03:00, 30.07s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
28
  50%|█████ | 5/10 [02:38<02:40, 32.18s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
29
  60%|██████ | 6/10 [03:12<02:11, 32.96s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
30
  70%|███████ | 7/10 [03:46<01:40, 33.34s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
31
  80%|████████ | 8/10 [04:21<01:07, 33.60s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
32
  90%|█████████ | 9/10 [04:51<00:32, 32.60s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  30%|███ | 3/10 [18:19<41:45, 357.93s/it][Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
 
 
 
34
  0%| | 0/10 [00:00<?, ?it/s]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
35
  10%|█ | 1/10 [00:31<04:46, 31.84s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
36
  20%|██ | 2/10 [01:02<04:10, 31.26s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
37
  30%|███ | 3/10 [01:34<03:39, 31.32s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
38
  40%|████ | 4/10 [02:03<03:04, 30.71s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
39
  50%|█████ | 5/10 [02:36<02:37, 31.57s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
40
  60%|██████ | 6/10 [03:07<02:05, 31.33s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
41
  70%|███████ | 7/10 [03:39<01:34, 31.34s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
42
  80%|████████ | 8/10 [04:11<01:03, 31.67s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
43
  90%|█████████ | 9/10 [04:43<00:31, 31.76s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
44
  40%|████ | 4/10 [23:33<34:04, 340.77s/it][Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
 
 
 
45
  0%| | 0/10 [00:00<?, ?it/s]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
46
  10%|█ | 1/10 [00:35<05:22, 35.86s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
47
  20%|██ | 2/10 [01:15<05:05, 38.18s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
48
  30%|███ | 3/10 [01:55<04:32, 38.95s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
49
  40%|████ | 4/10 [02:31<03:46, 37.70s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
50
  50%|█████ | 5/10 [03:09<03:09, 37.82s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
51
  60%|██████ | 6/10 [03:47<02:32, 38.03s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
52
  70%|███████ | 7/10 [04:28<01:56, 38.90s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
53
  80%|████████ | 8/10 [05:07<01:17, 38.94s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
54
  90%|█████████ | 9/10 [05:46<00:38, 38.99s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
55
  50%|█████ | 5/10 [29:57<29:40, 356.10s/it][Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
 
 
 
56
  0%| | 0/10 [00:00<?, ?it/s]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
57
  10%|█ | 1/10 [00:33<05:02, 33.65s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
58
  20%|██ | 2/10 [01:05<04:21, 32.66s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
59
  30%|███ | 3/10 [01:39<03:51, 33.06s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
60
  40%|████ | 4/10 [02:11<03:16, 32.69s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
61
  50%|█████ | 5/10 [02:42<02:41, 32.23s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
62
  60%|██████ | 6/10 [03:15<02:09, 32.46s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
63
  70%|███████ | 7/10 [03:49<01:38, 32.82s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
64
  80%|████████ | 8/10 [04:21<01:05, 32.52s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
65
  90%|█████████ | 9/10 [04:54<00:32, 32.74s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  60%|██████ | 6/10 [35:25<23:06, 346.70s/it][Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
 
 
 
67
  0%| | 0/10 [00:00<?, ?it/s]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
68
  10%|█ | 1/10 [00:34<05:09, 34.37s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
69
  20%|██ | 2/10 [01:08<04:35, 34.44s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
70
  30%|███ | 3/10 [01:42<03:57, 33.94s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
71
  40%|████ | 4/10 [02:16<03:24, 34.01s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
72
  50%|█████ | 5/10 [02:53<02:55, 35.07s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
73
  60%|██████ | 6/10 [03:27<02:19, 34.87s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
74
  70%|███████ | 7/10 [04:05<01:47, 35.78s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
75
  80%|████████ | 8/10 [04:39<01:10, 35.26s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
76
  90%|█████████ | 9/10 [05:15<00:35, 35.41s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  70%|███████ | 7/10 [41:16<17:24, 348.18s/it][Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
 
 
 
78
  0%| | 0/10 [00:00<?, ?it/s]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
79
  10%|█ | 1/10 [00:37<05:38, 37.63s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
80
  20%|██ | 2/10 [01:14<04:55, 36.90s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
81
  30%|███ | 3/10 [01:50<04:18, 36.92s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
82
  40%|████ | 4/10 [02:28<03:42, 37.15s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
83
  50%|█████ | 5/10 [03:06<03:07, 37.55s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
84
  60%|██████ | 6/10 [03:43<02:29, 37.33s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
85
  70%|███████ | 7/10 [04:21<01:52, 37.54s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
86
  80%|████████ | 8/10 [04:57<01:14, 37.14s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
87
  90%|█████████ | 9/10 [05:33<00:36, 36.74s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
  80%|████████ | 8/10 [47:29<11:51, 355.92s/it][Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
 
 
 
89
  0%| | 0/10 [00:00<?, ?it/s]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
90
  10%|█ | 1/10 [00:27<04:03, 27.01s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
91
  20%|██ | 2/10 [00:54<03:36, 27.05s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
92
  30%|███ | 3/10 [01:21<03:09, 27.08s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
93
  40%|████ | 4/10 [01:48<02:41, 26.97s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
94
  50%|█████ | 5/10 [02:14<02:14, 26.97s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
95
  60%|██████ | 6/10 [02:43<01:49, 27.40s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
96
  70%|███████ | 7/10 [03:09<01:21, 27.19s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
97
  80%|████████ | 8/10 [03:37<00:54, 27.34s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
98
  90%|█████████ | 9/10 [04:04<00:27, 27.32s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
99
  90%|█████████ | 9/10 [52:02<05:29, 329.92s/it][Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
 
 
 
100
  0%| | 0/10 [00:00<?, ?it/s]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
101
  10%|█ | 1/10 [00:29<04:25, 29.54s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
102
  20%|██ | 2/10 [00:59<03:58, 29.84s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
103
  30%|███ | 3/10 [01:29<03:30, 30.07s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
104
  40%|████ | 4/10 [01:59<02:59, 29.99s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
105
  50%|█████ | 5/10 [02:30<02:31, 30.31s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
106
  60%|██████ | 6/10 [03:01<02:02, 30.60s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
107
  70%|███████ | 7/10 [03:32<01:31, 30.64s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
108
  80%|████████ | 8/10 [04:02<01:00, 30.34s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
109
  90%|█████████ | 9/10 [04:31<00:30, 30.02s/it]INFO:root:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ================================================================================
2
+ JobID = 12563538
3
+ User = u24877, Account = kisski-spath
4
+ Partition = kisski, Nodelist = ggpu170
5
+ ================================================================================
6
+ ===========================================
7
+ Experiment: eval_pi0fast_libero
8
+ Codebase: /projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/VLA-Humanoid
9
+ Checkpoint: /projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/VLA-Humanoid/outputs/train/2026-02-08/07-52-25_pi0fast_baseline_libero_30k/checkpoints/100000/pretrained_model
10
+ Video Output: /projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/VLA-Humanoid/results/eval_pi0fast_libero/videos
11
+ ===========================================
12
+ [robosuite WARNING] No private macro file found! (__init__.py:7)
13
+ [robosuite WARNING] It is recommended to use a private macro file (__init__.py:8)
14
+ [robosuite WARNING] To setup, run: python /user/hominhduy.nguyen01/u24877/.local/lib/python3.10/site-packages/robosuite/scripts/setup_macros.py (__init__.py:9)
15
+ Gym has been unmaintained since 2022 and does not support NumPy 2.0 amongst other critical functionality.
16
+ Please upgrade to Gymnasium, the maintained drop-in replacement of Gym, or contact the authors of your software and request that they upgrade.
17
+ Users of this version of Gym should be able to simply replace 'import gym' with 'import gymnasium as gym' in the vast majority of cases.
18
+ See the migration guide at https://gymnasium.farama.org/introduction/migration_guide/ for additional information.
19
+ INFO:root:Task suite: libero_10
20
+ <frozen importlib._bootstrap>:241: DeprecationWarning: builtin type SwigPyPacked has no __module__ attribute
21
+ <frozen importlib._bootstrap>:241: DeprecationWarning: builtin type SwigPyObject has no __module__ attribute
22
+ Some kwargs in processor config are unused and will not have any effect: scale, action_dim, time_horizon, min_token, vocab_size.
23
+ /projects/extern/kisski/kisski-spath/dir.project/VLA_3D/miniconda3/envs/pitorch_doanh/lib/python3.10/site-packages/transformers/models/paligemma/configuration_paligemma.py:134: FutureWarning: The `ignore_index` attribute is deprecated and will be removed in v4.47.
24
+ warnings.warn(
25
+ /projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/VLA-Humanoid/libero_config/libero_config.yaml
26
+ [info] using task orders [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
27
+ Loading weights from local directory
28
+ [INFO] Missing keys (will be randomly initialized): ['model.pi0_paligemma.language_model.model.embed_tokens.weight']
29
+
30
  0%| | 0/10 [00:00<?, ?it/s][Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
31
+ [Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
32
+
33
+
34
  0%| | 0/10 [00:00<?, ?it/s]INFO:root:
35
+ Task: put both the alphabet soup and the tomato sauce in the basket
36
+ INFO:root:Starting episode 1...
37
+ You're using a GemmaTokenizerFast tokenizer. Please note that with a fast tokenizer, using the `__call__` method is faster than using a method to encode the text followed by a call to the `pad` method to get a padded encoding.
38
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
39
+ To disable this warning, you can either:
40
+ - Avoid using `tokenizers` before the fork if possible
41
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
42
+ INFO:root:Success: False
43
+ INFO:root:# episodes completed so far: 1
44
+ INFO:root:# successes: 0 (0.0%)
45
+
46
+
47
  10%|█ | 1/10 [00:40<06:08, 40.97s/it]INFO:root:
48
+ Task: put both the alphabet soup and the tomato sauce in the basket
49
+ INFO:root:Starting episode 2...
50
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
51
+ To disable this warning, you can either:
52
+ - Avoid using `tokenizers` before the fork if possible
53
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
54
+ INFO:root:Success: False
55
+ INFO:root:# episodes completed so far: 2
56
+ INFO:root:# successes: 0 (0.0%)
57
+
58
+
59
  20%|██ | 2/10 [01:17<05:07, 38.42s/it]INFO:root:
60
+ Task: put both the alphabet soup and the tomato sauce in the basket
61
+ INFO:root:Starting episode 3...
62
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
63
+ To disable this warning, you can either:
64
+ - Avoid using `tokenizers` before the fork if possible
65
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
66
+ INFO:root:Success: False
67
+ INFO:root:# episodes completed so far: 3
68
+ INFO:root:# successes: 0 (0.0%)
69
+
70
+
71
  30%|███ | 3/10 [01:54<04:24, 37.83s/it]INFO:root:
72
+ Task: put both the alphabet soup and the tomato sauce in the basket
73
+ INFO:root:Starting episode 4...
74
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
75
+ To disable this warning, you can either:
76
+ - Avoid using `tokenizers` before the fork if possible
77
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
78
+ INFO:root:Success: False
79
+ INFO:root:# episodes completed so far: 4
80
+ INFO:root:# successes: 0 (0.0%)
81
+
82
+
83
  40%|████ | 4/10 [02:33<03:48, 38.11s/it]INFO:root:
84
+ Task: put both the alphabet soup and the tomato sauce in the basket
85
+ INFO:root:Starting episode 5...
86
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
87
+ To disable this warning, you can either:
88
+ - Avoid using `tokenizers` before the fork if possible
89
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
90
+ INFO:root:Success: False
91
+ INFO:root:# episodes completed so far: 5
92
+ INFO:root:# successes: 0 (0.0%)
93
+
94
+
95
  50%|█████ | 5/10 [03:11<03:11, 38.32s/it]INFO:root:
96
+ Task: put both the alphabet soup and the tomato sauce in the basket
97
+ INFO:root:Starting episode 6...
98
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
99
+ To disable this warning, you can either:
100
+ - Avoid using `tokenizers` before the fork if possible
101
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
102
+ INFO:root:Success: False
103
+ INFO:root:# episodes completed so far: 6
104
+ INFO:root:# successes: 0 (0.0%)
105
+
106
+
107
  60%|██████ | 6/10 [03:50<02:34, 38.56s/it]INFO:root:
108
+ Task: put both the alphabet soup and the tomato sauce in the basket
109
+ INFO:root:Starting episode 7...
110
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
111
+ To disable this warning, you can either:
112
+ - Avoid using `tokenizers` before the fork if possible
113
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
114
+ INFO:root:Success: False
115
+ INFO:root:# episodes completed so far: 7
116
+ INFO:root:# successes: 0 (0.0%)
117
+
118
+
119
  70%|███████ | 7/10 [04:28<01:54, 38.17s/it]INFO:root:
120
+ Task: put both the alphabet soup and the tomato sauce in the basket
121
+ INFO:root:Starting episode 8...
122
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
123
+ To disable this warning, you can either:
124
+ - Avoid using `tokenizers` before the fork if possible
125
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
126
+ INFO:root:Success: False
127
+ INFO:root:# episodes completed so far: 8
128
+ INFO:root:# successes: 0 (0.0%)
129
+
130
+
131
  80%|████████ | 8/10 [05:09<01:18, 39.02s/it]INFO:root:
132
+ Task: put both the alphabet soup and the tomato sauce in the basket
133
+ INFO:root:Starting episode 9...
134
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
135
+ To disable this warning, you can either:
136
+ - Avoid using `tokenizers` before the fork if possible
137
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
138
+ INFO:root:Success: False
139
+ INFO:root:# episodes completed so far: 9
140
+ INFO:root:# successes: 0 (0.0%)
141
+
142
+
143
  90%|█████████ | 9/10 [05:49<00:39, 39.29s/it]INFO:root:
144
+ Task: put both the alphabet soup and the tomato sauce in the basket
145
+ INFO:root:Starting episode 10...
146
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
147
+ To disable this warning, you can either:
148
+ - Avoid using `tokenizers` before the fork if possible
149
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
150
+ INFO:root:Success: False
151
+ INFO:root:# episodes completed so far: 10
152
+ INFO:root:# successes: 0 (0.0%)
153
+
154
+
155
+ INFO:root:Current task success rate: 0.0
156
+ INFO:root:Current total success rate: 0.0
157
+
158
  10%|█ | 1/10 [06:31<58:44, 391.59s/it][Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
159
+ [Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
160
+
161
+
162
  0%| | 0/10 [00:00<?, ?it/s]INFO:root:
163
+ Task: put both the cream cheese box and the butter in the basket
164
+ INFO:root:Starting episode 1...
165
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
166
+ To disable this warning, you can either:
167
+ - Avoid using `tokenizers` before the fork if possible
168
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
169
+ INFO:root:Success: False
170
+ INFO:root:# episodes completed so far: 11
171
+ INFO:root:# successes: 0 (0.0%)
172
+
173
+
174
  10%|█ | 1/10 [00:38<05:44, 38.24s/it]INFO:root:
175
+ Task: put both the cream cheese box and the butter in the basket
176
+ INFO:root:Starting episode 2...
177
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
178
+ To disable this warning, you can either:
179
+ - Avoid using `tokenizers` before the fork if possible
180
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
181
+ INFO:root:Success: False
182
+ INFO:root:# episodes completed so far: 12
183
+ INFO:root:# successes: 0 (0.0%)
184
+
185
+
186
  20%|██ | 2/10 [01:16<05:04, 38.11s/it]INFO:root:
187
+ Task: put both the cream cheese box and the butter in the basket
188
+ INFO:root:Starting episode 3...
189
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
190
+ To disable this warning, you can either:
191
+ - Avoid using `tokenizers` before the fork if possible
192
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
193
+ INFO:root:Success: False
194
+ INFO:root:# episodes completed so far: 13
195
+ INFO:root:# successes: 0 (0.0%)
196
+
197
+
198
  30%|███ | 3/10 [01:55<04:29, 38.45s/it]INFO:root:
199
+ Task: put both the cream cheese box and the butter in the basket
200
+ INFO:root:Starting episode 4...
201
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
202
+ To disable this warning, you can either:
203
+ - Avoid using `tokenizers` before the fork if possible
204
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
205
+ INFO:root:Success: False
206
+ INFO:root:# episodes completed so far: 14
207
+ INFO:root:# successes: 0 (0.0%)
208
+
209
+
210
  40%|████ | 4/10 [02:33<03:50, 38.38s/it]INFO:root:
211
+ Task: put both the cream cheese box and the butter in the basket
212
+ INFO:root:Starting episode 5...
213
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
214
+ To disable this warning, you can either:
215
+ - Avoid using `tokenizers` before the fork if possible
216
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
217
+ INFO:root:Success: False
218
+ INFO:root:# episodes completed so far: 15
219
+ INFO:root:# successes: 0 (0.0%)
220
+
221
+
222
  50%|█████ | 5/10 [03:11<03:11, 38.37s/it]INFO:root:
223
+ Task: put both the cream cheese box and the butter in the basket
224
+ INFO:root:Starting episode 6...
225
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
226
+ To disable this warning, you can either:
227
+ - Avoid using `tokenizers` before the fork if possible
228
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
229
+ INFO:root:Success: False
230
+ INFO:root:# episodes completed so far: 16
231
+ INFO:root:# successes: 0 (0.0%)
232
+
233
+
234
  60%|██████ | 6/10 [03:50<02:34, 38.58s/it]INFO:root:
235
+ Task: put both the cream cheese box and the butter in the basket
236
+ INFO:root:Starting episode 7...
237
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
238
+ To disable this warning, you can either:
239
+ - Avoid using `tokenizers` before the fork if possible
240
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
241
+ INFO:root:Success: False
242
+ INFO:root:# episodes completed so far: 17
243
+ INFO:root:# successes: 0 (0.0%)
244
+
245
+
246
  70%|███████ | 7/10 [04:29<01:55, 38.50s/it]INFO:root:
247
+ Task: put both the cream cheese box and the butter in the basket
248
+ INFO:root:Starting episode 8...
249
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
250
+ To disable this warning, you can either:
251
+ - Avoid using `tokenizers` before the fork if possible
252
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
253
+ INFO:root:Success: False
254
+ INFO:root:# episodes completed so far: 18
255
+ INFO:root:# successes: 0 (0.0%)
256
+
257
+
258
  80%|████████ | 8/10 [05:07<01:16, 38.43s/it]INFO:root:
259
+ Task: put both the cream cheese box and the butter in the basket
260
+ INFO:root:Starting episode 9...
261
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
262
+ To disable this warning, you can either:
263
+ - Avoid using `tokenizers` before the fork if possible
264
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
265
+ INFO:root:Success: False
266
+ INFO:root:# episodes completed so far: 19
267
+ INFO:root:# successes: 0 (0.0%)
268
+
269
+
270
  90%|█████████ | 9/10 [05:46<00:38, 38.71s/it]INFO:root:
271
+ Task: put both the cream cheese box and the butter in the basket
272
+ INFO:root:Starting episode 10...
273
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
274
+ To disable this warning, you can either:
275
+ - Avoid using `tokenizers` before the fork if possible
276
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
277
+ INFO:root:Success: False
278
+ INFO:root:# episodes completed so far: 20
279
+ INFO:root:# successes: 0 (0.0%)
280
+
281
+
282
+ INFO:root:Current task success rate: 0.0
283
+ INFO:root:Current total success rate: 0.0
284
+
285
  20%|██ | 2/10 [12:57<51:47, 388.42s/it][Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
286
+ [Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
287
+
288
+
289
  0%| | 0/10 [00:00<?, ?it/s]INFO:root:
290
+ Task: turn on the stove and put the moka pot on it
291
+ INFO:root:Starting episode 1...
292
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
293
+ To disable this warning, you can either:
294
+ - Avoid using `tokenizers` before the fork if possible
295
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
296
+ INFO:root:Success: False
297
+ INFO:root:# episodes completed so far: 21
298
+ INFO:root:# successes: 0 (0.0%)
299
+
300
+
301
  10%|█ | 1/10 [00:31<04:47, 31.93s/it]INFO:root:
302
+ Task: turn on the stove and put the moka pot on it
303
+ INFO:root:Starting episode 2...
304
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
305
+ To disable this warning, you can either:
306
+ - Avoid using `tokenizers` before the fork if possible
307
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
308
+ INFO:root:Success: False
309
+ INFO:root:# episodes completed so far: 22
310
+ INFO:root:# successes: 0 (0.0%)
311
+
312
+
313
  20%|██ | 2/10 [01:03<04:12, 31.57s/it]INFO:root:
314
+ Task: turn on the stove and put the moka pot on it
315
+ INFO:root:Starting episode 3...
316
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
317
+ To disable this warning, you can either:
318
+ - Avoid using `tokenizers` before the fork if possible
319
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
320
+ INFO:root:Success: False
321
+ INFO:root:# episodes completed so far: 23
322
+ INFO:root:# successes: 0 (0.0%)
323
+
324
+
325
  30%|███ | 3/10 [01:34<03:39, 31.35s/it]INFO:root:
326
+ Task: turn on the stove and put the moka pot on it
327
+ INFO:root:Starting episode 4...
328
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
329
+ To disable this warning, you can either:
330
+ - Avoid using `tokenizers` before the fork if possible
331
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
332
+ INFO:root:Success: False
333
+ INFO:root:# episodes completed so far: 24
334
+ INFO:root:# successes: 0 (0.0%)
335
+
336
+
337
  40%|████ | 4/10 [02:02<03:00, 30.07s/it]INFO:root:
338
+ Task: turn on the stove and put the moka pot on it
339
+ INFO:root:Starting episode 5...
340
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
341
+ To disable this warning, you can either:
342
+ - Avoid using `tokenizers` before the fork if possible
343
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
344
+ INFO:root:Success: False
345
+ INFO:root:# episodes completed so far: 25
346
+ INFO:root:# successes: 0 (0.0%)
347
+
348
+
349
  50%|█████ | 5/10 [02:38<02:40, 32.18s/it]INFO:root:
350
+ Task: turn on the stove and put the moka pot on it
351
+ INFO:root:Starting episode 6...
352
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
353
+ To disable this warning, you can either:
354
+ - Avoid using `tokenizers` before the fork if possible
355
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
356
+ INFO:root:Success: False
357
+ INFO:root:# episodes completed so far: 26
358
+ INFO:root:# successes: 0 (0.0%)
359
+
360
+
361
  60%|██████ | 6/10 [03:12<02:11, 32.96s/it]INFO:root:
362
+ Task: turn on the stove and put the moka pot on it
363
+ INFO:root:Starting episode 7...
364
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
365
+ To disable this warning, you can either:
366
+ - Avoid using `tokenizers` before the fork if possible
367
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
368
+ INFO:root:Success: False
369
+ INFO:root:# episodes completed so far: 27
370
+ INFO:root:# successes: 0 (0.0%)
371
+
372
+
373
  70%|███████ | 7/10 [03:46<01:40, 33.34s/it]INFO:root:
374
+ Task: turn on the stove and put the moka pot on it
375
+ INFO:root:Starting episode 8...
376
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
377
+ To disable this warning, you can either:
378
+ - Avoid using `tokenizers` before the fork if possible
379
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
380
+ INFO:root:Success: False
381
+ INFO:root:# episodes completed so far: 28
382
+ INFO:root:# successes: 0 (0.0%)
383
+
384
+
385
  80%|████████ | 8/10 [04:21<01:07, 33.60s/it]INFO:root:
386
+ Task: turn on the stove and put the moka pot on it
387
+ INFO:root:Starting episode 9...
388
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
389
+ To disable this warning, you can either:
390
+ - Avoid using `tokenizers` before the fork if possible
391
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
392
+ INFO:root:Success: False
393
+ INFO:root:# episodes completed so far: 29
394
+ INFO:root:# successes: 0 (0.0%)
395
+
396
+
397
  90%|█████████ | 9/10 [04:51<00:32, 32.60s/it]INFO:root:
398
+ Task: turn on the stove and put the moka pot on it
399
+ INFO:root:Starting episode 10...
400
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
401
+ To disable this warning, you can either:
402
+ - Avoid using `tokenizers` before the fork if possible
403
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
404
+ INFO:root:Success: False
405
+ INFO:root:# episodes completed so far: 30
406
+ INFO:root:# successes: 0 (0.0%)
407
+
408
+
409
+ INFO:root:Current task success rate: 0.0
410
+ INFO:root:Current total success rate: 0.0
411
+
412
  30%|███ | 3/10 [18:19<41:45, 357.93s/it][Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
413
+ [Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
414
+
415
+
416
  0%| | 0/10 [00:00<?, ?it/s]INFO:root:
417
+ Task: put the black bowl in the bottom drawer of the cabinet and close it
418
+ INFO:root:Starting episode 1...
419
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
420
+ To disable this warning, you can either:
421
+ - Avoid using `tokenizers` before the fork if possible
422
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
423
+ INFO:root:Success: False
424
+ INFO:root:# episodes completed so far: 31
425
+ INFO:root:# successes: 0 (0.0%)
426
+
427
+
428
  10%|█ | 1/10 [00:31<04:46, 31.84s/it]INFO:root:
429
+ Task: put the black bowl in the bottom drawer of the cabinet and close it
430
+ INFO:root:Starting episode 2...
431
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
432
+ To disable this warning, you can either:
433
+ - Avoid using `tokenizers` before the fork if possible
434
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
435
+ INFO:root:Success: False
436
+ INFO:root:# episodes completed so far: 32
437
+ INFO:root:# successes: 0 (0.0%)
438
+
439
+
440
  20%|██ | 2/10 [01:02<04:10, 31.26s/it]INFO:root:
441
+ Task: put the black bowl in the bottom drawer of the cabinet and close it
442
+ INFO:root:Starting episode 3...
443
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
444
+ To disable this warning, you can either:
445
+ - Avoid using `tokenizers` before the fork if possible
446
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
447
+ INFO:root:Success: False
448
+ INFO:root:# episodes completed so far: 33
449
+ INFO:root:# successes: 0 (0.0%)
450
+
451
+
452
  30%|███ | 3/10 [01:34<03:39, 31.32s/it]INFO:root:
453
+ Task: put the black bowl in the bottom drawer of the cabinet and close it
454
+ INFO:root:Starting episode 4...
455
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
456
+ To disable this warning, you can either:
457
+ - Avoid using `tokenizers` before the fork if possible
458
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
459
+ INFO:root:Success: False
460
+ INFO:root:# episodes completed so far: 34
461
+ INFO:root:# successes: 0 (0.0%)
462
+
463
+
464
  40%|████ | 4/10 [02:03<03:04, 30.71s/it]INFO:root:
465
+ Task: put the black bowl in the bottom drawer of the cabinet and close it
466
+ INFO:root:Starting episode 5...
467
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
468
+ To disable this warning, you can either:
469
+ - Avoid using `tokenizers` before the fork if possible
470
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
471
+ INFO:root:Success: False
472
+ INFO:root:# episodes completed so far: 35
473
+ INFO:root:# successes: 0 (0.0%)
474
+
475
+
476
  50%|█████ | 5/10 [02:36<02:37, 31.57s/it]INFO:root:
477
+ Task: put the black bowl in the bottom drawer of the cabinet and close it
478
+ INFO:root:Starting episode 6...
479
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
480
+ To disable this warning, you can either:
481
+ - Avoid using `tokenizers` before the fork if possible
482
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
483
+ INFO:root:Success: False
484
+ INFO:root:# episodes completed so far: 36
485
+ INFO:root:# successes: 0 (0.0%)
486
+
487
+
488
  60%|██████ | 6/10 [03:07<02:05, 31.33s/it]INFO:root:
489
+ Task: put the black bowl in the bottom drawer of the cabinet and close it
490
+ INFO:root:Starting episode 7...
491
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
492
+ To disable this warning, you can either:
493
+ - Avoid using `tokenizers` before the fork if possible
494
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
495
+ INFO:root:Success: False
496
+ INFO:root:# episodes completed so far: 37
497
+ INFO:root:# successes: 0 (0.0%)
498
+
499
+
500
  70%|███████ | 7/10 [03:39<01:34, 31.34s/it]INFO:root:
501
+ Task: put the black bowl in the bottom drawer of the cabinet and close it
502
+ INFO:root:Starting episode 8...
503
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
504
+ To disable this warning, you can either:
505
+ - Avoid using `tokenizers` before the fork if possible
506
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
507
+ INFO:root:Success: False
508
+ INFO:root:# episodes completed so far: 38
509
+ INFO:root:# successes: 0 (0.0%)
510
+
511
+
512
  80%|████████ | 8/10 [04:11<01:03, 31.67s/it]INFO:root:
513
+ Task: put the black bowl in the bottom drawer of the cabinet and close it
514
+ INFO:root:Starting episode 9...
515
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
516
+ To disable this warning, you can either:
517
+ - Avoid using `tokenizers` before the fork if possible
518
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
519
+ INFO:root:Success: False
520
+ INFO:root:# episodes completed so far: 39
521
+ INFO:root:# successes: 0 (0.0%)
522
+
523
+
524
  90%|█████████ | 9/10 [04:43<00:31, 31.76s/it]INFO:root:
525
+ Task: put the black bowl in the bottom drawer of the cabinet and close it
526
+ INFO:root:Starting episode 10...
527
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
528
+ To disable this warning, you can either:
529
+ - Avoid using `tokenizers` before the fork if possible
530
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
531
+ INFO:root:Success: False
532
+ INFO:root:# episodes completed so far: 40
533
+ INFO:root:# successes: 0 (0.0%)
534
+
535
+
536
+ INFO:root:Current task success rate: 0.0
537
+ INFO:root:Current total success rate: 0.0
538
+
539
  40%|████ | 4/10 [23:33<34:04, 340.77s/it][Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
540
+ [Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
541
+
542
+
543
  0%| | 0/10 [00:00<?, ?it/s]INFO:root:
544
+ Task: put the white mug on the left plate and put the yellow and white mug on the right plate
545
+ INFO:root:Starting episode 1...
546
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
547
+ To disable this warning, you can either:
548
+ - Avoid using `tokenizers` before the fork if possible
549
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
550
+ INFO:root:Success: False
551
+ INFO:root:# episodes completed so far: 41
552
+ INFO:root:# successes: 0 (0.0%)
553
+
554
+
555
  10%|█ | 1/10 [00:35<05:22, 35.86s/it]INFO:root:
556
+ Task: put the white mug on the left plate and put the yellow and white mug on the right plate
557
+ INFO:root:Starting episode 2...
558
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
559
+ To disable this warning, you can either:
560
+ - Avoid using `tokenizers` before the fork if possible
561
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
562
+ INFO:root:Success: False
563
+ INFO:root:# episodes completed so far: 42
564
+ INFO:root:# successes: 0 (0.0%)
565
+
566
+
567
  20%|██ | 2/10 [01:15<05:05, 38.18s/it]INFO:root:
568
+ Task: put the white mug on the left plate and put the yellow and white mug on the right plate
569
+ INFO:root:Starting episode 3...
570
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
571
+ To disable this warning, you can either:
572
+ - Avoid using `tokenizers` before the fork if possible
573
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
574
+ INFO:root:Success: False
575
+ INFO:root:# episodes completed so far: 43
576
+ INFO:root:# successes: 0 (0.0%)
577
+
578
+
579
  30%|███ | 3/10 [01:55<04:32, 38.95s/it]INFO:root:
580
+ Task: put the white mug on the left plate and put the yellow and white mug on the right plate
581
+ INFO:root:Starting episode 4...
582
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
583
+ To disable this warning, you can either:
584
+ - Avoid using `tokenizers` before the fork if possible
585
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
586
+ INFO:root:Success: False
587
+ INFO:root:# episodes completed so far: 44
588
+ INFO:root:# successes: 0 (0.0%)
589
+
590
+
591
  40%|████ | 4/10 [02:31<03:46, 37.70s/it]INFO:root:
592
+ Task: put the white mug on the left plate and put the yellow and white mug on the right plate
593
+ INFO:root:Starting episode 5...
594
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
595
+ To disable this warning, you can either:
596
+ - Avoid using `tokenizers` before the fork if possible
597
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
598
+ INFO:root:Success: False
599
+ INFO:root:# episodes completed so far: 45
600
+ INFO:root:# successes: 0 (0.0%)
601
+
602
+
603
  50%|█████ | 5/10 [03:09<03:09, 37.82s/it]INFO:root:
604
+ Task: put the white mug on the left plate and put the yellow and white mug on the right plate
605
+ INFO:root:Starting episode 6...
606
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
607
+ To disable this warning, you can either:
608
+ - Avoid using `tokenizers` before the fork if possible
609
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
610
+ INFO:root:Success: False
611
+ INFO:root:# episodes completed so far: 46
612
+ INFO:root:# successes: 0 (0.0%)
613
+
614
+
615
  60%|██████ | 6/10 [03:47<02:32, 38.03s/it]INFO:root:
616
+ Task: put the white mug on the left plate and put the yellow and white mug on the right plate
617
+ INFO:root:Starting episode 7...
618
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
619
+ To disable this warning, you can either:
620
+ - Avoid using `tokenizers` before the fork if possible
621
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
622
+ INFO:root:Success: False
623
+ INFO:root:# episodes completed so far: 47
624
+ INFO:root:# successes: 0 (0.0%)
625
+
626
+
627
  70%|███████ | 7/10 [04:28<01:56, 38.90s/it]INFO:root:
628
+ Task: put the white mug on the left plate and put the yellow and white mug on the right plate
629
+ INFO:root:Starting episode 8...
630
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
631
+ To disable this warning, you can either:
632
+ - Avoid using `tokenizers` before the fork if possible
633
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
634
+ INFO:root:Success: False
635
+ INFO:root:# episodes completed so far: 48
636
+ INFO:root:# successes: 0 (0.0%)
637
+
638
+
639
  80%|████████ | 8/10 [05:07<01:17, 38.94s/it]INFO:root:
640
+ Task: put the white mug on the left plate and put the yellow and white mug on the right plate
641
+ INFO:root:Starting episode 9...
642
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
643
+ To disable this warning, you can either:
644
+ - Avoid using `tokenizers` before the fork if possible
645
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
646
+ INFO:root:Success: False
647
+ INFO:root:# episodes completed so far: 49
648
+ INFO:root:# successes: 0 (0.0%)
649
+
650
+
651
  90%|█████████ | 9/10 [05:46<00:38, 38.99s/it]INFO:root:
652
+ Task: put the white mug on the left plate and put the yellow and white mug on the right plate
653
+ INFO:root:Starting episode 10...
654
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
655
+ To disable this warning, you can either:
656
+ - Avoid using `tokenizers` before the fork if possible
657
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
658
+ INFO:root:Success: False
659
+ INFO:root:# episodes completed so far: 50
660
+ INFO:root:# successes: 0 (0.0%)
661
+
662
+
663
+ INFO:root:Current task success rate: 0.0
664
+ INFO:root:Current total success rate: 0.0
665
+
666
  50%|█████ | 5/10 [29:57<29:40, 356.10s/it][Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
667
+ [Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
668
+
669
+
670
  0%| | 0/10 [00:00<?, ?it/s]INFO:root:
671
+ Task: pick up the book and place it in the back compartment of the caddy
672
+ INFO:root:Starting episode 1...
673
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
674
+ To disable this warning, you can either:
675
+ - Avoid using `tokenizers` before the fork if possible
676
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
677
+ INFO:root:Success: False
678
+ INFO:root:# episodes completed so far: 51
679
+ INFO:root:# successes: 0 (0.0%)
680
+
681
+
682
  10%|█ | 1/10 [00:33<05:02, 33.65s/it]INFO:root:
683
+ Task: pick up the book and place it in the back compartment of the caddy
684
+ INFO:root:Starting episode 2...
685
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
686
+ To disable this warning, you can either:
687
+ - Avoid using `tokenizers` before the fork if possible
688
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
689
+ INFO:root:Success: False
690
+ INFO:root:# episodes completed so far: 52
691
+ INFO:root:# successes: 0 (0.0%)
692
+
693
+
694
  20%|██ | 2/10 [01:05<04:21, 32.66s/it]INFO:root:
695
+ Task: pick up the book and place it in the back compartment of the caddy
696
+ INFO:root:Starting episode 3...
697
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
698
+ To disable this warning, you can either:
699
+ - Avoid using `tokenizers` before the fork if possible
700
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
701
+ INFO:root:Success: False
702
+ INFO:root:# episodes completed so far: 53
703
+ INFO:root:# successes: 0 (0.0%)
704
+
705
+
706
  30%|███ | 3/10 [01:39<03:51, 33.06s/it]INFO:root:
707
+ Task: pick up the book and place it in the back compartment of the caddy
708
+ INFO:root:Starting episode 4...
709
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
710
+ To disable this warning, you can either:
711
+ - Avoid using `tokenizers` before the fork if possible
712
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
713
+ INFO:root:Success: False
714
+ INFO:root:# episodes completed so far: 54
715
+ INFO:root:# successes: 0 (0.0%)
716
+
717
+
718
  40%|████ | 4/10 [02:11<03:16, 32.69s/it]INFO:root:
719
+ Task: pick up the book and place it in the back compartment of the caddy
720
+ INFO:root:Starting episode 5...
721
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
722
+ To disable this warning, you can either:
723
+ - Avoid using `tokenizers` before the fork if possible
724
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
725
+ INFO:root:Success: False
726
+ INFO:root:# episodes completed so far: 55
727
+ INFO:root:# successes: 0 (0.0%)
728
+
729
+
730
  50%|█████ | 5/10 [02:42<02:41, 32.23s/it]INFO:root:
731
+ Task: pick up the book and place it in the back compartment of the caddy
732
+ INFO:root:Starting episode 6...
733
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
734
+ To disable this warning, you can either:
735
+ - Avoid using `tokenizers` before the fork if possible
736
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
737
+ INFO:root:Success: False
738
+ INFO:root:# episodes completed so far: 56
739
+ INFO:root:# successes: 0 (0.0%)
740
+
741
+
742
  60%|██████ | 6/10 [03:15<02:09, 32.46s/it]INFO:root:
743
+ Task: pick up the book and place it in the back compartment of the caddy
744
+ INFO:root:Starting episode 7...
745
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
746
+ To disable this warning, you can either:
747
+ - Avoid using `tokenizers` before the fork if possible
748
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
749
+ INFO:root:Success: False
750
+ INFO:root:# episodes completed so far: 57
751
+ INFO:root:# successes: 0 (0.0%)
752
+
753
+
754
  70%|███████ | 7/10 [03:49<01:38, 32.82s/it]INFO:root:
755
+ Task: pick up the book and place it in the back compartment of the caddy
756
+ INFO:root:Starting episode 8...
757
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
758
+ To disable this warning, you can either:
759
+ - Avoid using `tokenizers` before the fork if possible
760
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
761
+ INFO:root:Success: False
762
+ INFO:root:# episodes completed so far: 58
763
+ INFO:root:# successes: 0 (0.0%)
764
+
765
+
766
  80%|████████ | 8/10 [04:21<01:05, 32.52s/it]INFO:root:
767
+ Task: pick up the book and place it in the back compartment of the caddy
768
+ INFO:root:Starting episode 9...
769
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
770
+ To disable this warning, you can either:
771
+ - Avoid using `tokenizers` before the fork if possible
772
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
773
+ INFO:root:Success: False
774
+ INFO:root:# episodes completed so far: 59
775
+ INFO:root:# successes: 0 (0.0%)
776
+
777
+
778
  90%|█████████ | 9/10 [04:54<00:32, 32.74s/it]INFO:root:
779
+ Task: pick up the book and place it in the back compartment of the caddy
780
+ INFO:root:Starting episode 10...
781
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
782
+ To disable this warning, you can either:
783
+ - Avoid using `tokenizers` before the fork if possible
784
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
785
+ INFO:root:Success: False
786
+ INFO:root:# episodes completed so far: 60
787
+ INFO:root:# successes: 0 (0.0%)
788
+
789
+
790
+ INFO:root:Current task success rate: 0.0
791
+ INFO:root:Current total success rate: 0.0
792
+
793
  60%|██████ | 6/10 [35:25<23:06, 346.70s/it][Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
794
+ [Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
795
+
796
+
797
  0%| | 0/10 [00:00<?, ?it/s]INFO:root:
798
+ Task: put the white mug on the plate and put the chocolate pudding to the right of the plate
799
+ INFO:root:Starting episode 1...
800
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
801
+ To disable this warning, you can either:
802
+ - Avoid using `tokenizers` before the fork if possible
803
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
804
+ INFO:root:Success: False
805
+ INFO:root:# episodes completed so far: 61
806
+ INFO:root:# successes: 0 (0.0%)
807
+
808
+
809
  10%|█ | 1/10 [00:34<05:09, 34.37s/it]INFO:root:
810
+ Task: put the white mug on the plate and put the chocolate pudding to the right of the plate
811
+ INFO:root:Starting episode 2...
812
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
813
+ To disable this warning, you can either:
814
+ - Avoid using `tokenizers` before the fork if possible
815
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
816
+ INFO:root:Success: False
817
+ INFO:root:# episodes completed so far: 62
818
+ INFO:root:# successes: 0 (0.0%)
819
+
820
+
821
  20%|██ | 2/10 [01:08<04:35, 34.44s/it]INFO:root:
822
+ Task: put the white mug on the plate and put the chocolate pudding to the right of the plate
823
+ INFO:root:Starting episode 3...
824
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
825
+ To disable this warning, you can either:
826
+ - Avoid using `tokenizers` before the fork if possible
827
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
828
+ INFO:root:Success: False
829
+ INFO:root:# episodes completed so far: 63
830
+ INFO:root:# successes: 0 (0.0%)
831
+
832
+
833
  30%|███ | 3/10 [01:42<03:57, 33.94s/it]INFO:root:
834
+ Task: put the white mug on the plate and put the chocolate pudding to the right of the plate
835
+ INFO:root:Starting episode 4...
836
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
837
+ To disable this warning, you can either:
838
+ - Avoid using `tokenizers` before the fork if possible
839
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
840
+ INFO:root:Success: False
841
+ INFO:root:# episodes completed so far: 64
842
+ INFO:root:# successes: 0 (0.0%)
843
+
844
+
845
  40%|████ | 4/10 [02:16<03:24, 34.01s/it]INFO:root:
846
+ Task: put the white mug on the plate and put the chocolate pudding to the right of the plate
847
+ INFO:root:Starting episode 5...
848
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
849
+ To disable this warning, you can either:
850
+ - Avoid using `tokenizers` before the fork if possible
851
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
852
+ INFO:root:Success: False
853
+ INFO:root:# episodes completed so far: 65
854
+ INFO:root:# successes: 0 (0.0%)
855
+
856
+
857
  50%|█████ | 5/10 [02:53<02:55, 35.07s/it]INFO:root:
858
+ Task: put the white mug on the plate and put the chocolate pudding to the right of the plate
859
+ INFO:root:Starting episode 6...
860
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
861
+ To disable this warning, you can either:
862
+ - Avoid using `tokenizers` before the fork if possible
863
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
864
+ INFO:root:Success: False
865
+ INFO:root:# episodes completed so far: 66
866
+ INFO:root:# successes: 0 (0.0%)
867
+
868
+
869
  60%|██████ | 6/10 [03:27<02:19, 34.87s/it]INFO:root:
870
+ Task: put the white mug on the plate and put the chocolate pudding to the right of the plate
871
+ INFO:root:Starting episode 7...
872
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
873
+ To disable this warning, you can either:
874
+ - Avoid using `tokenizers` before the fork if possible
875
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
876
+ INFO:root:Success: False
877
+ INFO:root:# episodes completed so far: 67
878
+ INFO:root:# successes: 0 (0.0%)
879
+
880
+
881
  70%|███████ | 7/10 [04:05<01:47, 35.78s/it]INFO:root:
882
+ Task: put the white mug on the plate and put the chocolate pudding to the right of the plate
883
+ INFO:root:Starting episode 8...
884
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
885
+ To disable this warning, you can either:
886
+ - Avoid using `tokenizers` before the fork if possible
887
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
888
+ INFO:root:Success: False
889
+ INFO:root:# episodes completed so far: 68
890
+ INFO:root:# successes: 0 (0.0%)
891
+
892
+
893
  80%|████████ | 8/10 [04:39<01:10, 35.26s/it]INFO:root:
894
+ Task: put the white mug on the plate and put the chocolate pudding to the right of the plate
895
+ INFO:root:Starting episode 9...
896
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
897
+ To disable this warning, you can either:
898
+ - Avoid using `tokenizers` before the fork if possible
899
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
900
+ INFO:root:Success: False
901
+ INFO:root:# episodes completed so far: 69
902
+ INFO:root:# successes: 0 (0.0%)
903
+
904
+
905
  90%|█████████ | 9/10 [05:15<00:35, 35.41s/it]INFO:root:
906
+ Task: put the white mug on the plate and put the chocolate pudding to the right of the plate
907
+ INFO:root:Starting episode 10...
908
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
909
+ To disable this warning, you can either:
910
+ - Avoid using `tokenizers` before the fork if possible
911
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
912
+ INFO:root:Success: False
913
+ INFO:root:# episodes completed so far: 70
914
+ INFO:root:# successes: 0 (0.0%)
915
+
916
+
917
+ INFO:root:Current task success rate: 0.0
918
+ INFO:root:Current total success rate: 0.0
919
+
920
  70%|███████ | 7/10 [41:16<17:24, 348.18s/it][Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
921
+ [Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
922
+
923
+
924
  0%| | 0/10 [00:00<?, ?it/s]INFO:root:
925
+ Task: put both the alphabet soup and the cream cheese box in the basket
926
+ INFO:root:Starting episode 1...
927
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
928
+ To disable this warning, you can either:
929
+ - Avoid using `tokenizers` before the fork if possible
930
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
931
+ INFO:root:Success: False
932
+ INFO:root:# episodes completed so far: 71
933
+ INFO:root:# successes: 0 (0.0%)
934
+
935
+
936
  10%|█ | 1/10 [00:37<05:38, 37.63s/it]INFO:root:
937
+ Task: put both the alphabet soup and the cream cheese box in the basket
938
+ INFO:root:Starting episode 2...
939
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
940
+ To disable this warning, you can either:
941
+ - Avoid using `tokenizers` before the fork if possible
942
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
943
+ INFO:root:Success: False
944
+ INFO:root:# episodes completed so far: 72
945
+ INFO:root:# successes: 0 (0.0%)
946
+
947
+
948
  20%|██ | 2/10 [01:14<04:55, 36.90s/it]INFO:root:
949
+ Task: put both the alphabet soup and the cream cheese box in the basket
950
+ INFO:root:Starting episode 3...
951
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
952
+ To disable this warning, you can either:
953
+ - Avoid using `tokenizers` before the fork if possible
954
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
955
+ INFO:root:Success: False
956
+ INFO:root:# episodes completed so far: 73
957
+ INFO:root:# successes: 0 (0.0%)
958
+
959
+
960
  30%|███ | 3/10 [01:50<04:18, 36.92s/it]INFO:root:
961
+ Task: put both the alphabet soup and the cream cheese box in the basket
962
+ INFO:root:Starting episode 4...
963
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
964
+ To disable this warning, you can either:
965
+ - Avoid using `tokenizers` before the fork if possible
966
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
967
+ INFO:root:Success: False
968
+ INFO:root:# episodes completed so far: 74
969
+ INFO:root:# successes: 0 (0.0%)
970
+
971
+
972
  40%|████ | 4/10 [02:28<03:42, 37.15s/it]INFO:root:
973
+ Task: put both the alphabet soup and the cream cheese box in the basket
974
+ INFO:root:Starting episode 5...
975
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
976
+ To disable this warning, you can either:
977
+ - Avoid using `tokenizers` before the fork if possible
978
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
979
+ INFO:root:Success: False
980
+ INFO:root:# episodes completed so far: 75
981
+ INFO:root:# successes: 0 (0.0%)
982
+
983
+
984
  50%|█████ | 5/10 [03:06<03:07, 37.55s/it]INFO:root:
985
+ Task: put both the alphabet soup and the cream cheese box in the basket
986
+ INFO:root:Starting episode 6...
987
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
988
+ To disable this warning, you can either:
989
+ - Avoid using `tokenizers` before the fork if possible
990
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
991
+ INFO:root:Success: False
992
+ INFO:root:# episodes completed so far: 76
993
+ INFO:root:# successes: 0 (0.0%)
994
+
995
+
996
  60%|██████ | 6/10 [03:43<02:29, 37.33s/it]INFO:root:
997
+ Task: put both the alphabet soup and the cream cheese box in the basket
998
+ INFO:root:Starting episode 7...
999
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1000
+ To disable this warning, you can either:
1001
+ - Avoid using `tokenizers` before the fork if possible
1002
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1003
+ INFO:root:Success: False
1004
+ INFO:root:# episodes completed so far: 77
1005
+ INFO:root:# successes: 0 (0.0%)
1006
+
1007
+
1008
  70%|███████ | 7/10 [04:21<01:52, 37.54s/it]INFO:root:
1009
+ Task: put both the alphabet soup and the cream cheese box in the basket
1010
+ INFO:root:Starting episode 8...
1011
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1012
+ To disable this warning, you can either:
1013
+ - Avoid using `tokenizers` before the fork if possible
1014
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1015
+ INFO:root:Success: False
1016
+ INFO:root:# episodes completed so far: 78
1017
+ INFO:root:# successes: 0 (0.0%)
1018
+
1019
+
1020
  80%|████████ | 8/10 [04:57<01:14, 37.14s/it]INFO:root:
1021
+ Task: put both the alphabet soup and the cream cheese box in the basket
1022
+ INFO:root:Starting episode 9...
1023
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1024
+ To disable this warning, you can either:
1025
+ - Avoid using `tokenizers` before the fork if possible
1026
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1027
+ INFO:root:Success: False
1028
+ INFO:root:# episodes completed so far: 79
1029
+ INFO:root:# successes: 0 (0.0%)
1030
+
1031
+
1032
  90%|█████████ | 9/10 [05:33<00:36, 36.74s/it]INFO:root:
1033
+ Task: put both the alphabet soup and the cream cheese box in the basket
1034
+ INFO:root:Starting episode 10...
1035
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1036
+ To disable this warning, you can either:
1037
+ - Avoid using `tokenizers` before the fork if possible
1038
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1039
+ INFO:root:Success: False
1040
+ INFO:root:# episodes completed so far: 80
1041
+ INFO:root:# successes: 0 (0.0%)
1042
+
1043
+
1044
+ INFO:root:Current task success rate: 0.0
1045
+ INFO:root:Current total success rate: 0.0
1046
+
1047
  80%|████████ | 8/10 [47:29<11:51, 355.92s/it][Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
1048
+ [Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
1049
+
1050
+
1051
  0%| | 0/10 [00:00<?, ?it/s]INFO:root:
1052
+ Task: put both moka pots on the stove
1053
+ INFO:root:Starting episode 1...
1054
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1055
+ To disable this warning, you can either:
1056
+ - Avoid using `tokenizers` before the fork if possible
1057
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1058
+ INFO:root:Success: False
1059
+ INFO:root:# episodes completed so far: 81
1060
+ INFO:root:# successes: 0 (0.0%)
1061
+
1062
+
1063
  10%|█ | 1/10 [00:27<04:03, 27.01s/it]INFO:root:
1064
+ Task: put both moka pots on the stove
1065
+ INFO:root:Starting episode 2...
1066
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1067
+ To disable this warning, you can either:
1068
+ - Avoid using `tokenizers` before the fork if possible
1069
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1070
+ INFO:root:Success: False
1071
+ INFO:root:# episodes completed so far: 82
1072
+ INFO:root:# successes: 0 (0.0%)
1073
+
1074
+
1075
  20%|██ | 2/10 [00:54<03:36, 27.05s/it]INFO:root:
1076
+ Task: put both moka pots on the stove
1077
+ INFO:root:Starting episode 3...
1078
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1079
+ To disable this warning, you can either:
1080
+ - Avoid using `tokenizers` before the fork if possible
1081
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1082
+ INFO:root:Success: False
1083
+ INFO:root:# episodes completed so far: 83
1084
+ INFO:root:# successes: 0 (0.0%)
1085
+
1086
+
1087
  30%|███ | 3/10 [01:21<03:09, 27.08s/it]INFO:root:
1088
+ Task: put both moka pots on the stove
1089
+ INFO:root:Starting episode 4...
1090
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1091
+ To disable this warning, you can either:
1092
+ - Avoid using `tokenizers` before the fork if possible
1093
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1094
+ INFO:root:Success: False
1095
+ INFO:root:# episodes completed so far: 84
1096
+ INFO:root:# successes: 0 (0.0%)
1097
+
1098
+
1099
  40%|████ | 4/10 [01:48<02:41, 26.97s/it]INFO:root:
1100
+ Task: put both moka pots on the stove
1101
+ INFO:root:Starting episode 5...
1102
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1103
+ To disable this warning, you can either:
1104
+ - Avoid using `tokenizers` before the fork if possible
1105
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1106
+ INFO:root:Success: False
1107
+ INFO:root:# episodes completed so far: 85
1108
+ INFO:root:# successes: 0 (0.0%)
1109
+
1110
+
1111
  50%|█████ | 5/10 [02:14<02:14, 26.97s/it]INFO:root:
1112
+ Task: put both moka pots on the stove
1113
+ INFO:root:Starting episode 6...
1114
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1115
+ To disable this warning, you can either:
1116
+ - Avoid using `tokenizers` before the fork if possible
1117
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1118
+ INFO:root:Success: False
1119
+ INFO:root:# episodes completed so far: 86
1120
+ INFO:root:# successes: 0 (0.0%)
1121
+
1122
+
1123
  60%|██████ | 6/10 [02:43<01:49, 27.40s/it]INFO:root:
1124
+ Task: put both moka pots on the stove
1125
+ INFO:root:Starting episode 7...
1126
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1127
+ To disable this warning, you can either:
1128
+ - Avoid using `tokenizers` before the fork if possible
1129
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1130
+ INFO:root:Success: False
1131
+ INFO:root:# episodes completed so far: 87
1132
+ INFO:root:# successes: 0 (0.0%)
1133
+
1134
+
1135
  70%|███████ | 7/10 [03:09<01:21, 27.19s/it]INFO:root:
1136
+ Task: put both moka pots on the stove
1137
+ INFO:root:Starting episode 8...
1138
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1139
+ To disable this warning, you can either:
1140
+ - Avoid using `tokenizers` before the fork if possible
1141
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1142
+ INFO:root:Success: False
1143
+ INFO:root:# episodes completed so far: 88
1144
+ INFO:root:# successes: 0 (0.0%)
1145
+
1146
+
1147
  80%|████████ | 8/10 [03:37<00:54, 27.34s/it]INFO:root:
1148
+ Task: put both moka pots on the stove
1149
+ INFO:root:Starting episode 9...
1150
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1151
+ To disable this warning, you can either:
1152
+ - Avoid using `tokenizers` before the fork if possible
1153
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1154
+ INFO:root:Success: False
1155
+ INFO:root:# episodes completed so far: 89
1156
+ INFO:root:# successes: 0 (0.0%)
1157
+
1158
+
1159
  90%|█████████ | 9/10 [04:04<00:27, 27.32s/it]INFO:root:
1160
+ Task: put both moka pots on the stove
1161
+ INFO:root:Starting episode 10...
1162
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1163
+ To disable this warning, you can either:
1164
+ - Avoid using `tokenizers` before the fork if possible
1165
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1166
+ INFO:root:Success: False
1167
+ INFO:root:# episodes completed so far: 90
1168
+ INFO:root:# successes: 0 (0.0%)
1169
+
1170
+
1171
+ INFO:root:Current task success rate: 0.0
1172
+ INFO:root:Current total success rate: 0.0
1173
+
1174
  90%|█████████ | 9/10 [52:02<05:29, 329.92s/it][Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
1175
+ [Warning]: datasets path /mnt/vast-kisski/projects/kisski-spath/VLA_objectcentric/VLA-Humanoid/libero/libero/../datasets does not exist!
1176
+
1177
+
1178
  0%| | 0/10 [00:00<?, ?it/s]INFO:root:
1179
+ Task: put the yellow and white mug in the microwave and close it
1180
+ INFO:root:Starting episode 1...
1181
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1182
+ To disable this warning, you can either:
1183
+ - Avoid using `tokenizers` before the fork if possible
1184
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1185
+ INFO:root:Success: False
1186
+ INFO:root:# episodes completed so far: 91
1187
+ INFO:root:# successes: 0 (0.0%)
1188
+
1189
+
1190
  10%|█ | 1/10 [00:29<04:25, 29.54s/it]INFO:root:
1191
+ Task: put the yellow and white mug in the microwave and close it
1192
+ INFO:root:Starting episode 2...
1193
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1194
+ To disable this warning, you can either:
1195
+ - Avoid using `tokenizers` before the fork if possible
1196
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1197
+ INFO:root:Success: False
1198
+ INFO:root:# episodes completed so far: 92
1199
+ INFO:root:# successes: 0 (0.0%)
1200
+
1201
+
1202
  20%|██ | 2/10 [00:59<03:58, 29.84s/it]INFO:root:
1203
+ Task: put the yellow and white mug in the microwave and close it
1204
+ INFO:root:Starting episode 3...
1205
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1206
+ To disable this warning, you can either:
1207
+ - Avoid using `tokenizers` before the fork if possible
1208
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1209
+ INFO:root:Success: False
1210
+ INFO:root:# episodes completed so far: 93
1211
+ INFO:root:# successes: 0 (0.0%)
1212
+
1213
+
1214
  30%|███ | 3/10 [01:29<03:30, 30.07s/it]INFO:root:
1215
+ Task: put the yellow and white mug in the microwave and close it
1216
+ INFO:root:Starting episode 4...
1217
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1218
+ To disable this warning, you can either:
1219
+ - Avoid using `tokenizers` before the fork if possible
1220
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1221
+ INFO:root:Success: False
1222
+ INFO:root:# episodes completed so far: 94
1223
+ INFO:root:# successes: 0 (0.0%)
1224
+
1225
+
1226
  40%|████ | 4/10 [01:59<02:59, 29.99s/it]INFO:root:
1227
+ Task: put the yellow and white mug in the microwave and close it
1228
+ INFO:root:Starting episode 5...
1229
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1230
+ To disable this warning, you can either:
1231
+ - Avoid using `tokenizers` before the fork if possible
1232
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1233
+ INFO:root:Success: False
1234
+ INFO:root:# episodes completed so far: 95
1235
+ INFO:root:# successes: 0 (0.0%)
1236
+
1237
+
1238
  50%|█████ | 5/10 [02:30<02:31, 30.31s/it]INFO:root:
1239
+ Task: put the yellow and white mug in the microwave and close it
1240
+ INFO:root:Starting episode 6...
1241
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1242
+ To disable this warning, you can either:
1243
+ - Avoid using `tokenizers` before the fork if possible
1244
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1245
+ INFO:root:Success: False
1246
+ INFO:root:# episodes completed so far: 96
1247
+ INFO:root:# successes: 0 (0.0%)
1248
+
1249
+
1250
  60%|██████ | 6/10 [03:01<02:02, 30.60s/it]INFO:root:
1251
+ Task: put the yellow and white mug in the microwave and close it
1252
+ INFO:root:Starting episode 7...
1253
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1254
+ To disable this warning, you can either:
1255
+ - Avoid using `tokenizers` before the fork if possible
1256
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1257
+ INFO:root:Success: False
1258
+ INFO:root:# episodes completed so far: 97
1259
+ INFO:root:# successes: 0 (0.0%)
1260
+
1261
+
1262
  70%|███████ | 7/10 [03:32<01:31, 30.64s/it]INFO:root:
1263
+ Task: put the yellow and white mug in the microwave and close it
1264
+ INFO:root:Starting episode 8...
1265
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1266
+ To disable this warning, you can either:
1267
+ - Avoid using `tokenizers` before the fork if possible
1268
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1269
+ INFO:root:Success: False
1270
+ INFO:root:# episodes completed so far: 98
1271
+ INFO:root:# successes: 0 (0.0%)
1272
+
1273
+
1274
  80%|████████ | 8/10 [04:02<01:00, 30.34s/it]INFO:root:
1275
+ Task: put the yellow and white mug in the microwave and close it
1276
+ INFO:root:Starting episode 9...
1277
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1278
+ To disable this warning, you can either:
1279
+ - Avoid using `tokenizers` before the fork if possible
1280
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1281
+ INFO:root:Success: False
1282
+ INFO:root:# episodes completed so far: 99
1283
+ INFO:root:# successes: 0 (0.0%)
1284
+
1285
+
1286
  90%|█████████ | 9/10 [04:31<00:30, 30.02s/it]INFO:root:
1287
+ Task: put the yellow and white mug in the microwave and close it
1288
+ INFO:root:Starting episode 10...
1289
+ huggingface/tokenizers: The current process just got forked, after parallelism has already been used. Disabling parallelism to avoid deadlocks...
1290
+ To disable this warning, you can either:
1291
+ - Avoid using `tokenizers` before the fork if possible
1292
+ - Explicitly set the environment variable TOKENIZERS_PARALLELISM=(true | false)
1293
+ INFO:root:Success: False
1294
+ INFO:root:# episodes completed so far: 100
1295
+ INFO:root:# successes: 0 (0.0%)
1296
+
1297
+
1298
+ INFO:root:Current task success rate: 0.0
1299
+ INFO:root:Current total success rate: 0.0
1300
+
1301
+ INFO:root:Total success rate: 0.0
1302
+ INFO:root:Total episodes: 100
1303
+ Exception ignored in: <function MjRenderContext.__del__ at 0x14cd11c11ea0>
1304
+ Traceback (most recent call last):
1305
+ File "/user/hominhduy.nguyen01/u24877/.local/lib/python3.10/site-packages/robosuite/utils/binding_utils.py", line 199, in __del__
1306
+ self.gl_ctx.free()
1307
+ File "/user/hominhduy.nguyen01/u24877/.local/lib/python3.10/site-packages/robosuite/renderers/context/egl_context.py", line 149, in free
1308
+ EGL.eglMakeCurrent(EGL_DISPLAY, EGL.EGL_NO_SURFACE, EGL.EGL_NO_SURFACE, EGL.EGL_NO_CONTEXT)
1309
+ File "/user/hominhduy.nguyen01/u24877/.local/lib/python3.10/site-packages/OpenGL/error.py", line 230, in glCheckError
1310
+ raise self._errorClass(
1311
+ OpenGL.raw.EGL._errors.EGLError: EGLError(
1312
+ err = EGL_NOT_INITIALIZED,
1313
+ baseOperation = eglMakeCurrent,
1314
+ cArguments = (
1315
+ <OpenGL._opaque.EGLDisplay_pointer object at 0x14ccc11caa40>,
1316
+ <OpenGL._opaque.EGLSurface_pointer object at 0x14cd11b98bc0>,
1317
+ <OpenGL._opaque.EGLSurface_pointer object at 0x14cd11b98bc0>,
1318
+ <OpenGL._opaque.EGLContext_pointer object at 0x14cd11b98b40>,
1319
+ ),
1320
+ result = 0
1321
+ )
1322
+ Exception ignored in: <function EGLGLContext.__del__ at 0x14cd11c11cf0>
1323
+ Traceback (most recent call last):
1324
+ File "/user/hominhduy.nguyen01/u24877/.local/lib/python3.10/site-packages/robosuite/renderers/context/egl_context.py", line 155, in __del__
1325
+ self.free()
1326
+ File "/user/hominhduy.nguyen01/u24877/.local/lib/python3.10/site-packages/robosuite/renderers/context/egl_context.py", line 149, in free
1327
+ EGL.eglMakeCurrent(EGL_DISPLAY, EGL.EGL_NO_SURFACE, EGL.EGL_NO_SURFACE, EGL.EGL_NO_CONTEXT)
1328
+ File "/user/hominhduy.nguyen01/u24877/.local/lib/python3.10/site-packages/OpenGL/error.py", line 230, in glCheckError
1329
+ raise self._errorClass(
1330
+ OpenGL.raw.EGL._errors.EGLError: EGLError(
1331
+ err = EGL_NOT_INITIALIZED,
1332
+ baseOperation = eglMakeCurrent,
1333
+ cArguments = (
1334
+ <OpenGL._opaque.EGLDisplay_pointer object at 0x14ccc11caa40>,
1335
+ <OpenGL._opaque.EGLSurface_pointer object at 0x14cd11b98bc0>,
1336
+ <OpenGL._opaque.EGLSurface_pointer object at 0x14cd11b98bc0>,
1337
+ <OpenGL._opaque.EGLContext_pointer object at 0x14cd11b98b40>,
1338
+ ),
1339
+ result = 0
1340
+ )
1341
+ sys:1: DeprecationWarning: builtin type swigvarlink has no __module__ attribute
1342
+ ===========================================
1343
+ Evaluation completed!
1344
+ Videos saved to: /projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/VLA-Humanoid/results/eval_pi0fast_libero/videos
1345
+ ===========================================
1346
+ ============ Job Information ===================================================
1347
+ Submitted: 2026-02-10T09:23:42
1348
+ Started: 2026-02-10T09:24:05
1349
+ Ended: 2026-02-10T10:22:43
1350
+ Elapsed: 59 min, Limit: 240 min, Difference: 181 min
1351
+ CPUs: 16, Nodes: 1
1352
+ Estimated Consumption: 590.00 core-hours
1353
+ ================================================================================
scripts/logs/pi0fast_baseline_libero_h100.err ADDED
The diff for this file is too large to render. See raw diff
 
scripts/logs/pi0fast_baseline_libero_h100.out ADDED
@@ -0,0 +1,569 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ================================================================================
2
+ JobID = 12538472
3
+ User = u24877, Account = kisski-spath
4
+ Partition = kisski, Nodelist = ggpu174
5
+ ================================================================================
6
+ ===========================================
7
+ Experiment: pi0fast_baseline_libero_30k
8
+ Codebase: /projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/VLA-Humanoid
9
+ Data: /projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/merged_libero_mask_depth_noops_lerobot_10
10
+ Policy Config Source: /projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/VLA-Humanoid/configs/policy_config/pi0fast_baseline.json
11
+ Temp Config Dir: /projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/VLA-Humanoid/temp/configs/pi0fast_baseline_libero_30k
12
+ Output Dir: /projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/VLA-Humanoid/outputs/train/2026-02-08/07-52-25_pi0fast_baseline_libero_30k
13
+ ===========================================
14
+ {'batch_size': 4,
15
+ 'dataset': {'episodes': None,
16
+ 'image_transforms': {'enable': True,
17
+ 'image_tfs': {'brightness': {'kwargs': {'brightness': [0.8,
18
+ 1.2]},
19
+ 'type': 'ColorJitter',
20
+ 'weight': 1.0},
21
+ 'contrast': {'kwargs': {'contrast': [0.8,
22
+ 1.2]},
23
+ 'type': 'ColorJitter',
24
+ 'weight': 1.0},
25
+ 'crop_resize': {'kwargs': {'ratio': [1,
26
+ 1],
27
+ 'scale': [0.9,
28
+ 0.95],
29
+ 'size': [256,
30
+ 256]},
31
+ 'type': 'RandomResizedCrop',
32
+ 'weight': 1.0},
33
+ 'hue': {'kwargs': {'hue': [-0.05,
34
+ 0.05]},
35
+ 'type': 'ColorJitter',
36
+ 'weight': 1.0},
37
+ 'rotate': {'kwargs': {'degrees': [-5,
38
+ 5]},
39
+ 'type': 'RandomRotate',
40
+ 'weight': 1.0},
41
+ 'saturation': {'kwargs': {'saturation': [0.5,
42
+ 1.5]},
43
+ 'type': 'ColorJitter',
44
+ 'weight': 1.0},
45
+ 'sharpness': {'kwargs': {'sharpness': [0.5,
46
+ 1.5]},
47
+ 'type': 'SharpnessJitter',
48
+ 'weight': 1.0}},
49
+ 'max_num_transforms': 3,
50
+ 'random_order': False,
51
+ 'wrist_tfs': {'brightness': {'kwargs': {'brightness': [0.8,
52
+ 1.2]},
53
+ 'type': 'ColorJitter',
54
+ 'weight': 1.0},
55
+ 'contrast': {'kwargs': {'contrast': [0.8,
56
+ 1.2]},
57
+ 'type': 'ColorJitter',
58
+ 'weight': 1.0},
59
+ 'hue': {'kwargs': {'hue': [-0.05,
60
+ 0.05]},
61
+ 'type': 'ColorJitter',
62
+ 'weight': 1.0},
63
+ 'saturation': {'kwargs': {'saturation': [0.5,
64
+ 1.5]},
65
+ 'type': 'ColorJitter',
66
+ 'weight': 1.0},
67
+ 'sharpness': {'kwargs': {'sharpness': [0.5,
68
+ 1.5]},
69
+ 'type': 'SharpnessJitter',
70
+ 'weight': 1.0}}},
71
+ 'repo_id': '.',
72
+ 'revision': None,
73
+ 'root': '/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/merged_libero_mask_depth_noops_lerobot_10',
74
+ 'use_imagenet_stats': True,
75
+ 'video_backend': 'pyav',
76
+ 'vqa_data_path': None},
77
+ 'env': None,
78
+ 'eval': {'batch_size': 50, 'n_episodes': 50, 'use_async_envs': False},
79
+ 'eval_freq': 20000,
80
+ 'job_name': 'pi0fast_baseline_libero_30k',
81
+ 'log_freq': 100,
82
+ 'num_workers': 8,
83
+ 'optimizer': {'betas': [0.9, 0.95],
84
+ 'eps': 1e-08,
85
+ 'grad_clip_norm': 1,
86
+ 'lr': 0.0001,
87
+ 'type': 'adamw',
88
+ 'weight_decay': 1e-05},
89
+ 'output_dir': '/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/VLA-Humanoid/outputs/train/2026-02-08/07-52-25_pi0fast_baseline_libero_30k',
90
+ 'policy': {'adapt_to_pi_aloha': False,
91
+ 'checkpoint_path': None,
92
+ 'chunk_size': 10,
93
+ 'device': 'cuda',
94
+ 'empty_cameras': 0,
95
+ 'fast_skip_tokens': 128,
96
+ 'fast_tokenizer_path': '/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/ricl_openpi/fast',
97
+ 'freeze_lm_head': True,
98
+ 'freeze_vision_encoder': True,
99
+ 'grad_clip_norm': 1,
100
+ 'gradient_accumulation_steps': 4,
101
+ 'input_features': {},
102
+ 'interpolate_like_pi': False,
103
+ 'max_action_dim': 32,
104
+ 'max_decoding_steps': 256,
105
+ 'max_input_seq_len': 256,
106
+ 'max_state_dim': 32,
107
+ 'n_action_steps': 10,
108
+ 'n_obs_steps': 1,
109
+ 'normalization_mapping': {'ACTION': <NormalizationMode.MEAN_STD: 'MEAN_STD'>,
110
+ 'STATE': <NormalizationMode.MEAN_STD: 'MEAN_STD'>,
111
+ 'VISUAL': <NormalizationMode.IDENTITY: 'IDENTITY'>},
112
+ 'optimizer_betas': [0.9, 0.95],
113
+ 'optimizer_eps': 1e-08,
114
+ 'optimizer_lr': 0.0001,
115
+ 'optimizer_weight_decay': 1e-05,
116
+ 'output_features': {},
117
+ 'padding_side': 'right',
118
+ 'pi0_paligemma_path': '/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/VLA-Humanoid/paligemma-3b-pt-224',
119
+ 'precision': 'bfloat16',
120
+ 'proj_width': 1024,
121
+ 'relaxed_action_decoding': True,
122
+ 'resize_imgs_with_padding': [224, 224],
123
+ 'scheduler_decay_lr': 2.5e-06,
124
+ 'scheduler_decay_steps': 30000,
125
+ 'scheduler_warmup_steps': 1000,
126
+ 'tokenizer_max_length': 48,
127
+ 'type': 'pi0fast',
128
+ 'use_amp': False,
129
+ 'use_cache': True,
130
+ 'use_delta_joint_actions_aloha': False},
131
+ 'resume': False,
132
+ 'save_checkpoint': True,
133
+ 'save_freq': 5000,
134
+ 'scheduler': {'decay_lr': 2.5e-06,
135
+ 'num_decay_steps': 30000,
136
+ 'num_warmup_steps': 1000,
137
+ 'peak_lr': 0.0001,
138
+ 'type': 'cosine_decay_with_warmup'},
139
+ 'seed': 42,
140
+ 'steps': 100000,
141
+ 'use_policy_training_preset': True,
142
+ 'wandb': {'disable_artifact': True,
143
+ 'enable': False,
144
+ 'entity': 'Robotics_VLA',
145
+ 'mode': 'online',
146
+ 'notes': None,
147
+ 'project': 'pi0_lerobot',
148
+ 'run_id': None}}
149
+ {'batch_size': 4,
150
+ 'dataset': {'episodes': None,
151
+ 'image_transforms': {'enable': True,
152
+ 'image_tfs': {'brightness': {'kwargs': {'brightness': [0.8,
153
+ 1.2]},
154
+ 'type': 'ColorJitter',
155
+ 'weight': 1.0},
156
+ 'contrast': {'kwargs': {'contrast': [0.8,
157
+ 1.2]},
158
+ 'type': 'ColorJitter',
159
+ 'weight': 1.0},
160
+ 'crop_resize': {'kwargs': {'ratio': [1,
161
+ 1],
162
+ 'scale': [0.9,
163
+ 0.95],
164
+ 'size': [256,
165
+ 256]},
166
+ 'type': 'RandomResizedCrop',
167
+ 'weight': 1.0},
168
+ 'hue': {'kwargs': {'hue': [-0.05,
169
+ 0.05]},
170
+ 'type': 'ColorJitter',
171
+ 'weight': 1.0},
172
+ 'rotate': {'kwargs': {'degrees': [-5,
173
+ 5]},
174
+ 'type': 'RandomRotate',
175
+ 'weight': 1.0},
176
+ 'saturation': {'kwargs': {'saturation': [0.5,
177
+ 1.5]},
178
+ 'type': 'ColorJitter',
179
+ 'weight': 1.0},
180
+ 'sharpness': {'kwargs': {'sharpness': [0.5,
181
+ 1.5]},
182
+ 'type': 'SharpnessJitter',
183
+ 'weight': 1.0}},
184
+ 'max_num_transforms': 3,
185
+ 'random_order': False,
186
+ 'wrist_tfs': {'brightness': {'kwargs': {'brightness': [0.8,
187
+ 1.2]},
188
+ 'type': 'ColorJitter',
189
+ 'weight': 1.0},
190
+ 'contrast': {'kwargs': {'contrast': [0.8,
191
+ 1.2]},
192
+ 'type': 'ColorJitter',
193
+ 'weight': 1.0},
194
+ 'hue': {'kwargs': {'hue': [-0.05,
195
+ 0.05]},
196
+ 'type': 'ColorJitter',
197
+ 'weight': 1.0},
198
+ 'saturation': {'kwargs': {'saturation': [0.5,
199
+ 1.5]},
200
+ 'type': 'ColorJitter',
201
+ 'weight': 1.0},
202
+ 'sharpness': {'kwargs': {'sharpness': [0.5,
203
+ 1.5]},
204
+ 'type': 'SharpnessJitter',
205
+ 'weight': 1.0}}},
206
+ 'repo_id': '.',
207
+ 'revision': None,
208
+ 'root': '/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/merged_libero_mask_depth_noops_lerobot_10',
209
+ 'use_imagenet_stats': True,
210
+ 'video_backend': 'pyav',
211
+ 'vqa_data_path': None},
212
+ 'env': None,
213
+ 'eval': {'batch_size': 50, 'n_episodes': 50, 'use_async_envs': False},
214
+ 'eval_freq': 20000,
215
+ 'job_name': 'pi0fast_baseline_libero_30k',
216
+ 'log_freq': 100,
217
+ 'num_workers': 8,
218
+ 'optimizer': {'betas': [0.9, 0.95],
219
+ 'eps': 1e-08,
220
+ 'grad_clip_norm': 1,
221
+ 'lr': 0.0001,
222
+ 'type': 'adamw',
223
+ 'weight_decay': 1e-05},
224
+ 'output_dir': '/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/VLA-Humanoid/outputs/train/2026-02-08/07-52-25_pi0fast_baseline_libero_30k',
225
+ 'policy': {'adapt_to_pi_aloha': False,
226
+ 'checkpoint_path': None,
227
+ 'chunk_size': 10,
228
+ 'device': 'cuda',
229
+ 'empty_cameras': 0,
230
+ 'fast_skip_tokens': 128,
231
+ 'fast_tokenizer_path': '/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/ricl_openpi/fast',
232
+ 'freeze_lm_head': True,
233
+ 'freeze_vision_encoder': True,
234
+ 'grad_clip_norm': 1,
235
+ 'gradient_accumulation_steps': 4,
236
+ 'input_features': {},
237
+ 'interpolate_like_pi': False,
238
+ 'max_action_dim': 32,
239
+ 'max_decoding_steps': 256,
240
+ 'max_input_seq_len': 256,
241
+ 'max_state_dim': 32,
242
+ 'n_action_steps': 10,
243
+ 'n_obs_steps': 1,
244
+ 'normalization_mapping': {'ACTION': <NormalizationMode.MEAN_STD: 'MEAN_STD'>,
245
+ 'STATE': <NormalizationMode.MEAN_STD: 'MEAN_STD'>,
246
+ 'VISUAL': <NormalizationMode.IDENTITY: 'IDENTITY'>},
247
+ 'optimizer_betas': [0.9, 0.95],
248
+ 'optimizer_eps': 1e-08,
249
+ 'optimizer_lr': 0.0001,
250
+ 'optimizer_weight_decay': 1e-05,
251
+ 'output_features': {},
252
+ 'padding_side': 'right',
253
+ 'pi0_paligemma_path': '/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/VLA-Humanoid/paligemma-3b-pt-224',
254
+ 'precision': 'bfloat16',
255
+ 'proj_width': 1024,
256
+ 'relaxed_action_decoding': True,
257
+ 'resize_imgs_with_padding': [224, 224],
258
+ 'scheduler_decay_lr': 2.5e-06,
259
+ 'scheduler_decay_steps': 30000,
260
+ 'scheduler_warmup_steps': 1000,
261
+ 'tokenizer_max_length': 48,
262
+ 'type': 'pi0fast',
263
+ 'use_amp': False,
264
+ 'use_cache': True,
265
+ 'use_delta_joint_actions_aloha': False},
266
+ 'resume': False,
267
+ 'save_checkpoint': True,
268
+ 'save_freq': 5000,
269
+ 'scheduler': {'decay_lr': 2.5e-06,
270
+ 'num_decay_steps': 30000,
271
+ 'num_warmup_steps': 1000,
272
+ 'peak_lr': 0.0001,
273
+ 'type': 'cosine_decay_with_warmup'},
274
+ 'seed': 42,
275
+ 'steps': 100000,
276
+ 'use_policy_training_preset': True,
277
+ 'wandb': {'disable_artifact': True,
278
+ 'enable': False,
279
+ 'entity': 'Robotics_VLA',
280
+ 'mode': 'online',
281
+ 'notes': None,
282
+ 'project': 'pi0_lerobot',
283
+ 'run_id': None}}
284
+ {'batch_size': 4,
285
+ 'dataset': {'episodes': None,
286
+ 'image_transforms': {'enable': True,
287
+ 'image_tfs': {'brightness': {'kwargs': {'brightness': [0.8,
288
+ 1.2]},
289
+ 'type': 'ColorJitter',
290
+ 'weight': 1.0},
291
+ 'contrast': {'kwargs': {'contrast': [0.8,
292
+ 1.2]},
293
+ 'type': 'ColorJitter',
294
+ 'weight': 1.0},
295
+ 'crop_resize': {'kwargs': {'ratio': [1,
296
+ 1],
297
+ 'scale': [0.9,
298
+ 0.95],
299
+ 'size': [256,
300
+ 256]},
301
+ 'type': 'RandomResizedCrop',
302
+ 'weight': 1.0},
303
+ 'hue': {'kwargs': {'hue': [-0.05,
304
+ 0.05]},
305
+ 'type': 'ColorJitter',
306
+ 'weight': 1.0},
307
+ 'rotate': {'kwargs': {'degrees': [-5,
308
+ 5]},
309
+ 'type': 'RandomRotate',
310
+ 'weight': 1.0},
311
+ 'saturation': {'kwargs': {'saturation': [0.5,
312
+ 1.5]},
313
+ 'type': 'ColorJitter',
314
+ 'weight': 1.0},
315
+ 'sharpness': {'kwargs': {'sharpness': [0.5,
316
+ 1.5]},
317
+ 'type': 'SharpnessJitter',
318
+ 'weight': 1.0}},
319
+ 'max_num_transforms': 3,
320
+ 'random_order': False,
321
+ 'wrist_tfs': {'brightness': {'kwargs': {'brightness': [0.8,
322
+ 1.2]},
323
+ 'type': 'ColorJitter',
324
+ 'weight': 1.0},
325
+ 'contrast': {'kwargs': {'contrast': [0.8,
326
+ 1.2]},
327
+ 'type': 'ColorJitter',
328
+ 'weight': 1.0},
329
+ 'hue': {'kwargs': {'hue': [-0.05,
330
+ 0.05]},
331
+ 'type': 'ColorJitter',
332
+ 'weight': 1.0},
333
+ 'saturation': {'kwargs': {'saturation': [0.5,
334
+ 1.5]},
335
+ 'type': 'ColorJitter',
336
+ 'weight': 1.0},
337
+ 'sharpness': {'kwargs': {'sharpness': [0.5,
338
+ 1.5]},
339
+ 'type': 'SharpnessJitter',
340
+ 'weight': 1.0}}},
341
+ 'repo_id': '.',
342
+ 'revision': None,
343
+ 'root': '/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/merged_libero_mask_depth_noops_lerobot_10',
344
+ 'use_imagenet_stats': True,
345
+ 'video_backend': 'pyav',
346
+ 'vqa_data_path': None},
347
+ 'env': None,
348
+ 'eval': {'batch_size': 50, 'n_episodes': 50, 'use_async_envs': False},
349
+ 'eval_freq': 20000,
350
+ 'job_name': 'pi0fast_baseline_libero_30k',
351
+ 'log_freq': 100,
352
+ 'num_workers': 8,
353
+ 'optimizer': {'betas': [0.9, 0.95],
354
+ 'eps': 1e-08,
355
+ 'grad_clip_norm': 1,
356
+ 'lr': 0.0001,
357
+ 'type': 'adamw',
358
+ 'weight_decay': 1e-05},
359
+ 'output_dir': '/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/VLA-Humanoid/outputs/train/2026-02-08/07-52-25_pi0fast_baseline_libero_30k',
360
+ 'policy': {'adapt_to_pi_aloha': False,
361
+ 'checkpoint_path': None,
362
+ 'chunk_size': 10,
363
+ 'device': 'cuda',
364
+ 'empty_cameras': 0,
365
+ 'fast_skip_tokens': 128,
366
+ 'fast_tokenizer_path': '/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/ricl_openpi/fast',
367
+ 'freeze_lm_head': True,
368
+ 'freeze_vision_encoder': True,
369
+ 'grad_clip_norm': 1,
370
+ 'gradient_accumulation_steps': 4,
371
+ 'input_features': {},
372
+ 'interpolate_like_pi': False,
373
+ 'max_action_dim': 32,
374
+ 'max_decoding_steps': 256,
375
+ 'max_input_seq_len': 256,
376
+ 'max_state_dim': 32,
377
+ 'n_action_steps': 10,
378
+ 'n_obs_steps': 1,
379
+ 'normalization_mapping': {'ACTION': <NormalizationMode.MEAN_STD: 'MEAN_STD'>,
380
+ 'STATE': <NormalizationMode.MEAN_STD: 'MEAN_STD'>,
381
+ 'VISUAL': <NormalizationMode.IDENTITY: 'IDENTITY'>},
382
+ 'optimizer_betas': [0.9, 0.95],
383
+ 'optimizer_eps': 1e-08,
384
+ 'optimizer_lr': 0.0001,
385
+ 'optimizer_weight_decay': 1e-05,
386
+ 'output_features': {},
387
+ 'padding_side': 'right',
388
+ 'pi0_paligemma_path': '/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/VLA-Humanoid/paligemma-3b-pt-224',
389
+ 'precision': 'bfloat16',
390
+ 'proj_width': 1024,
391
+ 'relaxed_action_decoding': True,
392
+ 'resize_imgs_with_padding': [224, 224],
393
+ 'scheduler_decay_lr': 2.5e-06,
394
+ 'scheduler_decay_steps': 30000,
395
+ 'scheduler_warmup_steps': 1000,
396
+ 'tokenizer_max_length': 48,
397
+ 'type': 'pi0fast',
398
+ 'use_amp': False,
399
+ 'use_cache': True,
400
+ 'use_delta_joint_actions_aloha': False},
401
+ 'resume': False,
402
+ 'save_checkpoint': True,
403
+ 'save_freq': 5000,
404
+ 'scheduler': {'decay_lr': 2.5e-06,
405
+ 'num_decay_steps': 30000,
406
+ 'num_warmup_steps': 1000,
407
+ 'peak_lr': 0.0001,
408
+ 'type': 'cosine_decay_with_warmup'},
409
+ 'seed': 42,
410
+ 'steps': 100000,
411
+ 'use_policy_training_preset': True,
412
+ 'wandb': {'disable_artifact': True,
413
+ 'enable': False,
414
+ 'entity': 'Robotics_VLA',
415
+ 'mode': 'online',
416
+ 'notes': None,
417
+ 'project': 'pi0_lerobot',
418
+ 'run_id': None}}
419
+ {'batch_size': 4,
420
+ 'dataset': {'episodes': None,
421
+ 'image_transforms': {'enable': True,
422
+ 'image_tfs': {'brightness': {'kwargs': {'brightness': [0.8,
423
+ 1.2]},
424
+ 'type': 'ColorJitter',
425
+ 'weight': 1.0},
426
+ 'contrast': {'kwargs': {'contrast': [0.8,
427
+ 1.2]},
428
+ 'type': 'ColorJitter',
429
+ 'weight': 1.0},
430
+ 'crop_resize': {'kwargs': {'ratio': [1,
431
+ 1],
432
+ 'scale': [0.9,
433
+ 0.95],
434
+ 'size': [256,
435
+ 256]},
436
+ 'type': 'RandomResizedCrop',
437
+ 'weight': 1.0},
438
+ 'hue': {'kwargs': {'hue': [-0.05,
439
+ 0.05]},
440
+ 'type': 'ColorJitter',
441
+ 'weight': 1.0},
442
+ 'rotate': {'kwargs': {'degrees': [-5,
443
+ 5]},
444
+ 'type': 'RandomRotate',
445
+ 'weight': 1.0},
446
+ 'saturation': {'kwargs': {'saturation': [0.5,
447
+ 1.5]},
448
+ 'type': 'ColorJitter',
449
+ 'weight': 1.0},
450
+ 'sharpness': {'kwargs': {'sharpness': [0.5,
451
+ 1.5]},
452
+ 'type': 'SharpnessJitter',
453
+ 'weight': 1.0}},
454
+ 'max_num_transforms': 3,
455
+ 'random_order': False,
456
+ 'wrist_tfs': {'brightness': {'kwargs': {'brightness': [0.8,
457
+ 1.2]},
458
+ 'type': 'ColorJitter',
459
+ 'weight': 1.0},
460
+ 'contrast': {'kwargs': {'contrast': [0.8,
461
+ 1.2]},
462
+ 'type': 'ColorJitter',
463
+ 'weight': 1.0},
464
+ 'hue': {'kwargs': {'hue': [-0.05,
465
+ 0.05]},
466
+ 'type': 'ColorJitter',
467
+ 'weight': 1.0},
468
+ 'saturation': {'kwargs': {'saturation': [0.5,
469
+ 1.5]},
470
+ 'type': 'ColorJitter',
471
+ 'weight': 1.0},
472
+ 'sharpness': {'kwargs': {'sharpness': [0.5,
473
+ 1.5]},
474
+ 'type': 'SharpnessJitter',
475
+ 'weight': 1.0}}},
476
+ 'repo_id': '.',
477
+ 'revision': None,
478
+ 'root': '/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/merged_libero_mask_depth_noops_lerobot_10',
479
+ 'use_imagenet_stats': True,
480
+ 'video_backend': 'pyav',
481
+ 'vqa_data_path': None},
482
+ 'env': None,
483
+ 'eval': {'batch_size': 50, 'n_episodes': 50, 'use_async_envs': False},
484
+ 'eval_freq': 20000,
485
+ 'job_name': 'pi0fast_baseline_libero_30k',
486
+ 'log_freq': 100,
487
+ 'num_workers': 8,
488
+ 'optimizer': {'betas': [0.9, 0.95],
489
+ 'eps': 1e-08,
490
+ 'grad_clip_norm': 1,
491
+ 'lr': 0.0001,
492
+ 'type': 'adamw',
493
+ 'weight_decay': 1e-05},
494
+ 'output_dir': '/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/VLA-Humanoid/outputs/train/2026-02-08/07-52-25_pi0fast_baseline_libero_30k',
495
+ 'policy': {'adapt_to_pi_aloha': False,
496
+ 'checkpoint_path': None,
497
+ 'chunk_size': 10,
498
+ 'device': 'cuda',
499
+ 'empty_cameras': 0,
500
+ 'fast_skip_tokens': 128,
501
+ 'fast_tokenizer_path': '/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/ricl_openpi/fast',
502
+ 'freeze_lm_head': True,
503
+ 'freeze_vision_encoder': True,
504
+ 'grad_clip_norm': 1,
505
+ 'gradient_accumulation_steps': 4,
506
+ 'input_features': {},
507
+ 'interpolate_like_pi': False,
508
+ 'max_action_dim': 32,
509
+ 'max_decoding_steps': 256,
510
+ 'max_input_seq_len': 256,
511
+ 'max_state_dim': 32,
512
+ 'n_action_steps': 10,
513
+ 'n_obs_steps': 1,
514
+ 'normalization_mapping': {'ACTION': <NormalizationMode.MEAN_STD: 'MEAN_STD'>,
515
+ 'STATE': <NormalizationMode.MEAN_STD: 'MEAN_STD'>,
516
+ 'VISUAL': <NormalizationMode.IDENTITY: 'IDENTITY'>},
517
+ 'optimizer_betas': [0.9, 0.95],
518
+ 'optimizer_eps': 1e-08,
519
+ 'optimizer_lr': 0.0001,
520
+ 'optimizer_weight_decay': 1e-05,
521
+ 'output_features': {},
522
+ 'padding_side': 'right',
523
+ 'pi0_paligemma_path': '/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/VLA-Humanoid/paligemma-3b-pt-224',
524
+ 'precision': 'bfloat16',
525
+ 'proj_width': 1024,
526
+ 'relaxed_action_decoding': True,
527
+ 'resize_imgs_with_padding': [224, 224],
528
+ 'scheduler_decay_lr': 2.5e-06,
529
+ 'scheduler_decay_steps': 30000,
530
+ 'scheduler_warmup_steps': 1000,
531
+ 'tokenizer_max_length': 48,
532
+ 'type': 'pi0fast',
533
+ 'use_amp': False,
534
+ 'use_cache': True,
535
+ 'use_delta_joint_actions_aloha': False},
536
+ 'resume': False,
537
+ 'save_checkpoint': True,
538
+ 'save_freq': 5000,
539
+ 'scheduler': {'decay_lr': 2.5e-06,
540
+ 'num_decay_steps': 30000,
541
+ 'num_warmup_steps': 1000,
542
+ 'peak_lr': 0.0001,
543
+ 'type': 'cosine_decay_with_warmup'},
544
+ 'seed': 42,
545
+ 'steps': 100000,
546
+ 'use_policy_training_preset': True,
547
+ 'wandb': {'disable_artifact': True,
548
+ 'enable': False,
549
+ 'entity': 'Robotics_VLA',
550
+ 'mode': 'online',
551
+ 'notes': None,
552
+ 'project': 'pi0_lerobot',
553
+ 'run_id': None}}
554
+ load fresh policy
555
+ load fresh policy
556
+ load fresh policy
557
+ load fresh policy
558
+ ===========================================
559
+ Training completed!
560
+ Outputs in: /projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/VLA-Humanoid/outputs/train/2026-02-08/07-52-25_pi0fast_baseline_libero_30k
561
+ ===========================================
562
+ ============ Job Information ===================================================
563
+ Submitted: 2026-02-08T07:52:07
564
+ Started: 2026-02-08T07:52:16
565
+ Ended: 2026-02-09T07:22:29
566
+ Elapsed: 1411 min, Limit: 2880 min, Difference: 1469 min
567
+ CPUs: 32, Nodes: 1
568
+ Estimated Consumption: 14110.00 core-hours
569
+ ================================================================================
scripts/serve_policy_ricl.py ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import dataclasses
2
+ import enum
3
+ import logging
4
+ import socket
5
+
6
+ import tyro
7
+
8
+ from openpi.policies import policy as _policy
9
+ from openpi.policies import policy_config as _policy_config
10
+ from openpi.serving import websocket_policy_server
11
+ from openpi.training import config as _config
12
+
13
+
14
+ class EnvMode(enum.Enum):
15
+ """Supported environments."""
16
+
17
+ ALOHA = "aloha"
18
+ ALOHA_SIM = "aloha_sim"
19
+ DROID = "droid"
20
+ LIBERO = "libero"
21
+
22
+
23
+ @dataclasses.dataclass
24
+ class Checkpoint:
25
+ """Load a policy from a trained checkpoint."""
26
+
27
+ # Training config name (e.g., "pi0_aloha_sim").
28
+ config: str
29
+ # Checkpoint directory (e.g., "checkpoints/pi0_aloha_sim/exp/10000").
30
+ dir: str
31
+ # Demos directory (e.g., "ricl_droid_preprocessing/collected_demos/2025-03-04").
32
+ demos_dir: str
33
+
34
+
35
+ @dataclasses.dataclass
36
+ class Default:
37
+ """Use the default policy for the given environment."""
38
+
39
+
40
+ @dataclasses.dataclass
41
+ class Args:
42
+ """Arguments for the serve_policy script."""
43
+
44
+ # Environment to serve the policy for. This is only used when serving default policies.
45
+ env: EnvMode = EnvMode.DROID
46
+
47
+ # If provided, will be used in case the "prompt" key is not present in the data, or if the model doesn't have a default
48
+ # prompt.
49
+ default_prompt: str | None = None
50
+
51
+ # Port to serve the policy on.
52
+ port: int = 8000
53
+ # Record the policy's behavior for debugging.
54
+ record: bool = False
55
+
56
+ # Specifies how to load the policy. If not provided, the default policy for the environment will be used.
57
+ policy: Checkpoint | Default = dataclasses.field(default_factory=Default)
58
+
59
+
60
+ def create_policy(args: Args) -> _policy.Policy:
61
+ """Create a policy from the given arguments."""
62
+ return _policy_config.create_trained_ricl_policy(
63
+ _config.get_config(args.policy.config), args.policy.dir, demos_dir=args.policy.demos_dir
64
+ )
65
+
66
+
67
+ def main(args: Args) -> None:
68
+ policy = create_policy(args)
69
+ policy_metadata = policy.metadata
70
+
71
+ # Record the policy's behavior.
72
+ if args.record:
73
+ policy = _policy.PolicyRecorder(policy, "policy_records")
74
+
75
+ hostname = socket.gethostname()
76
+ local_ip = socket.gethostbyname(hostname)
77
+ logging.info("Creating server (host: %s, ip: %s)", hostname, local_ip)
78
+
79
+ server = websocket_policy_server.WebsocketPolicyServer(
80
+ policy=policy,
81
+ host="0.0.0.0",
82
+ port=args.port,
83
+ metadata=policy_metadata,
84
+ )
85
+ server.serve_forever()
86
+
87
+
88
+ if __name__ == "__main__":
89
+ logging.basicConfig(level=logging.INFO, force=True)
90
+ main(tyro.cli(Args))
scripts/test_ricl_data_pipeline.py ADDED
@@ -0,0 +1,219 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ Quick test script to validate LIBERO dataset loading and RICL precomputation logic.
4
+
5
+ This runs a minimal version of the precomputation to verify:
6
+ 1. Parquet files can be loaded
7
+ 2. Video frames can be extracted
8
+ 3. DINOv2 embeddings can be built
9
+ 4. FAISS index works correctly
10
+ 5. Self-exclusion in retrieval works
11
+
12
+ Usage:
13
+ python scripts/test_ricl_data_pipeline.py
14
+ """
15
+
16
+ import sys
17
+ from pathlib import Path
18
+
19
+ # Add src to path
20
+ sys.path.insert(0, str(Path(__file__).parent.parent / "src"))
21
+
22
+ import numpy as np
23
+ import pandas as pd
24
+ from glob import glob
25
+ from tqdm import tqdm
26
+ import torch
27
+ import torchvision
28
+
29
+ print("=" * 60)
30
+ print("RICL Data Pipeline Test")
31
+ print("=" * 60)
32
+
33
+ # Paths - Using smaller test dataset
34
+ DATA_DIR = Path("/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/merged_libero_mask_depth_noops_lerobot_10")
35
+ VIDEOS_DIR = DATA_DIR / "videos"
36
+
37
+ print(f"Testing with dataset: {DATA_DIR}")
38
+ print(f"Dataset exists: {DATA_DIR.exists()}")
39
+
40
+ # Test 1: Load parquet files
41
+ print("\nTest 1: Loading parquet files...")
42
+ parquet_files = sorted(glob(str(DATA_DIR / "data" / "**" / "*.parquet"), recursive=True))
43
+ print(f" Found {len(parquet_files)} parquet files")
44
+
45
+ # Load first few files
46
+ dfs = []
47
+ for f in parquet_files[:2]: # Just first 2 chunks
48
+ df = pd.read_parquet(f)
49
+ dfs.append(df)
50
+ print(f" Loaded {f.split('/')[-1]}: {len(df)} rows")
51
+
52
+ df = pd.concat(dfs, ignore_index=True)
53
+ print(f" Total frames: {len(df)}")
54
+ print(f" ✓ PASSED")
55
+
56
+ # Test 2: Extract state and action
57
+ print("\nTest 2: Extracting state and action...")
58
+ row = df.iloc[0]
59
+ state_ee = np.array(row["observation.states.ee_state"], dtype=np.float32)
60
+ action = np.array(row["action"], dtype=np.float32)
61
+
62
+ print(f" State (ee_state) shape: {state_ee.shape}")
63
+ print(f" Action shape: {action.shape}")
64
+ print(f" State sample: {state_ee[:3]}")
65
+ print(f" Action sample: {action[:3]}")
66
+
67
+ assert state_ee.shape == (6,), f"Expected state shape (6,), got {state_ee.shape}"
68
+ assert action.shape == (7,), f"Expected action shape (7,), got {action.shape}"
69
+ print(f" ✓ PASSED")
70
+
71
+ # Test 3: Load video frame
72
+ print("\nTest 3: Loading video frame...")
73
+ ep_idx = int(row["episode_index"])
74
+ frame_idx = int(row["frame_index"])
75
+
76
+ video_file = f"episode_{ep_idx:06d}.mp4"
77
+ image_key = "observation.images.image"
78
+
79
+ # Find video file
80
+ video_path = None
81
+ for chunk_dir in sorted(VIDEOS_DIR.glob("chunk-*")):
82
+ candidate = chunk_dir / image_key / video_file
83
+ if candidate.exists():
84
+ video_path = candidate
85
+ break
86
+
87
+ if video_path is None:
88
+ print(f" ✗ FAILED: Video not found for episode {ep_idx}")
89
+ else:
90
+ print(f" Video path: {video_path}")
91
+
92
+ # Load frame
93
+ vframes, _, _ = torchvision.io.read_video(str(video_path), pts_unit='sec')
94
+ if frame_idx >= len(vframes):
95
+ frame_idx = len(vframes) - 1
96
+
97
+ frame = vframes[frame_idx].numpy()
98
+ print(f" Frame shape: {frame.shape}")
99
+ print(f" Frame dtype: {frame.dtype}")
100
+ print(f" Frame range: [{frame.min()}, {frame.max()}]")
101
+
102
+ assert frame.shape[2] == 3, f"Expected RGB image, got shape {frame.shape}"
103
+ print(f" ✓ PASSED")
104
+
105
+ # Test 4: DINOv2 encoding (if model available)
106
+ print("\nTest 4: DINOv2 encoding...")
107
+ DINO_MODEL_PATH = Path("/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/VLA-Humanoid/rag/dinov2-base")
108
+
109
+ if not DINO_MODEL_PATH.exists():
110
+ print(f" SKIPPED: DINOv2 model not found at {DINO_MODEL_PATH}")
111
+ else:
112
+ from transformers import AutoImageProcessor, AutoModel
113
+
114
+ device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
115
+ processor = AutoImageProcessor.from_pretrained(str(DINO_MODEL_PATH), local_files_only=True)
116
+ model = AutoModel.from_pretrained(str(DINO_MODEL_PATH), local_files_only=True).to(device)
117
+ model.eval()
118
+
119
+ with torch.no_grad():
120
+ inputs = processor(images=frame, return_tensors="pt")
121
+ inputs = {k: v.to(device) for k, v in inputs.items()}
122
+ outputs = model(**inputs)
123
+ embedding = outputs.last_hidden_state[:, 0, :].cpu().numpy().squeeze()
124
+
125
+ print(f" Embedding shape: {embedding.shape}")
126
+ print(f" Embedding norm: {np.linalg.norm(embedding):.4f}")
127
+
128
+ assert embedding.shape == (768,), f"Expected embedding shape (768,), got {embedding.shape}"
129
+ print(f" ✓ PASSED")
130
+
131
+ # Test 5: Action chunk building
132
+ print("\nTest 5: Action chunk building...")
133
+ ACTION_HORIZON = 50
134
+
135
+ # Get all actions for this episode
136
+ episode_mask = df["episode_index"] == ep_idx
137
+ ep_df = df[episode_mask]
138
+ ep_actions = np.array([
139
+ np.array(row["action"], dtype=np.float32)
140
+ for _, row in ep_df.iterrows()
141
+ ])
142
+
143
+ print(f" Episode {ep_idx} length: {len(ep_df)} frames")
144
+ print(f" Episode actions shape: {ep_actions.shape}")
145
+
146
+ # Build chunk
147
+ local_frame_idx = 0
148
+ action_chunk = []
149
+ for i in range(ACTION_HORIZON):
150
+ if local_frame_idx + i < len(ep_actions):
151
+ action_chunk.append(ep_actions[local_frame_idx + i])
152
+ else:
153
+ action_chunk.append(ep_actions[-1]) # Pad with last action
154
+
155
+ action_chunk = np.stack(action_chunk, axis=0)
156
+ print(f" Action chunk shape: {action_chunk.shape}")
157
+
158
+ assert action_chunk.shape == (ACTION_HORIZON, 7), f"Expected shape ({ACTION_HORIZON}, 7), got {action_chunk.shape}"
159
+ print(f" ✓ PASSED")
160
+
161
+ # Test 6: FAISS index (if faiss available)
162
+ print("\nTest 6: FAISS index and retrieval...")
163
+ try:
164
+ import faiss
165
+
166
+ # Create dummy embeddings
167
+ N = 100
168
+ D = 768
169
+ embeddings = np.random.randn(N, D).astype(np.float32)
170
+
171
+ # L2 normalize
172
+ norms = np.linalg.norm(embeddings, axis=1, keepdims=True)
173
+ embeddings = embeddings / (norms + 1e-8)
174
+
175
+ # Build index
176
+ index = faiss.IndexFlatL2(D)
177
+ index.add(embeddings)
178
+
179
+ # Search for top-3 nearest neighbors
180
+ top_k = 3
181
+ search_k = top_k + 1 # +1 to exclude self
182
+
183
+ query_idx = 0
184
+ query_emb = embeddings[query_idx:query_idx+1]
185
+
186
+ D_result, I_result = index.search(query_emb, search_k)
187
+
188
+ print(f" Index built with {index.ntotal} vectors")
189
+ print(f" Query index: {query_idx}")
190
+ print(f" Retrieved indices: {I_result[0]}")
191
+ print(f" Retrieved distances: {D_result[0]}")
192
+
193
+ # Verify self is first result (distance ~0)
194
+ assert I_result[0, 0] == query_idx, "Self should be first result"
195
+ assert D_result[0, 0] < 1e-5, f"Self-distance should be ~0, got {D_result[0, 0]}"
196
+
197
+ # Filter out self
198
+ mask = I_result[0] != query_idx
199
+ nn_indices = I_result[0][mask][:top_k]
200
+ nn_distances = D_result[0][mask][:top_k]
201
+
202
+ print(f" After self-exclusion:")
203
+ print(f" NN indices: {nn_indices}")
204
+ print(f" NN distances: {nn_distances}")
205
+
206
+ assert query_idx not in nn_indices, "Self should be excluded"
207
+ assert len(nn_indices) == top_k, f"Should have {top_k} NNs, got {len(nn_indices)}"
208
+
209
+ print(f" ✓ PASSED")
210
+
211
+ except ImportError:
212
+ print(f" SKIPPED: faiss not available")
213
+
214
+ print("\n" + "=" * 60)
215
+ print("✓ All tests passed!")
216
+ print("=" * 60)
217
+ print("\nData pipeline is ready. You can now run:")
218
+ print(" sbatch slurm/precompute_ricl_context_libero.slurm")
219
+ print("=" * 60)
scripts/test_ricl_data_pipeline_v2.py ADDED
@@ -0,0 +1,206 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ Quick test script for RICL LIBERO data pipeline.
4
+
5
+ Tests:
6
+ 1. Dataset loading
7
+ 2. Video frame loading
8
+ 3. Action chunk building
9
+ 4. Transform pipeline
10
+ 5. Batch creation
11
+ """
12
+
13
+ import sys
14
+ from pathlib import Path
15
+
16
+ # Add src to path
17
+ sys.path.insert(0, str(Path(__file__).parent.parent / "src"))
18
+
19
+ import numpy as np
20
+
21
+ def test_video_loading():
22
+ """Test that videos can be loaded."""
23
+ print("\n" + "="*60)
24
+ print("TEST 1: Video Loading")
25
+ print("="*60)
26
+
27
+ import av
28
+ from pathlib import Path
29
+
30
+ data_dir = Path("/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/merged_libero_mask_depth_noops_lerobot_10")
31
+
32
+ # Try to load first frame from first episode
33
+ video_path = data_dir / "videos" / "chunk-000" / "observation.images.image" / "episode_000000.mp4"
34
+
35
+ if not video_path.exists():
36
+ print(f"✗ Video not found: {video_path}")
37
+ return False
38
+
39
+ try:
40
+ with av.open(str(video_path)) as container:
41
+ frame = next(container.decode(video=0))
42
+ img = frame.to_ndarray(format='rgb24')
43
+ print(f"✓ Loaded frame shape: {img.shape}")
44
+ print(f"✓ Frame dtype: {img.dtype}")
45
+ print(f"✓ Frame range: [{img.min()}, {img.max()}]")
46
+ return True
47
+ except Exception as e:
48
+ print(f"✗ Failed to load video: {e}")
49
+ return False
50
+
51
+
52
+ def test_dataset_loading():
53
+ """Test RiclLiberoDataset loading."""
54
+ print("\n" + "="*60)
55
+ print("TEST 2: Dataset Loading")
56
+ print("="*60)
57
+
58
+ from openpi.data.ricl_libero_dataset import RiclLiberoDataset
59
+
60
+ data_dir = "/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/merged_libero_mask_depth_noops_lerobot_10"
61
+ context_dir = "rag/ricl_training_context_libero_10_test"
62
+
63
+ try:
64
+ dataset = RiclLiberoDataset(
65
+ data_dir=data_dir,
66
+ context_dir=context_dir,
67
+ action_horizon=15, # Use 15 like DROID
68
+ lambda_decay=10.0,
69
+ num_retrieved_observations=1,
70
+ )
71
+
72
+ print(f"✓ Dataset loaded: {len(dataset)} samples")
73
+ return dataset
74
+ except Exception as e:
75
+ print(f"✗ Failed to load dataset: {e}")
76
+ import traceback
77
+ traceback.print_exc()
78
+ return None
79
+
80
+
81
+ def test_sample_loading(dataset):
82
+ """Test loading a single sample."""
83
+ print("\n" + "="*60)
84
+ print("TEST 3: Sample Loading")
85
+ print("="*60)
86
+
87
+ if dataset is None:
88
+ print("✗ Skipping (dataset not loaded)")
89
+ return False
90
+
91
+ try:
92
+ sample = dataset[0]
93
+
94
+ print("✓ Sample loaded successfully")
95
+ print(f" Keys: {list(sample.keys())}")
96
+
97
+ # Check images
98
+ for key in ['query_top_image', 'query_wrist_image', 'retrieved_0_top_image', 'retrieved_0_wrist_image']:
99
+ if key in sample:
100
+ img = sample[key]
101
+ print(f" {key}: shape={img.shape}, dtype={img.dtype}")
102
+ assert img.shape[2] == 3, f"Expected RGB image, got shape {img.shape}"
103
+ assert img.dtype == np.uint8, f"Expected uint8, got {img.dtype}"
104
+
105
+ # Check states
106
+ for key in ['query_state', 'retrieved_0_state']:
107
+ if key in sample:
108
+ state = sample[key]
109
+ print(f" {key}: shape={state.shape}")
110
+
111
+ # Check actions
112
+ for key in ['query_actions', 'retrieved_0_actions']:
113
+ if key in sample:
114
+ actions = sample[key]
115
+ print(f" {key}: shape={actions.shape}")
116
+ assert actions.shape[1] == 7, f"Expected 7-dim actions, got {actions.shape}"
117
+
118
+ return True
119
+
120
+ except Exception as e:
121
+ print(f"✗ Failed to load sample: {e}")
122
+ import traceback
123
+ traceback.print_exc()
124
+ return False
125
+
126
+
127
+ def test_batch_loading(dataset):
128
+ """Test loading a batch."""
129
+ print("\n" + "="*60)
130
+ print("TEST 4: Batch Loading")
131
+ print("="*60)
132
+
133
+ if dataset is None:
134
+ print("✗ Skipping (dataset not loaded)")
135
+ return False
136
+
137
+ try:
138
+ batch_size = 4
139
+ batch = [dataset[i] for i in range(min(batch_size, len(dataset)))]
140
+
141
+ print(f"✓ Loaded batch of {len(batch)} samples")
142
+
143
+ # Check consistency
144
+ keys = set(batch[0].keys())
145
+ for i, sample in enumerate(batch[1:], 1):
146
+ assert set(sample.keys()) == keys, f"Sample {i} has different keys"
147
+
148
+ print(f" All samples have consistent keys: {len(keys)} keys")
149
+ return True
150
+
151
+ except Exception as e:
152
+ print(f"✗ Failed to load batch: {e}")
153
+ import traceback
154
+ traceback.print_exc()
155
+ return False
156
+
157
+
158
+ def main():
159
+ print("\n" + "#"*60)
160
+ print("# RICL LIBERO Data Pipeline Test")
161
+ print("#"*60)
162
+
163
+ results = {}
164
+
165
+ # Run tests
166
+ results['video_loading'] = test_video_loading()
167
+ results['dataset_loading'] = test_dataset_loading()
168
+
169
+ # Get dataset for subsequent tests
170
+ if results['dataset_loading']:
171
+ from openpi.data.ricl_libero_dataset import RiclLiberoDataset
172
+ dataset = RiclLiberoDataset(
173
+ data_dir="/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/merged_libero_mask_depth_noops_lerobot_10",
174
+ context_dir="rag/ricl_training_context_libero_10_test",
175
+ action_horizon=15,
176
+ lambda_decay=10.0,
177
+ num_retrieved_observations=1,
178
+ )
179
+ else:
180
+ dataset = None
181
+
182
+ results['sample_loading'] = test_sample_loading(dataset)
183
+ results['batch_loading'] = test_batch_loading(dataset)
184
+
185
+ # Print summary
186
+ print("\n" + "="*60)
187
+ print("TEST SUMMARY")
188
+ print("="*60)
189
+
190
+ for test_name, passed in results.items():
191
+ status = "✓ PASS" if passed else "✗ FAIL"
192
+ print(f" {test_name:20s}: {status}")
193
+
194
+ all_passed = all(results.values())
195
+ print()
196
+ if all_passed:
197
+ print("🎉 ALL TESTS PASSED!")
198
+ else:
199
+ print("❌ SOME TESTS FAILED")
200
+
201
+ print("="*60)
202
+ return 0 if all_passed else 1
203
+
204
+
205
+ if __name__ == "__main__":
206
+ sys.exit(main())
scripts/train.py ADDED
@@ -0,0 +1,273 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import dataclasses
2
+ import functools
3
+ import logging
4
+ import platform
5
+ from typing import Any
6
+
7
+ import etils.epath as epath
8
+ import flax.nnx as nnx
9
+ from flax.training import common_utils
10
+ import flax.traverse_util as traverse_util
11
+ import jax
12
+ import jax.experimental
13
+ import jax.numpy as jnp
14
+ import optax
15
+ import tqdm_loggable.auto as tqdm
16
+ import wandb
17
+
18
+ import openpi.models.model as _model
19
+ import openpi.shared.array_typing as at
20
+ import openpi.shared.nnx_utils as nnx_utils
21
+ import openpi.training.checkpoints as _checkpoints
22
+ import openpi.training.config as _config
23
+ import openpi.training.data_loader as _data_loader
24
+ import openpi.training.optimizer as _optimizer
25
+ import openpi.training.sharding as sharding
26
+ import openpi.training.utils as training_utils
27
+ import openpi.training.weight_loaders as _weight_loaders
28
+
29
+
30
+ def init_logging():
31
+ """Custom logging format for better readability."""
32
+ level_mapping = {"DEBUG": "D", "INFO": "I", "WARNING": "W", "ERROR": "E", "CRITICAL": "C"}
33
+
34
+ class CustomFormatter(logging.Formatter):
35
+ def format(self, record):
36
+ record.levelname = level_mapping.get(record.levelname, record.levelname)
37
+ return super().format(record)
38
+
39
+ formatter = CustomFormatter(
40
+ fmt="%(asctime)s.%(msecs)03d [%(levelname)s] %(message)-80s (%(process)d:%(filename)s:%(lineno)s)",
41
+ datefmt="%H:%M:%S",
42
+ )
43
+
44
+ logger = logging.getLogger()
45
+ logger.setLevel(logging.INFO)
46
+ logger.handlers[0].setFormatter(formatter)
47
+
48
+
49
+ def init_wandb(config: _config.TrainConfig, *, resuming: bool, log_code: bool = False, enabled: bool = True):
50
+ if not enabled:
51
+ wandb.init(mode="disabled")
52
+ return
53
+
54
+ ckpt_dir = config.checkpoint_dir
55
+ if not ckpt_dir.exists():
56
+ raise FileNotFoundError(f"Checkpoint directory {ckpt_dir} does not exist.")
57
+ if resuming:
58
+ run_id = (ckpt_dir / "wandb_id.txt").read_text().strip()
59
+ wandb.init(id=run_id, resume="must", project=config.project_name)
60
+ else:
61
+ wandb.init(
62
+ name=config.exp_name,
63
+ config=dataclasses.asdict(config),
64
+ project=config.project_name,
65
+ )
66
+ (ckpt_dir / "wandb_id.txt").write_text(wandb.run.id)
67
+
68
+ if log_code:
69
+ wandb.run.log_code(epath.Path(__file__).parent.parent)
70
+
71
+
72
+ def _load_weights_and_validate(loader: _weight_loaders.WeightLoader, params_shape: at.Params) -> at.Params:
73
+ """Loads and validates the weights. Returns a loaded subset of the weights."""
74
+ loaded_params = loader.load(params_shape)
75
+ at.check_pytree_equality(expected=params_shape, got=loaded_params, check_shapes=True, check_dtypes=True)
76
+
77
+ # Remove jax.ShapeDtypeStruct from the loaded params. This makes sure that only the loaded params are returned.
78
+ return traverse_util.unflatten_dict(
79
+ {k: v for k, v in traverse_util.flatten_dict(loaded_params).items() if not isinstance(v, jax.ShapeDtypeStruct)}
80
+ )
81
+
82
+
83
+ @at.typecheck
84
+ def init_train_state(
85
+ config: _config.TrainConfig, init_rng: at.KeyArrayLike, mesh: jax.sharding.Mesh, *, resume: bool
86
+ ) -> tuple[training_utils.TrainState, Any]:
87
+ tx = _optimizer.create_optimizer(config.optimizer, config.lr_schedule, weight_decay_mask=None)
88
+
89
+ def init(rng: at.KeyArrayLike, partial_params: at.Params | None = None) -> training_utils.TrainState:
90
+ rng, model_rng = jax.random.split(rng)
91
+ # initialize the model (and its parameters).
92
+ model = config.model.create(model_rng)
93
+
94
+ # Merge the partial params into the model.
95
+ if partial_params is not None:
96
+ graphdef, state = nnx.split(model)
97
+ # This will produce an error if the partial params are not a subset of the state.
98
+ state.replace_by_pure_dict(partial_params)
99
+ model = nnx.merge(graphdef, state)
100
+
101
+ params = nnx.state(model)
102
+ # Convert frozen params to bfloat16.
103
+ params = nnx_utils.state_map(params, config.freeze_filter, lambda p: p.replace(p.value.astype(jnp.bfloat16)))
104
+
105
+ return training_utils.TrainState(
106
+ step=0,
107
+ params=params,
108
+ model_def=nnx.graphdef(model),
109
+ tx=tx,
110
+ opt_state=tx.init(params.filter(config.trainable_filter)),
111
+ ema_decay=config.ema_decay,
112
+ ema_params=None if config.ema_decay is None else params,
113
+ )
114
+
115
+ train_state_shape = jax.eval_shape(init, init_rng)
116
+ state_sharding = sharding.fsdp_sharding(train_state_shape, mesh, log=True)
117
+
118
+ if resume:
119
+ return train_state_shape, state_sharding
120
+
121
+ partial_params = _load_weights_and_validate(config.weight_loader, train_state_shape.params.to_pure_dict())
122
+ replicated_sharding = jax.sharding.NamedSharding(mesh, jax.sharding.PartitionSpec())
123
+
124
+ # Initialize the train state and mix in the partial params.
125
+ train_state = jax.jit(
126
+ init,
127
+ donate_argnums=(1,), # donate the partial params buffer.
128
+ in_shardings=replicated_sharding,
129
+ out_shardings=state_sharding,
130
+ )(init_rng, partial_params)
131
+
132
+ return train_state, state_sharding
133
+
134
+
135
+ @at.typecheck
136
+ def train_step(
137
+ config: _config.TrainConfig,
138
+ rng: at.KeyArrayLike,
139
+ state: training_utils.TrainState,
140
+ batch: tuple[_model.Observation, _model.Actions],
141
+ ) -> tuple[training_utils.TrainState, dict[str, at.Array]]:
142
+ model = nnx.merge(state.model_def, state.params)
143
+ model.train()
144
+
145
+ @at.typecheck
146
+ def loss_fn(
147
+ model: _model.BaseModel, rng: at.KeyArrayLike, observation: _model.Observation, actions: _model.Actions
148
+ ):
149
+ chunked_loss = model.compute_loss(rng, observation, actions, train=True)
150
+ return jnp.mean(chunked_loss)
151
+
152
+ train_rng = jax.random.fold_in(rng, state.step)
153
+ observation, actions = batch
154
+
155
+ # Filter out frozen params.
156
+ diff_state = nnx.DiffState(0, config.trainable_filter)
157
+ loss, grads = nnx.value_and_grad(loss_fn, argnums=diff_state)(model, train_rng, observation, actions)
158
+
159
+ params = state.params.filter(config.trainable_filter)
160
+ updates, new_opt_state = state.tx.update(grads, state.opt_state, params)
161
+ new_params = optax.apply_updates(params, updates)
162
+
163
+ # Update the model in place and return the new full state.
164
+ nnx.update(model, new_params)
165
+ new_params = nnx.state(model)
166
+
167
+ new_state = dataclasses.replace(state, step=state.step + 1, params=new_params, opt_state=new_opt_state)
168
+ if state.ema_decay is not None:
169
+ new_state = dataclasses.replace(
170
+ new_state,
171
+ ema_params=jax.tree.map(
172
+ lambda old, new: state.ema_decay * old + (1 - state.ema_decay) * new, state.ema_params, new_params
173
+ ),
174
+ )
175
+
176
+ # Filter out params that aren't kernels.
177
+ kernel_params = nnx.state(
178
+ model,
179
+ nnx.All(
180
+ nnx.Param,
181
+ nnx.Not(nnx_utils.PathRegex(".*/(bias|scale|pos_embedding|input_embedding)")),
182
+ lambda _, x: x.value.ndim > 1,
183
+ ),
184
+ )
185
+ info = {
186
+ "loss": loss,
187
+ "grad_norm": optax.global_norm(grads),
188
+ "param_norm": optax.global_norm(kernel_params),
189
+ }
190
+ return new_state, info
191
+
192
+
193
+ def main(config: _config.TrainConfig):
194
+ init_logging()
195
+ logging.info(f"Running on: {platform.node()}")
196
+
197
+ if config.batch_size % jax.device_count() != 0:
198
+ raise ValueError(
199
+ f"Batch size {config.batch_size} must be divisible by the number of devices {jax.device_count()}."
200
+ )
201
+
202
+ jax.config.update("jax_compilation_cache_dir", str(epath.Path("~/.cache/jax").expanduser()))
203
+
204
+ rng = jax.random.key(config.seed)
205
+ train_rng, init_rng = jax.random.split(rng)
206
+
207
+ mesh = sharding.make_mesh(config.fsdp_devices)
208
+ data_sharding = jax.sharding.NamedSharding(mesh, jax.sharding.PartitionSpec(sharding.DATA_AXIS))
209
+ replicated_sharding = jax.sharding.NamedSharding(mesh, jax.sharding.PartitionSpec())
210
+
211
+ checkpoint_manager, resuming = _checkpoints.initialize_checkpoint_dir(
212
+ config.checkpoint_dir,
213
+ keep_period=config.keep_period,
214
+ overwrite=config.overwrite,
215
+ resume=config.resume,
216
+ )
217
+ init_wandb(config, resuming=resuming, enabled=config.wandb_enabled)
218
+
219
+ data_loader = _data_loader.create_data_loader(
220
+ config,
221
+ sharding=data_sharding,
222
+ num_workers=config.num_workers,
223
+ shuffle=True,
224
+ )
225
+ data_iter = iter(data_loader)
226
+ batch = next(data_iter)
227
+ logging.info(f"Initialized data loader:\n{training_utils.array_tree_to_info(batch)}")
228
+
229
+ train_state, train_state_sharding = init_train_state(config, init_rng, mesh, resume=resuming)
230
+ jax.block_until_ready(train_state)
231
+ logging.info(f"Initialized train state:\n{training_utils.array_tree_to_info(train_state.params)}")
232
+
233
+ if resuming:
234
+ train_state = _checkpoints.restore_state(checkpoint_manager, train_state, data_loader)
235
+
236
+ ptrain_step = jax.jit(
237
+ functools.partial(train_step, config),
238
+ in_shardings=(replicated_sharding, train_state_sharding, data_sharding),
239
+ out_shardings=(train_state_sharding, replicated_sharding),
240
+ donate_argnums=(1,),
241
+ )
242
+
243
+ start_step = int(train_state.step)
244
+ pbar = tqdm.tqdm(
245
+ range(start_step, config.num_train_steps),
246
+ initial=start_step,
247
+ total=config.num_train_steps,
248
+ dynamic_ncols=True,
249
+ )
250
+
251
+ infos = []
252
+ for step in pbar:
253
+ with sharding.set_mesh(mesh):
254
+ train_state, info = ptrain_step(train_rng, train_state, batch)
255
+ infos.append(info)
256
+ if step % config.log_interval == 0:
257
+ stacked_infos = common_utils.stack_forest(infos)
258
+ reduced_info = jax.device_get(jax.tree.map(jnp.mean, stacked_infos))
259
+ info_str = ", ".join(f"{k}={v:.4f}" for k, v in reduced_info.items())
260
+ pbar.write(f"Step {step}: {info_str}")
261
+ wandb.log(reduced_info, step=step)
262
+ infos = []
263
+ batch = next(data_iter)
264
+
265
+ if (step % config.save_interval == 0 and step > start_step) or step == config.num_train_steps - 1:
266
+ _checkpoints.save_state(checkpoint_manager, train_state, data_loader, step)
267
+
268
+ logging.info("Waiting for checkpoint manager to finish")
269
+ checkpoint_manager.wait_until_finished()
270
+
271
+
272
+ if __name__ == "__main__":
273
+ main(_config.cli())
scripts/train_debug_interactive.sh ADDED
@@ -0,0 +1,48 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+
3
+ # Interactive debug training (no SLURM - runs directly on allocated node)
4
+
5
+ cd /projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/ricl_openpi
6
+
7
+ export PYTHONPATH="/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/ricl_openpi/src:$PYTHONPATH"
8
+ export HF_HOME="/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/hf_cache"
9
+
10
+ # Memory optimization for JAX/XLA
11
+ export XLA_PYTHON_CLIENT_PREALLOCATE=false
12
+
13
+ echo "=========================================="
14
+ echo "RICL Interactive Debug Training"
15
+ echo "=========================================="
16
+ echo "Config:"
17
+ echo " Steps: 500 (quick test)"
18
+ echo " Batch: 2 (reduced to fit single GPU memory)"
19
+ echo " Action Horizon: 15"
20
+ echo " Lambda: 10.0"
21
+ echo "=========================================="
22
+
23
+ python scripts/train_pi0_fast_ricl.py \
24
+ pi0_fast_ricl_libero \
25
+ --exp-name="ricl_libero_debug_interactive" \
26
+ --project-name="ricl_openpi" \
27
+ --libero-data-dir="/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/merged_libero_mask_depth_noops_lerobot_10" \
28
+ --libero-context-dir="rag/ricl_training_context_libero_10_test" \
29
+ --model.lamda=10.0 \
30
+ --model.use-action-interpolation \
31
+ --model.num-retrieved-observations=1 \
32
+ --model.action-horizon=15 \
33
+ --model.action-dim=7 \
34
+ --model.max-token-len=250 \
35
+ --batch-size=2 \
36
+ --num-train-steps=500 \
37
+ --save-interval=500 \
38
+ --log-interval=10 \
39
+ --lr-schedule.peak-lr=1e-4 \
40
+ --seed=42 \
41
+ --no-wandb-enabled \
42
+ --overwrite \
43
+ --no-resume
44
+
45
+ echo ""
46
+ echo "=========================================="
47
+ echo "Debug Training Complete!"
48
+ echo "=========================================="
scripts/train_pi0_fast_baseline_libero.slurm ADDED
@@ -0,0 +1,85 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ #SBATCH --job-name=pi0fast_baseline_libero
3
+ #SBATCH --output=logs/pi0fast_baseline_libero_h100.out
4
+ #SBATCH --error=logs/pi0fast_baseline_libero_h100.err
5
+ #SBATCH --nodes=1
6
+ #SBATCH --ntasks=1
7
+ #SBATCH --gres=gpu:4
8
+ #SBATCH --cpus-per-task=32
9
+ #SBATCH --time=48:00:00
10
+ #SBATCH --mem=400G
11
+ #SBATCH --partition=kisski
12
+
13
+ # ==========================================
14
+ # Baseline Pi0-FAST Training for LIBERO
15
+ # Using VLA-Humanoid Codebase (LeRobot)
16
+ # ==========================================
17
+
18
+ # Activate Environment
19
+ source /projects/extern/kisski/kisski-spath/dir.project/VLA_3D/miniconda3/etc/profile.d/conda.sh
20
+ conda activate pitorch_doanh
21
+
22
+ # Environment Variables
23
+ export PROJECT_DIR="/projects/extern/kisski/kisski-spath/dir.project"
24
+ export PYTHONPATH="$PROJECT_DIR/VLA_Groot/in_context_learning/VLA-Humanoid:$PYTHONPATH"
25
+ export HF_HOME="$PROJECT_DIR/VLA_Groot/hf_cache"
26
+
27
+ # Paths
28
+ VLA_HUMANOID_DIR="$PROJECT_DIR/VLA_Groot/in_context_learning/VLA-Humanoid"
29
+ DATA_DIR="$PROJECT_DIR/VLA_Groot/merged_libero_mask_depth_noops_lerobot_10"
30
+ POLICY_CONFIG_SOURCE="$VLA_HUMANOID_DIR/configs/policy_config/pi0fast_baseline.json"
31
+ LIBERO_CONFIG_PATH="$VLA_HUMANOID_DIR/configs/libero_config/default.json"
32
+
33
+ EXP_NAME="pi0fast_baseline_libero_pretrained_fix"
34
+ # Output directory
35
+ OUTPUT_DIR="$VLA_HUMANOID_DIR/outputs/train/$(date +%Y-%m-%d)/$(date +%H-%M-%S)_$EXP_NAME"
36
+ # Temp directory for initializing config (must separate from output to avoid FileExistsError)
37
+ TEMP_CONFIG_DIR="$VLA_HUMANOID_DIR/temp/configs/$EXP_NAME"
38
+
39
+ echo "==========================================="
40
+ echo "Experiment: $EXP_NAME"
41
+ echo "Codebase: $VLA_HUMANOID_DIR"
42
+ echo "Data: $DATA_DIR"
43
+ echo "Policy Config Source: $POLICY_CONFIG_SOURCE"
44
+ echo "Temp Config Dir: $TEMP_CONFIG_DIR"
45
+ echo "Output Dir: $OUTPUT_DIR"
46
+ echo "==========================================="
47
+
48
+ # Move to codebase directory
49
+ cd $VLA_HUMANOID_DIR
50
+
51
+ # 1. Run Verification Script (CRITICAL: Fail if setup is wrong)
52
+ echo "==========================================="
53
+ echo "Running verification script..."
54
+ echo "==========================================="
55
+ python scripts/verify_training_setup.py
56
+ if [ $? -ne 0 ]; then
57
+ echo "❌ ERROR: Verification failed! Aborting training."
58
+ exit 1
59
+ fi
60
+ echo "✓ Verification passed. Proceeding to training..."
61
+
62
+ # 2. Setup Temp Config Directory (Source for initialization)
63
+ mkdir -p $TEMP_CONFIG_DIR
64
+ cp $POLICY_CONFIG_SOURCE $TEMP_CONFIG_DIR/config.json
65
+
66
+ # 3. Run Training
67
+ # Note: OUTPUT_DIR is created by the script, it should not exist beforehand if resume=False
68
+ export PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True
69
+ accelerate launch --num_processes=4 --main_process_port 29600 lerobot/scripts/train_accelerate.py \
70
+ --policy.type=pi0fast \
71
+ --dataset.root=$DATA_DIR \
72
+ --dataset.video_backend=pyav \
73
+ --output_dir=$OUTPUT_DIR \
74
+ --job_name=$EXP_NAME \
75
+ --config_path=$LIBERO_CONFIG_PATH \
76
+ --batch_size=4 \
77
+ --policy.gradient_accumulation_steps=4 \
78
+ --save_freq=5000 \
79
+ --log_freq=100 \
80
+ --wandb.enable=false
81
+
82
+ echo "==========================================="
83
+ echo "Training completed!"
84
+ echo "Outputs in: $OUTPUT_DIR"
85
+ echo "==========================================="
scripts/train_pi0_fast_ricl.py ADDED
@@ -0,0 +1,317 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import dataclasses
2
+ import functools
3
+ import logging
4
+ import platform
5
+ from typing import Any
6
+
7
+ import etils.epath as epath
8
+ import flax.nnx as nnx
9
+ from flax.training import common_utils
10
+ import flax.traverse_util as traverse_util
11
+ import jax
12
+ import jax.experimental
13
+ import jax.numpy as jnp
14
+ import optax
15
+ import tqdm_loggable.auto as tqdm
16
+ import wandb
17
+ from torch.utils.tensorboard import SummaryWriter
18
+
19
+ import openpi.models.model as _model
20
+ import openpi.shared.array_typing as at
21
+ import openpi.shared.nnx_utils as nnx_utils
22
+ import openpi.training.checkpoints as _checkpoints
23
+ import openpi.training.config as _config
24
+ import openpi.training.data_loader as _data_loader
25
+ import openpi.training.optimizer as _optimizer
26
+ import openpi.training.sharding as sharding
27
+ import openpi.training.utils as training_utils
28
+ import openpi.training.weight_loaders as _weight_loaders
29
+
30
+
31
+ def init_logging():
32
+ """Custom logging format for better readability."""
33
+ level_mapping = {"DEBUG": "D", "INFO": "I", "WARNING": "W", "ERROR": "E", "CRITICAL": "C"}
34
+
35
+ class CustomFormatter(logging.Formatter):
36
+ def format(self, record):
37
+ record.levelname = level_mapping.get(record.levelname, record.levelname)
38
+ return super().format(record)
39
+
40
+ formatter = CustomFormatter(
41
+ fmt="%(asctime)s.%(msecs)03d [%(levelname)s] %(message)-80s (%(process)d:%(filename)s:%(lineno)s)",
42
+ datefmt="%H:%M:%S",
43
+ )
44
+
45
+ logger = logging.getLogger()
46
+ logger.setLevel(logging.INFO)
47
+ logger.handlers[0].setFormatter(formatter)
48
+
49
+
50
+ def init_wandb(config: _config.TrainConfig, *, resuming: bool, log_code: bool = False, enabled: bool = True):
51
+ if not enabled:
52
+ wandb.init(mode="disabled")
53
+ return
54
+
55
+ ckpt_dir = config.checkpoint_dir
56
+ if not ckpt_dir.exists():
57
+ raise FileNotFoundError(f"Checkpoint directory {ckpt_dir} does not exist.")
58
+ if resuming:
59
+ run_id = (ckpt_dir / "wandb_id.txt").read_text().strip()
60
+ wandb.init(id=run_id, resume="must", project=config.project_name)
61
+ else:
62
+ wandb.init(
63
+ name=config.exp_name,
64
+ config=dataclasses.asdict(config),
65
+ project=config.project_name,
66
+ )
67
+ (ckpt_dir / "wandb_id.txt").write_text(wandb.run.id)
68
+
69
+ if log_code:
70
+ wandb.run.log_code(epath.Path(__file__).parent.parent)
71
+
72
+
73
+ def _load_weights_and_validate(loader: _weight_loaders.WeightLoader, params_shape: at.Params) -> at.Params:
74
+ """Loads and validates the weights. Returns a loaded subset of the weights."""
75
+ loaded_params = loader.load(params_shape)
76
+ at.check_pytree_equality(expected=params_shape, got=loaded_params, check_shapes=True, check_dtypes=True)
77
+
78
+ # Remove jax.ShapeDtypeStruct from the loaded params. This makes sure that only the loaded params are returned.
79
+ return traverse_util.unflatten_dict(
80
+ {k: v for k, v in traverse_util.flatten_dict(loaded_params).items() if not isinstance(v, jax.ShapeDtypeStruct)}
81
+ )
82
+
83
+
84
+ def count_parameters(params, trainable_filter):
85
+ """Counts total and trainable parameters."""
86
+ total_params = sum(p.size for p in jax.tree_util.tree_leaves(params))
87
+
88
+ trainable_params = sum(
89
+ p.size for p in jax.tree_util.tree_leaves(params.filter(trainable_filter))
90
+ )
91
+
92
+ return total_params, trainable_params
93
+
94
+
95
+ @at.typecheck
96
+ def init_train_state(
97
+ config: _config.TrainConfig, init_rng: at.KeyArrayLike, mesh: jax.sharding.Mesh, *, resume: bool
98
+ ) -> tuple[training_utils.TrainState, Any]:
99
+ tx = _optimizer.create_optimizer(config.optimizer, config.lr_schedule, weight_decay_mask=None)
100
+
101
+ def init(rng: at.KeyArrayLike, partial_params: at.Params | None = None) -> training_utils.TrainState:
102
+ rng, model_rng = jax.random.split(rng)
103
+ # initialize the model (and its parameters).
104
+ model = config.model.create(model_rng)
105
+
106
+ # Merge the partial params into the model.
107
+ if partial_params is not None:
108
+ graphdef, state = nnx.split(model)
109
+ # This will produce an error if the partial params are not a subset of the state.
110
+ state.replace_by_pure_dict(partial_params)
111
+ model = nnx.merge(graphdef, state)
112
+
113
+ params = nnx.state(model)
114
+ # Convert frozen params to bfloat16.
115
+ params = nnx_utils.state_map(params, config.freeze_filter, lambda p: p.replace(p.value.astype(jnp.bfloat16)))
116
+
117
+ # Count total and trainable parameters
118
+ total_params, trainable_params = count_parameters(params, config.trainable_filter)
119
+ print(f"Total Parameters: {total_params // 1e6}M")
120
+ print(f"Trainable Parameters: {trainable_params // 1e6}M")
121
+ print(f"Trainable Parameters %: {100 * trainable_params / total_params:.2f}%")
122
+
123
+ return training_utils.TrainState(
124
+ step=0,
125
+ params=params,
126
+ model_def=nnx.graphdef(model),
127
+ tx=tx,
128
+ opt_state=tx.init(params.filter(config.trainable_filter)),
129
+ ema_decay=config.ema_decay,
130
+ ema_params=None if config.ema_decay is None else params,
131
+ )
132
+
133
+ train_state_shape = jax.eval_shape(init, init_rng)
134
+ state_sharding = sharding.fsdp_sharding(train_state_shape, mesh, log=True)
135
+
136
+ if resume:
137
+ return train_state_shape, state_sharding
138
+
139
+ partial_params = _load_weights_and_validate(config.weight_loader, train_state_shape.params.to_pure_dict())
140
+ replicated_sharding = jax.sharding.NamedSharding(mesh, jax.sharding.PartitionSpec())
141
+
142
+ # Initialize the train state and mix in the partial params.
143
+ train_state = jax.jit(
144
+ init,
145
+ donate_argnums=(1,), # donate the partial params buffer.
146
+ in_shardings=replicated_sharding,
147
+ out_shardings=state_sharding,
148
+ )(init_rng, partial_params)
149
+
150
+ return train_state, state_sharding
151
+
152
+
153
+ def create_decode_indices(config: _config.TrainConfig) -> at.Int[at.Array, "decode_len"]:
154
+ # create the indices to decide which tokens to decode: i.e. only those belonging to each retrieved/query "prompt, state, action" prompt and not the images
155
+ image_token_len = 256*2 # number of image tokens times number of images
156
+ prompt_token_len = config.model.max_token_len # max token len for each retrieved/query "prompt, state, action" prompt
157
+ total_token_len = image_token_len + prompt_token_len
158
+ decode_indices = []
159
+ for i in range(config.model.num_retrieved_observations + 1):
160
+ decode_indices.extend(list(range(i * total_token_len + image_token_len + 1, (i+1) * total_token_len)))
161
+ decode_indices = jnp.asarray(decode_indices)
162
+ print(f'decode_indices shape: {decode_indices.shape}')
163
+ return decode_indices
164
+
165
+
166
+ # @at.typecheck
167
+ def train_step(
168
+ config: _config.TrainConfig,
169
+ rng: at.KeyArrayLike,
170
+ state: training_utils.TrainState,
171
+ batch: tuple[_model.RiclObservation, _model.Actions],
172
+ decode_indices: at.Int[at.Array, "decode_len"],
173
+ ) -> tuple[training_utils.TrainState, dict[str, at.Array]]:
174
+ model = nnx.merge(state.model_def, state.params)
175
+ model.train()
176
+
177
+ # @at.typecheck
178
+ def loss_fn(
179
+ model: _model.BaseModel, rng: at.KeyArrayLike, observation: _model.RiclObservation, actions: _model.Actions
180
+ ):
181
+ chunked_loss = model.compute_loss(rng, observation, actions, train=True, decode_indices=decode_indices)
182
+ return jnp.mean(chunked_loss)
183
+
184
+ train_rng = jax.random.fold_in(rng, state.step)
185
+ observation, actions = batch
186
+
187
+ # Filter out frozen params.
188
+ diff_state = nnx.DiffState(0, config.trainable_filter)
189
+ loss, grads = nnx.value_and_grad(loss_fn, argnums=diff_state)(model, train_rng, observation, actions)
190
+
191
+ params = state.params.filter(config.trainable_filter)
192
+ updates, new_opt_state = state.tx.update(grads, state.opt_state, params)
193
+ new_params = optax.apply_updates(params, updates)
194
+
195
+ # Update the model in place and return the new full state.
196
+ nnx.update(model, new_params)
197
+ new_params = nnx.state(model)
198
+
199
+ new_state = dataclasses.replace(state, step=state.step + 1, params=new_params, opt_state=new_opt_state)
200
+ if state.ema_decay is not None:
201
+ new_state = dataclasses.replace(
202
+ new_state,
203
+ ema_params=jax.tree.map(
204
+ lambda old, new: state.ema_decay * old + (1 - state.ema_decay) * new, state.ema_params, new_params
205
+ ),
206
+ )
207
+
208
+ # Filter out params that aren't kernels.
209
+ kernel_params = nnx.state(
210
+ model,
211
+ nnx.All(
212
+ nnx.Param,
213
+ nnx.Not(nnx_utils.PathRegex(".*/(bias|scale|pos_embedding|input_embedding)")),
214
+ lambda _, x: x.value.ndim > 1,
215
+ ),
216
+ )
217
+ info = {
218
+ "loss": loss,
219
+ "grad_norm": optax.global_norm(grads),
220
+ "param_norm": optax.global_norm(kernel_params),
221
+ }
222
+ return new_state, info
223
+
224
+
225
+ def main(config: _config.TrainConfig):
226
+ init_logging()
227
+ logging.info(f"Running on: {platform.node()}")
228
+
229
+ if config.batch_size % jax.device_count() != 0:
230
+ raise ValueError(
231
+ f"Batch size {config.batch_size} must be divisible by the number of devices {jax.device_count()}."
232
+ )
233
+
234
+ jax.config.update("jax_compilation_cache_dir", str(epath.Path("~/.cache/jax").expanduser()))
235
+
236
+ rng = jax.random.key(config.seed)
237
+ train_rng, init_rng = jax.random.split(rng)
238
+
239
+ mesh = sharding.make_mesh(config.fsdp_devices)
240
+ data_sharding = jax.sharding.NamedSharding(mesh, jax.sharding.PartitionSpec(sharding.DATA_AXIS))
241
+ replicated_sharding = jax.sharding.NamedSharding(mesh, jax.sharding.PartitionSpec())
242
+
243
+ checkpoint_manager, resuming = _checkpoints.initialize_checkpoint_dir(
244
+ config.checkpoint_dir,
245
+ keep_period=config.keep_period,
246
+ overwrite=config.overwrite,
247
+ resume=config.resume,
248
+ )
249
+ init_wandb(config, resuming=resuming, enabled=config.wandb_enabled)
250
+
251
+ writer = None
252
+ if not config.wandb_enabled:
253
+ log_dir = config.checkpoint_dir / "tensorboard"
254
+ logging.info(f"WandB disabled. Using TensorBoard logging to {log_dir}")
255
+ writer = SummaryWriter(log_dir=str(log_dir))
256
+
257
+ data_loader = _data_loader.create_data_loader(
258
+ config,
259
+ sharding=data_sharding,
260
+ num_workers=config.num_workers,
261
+ shuffle=True,
262
+ )
263
+ data_iter = iter(data_loader)
264
+ batch = next(data_iter)
265
+ logging.info(f"Initialized data loader:\n{training_utils.array_tree_to_info(batch)}")
266
+
267
+ train_state, train_state_sharding = init_train_state(config, init_rng, mesh, resume=resuming)
268
+ jax.block_until_ready(train_state)
269
+ logging.info(f"Initialized train state:\n{training_utils.array_tree_to_info(train_state.params)}")
270
+
271
+ if resuming:
272
+ train_state = _checkpoints.restore_state(checkpoint_manager, train_state, data_loader)
273
+
274
+ decode_indices = create_decode_indices(config)
275
+
276
+ ptrain_step = jax.jit(
277
+ functools.partial(train_step, config, decode_indices=decode_indices),
278
+ in_shardings=(replicated_sharding, train_state_sharding, data_sharding),
279
+ out_shardings=(train_state_sharding, replicated_sharding),
280
+ donate_argnums=(1,),
281
+ )
282
+
283
+ start_step = int(train_state.step)
284
+ pbar = tqdm.tqdm(
285
+ range(start_step, config.num_train_steps),
286
+ initial=start_step,
287
+ total=config.num_train_steps,
288
+ dynamic_ncols=True,
289
+ )
290
+
291
+ infos = []
292
+ for step in pbar:
293
+ with sharding.set_mesh(mesh):
294
+ train_state, info = ptrain_step(train_rng, train_state, batch)
295
+ infos.append(info)
296
+ if step % config.log_interval == 0:
297
+ stacked_infos = common_utils.stack_forest(infos)
298
+ reduced_info = jax.device_get(jax.tree.map(jnp.mean, stacked_infos))
299
+ info_str = ", ".join(f"{k}={v}" for k, v in reduced_info.items())
300
+ pbar.write(f"Step {step}: {info_str}")
301
+ if config.wandb_enabled:
302
+ wandb.log(reduced_info, step=step)
303
+ elif writer is not None:
304
+ for k, v in reduced_info.items():
305
+ writer.add_scalar(k, v, step)
306
+ infos = []
307
+ batch = next(data_iter)
308
+
309
+ if (step % config.save_interval == 0 and step > start_step) or step == config.num_train_steps - 1:
310
+ _checkpoints.save_state(checkpoint_manager, train_state, data_loader, step)
311
+
312
+ logging.info("Waiting for checkpoint manager to finish")
313
+ checkpoint_manager.wait_until_finished()
314
+
315
+
316
+ if __name__ == "__main__":
317
+ main(_config.cli())
scripts/train_pi0_fast_ricl_libero_80k.slurm ADDED
@@ -0,0 +1,69 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ #SBATCH --job-name=ricl_libero_80k
3
+ #SBATCH --output=logs/ricl_libero_80k_%j.out
4
+ #SBATCH --error=logs/ricl_libero_80k_%j.err
5
+ #SBATCH --nodes=1
6
+ #SBATCH --ntasks=1
7
+ #SBATCH --gres=gpu:4
8
+ #SBATCH --cpus-per-task=32
9
+ #SBATCH --time=48:00:00
10
+ #SBATCH --mem=400G
11
+ #SBATCH --partition=kisski
12
+
13
+ # Activate Conda environment
14
+ source /projects/extern/kisski/kisski-spath/dir.project/VLA_3D/miniconda3/etc/profile.d/conda.sh
15
+ conda activate pitorch_doanh
16
+
17
+ # Set PYTHONPATH to include the current directory
18
+ export PYTHONPATH=/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/ricl_openpi/src:$PYTHONPATH
19
+
20
+ # Workdir
21
+ cd /projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/ricl_openpi
22
+
23
+ # Create logs directory
24
+ mkdir -p logs/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/ricl_openpi/scripts/train_pi0_fast_ricl_libero_80k.slurm
25
+
26
+ # Configuration
27
+ EXP_NAME="ricl_libero_lambda10_80k_bs16"
28
+ PROJECT_NAME="ricl_libero_bs16"
29
+ LIBERO_DATA_DIR="/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/merged_libero_mask_depth_noops_lerobot_10"
30
+ LIBERO_CONTEXT_DIR="rag/ricl_training_context_libero_10_test/"
31
+
32
+ # Hyperparameters (Recommended Config)
33
+ LAMBDA=10.0
34
+ ACTION_HORIZON=15 # Reduced from 50 to match DROID (prevents token overflow)
35
+ NUM_RETRIEVED=1
36
+ ACTION_DIM=7
37
+ MAX_TOKEN_LEN=250
38
+
39
+ # Training parameters
40
+ BATCH_SIZE=16 # Global batch size (4 per GPU for 4 GPUs)
41
+ NUM_STEPS=80000
42
+ SAVE_INTERVAL=10000
43
+ LOG_INTERVAL=100
44
+
45
+ echo "Starting training with Experiment Name: ${EXP_NAME}"
46
+ echo "Data Dir: ${LIBERO_DATA_DIR}"
47
+ echo "Context Dir: ${LIBERO_CONTEXT_DIR}"
48
+
49
+ python scripts/train_pi0_fast_ricl.py pi0_fast_ricl_libero \
50
+ --exp-name="${EXP_NAME}" \
51
+ --project-name="${PROJECT_NAME}" \
52
+ --libero-data-dir="${LIBERO_DATA_DIR}" \
53
+ --libero-context-dir="${LIBERO_CONTEXT_DIR}" \
54
+ --model.lamda=${LAMBDA} \
55
+ --model.use-action-interpolation \
56
+ --model.num-retrieved-observations=${NUM_RETRIEVED} \
57
+ --model.action-horizon=${ACTION_HORIZON} \
58
+ --model.action-dim=${ACTION_DIM} \
59
+ --model.max-token-len=${MAX_TOKEN_LEN} \
60
+ --batch-size=${BATCH_SIZE} \
61
+ --num-train-steps=${NUM_STEPS} \
62
+ --save-interval=${SAVE_INTERVAL} \
63
+ --log-interval=${LOG_INTERVAL} \
64
+ --lr-schedule.peak-lr=1e-4 \
65
+ --seed=42 \
66
+ --no-wandb-enabled \
67
+ --overwrite \
68
+ --no-resume \
69
+ --fsdp_devices=4
scripts/train_pi0_fast_ricl_libero_80k_2nn.slurm ADDED
@@ -0,0 +1,70 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/bin/bash
2
+ #SBATCH --job-name=ricl_libero_2nn_80k
3
+ #SBATCH --output=logs/ricl_libero_2nn_80k_%j.out
4
+ #SBATCH --error=logs/ricl_libero_2nn_80k_%j.err
5
+ #SBATCH --mem=128G
6
+ #SBATCH --cpus-per-task=32
7
+ #SBATCH --partition=kisski
8
+ #SBATCH --time=48:00:00
9
+ #SBATCH --gres=gpu:4
10
+
11
+ # Environment setup
12
+ source /projects/extern/kisski/kisski-spath/dir.project/VLA_3D/miniconda3/etc/profile.d/conda.sh
13
+ conda activate pitorch_doanh
14
+
15
+ export PYTHONPATH=/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/ricl_openpi/src:$PYTHONPATH
16
+
17
+ # Create logs directory
18
+ mkdir -p logs/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/ricl_openpi/scripts/train_pi0_fast_ricl_libero_80k_2nn.slurm
19
+
20
+ # Configuration
21
+ EXP_NAME="ricl_libero_lambda10_80k_2nn_fsdp"
22
+ PROJECT_NAME="ricl_libero_2nn"
23
+ LIBERO_DATA_DIR="/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/merged_libero_mask_depth_noops_lerobot_10"
24
+ LIBERO_CONTEXT_DIR="rag/ricl_training_context_libero_10_test/"
25
+
26
+ # Model hyperparameters
27
+ LAMBDA=10.0
28
+ NUM_RETRIEVED=2 # Increased to 2 neighbors
29
+ ACTION_HORIZON=50
30
+ ACTION_DIM=7
31
+ MAX_TOKEN_LEN=250
32
+
33
+ # Training parameters
34
+ BATCH_SIZE=16 # Global batch size (4 per GPU for 4 GPUs)
35
+ NUM_STEPS=80000
36
+ SAVE_INTERVAL=10000
37
+ LOG_INTERVAL=100
38
+
39
+ echo "Starting training job: $SLURM_JOB_ID"
40
+ echo "Experiment: $EXP_NAME"
41
+ echo "Batch Size: $BATCH_SIZE"
42
+ echo "Num Retrieved: $NUM_RETRIEVED"
43
+
44
+ cd /projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/ricl_openpi
45
+
46
+ # Run training
47
+ # Note: FSDP is enabled to handle memory usage
48
+ python scripts/train_pi0_fast_ricl.py pi0_fast_ricl_libero \
49
+ --exp-name="$EXP_NAME" \
50
+ --project-name="$PROJECT_NAME" \
51
+ --libero-data-dir="$LIBERO_DATA_DIR" \
52
+ --libero-context-dir="$LIBERO_CONTEXT_DIR" \
53
+ --model.lamda=$LAMBDA \
54
+ --model.use-action-interpolation \
55
+ --model.num-retrieved-observations=$NUM_RETRIEVED \
56
+ --model.action-horizon=$ACTION_HORIZON \
57
+ --model.action-dim=$ACTION_DIM \
58
+ --model.max-token-len=$MAX_TOKEN_LEN \
59
+ --batch-size=$BATCH_SIZE \
60
+ --num-train-steps=$NUM_STEPS \
61
+ --save-interval=$SAVE_INTERVAL \
62
+ --log-interval=$LOG_INTERVAL \
63
+ --lr-schedule.peak-lr=1e-4 \
64
+ --seed=42 \
65
+ --no-wandb-enabled \
66
+ --overwrite \
67
+ --no-resume \
68
+ --fsdp_devices=4
69
+
70
+ echo "Training completed"
scripts/train_test.py ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import dataclasses
2
+ import os
3
+ import pathlib
4
+
5
+ import pytest
6
+
7
+ os.environ["JAX_PLATFORMS"] = "cpu"
8
+
9
+ from openpi.training import config as _config
10
+
11
+ from . import train
12
+
13
+
14
+ @pytest.mark.parametrize("config_name", ["debug"])
15
+ def test_train(tmp_path: pathlib.Path, config_name: str):
16
+ config = dataclasses.replace(
17
+ _config._CONFIGS_DICT[config_name], # noqa: SLF001
18
+ batch_size=2,
19
+ checkpoint_base_dir=tmp_path / "checkpoint",
20
+ exp_name="test",
21
+ overwrite=False,
22
+ resume=False,
23
+ num_train_steps=2,
24
+ log_interval=1,
25
+ )
26
+ train.main(config)
27
+
28
+ # test resuming
29
+ config = dataclasses.replace(config, resume=True, num_train_steps=4)
30
+ train.main(config)
scripts/verify_ricl_training_setup.py ADDED
@@ -0,0 +1,514 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env python3
2
+ """
3
+ RICL Training Verification Script
4
+ Run this BEFORE training to ensure everything is configured correctly.
5
+
6
+ Usage:
7
+ cd /projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/ricl_openpi
8
+ python scripts/verify_ricl_training_setup.py
9
+ """
10
+
11
+ import os
12
+ import sys
13
+ import json
14
+ import numpy as np
15
+ from pathlib import Path
16
+
17
+ # ============================================================
18
+ # CONFIGURATION
19
+ # ============================================================
20
+ WORK_DIR = "/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/in_context_learning/ricl_openpi"
21
+ DATA_DIR = "/projects/extern/kisski/kisski-spath/dir.project/VLA_Groot/merged_libero_mask_depth_noops_lerobot_10"
22
+ CONTEXT_DIR = os.path.join(WORK_DIR, "rag/ricl_training_context_libero_10_test")
23
+ CHECKPOINT_PATH = os.path.join(WORK_DIR, "pi0_fast_base_params")
24
+ ASSETS_DIR = os.path.join(WORK_DIR, "assets")
25
+
26
+ sys.path.insert(0, WORK_DIR)
27
+
28
+ passed = 0
29
+ failed = 0
30
+
31
+ def check_pass(msg):
32
+ global passed
33
+ passed += 1
34
+ print(f" ✓ {msg}")
35
+
36
+ def check_fail(msg):
37
+ global failed
38
+ failed += 1
39
+ print(f" ❌ {msg}")
40
+
41
+ # ============================================================
42
+ # CHECK 1: Verify all paths exist
43
+ # ============================================================
44
+ print("=" * 60)
45
+ print("CHECK 1: Verify all paths exist")
46
+ print("=" * 60)
47
+
48
+ paths_to_check = {
49
+ "WORK_DIR": WORK_DIR,
50
+ "DATA_DIR": DATA_DIR,
51
+ "CONTEXT_DIR": CONTEXT_DIR,
52
+ "CHECKPOINT_PATH (pi0_fast_base_params)": CHECKPOINT_PATH,
53
+ "ASSETS_DIR": ASSETS_DIR,
54
+ }
55
+
56
+ for name, path in paths_to_check.items():
57
+ if os.path.exists(path):
58
+ check_pass(f"{name}: {path}")
59
+ else:
60
+ check_fail(f"{name} MISSING: {path}")
61
+ print()
62
+
63
+ # ============================================================
64
+ # CHECK 2: Verify JAX/Orbax checkpoint structure
65
+ # ============================================================
66
+ print("=" * 60)
67
+ print("CHECK 2: Verify base model checkpoint (JAX/Orbax)")
68
+ print("=" * 60)
69
+
70
+ required_ckpt_files = ["_METADATA", "_sharding", "manifest.ocdbt"]
71
+ for f in required_ckpt_files:
72
+ fpath = os.path.join(CHECKPOINT_PATH, f)
73
+ if os.path.exists(fpath):
74
+ size = os.path.getsize(fpath)
75
+ check_pass(f"{f}: {size} bytes")
76
+ else:
77
+ check_fail(f"{f} MISSING")
78
+
79
+ ocdbt_dir = os.path.join(CHECKPOINT_PATH, "ocdbt.process_0")
80
+ if os.path.exists(ocdbt_dir):
81
+ num_files = len(os.listdir(ocdbt_dir))
82
+ check_pass(f"ocdbt.process_0/: {num_files} shard files")
83
+ else:
84
+ check_fail("ocdbt.process_0/ directory MISSING")
85
+ print()
86
+
87
+ # ============================================================
88
+ # CHECK 3: Verify RICL context directory
89
+ # ============================================================
90
+ print("=" * 60)
91
+ print("CHECK 3: Verify RICL retrieval context")
92
+ print("=" * 60)
93
+
94
+ required_context_files = {
95
+ "nn_indices.npy": "Nearest neighbor indices",
96
+ "nn_distances.npy": "Nearest neighbor distances",
97
+ "actions.npy": "Action chunks",
98
+ "states.npy": "State vectors",
99
+ "metadata.json": "Frame metadata",
100
+ "embeddings.npy": "Visual embeddings",
101
+ "index.faiss": "FAISS index",
102
+ }
103
+
104
+ for fname, desc in required_context_files.items():
105
+ fpath = os.path.join(CONTEXT_DIR, fname)
106
+ if os.path.exists(fpath):
107
+ size_mb = os.path.getsize(fpath) / 1e6
108
+ check_pass(f"{fname} ({desc}): {size_mb:.1f} MB")
109
+ else:
110
+ check_fail(f"{fname} ({desc}) MISSING")
111
+ print()
112
+
113
+ # ============================================================
114
+ # CHECK 4: Load and validate context data shapes
115
+ # ============================================================
116
+ print("=" * 60)
117
+ print("CHECK 4: Validate context data shapes and contents")
118
+ print("=" * 60)
119
+
120
+ try:
121
+ nn_indices = np.load(os.path.join(CONTEXT_DIR, "nn_indices.npy"))
122
+ nn_distances = np.load(os.path.join(CONTEXT_DIR, "nn_distances.npy"))
123
+ actions = np.load(os.path.join(CONTEXT_DIR, "actions.npy"))
124
+ states = np.load(os.path.join(CONTEXT_DIR, "states.npy"))
125
+
126
+ with open(os.path.join(CONTEXT_DIR, "metadata.json"), "r") as f:
127
+ metadata = json.load(f)
128
+
129
+ num_frames = len(metadata)
130
+ print(f" Total frames: {num_frames}")
131
+ print(f" nn_indices shape: {nn_indices.shape}")
132
+ print(f" nn_distances shape: {nn_distances.shape}")
133
+ print(f" actions shape: {actions.shape}")
134
+ print(f" states shape: {states.shape}")
135
+
136
+ # Validate shapes match
137
+ if nn_indices.shape[0] == num_frames:
138
+ check_pass(f"nn_indices rows ({nn_indices.shape[0]}) match metadata ({num_frames})")
139
+ else:
140
+ check_fail(f"nn_indices rows ({nn_indices.shape[0]}) != metadata ({num_frames})")
141
+
142
+ if nn_distances.shape[0] == num_frames:
143
+ check_pass(f"nn_distances rows ({nn_distances.shape[0]}) match metadata ({num_frames})")
144
+ else:
145
+ check_fail(f"nn_distances rows ({nn_distances.shape[0]}) != metadata ({num_frames})")
146
+
147
+ if actions.shape[0] == num_frames:
148
+ check_pass(f"actions rows ({actions.shape[0]}) match metadata ({num_frames})")
149
+ else:
150
+ check_fail(f"actions rows ({actions.shape[0]}) != metadata ({num_frames})")
151
+
152
+ # Check action dimensions
153
+ action_dim = actions.shape[-1] if len(actions.shape) > 1 else 0
154
+ print(f" Action dimension: {action_dim}")
155
+ if action_dim == 7:
156
+ check_pass(f"Action dimension is 7 (LIBERO standard)")
157
+ else:
158
+ check_fail(f"Action dimension is {action_dim}, expected 7")
159
+
160
+ # Action horizon
161
+ if len(actions.shape) == 3:
162
+ action_horizon = actions.shape[1]
163
+ print(f" Action horizon: {action_horizon}")
164
+
165
+ # Check nn_indices are valid (no out-of-range)
166
+ max_idx = nn_indices.max()
167
+ if max_idx < num_frames:
168
+ check_pass(f"nn_indices max ({max_idx}) < num_frames ({num_frames})")
169
+ else:
170
+ check_fail(f"nn_indices max ({max_idx}) >= num_frames ({num_frames}) - OUT OF RANGE!")
171
+
172
+ # Check no self-retrieval (query != demo)
173
+ if nn_indices.shape[1] >= 1:
174
+ self_retrieval_count = np.sum(nn_indices[:, 0] == np.arange(num_frames))
175
+ self_pct = 100 * self_retrieval_count / num_frames
176
+ if self_pct < 5:
177
+ check_pass(f"Self-retrieval rate: {self_pct:.1f}% (low, good)")
178
+ else:
179
+ check_fail(f"Self-retrieval rate: {self_pct:.1f}% (HIGH - might be a bug!)")
180
+
181
+ # Distance statistics
182
+ top1_dist = nn_distances[:, 0]
183
+ print(f"\n Top-1 distance statistics:")
184
+ print(f" Min: {top1_dist.min():.4f}")
185
+ print(f" Max: {top1_dist.max():.4f}")
186
+ print(f" Mean: {top1_dist.mean():.4f}")
187
+ print(f" Median: {np.median(top1_dist):.4f}")
188
+ print(f" Std: {top1_dist.std():.4f}")
189
+
190
+ if top1_dist.mean() > 0:
191
+ check_pass(f"Distances are non-zero (mean={top1_dist.mean():.4f})")
192
+ else:
193
+ check_fail(f"Distances are all zero - retrieval might be broken!")
194
+
195
+ except Exception as e:
196
+ check_fail(f"Error loading context: {e}")
197
+ import traceback
198
+ traceback.print_exc()
199
+
200
+ print()
201
+
202
+ # ============================================================
203
+ # CHECK 5: Verify dataset structure
204
+ # ============================================================
205
+ print("=" * 60)
206
+ print("CHECK 5: Verify dataset structure")
207
+ print("=" * 60)
208
+
209
+ meta_path = os.path.join(DATA_DIR, "meta")
210
+ if os.path.exists(meta_path):
211
+ info_path = os.path.join(meta_path, "info.json")
212
+ if os.path.exists(info_path):
213
+ with open(info_path, "r") as f:
214
+ info = json.load(f)
215
+ check_pass(f"Dataset info found")
216
+ print(f" Total episodes: {info.get('total_episodes', 'N/A')}")
217
+ print(f" Total frames: {info.get('total_frames', 'N/A')}")
218
+
219
+ features = info.get("features", {})
220
+ image_keys = [k for k in features if "image" in k.lower() and "mask" not in k.lower() and "depth" not in k.lower()]
221
+ print(f" RGB image keys: {image_keys}")
222
+
223
+ # Check video files exist
224
+ video_dir = os.path.join(DATA_DIR, "videos", "chunk-000")
225
+ if os.path.exists(video_dir):
226
+ check_pass(f"Video directory exists: {video_dir}")
227
+ for img_key in ["observation.images.image", "observation.images.wrist_image"]:
228
+ key_dir = os.path.join(video_dir, img_key)
229
+ if os.path.exists(key_dir):
230
+ num_vids = len([f for f in os.listdir(key_dir) if f.endswith(".mp4")])
231
+ check_pass(f"{img_key}: {num_vids} video files")
232
+ else:
233
+ check_fail(f"{img_key} video directory MISSING")
234
+ else:
235
+ check_fail(f"Video directory MISSING: {video_dir}")
236
+ else:
237
+ check_fail(f"info.json MISSING")
238
+ else:
239
+ check_fail(f"meta directory MISSING")
240
+
241
+ # Check tasks.jsonl
242
+ tasks_file = os.path.join(DATA_DIR, "meta", "tasks.jsonl")
243
+ if os.path.exists(tasks_file):
244
+ task_count = 0
245
+ with open(tasks_file, "r") as f:
246
+ for line in f:
247
+ task_count += 1
248
+ check_pass(f"tasks.jsonl: {task_count} tasks")
249
+ else:
250
+ check_fail(f"tasks.jsonl MISSING")
251
+
252
+ print()
253
+
254
+ # ============================================================
255
+ # CHECK 6: Retrieval quality debug (sample pairs)
256
+ # ============================================================
257
+ print("=" * 60)
258
+ print("CHECK 6: Retrieval quality debug (sample pairs)")
259
+ print("=" * 60)
260
+
261
+ try:
262
+ import random
263
+ random.seed(42)
264
+
265
+ # Load task mapping
266
+ task_mapping = {}
267
+ with open(os.path.join(DATA_DIR, "meta", "tasks.jsonl"), "r") as f:
268
+ for line in f:
269
+ item = json.loads(line)
270
+ if "task_index" in item and "task" in item:
271
+ task_mapping[item["task_index"]] = item["task"]
272
+
273
+ # Load parquet for task indices
274
+ import pandas as pd
275
+ parquet_files = sorted(list(Path(DATA_DIR, "data").rglob("*.parquet")))
276
+ dfs = [pd.read_parquet(f) for f in parquet_files[:5]] # Load a subset for speed
277
+ df = pd.concat(dfs, ignore_index=True)
278
+
279
+ # Sample and display pairs
280
+ num_samples = 5
281
+ sample_indices = random.sample(range(min(len(metadata), len(df))), min(num_samples, len(metadata), len(df)))
282
+
283
+ same_task_count = 0
284
+ for i, query_idx in enumerate(sample_indices):
285
+ demo_idx = int(nn_indices[query_idx, 0])
286
+ distance = nn_distances[query_idx, 0]
287
+
288
+ query_meta = metadata[query_idx]
289
+ demo_meta = metadata[demo_idx]
290
+
291
+ # Get tasks
292
+ query_global = query_meta.get("global_frame_idx", query_idx)
293
+ demo_global = demo_meta.get("global_frame_idx", demo_idx)
294
+
295
+ query_task_idx = -1
296
+ demo_task_idx = -1
297
+ if query_global < len(df):
298
+ query_row = df.iloc[query_global]
299
+ query_task_idx = int(query_row.get("task_index", -1))
300
+ if demo_global < len(df):
301
+ demo_row = df.iloc[demo_global]
302
+ demo_task_idx = int(demo_row.get("task_index", -1))
303
+
304
+ query_task = task_mapping.get(query_task_idx, "Unknown")
305
+ demo_task = task_mapping.get(demo_task_idx, "Unknown")
306
+ same_task = query_task_idx == demo_task_idx
307
+ if same_task:
308
+ same_task_count += 1
309
+
310
+ # Action similarity
311
+ action_mse = np.mean((actions[query_idx] - actions[demo_idx]) ** 2)
312
+
313
+ print(f"\n Pair {i+1}/{num_samples}:")
314
+ print(f" Query: ep={query_meta.get('episode_idx', '?')}, frame={query_meta.get('frame_idx', '?')}")
315
+ print(f" Task: '{query_task[:70]}'")
316
+ print(f" Demo: ep={demo_meta.get('episode_idx', '?')}, frame={demo_meta.get('frame_idx', '?')}")
317
+ print(f" Task: '{demo_task[:70]}'")
318
+ print(f" Distance: {distance:.4f} | Action MSE: {action_mse:.4f} | Same task: {same_task}")
319
+
320
+ same_task_pct = 100 * same_task_count / num_samples
321
+ print(f"\n Same-task retrieval rate (in sample): {same_task_pct:.0f}%")
322
+ if same_task_pct >= 50:
323
+ check_pass(f"Same-task retrieval is reasonable ({same_task_pct:.0f}%)")
324
+ else:
325
+ print(f" ⚠ Low same-task retrieval - this could indicate cross-task retrieval (may be intended)")
326
+
327
+ except Exception as e:
328
+ check_fail(f"Error in retrieval debug: {e}")
329
+ import traceback
330
+ traceback.print_exc()
331
+
332
+ print()
333
+
334
+ # ============================================================
335
+ # CHECK 7: Verify RiclLiberoDataset can load
336
+ # ============================================================
337
+ print("=" * 60)
338
+ print("CHECK 7: Verify RiclLiberoDataset loads correctly")
339
+ print("=" * 60)
340
+
341
+ try:
342
+ from openpi.data.ricl_libero_dataset import RiclLiberoDataset
343
+
344
+ TARGET_ACTION_HORIZON = 10 # Must match pi0fast-LIBERO default
345
+
346
+ dataset = RiclLiberoDataset(
347
+ data_dir=DATA_DIR,
348
+ context_dir=CONTEXT_DIR,
349
+ action_horizon=TARGET_ACTION_HORIZON, # Truncate from precomputed 50 → 10
350
+ use_action_interpolation=True,
351
+ lambda_decay=10.0,
352
+ num_retrieved_observations=1,
353
+ )
354
+
355
+ check_pass(f"Dataset created successfully with {len(dataset)} samples")
356
+
357
+ # Try loading one sample
358
+ print(" Loading sample [0]...")
359
+ sample = dataset[0]
360
+ print(f" Sample keys: {sorted(sample.keys())}")
361
+
362
+ # Check expected keys (matching actual RiclLiberoDataset output format)
363
+ expected_keys = [
364
+ "query_observation.images.image",
365
+ "query_observation.images.wrist_image",
366
+ "query_observation.state",
367
+ "query_actions",
368
+ "query_prompt",
369
+ ]
370
+ for key in expected_keys:
371
+ if key in sample:
372
+ val = sample[key]
373
+ if isinstance(val, np.ndarray):
374
+ check_pass(f"{key}: shape={val.shape}, dtype={val.dtype}")
375
+ else:
376
+ check_pass(f"{key}: type={type(val).__name__}")
377
+ else:
378
+ check_fail(f"{key} MISSING from sample")
379
+
380
+ # Check demo keys
381
+ demo_keys = [k for k in sample.keys() if "retrieved" in k or "demo" in k]
382
+ print(f" Demo keys: {demo_keys}")
383
+ for key in demo_keys:
384
+ val = sample[key]
385
+ if isinstance(val, np.ndarray):
386
+ check_pass(f"{key}: shape={val.shape}, dtype={val.dtype}")
387
+ else:
388
+ check_pass(f"{key}: type={type(val).__name__}")
389
+
390
+ # Check interpolation weights
391
+ interp_keys = [k for k in sample.keys() if "lamda" in k or "lambda" in k or "interp" in k]
392
+ if interp_keys:
393
+ for key in interp_keys:
394
+ val = sample[key]
395
+ if isinstance(val, np.ndarray):
396
+ print(f" {key}: shape={val.shape}, range=[{val.min():.4f}, {val.max():.4f}]")
397
+ else:
398
+ print(f" {key}: {val}")
399
+ check_pass("Interpolation weights present")
400
+ else:
401
+ print(f" ⚠ No interpolation weight keys found (checked: lamda, lambda, interp)")
402
+
403
+ # ============================================================
404
+ # CHECK 7b: Verify action truncation (50 → 10)
405
+ # ============================================================
406
+ print()
407
+ print("=" * 60)
408
+ print(f"CHECK 7b: Verify action truncation (precomputed=50 → target={TARGET_ACTION_HORIZON})")
409
+ print("=" * 60)
410
+
411
+ # Precomputed actions shape
412
+ precomputed_horizon = actions.shape[1]
413
+ print(f" Precomputed context action_horizon: {precomputed_horizon}")
414
+ print(f" Target action_horizon: {TARGET_ACTION_HORIZON}")
415
+
416
+ # Check query_actions shape
417
+ query_actions = sample["query_actions"]
418
+ if query_actions.shape[0] == TARGET_ACTION_HORIZON:
419
+ check_pass(f"query_actions truncated correctly: shape={query_actions.shape} (horizon={TARGET_ACTION_HORIZON})")
420
+ else:
421
+ check_fail(f"query_actions NOT truncated: shape={query_actions.shape} (expected horizon={TARGET_ACTION_HORIZON})")
422
+
423
+ # Check demo actions shape
424
+ demo_actions = sample["retrieved_0_actions"]
425
+ if demo_actions.shape[0] == TARGET_ACTION_HORIZON:
426
+ check_pass(f"retrieved_0_actions truncated correctly: shape={demo_actions.shape} (horizon={TARGET_ACTION_HORIZON})")
427
+ else:
428
+ check_fail(f"retrieved_0_actions NOT truncated: shape={demo_actions.shape} (expected horizon={TARGET_ACTION_HORIZON})")
429
+
430
+ # Verify truncation preserves data (first 10 of 50 should match)
431
+ raw_demo_actions_full = actions[int(nn_indices[0, 0])] # Full 50-step from context
432
+ raw_demo_truncated = raw_demo_actions_full[:TARGET_ACTION_HORIZON]
433
+ if np.allclose(demo_actions, raw_demo_truncated, atol=1e-5):
434
+ check_pass(f"Truncated demo actions match first {TARGET_ACTION_HORIZON} steps of precomputed context")
435
+ else:
436
+ check_fail(f"Truncated demo actions DO NOT match precomputed context first {TARGET_ACTION_HORIZON} steps!")
437
+
438
+ # Verify multiple samples to ensure consistency
439
+ num_verify = 5
440
+ all_correct = True
441
+ for vi in range(1, min(num_verify + 1, len(dataset))):
442
+ s = dataset[vi]
443
+ if s["query_actions"].shape[0] != TARGET_ACTION_HORIZON:
444
+ all_correct = False
445
+ break
446
+ if s["retrieved_0_actions"].shape[0] != TARGET_ACTION_HORIZON:
447
+ all_correct = False
448
+ break
449
+ if all_correct:
450
+ check_pass(f"Truncation verified across {num_verify} additional samples")
451
+ else:
452
+ check_fail(f"Truncation inconsistent across samples!")
453
+
454
+ except Exception as e:
455
+ check_fail(f"Error loading dataset: {e}")
456
+ import traceback
457
+ traceback.print_exc()
458
+
459
+ print()
460
+
461
+ # ============================================================
462
+ # CHECK 8: Verify config resolution
463
+ # ============================================================
464
+ print("=" * 60)
465
+ print("CHECK 8: Verify training config resolution")
466
+ print("=" * 60)
467
+
468
+ try:
469
+ import etils.epath as epath
470
+
471
+ # Check PI0_FAST_BASE_CHECKPOINT resolution
472
+ local_ckpt = epath.Path("pi0_fast_base_params")
473
+ if local_ckpt.exists():
474
+ check_pass(f"PI0_FAST_BASE_CHECKPOINT resolves to LOCAL: pi0_fast_base_params")
475
+ else:
476
+ check_fail(f"pi0_fast_base_params NOT found locally - will try S3 (requires network!)")
477
+
478
+ # Check assets
479
+ assets_franka = os.path.join(WORK_DIR, "pi0_fast_base", "assets", "franka")
480
+ if os.path.exists(assets_franka):
481
+ check_pass(f"Assets dir (franka) exists")
482
+ else:
483
+ # Check alternative location
484
+ assets_alt = os.path.join(WORK_DIR, "assets")
485
+ if os.path.exists(assets_alt):
486
+ check_pass(f"Assets base dir exists: {assets_alt}")
487
+ else:
488
+ check_fail(f"No assets directory found")
489
+
490
+ except Exception as e:
491
+ check_fail(f"Config check error: {e}")
492
+
493
+ print()
494
+
495
+ # ============================================================
496
+ # SUMMARY
497
+ # ============================================================
498
+ print("=" * 60)
499
+ print("VERIFICATION COMPLETE")
500
+ print("=" * 60)
501
+ total = passed + failed
502
+ print(f"\n ✓ Passed: {passed}/{total}")
503
+ print(f" ❌ Failed: {failed}/{total}")
504
+
505
+ if failed == 0:
506
+ print("\n 🎉 ALL CHECKS PASSED! Ready to train.")
507
+ else:
508
+ print(f"\n ⚠ {failed} check(s) failed. Fix before training.")
509
+
510
+ print(f"""
511
+ To train RICL, submit:
512
+ cd {WORK_DIR}
513
+ sbatch slurm/train_ricl_libero.slurm
514
+ """)
src/openpi/__pycache__/__init__.cpython-313.pyc ADDED
Binary file (200 Bytes). View file
 
src/openpi/data/__pycache__/ricl_libero_dataset.cpython-310.pyc ADDED
Binary file (11.3 kB). View file
 
src/openpi/data/__pycache__/ricl_libero_dataset.cpython-313.pyc ADDED
Binary file (17.4 kB). View file
 
src/openpi/models/__pycache__/__init__.cpython-310.pyc ADDED
Binary file (213 Bytes). View file
 
src/openpi/models/__pycache__/gemma.cpython-310.pyc ADDED
Binary file (12.8 kB). View file
 
src/openpi/models/__pycache__/gemma_fast.cpython-310.pyc ADDED
Binary file (12.2 kB). View file
 
src/openpi/models/__pycache__/lora.cpython-310.pyc ADDED
Binary file (4.66 kB). View file
 
src/openpi/models/__pycache__/model.cpython-310.pyc ADDED
Binary file (29.9 kB). View file
 
src/openpi/models/__pycache__/pi0.cpython-310.pyc ADDED
Binary file (10.3 kB). View file