Add files using upload-large-folder tool
Browse filesThis view is limited to 50 files because it contains too many changes.
See raw diff
- examples/aloha_real/Dockerfile +70 -0
- examples/aloha_real/README.md +126 -0
- packages/openpi-client/pyproject.toml +25 -0
- packages/openpi-client/src/openpi_client/__init__.py +1 -0
- packages/openpi-client/src/openpi_client/action_chunk_broker.py +45 -0
- packages/openpi-client/src/openpi_client/base_policy.py +12 -0
- packages/openpi-client/src/openpi_client/image_tools.py +58 -0
- packages/openpi-client/src/openpi_client/image_tools_test.py +37 -0
- packages/openpi-client/src/openpi_client/msgpack_numpy.py +57 -0
- packages/openpi-client/src/openpi_client/runtime/agent.py +17 -0
- packages/openpi-client/src/openpi_client/runtime/environment.py +32 -0
- packages/openpi-client/src/openpi_client/runtime/runtime.py +92 -0
- packages/openpi-client/src/openpi_client/runtime/subscriber.py +20 -0
- packages/openpi-client/src/openpi_client/websocket_client_policy.py +49 -0
- pi0_fast_base_params/d/900e9758c5a900a9363d9695ce317b05 +0 -0
- pi0_fast_base_params/ocdbt.process_0/d/188d9577d40fae6772f2a1e734d246a6 +0 -0
- pi0_fast_base_params/ocdbt.process_0/d/82430346fa8fc21f6c02b925d2071bbe +0 -0
- pi0_fast_base_params/ocdbt.process_0/d/8c8f756cbcb196e0b8950de1511a1889 +0 -0
- pi0_fast_base_params/ocdbt.process_0/d/c0125332e372918231585505ecbac6a0 +0 -0
- pi0_fast_base_params/ocdbt.process_0/d/f55c8d160596d5002991decf8dc4edc6 +0 -0
- pi0_fast_base_params/ocdbt.process_0/d/fbf426851e50f4721bba2e803e51535c +0 -0
- pi0_fast_base_params/ocdbt.process_0/manifest.ocdbt +0 -0
- rag/ricl_training_context_libero_10_test/metadata.json +0 -0
- scripts/docker/compose.yml +29 -0
- scripts/docker/install_docker_ubuntu22.sh +37 -0
- scripts/docker/install_nvidia_container_toolkit.sh +17 -0
- scripts/docker/serve_policy.Dockerfile +34 -0
- scripts/logs/eval_pi0fast_libero.out +1243 -0
- scripts/logs/pi0fast_baseline_libero_h100.err +0 -0
- scripts/logs/pi0fast_baseline_libero_h100.out +569 -0
- scripts/serve_policy_ricl.py +90 -0
- scripts/test_ricl_data_pipeline.py +219 -0
- scripts/test_ricl_data_pipeline_v2.py +206 -0
- scripts/train.py +273 -0
- scripts/train_debug_interactive.sh +48 -0
- scripts/train_pi0_fast_baseline_libero.slurm +85 -0
- scripts/train_pi0_fast_ricl.py +317 -0
- scripts/train_pi0_fast_ricl_libero_80k.slurm +69 -0
- scripts/train_pi0_fast_ricl_libero_80k_2nn.slurm +70 -0
- scripts/train_test.py +30 -0
- scripts/verify_ricl_training_setup.py +514 -0
- src/openpi/__pycache__/__init__.cpython-313.pyc +0 -0
- src/openpi/data/__pycache__/ricl_libero_dataset.cpython-310.pyc +0 -0
- src/openpi/data/__pycache__/ricl_libero_dataset.cpython-313.pyc +0 -0
- src/openpi/models/__pycache__/__init__.cpython-310.pyc +0 -0
- src/openpi/models/__pycache__/gemma.cpython-310.pyc +0 -0
- src/openpi/models/__pycache__/gemma_fast.cpython-310.pyc +0 -0
- src/openpi/models/__pycache__/lora.cpython-310.pyc +0 -0
- src/openpi/models/__pycache__/model.cpython-310.pyc +0 -0
- 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][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 2 |
10%|█ | 1/10 [00:40<06:08, 40.97s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 3 |
20%|██ | 2/10 [01:17<05:07, 38.42s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 4 |
30%|███ | 3/10 [01:54<04:24, 37.83s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
40%|████ | 4/10 [02:33<03:48, 38.11s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 6 |
50%|█████ | 5/10 [03:11<03:11, 38.32s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 7 |
60%|██████ | 6/10 [03:50<02:34, 38.56s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 8 |
70%|███████ | 7/10 [04:28<01:54, 38.17s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 9 |
80%|████████ | 8/10 [05:09<01:18, 39.02s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 10 |
90%|█████████ | 9/10 [05:49<00:39, 39.29s/it][AINFO: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][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
10%|█ | 1/10 [00:38<05:44, 38.24s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 14 |
20%|██ | 2/10 [01:16<05:04, 38.11s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 15 |
30%|███ | 3/10 [01:55<04:29, 38.45s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 16 |
40%|████ | 4/10 [02:33<03:50, 38.38s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 17 |
50%|█████ | 5/10 [03:11<03:11, 38.37s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 18 |
60%|██████ | 6/10 [03:50<02:34, 38.58s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
70%|███████ | 7/10 [04:29<01:55, 38.50s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
80%|████████ | 8/10 [05:07<01:16, 38.43s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 21 |
90%|█████████ | 9/10 [05:46<00:38, 38.71s/it][AINFO: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][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 24 |
10%|█ | 1/10 [00:31<04:47, 31.93s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 25 |
20%|██ | 2/10 [01:03<04:12, 31.57s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 26 |
30%|███ | 3/10 [01:34<03:39, 31.35s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 27 |
40%|████ | 4/10 [02:02<03:00, 30.07s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 28 |
50%|█████ | 5/10 [02:38<02:40, 32.18s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 29 |
60%|██████ | 6/10 [03:12<02:11, 32.96s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 30 |
70%|███████ | 7/10 [03:46<01:40, 33.34s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 31 |
80%|████████ | 8/10 [04:21<01:07, 33.60s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 32 |
90%|█████████ | 9/10 [04:51<00:32, 32.60s/it][AINFO: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][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 35 |
10%|█ | 1/10 [00:31<04:46, 31.84s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
20%|██ | 2/10 [01:02<04:10, 31.26s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
30%|███ | 3/10 [01:34<03:39, 31.32s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 38 |
40%|████ | 4/10 [02:03<03:04, 30.71s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 39 |
50%|█████ | 5/10 [02:36<02:37, 31.57s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 40 |
60%|██████ | 6/10 [03:07<02:05, 31.33s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 41 |
70%|███████ | 7/10 [03:39<01:34, 31.34s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 42 |
80%|████████ | 8/10 [04:11<01:03, 31.67s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 43 |
90%|█████████ | 9/10 [04:43<00:31, 31.76s/it][AINFO: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][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 46 |
10%|█ | 1/10 [00:35<05:22, 35.86s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 47 |
20%|██ | 2/10 [01:15<05:05, 38.18s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 48 |
30%|███ | 3/10 [01:55<04:32, 38.95s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 49 |
40%|████ | 4/10 [02:31<03:46, 37.70s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 50 |
50%|█████ | 5/10 [03:09<03:09, 37.82s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 51 |
60%|██████ | 6/10 [03:47<02:32, 38.03s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 52 |
70%|███████ | 7/10 [04:28<01:56, 38.90s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 53 |
80%|████████ | 8/10 [05:07<01:17, 38.94s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 54 |
90%|█████████ | 9/10 [05:46<00:38, 38.99s/it][AINFO: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][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 57 |
10%|█ | 1/10 [00:33<05:02, 33.65s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 58 |
20%|██ | 2/10 [01:05<04:21, 32.66s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 59 |
30%|███ | 3/10 [01:39<03:51, 33.06s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 60 |
40%|████ | 4/10 [02:11<03:16, 32.69s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 61 |
50%|█████ | 5/10 [02:42<02:41, 32.23s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 62 |
60%|██████ | 6/10 [03:15<02:09, 32.46s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 63 |
70%|███████ | 7/10 [03:49<01:38, 32.82s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 64 |
80%|████████ | 8/10 [04:21<01:05, 32.52s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 65 |
90%|█████████ | 9/10 [04:54<00:32, 32.74s/it][AINFO: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][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 68 |
10%|█ | 1/10 [00:34<05:09, 34.37s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 69 |
20%|██ | 2/10 [01:08<04:35, 34.44s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 70 |
30%|███ | 3/10 [01:42<03:57, 33.94s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 71 |
40%|████ | 4/10 [02:16<03:24, 34.01s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 72 |
50%|█████ | 5/10 [02:53<02:55, 35.07s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 73 |
60%|██████ | 6/10 [03:27<02:19, 34.87s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 74 |
70%|███████ | 7/10 [04:05<01:47, 35.78s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 75 |
80%|████████ | 8/10 [04:39<01:10, 35.26s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 76 |
90%|█████████ | 9/10 [05:15<00:35, 35.41s/it][AINFO: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][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 79 |
10%|█ | 1/10 [00:37<05:38, 37.63s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 80 |
20%|██ | 2/10 [01:14<04:55, 36.90s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 81 |
30%|███ | 3/10 [01:50<04:18, 36.92s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 82 |
40%|████ | 4/10 [02:28<03:42, 37.15s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 83 |
50%|█████ | 5/10 [03:06<03:07, 37.55s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 84 |
60%|██████ | 6/10 [03:43<02:29, 37.33s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 85 |
70%|███████ | 7/10 [04:21<01:52, 37.54s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 86 |
80%|████████ | 8/10 [04:57<01:14, 37.14s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 87 |
90%|█████████ | 9/10 [05:33<00:36, 36.74s/it][AINFO: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][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 90 |
10%|█ | 1/10 [00:27<04:03, 27.01s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 91 |
20%|██ | 2/10 [00:54<03:36, 27.05s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 92 |
30%|███ | 3/10 [01:21<03:09, 27.08s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 93 |
40%|████ | 4/10 [01:48<02:41, 26.97s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 94 |
50%|█████ | 5/10 [02:14<02:14, 26.97s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 95 |
60%|██████ | 6/10 [02:43<01:49, 27.40s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 96 |
70%|███████ | 7/10 [03:09<01:21, 27.19s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 97 |
80%|████████ | 8/10 [03:37<00:54, 27.34s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 98 |
90%|█████████ | 9/10 [04:04<00:27, 27.32s/it][AINFO: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][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 101 |
10%|█ | 1/10 [00:29<04:25, 29.54s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 102 |
20%|██ | 2/10 [00:59<03:58, 29.84s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 103 |
30%|███ | 3/10 [01:29<03:30, 30.07s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 104 |
40%|████ | 4/10 [01:59<02:59, 29.99s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 105 |
50%|█████ | 5/10 [02:30<02:31, 30.31s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 106 |
60%|██████ | 6/10 [03:01<02:02, 30.60s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 107 |
70%|███████ | 7/10 [03:32<01:31, 30.64s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 108 |
80%|████████ | 8/10 [04:02<01:00, 30.34s/it][AINFO:root:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 109 |
90%|█████████ | 9/10 [04:31<00:30, 30.02s/it][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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][AINFO: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
|
|
|