| |
| """ |
| Download DreamZero DROID dataset from Hugging Face with rate-limit handling. |
| |
| Use this script when `huggingface-cli download` hits 429 (Too Many Requests). |
| It uses a single worker and retries with backoff to stay within the 3000 req/5min limit. |
| |
| Usage: |
| python scripts/data/download_droid_hf.py [--local-dir ./data/droid_lerobot] [--max-workers 1] |
| |
| # Or with env (same as CLI default): |
| DROID_DATA_ROOT=./data/droid_lerobot python scripts/data/download_droid_hf.py |
| """ |
|
|
| from __future__ import annotations |
|
|
| import argparse |
| import os |
| import sys |
| import time |
|
|
| try: |
| from huggingface_hub import snapshot_download |
| except ImportError: |
| print("Install huggingface_hub: pip install huggingface_hub", file=sys.stderr) |
| sys.exit(1) |
|
|
| REPO_ID = "GEAR-Dreams/DreamZero-DROID-Data" |
| REPO_TYPE = "dataset" |
|
|
|
|
| def main() -> None: |
| p = argparse.ArgumentParser(description="Download DreamZero DROID dataset with rate-limit handling.") |
| p.add_argument( |
| "--local-dir", |
| default=os.environ.get("DROID_DATA_ROOT", "./data/droid_lerobot"), |
| help="Local directory to download into (default: DROID_DATA_ROOT or ./data/droid_lerobot)", |
| ) |
| p.add_argument( |
| "--max-workers", |
| type=int, |
| default=1, |
| help="Concurrent download threads (default 1 to reduce API requests and avoid 429)", |
| ) |
| p.add_argument( |
| "--retry-wait", |
| type=int, |
| default=320, |
| help="Seconds to wait on 429 before retry (default 320 ≈ 5min)", |
| ) |
| args = p.parse_args() |
|
|
| local_dir = os.path.abspath(args.local_dir) |
| os.makedirs(local_dir, exist_ok=True) |
|
|
| attempt = 0 |
| while True: |
| attempt += 1 |
| try: |
| print(f"Download attempt {attempt} (max_workers={args.max_workers})...") |
| snapshot_download( |
| repo_id=REPO_ID, |
| repo_type=REPO_TYPE, |
| local_dir=local_dir, |
| local_dir_use_symlinks=False, |
| max_workers=args.max_workers, |
| resume_download=True, |
| ) |
| print(f"Done. Dataset at: {local_dir}") |
| return |
| except Exception as e: |
| err_str = str(e).lower() |
| if "429" in err_str or "too many requests" in err_str or "rate limit" in err_str: |
| print(f"Rate limited (429). Waiting {args.retry_wait}s before retry...", file=sys.stderr) |
| time.sleep(args.retry_wait) |
| continue |
| raise |
|
|
|
|
| if __name__ == "__main__": |
| main() |
|
|