diff --git a/.gitattributes b/.gitattributes index c0099a55c928266bd16306bf20762d3b5e940976..fa9422891f766651c58f7c7d5383babe2d2d19d3 100644 --- a/.gitattributes +++ b/.gitattributes @@ -36,3 +36,17 @@ saved_model/**/* filter=lfs diff=lfs merge=lfs -text aws_infra/ministack_logo.png filter=lfs diff=lfs merge=lfs -text scripts/Screenshot[[:space:]]2026-04-20[[:space:]]at[[:space:]]6.50.47 PM.png filter=lfs diff=lfs merge=lfs -text scripts/Screenshot[[:space:]]2026-04-20[[:space:]]at[[:space:]]6.50.47 PM.png filter=lfs diff=lfs merge=lfs -text +docs/figures/compare_dataset.png filter=lfs diff=lfs merge=lfs -text +docs/figures/compare_rl_env.png filter=lfs diff=lfs merge=lfs -text +docs/figures/env_init_screenshot.png filter=lfs diff=lfs merge=lfs -text +docs/figures/grpo_final_per_step.png filter=lfs diff=lfs merge=lfs -text +docs/figures/grpo_optuna_trial_curves.png filter=lfs diff=lfs merge=lfs -text +docs/figures/grpo_optuna_trials_comparison.png filter=lfs diff=lfs merge=lfs -text +docs/figures/grpo_reward_curve.png filter=lfs diff=lfs merge=lfs -text +docs/figures/ministack_logo.png filter=lfs diff=lfs merge=lfs -text +docs/figures/optuna_parallel.png filter=lfs diff=lfs merge=lfs -text +docs/figures/optuna_slice.png filter=lfs diff=lfs merge=lfs -text +docs/figures/sft_loss_curve.png filter=lfs diff=lfs merge=lfs -text +images/compare_dataset.png filter=lfs diff=lfs merge=lfs -text +images/compare_rl_env.png filter=lfs diff=lfs merge=lfs -text +scripts/Screenshot[[:space:]]2026-04-20[[:space:]]at[[:space:]]6.50.47 PM.png filter=lfs diff=lfs merge=lfs -text diff --git a/Dockerfile b/Dockerfile index 622791ab4335120bdaff1a0fea3702032add8c4b..9174d397aa31879075333558a93f2d8a4a48078e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -80,7 +80,7 @@ RUN mkdir -p /root/.aws && \ ENV AWS_ENDPOINT_URL=http://localhost:4566 # Enable the web interface for OpenEnv (if applicable) -ENV ENABLE_WEB_INTERFACE=false +ENV ENABLE_WEB_INTERFACE=true # Set PATH to use the virtual environment ENV PATH="/app/.venv/bin:$PATH" @@ -90,6 +90,9 @@ ENV PYTHONPATH="/app/env:$PYTHONPATH" ENV AWS_RL_ENV_POOL_SIZE=8 ENV AWS_RL_ENV_MINISTACK_BASE_PORT=4566 +# Dedicated port for the web playground's lazily-spawned MiniStack. +# Kept outside the pool's range so a WebSocket session can never claim it. +ENV AWS_RL_ENV_WEB_MINISTACK_PORT=4565 # DEV_MODE=1 enables live reload via --reload flag ENV DEV_MODE=0 @@ -100,6 +103,9 @@ ENV MODEL_NAME=Qwen/Qwen2.5-72B-Instruct # Entrypoint: start N MiniStack instances (AWS_RL_ENV_POOL_SIZE, default 1), # then run the FastAPI server. Each MiniStack listens on a distinct port # starting at AWS_RL_ENV_MINISTACK_BASE_PORT (default 4566). +# The web playground's MiniStack on AWS_RL_ENV_WEB_MINISTACK_PORT is NOT +# started here — the FastAPI server spawns it lazily on the first /web/* +# request so training-only deployments pay zero cost. # cloudflared tunnel --url localhost:8000 CMD ["sh", "-c", "\ POOL_SIZE=\"${AWS_RL_ENV_POOL_SIZE:-1}\"; \ diff --git a/README.md b/README.md index 0ab990a8247f0ddf179a32d80970f40cf8cb14c9..5344b820a644694345a7e47474f0e3135ad860bf 100644 --- a/README.md +++ b/README.md @@ -11,244 +11,167 @@ tags: - openenv --- -# AWS Cloud CLI and SRE Reinforcement Learning Environment +

+ MiniStack logo +

-A **OpenEnv** RL environment** for training AI agents on real-world AWS cloud operations. The agent sends AWS CLI commands as actions, receives structured observations, and progresses through a **curriculum of 120+ tasks** across 5 difficulty tiers — from basic listing to SRE incident response and security posture auditing. +# AWS Cloud CLI & SRE — A Reinforcement-Learning Environment + Training Pipeline -The agents interact with a **real-world AWS Shell simulator** — a vendored MiniStack emulator (34 AWS services, in-memory, zero-cost) inside the same Docker container. The response of every executed command is the same as production AWS. The grading system evaluates rewards and penalties based on the **actual AWS infrastructure state** instead of static metrics. No AWS account needed. +> An OpenEnv-compatible RL environment with a curriculum of **120+ AWS tasks** across 5 difficulty tiers, paired with a complete **SFT → GRPO** training pipeline (Qwen2.5-Coder-3B + LoRA + Optuna). Vendored MiniStack simulator means **zero AWS cost**, real CLI semantics, and 8-way parallel rollouts that fit on a single GPU. -> **[Try the Playground](https://sizzing-aws-rl-env.hf.space/web)** | **[API Docs](https://sizzing-aws-rl-env.hf.space/docs)** | **[Hugging Face Space](https://huggingface.co/spaces/Sizzing/aws_rl_env)** +| | | +|---|---| +| **Live demo** | [sizzing-aws-rl-env.hf.space/web](https://sizzing-aws-rl-env.hf.space/web) — try the playground in a browser | +| **API docs** | [sizzing-aws-rl-env.hf.space/docs](https://sizzing-aws-rl-env.hf.space/docs) (Swagger), [/redoc](https://sizzing-aws-rl-env.hf.space/redoc) | +| **HF Space** | [huggingface.co/spaces/Sizzing/aws_rl_env](https://huggingface.co/spaces/Sizzing/aws_rl_env) | +| **SFT adapter**| [Sizzing/aws-rl-sft-qwen25coder3b-adapter](https://huggingface.co/Sizzing/aws-rl-sft-qwen25coder3b-adapter) | +| **Dataset** | [Sizzing/aws-rl-sft](https://huggingface.co/datasets/Sizzing/aws-rl-sft) | +--- -## Task Tiers (100+ Tasks) - -### Warmup — 20 tasks -> List resources — single read-only commands - -- Run one AWS CLI command to list or describe a resource type -- S3 buckets, EC2 instances, DynamoDB tables, Lambda functions, RDS, EBS volumes -- Graded by **command_match** — checks operation + service pair -- No setup required, no state mutations - -### Beginner — 20 tasks -> Create single resources with verification - -- Create an S3 bucket, DynamoDB table, SQS queue, or Lambda function -- Graded by **resource_creation** — verifies the exact resource exists in the AWS Infrastructure Simulator -- Introduces resource name validation — "my-bucket-2" won't satisfy a check for "my-bucket" -- First tier where idempotency bonus (+0.02) can be earned +## Table of contents + +1. [What this is & why it matters](#1-what-this-is--why-it-matters) +2. [Highlights — full feature inventory](#2-highlights--full-feature-inventory) +3. [Architecture](#3-architecture) +4. [Live demo & Quick Start](#4-live-demo--quick-start) +5. [Run on Colab](#5-run-on-colab) +6. [Action / Observation spec](#6-action--observation-spec) +7. [Curriculum & Reward (overview)](#7-curriculum--reward-overview) +8. [Training pipeline (SFT → GRPO)](#8-training-pipeline-sft--grpo) +9. [Parallel rollout architecture](#9-parallel-rollout-architecture) +10. [MiniStack: vendored & customized](#10-ministack-vendored--customized) +11. [Results & Benchmarks](#11-results--benchmarks) +12. [Repository map](#12-repository-map) +13. [Configuration & Running](#13-configuration--running) +14. [Testing](#14-testing) +15. [Tech stack](#15-tech-stack) +16. [Links](#16-links) +17. [Acknowledgments](#17-acknowledgments) -### Intermediate — 20 tasks -> Multi-step workflows — create, configure, connect +--- -- Ordered sequences: create a bucket then enable versioning, create a table then add an item -- Graded by **multi_step** — validates each step was completed in order -- Chaos injection begins at **10% probability** — resources may be silently mutated mid-episode -- Rollback penalty (-0.1) starts to matter with multi-step create/delete patterns +## 1. What this is & why it matters -### Advanced — 20 tasks -> Cross-service architectures spanning multiple AWS services +Modern AI agents are increasingly asked to operate cloud infrastructure — provisioning resources, fixing misconfigurations, responding to drift. Training such agents needs (a) a realistic environment, (b) reliable reward signals, and (c) enough scale to make RL feasible. Existing options force a hard tradeoff: real AWS costs hundreds of dollars per training run and is impossible to reset; toy emulators don't behave like production AWS. -- Wire Lambda to SQS, configure API Gateway with integrations, build event-driven pipelines -- Graded by **multi_step + services** — all required services must be configured -- Chaos injection escalates to **20% probability** — DynamoDB throughput, Lambda configs may change -- Hints cost more: 3 hints = only 61% of max reward (0.85³ decay) +**This project closes that gap.** We built: -### Expert — 20 tasks -> SRE incidents, drift detection & security posture audits +1. **An OpenEnv-compatible RL environment** that speaks real AWS CLI semantics. The agent sends `aws s3 mb …`, `aws iam create-role …`, and so on — the exact same commands a human SRE would type. +2. **A vendored, customized MiniStack simulator** that responds with production-equivalent JSON, runs locally for zero cost, supports 34 AWS services, and exposes a single-call state-introspection endpoint we added so the grader has cheap ground-truth access. +3. **A 120+ task curriculum** across 5 tiers (warmup → expert) with adaptive selection, mastery tracking, spaced repetition, chaos injection, and drift-detection scenarios — every feature designed to keep the reward signal honest and prevent the agent from gaming it. +4. **A complete SFT → GRPO training pipeline.** A 1,500-row synthetic dataset spanning 5 trajectory shapes, an 11-model base benchmark, LoRA fine-tuning, and TRL GRPO with multi-turn rollouts and Optuna hyperparameter search. +5. **An 8-way parallel-rollout architecture.** Server-side MiniStack pool, client-side `GrpoPool`, in-process `MultiTurnEnvPool` — three coordinated layers that let G=8 concurrent rollouts run on one GPU without state contamination. -- Fix overly permissive S3 policies, replace broad IAM inline policies, repair broken infrastructure -- Graded by **state_checks** — actual CLI commands run against MiniStack at grading time -- Chaos injection at **30% probability** — maximum perturbation frequency -- **6 drift detection tasks** — correct infra is provisioned, then 2-3 random mutations applied from a pool -- Agent must audit environment, discover which resources drifted, and fix only those -- Drift is randomized per episode — prevents memorization of fix sequences +Everything is reproducible: the dataset is generated by a deterministic script, the model selection is documented end-to-end, training entry points run on Colab, and the env runs locally in a single Docker container with no external network requirement. --- -## Features - -### 1. Curriculum & Training - -Adaptive learning system that tracks mastery and selects optimal tasks. - -#### Progressive Difficulty -- **What:** The environment organizes 120+ tasks across 5 tiers: Warmup, Beginner, Intermediate, Advanced, and Expert. Tasks progress from simple listing operations to complex SRE incident response and drift detection scenarios. -- **Why:** Prevents the agent from being overwhelmed by complex tasks early on. Scaffolded difficulty ensures the agent builds foundational skills before tackling multi-service architectures. -- **How:** The `CurriculumManager` maintains per-agent tier state. Promotion requires meeting a minimum episode count and success rate threshold. A fast-track mechanism allows agents scoring 90%+ on 3 consecutive episodes to skip the minimum wait. -- **Metrics:** 5 Difficulty Tiers | 120+ Total Tasks | 90% Fast-track Threshold - -#### Mastery Tracking -- **What:** Each task independently tracks the agent's performance using a weighted success rate over a sliding window. Tasks "graduate" when performance exceeds the mastery threshold consistently. -- **Why:** Ensures the agent truly masters a skill before moving on. Prevents lucky single completions from being treated as mastery. Un-graduation catches skill decay. -- **How:** A `mastery_window` of 10 episodes and `mastery_threshold` of 0.7 (70% success). Minimum 3 attempts required before graduation. Recent results are weighted more heavily using exponential decay (factor 0.85). Graduated tasks can un-graduate if performance drops. -- **Metrics:** 70% Mastery Threshold | 10 Window Size | 0.85 Decay Factor +## 2. Highlights — full feature inventory + +This is the complete surface area of the project. Each entry links to deeper documentation in the corresponding sub-README. + +### Environment & Curriculum +- **[120+ tasks across 5 tiers](server/services/tasks/)** — warmup (25), beginner (25), intermediate (25), advanced (25), expert (24), drift (9). YAML-defined task spec per tier. +- **[Curriculum learning with priority scoring](server/README.md#7-curriculum-manager)** — `score = novelty + weakness − recency + spaced_rep_bonus` drives task selection. +- **[Mastery tracking](server/README.md#7-curriculum-manager)** — sliding 10-episode window, 0.7 threshold, 0.85 exponential decay, supports un-graduation. +- **[Spaced repetition](server/README.md#7-curriculum-manager)** — graduated tasks resurface at intervals `[3, 6, 12, 24, 48]` to prevent forgetting. +- **[Tier promotion](server/README.md#7-curriculum-manager)** — standard (min episodes + success rate) + fast-track (3 consecutive ≥90% episodes). +- **[Strategy pattern: simulator vs real AWS](server/README.md#4-strategy-pattern-simulator-vs-real-aws)** — `BACKEND_TYPE=simulator` (default) or `aws`, no code fork. + +### Reward shaping +- **[Five grading strategies](server/README.md#8-reward-shaping--taskgrader)** — command-match (warmup), resource-creation (beginner), multi-step (intermediate), multi-step+services (advanced), state-checks (expert). +- **[Dense partial-progress signal](server/README.md#8-reward-shaping--taskgrader)** — clamped to `[0.0, 0.99]`, `1.0` reserved for verified completion. +- **[Rollback penalty](server/README.md#8-reward-shaping--taskgrader)** — `−0.1` per `(create-X, …, delete-X)` pair. +- **[Idempotency bonus](server/README.md#8-reward-shaping--taskgrader)** — `+0.02` for graceful "already exists" retry. +- **[Hint decay](server/README.md#13-hint-provider)** — three-level progressive hints with `0.85^n` reward multiplier. +- **[Chaos survival bonus](server/README.md#11-chaos-engine)** — `×1.05` if the agent completes a chaotic task. + +### Resilience & adversarial features +- **[Chaos injection](server/README.md#11-chaos-engine)** — silent mid-episode mutations, tier-scaled probabilities (10/20/30%) on services the task is touching. +- **[Drift detection](server/README.md#12-drift-engine)** — 6 expert tasks, 2–3 random mutations from a per-task pool, randomized per episode (no memorization). +- **[Security-posture audit tasks](server/README.md#17-security-posture-audit-examples)** — S3 public bucket lockdown, IAM least-privilege, Lambda secret rotation. +- **[8-layer anti-reward-hacking](server/README.md#9-anti-reward-hacking--8-defense-layers)** — ground-truth verification, dedup, grader invisibility, command allow-list, no-credit-for-reads, monotonic progress, exact resource-name validation, final state checks. + +### Training pipeline +- **[Synthetic SFT dataset (1,500 rows)](data/README.md)** — 5 trajectory types: success / multi-step continuation / failure recovery / verification / hint usage. +- **[Rigorous base-model selection](data/sft/MODEL_EVALUATION.md)** — 11 models × 27 prompts, [Qwen2.5-Coder-3B-Instruct](https://huggingface.co/unsloth/Qwen2.5-Coder-3B-Instruct-bnb-4bit) wins. +- **[LoRA SFT](train/README.md#1-sft-stage--supervised-lora)** — `r ∈ {8,16,32}`, `lora_alpha = r × multiplier`, attention-only adaptation. +- **[GRPO RL via TRL](train/README.md#2-grpo-stage--reinforcement-learning)** — group-relative advantages, KL to SFT reference, `dapo` loss, no critic. +- **[Multi-turn rollouts](train/README.md#4-multi-turn-rollouts--parallel-envs)** — up to `MAX_TURNS=6`, observation fed back as next-turn user message. +- **[Optuna hyperparameter search](train/README.md#3-optuna-hyperparameter-search)** — TPE sampler over 8-dim space, frozen held-out validation set. +- **[HuggingFace integration](data/README.md#7-huggingface-publishing)** — adapter + dataset published to Hub, OpenEnv Space deployment. + +### Parallel rollout architecture +- **[Server-side MiniStack pool](server/README.md#6-server-side-ministack-pool-parallel-rollouts)** — `MiniStackPool` ([server/app.py](server/app.py)), free-list of ports, lock-guarded acquire/release. +- **[Client-side GrpoPool](scripts/README.md#2-three-coordinated-pool-layers)** — async-native, all-or-nothing connect, asyncio.gather for concurrent rollouts. +- **[In-process MultiTurnEnvPool](train/README.md#4-multi-turn-rollouts--parallel-envs)** — sync API, owns a background asyncio loop, used by the trainer. +- **[8 isolated rollouts on one server](scripts/README.md#7-running-the-multi-connection-demo)** — proof in [scripts/TestMultipleConnects.ipynb](scripts/TestMultipleConnects.ipynb). + +### Vendored simulator +- **[MiniStack as git subtree](server/README.md#5-ministack-vendored-fork--customizations)** — vendored at [aws_infra/](aws_infra/) (commit `2c38c0b`). 34 AWS services. MIT. +- **[Custom `/_ministack/state` endpoint](server/README.md#5-ministack-vendored-fork--customizations)** — added in commit `a648c3a`; returns full infra inventory in one call. +- **[Upstream sync workflow](server/README.md#5-ministack-vendored-fork--customizations)** — periodic `git subtree pull`; isolated patches keep conflicts minimal. + +### Operations & deployment +- **[OpenEnv-compliant](https://github.com/openai/openenv)** — `/reset`, `/step`, `/state`, `/schema`, `/ws` HTTP+WebSocket endpoints. +- **[Web playground UI](server/README.md#19-web-playground)** — `/web` route, 40 AWS service icons, Jinja2 + JS frontend. +- **[Docker-first deployment](Dockerfile)** — multi-stage build, container ships server + N MiniStack instances + AWS CLI. +- **[Comprehensive test suite](#14-testing)** — 10 unit tests + 6 tier-integration suites covering 134 tasks. -#### Spaced Repetition -- **What:** Graduated tasks don't disappear — they resurface at exponentially increasing intervals (3, 6, 12, 24, 48 episodes) for re-testing, earning a +30 priority bonus when due. -- **Why:** Prevents catastrophic forgetting. The agent must retain skills even as it learns new ones. Exponential spacing is the most efficient retention schedule, borrowed from cognitive science. -- **How:** Each task tracks a `spaced_rep_interval` starting at 3 episodes. When re-tested and passes, the interval doubles (up to 48). If it fails, the interval resets. `_is_spaced_rep_due()` checks elapsed episodes against the interval. -- **Metrics:** +30 Spaced Rep Bonus | 3→48 Interval Range | 2x Interval Growth +--- -#### Priority Selection -- **What:** Tasks are ranked by a composite score combining novelty, weakness, spaced repetition due dates, and recency. The highest-scoring task is selected for each episode. -- **Why:** Optimizes the training curriculum by ensuring the agent explores new tasks, practices weak areas, revisits graduated skills, and maintains variety — all balanced automatically. -- **How:** `score = novelty_bonus (+100 if never attempted) + weakness_weight (+50 × (1 - success_rate)) + spaced_rep_bonus (+30 if due) - recency_penalty (-20 if attempted in last 2 episodes)`. Uses exponential decay (0.85) to emphasize recent performance. -- **Metrics:** +100 Novelty Bonus | +50 Max Weakness Weight | -20 Recency Penalty +## 3. Architecture -#### Tier Progression -- **What:** Agents advance through tiers via standard promotion (minimum episodes + success rate) or fast-track (3 consecutive high-scoring episodes). Tiers gate access to increasingly complex task pools. -- **Why:** Provides structure to the learning process. Standard promotion ensures sufficient exposure; fast-track rewards agents that demonstrate immediate competence. -- **How:** Standard: complete `min_episodes` at current tier with `success_rate >= advance_rate`. Fast-track: 3 consecutive episodes at >= 90% success bypasses the minimum episode requirement. Un-promotion is not supported — agents cannot drop tiers. -- **Metrics:** 3 Fast-track Streak | 90% Fast-track Rate | 5 Total Tiers +``` +┌────────────────────────────────── Docker container ──────────────────────────────────┐ +│ │ +│ FastAPI server (port 8000) │ +│ ├── OpenEnv router /reset /step /state /schema /ws /health │ +│ ├── Web playground /web (Jinja2 + 40 AWS icon SVGs) │ +│ ├── env_factory per-WS-session AwsRlEnvironment instance │ +│ │ (acquires a MiniStack port from MiniStackPool) │ +│ └── Services │ +│ Curriculum · TaskGrader · ResourceVerifier · ChaosEngine · DriftEngine │ +│ HintProvider · EpisodeTracker · EnvironmentDesigner · EnvironmentStrategy │ +│ │ +│ │ +│ MiniStack instances :4566 :4567 :4568 … :4566+POOL_SIZE-1 │ +│ (vendored at aws_infra/, started by the Dockerfile entrypoint) │ +│ │ +└──────────────────────────────────────────────────────────────────────────────────────┘ + ▲ ▲ + │ HTTP/WS │ AWS CLI subprocess + │ │ (AWS_ENDPOINT_URL=http://localhost:4566+i) + │ │ + ┌───────┴───────────┐ ┌───────┴───────────┐ + │ RL Agent │ │ AWS CLI commands │ + │ (client.py) │ │ the agent emits │ + └───────────────────┘ └───────────────────┘ +``` -### 2. Reward Shaping +A more visual diagram (architecture + curriculum progression) will live at `docs/figures/architecture_diagram.png` once added. -Dense reward signals that encourage operational discipline and real progress. +### Episode lifecycle -``` -if task_achieved: reward = 1.0 -else: - reward = partial_progress * 0.8 # base: scaled to [0.0, 0.8] - if progress_increased: reward += 0.1 # dense signal for advancing - if command_failed: reward *= 0.5 # penalty for errors - reward = clamp(reward, 0.0, 0.99) # never 1.0 without completion - reward *= 0.85 ** hints_used # hint decay - if survived_chaos: reward *= 1.05 # chaos survival bonus -``` +1. **`reset()`** — wipes simulator state, picks next task from the curriculum, runs `setup_commands`, applies drift if applicable, returns initial observation. +2. **`step(action)`** — validates the command (must start with `aws `), intercepts hint requests, executes via the strategy, records in tracker, grades with shaped reward, optionally injects chaos, returns observation. +3. **Hint** — agent sends `aws help --task-hint`; intercepted before reaching MiniStack; returns next-level hint, increments `hints_used` (which decays final reward by `0.85^n`). +4. **Termination** — `task_achieved=True` or `step_count >= MAX_STEPS` (default 15). -#### Rollback Penalty & Idempotency Bonus -- **What:** Detects create→delete pairs on the same resource (rollbacks) and penalizes them (-0.1 each). Rewards graceful "already exists" handling (+0.02) where the agent retries idempotently. -- **Why:** First RL environment rewarding operational discipline. In production, create-then-delete cycles are wasteful. Handling "already exists" gracefully is a sign of robust automation. -- **How:** `EpisodeTracker.detect_rollbacks()` scans command history for paired create/delete operations on the same resource. Idempotency detection looks for commands that fail with "already exists" patterns (BucketAlreadyExists, ResourceInUseException, etc.) followed by successful continuation. -- **Metrics:** -0.1 Rollback Penalty | +0.02 Idempotency Bonus | Per-pair Detection - -#### Shaped Reward System -- **What:** Rewards are carefully shaped: 1.0 for full completion, 0.0-0.8 for partial progress, +0.1 progress bonus for advancing, ×0.5 for failures, capped at 0.99 without completion. Chaos bonus (×1.05) and hint decay (×0.85^n) layer on top. -- **Why:** Dense reward signal prevents sparse-reward stagnation. The agent gets meaningful feedback on every step, not just at episode end. Capping at 0.99 ensures only real completion earns full credit. -- **How:** `TaskGrader` dispatches to 5 strategies by tier: `command_match` (warmup), `resource_creation` (beginner), `multi_step` (intermediate), `multi_step+services` (advanced), and `state_checks` (expert). Each returns `partial_progress` which is converted to reward with bonuses/penalties applied. -- **Metrics:** 1.0 Max Reward | 0.99 Progress Cap | ×1.05 Chaos Bonus - -#### Multi-Strategy Grading -- **What:** Five distinct grading strategies, one per tier: `command_match` checks operation+service pairs, `resource_creation` verifies resources exist, `multi_step` validates ordered sequences, advanced adds service coverage, and expert runs `state_checks` against MiniStack. -- **Why:** Each tier tests fundamentally different skills. A single grading strategy would either be too lenient for beginners or miss the nuance needed for expert SRE tasks. -- **How:** `TaskGrader.grade()` dispatches based on the task's `grading_strategy` field. Each strategy returns a `GradeResult` with `partial_progress` (0.0-1.0), `completed` flag, and details. Grading is deterministic and fully automated. -- **Metrics:** 5 Grading Strategies | 100% Automated | Per-tier Selection - -### 3. Resilience & Adaptability - -Features that test agent robustness under unpredictable conditions. - -#### Progressive Hint System -- **What:** A 3-level hint system where each level reveals progressively more detail: Level 1 names the AWS services, Level 2 describes the operations, Level 3 gives near-complete command structure. Each hint reduces the final reward by ×0.85. -- **Why:** Creates an information-reward tradeoff unique in RL. The agent learns to wean off hints over time — initially relying on them for unfamiliar tasks, then solving independently for maximum reward. From GRPO perspective, it creates a natural exploration/exploitation axis within a single episode. -- **How:** Agent issues special command `aws help --task-hint` as its action (intercepted before reaching MiniStack). Hints auto-generated from `SuccessCriteria` fields (services, steps, operations). Reward decay: `final_reward *= 0.85 ^ hints_used` — 0 hints: 1.0×, 1 hint: 0.85×, 2 hints: 0.72×, 3 hints: 0.61×. Curriculum naturally penalizes hint-dependent agents: lower rewards → slower graduation. -- **Metrics:** 3 Hint Levels | ×0.85 Decay Per Hint | ~61% Reward with 3 Hints - -#### Chaos Injection Engine -- **What:** Silently mutates AWS resource state mid-episode to test agent resilience. Perturbations are scoped to services the current task uses. If the agent completes despite chaos, it earns a ×1.05 bonus. -- **Why:** Tests whether the agent can handle unexpected state changes — a critical SRE skill. Prevents brittle memorization of exact command sequences. Probability scales with tier difficulty. -- **How:** `ChaosEngine` selects perturbation templates specific to the services in use (S3 policy changes, DynamoDB throughput modifications, Lambda config alterations, etc.). Resource names are extracted from successful commands via regex. Chaos probability: 10% (Intermediate), 20% (Advanced), 30% (Expert). -- **Metrics:** ×1.05 Chaos Survival Bonus | 10-30% Probability by Tier | 5 Service Templates - -#### Drift Detection Tasks -- **What:** 6 expert-tier tasks where infrastructure is provisioned correctly, then 2-3 random mutations are applied from a pool. The agent must audit, discover drifted resources, and fix only those — without knowing which drifted. -- **Why:** Randomized per episode, preventing memorization. Tests real SRE audit skills: the agent must reason about desired vs. actual state, not just follow a script. -- **How:** `DriftEngine` randomly selects 2-3 mutations from a task's `possible_drifts` pool and applies them after setup. Each task defines a `desired_state_spec` (natural language) and `state_checks` (ground truth CLI commands). Examples: S3 versioning/encryption drift, DynamoDB throughput changes, SNS subscription modifications. -- **Metrics:** 6 Drift Tasks | 2-3 Mutations Per Episode | Random Selection Per Run - -### 4. Security Posture Audit - -Tests *reasoning about configuration state* — the agent must READ and ANALYZE existing infrastructure, not just build things. Unlike SRE tasks (broken functionality), these have *working but insecure* infrastructure. - -#### Public S3 Bucket Lockdown -- **What:** A pre-provisioned S3 bucket "public-assets" has an overly permissive bucket policy granting access to any principal (`Principal: *`). The agent must read the policy, identify the vulnerability, and replace it with a restrictive policy allowing only a specific IAM role. -- **Why:** Tests security reasoning — the infrastructure is functional but insecure. Unlike SRE tasks where things are broken, here the agent must understand what "correct" security posture looks like and make the right judgment call. -- **How:** Setup creates the bucket with a wide-open policy. State checks verify the new policy denies `Principal: *` and only allows the `app-role` principal to perform `s3:GetObject`. -- **Metrics:** S3 Target Service | Policy Attack Surface | Expert Tier - -#### IAM Least Privilege -- **What:** An IAM role "app-role" has an inline policy with `Action: *` and `Resource: *` — full admin access. The agent must replace it with a least-privilege policy allowing only `dynamodb:GetItem` and `dynamodb:PutItem` on the users table. -- **Why:** IAM misconfiguration is the #1 cloud security risk. This task tests whether the agent understands permission scoping and can reason about what access an application actually needs vs. what it currently has. -- **How:** Setup creates the role with a wildcard policy. The agent must craft a replacement policy document with specific actions and resource ARN. State checks verify the policy document matches the expected least-privilege permissions. -- **Metrics:** IAM Target Service | 2 Allowed Actions | Expert Tier - -#### Secrets in Lambda Environment -- **What:** A Lambda function "data-processor" has a database password stored as a plaintext environment variable (`DB_PASSWORD=hunter2`). The agent must create a secret in Secrets Manager, update the Lambda to reference the secret ARN, and remove the plaintext variable. -- **Why:** Plaintext secrets in environment variables is a critical security anti-pattern. This task combines multiple services (Lambda + Secrets Manager) and tests the agent's ability to perform a safe credential rotation without breaking the function. -- **How:** Setup creates the Lambda with the plaintext env var. The agent must: (1) create a secret in Secrets Manager, (2) add `SECRET_ARN` env var to Lambda, (3) remove `DB_PASSWORD`. State checks verify all three conditions. -- **Metrics:** 2 Services Involved | 3 Required Steps | Expert Tier - -### 5. Anti-Reward-Hacking (8 Defense Layers) - -8 defense layers that prevent the agent from gaming the reward system. - -#### 1. Ground-Truth Verification via MiniStack -- **What:** The grader never trusts agent command output. It independently queries MiniStack (the simulated AWS backend) to verify resource state for 20+ services. Even if the agent crafts fake-looking stdout, the grader checks actual state. -- **Why:** Prevents reward hacking through output fabrication. The agent cannot game the system by producing convincing but fake CLI output — ground truth is always checked server-side. -- **How:** `ResourceVerifier` has per-service verification methods that query MiniStack directly. For expert tasks, `StateCheck` assertions run actual AWS CLI commands against MiniStack at grading time, checking either `output_contains` (substring) or `json_path` extraction with expected values. -- **Metrics:** 20+ Verified Services | 100% Server-side | 0 Agent Visibility - -#### 2. Deduplication -- **What:** `EpisodeTracker.has_executed_operation()` tracks which (operation, resource) pairs have been credited. Running the same successful command twice does NOT increase `partial_progress`. Progress can only increase, never re-earn. -- **Why:** Prevents the agent from gaming the reward system by repeating the same command to accumulate credit. Each unique operation earns credit exactly once. -- **How:** `credit_operation()` records each (operation, resource) pair. Before granting credit, `is_operation_already_credited()` checks if this exact pair was already rewarded. The check is deterministic and happens at grading time. -- **Metrics:** 1x Credit Per Operation | Exact Match Type | (op, res) Tracking Granularity - -#### 3. Grader Invisibility -- **What:** The verification commands run by `ResourceVerifier` are NOT returned in the observation's `command_output`. They happen server-side during grading. The agent cannot observe or mimic them. -- **Why:** If the agent could see which verification commands the grader runs, it could learn to craft fake outputs that match expected patterns. Keeping grader logic invisible forces the agent to actually perform the task. -- **How:** `ResourceVerifier` executes AWS CLI commands against MiniStack in a separate execution context. Results are consumed internally by the grading pipeline. The observation returned to the agent only contains output from the agent's own commands. -- **Metrics:** 0 Grader Cmds Exposed | Server Execution Context | 20+ Hidden Verifications - -#### 4. Command Allowlisting -- **What:** Only commands starting with `aws` are executed. Any attempt to run shell commands, pipe to other tools, use redirects, or escape the sandbox is rejected with `success=False`. -- **Why:** Prevents the agent from escaping the AWS CLI sandbox. Without this, the agent could potentially execute arbitrary shell commands, access the filesystem, or interfere with the environment. -- **How:** The environment's `step()` method validates the command before execution. Commands not starting with `aws` are immediately rejected. -- **Metrics:** `aws *` Allowed Pattern | 0 Shell Access | Instant Rejection - -#### 5. No Verification Reward -- **What:** If the agent runs a command that matches a `state_check` command exactly (e.g., `aws s3api get-bucket-versioning --bucket app-config-store`), it gets no progress credit. Progress is only earned through `steps` operations (mutating commands), not read-only queries. -- **Why:** Prevents the agent from gaming progress by running the same verification commands the grader uses. The agent can run read commands to understand state, but only mutation commands earn progress. -- **How:** During grading, the `TaskGrader` checks if the agent's command matches any `state_check` command. Matching commands are flagged as verification-only and excluded from credit. Only commands matching `steps` operations (create, put, update, delete) earn `partial_progress`. -- **Metrics:** 0 Credit for Reads | Mutate Rewarded Actions | Exact Match Detection - -#### 6. Monotonic Progress -- **What:** `partial_progress` can only increase within an episode. It is clamped to [0.0, 0.99] — reaching 1.0 requires actual task completion. The agent cannot lose progress, but also cannot re-earn it. -- **Why:** Prevents cycling strategies where the agent creates and destroys resources repeatedly. Combined with deduplication, this ensures steady forward progress. -- **How:** In `TaskGrader`, `previous_progress` tracks the highest progress seen. New progress is always `max(previous, current)`. Reward is clamped at 0.99 for partial completion, reserving 1.0 exclusively for verified full completion. -- **Metrics:** 0.99 Max Without Completion | 1.0 Requires Full Completion | max() Progress Function - -#### 7. Resource Name Validation -- **What:** For `resource_exists` checks, the verifier matches the exact resource name, not just any resource of that type. Creating "my-test-bucket-2" doesn't satisfy a check for "my-test-bucket". -- **Why:** Prevents the agent from creating arbitrarily named resources to game the verification system. Forces precise execution of the task requirements. -- **How:** `ResourceVerifier`'s per-service methods (`verify_s3_bucket`, `verify_dynamodb_table`, etc.) compare against the exact expected resource name from the task definition. Each of the 20+ supported services has its own verification logic. -- **Metrics:** Exact Name Matching | 20+ Verified Services | 0 Partial Matches - -#### 8. State Checks Verify Final State -- **What:** For expert SRE tasks, `state_checks` run actual AWS CLI commands against MiniStack at grading time. The grader verifies the final infrastructure state — not the commands the agent ran. -- **Why:** The agent cannot fake the state. MiniStack is the ground truth. This decouples "what the agent did" from "what was actually achieved", making reward hacking extremely difficult. -- **How:** Each expert task defines `state_checks` with command + assertion pairs. Assertions support `output_contains` (substring match on CLI output) and `json_path + expected` (JSON extraction). The grader runs these checks against the live MiniStack state independently of the agent. -- **Metrics:** CLI Verification Method | 2 Assertion Types | Live State Source +Full mechanics in [server/README.md](server/README.md). --- -## Supported AWS Services (34) +## 4. Live demo & Quick Start -| Category | Services | -|----------|----------| -| **Storage & DB** | S3, DynamoDB, RDS, ElastiCache, EFS | -| **Compute** | Lambda, ECS, EC2, Step Functions | -| **Messaging** | SQS, SNS, Kinesis, EventBridge, Firehose | -| **API** | API Gateway v1/v2, ALB/ELBv2 | -| **Security** | IAM, STS, Cognito, ACM, WAF v2, Secrets Manager | -| **Monitoring** | CloudWatch, CloudWatch Logs, SSM | -| **Infrastructure** | CloudFormation, Route53 | -| **Other** | SES, Athena, Glue, EMR | +### Try it in a browser ---- +The hosted playground lets you click around any task without writing code: -## Quick Start +> **[sizzing-aws-rl-env.hf.space/web](https://sizzing-aws-rl-env.hf.space/web)** + +### Python client ```python from aws_rl_env import AwsRlAction, AwsRlEnv @@ -261,7 +184,7 @@ with AwsRlEnv.from_docker_image("aws-rl-env:latest") as env: print(f"Reward: {result.reward}, Done: {result.done}") ``` -Or connect to a running server: +Or against a running server: ```python env = AwsRlEnv(base_url="http://localhost:8000") @@ -269,7 +192,7 @@ result = env.reset() result = env.step(AwsRlAction(command="aws s3 ls")) ``` -WebSocket API: +### WebSocket API ```python import websockets, json @@ -282,116 +205,42 @@ async with websockets.connect("wss://sizzing-aws-rl-env.hf.space/ws") as ws: obs = json.loads(await ws.recv()) ``` ---- - -## Architecture +### Local Docker +```bash +make docker-build # build the image +make docker-run # foreground; serves on :8000 +make docker-run-detach # background +make docker-health # liveness probe ``` -┌─────────────────────────────────────────────────────────┐ -│ Docker Container │ -│ │ -│ ┌─────────────────────┐ ┌────────────────────┐ │ -│ │ FastAPI RL Server │ │ AWS Simulator │ │ -│ │ (port 8000) │─────>│ (port 4566) │ │ -│ │ │ │ 34 AWS services │ │ -│ │ - Environment │ │ In-memory state │ │ -│ │ - Curriculum │ │ Reset API │ │ -│ │ - Grading Engine │ │ (Ministack) │ │ -│ │ - Episode Tracker │ │ │ │ -│ │ - Hint Provider │ │ │ │ -│ └─────────────────────┘ └────────────────────┘ │ -│ ^ ^ │ -│ | OpenEnv HTTP/WS | AWS CLI calls │ -└──────────┼─────────────────────────────┼────────────────┘ - | | - RL Agent (client, External) (internal only) -``` - -### Episode Lifecycle - -1. **`reset()`** — Wipes AWS Infracture state, selects next task from curriculum, provisions setup commands (if any), returns initial observation -2. **`step(action)`** — Validates command (`aws` prefix only), executes against MiniStack, records in tracker, grades with shaped reward, returns observation -3. **Hint request** — Agent sends `aws help --task-hint` to get a progressive hint (costs reward) -4. **Terminates** when `task_achieved == True` or max steps reached - ---- - - -## Core Classes - -### `AwsRlEnvironment` -[server/aws_rl_env_environment.py](server/aws_rl_env_environment.py) — Implements the OpenEnv `Environment` interface. Orchestrates all services. +For training (8-way parallel rollouts): -| Method | Description | -|--------|-------------| -| `reset()` | Wipe infra, select task, provision setup, return initial observation | -| `step(action)` | Execute command (or intercept hint request), grade, update curriculum, return observation | - -### `Curriculum` - -[server/services/curriculum.py](server/services/curriculum.py) — Priority-queue-based task selection with progressive difficulty. - -Selects the next task using a **max-heap scored by**: - -``` -score = ( - novelty_bonus # +100 if never attempted (explore first) - + weakness_weight # +50 * (1 - task_success_rate) — worse tasks get higher priority - + spaced_rep_bonus # +30 if graduated task is "due" for re-test - - recency_penalty # -20 if attempted in last 2 episodes (ensure variety) -) +```bash +AWS_RL_ENV_POOL_SIZE=8 make run ``` -### `TaskGrader` - -[server/services/task_grader.py](server/services/task_grader.py) — Evaluates task completion using a dispatcher pattern. Rewards are always in [0.0, 1.0]. - -**Grading strategies by tier:** - -| Tier | Strategy | How it works | -|------|----------|--------------| -| Warmup | Command match | Checks command contains service string + correct operation | -| Beginner | Resource creation | Verifies resource actually exists in MiniStack via `ResourceVerifier` | -| Intermediate | Multi-step | Tracks ordered sequence of (operation, resource) pairs | -| Advanced | Multi-step + services | All steps completed AND all required services touched | -| Expert | State checks | Runs arbitrary AWS CLI commands to assert end-state (ground truth) | - -### `HintProvider` - -[server/services/hint_provider.py](server/services/hint_provider.py) — Generates progressive hints from `SuccessCriteria` fields. - -| Hint Level | What it reveals | Example | -|-----------|----------------|---------| -| Level 1 | Which AWS services to use | "You'll need IAM and Lambda" | -| Level 2 | Which operations | "Start with create-role, then put-role-policy" | -| Level 3 | Near-complete command structure | "Use: aws iam create-role --role-name ..." | - -### `EpisodeTracker` - -[server/services/episode_tracker.py](server/services/episode_tracker.py) — Maintains per-episode step history. Parses AWS CLI commands to extract (service, operation, resource) tuples. Tracks credited operations for deduplication, monotonic progress, and hint usage. - -### `ResourceVerifier` - -[server/services/resource_verifier.py](server/services/resource_verifier.py) — Queries MiniStack directly to verify ground-truth resource state. Service-specific checks for S3, DynamoDB, Lambda, SQS, SNS, IAM, Secrets Manager, and API Gateway. Also evaluates `StateCheck` assertions (substring match, JSON path extraction). - -### `EnvironmentDesigner` - -[server/services/environment_designer.py](server/services/environment_designer.py) — Provisions initial AWS state via setup commands before the agent acts. Used by SRE/expert tasks to create broken or insecure infrastructure the agent must fix. +--- -### `AwsBackend` +## 5. Run on Colab -[server/services/aws_backend.py](server/services/aws_backend.py) — Executes AWS CLI commands against MiniStack (`AWS_ENDPOINT_URL=http://localhost:4566`). Provides `reset_environment()` via MiniStack's `/_ministack/reset` endpoint. +The full pipeline is reproducible on a Colab GPU runtime. Drop your token into Colab Secrets, set `ENV_BASE_URL` to your HF Space (or local with ngrok), and run. -### `AwsRlEnv` (Client) +| Notebook | What it does | Open in Colab | +|-------------------------------------------------------------------------------------|-------------------------------------------------------|----------------------------------------------| +| [aws_rl_env_colab.ipynb](aws_rl_env_colab.ipynb) | End-to-end driver: validation, Optuna search, full GRPO training, plotting, optional push-to-Hub | | +| [train/train_sft_lora.ipynb](train/train_sft_lora.ipynb) | Stage 1 — SFT LoRA fine-tuning of Qwen2.5-Coder-3B | | +| [train/train_grpo_lora.ipynb](train/train_grpo_lora.ipynb) | Stage 2 — GRPO RL training with multi-turn rollouts | | +| [compare/compare_base_vs_sft.ipynb](compare/compare_base_vs_sft.ipynb) | Side-by-side: base model vs SFT adapter (dataset + RL env) | | +| [scripts/TestMultipleConnects.ipynb](scripts/TestMultipleConnects.ipynb) | Demo: 8 simultaneous WebSocket sessions stay isolated | | -[client.py](client.py) — OpenEnv HTTP/WebSocket client. Wraps `reset()` and `step()` calls to the server. +Replace each `` with the Colab badge URL once published. --- -## Data Models +## 6. Action / Observation spec -[models.py](models.py) — All Pydantic models and type aliases. +The full Pydantic data models — kept inline so any reader can wire up an agent without leaving this page. Source: [models.py](models.py). ### Action @@ -400,51 +249,53 @@ class AwsRlAction(Action): command: str # AWS CLI command, e.g. "aws s3 ls" ``` +The environment validates that `command` starts with `aws `; anything else is rejected with `success=False`. + ### Observation ```python class AwsRlObservation(Observation): episode_id: EpisodeID step_count: StepCount - command_success: bool - command_output: str # stdout from AWS CLI - error: str # stderr if failed - task: TaskInfo | None # masked task definition (hides success criteria) + command_success: bool # exit code == 0 + command_output: str # stdout from the AWS CLI invocation + error: str # stderr (empty if success) + task: TaskInfo | None # masked task definition (no success criteria) task_achieved: bool - partial_progress: float # current task progress in [0.0, 1.0] - hints_used: int # number of hints requested this episode - hint_text: str # most recent hint text (if any) + partial_progress: float # current task progress in [0.0, 1.0] + hints_used: int # cumulative hint count this episode + hint_text: str # most recent hint text (if any) ``` -### Environment State +### State ```python class AwsRlState(State): - current_task: Task | None # full task assigned for the episode - tracker: TrackerState # episode tracker snapshot - infra_state: dict # AWS infrastructure state keyed by service name - chaos_occurred: bool # whether chaos was injected this episode - current_tier: str # agent's current difficulty tier + current_task: Task | None # full task assigned for the episode + tracker: TrackerState # episode tracker snapshot + infra_state: dict # AWS infrastructure state keyed by service name + chaos_occurred: bool # whether chaos was injected this episode + current_tier: str # agent's current difficulty tier class TrackerState: - step_count: int # steps taken this episode - hints_used: int # hints requested this episode - progress: float # current partial progress [0.0, 1.0] - commands_executed: list[str] # commands executed this episode - credited_operations: list[str] # (operation, resource) pairs that earned credit + step_count: int # steps taken this episode + hints_used: int # hints requested this episode + progress: float # current partial progress [0.0, 1.0] + commands_executed: list[str] # commands executed this episode + credited_operations: list[str] # (operation, resource) pairs that earned credit ``` -### Task Definitions +### Task definitions ```python class Task: task_id: TaskID - difficulty: TaskDifficulty # warmup | beginner | intermediate | advanced | expert - description: str # human-readable goal + difficulty: TaskDifficulty # warmup | beginner | intermediate | advanced | expert + description: str # human-readable goal success_criteria: SuccessCriteria - setup_commands: list[SetupCommand] # pre-provision for SRE tasks - desired_state_spec: str | None # natural-language desired end state (drift tasks) - possible_drifts: list[SetupCommand] # pool of mutations for DriftEngine + setup_commands: list[SetupCommand] # pre-provision for SRE tasks + desired_state_spec: str | None # natural-language desired end state (drift tasks) + possible_drifts: list[SetupCommand] # pool of mutations for DriftEngine class TaskInfo: """Agent-visible subset of Task — masks success_criteria, setup_commands, and possible_drifts.""" @@ -454,143 +305,311 @@ class TaskInfo: desired_state_spec: str | None class SuccessCriteria: - command_contains: str | None # warmup/beginner - operation: str | None # warmup/beginner - resource_exists: ResourceExistsCheck | None # beginner - steps: list[StepCriteria] # intermediate/advanced/expert - services: list[AwsService] # advanced/expert - state_checks: list[StateCheck] # expert (ground truth) + command_contains: str | None # warmup/beginner + operation: str | None # warmup/beginner + resource_exists: ResourceExistsCheck | None # beginner + steps: list[StepCriteria] # intermediate/advanced/expert + services: list[AwsService] # advanced/expert + state_checks: list[StateCheck] # expert (ground truth) ``` -### Curriculum Configuration +### Curriculum config ```python class TierConfig: - min_episodes: int # minimum episodes before promotion - advance_rate: float # tier success rate threshold (0.6 - 1.0) - mastery_window: int # sliding window size (default: 10) - mastery_threshold: float # per-task graduation threshold (default: 0.7) + min_episodes: int # minimum episodes before promotion + advance_rate: float # tier success rate threshold (0.6 - 1.0) + mastery_window: int # sliding window size (default: 10) + mastery_threshold: float # per-task graduation threshold (default: 0.7) fast_track_rate: float # early promotion threshold (default: 0.9) - chaos_probability: float # probability of chaos injection per step (default: 0.0) + chaos_probability: float # probability of chaos injection per step class SpacedRepState: - interval: int # episodes until next re-test (3 -> 48) + interval: int # episodes until next re-test (3 → 48) last_graduated_episode: int # when last graduated ``` --- -## Project Structure +## 7. Curriculum & Reward (overview) + +The curriculum and reward stack is the heart of the project. This section is the elevator pitch; **the full mechanics — priority scoring math, anti-reward-hacking layers, chaos engine, drift engine — live in [server/README.md](server/README.md)**. + +### Priority scoring (one-formula task selection) ``` -aws-rl-env/ -├── __init__.py # Exports: AwsRlEnv, AwsRlAction, AwsRlObservation -├── models.py # Pydantic data models & type aliases -├── client.py # AwsRlEnv OpenEnv client -├── inference.py # LLM agent inference script -├── inference-complete.py # Full inference pipeline with curriculum -├── server/ -│ ├── app.py # FastAPI application + web UI endpoints -│ ├── aws_rl_env_environment.py # Core RL environment (reset/step) -│ ├── templates/ -│ │ └── index.html # Web playground UI -│ ├── static/ -│ │ ├── css/style.css # Playground styles -│ │ └── js/app.js # Playground frontend logic -│ └── services/ -│ ├── aws_backend.py # MiniStack command executor -│ ├── task_grader.py # Grading engine with reward shaping -│ ├── curriculum.py # Curriculum learning manager -│ ├── episode_tracker.py # Per-episode step history & hints -│ ├── resource_verifier.py # Ground-truth state verification -│ ├── environment_designer.py # Setup provisioning for SRE tasks -│ ├── hint_provider.py # Progressive hint generator -│ ├── chaos_engine.py # Chaos injection engine -│ ├── drift_engine.py # Drift detection engine -│ ├── task_solutions.py # Reference solutions for tasks -│ └── tasks/ -│ ├── warmup.yaml # 20 listing tasks -│ ├── beginner.yaml # 20 creation tasks -│ ├── intermediate.yaml # 20 multi-step tasks -│ ├── advanced.yaml # 20 architecture tasks -│ ├── expert.yaml # 20 SRE/security tasks -│ └── drift.yaml # Drift detection tasks -├── tests/ # Unit tests for core services -│ ├── test_aws_rl_env_environment.py -│ ├── test_drift_engine.py -│ ├── test_environment_designer.py -│ ├── test_episode_tracker.py -│ ├── test_hint_provider.py -│ ├── test_resource_verifier.py -│ └── test_task_grader.py -├── tests_tasks/ # Integration tests per task tier -│ ├── test_warmup_tasks.py -│ ├── test_beginner_tasks.py -│ ├── test_intermediate_tasks.py -│ ├── test_advanced_tasks.py -│ ├── test_expert_tasks.py -│ └── test_drift_tasks.py -├── aws_infra/ # MiniStack emulator (git subtree from ministackorg/ministack) -│ └── ministack/ -│ ├── app.py # MiniStack ASGI router -│ ├── core/ # Routing, persistence, responses -│ └── services/ # AWS service implementations -├── Dockerfile # Multi-stage build (server + MiniStack) -├── Makefile # Dev tasks: run, format, lint, docker-* -├── openenv.yaml # OpenEnv manifest -└── pyproject.toml # Dependencies & build config +score = novelty_bonus # +100 if never attempted + + weakness_weight # +50 × (1 − task_success_rate) + + spaced_rep_bonus # +30 if a graduated task is "due" for re-test + − recency_penalty # −20 if attempted in the last 2 episodes +``` + +Exploration, weakness-targeting, anti-forgetting, and variety — all balanced by one weighted sum. + +### Reward shaping + +``` +if task_achieved: + reward = 1.0 + if survived_chaos: reward *= 1.05 # chaos survival bonus +else: + reward = partial_progress * 0.8 # ≤ 0.8 from steps alone + if progress_increased: reward += 0.1 # dense progress signal + if command_failed: reward *= 0.5 # error penalty + reward -= 0.1 * rollback_count # waste penalty + reward += 0.02 * idempotent_retries # graceful retry bonus + reward = clamp(reward, 0.0, 0.99) # 1.0 reserved for completion + +reward *= 0.85 ** hints_used # hint decay applied last ``` +The agent's loss surface is intentionally narrow: only doing the task earns full reward, and every reward-hacking shortcut we identified during design has a defense layer (full list in [server/README.md §9](server/README.md#9-anti-reward-hacking--8-defense-layers)). + +> Curriculum progression visual will live at `docs/figures/curriculum_progression.png`. + --- -## Running +## 8. Training pipeline (SFT → GRPO) -### Docker (recommended) +The training pipeline runs in two stages, both reproducible on Colab. Full detail in **[train/README.md](train/README.md)**. -```bash -make docker-build # Build image -make docker-run # Run on port 8000 -make docker-run-detach # Run in background -make docker-health # Health check +``` + ┌────────── data/sft/ ──────────┐ + │ 1,500 train · 150 val rows │ + │ 5 trajectory types │ + └───────────────┬───────────────┘ + ▼ + STAGE 1 — Supervised Fine-Tuning train/train_sft_lora.ipynb + Qwen2.5-Coder-3B-Instruct + LoRA r=8/16/32 (Optuna) → SFT adapter + │ + │ Sizzing/aws-rl-sft-qwen25coder3b-adapter + ▼ + STAGE 2 — GRPO RL train/train_grpo_lora.ipynb + G=8 parallel rollouts · multi-turn · reward = env return + Optuna over (lr, β, G, T, top_p, lora_r, max_turns) ``` -### Local (without Docker) +### Numbers worth knowing -Use the combined Makefile target: +| | | +|---|---| +| **Base model** | `unsloth/Qwen2.5-Coder-3B-Instruct-bnb-4bit` — picked via [data/sft/MODEL_EVALUATION.md](data/sft/MODEL_EVALUATION.md) | +| **SFT LoRA** | `r ∈ {8,16,32}`, `lora_alpha = r × multiplier`, target = attention only, dropout `[0.005, 0.031]` | +| **GRPO config** | `G=8`, `β=0.04`, `lr=5e-6`, `T=0.9`, `top_p=0.95`, `max_turns=6`, loss=`dapo` | +| **Optuna search** | TPE sampler, 6 trials × 30 GRPO steps, frozen 10-task held-out val set | +| **Final training** | 200 GRPO steps with best config | + +### Training graphs + +> Embed once notebook is executed: +> ![SFT loss curve](docs/figures/sft_loss_curve.png) +> ![GRPO mean reward over training](docs/figures/grpo_reward_curve.png) +> ![Per-rollout reward by curriculum tier](docs/figures/grpo_per_tier_curve.png) +> ![Optuna parameter importance](docs/figures/optuna_param_importance.png) + +--- + +## 9. Parallel rollout architecture + +GRPO needs `G` rollouts on the same task per training step. We run all G in parallel with **state isolation guaranteed**. Three coordinated pool layers make it work: -```bash -make run # Starts MiniStack + server ``` + Trainer (G=8 generations needed per step) + │ + ┌────────────────────┼────────────────────┐ + ▼ ▼ ▼ + MultiTurnEnvPool GrpoPool (in-process) + (train_grpo.py) (scripts/grpo_pool.py) + sync API async API + │ │ + └─────── 8 WebSocket connections ────────┘ + │ + ▼ + FastAPI server :8000 + + OpenEnv max_concurrent_envs=8 + │ + ▼ + MiniStackPool (free-list, lock-guarded) + acquire(port) on connect, release on disconnect + │ + ▼ + 8 isolated MiniStack instances :4566..:4573 +``` + +Wall-clock impact: an 8-rollout × 6-turn episode runs in ~300 ms of env time vs ~2.4 s sequential. Full mechanics, including the **all-or-nothing connect protocol** that prevents pool-slot leakage on flake, are in **[scripts/README.md](scripts/README.md)**. + +--- + +## 10. MiniStack: vendored & customized + +The simulator powering the env is **vendored** as a git subtree at [aws_infra/](aws_infra/), not pulled as a black-box dependency. We forked it because we needed: -### OpenEnv Deployment +1. A custom `/_ministack/state` JSON endpoint so the grader can read the entire infra inventory in **one HTTP call** instead of iterating 20+ list APIs per grading pass. Added in commit `a648c3a "feat: Add support for service state retrieval and action listing across multiple AWS services"`. +2. A reproducible build with no runtime network requirement — the Docker image bundles a specific MiniStack revision. +3. The freedom to extend service coverage on demand. + +Custom commits live as small, isolated patches so periodic upstream syncs (`af2e945`, `579597b`) replay cleanly. To inspect: ```bash -make openenv-validate # Validate config -make openenv-build # Build environment -make openenv-push # Push to HuggingFace Spaces +git show a648c3a # the state-endpoint diff +git log --oneline -- aws_infra/ # only the aws_infra subtree history ``` +Full subtree workflow + commit-by-commit detail in [server/README.md §5](server/README.md#5-ministack-vendored-fork--customizations). Upstream MiniStack docs (81 KB) are preserved at [aws_infra/README.md](aws_infra/README.md). + --- -## Configuration +## 11. Results & Benchmarks + +### Base-model selection + +We evaluated 11 chat models on 27 held-out prompts. **Qwen2.5-Coder-3B-Instruct** wins on every metric that matters: 41% exact match (highest), 63% operation match (highest), 3.1 s/call (3× faster than the 4B runner-up). Full report: + +> **[data/sft/MODEL_EVALUATION.md](data/sft/MODEL_EVALUATION.md)** — 270-line writeup, per-model verdicts, methodology + +> ![Top 4 candidate models on the held-out benchmark](docs/figures/model_eval_chart.png) + +### Base vs SFT — actual results + +After running the SFT pipeline end-to-end, the eval delta on the same held-out prompts is striking. Numbers from [out/delta_summary.json](out/delta_summary.json): + +| Metric | Base | Post-SFT | Delta | +|-----------------|:------:|:--------:|:-----------:| +| `format_pct` | 33.3% | **100.0%** | **+66.7 pp** | +| `exact_pct` | 38.9% | **88.9%** | **+50.0 pp** | +| `service_pct` | 77.8% | **88.9%** | +11.1 pp | +| `operation_pct` | 61.1% | **88.9%** | +27.8 pp | +| `avg_latency` | 2.03s | **1.40s** | −0.63s (faster!) | +| `avg_len` | 85.8 | 74.7 | −11 chars (tighter) | + +> ![Base vs SFT eval-metrics comparison](docs/figures/base_vs_sft_success.png) + +Every target from [data/sft/MODEL_EVALUATION.md §11](data/sft/MODEL_EVALUATION.md) is met or exceeded. Format compliance is now perfect; the model never wraps commands in fences or quotes after SFT. Exact-match jumped from 39% to 89% — the agent now emits the canonical command for ~9 of every 10 prompts. + +The richer two-mode benchmark (dataset eval + live RL env eval) is in [compare/compare_base_vs_sft.ipynb](compare/compare_base_vs_sft.ipynb); methodology in [compare/README.md](compare/README.md). + +> ![Dataset comparison: base vs SFT (per-row scores)](docs/figures/compare_dataset.png) +> ![RL env comparison: base vs SFT (per-episode rewards)](docs/figures/compare_rl_env.png) + +### SFT training curves + +> ![SFT loss curve over training](docs/figures/sft_loss_curve.png) + +### Optuna SFT search + +The best SFT trial (out of 6) used `lora_r=16, lora_alpha=16, dropout=0.0058, lr=4.03e-4, warmup=0.1`. Full study at [out/optuna_study.json](out/optuna_study.json). + +> ![Optuna parameter importances](docs/figures/optuna_param_importance.png) +> ![Optuna optimization history](docs/figures/optuna_history.png) + +### GRPO results (live multi-step env eval) -| Variable | Default | Description | -|----------|---------|-------------| -| `AWS_INFRA_URL` | `http://localhost:4566` | AWS Infra endpoint | -| `AWS_ACCESS_KEY_ID` | `test` | AWS credentials (any value works) | -| `AWS_SECRET_ACCESS_KEY` | `test` | AWS credentials (any value works) | -| `AWS_DEFAULT_REGION` | `us-east-1` | AWS region | -| `MAX_STEPS` | `15` | Max steps per episode | -| `API_BASE_URL` | — | LLM API endpoint (for inference.py) | -| `MODEL_NAME` | — | LLM model name (for inference.py) | -| `HF_TOKEN` | — | HuggingFace token (for inference.py) | -| `TEMPERATURE` | `0.7` | LLM sampling temperature | +After 35 GRPO steps on top of the SFT adapter (config from [out_grpo/optuna_best.json](out_grpo/optuna_best.json) — `lr=1.6e-5, β=0.0021, T=0.99`), we re-evaluated end-to-end on 100+ episodes: + +| Metric | Base + SFT | Base + SFT + GRPO | Δ | +|-------------------------------|:---------:|:-----------------:|:------------:| +| Overall success rate | 86.8% | 86.2% | −0.5 pp | +| Overall mean reward | 0.883 | 0.877 | −0.006 | +| Beginner success | 96.2% | **100.0%** | **+3.8 pp** | +| Intermediate success | 81.0% | **87.0%** | **+6.0 pp** | +| Warmup success | 96.0% | 90.2% | −5.8 pp | +| Expert success | 22.2% | 22.2% | flat | +| Drift repair rate | 22.2% | 22.2% | flat | +| Destructive-action fail rate | 15.1% | 14.7% | −0.4 pp | +| Steps to solve | 1.45 | 1.55 | +0.10 | + +> ![SFT vs GRPO metrics grid](docs/figures/sft_vs_grpo_metrics_grid.png) +> ![SFT vs GRPO by tier](docs/figures/sft_vs_grpo_by_tier.png) + +**Honest reading:** the 35-step GRPO run preserves the SFT gains and modestly improves the middle tiers (beginner +3.8 pp, intermediate +6.0 pp) — but does not crack the **expert-tier bottleneck** (22% success on SRE / drift / security-posture tasks). With longer GRPO runs and more curriculum exposure to expert tasks, this is the next gain to chase. The full episode-level data is in [out_grpo/grpo_multi_step.json](out_grpo/grpo_multi_step.json). + +### GRPO training curves + +Per-step training signals from the final 35-step GRPO run ([out_grpo/final_grpo/checkpoint-35/trainer_state.json](out_grpo/final_grpo/checkpoint-35/trainer_state.json)): + +> ![GRPO final per-step training signals](docs/figures/grpo_final_per_step.png) +> ![GRPO env reward over training](docs/figures/grpo_reward_curve.png) + +Optuna search across 4 trials picked the final config: + +> ![GRPO Optuna trial comparison](docs/figures/grpo_optuna_trials_comparison.png) +> ![GRPO Optuna parameter importances](docs/figures/grpo_optuna_importances.png) +> ![GRPO Optuna optimization history](docs/figures/grpo_optuna_history.png) + +### Qualitative rollouts (post-GRPO) + +One sample episode per tier from [out_grpo/qualitative_rollouts.json](out_grpo/qualitative_rollouts.json): + +> ![Qualitative rollouts on representative tasks](docs/figures/qualitative_rollouts.png) + +--- + +## 12. Repository map + +| Path | Purpose | Sub-README | +|--------------------------------|--------------------------------------------------------------------|-----------------------------------------| +| [server/](server/) | OpenEnv FastAPI server, env logic, services, web playground | [server/README.md](server/README.md) | +| [train/](train/) | SFT and GRPO training notebooks | [train/README.md](train/README.md) | +| [data/](data/) | SFT dataset, base-model selection, eval harness | [data/README.md](data/README.md) · [MODEL_EVALUATION.md](data/sft/MODEL_EVALUATION.md) | +| [compare/](compare/) | Base vs SFT side-by-side benchmark | [compare/README.md](compare/README.md) | +| [scripts/](scripts/) | Parallel-rollout architecture + multi-connection demo | [scripts/README.md](scripts/README.md) | +| [aws_infra/](aws_infra/) | Vendored MiniStack simulator (git subtree) | [aws_infra/README.md](aws_infra/README.md) | +| [out/](out/) | Reference SFT training output (Optuna study, baseline + post-train metrics, plots, final adapter checkpoints) | (see [train/README.md §7](train/README.md#7-logging-and-artifacts)) | +| [out_grpo/](out_grpo/) | Reference GRPO training output (Optuna study, baseline + post-train multi-step eval, qualitative rollouts, final adapter, 10 ready plots) | (see [train/README.md §7](train/README.md#7-logging-and-artifacts)) | +| [tests/](tests/), [tests_tasks/](tests_tasks/) | Unit + tier-integration test suites | (see [§14](#14-testing)) | +| [models.py](models.py) | Pydantic data models for action/observation/task | (inline §6) | +| [client.py](client.py) | OpenEnv HTTP/WebSocket client wrapper | — | +| [inference.py](inference.py) | Single-model agent loop (matches RL eval mode of `compare/`) | — | +| [train_grpo.py](train_grpo.py) | GRPO trainer (1,283 LOC) — `MultiTurnEnvPool`, Optuna, plotting | (see [train/README.md](train/README.md)) | +| [aws_rl_env_colab.ipynb](aws_rl_env_colab.ipynb) | Colab driver for the full training pipeline | — | +| [docs/figures/](docs/figures/) | All README graphs and screenshots | — | --- -## Curriculum Stats API +## 13. Configuration & Running + +### Docker (recommended) + +```bash +make docker-build # build the image +make docker-run # foreground on :8000 +make docker-run-detach # background +make docker-health # liveness probe +``` + +### Local + +```bash +make install-all # uv sync + install aws_infra (MiniStack) editable +make run # starts MiniStack pool + FastAPI server +``` + +### OpenEnv deployment -The curriculum exposes detailed training progress: +```bash +make openenv-validate # validate config +make openenv-build # build environment +make openenv-push # push to HuggingFace Spaces +``` + +### Environment variables + +| Variable | Default | Description | +|-------------------------------------|--------------------------|-------------------------------------------------------------------| +| `AWS_INFRA_URL` | `http://localhost:4566` | MiniStack endpoint (used when `POOL_SIZE=1`) | +| `AWS_RL_ENV_POOL_SIZE` | `1` | **Server-side MiniStack pool size; set to 8 for GRPO training** | +| `AWS_RL_ENV_MINISTACK_BASE_PORT` | `4566` | First MiniStack port; pool covers `[BASE, BASE + POOL_SIZE)` | +| `BACKEND_TYPE` | `simulator` | `simulator` (MiniStack) or `aws` (real AWS, no pool) | +| `AWS_ACCESS_KEY_ID` | `test` | AWS credentials (any value works for the simulator) | +| `AWS_SECRET_ACCESS_KEY` | `test` | AWS credentials (any value works for the simulator) | +| `AWS_DEFAULT_REGION` | `us-east-1` | AWS region | +| `MAX_STEPS` | `15` | Max steps per episode | +| `API_BASE_URL` | — | LLM API endpoint for [inference.py](inference.py) | +| `MODEL_NAME` | — | LLM model name for [inference.py](inference.py) | +| `HF_TOKEN` | — | HuggingFace token (dataset/adapter access, push) | +| `TEMPERATURE` | `0.7` | LLM sampling temperature | + +### Curriculum stats API ```python curriculum.get_stats() @@ -609,10 +628,98 @@ curriculum.get_stats() --- -## Links +## 14. Testing + +The test suite covers both isolated unit logic and end-to-end task execution against MiniStack. + +### Unit tests — [tests/](tests/) + +```bash +pytest tests/ -v +``` + +| File | Covers | +|----------------------------------------------------------------------------------------------|-----------------------------------------------------------------| +| [test_aws_rl_env_environment.py](tests/test_aws_rl_env_environment.py) | Environment lifecycle, reset/step semantics, reward integration | +| [test_task_grader.py](tests/test_task_grader.py) | All 5 grading strategies, partial progress, penalties, bonuses | +| [test_resource_verifier.py](tests/test_resource_verifier.py) | Per-service ground-truth verification (20+ services) | +| [test_episode_tracker.py](tests/test_episode_tracker.py) | Command parsing, dedup, monotonic progress, rollback detection | +| [test_episode_context.py](tests/test_episode_context.py) | Per-episode context lifecycle | +| [test_drift_engine.py](tests/test_drift_engine.py) | Random drift selection, mutation application | +| [test_hint_provider.py](tests/test_hint_provider.py) | Three-level progressive hints, decay computation | +| [test_environment_designer.py](tests/test_environment_designer.py) | Setup-command provisioning | +| [test_pool.py](tests/test_pool.py) | Server-side `MiniStackPool` acquire/release, exhaustion | +| [test_grpo_pool.py](tests/test_grpo_pool.py) | Client-side `GrpoPool` connect/close, all-or-nothing rollback | + +### Tier integration tests — [tests_tasks/](tests_tasks/) + +```bash +pytest tests_tasks/ -v +``` + +134 tasks exercised end-to-end: +| File | Tasks | +|-----------------------------------------------------------------------------------------------------|------:| +| [test_warmup_tasks.py](tests_tasks/test_warmup_tasks.py) | 25 | +| [test_beginner_tasks.py](tests_tasks/test_beginner_tasks.py) | 25 | +| [test_intermediate_tasks.py](tests_tasks/test_intermediate_tasks.py) | 25 | +| [test_advanced_tasks.py](tests_tasks/test_advanced_tasks.py) | 25 | +| [test_expert_tasks.py](tests_tasks/test_expert_tasks.py) | 24 | +| [test_drift_tasks.py](tests_tasks/test_drift_tasks.py) | 9 | +| **Total** | **133** | + +These tests double as the source of truth for canonical solutions used by the SFT dataset generator (extracted via AST — see [data/README.md §1](data/README.md#1-sft-dataset-generation)). + +--- + +## 15. Tech stack + +- **Python 3.12**, [`uv`](https://github.com/astral-sh/uv) for dependency management, multi-stage Docker +- **FastAPI**, **OpenEnv** (HTTP + WebSocket env protocol), **uvicorn** +- **TRL ≥ 0.21** (`GRPOTrainer`, `GRPOConfig`) +- **PEFT** (LoRA), **Unsloth** (4-bit quantized base, fused training kernels) +- **Transformers ≥ 4.45**, **datasets ≥ 2.20**, **HuggingFace Hub ≥ 0.24** +- **Optuna ≥ 3.6** (TPE sampler, SQLite study storage) +- **asyncio** + **websockets** + **httpx** (parallel rollout orchestration) +- **MiniStack** (vendored at [aws_infra/](aws_infra/), 34 AWS services) +- **AWS CLI v2** (subprocess invocation against MiniStack endpoint) +- **matplotlib**, **plotly** (training curves, Optuna visualizations) +- **pytest** (16 test files, ~250 KB of test code) + +--- + +## 16. Links + +- **Live demo**: [sizzing-aws-rl-env.hf.space/web](https://sizzing-aws-rl-env.hf.space/web) +- **HF Space**: [huggingface.co/spaces/Sizzing/aws_rl_env](https://huggingface.co/spaces/Sizzing/aws_rl_env) +- **API docs**: [/docs](https://sizzing-aws-rl-env.hf.space/docs) · [/redoc](https://sizzing-aws-rl-env.hf.space/redoc) +- **SFT adapter**: [Sizzing/aws-rl-sft-qwen25coder3b-adapter](https://huggingface.co/Sizzing/aws-rl-sft-qwen25coder3b-adapter) +- **Dataset**: [Sizzing/aws-rl-sft](https://huggingface.co/datasets/Sizzing/aws-rl-sft) - **GitHub**: [github.com/udaykiranpadhy/aws-rl-env](https://github.com/udaykiranpadhy/aws-rl-env) -- **Hugging Face Space**: [huggingface.co/spaces/Sizzing/aws_rl_env](https://huggingface.co/spaces/Sizzing/aws_rl_env) -- **API Reference**: [/docs](https://sizzing-aws-rl-env.hf.space/docs) -- **ReDoc**: [/redoc](https://sizzing-aws-rl-env.hf.space/redoc) - **Portfolio**: [portfolio.udaykp.dev](https://portfolio.udaykp.dev) +- **Colab**: + +--- + +## 17. Acknowledgments + +- **MiniStack** — vendored at [aws_infra/](aws_infra/). Upstream license preserved. Custom modifications attributable to commits `a648c3a`, `a00e981`; periodic upstream syncs `af2e945`, `579597b`. +- **OpenEnv** — environment protocol and Python client framework. +- **TRL** (HuggingFace) — `GRPOTrainer` implementation. +- **Unsloth** — 4-bit quantized model loaders + fused training kernels. +- **AWS service icons** in [server/static/img/aws/](server/static/img/aws/) — used in the web playground. + +--- + +## Sub-README index + +For deep technical detail on any subsystem: + +- [server/README.md](server/README.md) — environment internals (curriculum, reward shaping, anti-hacking, chaos, drift, MiniStack-fork detail) +- [train/README.md](train/README.md) — SFT + GRPO training pipeline (LoRA config, Optuna search, multi-turn rollouts) +- [scripts/README.md](scripts/README.md) — parallel-rollout architecture (3 pool layers, all-or-nothing connect, concurrency safety) +- [data/README.md](data/README.md) — dataset generation (5 trajectory types, AST extraction) + base-model selection summary +- [data/sft/MODEL_EVALUATION.md](data/sft/MODEL_EVALUATION.md) — full 11-model benchmark report +- [compare/README.md](compare/README.md) — base vs SFT comparison harness +- [aws_infra/README.md](aws_infra/README.md) — vendored MiniStack upstream documentation (81 KB) diff --git a/aws_rl_env_colab.ipynb b/aws_rl_env_colab.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..c1f538215a8d6ad5a1efc60b5144e09115c42a99 --- /dev/null +++ b/aws_rl_env_colab.ipynb @@ -0,0 +1,233 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "7b80aed985f7", + "metadata": {}, + "source": [ + "# AWS RL Env \u2014 GRPO Training (multi-turn + parallel envs)\n\nThis notebook trains a Qwen2.5-Coder-3B policy on the AWS RL environment using **GRPO** with:\n\n- **Multi-turn rollouts** \u2014 each task runs up to `MAX_TURNS` steps; each step is one `aws ...` command, the command's output is fed back into the next turn.\n- **Parallel environments** \u2014 `NUM_GENERATIONS` MiniStack-backed env sessions run concurrently, all rolling out the *same* curriculum-picked task.\n- **Curriculum** \u2014 `Curriculum.next_task()` picks one task per GRPO step; group-level reward feeds back via `Curriculum.record_result(...)` driving promotion + spaced repetition.\n- **Optuna** \u2014 TPE search over learning rate, KL coefficient, num_generations, temperature, top-p, LoRA rank, and max_turns. Frozen held-out validation tasks evaluate each trial.\n\nThe heavy lifting lives in [`train_grpo.py`](./train_grpo.py); this notebook is a thin driver that mirrors `kube-sre-gym/kube_sre_gym_colab.ipynb`.\n" + ] + }, + { + "cell_type": "markdown", + "id": "651b17a160c4", + "metadata": {}, + "source": [ + "## 1 - Install dependencies" + ] + }, + { + "cell_type": "code", + "id": "41cb8a624696", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "%pip install -q --upgrade pip\n%pip install -q \\\n \"trl>=0.21\" \\\n \"transformers>=4.45\" \\\n \"peft>=0.13\" \\\n \"datasets>=2.20\" \\\n \"huggingface_hub>=0.24\" \\\n \"websockets>=13\" \\\n \"openenv-core[core]>=0.2.2\" \\\n \"pyyaml>=6.0\" \\\n \"matplotlib\" \\\n \"optuna>=3.6\" \\\n \"plotly\" \\\n \"kaleido\" \\\n \"httpx\"\n%pip install -q \"unsloth @ git+https://github.com/unslothai/unsloth.git\"\n" + ] + }, + { + "cell_type": "markdown", + "id": "23979a7833e6", + "metadata": {}, + "source": [ + "## 2 - Configuration\n\nEverything you'll typically tune lives in this cell." + ] + }, + { + "cell_type": "code", + "id": "6b425cb11474", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "import os\nfrom pathlib import Path\nfrom datetime import datetime\n\n# --- Environment server ---\nENV_URL = os.environ.get(\"AWS_RL_ENV_URL\", \"http://localhost:8000\")\n\n# --- Model & adapter ---\nMODEL_ID = \"unsloth/Qwen2.5-Coder-3B-Instruct-bnb-4bit\"\nSFT_ADAPTER = \"Sizzing/aws-rl-sft-qwen25coder3b-adapter\" # set to None to skip SFT init\nHUB_REPO = None # e.g. \"your-org/aws-rl-grpo-qwen25coder3b\"\n\n# --- Training defaults (Optuna may override) ---\nNUM_GENERATIONS = 8 # parallel envs == GRPO group size\nMAX_TURNS = 6 # multi-turn cap per episode\nMAX_STEPS = 200 # GRPO optimizer steps\nMAX_TOTAL_TOKENS = 4096 # token budget per episode (anti-OOM)\nMAX_PROMPT_LEN = 2048\nMAX_COMPL_LEN = 256\n\n# --- Optuna ---\nRUN_OPTUNA = True\nN_TRIALS = 6\nTRIAL_MAX_STEPS = 30\nVAL_TASKS_PER_TIER = 2\n\n# --- Output ---\nTIMESTAMP = datetime.now().strftime(\"%Y-%m-%d_%H-%M-%S\")\nOUTPUT_DIR = Path(f\"outputs/aws-rl-grpo-{TIMESTAMP}\")\nOUTPUT_DIR.mkdir(parents=True, exist_ok=True)\n\nprint(f\"Env URL : {ENV_URL}\")\nprint(f\"Model : {MODEL_ID}\")\nprint(f\"SFT adapter: {SFT_ADAPTER}\")\nprint(f\"Output dir : {OUTPUT_DIR}\")\nprint(f\"Optuna : {'on' if RUN_OPTUNA else 'off'} ({N_TRIALS} trials, {TRIAL_MAX_STEPS} steps each)\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "df5456a79dea", + "metadata": {}, + "source": [ + "## 3 - Authenticate to HF Hub (and optionally W&B)" + ] + }, + { + "cell_type": "code", + "id": "860228b6c968", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "import os\n\n# HF Hub\ntry:\n from google.colab import userdata\n os.environ[\"HF_TOKEN\"] = userdata.get(\"HF_TOKEN\")\nexcept (ImportError, KeyError, ModuleNotFoundError):\n pass\nif os.environ.get(\"HF_TOKEN\"):\n from huggingface_hub import login\n login(token=os.environ[\"HF_TOKEN\"], add_to_git_credential=False)\n print(\"HF Hub: logged in\")\nelse:\n print(\"HF Hub: HF_TOKEN not set (push_to_hub will be disabled)\")\n\n# Optional: W&B\ntry:\n from google.colab import userdata\n os.environ.setdefault(\"WANDB_API_KEY\", userdata.get(\"WANDB_API_KEY\"))\nexcept (ImportError, KeyError, ModuleNotFoundError):\n pass\n" + ] + }, + { + "cell_type": "markdown", + "id": "e7918896aa17", + "metadata": {}, + "source": [ + "## 4 - Smoke-test the env URL" + ] + }, + { + "cell_type": "code", + "id": "1356c4b20164", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "import httpx\n\nresp = httpx.get(f\"{ENV_URL}/health\", timeout=10.0)\nprint(f\"GET {ENV_URL}/health -> {resp.status_code}\")\nprint(resp.text[:500])\nassert resp.status_code == 200, \"env server is not responding \u2014 start it before training\"\n" + ] + }, + { + "cell_type": "markdown", + "id": "32b12707b0e9", + "metadata": {}, + "source": [ + "## 5 - Imports from `train_grpo`\n\nAll heavy logic (rollout, env pool, reward funcs, Optuna search, training loop) lives in `train_grpo.py` at the repo root." + ] + }, + { + "cell_type": "code", + "id": "0e989d6fe640", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "import json\nimport logging\nfrom pathlib import Path\n\nfrom train_grpo import (\n SYSTEM_PROMPT,\n DEFAULT_CFG,\n SamplingCfg,\n load_policy,\n MultiTurnEnvPool,\n plot_rewards,\n pick_validation_task_ids,\n evaluate_on_validation,\n optuna_search,\n run_training,\n)\n\nlogging.basicConfig(level=logging.INFO, format=\"%(asctime)s %(levelname)s %(name)s %(message)s\")\nprint(\"System prompt (first 200 chars):\")\nprint(SYSTEM_PROMPT[:200])\n" + ] + }, + { + "cell_type": "markdown", + "id": "f82fff889024", + "metadata": {}, + "source": [ + "## 6 - Pick fixed validation task ids\n\nA frozen list of tasks (k per tier) used as the held-out set across **all** Optuna trials and post-training comparisons. Stored to disk for reproducibility." + ] + }, + { + "cell_type": "code", + "id": "94dd77b1304a", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "val_task_ids = pick_validation_task_ids(k_per_tier=VAL_TASKS_PER_TIER, seed=42)\nval_path = OUTPUT_DIR / \"val_task_ids.json\"\nval_path.write_text(json.dumps(val_task_ids))\nprint(f\"Validation task ids ({len(val_task_ids)}): {val_task_ids}\")\nprint(f\"Saved to {val_path}\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "ee0704afd204", + "metadata": {}, + "source": [ + "## 7 - Optuna hyperparameter search\n\nSet `RUN_OPTUNA=False` in the config cell to skip and use `DEFAULT_CFG`." + ] + }, + { + "cell_type": "code", + "id": "bf36301c7db8", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "best_cfg = None\n\nif RUN_OPTUNA:\n study = optuna_search(\n n_trials=N_TRIALS,\n trial_max_steps=TRIAL_MAX_STEPS,\n val_task_ids=val_task_ids,\n base_model=MODEL_ID,\n sft_adapter=SFT_ADAPTER,\n env_url=ENV_URL,\n output_dir=OUTPUT_DIR,\n max_total_tokens=MAX_TOTAL_TOKENS,\n max_completion_length=MAX_COMPL_LEN,\n max_prompt_length=MAX_PROMPT_LEN,\n )\n best_cfg = {**DEFAULT_CFG, **dict(study.best_params)}\n print(f\"\\nBest objective : {study.best_value:.4f}\")\n print(f\"Best params : {dict(study.best_params)}\")\nelse:\n print(\"Skipping Optuna; using DEFAULT_CFG.\")\n best_cfg = dict(DEFAULT_CFG)\n\nwith open(OUTPUT_DIR / \"best_cfg.json\", \"w\") as f:\n json.dump(best_cfg, f, indent=2)\nprint(f\"Saved best_cfg -> {OUTPUT_DIR / 'best_cfg.json'}\")\n" + ] + }, + { + "cell_type": "code", + "id": "f0323086fc29", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "# Optional Optuna visualisations (skip silently if Optuna wasn't run)\nif RUN_OPTUNA:\n try:\n import optuna.visualization as vis\n import plotly.io as pio\n pio.renderers.default = \"notebook\"\n vis.plot_optimization_history(study).show()\n vis.plot_param_importances(study).show()\n except Exception as e:\n print(f\"(visualisation skipped: {e})\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "ecf4bdc095e0", + "metadata": {}, + "source": [ + "## 8 - Final GRPO training pass with the best config" + ] + }, + { + "cell_type": "code", + "id": "80fcd2297776", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "print(f\"Final config: {best_cfg}\")\n\n# Override via best_cfg, falling back to top-of-notebook defaults\nNUM_GENERATIONS = int(best_cfg[\"num_generations\"])\nMAX_TURNS = int(best_cfg[\"max_turns\"])\n\nrun_training(\n cfg=best_cfg,\n base_model=MODEL_ID,\n sft_adapter=SFT_ADAPTER,\n env_url=ENV_URL,\n output_dir=OUTPUT_DIR,\n max_steps=MAX_STEPS,\n max_total_tokens=MAX_TOTAL_TOKENS,\n max_completion_length=MAX_COMPL_LEN,\n max_prompt_length=MAX_PROMPT_LEN,\n push_to_hub=False,\n hub_repo=HUB_REPO,\n)\n" + ] + }, + { + "cell_type": "markdown", + "id": "b2305c48d920", + "metadata": {}, + "source": [ + "## 9 - Reward curves\n\n`plot_rewards` reads `reward_log.csv` (written incrementally by `EpisodeLogger`), so the chart is meaningful even if training was interrupted." + ] + }, + { + "cell_type": "code", + "id": "f35ef4ee8206", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "from IPython.display import Image, display\n\nreward_csv = OUTPUT_DIR / \"reward_log.csv\"\nplot_path = OUTPUT_DIR / \"reward_plot.png\"\nplot_rewards(reward_csv, plot_path)\nif plot_path.exists():\n display(Image(filename=str(plot_path)))\nelse:\n print(\"No plot generated (no rows in reward_log.csv).\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "fb7ed0eab6e6", + "metadata": {}, + "source": [ + "## 10 - Quick post-training validation re-run (optional)\n\nRun the same held-out tasks again on the freshly trained adapter and compare to whatever each Optuna trial achieved on the same set." + ] + }, + { + "cell_type": "code", + "id": "9fd1d1dd95ef", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "# Re-load policy in inference mode\nmodel, tokenizer = load_policy(MODEL_ID, SFT_ADAPTER, trainable=False)\npool = MultiTurnEnvPool(ENV_URL, size=1)\npool.start()\n\nsampling = SamplingCfg(\n temperature=float(best_cfg[\"temperature\"]),\n top_p=float(best_cfg[\"top_p\"]),\n max_new_tokens=MAX_COMPL_LEN,\n max_prompt_length=MAX_PROMPT_LEN,\n)\n\ntry:\n metrics = evaluate_on_validation(\n model=model,\n tokenizer=tokenizer,\n pool=pool,\n val_task_ids=val_task_ids,\n system_prompt=SYSTEM_PROMPT,\n max_turns=int(best_cfg[\"max_turns\"]),\n max_total_tokens=MAX_TOTAL_TOKENS,\n sampling=sampling,\n )\n print(f\"Post-training validation metrics: {metrics}\")\n with open(OUTPUT_DIR / \"post_train_val.json\", \"w\") as f:\n json.dump(metrics, f, indent=2)\nfinally:\n pool.close()\n" + ] + }, + { + "cell_type": "markdown", + "id": "fb00a27401a8", + "metadata": {}, + "source": [ + "## 11 - Push to Hugging Face Hub (optional)" + ] + }, + { + "cell_type": "code", + "id": "601184d3ddf5", + "metadata": {}, + "execution_count": null, + "outputs": [], + "source": [ + "# Uncomment to push the trained adapter:\n#\n# from huggingface_hub import create_repo, upload_folder\n# create_repo(HUB_REPO, exist_ok=True, private=False)\n# upload_folder(folder_path=str(OUTPUT_DIR), repo_id=HUB_REPO, repo_type=\"model\")\n# print(f\"Pushed: https://huggingface.co/{HUB_REPO}\")\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python (aws-rl-env)", + "language": "python", + "name": "aws-rl-env" + }, + "language_info": { + "name": "python", + "version": "3.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/compare/README.md b/compare/README.md new file mode 100644 index 0000000000000000000000000000000000000000..1066b64e1e2b5820a0c8a519be144bd4d921ef85 --- /dev/null +++ b/compare/README.md @@ -0,0 +1,230 @@ +# `compare/` — Base Model vs SFT Adapter Benchmark + +[← back to main README](../README.md) + +This directory holds the side-by-side benchmark that answers the only question that ultimately matters: **did SFT actually make the model better at the task?** + +The benchmark compares the base [Qwen2.5-Coder-3B-Instruct](https://huggingface.co/unsloth/Qwen2.5-Coder-3B-Instruct-bnb-4bit) against our published SFT adapter [Sizzing/aws-rl-sft-qwen25coder3b-adapter](https://huggingface.co/Sizzing/aws-rl-sft-qwen25coder3b-adapter) under two evaluation modes — fast static dataset eval and slow live-environment eval. Both write structured metrics so the deltas are explicit. + +> ![Dataset comparison: base vs SFT (per-row scores)](../docs/figures/compare_dataset.png) +> ![RL-env comparison: base vs SFT (per-episode rewards)](../docs/figures/compare_rl_env.png) + +--- + +## Table of contents + +1. [What's compared](#1-whats-compared) +2. [Two evaluation modes](#2-two-evaluation-modes) +3. [Methodology](#3-methodology) +4. [Metrics reported](#4-metrics-reported) +5. [How to run](#5-how-to-run) +6. [Reading the results](#6-reading-the-results) +7. [Files in this directory](#7-files-in-this-directory) + +--- + +## 1. What's compared + +| | Base | SFT | +|---|---|---| +| **Model** | `unsloth/Qwen2.5-Coder-3B-Instruct-bnb-4bit` | Same base + LoRA adapter | +| **Adapter** | None | `Sizzing/aws-rl-sft-qwen25coder3b-adapter` | +| **Training data** | Pretraining + Qwen instruction tuning | + 1,500 rows from [data/sft/aws_rl_sft.train.jsonl](../data/sft/aws_rl_sft.train.jsonl) | +| **Inference** | Same prompt template, same temperature | Identical | + +The only variable is the LoRA adapter. Same base, same prompts, same decoding parameters, same evaluation set. + +--- + +## 2. Two evaluation modes + +The notebook runs two separate evaluations because they answer different questions: + +### Dataset eval (static) + +| Question | Does the model emit the *canonical* command for held-out prompts, one-shot? | +|-----------|-----------------------------------------------------------------------------| +| Speed | Fast (~minutes) | +| Needs | HF token + dataset access; **no env server** | +| Source | [data/sft/aws_rl_sft.val.jsonl](../data/sft/aws_rl_sft.val.jsonl) (150 held-out rows) | +| Verifies | Format correctness + command-token match against canonical | + +This is the same kind of pattern-matching benchmark as [data/sft/MODEL_EVALUATION.md](../data/sft/MODEL_EVALUATION.md) — fast and deterministic. Useful as a regression check. + +### RL env eval (live) + +| Question | Can the model actually *solve* a task end-to-end against a live environment? | +|-----------|------------------------------------------------------------------------------| +| Speed | Slow (~tens of minutes per model) | +| Needs | Dataset eval above + a running env server (HF Space or local) | +| Source | Same val tasks, but exercised through `client.AwsRlEnv` round-trips | +| Verifies | Multi-step task completion, partial progress, reward shaping, hint usage | + +This is closer to what training optimizes for. A model can score well on dataset eval (right command on step 1) but fail RL env eval (can't recover from a step 1 typo, can't continue past the first turn). Both signals matter. + +--- + +## 3. Methodology + +### Dataset eval + +1. Load `Sizzing/aws-rl-sft` dataset from HF Hub +2. For each row in `val`, build the prompt from `messages[:-1]` (system + user, drop assistant) +3. Generate the model's response (`max_new_tokens=128`, deterministic decoding) +4. **Extract the AWS CLI line**: strip markdown fences, find first line starting with `aws ` +5. Score against `messages[-1].content` (the canonical assistant response): + - Format OK (extracted line starts with `aws`) + - Service match (same first word after `aws`) + - Operation match (same first two words) + - Exact match (full token-for-token equality) + +This mirrors the methodology in [eval_lm_studio_models.py](../data/eval_lm_studio_models.py); the same scoring functions are reused. + +### RL env eval + +1. Connect to the running env at `ENV_BASE_URL` (default: an HF Space; can be overridden to local) +2. For each val task, run a full episode (up to `MAX_STEPS=15` turns): + - Build the prompt from system + task + observation history (matches [inference.py](../inference.py)) + - Generate one AWS CLI command per turn + - Step the environment, record `reward`, `task_achieved`, `partial_progress` +3. Aggregate per-episode metrics + +The agent loop is identical to the training-time `rollout_one_episode` in [train_grpo.py](../train_grpo.py) — same prompt structure, same generation parameters, same termination logic. So the RL env eval is genuinely measuring "what would this model do during a GRPO rollout". + +--- + +## 4. Metrics reported + +### Dataset eval + +| Metric | Definition | +|----------------|-----------------------------------------------------------| +| `format_ok` | % of responses where the extracted line starts with `aws ` | +| `svc_match` | % matching the canonical service | +| `op_match` | % matching service + operation | +| `exact_match` | % matching the full canonical command token-for-token | + +### RL env eval (per episode) + +| Metric | Definition | +|-------------------------|------------------------------------------------------------------| +| `avg_episode_reward` | Mean total reward accumulated per episode (sum of step rewards) | +| `completion_rate` | % of episodes ending in `task_achieved=True` | +| `avg_steps_to_complete` | Mean steps used by completed episodes (lower = more efficient) | +| `avg_max_progress` | Mean of the highest `partial_progress` reached per episode | +| `hint_usage_rate` | % of episodes where the agent requested at least one hint | +| `format_failure_rate` | % of agent commands that failed the `aws ` prefix gate | + +The notebook produces per-tier breakdowns of all six metrics so you can see where SFT helped most (typically: warmup format-locking goes from ~85% → 100%; intermediate completion goes from a small base to a meaningful fraction). + +--- + +## 5. How to run + +### Prerequisites + +- HuggingFace token (`HF_TOKEN`) — needed to load the dataset and adapter +- A running env server — either: + - Your own HF Space deployment (set `ENV_BASE_URL` accordingly), or + - Local server: `make run` from the repo root, then `ENV_BASE_URL=http://localhost:8000` +- A GPU runtime (Colab T4 or better, A10/A100 ideal) + +### Notebooks + +| Notebook | Open in Colab | +|---------------------------------------------------------------------|--------------------------------| +| [compare_base_vs_sft.ipynb](compare_base_vs_sft.ipynb) (clean) | | +| [compare_base_vs_sft_with_outputs.ipynb](compare_base_vs_sft_with_outputs.ipynb) (with outputs) | | + +The two notebooks are functionally identical; the second has cell outputs preserved (18 display widgets, 26 stdout cells) for offline inspection. + +### Running steps + +1. Open the notebook in Colab (or local Jupyter) +2. Edit the **CONFIG** cell: + ```python + BASE_MODEL = "unsloth/Qwen2.5-Coder-3B-Instruct-bnb-4bit" + SFT_ADAPTER_REPO = "Sizzing/aws-rl-sft-qwen25coder3b-adapter" + DATASET_REPO = "Sizzing/aws-rl-sft" + ENV_BASE_URL = "https://your-hf-space.hf.space" # or local + ``` +3. Run all cells. Part 1 (dataset eval) finishes first; Part 2 (RL env eval) is the slow one. +4. Compare the per-metric deltas between base and SFT. + +--- + +## 6. Reading the results + +### Actual numbers from the run + +From the saved outputs of [compare_base_vs_sft_with_outputs.ipynb](compare_base_vs_sft_with_outputs.ipynb): + +#### Dataset eval + +| Metric | Base | Base + SFT | Δ | +|---------------------------|:------:|:----------:|:----------:| +| `format_pct` | 33.3% | **100.0%** | **+66.7 pp** | +| `format_after_extract_pct`| 100.0% | 100.0% | 0 | +| `exact_pct` | 38.9% | **88.9%** | **+50.0 pp** | + +#### RL env eval (live multi-step agent loop) + +| Metric | Base | Base + SFT | Δ | +|-------------------------|:-----:|:----------:|:---------:| +| `avg_episode_reward` | 1.187 | **2.011** | **+0.824** | +| `reward_std` | 1.137 | 1.908 | +0.771 | +| `avg_steps` | 8.600 | **5.733** | **−2.867** | +| `avg_reward_per_step` | 0.138 | **0.351** | **+0.213** | + +> ![RL-env eval: base vs SFT](../docs/figures/rl_env_eval_base_vs_sft.png) + +The agent **earns more reward per episode while taking fewer steps** — exactly what good fine-tuning should produce. Reward-per-step jumps 2.5× because (a) the agent picks the right command more often (fewer wasted steps), and (b) format compliance is now perfect (no more `aws help` fallbacks). + +#### Per-tier success in the RL eval + +From the notebook's per-rollout traces (3 episodes per tier × 5 tiers = 15 episodes per model): + +| Tier | Base (rollouts ✓ / 3) | Base + SFT (rollouts ✓ / 3) | +|--------------|:---------------------:|:----------------------------:| +| warmup | 3 | 3 | +| beginner | 3 | 3 | +| intermediate | 1 | 3 | +| advanced | 0 | 1 | +| expert | 0 | 2 | + +SFT moves the **success frontier** up two tiers — the base model could not finish a single advanced or expert episode, while SFT completes 2 of 3 expert tasks (S3 lockdown, IAM least-privilege variants) within 5 steps. + +### What counts as a meaningful delta? + +The val set is small (150 rows / ~10 unique tasks per RL eval), so individual percentage points have meaningful noise. Rules of thumb: + +| Delta size | Significance | +|------------|------------------------------------------------| +| ±2pp | Within noise — don't claim improvement | +| 5–10pp | Likely real, look at per-tier breakdown | +| >10pp | Almost certainly real | + +The deltas above (66.7 pp, 50.0 pp on dataset; 0.82 reward / −2.9 steps on RL eval) are well above the noise floor. + +### Going further with GRPO + +Once the SFT adapter is in hand, the same comparison can be re-run against the GRPO adapter (`out_grpo/grpo_adapter/`). Multi-step results from the GRPO run are documented in the [main README §11](../README.md#11-results--benchmarks); the short version is GRPO@35-steps preserves SFT performance and modestly improves the middle tiers, while the expert tier remains the bottleneck. + +--- + +## 7. Files in this directory + +| File | Purpose | +|-----------------------------------------------------------------------------------------------------|------------------------------------------------------------------| +| [compare_base_vs_sft.ipynb](compare_base_vs_sft.ipynb) | Side-by-side dataset + RL env benchmark — clean version | +| [compare_base_vs_sft_with_outputs.ipynb](compare_base_vs_sft_with_outputs.ipynb) | Same notebook with cell outputs preserved (18 display widgets) | + +--- + +## See also + +- [Main README](../README.md) — top-level overview, results section +- [data/README.md](../data/README.md) — dataset that drives this comparison +- [data/sft/MODEL_EVALUATION.md](../data/sft/MODEL_EVALUATION.md) — base-model selection benchmark (same scoring functions reused here) +- [train/README.md](../train/README.md) — how the SFT adapter being benchmarked here was produced +- [inference.py](../inference.py) — single-model agent loop (the prototype the RL eval mode is modeled after) diff --git a/compare/compare_base_vs_sft.ipynb b/compare/compare_base_vs_sft.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..363f8e6d47cc4b6ba3f86ef9cc2524db140ab3c5 --- /dev/null +++ b/compare/compare_base_vs_sft.ipynb @@ -0,0 +1,7364 @@ +{ + "nbformat": 4, + "nbformat_minor": 5, + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "name": "python", + "version": "3.10.0" + }, + "colab": { + "provenance": [], + "gpuType": "T4" + }, + "accelerator": "GPU", + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "3cf95de334a14af9b7274dee96b2f20d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_41a765ae42f142a5aaf0163612bbe490", + "IPY_MODEL_0f614193015744f2a0263aa13681b411", + "IPY_MODEL_68d44bd4ff9a439f958573c8ec16405b" + ], + "layout": "IPY_MODEL_c0c12b0fc46f4b9f8ea2af23e194da23" + } + }, + "41a765ae42f142a5aaf0163612bbe490": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_796833bcdc3845849bf4b44da6379fcc", + "placeholder": "​", + "style": "IPY_MODEL_b22885fcbf3147509191939f5de83602", + "value": "README.md: " + } + }, + "0f614193015744f2a0263aa13681b411": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_cc427e51ea1446aaa74d6f24cb17d043", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a8816b70cd9f409ba7acfacc2864c043", + "value": 1 + } + }, + "68d44bd4ff9a439f958573c8ec16405b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c71fef24bafe4b45896601a7ae144c2f", + "placeholder": "​", + "style": "IPY_MODEL_548cc14a659b4e6e9c217ff980e34608", + "value": " 4.89k/? [00:00<00:00, 314kB/s]" + } + }, + "c0c12b0fc46f4b9f8ea2af23e194da23": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "796833bcdc3845849bf4b44da6379fcc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b22885fcbf3147509191939f5de83602": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "cc427e51ea1446aaa74d6f24cb17d043": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "a8816b70cd9f409ba7acfacc2864c043": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "c71fef24bafe4b45896601a7ae144c2f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "548cc14a659b4e6e9c217ff980e34608": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9d1f05eb5d3b4bdba57d618f022eaa7b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_7ec0191160e04c5397c24bbad3d2b593", + "IPY_MODEL_bf317a89297c4265938863cc3f74ba8c", + "IPY_MODEL_616c3d44f0a64e22828c2e472a8c13bc" + ], + "layout": "IPY_MODEL_57cd591f5b3f4d6aa2e401dcb0c3c8fc" + } + }, + "7ec0191160e04c5397c24bbad3d2b593": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_51ad078171814b9ca022d88231cf6387", + "placeholder": "​", + "style": "IPY_MODEL_ed06bfd4c13f41598d5e10bbe6139eb8", + "value": "data/train-00000-of-00001.parquet: 100%" + } + }, + "bf317a89297c4265938863cc3f74ba8c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_62ba79bd0e2f47fcbb073cbe15ab2bf6", + "max": 1923495, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_62a7c1256a3d462ca1f58711b4985852", + "value": 1923495 + } + }, + "616c3d44f0a64e22828c2e472a8c13bc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0cf6a91ad33f4f0a94b890881658b5b2", + "placeholder": "​", + "style": "IPY_MODEL_5178b799d7404fd282f4e5016d616d14", + "value": " 1.92M/1.92M [00:00<00:00, 9.61MB/s]" + } + }, + "57cd591f5b3f4d6aa2e401dcb0c3c8fc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "51ad078171814b9ca022d88231cf6387": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ed06bfd4c13f41598d5e10bbe6139eb8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "62ba79bd0e2f47fcbb073cbe15ab2bf6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "62a7c1256a3d462ca1f58711b4985852": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "0cf6a91ad33f4f0a94b890881658b5b2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5178b799d7404fd282f4e5016d616d14": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "0d2747470d4947849c27775b43ecb54c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_fbc88709dcf84cfbb91d7efbb10e0b42", + "IPY_MODEL_cc4366820b234778b543af95146a4e92", + "IPY_MODEL_0fba0e0c04c14214ae58cdd3f65fd92f" + ], + "layout": "IPY_MODEL_4dae08a1f54842e49185c4402659df6f" + } + }, + "fbc88709dcf84cfbb91d7efbb10e0b42": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c795b9a1dc834f67ac44a568b9744ed7", + "placeholder": "​", + "style": "IPY_MODEL_1241be723444464fbb334b06d8208410", + "value": "data/validation-00000-of-00001.parquet: 100%" + } + }, + "cc4366820b234778b543af95146a4e92": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7f28dc39b40543d9b17bd8ad611e3623", + "max": 193593, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_2def96a8b6d646ef8801ce2c1e0a8d14", + "value": 193593 + } + }, + "0fba0e0c04c14214ae58cdd3f65fd92f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_96abbd4be45f4eef9587a795f10c73f9", + "placeholder": "​", + "style": "IPY_MODEL_6736d9704da04076a134426a47cb15c4", + "value": " 194k/194k [00:01<00:00, 965kB/s]" + } + }, + "4dae08a1f54842e49185c4402659df6f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c795b9a1dc834f67ac44a568b9744ed7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1241be723444464fbb334b06d8208410": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7f28dc39b40543d9b17bd8ad611e3623": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2def96a8b6d646ef8801ce2c1e0a8d14": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "96abbd4be45f4eef9587a795f10c73f9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6736d9704da04076a134426a47cb15c4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "617dcbb6224b49bb9b83dac185420e09": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_7c93228f55074cf78b1170001545f89d", + "IPY_MODEL_b1e2bcaf50124b14b7bc70fb403e68b8", + "IPY_MODEL_c36279d8d0774918812725c906a8af12" + ], + "layout": "IPY_MODEL_ebb9a1dea358429e9e166c470076d4ce" + } + }, + "7c93228f55074cf78b1170001545f89d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5bbbc6530c014b5296c181526d08cec0", + "placeholder": "​", + "style": "IPY_MODEL_8a2f80c0be5a47b994f6e091cb01d287", + "value": "data/reserve-00000-of-00001.parquet: 100%" + } + }, + "b1e2bcaf50124b14b7bc70fb403e68b8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fbb8cb04661945c782b1df5e423b37a0", + "max": 260654, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_94eb4cb08c8443098267d78b1665514e", + "value": 260654 + } + }, + "c36279d8d0774918812725c906a8af12": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f5eb0e8911ad46d19d1d76dfa55fb21c", + "placeholder": "​", + "style": "IPY_MODEL_1161e043c93c4671a8155dce8d9dd701", + "value": " 261k/261k [00:00<00:00, 1.30MB/s]" + } + }, + "ebb9a1dea358429e9e166c470076d4ce": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5bbbc6530c014b5296c181526d08cec0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8a2f80c0be5a47b994f6e091cb01d287": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "fbb8cb04661945c782b1df5e423b37a0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "94eb4cb08c8443098267d78b1665514e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "f5eb0e8911ad46d19d1d76dfa55fb21c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1161e043c93c4671a8155dce8d9dd701": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1dc1444225ce43a888350992cc7f0bbb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9ef9a30c556c4d9da3692fd8a829270f", + "IPY_MODEL_b14329f3b61447f788d6e836bf934c91", + "IPY_MODEL_6cff000d81e8431298609a9148cdb793" + ], + "layout": "IPY_MODEL_49de19f8c9e04603980b4a4a8c816545" + } + }, + "9ef9a30c556c4d9da3692fd8a829270f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4dca96c48eb64681b36a76b4f0b01b62", + "placeholder": "​", + "style": "IPY_MODEL_66f989e6acee487faf8f6cc453faa486", + "value": "Generating train split: 100%" + } + }, + "b14329f3b61447f788d6e836bf934c91": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_052ba95707274c42933cb13fc8ad078c", + "max": 1500, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_daf23f97138a44f49f8099d73a39b33b", + "value": 1500 + } + }, + "6cff000d81e8431298609a9148cdb793": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_741c77c00dd34486bd780369d2918d53", + "placeholder": "​", + "style": "IPY_MODEL_b6c49d1dbf184f86a4a94644340b9f90", + "value": " 1500/1500 [00:00<00:00, 29631.67 examples/s]" + } + }, + "49de19f8c9e04603980b4a4a8c816545": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4dca96c48eb64681b36a76b4f0b01b62": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "66f989e6acee487faf8f6cc453faa486": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "052ba95707274c42933cb13fc8ad078c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "daf23f97138a44f49f8099d73a39b33b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "741c77c00dd34486bd780369d2918d53": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b6c49d1dbf184f86a4a94644340b9f90": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c9572ada407547acb82b499b4aba9408": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_2f17b452a3f04d448beff33d60445e2e", + "IPY_MODEL_5cdf05f2225f499e8574ab64ec9a8766", + "IPY_MODEL_80d9e1dd1507439088c3d9d8c4c7b0ac" + ], + "layout": "IPY_MODEL_4e6c58ce96404281b880833f88e08413" + } + }, + "2f17b452a3f04d448beff33d60445e2e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_cd77111d0ee44ecaacb5159f68c88609", + "placeholder": "​", + "style": "IPY_MODEL_89604435feab456888553549728c15a7", + "value": "Generating validation split: 100%" + } + }, + "5cdf05f2225f499e8574ab64ec9a8766": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_66558440f90b42d99278658f7151f043", + "max": 150, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_188a00a386704c7887d139bc284ccc1a", + "value": 150 + } + }, + "80d9e1dd1507439088c3d9d8c4c7b0ac": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ceadf3915006459fb72ed9141c49dc2f", + "placeholder": "​", + "style": "IPY_MODEL_63b9d68de11b4fbfa5e8acaaa25b4c35", + "value": " 150/150 [00:00<00:00, 4766.72 examples/s]" + } + }, + "4e6c58ce96404281b880833f88e08413": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "cd77111d0ee44ecaacb5159f68c88609": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "89604435feab456888553549728c15a7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "66558440f90b42d99278658f7151f043": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "188a00a386704c7887d139bc284ccc1a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "ceadf3915006459fb72ed9141c49dc2f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "63b9d68de11b4fbfa5e8acaaa25b4c35": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f65560291a834aef846683d3909a9db6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9c1e0ff6a9094793905ddc191e95796d", + "IPY_MODEL_182361253eee49418048b01fbcf2672f", + "IPY_MODEL_8af925f00d3541958d318f43591bdd76" + ], + "layout": "IPY_MODEL_c0cdb510c34c4e27b8061a5b4e4b88fa" + } + }, + "9c1e0ff6a9094793905ddc191e95796d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ea1e771eea51498b9917da282d783427", + "placeholder": "​", + "style": "IPY_MODEL_39929719372644589a9baa7295fd5849", + "value": "Generating reserve split: 100%" + } + }, + "182361253eee49418048b01fbcf2672f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_79d5b6596f1b4ee5966b55dad97df3a2", + "max": 200, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_b49e779bf02c49bbb1f4eba5ac2dd1e2", + "value": 200 + } + }, + "8af925f00d3541958d318f43591bdd76": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e87a2309352248309f209b71dd050799", + "placeholder": "​", + "style": "IPY_MODEL_1e3372b4af51443f88050b77fedc5bef", + "value": " 200/200 [00:00<00:00, 5397.52 examples/s]" + } + }, + "c0cdb510c34c4e27b8061a5b4e4b88fa": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ea1e771eea51498b9917da282d783427": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "39929719372644589a9baa7295fd5849": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "79d5b6596f1b4ee5966b55dad97df3a2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b49e779bf02c49bbb1f4eba5ac2dd1e2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e87a2309352248309f209b71dd050799": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1e3372b4af51443f88050b77fedc5bef": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "082ceda90b8d484a81a1de5fead892b6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_e8560b1f7c5a42a1b850a24bd22f9a73", + "IPY_MODEL_5a5d3dac3d2f43419349404bd0c79f4f", + "IPY_MODEL_4772a353fbb243aca9f472de257d1358" + ], + "layout": "IPY_MODEL_b14fbeb1fb4f4888b63afd9cf4476b28" + } + }, + "e8560b1f7c5a42a1b850a24bd22f9a73": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0ac4cc8e789d4a7389ba2d81f752b2a6", + "placeholder": "​", + "style": "IPY_MODEL_17ad15eed85f493ca0d0d6b8d914ca2c", + "value": "model.safetensors: 100%" + } + }, + "5a5d3dac3d2f43419349404bd0c79f4f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8c91b59afcd343648321a9ed206531a7", + "max": 2054625552, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a3710ca3ab474ce59a146b54fea25736", + "value": 2054625552 + } + }, + "4772a353fbb243aca9f472de257d1358": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f2247b50901c4a20854c1ac284d76e7f", + "placeholder": "​", + "style": "IPY_MODEL_71c857a576e04c1592352df2553a10f6", + "value": " 2.05G/2.05G [00:14<00:00, 159MB/s]" + } + }, + "b14fbeb1fb4f4888b63afd9cf4476b28": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0ac4cc8e789d4a7389ba2d81f752b2a6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "17ad15eed85f493ca0d0d6b8d914ca2c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8c91b59afcd343648321a9ed206531a7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a3710ca3ab474ce59a146b54fea25736": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "f2247b50901c4a20854c1ac284d76e7f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "71c857a576e04c1592352df2553a10f6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "44fb962be403416c910b1c4bf25bcdf1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_161b757d5f64481a9212dbccd7a884c7", + "IPY_MODEL_a18521a6e11b4e1ea6e53ce81b2af574", + "IPY_MODEL_969a9823b8864c0f877eb2c3af383205" + ], + "layout": "IPY_MODEL_753cba0957c240cd8d7fcf171dd2557e" + } + }, + "161b757d5f64481a9212dbccd7a884c7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_89fdaf865e0e4f7fa1909f032005d1d8", + "placeholder": "​", + "style": "IPY_MODEL_8060b0a254d54032bbb01a56431e98eb", + "value": "generation_config.json: 100%" + } + }, + "a18521a6e11b4e1ea6e53ce81b2af574": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_80d066d9f0614ae4b264ade4a304cf49", + "max": 266, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_bdccff3baee846459a9645d014266d2a", + "value": 266 + } + }, + "969a9823b8864c0f877eb2c3af383205": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f105bcab30d8404a9b3a1ce866480374", + "placeholder": "​", + "style": "IPY_MODEL_9c78bf775e4149cfbe34f1e253c2c9fc", + "value": " 266/266 [00:00<00:00, 23.7kB/s]" + } + }, + "753cba0957c240cd8d7fcf171dd2557e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "89fdaf865e0e4f7fa1909f032005d1d8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8060b0a254d54032bbb01a56431e98eb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "80d066d9f0614ae4b264ade4a304cf49": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bdccff3baee846459a9645d014266d2a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "f105bcab30d8404a9b3a1ce866480374": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9c78bf775e4149cfbe34f1e253c2c9fc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7799ec6190d04928963fbd82d195e2b3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_68d465d228c141a7b5c8c97799102790", + "IPY_MODEL_9f01388850d44b30a155bdd6c1528de4", + "IPY_MODEL_a5a23a6849e240be90007a200a14e1a3" + ], + "layout": "IPY_MODEL_1a190eca13234bca86da0f33e46a34e1" + } + }, + "68d465d228c141a7b5c8c97799102790": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_00ff165127094d2fb481980c130f04c8", + "placeholder": "​", + "style": "IPY_MODEL_d2af9a4571554901a04f1afdd556984d", + "value": "tokenizer_config.json: " + } + }, + "9f01388850d44b30a155bdd6c1528de4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d06befc9db47458fa696880e19449d90", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_aadd0d6341714668ae5a85c445f49a09", + "value": 1 + } + }, + "a5a23a6849e240be90007a200a14e1a3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5329bea02fc2432b84b8bb8eb733eaf9", + "placeholder": "​", + "style": "IPY_MODEL_ba6c2ac768044ec0b688e6573e540f92", + "value": " 7.51k/? [00:00<00:00, 521kB/s]" + } + }, + "1a190eca13234bca86da0f33e46a34e1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "00ff165127094d2fb481980c130f04c8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d2af9a4571554901a04f1afdd556984d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d06befc9db47458fa696880e19449d90": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "aadd0d6341714668ae5a85c445f49a09": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "5329bea02fc2432b84b8bb8eb733eaf9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ba6c2ac768044ec0b688e6573e540f92": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e580572f40454f8ebb8d6d50cab3c644": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_bc4ee14a8b7140edba21f43a0d673045", + "IPY_MODEL_399a72c355d8478e87995aff1c57f426", + "IPY_MODEL_ab9aa9b9c93b4ee5900a351cd584cee8" + ], + "layout": "IPY_MODEL_2c51081cf8314bd58a8b7b93cdf2eed7" + } + }, + "bc4ee14a8b7140edba21f43a0d673045": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_88f4f5a8f65742eb8cb1228e5d94508c", + "placeholder": "​", + "style": "IPY_MODEL_54c323cb9fe9458fb062b2d4bd5cf927", + "value": "vocab.json: " + } + }, + "399a72c355d8478e87995aff1c57f426": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_564a55b31d504a2499140061de7c8354", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_db821f8b3e1b414590bbde186cc62d59", + "value": 1 + } + }, + "ab9aa9b9c93b4ee5900a351cd584cee8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_974d765200034661a14a25e0b241fdeb", + "placeholder": "​", + "style": "IPY_MODEL_41873020c9324e8b96fb6a8a7e432ed2", + "value": " 2.78M/? [00:00<00:00, 55.7MB/s]" + } + }, + "2c51081cf8314bd58a8b7b93cdf2eed7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "88f4f5a8f65742eb8cb1228e5d94508c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "54c323cb9fe9458fb062b2d4bd5cf927": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "564a55b31d504a2499140061de7c8354": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "db821f8b3e1b414590bbde186cc62d59": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "974d765200034661a14a25e0b241fdeb": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "41873020c9324e8b96fb6a8a7e432ed2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "bab57aecb3f84216af720fa9321f6fb8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_2fe800ca1f6948009a218f9f3ce0acbb", + "IPY_MODEL_9e1d365fa1c84030a4caeead8ef954d3", + "IPY_MODEL_55a60ff24a23452682aebac4cdcdf086" + ], + "layout": "IPY_MODEL_b71f5888837e4717bc8669603cb587a2" + } + }, + "2fe800ca1f6948009a218f9f3ce0acbb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f13c88be577549acad8e2606a8c4e6f2", + "placeholder": "​", + "style": "IPY_MODEL_c1b370ab7fee4dbeb2cb37f47f774eb6", + "value": "merges.txt: " + } + }, + "9e1d365fa1c84030a4caeead8ef954d3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6eb2f500acda438a82e453126b22ae25", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_9d32149562cf47859390636be9c70d76", + "value": 1 + } + }, + "55a60ff24a23452682aebac4cdcdf086": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_923264d53c454d9d96d618b0efd3f59a", + "placeholder": "​", + "style": "IPY_MODEL_8b918bfb9f2f4ee0a71884837b495ebf", + "value": " 1.67M/? [00:00<00:00, 43.5MB/s]" + } + }, + "b71f5888837e4717bc8669603cb587a2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f13c88be577549acad8e2606a8c4e6f2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c1b370ab7fee4dbeb2cb37f47f774eb6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6eb2f500acda438a82e453126b22ae25": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "9d32149562cf47859390636be9c70d76": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "923264d53c454d9d96d618b0efd3f59a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8b918bfb9f2f4ee0a71884837b495ebf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3332ae39c1094b3bb3fde04198a3f2a6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_71cbf065dfca4450a615fdef7c2114f6", + "IPY_MODEL_fdadb7a27d07425c8e04dd10df1aeba1", + "IPY_MODEL_ec590a2a32d045b194dab35ae5273043" + ], + "layout": "IPY_MODEL_826ab03235c94f929ca1e261327a0137" + } + }, + "71cbf065dfca4450a615fdef7c2114f6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_06c2b0aff48f40a886e14723ee788248", + "placeholder": "​", + "style": "IPY_MODEL_0803a7b3995241f493052389046afe98", + "value": "added_tokens.json: 100%" + } + }, + "fdadb7a27d07425c8e04dd10df1aeba1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_98dada6fc260427ebe46383263de1e75", + "max": 632, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5405361924614557867c74ba647b08b4", + "value": 632 + } + }, + "ec590a2a32d045b194dab35ae5273043": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b3d0061be3d24e22af12225fb08f02ee", + "placeholder": "​", + "style": "IPY_MODEL_9f61db866c9c41e6af53f0b79f55b4e7", + "value": " 632/632 [00:00<00:00, 65.0kB/s]" + } + }, + "826ab03235c94f929ca1e261327a0137": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "06c2b0aff48f40a886e14723ee788248": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0803a7b3995241f493052389046afe98": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "98dada6fc260427ebe46383263de1e75": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5405361924614557867c74ba647b08b4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "b3d0061be3d24e22af12225fb08f02ee": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9f61db866c9c41e6af53f0b79f55b4e7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ba375ee09b334728b8cfc63975f4302a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_4f00645b01294756ae17955d5889514b", + "IPY_MODEL_358628764f24466198ceadb0f4478487", + "IPY_MODEL_874de7ba061b4d8783c74e605440394e" + ], + "layout": "IPY_MODEL_01e0602c676442ff952a7a7b3f4024c7" + } + }, + "4f00645b01294756ae17955d5889514b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2e707c60d0384e8b8c993c883ad3456a", + "placeholder": "​", + "style": "IPY_MODEL_3af6672587a84a2b886482e68fcfbba9", + "value": "special_tokens_map.json: 100%" + } + }, + "358628764f24466198ceadb0f4478487": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_20e58c5f72e14d47901d1eec0a08c12f", + "max": 613, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_217d16de232c4a1d83a1a4b48ad453d6", + "value": 613 + } + }, + "874de7ba061b4d8783c74e605440394e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2dbe35d37c824c839a2913a0cfbc5266", + "placeholder": "​", + "style": "IPY_MODEL_f9f3f435180b4929a938ac4500216247", + "value": " 613/613 [00:00<00:00, 59.9kB/s]" + } + }, + "01e0602c676442ff952a7a7b3f4024c7": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2e707c60d0384e8b8c993c883ad3456a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3af6672587a84a2b886482e68fcfbba9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "20e58c5f72e14d47901d1eec0a08c12f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "217d16de232c4a1d83a1a4b48ad453d6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "2dbe35d37c824c839a2913a0cfbc5266": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f9f3f435180b4929a938ac4500216247": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "31d96fb276614537bab907c316f0ce25": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_f9ec2b3ae5604344bf3a5f267ce7de38", + "IPY_MODEL_4772c50a4e454979acb7cc4de466937a", + "IPY_MODEL_6ee363978e9749d7b39191a4027be66a" + ], + "layout": "IPY_MODEL_b74c48e99fa742ad8b44d5bb7fd34171" + } + }, + "f9ec2b3ae5604344bf3a5f267ce7de38": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c034e1899af543e7ab854b7276a787e2", + "placeholder": "​", + "style": "IPY_MODEL_c545c0cc491b4692b6f7eaaf42e50baf", + "value": "tokenizer.json: " + } + }, + "4772c50a4e454979acb7cc4de466937a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ef8ace2a258a479db27919c2527a172f", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_02068d599f844ea5838544754e6d8448", + "value": 1 + } + }, + "6ee363978e9749d7b39191a4027be66a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5a09cd99ab3444248c365ba3e1f46436", + "placeholder": "​", + "style": "IPY_MODEL_375ea535f86c4dd193d114568bb3045b", + "value": " 7.03M/? [00:00<00:00, 98.9MB/s]" + } + }, + "b74c48e99fa742ad8b44d5bb7fd34171": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c034e1899af543e7ab854b7276a787e2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c545c0cc491b4692b6f7eaaf42e50baf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ef8ace2a258a479db27919c2527a172f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "02068d599f844ea5838544754e6d8448": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "5a09cd99ab3444248c365ba3e1f46436": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "375ea535f86c4dd193d114568bb3045b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "68000393fa504271ba1a4c0dfb18a182": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ea95e9fdfc1e43ec8c1cb7b35d24f436", + "IPY_MODEL_5e9776eebdc544159f73ebc7447d54f1", + "IPY_MODEL_d953a7141b174afdbf2f8912cdf4e04f" + ], + "layout": "IPY_MODEL_2b446f04958943a4adc493cb624ecb7e" + } + }, + "ea95e9fdfc1e43ec8c1cb7b35d24f436": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2f1ae5179b0945fda20f970c25c93c57", + "placeholder": "​", + "style": "IPY_MODEL_e90dd825fc0b44d2bbe077f7361756af", + "value": "adapter_model.safetensors: 100%" + } + }, + "5e9776eebdc544159f73ebc7447d54f1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ee387cb17b58451fab83e2b3241032dc", + "max": 14783936, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c402601073394089ab3718d6288660ff", + "value": 14783936 + } + }, + "d953a7141b174afdbf2f8912cdf4e04f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_24dadb01295d447ca81ac02a4908fdf1", + "placeholder": "​", + "style": "IPY_MODEL_c07912b3d8974e6891c3d770391aa649", + "value": " 14.8M/14.8M [00:00<00:00, 73.9MB/s]" + } + }, + "2b446f04958943a4adc493cb624ecb7e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2f1ae5179b0945fda20f970c25c93c57": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e90dd825fc0b44d2bbe077f7361756af": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ee387cb17b58451fab83e2b3241032dc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c402601073394089ab3718d6288660ff": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "24dadb01295d447ca81ac02a4908fdf1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c07912b3d8974e6891c3d770391aa649": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + } + } + } + }, + "cells": [ + { + "cell_type": "markdown", + "id": "cell-title", + "metadata": { + "id": "cell-title" + }, + "source": [ + "# Base Model vs SFT Model — Comparison\n", + "\n", + "Two evaluation modes — run one or both:\n", + "\n", + "| Mode | What it tests | Needs |\n", + "|---|---|---|\n", + "| **Dataset eval** | Static pattern matching on held-out prompts | HF token + dataset access |\n", + "| **RL env eval** | Live task completion against the AWS environment | Dataset eval above + running HF Space |\n", + "\n", + "**RL env metrics (per episode)**\n", + "| Metric | What it measures |\n", + "|---|---|\n", + "| `avg_episode_reward` | Mean total reward accumulated per episode |\n", + "| `completion_rate` | % episodes the model completed the task before hitting max steps |\n", + "| `avg_steps` | Mean number of AWS commands issued per episode |\n", + "| `avg_reward_per_step` | Mean per-step reward (efficiency) |\n", + "| `reward_std` | Reward variance across episodes (consistency) |\n", + "\n", + "**Before running:**\n", + "1. Runtime → Change runtime type → GPU (T4)\n", + "2. Fill in Config below\n", + "3. Add `HF_TOKEN` to Colab Secrets (🔑 left sidebar)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cell-config", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cell-config", + "outputId": "f5ce28ff-dc54-4750-f34d-5d0eda178323" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Config OK\n" + ] + } + ], + "source": [ + "# ── CONFIG ─────────────────────────────────────────────────────────────────\n", + "BASE_MODEL = \"unsloth/Qwen2.5-Coder-3B-Instruct-bnb-4bit\"\n", + "SFT_ADAPTER_REPO = \"Sizzing/aws-rl-sft-qwen25coder3b-adapter\" # HF Hub or local path\n", + "DATASET_REPO = \"Sizzing/aws-rl-sft\"\n", + "REPO_URL = \"https://github.com/bangar1/aws-rl-env-fork\" # your fork\n", + "ENV_BASE_URL = \"https://bangar-hf-aws-rl-env.hf.space/\" # HF Space URL\n", + "\n", + "# Dataset eval knobs\n", + "MAX_SEQ_LENGTH = 512\n", + "MAX_NEW_TOKENS = 120\n", + "EVAL_MAX_PER_COMBO = 2 # rows per (difficulty, source) combo\n", + "\n", + "# RL env eval knobs — difficulty tiers: warmup, beginner, intermediate, advanced, expert\n", + "RL_EPISODES_PER_DIFF = 3 # episodes per difficulty tier\n", + "MAX_EPISODE_STEPS = 15 # max AWS commands per episode\n", + "TEMPERATURE = 0.7\n", + "\n", + "IS_COLAB = True\n", + "# ───────────────────────────────────────────────────────────────────────────\n", + "assert \"YOUR_USERNAME\" not in ENV_BASE_URL, \"Set ENV_BASE_URL to your HF Space URL\"\n", + "assert \"YOUR_USERNAME\" not in REPO_URL, \"Set REPO_URL to your fork URL\"\n", + "print(\"Config OK\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "cell-install", + "metadata": { + "id": "cell-install" + }, + "outputs": [], + "source": [ + "%%capture\n", + "!pip install -q --upgrade pip\n", + "!pip install -q unsloth\n", + "!pip install -q --force-reinstall --no-deps \"transformers>=4.50,<5.0\"\n", + "!pip install -q --upgrade \"trl<0.12.0\" peft accelerate datasets huggingface_hub bitsandbytes\n", + "!pip install -q matplotlib numpy httpx websockets nest_asyncio" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "cell-clone", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cell-clone", + "outputId": "c65ab6ce-d038-4367-d94f-81d28b2946ca" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Removed existing directory: /content/aws-rl-env\n", + " Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n", + " Checking if build backend supports build_editable ... \u001b[?25l\u001b[?25hdone\n", + " Getting requirements to build editable ... \u001b[?25l\u001b[?25hdone\n", + " Preparing editable metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", + " Building editable for openenv-aws_rl_env (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", + "Repo ready at /content/aws-rl-env\n" + ] + } + ], + "source": [ + "import subprocess, sys\n", + "import shutil\n", + "\n", + "REPO_DIR = \"/content/aws-rl-env\"\n", + "\n", + "# Remove the directory if it already exists\n", + "if os.path.exists(REPO_DIR):\n", + " shutil.rmtree(REPO_DIR)\n", + " print(f\"Removed existing directory: {REPO_DIR}\")\n", + "\n", + "subprocess.run([\"git\", \"clone\", \"--depth\", \"1\", REPO_URL, REPO_DIR], check=True)\n", + "!pip install -q -e /content/aws-rl-env # ← add this\n", + "\n", + "if REPO_DIR not in sys.path:\n", + " sys.path.insert(0, REPO_DIR)\n", + "print(\"Repo ready at\", REPO_DIR)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "cell-gpu", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cell-gpu", + "outputId": "52260168-fddc-4cde-ed62-d3d0c38178c0" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "GPU : Tesla T4\n", + "VRAM : 15.6 GB\n", + "Prec : fp16\n" + ] + } + ], + "source": [ + "import os, gc, time, json, math, asyncio, logging\n", + "from dataclasses import dataclass, field\n", + "from typing import List, Tuple\n", + "import torch\n", + "import nest_asyncio\n", + "nest_asyncio.apply()\n", + "\n", + "os.environ.setdefault(\"PYTORCH_ALLOC_CONF\", \"expandable_segments:True\")\n", + "\n", + "assert torch.cuda.is_available(), \"No GPU — Runtime → Change runtime type → GPU\"\n", + "gpu = torch.cuda.get_device_properties(0)\n", + "IS_T4 = \"T4\" in gpu.name\n", + "USE_FP16 = IS_T4\n", + "USE_BF16 = not IS_T4\n", + "print(f\"GPU : {gpu.name}\")\n", + "print(f\"VRAM : {gpu.total_memory / 1e9:.1f} GB\")\n", + "print(f\"Prec : {'fp16' if USE_FP16 else 'bf16'}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cell-auth", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cell-auth", + "outputId": "a1df87c9-db7b-460c-df5e-7347b83e412b" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "Note: Environment variable`HF_TOKEN` is set and is the current active token independently from the token you've just configured.\n", + "WARNING:huggingface_hub._login:Note: Environment variable`HF_TOKEN` is set and is the current active token independently from the token you've just configured.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "HF authenticated\n" + ] + } + ], + "source": [ + "if IS_COLAB:\n", + " from google.colab import userdata\n", + " os.environ[\"HF_TOKEN\"] = userdata.get(\"HF_TOKEN\")\n", + "\n", + "assert os.environ.get(\"HF_TOKEN\"), \"Set HF_TOKEN in Colab Secrets\"\n", + "\n", + "from huggingface_hub import login as hf_login\n", + "hf_login(token=os.environ[\"HF_TOKEN\"], add_to_git_credential=False)\n", + "print(\"HF authenticated\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "cell-health", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cell-health", + "outputId": "7358686d-101a-4f4e-c7aa-b36869bcc10f" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "RL env server: 404 {'detail': 'Not Found'}\n" + ] + } + ], + "source": [ + "import httpx\n", + "\n", + "with httpx.Client(timeout=15) as c:\n", + " r = c.get(f\"{ENV_BASE_URL}/health\")\n", + " print(\"RL env server:\", r.status_code, r.json())" + ] + }, + { + "cell_type": "markdown", + "id": "cell-part1-md", + "metadata": { + "id": "cell-part1-md" + }, + "source": [ + "---\n", + "# Part 1 — Dataset Eval (static)\n", + "\n", + "Pattern-matching on held-out prompts. Fast, no env server needed." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "cell-dataset", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 491, + "referenced_widgets": [ + "3cf95de334a14af9b7274dee96b2f20d", + "41a765ae42f142a5aaf0163612bbe490", + "0f614193015744f2a0263aa13681b411", + "68d44bd4ff9a439f958573c8ec16405b", + "c0c12b0fc46f4b9f8ea2af23e194da23", + "796833bcdc3845849bf4b44da6379fcc", + "b22885fcbf3147509191939f5de83602", + "cc427e51ea1446aaa74d6f24cb17d043", + "a8816b70cd9f409ba7acfacc2864c043", + "c71fef24bafe4b45896601a7ae144c2f", + "548cc14a659b4e6e9c217ff980e34608", + "9d1f05eb5d3b4bdba57d618f022eaa7b", + "7ec0191160e04c5397c24bbad3d2b593", + "bf317a89297c4265938863cc3f74ba8c", + "616c3d44f0a64e22828c2e472a8c13bc", + "57cd591f5b3f4d6aa2e401dcb0c3c8fc", + "51ad078171814b9ca022d88231cf6387", + "ed06bfd4c13f41598d5e10bbe6139eb8", + "62ba79bd0e2f47fcbb073cbe15ab2bf6", + "62a7c1256a3d462ca1f58711b4985852", + "0cf6a91ad33f4f0a94b890881658b5b2", + "5178b799d7404fd282f4e5016d616d14", + "0d2747470d4947849c27775b43ecb54c", + "fbc88709dcf84cfbb91d7efbb10e0b42", + "cc4366820b234778b543af95146a4e92", + "0fba0e0c04c14214ae58cdd3f65fd92f", + "4dae08a1f54842e49185c4402659df6f", + "c795b9a1dc834f67ac44a568b9744ed7", + "1241be723444464fbb334b06d8208410", + "7f28dc39b40543d9b17bd8ad611e3623", + "2def96a8b6d646ef8801ce2c1e0a8d14", + "96abbd4be45f4eef9587a795f10c73f9", + "6736d9704da04076a134426a47cb15c4", + "617dcbb6224b49bb9b83dac185420e09", + "7c93228f55074cf78b1170001545f89d", + "b1e2bcaf50124b14b7bc70fb403e68b8", + "c36279d8d0774918812725c906a8af12", + "ebb9a1dea358429e9e166c470076d4ce", + "5bbbc6530c014b5296c181526d08cec0", + "8a2f80c0be5a47b994f6e091cb01d287", + "fbb8cb04661945c782b1df5e423b37a0", + "94eb4cb08c8443098267d78b1665514e", + "f5eb0e8911ad46d19d1d76dfa55fb21c", + "1161e043c93c4671a8155dce8d9dd701", + "1dc1444225ce43a888350992cc7f0bbb", + "9ef9a30c556c4d9da3692fd8a829270f", + "b14329f3b61447f788d6e836bf934c91", + "6cff000d81e8431298609a9148cdb793", + "49de19f8c9e04603980b4a4a8c816545", + "4dca96c48eb64681b36a76b4f0b01b62", + "66f989e6acee487faf8f6cc453faa486", + "052ba95707274c42933cb13fc8ad078c", + "daf23f97138a44f49f8099d73a39b33b", + "741c77c00dd34486bd780369d2918d53", + "b6c49d1dbf184f86a4a94644340b9f90", + "c9572ada407547acb82b499b4aba9408", + "2f17b452a3f04d448beff33d60445e2e", + "5cdf05f2225f499e8574ab64ec9a8766", + "80d9e1dd1507439088c3d9d8c4c7b0ac", + "4e6c58ce96404281b880833f88e08413", + "cd77111d0ee44ecaacb5159f68c88609", + "89604435feab456888553549728c15a7", + "66558440f90b42d99278658f7151f043", + "188a00a386704c7887d139bc284ccc1a", + "ceadf3915006459fb72ed9141c49dc2f", + "63b9d68de11b4fbfa5e8acaaa25b4c35", + "f65560291a834aef846683d3909a9db6", + "9c1e0ff6a9094793905ddc191e95796d", + "182361253eee49418048b01fbcf2672f", + "8af925f00d3541958d318f43591bdd76", + "c0cdb510c34c4e27b8061a5b4e4b88fa", + "ea1e771eea51498b9917da282d783427", + "39929719372644589a9baa7295fd5849", + "79d5b6596f1b4ee5966b55dad97df3a2", + "b49e779bf02c49bbb1f4eba5ac2dd1e2", + "e87a2309352248309f209b71dd050799", + "1e3372b4af51443f88050b77fedc5bef" + ] + }, + "id": "cell-dataset", + "outputId": "6708e2fd-f2c4-4b6a-baf7-da9410d3cb22" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "README.md: 0.00B [00:00, ?B/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "3cf95de334a14af9b7274dee96b2f20d" + } + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "data/train-00000-of-00001.parquet: 0%| | 0.00/1.92M [00:00 str:\n", + " text = raw.strip()\n", + " if text.startswith(\"```\"):\n", + " lines = text.split(\"\\n\")\n", + " text = \"\\n\".join(l for l in lines if not l.startswith(\"```\")).strip()\n", + " for line in text.split(\"\\n\"):\n", + " line = line.strip()\n", + " if line.startswith(\"aws \"):\n", + " return line\n", + " return text\n", + "\n", + "\n", + "def score_row(completion: str, expected: str) -> dict:\n", + " extracted = extract_command(completion)\n", + " e_tokens = extracted.split()\n", + " exp_tokens = expected.split()\n", + " return {\n", + " \"format_ok\": completion.strip().startswith(\"aws \"),\n", + " \"format_after_extract\": extracted.startswith(\"aws \"),\n", + " \"exact\": extracted == expected.strip(),\n", + " \"service\": (len(e_tokens) >= 2 and len(exp_tokens) >= 2\n", + " and e_tokens[1:2] == exp_tokens[1:2]),\n", + " \"operation\": (len(e_tokens) >= 3 and len(exp_tokens) >= 3\n", + " and e_tokens[2:3] == exp_tokens[2:3]),\n", + " }\n", + "\n", + "\n", + "def build_eval_set(dataset, max_per_combo: int = 2):\n", + " seen, picks = {}, []\n", + " for r in dataset:\n", + " key = (r[\"difficulty\"], r[\"source\"])\n", + " seen[key] = seen.get(key, 0) + 1\n", + " if seen[key] <= max_per_combo:\n", + " picks.append(r)\n", + " return picks\n", + "\n", + "\n", + "def dataset_eval(model, tokenizer, eval_set, max_new_tokens: int = 120) -> dict:\n", + " results = []\n", + " model.eval()\n", + " for row in eval_set:\n", + " msgs = row[\"messages\"][:2]\n", + " expected = row[\"messages\"][2][\"content\"]\n", + " prompt = tokenizer.apply_chat_template(\n", + " msgs, tokenize=False, add_generation_prompt=True\n", + " )\n", + " inputs = tokenizer(prompt, return_tensors=\"pt\").to(model.device)\n", + " t0 = time.time()\n", + " with torch.inference_mode():\n", + " out_ids = model.generate(\n", + " **inputs, max_new_tokens=max_new_tokens,\n", + " do_sample=False, temperature=0.0,\n", + " pad_token_id=tokenizer.eos_token_id,\n", + " )\n", + " dt = time.time() - t0\n", + " completion = tokenizer.decode(\n", + " out_ids[0, inputs.input_ids.shape[1]:], skip_special_tokens=True\n", + " )\n", + " s = score_row(completion, expected)\n", + " s.update({\"latency\": dt, \"len\": len(completion),\n", + " \"completion\": completion, \"expected\": expected})\n", + " results.append(s)\n", + "\n", + " n = len(results)\n", + " return {\n", + " \"format_pct\": sum(r[\"format_ok\"] for r in results) / n,\n", + " \"format_after_extract_pct\": sum(r[\"format_after_extract\"] for r in results) / n,\n", + " \"exact_pct\": sum(r[\"exact\"] for r in results) / n,\n", + " \"service_pct\": sum(r[\"service\"] for r in results) / n,\n", + " \"operation_pct\": sum(r[\"operation\"] for r in results) / n,\n", + " \"avg_latency\": sum(r[\"latency\"] for r in results) / n,\n", + " \"avg_len\": sum(r[\"len\"] for r in results) / n,\n", + " \"_per_row\": results,\n", + " }\n", + "\n", + "\n", + "EVAL_SET = build_eval_set(ds[\"validation\"], max_per_combo=EVAL_MAX_PER_COMBO)\n", + "combos = len(set((r[\"difficulty\"], r[\"source\"]) for r in EVAL_SET))\n", + "print(f\"Eval set: {len(EVAL_SET)} prompts across {combos} (tier, source) combos\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "cell-base-dataset-eval", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 686, + "referenced_widgets": [ + "082ceda90b8d484a81a1de5fead892b6", + "e8560b1f7c5a42a1b850a24bd22f9a73", + "5a5d3dac3d2f43419349404bd0c79f4f", + "4772a353fbb243aca9f472de257d1358", + "b14fbeb1fb4f4888b63afd9cf4476b28", + "0ac4cc8e789d4a7389ba2d81f752b2a6", + "17ad15eed85f493ca0d0d6b8d914ca2c", + "8c91b59afcd343648321a9ed206531a7", + "a3710ca3ab474ce59a146b54fea25736", + "f2247b50901c4a20854c1ac284d76e7f", + "71c857a576e04c1592352df2553a10f6", + "44fb962be403416c910b1c4bf25bcdf1", + "161b757d5f64481a9212dbccd7a884c7", + "a18521a6e11b4e1ea6e53ce81b2af574", + "969a9823b8864c0f877eb2c3af383205", + "753cba0957c240cd8d7fcf171dd2557e", + "89fdaf865e0e4f7fa1909f032005d1d8", + "8060b0a254d54032bbb01a56431e98eb", + "80d066d9f0614ae4b264ade4a304cf49", + "bdccff3baee846459a9645d014266d2a", + "f105bcab30d8404a9b3a1ce866480374", + "9c78bf775e4149cfbe34f1e253c2c9fc", + "7799ec6190d04928963fbd82d195e2b3", + "68d465d228c141a7b5c8c97799102790", + "9f01388850d44b30a155bdd6c1528de4", + "a5a23a6849e240be90007a200a14e1a3", + "1a190eca13234bca86da0f33e46a34e1", + "00ff165127094d2fb481980c130f04c8", + "d2af9a4571554901a04f1afdd556984d", + "d06befc9db47458fa696880e19449d90", + "aadd0d6341714668ae5a85c445f49a09", + "5329bea02fc2432b84b8bb8eb733eaf9", + "ba6c2ac768044ec0b688e6573e540f92", + "e580572f40454f8ebb8d6d50cab3c644", + "bc4ee14a8b7140edba21f43a0d673045", + "399a72c355d8478e87995aff1c57f426", + "ab9aa9b9c93b4ee5900a351cd584cee8", + "2c51081cf8314bd58a8b7b93cdf2eed7", + "88f4f5a8f65742eb8cb1228e5d94508c", + "54c323cb9fe9458fb062b2d4bd5cf927", + "564a55b31d504a2499140061de7c8354", + "db821f8b3e1b414590bbde186cc62d59", + "974d765200034661a14a25e0b241fdeb", + "41873020c9324e8b96fb6a8a7e432ed2", + "bab57aecb3f84216af720fa9321f6fb8", + "2fe800ca1f6948009a218f9f3ce0acbb", + "9e1d365fa1c84030a4caeead8ef954d3", + "55a60ff24a23452682aebac4cdcdf086", + "b71f5888837e4717bc8669603cb587a2", + "f13c88be577549acad8e2606a8c4e6f2", + "c1b370ab7fee4dbeb2cb37f47f774eb6", + "6eb2f500acda438a82e453126b22ae25", + "9d32149562cf47859390636be9c70d76", + "923264d53c454d9d96d618b0efd3f59a", + "8b918bfb9f2f4ee0a71884837b495ebf", + "3332ae39c1094b3bb3fde04198a3f2a6", + "71cbf065dfca4450a615fdef7c2114f6", + "fdadb7a27d07425c8e04dd10df1aeba1", + "ec590a2a32d045b194dab35ae5273043", + "826ab03235c94f929ca1e261327a0137", + "06c2b0aff48f40a886e14723ee788248", + "0803a7b3995241f493052389046afe98", + "98dada6fc260427ebe46383263de1e75", + "5405361924614557867c74ba647b08b4", + "b3d0061be3d24e22af12225fb08f02ee", + "9f61db866c9c41e6af53f0b79f55b4e7", + "ba375ee09b334728b8cfc63975f4302a", + "4f00645b01294756ae17955d5889514b", + "358628764f24466198ceadb0f4478487", + "874de7ba061b4d8783c74e605440394e", + "01e0602c676442ff952a7a7b3f4024c7", + "2e707c60d0384e8b8c993c883ad3456a", + "3af6672587a84a2b886482e68fcfbba9", + "20e58c5f72e14d47901d1eec0a08c12f", + "217d16de232c4a1d83a1a4b48ad453d6", + "2dbe35d37c824c839a2913a0cfbc5266", + "f9f3f435180b4929a938ac4500216247", + "31d96fb276614537bab907c316f0ce25", + "f9ec2b3ae5604344bf3a5f267ce7de38", + "4772c50a4e454979acb7cc4de466937a", + "6ee363978e9749d7b39191a4027be66a", + "b74c48e99fa742ad8b44d5bb7fd34171", + "c034e1899af543e7ab854b7276a787e2", + "c545c0cc491b4692b6f7eaaf42e50baf", + "ef8ace2a258a479db27919c2527a172f", + "02068d599f844ea5838544754e6d8448", + "5a09cd99ab3444248c365ba3e1f46436", + "375ea535f86c4dd193d114568bb3045b" + ] + }, + "id": "cell-base-dataset-eval", + "outputId": "930c1a84-a40f-400b-a419-cb8c67ef404f" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "🦥 Unsloth: Will patch your computer to enable 2x faster free finetuning.\n", + "🦥 Unsloth Zoo will now patch everything to make training faster!\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "WARNING:unsloth_zoo.log:Unsloth: Could not patch trl.trainer.gkd_trainer: Direct module loading failed for UnslothGKDTrainer: parameter without a default follows parameter with a default (UnslothGKDTrainer.py, line 962)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Loading base model...\n", + "==((====))== Unsloth 2026.4.8: Fast Qwen2 patching. Transformers: 4.57.6.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "model.safetensors: 0%| | 0.00/2.05G [00:00 str:\n", + " messages = [\n", + " {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n", + " {\"role\": \"user\", \"content\": f\"TASK: {task.description}\"},\n", + " ]\n", + " for cmd, out in history[-4:]:\n", + " messages.append({\"role\": \"assistant\", \"content\": cmd})\n", + " messages.append({\"role\": \"user\", \"content\": f\"OUTPUT:\\n{out[:400]}\"})\n", + " return tokenizer.apply_chat_template(\n", + " messages, tokenize=False, add_generation_prompt=True\n", + " )\n", + "\n", + "\n", + "def _extract_aws_command(raw: str) -> str:\n", + " for line in raw.splitlines():\n", + " line = line.strip().strip(\"`\").strip()\n", + " if line.startswith(\"aws \"):\n", + " return line\n", + " return \"aws help\"\n", + "\n", + "\n", + "@torch.no_grad()\n", + "def _generate(model, tokenizer, prompt: str) -> str:\n", + " device = next(model.parameters()).device\n", + " inputs = tokenizer(prompt, return_tensors=\"pt\").to(device)\n", + " out = model.generate(\n", + " **inputs,\n", + " max_new_tokens=MAX_NEW_TOKENS,\n", + " do_sample=True,\n", + " temperature=TEMPERATURE,\n", + " top_p=0.95,\n", + " pad_token_id=tokenizer.eos_token_id,\n", + " )\n", + " return tokenizer.decode(\n", + " out[0, inputs.input_ids.shape[1]:], skip_special_tokens=True\n", + " )\n", + "\n", + "\n", + "@dataclass\n", + "class EpisodeResult:\n", + " total_reward: float = 0.0\n", + " steps: int = 0\n", + " completed: bool = False\n", + " per_step_rewards: List[float] = field(default_factory=list)\n", + " difficulty: str = \"unknown\"\n", + "\n", + "\n", + "async def run_episode(model, tokenizer, task: Task) -> EpisodeResult:\n", + " result = EpisodeResult(difficulty=task.difficulty.value)\n", + " env = AwsRlEnv(base_url=ENV_BASE_URL)\n", + " await env.connect()\n", + " try:\n", + " await env.reset(task=task)\n", + " history = []\n", + " for _ in range(MAX_EPISODE_STEPS):\n", + " prompt = build_prompt(task, history, tokenizer)\n", + " text = await asyncio.to_thread(_generate, model, tokenizer, prompt)\n", + " command = _extract_aws_command(text)\n", + " step = await env.step(AwsRlAction(command=command))\n", + " r = float(step.reward)\n", + " result.total_reward += r\n", + " result.per_step_rewards.append(r)\n", + " result.steps += 1\n", + " history.append((command, step.observation.command_output or \"\"))\n", + " if step.done:\n", + " result.completed = True\n", + " break\n", + " finally:\n", + " await env.close()\n", + " return result\n", + "\n", + "\n", + "async def rl_eval(model, tokenizer, episodes_per_diff: int = 3) -> dict:\n", + " \"\"\"Run episodes across all 5 difficulty tiers and return aggregate metrics.\"\"\"\n", + " all_results: List[EpisodeResult] = []\n", + "\n", + " for diff_enum in ALL_DIFFICULTIES:\n", + " diff_tasks = load_tier(diff_enum)\n", + " if not diff_tasks:\n", + " print(f\" No tasks found for {diff_enum.value}, skipping.\")\n", + " continue\n", + " diff_label = diff_enum.value\n", + " for i in range(episodes_per_diff):\n", + " task = diff_tasks[i % len(diff_tasks)]\n", + " ep = await run_episode(model, tokenizer, task)\n", + " all_results.append(ep)\n", + " print(f\" [{diff_label:12}] ep {i+1}/{episodes_per_diff} \"\n", + " f\"reward={ep.total_reward:6.2f} \"\n", + " f\"steps={ep.steps:2d} \"\n", + " f\"done={'✓' if ep.completed else '✗'}\")\n", + "\n", + " n = len(all_results)\n", + " rewards = [r.total_reward for r in all_results]\n", + " steps_list = [r.steps for r in all_results]\n", + " flat_sr = [s for r in all_results for s in r.per_step_rewards]\n", + "\n", + " per_diff = {}\n", + " for diff_enum in ALL_DIFFICULTIES:\n", + " diff_label = diff_enum.value\n", + " sub = [r for r in all_results if r.difficulty == diff_label]\n", + " if sub:\n", + " per_diff[diff_label] = {\n", + " \"avg_reward\": sum(r.total_reward for r in sub) / len(sub),\n", + " \"completion_rate\": sum(r.completed for r in sub) / len(sub),\n", + " \"avg_steps\": sum(r.steps for r in sub) / len(sub),\n", + " }\n", + "\n", + " mean_r = sum(rewards) / n\n", + " return {\n", + " \"avg_episode_reward\": mean_r,\n", + " \"reward_std\": math.sqrt(sum((r - mean_r)**2 for r in rewards) / n),\n", + " \"completion_rate\": sum(r.completed for r in all_results) / n,\n", + " \"avg_steps\": sum(steps_list) / n,\n", + " \"avg_reward_per_step\": sum(flat_sr) / len(flat_sr) if flat_sr else 0.0,\n", + " \"_rewards\": rewards,\n", + " \"_results\": all_results,\n", + " \"_per_diff\": per_diff,\n", + " }\n", + "\n", + "print(\"RL eval helpers ready.\")" + ] + }, + { + "cell_type": "code", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "77e7f47e", + "outputId": "2d52b07c-f695-4249-c692-86a522041919" + }, + "source": [ + "import sys\n", + "import os\n", + "\n", + "if 'openenv' in sys.modules:\n", + " print(f\"'openenv' module found in sys.modules. Loaded from: {sys.modules['openenv'].__file__}\")\n", + " # Optionally, verify it's from the REPO_DIR\n", + " if os.path.commonpath([sys.modules['openenv'].__file__, REPO_DIR]) == REPO_DIR:\n", + " print(\" (Path confirms it's loaded from the cloned repository)\")\n", + "else:\n", + " print(\"'openenv' module not found in sys.modules.\")" + ], + "id": "77e7f47e", + "execution_count": 24, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "'openenv' module found in sys.modules. Loaded from: /usr/local/lib/python3.12/dist-packages/openenv/__init__.py\n" + ] + } + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "cell-base-rl-eval", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cell-base-rl-eval", + "outputId": "25070cec-3f5b-4e1c-b2ea-215f71f5e40d" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Loading base model for RL eval...\n", + "==((====))== Unsloth 2026.4.8: Fast Qwen2 patching. Transformers: 4.57.6.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n", + "Running 3 episodes per difficulty tier...\n", + " [warmup ] ep 1/3 reward= 1.00 steps= 1 done=✓\n", + " [warmup ] ep 2/3 reward= 1.00 steps= 1 done=✓\n", + " [warmup ] ep 3/3 reward= 1.00 steps= 1 done=✓\n", + " [beginner ] ep 1/3 reward= 1.00 steps= 1 done=✓\n", + " [beginner ] ep 2/3 reward= 1.00 steps= 1 done=✓\n", + " [beginner ] ep 3/3 reward= 1.00 steps= 1 done=✓\n", + " [intermediate] ep 1/3 reward= 0.00 steps=15 done=✗\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "Unsloth: Input IDs of shape torch.Size([1, 523]) with length 523 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 515]) with length 515 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 633]) with length 633 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " [intermediate] ep 2/3 reward= 2.10 steps=15 done=✗\n", + " [intermediate] ep 3/3 reward= 2.00 steps= 3 done=✓\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "Unsloth: Input IDs of shape torch.Size([1, 570]) with length 570 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 637]) with length 637 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " [advanced ] ep 1/3 reward= 0.00 steps=15 done=✗\n", + " [advanced ] ep 2/3 reward= 0.56 steps=15 done=✗\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "Unsloth: Input IDs of shape torch.Size([1, 527]) with length 527 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 526]) with length 526 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 525]) with length 525 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 567]) with length 567 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " [advanced ] ep 3/3 reward= 1.83 steps=15 done=✗\n", + " [expert ] ep 1/3 reward= 0.00 steps=15 done=✗\n", + " [expert ] ep 2/3 reward= 4.70 steps=15 done=✗\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "Unsloth: Input IDs of shape torch.Size([1, 548]) with length 548 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 623]) with length 623 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " [expert ] ep 3/3 reward= 0.62 steps=15 done=✗\n", + "\n", + "=== BASE — RL Env Eval ===\n", + " avg_episode_reward 1.187\n", + " reward_std 1.137\n", + " completion_rate 46.7%\n", + " avg_steps 8.600\n", + " avg_reward_per_step 0.138\n", + "\n", + "Base model unloaded.\n" + ] + } + ], + "source": [ + "print(\"Loading base model for RL eval...\")\n", + "base_model, base_tokenizer = FastLanguageModel.from_pretrained(\n", + " model_name=BASE_MODEL, max_seq_length=MAX_SEQ_LENGTH,\n", + " load_in_4bit=True, dtype=None,\n", + ")\n", + "FastLanguageModel.for_inference(base_model)\n", + "\n", + "print(f\"Running {RL_EPISODES_PER_DIFF} episodes per difficulty tier...\")\n", + "base_rl_metrics = asyncio.run(\n", + " rl_eval(base_model, base_tokenizer, episodes_per_diff=RL_EPISODES_PER_DIFF)\n", + ")\n", + "\n", + "print(\"\\n=== BASE — RL Env Eval ===\")\n", + "for k, v in base_rl_metrics.items():\n", + " if k.startswith(\"_\"): continue\n", + " print(f\" {'completion_rate':<25} {100*v:.1f}%\" if k == \"completion_rate\"\n", + " else f\" {k:<25} {v:.3f}\")\n", + "\n", + "del base_model, base_tokenizer\n", + "gc.collect(); torch.cuda.empty_cache()\n", + "print(\"\\nBase model unloaded.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "cell-sft-rl-eval", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cell-sft-rl-eval", + "outputId": "0959f5c1-6682-4ea0-9bd6-18277dd436ca" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Loading SFT model for RL eval...\n", + "==((====))== Unsloth 2026.4.8: Fast Qwen2 patching. Transformers: 4.57.6.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n", + "Running 3 episodes per difficulty tier...\n", + " [warmup ] ep 1/3 reward= 0.00 steps=15 done=✗\n", + " [warmup ] ep 2/3 reward= 1.00 steps= 1 done=✓\n", + " [warmup ] ep 3/3 reward= 1.00 steps= 1 done=✓\n", + " [beginner ] ep 1/3 reward= 1.00 steps= 1 done=✓\n", + " [beginner ] ep 2/3 reward= 1.00 steps= 1 done=✓\n", + " [beginner ] ep 3/3 reward= 1.00 steps= 1 done=✓\n", + " [intermediate] ep 1/3 reward= 1.50 steps= 2 done=✓\n", + " [intermediate] ep 2/3 reward= 1.50 steps= 2 done=✓\n", + " [intermediate] ep 3/3 reward= 2.00 steps= 3 done=✓\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "Unsloth: Input IDs of shape torch.Size([1, 581]) with length 581 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 622]) with length 622 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 645]) with length 645 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " [advanced ] ep 1/3 reward= 0.00 steps=15 done=✗\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "Unsloth: Input IDs of shape torch.Size([1, 673]) with length 673 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 808]) with length 808 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 815]) with length 815 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 741]) with length 741 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 638]) with length 638 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 517]) with length 517 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " [advanced ] ep 2/3 reward= 4.93 steps=15 done=✗\n", + " [advanced ] ep 3/3 reward= 3.58 steps= 6 done=✓\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "Unsloth: Input IDs of shape torch.Size([1, 558]) with length 558 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 693]) with length 693 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 774]) with length 774 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 593]) with length 593 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 574]) with length 574 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 655]) with length 655 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + " [expert ] ep 1/3 reward= 7.48 steps=15 done=✗\n", + " [expert ] ep 2/3 reward= 2.10 steps= 5 done=✓\n", + " [expert ] ep 3/3 reward= 2.08 steps= 3 done=✓\n", + "\n", + "=== SFT — RL Env Eval ===\n", + " avg_episode_reward 2.011\n", + " reward_std 1.908\n", + " completion_rate 73.3%\n", + " avg_steps 5.733\n", + " avg_reward_per_step 0.351\n", + "\n", + "SFT model unloaded.\n" + ] + } + ], + "source": [ + "print(\"Loading SFT model for RL eval...\")\n", + "sft_model, sft_tokenizer = FastLanguageModel.from_pretrained(\n", + " model_name=SFT_ADAPTER_REPO, max_seq_length=MAX_SEQ_LENGTH,\n", + " load_in_4bit=True, dtype=None,\n", + ")\n", + "FastLanguageModel.for_inference(sft_model)\n", + "\n", + "print(f\"Running {RL_EPISODES_PER_DIFF} episodes per difficulty tier...\")\n", + "sft_rl_metrics = asyncio.run(\n", + " rl_eval(sft_model, sft_tokenizer, episodes_per_diff=RL_EPISODES_PER_DIFF)\n", + ")\n", + "\n", + "print(\"\\n=== SFT — RL Env Eval ===\")\n", + "for k, v in sft_rl_metrics.items():\n", + " if k.startswith(\"_\"): continue\n", + " print(f\" {'completion_rate':<25} {100*v:.1f}%\" if k == \"completion_rate\"\n", + " else f\" {k:<25} {v:.3f}\")\n", + "\n", + "del sft_model, sft_tokenizer\n", + "gc.collect(); torch.cuda.empty_cache()\n", + "print(\"\\nSFT model unloaded.\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-plots-md", + "metadata": { + "id": "cell-plots-md" + }, + "source": [ + "---\n", + "# Plots — Dataset Eval + RL Env Eval" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "cell-plots", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "cell-plots", + "outputId": "31f3c249-0bfc-44db-b465-fd0184378156" + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAA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GjZsqNq1a6tevXpq0aKFihcvfstyDhw4YDW1Vbpq1arp0UcfzVebAAAAgIzyey31yCOPyMPDQ1OmTNGJEyck/f/0qOnq168vSfrwww/11Vdfment2rXTQw89pCtXruibb75RdHS09u3bp/79++u3337Ltn179+6Vj4+PRowYobi4OH311VdKSUmRJL377rsKDQ0187766qtasGCBuVy0aFE9/vjjCgwM1PHjx7VkyRJz3dNPP63//Oc/iouLU2RkpObPn68BAwZISns+ZsZr4MGDB+f5eC5btkwjR440l2NjY/XII49o4cKFatWqlZn+zjvvmI8Keemll/Thhx/muY7MkpKStHfvXs2fP99Ma9CggdVjKFJSUtS1a1cdPXpUkuTl5aV+/fqpRIkS2rp1q3ls3n//fdWsWVN9+/aVJH366admGRUrVlTPnj3l5OSks2fP6tChQ9q0aVOubVu5cqUefvhhNW/eXDt37jSvw6KiojRw4EDt3LlTUtojZzp37qwrV65ISvtNYsCAAQoKCtLixYu1Z88eSdKsWbNUqVIl89hltn79etWvX19t27bV6tWr9ccff0iSrly5omnTpun111+XJE2fPt38LcDb21tPPvmkihUrpkuXLun48eNat26dVbnXr19Xp06ddOnSJUmSv7+/+vTpo6JFi2rFihVat26dUlJSFBYWplq1aqlJkya5HpeCevnll/Xzzz9LSrtm7dGjh6pXr65Tp05p1qxZSkhI0Jo1a/Tiiy/qyy+/zLaMLVu2KCgoSP369dOZM2c0Z84cSVJqaqref/99tWjRwsw7cOBA87c2SXr00UfVoEEDrVy5UosWLcq2/IL+xrVt27Y8v9cBoFAVdnQVwJ2X17vOfv75Z6t8zz77rNX61NRUY/v27cY333xjTJ482Zg4caLx9ttvW23zzTffWG2TeSqL3Ozfv9+YM2eO8cknnxgffPCBMXHiRMPV1dXc/t///reZN+OdaJmn6jQMw4iNjTXOnj1rLmcceRoQEGBER0eb6+Lj441SpUqZ6zOOhMx87Ao6yurNN9+0Kuf48eOGYRhG3759zTQvL68sd/HVq1fP6m7DP/74w2p9SkqKER4ebv6d8W5FLy8v4+jRo1b5ExISrKbtuVMjN7t165brFD75ObevvPKKVdmZR2MahmF1p+upU6esRramT9ObkpJilChR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w8Pl7e0tHx8ftWrVyjwPkZGR5n6kpKRo165dKleunJo0aWK2LyYmRnXr1lWLFi2ylLt//35FRUXdlcBcSEiIHBwczKlpExISsn28TlRUlH755RdVr179turLeD0sSbNnzzb3OTU1NdfZhW73Ny4AuJ8R3AT+AQ4cOKAPPvhA8fHxOn78uJYuXWp18eTv7281ijPzHZHt27dXhw4ddPToUasvstkJCgoyR50tW7ZMr7/+uvz8/OTk5KQXXnghS9n9+vVTnz59dOHChVy/kH366aeaNm2aWrRooXLlyikgIEAJCQn68ccfrfKlB2Gff/55TZkyRXFxcYqPj1fDhg3Vo0cPlS9fXklJSTp27JjWrVunM2fOaPr06eYzRYoXLy4nJyclJiZKkj744ANFRETIzc1N5cuXV9euXXPd/1mzZpnbSmkj3zI/X0SSVq9ebV5MzZw5U//5z39kb2+v0aNHm3UkJyeradOm6tmzpypVqqTLly9r9erVat26tT7++GPZ2dlp1KhRGjFihKS0L/Y1atRQ7969FRwcrPPnz+vXX39VWFiYXnzxRUlpz/P46aefzPy1a9dWgwYN9Mcff+jcuXO57tutFPTchoWF6YsvvtCNGzckSa+88op+/fVXhYSEKCEhQTt37tTVq1ezBP169eql1157TRcvXrR6huKgQYNs5s7CmJgYffDBB5Kk69ev6+effzbfP1La9L/pF3QZj29UVJTatWunpk2baseOHVq4cGGOdfTr10+XLl1Sy5YtVbJkSfn5+enKlSuaNWuWmSfjnaevv/66evXqJUnmiNCuXbsqICBAMTExOnDggNasWaOYmBiFh4eb77lbefDBB9W0aVOtX79ehmHo5MmTktKmuEm/0E937Ngx1a9fX7Vq1VKdOnUUGBgoNzc37d692+qmjLxOPbx06VJ99tln8vf318MPP6yKFSvKzc1Np06dsgoM29vbq23btnkqEwAAAMirpUuX5jh6a+rUqQW+lpL+//EyUtpIxBdeeMG8qXH48OFydXXVq6++aj4TcNWqVapevbo6duwoX19fRUZGau/evVq3bp3i4uJyfERDXnl7e+vZZ581n6N46tQpVapUST179lRgYKBOnTqlJUuWaOrUqXrsscfM7ezs7PT8888rLCxMksxrvCJFiqhnz555rt/Ozk7PPvusORLzyJEjqlKlivr0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EhKiL7/8UmfPntX8+fMfcbWS5+LFi6pQoYIsFot69Oghb29vLV++XB07dtTNmzcfOZTrlClTVKRIETVs2FC2trZavHix3nnnHcXFxal79+5Wdf/55x81a9ZMHTt2VFBQkH744Qe1b99epUuXVpEiRazq9uzZU+7u7ho2bJhOnTqlzz//XD169NDcuXPNOsHBwRo+fLhq1Kihbt266ciRI5oyZYp27NihP//8U3Z2dvrggw9048YNnT17Vp999pkkycXFRdK96Z2+++47tWrVSp06dVJ4eLi+//571a5dWyEhISpZsqS8vb01ZcoUdevWTU2aNNHrr78u6d50SdK9hGXlypWVLVs2vffee3J2dta8efPUuHFjLVy4UE2aNJF070f51apVU0xMjFlv6tSpcnJySvS8li5dWpL0559/qlSpUsm5lACQthkAXhpDhw41cuTIYS5fu3bNcHJyMqZOnfrQdocPHzacnJyM8ePHG/v37zfs7e2NCRMmmOujoqIMScaUKVOs2p08edKQZCxevNiq/NdffzUkGSdOnDDL/vzzT0OS0bRpU7OsYsWKRpkyZYy4uLhE4/rmm28MScadO3esylu1amVUqVIlyXaGYRiTJk0ybG1tjX///dcs27x5syHJCAoKsqp76dIlQ5Lx+++/J7k9AAAAAACetjVr1hju7u6GJEOS0bt3b8Mw7v1N7eTkZJw6deqxt1myZEkjU6ZMxpUrV8yyffv2GenSpTPatWtnlq1bt86QZMyfP/+R25w2bZohyahdu7bV3+YVK1Y0LBaL0bVrV7MsJibG8PX1Nfz9/a22ERERYbUcHR1tFC1a1HjttdesykNDQw0PDw+jZs2aRlRUlFGqVCkjR44cxo0bNx4Zp6+vr9X3EPGGDRtmSDJatWqVYN2DcRmGYfz000+GJGPjxo1mWb169Yxy5cqZy6+//rrx+uuvGzY2Nsby5csNwzCM3bt3G5KM33777aFxVqxY0ShdurRVWUhIiCHJmDlz5kNjGz16tGGxWIzTp08nOL548d/fTJs2LUF7ScawYcPM5Y4dOxo+Pj5GWFiYVb2WLVsaGTNmTDSG+yW2vnbt2kaePHmsynLmzJngnF66dMlwcHAw+vXrZ5bF32s1atSwutf69Olj2NjYGNevX4tIgo4AAQAASURBVDfb2tvbG7Vq1TJiY2PNepMmTTIk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TSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJ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/viDESNGFNqvb9++LFmyhGnTprF582aaNm1Kjx492Lt3b6Ht1q5dy/bt23njjTd45pln2LJlC9OmTQPguuuu47nnngNg/fr17N69mw0bNvzXX5MQQgghxBkCgQAffPABvXv3plq1arz88sv06tWL/fv389lnnzFy5EgpsJzG9cNHJKyegZp/ajYRS7Urie71YKHiYUljrlib2L5TsNS4utB45lebiFv6MN608rlUhsFgoEuXLqxevZpjx47x1FNPsXv3bpo3b87111/P66+/HrwoUgghRNGSClEZ0//KbvS/sts5t2kUU5dG7cafcxsAuyWMEU3vYAR3/Os2Tks4b/V5BaPxzDU4h13Xn2HX9T9/6BMMOgNDru3LkGv7/us211W6iusqlc9F54UQQoiyYvDgwUycOBGAKlWq0KhRI3799Vd27NgBQIcOHVizZg3r16+nefNTF1+lpKSwadMmbrzxRgCuv/56atWqxZIlSxg1alRwu4oVK7JmzZrg7ffff58vvviCXbt20bp1awDatWtH9erVmTNnDq+//jodO3YkMjKSNWvWMHnyZKCgG+Hzzz9n7dq1ABw+fJj58+ezePFihg4dGswaHx/PE088Qbdup96DZWdns2nTJhwOB1DQTblgwQI++eQTbr65YB3y48ePM3r0aHJzcwkJCWH79u1s3bq1UM5bbrmFQ4cO8fTTT7Nu3brg8Y1GIxs3bgxetX3gwIHgekB2uz24DtC1114rXZtCCCGEuGQZGRksXryYefPm8fvvv9OiRQsWLFjAwIEDsVqtWscrcVQ1QNrOt8jcvbHQuO3K1jhu7IOiK/n9JjpLKJG3DCfnwBdkfLkeTnRseuJ/59iih4jqPIKwq1prnFI7TqeTCRMmMH78eHbt2sX8+fMZO3YskyZNYtiwYYwePZq6detqHVMIIcqskv83qRBCCCGEKFPat28f/L527dpAQbHxJJ1OR82aNYmLiyu0X0xMTLCwCVCtWjWuv/569uzZU2i7Ll26FLq9Z88eYmJiggVDgNDQULp168bnnxesD24wGOjTp0+houi6desIDQ2la9euAGzfvh2dTkfv3r3x+XzBr/bt27N37178fn9w3yZNmgQLmycfp8lkolWrVmc89uPHjwPw8ccfU6FCBVq2bHnG8U+fQhegbdu2haajatiwIUlJSXi95WuaMCGEEEIU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r72WTZs2FTrOu+++e0Hna9++PQkJCdhstrOe458cDge33347vXr14sCBA2fcHx0dzciRI7npppvOej/AlVdeSUhICOvWrSs0vnbtWurWrfuvXadCCCGEKLvS09MZOnQo3bt3p2XLluzbt08Km0XMn5NJ/FvTCxU2Fb2RyE73ENa4vRQ2SxFjeCwxfSZgu6pNofGcA18Qt3AC7mO/ahOslDvZxfnkk08ye/ZsmjVrxo8//qh1LCGEOC/p3BRCCCGEEMVKURSmTZvGHXfcwXfffcf06dMZO3YsR44c4eabbyYQCHDo0CF27tzJhg0bAJg6dSq33XYbY8aMoUePHnzxxRds3boVAJ3u3NfrdezYkU6dOtGxY0cmT55Mo0aNcLlc7N27F7fbzaxZs3j99dfZvXs3nTt3pmLFihw6dIi3336bIUOGAPD444+TlpYWnJL2hx9+4JNPPjlr1yYUdGaOGzeOGTNmBDtX169fz7Zt21i1atVl/GkKIYQQojR4//33ueeee/B6vaxevZoBAwZoHanM86TGkbD6aXwZicExnTWMqFtHYoqppmEycbEUvZHwlrdhrlKP9J0rgmun+jKTOb7sESJuHkD4jb1RdHqNk5YuBoOBqVOn0r17d+6++26aNGnCY489xtSpUzEYpHwghCiZ5NVJCCGEEEIUuwEDBjB9+nSeffZZPvjgAypVqsSLL77I888/j8VioW7duoU+9OvTpw+vvPIKzzzzDG+++SZt2rThueeeo3///tjt9nOeS1EU1q9fz8yZM3nppZc4evQoTqeTa665hvvvvx+Aq6++mnfffZfx48eTlpZGxYoVGT58OE899RQATZs25cUXX2T16tVkZWVRrVq1YFH23zz55JMYDAbmz59PYmIitWvXZsWKFQwcOPAy/ASFEEIIURp4vV6mTZvGc889R+/evfm///s/YmJitI5V5uUd2Ufi288Gi18ABmdFom4dhSFMlgco7azVrsTUbyppO5aRH3eoYFANkP7JKvL++pmYHg9gsEee+yDiDFdeeSVffvklc+bM4YknnuDjjz9m5cqVVK5cWetoQghxBkWVVZf/k/3793PllVeyb98+GjVqpFmO/mvu0+zcJdnaAfO1jiDOw+v1kpiYSGxsrMzhL/4Tee6Ii1Fanze//lowpVK9evUKjR+YMQt3QoIWkbBUqEDDR6Zqcu5/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81x22WVMmzaNESNGcMQRR/Diiy+Wfv/Nb36Tww47jK9//es0Nzez3377AXDllVcyc+ZMkskkkyZN4rOf/Sy5XLEy53vf+x633nort99+O4lEgkQiwcqVK0vr8Tpm1/m+zw9/+ENmzpxJQ0MDBxxwAA899BAADz30EK2trXz3u9/lz3/+c+m+jj32WNasWTNEj3LvhGHA5n/8gU0PXt8j2Ezs/W5GnnD+DoNNgEwuT8Q0h0WwCdCazqAoCg0yZ3OXHNdjU2s7W9MZTENndMdMzVoONuuFoijEoxHGNDWSiEeLVbVbWsna+UovrarFIhaxiEVbOjMsKl4VRSERi2AXCjXRxlhPjWLMKf9Lcv9jga6K8Nxb/2H1jV/AXrFwu+vsu+++7LPPPv3+ApMQw428gwshhBBCCCGEEGLYW7x4MYsXL+acc87Z7ndz5szhXe96F/fff39p32233cZ///tfli1bhuM4PdrFXnDBBTz//PP885//ZOPGjZxxxhkcf/zxtLa2li7z3HPPYRgGS5cu5b///S8AM2bM4NFHH6W9vZ2//e1vPPTQQ3z7298G4LLLLuOss87izDPPJJPJkMlkmDx58nZr/elPf8rPfvYz/vSnP7F582a+9KUvccopp/DCCy9wyy238M53vhPXdbn77rv5z3/+w+rVq8nlclx22WWD9EgOXOAWaPnLj2h79p6unYpCw/98kMbDTkfZSSBVcFxczxs2szZz+TwFx6UxFZcqt50Iw5D2TI5NrW2oilJqhVoPLYvbsi5vr8vy5KI2/vtWK21Zl2zeo+AGBDXYqE9RFJKxKGObGolGLNoyWTa3tsscv11IxWMoikJbOlvppQyJqGWhqWrNBN+KptFw0PsZdfJFqLFUab+f3sK6W77JliduIwx6vr4//OEPc9ddd2Hb1TtfVIhqUZv9CoQQQgghhBBCCCEG0caNxXmOEyZM2OHvJ06c2KM686qrrqKpqQkozr56xzvewapVq4jFYtx888288cYbTJxYnAd58cUX87Of/Yz777+/FIKOHTuWr3/96z1m/J199tmln/faay8uuugibrnlFq666qpeH8evf/1rLr30UubOnQvAhz70IW677TauvfZa7rvvPi6++GJeeeUVrrrqKhoaGgD4yEc+wnXXXdfr+ygnL9PKhjuvorD27dI+RTdpOvZcolP23uV10zkb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++/P0/tVPvfcc1qzZk2enf9yVatW1Zo1a7R48WL98MMPqlatml577TWlpaXly/UBFDxr1qzR3XffnetT0LZo0UIeHh6y2WxZHosWLcqlyq+ubNmyevfdd/P8OgAKN8JNAAAAAAAAFHr333+/fH19tWvXLiUkJOiPP/7Qww8/nOM/8hfE+1uaTCb16NFDe/fu1cCBA/Xcc8/prrvu0ieffCLDMFxdHoB88ttvv6ldu3Zq3769ypYtmydT0I4ePVoJCQlZHg8//HCunR8AbgXhJgAAAAAAAAq1ixcvOu9NGRQUJEkKCwtTv379VLRoUUnSL7/8ohYtWig4OFhlypTR888/r4yMDOc5TCaT3njjDTVp0kQ+Pj5auHChvL299f3332e51tNPP63OnTtLkiZOnKimTZs6tyUnJ2v8+PGqXLmyfH19Vb58eX344YfO7d9++60aNWqkwMBAVapUSW+99VaOnq/NZtPUqVO1d+9eNWzYUH379lXdunW1cuXKHJ0PQOFw6NAh9ezZUw0aNND58+e1atUqffvtt/k6BW1ERITuuece56jxgwcPKiAgQEuWLJEkbdy4UU2aNFFwcLACAwPVqlUrbd++Pcs5tmzZolatWqlIkSIKCgpSy5YtlZycrA4dOuj48eMaMmSIbDabqlevnm/PC0DhQrgJAAAAAACAQi04OFg1a9ZUZGSkPvjgA+3YsUMOh8O5ff/+/WrdurUGDBigs2fPavPmzfr66681bdq0LOf5f//v/+ndd99VQkKCevbsqe7du+u9995zbk9JSdEnn3yiiIiIbOt46qmntGbNGn311VeKi4vTDz/8oJo1a0qSNmzYoD59+ujll1/WxYsX9cUXX+jVV1/VggULcvy8K1SooIULF+r3339XWFiY7r//frVs2VI///xzjs8JoOA5c+aMBgwYoLvuuku//fabFixYoN9++03t27e/5Slob9asWbOUkZGh4cOHKykpSQ8++KCeeOIJ9ejRQ5JksVj02muv6fTp0zp+/LgqVqyoLl26OMPQ3bt3q1WrVnrooYd0/PhxnTlzRhMmTJDZbNbKlStVunRpzZo1SwkJCdq9e3e+PjcAhQfhJgAAAAAAAAq9DRs2qEOHDpozZ44aNmyoIkWKaOTIkUpNTdX//vc/derUSb169ZK7u7vKlCmj0aNH64MPPshyjuHDh+uuu+6S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X2ru3LmaM2eOBgwY4Gzv0KGDihYtqueee05t27ZV3bp187SO3PjMKlmypEqWLJlLFQEAAAAAAOByTEt7B/vuu+/UqFEjWa1WhYWFadCgQUpISHBu37hxo0wmk1avXq3OnTvLZrNpyJAhzvb169erS5cu8vHxUaVKlbRmzRrZ7XaNGjVKRYoUUYkSJa4YfbNlyxZ17txZxYoVk4+Pj2rXrq0FCxY4t8+fP19Dhw6VJOfUlS1atMiX1wM3hn6D3PTqq6/KarVqz549zratW7fK3d1d8+bNkyQlJiZqyJAhqlKliry9vVWuXDkNHjxYcXFxWc5lt9v1yiuvqHLlyvL09FTJkiX12GOPSbo09ehvv/2mDz/80NlH5s+fn19PE9mIiYlR0aJFr2g3mUxZ1lNSUjR69GiVKlVKnp6euvvuu/Xtt99m2ads2bIaMWKEpkyZopIlS8rPz0/z58+Xh4eHYmJisuy7e/dumUwmrVu3TlL209Lu2LFDnTp1UkBAgGw2mxo2bKi1a9c6t0dFRal///4KCwuT1WpVkyZN9Msvv9zKywFJb775pipWrKinnnrqim3PPfecfH19NWvWLEn//NzeeecdlS1bVl5eXurYsaNOnjyZ5bic9h/p1j57spuW9siRI+ratav8/Pzk6+urTp066dChQ1n2MZlMevPNN/Xcc88pJCREoaGhGjx4sFJTU3PwigIAAAAAANyeGLl5B8jIyMiy7ubmpj179ui+++5T27ZttXTpUp04cUJjx47V4cOHr5g+8sknn9Tjjz+uZ555RlarVWlpaZKkyMhIRUZGavDgwZo+fbq6d++u//znPzIMQwsXLtSKFSs0YsQIhYeHq1GjRpKkY8eOKTw8XAMGDJDVatWPP/6oxx9/XGazWb1791bHjh01YsQIvf7669qyZYskOf/IiPxFv0Fu+nd/ki6N6BwxYoS++uor9evXT1u2bFFGRob69eundu3aOQOOpKQk2e12vfTSSwoJCdGJEyf00ksvqUePHlq9erXzfJGRkfroo480evRoNW/eXFFRUVq6dKmkS1OPPvTQQypfvryef/55SVKFChXy4ZnjaurWrau3335bpUuX1gMPPKDg4OBs9+vevbtz6s8KFSpo8eLF6ty5s7Zt26batWs791u4cKGqV6+u2bNnKyMjQ61atVJkZKS++OILPf744879Fi1a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nG2///67jh8/7lz/8ccfde7cOTVs2FDSrfWf3P7sadSokX777TcdOXLE2Xby5En99NNPefb5CQAAAAAAcLti5OYdavz48apTp466du2qgQMH6u+//9aYMWPUvn37LPdNzE3+/v5q0KCBJk+eLD8/P5nNZk2dOlX+/v6Ki4tz7le1alVJ0ptvvqlWrVrJz89PVapUyZOacHPoN8iJjIwM/fzzz1e0lypVSoZhaNiwYRo1apQaNWqkRo0aaenSperXr5/++OMPWa1WtW3bVoMHD9ZLL72kRo0a6dtvv9X69euznCvznrAjRozQuXPn1KxZM8XExOjzzz/XZ599JulSH1m9erVWr16t4OBglStXTsHBwfnyGuBKNWvWVJcuXdSuXTuFhobq2LFjeu211+Tt7a1+/fpJktq2bav27durbdu2GjNmjKpXr664uDht375dKSkpeuWVV657nfvvv1/e3t6KjIxUuXLlnMHX1UyYMEENGjRQs2bNNGLECAUHB+uPP/5QcHCwnnjiCT366KOaO3euWrRooZEjR6p8+fK6ePGitm7dqqJFi2r48OG58vrcibp27aoBAwZo8ODB2rNnjx544AFlZGRo0aJFmj9/vl555RXVrVvXuX9ISIg6duyoSZMmKSUlRWPGjFHdunV13333Sbq1/pPbnz2PPfaYpk2bpg4dOmjy5Mlyc3PTpEmTVKRIEUVGRubWSwgAAAAAAHBHYOTmHap69epauXKlzp07pwcffFDjx49X79699fnnn+fpdRcuXKjy5cvr0Ucf1bBhw/TQQw/p0UcfzbLPvffeq1GjRunNN99Uo0aN+KNfAUK/QU7ExsaqcePGVzw++OADRUREqGTJkpo0aZJz//fee09nzpzRuHHjJEmRkZEaMWKE3nzzTT344IM6duyYFi5ceMV1Zs+erQkTJuiTTz7R/fffr2eeeUbe3t7O7ePHj1e1atXUs2dPNWjQQN98803eP3lc1QsvvKCjR4/q6aefVrt27fT888+revXq2rp1q8qVKyfp0lShy5Yt0xNPPKGZM2eqffv2ioyM1JYtW254tJuXl5c6d+6s06dP6+GHH77u/lWqVNEPP/ygIkWKKCIiQt26ddPnn3+uMmXKSJKsVqs2bNigtm3basKECWrXrp2GDRumgwcPXjc4xfXNnj1b8+bN05YtW9SlSxf16NFDhw8f1ldffaWxY8dm2bdJkyYaPHiwnnnmGT355JOqUaNGlilob7X/5OZnj6enp9atW6eqVavqySefVL9+/VS6dGlt3LiRaWkBAAAAAABukskwDMPVRQAAAAA3qkWLFipSpEief7kGAAAAAAAABQ8jNwEAAAAAAAAAAAAUCoSbAAAAAAAAAAAAAAoFpqUFAAAAAAAAAAAAUCgwchMAAAAAAAAAAABAoUC4CQAAAAAAAAAAAKBQINwEblOGYah27dr68MMPc+2caWlpmjhxorZv355r57wRW7du1cSJE3P1nPXr19djjz3mXB8yZIiefPLJXL0GAAAAAAAAAADIXYSbwG1q8eLFioqKUp8+fXLtnGlpaZo0aZJLws1Jkybl6TVGjhypBQsW6NChQ3l6HQAAAAAAAAAAkHOEm8Bt6q233lLfvn1lsVhccv3k5GSXXDenypYtq6ZNm2rOnDmuLgUAAAAAAAAAAFwF4SZwGzp06JB++uknde/ePUv7u+++q+rVq8vT01NlypTR9OnTndt+/vlnubu76/3333e2xcbGqlSpUvrPf/4jSfL19ZUkPf744zKZTDKZTDp69KiOHj0qk8mkBQsW6NFHH1VAQIA6deokSfroo4/UtGlTBQUFKTAwUC1bttS2bduuqHnz5s1q2bKlbDab/P391aJFC/3xxx+aP3++hg4dKknOa7Zo0cJ53K5du9SxY0f5+vrK19dXPXr00JkzZ7Kce9euXQoPD5fValW1atX09ddfZ/u6PfTQQ1qwYIEcDseNvtQAAAAAAAAAACAfEW4Ct6H169fLx8dHd999t7Pt1Vdf1cCBA9W1a1ctX75cAwcO1PPPP69Zs2ZJku655x6NGjVKw4cP1/HjxyVJTz/9tBwOh3Of7777TpI0fvx4bdmyRVu2bFGxYsWc1xg5cqR8fX21ZMkSPffcc5Kko0eP6tFHH9WSJUu0cOFClSpVSvfee68OHz7sPG7jxo1q3bq1LBaLPvzwQy1atEj33nuvTp48qY4dO2rEiBGS5Lzm7NmzJV0KccPDw5WSkqJPPvlE8+fP1+7du9WpUycZhiHp0gjS9u3bKyEhQQsXLtT48eP1zDPPOJ/j5Zo0aaKzZ89q586dufODAAAAAAAAAAAAucpkZCYAAG4b/fv31x9//KFff/1VkhQXF6fixYtr1KhRmjBhgnO/F154Qe+8845OnjwpNzc3paWlqX79+goNDdXQoUPVtWtXffvtt+rQoYMkKSEhQb6+vvrggw/02GOPOc9z9OhRlStXTl27dtUXX3xx1bocDoccDodq1KihPn366IUXXpAkNW7cWOnp6fr1119lMpmuOG7WrFkaOnSo/v121bdvX23dulU7d+6Uh4eHJOngwYOqWrWqvv76a3Xs2FGzZ8/WsGHDdOTIEZUsWVKS9OOPP6pp06bq16+f5s+f7zxfRkaGrFar5syZo6eeeuomXnEAAAAAAAAAAJAfGLkJ3IbOnDmjIkWKONe3bNmixMRE9ejRQxkZGc5Hq1atdPbsWf3999+SJA8PD3300UfavHmzHn74YUVERDiDzRvRsWPHK9r27t2rbt26KSwsTG5ubrJYLNq/f78OHDggSUpMTNQvv/yifv36ZRtsXsu6devUrVs3mc1m53MqV66cypYt65z6duvWrapXr54z2JSk8PBwhYaGXnE+d3d3BQQEXDGtLQAAAAAAAAAAKBgIN4HbUEpKijw9PZ3rFy5ckCRVr15dFovF+WjZsqUk6cSJE8597777bt11111KTU3VoEGDbuq6YWFhWdbj4+PVrl07nThxQjNmzND333+vX3/9VXfffbdSUlIkSdHR0TIMI8v0tjfqwoULmjZtWpbnZLFYdPjwYedzOnPmTLZBZnZtkuTp6emsDQAAAAAAAAAAFCzuri4AQO4LCgrKMvowKChIkrR8+fIrAkhJqlKlinN55syZ2rdvn6pVq6ann35amzZtktl8Y9+D+PfIyy1btujvv//W2rVrVbVqVWd7bGysczkwMFBms1mnT5++sSd3maCgIHXr1k0RERFXbMscuVq0aFHt27fviu3nzp3L9pwxMTHO1wsAAAAAAAAAABQshJvAbahKlSrasmWLc71x48by8vLSqVOnsp06NtP+/fs1btw4vfjii7rvvvtUr149vfHGGxoxYoQkOe9reaMjG5OTkyUpyyjSn376SUePHlW9evUkST4+PmrUqJE++ugjDRkyJNupaS+/rtVqdba3bt1au3fvVr169a46pW2DBg20YMEC/f3331nuuZlduHn+/HklJSWpcuXKN/T8AAAAAAAAAABA/mJaWuA2FB4eruPHj+v8+fOSpICAAE2cOFHDhg3T+PHjtWbNGq1atUpvvfWWunXrJkmy2+3q16+f6tSpo2ef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\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Saved → compare_dataset.png\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.patches as mpatches\n", + "from matplotlib.gridspec import GridSpec\n", + "\n", + "COLOR_BASE = \"#4C72B0\"\n", + "COLOR_SFT = \"#DD8452\"\n", + "COLOR_POS = \"#55A868\"\n", + "COLOR_NEG = \"#C44E52\"\n", + "\n", + "plt.rcParams.update({\n", + " \"figure.dpi\": 120,\n", + " \"font.family\": \"DejaVu Sans\",\n", + " \"font.size\": 11,\n", + " \"axes.titlesize\": 12,\n", + " \"axes.titleweight\": \"bold\",\n", + " \"axes.labelsize\": 10,\n", + " \"axes.spines.top\": False,\n", + " \"axes.spines.right\": False,\n", + " \"axes.grid\": True,\n", + " \"grid.alpha\": 0.35,\n", + " \"legend.framealpha\": 0.9,\n", + " \"legend.fontsize\": 9,\n", + " \"xtick.labelsize\": 9,\n", + " \"ytick.labelsize\": 9,\n", + "})\n", + "\n", + "\n", + "# ── helper: annotate bars ───────────────────────────────────────────────────\n", + "def annotate_bars(ax, bars, fmt=\"{:.1f}\", offset=0.5, color=None, fontsize=8):\n", + " for bar in bars:\n", + " h = bar.get_height()\n", + " ax.text(\n", + " bar.get_x() + bar.get_width() / 2, h + offset,\n", + " fmt.format(h), ha=\"center\", va=\"bottom\",\n", + " fontsize=fontsize, fontweight=\"bold\",\n", + " color=color or bar.get_facecolor(),\n", + " )\n", + "\n", + "\n", + "# ═══════════════════════════════════════════════════════════════════════════\n", + "# Figure 1 — Dataset eval (2x2)\n", + "# ═══════════════════════════════════════════════════════════════════════════\n", + "acc_keys = [\"format_pct\", \"format_after_extract_pct\", \"exact_pct\",\n", + " \"service_pct\", \"operation_pct\"]\n", + "acc_labels = [\"Format\", \"Format\\n(extracted)\", \"Exact\", \"Service\", \"Operation\"]\n", + "base_acc = [base_ds_metrics[k] * 100 for k in acc_keys]\n", + "sft_acc = [sft_ds_metrics[k] * 100 for k in acc_keys]\n", + "delta_acc = [s - b for s, b in zip(sft_acc, base_acc)]\n", + "\n", + "lat_labels = [\"Avg Latency (s)\", \"Avg Resp Len\"]\n", + "base_lat = [base_ds_metrics[\"avg_latency\"], base_ds_metrics[\"avg_len\"]]\n", + "sft_lat = [sft_ds_metrics[\"avg_latency\"], sft_ds_metrics[\"avg_len\"]]\n", + "\n", + "fig1 = plt.figure(figsize=(18, 14))\n", + "gs1 = GridSpec(2, 2, figure=fig1, hspace=0.48, wspace=0.38)\n", + "ax1, ax2 = fig1.add_subplot(gs1[0, 0]), fig1.add_subplot(gs1[0, 1])\n", + "ax3 = fig1.add_subplot(gs1[1, 0])\n", + "ax4 = fig1.add_subplot(gs1[1, 1], polar=True)\n", + "\n", + "# 1a. Grouped bar — accuracy\n", + "x, w = np.arange(len(acc_labels)), 0.35\n", + "annotate_bars(ax1, ax1.bar(x - w/2, base_acc, w, color=COLOR_BASE,\n", + " label=\"Base\", edgecolor=\"white\", linewidth=0.6), fmt=\"{:.1f}%\")\n", + "annotate_bars(ax1, ax1.bar(x + w/2, sft_acc, w, color=COLOR_SFT,\n", + " label=\"SFT\", edgecolor=\"white\", linewidth=0.6), fmt=\"{:.1f}%\")\n", + "ax1.set(title=\"Dataset Accuracy — Base vs SFT\", ylabel=\"Score (%)\",\n", + " xlabel=\"Metric\", ylim=(0, 118))\n", + "ax1.set_xticks(x); ax1.set_xticklabels(acc_labels)\n", + "ax1.legend(); ax1.set_axisbelow(True)\n", + "\n", + "# 1b. Horizontal bar — latency / length (dual x-axes not needed; normalize)\n", + "y, h = np.arange(len(lat_labels)), 0.35\n", + "# Normalize each metric independently so bars fit on one scale\n", + "max_vals = [max(base_lat[i], sft_lat[i]) for i in range(len(lat_labels))]\n", + "base_norm = [base_lat[i] / max_vals[i] * 100 for i in range(len(lat_labels))]\n", + "sft_norm = [sft_lat[i] / max_vals[i] * 100 for i in range(len(lat_labels))]\n", + "hb = ax2.barh(y + h/2, base_norm, h, color=COLOR_BASE, label=\"Base\",\n", + " edgecolor=\"white\", linewidth=0.6)\n", + "hs = ax2.barh(y - h/2, sft_norm, h, color=COLOR_SFT, label=\"SFT\",\n", + " edgecolor=\"white\", linewidth=0.6)\n", + "for bar, raw in zip(list(hb) + list(hs),\n", + " [base_lat[0], base_lat[1], sft_lat[0], sft_lat[1]]):\n", + " ax2.text(bar.get_width() + 1, bar.get_y() + bar.get_height()/2,\n", + " f\"{raw:.2f}\", va=\"center\", fontsize=9, fontweight=\"bold\")\n", + "ax2.set(title=\"Latency & Response Length\", xlabel=\"% of max (raw value annotated)\")\n", + "ax2.set_yticks(y); ax2.set_yticklabels(lat_labels)\n", + "ax2.set_xlim(0, 130); ax2.legend(loc=\"lower right\"); ax2.set_axisbelow(True)\n", + "\n", + "# 1c. Delta bar\n", + "colors_d = [COLOR_POS if d >= 0 else COLOR_NEG for d in delta_acc]\n", + "bars_d = ax3.bar(x, delta_acc, 0.5, color=colors_d, edgecolor=\"white\", linewidth=0.6)\n", + "for bar, d in zip(bars_d, delta_acc):\n", + " ax3.text(bar.get_x() + bar.get_width()/2,\n", + " bar.get_height() + (0.4 if d >= 0 else -1.2),\n", + " f\"{d:+.1f}pt\", ha=\"center\", va=\"bottom\", fontsize=9, fontweight=\"bold\",\n", + " color=COLOR_POS if d >= 0 else COLOR_NEG)\n", + "ax3.axhline(0, color=\"#333\", lw=0.9)\n", + "ax3.set(title=\"Delta: SFT − Base (dataset, pp)\", ylabel=\"Δ pp\", xlabel=\"Metric\")\n", + "ax3.set_xticks(x); ax3.set_xticklabels(acc_labels)\n", + "ax3.legend(handles=[mpatches.Patch(color=COLOR_POS, label=\"Improvement\"),\n", + " mpatches.Patch(color=COLOR_NEG, label=\"Regression\")])\n", + "ax3.set_axisbelow(True)\n", + "\n", + "# 1d. Radar\n", + "N = len(acc_labels)\n", + "angles = np.linspace(0, 2*np.pi, N, endpoint=False).tolist() + [0]\n", + "ax4.set_theta_offset(np.pi / 2); ax4.set_theta_direction(-1)\n", + "ax4.set_thetagrids(np.degrees(angles[:-1]), acc_labels, fontsize=8)\n", + "for vals, color, label in [(base_acc + base_acc[:1], COLOR_BASE, \"Base\"),\n", + " (sft_acc + sft_acc[:1], COLOR_SFT, \"SFT\")]:\n", + " ax4.plot(angles, vals, color=color, linewidth=2, label=label)\n", + " ax4.fill(angles, vals, color=color, alpha=0.15)\n", + "ax4.set_ylim(0, 100)\n", + "ax4.set_yticks([20, 40, 60, 80, 100])\n", + "ax4.set_yticklabels([\"20%\", \"40%\", \"60%\", \"80%\", \"100%\"], fontsize=7)\n", + "ax4.set_title(\"Capability Profile (Dataset)\", pad=20, fontweight=\"bold\")\n", + "ax4.legend(loc=\"upper right\", bbox_to_anchor=(1.35, 1.15))\n", + "\n", + "fig1.suptitle(\"Part 1 — Dataset Eval: Base vs SFT\",\n", + " fontsize=15, fontweight=\"bold\", y=1.01)\n", + "plt.savefig(\"compare_dataset.png\", dpi=150, bbox_inches=\"tight\", facecolor=\"white\")\n", + "plt.show()\n", + "print(\"Saved → compare_dataset.png\")" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "cell-rl-plots", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 958 + }, + "id": "cell-rl-plots", + "outputId": "c1ec1dc2-7669-4648-c489-2a40ea4ed8ec" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/tmp/ipykernel_1212/2595381142.py:87: MatplotlibDeprecationWarning: The 'labels' parameter of boxplot() has been renamed 'tick_labels' since Matplotlib 3.9; support for the old name will be dropped in 3.11.\n", + " bp = rax6.boxplot(\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "iVBORw0KGgoAAAANSUhEUgAAB5gAAAVzCAYAAAAfQvFEAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjAsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvlHJYcgAAAAlwSFlzAAASdAAAEnQB3mYfeAABAABJREFUeJzs3Xd4FUX/9/FPeiEJNaF3CR2kF+lFmjSlCUgHBW7AAihFgVssCKK3ioiCoCgdBBGRZpAiHaR3AkjvnUBI5vmDJ/vL5pwkJyEQ0Pfrus51ZXdnZmf37Dlnst+dGTdjjBEAAAAAAAAAAAAAAIlwT+0KAAAAAAAAAAAAAACeDASYAQAAAAAAAAAAAAAuIcAMAAAAAAAAAAAAAHAJAWYAAAAAAAAAAAAAgEsIMAMAAAAAAAAAAAAAXEKAGQAAAAAAAAAAAADgEgLMAAAAAAAAAAAAAACXEGAGAAAAAAAAAAAAALiEADMAAAAAAAAAAAAAwCUEmAEAAAAAAAAAAAAALiHADAAAAAAAAAAAAABwCQFmAAAAAE+co0ePys3NzfZauXJlalcL+MeoXLmy9dnKly+f7t27l9pVckmnTp1s3ws1atRI7SrhH2TKlCkOvz1PouHDh9uOIU+ePKldpX+llHof3nnnHasMT09P7d27N2UrCgAA4AQBZgAA8FDUqFHD4QZc7JePj48yZ86satWqafjw4Tp27FhqV9mycuVKDR8+3Hp9+umnD1zmsWPH9P3336tbt24qV66cgoOD5e3tLT8/P2XPnl0NGjTQ+PHjdfPmzQc/gMdAQu+9l5eX0qVLp+LFi6tDhw5auHBhgmU5u5ZSkrNAZWKvV199NUXr8CitXLkyycebEp+BJ11C32keHh4KDAxUvnz51LBhQ3388ce6ePFialcZLjh16pRGjBihqlWrWt/LgYGByp07t0qXLq1WrVrpvffe06JFixQREeGQP25wwJXXX3/9JckxEJqc19GjRx/KeZk9e7bWrVtnLb/11lvy9PS0pUnqd8kXX3yRrLocPXrU9ps8fPhwXbly5UEODykkMjJS06ZN0+uvv64aNWqoQIECypAhgzw9PRUYGKj8+fOrcePG+uKLL3T9+vXUri7wj9WvXz8FBARIkqKiojRgwIBUrhEAAPg38Ew8CQAAQMq7e/euzp07p3Pnzmn16tUaNWqUPvroI/Xp0ye1q6aVK1dqxIgR1nLu3LkfKKC4detWlSlTxum2yMhInTp1SqdOndJvv/2mDz/8UHPnzlXZsmWTvb/H3b1793T16lVdvXpVu3bt0tSpU1W3bl3NmzfPujkGPEmio6N148YN3bhxQ+Hh4Vq8eLHeffddzZ07V7Vr107t6iEeM2fOVLdu3XTjxg3b+sjISN24cUPHjx/Xtm3bNHv2bEnSzp07VaxYsdSo6iMVGRmpQYMGWcvZs2dXp06dUq0+R48etf0mS/eD8+nSpUudCsFy8eJFtWvXzum2mO/EI0eO6JdfftF///tfzZkzR9WqVXvEtQT++TJmzKhXXnlFY8aMkSQtWrRIv//+u2rVqpXKNQMAAP9k9GAGAACPhYiICPXt21fTpk1L7aqkuOjoaJfTHj9+XM8++6zOnDnzEGv0+Fm2bJkGDx6c2tUAUszVq1fVunVrXb16NbWrAic2bdqkdu3aOQSXcb/38uHDh63ljh07ytvbOxVrlDRjxoxReHi49ZoxY0ZqV+mRunv3rowxLqW9c+fOQ67N/zl//ryaN2+uS5cuPbJ9PgwtWrSwXV/h4eGpXSVAktS9e3fb8qhRo1KpJgAA4N+CHswAAOCRibkJFxUVpaNHj2r06NFasmSJLc2QIUPUtm3b1KjeQ+fj46OWLVuqcePGKlKkiCIiIrRs2TK9//77tiDH5cuX9cknn/yjbgxVqFBBM2bMkDFG586d09SpUzVu3DhbmqlTp+rTTz+Vu3vqPwP5wgsvWL1AnAkKCnqEtXn4+vXrl2Av/QwZMjy6yjxBYn+n7d27V/369dORI0es7RcvXtRvv/2m1q1bp1YVEY8PP/xQUVFR1nLGjBn1zjvvqHLlykqXLp1u3rypQ4cOadOmTVq8eLF27NjhctnTp09XxYoV492eLVs2SfcDocOHD3fY3r9/f82dO9e2bvXq1cqRI4dDWmfrHtT48eNty/H1UI0rse+RjBkzPki1XJYpUyZlypTpkezrcRMREaFmzZopX758GjduXIJTSmzYsEEvvPCCpk+frqpVqyZrf25ubipevLjq1aunSpUqKWvWrMqYMaOuXLmisLAwjRw50ta+uXTpkhYuXKiOHTsma3+Pg4CAAEZbwWMpNDRUZcuW1ebNmyXdf3jz8OHDyp8/fyrXDAAA/GMZAACAh6B69epGku0V1507d0y+fPkc0h08eNAYY0xkZKT54YcfzOuvv25q1aplQkNDTaZMmYynp6cJCAgwefPmNc2aNTPfffeduXPnjtN6hIWFOZQfHh5uDhw4YDp37mxy5sxpvLy8TO7cuU3Hjh0d0sb3mjx5ssvn4q+//jL/+c9/zLlz55xunzdvnkP55cuXd7n8x1Hc46levbpDmtKlSzukO3v2rEM6V66lBxEeHu5QfseOHZNURnzX2alTp0zfvn1Nvnz5jI+Pj8mYMaNp3LixWb9+vS3/3bt3TUhIiC3/Z5995nRfR44ccdjXH3/88UB1HTZsmEt5U7Ke8+bNM4MGDTL16tUzhQoVMiEhIcbLy8v4+/ubnDlzmgYNGphx48aZ69evOy3f2fsWFhbmkC537tzJOta4XLkOp02b5pDmww8/dEi3fv16895775kXXnjBlChRwmTPnt34+voaHx8fExISYqpWrWrefvttc+zYsXjrExkZaSZPnmyee+45kytXLuPn52e8vLxMlixZTPHixU2bNm3M2LFjzbZt2+ItY+fOnaZv377m6aefNunTpzdeXl4mODjY1KhRw4wdO9bcuHEjyecpJa+RS5cumffee89UrVrVhISEGG9vb+Pn52dy5cplypUrZ7p3726++eYb8/fffye5nsHBwbb9TpkyJcH027dvN5cuXXJYP2zYMJeuw6Rw9lsUHh7+QGW6au/evbb9FitWLN60cb9LkvvZis/kyZNd/k2O/Z0d9/w5+/2JER4ebt566y1Tvnx5kzFjRuPl5WUyZMhgKlWqZP773/+aCxcuxJvXWbvg6tWrZvDgwaZw4cLGz8/P4b1bvny5ad++vSlYsKAJCAgwnp6eJmPGjKZQoUKmUaNGZvjw4ea3335L1vmKjIw09erVs+rTs2dPEx0d7TTt+vXrTdq0aY0kkyZNGrN27dpk7TMxX3/9tUvfiUmxdu1a0717d1OkSBETFBRkfe/Vr1/fTJw40dy9e9dpvvh+p0+cOGF69+5t8ubNa3x8fEzmzJlNq1atzPbt252W4+y6jCs6OtrMnTvXvPDCCyZ//vzG39/feHp6mpCQEFO0aFHTvHlz88EHH5g1a9bEe5wHDhww/fv3N2XLljUZMmQwnp6eJn369Obpp582ffv2Nbt27Ur0XE2dOtU888wzJjAw0AQGBpry5cubr7/+2kRHRzt8d+XOnTvecs6ePWveffddU61aNRMcHGy8vLxMunTpTKlSpczAgQMT/A5Oid8qVyxevNi0b9/ePPXUUyYgIMD4+PiYHDlymObNm5tZs2bF+1m4fv26+fbbb81//vMfU7VqVfPUU09Z5zsoKMiEhoaa1q1bm3nz5sVbRmyrV682PXr0MMWLF7d+VzNnzmxKlSpl+vbta1avXm1LH9/7sGPHDtO+fXuTNWtW4+3tbXLkyGG6d+9uTpw4keD+x4wZYyvvrbfecu0EAgAAJAMBZgAA8FC4GhRs0aKFQ7o///zTGGPM5cuXXb65XLx4cXPy5EmH8p3dUPzmm2+sG7+xb+g8rABzYqKiokxAQICt/EKFCqVY+akh7vlydoO/VatWDulu3rzpkO5JDTBPnDjRBAUFOb1+vL29zZIlS2xlvP7667Y0FStWdLqvkSNH2tIVKFDggeualMBQStUzJriR2Ct37txm586dDuU/jgHm6dOnO6SZMGGCQ7qmTZu6dOxp0qQxM2bMcMh/+/ZtU6VKFZfKqFevnkP+O3fumP/85z+J5s2ePbvDwxCuSIlrZP/+/SZr1qwuHeMHH3yQ5Dp6eXnZyvj888+TXIYx/7wA89ixY2377dWrV7xp436X5M6d22TPnt14eXmZoKAgU6RIEfPyyy+bLVu2JKsuDzPAHB0dbUaOHGk8PT0TLDddunRm4cKFTusXN+27775r8ubNG+9798Ybb7h0LD4+Psk6X8Y4Xo/Ogsyxg8uSTGhoqNP2U0qYMGGCw/HNmjUrWWVdvXrVtGzZMtHzV6RIEbN//36H/M5++6ZOnRrvb5Gnp6fT79/EAszR0dEu1VOSKViwoEP5UVFRZujQocbd3T3BvG5ubua1114zkZGRDmXcu3fPvPjii/HmbdiwoRk0aJDD59eZSZMmGX9//0Sv2YkTJzrkfdDfKlecOnXK1KhRI9Hyq1SpYk6fPu2Qf9u2bS5/z9SoUcNcu3bNaT3Onz9vnnvuuUTLaNq0qS2fswDzhAkTHH6jYl7ZsmVLMMi8YcMGW/qSJUsm67wCAAC4IvXHHwQAAP9axhjt3bvXYX369OmTXNbOnTtdHoa2Z8+eun37dpL38SjlzZs3tavw0O3fv9+2HBoaKn9//1SqTcrr3r27rl275nTb3bt31aNHD9sQvV26dLGlWb9+vdO5HadPn25b7ty5cwrU1nWPup7Hjh1T06ZNFRkZmaz8D9PRo0d19OhRHT58WL/++qvefvtt23ZPT0/Vr18/2eXfvHlTHTp0cPieHDdunNasWZPscjt37qwvvvgi0XQnT55U3bp1tWfPniSVnxLXyBtvvKHTp08nab9JkSVLFtvyG2+8oU6dOmnGjBk6fPiwy3PY/tOsXLnStlyhQgWX8x47dkwnT55UZGSkrl27pj179mjChAkqU6aMXn31VUVHR6dwbZNvyJAhGjp0qO7du5dguitXrqh58+YKCwtLtMwRI0bEOx/v5s2b9fHHHyerrkkxfPhwDRs2zFoeP368evfubV3PGzZsUL169ay54UNDQxUWFmYN2/4gzpw5o6NHj+rgwYNat26dPvjgA73xxhu2NLlz51bjxo2TXHZkZKSaNGmi2bNnJ5p2z549qlWrlkvfH126dLHORVz37t1Thw4dkjQ8viTNmzfPpXrGZ+DAgRo5cmSinxdjjD755BP16tXLYdu7777r8P0a26+//qr//e9/idbl66+/VteuXXXr1q0E0925c0fdunXT1KlTbesf9LcqMVevXlXt2rUdvrecWbNmjerVq6ebN28me38rV650er6vX7+uOnXq6Jdffkl22TFOnjypl19+Od42z6lTp/TWW2/Fm//pp5+Wj4+Ptbxjx44nft5zAADw+CLADAAAHrmoqCgdPnxY3bt31+7du23bQkJCFBoaai0XKFBAr732mubMmaNVq1Zp37592rVrl5YsWeIwh9+aNWu0fv36RPd/7949lStXTgsXLtT+/fv1xx9/qE+fPhozZozCw8PVr18/W/rs2bMrPDzc9mrRosUDnAG7OXPm2OYolKQ2bdqkWPmPg4iICB09elTh4eHasGGDevbsqe3bt9vSDB06NJVq5+i7776Tm5tbvK8rV64kWoYxRm3bttWmTZu0du1aVa9e3bb92LFj+vPPP63lokWLOgRzpk2bZlvesWOH7TPj4eGRInNZjhgxIt5jTZcunS1tStUzV65ceuWVVzRjxgytXLlSu3fv1p49exQWFqbXXnvNNhf3kSNHHOakfRzkzZtXefPm1VNPPaVGjRrp0KFD1jZPT0+NGzdOuXLlcsiXLl06tWzZUhMnTtTSpUv1119/6cCBA1q/fr3Gjh1rO+d37951CAT88ccftuW2bdvqzz//1MGDB7V9+3bNnz9fQ4cOVYUKFRzmNJ8/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7JmY2L/Jcd8zyfEhg6QICAhw+D8gbttRcmw/AgAApAbmYAYAAI9M7PkST548qRs3bujvv//W999/7/RmfIcOHZIUXJYUb2+D2B5lrx1nvvrqKzVt2tQWXK5UqZLWrl3rdL7Wf4Lq1avLGKOrV69q5syZtgBtzByI+/btS8Ua2gUEBChPnjzxvlyZKzBuDxJJLvX+idujavr06TLGOMxD+tJLLyWrp7sz6dKli/dY47smH6Se/fr1S1JwWXLts51a3NzclDVrVg0aNEhNmza1bZszZ45tzu6JEycmKbjsTKZMmbR161a9++67KlmypNPelxcvXtSXX36p8uXLuzRneGJiAr1J8SDXyDPPPKMdO3aoV69eyp07t9PyDx48qLfeesulXmsJSZcundq0aaNx48Zpy5YtunLlimbPnq08efLY0kVFRTnMUexMlixZ4v08hYSEPFBdH6aMGTM6fLddunQp2eXFDYJJSpFrMbUk9hlIrG0xb948TZ48WTVr1nT6QERERITmz5+vZ555RuvWrXugukrS+vXr9eyzzzo8VDJ16lS9/PLLD+071c/PT3ny5FGPHj20fPlyh9+9L7/88qHs15nkfG89KB8fH61atUqffvqpKlSo4DS4e/36dU2dOlXly5dPcjs3Man9Wxn7nKfGb1VS6hgZGalWrVolKbgsPdxznNy2Y2yxR8qR9Fj/7gAAgCcbPZgBAMAjE/dmfUKOHTvmcIO1Ro0aGjBggPLlyydfX19JUvPmzZPcIyqpN2pSijFGgwYN0qhRo2zrW7RooalTp1rH9E8WFBSkVq1ayc/PT02aNLHWR0REqH///vrll19SsXaPh2rVqil//vxWj5+///5bYWFhmj17ti1dag2PHSO59bx7967mzp1rW1eiRAkNGzZMBQsWVJo0aSRJffr0eSKvh9i90aT7vfYOHz5s9WiKG1xNnz69PvjgA1WsWNHqEfrjjz9q6NChCe4nKChIQ4cO1dChQ3X79m0dPHhQhw4d0pYtW/TFF1/o2rVrku6/L99995369eunjBkzytvb2zYU99tvv+10mNi4Euut6syDXstPPfWUNYT3pUuXdPDgQR08eFArV67Ut99+a93kX7hwoTX8dkpIkyaNWrRooYCAADVo0MC2LfaDQf807u7uCg4OtvWAvHDhQrJH1XAWOEtoyO1HJVu2bLYhlzt3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cAkBZgAAAAAAAAAAAACASwgwAwAAAAAAAAAAAABcQoAZAAAAAAAAAAAAAOASAswAAAAAAAAAAAAAAJcQYAYAAAAAAAAAAAAAuIQAMwAAAAAAAAAAAADAJQSYAQAAAAAAAAAAAAAuIcAMAAAAAAAAAAAAAHAJAWYAAAAAAAAAAAAAgEsIMAMAAAAAAAAAAAAAXEKAGQAAAAAAAAAAAADgEgLMAAAAAAAAAAAAAACXEGAGAAAAAAAAAAAAALiEADMAAAAAAAAAAAAAwCUEmAEAAAAAAAAAAAAALiHADAAAAAAAAAAAAABwCQFmAAAAAAAAAAAAAIBLCDADAAAAAAAAAAAAAFxCgBkAAAAAAAAAAAAA4BICzAAAAAAAAAAAAAAAlxBgBgAAAAAAAAAAAAC4hAAzAAAAAAAAAAAAAMAlBJgBAAAAAAAAAAAAAC4hwAwAAAAAAAAAAAAAcAkBZgAAAAAAAAAAAACASwgwAwAAAAAAAAAAAABcQoAZAAAAAAAAAAAAAOASAswAAAAAAAAAAAAAAJcQYAYAAAAAAAAAAAAAuIQAMwAAAAAAAAAAAADAJQSYAQAAAAAAAAAAAAAuIcAMAAAAAAAAAAAAAHAJAWYAAAAAAAAAAAAAgEsIMAMAAAAAAAAAAAAAXEKAGQAAAAAAAAAAAADgEgLMAAAAAAAAAAAAAACXEGAGAAAAAAAAAAAAALiEADMAAAAAAAAAAAAAwCUEmAEAAAAAAAAAAAAALiHADAAAAAAAAAAAAABwCQFmAAAAAAAAAAAAAIBLCDADAAAAAAAAAAAAAFxCgBkAAAAAAAAAAAAA4BICzAAAAAAAAAAAAAAAlxBgBgAAAAAAAAAAAAC4hAAzAAAAAAAAAAAAAMAlBJgBAAAAAAAAAAAAAC4hwAwAAAAAAAAAAAAAcAkBZgAAAAAAAAAAAACASwgwAwAAAAAAAAAAAABcQoAZAAAAAAAAAAAAAOASAswAAAAAAAAAAAAAAJcQYAYAAAAAAAAAAAAAuIQAMwAAAAAAAAAAAADAJQSYAQAAAAAAAAAAAAAuIcAMAAAAAAAAAAAAAHAJAWYAAAAAAAAAAAAAgEsIMAMAAAAAAAAAAAAAXEKAGQAAAAAAAAAAAADgEgLMAAAAAAAAAAAAAACXEGAGAAAAAAAAAAAAALiEADMAAAAAAAAAAAAAwCUEmAEAAAAA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/XfbcWXKlMls2rTJIV1UVJSZNWuW2bVrl239tWvXzKhRo0ylSpVMunTpjKenpwkODjZ169Y133//vYmKirKlj9tunzx5spk2bZopVaqU8fX1Nbly5TLDhw+32n8TJkwwRYsWNT4+PiZHjhxm4MCB5s6dO7Yy47Z9Dx8+bD7//HNTvHhx4+PjY4KDg02nTp3MyZMnE61LXOvXrzcvvfSSyZs3r/H19TX+/v6mePHi5u233zYXL16Mtyxnr5j3y5X9rl271rRt29bkyZPH+Pj4GH9/f1O4cGHTp08fc/jwYYf0zv6vGThwoMmTJ4/x9vY2OXPmNG+++abDuUtIYv9jVahQwbY9brts0qRJpnXr1qZIkSImODjYeHl5mTRp0phChQqZHj16mD179tjS586dO9FzGNuNGzfMxx9/bJ555hmTPn164+XlZUJCQkyTJk3M0qVLXT5OAABS0muvvWb9buXPn9/pPaW7d++a3377zVqO25Zx9ho2bJitDFfbKDHitiFPnTplunbtarJkyWJ8fHxM4cKFzaeffurQdouKijJffvmlqVq1qsmYMaPx8PAwQUFBJn/+/KZx48bm3Xffte6xuapr165WXQoXLuywPW4dkoJ7lI/2HmXsfM7uQceV2LWeO3duhzLju8eYWJ0jIiLM+PHjTe3ata22aMaMGU3p0qXN66+/bmsXJ/RZM8aYPXv2mFdeecUULFjQ+Pv7G19fXxMaGmpeffVVc+LEiQTPS3La5tu3bzcvv/yyKVSokAkICDC+vr4md+7cpnnz5mbZsmXGGGNat25t7ePpp592KCNuW/7HH39M8L3B440AMx57q1atsn3pzJgxwxQsWNBarl+/vi39d999Z23z8PAwp0+ftm1/4403rO3ZsmWzfgBPnjwZ782D2DfF4rvZ4kxKBJiDg4NNiRIlnNarbt26th/whAK4devWTdKNkVu3bpl69eolmD5v3rzmwIEDtnxLly413t7eDmnd3d1No0aN4q1fRESEadiwYYL7q1Gjhrl586ZL59CYhBtvP//8s23bxIkTbduTU58333zT2lawYEFr/YYNG2z5xo4da23r3r27tb5KlSrW+oULFyb6fjVo0MChcRt7e6VKlYyHh4fTcz5ixAinZWbKlMlUqlQpwYZQfP744w8rn5ubm7ly5YrLeV39bJ0/f95kzZo1wfMSc5M0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z549Onz4sP7880+tXbtWUVFR+vDDD9WgQQNVq1bN5TLTpUunixcvSkr+OYl9zCEhIS7vGwCAhyn2HFfFihXTtGnTVKhQIXl5eWngwIEaPXq003zPP/+8mjZtqi1btmjnzp06fPiwtm7dqiVLlsgYo6lTp6pOnTrq0KGDQ96cOXPq8uXLunHjhg4cOKC6desqLCxMGTNmdKnO7u7uqlWrljUH2eXLlzV//nyX5mF21o6NHWCMrx0bV+ybanEl9D9JQs6ePauCBQvalmNLrE2fPn16ubm5WTd4atWqpQYNGsSbvkiRIsmqZ2L7dfa/Uex1rp5TNze3FKlf0aJFrYcVGzRoYP2fd+XKFfXp08c2l13sz0OaNGk0Z84cVa9eXX5+fvr111/VqFGjZNcj9nG7ubnp/fffT/BacTYPIAAAj0poaKhCQ0P10ksvafTo0SpUqJBOnTolSTp27FiSykqpNkpi92Nit5WKFCmibdu2af/+/dq6dasOHTqkPXv2aMGCBbp9+7a2bt2qN9980zZXc3xiBzlj5qCVpEGDBun8+fP65JNPJMkKLkv350V2tW3rDPco73tY9ygfR3Hfy/DwcId5z5NSVkz8olSpUmrbtm28aXPkyOF0vatt87if78Q64MR45ZVX9N577ykiIkI7d+7UV199ZV1nadKkUZs2bVwqB4+51Ok4DSTutddeS9IQIH5+frY5tq5cuWIb2i9fvnzW36+++qptX2fOnLENu1u3bl3bkNspNQezs2EznEnpOZjv3LkT7xBxMXNvKNZwJc7mYI6KirLyJGcO5jt37rg8B3OHDh2c1vXy5ctm2rRpLp1DYxyHn4lt+vTptm2x5wl5kPpERkaawMBAK2+mTJls7/1XX31lJDkMyxd7+J61a9fats2dO9fatmfPHuPt7W1tizsMZux8sYdOie1hzW/y3//+18pXqFAhl/PFrndin61Tp06ZU6dOOayPjo42adOmtcoZM2aMtW3kyJG2471586ZD/oTmYF61apUtf3xDZD/77LNWmm7durl24AAApICEfqdi/6736dPHWn/r1i1TsGBBp22ly5cvO0x1EqN48eJW+v/85z/W+tjtrurVq5vly5fb5n0rXbq0uXz5ssvHtHz5clvdQkJCzJYtWxzSRUVFmVmzZllTaixYsMCWL7lzMMdukyR328OYgzn2XMhFihQx169fdzgnd+/eNXPnzjWXLl2y1v3www+2Mnfv3u2QL6H9lipVylqf3DmY47YrXRl22pnE/seqV6+ebXvsOQTr1q1rrS9evLgtX9xpiMLCwqxtJ06csG0bN26cQ73izv/97bffOq3/kSNHbFM/AQDwKEyZMsWMGzfOaXvszp07tukuypYta9verVs3a1vsYapjS24bJbE5mGPfn4uZg9mY+9Mjxr53G6NPnz5W+mLFiiV6XowxplmzZlYeX19f2z266Oho2/2emDZNZGSkS2XHd5yxcY8y5e9Rxr237mx6mMTyPew5mJs1a+ZwHZ04ccKlOZiff/55a33mzJmdzkMeFRVlli5dao4cOeLS8SXUNo89Vamnp6dZv369LW90dLTTaZRiT1cae17oTp06OaTFk4kezHgs3b17V1OnTrWWQ0JCbL2TY5w/f16///67JOn27duaNm2aevbsKUlKmzatWrRoYZVz5MgRK1/s4bGl+0NCNGvWTPPmzZN0f2iUWrVqqXr16tq0aZPtqfcHsXv3bo0ZM8bpttatWytnzpxOt3Xt2lVr1qxRpkyZNHPmTNuTdT169Eh0v9euXVPx4sVVoEABVa5cWVmzZlVQUJAOHjxoO7aYJ6kyZMigLl266Ouvv5Z0fxiVKlWqqG7dujp48KDtyf+CBQtaw+Y0adJEmTNntp4ue/fdd3Xo0CHlz59fv/zyi+1puNjSp0+v7t27a/z48ZKk77//Xnv37lWdOnUUGBioc+fOadu2bfrzzz+VLVs2vfjii4kec2JatWql4cOHa//+/dY+hw4dqrx58z5QfTw9PVW9enVrCPKYJx9jetNWr15d0v33JEbGjBn19NNPW8tPPfWU3N3draFI+vXrp23btunGjRuaMmWKbQjL5OjWrZsmTJhgPXnWpEkTdenSRT4+Ppo6daoiIyOTVW7sHsMHDhzQ9evXHYb9u3btmnVdxRbTe+rChQsOn5EGDRqoaNGikqS1a9eqVatWqlixoooVK6asWbPKy8tLq1evtkYokOxPBcZ9Uq9t27aqVKmSPDw81KRJE4WGhqpHjx7WcEr37t1T1apV1aFDB929e9elp10l2Z7YjHmfAQBIbQULFtSuXbskSd98843c3NwUFBSk2bNnW+2guA4dOqRy5crp6aefVunSpZU1a1b5+/vrr7/+0s6dO6108fVUle73fJg2bZpatWqlqKgobd26VQ0aNNDSpUtdGha4du3a6tevn/73v/9Juj/CUPny5dWwYUOVKVNGHh4eOnr0qJYtW6bjx48rLCxMktSoUSMVKVJEe/bskSS99957OnDggIoUKaIVK1ZozZo11j46deqkTJkyJVqXlPLtt9/q3LlzKlOmjMLCwrRq1SprW5MmTVyalufNN99U69atJUl79uxR0aJF1bx5c2XJkkXXrl3T7t27tXLlSl27dk3h4eFWL9m47aFevXqpfv368vT0VI0aNRIdIWjAgAFWz4irV6+qXLlyatOmjW7dumVrK/n4+KhPnz6unZCH5O2339aSJUus5REjRmj58uWS7n8eYobB3Llzp1q3bq1ixYpp5cqV1v+VzoSEhMjb29tqh48ZM0YXLlyQv7+/8ufPr+bNm6thw4YqVqyY9Xnr3r275s+fr1KlSsnT01N///23NmzYoO3bt6tjx46qV6/ewzoFAAA4CA8P14gRI/Tqq6/qmWeeUalSpRQcHKzr169r0aJFVg9aSWrYsKEtb+x2xPnz59WpUycVLVpUbm5ueumll5Q5c+Zkt1HiatSokbp06SJvb299//33unfvnrUt9j3QatWqKX369KpevbqyZcum9OnT68SJE7apCRNqq8bWu3dvzZ8/X5IUERGhSpUqqX379sqRI4e2bt1qG0Jbut/De/z48SnW5uEeZcrfo4zrm2++cXrN5cyZ07puH7YGDRrYpvScP3++SpYsqYYNG8rf31/79u3TggULdObMmURHNurfv7/mz5+v6OhonT17VsWLF1eLFi2UK1cu3bp1S/v27dMff/yh8+fPKyws7IGG45bu96yPGSUo5r5py5YtVahQIZ07d05hYWGqU6eOPv30U1u+fv36Wf8rxEx/JDE89j9Kake4AWdmz55te2Lm/fffd5ru5s2btqes4j5h98cff9jKkWQqVarktKyTJ0+aXLlyOaSXZBo1amRbjpnkPjFxn/xJ6BX7CfnYTxNlzpzZlCtXzmmeWrVq2Z50iq8H8/nz5xPdv7+/v61XyM2bN02dOnUSzJMrVy6zb98+2zEvXrzY9vRazMvNzc3WSyN2/Ywx5vbt2w7n2dkrKU+rJfR0oDH3n96Mvb1r164pUp9PPvnEId3Bgwet7SEhIbZtLVq0cCijV69eTvdXokQJU6ZMGWs5OU8HGmPM22+/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1atXL/Xq1Us3b95UixYtNHr0aPXv318ZM2Z0mufy5cuKioqy8sX1999/25ZDQkIclk+fPi1JSp8+vZYtW6bhw4erVatWio6O1rPPPqvPP/9c+fLlc+kYHkf0YAYAAAAAAAAAAACQYmLmWm7ZsqXSp0+v9OnTK2fOnLpz545mz56tqKj7I1K0bt1a69ev1/HjxzVz5kwFBwerVq1aVjlZsmTR+fPnbWVHREToxo0bSa5TmjRp1KtXL0VFRenQoUPxpkuXLp3c3Nw0YsQIbdq0yeHVpUsXW/pz5845LGfNmtVarlixon777TdduXJF8+bN04EDB9S2bdsk1/9xQg9mAAAAAAAAAAAAACni5s2bWrhwoV588UX16NHDtm3btm16/fXX9fvvv6tu3bp69tlnlS5dOs2aNUszZ85UixYt5OHhYaUvV66cJk+erNu3b1vDZP/888+J1uHSpUtKmzatrSxJOnjwoCQpc+bMkiRvb29FRETY0qRJk0YVK1bU/v379c477yS6r59++kmFCxeWJEVHR2vBggUqX768Qzo/Pz81btxYu3bt0gcffJBouY8zAswAAAAAAAAAAAAAUsSCBQt069Yt9evXTxUqVLBte+aZZ/Tee+9p+vTpqlu3rry8vPT8889r7NixOn36tL788ktb+ldffdWaQ/m1117TmTNn9OGHH8rf31/u7vEP1Pz7779r0KBB6ty5s8qVKyd3d3f9+eef+vDDD/Xcc88pT548kqRChQrp7NmzmjJliooVK6ZMmTIpT548+uijj1S7dm25u7urRYsWCgwM1PHjx7Vo0SK99957Cg0NtfY1ceJEeXt7q1ixYpo4caIOHTpk9eBetGiRvv32WzVr1ky5cuXSyZMnNWHCBFsv7ScRAWYAAAAAAAAAAADgMXc3MkoLP26aKvv19vJIPOH/N336dBUoUMAhuCxJXl5eatWqlaZNm6bx48fLx8dHbdq00aRJk5QtWzZVrVrVlj579uxatGiR+vXrp+eff16FCxfWt99+q7p16yooKCjeOlSoUEFNmzbVrFmz9NFHHykqKkp58uTR0KFD1a9fPytdq1atFBYWpoEDB+r8+fPq2LGjpkyZoipVqmjVqlUaNmyYXnrpJUVFRSl37tyqX7++1fs5xowZM/Taa69p6NChypkzp2bOnKlSpUpJkp566im5ublp8ODBOnfu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cnFxUd26dbVp0yaz/n///VfOzs56+eWXi+IUARSh5cuXKygoiOIyAADIE1YwAwAAwCYEBQXpzz//1K+//qrjx48rMzNT1apVU8OGDWUwGKwdDwCAIuXi4mL6euXKlbpx44ZpOyEhQd988422bdumHTt2qEWLFrp48aI6dOigsmXLasuWLRo+fLi6du2qo0ePqlq1apKkV199VaVKldK0adOK/HwAFK6DBw+qQ4cOGjx4sFatWqX09HS1bt1a8+fPV8WKFXOdGxcXp/j4eLO26OhoSVJaWprS0tIsmtXBwcGi+0PeWPrfEUDJl5aWpoyMDK4PNiK/P18pMAMAAKDEW7VqlVq0aCE/Pz81aNBADRo0MOuPiYnR7t27TaubAQAo6YxGo9l2enq6KleurHPnzqlGjRpq2LChqW/8+PHq2LGjqlevrosXLyosLEwbN25URkaG1qxZoxYtWmj//v1KTEzU888/r8DAQD333HN65ZVX9O2336patWr68ccf9cknn2jGjBny8fEp6tMFUMjOnz+vFStWqH79+vrss890+fJljRkzRk8//bQOHDiQ6xs2FyxYoMmTJ2fbl5iYqNjYWItm9fX1tej+kDfx8fGyt7e3dgwAxUhGRoaSk5MlieuDDcjvz1cKzAAAACjx+vbtqw8//FB+fn7Z9h88eFB9+/alwAwAsFnr16/XuXPnJN28JfZ/i0ETJ040fV22bFm99NJL2rhxo6T/rVRITU2VJDk6OkqSnJycJMm08nnEiBHy9/fX8OHDC/dEAFiF0WiU0WjUhg0b5OHhIUmqUKGCWrZsqR07dujxxx/PcW5YWJhCQ0PN2qKjo9WpUyd5eHjwphQb4eXlxepxAGZurVzm+nB3osAMAACAEu//r+L6/65evapSpfjVFwBguxYvXixJKl26tPr06ZPtGKPRqNOnT+v999+XJJUpU0Y9e/aUJD3yyCMqXbq0vvnmG40fP15fffWVDAaDmjdvrrVr12rv3r1au3atqfAMwLa4u7uratWqpuKyJAUGBsrR0VFHjx7NtcDs7e0tb2/vbPscHBwoOtgI/i0BZMfe3p7rw12Kv7IBAACgRPrtt9/066+/mrb37Nmj9PT0LOMuXryoRYsWqUaNGkWYDgCAohMdHa3t27dLkp555hnde++9WcaMGjVKb731lmnb1dVVixcvVr169SRJFStW1NKlSzVw4EC5ubnJ0dFRb775purWravQ0FC1bNlSXbp0kXRztQp/RARsS61atXT9+vUs7UajUXZ2dlZIBAAlS58+fbRy5cos7V26dNHatWtznNeqVSvt2rUr277evXtrxYoVkqTOnTvrxx9/VHx8vBwcHFSxYkV17txZ4eHhvAEQVkGBGQAAACXSunXrTM96MxgMWrx4sWn11v/n5uamVatWFWU8AACKzJIlS0x38xgwYECe5ly6dEn9+vWTv7+/GjVqJEnq2bOnnn32Wf3777+qWLGinJycNGfOHMXExGjt2rU6dOiQ+vXrp19++UXlypVTv379NHPmTIpPgA1o3769Jk2apISEBHl6ekqSdu/erbS0NNWvX9/K6QCg5HjiiSdUu3Zt03aDBg1yHd+1a1ezMcnJyaaickBAgKn9+PHjatasmTw8PHT8+HF9++23mjlzptLT0zV79mxLngKQJxSYAQAAUCL169dP7du3l9Fo1KOPPqopU6aoTZs2ZmMMBoPKli2ratWqcYtsAIBNSk1NNf0Rsl69emrSpEm24+bMmaM333xT586d01tvvaV58+bp8uXLmjJlir7++mvTuFKlSsnf31+SlJCQoOnTp6tPnz6qU6eO7r//fiUkJGjVqlVat26dZs+erWrVqql///6Ffp4ACle/fv0UERGhkJAQjR8/XpcvX9bYsWMVHByswMBAa8cDgBKjR48eOT6uJDuDBw822546daqkm2+UDwsLM7X//vvvZuPq1q2rI0eO6K+//rrzsEAB8Fc2AAAAlEgVKlRQhQoVJEnfffedatWqleOz3wAAsFVr165VfHy8JGngwIG5jrWzs1OlSpU0adIkzZs3T9LN22vnJDw8XBkZGZo+fbr+/PNP/fPPP+rYsaN69uyp2rVr64svvtDWrVspMAM2wNXVVTt27NDQoUPVrVs3OTo6qmPHjqZrBQAgb4YPH67+/fvLx8dHjz32mCZPniw/P788zb1y5YreeecdSdKwYcPk6upq1r9s2TL9+uuv+vPPP3XkyBHde++9GjVqlKVPAcgTCswAAAAo8Vq2bClJunHjhg4dOqS4uDg1a9bMdHs/AABs1a3HQ7i4uKhnz55Z+jds2KCTJ0+qTZs28vPzU3JystltFKtWrZrtfqOiorR48WJNmTJF5cuX14ULFyTJ9OzlW5+5QwhgO6pXr67IyEhrxwCAEsnR0VEtW7ZUjRo1dOXKFW3cuFGrVq3S3r17dfjwYbm4uNx2HwsXLlRiYqJcXV01bNiwLP2bNm3Shg0bTNtBQUGqVq2aRc8DyCsekgMAAACbEBERoQoVKigwMFCdO3fWb7/9Jkmm58gtX77cygkBALCsY8eOaffu3ZJuPj+5XLlyWcacOnVKI0aMUK1atVSmTBmVL19eb731liTJyclJr776arb7HjVqlHx9fTVixAhJUo0aNVSjRg1t375d3333nd59911JN5/bCgAAcLdbvHixdu7cqSVLluiTTz7R559/Lkk6efKk9u3bd9v5165dM/2ONnjwYLm7u2cZs379eqWmpurIkSOqX7++1q5dq65du1r2RIA8osAMAACAEu+DDz7Q8OHD1bp1ay1btkxGo9HU5+npqaCgIH322WdWTAgAgOXdWr0sSQMGDMh2TJMmTdSlSxdVqVJFZcqUkYODg6pUqaKePXtq06ZN2T6zefv27fr666/15ptvysnJSdLNlcrr16/XQw89pA4dOmjLli2aPn26nn/++cI5OQAAgBIkKioqx75r165JkpKTkxUVFZXt2Pfff1+xsbEqW7asXnnlFbO+y5cvm/7O4eDgoNq1a+vhhx+WJP3yyy+WOgUgX7iPEQAAAEq8t956Sx07dtQnn3yixMTELP0NGzZURESEFZIBAFB43n77bb399tu5jmnUqJHWrl2bpT0tLU2xsbHZznn88cfN3qx1S61atbRt27Y7ygoAAGDLateurUceeUQPPPCArl+/brqVtb+/v4KDgyVJ69atU9++fSXJ7Het1NRU0yNMBg4cmOVxX1988YVee+01NW3aVJ6enjpx4oS2bt0qibvJwHooMAMAAKDEi46O1tChQ3Psv/fee7MtPAMAAAAAABTUyJEjtX37dn355Ze6fv26fH191bZtW40bN05ly5bNde6KFSt0+vRplSlTRqNGjcrSX6NGDVWtWlXfffedLl68KEdHR9WrV0+dO3fWmDFjCuuUgFxRYAYAAECJ5+bmpoSEhBz7jx49qvLlyxdhIgBAcZKZniq7Uo7WjlGsODg4yNfX19oxiiVeLwAAIL/mzJlz2zF9+vRRnz59srT369dP/fr1y3Fe06ZNtXv37oLEAyyOAjMAAABKvLZt22rJkiUKCwvL0nfkyBG9//77euGFF6yQDABQ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iwIzAAAASpwVK1bkug0AAAAAAACgcNjld0JmZmaRPH85Ojpa/fv3V7169WRvb69WrVrddk5MTIwMBkOWj27duhV6XgAAAAAAAAAAAACwdcV2BfORI0cUGRmpxo0bKy0tLV9z58yZo2bNmpm2PT09LR0PAAAAxcyNGzf0/vvvKzIyUjExMZIkPz8/tW3bVi+99JJKly5t3YAAAAAAAACADcj3CuaiEhISon///Vdr1qxRnTp18jW3Zs2aaty4semjevXqhZQS/190dLRefvll1alTR3Z2djIYDCpVKm/vY7h27Zok6aeffrrt3NOnT6tPnz4qX768nJycFBAQoDfffFMZGRkWOxcAAFBynD59Wg0aNNDQoUN1+PBheXl5ycvLS4cPH9bQoUPVoEEDnT592toxAQAAAAAAgBKv2K5gtrMrtrVv5OKPP/7Q0qVL72ju1atXJUkpKSm5jjt//rwaN26sM2fOmNr+/PNPjR07Vn/++aeWLVt2R8cHAAAl16BBg/T333/r888/V9euXc361qxZo969e2vQoEHasGGDlRICAAAAAAAAtqHYFpgLom/fvrpw4YK8vb3VvXt3TZ8+XWXKlMl1TlxcnOLj483aoqOjJUlpaWn5vk333crHx0djx45V48aN9cYbb+jHH3+UpDx9/xwdHSVJtWvXVtmyZXOc+8Ybb5iKyytXrlT79u01btw4vf/++1q+fLmef/55s1ukAyg6Dg4O1o6AEqSwfrbyOrw7bd++Xa+88kqW4rIkhYaG6tChQ3r33XetkAwAAAAAAACwLTZVYHZyctKgQYP05JNPytXVVTt37tSsWbN04sSJ265WWbBggSZPnpxtX2JiomJjYwsjss257777NHjwYEmSvb29qT0v3z8nJydJUrly5WQwGHKcu337dkmSh4eHgoKClJKSotDQUL3//vuSpOXLl3NbdMBKfH19rR0BJUhh/WzldXh3KleunLy9vXPsL1++vMqVK1eEiQAAAAAAAADbZFMF5goVKmj+/Pmm7VatWsnHx0dhYWE6fPiw6tevn+PcsLAwhYaGmrVFR0erU6dO8vDwkI+PT6HltlW3ViRLytP379Z4R0dHswLz/597a8WbnZ2dqe+/RYq//vqLfy8AKAG4VsOS+vbtqxUrVujll1+Ws7OzWd+VK1f0wQcf6MUXX7RSOgAAAAAAAMB22FSB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fvx4Pfnkkw5lH3nkEb399tvq1KmTpk2bJpvNpnvuuSfN/s+fP68mTZpo5cqVGj16tGbOnKmKFStq6NChevvtt3PkmAEAAJA/EKsCAAAgryJWBZBTSDADyBcGDBigJUuWKCYmRpI0b948tW7dWsWLF3cot3TpUq1evVpTp07V//73P40aNUpLly5Vnz59NHPmTB05ckSS9Oeff+qLL77QyJEjNW/ePI0aNUqLFi1SjRo10uz7+eefl91u186dOzVx4kQNHz5c3333nfr166fJkyebbQIAAMCdiVgVAAAAeRWxKoCcQIIZQL5w3333KSYmRj/88IOuXr2qH374Id1pXJYtWyar1arHH3/cYflTTz0lwzC0fPlys5ykNOWeeOIJh+eGYWjRokXq3r27DMNQeHi4+ejcubMiIyO1Y8eObDxSAAAA5DfEqgAAAMiriFUB5AR3VzcAAJwRHBysDh06aP78+YqOjpbdblefPn3SlDtx4oSKFy8uPz8/h+VVq1Y11yf/6+bmpgoVKjiUq1y5ssPzixcv6sqVK/roo4/00Ucfpdu2CxcuZPm4AAAAkP8RqwIAACCvIlYFkBNIMAPINwYMGKBHH31U586dU5cuXVSkSJEc32dSUpIk6YEHHtDgwYPTLVOrVq0cbwcAAADyNmJVAAAA5FXEqgCyGwlmAPlG7969NWzYMG3evFkLFy5Mt0yZMmW0cuVKXb161eFsu/3795vrk/9NSkrSkSNHHM6uO3DggEN9wcHB8vPzk91uV4cOHbL7kAAAAFBAEKsCAAAgryJWBZDduAczgHzD19dXH3zwgSZPnqzu3bunW6Zr166y2+167733HJa/9dZbslgs6tKliySZ/77zzjsO5d5++22H51arVffee68WLVqk3bt3p9nfxYsXs3o4AAAAKECIVQEAAJBXEasCyG5cwQwgX8loOpVk3bt3V9u2bfX888/r+PHjql27tlasWKHvvvtOTzzxhHlvkDp16qh///6aNWuWIiMj1axZM61atUqHDx9OU+e0adO0Zs0aNW7cWI8++qiqVaumy5cva8eOHVq5cqUuX76cI8cKAACA/IVYFQAAAHkVsSqA7ESCGUCB4ubmpqVLl+rFF1/UwoULNWfOHJUtW1bTp0/XU0895VD2k08+UXBwsObNm6clS5aoXbt2+vHHH1WqVCmHcqGhodqyZYte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EJmeWx0blhxfp/Rek+waH05PVuPPL7/8UnXq1JF04/X56aef9P7772vMmDGqV6+e6tevf9u/p7JjHDCrvyFza1z3Zn/b7u7uKlq0aIblk6U+qTu7fisiZxDJI1ft2bPH4SrdCxcuZPqDcvbs2Q5nOj3yyCMaNWqUJGn+/PmqW7eueU/WoKAg9e7d2yybPKiUcl8pnTt3LsvHkVL16tXN+4R16dLFbMOVK1c0ZswY854akhy+1Pz9/TVx4sRM6055VlL79u3NhPX69evN+9S1atVKzZo1k81mU0JCgmbOnGleSWyxWNSuXTuzjq+//tr8ELZYLPriiy/UvXt3+fn5ae/evapevbpTx5zePSJS93fyfaYzep5VN6s3ZTt8fX01dOhQ/ec//5Ekffjhhw5tHzJkSKb34ciK2bNnO3xxp76C3BUCAgJksVjMdiUPSmUmZb8k/whIljJYywmueN2clTow7dOnT6b3iEx5dmlK3G8ZAJzXoUMHHTx4UJLMQbInn3zyptul/sw+d+6cQ6yTOhbMaPAhs/s7ZTUxcivxTEYCAwPN+LZu3boOJ2qmlp0nvKXcb3rxdMplAQEBGdaTsl+z68rWUqVK6emnn5YkPfDAA2rSpInsdrvi4+P16KOP6o8//jAHUbMrLk5P6vfShAkTHAZTUsvKFbO38h5KniFmzJgxkqSPPvpIp06dMtffe++9Tt1/+1Z88803DgOMbdu2dVn8llLK9++txsTSjbjYx8dHUs7HxK543ZyV+vdFu3bt1KVLlwzLp76iORkxMQC41qVLl2S32x2SzFmJS1u2bKnDhw9r165d+vPPP3XkyBHt2rVL33//vex2u3755RdNnz5dL774YroxembPk8unN+6YnNROr92pt0/26KOP6q677srwWG52L92MJMeg48aNU7169cxx2+eff1733nuvypQpc9vtad++vTmWnNy/0o2T5kqWLKlWrVpp/vz5WrduncMMOSnHJg8ePKidO3eaz/v166fp06erePHicnNzU6NGjdJcLZ6ejL7DU75O6b0m2TU+nJ6sxp/VqlXTzp07deDAAe3YsUOHDx/W3r179d133ykmJkY7duzQhAkTHO7VfKuyI+ZxNv5PL35NKadi2Jv9bScmJjpclOXs7++8MAsSMkaCGbkq5dXLzli8eLEiIyPNH84DBw7U008/rZiYGB0/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s/3OmjXLcHd3z3B/VqvVeOeddxy2mTRpUobfkTfbX2ZSbte6des064cMGeJQ5vPPPzcMI+txsWEYxvjx49Pdrnr16maZ8PDwDPv5Zm1OT+o4r02bNobFYklTn4eHh7F8+fJ06zh69Kjh5ubmUH7atGlO7T+l1PFURg8vLy9j5syZabbPLM4yjJu/F262/c3q+OKLLwxvb+8M292zZ0+H8ql/22X0d5zZ33zqNvbt2zfdOu+55540x5Jdr1tKqf8e0+tDw7j574vJkyen+z5M/UgZc6f8TeXs+x8AkFbqz+jMHik/51N+j4eGhmYYr7Rr185ISEgwt8tovOfixYs33b+Pj4+xfft2s67r168bHTp0yHSb0qVLG/v373c45uXLl6cb+1osljTf1ym/e2JiYtKMA6f3KFOmjNP9n3qMMLW5c+c6rB86dGi2tOett95KU+7QoUPm+pCQEId1ffr0SVPHyJEj091frVq1jPr162f4PX2zGC3ZxIkT062/cOHCRr169bLU3zkZf97sN6bVak0zxu5MLOfsOGBG/Xo7Y+Kp/16TH8HBwUajRo0yfA3Onz9v+Pr6prvt119/fdO+tNvtxqBBgzLtz8DAQGPDhg0O+80sPnQm9ofruP4mSLhjpJySOvlq1/T4+Pho4MCB5vNt27Y5nB3eqlWrNGfLZDQ9WPHixbV582Y9/PDDCg4Olqenp6pXr6733nvPPJsmWXaeUZ363sqTJ082/9+wYUPt2bNHL7/8spo0aaIiRYrIarXKz89PNWrU0ODBg/Xll1+mO41H6itKks9Qk25MxZfyninu7u4O66Ubx7hhwwbdd999KlKkiLy8vFS7dm198sknevHFF2/nkCXdOEPq119/1dixY1W8eHF5eHioYsWKmjJlSrZdMf7iiy9q3rx5atiwoby9vVWkSBH17t1bv//+u8MZeSm1atXKYV3q+3VnlcVikc1mU2BgoKpWrapevXrpv//9r06ePKn77rvvtuvPbuPHj9f27dv12GOPqXLlyvLx8ZGnp6dKlCih7t2765577jHLenp6avXq1erfv78CAwPl6empunXrau7cueb0MFmxePFi3X///QoODr7pfVBy6nW7XRaLRf/73/+0cuVK9evXT2XLlpWnp6dsNpuKFSumdu3aafLkyVm+qgUAkL6hQ4fqxIkTev3119WhQweFhYXJ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yitOSAYAAAAAAABULBSYAQAAUO7FxcVd9bH7bm5uiouLK8VEAAAAAAAAQMVEgRkAUKqMRqPCwsLk6soqDQBKTtOmTbVgwQKdOXMmX19cXJwWLFigZs2aOSEZAAAAAAAAULHw7j4AoFQZDAa5GiRTknNnEroFVpPBtfDZjgDKlzlz5qh3795q2LChbr/9dtWvX1+SdOzYMa1evVpWq1Uff/yxk1MCAAAAAAAA5R8FZgBAqTOlnFfcO+OdmiH84TfkHnKDUzMAKDlRUVHatWuXnn32WX3xxRe6dOmSJMnLy0u9e/fWtGnTmMEMAACAcqdOnToyGAxF2sdgMOj48eMOSgQAAECBGQAAABVE06ZN9cUXX8hisSgxMVGSFBISIhcXVoUBAABA+dS5c+d8Beaff/5Zhw4dUpMmTdSoUSNJ0tGjR3X48GE1bdpUrVq1ckZUAABQiVBgBgAAQIXi4uIiT09P+fr6UlwGAABAubZ48WK77dWrV2v16tX65ptv1L17d7u+b775RnfffbemT59eigkBAEBlxDtuAAAAqBB+/vln9enTR97e3goKCtK3334rSUpKStKgQYO0bds25wYEAAAAium5557T2LFj8xWXJalnz5567LHHNGXKFCckAwAAlUmRZjCz5gcAAADKoh07dqhbt26qWbOm7r33Xr333nu2vuDgYKWmpmrRokXq0qWL80ICAAAAxXTs2DEFBQUV2h8UFMR7sQAAwOGKVGBmzQ8AAACURc8884waN26snTt3Kj093a7ALEldu3bVRx995KR0AAAAQMmoV6+ePvzwQz300EPy9fW160tPT9cHH3ygunXrOikdAACoLIpUYGbNDwAAAJRFP/30k2bMmCEPDw9lZGTk669Zs6bOnz/v0AyffvqpXnnlFf3++++qUqWKunfvrpkzZ6pGjRq2MVarVTNmzNDChQuVlJSk1q1ba968eWrZsqVDswEAAKBiePHFF3XXXXcpMjJSI0eOVP369SVdntn80UcfKT4+XitXrnRySgAAUNEVaw1m1vwAAABAWeDm5iaLxVJo/5kzZ/LN8ChJX375pYYNG6YOHTpozZo1mjVrlrZv367+/fvb5Zo5c6amT5+up556SmvXrpWvr6969Ojh8OI3AAAAKobBgwcrJiZGISEhevnll/Xggw/qwQcf1IwZMxQaGqqvvvpKgwcPdnZM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BSksLMwh53WmKzM3Q0JCmO3lBNx/5+L+O4/RaFRZmTPs6upaIV/fr6as3P/KeO/hWKmpqXbrH8fExKhnz5622cQ9e/Z06JIp/v7+2rJli/71r39p6NChcnd316BBgzRnzhy7cU8//bQsFotmzJih5ORk3XLLLfrmm2/4eQAAAMA1OXr0qF577bUCPyxvNBoVHR2tiRMnOiEZAKAssOTmKPPoj8o8vMPWlpdyXjl/HJZPkw7yadSeIjNKRLELzG+++aamTJmijIwMu3Xn/Pz89NJLL+mxxx4r1vEvXLigvn37qnbt2lq2bNlVxwYGBtpmJP5VSkqKAgMDr7pvaGhoobO63NzcKmwBymg0VujrK+u4/87F/XeOgtYodRaDwVDpvv5l5f5XxnsPx6pevbp+++03SdK5c+e0Z88ePfDAA7b+jIwM21rIjlK/fn3FxMRcdYzBYNDkyZM1efJkh2YBAABAxVSlShWdOnWq0P5Tp07J39+/9AIBAMqU3OQ4u+LyX2Ue3iG34FryrF63lFOhIipWgdnRa35kZWXptttuU25urr766it5e3tfdXxkZKT+/PNPZWZm2s2ePnLkiCIjI68rAwAAAMq+QYMG6c0331R2drZ27dolDw8P3X777bb+/fv3q25d/gEFAACA8q1///5688031apVKw0dOtSub/ny5Zo/f77uueceJ6UDAJSW8ePHa9++fXZtDRs21PCbaujC0T2F7lf1Qq7+88tZ/f777397jtjYWKWlpcnf31/169cvbuRCtWzZUm+88YbDjg/HKFaB2ZFrfuTl5Sk6OlrHjh3Tjh07rmnNyF69ekmSvvjiC917772SpLNnz+q7777TggULipwBAAAA5cOLL76oxMRELV26VAEBAVq8eLHtsdNpaWlatWqVxowZ4+SUAAAAQPHMnDlTP/74o+655x498cQTatCggSTp2LFjOn/+vCIjIzVz5kwnpwQAONq+ffv07bff2rV5e3ooJcyk5OTkQvcznPtDcX+cybfv1aSnp+vMmTPXnRUVU7EKzI5c82P06NGKiYnR3LlzlZycbPcDcdNNN8nDw0Pdu3eXJG3evFmSFB4eroceekjjx4+X1WpVSEiIpk6dqtq1a9sKzgAAAKh4fH19C11OxdfXV3FxcX/7NBwAAACgrAsJCdHevXu1aNEirVu3TqdPn5YkNWvWTE89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CuKPQbGyhl1wF2isbFCSdhn67FQAgKW7Hxw7DTXZL++vAzDkpsPSrWGNXBsRERERERERERERERER3RkcYCYY8rORfeRnAIBbv3/BscMgFKdewqVPZ6HoSizy447Crlmncvvl/XWgdHDZwgo+U96ElZtPuTrWPkGw9glSfy/JTFbP5dzj/mq6IiIiIiIiIiIiIiIiIiKqDhxgJhQnxgFGAwBA59MMAGDl7guNzhbGonwUJvxV4QBzfuxhAIDG1hGpWz5FUeJZaG3sYRfaAy69H4DGUldun8zfvgeMBli4NIB9i17VeFVEREREREREREREREREdKdpzB0AmZ+xME/9WaOzUX9WrKzLbb+eIS+z9P/sVBiL8mHXvDsM+dnIOvgD0nasLFdfn52GnD9K13117j6qwmm3iYiIiIiIiIiIiIiIiKj24gAzQaOzVX82FhVc+7m4sHS7tV2F+ylW1wajvcfPh+fwx+HYaQiA0umzb5R5YCNg0MPCyQMOrcLuROhEREREREREREREREREVIM4wEywahgE/O9u4qLLZwAAxamXIEX5AABr3xAYC/NQnHoJxamX1P2s/zeddkUUjelTS5+biZzjOwAAzt3ug6Ll7OxEREREREREREREREREdxsOMBO0to5wbD8IAJC2azVSNn2ApLWvAgB03k1gG9QBead/x6VPZ+HSp7PU/Rza9ofW3hUAkPj1K7j600fIjtpSuq3dQJNzZP3+I0RfDK2DKxza9KuJyyIiIiKqMevWrcOIESPg4+MDe3t7dOjQAV9//XW5ep999hmCgoJgbW2NDh06YOfOnWaIloiIiIiovLi4OEyfPh2tW7eGVqtFnz59zB0SVRONosDPyx4hjVzg52UPjaLc8eM28nKAf4OKz2Gh0aBTqCfu79MEw3sGIqCBwx2LgaheUzSwcPeFzicYFu6+gFLBEOD1dTz8YOHye7YEAABiRElEQVTuD51vCKybtofON6Ty/f7peanO4aNMAAC3AZPh0udBaO2ckHtyH6SkCA5tw9Fg/PxK10rW2jig4aSFsAvpBn3WVeRG74ela0O4D5kBl94PqPUMBTnIProNAODcbSQUC8sauSYiIiKimrJkyRLY29vjnXfewY8//oi+ffviwQcfxAcffKDW+frrrzFjxgxMnDgRW7duRYsWLTBs2DCcPHnSjJETEREREZU6deoU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IiIiqhIOMBMRERERERERERERERERUZVwgJmIiIiIiIiIiIiIiIiIiKqEA8xERERERERERERERERERFQlHGAmIiIiIiIiIiIiIiIiIqIq4QAzERERERERERERERERERFVCQeYiYiIiIiIiIiIiIiIiIioSjjATEREREREREREREREREREVcIBZiIiIiIiIiIiIiIiIiIiqhIOMBMRERERERERERERERERUZVwgJmIiIiIiIiIiIiIiIiIiKqEA8xERERERERERERERERERFQlHGAmIiIiIiIiIiIiIiIiIqIq4QAzERERERERERERERERERFVCQeYiYiIiIiIiIiIiIiIiIioSjjATERERERERERERFTPRUdHo3///rC1tUXDhg3x0ksvwWAwmDssqmYighK9ASJSpfLqPi8RVR8RgdFQUuHrvaJyopuxMHcARERERERERERERGQ+GRkZCA8PR2hoKH744QecPXsWzz33HIxGIxYuXGju8KgaFBbrcSklFydiryI9qxCuTtZoE+QBL1dbJKfnlyv39bSHtdU/H06o7Lx36vhEVJ6xuAjFaZdQcP5PGHLSoXVwhU1AK1g6e6EkM7lcuZWbLzRWOnOHTbUc37GJiIiIiIiIiIiI6rFPPvkEBQUF+O677+Do6IgBAwYgOzsbERERmDNnDhwdHc0dIt1BhcV6/PZHIvaduKyWJablITu3CE72OvwRlwqNRlHLT8WnoWcbH3Rv7f2PBoErO++dOj4RlWcsLkLe6QPIi/5NLdNnJMGYnw2NrSMKL5yEomjU8qKL0bAL7Q674G7mCpnuEpwim4iIiIiIiIiIiKge27p1KwYNGmQykDxu3DgUFBQgMjLSjJFRdbiUkmsyyAsAigJ4udrhuz1xKCzSl9tn34nLuJySe8fPeyePT0TlFaddMhlcBgAoCiycPZF18EcYiwvL7ZMX/RuK0y5Dq9XWUJR0N+LXgYiIiIiIiIiIiIjqsZiYGPTr18+kzN/fH7a2toiJicHw4cMr3TclJQVXr141KYuLiwMAlJSUoKSk5M4HTFXy3HPP4cSJEyZlzZo1g3foQBw6mWBS3rSRJw4VFyAjIwOiL0RRzlXk5pkO+OqzE5AYvR1nzpxRy8qOf+LECYSFhVUaS2Xn/bvjX69NmzZYvHhxpfsT1ScVvb5v1KxZM0xo74P000dMyp19m8CvKAq5GRmwKjHiUlYh8vLyTOq4phfDYDAA+PvX9z/F13btYGlpeUv1OcBMREREREREREREVI9lZGTA2dm5XLmLiwsyMjJuuu/SpUvx8ssvV7gtLS0NycnJdyJEug1RUVE4ePCgSZm1jS2KHK8iPS3dtLKfK66m56KkuAQFhRoUFRaUq3PhkjWSEi7h119/LXeurKysCsv/9rxVPD4AFBcX8/lE9D8Vvb5vZGdjjYwGeqSlpZmU23g3RmFmKopLioHCAhQWFJaroyRehJ2NNYC/f33/U3xt1w6+vr63VJ8DzERERERERERERER0W2bOnIkxY8aYlMXFxWHkyJFwc3ODl5eXmSKjTp06wcrKyqTM388X3r4eSMm8YVpcjQU8XO1xPikHNtY6aEps4OrmalKlka8HrLJ90bt3b7UsLi4OOTk5cHBwQNOmTSuNpdLz/s3xr9emTRs+n4j+p6LX9418/Pzh0tAHkpNqUq7TKrB2doP+6kVYWdvA2kaBm5ubSR0Xb38YcQUODg5/+/r+p/javjtxgJmIiIiIiIiIiIioHnNxcUFWVla58oyMDLi4uNx0X09PT3h6ela4zdLS8pan3KQ75/3336+wPO5SJiwcY0zKFAXoEOyFuMRC+HrYw7axd7n9JgwKQRNf0y8TlJSUIDk5GV5eXn/7WFd03r87PhFVrLLX940KE88i89cbBqIVBTZN2sEy9Rws3RrCrZFtuf2ce4/DpkfmVfn1TfWPxtwBEBEREREREREREZH5hISEICbGdOAvISEB+fn5CAkJMVNUVF18Pe3Rs42PSZkIkJyeh1F9msJaV/6+tJ5tfODjaX/Hz3snj09E5Vm5+cIutLtpoQj0mSlw6novNFbW5faxC+0BK7eKX6tEZXgHMxEREREREREREVE9NnjwYLz11lvqVMcAsHbtWtjY2CAsLMzM0dGdZm1lge6tvdGogQOOx15FenYhXB2t0TbIA56utmgT5FGu3MfTHtZW/2w44WbnvRPHJ6LyNFY62AV3g6W7PwrO/wFDTjq0Dq6wCWgNS2dP2AS0Kldu5eYDjZUOhpISc4dPtRjfsYmIiIiIiIiIiIjqsRkzZuD999/HqFGjMHfuXMTHxyMiIgLPPvssHB0dzR0eVQNrKws08XVGYx8n6A1GWGg1UBQFAOBga1VheXWfl4iqh8ZKB2vvxtA1CIQY9VA0FurrTmtjX2E50d/hADMRERERERER1XpGo2DD7lj8cugirmbkw8HWCl1aemPS0FDY21hi28EL+HbHaeTkF6NFY3c8ObYtXB1Lp/xLTs/Hk2/vxlMPtK10ak6qHNueqO5zcXHBzp078cQTT2D48OFwdnbGM888g4iICHOHRtVMURRYWmirXF7d5yWi6qMoChRt+bWUKysnuhmuwUxEREREREREtd5/fzyJVVv+QmZOEXq384WVpRY/HziPiGUHcCEpG0vXH4e1zgJdW3rjaEwy/vvjSQCAiOC9b46hQ4gnBzhvE9ueqH4IDQ3Frl27UFBQgMTERLzyyivQajkASEREROXxDmYiIiIiIiIiqtWycouwef85AMDDw0IxuHsgEpJzMPPNXTh9MQNxCZkwCjB5aCg6hTZAQkouzl3JBgD8uDceCSk5+L9J/cx5CXcttj0REREREd2IA8xEREREREREVKuduZgBg1EAAMGNXAEAfl4OsLO2QF6hHlHRydAowH9/PIVdhxMQfykTPdv64FJKDlZt+QvPT+gARzsrc17CXYttT0REREREN+IAMxERERERERHVarkFJerPNrprXRnWutJBTjsbS8wc3RZrd5zG4b+S0T7EC5OHtsAbq6LQvbU3Gvs44dUVv+N8YjYauNlhyvAWCGzoZI5Lueuw7YmIiIiI6EYcYCYiIiIiIiKiWs3OxlL9uaBIX+5nextLDOraCIO6NlK3rd1xGlczCxDxaFcsXHEI2XlFWPBIVyxd/wcWfv47/vviwJq7gLsY256IiIiIiG6kMXcAREREREREREQ3E+zvAq1GAQCcvpAOAEhIzkF+YekgZ/NAV5P6565k4ZvtZ/DEmDawt7VC3KVM+Hs5wtfTAU18nZCSUYCs3KKavYi7FNueiIiIiIhuxDuYiYiIiIiIiKhWc7LXYXD3APy07xxW/BSNmAsZOBWfBgBo6ueMTs291LoleiPe+foo+rT3RafQBgBK1wyOik7C+2uP4bc/E+Fsr+O6wFXEticiIiIiohvxDmYiIiIiIiIiqvUeubcV/jW4OZztdfj12CUUFRswqGsj/GdaN2i117o3vt4eg5y8Yjxyb0u1bNYD7RDo44TIY5fh4WyDORM7QlEUc1zGXYltT0RERERE16vVdzBHR0fjySefxIEDB+Ds7IxHHnkECxYsgFarvel+WVlZePrp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kp6eLvfdd5+6VllZveLiYnF2dlbXTSzz2WefSZMmTcTS0lI6dOggHh4eMmzYMHVduRdffFFCQkLU9yGR0ulVR48erd61JlI6cLBgwQLp3LmzeHl5Sa9eveTzzz+vtQMA5rJx40Zxd3cXnU4nw4YNk8WLF8uxY8fUaTLLGAwGefDBB0VRFAkKCpKXXnrJZNvy5ctFURRp1qyZPPXUUzJu3DhxdXWV119//W9j0Ov1dfLvBBFVjLlqzWCual7MVWse89S6h3kqERERERHVFA4wi8ihQ4ckNDRUXWcuJydHnn/+eXnkkUekpKREevXqJQsWLBARkYiICGnQoIFkZmbKtm3bxMfHR+bOnSsxMTEiIvL222+Lp6enbNmyRUREDhw4IM2aNVPvLCnrhLh48aJ07NhROnToICLXPphXdudHZdPB3U0+/fRTsbKyUteFK2uLiIgICQ4OVqc3K5sysWPHjrJt2zbZuXOnjB49Wry9vdXOtgULFoiXl5eIXGubkpISeeyxxyQgIEA99k8//SSKokhUVJSIlLZzaGioPPXUUyZr233zzTfSqFEjWbNmjYiUdrZUNB2iSN349rXRaJTTp09LVFSUhIWFyUcffSTTpk2TBx54QLp37y6NGjWSxo0by2effabu8+6774q7u7scP35cREReeOEFURRFbGxsxMbGRrp37y4RERGyf/9+ycrKUttt4MCB0qhRI1m5cqWcOXNGFi9eLEOHDhVFUeTRRx9V716IjIyUK1eu1HxjVJPff/9d7OzsZOjQoer0ihXdgRMTEyM7duyQQ4cOiaIoEhkZKSKlHdPW1tbqc1ek9E4nd3d3k07nH374QRo1aiRPP/20+ti8+uqr4uXlpU4r+Ouvv4qnp6csW7ZM3c9gMMibb74piqKonYtl8ZUNOlDFLly4ICEhIfLMM8+ISPnHtez3o0ePipOTk2zevFkWL14sWq1W5s6dq9aLiooSa2tr+eijj+T555+X0aNHy5o1a0zem248bl2acpOIqo65as1grlp7MFetXsxT6y7mqUREREREVFM4wCylnTAvv/yyaDQa+euvv0REZMqUKTJr1iwRKZ0isHPnzhIfHy+LFi2Sxo0bS2JiosyaNUuaN29usibe6tWrRVEUtZPvypUrMmrUKGndurV6LpHSD827du0ymXawrjt9+rT4+/vLu+++KyKifvt/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lTg7O8s999wjoaGhMmfOHJk5c6Z06tRJsrOzK43jbnosyp5DO3fulGbNmsnbb7+tll+/Btknn3wiAQEBMmLECJk5c6a4urrKwIED1Xb48MMPRVEU2b9/v4hcm6pxy5Yt4uHhIatXr1aPVVBQIEOHDpVBgwaJyLX22rRpk9ja2sqOHTvUGK5cuSIrV66UKVOmyBtvvCGnT5+uzuao9cqmynzhhRckMDBQsrKyZP369WJrayvTp08XEZHo6GixtraWr776St3PaDTK4cOHRaPRyKZNm0yO2a1bNxk5cqS89NJL0rp1azl06JC6LS8vT10b0traWtq3by8nTpy46fOf/rmUlBRp27atBAYGSq9evcTKykrs7e2lZ8+esnLlSsnJyVHr3jid4/XvPykpKeo0qUREf4e5avVjrnrrmKvePZin1g/MU4mIiEhEZMWKFQJAAFT4N91oNIqvr68AkKFDh96x8wJQl2S6FefOnRMA6pI3RFT7cYD5Bh988IHY2NjIkCFDZOzYsSadIl9//bXY2dmJoiiye/dutbxs3aIb3U0dQzXlwoULEhISIs8884yIXOvkKCwslOnTp0vz5s3lyJEjMmjQIAkPDzfZ99KlS/Lee+/JG2+8oXY4JScny6JFi+Thhx+Wzz//XEREhg8fLgMHDpSsrCx13+vXx6tNyq7jxrX0SkpK1LKy51FOTo506dJFWrZsKR07dhSdTieLFi0So9Eop06dEltbW5k3b55kZGRIcXGx/P777+Lt7S2vv/66iIj8+uuv4uzsrK4rWNYReubMGenatas8+OCDJud75513xMPDw2Tds/z8fFEURd55551qbJW7X0lJiTz77LPSoEEDESntXJs+fbpYWlrKvn37RETE1tZWPvjgA7W9jUajXL58WRo2bChz5841ec5u3rxZ+vXrJzqdTnr27CmxsbHqPmX/x8bGmnQWUfUqKSmRadOmSbdu3eTFF1+U48ePV1ivtr73ENHdi7lq9WKuaoq5at3DPLXuY55KREREItcGmK2treWxxx4rt3337t0CQHQ6HQeYiei2cID5BsnJyTJgwABRFEXuvfdeuXr1qrotLS1NvvjiC/n5558r/DCm1+v5Ie1vFBUVyciRI6Vbt24iYvqh9ptvvhFFUeTy5cuya9cucXFxkd69e8vbb78tCxYskL59+0qHDh1k7dq1otfr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X74ca9aswYMPPqiW9+3bF/fccw/WrVtnUh4XF4eff/4ZgwYNMke4RERERFRPME8lIiIiIiKi2o53MBNRvbRu3To4OTlhwIABSE1NVf916NAB9vb22L17t0n9wMBAdtoRERERUbVjnkpERERERES1He9gJqJ6KTY2FllZWfD09Kxwe0pKisnvgYGBNREWEREREdVzzFOJiIiIiIiotuMAMxHVS0ajEZ6enlizZk2F2z08PEx+t7GxqYmwiIiIiKieY55KREREREREtR0HmImoXmrSpAl27NiBHj16sFOOiIiIiGoN5qlERERERERU23ENZiKql8aOHQuDwYBXXnml3Da9Xo/MzMyaD4qIiIiI6j3mqURERERERFTb8Q5mIqqXwsLCMH36dCxatAjHjx/HwIEDYWlpidjYWKxbtw7vvfceRo8ebe4wiYiIiKieYZ5KREREREREtR0HmImo3vrkk0/QoUMHfPrpp/j3v/8NCwsLBAQE4KGHHkKPHj3MHR4RERER1VPMU4mIiIiIiKg2U0REzB0EERERERERERERERERERHVflyDmYiIiIiIiIiIiIiIiIiIqoQDzEREREREREREREREREREVCUcYCYiIiIiIiIiIiIiIiIioirhADMREREREREREREREREREVUJB5iJiIiIiIiIiIiIiIiIiKhKOMBMRERERERERERERERERERVwgFmIiIiIiIiIiIiIiIiIiKqEg4wExERERERERERERERERFRlXCAmYiIiIiIiIiIiIiIiIiIqoQDzEREREREREREREREREREVCUcYCYiIiIiIiIiIiIiIiIioirhADMREREREREREREREREREVUJB5iJiIiIiIiIiIiIiIiIiKhKOMBMRERERERERERERERERERV8v/MDz9TohOZLAAAAABJRU5ErkJggg==\n" + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Saved → compare_rl_env.png\n" + ] + } + ], + "source": [ + "# ═══════════════════════════════════════════════════════════════════════════\n", + "# Figure 2 — RL env eval (2x3)\n", + "# ═══════════════════════════════════════════════════════════════════════════\n", + "TIER_ORDER = [\"warmup\", \"beginner\", \"intermediate\", \"advanced\", \"expert\"]\n", + "difficulties = [d for d in TIER_ORDER\n", + " if d in base_rl_metrics[\"_per_diff\"] and d in sft_rl_metrics[\"_per_diff\"]]\n", + "\n", + "fig2 = plt.figure(figsize=(20, 12))\n", + "gs2 = GridSpec(2, 3, figure=fig2, hspace=0.5, wspace=0.38)\n", + "rax1 = fig2.add_subplot(gs2[0, 0]) # avg episode reward\n", + "rax2 = fig2.add_subplot(gs2[0, 1]) # completion rate\n", + "rax3 = fig2.add_subplot(gs2[0, 2]) # avg steps & reward/step\n", + "rax4 = fig2.add_subplot(gs2[1, 0]) # per-difficulty reward\n", + "rax5 = fig2.add_subplot(gs2[1, 1]) # per-difficulty completion\n", + "rax6 = fig2.add_subplot(gs2[1, 2]) # reward distribution (box)\n", + "\n", + "models = [\"Base\", \"SFT\"]\n", + "x2 = np.arange(len(models))\n", + "bar_colors = [COLOR_BASE, COLOR_SFT]\n", + "\n", + "# 2a. Avg episode reward ± std\n", + "avg_rewards = [base_rl_metrics[\"avg_episode_reward\"], sft_rl_metrics[\"avg_episode_reward\"]]\n", + "reward_stds = [base_rl_metrics[\"reward_std\"], sft_rl_metrics[\"reward_std\"]]\n", + "bars_r = rax1.bar(x2, avg_rewards, 0.45, color=bar_colors,\n", + " edgecolor=\"white\", linewidth=0.6,\n", + " yerr=reward_stds, capsize=5, error_kw={\"elinewidth\": 1.5})\n", + "for bar, v in zip(bars_r, avg_rewards):\n", + " rax1.text(bar.get_x() + bar.get_width()/2,\n", + " bar.get_height() + max(reward_stds) * 0.1 + 0.05,\n", + " f\"{v:.2f}\", ha=\"center\", fontsize=9, fontweight=\"bold\")\n", + "rax1.set(title=\"Avg Episode Reward (±std)\", ylabel=\"Total Reward\", xlabel=\"Model\")\n", + "rax1.set_xticks(x2); rax1.set_xticklabels(models); rax1.set_axisbelow(True)\n", + "\n", + "# 2b. Task completion rate\n", + "comp_rates = [base_rl_metrics[\"completion_rate\"] * 100,\n", + " sft_rl_metrics[\"completion_rate\"] * 100]\n", + "bars_c = rax2.bar(x2, comp_rates, 0.45, color=bar_colors, edgecolor=\"white\", linewidth=0.6)\n", + "for bar, v in zip(bars_c, comp_rates):\n", + " rax2.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.8,\n", + " f\"{v:.0f}%\", ha=\"center\", fontsize=9, fontweight=\"bold\")\n", + "rax2.set(title=\"Task Completion Rate\", ylabel=\"% Episodes Completed\",\n", + " xlabel=\"Model\", ylim=(0, 115))\n", + "rax2.set_xticks(x2); rax2.set_xticklabels(models); rax2.set_axisbelow(True)\n", + "\n", + "# 2c. Avg steps + reward/step (grouped)\n", + "step_vals = [base_rl_metrics[\"avg_steps\"], sft_rl_metrics[\"avg_steps\"]]\n", + "rps_vals = [base_rl_metrics[\"avg_reward_per_step\"], sft_rl_metrics[\"avg_reward_per_step\"]]\n", + "w3 = 0.35\n", + "for i, (vals, label) in enumerate([(step_vals, \"Avg Steps\"), (rps_vals, \"Reward/Step\")]):\n", + " bars_ = rax3.bar(x2 + (i - 0.5) * w3, vals, w3,\n", + " color=bar_colors, edgecolor=\"white\",\n", + " linewidth=0.6, label=label, alpha=0.85 if i else 1.0)\n", + " for bar, v in zip(bars_, vals):\n", + " rax3.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.05,\n", + " f\"{v:.2f}\", ha=\"center\", fontsize=8, fontweight=\"bold\")\n", + "rax3.set(title=\"Steps & Reward Efficiency\", ylabel=\"Value\", xlabel=\"Model\")\n", + "rax3.set_xticks(x2); rax3.set_xticklabels(models)\n", + "rax3.legend(loc=\"upper right\"); rax3.set_axisbelow(True)\n", + "\n", + "# 2d. Per-difficulty avg reward (all 5 tiers)\n", + "xd, wd = np.arange(len(difficulties)), 0.35\n", + "base_dr = [base_rl_metrics[\"_per_diff\"][d][\"avg_reward\"] for d in difficulties]\n", + "sft_dr = [sft_rl_metrics[\"_per_diff\"][d][\"avg_reward\"] for d in difficulties]\n", + "annotate_bars(rax4, rax4.bar(xd - wd/2, base_dr, wd, color=COLOR_BASE,\n", + " label=\"Base\", edgecolor=\"white\"), fmt=\"{:.2f}\", offset=0.02)\n", + "annotate_bars(rax4, rax4.bar(xd + wd/2, sft_dr, wd, color=COLOR_SFT,\n", + " label=\"SFT\", edgecolor=\"white\"), fmt=\"{:.2f}\", offset=0.02)\n", + "rax4.set(title=\"Avg Reward by Difficulty Tier\", ylabel=\"Avg Episode Reward\", xlabel=\"Tier\")\n", + "rax4.set_xticks(xd)\n", + "rax4.set_xticklabels([d.capitalize() for d in difficulties], rotation=15, ha=\"right\")\n", + "rax4.legend(); rax4.set_axisbelow(True)\n", + "\n", + "# 2e. Per-difficulty completion rate (all 5 tiers)\n", + "base_dc = [base_rl_metrics[\"_per_diff\"][d][\"completion_rate\"] * 100 for d in difficulties]\n", + "sft_dc = [sft_rl_metrics[\"_per_diff\"][d][\"completion_rate\"] * 100 for d in difficulties]\n", + "annotate_bars(rax5, rax5.bar(xd - wd/2, base_dc, wd, color=COLOR_BASE,\n", + " label=\"Base\", edgecolor=\"white\"), fmt=\"{:.0f}%\", offset=0.8)\n", + "annotate_bars(rax5, rax5.bar(xd + wd/2, sft_dc, wd, color=COLOR_SFT,\n", + " label=\"SFT\", edgecolor=\"white\"), fmt=\"{:.0f}%\", offset=0.8)\n", + "rax5.set(title=\"Completion Rate by Difficulty Tier\",\n", + " ylabel=\"% Episodes Completed\", xlabel=\"Tier\", ylim=(0, 120))\n", + "rax5.set_xticks(xd)\n", + "rax5.set_xticklabels([d.capitalize() for d in difficulties], rotation=15, ha=\"right\")\n", + "rax5.legend(); rax5.set_axisbelow(True)\n", + "\n", + "# 2f. Reward distribution — box + jitter\n", + "bp = rax6.boxplot(\n", + " [base_rl_metrics[\"_rewards\"], sft_rl_metrics[\"_rewards\"]],\n", + " labels=[\"Base\", \"SFT\"],\n", + " patch_artist=True,\n", + " medianprops={\"color\": \"white\", \"linewidth\": 2},\n", + " whiskerprops={\"linewidth\": 1.5},\n", + " capprops={\"linewidth\": 1.5},\n", + " flierprops={\"marker\": \"o\", \"markersize\": 5, \"alpha\": 0.6},\n", + " widths=0.4,\n", + ")\n", + "for patch, color in zip(bp[\"boxes\"], [COLOR_BASE, COLOR_SFT]):\n", + " patch.set_facecolor(color); patch.set_alpha(0.85)\n", + "for i, (rewards, color) in enumerate(\n", + " [(base_rl_metrics[\"_rewards\"], COLOR_BASE),\n", + " (sft_rl_metrics[\"_rewards\"], COLOR_SFT)], start=1\n", + "):\n", + " jitter = np.random.uniform(-0.08, 0.08, len(rewards))\n", + " rax6.scatter(np.full(len(rewards), i) + jitter, rewards,\n", + " color=color, alpha=0.7, zorder=3, s=30,\n", + " edgecolors=\"white\", linewidths=0.4)\n", + "rax6.set(title=\"Episode Reward Distribution\",\n", + " ylabel=\"Total Episode Reward\", xlabel=\"Model\")\n", + "rax6.set_axisbelow(True)\n", + "\n", + "fig2.suptitle(\n", + " f\"Part 2 — RL Env Eval: Base vs SFT \"\n", + " f\"({len(difficulties)} tiers × {RL_EPISODES_PER_DIFF} episodes each)\",\n", + " fontsize=15, fontweight=\"bold\", y=1.01,\n", + ")\n", + "plt.savefig(\"compare_rl_env.png\", dpi=150, bbox_inches=\"tight\", facecolor=\"white\")\n", + "plt.show()\n", + "print(\"Saved → compare_rl_env.png\")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "cell-summary-table", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cell-summary-table", + "outputId": "de39bae0-ef24-4d5c-d84f-0c0134ed671c" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "========================================================================\n", + "DATASET EVAL SUMMARY\n", + "========================================================================\n", + "Metric Base SFT Delta\n", + "----------------------------------------------------------------\n", + "format_pct 33.3% 100.0% +66.7pt\n", + "format_after_extract_pct 100.0% 100.0% +0.0pt\n", + "exact_pct 38.9% 88.9% +50.0pt\n", + "service_pct 77.8% 88.9% +11.1pt\n", + "operation_pct 61.1% 88.9% +27.8pt\n", + "avg_latency 1.901 1.559 -0.342\n", + "avg_len 85.833 74.722 -11.111\n", + "\n", + "========================================================================\n", + "RL ENV EVAL SUMMARY\n", + "========================================================================\n", + "Metric Base SFT Delta\n", + "------------------------------------------------------------\n", + "avg_episode_reward 1.187 2.011 +0.824\n", + "reward_std 1.137 1.908 +0.771\n", + "completion_rate 46.7% 73.3% +26.7pt\n", + "avg_steps 8.600 5.733 -2.867\n", + "avg_reward_per_step 0.138 0.351 +0.213\n" + ] + } + ], + "source": [ + "print(\"=\" * 72)\n", + "print(\"DATASET EVAL SUMMARY\")\n", + "print(\"=\" * 72)\n", + "ds_keys = [\"format_pct\", \"format_after_extract_pct\", \"exact_pct\",\n", + " \"service_pct\", \"operation_pct\", \"avg_latency\", \"avg_len\"]\n", + "print(f\"{'Metric':<30} {'Base':>10} {'SFT':>10} {'Delta':>12}\")\n", + "print(\"-\" * 64)\n", + "for k in ds_keys:\n", + " b, s = base_ds_metrics[k], sft_ds_metrics[k]\n", + " if \"pct\" in k:\n", + " print(f\"{k:<30} {100*b:9.1f}% {100*s:9.1f}% {100*(s-b):+11.1f}pt\")\n", + " else:\n", + " print(f\"{k:<30} {b:10.3f} {s:10.3f} {s-b:+12.3f}\")\n", + "\n", + "print()\n", + "print(\"=\" * 72)\n", + "print(\"RL ENV EVAL SUMMARY\")\n", + "print(\"=\" * 72)\n", + "rl_keys = [\"avg_episode_reward\", \"reward_std\", \"completion_rate\",\n", + " \"avg_steps\", \"avg_reward_per_step\"]\n", + "print(f\"{'Metric':<25} {'Base':>10} {'SFT':>10} {'Delta':>12}\")\n", + "print(\"-\" * 60)\n", + "for k in rl_keys:\n", + " b, s = base_rl_metrics[k], sft_rl_metrics[k]\n", + " if k == \"completion_rate\":\n", + " print(f\"{k:<25} {100*b:9.1f}% {100*s:9.1f}% {100*(s-b):+11.1f}pt\")\n", + " else:\n", + " print(f\"{k:<25} {b:10.3f} {s:10.3f} {s-b:+12.3f}\")" + ] + } + ] +} \ No newline at end of file diff --git a/compare/compare_base_vs_sft_with_outputs.ipynb b/compare/compare_base_vs_sft_with_outputs.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..f454e88290be7e79821c50d7c16682e65c155f3b --- /dev/null +++ b/compare/compare_base_vs_sft_with_outputs.ipynb @@ -0,0 +1,7373 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "cell-title", + "metadata": { + "id": "cell-title" + }, + "source": [ + "# Base Model vs SFT Model — Comparison\n", + "\n", + "Two evaluation modes — run one or both:\n", + "\n", + "| Mode | What it tests | Needs |\n", + "|---|---|---|\n", + "| **Dataset eval** | Static pattern matching on held-out prompts | HF token + dataset access |\n", + "| **RL env eval** | Live task completion against the AWS environment | Dataset eval above + running HF Space |\n", + "\n", + "**RL env metrics (per episode)**\n", + "| Metric | What it measures |\n", + "|---|---|\n", + "| `avg_episode_reward` | Mean total reward accumulated per episode |\n", + "| `completion_rate` | % episodes the model completed the task before hitting max steps |\n", + "| `avg_steps` | Mean number of AWS commands issued per episode |\n", + "| `avg_reward_per_step` | Mean per-step reward (efficiency) |\n", + "| `reward_std` | Reward variance across episodes (consistency) |\n", + "\n", + "**Before running:**\n", + "1. Runtime → Change runtime type → GPU (T4)\n", + "2. Fill in Config below\n", + "3. Add `HF_TOKEN` to Colab Secrets (🔑 left sidebar)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "cell-config", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cell-config", + "outputId": "f5ce28ff-dc54-4750-f34d-5d0eda178323" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Config OK\n" + ] + } + ], + "source": [ + "# ── CONFIG ─────────────────────────────────────────────────────────────────\n", + "BASE_MODEL = \"unsloth/Qwen2.5-Coder-3B-Instruct-bnb-4bit\"\n", + "SFT_ADAPTER_REPO = \"Sizzing/aws-rl-sft-qwen25coder3b-adapter\" # HF Hub or local path\n", + "DATASET_REPO = \"Sizzing/aws-rl-sft\"\n", + "REPO_URL = \"https://github.com/bangar1/aws-rl-env-fork\" # your fork\n", + "ENV_BASE_URL = \"https://bangar-hf-aws-rl-env.hf.space/\" # HF Space URL\n", + "\n", + "# Dataset eval knobs\n", + "MAX_SEQ_LENGTH = 512\n", + "MAX_NEW_TOKENS = 120\n", + "EVAL_MAX_PER_COMBO = 2 # rows per (difficulty, source) combo\n", + "\n", + "# RL env eval knobs — difficulty tiers: warmup, beginner, intermediate, advanced, expert\n", + "RL_EPISODES_PER_DIFF = 3 # episodes per difficulty tier\n", + "MAX_EPISODE_STEPS = 15 # max AWS commands per episode\n", + "TEMPERATURE = 0.7\n", + "\n", + "IS_COLAB = True\n", + "# ───────────────────────────────────────────────────────────────────────────\n", + "assert \"YOUR_USERNAME\" not in ENV_BASE_URL, \"Set ENV_BASE_URL to your HF Space URL\"\n", + "assert \"YOUR_USERNAME\" not in REPO_URL, \"Set REPO_URL to your fork URL\"\n", + "print(\"Config OK\")" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "cell-install", + "metadata": { + "id": "cell-install" + }, + "outputs": [], + "source": [ + "%%capture\n", + "!pip install -q --upgrade pip\n", + "!pip install -q unsloth\n", + "!pip install -q --force-reinstall --no-deps \"transformers>=4.50,<5.0\"\n", + "!pip install -q --upgrade \"trl<0.12.0\" peft accelerate datasets huggingface_hub bitsandbytes\n", + "!pip install -q matplotlib numpy httpx websockets nest_asyncio" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "id": "cell-clone", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cell-clone", + "outputId": "c65ab6ce-d038-4367-d94f-81d28b2946ca" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Removed existing directory: /content/aws-rl-env\n", + " Installing build dependencies ... \u001b[?25l\u001b[?25hdone\n", + " Checking if build backend supports build_editable ... \u001b[?25l\u001b[?25hdone\n", + " Getting requirements to build editable ... \u001b[?25l\u001b[?25hdone\n", + " Preparing editable metadata (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", + " Building editable for openenv-aws_rl_env (pyproject.toml) ... \u001b[?25l\u001b[?25hdone\n", + "Repo ready at /content/aws-rl-env\n" + ] + } + ], + "source": [ + "import subprocess, sys\n", + "import shutil\n", + "\n", + "REPO_DIR = \"/content/aws-rl-env\"\n", + "\n", + "# Remove the directory if it already exists\n", + "if os.path.exists(REPO_DIR):\n", + " shutil.rmtree(REPO_DIR)\n", + " print(f\"Removed existing directory: {REPO_DIR}\")\n", + "\n", + "subprocess.run([\"git\", \"clone\", \"--depth\", \"1\", REPO_URL, REPO_DIR], check=True)\n", + "!pip install -q -e /content/aws-rl-env # ← add this\n", + "\n", + "if REPO_DIR not in sys.path:\n", + " sys.path.insert(0, REPO_DIR)\n", + "print(\"Repo ready at\", REPO_DIR)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "cell-gpu", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cell-gpu", + "outputId": "52260168-fddc-4cde-ed62-d3d0c38178c0" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "GPU : Tesla T4\n", + "VRAM : 15.6 GB\n", + "Prec : fp16\n" + ] + } + ], + "source": [ + "import os, gc, time, json, math, asyncio, logging\n", + "from dataclasses import dataclass, field\n", + "from typing import List, Tuple\n", + "import torch\n", + "import nest_asyncio\n", + "nest_asyncio.apply()\n", + "\n", + "os.environ.setdefault(\"PYTORCH_ALLOC_CONF\", \"expandable_segments:True\")\n", + "\n", + "assert torch.cuda.is_available(), \"No GPU — Runtime → Change runtime type → GPU\"\n", + "gpu = torch.cuda.get_device_properties(0)\n", + "IS_T4 = \"T4\" in gpu.name\n", + "USE_FP16 = IS_T4\n", + "USE_BF16 = not IS_T4\n", + "print(f\"GPU : {gpu.name}\")\n", + "print(f\"VRAM : {gpu.total_memory / 1e9:.1f} GB\")\n", + "print(f\"Prec : {'fp16' if USE_FP16 else 'bf16'}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "cell-auth", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cell-auth", + "outputId": "a1df87c9-db7b-460c-df5e-7347b83e412b" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Note: Environment variable`HF_TOKEN` is set and is the current active token independently from the token you've just configured.\n", + "WARNING:huggingface_hub._login:Note: Environment variable`HF_TOKEN` is set and is the current active token independently from the token you've just configured.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "HF authenticated\n" + ] + } + ], + "source": [ + "if IS_COLAB:\n", + " from google.colab import userdata\n", + " os.environ[\"HF_TOKEN\"] = userdata.get(\"HF_TOKEN\")\n", + "\n", + "assert os.environ.get(\"HF_TOKEN\"), \"Set HF_TOKEN in Colab Secrets\"\n", + "\n", + "from huggingface_hub import login as hf_login\n", + "hf_login(token=os.environ[\"HF_TOKEN\"], add_to_git_credential=False)\n", + "print(\"HF authenticated\")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "cell-health", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cell-health", + "outputId": "7358686d-101a-4f4e-c7aa-b36869bcc10f" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "RL env server: 404 {'detail': 'Not Found'}\n" + ] + } + ], + "source": [ + "import httpx\n", + "\n", + "with httpx.Client(timeout=15) as c:\n", + " r = c.get(f\"{ENV_BASE_URL}/health\")\n", + " print(\"RL env server:\", r.status_code, r.json())" + ] + }, + { + "cell_type": "markdown", + "id": "cell-part1-md", + "metadata": { + "id": "cell-part1-md" + }, + "source": [ + "---\n", + "# Part 1 — Dataset Eval (static)\n", + "\n", + "Pattern-matching on held-out prompts. Fast, no env server needed." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "cell-dataset", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 491, + "referenced_widgets": [ + "3cf95de334a14af9b7274dee96b2f20d", + "41a765ae42f142a5aaf0163612bbe490", + "0f614193015744f2a0263aa13681b411", + "68d44bd4ff9a439f958573c8ec16405b", + "c0c12b0fc46f4b9f8ea2af23e194da23", + "796833bcdc3845849bf4b44da6379fcc", + "b22885fcbf3147509191939f5de83602", + "cc427e51ea1446aaa74d6f24cb17d043", + "a8816b70cd9f409ba7acfacc2864c043", + "c71fef24bafe4b45896601a7ae144c2f", + "548cc14a659b4e6e9c217ff980e34608", + "9d1f05eb5d3b4bdba57d618f022eaa7b", + "7ec0191160e04c5397c24bbad3d2b593", + "bf317a89297c4265938863cc3f74ba8c", + "616c3d44f0a64e22828c2e472a8c13bc", + "57cd591f5b3f4d6aa2e401dcb0c3c8fc", + "51ad078171814b9ca022d88231cf6387", + "ed06bfd4c13f41598d5e10bbe6139eb8", + "62ba79bd0e2f47fcbb073cbe15ab2bf6", + "62a7c1256a3d462ca1f58711b4985852", + "0cf6a91ad33f4f0a94b890881658b5b2", + "5178b799d7404fd282f4e5016d616d14", + "0d2747470d4947849c27775b43ecb54c", + "fbc88709dcf84cfbb91d7efbb10e0b42", + "cc4366820b234778b543af95146a4e92", + "0fba0e0c04c14214ae58cdd3f65fd92f", + "4dae08a1f54842e49185c4402659df6f", + "c795b9a1dc834f67ac44a568b9744ed7", + "1241be723444464fbb334b06d8208410", + "7f28dc39b40543d9b17bd8ad611e3623", + "2def96a8b6d646ef8801ce2c1e0a8d14", + "96abbd4be45f4eef9587a795f10c73f9", + "6736d9704da04076a134426a47cb15c4", + "617dcbb6224b49bb9b83dac185420e09", + "7c93228f55074cf78b1170001545f89d", + "b1e2bcaf50124b14b7bc70fb403e68b8", + "c36279d8d0774918812725c906a8af12", + "ebb9a1dea358429e9e166c470076d4ce", + "5bbbc6530c014b5296c181526d08cec0", + "8a2f80c0be5a47b994f6e091cb01d287", + "fbb8cb04661945c782b1df5e423b37a0", + "94eb4cb08c8443098267d78b1665514e", + "f5eb0e8911ad46d19d1d76dfa55fb21c", + "1161e043c93c4671a8155dce8d9dd701", + "1dc1444225ce43a888350992cc7f0bbb", + "9ef9a30c556c4d9da3692fd8a829270f", + "b14329f3b61447f788d6e836bf934c91", + "6cff000d81e8431298609a9148cdb793", + "49de19f8c9e04603980b4a4a8c816545", + "4dca96c48eb64681b36a76b4f0b01b62", + "66f989e6acee487faf8f6cc453faa486", + "052ba95707274c42933cb13fc8ad078c", + "daf23f97138a44f49f8099d73a39b33b", + "741c77c00dd34486bd780369d2918d53", + "b6c49d1dbf184f86a4a94644340b9f90", + "c9572ada407547acb82b499b4aba9408", + "2f17b452a3f04d448beff33d60445e2e", + "5cdf05f2225f499e8574ab64ec9a8766", + "80d9e1dd1507439088c3d9d8c4c7b0ac", + "4e6c58ce96404281b880833f88e08413", + "cd77111d0ee44ecaacb5159f68c88609", + "89604435feab456888553549728c15a7", + "66558440f90b42d99278658f7151f043", + "188a00a386704c7887d139bc284ccc1a", + "ceadf3915006459fb72ed9141c49dc2f", + "63b9d68de11b4fbfa5e8acaaa25b4c35", + "f65560291a834aef846683d3909a9db6", + "9c1e0ff6a9094793905ddc191e95796d", + "182361253eee49418048b01fbcf2672f", + "8af925f00d3541958d318f43591bdd76", + "c0cdb510c34c4e27b8061a5b4e4b88fa", + "ea1e771eea51498b9917da282d783427", + "39929719372644589a9baa7295fd5849", + "79d5b6596f1b4ee5966b55dad97df3a2", + "b49e779bf02c49bbb1f4eba5ac2dd1e2", + "e87a2309352248309f209b71dd050799", + "1e3372b4af51443f88050b77fedc5bef" + ] + }, + "id": "cell-dataset", + "outputId": "6708e2fd-f2c4-4b6a-baf7-da9410d3cb22" + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "3cf95de334a14af9b7274dee96b2f20d", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "README.md: 0.00B [00:00, ?B/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "9d1f05eb5d3b4bdba57d618f022eaa7b", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "data/train-00000-of-00001.parquet: 0%| | 0.00/1.92M [00:00 str:\n", + " text = raw.strip()\n", + " if text.startswith(\"```\"):\n", + " lines = text.split(\"\\n\")\n", + " text = \"\\n\".join(l for l in lines if not l.startswith(\"```\")).strip()\n", + " for line in text.split(\"\\n\"):\n", + " line = line.strip()\n", + " if line.startswith(\"aws \"):\n", + " return line\n", + " return text\n", + "\n", + "\n", + "def score_row(completion: str, expected: str) -> dict:\n", + " extracted = extract_command(completion)\n", + " e_tokens = extracted.split()\n", + " exp_tokens = expected.split()\n", + " return {\n", + " \"format_ok\": completion.strip().startswith(\"aws \"),\n", + " \"format_after_extract\": extracted.startswith(\"aws \"),\n", + " \"exact\": extracted == expected.strip(),\n", + " \"service\": (len(e_tokens) >= 2 and len(exp_tokens) >= 2\n", + " and e_tokens[1:2] == exp_tokens[1:2]),\n", + " \"operation\": (len(e_tokens) >= 3 and len(exp_tokens) >= 3\n", + " and e_tokens[2:3] == exp_tokens[2:3]),\n", + " }\n", + "\n", + "\n", + "def build_eval_set(dataset, max_per_combo: int = 2):\n", + " seen, picks = {}, []\n", + " for r in dataset:\n", + " key = (r[\"difficulty\"], r[\"source\"])\n", + " seen[key] = seen.get(key, 0) + 1\n", + " if seen[key] <= max_per_combo:\n", + " picks.append(r)\n", + " return picks\n", + "\n", + "\n", + "def dataset_eval(model, tokenizer, eval_set, max_new_tokens: int = 120) -> dict:\n", + " results = []\n", + " model.eval()\n", + " for row in eval_set:\n", + " msgs = row[\"messages\"][:2]\n", + " expected = row[\"messages\"][2][\"content\"]\n", + " prompt = tokenizer.apply_chat_template(\n", + " msgs, tokenize=False, add_generation_prompt=True\n", + " )\n", + " inputs = tokenizer(prompt, return_tensors=\"pt\").to(model.device)\n", + " t0 = time.time()\n", + " with torch.inference_mode():\n", + " out_ids = model.generate(\n", + " **inputs, max_new_tokens=max_new_tokens,\n", + " do_sample=False, temperature=0.0,\n", + " pad_token_id=tokenizer.eos_token_id,\n", + " )\n", + " dt = time.time() - t0\n", + " completion = tokenizer.decode(\n", + " out_ids[0, inputs.input_ids.shape[1]:], skip_special_tokens=True\n", + " )\n", + " s = score_row(completion, expected)\n", + " s.update({\"latency\": dt, \"len\": len(completion),\n", + " \"completion\": completion, \"expected\": expected})\n", + " results.append(s)\n", + "\n", + " n = len(results)\n", + " return {\n", + " \"format_pct\": sum(r[\"format_ok\"] for r in results) / n,\n", + " \"format_after_extract_pct\": sum(r[\"format_after_extract\"] for r in results) / n,\n", + " \"exact_pct\": sum(r[\"exact\"] for r in results) / n,\n", + " \"service_pct\": sum(r[\"service\"] for r in results) / n,\n", + " \"operation_pct\": sum(r[\"operation\"] for r in results) / n,\n", + " \"avg_latency\": sum(r[\"latency\"] for r in results) / n,\n", + " \"avg_len\": sum(r[\"len\"] for r in results) / n,\n", + " \"_per_row\": results,\n", + " }\n", + "\n", + "\n", + "EVAL_SET = build_eval_set(ds[\"validation\"], max_per_combo=EVAL_MAX_PER_COMBO)\n", + "combos = len(set((r[\"difficulty\"], r[\"source\"]) for r in EVAL_SET))\n", + "print(f\"Eval set: {len(EVAL_SET)} prompts across {combos} (tier, source) combos\")" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "cell-base-dataset-eval", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 686, + "referenced_widgets": [ + "082ceda90b8d484a81a1de5fead892b6", + "e8560b1f7c5a42a1b850a24bd22f9a73", + "5a5d3dac3d2f43419349404bd0c79f4f", + "4772a353fbb243aca9f472de257d1358", + "b14fbeb1fb4f4888b63afd9cf4476b28", + "0ac4cc8e789d4a7389ba2d81f752b2a6", + "17ad15eed85f493ca0d0d6b8d914ca2c", + "8c91b59afcd343648321a9ed206531a7", + "a3710ca3ab474ce59a146b54fea25736", + "f2247b50901c4a20854c1ac284d76e7f", + "71c857a576e04c1592352df2553a10f6", + "44fb962be403416c910b1c4bf25bcdf1", + "161b757d5f64481a9212dbccd7a884c7", + "a18521a6e11b4e1ea6e53ce81b2af574", + "969a9823b8864c0f877eb2c3af383205", + "753cba0957c240cd8d7fcf171dd2557e", + "89fdaf865e0e4f7fa1909f032005d1d8", + "8060b0a254d54032bbb01a56431e98eb", + "80d066d9f0614ae4b264ade4a304cf49", + "bdccff3baee846459a9645d014266d2a", + "f105bcab30d8404a9b3a1ce866480374", + "9c78bf775e4149cfbe34f1e253c2c9fc", + "7799ec6190d04928963fbd82d195e2b3", + "68d465d228c141a7b5c8c97799102790", + "9f01388850d44b30a155bdd6c1528de4", + "a5a23a6849e240be90007a200a14e1a3", + "1a190eca13234bca86da0f33e46a34e1", + "00ff165127094d2fb481980c130f04c8", + "d2af9a4571554901a04f1afdd556984d", + "d06befc9db47458fa696880e19449d90", + "aadd0d6341714668ae5a85c445f49a09", + "5329bea02fc2432b84b8bb8eb733eaf9", + "ba6c2ac768044ec0b688e6573e540f92", + "e580572f40454f8ebb8d6d50cab3c644", + "bc4ee14a8b7140edba21f43a0d673045", + "399a72c355d8478e87995aff1c57f426", + "ab9aa9b9c93b4ee5900a351cd584cee8", + "2c51081cf8314bd58a8b7b93cdf2eed7", + "88f4f5a8f65742eb8cb1228e5d94508c", + "54c323cb9fe9458fb062b2d4bd5cf927", + "564a55b31d504a2499140061de7c8354", + "db821f8b3e1b414590bbde186cc62d59", + "974d765200034661a14a25e0b241fdeb", + "41873020c9324e8b96fb6a8a7e432ed2", + "bab57aecb3f84216af720fa9321f6fb8", + "2fe800ca1f6948009a218f9f3ce0acbb", + "9e1d365fa1c84030a4caeead8ef954d3", + "55a60ff24a23452682aebac4cdcdf086", + "b71f5888837e4717bc8669603cb587a2", + "f13c88be577549acad8e2606a8c4e6f2", + "c1b370ab7fee4dbeb2cb37f47f774eb6", + "6eb2f500acda438a82e453126b22ae25", + "9d32149562cf47859390636be9c70d76", + "923264d53c454d9d96d618b0efd3f59a", + "8b918bfb9f2f4ee0a71884837b495ebf", + "3332ae39c1094b3bb3fde04198a3f2a6", + "71cbf065dfca4450a615fdef7c2114f6", + "fdadb7a27d07425c8e04dd10df1aeba1", + "ec590a2a32d045b194dab35ae5273043", + "826ab03235c94f929ca1e261327a0137", + "06c2b0aff48f40a886e14723ee788248", + "0803a7b3995241f493052389046afe98", + "98dada6fc260427ebe46383263de1e75", + "5405361924614557867c74ba647b08b4", + "b3d0061be3d24e22af12225fb08f02ee", + "9f61db866c9c41e6af53f0b79f55b4e7", + "ba375ee09b334728b8cfc63975f4302a", + "4f00645b01294756ae17955d5889514b", + "358628764f24466198ceadb0f4478487", + "874de7ba061b4d8783c74e605440394e", + "01e0602c676442ff952a7a7b3f4024c7", + "2e707c60d0384e8b8c993c883ad3456a", + "3af6672587a84a2b886482e68fcfbba9", + "20e58c5f72e14d47901d1eec0a08c12f", + "217d16de232c4a1d83a1a4b48ad453d6", + "2dbe35d37c824c839a2913a0cfbc5266", + "f9f3f435180b4929a938ac4500216247", + "31d96fb276614537bab907c316f0ce25", + "f9ec2b3ae5604344bf3a5f267ce7de38", + "4772c50a4e454979acb7cc4de466937a", + "6ee363978e9749d7b39191a4027be66a", + "b74c48e99fa742ad8b44d5bb7fd34171", + "c034e1899af543e7ab854b7276a787e2", + "c545c0cc491b4692b6f7eaaf42e50baf", + "ef8ace2a258a479db27919c2527a172f", + "02068d599f844ea5838544754e6d8448", + "5a09cd99ab3444248c365ba3e1f46436", + "375ea535f86c4dd193d114568bb3045b" + ] + }, + "id": "cell-base-dataset-eval", + "outputId": "930c1a84-a40f-400b-a419-cb8c67ef404f" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🦥 Unsloth: Will patch your computer to enable 2x faster free finetuning.\n", + "🦥 Unsloth Zoo will now patch everything to make training faster!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:unsloth_zoo.log:Unsloth: Could not patch trl.trainer.gkd_trainer: Direct module loading failed for UnslothGKDTrainer: parameter without a default follows parameter with a default (UnslothGKDTrainer.py, line 962)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading base model...\n", + "==((====))== Unsloth 2026.4.8: Fast Qwen2 patching. Transformers: 4.57.6.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "082ceda90b8d484a81a1de5fead892b6", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "model.safetensors: 0%| | 0.00/2.05G [00:00 str:\n", + " messages = [\n", + " {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n", + " {\"role\": \"user\", \"content\": f\"TASK: {task.description}\"},\n", + " ]\n", + " for cmd, out in history[-4:]:\n", + " messages.append({\"role\": \"assistant\", \"content\": cmd})\n", + " messages.append({\"role\": \"user\", \"content\": f\"OUTPUT:\\n{out[:400]}\"})\n", + " return tokenizer.apply_chat_template(\n", + " messages, tokenize=False, add_generation_prompt=True\n", + " )\n", + "\n", + "\n", + "def _extract_aws_command(raw: str) -> str:\n", + " for line in raw.splitlines():\n", + " line = line.strip().strip(\"`\").strip()\n", + " if line.startswith(\"aws \"):\n", + " return line\n", + " return \"aws help\"\n", + "\n", + "\n", + "@torch.no_grad()\n", + "def _generate(model, tokenizer, prompt: str) -> str:\n", + " device = next(model.parameters()).device\n", + " inputs = tokenizer(prompt, return_tensors=\"pt\").to(device)\n", + " out = model.generate(\n", + " **inputs,\n", + " max_new_tokens=MAX_NEW_TOKENS,\n", + " do_sample=True,\n", + " temperature=TEMPERATURE,\n", + " top_p=0.95,\n", + " pad_token_id=tokenizer.eos_token_id,\n", + " )\n", + " return tokenizer.decode(\n", + " out[0, inputs.input_ids.shape[1]:], skip_special_tokens=True\n", + " )\n", + "\n", + "\n", + "@dataclass\n", + "class EpisodeResult:\n", + " total_reward: float = 0.0\n", + " steps: int = 0\n", + " completed: bool = False\n", + " per_step_rewards: List[float] = field(default_factory=list)\n", + " difficulty: str = \"unknown\"\n", + "\n", + "\n", + "async def run_episode(model, tokenizer, task: Task) -> EpisodeResult:\n", + " result = EpisodeResult(difficulty=task.difficulty.value)\n", + " env = AwsRlEnv(base_url=ENV_BASE_URL)\n", + " await env.connect()\n", + " try:\n", + " await env.reset(task=task)\n", + " history = []\n", + " for _ in range(MAX_EPISODE_STEPS):\n", + " prompt = build_prompt(task, history, tokenizer)\n", + " text = await asyncio.to_thread(_generate, model, tokenizer, prompt)\n", + " command = _extract_aws_command(text)\n", + " step = await env.step(AwsRlAction(command=command))\n", + " r = float(step.reward)\n", + " result.total_reward += r\n", + " result.per_step_rewards.append(r)\n", + " result.steps += 1\n", + " history.append((command, step.observation.command_output or \"\"))\n", + " if step.done:\n", + " result.completed = True\n", + " break\n", + " finally:\n", + " await env.close()\n", + " return result\n", + "\n", + "\n", + "async def rl_eval(model, tokenizer, episodes_per_diff: int = 3) -> dict:\n", + " \"\"\"Run episodes across all 5 difficulty tiers and return aggregate metrics.\"\"\"\n", + " all_results: List[EpisodeResult] = []\n", + "\n", + " for diff_enum in ALL_DIFFICULTIES:\n", + " diff_tasks = load_tier(diff_enum)\n", + " if not diff_tasks:\n", + " print(f\" No tasks found for {diff_enum.value}, skipping.\")\n", + " continue\n", + " diff_label = diff_enum.value\n", + " for i in range(episodes_per_diff):\n", + " task = diff_tasks[i % len(diff_tasks)]\n", + " ep = await run_episode(model, tokenizer, task)\n", + " all_results.append(ep)\n", + " print(f\" [{diff_label:12}] ep {i+1}/{episodes_per_diff} \"\n", + " f\"reward={ep.total_reward:6.2f} \"\n", + " f\"steps={ep.steps:2d} \"\n", + " f\"done={'✓' if ep.completed else '✗'}\")\n", + "\n", + " n = len(all_results)\n", + " rewards = [r.total_reward for r in all_results]\n", + " steps_list = [r.steps for r in all_results]\n", + " flat_sr = [s for r in all_results for s in r.per_step_rewards]\n", + "\n", + " per_diff = {}\n", + " for diff_enum in ALL_DIFFICULTIES:\n", + " diff_label = diff_enum.value\n", + " sub = [r for r in all_results if r.difficulty == diff_label]\n", + " if sub:\n", + " per_diff[diff_label] = {\n", + " \"avg_reward\": sum(r.total_reward for r in sub) / len(sub),\n", + " \"completion_rate\": sum(r.completed for r in sub) / len(sub),\n", + " \"avg_steps\": sum(r.steps for r in sub) / len(sub),\n", + " }\n", + "\n", + " mean_r = sum(rewards) / n\n", + " return {\n", + " \"avg_episode_reward\": mean_r,\n", + " \"reward_std\": math.sqrt(sum((r - mean_r)**2 for r in rewards) / n),\n", + " \"completion_rate\": sum(r.completed for r in all_results) / n,\n", + " \"avg_steps\": sum(steps_list) / n,\n", + " \"avg_reward_per_step\": sum(flat_sr) / len(flat_sr) if flat_sr else 0.0,\n", + " \"_rewards\": rewards,\n", + " \"_results\": all_results,\n", + " \"_per_diff\": per_diff,\n", + " }\n", + "\n", + "print(\"RL eval helpers ready.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "77e7f47e", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "77e7f47e", + "outputId": "2d52b07c-f695-4249-c692-86a522041919" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "'openenv' module found in sys.modules. Loaded from: /usr/local/lib/python3.12/dist-packages/openenv/__init__.py\n" + ] + } + ], + "source": [ + "import sys\n", + "import os\n", + "\n", + "if 'openenv' in sys.modules:\n", + " print(f\"'openenv' module found in sys.modules. Loaded from: {sys.modules['openenv'].__file__}\")\n", + " # Optionally, verify it's from the REPO_DIR\n", + " if os.path.commonpath([sys.modules['openenv'].__file__, REPO_DIR]) == REPO_DIR:\n", + " print(\" (Path confirms it's loaded from the cloned repository)\")\n", + "else:\n", + " print(\"'openenv' module not found in sys.modules.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "cell-base-rl-eval", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cell-base-rl-eval", + "outputId": "25070cec-3f5b-4e1c-b2ea-215f71f5e40d" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading base model for RL eval...\n", + "==((====))== Unsloth 2026.4.8: Fast Qwen2 patching. Transformers: 4.57.6.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n", + "Running 3 episodes per difficulty tier...\n", + " [warmup ] ep 1/3 reward= 1.00 steps= 1 done=✓\n", + " [warmup ] ep 2/3 reward= 1.00 steps= 1 done=✓\n", + " [warmup ] ep 3/3 reward= 1.00 steps= 1 done=✓\n", + " [beginner ] ep 1/3 reward= 1.00 steps= 1 done=✓\n", + " [beginner ] ep 2/3 reward= 1.00 steps= 1 done=✓\n", + " [beginner ] ep 3/3 reward= 1.00 steps= 1 done=✓\n", + " [intermediate] ep 1/3 reward= 0.00 steps=15 done=✗\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unsloth: Input IDs of shape torch.Size([1, 523]) with length 523 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 515]) with length 515 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 633]) with length 633 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " [intermediate] ep 2/3 reward= 2.10 steps=15 done=✗\n", + " [intermediate] ep 3/3 reward= 2.00 steps= 3 done=✓\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unsloth: Input IDs of shape torch.Size([1, 570]) with length 570 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 637]) with length 637 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " [advanced ] ep 1/3 reward= 0.00 steps=15 done=✗\n", + " [advanced ] ep 2/3 reward= 0.56 steps=15 done=✗\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unsloth: Input IDs of shape torch.Size([1, 527]) with length 527 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 526]) with length 526 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 525]) with length 525 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 567]) with length 567 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " [advanced ] ep 3/3 reward= 1.83 steps=15 done=✗\n", + " [expert ] ep 1/3 reward= 0.00 steps=15 done=✗\n", + " [expert ] ep 2/3 reward= 4.70 steps=15 done=✗\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unsloth: Input IDs of shape torch.Size([1, 548]) with length 548 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 623]) with length 623 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " [expert ] ep 3/3 reward= 0.62 steps=15 done=✗\n", + "\n", + "=== BASE — RL Env Eval ===\n", + " avg_episode_reward 1.187\n", + " reward_std 1.137\n", + " completion_rate 46.7%\n", + " avg_steps 8.600\n", + " avg_reward_per_step 0.138\n", + "\n", + "Base model unloaded.\n" + ] + } + ], + "source": [ + "print(\"Loading base model for RL eval...\")\n", + "base_model, base_tokenizer = FastLanguageModel.from_pretrained(\n", + " model_name=BASE_MODEL, max_seq_length=MAX_SEQ_LENGTH,\n", + " load_in_4bit=True, dtype=None,\n", + ")\n", + "FastLanguageModel.for_inference(base_model)\n", + "\n", + "print(f\"Running {RL_EPISODES_PER_DIFF} episodes per difficulty tier...\")\n", + "base_rl_metrics = asyncio.run(\n", + " rl_eval(base_model, base_tokenizer, episodes_per_diff=RL_EPISODES_PER_DIFF)\n", + ")\n", + "\n", + "print(\"\\n=== BASE — RL Env Eval ===\")\n", + "for k, v in base_rl_metrics.items():\n", + " if k.startswith(\"_\"): continue\n", + " print(f\" {'completion_rate':<25} {100*v:.1f}%\" if k == \"completion_rate\"\n", + " else f\" {k:<25} {v:.3f}\")\n", + "\n", + "del base_model, base_tokenizer\n", + "gc.collect(); torch.cuda.empty_cache()\n", + "print(\"\\nBase model unloaded.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "cell-sft-rl-eval", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cell-sft-rl-eval", + "outputId": "0959f5c1-6682-4ea0-9bd6-18277dd436ca" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Loading SFT model for RL eval...\n", + "==((====))== Unsloth 2026.4.8: Fast Qwen2 patching. Transformers: 4.57.6.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n", + "Running 3 episodes per difficulty tier...\n", + " [warmup ] ep 1/3 reward= 0.00 steps=15 done=✗\n", + " [warmup ] ep 2/3 reward= 1.00 steps= 1 done=✓\n", + " [warmup ] ep 3/3 reward= 1.00 steps= 1 done=✓\n", + " [beginner ] ep 1/3 reward= 1.00 steps= 1 done=✓\n", + " [beginner ] ep 2/3 reward= 1.00 steps= 1 done=✓\n", + " [beginner ] ep 3/3 reward= 1.00 steps= 1 done=✓\n", + " [intermediate] ep 1/3 reward= 1.50 steps= 2 done=✓\n", + " [intermediate] ep 2/3 reward= 1.50 steps= 2 done=✓\n", + " [intermediate] ep 3/3 reward= 2.00 steps= 3 done=✓\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unsloth: Input IDs of shape torch.Size([1, 581]) with length 581 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 622]) with length 622 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 645]) with length 645 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " [advanced ] ep 1/3 reward= 0.00 steps=15 done=✗\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unsloth: Input IDs of shape torch.Size([1, 673]) with length 673 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 808]) with length 808 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 815]) with length 815 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 741]) with length 741 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 638]) with length 638 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 517]) with length 517 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " [advanced ] ep 2/3 reward= 4.93 steps=15 done=✗\n", + " [advanced ] ep 3/3 reward= 3.58 steps= 6 done=✓\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unsloth: Input IDs of shape torch.Size([1, 558]) with length 558 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 693]) with length 693 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 774]) with length 774 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 593]) with length 593 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 574]) with length 574 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n", + "Unsloth: Input IDs of shape torch.Size([1, 655]) with length 655 > the model's max sequence length of 512.\n", + "We shall truncate it ourselves. It's imperative if you correct this issue first.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " [expert ] ep 1/3 reward= 7.48 steps=15 done=✗\n", + " [expert ] ep 2/3 reward= 2.10 steps= 5 done=✓\n", + " [expert ] ep 3/3 reward= 2.08 steps= 3 done=✓\n", + "\n", + "=== SFT — RL Env Eval ===\n", + " avg_episode_reward 2.011\n", + " reward_std 1.908\n", + " completion_rate 73.3%\n", + " avg_steps 5.733\n", + " avg_reward_per_step 0.351\n", + "\n", + "SFT model unloaded.\n" + ] + } + ], + "source": [ + "print(\"Loading SFT model for RL eval...\")\n", + "sft_model, sft_tokenizer = FastLanguageModel.from_pretrained(\n", + " model_name=SFT_ADAPTER_REPO, max_seq_length=MAX_SEQ_LENGTH,\n", + " load_in_4bit=True, dtype=None,\n", + ")\n", + "FastLanguageModel.for_inference(sft_model)\n", + "\n", + "print(f\"Running {RL_EPISODES_PER_DIFF} episodes per difficulty tier...\")\n", + "sft_rl_metrics = asyncio.run(\n", + " rl_eval(sft_model, sft_tokenizer, episodes_per_diff=RL_EPISODES_PER_DIFF)\n", + ")\n", + "\n", + "print(\"\\n=== SFT — RL Env Eval ===\")\n", + "for k, v in sft_rl_metrics.items():\n", + " if k.startswith(\"_\"): continue\n", + " print(f\" {'completion_rate':<25} {100*v:.1f}%\" if k == \"completion_rate\"\n", + " else f\" {k:<25} {v:.3f}\")\n", + "\n", + "del sft_model, sft_tokenizer\n", + "gc.collect(); torch.cuda.empty_cache()\n", + "print(\"\\nSFT model unloaded.\")" + ] + }, + { + "cell_type": "markdown", + "id": "cell-plots-md", + "metadata": { + "id": "cell-plots-md" + }, + "source": [ + "---\n", + "# Plots — Dataset Eval + RL Env Eval" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "cell-plots", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "cell-plots", + "outputId": "31f3c249-0bfc-44db-b465-fd0184378156" + }, + "outputs": [ + { + "data": { + "image/png": "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4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAAAABsAsFNAAAAAAAAAAAAADaB4CYAAAAAAAAAAAAAm0BwEwAAAAAAAAAAAIBNILgJAAAAAAAAAAAAwCYQ3AQAAAAAAAAAAABgEwhuAgAAAAAAAAAAALAJBDcBAAAAAAAAAAAA2ASCmwAAAAAAAAAA/AOVKVNGFotFFotFAwcOLOzmAECeENwE/oZOnjxpfilJfzk4OMjd3V0lS5ZUw4YN9fTTT2vVqlUyDOOO1m3rX4gyH7sZM2bcVnm7du3Kci66d+9+ZxoLm5TxPZLx5eLiopIlS6pNmzb673//q/j4+MJu6t9KdHS0/v3vf6t+/foqUqSIHB0d5evrqwoVKujRRx/V66+/rs2bN1ttk91naU4vSVqzZk2e82d8rVmzphCOCAAAAO6WzN8j7+a1cfPmzc16mjdvftfqsVU///yzOnXqpNKlS8vZ2Vl+fn6qVauWhgwZop07dxa43Jy+27u5uals2bLq3r27li5degf3BHfLvXy/3mt3+jcuALifOBR2AwDcGykpKYqNjVVsbKzOnz+vrVu36quvvlJISIjmzp2rMmXKFHYT/5amTZuWJW3JkiW6cuWK/Pz8CqFFuF8lJCTo/PnzOn/+vFasWKHvv/9eq1evlr29fWE3zeadPXtWTZs21cmTJ63SIyMjFRkZqWPHjmn58uVKSEhQSEhI4TQSAAAAwB01fvx4vfnmm1ZpERERioiI0J49e1S1alXVqVPnjtYZFxenkydP6uTJk/rxxx81ZswYjR079o7WAQAACG4C/wj16tVTr169FBcXpxMnTmjp0qWKiIiQJG3evFkhISHatGmTypYtW8gt/XuJj4/X7Nmzs6QnJSVp1qxZeumllwqhVXdHTEyMvLy8CrsZNsfHx0dvvPGGpLRA24wZM3ThwgVJ0vr167V06VJ16dKlMJv4t/Daa6+ZgU0HBwd1795dlStXloODg86cOaOtW7dq9+7dtywn/bM0J+XLl9fEiROt0rZv36558+aZy7169VK9evWybAcAAADgzvrggw/Mv319fTV48GC5ubnp3Llz+uOPP8wZWG5XuXLl9MwzzygxMVF79+7V999/b86SNX78eIWFhcnHx+eO1AUAAP5iAPjbCQ8PNySZr9DQUKv1N2/eNPr372+V5+GHH7bKs3r1auOpp54y6tatawQGBhouLi6Gs7OzUapUKaNr167G8uXLrfKHhoZalZfda/Xq1YZhGMauXbuMZ555xggJCTGCgoIMNzc3w8nJyQgMDDTatWtnfPfdd9nu15YtW4xevXoZpUuXNpydnQ1nZ2ejZMmSRqNGjYywsDBj27ZtWbY5ffq08corrxjVq1c3PDw8DCcnJ6Ns2bLG4MGDjcOHD1vlDQ4OvuU+5Mfs2bOttn3wwQfNv6tWrZrrtnv27DGGDh1qVKpUyfDw8DBcXFyM4OBgo2vXrsbvv/+eJf/69euNAQMGGOXLlzfc3NwMNzc3o3z58kafPn2M7du3m/maNWtmtqFZs2ZWZaxevTrb82UYhjFmzBirdTdu3DBGjhxplC1b1nBwcDD7WEHPrWEYxsWLF4233nrLqF+/vuHt7W04OjoagYGBRvPmzY3PPvvMMAzDmDJlitkGJycn4/Lly1nKKVOmjJlnyJAhuR7nwpCxnwUHB1utW7BggdVxfuedd6zW//TTT8aAAQOMGjVqGP7+/oaTk5Ph6upqlCtXzujXr5+xefPmbOucO3eu0aZNG6N48eKGg4OD4eHhYQQHBxtt27Y13nzzTePChQtZttm8ebMxYMAAo2zZsoaLi4vh5uZmVK9e3XjrrbeMq1ev5mlfU1JSrPb36aefzpLnxx9/tNrnvXv3GoZhGJGRkcYbb7xh1KxZ0/D09DTs7e0NX19fo0qVKka/fv2Mr776Kk9tMAzD8PHxMcsfM2ZMtnkuXLiQ5TPkVp+leTF9+nSrMqZPn57vMgAAAGBbCvI9Mr/XUpmv0bJ7Zf7uuXz5cqNHjx5GUFCQ4eTkZHh6ehr169c3Jk6caNy8eTNLmzJ+lw8NDTWOHj1q9O3b1/Dz8zOcnJyMqlWrGjNmzMhxn5YuXWp0797dvIb39PQ0KlasaAwaNMg4duyYkZSUZAQFBZl1vPjii1nKyPh92s7Ozjhz5swtj2W68uXLm9s+88wzWdanpKTkuazMMh7nzNfWvXr1slqf3XXajRs3jA8//NBo3Lix4ePjYzg6OhrFixc3OnfubPz222/Z1rl8+XKjc+fORokSJQxHR0fD1dXVKFWqlNG8eXPj1VdfNY4cOWLmze76fvbs2Ub9+vUNV1dXw8fHx+jevXuW30XSXbp0yXjzzTeNOnXqGF5eXub1eefOnY3FixdnyZ9dffPmzTNCQkIMNzc3w8vLy+jYsaNx6NChLNsePnzYGDRokPHAAw8YLi4uhqOjoxEQEGDUq1fPGDZsmLFixYos20RERBhjx4416tWrZ7avZMmSRp8+fYytW7dmu085Keh1X2pqqjFv3jyjQ4cORkBAgOHo6GgUKVLEaNq0qTF16lQjKSkpyzYZ6xkzZoyxY8cOo3Pnzoa3t7fh4uJi1K9f31i6dGm29R09etTo2bOn4ePjY7i5uRkNGzY0FixYkONvOfn5jSvze/3UqVPGE088kef3OgAUBoKbwN9QXr6YJSUlGdWrV7fKt2XLFnP9yy+/fMsvQRMmTDDz5ye4+emnn94y79ChQ63au2bNGsPBwSHXbTIHLZYtW2Z4enrmmN/FxcX44YcfzPx3OrjZsmVLc7tKlSoZc+bMueUFjmEYxsSJEw17e/sc2xAWFmaVPywsLNc2f/TRR2beOxXcbNq0abZ9rCDn1jAMY8WKFVYBqMyvmjVrGoaRFpjPmO+9996zKmfTpk059un7RU7BzcjISOOpp56yav/MmTOttu3evXuux9bOzs749ttvrbYZP358nt+b6caNG2dYLJYc85cuXTrHi+DMxo0bZ27n4+NjJCQk5LhPDRo0MAzDMOLj441q1arl2ubMgeHceHl5mdv16tXLiI2NzdN2BDcBAABQEAX5Hpnfa6n8BDdTU1ONIUOG5Jq3evXqxqVLl6zalPHapUaNGlbfqzO+Mgc9EhMTjR49euRa308//WQYhmFMmDDBTCtatKgRFxdnVVbbtm3N9e3atcvXech4c6ybm5uxcePGfG2fm4z7kvna+qWXXrJaf+zYMav1x48fNypUqJDr8Xnttdestvn222/zfL4NI+v1fatWrbLdxtvb29izZ49VXZs3bzb8/PxyrWvAgAFWweHM9WX+zSD95efnZ1y5csXc7vDhw4aHh0eudWV+/2zbts3w9/fPMb+9vb3x6aef5vlcFuT9Gh8fb7Rv3z7Xdjdv3jzLTQMZ1zds2NBwcnLKsp2dnZ2xatUqq+327duX428mXbp0sVq+3eBm/fr1DV9f3zy91wGgMDEtLfAP5eDgoEGDBmnEiBFm2sqVK9WgQQNJkru7u5o2baoaNWqoaNGicnNzU3R0tFasWKHt27dLksaOHavQ0FCVKFFCvXv3VrVq1TRhwgRdu3ZNUtYpHNOnXnR2dlaDBg1Uu3ZtFStWTB4eHrpx44b++OMPrVmzRpI0depUDR482Jy+ccqUKUpOTpYklSxZUv3795enp6fOnz+vo0ePav369Vb7d+rUKfXs2VOxsbGSpLJly+rxxx+Xi4uLFi1apN27dys+Pl79+vXTgQMHVK5cOY0ePVonT57UhAkTzHKym0IyL8LDw7V69WpzuV+/furSpYvc3d118+ZNSdLXX3+thg0bWm23cOFCvfrqq+ayg4ODevbsqUqVKunChQtauXKlVf6PP/5YkydPNpfd3NzUq1cvlSlTRqdPn9Yvv/yS77bnxfr169WgQQO1adNGCQkJ5hQ7BTm3Z8+e1WOPPaYbN26Y5bds2VKNGjVSbGystmzZYh4zNzc3DR482Jz688svv9Srr75qTif03XffmWVUr17d7M/3q1OnTuU4FVLFihXVvXt3qzRvb2+1bt1aVapUkY+Pj1xcXBQREaFly5bp8OHDSk1NVVhYmLp37y4XFxdJ0ieffGJuX69ePXXs2FGSdObMGe3du1c7duywqmPBggUaM2aMudy4cWO1adNGN2/e1KxZs3Tx4kWdPn1aXbt21b59+275TNBBgwZp3LhxSk1N1bVr17Rs2TJ17dpVkhQdHa2lS5eaeYcMGSJJWr16tfbv3y9JsrOz04ABA1SxYkVdu3ZNp0+f1oYNG3KtM7M6deqY/W/evHlatmyZGjZsqNq1a6tevXpq0aKFihcvfstyDhw4YDW1Vbpq1arp0UcfzVebAAAAgIzyey31yCOPyMPDQ1OmTNGJEyck/f/0qOnq168vSfrwww/11Vdfment2rXTQw89pCtXruibb75RdHS09u3bp/79++u3337Ltn179+6Vj4+PRowYobi4OH311VdKSUmRJL377rsKDQ0187766qtasGCBuVy0aFE9/vjjCgwM1PHjx7VkyRJz3dNPP63//Oc/iouLU2RkpObPn68BAwZISns+ZsZr4MGDB+f5eC5btkwjR440l2NjY/XII49o4cKFatWqlZn+zjvvmI8Keemll/Thhx/muY7MkpKStHfvXs2fP99Ma9CggdVjKFJSUtS1a1cdPXpUkuTl5aV+/fqpRIkS2rp1q3ls3n//fdWsWVN9+/aVJH366admGRUrVlTPnj3l5OSks2fP6tChQ9q0aVOubVu5cqUefvhhNW/eXDt37jSvw6KiojRw4EDt3LlTUtojZzp37qwrV65ISvtNYsCAAQoKCtLixYu1Z88eSdKsWbNUqVIl89hltn79etWvX19t27bV6tWr9ccff0iSrly5omnTpun111+XJE2fPt38LcDb21tPPvmkihUrpkuXLun48eNat26dVbnXr19Xp06ddOnSJUmSv7+/+vTpo6JFi2rFihVat26dUlJSFBYWplq1aqlJkya5HpeCevnll/Xzzz9LSrtm7dGjh6pXr65Tp05p1qxZSkhI0Jo1a/Tiiy/qyy+/zLaMLVu2KCgoSP369dOZM2c0Z84cSVJqaqref/99tWjRwsw7cOBA87c2SXr00UfVoEEDrVy5UosWLcq2/IL+xrVt27Y8v9cBoFAVdnQVwJ2X17vOfv75Z6t8zz77rNX61NRUY/v27cY333xjTJ482Zg4caLx9ttvW23zzTffWG2TeSqL3Ozfv9+YM2eO8cknnxgffPCBMXHiRMPV1dXc/t///reZN+OdaJmn6jQMw4iNjTXOnj1rLmcceRoQEGBER0eb6+Lj441SpUqZ6zOOhMx87Ao6yurNN9+0Kuf48eOGYRhG3759zTQvL68sd/HVq1fP6m7DP/74w2p9SkqKER4ebv6d8W5FLy8v4+jRo1b5ExISrKbtuVMjN7t165brFD75ObevvPKKVdmZR2MahmF1p+upU6esRramT9ObkpJilChR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w8Pl7e0tHx8ftWrVyjwPkZGR5n6kpKRo165dKleunJo0aWK2LyYmRnXr1lWLFi2ylLt//35FRUXdlcBcSEiIHBwczKlpExISsn28TlRUlH755RdVr179turLeD0sSbNnzzb3OTU1NdfZhW73Ny4AuJ8R3AT+AQ4cOKAPPvhA8fHxOn78uJYuXWp18eTv7281ijPzHZHt27dXhw4ddPToUasvstkJCgoyR50tW7ZMr7/+uvz8/OTk5KQXXnghS9n9+vVTnz59dOHChVy/kH366aeaNm2aWrRooXLlyikgIEAJCQn68ccfrfKlB2Gff/55TZkyRXFxcYqPj1fDhg3Vo0cPlS9fXklJSTp27JjWrVunM2fOaPr06eYzRYoXLy4nJyclJiZKkj744ANFRETIzc1N5cuXV9euXXPd/1mzZpnbSmkj3zI/X0SSVq9ebV5MzZw5U//5z39kb2+v0aNHm3UkJyeradOm6tmzpypVqqTLly9r9erVat26tT7++GPZ2dlp1KhRGjFihKS0L/Y1atRQ7969FRwcrPPnz+vXX39VWFiYXnzxRUlpz/P46aefzPy1a9dWgwYN9Mcff+jcuXO57tutFPTchoWF6YsvvtCNGzckSa+88op+/fVXhYSEKCEhQTt37tTVq1ezBP169eql1157TRcvXrR6huKgQYNs5s7CmJgYffDBB5Kk69ev6+effzbfP1La9L/pF3QZj29UVJTatWunpk2baseOHVq4cGGOdfTr10+XLl1Sy5YtVbJkSfn5+enKlSuaNWuWmSfjnaevv/66evXqJUnmiNCuXbsqICBAMTExOnDggNasWaOYmBiFh4eb77lbefDBB9W0aVOtX79ehmHo5MmTktKmuEm/0E937Ngx1a9fX7Vq1VKdOnUUGBgoNzc37d692+qmjLxOPbx06VJ99tln8vf318MPP6yKFSvKzc1Np06dsgoM29vbq23btnkqEwAAAMirpUuX5jh6a+rUqQW+lpL+//EyUtpIxBdeeMG8qXH48OFydXXVq6++aj4TcNWqVapevbo6duwoX19fRUZGau/evVq3bp3i4uJyfERDXnl7e+vZZ581n6N46tQpVapUST179lRgYKBOnTqlJUuWaOrUqXrsscfM7ezs7PT8888rLCxMksxrvCJFiqhnz555rt/Ozk7PPvusORLzyJEjqlKlivr0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EhKiL7/8UmfPntX8+fMfcbWS5+LFi6pQoYIsFot69Oghb29vLV++XB07dtTNmzcfOZTrlClTVKRIETVs2FC2trZavHix3nnnHcXFxal79+5Wdf/55x81a9ZMHTt2VFBQkH744Qe1b99epUuXVpEiRazq9uzZU+7u7ho2bJhOnTqlzz//XD169NDcuXPNOsHBwRo+fLhq1Kihbt266ciRI5oyZYp27NihP//8U3Z2dvrggw9048YNnT17Vp999pkkycXFRdK96Z2+++47tWrVSp06dVJ4eLi+//571a5dWyEhISpZsqS8vb01ZcoUdevWTU2aNNHrr78u6d50SdK9hGXlypWVLVs2vffee3J2dta8efPUuHFjLVy4UE2aNJF070f51apVU0xMjFlv6tSpcnJySvS8li5dWpL0559/qlSpUsm5lACQthkAXhpDhw41cuTIYS5fu3bNcHJyMqZOnfrQdocPHzacnJyM8ePHG/v37zfs7e2NCRMmmOujoqIMScaUKVOs2p08edKQZCxevNiq/NdffzUkGSdOnDDL/vzzT0OS0bRpU7OsYsWKRpkyZYy4uLhE4/rmm28MScadO3esylu1amVUqVIlyXaGYRiTJk0ybG1tjX///dcs27x5syHJCAoKsqp76dIlQ5Lx+++/J7k9AAAAAACetjVr1hju7u6GJEOS0bt3b8Mw7v1N7eTkZJw6deqxt1myZEkjU6ZMxpUrV8yyffv2GenSpTPatWtnlq1bt86QZMyfP/+R25w2bZohyahdu7bV3+YVK1Y0LBaL0bVrV7MsJibG8PX1Nfz9/a22ERERYbUcHR1tFC1a1HjttdesykNDQw0PDw+jZs2aRlRUlFGqVCkjR44cxo0bNx4Zp6+vr9X3EPGGDRtmSDJatWqVYN2DcRmGYfz000+GJGPjxo1mWb169Yxy5cqZy6+//rrx+uuvGzY2Nsby5csNwzCM3bt3G5KM33777aFxVqxY0ShdurRVWUhIiCHJmDlz5kNjGz16tGGxWIzTp08nOL548d/fTJs2LUF7ScawYcPM5Y4dOxo+Pj5GWFiYVb2WLVsaGTNmTDSG+yW2vnbt2kaePHmsynLmzJngnF66dMlwcHAw+vXrZ5bF32s1atSwutf69Olj2NjYGNevX4tIgo4AAQAASURBVDfb2tvbG7Vq1TJiY2PNepMmTTIk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TSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJAAAAAAAAAAAAIE0guQkAAAAAAAAAAAAgTSC5CQAAAAAAAAAAACBNILkJ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/viDESNGFNqvb9++LFmyhGnTprF582aaNm1Kjx492Lt3b6Ht1q5dy/bt23njjTd45pln2LJlC9OmTQPguuuu47nnngNg/fr17N69mw0bNvzXX5MQQgghxBkCgQAffPABvXv3plq1arz88sv06tWL/fv389lnnzFy5EgpsJzG9cNHJKyegZp/ajYRS7Urie71YKHiYUljrlib2L5TsNS4utB45lebiFv6MN608rlUhsFgoEuXLqxevZpjx47x1FNPsXv3bpo3b87111/P66+/HrwoUgghRNGSClEZ0//KbvS/sts5t2kUU5dG7cafcxsAuyWMEU3vYAR3/Os2Tks4b/V5BaPxzDU4h13Xn2HX9T9/6BMMOgNDru3LkGv7/us211W6iusqlc9F54UQQoiyYvDgwUycOBGAKlWq0KhRI3799Vd27NgBQIcOHVizZg3r16+nefNTF1+lpKSwadMmbrzxRgCuv/56atWqxZIlSxg1alRwu4oVK7JmzZrg7ffff58vvviCXbt20bp1awDatWtH9erVmTNnDq+//jodO3YkMjKSNWvWMHnyZKCgG+Hzzz9n7dq1ABw+fJj58+ezePFihg4dGswaHx/PE088Qbdup96DZWdns2nTJhwOB1DQTblgwQI++eQTbr65YB3y48ePM3r0aHJzcwkJCWH79u1s3bq1UM5bbrmFQ4cO8fTTT7Nu3brg8Y1GIxs3bgxetX3gwIHgekB2uz24DtC1114rXZtCCCGEuGQZGRksXryYefPm8fvvv9OiRQsWLFjAwIEDsVqtWscrcVQ1QNrOt8jcvbHQuO3K1jhu7IOiK/n9JjpLKJG3DCfnwBdkfLkeTnRseuJ/59iih4jqPIKwq1prnFI7TqeTCRMmMH78eHbt2sX8+fMZO3YskyZNYtiwYYwePZq6detqHVMIIcqskv83qRBCCCGEKFPat28f/L527dpAQbHxJJ1OR82aNYmLiyu0X0xMTLCwCVCtWjWuv/569uzZU2i7Ll26FLq9Z88eYmJiggVDgNDQULp168bnnxesD24wGOjTp0+houi6desIDQ2la9euAGzfvh2dTkfv3r3x+XzBr/bt27N37178fn9w3yZNmgQLmycfp8lkolWrVmc89uPHjwPw8ccfU6FCBVq2bHnG8U+fQhegbdu2haajatiwIUlJSXi95WuaMCGEEEIU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r72WTZs2FTrOu+++e0Hna9++PQkJCdhstrOe458cDge33347vXr14sCBA2fcHx0dzciRI7npppvOej/AlVdeSUhICOvWrSs0vnbtWurWrfuvXadCCCGEKLvS09MZOnQo3bt3p2XLluzbt08Km0XMn5NJ/FvTCxU2Fb2RyE73ENa4vRQ2SxFjeCwxfSZgu6pNofGcA18Qt3AC7mO/ahOslDvZxfnkk08ye/ZsmjVrxo8//qh1LCGEOC/p3BRCCCGEEMVKURSmTZvGHXfcwXfffcf06dMZO3YsR44c4eabbyYQCHDo0CF27tzJhg0bAJg6dSq33XYbY8aMoUePHnzxxRds3boVAJ3u3NfrdezYkU6dOtGxY0cmT55Mo0aNcLlc7N27F7fbzaxZs3j99dfZvXs3nTt3pmLFihw6dIi3336bIUOGAPD444+TlpYWnJL2hx9+4JNPPjlr1yYUdGaOGzeOGTNmBDtX169fz7Zt21i1atVl/GkKIYQQojR4//33ueeee/B6vaxevZoBAwZoHanM86TGkbD6aXwZicExnTWMqFtHYoqppmEycbEUvZHwlrdhrlKP9J0rgmun+jKTOb7sESJuHkD4jb1RdHqNk5YuBoOBqVOn0r17d+6++26aNGnCY489xtSpUzEYpHwghCiZ5NVJCCGEEEIUuwEDBjB9+nSeffZZPvjgAypVqsSLL77I888/j8VioW7duoU+9OvTpw+vvPIKzzzzDG+++SZt2rThueeeo3///tjt9nOeS1EU1q9fz8yZM3nppZc4evQoTqeTa665hvvvvx+Aq6++mnfffZfx48eTlpZGxYoVGT58OE899RQATZs25cUXX2T16tVkZWVRrVq1YFH23zz55JMYDAbmz59PYmIitWvXZsWKFQwcOPAy/ASFEEIIURp4vV6mTZvGc889R+/evfm///s/YmJitI5V5uUd2Ufi288Gi18ABmdFom4dhSFMlgco7azVrsTUbyppO5aRH3eoYFANkP7JKvL++pmYHg9gsEee+yDiDFdeeSVffvklc+bM4YknnuDjjz9m5cqVVK5cWetoQghxBkWVVZf/k/3793PllVeyb98+GjVqpFmO/mvu0+zcJdnaAfO1jiDOw+v1kpiYSGxsrMzhL/4Tee6Ii1Fanze//lowpVK9evUKjR+YMQt3QoIWkbBUqEDDR6Zqcu5/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81x22WVMmzaNESNGcMQRR/Diiy+Wfv/Nb36Tww47jK9//es0Nzez3377AXDllVcyc+ZMkskkkyZN4rOf/Sy5XLEy53vf+x633nort99+O4lEgkQiwcqVK0vr8Tpm1/m+zw9/+ENmzpxJQ0MDBxxwAA899BAADz30EK2trXz3u9/lz3/+c+m+jj32WNasWTNEj3LvhGHA5n/8gU0PXt8j2Ezs/W5GnnD+DoNNgEwuT8Q0h0WwCdCazqAoCg0yZ3OXHNdjU2s7W9MZTENndMdMzVoONuuFoijEoxHGNDWSiEeLVbVbWsna+UovrarFIhaxiEVbOjMsKl4VRSERi2AXCjXRxlhPjWLMKf9Lcv9jga6K8Nxb/2H1jV/AXrFwu+vsu+++7LPPPv3+ApMQw428gwshhBBCCCGEEGLYW7x4MYsXL+acc87Z7ndz5szhXe96F/fff39p32233cZ///tfli1bhuM4PdrFXnDBBTz//PP885//ZOPGjZxxxhkcf/zxtLa2li7z3HPPYRgGS5cu5b///S8AM2bM4NFHH6W9vZ2//e1vPPTQQ3z7298G4LLLLuOss87izDPPJJPJkMlkmDx58nZr/elPf8rPfvYz/vSnP7F582a+9KUvccopp/DCCy9wyy238M53vhPXdbn77rv5z3/+w+rVq8nlclx22WWD9EgOXOAWaPnLj2h79p6unYpCw/98kMbDTkfZSSBVcFxczxs2szZz+TwFx6UxFZcqt50Iw5D2TI5NrW2oilJqhVoPLYvbsi5vr8vy5KI2/vtWK21Zl2zeo+AGBDXYqE9RFJKxKGObGolGLNoyWTa3tsscv11IxWMoikJbOlvppQyJqGWhqWrNBN+KptFw0PsZdfJFqLFUab+f3sK6W77JliduIwx6vr4//OEPc9ddd2Hb1TtfVIhqUZv9CoQQQgghhBBCCCEG0caNxXmOEyZM2OHvJ06c2KM686qrrqKpqQkozr56xzvewapVq4jFYtx888288cYbTJxYnAd58cUX87Of/Yz777+/FIKOHTuWr3/96z1m/J199tmln/faay8uuugibrnlFq666qpeH8evf/1rLr30UubOnQvAhz70IW677TauvfZa7rvvPi6++GJeeeUVrrrqKhoaGgD4yEc+wnXXXdfr+ygnL9PKhjuvorD27dI+RTdpOvZcolP23uV10zkb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++/P0/tVPvfcc1qzZk2enf9yVatW1Zo1a7R48WL98MMPqlatml577TWlpaXly/UBFDxr1qzR3XffnetT0LZo0UIeHh6y2WxZHosWLcqlyq+ubNmyevfdd/P8OgAKN8JNAAAAAAAAFHr333+/fH19tWvXLiUkJOiPP/7Qww8/nOM/8hfE+1uaTCb16NFDe/fu1cCBA/Xcc8/prrvu0ieffCLDMFxdHoB88ttvv6ldu3Zq3769ypYtmydT0I4ePVoJCQlZHg8//HCunR8AbgXhJgAAAAAAAAq1ixcvOu9NGRQUJEkKCwtTv379VLRoUUnSL7/8ohYtWig4OFhlypTR888/r4yMDOc5TCaT3njjDTVp0kQ+Pj5auHChvL299f3332e51tNPP63OnTtLkiZOnKimTZs6tyUnJ2v8+PGqXLmyfH19Vb58eX344YfO7d9++60aNWqkwMBAVapUSW+99VaOnq/NZtPUqVO1d+9eNWzYUH379lXdunW1cuXKHJ0PQOFw6NAh9ezZUw0aNND58+e1atUqffvtt/k6BW1ERITuuece56jxgwcPKiAgQEuWLJEkbdy4UU2aNFFwcLACAwPVqlUrbd++Pcs5tmzZolatWqlIkSIKCgpSy5YtlZycrA4dOuj48eMaMmSIbDabqlevnm/PC0DhQrgJAAAAAACAQi04OFg1a9ZUZGSkPvjgA+3YsUMOh8O5ff/+/WrdurUGDBigs2fPavPmzfr66681bdq0LOf5f//v/+ndd99VQkKCevbsqe7du+u9995zbk9JSdEnn3yiiIiIbOt46qmntGbNGn311VeKi4vTDz/8oJo1a0qSNmzYoD59+ujll1/WxYsX9cUXX+jVV1/VggULcvy8K1SooIULF+r3339XWFiY7r//frVs2VI///xzjs8JoOA5c+aMBgwYoLvuuku//fabFixYoN9++03t27e/5Slob9asWbOUkZGh4cOHKykpSQ8++KCeeOIJ9ejRQ5JksVj02muv6fTp0zp+/LgqVqyoLl26OMPQ3bt3q1WrVnrooYd0/PhxnTlzRhMmTJDZbNbKlStVunRpzZo1SwkJCdq9e3e+PjcAhQfhJgAAAAAAAAq9DRs2qEOHDpozZ44aNmyoIkWKaOTIkUpNTdX//vc/derUSb169ZK7u7vKlCmj0aNH64MPPshyjuHDh+uuu+6S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X2ru3LmaM2eOBgwY4Gzv0KGDihYtqueee05t27ZV3bp187SO3PjMKlmypEqWLJlLFQEAAAAAAOByTEt7B/vuu+/UqFEjWa1WhYWFadCgQUpISHBu37hxo0wmk1avXq3OnTvLZrNpyJAhzvb169erS5cu8vHxUaVKlbRmzRrZ7XaNGjVKRYoUUYkSJa4YfbNlyxZ17txZxYoVk4+Pj2rXrq0FCxY4t8+fP19Dhw6VJOfUlS1atMiX1wM3hn6D3PTqq6/KarVqz549zratW7fK3d1d8+bNkyQlJiZqyJAhqlKliry9vVWuXDkNHjxYcXFxWc5lt9v1yiuvqHLlyvL09FTJkiX12GOPSbo09ehvv/2mDz/80NlH5s+fn19PE9mIiYlR0aJFr2g3mUxZ1lNSUjR69GiVKlVKnp6euvvuu/Xtt99m2ads2bIaMWKEpkyZopIlS8rPz0/z58+Xh4eHYmJisuy7e/dumUwmrVu3TlL209Lu2LFDnTp1UkBAgGw2mxo2bKi1a9c6t0dFRal///4KCwuT1WpVkyZN9Msvv9zKywFJb775pipWrKinnnrqim3PPfecfH19NWvWLEn//NzeeecdlS1bVl5eXurYsaNOnjyZ5bic9h/p1j57spuW9siRI+ratav8/Pzk6+urTp066dChQ1n2MZlMevPNN/Xcc88pJCREoaGhGjx4sFJTU3PwigIAAAAAANyeGLl5B8jIyMiy7ubmpj179ui+++5T27ZttXTpUp04cUJjx47V4cOHr5g+8sknn9Tjjz+uZ555RlarVWlpaZKkyMhIRUZGavDgwZo+fbq6d++u//znPzIMQwsXLtSKFSs0YsQIhYeHq1GjRpKkY8eOKTw8XAMGDJDVatWPP/6oxx9/XGazWb1791bHjh01YsQIvf7669qyZYskOf/IiPxFv0Fu+nd/ki6N6BwxYoS++uor9evXT1u2bFFGRob69eundu3aOQOOpKQk2e12vfTSSwoJCdGJEyf00ksvqUePHlq9erXzfJGRkfroo480evRoNW/eXFFRUVq6dKmkS1OPPvTQQypfvryef/55SVKFChXy4ZnjaurWrau3335bpUuX1gMPPKDg4OBs9+vevbtz6s8KFSpo8eLF6ty5s7Zt26batWs791u4cKGqV6+u2bNnKyMjQ61atVJkZKS++OILPf744879Fi1a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nG2///67jh8/7lz/8ccfde7cOTVs2FDSrfWf3P7sadSokX777TcdOXLE2Xby5En99NNPefb5CQAAAAAAcLti5OYdavz48apTp466du2qgQMH6u+//9aYMWPUvn37LPdNzE3+/v5q0KCBJk+eLD8/P5nNZk2dOlX+/v6Ki4tz7le1alVJ0ptvvqlWrVrJz89PVapUyZOacHPoN8iJjIwM/fzzz1e0lypVSoZhaNiwYRo1apQaNWqkRo0aaenSperXr5/++OMPWa1WtW3bVoMHD9ZLL72kRo0a6dtvv9X69euznCvznrAjRozQuXPn1KxZM8XExOjzzz/XZ599JulSH1m9erVWr16t4OBglStXTsHBwfnyGuBKNWvWVJcuXdSuXTuFhobq2LFjeu211+Tt7a1+/fpJktq2bav27durbdu2GjNmjKpXr664uDht375dKSkpeuWVV657nfvvv1/e3t6KjIxUuXLlnMHX1UyYMEENGjRQs2bNNGLECAUHB+uPP/5QcHCwnnjiCT366KOaO3euWrRooZEjR6p8+fK6ePGitm7dqqJFi2r48OG58vrcibp27aoBAwZo8ODB2rNnjx544AFlZGRo0aJFmj9/vl555RXVrVvXuX9ISIg6duyoSZMmKSUlRWPGjFHdunV13333Sbq1/pPbnz2PPfaYpk2bpg4dOmjy5Mlyc3PTpEmTVKRIEUVGRubWSwgAAAAAAHBHYOTmHap69epauXKlzp07pwcffFDjx49X79699fnnn+fpdRcuXKjy5cvr0Ucf1bBhw/TQQw/p0UcfzbLPvffeq1GjRunNN99Uo0aN+KNfAUK/QU7ExsaqcePGVzw++OADRUREqGTJkpo0aZJz//fee09nzpzRuHHjJEmRkZEaMWKE3nzzTT344IM6duyYFi5ceMV1Zs+erQkTJuiTTz7R/fffr2eeeUbe3t7O7ePHj1e1atXUs2dPNWjQQN98803eP3lc1QsvvKCjR4/q6aefVrt27fT888+revXq2rp1q8qVKyfp0lShy5Yt0xNPPKGZM2eqffv2ioyM1JYtW254tJuXl5c6d+6s06dP6+GHH77u/lWqVNEPP/ygIkWKKCIiQt26ddPnn3+uMmXKSJKsVqs2bNigtm3basKECWrXrp2GDRumgwcPXjc4xfXNnj1b8+bN05YtW9SlSxf16NFDhw8f1ldffaWxY8dm2bdJkyYaPHiwnnnmGT355JOqUaNGlilob7X/5OZnj6enp9atW6eqVavqySefVL9+/VS6dGlt3LiRaWkBAAAAAABukskwDMPVRQAAAAA3qkWLFipSpEief7kGAAAAAAAABQ8jNwEAAAAAAAAAAAAUCoSbAAAAAAAAAAAAAAoFpqUFAAAAAAAAAAAAUCgwchMAAAAAAAAAAABAoUC4CQAAAAAAAAAAAKBQINwEblOGYah27dr68MMPc+2caWlpmjhxorZv355r57wRW7du1cSJE3P1nPXr19djjz3mXB8yZIiefPLJXL0GAAAAAAAAAADIXYSbwG1q8eLFioqKUp8+fXLtnGlpaZo0aZJLws1Jkybl6TVGjhypBQsW6NChQ3l6HQAAAAAAAAAAkHOEm8Bt6q233lLfvn1lsVhccv3k5GSXXDenypYtq6ZNm2rOnDmuLgUAAAAAAAAAAFwF4SZwGzp06JB++uknde/ePUv7u+++q+rVq8vT01NlypTR9OnTndt+/vlnubu76/3333e2xcbGqlSpUvrPf/4jSfL19ZUkPf744zKZTDKZTDp69KiOHj0qk8mkBQsW6NFHH1VAQIA6deokSfroo4/UtGlTBQUFKTAwUC1bttS2bduuqHnz5s1q2bKlbDab/P391aJFC/3xxx+aP3++hg4dKknOa7Zo0cJ53K5du9SxY0f5+vrK19dXPXr00JkzZ7Kce9euXQoPD5fValW1atX09ddfZ/u6PfTQQ1qwYIEcDseNvtQAAAAAAAAAACAfEW4Ct6H169fLx8dHd999t7Pt1Vdf1cCBA9W1a1ctX75cAwcO1PPPP69Zs2ZJku655x6NGjVKw4cP1/HjxyVJTz/9tBwOh3Of7777TpI0fvx4bdmyRVu2bFGxYsWc1xg5cqR8fX21ZMkSPffcc5Kko0eP6tFHH9WSJUu0cOFClSpVSvfee68OHz7sPG7jxo1q3bq1LBaLPvzwQy1atEj33nuvTp48qY4dO2rEiBGS5Lzm7NmzJV0KccPDw5WSkqJPPvlE8+fP1+7du9WpUycZhiHp0gjS9u3bKyEhQQsXLtT48eP1zDPPOJ/j5Zo0aaKzZ89q586dufODAAAAAAAAAAAAucpkZCYAAG4b/fv31x9//KFff/1VkhQXF6fixYtr1KhRmjBhgnO/F154Qe+8845OnjwpNzc3paWlqX79+goNDdXQoUPVtWtXffvtt+rQoYMkKSEhQb6+vvrggw/02GOPOc9z9OhRlStXTl27dtUXX3xx1bocDoccDodq1KihPn366IUXXpAkNW7cWOnp6fr1119lMpmuOG7WrFkaOnSo/v121bdvX23dulU7d+6Uh4eHJOngwYOqWrWqvv76a3Xs2FGzZ8/WsGHDdOTIEZUsWVKS9OOPP6pp06bq16+f5s+f7zxfRkaGrFar5syZo6eeeuomXnEAAAAAAAAAAJAfGLkJ3IbOnDmjIkWKONe3bNmixMRE9ejRQxkZGc5Hq1atdPbsWf3999+SJA8PD3300UfavHmzHn74YUVERDiDzRvRsWPHK9r27t2rbt26KSwsTG5ubrJYLNq/f78OHDggSUpMTNQvv/yifv36ZRtsXsu6devUrVs3mc1m53MqV66cypYt65z6duvWrapXr54z2JSk8PBwhYaGXnE+d3d3BQQEXDGtLQAAAAAAAAAAKBgIN4HbUEpKijw9PZ3rFy5ckCRVr15dFovF+WjZsqUk6cSJE8597777bt11111KTU3VoEGDbuq6YWFhWdbj4+PVrl07nThxQjNmzND333+vX3/9VXfffbdSUlIkSdHR0TIMI8v0tjfqwoULmjZtWpbnZLFYdPjwYedzOnPmTLZBZnZtkuTp6emsDQAAAAAAAAAAFCzuri4AQO4LCgrKMvowKChIkrR8+fIrAkhJqlKlinN55syZ2rdvn6pVq6ann35amzZtktl8Y9+D+PfIyy1btujvv//W2rVrVbVqVWd7bGysczkwMFBms1mnT5++sSd3maCgIHXr1k0RERFXbMscuVq0aFHt27fviu3nzp3L9pwxMTHO1wsAAAAAAAAAABQshJvAbahKlSrasmWLc71x48by8vLSqVOnsp06NtP+/fs1btw4vfjii7rvvvtUr149vfHGGxoxYoQkOe9reaMjG5OTkyUpyyjSn376SUePHlW9evUkST4+PmrUqJE++ugjDRkyJNupaS+/rtVqdba3bt1au3fvVr169a46pW2DBg20YMEC/f3331nuuZlduHn+/HklJSWpcuXKN/T8AAAAAAAAAABA/mJaWuA2FB4eruPHj+v8+fOSpICAAE2cOFHDhg3T+PHjtWbNGq1atUpvvfWWunXrJkmy2+3q16+f6tSpo2ef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\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Saved → compare_dataset.png\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.patches as mpatches\n", + "from matplotlib.gridspec import GridSpec\n", + "\n", + "COLOR_BASE = \"#4C72B0\"\n", + "COLOR_SFT = \"#DD8452\"\n", + "COLOR_POS = \"#55A868\"\n", + "COLOR_NEG = \"#C44E52\"\n", + "\n", + "plt.rcParams.update({\n", + " \"figure.dpi\": 120,\n", + " \"font.family\": \"DejaVu Sans\",\n", + " \"font.size\": 11,\n", + " \"axes.titlesize\": 12,\n", + " \"axes.titleweight\": \"bold\",\n", + " \"axes.labelsize\": 10,\n", + " \"axes.spines.top\": False,\n", + " \"axes.spines.right\": False,\n", + " \"axes.grid\": True,\n", + " \"grid.alpha\": 0.35,\n", + " \"legend.framealpha\": 0.9,\n", + " \"legend.fontsize\": 9,\n", + " \"xtick.labelsize\": 9,\n", + " \"ytick.labelsize\": 9,\n", + "})\n", + "\n", + "\n", + "# ── helper: annotate bars ───────────────────────────────────────────────────\n", + "def annotate_bars(ax, bars, fmt=\"{:.1f}\", offset=0.5, color=None, fontsize=8):\n", + " for bar in bars:\n", + " h = bar.get_height()\n", + " ax.text(\n", + " bar.get_x() + bar.get_width() / 2, h + offset,\n", + " fmt.format(h), ha=\"center\", va=\"bottom\",\n", + " fontsize=fontsize, fontweight=\"bold\",\n", + " color=color or bar.get_facecolor(),\n", + " )\n", + "\n", + "\n", + "# ═══════════════════════════════════════════════════════════════════════════\n", + "# Figure 1 — Dataset eval (2x2)\n", + "# ═══════════════════════════════════════════════════════════════════════════\n", + "acc_keys = [\"format_pct\", \"format_after_extract_pct\", \"exact_pct\",\n", + " \"service_pct\", \"operation_pct\"]\n", + "acc_labels = [\"Format\", \"Format\\n(extracted)\", \"Exact\", \"Service\", \"Operation\"]\n", + "base_acc = [base_ds_metrics[k] * 100 for k in acc_keys]\n", + "sft_acc = [sft_ds_metrics[k] * 100 for k in acc_keys]\n", + "delta_acc = [s - b for s, b in zip(sft_acc, base_acc)]\n", + "\n", + "lat_labels = [\"Avg Latency (s)\", \"Avg Resp Len\"]\n", + "base_lat = [base_ds_metrics[\"avg_latency\"], base_ds_metrics[\"avg_len\"]]\n", + "sft_lat = [sft_ds_metrics[\"avg_latency\"], sft_ds_metrics[\"avg_len\"]]\n", + "\n", + "fig1 = plt.figure(figsize=(18, 14))\n", + "gs1 = GridSpec(2, 2, figure=fig1, hspace=0.48, wspace=0.38)\n", + "ax1, ax2 = fig1.add_subplot(gs1[0, 0]), fig1.add_subplot(gs1[0, 1])\n", + "ax3 = fig1.add_subplot(gs1[1, 0])\n", + "ax4 = fig1.add_subplot(gs1[1, 1], polar=True)\n", + "\n", + "# 1a. Grouped bar — accuracy\n", + "x, w = np.arange(len(acc_labels)), 0.35\n", + "annotate_bars(ax1, ax1.bar(x - w/2, base_acc, w, color=COLOR_BASE,\n", + " label=\"Base\", edgecolor=\"white\", linewidth=0.6), fmt=\"{:.1f}%\")\n", + "annotate_bars(ax1, ax1.bar(x + w/2, sft_acc, w, color=COLOR_SFT,\n", + " label=\"SFT\", edgecolor=\"white\", linewidth=0.6), fmt=\"{:.1f}%\")\n", + "ax1.set(title=\"Dataset Accuracy — Base vs SFT\", ylabel=\"Score (%)\",\n", + " xlabel=\"Metric\", ylim=(0, 118))\n", + "ax1.set_xticks(x); ax1.set_xticklabels(acc_labels)\n", + "ax1.legend(); ax1.set_axisbelow(True)\n", + "\n", + "# 1b. Horizontal bar — latency / length (dual x-axes not needed; normalize)\n", + "y, h = np.arange(len(lat_labels)), 0.35\n", + "# Normalize each metric independently so bars fit on one scale\n", + "max_vals = [max(base_lat[i], sft_lat[i]) for i in range(len(lat_labels))]\n", + "base_norm = [base_lat[i] / max_vals[i] * 100 for i in range(len(lat_labels))]\n", + "sft_norm = [sft_lat[i] / max_vals[i] * 100 for i in range(len(lat_labels))]\n", + "hb = ax2.barh(y + h/2, base_norm, h, color=COLOR_BASE, label=\"Base\",\n", + " edgecolor=\"white\", linewidth=0.6)\n", + "hs = ax2.barh(y - h/2, sft_norm, h, color=COLOR_SFT, label=\"SFT\",\n", + " edgecolor=\"white\", linewidth=0.6)\n", + "for bar, raw in zip(list(hb) + list(hs),\n", + " [base_lat[0], base_lat[1], sft_lat[0], sft_lat[1]]):\n", + " ax2.text(bar.get_width() + 1, bar.get_y() + bar.get_height()/2,\n", + " f\"{raw:.2f}\", va=\"center\", fontsize=9, fontweight=\"bold\")\n", + "ax2.set(title=\"Latency & Response Length\", xlabel=\"% of max (raw value annotated)\")\n", + "ax2.set_yticks(y); ax2.set_yticklabels(lat_labels)\n", + "ax2.set_xlim(0, 130); ax2.legend(loc=\"lower right\"); ax2.set_axisbelow(True)\n", + "\n", + "# 1c. Delta bar\n", + "colors_d = [COLOR_POS if d >= 0 else COLOR_NEG for d in delta_acc]\n", + "bars_d = ax3.bar(x, delta_acc, 0.5, color=colors_d, edgecolor=\"white\", linewidth=0.6)\n", + "for bar, d in zip(bars_d, delta_acc):\n", + " ax3.text(bar.get_x() + bar.get_width()/2,\n", + " bar.get_height() + (0.4 if d >= 0 else -1.2),\n", + " f\"{d:+.1f}pt\", ha=\"center\", va=\"bottom\", fontsize=9, fontweight=\"bold\",\n", + " color=COLOR_POS if d >= 0 else COLOR_NEG)\n", + "ax3.axhline(0, color=\"#333\", lw=0.9)\n", + "ax3.set(title=\"Delta: SFT − Base (dataset, pp)\", ylabel=\"Δ pp\", xlabel=\"Metric\")\n", + "ax3.set_xticks(x); ax3.set_xticklabels(acc_labels)\n", + "ax3.legend(handles=[mpatches.Patch(color=COLOR_POS, label=\"Improvement\"),\n", + " mpatches.Patch(color=COLOR_NEG, label=\"Regression\")])\n", + "ax3.set_axisbelow(True)\n", + "\n", + "# 1d. Radar\n", + "N = len(acc_labels)\n", + "angles = np.linspace(0, 2*np.pi, N, endpoint=False).tolist() + [0]\n", + "ax4.set_theta_offset(np.pi / 2); ax4.set_theta_direction(-1)\n", + "ax4.set_thetagrids(np.degrees(angles[:-1]), acc_labels, fontsize=8)\n", + "for vals, color, label in [(base_acc + base_acc[:1], COLOR_BASE, \"Base\"),\n", + " (sft_acc + sft_acc[:1], COLOR_SFT, \"SFT\")]:\n", + " ax4.plot(angles, vals, color=color, linewidth=2, label=label)\n", + " ax4.fill(angles, vals, color=color, alpha=0.15)\n", + "ax4.set_ylim(0, 100)\n", + "ax4.set_yticks([20, 40, 60, 80, 100])\n", + "ax4.set_yticklabels([\"20%\", \"40%\", \"60%\", \"80%\", \"100%\"], fontsize=7)\n", + "ax4.set_title(\"Capability Profile (Dataset)\", pad=20, fontweight=\"bold\")\n", + "ax4.legend(loc=\"upper right\", bbox_to_anchor=(1.35, 1.15))\n", + "\n", + "fig1.suptitle(\"Part 1 — Dataset Eval: Base vs SFT\",\n", + " fontsize=15, fontweight=\"bold\", y=1.01)\n", + "plt.savefig(\"compare_dataset.png\", dpi=150, bbox_inches=\"tight\", facecolor=\"white\")\n", + "plt.show()\n", + "print(\"Saved → compare_dataset.png\")" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "cell-rl-plots", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 958 + }, + "id": "cell-rl-plots", + "outputId": "c1ec1dc2-7669-4648-c489-2a40ea4ed8ec" + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/tmp/ipykernel_1212/2595381142.py:87: MatplotlibDeprecationWarning: The 'labels' parameter of boxplot() has been renamed 'tick_labels' since Matplotlib 3.9; support for the old name will be dropped in 3.11.\n", + " bp = rax6.boxplot(\n" + ] + }, + { + "data": { + "image/png": "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FRkZmaz8D9PRo0d19OhRHT58WL/++qvefvtt23ZPT0/Vr18/2eXfvHlTHTp0cPieHDdunNasWZPscjt37qwvvvgi0XQnT55U3bp1tWfPniSVnxLXyBtvvKHTp08nab9JkSVLFtvyG2+8oU6dOmnGjBk6fPiwy3PY/tOsXLnStlyhQgWX8x47dkwnT55UZGSkrl27pj179mjChAkqU6aMXn31VUVHR6dwbZNvyJAhGjp0qO7du5dguitXrqh58+YKCwtLtMwRI0bEOx/v5s2b9fHHHyerrkkxfPhwDRs2zFoeP368evfubV3PGzZsUL169ay54UNDQxUWFmYN2/4gzpw5o6NHj+rgwYNat26dPvjgA73xxhu2NLlz51bjxo2TXHZkZKSaNGmi2bNnJ5p2z549qlWrlkvfH126dLHORVz37t1Thw4dkjQ8viTNmzfPpXrGZ+DAgRo5cmSinxdjjD755BP16tXLYdu7777r8P0a26+//qr//e9/idbl66+/VteuXXXr1q0E0925c0fdunXT1KlTbesf9LcqMVevXlXt2rUdvrecWbNmjerVq6ebN28me38rV650er6vX7+uOnXq6Jdffkl22TFOnjypl19+Od42z6lTp/TWW2/Fm//pp5+Wj4+Ptbxjx44nft5zAADw+CLADAAAHrmoqCgdPnxY3bt31+7du23bQkJCFBoaai0XKFBAr732mubMmaNVq1Zp37592rVrl5YsWeIwh9+aNWu0fv36RPd/7949lStXTgsXLtT+/fv1xx9/qE+fPhozZozCw8PVr18/W/rs2bMrPDzc9mrRosUDnAG7OXPm2OYolKQ2bdqkWPmPg4iICB09elTh4eHasGGDevbsqe3bt9vSDB06NJVq5+i7776Tm5tbvK8rV64kWoYxRm3bttWmTZu0du1aVa9e3bb92LFj+vPPP63lokWLOgRzpk2bZlvesWOH7TPj4eGRInNZjhgxIt5jTZcunS1tStUzV65ceuWVVzRjxgytXLlSu3fv1p49exQWFqbXXnvNNhf3kSNHHOakfRzkzZtXefPm1VNPPaVGjRrp0KFD1jZPT0+NGzdOuXLlcsiXLl06tWzZUhMnTtTSpUv1119/6cCBA1q/fr3Gjh1rO+d37951CAT88ccftuW2bdvqzz//1MGDB7V9+3bNnz9fQ4cOVYUKFRzmNJ8/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7JmY2L/Jcd8zyfEhg6QICAhw+D8gbttRcmw/AgAApAbmYAYAAI9M7PkST548qRs3bujvv//W999/7/RmfIcOHZIUXJYUb2+D2B5lrx1nvvrqKzVt2tQWXK5UqZLWrl3rdL7Wf4Lq1avLGKOrV69q5syZtgBtzByI+/btS8Ua2gUEBChPnjzxvlyZKzBuDxJJLvX+idujavr06TLGOMxD+tJLLyWrp7sz6dKli/dY47smH6Se/fr1S1JwWXLts51a3NzclDVrVg0aNEhNmza1bZszZ45tzu6JEycmKbjsTKZMmbR161a9++67KlmypNPelxcvXtSXX36p8uXLuzRneGJiAr1J8SDXyDPPPKMdO3aoV69eyp07t9PyDx48qLfeesulXmsJSZcundq0aaNx48Zpy5YtunLlimbPnq08efLY0kVFRTnMUexMlixZ4v08hYSEPFBdH6aMGTM6fLddunQp2eXFDYJJSpFrMbUk9hlIrG0xb948TZ48WTVr1nT6QERERITmz5+vZ555RuvWrXugukrS+vXr9eyzzzo8VDJ16lS9/PLLD+071c/PT3ny5FGPHj20fPlyh9+9L7/88qHs15nkfG89KB8fH61atUqffvqpKlSo4DS4e/36dU2dOlXly5dPcjs3Man9Wxn7nKfGb1VS6hgZGalWrVolKbgsPdxznNy2Y2yxR8qR9Fj/7gAAgCcbPZgBAMAjE/dmfUKOHTvmcIO1Ro0aGjBggPLlyydfX19JUvPmzZPcIyqpN2pSijFGgwYN0qhRo2zrW7RooalTp1rH9E8WFBSkVq1ayc/PT02aNLHWR0REqH///vrll19SsXaPh2rVqil//vxWj5+///5bYWFhmj17ti1dag2PHSO59bx7967mzp1rW1eiRAkNGzZMBQsWVJo0aSRJffr0eSKvh9i90aT7vfYOHz5s9WiKG1xNnz69PvjgA1WsWNHqEfrjjz9q6NChCe4nKChIQ4cO1dChQ3X79m0dPHhQhw4d0pYtW/TFF1/o2rVrku6/L99995369eunjBkzytvb2zYU99tvv+10mNi4Euut6syDXstPPfWUNYT3pUuXdPDgQR08eFArV67Ut99+a93kX7hwoTX8dkpIkyaNWrRooYCAADVo0MC2LfaDQf807u7uCg4OtvWAvHDhQrJH1XAWOEtoyO1HJVu2bLYhlzt3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cAkBZgAAAAAAAAAAAACASwgwAwAAAAAAAAAAAABcQoAZAAAAAAAAAAAAAOASAswAAAAAAAAAAAAAAJcQYAYAAAAAAAAAAAAAuIQAMwAAAAAAAAAAAADAJQSYAQAAAAAAAAAAAAAuIcAMAAAAAAAAAAAAAHAJAWYAAAAAAAAAAAAAgEsIMAMAAAAAAAAAAAAAXEKAGQAAAAAAAAAAAADgEgLMAAAAAAAAAAAAAACXEGAGAAAAAAAAAAAAALiEADMAAAAAAAAAAAAAwCUEmAEAAAAAAAAAAAAALiHADAAAAAAAAAAAAABwCQFmAAAAAAAAAAAAAIBLCDADAAAAAAAAAAAAAFxCgBkAAAAAAAAAAAAA4BICzAAAAAAAAAAAAAAAlxBgBgAAAAAAAAAAAAC4hAAzAAAAAAAAAAAAAMAlBJgBAAAAAAAAAAAAAC4hwAwAAAAAAAAAAAAAcAkBZgAAAAAAAAAAAACASwgwAwAAAAAAAAAAAABcQoAZAAAAAAAAAAAAAOASAswAAAAAAAAAAAAAAJcQYAYAAAAAAAAAAAAAuIQAMwAAAAAAAAAAAADAJQSYAQAAAAAAAAAAAAAuIcAMAAAAAAAAAAAAAHAJAWYAAAAAAAAAAAAAgEsIMAMAAAAAAAAAAAAAXEKAGQAAAAAAAAAAAADgEgLMAAAAAAAAAAAAAACXEGAGAAAAAAAAAAAAALiEADMAAAAAAAAAAAAAwCUEmAEAAAAAAAAAAAAALiHADAAAAAAAAAAAAABwCQFmAAAAAAAAAAAAAIBLCDADAAAAAAAAAAAAAFxCgBkAAAAAAAAAAAAA4BICzAAAAAAAAAAAAAAAlxBgBgAAAAAAAAAAAAC4hAAzAAAAAAAAAAAAAMAlBJgBAAAAAAAAAAAAAC4hwAwAAAAAAAAAAAAAcAkBZgAAAAAAAAAAAACASwgwAwAAAAAAAAAAAABcQoAZAAAAAAAAAAAAAOASAswAAAAAAAAAAAAAAJcQYAYAAAAAAAAAAAAAuIQAMwAAAAAAAAAAAADAJQSYAQAAAAAAAAAAAAAuIcAMAAAAAAAAAAAAAHAJAWYAAAAAAAAAAAAAgEsIMAMAAAAAAAAAAAAAXEKAGQAAAAAAAAAAAADgEgLMAAAAAAAAAAAAAACXEGAGAAAAAAAAAAAAALiEADMAAAAAAAAAAAAAwCUEmAEAAAAA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/XfbcWXKlMls2rTJIV1UVJSZNWuW2bVrl239tWvXzKhRo0ylSpVMunTpjKenpwkODjZ169Y133//vYmKirKlj9tunzx5spk2bZopVaqU8fX1Nbly5TLDhw+32n8TJkwwRYsWNT4+PiZHjhxm4MCB5s6dO7Yy47Z9Dx8+bD7//HNTvHhx4+PjY4KDg02nTp3MyZMnE61LXOvXrzcvvfSSyZs3r/H19TX+/v6mePHi5u233zYXL16Mtyxnr5j3y5X9rl271rRt29bkyZPH+Pj4GH9/f1O4cGHTp08fc/jwYYf0zv6vGThwoMmTJ4/x9vY2OXPmNG+++abDuUtIYv9jVahQwbY9brts0qRJpnXr1qZIkSImODjYeHl5mTRp0phChQqZHj16mD179tjS586dO9FzGNuNGzfMxx9/bJ555hmTPn164+XlZUJCQkyTJk3M0qVLXT5OAABS0muvvWb9buXPn9/pPaW7d++a3377zVqO25Zx9ho2bJitDFfbKDHitiFPnTplunbtarJkyWJ8fHxM4cKFzaeffurQdouKijJffvmlqVq1qsmYMaPx8PAwQUFBJn/+/KZx48bm3Xffte6xuapr165WXQoXLuywPW4dkoJ7lI/2HmXsfM7uQceV2LWeO3duhzLju8eYWJ0jIiLM+PHjTe3ata22aMaMGU3p0qXN66+/bmsXJ/RZM8aYPXv2mFdeecUULFjQ+Pv7G19fXxMaGmpeffVVc+LEiQTPS3La5tu3bzcvv/yyKVSokAkICDC+vr4md+7cpnnz5mbZsmXGGGNat25t7ePpp592KCNuW/7HH39M8L3B440AMx57q1atsn3pzJgxwxQsWNBarl+/vi39d999Z23z8PAwp0+ftm1/4403rO3ZsmWzfgBPnjwZ782D2DfF4rvZ4kxKBJiDg4NNiRIlnNarbt26th/whAK4devWTdKNkVu3bpl69eolmD5v3rzmwIEDtnxLly413t7eDmnd3d1No0aN4q1fRESEadiwYYL7q1Gjhrl586ZL59CYhBtvP//8s23bxIkTbduTU58333zT2lawYEFr/YYNG2z5xo4da23r3r27tb5KlSrW+oULFyb6fjVo0MChcRt7e6VKlYyHh4fTcz5ixAinZWbKlMlUqlQpwYZQfP744w8rn5ubm7ly5YrLeV39bJ0/f95kzZo1wfMSc5M0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z549Onz4sP7880+tXbtWUVFR+vDDD9WgQQNVq1bN5TLTpUunixcvSkr+OYl9zCEhIS7vGwCAhyn2HFfFihXTtGnTVKhQIXl5eWngwIEaPXq003zPP/+8mjZtqi1btmjnzp06fPiwtm7dqiVLlsgYo6lTp6pOnTrq0KGDQ96cOXPq8uXLunHjhg4cOKC6desqLCxMGTNmdKnO7u7uqlWrljUH2eXLlzV//nyX5mF21o6NHWCMrx0bV+ybanEl9D9JQs6ePauCBQvalmNLrE2fPn16ubm5WTd4atWqpQYNGsSbvkiRIsmqZ2L7dfa/Uex1rp5TNze3FKlf0aJFrYcVGzRoYP2fd+XKFfXp08c2l13sz0OaNGk0Z84cVa9eXX5+fvr111/VqFGjZNcj9nG7ubnp/fffT/BacTYPIAAAj0poaKhCQ0P10ksvafTo0SpUqJBOnTolSTp27FiSykqpNkpi92Nit5WKFCmibdu2af/+/dq6dasOHTqkPXv2aMGCBbp9+7a2bt2qN9980zZXc3xiBzlj5qCVpEGDBun8+fP65JNPJMkKLkv350V2tW3rDPco73tY9ygfR3Hfy/DwcId5z5NSVkz8olSpUmrbtm28aXPkyOF0vatt87if78Q64MR45ZVX9N577ykiIkI7d+7UV199ZV1nadKkUZs2bVwqB4+51Ok4DSTutddeS9IQIH5+frY5tq5cuWIb2i9fvnzW36+++qptX2fOnLENu1u3bl3bkNspNQezs2EznEnpOZjv3LkT7xBxMXNvKNZwJc7mYI6KirLyJGcO5jt37rg8B3OHDh2c1vXy5ctm2rRpLp1DYxyHn4lt+vTptm2x5wl5kPpERkaawMBAK2+mTJls7/1XX31lJDkMyxd7+J61a9fats2dO9fatmfPHuPt7W1tizsMZux8sYdOie1hzW/y3//+18pXqFAhl/PFrndin61Tp06ZU6dOOayPjo42adOmtcoZM2aMtW3kyJG2471586ZD/oTmYF61apUtf3xDZD/77LNWmm7durl24AAApICEfqdi/6736dPHWn/r1i1TsGBBp22ly5cvO0x1EqN48eJW+v/85z/W+tjtrurVq5vly5fb5n0rXbq0uXz5ssvHtHz5clvdQkJCzJYtWxzSRUVFmVmzZllTaixYsMCWL7lzMMdukyR328OYgzn2XMhFihQx169fdzgnd+/eNXPnzjWXLl2y1v3www+2Mnfv3u2QL6H9lipVylqf3DmY47YrXRl22pnE/seqV6+ebXvsOQTr1q1rrS9evLgtX9xpiMLCwqxtJ06csG0bN26cQ73izv/97bffOq3/kSNHbFM/AQDwKEyZMsWMGzfOaXvszp07tukuypYta9verVs3a1vsYapjS24bJbE5mGPfn4uZg9mY+9Mjxr53G6NPnz5W+mLFiiV6XowxplmzZlYeX19f2z266Oho2/2emDZNZGSkS2XHd5yxcY8y5e9Rxr237mx6mMTyPew5mJs1a+ZwHZ04ccKlOZiff/55a33mzJmdzkMeFRVlli5dao4cOeLS8SXUNo89Vamnp6dZv369LW90dLTTaZRiT1cae17oTp06OaTFk4kezHgs3b17V1OnTrWWQ0JCbL2TY5w/f16///67JOn27duaNm2aevbsKUlKmzatWrRoYZVz5MgRK1/s4bGl+0NCNGvWTPPmzZN0f2iUWrVqqXr16tq0aZPtqfcHsXv3bo0ZM8bpttatWytnzpxOt3Xt2lVr1qxRpkyZNHPmTNuTdT169Eh0v9euXVPx4sVVoEABVa5cWVmzZlVQUJAOHjxoO7aYJ6kyZMigLl266Ouvv5Z0fxiVKlWqqG7dujp48KDtyf+CBQtaw+Y0adJEmTNntp4ue/fdd3Xo0CHlz59fv/zyi+1puNjSp0+v7t27a/z48ZKk77//Xnv37lWdOnUUGBioc+fOadu2bfrzzz+VLVs2vfjii4kec2JatWql4cOHa//+/dY+hw4dqrx58z5QfTw9PVW9enVrCPKYJx9jetNWr15d0v33JEbGjBn19NNPW8tPPfWU3N3draFI+vXrp23btunGjRuaMmWKbQjL5OjWrZsmTJhgPXnWpEkTdenSRT4+Ppo6daoiIyOTVW7sHsMHDhzQ9evXHYb9u3btmnVdxRbTe+rChQsOn5EGDRqoaNGikqS1a9eqVatWqlixoooVK6asWbPKy8tLq1evtkYokOxPBcZ9Uq9t27aqVKmSPDw81KRJE4WGhqpHjx7WcEr37t1T1apV1aFDB929e9elp10l2Z7YjHmfAQBIbQULFtSuXbskSd98843c3NwUFBSk2bNnW+2guA4dOqRy5crp6aefVunSpZU1a1b5+/vrr7/+0s6dO6108fVUle73fJg2bZpatWqlqKgobd26VQ0aNNDSpUtdGha4du3a6tevn/73v/9Juj/CUPny5dWwYUOVKVNGHh4eOnr0qJYtW6bjx48rLCxMktSoUSMVKVJEe/bskSS99957OnDggIoUKaIVK1ZozZo11j46deqkTJkyJVqXlPLtt9/q3LlzKlOmjMLCwrRq1SprW5MmTVyalufNN99U69atJUl79uxR0aJF1bx5c2XJkkXXrl3T7t27tXLlSl27dk3h4eFWL9m47aFevXqpfv368vT0VI0aNRIdIWjAgAFWz4irV6+qXLlyatOmjW7dumVrK/n4+KhPnz6unZCH5O2339aSJUus5REjRmj58uWS7n8eYobB3Llzp1q3bq1ixYpp5cqV1v+VzoSEhMjb29tqh48ZM0YXLlyQv7+/8ufPr+bNm6thw4YqVqyY9Xnr3r275s+fr1KlSsnT01N///23NmzYoO3bt6tjx46qV6/ewzoFAAA4CA8P14gRI/Tqq6/qmWeeUalSpRQcHKzr169r0aJFVg9aSWrYsKEtb+x2xPnz59WpUycVLVpUbm5ueumll5Q5c+Zkt1HiatSokbp06SJvb299//33unfvnrUt9j3QatWqKX369KpevbqyZcum9OnT68SJE7apCRNqq8bWu3dvzZ8/X5IUERGhSpUqqX379sqRI4e2bt1qG0Jbut/De/z48SnW5uEeZcrfo4zrm2++cXrN5cyZ07puH7YGDRrYpvScP3++SpYsqYYNG8rf31/79u3TggULdObMmURHNurfv7/mz5+v6OhonT17VsWLF1eLFi2UK1cu3bp1S/v27dMff/yh8+fPKyws7IGG45bu96yPGSUo5r5py5YtVahQIZ07d05hYWGqU6eOPv30U1u+fv36Wf8rxEx/JDE89j9Kake4AWdmz55te2Lm/fffd5ru5s2btqes4j5h98cff9jKkWQqVarktKyTJ0+aXLlyOaSXZBo1amRbjpnkPjFxn/xJ6BX7CfnYTxNlzpzZlCtXzmmeWrVq2Z50iq8H8/nz5xPdv7+/v61XyM2bN02dOnUSzJMrVy6zb98+2zEvXrzY9vRazMvNzc3WSyN2/Ywx5vbt2w7n2dkrKU+rJfR0oDH3n96Mvb1r164pUp9PPvnEId3Bgwet7SEhIbZtLVq0cCijV69eTvdXokQJU6ZMGWs5OU8HGmPM22+/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1atXL/Xq1Us3b95UixYtNHr0aPXv318ZM2Z0mufy5cuKioqy8sX1999/25ZDQkIclk+fPi1JSp8+vZYtW6bhw4erVatWio6O1rPPPqvPP/9c+fLlc+kYHkf0YAYAAAAAAAAAAACQYmLmWm7ZsqXSp0+v9OnTK2fOnLpz545mz56tqKj7I1K0bt1a69ev1/HjxzVz5kwFBwerVq1aVjlZsmTR+fPnbWVHREToxo0bSa5TmjRp1KtXL0VFRenQoUPxpkuXLp3c3Nw0YsQIbdq0yeHVpUsXW/pz5845LGfNmtVarlixon777TdduXJF8+bN04EDB9S2bdsk1/9xQg9mAAAAAAAAAAAAACni5s2bWrhwoV588UX16NHDtm3btm16/fXX9fvvv6tu3bp69tlnlS5dOs2aNUszZ85UixYt5OHhYaUvV66cJk+erNu3b1vDZP/888+J1uHSpUtKmzatrSxJOnjwoCQpc+bMkiRvb29FRETY0qRJk0YVK1bU/v379c477yS6r59++kmFCxeWJEVHR2vBggUqX768Qzo/Pz81btxYu3bt0gcffJBouY8zAswAAAAAAAAAAAAAUsSCBQt069Yt9evXTxUqVLBte+aZZ/Tee+9p+vTpqlu3rry8vPT8889r7NixOn36tL788ktb+ldffdWaQ/m1117TmTNn9OGHH8rf31/u7vEP1Pz7779r0KBB6ty5s8qVKyd3d3f9+eef+vDDD/Xcc88pT548kqRChQrp7NmzmjJliooVK6ZMmTIpT548+uijj1S7dm25u7urRYsWCgwM1PHjx7Vo0SK99957Cg0NtfY1ceJEeXt7q1ixYpo4caIOHTpk9eBetGiRvv32WzVr1ky5cuXSyZMnNWHCBFsv7ScRAWYAAAAAAAAAAADgMXc3MkoLP26aKvv19vJIPOH/N336dBUoUMAhuCxJXl5eatWqlaZNm6bx48fLx8dHbdq00aRJk5QtWzZVrVrVlj579uxatGiR+vXrp+eff16FCxfWt99+q7p16yooKCjeOlSoUEFNmzbVrFmz9NFHHykqKkp58uTR0KFD1a9fPytdq1atFBYWpoEDB+r8+fPq2LGjpkyZoipVqmjVqlUaNmyYXnrpJUVFRSl37tyqX7++1fs5xowZM/Taa69p6NChypkzp2bOnKlSpUpJkp566im5ublp8ODBOnfu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cnFxUd26dbVp0yaz/n///VfOzs56+eWXi+IUARSh5cuXKygoiOIyAADIE1YwAwAAwCYEBQXpzz//1K+//qrjx48rMzNT1apVU8OGDWUwGKwdDwCAIuXi4mL6euXKlbpx44ZpOyEhQd988422bdumHTt2qEWLFrp48aI6dOigsmXLasuWLRo+fLi6du2qo0ePqlq1apKkV199VaVKldK0adOK/HwAFK6DBw+qQ4cOGjx4sFatWqX09HS1bt1a8+fPV8WKFXOdGxcXp/j4eLO26OhoSVJaWprS0tIsmtXBwcGi+0PeWPrfEUDJl5aWpoyMDK4PNiK/P18pMAMAAKDEW7VqlVq0aCE/Pz81aNBADRo0MOuPiYnR7t27TaubAQAo6YxGo9l2enq6KleurHPnzqlGjRpq2LChqW/8+PHq2LGjqlevrosXLyosLEwbN25URkaG1qxZoxYtWmj//v1KTEzU888/r8DAQD333HN65ZVX9O2336patWr68ccf9cknn2jGjBny8fEp6tMFUMjOnz+vFStWqH79+vrss890+fJljRkzRk8//bQOHDiQ6xs2FyxYoMmTJ2fbl5iYqNjYWItm9fX1tej+kDfx8fGyt7e3dgwAxUhGRoaSk5MlieuDDcjvz1cKzAAAACjx+vbtqw8//FB+fn7Z9h88eFB9+/alwAwAsFnr16/XuXPnJN28JfZ/i0ETJ040fV22bFm99NJL2rhxo6T/rVRITU2VJDk6OkqSnJycJMm08nnEiBHy9/fX8OHDC/dEAFiF0WiU0WjUhg0b5OHhIUmqUKGCWrZsqR07dujxxx/PcW5YWJhCQ0PN2qKjo9WpUyd5eHjwphQb4eXlxepxAGZurVzm+nB3osAMAACAEu//r+L6/65evapSpfjVFwBguxYvXixJKl26tPr06ZPtGKPRqNOnT+v999+XJJUpU0Y9e/aUJD3yyCMqXbq0vvnmG40fP15fffWVDAaDmjdvrrVr12rv3r1au3atqfAMwLa4u7uratWqpuKyJAUGBsrR0VFHjx7NtcDs7e0tb2/vbPscHBwoOtgI/i0BZMfe3p7rw12Kv7IBAACgRPrtt9/066+/mrb37Nmj9PT0LOMuXryoRYsWqUaNGkWYDgCAohMdHa3t27dLkp555hnde++9WcaMGjVKb731lmnb1dVVixcvVr169SRJFStW1NKlSzVw4EC5ubnJ0dFRb775purWravQ0FC1bNlSXbp0kXRztQp/RARsS61atXT9+vUs7UajUXZ2dlZIBAAlS58+fbRy5cos7V26dNHatWtznNeqVSvt2rUr277evXtrxYoVkqTOnTvrxx9/VHx8vBwcHFSxYkV17txZ4eHhvAEQVkGBGQAAACXSunXrTM96MxgMWrx4sWn11v/n5uamVatWFWU8AACKzJIlS0x38xgwYECe5ly6dEn9+vWTv7+/GjVqJEnq2bOnnn32Wf3777+qWLGinJycNGfOHMXExGjt2rU6dOiQ+vXrp19++UXlypVTv379NHPmTIpPgA1o3769Jk2apISEBHl6ekqSdu/erbS0NNWvX9/K6QCg5HjiiSdUu3Zt03aDBg1yHd+1a1ezMcnJyaaickBAgKn9+PHjatasmTw8PHT8+HF9++23mjlzptLT0zV79mxLngKQJxSYAQAAUCL169dP7du3l9Fo1KOPPqopU6aoTZs2ZmMMBoPKli2ratWqcYtsAIBNSk1NNf0Rsl69emrSpEm24+bMmaM333xT586d01tvvaV58+bp8uXLmjJlir7++mvTuFKlSsnf31+SlJCQoOnTp6tPnz6qU6eO7r//fiUkJGjVqlVat26dZs+erWrVqql///6Ffp4ACle/fv0UERGhkJAQjR8/XpcvX9bYsWMVHByswMBAa8cDgBKjR48eOT6uJDuDBw822546daqkm2+UDwsLM7X//vvvZuPq1q2rI0eO6K+//rrzsEAB8Fc2AAAAlEgVKlRQhQoVJEnfffedatWqleOz3wAAsFVr165VfHy8JGngwIG5jrWzs1OlSpU0adIkzZs3T9LN22vnJDw8XBkZGZo+fbr+/PNP/fPPP+rYsaN69uyp2rVr64svvtDWrVspMAM2wNXVVTt27NDQoUPVrVs3OTo6qmPHjqZrBQAgb4YPH67+/fvLx8dHjz32mCZPniw/P788zb1y5YreeecdSdKwYcPk6upq1r9s2TL9+uuv+vPPP3XkyBHde++9GjVqlKVPAcgTCswAAAAo8Vq2bClJunHjhg4dOqS4uDg1a9bMdHs/AABs1a3HQ7i4uKhnz55Z+jds2KCTJ0+qTZs28vPzU3JystltFKtWrZrtfqOiorR48WJNmTJF5cuX14ULFyTJ9OzlW5+5QwhgO6pXr67IyEhrxwCAEsnR0VEtW7ZUjRo1dOXKFW3cuFGrVq3S3r17dfjwYbm4uNx2HwsXLlRiYqJcXV01bNiwLP2bNm3Shg0bTNtBQUGqVq2aRc8DyCsekgMAAACbEBERoQoVKigwMFCdO3fWb7/9Jkmm58gtX77cygkBALCsY8eOaffu3ZJuPj+5XLlyWcacOnVKI0aMUK1atVSmTBmVL19eb731liTJyclJr776arb7HjVqlHx9fTVixAhJUo0aNVSjRg1t375d3333nd59911JN5/bCgAAcLdbvHixdu7cqSVLluiTTz7R559/Lkk6efKk9u3bd9v5165dM/2ONnjwYLm7u2cZs379eqWmpurIkSOqX7++1q5dq65du1r2RIA8osAMAACAEu+DDz7Q8OHD1bp1ay1btkxGo9HU5+npqaCgIH322WdWTAgAgOXdWr0sSQMGDMh2TJMmTdSlSxdVqVJFZcqUkYODg6pUqaKePXtq06ZN2T6zefv27fr666/15ptvysnJSdLNlcrr16/XQw89pA4dOmjLli2aPn26nn/++cI5OQAAgBIkKioqx75r165JkpKTkxUVFZXt2Pfff1+xsbEqW7asXnnlFbO+y5cvm/7O4eDgoNq1a+vhhx+WJP3yyy+WOgUgX7iPEQAAAEq8t956Sx07dtQnn3yixMTELP0NGzZURESEFZIBAFB43n77bb399tu5jmnUqJHWrl2bpT0tLU2xsbHZznn88cfN3qx1S61atbRt27Y7ygoAAGDLateurUceeUQPPPCArl+/brqVtb+/v4KDgyVJ69atU9++fSXJ7Het1NRU0yNMBg4cmOVxX1988YVee+01NW3aVJ6enjpx4oS2bt0qibvJwHooMAMAAKDEi46O1tChQ3Psv/fee7MtPAMAAAAAABTUyJEjtX37dn355Ze6fv26fH191bZtW40bN05ly5bNde6KFSt0+vRplSlTRqNGjcrSX6NGDVWtWlXfffedLl68KEdHR9WrV0+dO3fWmDFjCuuUgFxRYAYAAECJ5+bmpoSEhBz7jx49qvLlyxdhIgBAcZKZniq7Uo7WjlGsODg4yNfX19oxiiVeLwAAIL/mzJlz2zF9+vRRnz59srT369dP/fr1y3Fe06ZNtXv37oLEAyyOAjMAAABKvLZt22rJkiUKCwvL0nfkyBG9//77euGFF6yQDABQHNiVctTJ6V2sHQMlRNUJX1g7AgAAuEO8UazoODg4qLyXh7I+WAV3AwrMAAAAKPGmTZumRo0aqW7dugoJCZHBYNDKlSu1fPlyffHFF6pQoYImTpxo7ZgAAAAAAKAQ8cbColV1whdKS0uzdgxYgZ21AwAAAAAFVbFiRf38889q3bq1Vq9eLaPRqA8//FCbNm1S9+7ddeDAAXl6elo7JgAAAAAAAFDisYIZAAAANsHb21tLly7V0qVLFR8fr8zMTHl5ecnOjvdUAgAAAAAAAJZCgRkAAAA2x8vLy9oRAAAAAAAAAJtEgRkAAAAlzpQpU/I9x2Aw6PXXXy+ENAAAAAAAAMDdgwIzAAAASpzw8PB8z6HADAAAAAAAABRcsX0g3Zo1a9ShQwdVqlRJLi4uatiwoT799NPbzjMYDFk+GjduXASJAQAAUFQyMzPz/ZGRkWHt2AAAAAAAAECJV2xXMM+dO1f+/v6aN2+ePD09FRkZqR49eighIUFDhgzJde7IkSPVtWtX03a5cuUKOy4AAAAAAAAAAAAA2LxiW2DetGmTPD09TdtBQUE6e/as5s6de9sCs5+fH6uWAQAA7kIXLlzQtm3bFBMTI+nm74WPP/64PDw8rBsMAAAAAAAAsBH5KjBPmTIl3we402fd/be4fMuDDz6oL774It/7AgAAgO0LDw/XrFmzlJqaKqPRaGp3dHTUmDFj7uh3WQAAAAAAAADm8lVgDg8Pz9JmMBgkyeyPeLfajUbjHReYs7N//37VqFEjTzmHDx8uNzc3dejQQXPmzNG9996b65y4uDjFx8ebtUVHR0uS0tLSlJaWdufBkSdpaWnKyMjgew3Aptz6+Wg0Grm+FREHBwdrR4AVTJ06VVOmTFG7du00ePBg0++Mf/75p+bPn6/p06fLwcHBYr+XAgAAAAAAAHerfBWYMzMzzbbPnDmjdu3aqW7duho+fLhq1qwpSYqKitLbb7+to0eP6uuvv7ZI0O3bt2v9+vVavnx5ruN69+6tkJAQeXl56aefftLUqVN1+PBh/fDDD7K3t89x3oIFCzR58uRs+xITExUbG1ug/Li9jIwMJScnS1Ku/1YAUJKkpqaaPvOzpGj4+vpaOwKsYNGiRQoJCdGGDRvM2v39/dW6dWuFhIRo4cKFFJgBAAAAAACAAirQM5gHDRqk+++/Xx999JFZ+yOPPKKPP/5YXbt21aBBg7Ru3boChYyJiVGPHj3UsWNH9enTJ9exK1asMH3dokUL1apVS23bttWmTZvUqVOnHOeFhYUpNDTUrC06OlqdOnWSh4eHfHx8CnAGyItbK/u8vLxYfQbAZjg6Opo+87MEKDzJyclq3bp1jv1t27bVzp07iy4QAAAAAAAAYKMKVGDesWOHZs2alWP/448/rrFjxxbkELpw4YLatGmjKlWq6OOPP873/NatW8vFxUWHDh3KtcDs7e0tb2/vbPscHBwoeBYRe3t7vt8AbMqtR0kYDAaubUAhatasmQ4ePKiBAwdm23/w4EE1a9asiFMBAAAAAAAAtseuIJNLly6t/fv359i/b98+lS5d+o73n5KSovbt2ys1NVVfffWVnJ2d872P//5hHwAAALZp0aJF2r9/v1555RVFR0crMzNTmZmZio6O1vDhw3XgwAEtWrTI2jEBAAAAAACAEq9AK5h79uypiIgIubm5aciQIapWrZok6cSJE4qIiNAnn3yioUOH3tG+09PTFRoaquPHj2vfvn05ri6+nS1btujKlStq2LDhHc0HAABA8VevXj1lZmYqIiJCERERsrO7+T7KzMxMSZKTk5Pq1atnNsdgMCg5ObnIswIAAAAAAAAlWYEKzLNmzVJCQoLmz5+v9957z+wPeUajUd27d8/1Ftq5CQsLU2RkpN555x0lJiYqMTHR1Pfggw/KyclJjz/+uCRp+/btkqQlS5bop59+UnBwsDw9PXXo0CFNmzZNjz76qNq1a1eQUwUAAEAx1qVLF+5YAwAAAAAAABSBAhWYHR0d9eGHH2r06NGKjIzU33//LUmqUqWK2rRpo/r169/xvrdu3SpJGjZsWJa+U6dOyc/PTxkZGWbt1apV08qVK/XFF1/o0qVLKl++vHr16qWpU6fK3t7+jrMAAACgeFuxYoW1IwAAAAAAAAB3hTsuMKekpOi5555Tly5d1LNnzyy3HCyomJiY247ZuXOn2fbjjz9uWtUMAAAAAAAAAAAAALCsOy4wOzs7a9u2bWrTpo0l8wAAAAB3bPfu3Tp58qSSkpJkNBrN+gwGg1555RUrJQMAAAAAAABsQ4FukR0YGKj9+/fr5ZdftlQeAAAAIN9+/fVXPfvss4qOjs5SWL6FAjMAAAAAAABQcAUqMM+fP19PPfWUXnvtNQ0YMEC+vr6WygUAAADk2UsvvaS4uDgtWrRIjRo10j333GPtSAAAAAAAAIBNKlCBuX79+kpPT9eMGTM0Y8YMlSpVSk5OTmZjDAaDkpOTCxQSAAAAyM2RI0c0ZcoU7qwDAAAAAAAAFLICFZi7dOkig8FgqSwAAADAHbn//vv5vRQAAAAAAAAoAgUqMK9YscJCMQAAAIA7Fx4erpEjR6p79+6qVKmSteMAAAAAAAAANqtABWYAAACgOOjcubOuX7+umjVr6vHHH5evr6/s7e3NxhgMBr3zzjtWSggAAAAAAADYBosUmE+fPq1ffvlFycnJyszMzNLfq1cvSxwGAAAAyNauXbs0cOBApaSkaNOmTdmOocAMAAAAAAAAFFyBCszXr19X79699cUXXygzM1MGg0FGo1GSzJ6BR4EZAFASrVq1SuvWrdOvv/6q2NhYlStXTnXr1tVrr72mxx577Lbz//nnH0VFRUmS9uzZo/r162vo0KF68cUXzcYtWLBAGzdu1IEDB5ScnCxJmjp1ql577TXLnxRgo4YMGSJXV1etXbtWjRo1kqurq7UjAQAAAAAAADbJriCTx48fry+//FLTp0/Xzp07ZTQatXLlSm3dulVt2rRR/fr1dfjwYUtlBQCgSL3xxhtav369YmJidO3aNcXFxWnHjh0KCgrSZ599luvc8+fPq2nTpoqLi5MkGY1G/fbbb3rppZc0ffp0s7FLlizRN998YyouA8i/6OhojR49Wk888QTFZQAAAAAAAKAQFWgF89q1a9W3b1+NHTtWiYmJkqRKlSopKChIwcHBCgoK0nvvvaeFCxdaJCxKvjp16uTYZzQalZGRIXt7e7MV8P915MiRwooGAFm4ublp2rRpeu6553Tvvfdq5syZeuONNyTdXGHcrVu3HOdOmjRJZ86cMW03btxYRqNRBw8e1OTJk/X888+rcuXKkqSnn35a/fv3l8Fg0MCBAwv3pAAbVadOHd6kAQAAAAAAABSBAq1gjouL06OPPipJKlOmjCTp6tWrpv4uXbroyy+/LMghcBdJTk5WQkICfxwGUGxs27ZNEyZMUJUqVVSuXDlNmzbNtDIyOjo6x3mZmZlavXq1JMnZ2VmS5OjoqBEjRkiS0tLStHbtWtP4SZMmaeDAgQoICCisUwFs3pw5c7R48WL98MMP1o4CAAAAAAAA2LQCrWD28fExrVx2dnaWu7u7/vzzT4WEhEiSLl26pOvXrxc8JWxGbiuQW7Zsqd27d6tFixbatWtXEaYCgOy5uLiYbaempiojI0PSzTt25OTEiROmN8uUKVNGKSkpkqQaNWqYxvzyyy+Wjgvc1d566y2VK1dOTZo0Ue3atVW5cmXZ29ubjTEYDNqwYYOVEgIAAAAAAAC2oUAF5kaNGmnv3r0aO3asJCkkJESzZ89WhQoVlJmZqXnz5qlx48YWCQoAgLXNmTPHdKeOF198McdxCQkJpq//W+D673Nhbz2bGYBl/PbbbzIYDKpcubKuXLmio0ePZhmT0yM4AAAAAAAAAORdgQrMQ4cO1Zo1a3Tjxg05OTlp6tSp2r9/v55//nlJUrVq1RQREWGRoAAAWNOqVas0ceJESdJjjz2mMWPG5HsfRqPR9DWFLsCyYmJirB0BAAAAAAAAuCsUqMAcGBiowMBA0/Z9992nY8eO6ffff5e9vb0CAgJUqlSBDgEAgNWtXLlSL7zwgjIzMxUYGKgNGzbIwcEhx/Genp6mr2/dUluSLl++bPray8urcMICAAAAAAAAAFCILF79tbOzU/369S29WwAArGLFihV68cUXlZmZqaCgIG3cuFFly5bNdU61atV0zz33KDk5WdeuXTO1//XXX6avH3zwwULLDNzNdu3apa+//lp///23JKlKlSpq166dWrZsaeVkAAAAAAAAgG2wK8jkihUr6tlnn9X8+fN1+PBhS2UCAKBY+OCDD0zF5datW+vrr7/OUlyOiYmRwWCQwWBQeHi4pJtvtnr22WclSSkpKZKk1NRUzZ07V5Lk4OCg0NBQ0z6Sk5OVkJCg5ORkU1tKSooSEhKUlJRUmKcI2IzU1FR16dJFQUFBmjNnjr799lt9++23mjNnjoKCgtS1a1elpaVZOyYAAAAAAABQ4hWowNyxY0cdPXpUw4YN00MPPSR3d3e1a9dOs2bN0r59+/gjHgCgRJs8ebIyMzMlSVu2bFGZMmVMxWSDwZDrM18nT56sSpUqmbYPHDiggwcPSpImTZqk++67z9TXsWNHeXl5qVOnTqa2GTNmyMvLi5XOQB5NnjxZ69at08iRI3Xu3DlduHBBFy5c0Pnz5zVq1Ch9+eWXmjJlirVjAgAAAAAAACVegW6RvXDhQklSUlKS9uzZoz179mjv3r2aOHGi0tPT5eTkpEaNGum7776zSFgAAEqK8uXLa9++fXr44YcVHx8vg8GgBx54QEOHDtWLL75o7XiAzfnkk0/Uu3dvvfnmm2bt3t7emjVrlmJjY/Xhhx9q6tSpVkoIAAAAAAAA2AaLPIPZ3d1dHTp0UIcOHfTvv/9q8+bNmjt3rv766y/t3r3bEocAAKDI5bZC+b+MRmO27ZUrV1atWrUUHx+v5s2ba9euXdmO27lz5x0mBHDLuXPn1KhRoxz7GzVqpM8++6wIEwEAAAAAAAC2qUC3yJakY8eOacmSJXr++efl5+cnPz8/jRs3TtWqVdOMGTO0Z88eS+QEAAAAcuTr65vrmzV27dolX1/fogsEAAAAFJKMjAx99tln6t+/v55++mn9/vvvkqTk5GR9+eWXio2NtXJCAABg6wq0gtnLy0sXLlyQt7e3mjdvrpEjR6p58+aqX7++DAaDpTICAAAAuerdu7cmTZokNzc3vfLKK6pevboMBoOOHz+ut99+W2vWrNHkyZOtHRMAAAAokIsXL6p169b64Ycf5OLioqtXr2rIkCGSJBcXFw0dOlS9evXSG2+8YeWkAADAlhVoBXNiYqIMBoMCAgJUq1Yt1apVS/fffz/FZQAAABSp8ePHq1evXlqyZIlq166t0qVLy8nJSbVr19bixYvVq1cvjR8/3toxAQAAgAIZN26cjhw5om+++UYnT540e2STvb29unbtqsjISCsmBAAAd4MCrWCOj4/X3r17tWfPHm3ZskUzZsyQJDVo0EDNmzdX8+bNFRgYKE9PT4uEBQAAALJjb2+vFStWaMSIEYqMjNTff/8tSapSpYratm2revXqWTkhAAAAUHDr16/XkCFD9MQTTygxMTFLf40aNbRixYqiDwYAAO4qBSowe3h4qGPHjurYsaMkKSUlRfv379eePXv0+eef6+2335bBYFB6erpFwgIAAAC5qVevntWKyenp6ZozZ46WLVumf/75R15eXgoNDdW8efNMY4xGo2bMmKGFCxcqISFBjzzyiCIiItSgQQOrZAYAAEDJkpycLH9//xz709LS+FssAAAodAUqMP/X8ePHtWfPHu3evVt79uzRqVOnJN18TjMAAABgadevX9fw4cNVp04d03PnshMREaFjx44pIiJCDg4OhZanT58+2rFjhyZNmqSAgAD9+++/Onr0qNmYmTNnaurUqZo9e7YCAgI0d+5cBQcH648//lD58uULLRsAAABsQ7Vq1XTo0KEc+7du3aratWsXYSIAAHA3KlCBef78+dq9e7f27t2r2NhYGY1G+fv7q3nz5ho/fryaN2+uGjVqWCorAAAAYLJkyRKtWLEiSxH3/2vXrp3GjBmjevXqaeDAgYWSZcuWLVq9erUOHz6c4x/0rl+/rpkzZ+rVV1/V4MGDJUlNmjSRn5+f5s+fr2nTphVKNgAAANiOl156SWPHjlWrVq30+OOPS5IMBoNu3LihKVOmaMuWLVqyZImVUwIAAFtXoALz8OHDVbduXXXp0sX0zOUKFSpYKhsAAACQo88//1xdunRR1apVcx1XrVo1hYaG6tNPPy20AvPy5csVFBSU62qRffv26dKlS3rmmWdMbWXLllVISIg2b95MgRkAAAC3NWzYMB05ckTdu3eXm5ubJKlHjx5KTExUenq6+vfvrxdffNG6IQEAgM0rUIE5MTFR99xzj6WyAAAAAHn2+++/q2fPnnka27RpU23atKnQshw8eFAdOnTQ4MGDtWrVKqWnp6t169aaP3++KlasKEmKioqSvb297r//frO5tWrV0urVq3Pdf1xcnOLj483aoqOjJd18zl5aWpoFzwbZSUtLU0ZGBt9roIQqzEckwDYV1vWe1yIKymAw6P3331fv3r21du1aHT9+XJmZmapWrZqeeeYZtWjRwtoRAQDAXaBABeb/FpfPnTunuLg4Va9eXWXLli1wMAAAACA3qampcnR0zNNYR0dH3bhxo9CynD9/XitWrFD9+vX12Wef6fLlyxozZoyefvppHThwQAaDQUlJSXJxcZG9vb3ZXHd3d6WkpOR6PgsWLNDkyZOz7UtMTFRsbKzFzwnmMjIylJycLElZ/g0BFH++vr7WjoASprB+tvJahKUEBgYqMDDQ2jEAAMBdqkAFZknasGGDxo4dq+PHj0uSvv32WwUFBSkhIUFPPPGEJk2apE6dOhX0MAAAAICZihUr6o8//sjT2D/++MO0krgwGI1GGY1GbdiwQR4eHpKkChUqqGXLltqxY4fp+Xh3KiwsTKGhoWZt0dHR6tSpkzw8POTj41Og/eP2bq1k8/LyYvUZANwF+NkKAAAA5KxABeZNmzapc+fOatKkiXr06KHw8HBTn6enpypVqqQPPviAAjMAAAAsLjg4WKtWrdKrr74qb2/vHMfFxcVp1apVWQq0luTu7q6qVauaisvSzVUljo6OOnr0qB5//HG5u7vrypUrysjIMFsBm5SUJGdn51xXY3t7e+d4jg4ODhQ8i4i9vT3fbwC4S3CtR3Hl7+8vg8GQ6xiDwaATJ04UUSIAAHA3sivI5ClTpqhFixbau3evBg0alKW/SZMm+uWXXwpyCAAAACBbY8eO1fXr1xUUFKSDBw9mO+bgwYN6/PHHdf36dY0ePbrQstSqVUtGozFLu9FolJ3dzV+5AwIClJGRYXp28i1RUVEKCAgotGwAAACwHS1btszyERgYqPvuu0///POPXF1deQ4zAAAodAVawfzHH39o7ty5Ofb7+PgoLi6uIIcAAAAAslW1alV9/vnn6t69u5o2baqqVavqgQceULly5XT58mX98ccfOnHihJydnfXZZ5+pWrVqhZalffv2mjRpkhISEuTp6SlJ2r17t9LS0lS/fn1JUtOmTeXq6qo1a9botddekySlpKRo06ZN6tevX6FlAwAAgO1YsWJFjn2HDx/WU089pZ49exZdIAAAcFcq0ApmZ2dnXb16Ncf+kydPmt0mEAAAALCkdu3a6bffflO/fv10/fp1rV+/Xh9++KHWr1+vlJQUvfzyyzp8+LBCQkIKNUe/fv3k4eGhkJAQbdq0SZ988omef/55BQcHKzAwUJJUunRpjRs3Tm+88Ybee+89bd++XaGhocrMzNSQIUMKNR8AAABsX/369dW/f3+NHTvW2lEAAICNK9AK5scee0wrV67U8OHDs/SdP39e77//vtq3b1+QQwAAAAC58vPz08KFC7Vw4UJdvnxZly5dkqurq8qVK1dkGVxdXbVjxw4NHTpU3bp1k6Ojozp27Kh58+aZjRs3bpwyMzM1Y8YMJSYm6uGHH9a3334rHx+fIssKAAAA2+Xj46OjR49aOwYAALBxBSowT58+XY0bN9Yjjzyi0NBQGQwGffPNN9qxY4cWL14so9GoSZMmWSorAAAAkKty5coVaWH5v6pXr67IyMhcxxgMBk2YMEETJkwoolQAAAC4WyQmJmrZsmXy9fW1dhQAAGDjClRgrlmzpvbu3athw4bp9ddfl9Fo1OzZsyVJrVq10nvvvSc/Pz9L5AQAAAAAAACAu1pQUFC27RcvXlRUVJRSU1P14YcfFnEqAABwtylQgVmS6tSpo23btikpKUnR0dHKzMxU1apV5eXlJUkyGo0yGAwFDgoAAAAAAAAAd7PMzMwsf2s1GAzy9/dXcHCwXnjhBQUEBFgpHQAAuFsUuMB8i7u7ux555BHTdmpqqlasWKE5c+bor7/+stRhAAAAAAAAAOCutHPnTmtHAAAAkN2dTEpNTdXatWs1a9YsLVmyRGfPnjX1paSk6M0335Sfn58GDBggo9F4R8HWrFmjDh06qFKlSnJxcVHDhg316aef3nbejRs3NHLkSHl7e6ts2bJq166dYmJi7igDAAAAAAAAAAAAAOB/8r2C+ezZs2rVqpVOnDhhKh6XKVNGGzdulKOjo3r06KEzZ87o0Ucf1bvvvqvOnTvfUbC5c+fK399f8+bNk6enpyIjI9WjRw8lJCRoyJAhOc4bOnSo1q5dq3nz5snLy0vh4eF64okn9Pvvv6t06dJ3lAUAAAAAAAAAitqqVavuaF6vXr0snAQAAOB/8l1gnjBhgk6dOqUxY8aoefPmOnXqlKZMmaJ+/fopISFBderU0UcffaSWLVsWKNimTZvk6elp2g4KCtLZs2c1d+7cHAvMp0+f1rJly7R8+XLTL1H16tWTv7+/PvroI7300ksFygQAAIDi6ddff9WxY8fUvXt3U9s333yj6dOn68aNG+rRo4eGDRtmxYQAAABA/vXp0yffcwwGAwVmAABQqPJdYP7222/Vt29fzZgxw9RWvnx5hYaGql27dtqwYYPs7O7ozttm/ltcvuXBBx/UF198keOcrVu3SpLZqulKlSopMDBQmzdvpsAMAABgo8aMGSNnZ2dTgfnUqVN6+umn5eHhoYoVK2rEiBEqU6aM+vXrZ+WkAAAAQN6dOnXK2hEAAACyyHeBOTY2Vo0bNzZru7X9wgsvWKS4nJP9+/erRo0aOfZHRUXJ19dXLi4uZu21atXSzp07c913XFyc4uPjzdqio6MlSWlpaUpLS7uz0MizW7dcNxqNfL+BEspeRtk5OFo7RrFiMBjMPuOmzLRUZahwvicODg6Fsl8Ub4cPH9bo0aNN26tWrZK9vb1++eUXeXp66tlnn9WiRYsoMAMAAKBEqVKlirUjAAAAZJHvAnNGRkaWZxnf2r7nnnsskyob27dv1/r167V8+fIcxyQlJcnNzS1Lu7u7u5KSknLd/4IFCzR58uRs+xITExUbG5uvvMi/1NRU02e+30DJ5Ovrq5PTu1g7RrFy/e8jps98b/6n6oQvdPb06ULZt6+vb6HsF8VbcnKyPDw8TNuRkZF64oknTHfFeeKJJ7R582ZrxQMAAAAAAABsRr4LzJIUExOjQ4cOmbaTk5MlScePH8+2wPvQQw/dWbr/HK9Hjx7q2LHjHT13JC/CwsIUGhpq1hYdHa1OnTrJw8NDPj4+hXJc/I+jo6PpM99vALB9XOthSRUqVNCxY8ckSefOndPPP/+svn37mvqvXLlSqHfaAQAAAIrK+fPntWzZMh06dEjJycnKzMw06zcYDNq+fbuV0gEAgLvBHRWYX3/9db3++utZ2sPCwsy2jUajDAaDMjIy7iydpAsXLqhNmzaqUqWKPv7441zHuru7m4rd/5WUlCR3d/dc53p7e8vb2zvbPgcHB263WQT+extZvt8AYPu41sOSOnbsqHfffVfXr1/XwYMH5eTkpKefftrUf/jwYVWtWtWKCQEAAICC++2339SqVStdu3ZNNWvW1O+//67atWvr4sWLOnPmjKpVq6b77rvP2jEBAICNy3eB+YMPPiiMHNlKSUlR+/btlZqaqq+++krOzs65jg8ICNC///6rq1evqmzZsqb2qKgoBQQEFHZcAAAAWMm0adMUHx+vDz/8UG5ublqxYoVplfylS5e0du1aDRo0yMopAQAAgIIZN26cXFxc9Ouvv8rZ2Vne3t565513FBQUpDVr1mjgwIG3XaQDAABQUPkuMPfu3bswcmSRnp6u0NBQHT9+XPv27ctxdfF/Pfnkk5KkdevW6bnnnpMknT17Vnv27NGCBQsKNS8AAACsx8XFJcc/pLm4uOj06dO3fbMiAAAAUNx9//33GjNmjCpXrqwLFy5IkukW2aGhodq7d69Gjx6tXbt2WTMmAACwcXd0i+yiEBYWpsjISL3zzjtKTExUYmKiqe/BBx+Uk5OTHn/8cUkyPVPE19dXL774ooYPHy6j0SgvLy+Fh4erSpUqpoIzAAAAbF9ycrJcXFxkb28vOzs73XPPPdaOBAAAABRYZmam6U49bm5usre3NxWaJemBBx7QsmXLrBUPAADcJeysHSAnW7dulSQNGzZMTZo0Mfs4d+6cJCkjIyPL850jIiLUq1cvjRgxQl26dNG9996rrVu3qnTp0kV+DgAAACg6P/30k1q3bi1nZ2d5eHiYVm0kJCSoY8eO2rlzp3UDAgAAAAXk7++vU6dOSZLs7Ozk7++vbdu2mfr37dsnNzc3K6UDAAB3i2JbYI6JiZHRaMz2w8/PT5K0c+fOLH8odHJy0ty5cxUfH6+rV68qMjJS/v7+RX8CAAAAKDL79u1TYGCgjh8/rueee850m0BJ8vT0VHJyshYvXmzFhAAAAMCdSUpKMn395JNPas2aNabtgQMHaunSpQoODtbjjz+ulStXqkePHtaICQAA7iLF9hbZAAAAQF6NHz9etWrV0oEDB3T58mUtXbrUrP+xxx7TypUrrZQOAAAAuHPly5dX27Zt1bNnT40cOVLdu3dXWlqaHBwcNHz4cF29elVffPGF7O3t9frrr2v8+PHWjgwAAGwcBWYAAACUeD/++KNmzJghJycnXblyJUt/pUqVdP78eSskAwAAAAqma9eu2rhxozZu3Khy5cqpc+fO6tmzp4KCgmQwGPTaa6/ptddes3ZMAABwFym2t8gGAAAA8srBwcHsttj/35kzZ+Ti4lKEiQAAAADL+PjjjxUXF6ePPvpIzZs318cff6wnn3xSlSpV0siRI3Xo0CFrRwQAAHeZfK1g3r179x0dpEWLFnc0DwAAAMiLxo0ba+3atRo+fHiWvqtXr+qDDz5Qy5Ytiz4YAAAAYAFlypRR9+7d1b17dyUlJenzzz/XJ598orfffltvv/227r//fj333HPq0aOHqlatau24AADAxuWrwNyqVSsZDIY8jzcajTIYDMrIyMh3MAAAACCvJk+erJYtW6pdu3bq3r27JOnw4cM6efKk5syZo/j4eL3++utWTgkAAAAUnLu7u/r376/+/fvrzJkz+uSTT/Tpp59q4sSJmjRpkho1aqR9+/ZZOyYAALBh+Sowf/fdd4WVAwAAALhjjRo1UmRkpAYOHKhevXpJkkaOHClJqlatmiIjI1WvXj1rRgQAAAAsrlKlSho9erRat26tiRMnasOGDTp48KC1YwEAABuXrwIztxUEAABAcRUUFKQ///xTv/76q44fP67MzExVq1ZNDRs2zNddeAAAAICS4J9//jGtXv7jjz9kNBrVtGlT9ezZs8D7PnPmjGrWrKmrV6/q8uXLcnFxsUBiAABgK/JVYAYAAACKuwYNGqhBgwbWjgEAAABYXEJCgun5y/v375fRaFRAQICmTJminj17ys/PzyLHGT16tFxcXHT16lWL7A8AANiWAheYr1+/ri+++EKHDh1ScnKyMjMzzfoNBoOWLVtW0MMAAAAAJrt3776jeS1atLBwEgAAAKBwXb16VevWrdMnn3yi7du3Ky0tTRUqVNDw4cPVs2dPPfTQQxY93u7du7VlyxaNHz9eo0ePtui+AQCAbShQgfnvv//WY489ppiYGLm5uSk5OVn33nuvLl68qIyMDHl6enL7FAAAAFhcq1atzG57bTQa83Qb7IyMjMKMBQAAAFict7e3rl+/LhcXF/Xo0UM9e/ZUUFCQ7OzsLH6sjIwMDRkyRBMnTpSbm5vF9w8AAGxDgQrMo0ePVnJysg4cOKCqVavK29tbq1evVrNmzRQREaH58+frm2++sVRWAAAAQJL03XffmW3fuHFDY8aMUUpKivr166eaNWtKkqKiovT++++rbNmyevPNN60RFQAAACiQ4OBg9ezZUx06dFDp0qUL9ViLFi3SjRs3NGjQIH388cd5mhMXF6f4+HiztujoaElSWlqa0tLSLJrRwcHBovtD3lj63xEoLFwjih7XB9uQ3/92ClRg3rFjh8LCwvToo4/qwoULkm6uHnFyctLo0aN17NgxDR8+XF9//XVBDgMAAACYadmypdn2iBEj5OjoqAMHDpj90S0kJESDBg1Sy5YttWXLFj3xxBNFHRUAAAAokA0bNhTJcRITE/X666/ro48+ytcfmRcsWKDJkyfnuM/Y2FhLRZQk+fr6WnR/yJv4+HjZ29tbOwZwW1wjih7XB9uQ3/92ClRgTklJkZ+fnyTJ1dVVBoNBycnJpv4mTZpo1KhRBTkEAAAAcFsff/yxXnvttWxXdDg7O+v555/X9OnT9dZbb1khHQAAAFD8TZgwQY0bN1bbtm3zNS8sLEyhoaFmbdHR0erUqZM8PDzk4+NjyZiwEi8vL1aGAsgW14e7U4EKzJUrV9bp06dv7qhUKVWqVEkHDhxQ586dJUlHjx4t9Nu2AAAAAFevXtW5c+dy7D937pxSUlKKMBEAAABQchw5ckTLly/X7t27dfHiRUky/f6cnJwse3t7lSlTJtu53t7e8vb2zrbPwcGBooON4N8SQE64Ptyd7AoyOSgoyOwWLX369NG8efP08ssv68UXX9R7772nkJCQAocEAAAAchMcHKx33nlHX375ZZa+L774Qu+8846Cg4OtkAzF1bZt22QwGEwfe/fulSSFh4ebtd/6cHR01H333Wf2Otq0aZPq1q0rFxcXPfroo9q3b5/ZMX788UfZ2dlp+vTpRXpuAAAA+XX8+HGlpaWpSZMmcnd3l7u7uwYNGiTp5i0zhwwZYuWEAACgOCnQCuZx48bpxx9/1I0bN+Tk5KTx48fr7NmzWrt2rezt7dWjRw9uQwgAAIBC99577ykoKEihoaGqUKGCqlevLkk6ceKEzp49q2rVqundd9+1ckoUF2lpaXf8R1IXFxdJN19bXbt21QMPPKAtW7aoZ8+e6tChg6Kjo+Xm5ibp5rPBK1eurJEjR1oqOgAAQKEIDAzUd999Z9a2ZcsWzZo1S5GRkapataqVkgEAgOKoQCuYK1eurC5dusjJyUmSVLp0aS1dulRJSUlKSEjQihUrdM8991gkKAAAAJCTSpUq6fDhw5o7d67q1q2r2NhYxcbGqk6dOpo3b54OHz4sX19fa8dEMTFv3jxFRUXJ2dk5S194eLiMRqPZx3/fnPDss89KkrZu3arU1FQ9//zzCgwM1NNPP63ExEQdOHBAkrR27Vrt3btXs2bN4rFBAACg2PP09FSrVq3MPgICAiRJzZs3V82aNa2cEAAAFCcFKjC/8MILOnjwYI79P/zwg1544YWCHAIAAADIk9KlS2vYsGHasmWLjh07pmPHjmnLli0aOnRojs+Lw93nzJkzmjp1qry9vfXyyy/nac7ixYslSffee6+6dOkiSUpNTZUkOTo6SpLpTbc3btxQamqqxo4dq2bNmpkK0gAAAAAAALaiQAXmFStW6MSJEzn2nzp1SitXrizIIQAAAIB8OXr0qDZv3qzNmzfr6NGj1o6DYmbUqFG6cuWKZs2aZbqVdW6+//57/fHHH5KkZ555xlRQDgwMlMFg0FdffaXk5GR98803Kl26tB555BFFRETo1KlTevvttwvxTAAAAApXnz59ZDQaTY8IAQAAuKVABebbOXv2LKtFAAAAUCQ2bNigatWq6YEHHlD79u3Vrl07PfDAA6pevbo2btxo7XgoBnbu3KnPPvtMTZs2Ve/evfM0Z9GiRZIkg8Ggnj17mtobNmyoN998U9u2bZObm5tOnjyppUuXytHRUdOnT9fzzz+vhx9+WNL/VjsDAAAAAADYglL5nbBhwwZt2LDBtL1kyRJt27Yty7iLFy9q27ZteuSRRwqWEAAAALiNyMhIdenSRVWqVNEbb7yhWrVqSZKOHTumJUuWqHPnzvrqq6/UunVrKyeFtaSnp2vIkCGyt7fXe++9J4PBcNs5Fy5c0Nq1ayVJwcHB8vPzM+sfNWqUhgwZorNnz+q+++5TqVKlNHjwYKWlpWnGjBn69ttvNWTIEP3111/y9PTUuHHjNGLEiMI4PQAAAAAAgCKT7wLz0aNHtWbNGkk338V/8OBB/fzzz2ZjDAaDypYtqxYtWmju3LmWSQoAAADkYOrUqapXr5727NmjsmXLmto7dOigwYMHKzAwUJMnT6bAfBdbv369/vjjD7Vv316S9Ouvv+r8+fOm/ujoaJUvX17Vq1c3ta1YsULXr1+XpByf1+zk5CR/f39JUlRUlBYvXqyJEyfKwcFBXbt2VZkyZbRmzRpFRERo5MiRqlOnjp566qnCOk0AAAAAAIBCl+9bZL/66qu6fPmyLl++LKPRqGXLlpm2b31cunRJ586d01dffaUaNWoURm4AAADA5LffflPv3r3Nisu3lC1bVn369NFvv/1mhWQoLq5cuSJJ+uqrr/Tggw/qwQcf1OLFi039ffv21UsvvWQ2Z8mSJZKkSpUqmQrTuRk1apQqVqyoUaNG6cCBA7p06ZK6deumLl26aPjw4ZKkrVu3WuiMAAAAAAAArCPfK5j/KzMz01I5AAAAgDtWunRpXbhwIcf+CxcuqHTp0kWYCCXdd999pz///FOS9NJLL6lUqdz/12n79u36+uuv9cknn6hMmTKyt7eXJDk4OJh9vt1+AAAAAAAAirt8r2DOzqlTp7RgwQKNHTtWY8eO1YIFC3Tq1ClL7BoAAAC4raCgIL3zzjvav39/lr6DBw8qIiJCwcHBVkiG4qJPnz4yGo1mH5MmTTL179mzRzt37jRtL1q0SJJkb2+f4+2xb8nMzNSIESPUpEkTde/eXZLUpEkTeXh46Msvv9T+/ftNq6HzshIaAAAAAACgOCvw2+dHjhypd955J8tqZjs7Ow0fPlxz5swp6CEAAACAXL355ptq0qSJAgMD9eijj6pmzZqSpD///FM//PCDvL29NWvWLCunREkRFxendevWSbpZEK5UqZLS0tJyHL98+XL9/vvvOnDggKnN3d1dGzdu1IgRIxQcHKyKFStq6dKlat68eaHnBwAAAAAAKEwFWsH81ltvad68eercubP279+vixcv6uLFi9q/f7+6du2qefPmad68eZbKCgAAAGTL399fv/32m4YOHaqkpCStXr1aq1evVlJSkoYNG6bDhw/Lz8/P2jFRzISHh5tWMwcGBpravb29lZqaKqPRqPXr1992Py+99JIyMzP16KOPmrU3bdpUBw4c0NWrV3X8+HG9+OKLlj4FAAAAAACAIlegFczvv/++OnTooM8//9ysvVGjRvrss890/fp1LV68WK+88kqBQgIAAAC34+3tzRscAQAAAAAAgEJWoBXMMTExeuqpp3Lsf+qppxQTE1OQQwAAAAB37OTJkzp27Ji1Y5Q4qWkZ1o5Q7Dg4OMjX11cODg7WjlLs8HoBAAAAAODuUqAVzN7e3jp8+HCO/YcPH5aXl1dBDgEAAADcVkREhPbt26fPPvvM1NanTx99+OGHkqQHH3xQkZGR8vb2tlbEEsXRwV4hIzdYOwZKiE1vdbR2BAAAAAAAUITyvYJ59+7dio+PlySFhoZq6dKlmjlzpq5evWoac/XqVc2aNUtLly7Vs88+a7m0AAAAQDaWLl0qHx8f0/Y333yjVatWqV+/fnr33Xd18uRJTZ482YoJAQAAAAAAANuQ7xXMjz32mD788EP16NFDU6dO1a+//qrx48dr4sSJqlixoiTp7NmzSk9P12OPPaYpU6ZYPDQAAADwX3///bdq1apl2v7888/l7++vhQsXSpLOnz9vWs0MAAAAAAAA4M7lu8BsNBpNXzs7O2v79u3asGGDNm/erL///luS1Lp1a7Vt21YhISEyGAyWSwsAAABk47+/o0rS1q1b1bHj/27b6+fnp/Pnzxd1LAAAAAAAAMDmFOgZzLd07NjR7A94AAAAQFGqUaOG1q1bpwEDBuibb77R2bNn1aZNG1P/6dOn5ebmZr2AAAAAAAAAgI24owIzq5IBAABQnIwaNUo9evSQu7u7rl69qlq1aumpp54y9e/YsUMNGjSwXkAAAAAAAADARtxRgfm5557Tc889l6exBoNB6enpd3IYAAAAIE+6desmDw8PRUZGys3NTWFhYSpV6uavuhcuXNC9996r559/3sopAQAAAAAAgJLvjgrMwcHBqlGjhqWzAAAAAHfsiSee0BNPPJGl/d5779WXX35phUQAAAAAAACA7bmjAnPv3r3Vo0cPS2cBAAAAAAAAAAAAABRjd1RgBgAAAKzJ399fdnZ2ioqKkoODg/z9/WUwGHKdYzAYdOLEiSJKCAAAAAAAANgmCswAAAAocVq2bCmDwSA7OzuzbQAAAAAAAACFiwIzAAAASpwVK1bkug0AAAAAAACgcNjld0JmZmaRPH85Ojpa/fv3V7169WRvb69WrVrddk5MTIwMBkOWj27duhV6XgAAAAAAAAAAAACwdcV2BfORI0cUGRmpxo0bKy0tLV9z58yZo2bNmpm2PT09LR0PAAAAxcyNGzf0/vvvKzIyUjExMZIkPz8/tW3bVi+99JJKly5t3YAAAAAAAACADcj3CuaiEhISon///Vdr1qxRnTp18jW3Zs2aaty4semjevXqhZQS/190dLRefvll1alTR3Z2djIYDCpVKm/vY7h27Zok6aeffrrt3NOnT6tPnz4qX768nJycFBAQoDfffFMZGRkWOxcAAFBynD59Wg0aNNDQoUN1+PBheXl5ycvLS4cPH9bQoUPVoEEDnT592toxAQAAAAAAgBKv2K5gtrMrtrVv5OKPP/7Q0qVL72ju1atXJUkpKSm5jjt//rwaN26sM2fOmNr+/PNPjR07Vn/++aeWLVt2R8cHAAAl16BBg/T333/r888/V9euXc361qxZo969e2vQoEHasGGDlRICAAAAAAAAtqHYFpgLom/fvrpw4YK8vb3VvXt3TZ8+XWXKlMl1TlxcnOLj483aoqOjJUlpaWn5vk333crHx0djx45V48aN9cYbb+jHH3+UpDx9/xwdHSVJtWvXVtmyZXOc+8Ybb5iKyytXrlT79u01btw4vf/++1q+fLmef/55s1ukAyg6Dg4O1o6AEqSwfrbyOrw7bd++Xa+88kqW4rIkhYaG6tChQ3r33XetkAwAAAAAAACwLTZVYHZyctKgQYP05JNPytXVVTt37tSsWbN04sSJ265WWbBggSZPnpxtX2JiomJjYwsjss257777NHjwYEmSvb29qT0v3z8nJydJUrly5WQwGHKcu337dkmSh4eHgoKClJKSotDQUL3//vuSpOXLl3NbdMBKfH19rR0BJUhh/WzldXh3KleunLy9vXPsL1++vMqVK1eEiQAAAAAAAADbZFMF5goVKmj+/Pmm7VatWsnHx0dhYWE6fPiw6tevn+PcsLAwhYaGmrVFR0erU6dO8vDwkI+PT6HltlW3ViRLytP379Z4R0dHswLz/597a8WbnZ2dqe+/RYq//vqLfy8AKAG4VsOS+vbtqxUrVujll1+Ws7OzWd+VK1f0wQcf6MUXX7RSOgAAAAAAAMB22FSBOTtdu3ZVWFiYfv7551wLzN7e3jmuenFwcOB2m3fgv0XivHz/bo03GAy5zq1fv76OHz+u+Ph4rVmzRh06dDCtXpakCxcu8O8FACUA12pYUoMGDfT1118rICBAvXv3Nt3N5Pjx41q1apXuvfde1atXT19++aXZvM6dOxdKnjNnzqhmzZq6evWqLl++LBcXF0mS0WjUjBkztHDhQiUkJOiRRx5RRESEGjRoUCg5AAAAAAAAAEuz+QLzf4uWsA1jx47Vxo0blZqaqp49e2bpp2ABAMDdp1u3bqavp0+fnqX/9OnT6t69u4xGo6nNYDAoIyOjUPKMHj1aLi4uunr1qln7zJkzNXXqVM2ePVsBAQGaO3eugoOD9ccff6h8+fKFkgUAAAAAAACwJJsvMK9du1aS1LBhQysngaU8/PDD2rZtmyZMmKAff/xRbm5uevrpp7VmzRolJCTovvvus3ZEAABQxL777jtrRzDZvXu3tmzZovHjx2v06NGm9uvXr2vmzJl69dVXNXjwYElSkyZN5Ofnp/nz52vatGnWigwAAAAAAADkWbEtMKekpCgyMlLSzVsMXrp0yVQsbtu2rZydnVW9enW1bNlSy5YtkySFh4fr8uXLatasmVxdXbV7927Nnj1bnTt3Vr169ax2LrC85s2ba/fu3abtY8eOaeHChZKkli1bWisWAACwkuLy8z8jI0NDhgzRxIkT5ebmZta3b98+Xbp0Sc8884yprWzZsgoJCdHmzZspMAMAAAAAAKBEKLYF5ri4OIWGhpq13do+deqU/Pz8lJ6ebnZbw4CAAM2ZM0dLly7VtWvXVLlyZY0ePVoTJkwo0ux3s7S0NCUnJ5u+viUhIUGSVK5cOZ07d07+/v6SpEmTJik8PFySlJmZaZr331ua/3euk5OTEhIS9NVXX+nJJ5+Uu7u7fvnlFw0YMMA0pm/fvoV7kgAAoFiIi4uTm5ubHB0dbzs2Pj5ex44dU4sWLQo106JFi3Tjxg0NGjRIH3/8sVlfVFSU7O3tdf/995u116pVS6tXr851v3FxcYqPjzdri46OlnTzd6f//t5lCTxyBPll6dcgYGlc15BfhXVd47UIAAAAW1BsC8x+fn5mz8jLTkxMjNl2t27dzJ6/h6L3/fff67HHHjNry8jIkJeXlyTpgw8+UKtWrbKde+nSJUnS/v37c5zbp08fXbx4Mdsisr29vd5//32eXwgAwF2iQoUK+vDDD9WjRw9JUnJyspo0aaIPPvhAjRo1Mhu7detW9erVq9CeuSxJiYmJev311/XRRx9l+8fjpKQkubi4yN7e3qzd3d1dKSkpSk1NzbFYvmDBAk2ePDnH48bGxhb8BP7D19fXovuD7bP0axCwNK5ryK/Cuq7xWgQAAIAtKLYFZiAn7u7u6tSpk3788UfFx8fLxcVFTZs21fjx49WkSRNrxwMAAEXk/78ZMT09XVFRUbp69apV8kyYMEGNGzdW27ZtLb7vsLCwLHf3iY6OVqdOneTh4SEfHx+LHxPID16DAGwN1zUAAAAgZxSYYVGtWrW67cpzKesfhCWZnlPYokUL7dq1K8e5Hh4eWrdu3R1nBAAAsLQjR45o+fLl2r17ty5evChJSklJkXRzZbW9vb3c3d115coVZWRkmK1iTkpKkrOzc663+vb29pa3t3e2fQ4ODtxuE1bHaxCAreG6BgAAAOSMAjMAAABQQMePH1daWlq2d1Px9fXViy++qB49eigjI0PR0dGqWbOmqT8qKkoBAQFFGRcAAAAAAAC4YxSYAQAAgAIKDAzUd999Z9a2ZcsWzZo1S5GRkapataqqVKkiV1dXrVmzRq+99pqkm6ucN23apH79+lkjNgAAAAAAAJBvFJgBAABQYl29elUXLlyQJNPny5cvm76+5cqVK4Waw9PTU61atTJri4mJkSQ1b95cLi4ukqRx48Zp6tSpcnd3V0BAgObOnavMzEwNGTKkUPMBAAAAAAAAlkKBGQAAACXWgAEDNGDAALO2zp07ZxlnNBplMBiKKlaOxo0bp8zMTM2YMUOJiYl6+OGH9e2338rHx8fa0QAAAAAAAIA8ocAMAACAEmnSpEnWjpCrPn36qE+fPmZtBoNBEyZM0IQJE6wTCgAAAAAAACggCswAAAAokYp7gRkAAAAAAACwRXbWDgAAAAAAAAAAAAAAKBkoMAMAAAAAAAAAAAAA8oQCMwAAAAAAAAAAAAAgTygwAwAAAAAAAAAAAADyhAIzAAAAAAAAAAAAACBPKDADAAAAAAAAAAAAAPKklLUDAAAAAJa2a9cuffzxxzpz5ozKly+vZ599Vk8++aS1YwEAAAAAAAAlHiuYAQAAYFMWL16sdu3aKTU1VfXr19eFCxfUrl07vfXWW9aOBgAAAAAAAJR4rGAGAABAiXT58mWVK1cuS/vbb7+tTz/9VCEhIaa28ePHa968eRo5cmRRRgQAAAAAAABsDiuYAQAAUCJVr15dy5Yty9NYg8Egg8FQyIkAAAAAAAAA28cKZgAAAJRICxcu1OjRo7VgwQJFRESoWbNmkqShQ4eqR48eCg0NVcWKFRUVFaX169frjTfesHJiAAAAAAAAoORjBTMAAABKpM6dO+vo0aN6+umn1bp1a3Xr1k2nT5/WwIEDtW7dOtnZ2enQoUMqV66cNmzYoDFjxlg7MgAAAAAAAFDisYIZAAAAJZaTk5Nee+019e3bV2PGjFFAQIBGjRqlsWPHKjg42NrxAAAAAAAAAJvDCmYAAACUeJUqVdLHH3+srVu36uuvv1bNmjX16aefWjsWAAAAAAAAYHNYwQwAAIAS659//tE333yjlJQUNWrUSE2bNtUPP/yg5cuXa8SIEZo/f74iIiLUsGFDa0cFAAAAAAAAbAIrmAEAAFAiffXVVwoICNDMmTO1atUqBQYGatSoUTIYDHrxxRf1119/qUmTJgoMDNQLL7yguLg4a0cGAAAAAAAASjwKzAAAACiRxo4dq65du+rEiRP6+eeftXLlSs2bN09nzpyRJJUrV05z5szR4cOHFRsbq/vvv9/KiQEAAAAAAICSjwIzAAAASqTTp0+rWbNmpu1mzZrJaDTq7NmzZuNq1Kihr7/+Wp999llRRwQAAAAAAABsDs9gtqLUtAw5OthbO0axYTAYzD7jf3itAACQVWBgoCIiIlS3bl25ublp+vTpuvfee1WnTp1sx7dp06aIEwIAAAAAAAC2hwKzFTk62Ctk5AZrxyg2fj+RYPrM98Xcprc6WjsCAADFzvvvv69evXqpRYsWMhqNqlatmtasWSNnZ2drRwMAAAAAAABsFgVmAAAAlEgVK1bUtm3bdP36dV2/fl1ubm7WjgQAAAAAAADYPArMAAAAKNFKly6t0qVLWzsGAAAAAAAAcFews3YAAAAAAAAAAAAAAEDJQIEZAAAAAAAAAAAAAJAnFJgBAAAAAAAAAAAAAHlCgRkAAAAAAAAAAAAAkCcUmAEAAAAAAAAAAAAAeUKBGQAAAAAAAAAAAACQJxSYAQAAAAAAAAAAAAB5QoEZAAAAAAAAAAAAAJAnFJgBAAAAAAAAAAAAAHlCgRkAAAAAAAAAAAAAkCcUmAEAAAAAAAAAAAAAeVJsC8zR0dHq37+/6tWrJ3t7e7Vq1SpP85KTk9W3b1+5u7vrnnvuUc+ePZWYmFi4YQEAAAAAAAAAAADgLlDK2gFycuTIEUVGRqpx48ZKS0vL87xnnnlGf/31l5YuXSo7OzuNHTtWnTp10p49ewoxLQAAAAAAAAAAAADYvmJbYA4JCVHHjh0lSV27dlVCQsJt5+zfv19bt27Vrl271KJFC0lSpUqV1KhRI23btk3BwcGFmhkAAAAAAAAAAAAAbFmxvUW2nV3+o23evFk+Pj6m4rIkPfroo/L399fmzZstGQ8AAAAAAAAAAAAA7jrFdgXznYiKilJAQECW9lq1aikqKirXuXFxcYqPjzdri46OliSlpaXl6zbdeeXg4GDxfcJ2FcZrELA0rmvIj8K6rvE6BAAAAAAAAIDCY1MF5qSkJLm5uWVpd3d318mTJ3Odu2DBAk2ePDnbvsTERMXGxloiohlfX1+L7xO2qzBeg4ClcV1DfhTWdY3XIQAAAAAAAAAUHpsqMBdEWFiYQkNDzdqio6PVqVMneXh4yMfHx0rJgJt4DQKwNVzXAAAAAAAAAKDksakCs7u7e5bbXEs3Vza7u7vnOtfb21ve3t7Z9jk4OHC7TVgdr0EAtobrGgAAAAAAAACUPHbWDmBJAQEB2T5rOadnMwMAAAAAAAAAAAAA8s6mCsxt2rTR+fPntXfvXlPbTz/9pJMnT6pNmzZWTAYAAAAAAAAAxdOaNWvUoUMHVapUSS4uLmrYsKE+/fRTa8cCAADFVLG9RXZKSooiIyMlSWfOnNGlS5e0du1aSVLbtm3l7Oys6tWrq2XLllq2bJkkqUmTJnryySfVq1cvzZkzR3Z2dho7dqwCAwMVHBxstXMBAAAAAAAAgOJq7ty58vf317x58+Tp6anIyEj16NFDCQkJGjJkiLXjAQCAYqbYFpjj4uIUGhpq1nZr+9SpU/Lz81N6eroyMjLMxqxevVqvvPKKXnjhBWVmZqp9+/aKiIgostwAAAAAAAAAUJJs2rRJnp6epu2goCCdPXtWc+fOpcAMAACyKLYFZj8/PxmNxlzHxMTEZGlzc3PTBx98oA8++KCQkgEAAAAAAACA7fhvcfmWBx98UF988YUV0gAAgOKu2BaYAQAAAAAAAADWsX//ftWoUeO24+Li4hQfH2/WFh0dLUlKS0tTWlqaRXM5ODhYdH/IG0v/OwKFhWtE0eP6YBvy+98OBWYAAAAAAAAAgMn27du1fv16LV++/LZjFyxYoMmTJ2fbl5iYqNjYWItm8/X1tej+kDfx8fGyt7e3dgzgtrhGFD2uD7Yhv//tUGAGAAAAAAAAAEi6+VjCHj16qGPHjurTp89tx4eFhSk0NNSsLTo6Wp06dZKHh4d8fHwKKSmKkpeXFytDAWSL68PdiQIzAAAAAAAAAEAXLlxQmzZtVKVKFX388cd5muPt7S1vb+9s+xwcHCg62Aj+LQHkhOvD3cnO2gEAAAAAAAAAANaVkpKi9u3bKzU1VV999ZWcnZ2tHQkAABRTrGAGAAAAAAAAgLtYenq6QkNDdfz4ce3bty/HFckAAAASBWYAAAAAAAAAuKuFhYUpMjJS77zzjhITE5WYmGjqe/DBB+Xk5GTFdAAAoLihwAwAAAAAAAAAd7GtW7dKkoYNG5al79SpU/Lz8yviRAAAoDijwAwAAAAAAAAAd7GYmBhrRwAAACWInbUDAAAAAAAAAAAAAABKBgrMAAAAAAAAAAAAAIA8ocAMAAAAAAAAAAAAAMgTCswAAAAAAAAAAAAAgDyhwAwAAAAAAAAAAAAAyBMKzAAAAAAAAAAAAACAPKHADAAAAAAAAAAAAADIEwrMAAAAAAAAAAAAAIA8ocAMAAAAAAAAAAAAAMgTCswAAABAAa1Zs0YdOnRQpUqV5OLiooYNG+rTTz/NMu7999/X/fffr9KlS6thw4bavn27FdICAAAAAAAAd44CMwAAAFBAc+fOlYuLi+bNm6eNGzfqscceU48ePfTuu++axnz66acaMGCAevXqpc2bN6tOnTpq3769/vjjDysmBwAAAAAAAPKnlLUDAAAAACXdpk2b5OnpadoOCgrS2bNnNXfuXA0ZMkSSFB4ert69e+v111+XJLVs2VK//PKLZs6cqY8++sgquQEAAAAAAID8YgUzAAAAUED/LS7f8uCDD+rs2bOSpJMnT+qvv/7SM888Y+q3s7NTaGioNm/eXGQ5AQAAAAAAgIJiBTMAAABQCPbv368aNWpIkqKioiRJAQEBZmNq1aqlCxcuKD4+Xl5eXjnuKy4uTvHx8WZt0dHRkqS0tDSlpaVZMrocHBwsuj/YPku/BgFL47qG/Cqs6xqvRQAAANgCCswAAACAhW3fvl3r16/X8uXLJUlJSUmSJDc3N7Nx7u7upv7cCswLFizQ5MmTs+1LTExUbGysBVL/j6+vr0X3B9tn6dcgYGlc15BfhXVd47UIAAAAW0CBGQAAALCgmJgY9ejRQx07dlSfPn0sss+wsDCFhoaatUVHR6tTp07y8PCQj4+PRY4D3ClegwBsDdc1AAAAIGcUmAEAAAALuXDhgtq0aaMqVaro448/NrXfWqmcnJxstor51srmW/058fb2lre3d7Z9Dg4O3G4TVsdrEICt4boGAAAA5MzO2gEAAAAAW5CSkqL27dsrNTVVX331lZydnU19t569fOtZzLdERUXp3nvvzfX22AAAAAAAAEBxQoEZAAAAKKD09HSFhobq+PHj2rJlS5bVxlWrVlWNGjW0Zs0aU1tmZqbWrFmjNm3aFHVcAAAAAAAA4I5xi2wAAACggMLCwhQZGal33nlHiYmJSkxMNPU9+OCDcnJyUnh4uJ577jn5+fmpWbNmWrlypY4fP65PPvnEiskBAAAAAACA/KHADAAAABTQ1q1bJUnDhg3L0nfq1Cn5+fmpe/fuunLlimbNmqWpU6eqTp06+uqrr1S3bt2ijgsAAAAAAADcMQrMAAAAQAHFxMTkadzLL7+sl19+uXDDAAAAAAAAAIWIZzADAAAAAAAAAAAAAPKEAjMAAAAAAAAAAAAAIE8oMAMAAAAAAAAAAAAA8oQCMwAAAAAAAAAAAAAgTygwAwAAAAAAAAAAAADyhAIzAAAAAAAAAAAAACBPKDADAAAAAAAAAAAAAPKEAjMAAAAAAAAAAAAAIE8oMAMAAAAAAAAAAAAA8oQCMwAAAAAAAAAAAAAgT4p1gfno0aN6/PHH5ezsrIoVK2rixInKyMjIdU5MTIwMBkOWj27duhVRagAAAAAAAAAAAACwTaWsHSAnSUlJCg4OVu3atbVhwwadOHFCI0eOVGZmpqZNm3bb+XPmzFGzZs1M256enoUZFwAAAAAAAAAAAABsXrEtMC9atEjXrl3Tl19+KVdXVz3xxBO6dOmSwsPDNWbMGLm6uuY6v2bNmmrcuHERpQUAAAAAAAAAAAAA21dsb5G9efNmPfXUU2aF5G7duunatWvatWuXFZMBAAAAAAAAAAAAwN2p2K5gjoqKUlBQkFlb5cqV5ezsrKioKIWEhOQ6v2/fvrpw4YK8vb3VvXt3TZ8+XWXKlMlxfFxcnOLj483aoqOjJUlpaWlKS0u7wzPJmYODg8X3CdtVGK9BwNK4riE/Cuu6xusQAAAAAAAAAApPsS0wJyUlyc3NLUu7u7u7kpKScpzn5OSkQYMG6cknn5Srq6t27typWbNm6cSJE9qwYUOO8xYsWKDJkydn25eYmKjY2Nh8n8Pt+Pr6WnyfsF2F8RoELI3rGvKjsK5rvA4BAAAAAAAAoPAU2wLznapQoYLmz59v2m7VqpV8fHwUFhamw4cPq379+tnOCwsLU2hoqFlbdHS0OnXqJA8PD/n4+BRqbuB2eA0CsDVc1wAAAAAAAACg5Cm2BWZ3d3clJydnaU9KSpK7u3u+9tW1a1eFhYXp559/zrHA7O3tLW9v72z7HBwcuN0mrI7XIABbw3UNAAAAAAAAAEoeO2sHyElAQICioqLM2v7991+lpKQoICAgX/syGAxmnwEAAAAAAAAAAAAA+VdsC8xt2rTRN998o8uXL5vaVq9erTJlyqhly5b52tfatWslSQ0bNrRoRgAAAAAAAAAAAAC4mxTbW2QPGDBAERER6ty5s8aOHauTJ08qPDxcI0aMkKurq2lc9erV1bJlSy1btkySFB4ersuXL6tZs2ZydXXV7t27NXv2bHXu3Fn16tWz1ukAAAAAAAAAAAAAQIlXbAvM7u7u2r59uwYPHqyQkBC5ubnplVdeUXh4uNm49PR0ZWRkmLYDAgI0Z84cLV26VNeuXVPlypU1evRoTZgwoYjPAAAAAAAAAAAAAABsS7EtMEtS7dq1tWPHjlzHxMTEmG1369ZN3bp1K8RUAAAAAAAAAAAAAHB3KrbPYAYAAAAAAAAAAAAAFC8UmAEAAAAAAAAAAAAAeUKBGQAAAAAAAAAAAACQJxSYAQAAAAAAAAAAAAB5QoEZAAAAAAAAAAAAAJAnFJgBAAAAAAAAAAAAAHlCgRkAAAAAAAAAAAAAkCcUmAEAAAAAAAAAAAAAeUKBGQAAAAAAAAAAAACQJxSYAQAAAAAAAAAAAAB5QoEZAAAAAAAAAAAAAJAnFJgBAAAAAAAAAAAAAHlCgRkAAAAAAAAAAAAAkCcUmAEAAAAAAAAAAAAAeUKBGQAAAAAAAAAAAACQJxSYAQAAAAAAAAAAAAB5QoEZAAAAAAAAAAAAAJAnFJgBAAAAAAAAAAAAAHlCgRkAAAAAAAAAAABAiZKZmamZM2fq/vvvl6OjoypUqKABAwbo4sWLOc45ePCgGjduLA8PDzk4OMjLy0stWrTQ+vXrzcb5+fnJYDBk+Zg/f37hnlQJUcraAQAAAAAAAAAAAAAgP0aMGKF33nlH5cqVU48ePbR7924tXrxYv/76q77//nvZ29tnmXP+/HnZ2dmpQ4cOcnJy0tatW7Vnzx59//33+vXXX/XAAw+Yje/bt69cXV1N2w0aNCjs0yoRKDADAAAAAAAAAAAAKDHi4+P13nvvSZLefPNNDRgwQMeOHVPt2rV18OBBff311+rQoUOWeR07dlTHjh1N2z/99JMeeeQRZWZmKjo6OkuBeeLEifLz8yvUcymJuEU2AAAAAAAAAAAAgBLjhx9+UHp6uiSpcePGkqRatWrpnnvukSTt3bs3x7nXrl3T8OHD1b9/fz3zzDOSpBYtWqh169ZZxj700EMqU6aMatasqddff11Xr1619KmUSKxgBgAAAAAAAAAAAFBiJCUlmb4uV66c6WsXFxclJyeb9f9/N27c0DvvvGPavueee0y3zL7Fzc1NDzzwgHx9ffX3339ry5YtmjZtmv766y+tXr3awmdT8lBgBgAAAAAAAAAAAFBiuLm5mb6+fPlylq/d3d1znWs0GnX16lV9/fXX6t69u0aNGqVy5cqpX79+kqRffvlFBoPBNGfMmDGaPXu2vvjiC6WkpMjZ2dnCZ1SycItsAAAAAAAAAAAAACVGo0aNVKrUzXW0Bw4ckCQdO3ZMly5dkiQ1a9ZMycnJioqKUlRUlGlecnKy6euyZcsqJCREZcuWlXSzqCxJiYmJSkhIyPa4mZmZSk1NtfwJlTCsYAYAAAAAAAAAAABQYnh5eWngwIF69913NWbMGB04cEC7d++WJD388MNq166dPvroI/Xt21eSZDQaJUlPP/20UlJSVKtWLTk4OOi7774zrXpu166dJOn333/XU089pZYtW6pq1ar6559/tOX/2Lvv8Ciq/Y/jn81m00gCSUihd+m99w6C1CsoRQRFpYuoyLUgIBYUrooFr14RLCCoIKKCIl0EpCrSe5UWCAmQvpnfH/wyZtNYQpJNwvv1PPvAzpw5c+bsZve75ztz5qefJEl9+vRxuHr6TkWCGQAAAAAAAAAAAEC+8tZbbyksLEyffPKJ5s+fr4CAAD366KOaNm2aeXVzau3atdOXX35pTnVdpEgRdezYUWPHjjUTzBUrVtTAgQP166+/6rfffpPValXNmjX14IMPavTo0bl5iHkWCWYAAAAAAAAAAAAA+YrVatVzzz2n5557Lt31Q4YM0ZAhQxyWvfDCC3rhhRcyrbdkyZL65JNPsquZBRIJZgAAAAAAAAAAkOckJSXpjTfe0OzZs3XixAkFBQWpZ8+emjZtWoZT1MbExGjQoEHasWOHjh07JkkaPHiw5s6dm275LVu2qGXLluY9VSMiIpj+FnCSPS5abklJsifGubopdw43N1k9fVzdChLMAAAAAAAAAAAg73nyySc1c+ZM+fn5acCAAVq/fr0+/PBD/fHHH+a0tanFx8dr06ZNqlOnjqKionTp0qUM6w8PD1ffvn2VlJSUk4cBFFxJSToz59+yWCyubskdo/iQ11zdBEmSm6sbAAAAAAAAAAAAkNLFixf1/vvvS5LeeOMNzZ07Vz/++KMk6ffffzf/n1rhwoV15swZ/fjjjypZsmSG9SclJWnAgAG6evVqhtPrAgDSR4IZAAAAAAAAAADkKVu2bFFiYqIkqUmTJpKkqlWrqnDhwpKkDRs23Fb9kyZN0qpVqzRv3jyVK1fu9hoLAHcYEswAAAAAAAAAACBPiYiIMP/v5+dn/t/X1zfN+lv1448/6pVXXtGLL76oLl26ZL2RAHCHIsEMAAAAAAAAAADylCJFipj/v3r1apr/BwQEZLnujz/+WBaLRVu2bFG3bt309ttvm+v69eunVatWZbluALgTuLu6AQAA5Hd3v/NLhutOR0RLknadiciw3E+Pd8yRdgEAAAAAAORXjRs3lru7uxITE7V582bVqVNH+/btU1RUlCSpefPmioyM1NmzZyVJVapUcbpuwzCUlJSkZcuWpVn3888/q1+/ftlzEABQQHEFMwAAOcjPy6ZAHw/5edlc3RQAAAAAAIB8Izg4WCNGjJAkPfPMMxoyZIjuueceSVKDBg10zz336Ntvv1XVqlVVtWpVh22HDBmiIUOG6OTJk5Ju3K95yJAhevrppyVJS5YskWEY5mPOnDnmthERERoyZEguHCEA5F9cwQwAwG3iCmQAAAAAAIDs99ZbbyksLEyffPKJ5s+fr4CAAD366KOaNm2a3N0zTm98+umnDs+PHDmiI0eOqEyZMpoxY0ZONxsACjyuYAYAAAAAAAAAAHmO1WrVc889p8OHDys+Pl7nz5/XRx99pMDAQEk3rlROvgo5pZRXJ6d8HD9+PN39pKwn5b2fAQDpI8EMAAAAAAAAAAAAAHAKU2QjV639dEyG62IiL0iSIs8dzrBcm8Hv5ki7AAAAAAAAAABpRccmyJ5kKC4h3tVNuSO4uVnk42VzdTMAIFMkmJFnuHsWktXmKYsbb0sAAAAAAAAAyAuSkgw9PXO9LBZXt+TOMOPxVq5uAgDcVJ7O5O3du1djxozRpk2bVKRIET3yyCOaNGmSrFZrpttFRkbqiSee0JIlS5SUlKRu3brpnXfeUVBQUC61HBnhCmQAAHCny2qMCwAAAOQk4lQAAOCsPJtgjoiIUIcOHVStWjV99913OnLkiJ566iklJSXp5ZdfznTb++67TwcPHtTHH38sNzc3TZgwQb169dKvv/6aS60HAAAA0rqdGBcAAADIKcSpAADgVuTZBPN///tfxcTEaPHixfL391fHjh0VFRWlyZMn65lnnpG/v3+6223atEkrVqzQunXr1KrVjakkSpQoocaNG2vlypXq0KFDbh4GAAAAYMpqjAsAAADkJOJUAABwK9xc3YCMLF++XJ07d3YIXvr166eYmBitW7cu0+1CQ0PN5LIkNWrUSOXKldPy5ctztM0AAABAZrIa4wIAAAA5iTgVAADcijx7BfP+/fvVrl07h2WlS5eWj4+P9u/fr+7du2e4XZUqVdIsr1q1qvbv35/h/i5cuKCLFy86LNu7d69ZZ0JCwq0ewk3ZbDZdDT+Z7fWi4NmzZ0+OvAeB7Gaz2XTqfJSrm4F8ICYHP9dsNpsqVKggLy+vHKkfuB1ZjXFzO1YlTsWtIFZFfkCciltBrIo7UVbjVIlY9U6wb+9eXTp3TBaLxdVNuSPs3VtUHnk2c5P3Efflrmt79+n835fEp0Puidi7T0lWW7bXe6txap79mIqIiFCRIkXSLA8ICFBERESWtjt69GiG282aNUtTpkxJd12fPn1u2l4gJ9X4zNUtAIBs9m6NHK1+9+7dql69eo7uA8iKrMa4xKrIy4hVARQ4xKq4A2U1TpWIVe8EjYj3ctU3M13dAuAWvLvS1S2487yyIMeqvpU4Nc8mmHPbyJEj1bdvX4dlUVFROnjwoGrWrClPT08XtezOcfjwYfXq1UtLlixRxYoVXd0cAMgWfLa5RoUKFVzdBCBbEau6Hp/nAAoaPtdch1gVBQ2xasHG9wWAjPD5UPDcSpyaZxPMAQEBioyMTLM8IiJCAQEBmW6XekoWZ7YLCQlRSEhImuVNmzZ1ssXILhUrVuRMXgAFDp9tAKSsx7jEqnkHn+cACho+1wBIWY9TJWLVOwXfFwAywufDncnN1Q3ISJUqVdLcM/nUqVOKjo5O9x7LmW0nZXxvZgAAACC3ZDXGBQAAAHIScSoAALgVeTbB3KVLF/3888+6evWquWzhwoXy9vZW69atM93u3Llz2rBhg7ls27ZtOnr0qLp06ZKjbQYAAAAyk9UYFwAAAMhJxKkAAOBW5NkE8/Dhw+Xp6al//etfWrlypT766CNNnjxZTz75pPz9/c1yFStW1NChQ83nTZs2VadOnfTggw9q8eLFWrJkiQYOHKgWLVqoQ4cOrjgUAAAAQJLzMS4AAACQm4hTAQDArcjT92BetWqVRo8ere7du6tIkSIaN26cJk+e7FAuMTFRdrvdYdnChQs1btw4Pfzww0pKSlK3bt30zjvv5GLrkRXBwcGaNGmSgoODXd0UAMg2fLYBSMnZGBd5D5/nAAoaPtcApESciozwfQEgI3w+3NkshmEYrm4EAAAAAAAAAAAAACDvy7NTZAMAAAAAAAAAAAAA8hYSzAAAAAAAAAAAAAAAp5BgBgAAAAAAAAAAAAA4hQQzAAAAAAAAAAAAAMApJJiRrSZPniyLxWI+fHx8VLNmTX300UeubhoAZJu5c+eqfv368vPzU0BAgOrWrasnn3zSoUzKz8KUjw0bNmS4LuXj+PHjrjk4ACigiFMB3CmIVQEAKREHA7hVxJNwhrurG4CCp3Dhwvrpp58kSdevX9f333+vYcOGydfXVwMGDHBx6wDg9rz22muaOHGinnnmGU2bNk2xsbHavn27vvjiC7355psOZZ966in16dPHYVnVqlW1adMm8/nRo0c1cOBAvf/++6pXr565vFixYjl7IABwByJOBVDQEasCANJDHAzAWcSTcJbFMAzD1Y1AwTF58mS99957Cg8Pd1jeqFEjlS1bVl999ZWLWgYA2aNEiRLq1auX3n//fYflhmHIYrGYzy0Wi959912NHj060/p2796tmjVras2aNWrTpk1ONBkAIOJUAHcGYlUAQGrEwQBuBfEknMUU2cgVfn5+SkhIkHTjLLnRo0ercuXK8vHxUbly5TRq1ChFRYb5Yz4AAQAASURBVEU5bDN79mxVq1ZN3t7eKlq0qFq3bq09e/aY62NjY/XMM8+oVKlS8vT0VO3atbVs2bJcPS4Ad54rV64oLCwszfKUARYAIP8gTgVQkBCrAgCcRRwMID3Ek3AWU2QjRyQmJkqSoqOjtXTpUq1bt06ffPKJucxut+uVV15RcHCwTp06pVdeeUV9+/bVzz//LElav369hg8frpdeeklNmzZVVFSUNm3apMjISHMfffr00ZYtWzRlyhRVqFBBX331lXr06KFt27apTp06uX7MAO4M9erV07vvvqvSpUurW7duCgoKyrBsUlKS+Xko3QjErFZrbjQTAJAB4lQABRmxKgAgI8TBAJxBPAmnGUA2mjRpkiEpzePxxx/PcJuEhARjw4YNhiTjxIkThmEYxvTp04169epluM3KlSsNScbatWsdlrds2dLo06dP9hwMAKTjzz//NMqVK2dIMiwWi1GtWjVj4sSJRmRkpEO59D4Lmzdvnqa+v/76y5BkrFmzJpeOAADuTMSpAO4ExKoAgNSIgwHcCuJJOIspspHtChcurK1bt2rr1q3asGGDZs6cqU8//VRTpkwxy3z++eeqW7eufH19ZbPZ1KJFC0nSwYMHJUl16tTRzp07NW7cOK1fv17x8fEO+1i5cqXCwsLUvHlzJSYmmo/27dtr27ZtuXewAO44tWrV0r59+7R06VKNHDlShmFo6tSpatCgga5du+ZQdvz48ebn4datWzV79mwXtRoAIBGnAij4iFUBAOkhDgbgLOJJOIspspHt3N3d1aBBA/N5clDx7LPPasyYMVq3bp0efPBBjRgxQq+++qoCAwN19uxZ9e7dW7GxsZKkDh06aM6cOXrnnXc0c+ZM+fr6atCgQXrjjTdUqFAhhYeH69y5c7LZbGn2zxQMAHKap6enunfvru7du0u6cQ+iRx55RLNnz9bYsWPNcqVLl3b4PAQAuBZxKoA7AbEqACA14mAAt4J4Es4gwYxcUbVqVcXHx+vIkSP6+uuv1bhxY82aNctcv27dujTbDB48WIMHD9bFixe1ePFijRs3Tn5+fpo2bZoCAwNVokQJLVmyJBePAgDSN3ToUD3zzDPav3+/q5sCALhFxKkACjpiVQBAeoiDATiLeBLpIcGMXLF7925JUqlSpRQTEyNPT0+H9fPmzctw2+DgYA0bNkyLFy/W3r17JUnt27fXf/7zH/n6+qpKlSo513AASOXChQsKCQlxWHbx4kVFRkYqNDTURa0CAGQVcSqAgoRYFQDgLOJgAOkhnoSzSDAj2yUmJmrz5s2SpPj4eG3fvl0vv/yyevbsqbCwMHXs2FGjRo3SK6+8osaNG2vZsmVatWqVQx2TJk3S5cuX1aZNGxUtWlQ7d+7UunXrNG3aNElSx44d1blzZ3Xs2FETJkxQ9erVFRUVpT/++EOxsbF67bXXcv24AdwZatasqZ49e6pTp04KCQnRiRMnNGPGDPn4+Gjw4MGubh4AIBPEqQAKOmJVAEB6iIMBOIt4Es4iwYxsFxkZqaZNm0qSbDabypQpo+HDh+uFF16QJA0bNkxHjx7VzJkzFRsbq44dO2r+/Plq0qSJWUfDhg311ltvacGCBbp69arKlCmjyZMnm/P7WywWLV68WK+++qrefvttnTx5UoGBgapTp47GjBmT+wcN4I7x4osv6rvvvtPjjz+uy5cvKywsTM2aNdPChQtVrlw5VzcPAJAJ4lQABR2xKgAgPcTBAJxFPAlnWQzDMFzdCAAAAAAAAAAAAABA3ufm6gYAAAAAAAAAAAAAAPIHEswAAAAAAAAAAAAAAKeQYAYAAAAAAAAAAAAAOIUEMwAAAAAAAAAAAADAKSSYAQAAAAAAAAAAAABOIcEMAAAAAAAAAAAAAHAKCWYAAAAAAAAAAAAAgFNIMAMAAAAAAAAAAAAAnEKCGQAAAAAAAAAAAADgFBLMAJCKxWLR5MmTb3m748ePy2KxaO7cudneJgAAAEAiVgUAAEDeRawK3DlIMAPIs+bOnSuLxSKLxaINGzakWW8YhkqVKiWLxaJu3bq5oIUAAAC4UxGrAgAAIK8iVgWQ00gwA8jzvLy8NH/+/DTL161bp9OnT8vT09MFrQIAAACIVQEAAJB3EasCyCkkmAHkeV27dtXXX3+txMREh+Xz589X/fr1FRYW5qKWAQAA4E5HrAoAAIC8ilgVQE4hwQwgz+vfv78uXbqkX375xVwWHx+vb775RgMGDEhT/vr163rqqadUqlQpeXp6qnLlypoxY4YMw3AoFxcXp3Hjxik4OFh+fn7q0aOHTp8+nW4bzpw5o4cfflihoaHy9PRU9erV9cknn2TvgQIAACDfIVYFAABAXkWsCiCnkGAGkOeVLVtWTZs21ZdffmkuW758uSIjI9WvXz+HsoZhqEePHnrrrbd09913680331TlypU1fvx4Pfnkkw5lH3nkEb399tvq1KmTpk2bJpvNpnvuuSfN/s+fP68mTZpo5cqVGj16tGbOnKmKFStq6NChevvtt3PkmAEAAJA/EKsCAAAgryJWBZBTSDADyBcGDBigJUuWKCYmRpI0b948tW7dWsWLF3cot3TpUq1evVpTp07V//73P40aNUpLly5Vnz59NHPmTB05ckSS9Oeff+qLL77QyJEjNW/ePI0aNUqLFi1SjRo10uz7+eefl91u186dOzVx4kQNHz5c3333nfr166fJkyebbQIAAMCdiVgVAAAAeRWxKoCcQIIZQL5w3333KSYmRj/88IOuXr2qH374Id1pXJYtWyar1arHH3/cYflTTz0lwzC0fPlys5ykNOWeeOIJh+eGYWjRokXq3r27DMNQeHi4+ejcubMiIyO1Y8eObDxSAAAA5DfEqgAAAMiriFUB5AR3VzcAAJwRHBysDh06aP78+YqOjpbdblefPn3SlDtx4oSKFy8uPz8/h+VVq1Y11yf/6+bmpgoVKjiUq1y5ssPzixcv6sqVK/roo4/00Ucfpdu2CxcuZPm4AAAAkP8RqwIAACCvIlYFkBNIMAPINwYMGKBHH31U586dU5cuXVSkSJEc32dSUpIk6YEHHtDgwYPTLVOrVq0cbwcAAADyNmJVAAAA5FXEqgCyGwlmAPlG7969NWzYMG3evFkLFy5Mt0yZMmW0cuVKXb161eFsu/3795vrk/9NSkrSkSNHHM6uO3DggEN9wcHB8vPzk91uV4cOHbL7kAAAAFBAEKsCAAAgryJWBZDduAczgHzD19dXH3zwgSZPnqzu3bunW6Zr166y2+167733HJa/9dZbslgs6tKliySZ/77zzjsO5d5++22H51arVffee68WLVqk3bt3p9nfxYsXs3o4AAAAKECIVQEAAJBXEasCyG5cwQwgX8loOpVk3bt3V9u2bfX888/r+PHjql27tlasWKHvvvtOTzzxhHlvkDp16qh///6aNWuWIiMj1axZM61atUqHDx9OU+e0adO0Zs0aNW7cWI8++qiqVaumy5cva8eOHVq5cqUuX76cI8cKAACA/IVYFQAAAHkVsSqA7ESCGUCB4ubmpqVLl+rFF1/UwoULNWfOHJUtW1bTp0/XU0895VD2k08+UXBwsObNm6clS5aoXbt2+vHHH1WqVCmHcqGhodqyZYte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EJmeWx0blhxfp/Rek+waH05PVuPPL7/8UnXq1JF04/X56aef9P7772vMmDGqV6+e6tevf9u/p7JjHDCrvyFza1z3Zn/b7u7uKlq0aIblk6U+qTu7fisiZxDJI1ft2bPH4SrdCxcuZPqDcvbs2Q5nOj3yyCMaNWqUJGn+/PmqW7eueU/WoKAg9e7d2yybPKiUcl8pnTt3LsvHkVL16tXN+4R16dLFbMOVK1c0ZswY854akhy+1Pz9/TVx4sRM6055VlL79u3NhPX69evN+9S1atVKzZo1k81mU0JCgmbOnGleSWyxWNSuXTuzjq+//tr8ELZYLPriiy/UvXt3+fn5ae/evapevbpTx5zePSJS93fyfaYzep5VN6s3ZTt8fX01dOhQ/ec//5Ekffjhhw5tHzJkSKb34ciK2bNnO3xxp76C3BUCAgJksVjMdiUPSmUmZb8k/whIljJYywmueN2clTow7dOnT6b3iEx5dmlK3G8ZAJzXoUMHHTx4UJLMQbInn3zyptul/sw+d+6cQ6yTOhbMaPAhs/s7ZTUxcivxTEYCAwPN+LZu3boOJ2qmlp0nvKXcb3rxdMplAQEBGdaTsl+z68rWUqVK6emnn5YkPfDAA2rSpInsdrvi4+P16KOP6o8//jAHUbMrLk5P6vfShAkTHAZTUsvKFbO38h5KniFmzJgxkqSPPvpIp06dMtffe++9Tt1/+1Z88803DgOMbdu2dVn8llLK9++txsTSjbjYx8dHUs7HxK543ZyV+vdFu3bt1KVLlwzLp76iORkxMQC41qVLl2S32x2SzFmJS1u2bKnDhw9r165d+vPPP3XkyBHt2rVL33//vex2u3755RdNnz5dL774YroxembPk8unN+6YnNROr92pt0/26KOP6q677srwWG52L92MJMeg48aNU7169cxx2+eff1733nuvypQpc9vtad++vTmWnNy/0o2T5kqWLKlWrVpp/vz5WrduncMMOSnHJg8ePKidO3eaz/v166fp06erePHicnNzU6NGjdJcLZ6ejL7DU75O6b0m2TU+nJ6sxp/VqlXTzp07deDAAe3YsUOHDx/W3r179d133ykmJkY7duzQhAkTHO7VfKuyI+ZxNv5PL35NKadi2Jv9bScmJjpclOXs7++8MAsSMkaCGbkq5dXLzli8eLEiIyPNH84DBw7U008/rZiYGB0/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s/3OmjXLcHd3z3B/VqvVeOeddxy2mTRpUobfkTfbX2ZSbte6des064cMGeJQ5vPPPzcMI+txsWEYxvjx49Pdrnr16maZ8PDwDPv5Zm1OT+o4r02bNobFYklTn4eHh7F8+fJ06zh69Kjh5ubmUH7atGlO7T+l1PFURg8vLy9j5syZabbPLM4yjJu/F262/c3q+OKLLwxvb+8M292zZ0+H8ql/22X0d5zZ33zqNvbt2zfdOu+55540x5Jdr1tKqf8e0+tDw7j574vJkyen+z5M/UgZc6f8TeXs+x8AkFbqz+jMHik/51N+j4eGhmYYr7Rr185ISEgwt8tovOfixYs33b+Pj4+xfft2s67r168bHTp0yHSb0qVLG/v373c45uXLl6cb+1osljTf1ym/e2JiYtKMA6f3KFOmjNP9n3qMMLW5c+c6rB86dGi2tOett95KU+7QoUPm+pCQEId1ffr0SVPHyJEj091frVq1jPr162f4PX2zGC3ZxIkT062/cOHCRr169bLU3zkZf97sN6bVak0zxu5MLOfsOGBG/Xo7Y+Kp/16TH8HBwUajRo0yfA3Onz9v+Pr6prvt119/fdO+tNvtxqBBgzLtz8DAQGPDhg0O+80sPnQm9ofruP4mSLhjpJySOvlq1/T4+Pho4MCB5vNt27Y5nB3eqlWrNGfLZDQ9WPHixbV582Y9/PDDCg4Olqenp6pXr6733nvPPJsmWXaeUZ363sqTJ082/9+wYUPt2bNHL7/8spo0aaIiRYrIarXKz89PNWrU0ODBg/Xll1+mO41H6itKks9Qk25MxZfyninu7u4O66Ubx7hhwwbdd999KlKkiLy8vFS7dm198sknevHFF2/nkCXdOEPq119/1dixY1W8eHF5eHioYsWKmjJlSrZdMf7iiy9q3rx5atiwoby9vVWkSBH17t1bv//+u8MZeSm1atXKYV3q+3VnlcVikc1mU2BgoKpWrapevXrpv//9r06ePKn77rvvtuvPbuPHj9f27dv12GOPqXLlyvLx8ZGnp6dKlCih7t2765577jHLenp6avXq1erfv78CAwPl6empunXrau7cueb0MFmxePFi3X///QoODr7pfVBy6nW7XRaLRf/73/+0cuVK9evXT2XLlpWnp6dsNpuKFSumdu3aafLkyVm+qgUAkL6hQ4fqxIkTev3119WhQweFhYXJ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yitOSAYAAAAAAABULBSYAQAAUO7FxcVd9bH7bm5uiouLK8VEAAAAAAAAQMVEgRkAUKqMRqPCwsLk6soqDQBKTtOmTbVgwQKdOXMmX19cXJwWLFigZs2aOSEZAAAAAAAAULHw7j4AoFQZDAa5GiRTknNnEroFVpPBtfDZjgDKlzlz5qh3795q2LChbr/9dtWvX1+SdOzYMa1evVpWq1Uff/yxk1MCAAAAAAAA5R8FZgBAqTOlnFfcO+OdmiH84TfkHnKDUzMAKDlRUVHatWuXnn32WX3xxRe6dOmSJMnLy0u9e/fWtGnTmMEMAACAcqdOnToyGAxF2sdgMOj48eMOSgQAAECBGQAAABVE06ZN9cUXX8hisSgxMVGSFBISIhcXVoUBAABA+dS5c+d8Beaff/5Zhw4dUpMmTdSoUSNJ0tGjR3X48GE1bdpUrVq1ckZUAABQiVBgBgAAQIXi4uIiT09P+fr6UlwGAABAubZ48WK77dWrV2v16tX65ptv1L17d7u+b775RnfffbemT59eigkBAEBlxDtuAAAAqBB+/vln9enTR97e3goKCtK3334rSUpKStKgQYO0bds25wYEAAAAium5557T2LFj8xWXJalnz5567LHHNGXKFCckAwAAlUmRZjCz5gcAAADKoh07dqhbt26qWbOm7r33Xr333nu2vuDgYKWmpmrRokXq0qWL80ICAAAAxXTs2DEFBQUV2h8UFMR7sQAAwOGKVGBmzQ8AAACURc8884waN26snTt3Kj093a7ALEldu3bVRx995KR0AAAAQMmoV6+ePvzwQz300EPy9fW160tPT9cHH3ygunXrOikdAACoLIpUYGbNDwAAAJRFP/30k2bMmCEPDw9lZGTk669Zs6bOnz/v0AyffvqpXnnlFf3++++qUqWKunfvrpkzZ6pGjRq2MVarVTNmzNDChQuVlJSk1q1ba968eWrZsqVDswEAAKBiePHFF3XXXXcpMjJSI0eOVP369SVdntn80UcfKT4+XitXrnRySgAAUNEVaw1m1vwAAABAWeDm5iaLxVJo/5kzZ/LN8ChJX375pYYNG6YOHTpozZo1mjVrlrZv367+/fvb5Zo5c6amT5+up556SmvXrpWvr6969Ojh8OI3AAAAKobBgwcrJiZGISEhevnll/Xggw/qwQcf1IwZMxQaGqqvvvpKgwcPdnZM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BSksLMwh53WmKzM3Q0JCmO3lBNx/5+L+O4/RaFRZmTPs6upaIV/fr6as3P/KeO/hWKmpqXbrH8fExKhnz5622cQ9e/Z06JIp/v7+2rJli/71r39p6NChcnd316BBgzRnzhy7cU8//bQsFotmzJih5ORk3XLLLfrmm2/4eQAAAMA1OXr0qF577bUCPyxvNBoVHR2tiRMnOiEZAKAssOTmKPPoj8o8vMPWlpdyXjl/HJZPkw7yadSeIjNKRLELzG+++aamTJmijIwMu3Xn/Pz89NJLL+mxxx4r1vEvXLigvn37qnbt2lq2bNlVxwYGBtpmJP5VSkqKAgMDr7pvaGhoobO63NzcKmwBymg0VujrK+u4/87F/XeOgtYodRaDwVDpvv5l5f5XxnsPx6pevbp+++03SdK5c+e0Z88ePfDAA7b+jIwM21rIjlK/fn3FxMRcdYzBYNDkyZM1efJkh2YBAABAxVSlShWdOnWq0P5Tp07J39+/9AIBAMqU3OQ4u+LyX2Ue3iG34FryrF63lFOhIipWgdnRa35kZWXptttuU25urr766it5e3tfdXxkZKT+/PNPZWZm2s2ePnLkiCIjI68rAwAAAMq+QYMG6c0331R2drZ27dolDw8P3X777bb+/fv3q25d/gEFAACA8q1///5688031apVKw0dOtSub/ny5Zo/f77uueceJ6UDAJSW8ePHa9++fXZtDRs21PCbaujC0T2F7lf1Qq7+88tZ/f777397jtjYWKWlpcnf31/169cvbuRCtWzZUm+88YbDjg/HKFaB2ZFrfuTl5Sk6OlrHjh3Tjh07rmnNyF69ekmSvvjiC917772SpLNnz+q7777TggULipwBAAAA5cOLL76oxMRELV26VAEBAVq8eLHtsdNpaWlatWqVxowZ4+SUAAAAQPHMnDlTP/74o+655x498cQTatCggSTp2LFjOn/+vCIjIzVz5kwnpwQAONq+ffv07bff2rV5e3ooJcyk5OTkQvcznPtDcX+cybfv1aSnp+vMmTPXnRUVU7EKzI5c82P06NGKiYnR3LlzlZycbPcDcdNNN8nDw0Pdu3eXJG3evFmSFB4eroceekjjx4+X1WpVSEiIpk6dqtq1a9sKzgAAAKh4fH19C11OxdfXV3FxcX/7NBwAAACgrAsJCdHevXu1aNEirVu3TqdPn5YkNWvWTE89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CuKPQbGyhl1wF2isbFCSdhn67FQAgKW7Hxw7DTXZL++vAzDkpsPSrWGNXBsRERERERERERERERER3RkcYCYY8rORfeRnAIBbv3/BscMgFKdewqVPZ6HoSizy447Crlmncvvl/XWgdHDZwgo+U96ElZtPuTrWPkGw9glSfy/JTFbP5dzj/mq6IiIiIiIiIiIiIiIiIiKqDhxgJhQnxgFGAwBA59MMAGDl7guNzhbGonwUJvxV4QBzfuxhAIDG1hGpWz5FUeJZaG3sYRfaAy69H4DGUldun8zfvgeMBli4NIB9i17VeFVEREREREREREREREREdKdpzB0AmZ+xME/9WaOzUX9WrKzLbb+eIS+z9P/sVBiL8mHXvDsM+dnIOvgD0nasLFdfn52GnD9K13117j6qwmm3iYiIiIiIiIiIiIiIiKj24gAzQaOzVX82FhVc+7m4sHS7tV2F+ylW1wajvcfPh+fwx+HYaQiA0umzb5R5YCNg0MPCyQMOrcLuROhEREREREREREREREREVIM4wEywahgE/O9u4qLLZwAAxamXIEX5AABr3xAYC/NQnHoJxamX1P2s/zeddkUUjelTS5+biZzjOwAAzt3ug6Ll7OxEREREREREREREREREdxsOMBO0to5wbD8IAJC2azVSNn2ApLWvAgB03k1gG9QBead/x6VPZ+HSp7PU/Rza9ofW3hUAkPj1K7j600fIjtpSuq3dQJNzZP3+I0RfDK2DKxza9KuJyyIiIiKqMevWrcOIESPg4+MDe3t7dOjQAV9//XW5ep999hmCgoJgbW2NDh06YOfOnWaIloiIiIiovLi4OEyfPh2tW7eGVqtFnz59zB0SVRONosDPyx4hjVzg52UPjaLc8eM28nKAf4OKz2Gh0aBTqCfu79MEw3sGIqCBwx2LgaheUzSwcPeFzicYFu6+gFLBEOD1dTz8YOHye7YEAABiRElEQVTuD51vCKybtofON6Ty/f7peanO4aNMAAC3AZPh0udBaO2ckHtyH6SkCA5tw9Fg/PxK10rW2jig4aSFsAvpBn3WVeRG74ela0O4D5kBl94PqPUMBTnIProNAODcbSQUC8sauSYiIiKimrJkyRLY29vjnXfewY8//oi+ffviwQcfxAcffKDW+frrrzFjxgxMnDgRW7duRYsWLTBs2DCcPHnSjJETEREREZU6deoU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IiIiqhIOMBMRERERERERERERERERUZVwgJmIiIiIiIiIiIiIiIiIiKqEA8xERERERERERERERERERFQlHGAmIiIiIiIiIiIiIiIiIqIq4QAzERERERERERERERERERFVCQeYiYiIiIiIiIiIiIiIiIioSjjATEREREREREREREREREREVcIBZiIiIiIiIiIiIiIiIiIiqhIOMBMRERERERERERERERERUZVwgJmIiIiIiIiIiIiIiIiIiKqEA8xERERERERERERERERERFQlHGAmIiIiIiIiIiIiIiIiIqIq4QAzERERERERERERERERERFVCQeYiYiIiIiIiIiIiIiIiIioSjjATERERERERERERFTPRUdHo3///rC1tUXDhg3x0ksvwWAwmDssqmYighK9ASJSpfLqPi8RVR8RgdFQUuHrvaJyopuxMHcARERERERERERERGQ+GRkZCA8PR2hoKH744QecPXsWzz33HIxGIxYuXGju8KgaFBbrcSklFydiryI9qxCuTtZoE+QBL1dbJKfnlyv39bSHtdU/H06o7Lx36vhEVJ6xuAjFaZdQcP5PGHLSoXVwhU1AK1g6e6EkM7lcuZWbLzRWOnOHTbUc37GJiIiIiIiIiIiI6rFPPvkEBQUF+O677+Do6IgBAwYgOzsbERERmDNnDhwdHc0dIt1BhcV6/PZHIvaduKyWJablITu3CE72OvwRlwqNRlHLT8WnoWcbH3Rv7f2PBoErO++dOj4RlWcsLkLe6QPIi/5NLdNnJMGYnw2NrSMKL5yEomjU8qKL0bAL7Q674G7mCpnuEpwim4iIiIiIiIiIiKge27p1KwYNGmQykDxu3DgUFBQgMjLSjJFRdbiUkmsyyAsAigJ4udrhuz1xKCzSl9tn34nLuJySe8fPeyePT0TlFaddMhlcBgAoCiycPZF18EcYiwvL7ZMX/RuK0y5Dq9XWUJR0N+LXgYiIiIiIiIiIiIjqsZiYGPTr18+kzN/fH7a2toiJicHw4cMr3TclJQVXr141KYuLiwMAlJSUoKSk5M4HTFXy3HPP4cSJEyZlzZo1g3foQBw6mWBS3rSRJw4VFyAjIwOiL0RRzlXk5pkO+OqzE5AYvR1nzpxRy8qOf+LECYSFhVUaS2Xn/bvjX69NmzZYvHhxpfsT1ScVvb5v1KxZM0xo74P000dMyp19m8CvKAq5GRmwKjHiUlYh8vLyTOq4phfDYDAA+PvX9z/F13btYGlpeUv1OcBMREREREREREREVI9lZGTA2dm5XLmLiwsyMjJuuu/SpUvx8ssvV7gtLS0NycnJdyJEug1RUVE4ePCgSZm1jS2KHK8iPS3dtLKfK66m56KkuAQFhRoUFRaUq3PhkjWSEi7h119/LXeurKysCsv/9rxVPD4AFBcX8/lE9D8Vvb5vZGdjjYwGeqSlpZmU23g3RmFmKopLioHCAhQWFJaroyRehJ2NNYC/f33/U3xt1w6+vr63VJ8DzERERERERERERER0W2bOnIkxY8aYlMXFxWHkyJFwc3ODl5eXmSKjTp06wcrKyqTM388X3r4eSMm8YVpcjQU8XO1xPikHNtY6aEps4OrmalKlka8HrLJ90bt3b7UsLi4OOTk5cHBwQNOmTSuNpdLz/s3xr9emTRs+n4j+p6LX9418/Pzh0tAHkpNqUq7TKrB2doP+6kVYWdvA2kaBm5ubSR0Xb38YcQUODg5/+/r+p/javjtxgJmIiIiIiIiIiIioHnNxcUFWVla58oyMDLi4uNx0X09PT3h6ela4zdLS8pan3KQ75/3336+wPO5SJiwcY0zKFAXoEOyFuMRC+HrYw7axd7n9JgwKQRNf0y8TlJSUIDk5GV5eXn/7WFd03r87PhFVrLLX940KE88i89cbBqIVBTZN2sEy9Rws3RrCrZFtuf2ce4/DpkfmVfn1TfWPxtwBEBEREREREREREZH5hISEICbGdOAvISEB+fn5CAkJMVNUVF18Pe3Rs42PSZkIkJyeh1F9msJaV/6+tJ5tfODjaX/Hz3snj09E5Vm5+cIutLtpoQj0mSlw6novNFbW5faxC+0BK7eKX6tEZXgHMxEREREREREREVE9NnjwYLz11lvqVMcAsHbtWtjY2CAsLMzM0dGdZm1lge6tvdGogQOOx15FenYhXB2t0TbIA56utmgT5FGu3MfTHtZW/2w44WbnvRPHJ6LyNFY62AV3g6W7PwrO/wFDTjq0Dq6wCWgNS2dP2AS0Kldu5eYDjZUOhpISc4dPtRjfsYmIiIiIiIiIiIjqsRkzZuD999/HqFGjMHfuXMTHxyMiIgLPPvssHB0dzR0eVQNrKws08XVGYx8n6A1GWGg1UBQFAOBga1VheXWfl4iqh8ZKB2vvxtA1CIQY9VA0FurrTmtjX2E50d/hADMRERERERER1XpGo2DD7lj8cugirmbkw8HWCl1aemPS0FDY21hi28EL+HbHaeTkF6NFY3c8ObYtXB1Lp/xLTs/Hk2/vxlMPtK10ak6qHNueqO5zcXHBzp078cQTT2D48OFwdnbGM888g4iICHOHRtVMURRYWmirXF7d5yWi6qMoChRt+bWUKysnuhmuwUxEREREREREtd5/fzyJVVv+QmZOEXq384WVpRY/HziPiGUHcCEpG0vXH4e1zgJdW3rjaEwy/vvjSQCAiOC9b46hQ4gnBzhvE9ueqH4IDQ3Frl27UFBQgMTERLzyyivQajkASEREROXxDmYiIiIiIiIiqtWycouwef85AMDDw0IxuHsgEpJzMPPNXTh9MQNxCZkwCjB5aCg6hTZAQkouzl3JBgD8uDceCSk5+L9J/cx5CXcttj0REREREd2IA8xEREREREREVKuduZgBg1EAAMGNXAEAfl4OsLO2QF6hHlHRydAowH9/PIVdhxMQfykTPdv64FJKDlZt+QvPT+gARzsrc17CXYttT0REREREN+IAMxERERERERHVarkFJerPNrprXRnWutJBTjsbS8wc3RZrd5zG4b+S0T7EC5OHtsAbq6LQvbU3Gvs44dUVv+N8YjYauNlhyvAWCGzoZI5Lueuw7YmIiIiI6EYcYCYiIiIiIiKiWs3OxlL9uaBIX+5nextLDOraCIO6NlK3rd1xGlczCxDxaFcsXHEI2XlFWPBIVyxd/wcWfv47/vviwJq7gLsY256IiIiIiG6kMXcAREREREREREQ3E+zvAq1GAQCcvpAOAEhIzkF+YekgZ/NAV5P6565k4ZvtZ/DEmDawt7VC3KVM+Hs5wtfTAU18nZCSUYCs3KKavYi7FNueiIiIiIhuxDuYiYiIiIiIiKhWc7LXYXD3APy07xxW/BSNmAsZOBWfBgBo6ueMTs291LoleiPe+foo+rT3RafQBgBK1wyOik7C+2uP4bc/E+Fsr+O6wFXEticiIiIiohvxDmYiIiIiIiIiqvUeubcV/jW4OZztdfj12CUUFRswqGsj/GdaN2i117o3vt4eg5y8Yjxyb0u1bNYD7RDo44TIY5fh4WyDORM7QlEUc1zGXYltT0RERERE16vVdzBHR0fjySefxIEDB+Ds7IxHHnkECxYsgFarvel+WVlZePrp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kp6eLvfdd5+6VllZveLiYnF2dlbXTSzz2WefSZMmTcTS0lI6dOggHh4eMmzYMHVduRdffFFCQkLU9yGR0ulVR48erd61JlI6cLBgwQLp3LmzeHl5Sa9eveTzzz+vtQMA5rJx40Zxd3cXnU4nw4YNk8WLF8uxY8fUaTLLGAwGefDBB0VRFAkKCpKXXnrJZNvy5ctFURRp1qyZPPXUUzJu3DhxdXWV119//W9j0Ov1dfLvBBFVjLlqzWCual7MVWse89S6h3kqERERERHVFA4wi8ihQ4ckNDRUXWcuJydHnn/+eXnkkUekpKREevXqJQsWLBARkYiICGnQoIFkZmbKtm3bxMfHR+bOnSsxMTEiIvL222+Lp6enbNmyRUREDhw4IM2aNVPvLCnrhLh48aJ07NhROnToICLXPphXdudHZdPB3U0+/fRTsbKyUteFK2uLiIgICQ4OVqc3K5sysWPHjrJt2zbZuXOnjB49Wry9vdXOtgULFoiXl5eIXGubkpISeeyxxyQgIEA99k8//SSKokhUVJSIlLZzaGioPPXUUyZr233zzTfSqFEjWbNmjYiUdrZUNB2iSN349rXRaJTTp09LVFSUhIWFyUcffSTTpk2TBx54QLp37y6NGjWSxo0by2effabu8+6774q7u7scP35cREReeOEFURRFbGxsxMbGRrp37y4RERGyf/9+ycrKUttt4MCB0qhRI1m5cqWcOXNGFi9eLEOHDhVFUeTRRx9V716IjIyUK1eu1HxjVJPff/9d7OzsZOjQoer0ihXdgRMTEyM7duyQQ4cOiaIoEhkZKSKlHdPW1tbqc1ek9E4nd3d3k07nH374QRo1aiRPP/20+ti8+uqr4uXlpU4r+Ouvv4qnp6csW7ZM3c9gMMibb74piqKonYtl8ZUNOlDFLly4ICEhIfLMM8+ISPnHtez3o0ePipOTk2zevFkWL14sWq1W5s6dq9aLiooSa2tr+eijj+T555+X0aNHy5o1a0zem248bl2acpOIqo65as1grlp7MFetXsxT6y7mqUREREREVFM4wCylnTAvv/yyaDQa+euvv0REZMqUKTJr1iwRKZ0isHPnzhIfHy+LFi2Sxo0bS2JiosyaNUuaN29usibe6tWrRVEUtZPvypUrMmrUKGndurV6LpHSD827du0ymXawrjt9+rT4+/vLu+++KyKifvt/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lTg7O8s999wjoaGhMmfOHJk5c6Z06tRJsrOzK43jbnosyp5DO3fulGbNmsnbb7+tll+/Btknn3wiAQEBMmLECJk5c6a4urrKwIED1Xb48MMPRVEU2b9/v4hcm6pxy5Yt4uHhIatXr1aPVVBQIEOHDpVBgwaJyLX22rRpk9ja2sqOHTvUGK5cuSIrV66UKVOmyBtvvCGnT5+uzuao9cqmynzhhRckMDBQsrKyZP369WJrayvTp08XEZHo6GixtraWr776St3PaDTK4cOHRaPRyKZNm0yO2a1bNxk5cqS89NJL0rp1azl06JC6LS8vT10b0traWtq3by8nTpy46fOf/rmUlBRp27atBAYGSq9evcTKykrs7e2lZ8+esnLlSsnJyVHr3jid4/XvPykpKeo0qUREf4e5avVjrnrrmKvePZin1g/MU4mIiEhEZMWKFQJAAFT4N91oNIqvr68AkKFDh96x8wJQl2S6FefOnRMA6pI3RFT7cYD5Bh988IHY2NjIkCFDZOzYsSadIl9//bXY2dmJoiiye/dutbxs3aIb3U0dQzXlwoULEhISIs8884yIXOvkKCwslOnTp0vz5s3lyJEjMmjQIAkPDzfZ99KlS/Lee+/JG2+8oXY4JScny6JFi+Thhx+Wzz//XEREhg8fLgMHDpSsrCx13+vXx6tNyq7jxrX0SkpK1LKy51FOTo506dJFWrZsKR07dhSdTieLFi0So9Eop06dEltbW5k3b55kZGRIcXGx/P777+Lt7S2vv/66iIj8+uuv4uzsrK4rWNYReubMGenatas8+OCDJud75513xMPDw2Tds/z8fFEURd55551qbJW7X0lJiTz77LPSoEEDESntXJs+fbpYWlrKvn37RETE1tZWPvjgA7W9jUajXL58WRo2bChz5841ec5u3rxZ+vXrJzqdTnr27CmxsbHqPmX/x8bGmnQWUfUqKSmRadOmSbdu3eTFF1+U48ePV1ivtr73ENHdi7lq9WKuaoq5at3DPLXuY55KREREItcGmK2treWxxx4rt3337t0CQHQ6HQeYiei2cID5BsnJyTJgwABRFEXuvfdeuXr1qrotLS1NvvjiC/n5558r/DCm1+v5Ie1vFBUVyciRI6Vbt24iYvqh9ptvvhFFUeTy5cuya9cucXFxkd69e8vbb78tCxYskL59+0qHDh1k7dq1otfr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X74ca9aswYMPPqiW9+3bF/fccw/WrVtnUh4XF4eff/4ZgwYNMke4RERERFRPME8lIiIiIiKi2o53MBNRvbRu3To4OTlhwIABSE1NVf916NAB9vb22L17t0n9wMBAdtoRERERUbVjnkpERERERES1He9gJqJ6KTY2FllZWfD09Kxwe0pKisnvgYGBNREWEREREdVzzFOJiIiIiIiotuMAMxHVS0ajEZ6enlizZk2F2z08PEx+t7GxqYmwiIiIiKieY55KREREREREtR0HmImoXmrSpAl27NiBHj16sFOOiIiIiGoN5qlERERERERU23ENZiKql8aOHQuDwYBXXnml3Da9Xo/MzMyaD4qIiIiI6j3mqURERERERFTb8Q5mIqqXwsLCMH36dCxatAjHjx/HwIEDYWlpidjYWKxbtw7vvfceRo8ebe4wiYiIiKieYZ5KREREREREtR0HmImo3vrkk0/QoUMHfPrpp/j3v/8NCwsLBAQE4KGHHkKPHj3MHR4RERER1VPMU4mIiIiIiKg2U0REzB0EERERERERERERERERERHVflyDmYiIiIiIiIiIiIiIiIiIqoQDzEREREREREREREREREREVCUcYCYiIiIiIiIiIiIiIiIioirhADMREREREREREREREREREVUJB5iJiIiIiIiIiIiIiIiIiKhKOMBMRERERERERERERERERERVwgFmIiIiIiIiIiIiIiIiIiKqEg4wExERERERERERERERERFRlXCAmYiIiIiIiIiIiIiIiIiIqoQDzEREREREREREREREREREVCUcYCYiIiIiIiIiIiIiIiIioirhADMREREREREREREREREREVUJB5iJiIiIiIiIiIiIiIiIiKhKOMBMRERERERERERERERERERV8v/MDz9TohOZLAAAAABJRU5ErkJggg==\n", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Saved → compare_rl_env.png\n" + ] + } + ], + "source": [ + "# ═══════════════════════════════════════════════════════════════════════════\n", + "# Figure 2 — RL env eval (2x3)\n", + "# ═══════════════════════════════════════════════════════════════════════════\n", + "TIER_ORDER = [\"warmup\", \"beginner\", \"intermediate\", \"advanced\", \"expert\"]\n", + "difficulties = [d for d in TIER_ORDER\n", + " if d in base_rl_metrics[\"_per_diff\"] and d in sft_rl_metrics[\"_per_diff\"]]\n", + "\n", + "fig2 = plt.figure(figsize=(20, 12))\n", + "gs2 = GridSpec(2, 3, figure=fig2, hspace=0.5, wspace=0.38)\n", + "rax1 = fig2.add_subplot(gs2[0, 0]) # avg episode reward\n", + "rax2 = fig2.add_subplot(gs2[0, 1]) # completion rate\n", + "rax3 = fig2.add_subplot(gs2[0, 2]) # avg steps & reward/step\n", + "rax4 = fig2.add_subplot(gs2[1, 0]) # per-difficulty reward\n", + "rax5 = fig2.add_subplot(gs2[1, 1]) # per-difficulty completion\n", + "rax6 = fig2.add_subplot(gs2[1, 2]) # reward distribution (box)\n", + "\n", + "models = [\"Base\", \"SFT\"]\n", + "x2 = np.arange(len(models))\n", + "bar_colors = [COLOR_BASE, COLOR_SFT]\n", + "\n", + "# 2a. Avg episode reward ± std\n", + "avg_rewards = [base_rl_metrics[\"avg_episode_reward\"], sft_rl_metrics[\"avg_episode_reward\"]]\n", + "reward_stds = [base_rl_metrics[\"reward_std\"], sft_rl_metrics[\"reward_std\"]]\n", + "bars_r = rax1.bar(x2, avg_rewards, 0.45, color=bar_colors,\n", + " edgecolor=\"white\", linewidth=0.6,\n", + " yerr=reward_stds, capsize=5, error_kw={\"elinewidth\": 1.5})\n", + "for bar, v in zip(bars_r, avg_rewards):\n", + " rax1.text(bar.get_x() + bar.get_width()/2,\n", + " bar.get_height() + max(reward_stds) * 0.1 + 0.05,\n", + " f\"{v:.2f}\", ha=\"center\", fontsize=9, fontweight=\"bold\")\n", + "rax1.set(title=\"Avg Episode Reward (±std)\", ylabel=\"Total Reward\", xlabel=\"Model\")\n", + "rax1.set_xticks(x2); rax1.set_xticklabels(models); rax1.set_axisbelow(True)\n", + "\n", + "# 2b. Task completion rate\n", + "comp_rates = [base_rl_metrics[\"completion_rate\"] * 100,\n", + " sft_rl_metrics[\"completion_rate\"] * 100]\n", + "bars_c = rax2.bar(x2, comp_rates, 0.45, color=bar_colors, edgecolor=\"white\", linewidth=0.6)\n", + "for bar, v in zip(bars_c, comp_rates):\n", + " rax2.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.8,\n", + " f\"{v:.0f}%\", ha=\"center\", fontsize=9, fontweight=\"bold\")\n", + "rax2.set(title=\"Task Completion Rate\", ylabel=\"% Episodes Completed\",\n", + " xlabel=\"Model\", ylim=(0, 115))\n", + "rax2.set_xticks(x2); rax2.set_xticklabels(models); rax2.set_axisbelow(True)\n", + "\n", + "# 2c. Avg steps + reward/step (grouped)\n", + "step_vals = [base_rl_metrics[\"avg_steps\"], sft_rl_metrics[\"avg_steps\"]]\n", + "rps_vals = [base_rl_metrics[\"avg_reward_per_step\"], sft_rl_metrics[\"avg_reward_per_step\"]]\n", + "w3 = 0.35\n", + "for i, (vals, label) in enumerate([(step_vals, \"Avg Steps\"), (rps_vals, \"Reward/Step\")]):\n", + " bars_ = rax3.bar(x2 + (i - 0.5) * w3, vals, w3,\n", + " color=bar_colors, edgecolor=\"white\",\n", + " linewidth=0.6, label=label, alpha=0.85 if i else 1.0)\n", + " for bar, v in zip(bars_, vals):\n", + " rax3.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.05,\n", + " f\"{v:.2f}\", ha=\"center\", fontsize=8, fontweight=\"bold\")\n", + "rax3.set(title=\"Steps & Reward Efficiency\", ylabel=\"Value\", xlabel=\"Model\")\n", + "rax3.set_xticks(x2); rax3.set_xticklabels(models)\n", + "rax3.legend(loc=\"upper right\"); rax3.set_axisbelow(True)\n", + "\n", + "# 2d. Per-difficulty avg reward (all 5 tiers)\n", + "xd, wd = np.arange(len(difficulties)), 0.35\n", + "base_dr = [base_rl_metrics[\"_per_diff\"][d][\"avg_reward\"] for d in difficulties]\n", + "sft_dr = [sft_rl_metrics[\"_per_diff\"][d][\"avg_reward\"] for d in difficulties]\n", + "annotate_bars(rax4, rax4.bar(xd - wd/2, base_dr, wd, color=COLOR_BASE,\n", + " label=\"Base\", edgecolor=\"white\"), fmt=\"{:.2f}\", offset=0.02)\n", + "annotate_bars(rax4, rax4.bar(xd + wd/2, sft_dr, wd, color=COLOR_SFT,\n", + " label=\"SFT\", edgecolor=\"white\"), fmt=\"{:.2f}\", offset=0.02)\n", + "rax4.set(title=\"Avg Reward by Difficulty Tier\", ylabel=\"Avg Episode Reward\", xlabel=\"Tier\")\n", + "rax4.set_xticks(xd)\n", + "rax4.set_xticklabels([d.capitalize() for d in difficulties], rotation=15, ha=\"right\")\n", + "rax4.legend(); rax4.set_axisbelow(True)\n", + "\n", + "# 2e. Per-difficulty completion rate (all 5 tiers)\n", + "base_dc = [base_rl_metrics[\"_per_diff\"][d][\"completion_rate\"] * 100 for d in difficulties]\n", + "sft_dc = [sft_rl_metrics[\"_per_diff\"][d][\"completion_rate\"] * 100 for d in difficulties]\n", + "annotate_bars(rax5, rax5.bar(xd - wd/2, base_dc, wd, color=COLOR_BASE,\n", + " label=\"Base\", edgecolor=\"white\"), fmt=\"{:.0f}%\", offset=0.8)\n", + "annotate_bars(rax5, rax5.bar(xd + wd/2, sft_dc, wd, color=COLOR_SFT,\n", + " label=\"SFT\", edgecolor=\"white\"), fmt=\"{:.0f}%\", offset=0.8)\n", + "rax5.set(title=\"Completion Rate by Difficulty Tier\",\n", + " ylabel=\"% Episodes Completed\", xlabel=\"Tier\", ylim=(0, 120))\n", + "rax5.set_xticks(xd)\n", + "rax5.set_xticklabels([d.capitalize() for d in difficulties], rotation=15, ha=\"right\")\n", + "rax5.legend(); rax5.set_axisbelow(True)\n", + "\n", + "# 2f. Reward distribution — box + jitter\n", + "bp = rax6.boxplot(\n", + " [base_rl_metrics[\"_rewards\"], sft_rl_metrics[\"_rewards\"]],\n", + " labels=[\"Base\", \"SFT\"],\n", + " patch_artist=True,\n", + " medianprops={\"color\": \"white\", \"linewidth\": 2},\n", + " whiskerprops={\"linewidth\": 1.5},\n", + " capprops={\"linewidth\": 1.5},\n", + " flierprops={\"marker\": \"o\", \"markersize\": 5, \"alpha\": 0.6},\n", + " widths=0.4,\n", + ")\n", + "for patch, color in zip(bp[\"boxes\"], [COLOR_BASE, COLOR_SFT]):\n", + " patch.set_facecolor(color); patch.set_alpha(0.85)\n", + "for i, (rewards, color) in enumerate(\n", + " [(base_rl_metrics[\"_rewards\"], COLOR_BASE),\n", + " (sft_rl_metrics[\"_rewards\"], COLOR_SFT)], start=1\n", + "):\n", + " jitter = np.random.uniform(-0.08, 0.08, len(rewards))\n", + " rax6.scatter(np.full(len(rewards), i) + jitter, rewards,\n", + " color=color, alpha=0.7, zorder=3, s=30,\n", + " edgecolors=\"white\", linewidths=0.4)\n", + "rax6.set(title=\"Episode Reward Distribution\",\n", + " ylabel=\"Total Episode Reward\", xlabel=\"Model\")\n", + "rax6.set_axisbelow(True)\n", + "\n", + "fig2.suptitle(\n", + " f\"Part 2 — RL Env Eval: Base vs SFT \"\n", + " f\"({len(difficulties)} tiers × {RL_EPISODES_PER_DIFF} episodes each)\",\n", + " fontsize=15, fontweight=\"bold\", y=1.01,\n", + ")\n", + "plt.savefig(\"compare_rl_env.png\", dpi=150, bbox_inches=\"tight\", facecolor=\"white\")\n", + "plt.show()\n", + "print(\"Saved → compare_rl_env.png\")" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "cell-summary-table", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cell-summary-table", + "outputId": "de39bae0-ef24-4d5c-d84f-0c0134ed671c" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "========================================================================\n", + "DATASET EVAL SUMMARY\n", + "========================================================================\n", + "Metric Base SFT Delta\n", + "----------------------------------------------------------------\n", + "format_pct 33.3% 100.0% +66.7pt\n", + "format_after_extract_pct 100.0% 100.0% +0.0pt\n", + "exact_pct 38.9% 88.9% +50.0pt\n", + "service_pct 77.8% 88.9% +11.1pt\n", + "operation_pct 61.1% 88.9% +27.8pt\n", + "avg_latency 1.901 1.559 -0.342\n", + "avg_len 85.833 74.722 -11.111\n", + "\n", + "========================================================================\n", + "RL ENV EVAL SUMMARY\n", + "========================================================================\n", + "Metric Base SFT Delta\n", + "------------------------------------------------------------\n", + "avg_episode_reward 1.187 2.011 +0.824\n", + "reward_std 1.137 1.908 +0.771\n", + "completion_rate 46.7% 73.3% +26.7pt\n", + "avg_steps 8.600 5.733 -2.867\n", + "avg_reward_per_step 0.138 0.351 +0.213\n" + ] + } + ], + "source": [ + "print(\"=\" * 72)\n", + "print(\"DATASET EVAL SUMMARY\")\n", + "print(\"=\" * 72)\n", + "ds_keys = [\"format_pct\", \"format_after_extract_pct\", \"exact_pct\",\n", + " \"service_pct\", \"operation_pct\", \"avg_latency\", \"avg_len\"]\n", + "print(f\"{'Metric':<30} {'Base':>10} {'SFT':>10} {'Delta':>12}\")\n", + "print(\"-\" * 64)\n", + "for k in ds_keys:\n", + " b, s = base_ds_metrics[k], sft_ds_metrics[k]\n", + " if \"pct\" in k:\n", + " print(f\"{k:<30} {100*b:9.1f}% {100*s:9.1f}% {100*(s-b):+11.1f}pt\")\n", + " else:\n", + " print(f\"{k:<30} {b:10.3f} {s:10.3f} {s-b:+12.3f}\")\n", + "\n", + "print()\n", + "print(\"=\" * 72)\n", + "print(\"RL ENV EVAL SUMMARY\")\n", + "print(\"=\" * 72)\n", + "rl_keys = [\"avg_episode_reward\", \"reward_std\", \"completion_rate\",\n", + " \"avg_steps\", \"avg_reward_per_step\"]\n", + "print(f\"{'Metric':<25} {'Base':>10} {'SFT':>10} {'Delta':>12}\")\n", + "print(\"-\" * 60)\n", + "for k in rl_keys:\n", + " b, s = base_rl_metrics[k], sft_rl_metrics[k]\n", + " if k == \"completion_rate\":\n", + " print(f\"{k:<25} {100*b:9.1f}% {100*s:9.1f}% {100*(s-b):+11.1f}pt\")\n", + " else:\n", + " print(f\"{k:<25} {b:10.3f} {s:10.3f} {s-b:+12.3f}\")" + ] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.10" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "00ff165127094d2fb481980c130f04c8": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "01e0602c676442ff952a7a7b3f4024c7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "02068d599f844ea5838544754e6d8448": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "052ba95707274c42933cb13fc8ad078c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "06c2b0aff48f40a886e14723ee788248": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0803a7b3995241f493052389046afe98": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "082ceda90b8d484a81a1de5fead892b6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_e8560b1f7c5a42a1b850a24bd22f9a73", + "IPY_MODEL_5a5d3dac3d2f43419349404bd0c79f4f", + "IPY_MODEL_4772a353fbb243aca9f472de257d1358" + ], + "layout": "IPY_MODEL_b14fbeb1fb4f4888b63afd9cf4476b28" + } + }, + "0ac4cc8e789d4a7389ba2d81f752b2a6": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0cf6a91ad33f4f0a94b890881658b5b2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0d2747470d4947849c27775b43ecb54c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_fbc88709dcf84cfbb91d7efbb10e0b42", + "IPY_MODEL_cc4366820b234778b543af95146a4e92", + "IPY_MODEL_0fba0e0c04c14214ae58cdd3f65fd92f" + ], + "layout": "IPY_MODEL_4dae08a1f54842e49185c4402659df6f" + } + }, + "0f614193015744f2a0263aa13681b411": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_cc427e51ea1446aaa74d6f24cb17d043", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a8816b70cd9f409ba7acfacc2864c043", + "value": 1 + } + }, + "0fba0e0c04c14214ae58cdd3f65fd92f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_96abbd4be45f4eef9587a795f10c73f9", + "placeholder": "​", + "style": "IPY_MODEL_6736d9704da04076a134426a47cb15c4", + "value": " 194k/194k [00:01<00:00, 965kB/s]" + } + }, + "1161e043c93c4671a8155dce8d9dd701": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1241be723444464fbb334b06d8208410": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "161b757d5f64481a9212dbccd7a884c7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_89fdaf865e0e4f7fa1909f032005d1d8", + "placeholder": "​", + "style": "IPY_MODEL_8060b0a254d54032bbb01a56431e98eb", + "value": "generation_config.json: 100%" + } + }, + "17ad15eed85f493ca0d0d6b8d914ca2c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "182361253eee49418048b01fbcf2672f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_79d5b6596f1b4ee5966b55dad97df3a2", + "max": 200, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_b49e779bf02c49bbb1f4eba5ac2dd1e2", + "value": 200 + } + }, + "188a00a386704c7887d139bc284ccc1a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "1a190eca13234bca86da0f33e46a34e1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1dc1444225ce43a888350992cc7f0bbb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9ef9a30c556c4d9da3692fd8a829270f", + "IPY_MODEL_b14329f3b61447f788d6e836bf934c91", + "IPY_MODEL_6cff000d81e8431298609a9148cdb793" + ], + "layout": "IPY_MODEL_49de19f8c9e04603980b4a4a8c816545" + } + }, + "1e3372b4af51443f88050b77fedc5bef": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "20e58c5f72e14d47901d1eec0a08c12f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "217d16de232c4a1d83a1a4b48ad453d6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "24dadb01295d447ca81ac02a4908fdf1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2b446f04958943a4adc493cb624ecb7e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2c51081cf8314bd58a8b7b93cdf2eed7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2dbe35d37c824c839a2913a0cfbc5266": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2def96a8b6d646ef8801ce2c1e0a8d14": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "2e707c60d0384e8b8c993c883ad3456a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2f17b452a3f04d448beff33d60445e2e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_cd77111d0ee44ecaacb5159f68c88609", + "placeholder": "​", + "style": "IPY_MODEL_89604435feab456888553549728c15a7", + "value": "Generating validation split: 100%" + } + }, + "2f1ae5179b0945fda20f970c25c93c57": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2fe800ca1f6948009a218f9f3ce0acbb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f13c88be577549acad8e2606a8c4e6f2", + "placeholder": "​", + "style": "IPY_MODEL_c1b370ab7fee4dbeb2cb37f47f774eb6", + "value": "merges.txt: " + } + }, + "31d96fb276614537bab907c316f0ce25": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_f9ec2b3ae5604344bf3a5f267ce7de38", + "IPY_MODEL_4772c50a4e454979acb7cc4de466937a", + "IPY_MODEL_6ee363978e9749d7b39191a4027be66a" + ], + "layout": "IPY_MODEL_b74c48e99fa742ad8b44d5bb7fd34171" + } + }, + "3332ae39c1094b3bb3fde04198a3f2a6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_71cbf065dfca4450a615fdef7c2114f6", + "IPY_MODEL_fdadb7a27d07425c8e04dd10df1aeba1", + "IPY_MODEL_ec590a2a32d045b194dab35ae5273043" + ], + "layout": "IPY_MODEL_826ab03235c94f929ca1e261327a0137" + } + }, + "358628764f24466198ceadb0f4478487": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_20e58c5f72e14d47901d1eec0a08c12f", + "max": 613, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_217d16de232c4a1d83a1a4b48ad453d6", + "value": 613 + } + }, + "375ea535f86c4dd193d114568bb3045b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "39929719372644589a9baa7295fd5849": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "399a72c355d8478e87995aff1c57f426": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_564a55b31d504a2499140061de7c8354", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_db821f8b3e1b414590bbde186cc62d59", + "value": 1 + } + }, + "3af6672587a84a2b886482e68fcfbba9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3cf95de334a14af9b7274dee96b2f20d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_41a765ae42f142a5aaf0163612bbe490", + "IPY_MODEL_0f614193015744f2a0263aa13681b411", + "IPY_MODEL_68d44bd4ff9a439f958573c8ec16405b" + ], + "layout": "IPY_MODEL_c0c12b0fc46f4b9f8ea2af23e194da23" + } + }, + "41873020c9324e8b96fb6a8a7e432ed2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "41a765ae42f142a5aaf0163612bbe490": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_796833bcdc3845849bf4b44da6379fcc", + "placeholder": "​", + "style": "IPY_MODEL_b22885fcbf3147509191939f5de83602", + "value": "README.md: " + } + }, + "44fb962be403416c910b1c4bf25bcdf1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_161b757d5f64481a9212dbccd7a884c7", + "IPY_MODEL_a18521a6e11b4e1ea6e53ce81b2af574", + "IPY_MODEL_969a9823b8864c0f877eb2c3af383205" + ], + "layout": "IPY_MODEL_753cba0957c240cd8d7fcf171dd2557e" + } + }, + "4772a353fbb243aca9f472de257d1358": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f2247b50901c4a20854c1ac284d76e7f", + "placeholder": "​", + "style": "IPY_MODEL_71c857a576e04c1592352df2553a10f6", + "value": " 2.05G/2.05G [00:14<00:00, 159MB/s]" + } + }, + "4772c50a4e454979acb7cc4de466937a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ef8ace2a258a479db27919c2527a172f", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_02068d599f844ea5838544754e6d8448", + "value": 1 + } + }, + "49de19f8c9e04603980b4a4a8c816545": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4dae08a1f54842e49185c4402659df6f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4dca96c48eb64681b36a76b4f0b01b62": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4e6c58ce96404281b880833f88e08413": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4f00645b01294756ae17955d5889514b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2e707c60d0384e8b8c993c883ad3456a", + "placeholder": "​", + "style": "IPY_MODEL_3af6672587a84a2b886482e68fcfbba9", + "value": "special_tokens_map.json: 100%" + } + }, + "5178b799d7404fd282f4e5016d616d14": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "51ad078171814b9ca022d88231cf6387": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5329bea02fc2432b84b8bb8eb733eaf9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5405361924614557867c74ba647b08b4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "548cc14a659b4e6e9c217ff980e34608": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "54c323cb9fe9458fb062b2d4bd5cf927": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "55a60ff24a23452682aebac4cdcdf086": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_923264d53c454d9d96d618b0efd3f59a", + "placeholder": "​", + "style": "IPY_MODEL_8b918bfb9f2f4ee0a71884837b495ebf", + "value": " 1.67M/? [00:00<00:00, 43.5MB/s]" + } + }, + "564a55b31d504a2499140061de7c8354": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "57cd591f5b3f4d6aa2e401dcb0c3c8fc": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5a09cd99ab3444248c365ba3e1f46436": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5a5d3dac3d2f43419349404bd0c79f4f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8c91b59afcd343648321a9ed206531a7", + "max": 2054625552, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a3710ca3ab474ce59a146b54fea25736", + "value": 2054625552 + } + }, + "5bbbc6530c014b5296c181526d08cec0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5cdf05f2225f499e8574ab64ec9a8766": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_66558440f90b42d99278658f7151f043", + "max": 150, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_188a00a386704c7887d139bc284ccc1a", + "value": 150 + } + }, + "5e9776eebdc544159f73ebc7447d54f1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ee387cb17b58451fab83e2b3241032dc", + "max": 14783936, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c402601073394089ab3718d6288660ff", + "value": 14783936 + } + }, + "616c3d44f0a64e22828c2e472a8c13bc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0cf6a91ad33f4f0a94b890881658b5b2", + "placeholder": "​", + "style": "IPY_MODEL_5178b799d7404fd282f4e5016d616d14", + "value": " 1.92M/1.92M [00:00<00:00, 9.61MB/s]" + } + }, + "617dcbb6224b49bb9b83dac185420e09": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_7c93228f55074cf78b1170001545f89d", + "IPY_MODEL_b1e2bcaf50124b14b7bc70fb403e68b8", + "IPY_MODEL_c36279d8d0774918812725c906a8af12" + ], + "layout": "IPY_MODEL_ebb9a1dea358429e9e166c470076d4ce" + } + }, + "62a7c1256a3d462ca1f58711b4985852": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "62ba79bd0e2f47fcbb073cbe15ab2bf6": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "63b9d68de11b4fbfa5e8acaaa25b4c35": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "66558440f90b42d99278658f7151f043": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "66f989e6acee487faf8f6cc453faa486": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6736d9704da04076a134426a47cb15c4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "68000393fa504271ba1a4c0dfb18a182": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ea95e9fdfc1e43ec8c1cb7b35d24f436", + "IPY_MODEL_5e9776eebdc544159f73ebc7447d54f1", + "IPY_MODEL_d953a7141b174afdbf2f8912cdf4e04f" + ], + "layout": "IPY_MODEL_2b446f04958943a4adc493cb624ecb7e" + } + }, + "68d44bd4ff9a439f958573c8ec16405b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c71fef24bafe4b45896601a7ae144c2f", + "placeholder": "​", + "style": "IPY_MODEL_548cc14a659b4e6e9c217ff980e34608", + "value": " 4.89k/? [00:00<00:00, 314kB/s]" + } + }, + "68d465d228c141a7b5c8c97799102790": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_00ff165127094d2fb481980c130f04c8", + "placeholder": "​", + "style": "IPY_MODEL_d2af9a4571554901a04f1afdd556984d", + "value": "tokenizer_config.json: " + } + }, + "6cff000d81e8431298609a9148cdb793": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_741c77c00dd34486bd780369d2918d53", + "placeholder": "​", + "style": "IPY_MODEL_b6c49d1dbf184f86a4a94644340b9f90", + "value": " 1500/1500 [00:00<00:00, 29631.67 examples/s]" + } + }, + "6eb2f500acda438a82e453126b22ae25": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "6ee363978e9749d7b39191a4027be66a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5a09cd99ab3444248c365ba3e1f46436", + "placeholder": "​", + "style": "IPY_MODEL_375ea535f86c4dd193d114568bb3045b", + "value": " 7.03M/? [00:00<00:00, 98.9MB/s]" + } + }, + "71c857a576e04c1592352df2553a10f6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "71cbf065dfca4450a615fdef7c2114f6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_06c2b0aff48f40a886e14723ee788248", + "placeholder": "​", + "style": "IPY_MODEL_0803a7b3995241f493052389046afe98", + "value": "added_tokens.json: 100%" + } + }, + "741c77c00dd34486bd780369d2918d53": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "753cba0957c240cd8d7fcf171dd2557e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7799ec6190d04928963fbd82d195e2b3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_68d465d228c141a7b5c8c97799102790", + "IPY_MODEL_9f01388850d44b30a155bdd6c1528de4", + "IPY_MODEL_a5a23a6849e240be90007a200a14e1a3" + ], + "layout": "IPY_MODEL_1a190eca13234bca86da0f33e46a34e1" + } + }, + "796833bcdc3845849bf4b44da6379fcc": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "79d5b6596f1b4ee5966b55dad97df3a2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7c93228f55074cf78b1170001545f89d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5bbbc6530c014b5296c181526d08cec0", + "placeholder": "​", + "style": "IPY_MODEL_8a2f80c0be5a47b994f6e091cb01d287", + "value": "data/reserve-00000-of-00001.parquet: 100%" + } + }, + "7ec0191160e04c5397c24bbad3d2b593": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_51ad078171814b9ca022d88231cf6387", + "placeholder": "​", + "style": "IPY_MODEL_ed06bfd4c13f41598d5e10bbe6139eb8", + "value": "data/train-00000-of-00001.parquet: 100%" + } + }, + "7f28dc39b40543d9b17bd8ad611e3623": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8060b0a254d54032bbb01a56431e98eb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "80d066d9f0614ae4b264ade4a304cf49": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "80d9e1dd1507439088c3d9d8c4c7b0ac": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ceadf3915006459fb72ed9141c49dc2f", + "placeholder": "​", + "style": "IPY_MODEL_63b9d68de11b4fbfa5e8acaaa25b4c35", + "value": " 150/150 [00:00<00:00, 4766.72 examples/s]" + } + }, + "826ab03235c94f929ca1e261327a0137": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "874de7ba061b4d8783c74e605440394e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2dbe35d37c824c839a2913a0cfbc5266", + "placeholder": "​", + "style": "IPY_MODEL_f9f3f435180b4929a938ac4500216247", + "value": " 613/613 [00:00<00:00, 59.9kB/s]" + } + }, + "88f4f5a8f65742eb8cb1228e5d94508c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "89604435feab456888553549728c15a7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "89fdaf865e0e4f7fa1909f032005d1d8": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8a2f80c0be5a47b994f6e091cb01d287": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8af925f00d3541958d318f43591bdd76": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e87a2309352248309f209b71dd050799", + "placeholder": "​", + "style": "IPY_MODEL_1e3372b4af51443f88050b77fedc5bef", + "value": " 200/200 [00:00<00:00, 5397.52 examples/s]" + } + }, + "8b918bfb9f2f4ee0a71884837b495ebf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8c91b59afcd343648321a9ed206531a7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "923264d53c454d9d96d618b0efd3f59a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "94eb4cb08c8443098267d78b1665514e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "969a9823b8864c0f877eb2c3af383205": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f105bcab30d8404a9b3a1ce866480374", + "placeholder": "​", + "style": "IPY_MODEL_9c78bf775e4149cfbe34f1e253c2c9fc", + "value": " 266/266 [00:00<00:00, 23.7kB/s]" + } + }, + "96abbd4be45f4eef9587a795f10c73f9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "974d765200034661a14a25e0b241fdeb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "98dada6fc260427ebe46383263de1e75": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9c1e0ff6a9094793905ddc191e95796d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ea1e771eea51498b9917da282d783427", + "placeholder": "​", + "style": "IPY_MODEL_39929719372644589a9baa7295fd5849", + "value": "Generating reserve split: 100%" + } + }, + "9c78bf775e4149cfbe34f1e253c2c9fc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9d1f05eb5d3b4bdba57d618f022eaa7b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_7ec0191160e04c5397c24bbad3d2b593", + "IPY_MODEL_bf317a89297c4265938863cc3f74ba8c", + "IPY_MODEL_616c3d44f0a64e22828c2e472a8c13bc" + ], + "layout": "IPY_MODEL_57cd591f5b3f4d6aa2e401dcb0c3c8fc" + } + }, + "9d32149562cf47859390636be9c70d76": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "9e1d365fa1c84030a4caeead8ef954d3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6eb2f500acda438a82e453126b22ae25", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_9d32149562cf47859390636be9c70d76", + "value": 1 + } + }, + "9ef9a30c556c4d9da3692fd8a829270f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4dca96c48eb64681b36a76b4f0b01b62", + "placeholder": "​", + "style": "IPY_MODEL_66f989e6acee487faf8f6cc453faa486", + "value": "Generating train split: 100%" + } + }, + "9f01388850d44b30a155bdd6c1528de4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d06befc9db47458fa696880e19449d90", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_aadd0d6341714668ae5a85c445f49a09", + "value": 1 + } + }, + "9f61db866c9c41e6af53f0b79f55b4e7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a18521a6e11b4e1ea6e53ce81b2af574": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_80d066d9f0614ae4b264ade4a304cf49", + "max": 266, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_bdccff3baee846459a9645d014266d2a", + "value": 266 + } + }, + "a3710ca3ab474ce59a146b54fea25736": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "a5a23a6849e240be90007a200a14e1a3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5329bea02fc2432b84b8bb8eb733eaf9", + "placeholder": "​", + "style": "IPY_MODEL_ba6c2ac768044ec0b688e6573e540f92", + "value": " 7.51k/? [00:00<00:00, 521kB/s]" + } + }, + "a8816b70cd9f409ba7acfacc2864c043": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "aadd0d6341714668ae5a85c445f49a09": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "ab9aa9b9c93b4ee5900a351cd584cee8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_974d765200034661a14a25e0b241fdeb", + "placeholder": "​", + "style": "IPY_MODEL_41873020c9324e8b96fb6a8a7e432ed2", + "value": " 2.78M/? [00:00<00:00, 55.7MB/s]" + } + }, + "b14329f3b61447f788d6e836bf934c91": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_052ba95707274c42933cb13fc8ad078c", + "max": 1500, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_daf23f97138a44f49f8099d73a39b33b", + "value": 1500 + } + }, + "b14fbeb1fb4f4888b63afd9cf4476b28": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b1e2bcaf50124b14b7bc70fb403e68b8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fbb8cb04661945c782b1df5e423b37a0", + "max": 260654, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_94eb4cb08c8443098267d78b1665514e", + "value": 260654 + } + }, + "b22885fcbf3147509191939f5de83602": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b3d0061be3d24e22af12225fb08f02ee": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b49e779bf02c49bbb1f4eba5ac2dd1e2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "b6c49d1dbf184f86a4a94644340b9f90": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b71f5888837e4717bc8669603cb587a2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b74c48e99fa742ad8b44d5bb7fd34171": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ba375ee09b334728b8cfc63975f4302a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_4f00645b01294756ae17955d5889514b", + "IPY_MODEL_358628764f24466198ceadb0f4478487", + "IPY_MODEL_874de7ba061b4d8783c74e605440394e" + ], + "layout": "IPY_MODEL_01e0602c676442ff952a7a7b3f4024c7" + } + }, + "ba6c2ac768044ec0b688e6573e540f92": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "bab57aecb3f84216af720fa9321f6fb8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_2fe800ca1f6948009a218f9f3ce0acbb", + "IPY_MODEL_9e1d365fa1c84030a4caeead8ef954d3", + "IPY_MODEL_55a60ff24a23452682aebac4cdcdf086" + ], + "layout": "IPY_MODEL_b71f5888837e4717bc8669603cb587a2" + } + }, + "bc4ee14a8b7140edba21f43a0d673045": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_88f4f5a8f65742eb8cb1228e5d94508c", + "placeholder": "​", + "style": "IPY_MODEL_54c323cb9fe9458fb062b2d4bd5cf927", + "value": "vocab.json: " + } + }, + "bdccff3baee846459a9645d014266d2a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "bf317a89297c4265938863cc3f74ba8c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_62ba79bd0e2f47fcbb073cbe15ab2bf6", + "max": 1923495, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_62a7c1256a3d462ca1f58711b4985852", + "value": 1923495 + } + }, + "c034e1899af543e7ab854b7276a787e2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c07912b3d8974e6891c3d770391aa649": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c0c12b0fc46f4b9f8ea2af23e194da23": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c0cdb510c34c4e27b8061a5b4e4b88fa": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c1b370ab7fee4dbeb2cb37f47f774eb6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c36279d8d0774918812725c906a8af12": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f5eb0e8911ad46d19d1d76dfa55fb21c", + "placeholder": "​", + "style": "IPY_MODEL_1161e043c93c4671a8155dce8d9dd701", + "value": " 261k/261k [00:00<00:00, 1.30MB/s]" + } + }, + "c402601073394089ab3718d6288660ff": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "c545c0cc491b4692b6f7eaaf42e50baf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c71fef24bafe4b45896601a7ae144c2f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c795b9a1dc834f67ac44a568b9744ed7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c9572ada407547acb82b499b4aba9408": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_2f17b452a3f04d448beff33d60445e2e", + "IPY_MODEL_5cdf05f2225f499e8574ab64ec9a8766", + "IPY_MODEL_80d9e1dd1507439088c3d9d8c4c7b0ac" + ], + "layout": "IPY_MODEL_4e6c58ce96404281b880833f88e08413" + } + }, + "cc427e51ea1446aaa74d6f24cb17d043": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "cc4366820b234778b543af95146a4e92": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7f28dc39b40543d9b17bd8ad611e3623", + "max": 193593, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_2def96a8b6d646ef8801ce2c1e0a8d14", + "value": 193593 + } + }, + "cd77111d0ee44ecaacb5159f68c88609": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ceadf3915006459fb72ed9141c49dc2f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d06befc9db47458fa696880e19449d90": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "d2af9a4571554901a04f1afdd556984d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d953a7141b174afdbf2f8912cdf4e04f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_24dadb01295d447ca81ac02a4908fdf1", + "placeholder": "​", + "style": "IPY_MODEL_c07912b3d8974e6891c3d770391aa649", + "value": " 14.8M/14.8M [00:00<00:00, 73.9MB/s]" + } + }, + "daf23f97138a44f49f8099d73a39b33b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "db821f8b3e1b414590bbde186cc62d59": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e580572f40454f8ebb8d6d50cab3c644": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_bc4ee14a8b7140edba21f43a0d673045", + "IPY_MODEL_399a72c355d8478e87995aff1c57f426", + "IPY_MODEL_ab9aa9b9c93b4ee5900a351cd584cee8" + ], + "layout": "IPY_MODEL_2c51081cf8314bd58a8b7b93cdf2eed7" + } + }, + "e8560b1f7c5a42a1b850a24bd22f9a73": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0ac4cc8e789d4a7389ba2d81f752b2a6", + "placeholder": "​", + "style": "IPY_MODEL_17ad15eed85f493ca0d0d6b8d914ca2c", + "value": "model.safetensors: 100%" + } + }, + "e87a2309352248309f209b71dd050799": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e90dd825fc0b44d2bbe077f7361756af": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ea1e771eea51498b9917da282d783427": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ea95e9fdfc1e43ec8c1cb7b35d24f436": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2f1ae5179b0945fda20f970c25c93c57", + "placeholder": "​", + "style": "IPY_MODEL_e90dd825fc0b44d2bbe077f7361756af", + "value": "adapter_model.safetensors: 100%" + } + }, + "ebb9a1dea358429e9e166c470076d4ce": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ec590a2a32d045b194dab35ae5273043": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b3d0061be3d24e22af12225fb08f02ee", + "placeholder": "​", + "style": "IPY_MODEL_9f61db866c9c41e6af53f0b79f55b4e7", + "value": " 632/632 [00:00<00:00, 65.0kB/s]" + } + }, + "ed06bfd4c13f41598d5e10bbe6139eb8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ee387cb17b58451fab83e2b3241032dc": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ef8ace2a258a479db27919c2527a172f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "f105bcab30d8404a9b3a1ce866480374": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f13c88be577549acad8e2606a8c4e6f2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f2247b50901c4a20854c1ac284d76e7f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f5eb0e8911ad46d19d1d76dfa55fb21c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f65560291a834aef846683d3909a9db6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_9c1e0ff6a9094793905ddc191e95796d", + "IPY_MODEL_182361253eee49418048b01fbcf2672f", + "IPY_MODEL_8af925f00d3541958d318f43591bdd76" + ], + "layout": "IPY_MODEL_c0cdb510c34c4e27b8061a5b4e4b88fa" + } + }, + "f9ec2b3ae5604344bf3a5f267ce7de38": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c034e1899af543e7ab854b7276a787e2", + "placeholder": "​", + "style": "IPY_MODEL_c545c0cc491b4692b6f7eaaf42e50baf", + "value": "tokenizer.json: " + } + }, + "f9f3f435180b4929a938ac4500216247": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "fbb8cb04661945c782b1df5e423b37a0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fbc88709dcf84cfbb91d7efbb10e0b42": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c795b9a1dc834f67ac44a568b9744ed7", + "placeholder": "​", + "style": "IPY_MODEL_1241be723444464fbb334b06d8208410", + "value": "data/validation-00000-of-00001.parquet: 100%" + } + }, + "fdadb7a27d07425c8e04dd10df1aeba1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_98dada6fc260427ebe46383263de1e75", + "max": 632, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5405361924614557867c74ba647b08b4", + "value": 632 + } + } + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/data/README.md b/data/README.md new file mode 100644 index 0000000000000000000000000000000000000000..9139d0705635e2cd6b5c52840659359ffeeb24c1 --- /dev/null +++ b/data/README.md @@ -0,0 +1,238 @@ +# `data/` — SFT Dataset Generation & Base-Model Selection + +[← back to main README](../README.md) + +This directory holds the SFT training corpus, the dataset generator that produced it, and the rigorous benchmark we used to pick the base model. Together they answer two questions a hackathon judge should be able to verify in under five minutes: + +1. **What did we train on?** A 1,500-row synthetic SFT corpus with five trajectory types covering success, continuation, failure recovery, verification, and hint usage. ([§1](#1-sft-dataset-generation)) +2. **Why this base model?** A reproducible 11-model benchmark across 27 held-out prompts. **Qwen2.5-Coder-3B-Instruct** wins on every metric that matters. ([§5](#5-base-model-selection-overview)) + +> ![Top 4 candidate models on the held-out benchmark](../docs/figures/model_eval_chart.png) + +--- + +## Table of contents + +1. [SFT dataset generation](#1-sft-dataset-generation) +2. [Five trajectory types](#2-five-trajectory-types) +3. [Tier weighting](#3-tier-weighting) +4. [Dataset format & artifacts](#4-dataset-format--artifacts) +5. [Base-model selection — overview](#5-base-model-selection-overview) +6. [Eval harness](#6-eval-harness) +7. [HuggingFace publishing](#7-huggingface-publishing) +8. [Files in this directory](#8-files-in-this-directory) + +--- + +## 1. SFT dataset generation + +[data/build_sft_dataset.py](build_sft_dataset.py) — 27 KB, single-script generator. + +### Approach + +The dataset is **synthetically generated** but grounded in canonical solutions extracted from our integration test suite. Two design decisions worth flagging to judges: + +#### AST-based extraction, not pytest execution + +Each `tests_tasks/test__tasks.py` file has a top-level constant (`WARMUP_COMMANDS`, `BEGINNER_COMMANDS`, …) mapping `task_id → canonical AWS CLI command`. We extract these via Python's `ast` module — we do **not** execute the test file. Reasons: + +1. `pytest` fixtures would spin up a MiniStack, hit AWS APIs, and add 30+ seconds of overhead per generation run. +2. Static extraction is deterministic — no flake risk. The dataset is reproducible bit-for-bit given a seed. +3. The canonical solutions are intentionally simple constant declarations that AST can parse without import side effects. + +#### Plausible-output simulation + +When generating multi-step continuations, we don't have a real MiniStack response to feed back into the user message — we have to fabricate one. The generator maps each AWS operation (`list-buckets`, `create-table`, `describe-instances`, …) to a JSON template, then interpolates the right resource names from the task. So an `aws s3api list-buckets` step in the user prompt history has output like: + +```json +{"Buckets":[{"Name":"my-app-data","CreationDate":"2026-04-15T..."}]} +``` + +…instead of the empty `{"Buckets":[]}` you'd get from a fresh MiniStack. This is the difference between the SFT model learning "first step, always answer with the canonical command" (degenerate) and "first step depends on what's already been done" (correct). + +### Dynamic-ID filtering + +Some tests reference resources whose IDs only exist at runtime — security groups (`sg-…`), subnets (`subnet-…`), VPCs (`vpc-…`), instance IDs (`i-…`). These commands cannot be deterministically captured by static extraction. The generator skips any task whose canonical command contains those patterns. The result: 72 unique tasks make it into the train split (out of 134 total tasks), all of which are deterministically reproducible. + +--- + +## 2. Five trajectory types + +The SFT corpus mixes five distinct trajectory shapes so the model learns to handle real multi-turn agent behavior, not just one-shot question answering. Actual proportions (from [data/sft/dataset_stats.json](sft/dataset_stats.json)): + +| Source | Train pct (target) | Train rows | What the model sees | +|----------------------------|:------------------:|:----------:|-------------------------------------------------------------------------------------------| +| `success_first_step` | 55.1% (55%) | 826 | User → Task description → assistant emits the canonical command | +| `multi_step_continuation` | 20.1% (20%) | 301 | User → Task description + a baked-in history of N-1 prior commands and their outputs → assistant emits step N | +| `failure_recovery` | 15.5% (15%) | 232 | User → Task description + step 1 of a wrong command and its simulated error → assistant emits the recovery command | +| `verification` | 4.5% (5%) | 67 | User → Task already complete → assistant emits a read-only verification command | +| `hint_usage` | 4.9% (5%) | 74 | User → Task description → assistant emits `aws help --task-hint` (the agent action that requests a hint) | + +Why include the last four sources at all? + +- **`multi_step_continuation`** trains continuation behavior. Without it, the model overfits to step 1 and degrades on later turns. +- **`failure_recovery`** teaches the model that a typo / wrong command is recoverable. The reward signal during GRPO is dense — the model needs to know what "try again" looks like. +- **`verification`** trains the model to recognize when a task is done and respond appropriately. Production agents must distinguish "do something" from "confirm it's done". +- **`hint_usage`** lets the model learn that `aws help --task-hint` is the in-environment way to request help, not just a literal CLI command. + +--- + +## 3. Tier weighting + +[data/build_sft_dataset.py:54-60](build_sft_dataset.py) — sampling weights: + +| Tier | Weight | Train rows | Why | +|--------------|:------:|:----------:|------------------------------------------------------------------------------------| +| warmup | 0.50 | 456 | Most rows. Format-locks the model on the simplest possible "aws X list" pattern. | +| beginner | 0.30 | 378 | Single-resource creation — bread and butter. | +| intermediate | 0.15 | 666 * | Multi-step workflows. Note actual count > target because each task contributes more rows via multi_step_continuation. | +| advanced | 0.05 | 0 | Cross-service architectures. Filtered out post-extraction (most have dynamic IDs). | +| expert | 0.00 | 0 | SRE / drift / security-posture. **Intentionally excluded from SFT.** | + +> **Why expert tier is excluded from SFT.** The expert tasks (drift detection, security audits) have *randomized* state checks — there is no canonical command sequence. Trying to SFT on them would teach the model a particular fix script that is *wrong* on most episodes. These tasks are reserved for GRPO, where the env's `state_checks` reward signal handles the randomization correctly. + +`*` Intermediate row count exceeds the simple weight because the multi-step trajectory generator naturally produces multiple rows per task (one for step 1, step 2, etc.). + +--- + +## 4. Dataset format & artifacts + +### JSONL chat-message schema + +```json +{ + "messages": [ + {"role": "system", "content": "You are an AWS cloud engineer interacting with a real AWS environment via CLI..."}, + {"role": "user", "content": "TASK: Create an S3 bucket named my-app-data and enable versioning on it.\n\nPREVIOUS COMMANDS:\n[1] $ aws s3 mb s3://my-app-data\n output: make_bucket: my-app-data\n reward: 0.50\n\n---\n\nCURRENT OBSERVATION:\nProgress: 0.50 Achieved: False Step: 2"}, + {"role": "assistant", "content": "aws s3api put-bucket-versioning --bucket my-app-data --versioning-configuration Status=Enabled"} + ], + "difficulty": "intermediate", + "source": "multi_step_continuation", + "task_id": 42 +} +``` + +Every row carries the `difficulty`, `source`, and `task_id` metadata — useful for filtering, ablations, and debugging. + +### Artifacts + +[data/sft/](sft/): + +| File | Size | Rows | Unique tasks | Use | +|--------------------------------------------------------------|------:|------:|:------------:|------------------------------------------------| +| [aws_rl_sft.train.jsonl](sft/aws_rl_sft.train.jsonl) | 2.2 MB | 1,500 | 72 | SFT training | +| [aws_rl_sft.val.jsonl](sft/aws_rl_sft.val.jsonl) | 218 KB | 150 | 63 | SFT validation; basis for [MODEL_EVALUATION.md](sft/MODEL_EVALUATION.md) | +| [aws_rl_sft.reserve.jsonl](sft/aws_rl_sft.reserve.jsonl) | 294 KB | 200 | 66 | Held-out reserve for post-SFT regression checks | +| [dataset_stats.json](sft/dataset_stats.json) | 3.4 KB | — | — | Per-split source/tier/task breakdowns | +| [MODEL_EVALUATION.md](sft/MODEL_EVALUATION.md) | 15 KB | — | — | Full model-selection writeup ([§5](#5-base-model-selection-overview)) | +| [model_eval_full.json](sft/model_eval_full.json) | 209 KB | 297 | — | Per-call eval data (11 models × 27 prompts) | +| [deepseek_r1_rerun.json](sft/deepseek_r1_rerun.json) | 5.3 KB | 27 | — | DeepSeek R1 re-run with `max_tokens=2048` | + +--- + +## 5. Base-model selection — overview + +This is the most rigorous decision in the whole project. Full reasoning, per-model verdicts, and methodology lives in **[data/sft/MODEL_EVALUATION.md](sft/MODEL_EVALUATION.md)** — a 270-line standalone report. Read it before judging the project's technical depth; it's what convinces us we're training the right thing. + +The 30-second summary: + +| Model | exact% | op% | fmt% | Latency | Verdict | +|--------------------------------|:-----:|:----:|:------:|:-------:|--------------------------------------| +| **qwen2.5-coder-3b-instruct** | **41%** | **63%** | 85% | **3.1s** | ✅ Train this. Highest exact, fastest viable. | +| qwen/qwen3-4b-2507 | 33% | 59% | 100% | 10.4s | Fallback. Perfect format, 3× slower. | +| qwen2.5-coder-1.5b-instruct | 22% | 44% | 81% | 2.5s | Speed play if GRPO budget tight. | +| smollm2-1.7b-instruct | 7% | 37% | 63% | 2.1s | ❌ Ceiling too low. | +| (7 more) | 0% | … | … | … | ❌ Format-broken or wrong domain. | + +> ![Per-model comparison: 5 quality metrics + latency](../docs/figures/model_eval_chart.png) + +What the metrics mean: + +- **`fmt%`**: raw output starts with `aws ` (no preamble, fences, or quotes). The agent's [inference.py:93](../inference.py) gate rejects everything else. +- **`+xtr%`**: `fmt%` after stripping markdown fences. Gap to `fmt%` = "model knows the answer, wrapping it in junk". +- **`exact%`**: extracted command matches canonical token-for-token. The hardest metric. +- **`svc%`**: same AWS service as canonical. Domain orientation. +- **`op%`**: same service AND operation. The gap SFT closes most reliably. + +The full table (11 models, 9 metrics, per-call logs) is in [data/sft/model_eval_full.json](sft/model_eval_full.json) — 297 records. + +--- + +## 6. Eval harness + +[data/eval_lm_studio_models.py](eval_lm_studio_models.py) — 9.9 KB, reusable. + +- Calls each chat model loaded in LM Studio at `http://localhost:1234/v1/chat/completions` (OpenAI-compatible API) +- Sends the same 27 held-out prompts to each model +- Extracts `aws ...` from the response (stripping fences / preamble) +- Compares against the canonical command from the val split +- Writes per-call detail + aggregate metrics to JSON + +To re-run post-SFT: + +```bash +.venv/bin/python data/eval_lm_studio_models.py \ + --max-per-combo 5 \ + --out data/sft/model_eval_postsft.json +``` + +A successful SFT run should see (predictions from [MODEL_EVALUATION.md §11](sft/MODEL_EVALUATION.md), and **actuals from our SFT run committed at [out/delta_summary.json](../out/delta_summary.json)**): + +| Metric | Base | Target | **Actual (post-SFT)** | +|-----------|:-----:|:-------:|:---------------------:| +| `exact%` | 39% | 75%+ | **88.9%** ✅ | +| `op%` | 61% | 90%+ | **88.9%** ≈ | +| `svc%` | 78% | — | **88.9%** | +| `fmt%` | 33% | 100% | **100.0%** ✅ | +| latency | 2.03s | — | **1.40s** (faster) | + +Every target from MODEL_EVALUATION.md is hit or essentially hit. Format compliance is now perfect; exact-match jumped 50 pp; the model is faster *and* tighter. + +> ![Base vs SFT comparison (eval metrics)](../docs/figures/base_vs_sft_success.png) +> ![Single-step eval base vs SFT](../docs/figures/single_step_eval.png) + +--- + +## 7. HuggingFace publishing + +[data/upload_sft_to_hf.py](upload_sft_to_hf.py) — pushes the JSONL splits to HuggingFace Hub: + +| Split | Hub repo | +|----------|-----------------------------------------------------| +| train | `Sizzing/aws-rl-sft-qwen25coder3b-train` | +| val | `Sizzing/aws-rl-sft-qwen25coder3b-val` | +| reserve | `Sizzing/aws-rl-sft-qwen25coder3b-reserve` | + +The trained SFT adapter (output of [train/train_sft_lora.ipynb](../train/train_sft_lora.ipynb)) is published separately at: + +- `Sizzing/aws-rl-sft-qwen25coder3b-adapter` + +GRPO training picks it up by setting `SFT_ADAPTER = "Sizzing/aws-rl-sft-qwen25coder3b-adapter"` in [aws_rl_env_colab.ipynb](../aws_rl_env_colab.ipynb). + +--- + +## 8. Files in this directory + +| File | Purpose | +|--------------------------------------------------------------------|--------------------------------------------------------------------| +| [build_sft_dataset.py](build_sft_dataset.py) | Generator — AST extraction + 5 trajectory types + plausible outputs | +| [eval_lm_studio_models.py](eval_lm_studio_models.py) | Base-model benchmark harness (LM Studio API) | +| [upload_sft_to_hf.py](upload_sft_to_hf.py) | Push the SFT splits to HuggingFace | +| [sft/aws_rl_sft.train.jsonl](sft/aws_rl_sft.train.jsonl) | 1,500 SFT training rows | +| [sft/aws_rl_sft.val.jsonl](sft/aws_rl_sft.val.jsonl) | 150 validation rows | +| [sft/aws_rl_sft.reserve.jsonl](sft/aws_rl_sft.reserve.jsonl) | 200 reserve rows | +| [sft/dataset_stats.json](sft/dataset_stats.json) | Per-split source / tier / task counts | +| [sft/MODEL_EVALUATION.md](sft/MODEL_EVALUATION.md) | **The base-model selection report (read this)** | +| [sft/model_eval_full.json](sft/model_eval_full.json) | Per-call eval data (11 models × 27 prompts) | +| [sft/deepseek_r1_rerun.json](sft/deepseek_r1_rerun.json) | R1 re-run with extended `max_tokens` | + +--- + +## See also + +- [Main README](../README.md) +- [data/sft/MODEL_EVALUATION.md](sft/MODEL_EVALUATION.md) — full base-model selection writeup +- [train/README.md](../train/README.md) — how this dataset is consumed by SFT training +- [compare/README.md](../compare/README.md) — how the trained model is benchmarked vs the base +- [server/services/tasks/](../server/services/tasks/) — source of truth for task definitions (the YAML the generator reads) +- [tests_tasks/](../tests_tasks/) — canonical solutions the generator extracts via AST diff --git a/docs/figures/base_vs_sft_success.png b/docs/figures/base_vs_sft_success.png new file mode 100644 index 0000000000000000000000000000000000000000..abad565ef710846a4d081fefeeabd497e9ed027a Binary files /dev/null and b/docs/figures/base_vs_sft_success.png differ diff --git a/docs/figures/compare_dataset.png b/docs/figures/compare_dataset.png new file mode 100644 index 0000000000000000000000000000000000000000..309ba14dee52cf2981bef8285822a79619f8d28a --- /dev/null +++ b/docs/figures/compare_dataset.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0192c7b5d9d57f278aac1a09d776329757ebaff2d3a29d791c3f5cda7258e724 +size 280057 diff --git a/docs/figures/compare_rl_env.png b/docs/figures/compare_rl_env.png new file mode 100644 index 0000000000000000000000000000000000000000..0215290af8b332c02ceda575dd96709063d4b676 --- /dev/null +++ b/docs/figures/compare_rl_env.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eda0c69c8c28515195d005f0a4431b7c6e7959d1f99f5b7c44ed448ede523374 +size 201180 diff --git a/docs/figures/env_init_screenshot.png b/docs/figures/env_init_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..70139c486f2b2b69eda7f16990973ff5a23aa3b9 --- /dev/null +++ b/docs/figures/env_init_screenshot.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:51a633c9058297eae3575abd5a4cb093d9204337bca4b69fd141f471d38ad5c8 +size 371591 diff --git a/docs/figures/grpo_final_per_step.png b/docs/figures/grpo_final_per_step.png new file mode 100644 index 0000000000000000000000000000000000000000..6906f2e8b4c769c16fe7859cd84c0e57c1d210a2 --- /dev/null +++ b/docs/figures/grpo_final_per_step.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f6d5d210de9f473d638cb75cf221e3e703eae9a3d00faa8fbcd122c17919e6ce +size 243084 diff --git a/docs/figures/grpo_optuna_history.png b/docs/figures/grpo_optuna_history.png new file mode 100644 index 0000000000000000000000000000000000000000..c18dc2ead516b9dc89db8bfec817c2bd3f4211fb Binary files /dev/null and b/docs/figures/grpo_optuna_history.png differ diff --git a/docs/figures/grpo_optuna_history_v0.png b/docs/figures/grpo_optuna_history_v0.png new file mode 100644 index 0000000000000000000000000000000000000000..dd603900ca06683d94fc1f7e5df4fd5afdc68f36 Binary files /dev/null and b/docs/figures/grpo_optuna_history_v0.png differ diff --git a/docs/figures/grpo_optuna_hparams.png b/docs/figures/grpo_optuna_hparams.png new file mode 100644 index 0000000000000000000000000000000000000000..71dd136452edb9d2c35325f20f80b39241733894 Binary files /dev/null and b/docs/figures/grpo_optuna_hparams.png differ diff --git a/docs/figures/grpo_optuna_importances.png b/docs/figures/grpo_optuna_importances.png new file mode 100644 index 0000000000000000000000000000000000000000..2947c6b1175e6dab6b18566d6807df9c7f7e12e5 Binary files /dev/null and b/docs/figures/grpo_optuna_importances.png differ diff --git a/docs/figures/grpo_optuna_parallel.png b/docs/figures/grpo_optuna_parallel.png new file mode 100644 index 0000000000000000000000000000000000000000..faee49ecb55d9784cfdb7c714972b104532574e0 Binary files /dev/null and b/docs/figures/grpo_optuna_parallel.png differ diff --git a/docs/figures/grpo_optuna_trial_curves.png b/docs/figures/grpo_optuna_trial_curves.png new file mode 100644 index 0000000000000000000000000000000000000000..f36e3d79c458d28106444ee5364a360856a54a09 --- /dev/null +++ b/docs/figures/grpo_optuna_trial_curves.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8254a87ffe69f2c818b5b403dae41f32dc36c301ca491d8618c41164333f43c6 +size 276663 diff --git a/docs/figures/grpo_optuna_trials_comparison.png b/docs/figures/grpo_optuna_trials_comparison.png new file mode 100644 index 0000000000000000000000000000000000000000..ffd8c65a0daa6a9c1aa4b6711dd26de589bc7204 --- /dev/null +++ b/docs/figures/grpo_optuna_trials_comparison.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:231ca2e7ecae1114a7e61d808f0b3736a22f4ddec7b90d7626cb0fb4d608c4c5 +size 122941 diff --git a/docs/figures/grpo_per_tier_curve.png b/docs/figures/grpo_per_tier_curve.png new file mode 100644 index 0000000000000000000000000000000000000000..9c4a28e80dfbcd6bf6c7448febc233d796c11eb1 Binary files /dev/null and b/docs/figures/grpo_per_tier_curve.png differ diff --git a/docs/figures/grpo_reward_by_tier.png b/docs/figures/grpo_reward_by_tier.png new file mode 100644 index 0000000000000000000000000000000000000000..534bc5b7e12035a10349e8909649fcb297c8d9c8 Binary files /dev/null and b/docs/figures/grpo_reward_by_tier.png differ diff --git a/docs/figures/grpo_reward_curve.png b/docs/figures/grpo_reward_curve.png new file mode 100644 index 0000000000000000000000000000000000000000..32d9ec61115fffc3b4594bdb04a6d3af3aae2567 --- /dev/null +++ b/docs/figures/grpo_reward_curve.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1d1222b3510873dadb8da9be7066e17220c5dab5c6456d11385f4e9f5c99b885 +size 260139 diff --git a/docs/figures/ministack_logo.png b/docs/figures/ministack_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..23ad55feba6c39ba7aec929ab56c62afaace4040 --- /dev/null +++ b/docs/figures/ministack_logo.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:d6ee9620212659d7f7e2da8dcc9ff39cf522d3f34ea07728d6e6ab00df876de5 +size 122307 diff --git a/docs/figures/model_eval_chart.png b/docs/figures/model_eval_chart.png new file mode 100644 index 0000000000000000000000000000000000000000..4c732252b9b05cfaab503c20417751bb46d06d6c Binary files /dev/null and b/docs/figures/model_eval_chart.png differ diff --git a/docs/figures/optuna_history.png b/docs/figures/optuna_history.png new file mode 100644 index 0000000000000000000000000000000000000000..ff96410e19973b36dfec1ed068c903ea8d510aec Binary files /dev/null and b/docs/figures/optuna_history.png differ diff --git a/docs/figures/optuna_parallel.png b/docs/figures/optuna_parallel.png new file mode 100644 index 0000000000000000000000000000000000000000..b58c52e9330843fb4da9bf5bf5d229ae7baa3157 --- /dev/null +++ b/docs/figures/optuna_parallel.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:a235e7fc7050edfdf8f547a31d5630d737c5b85fd5e4f2bcdd0abf1677058926 +size 217512 diff --git a/docs/figures/optuna_param_importance.png b/docs/figures/optuna_param_importance.png new file mode 100644 index 0000000000000000000000000000000000000000..798596f8dca23c8cf5f26a11aa65bca0eb3fc8af Binary files /dev/null and b/docs/figures/optuna_param_importance.png differ diff --git a/docs/figures/optuna_slice.png b/docs/figures/optuna_slice.png new file mode 100644 index 0000000000000000000000000000000000000000..72a1a7cec3824971b4e864a9eaadd8d266afb934 --- /dev/null +++ b/docs/figures/optuna_slice.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b743ec4e945f9ee5239694224d587ee1c912a8d415910e924218c9b5074003fc +size 107177 diff --git a/docs/figures/optuna_trial_curves.png b/docs/figures/optuna_trial_curves.png new file mode 100644 index 0000000000000000000000000000000000000000..0ce944965643570927d4201f4455693f89613daa Binary files /dev/null and b/docs/figures/optuna_trial_curves.png differ diff --git a/docs/figures/qualitative_rollouts.png b/docs/figures/qualitative_rollouts.png new file mode 100644 index 0000000000000000000000000000000000000000..5266e3e3a4976d21ef221c8b174ff08775b2b979 Binary files /dev/null and b/docs/figures/qualitative_rollouts.png differ diff --git a/docs/figures/rl_env_eval_base_vs_sft.png b/docs/figures/rl_env_eval_base_vs_sft.png new file mode 100644 index 0000000000000000000000000000000000000000..5285e869e594523f02f6230dfc2ce08f3ff3e647 Binary files /dev/null and b/docs/figures/rl_env_eval_base_vs_sft.png differ diff --git a/docs/figures/sft_loss_curve.png b/docs/figures/sft_loss_curve.png new file mode 100644 index 0000000000000000000000000000000000000000..7e5fd253f5111cf093e83d8596d92358d8a51751 --- /dev/null +++ b/docs/figures/sft_loss_curve.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e0c0d8d74358a2f95feee6e685e2d512f5ee5bda8ce869686c951114278c9a1a +size 178150 diff --git a/docs/figures/sft_optuna_trials_table.png b/docs/figures/sft_optuna_trials_table.png new file mode 100644 index 0000000000000000000000000000000000000000..d32bbdec6d88df708aed363d8dfa6d0c463d4e19 Binary files /dev/null and b/docs/figures/sft_optuna_trials_table.png differ diff --git a/docs/figures/sft_vs_grpo_by_tier.png b/docs/figures/sft_vs_grpo_by_tier.png new file mode 100644 index 0000000000000000000000000000000000000000..d8fcdc5919a7296bbd92b3460a7dc48197b7ee4a Binary files /dev/null and b/docs/figures/sft_vs_grpo_by_tier.png differ diff --git a/docs/figures/sft_vs_grpo_metrics_grid.png b/docs/figures/sft_vs_grpo_metrics_grid.png new file mode 100644 index 0000000000000000000000000000000000000000..798d37cdb2a01ce05e67d39fb8a40afc0302ee39 Binary files /dev/null and b/docs/figures/sft_vs_grpo_metrics_grid.png differ diff --git a/docs/figures/sft_vs_grpo_scalar.png b/docs/figures/sft_vs_grpo_scalar.png new file mode 100644 index 0000000000000000000000000000000000000000..93d97bdb9341362d615615143d794c175e48e8b0 Binary files /dev/null and b/docs/figures/sft_vs_grpo_scalar.png differ diff --git a/docs/figures/single_step_eval.png b/docs/figures/single_step_eval.png new file mode 100644 index 0000000000000000000000000000000000000000..eff9c3985da7449e74e3008b84d3f251dfb88d77 Binary files /dev/null and b/docs/figures/single_step_eval.png differ diff --git a/images/compare_dataset.png b/images/compare_dataset.png new file mode 100644 index 0000000000000000000000000000000000000000..309ba14dee52cf2981bef8285822a79619f8d28a --- /dev/null +++ b/images/compare_dataset.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0192c7b5d9d57f278aac1a09d776329757ebaff2d3a29d791c3f5cda7258e724 +size 280057 diff --git a/images/compare_rl_env.png b/images/compare_rl_env.png new file mode 100644 index 0000000000000000000000000000000000000000..0215290af8b332c02ceda575dd96709063d4b676 --- /dev/null +++ b/images/compare_rl_env.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:eda0c69c8c28515195d005f0a4431b7c6e7959d1f99f5b7c44ed448ede523374 +size 201180 diff --git a/pyproject.toml b/pyproject.toml index db79a4fe77796d7ec65fb8121c2e997c71a15c17..c6da29ee747054abe4bd7418a40e5e40d89587c3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -34,7 +34,16 @@ train = [ "ipykernel", "ipywidgets>=8.1.0", "datasets>=4.8.4", - "huggingface-hub>=1.9.0", + "huggingface-hub>=0.34,<1.0", + # GRPO training stack (versions mirror train/train_grpo_lora.ipynb) + "unsloth", + "trl>=0.18.2,<=0.24.0,!=0.19.0", + "peft", + "accelerate", + "bitsandbytes", + "transformers>=4.50,<5.0", + "optuna", + "matplotlib", ] diff --git a/scripts/README.md b/scripts/README.md new file mode 100644 index 0000000000000000000000000000000000000000..5709902e6616f38deaf78af57d9245d1b8453f30 --- /dev/null +++ b/scripts/README.md @@ -0,0 +1,260 @@ +# `scripts/` — Parallel Rollout Architecture + +[← back to main README](../README.md) + +This directory holds the helper modules that make **8 concurrent multi-turn rollouts** against the AWS RL environment possible — the scaling trick that turns GRPO from a thought experiment into something you can actually train on a single GPU. + +If you only read one section, read [§2 — Three coordinated pool layers](#2-three-coordinated-pool-layers). It explains the architecture in one page. + +--- + +## Table of contents + +1. [Why parallel rollouts matter](#1-why-parallel-rollouts-matter) +2. [Three coordinated pool layers](#2-three-coordinated-pool-layers) +3. [Walking through one GRPO step](#3-walking-through-one-grpo-step) +4. [The all-or-nothing connect protocol](#4-the-all-or-nothing-connect-protocol) +5. [Concurrency-safety guarantees](#5-concurrency-safety-guarantees) +6. [Configuration](#6-configuration) +7. [Running the multi-connection demo](#7-running-the-multi-connection-demo) +8. [Files in this directory](#8-files-in-this-directory) + +--- + +## 1. Why parallel rollouts matter + +GRPO computes **group-relative advantages**: every gradient step needs `G` rollouts on the *same* prompt so the algorithm can normalize rewards within the group. With `G = 8`, multi-turn episodes (≤ 6 turns), and an env step that round-trips an AWS CLI invocation through MiniStack (~50 ms), the math is: + +``` +Serial: 8 rollouts × 6 turns × 50 ms = 2,400 ms env-time per GRPO step +Parallel: max(8 envs) × 6 turns × 50 ms = 300 ms env-time per GRPO step +``` + +That's an 8× speedup on the env side. The model forward pass still serialises (single GPU), so the practical end-to-end gain depends on the env/compute ratio — but for an env that takes ~50 ms per step, parallelism is the difference between a tractable training run and a 24-hour one. + +The parallelism isn't free: each rollout needs **state isolation**. If two rollouts share an AWS world, rollout 1's S3 buckets bleed into rollout 2's view, the curriculum mastery numbers go to garbage, and the agent can hack the reward by piggy-backing off siblings. The three coordinated pools below exist to make state isolation cheap and automatic. + +> ![8 simultaneous WebSocket sessions established to the env server](../docs/figures/env_init_screenshot.png) + +--- + +## 2. Three coordinated pool layers + +The system has **three pools** that work together. They look similar at first glance — all of them deal with N concurrent envs — but each operates at a different layer of the stack: + +``` +┌─────────────────────────────────────────────────────────────────────────────┐ +│ Layer 3 — Trainer-process pool │ +│ MultiTurnEnvPool (train_grpo.py) │ +│ • owns a background asyncio loop │ +│ • exposes a sync run_group() that the GRPO trainer can call │ +│ • used by the in-process trainer (CLI: python train_grpo.py) │ +└────────────────────────────────────┬────────────────────────────────────────┘ + │ N WebSocket clients +┌────────────────────────────────────▼────────────────────────────────────────┐ +│ Layer 3 alt — Notebook-friendly pool │ +│ GrpoPool (scripts/grpo_pool.py) │ +│ • async-native API (async with GrpoPool(...) as pool: ...) │ +│ • used by Colab notebooks where the cell IS the asyncio loop │ +│ • simpler interface (no background thread) │ +└────────────────────────────────────┬────────────────────────────────────────┘ + │ N WebSocket clients +┌────────────────────────────────────▼────────────────────────────────────────┐ +│ Layer 2 — OpenEnv max_concurrent_envs │ +│ create_app(env_factory, ..., max_concurrent_envs=POOL_SIZE) │ +│ • OpenEnv reserves up to N env instances at once │ +│ • returns 503 if a 9th client tries to connect when POOL_SIZE=8 │ +└────────────────────────────────────┬────────────────────────────────────────┘ + │ env_factory() invoked per session +┌────────────────────────────────────▼────────────────────────────────────────┐ +│ Layer 1 — Server-side MiniStack pool │ +│ MiniStackPool (server/app.py) │ +│ • free-list of MiniStack ports (BASE..BASE+POOL_SIZE-1) │ +│ • acquire()/release() under a threading.Lock │ +│ • each WS session binds to ONE port for its lifetime → state isolation │ +└─────────────────────────────────────────────────────────────────────────────┘ + │ + ▼ + N independent MiniStack processes + (started by Dockerfile / Makefile) +``` + +### Layer 1 — Server-side `MiniStackPool` + +Lives in [server/app.py:75–138](../server/app.py). Documented in detail in [server/README.md §6](../server/README.md#6-server-side-ministack-pool-parallel-rollouts). + +- A `threading.Lock`-guarded free list of port numbers +- `acquire()` returns a port; `release(port)` puts it back +- `RuntimeError("MiniStack pool exhausted")` if depleted +- The Dockerfile launches `POOL_SIZE` MiniStack processes on consecutive ports before the FastAPI server starts accepting connections + +### Layer 2 — OpenEnv `max_concurrent_envs` + +When `create_app()` is called with `max_concurrent_envs=POOL_SIZE`, OpenEnv enforces the cap upstream — clients beyond the cap get a clean 503 instead of `RuntimeError`. Defence in depth. + +### Layer 3 — Client pools + +Two flavours, same parallelism model, different ergonomics: + +| | `MultiTurnEnvPool` ([train_grpo.py](../train_grpo.py)) | `GrpoPool` ([scripts/grpo_pool.py](grpo_pool.py)) | +|---|---|---| +| API | Sync — `pool.run_group(task, ...)` | Async — `await pool.run_group(rollout_fn)` | +| Loop | Owns a background thread + asyncio loop | Caller is the asyncio loop (Colab cell) | +| Use case | In-process trainer (`python train_grpo.py`) | Notebooks driving training from Colab | +| Connection | `await asyncio.gather(*(e.connect() for e in envs))` on background thread | Same, but on the caller's loop | +| `record_result()` | Trainer calls `Curriculum.record_result()` directly | `pool.record_group_result(task, rewards)` helper baked in | + +Both share the **all-or-nothing connect protocol** described in §4. + +### Why two client pools? + +Real life: the trainer process (`python train_grpo.py`) runs synchronously — TRL's `GRPOTrainer.train()` blocks. To use `await asyncio.gather` from inside that, we need a background asyncio loop on a separate thread. That's `MultiTurnEnvPool`. + +Colab cells, on the other hand, *are* the asyncio loop (Jupyter ≥ 7 ships nest_asyncio under the hood). Running a background thread + loop there is overkill and creates ordering bugs. `GrpoPool` is the simpler async-native variant for that case. + +The two pools share semantic invariants — same N, same all-or-nothing connect, same task scoping — so behaviour is identical regardless of which entry point you use. + +--- + +## 3. Walking through one GRPO step + +``` +1. trainer picks one task from the Curriculum (1 task) +2. pool.run_group(task) (asyncio.gather over N envs) +3. for turn in 0..MAX_TURNS: + prompts = build_prompts(observations) (CPU) + completions = policy.generate(prompts) (1 batched fwd, GPU) + actions = parse_completions(completions) (CPU; extract `aws ...` line) + observations = await pool.run_group_step(actions) (N concurrent env.step) +4. rewards = sum_per_episode(rewards_lists) (N floats) +5. GRPO computes group-relative advantages, KL, loss (1 backward, GPU) +6. Curriculum.record_result(task, mean(rewards)) (1 update) +``` + +A couple of subtleties: + +### Generation is serialised, env-step is not + +[train_grpo.py:_GENERATE_LOCK](../train_grpo.py) — a `threading.Lock` around `model.generate()`. The model lives on a single GPU; concurrent `generate()` calls would clobber each other. We let env step calls run concurrently (the slow part — WebSocket round-trip + MiniStack execution); only generation serialises. + +### Per-turn token accumulation + +`rollout_one_episode()` accumulates `prompt_ids`, `completion_ids`, and `logprobs` across turns into a single sequence. GRPO then assigns the episode-level reward to that full sequence. This matches the multi-turn structure of the underlying decision problem. + +### Why every rollout in a group runs the same task + +GRPO's group-relative advantage is `(reward_i − group_mean) / group_std`. If different rollouts ran different tasks, group statistics would mean nothing. The curriculum picks one task per GRPO step; the pool's `reset_group(task)` forces every env to that task; only then can the group statistics be meaningful. + +--- + +## 4. The all-or-nothing connect protocol + +[scripts/grpo_pool.py:58-82](grpo_pool.py) — the most non-obvious correctness detail in the whole pool stack. + +```python +async def connect(self) -> None: + if self.envs: + return + envs = [AwsRlEnv(base_url=self.base_url) for _ in range(self.size)] + try: + await asyncio.gather(*(e.connect() for e in envs)) + except BaseException: + # Roll back: close every env (successful or not). return_exceptions + # so a close() failure doesn't mask the original connect error. + await asyncio.gather( + *(e.close() for e in envs), + return_exceptions=True, + ) + raise + # Only publish the pool after the entire group connected successfully. + self.envs = envs +``` + +What makes this important: + +1. **`asyncio.gather` raises on the first failure**. If 3 of 8 connects succeed and the 4th raises, the other 4 may or may not have connected yet. Their state is undefined. +2. **Server-side state matters**. Each successful connect acquired a MiniStack port from the server pool. If we just `raise` without cleanup, those ports stay held until the WebSocket times out — typically minutes. The next training run hits "pool exhausted". +3. **`self.envs` is published only after success**. If any partial state were exposed, callers might call `pool.run_group()` on a half-initialised pool and get N/M valid results. +4. **`return_exceptions=True` on the rollback**. A close error must not mask the original connect error — the user needs to know the *real* reason connect failed, not a downstream cleanup failure. + +These four invariants are the difference between "training reliably resumes after a flake" and "every flake leaks 7 ports and you're rebuilding the container at 3 AM". + +`MultiTurnEnvPool._connect_all()` in [train_grpo.py:473-480](../train_grpo.py) implements the same pattern. + +--- + +## 5. Concurrency-safety guarantees + +| Concern | Guarantee | Where enforced | +|------------------------------|---------------------------------------------------------------------------------------------|-----------------------------------------------------------| +| Cross-rollout state isolation | Each WebSocket session holds its own MiniStack port for its lifetime | `MiniStackPool.acquire/release` ([server/app.py](../server/app.py)) | +| Curriculum coherence | One curriculum instance per training run; `record_result()` is the only mutation point | `make_rollout_func` in [train_grpo.py](../train_grpo.py) | +| GPU contention | `model.generate()` calls serialised behind `_GENERATE_LOCK` | [train_grpo.py:_GENERATE_LOCK](../train_grpo.py) | +| Pool slot leakage on flake | All-or-nothing connect with rollback close | `GrpoPool.connect`, `MultiTurnEnvPool._connect_all` | +| Hung shutdown | Pool close runs `asyncio.gather(..., return_exceptions=True)` then stops the loop with timeout | `MultiTurnEnvPool.close()` | +| Web playground vs pool collisions | Web routes refuse to mount when `POOL_SIZE > 1` | [server/app.py:171](../server/app.py) | + +Tests covering these: + +- [tests/test_pool.py](../tests/test_pool.py) — server-side `MiniStackPool` acquire/release, exhaustion behaviour +- [tests/test_grpo_pool.py](../tests/test_grpo_pool.py) — `GrpoPool` connect/close lifecycle, partial-connect rollback, group-result aggregation + +--- + +## 6. Configuration + +| Variable | Default | Purpose | +|-------------------------------------|---------|-------------------------------------------------------------------------------------| +| `AWS_RL_ENV_POOL_SIZE` | `1` | Server-side MiniStack pool size. Set to `8` for GRPO training. Must be ≥ training-time `num_generations`. | +| `AWS_RL_ENV_MINISTACK_BASE_PORT` | `4566` | First MiniStack port; the pool covers `[BASE, BASE + POOL_SIZE)` | +| `BACKEND_TYPE` | `simulator` | `simulator` (default; pool is meaningful) or `aws` (real AWS; pool disabled) | +| `NUM_GENERATIONS` (in trainer cfg) | `8` | Number of WebSocket clients the pool opens. Should equal `AWS_RL_ENV_POOL_SIZE` for full parallelism. | +| `MAX_TURNS` (in trainer cfg) | `6` | Per-rollout episode length cap | +| `MAX_TOTAL_TOKENS` (in trainer cfg) | `4096` | Per-episode token budget (anti-OOM) | + +When deploying to HuggingFace Spaces, pool size is constrained by container memory — each MiniStack process is ~50–100 MB resident. + +--- + +## 7. Running the multi-connection demo + +[scripts/TestMultipleConnects.ipynb](TestMultipleConnects.ipynb) is a hands-on notebook that proves all 8 sessions stay isolated. + +```bash +# 1. Start the env server with pool size 8 +AWS_RL_ENV_POOL_SIZE=8 make run + +# 2. Run the notebook +jupyter notebook scripts/TestMultipleConnects.ipynb +``` + +Expected output: 8 simultaneous "connection open" lines, 8 independent reset/step traces, no resource bleed across sessions. + +The screenshot at [docs/figures/env_init_screenshot.png](../docs/figures/env_init_screenshot.png) captures one such run. + +--- + +## 8. Files in this directory + +| File | Purpose | +|-------------------------------------------------------|--------------------------------------------------------------------------| +| [grpo_pool.py](grpo_pool.py) (139 LOC) | Async-native `GrpoPool` — N persistent WebSockets, `asyncio.gather`, all-or-nothing connect, group-result aggregation | +| [grpo_train.py](grpo_train.py) (~430 LOC) | Alternative training entry point that uses `GrpoPool` directly (vs `train_grpo.py` which embeds `MultiTurnEnvPool`) | +| [TestMultipleConnects.ipynb](TestMultipleConnects.ipynb) | Hands-on demo proving 8 concurrent WebSockets stay isolated | + +Related code outside this directory: + +- [train_grpo.py](../train_grpo.py) — `MultiTurnEnvPool` class, the canonical in-process pool +- [server/app.py](../server/app.py) — `MiniStackPool`, `make_env_factory`, the server-side pool layer +- [client.py](../client.py) — `AwsRlEnv` WebSocket client used by both pools +- [tests/test_pool.py](../tests/test_pool.py), [tests/test_grpo_pool.py](../tests/test_grpo_pool.py) — concurrency tests + +--- + +## See also + +- [Main README](../README.md) — project overview +- [server/README.md](../server/README.md) — environment internals (server-side pool detail in §6) +- [train/README.md](../train/README.md) — SFT + GRPO training pipeline (this pool plugs into the GRPO loop) +- [tests/test_pool.py](../tests/test_pool.py) — server-side pool acquire/release tests +- [tests/test_grpo_pool.py](../tests/test_grpo_pool.py) — client-side pool lifecycle tests diff --git a/server/README.md b/server/README.md new file mode 100644 index 0000000000000000000000000000000000000000..394411da6ccaced7a9db2394007b83d6d3ed5104 --- /dev/null +++ b/server/README.md @@ -0,0 +1,596 @@ +# `server/` — AWS RL Environment Internals + +[← back to main README](../README.md) + +This directory implements the **OpenEnv-compatible FastAPI server** that powers the AWS RL Environment. The server exposes HTTP and WebSocket endpoints to a training agent, executes AWS CLI commands against a backing simulator (or real AWS), runs a reward / curriculum stack, and returns shaped observations. + +If you only have time for the headline numbers, read [the main README](../README.md). This document is the reference for **how** the environment actually works — every defended invariant, every edge case, every config knob. + +--- + +## Table of contents + +1. [Architecture overview](#1-architecture-overview) +2. [HTTP / WebSocket endpoints](#2-http--websocket-endpoints) +3. [Episode lifecycle](#3-episode-lifecycle) +4. [Strategy pattern: Simulator vs Real AWS](#4-strategy-pattern-simulator-vs-real-aws) +5. [MiniStack: vendored fork & customizations](#5-ministack-vendored-fork--customizations) +6. [Server-side MiniStack pool (parallel rollouts)](#6-server-side-ministack-pool-parallel-rollouts) +7. [Curriculum manager](#7-curriculum-manager) +8. [Reward shaping & TaskGrader](#8-reward-shaping--taskgrader) +9. [Anti-reward-hacking — 8 defense layers](#9-anti-reward-hacking--8-defense-layers) +10. [Resource verifier](#10-resource-verifier) +11. [Chaos engine](#11-chaos-engine) +12. [Drift engine](#12-drift-engine) +13. [Hint provider](#13-hint-provider) +14. [Episode tracker](#14-episode-tracker) +15. [Environment designer](#15-environment-designer) +16. [Task definitions (YAML schema)](#16-task-definitions-yaml-schema) +17. [Security-posture audit examples](#17-security-posture-audit-examples) +18. [Curriculum stats API](#18-curriculum-stats-api) +19. [Web playground](#19-web-playground) + +--- + +## 1. Architecture overview + +``` +┌──────────────────────────────── server/ process ────────────────────────────────┐ +│ │ +│ FastAPI app (server/app.py) │ +│ ├── OpenEnv router /reset /step /state /schema /ws /health │ +│ ├── Web router /web /web/reset /web/step /web/state /web/solution │ +│ └── env_factory ──► AwsRlEnvironment(strategy=…) │ +│ │ │ +│ ├── EpisodeTracker (per-episode state) │ +│ ├── Curriculum (priority + mastery) │ +│ ├── EnvironmentDesigner (setup commands) │ +│ ├── HintProvider (3-level hints) │ +│ ├── ChaosEngine (mid-episode mutations) │ +│ ├── DriftEngine (drift-task injection) │ +│ ├── TaskGrader (5-strategy dispatcher) │ +│ ├── ResourceVerifier (ground-truth state) │ +│ └── EnvironmentStrategy ──► SimulatorStrategy │ +│ ╲ (talks to MiniStack) │ +│ ╲ AwsStrategy │ +│ (talks to real AWS) │ +└─────────────────────────────────────────────────────────────────────────────────┘ + │ + ▼ + MiniStack process(es) on :4566+ + (own port per pool slot when AWS_RL_ENV_POOL_SIZE > 1) +``` + +Files: + +- [server/app.py](app.py) — FastAPI app, OpenEnv integration, MiniStack pool, web routes +- [server/aws_rl_env_environment.py](aws_rl_env_environment.py) — main `AwsRlEnvironment` orchestrator +- [server/services/](services/) — pluggable services (one concern per file, listed in §7–§16) +- [server/services/tasks/](services/tasks/) — YAML task definitions, one file per tier +- [server/templates/index.html](templates/index.html) — playground HTML +- [server/static/](static/) — playground JS/CSS, 40 AWS service icons + +--- + +## 2. HTTP / WebSocket endpoints + +OpenEnv-compatible (created via `openenv.core.env_server.http_server.create_app`): + +| Method | Path | Purpose | +|--------|----------|-----------------------------------------------------------------| +| POST | `/reset` | Wipe infra, pick next task from curriculum, return observation | +| POST | `/step` | Execute action, grade, optionally inject chaos, return obs | +| GET | `/state` | Full `AwsRlState` snapshot (current task, tracker, infra state) | +| GET | `/schema`| JSON schemas for `AwsRlAction` / `AwsRlObservation` | +| GET | `/health`| Liveness probe | +| WS | `/ws` | Persistent session (one MiniStack acquired per connection) | + +Web playground (always mounted; backed by a dedicated lazy MiniStack — see §6): + +| Method | Path | Purpose | +|--------|------------------|-----------------------------------------------------------| +| GET | `/` | Redirect → `/web` | +| GET | `/web` | HTML playground (Jinja2 template `index.html`) | +| POST | `/web/reset` | Stateful reset for the playground's shared env | +| POST | `/web/step` | Stateful step for the playground's shared env | +| GET | `/web/state` | Current `AwsRlState` for the shared env | +| GET | `/web/solution` | Reveal next canonical solution command (debug aid) | + +Auto-generated docs: `/docs` (Swagger), `/redoc` (ReDoc). + +--- + +## 3. Episode lifecycle + +1. **`reset()`** + 1. `EnvironmentStrategy.reset_environment()` — wipes simulator state (no-op for real AWS) + 2. `Curriculum.next_task()` — picks the next task (see §7 priority scoring) + 3. `EnvironmentDesigner.provision(task.setup_commands)` — runs preflight CLI commands to create the broken / insecure infra the agent must fix (used by SRE, drift, security-posture tasks) + 4. `DriftEngine.inject(task)` — for drift tasks, randomly applies 2–3 mutations from `task.possible_drifts` + 5. `EpisodeTracker.start(task)` — fresh tracker + 6. Returns initial `AwsRlObservation` with the masked `TaskInfo` (task description but **not** success criteria) + +2. **`step(action)`** + 1. **Validate** — only commands starting with `aws ` are accepted (see §9 layer 4) + 2. **Intercept hint requests** — `aws help --task-hint` returns next-level hint, increments `hints_used`, never reaches the simulator + 3. `EnvironmentStrategy.execute(command)` — runs the AWS CLI invocation, returns stdout / stderr / exit_code + 4. `EpisodeTracker.record(...)` — parses command, dedup-checks, updates `partial_progress` + 5. `TaskGrader.grade(...)` — returns shaped reward (see §8) + 6. `ChaosEngine.maybe_inject(...)` — at tier-scaled probability, executes a destructive mutation on a resource the agent just touched + 7. `Curriculum.record_step(...)` — accumulates step-level signal + 8. Returns updated `AwsRlObservation` + +3. **Termination** + - `obs.task_achieved == True`, **or** + - `step_count >= MAX_STEPS` (default 15, configurable via env var) + - On terminate: `Curriculum.record_result(task, achieved, reward)` updates per-task mastery and may promote the agent's tier + +--- + +## 4. Strategy pattern: Simulator vs Real AWS + +The environment supports two backends, swapped via the `BACKEND_TYPE` env var (default `simulator`): + +### `SimulatorStrategy` — [services/simulator_strategy.py](services/simulator_strategy.py) + +- Talks to a MiniStack instance over HTTP (`AWS_INFRA_URL`, default `http://localhost:4566`) +- AWS CLI invocations are subprocessed with `AWS_ENDPOINT_URL` set so they hit MiniStack +- `reset_environment()` calls MiniStack's `/_ministack/reset` endpoint to wipe state +- `get_state()` reads the **custom** `/_ministack/state` endpoint (see §5) — one HTTP call returns the entire infra inventory used by `ResourceVerifier` + +### `AwsStrategy` — [services/aws_strategy.py](services/aws_strategy.py) + +- Uses ambient AWS credentials (whatever the standard AWS CLI credential chain finds) +- No `AWS_ENDPOINT_URL` override — commands hit real AWS +- `reset_environment()` is a **no-op** (we cannot wipe a real AWS account; expert-level task scenarios assume a clean / sandboxed sub-account) +- Useful for end-to-end demonstrations, less so for RL training + +Switching backends: + +```bash +export BACKEND_TYPE=aws # or "simulator" (default) +make run +``` + +The factory in [server/app.py](app.py) wires the right strategy at startup. + +--- + +## 5. MiniStack: vendored fork & customizations + +> **Why this matters:** the simulator that the grader queries is not a black-box pip dependency — it's vendored in-tree as a git subtree at [aws_infra/](../aws_infra/) so we can extend it. The custom endpoints we added there are how `ResourceVerifier` and the grader can read full infra state in a single round-trip. + +### Vendored as a git subtree + +`aws_infra/` was imported via `git subtree add` in commit **[`2c38c0b` "Bring mini stack to local"](../aws_infra/)** (PR #5). Upstream is the public MiniStack project. The full upstream README is preserved at [aws_infra/README.md](../aws_infra/README.md) (81 KB). + +Why we vendored instead of taking a pip dependency: + +1. **Custom endpoints**: we needed JSON state-introspection endpoints (`/_ministack/state`, `/_ministack/actions`) that upstream did not ship. These are the integration seams between our env grader and the simulator. +2. **Reproducible builds**: the Docker image ships a specific MiniStack revision; no runtime network fetch, identical behavior across environments. +3. **Service-coverage extensions**: occasional patches to individual service handlers (e.g. RDS state retrieval used by `ResourceVerifier`). + +### Custom modifications on top of upstream + +Each modification is a separate, cleanly-cherry-pickable commit so future upstream syncs are low-conflict. + +| Commit | Title | What it adds | +|-----------|----------------------------------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `a648c3a` | feat: Add support for service state retrieval and action listing across multiple AWS services | `/_ministack/state` returns the entire infra inventory as JSON in one call (the grader's primary read path). `/_ministack/actions` lists every supported operation per service — used by tooling and tests. | +| `a00e981` | chor: Small Fixes | Tightening / typo fixes on top of `a648c3a`. | +| `af2e945` | Sync MiniStack with latest changes | Periodic upstream sync. Replays our custom commits cleanly because they are isolated and well-scoped. | +| `579597b` | Sync MiniStack with latest changes | Subsequent upstream sync. | + +To inspect any of these: + +```bash +git show a648c3a # see the full diff for the state endpoint +git log --oneline -- aws_infra/ # see only the aws_infra/ history +``` + +### Build integration + +- [aws_infra/pyproject.toml](../aws_infra/pyproject.toml) declares MiniStack as its own package; we install it as an editable dependency via `make install-all`. +- The [Dockerfile](../Dockerfile) stages MiniStack explicitly so the resulting container has no external network requirement at runtime. +- The [aws_infra/Makefile](../aws_infra/Makefile) provides `make build` and `make test` targets if you want to work on MiniStack itself. +- `aws_infra/docker-compose.yml` lets you run MiniStack alone for debugging. + +### Upstream sync workflow + +```bash +# From the repo root +git subtree pull --prefix=aws_infra main --squash +# Resolve any conflicts (rare, because our patches live in identifiable commits) +# Test: +pytest tests/ -k "verifier or grader" +``` + +--- + +## 6. Server-side MiniStack pool (parallel rollouts) + +> **Why:** GRPO training generates `G=8` rollouts per step on the same task and computes group-relative advantages. To run those 8 rollouts truly in parallel **without state bleed**, every rollout needs its own AWS world. The server-side pool makes that possible. + +### Design — [server/app.py:75–138](app.py) + +When the server boots, `make_env_factory(POOL_SIZE, BASE_PORT, BACKEND_TYPE)` decides which factory to install: + +| Mode | What gets created | +|-------------------------------------------------|--------------------------------------------------------------------------------| +| `BACKEND_TYPE=aws` | No pool. All sessions share `AwsStrategy`. Pool would be meaningless on real AWS. | +| `AWS_RL_ENV_POOL_SIZE=1` (default) | No pool object; one shared `SimulatorStrategy` on the default port. | +| `AWS_RL_ENV_POOL_SIZE=N` (`N>1`, simulator) | A `MiniStackPool` (thread-safe free-list of ports `BASE..BASE+N-1`). Each WebSocket session calls `pool.acquire()` to get its own MiniStack port; on disconnect `env.close()` triggers `pool.release(port)`. | + +The pool's `acquire()` raises `RuntimeError("MiniStack pool exhausted")` if a 9th client tries to connect when `POOL_SIZE=8`. OpenEnv's `create_app(..., max_concurrent_envs=POOL_SIZE)` enforces the same cap upstream so callers see a clean 503 instead. + +### The Dockerfile launches N MiniStacks + +The container's entrypoint starts `POOL_SIZE` MiniStack processes on ports `4566..4566+POOL_SIZE-1` before the FastAPI server is ready to accept connections. Each MiniStack runs the same image but has its own in-memory state — so the 8 rollouts cannot accidentally see each other's S3 buckets, IAM roles, etc. + +### Web playground gets its own MiniStack (lazy, on a constant port) + +The pool owns `[BASE..BASE+N-1]` for WebSocket sessions. The web playground's shared `_env` cannot share those ports — a `/web/step` would clobber whichever rollout currently holds the same MiniStack. Instead, the web UI uses a **dedicated MiniStack on a constant port outside the pool's range** (`AWS_RL_ENV_WEB_MINISTACK_PORT`, default `4565`). The pool is constructed as `range(BASE, BASE+N)`, so `pool.acquire()` can never hand out the web port. + +That dedicated MiniStack is **spawned lazily** by the FastAPI server on the first `/web/*` request (`subprocess.Popen(["ministack", "-d"], env={"GATEWAY_PORT": "4565", ...})`). Training-only deployments — the common case — pay zero cost: the extra MiniStack only exists if a user actually opens the playground. First request takes ~1–3s for the bind; subsequent requests are fast (cached `_env`). A startup assertion refuses to boot if `AWS_RL_ENV_WEB_MINISTACK_PORT` falls inside the pool's range. + +`POOL_SIZE=1` keeps the legacy single-MiniStack path: the web env shares `:4566` with the lone pool MiniStack — no extra process, no extra port. + +### Configuration + +| Env var | Default | Purpose | +|------------------------------------|---------|---------------------------------------------------------------| +| `AWS_RL_ENV_POOL_SIZE` | `1` | Number of MiniStack instances + WebSocket session capacity | +| `AWS_RL_ENV_MINISTACK_BASE_PORT` | `4566` | First MiniStack port; pool covers `[BASE, BASE + N)` | +| `AWS_RL_ENV_WEB_MINISTACK_PORT` | `4565` | Web playground's dedicated MiniStack port (lazy spawn; must lie outside the pool's range when `POOL_SIZE>1`) | +| `BACKEND_TYPE` | `simulator` | `simulator` (default, MiniStack) or `aws` (real AWS, pool disabled) | + +### Cross-link + +The **client side** of this pool — the `GrpoPool` and `MultiTurnEnvPool` that open N persistent WebSocket connections and run rollouts concurrently — is documented in [scripts/README.md](../scripts/README.md). Read that doc for the full multi-turn + multi-rollout walkthrough. + +--- + +## 7. Curriculum manager + +[services/curriculum.py](services/curriculum.py) — 536 LOC. Adaptive task selection with mastery tracking, spaced repetition, and tier promotion. + +### Per-tier configuration + +| Tier | min_episodes | advance_rate | mastery_window | mastery_threshold | fast_track_rate | chaos_probability | +|--------------|:------------:|:------------:|:--------------:|:-----------------:|:---------------:|:-----------------:| +| warmup | 5 | 0.6 | 10 | 0.7 | 0.9 | 0.0 | +| beginner | 10 | 0.65 | 10 | 0.7 | 0.9 | 0.0 | +| intermediate | 15 | 0.65 | 10 | 0.7 | 0.9 | 0.10 | +| advanced | 15 | 0.7 | 10 | 0.7 | 0.9 | 0.20 | +| expert | 20 | 0.7 | 10 | 0.7 | 0.9 | 0.30 | + +### Priority scoring + +For each episode the curriculum picks the highest-scored task within the agent's current tier: + +``` +score = novelty_bonus # +100 if never attempted + + weakness_weight # +50 × (1 − task_success_rate) + + spaced_rep_bonus # +30 if a graduated task is "due" for re-test + − recency_penalty # −20 if attempted in the last 2 episodes +``` + +This single formula simultaneously enforces exploration (novelty), targets weak spots (weakness), prevents forgetting (spaced rep), and avoids rut behavior (recency). No hand-coded scheduling — it falls out of the score. + +### Mastery model + +- **Window**: the last 10 episodes for each task +- **Threshold**: a task graduates when its weighted success rate crosses 0.7 +- **Decay**: `0.85` exponential — recent results count for more +- **Un-graduation**: if a graduated task drops back below threshold, it loses graduation and re-enters the rotation + +### Spaced repetition + +Graduated tasks resurface at intervals `[3, 6, 12, 24, 48]` episodes. Pass on re-test → interval doubles (capped at 48). Fail → interval resets to 3. The `+30` priority bonus in the scoring formula is what surfaces them. + +### Tier promotion + +Two paths: + +- **Standard**: `tier_episodes >= min_episodes` and `tier_success_rate >= advance_rate` +- **Fast-track**: 3 consecutive episodes at ≥ `fast_track_rate` (0.9) — bypasses the minimum + +Demotion is **not** supported — the agent's "ratchet" only goes up. (Mastery on individual tasks does decay; the *tier* does not.) + +### Notable APIs + +- `Curriculum.next_task() -> Task` — selection +- `Curriculum.record_result(task, achieved, reward)` — episode-level callback +- `Curriculum.get_task_by_id(task_id) -> Task` — used by the GRPO validation harness for frozen held-out tasks +- `Curriculum.get_stats() -> dict` — see §18 + +--- + +## 8. Reward shaping & TaskGrader + +[services/task_grader.py](services/task_grader.py) — 264 LOC. The grader is the single source of reward truth. + +### Reward formula + +``` +if task_achieved: + reward = 1.0 + if survived_chaos: reward *= 1.05 # ≤ 1.05 cap +else: + reward = partial_progress * 0.8 # ≤ 0.8 from steps alone + if progress_increased: reward += 0.1 # dense progress signal + if command_failed: reward *= 0.5 # error penalty + reward -= 0.1 * rollback_count # create→delete pairs + reward += 0.02 * idempotent_retries # graceful "already exists" + reward = clamp(reward, 0.0, 0.99) # 1.0 reserved for completion + +reward *= 0.85 ** hints_used # hint decay applied last +``` + +This is **dense by design** — the agent gets meaningful feedback on every step, not just at episode end. + +### Five grading strategies (dispatcher pattern) + +`TaskGrader.grade()` dispatches on `task.success_criteria.grading_strategy`: + +| Tier | Strategy | Mechanism | Partial-progress source | +|--------------|---------------------------|--------------------------------------------------------------------------------------------|--------------------------------------| +| Warmup | `command_match` | Latest command contains correct service + operation | Binary 0 or 1.0 | +| Beginner | `resource_creation` | Command match (0.5) + `ResourceVerifier` confirms exact resource exists in state (1.0) | Two-stage (0.5 → 1.0) | +| Intermediate | `multi_step` | Ordered list of `(operation, resource)` pairs; credit each new step | `completed_steps / total_steps` | +| Advanced | `multi_step + services` | Same as multi_step **and** all `services_required` must be touched | `completed_steps / total_steps` (capped until services satisfied) | +| Expert | `state_checks` | `ResourceVerifier` runs arbitrary AWS CLI commands at grading time and asserts on output | `0.7 × steps + 0.3 × state_checks` | + +State-check assertions support two forms: +- `output_contains: ` — substring match on stdout +- `json_path: ` + `expected: ` — JSON extraction with expected value + +This per-tier polymorphism is critical: a single grading rule would be too lax for warmup or too crude for SRE tasks. + +### Chaos survival bonus + +If `ChaosEngine` injected a mutation during the episode and the agent still completed, reward is `1.05` instead of `1.0` (5% bonus) — and that bonus *stacks under* hint decay (so the agent that solves a chaotic task without hints gets the maximum). + +### Rollback penalty & idempotency bonus + +- **Rollback** (`-0.1` per pair): `EpisodeTracker.detect_rollbacks()` scans the command history for `(create-X, … , delete-X)` pairs on the same resource. Production-style waste — heavily penalized. +- **Idempotency** (`+0.02`): if a command fails with a known "already exists" pattern (`BucketAlreadyExists`, `ResourceInUseException`, etc.) and the next command continues productively, the agent is rewarded for graceful retry behavior. + +This is the first RL environment we know of that rewards *operational discipline* directly. + +--- + +## 9. Anti-reward-hacking — 8 defense layers + +The agent's only loss surface is the reward signal. We harden it so that the cheapest path to a high reward is *actually doing the task* — not gaming the grader. + +### Layer 1 — Ground-truth verification via MiniStack + +The grader **never trusts agent command output**. For every resource check it asks `ResourceVerifier` to query MiniStack (or AWS) directly. Even if the agent crafts a perfectly-formed fake JSON response, the grader looks at server-side state. + +> ResourceVerifier covers 20+ services with bespoke verification methods (S3, DynamoDB, Lambda, SQS, SNS, IAM, Secrets Manager, API Gateway, Cognito, RDS, EFS, ElastiCache, EC2, Step Functions, Glue, Athena, EMR, ECS, EKS, EventBridge, Kinesis, …). + +### Layer 2 — Deduplication + +`EpisodeTracker.has_executed_operation()` records every `(operation, resource)` pair that earned credit. Re-running the same successful command does **not** re-earn `partial_progress`. Each unique operation pays out exactly once. + +### Layer 3 — Grader invisibility + +The CLI commands run by `ResourceVerifier` and `state_checks` happen **server-side** and are not echoed into the agent's observation. The agent never sees which queries the grader is making, so it cannot reverse-engineer "fake outputs" that match the grader's expectations. + +### Layer 4 — Command allow-listing + +`step()` rejects anything that doesn't start with `aws ` (`success=False`, no execution). No shell metacharacters, no piping, no redirection, no escape from the AWS CLI sandbox. + +### Layer 5 — No verification reward + +If the agent's command exactly matches one of the task's `state_checks` commands (e.g. `aws s3api get-bucket-versioning --bucket app-config-store`), it gets **zero** progress credit. Only mutating commands (create / put / update / delete) earn credit. Read-only auditing is freely allowed but not rewarded — exactly mirroring the grader's behavior. + +### Layer 6 — Monotonic progress + +`partial_progress` only ever increases within an episode. It is clamped at `0.99`; reaching `1.0` requires fully verified completion. The agent cannot lose progress, but it also cannot re-earn lost progress, so cycling strategies (create → delete → create) yield zero net gain. + +### Layer 7 — Resource-name validation + +`ResourceVerifier` checks the **exact** resource name from the task definition. Creating `my-test-bucket-2` does not satisfy a check for `my-test-bucket`. The agent cannot creatively name its way around the spec. + +### Layer 8 — State checks verify the final state + +For expert SRE tasks, the grader runs the canonical `state_checks` commands at grading time against the live MiniStack. The grade is "what is true now?", not "what did the agent claim?". This is the single hardest layer to circumvent. + +These layers compose: even if one is bypassed (e.g. a clever exact-match name), the others independently still produce the right reward. + +--- + +## 10. Resource verifier + +[services/resource_verifier.py](services/resource_verifier.py) — 362 LOC. + +- **Per-service `verify_*` methods** for 20+ AWS services. Each method knows which API calls expose state for that service and how to read the response (e.g. `verify_s3_bucket(name)` calls `s3api list-buckets`, `verify_dynamodb_table(name)` calls `dynamodb describe-table`, etc.). +- **Single-shot state path**: when called via `SimulatorStrategy.get_state()`, the verifier reads MiniStack's custom `/_ministack/state` endpoint (added in commit `a648c3a`, see §5) which returns the full infra inventory in one HTTP call. This is dramatically faster than iterating 20+ list APIs per grading pass. +- **State-check evaluator**: handles `output_contains` (substring) and `json_path` + `expected` (JSON extraction with deep-path support) assertion types used by expert-tier tasks. +- **Live ground-truth source** — the verifier never consumes the agent's stdout. Always fresh state from the simulator. + +--- + +## 11. Chaos engine + +[services/chaos_engine.py](services/chaos_engine.py) — 168 LOC. + +Probabilistically perturbs AWS resource state mid-episode. Tests whether the agent can detect and recover from unexpected drift — a critical SRE skill. + +- **Tier-scaled probability**: 0% warmup/beginner, 10% intermediate, 20% advanced, 30% expert +- **Service-scoped templates**: a chaos roll only fires on services the current task is touching. Resource names are extracted from the agent's recent successful commands via service-specific regex (e.g. `aws s3 mb s3://(\S+)` → bucket name). +- **Five service templates**: S3 policy / versioning changes, DynamoDB throughput modifications, Lambda configuration alterations, IAM detach-role-policy, SNS subscription mutations +- **Silent**: chaos commands run server-side; the agent observes only the *consequence* (a state inconsistency), never the cause +- **Reward bonus**: surviving chaos and completing the task pays `1.05` instead of `1.0` + +The combination of "tier-scaled probability" + "task-scoped resource selection" means chaos is rare for warmup tasks (0%) and frequent for SRE tasks (30%) — exactly where it matters. + +--- + +## 12. Drift engine + +[services/drift_engine.py](services/drift_engine.py) — 67 LOC. + +Specialised for the 6 drift-detection expert tasks defined in [services/tasks/drift.yaml](services/tasks/drift.yaml). + +- Each drift task ships a pool of `possible_drifts` (each a small list of CLI commands that mutates a resource away from the desired spec). +- On `reset()`, the engine **randomly selects 2–3 drifts** from that pool and applies them after the setup-command phase. +- The agent sees a `desired_state_spec` (natural language) and must audit the environment, identify which resources drifted, and fix only those. +- Random selection per episode means **no memorization** — the agent must reason about desired vs actual state, not recall a fix script. +- Examples: S3 versioning/encryption drift, DynamoDB throughput changes, SNS subscription modifications, Lambda env-var tampering. + +--- + +## 13. Hint provider + +[services/hint_provider.py](services/hint_provider.py) — 137 LOC. + +Three-level progressive hints, requested via the special action `aws help --task-hint`: + +| Level | What it reveals | Example | +|-------|---------------------------------------|----------------------------------------------------------| +| 1 | Required AWS services | "You'll need IAM and Lambda" | +| 2 | Operation sequence | "Start with `create-role`, then `put-role-policy`" | +| 3 | Near-complete command structure | "Use: `aws iam create-role --role-name …`" | + +- Hints are **auto-derived** from the `SuccessCriteria` fields (services list, ordered steps, operation names) — no hand-written hint text per task. +- Reward decay: `final_reward *= 0.85 ** hints_used`. With three hints (max), the agent caps at `0.85³ ≈ 0.614` of normal reward. +- The hint command is **intercepted before reaching MiniStack** so it does not consume an episode step nor affect simulator state. + +--- + +## 14. Episode tracker + +[services/episode_tracker.py](services/episode_tracker.py) — 241 LOC. + +Single source of per-episode state. Maintains: + +- Step count, hint count, command history (raw + parsed) +- `partial_progress: float ∈ [0, 1]` (monotonic — see anti-hack layer 6) +- `credited_operations: set[(operation, resource)]` (for dedup — anti-hack layer 2) +- Rollback detection: scans history for `(create-X, …, delete-X)` pairs on same resource +- Idempotency detection: looks for known "already exists" error patterns + +Parses each AWS CLI invocation into a structured tuple `(service, operation, resource_name)` for downstream services to query without re-parsing. + +--- + +## 15. Environment designer + +[services/environment_designer.py](services/environment_designer.py) — 99 LOC. + +Provisioning helper for SRE / security-posture / drift tasks. A task can declare `setup_commands: list[SetupCommand]` — these are executed (server-side) **before** the agent starts so the world begins in a deliberately broken / insecure / over-provisioned state. Examples: + +- "Public S3 bucket lockdown" (§17): creates `public-assets` with a wide-open bucket policy +- "IAM least-privilege": creates `app-role` with `Action: *` / `Resource: *` +- Drift tasks: provision the *correct* infra so the drift engine can mutate it + +Setup failures abort the reset — partial setup is never exposed to the agent. + +--- + +## 16. Task definitions (YAML schema) + +[services/tasks/](services/tasks/) — one YAML file per tier: + +- [warmup.yaml](services/tasks/warmup.yaml) — 25 listing tasks +- [beginner.yaml](services/tasks/beginner.yaml) — 25 single-resource creation tasks +- [intermediate.yaml](services/tasks/intermediate.yaml) — 25 multi-step workflows +- [advanced.yaml](services/tasks/advanced.yaml) — 25 cross-service architectures +- [expert.yaml](services/tasks/expert.yaml) — 24 SRE / security tasks +- [drift.yaml](services/tasks/drift.yaml) — 9 drift detection tasks + +Sample task: + +```yaml +- task_id: 42 + description: Create an S3 bucket named my-app-data and enable versioning on it. + difficulty: intermediate + success_criteria: + grading_strategy: multi_step + steps: + - operation: create-bucket + resource: my-app-data + - operation: put-bucket-versioning + resource: my-app-data + services: [s3] + setup_commands: [] + possible_drifts: [] +``` + +Expert / drift tasks add `state_checks`, `desired_state_spec`, and `setup_commands`. + +--- + +## 17. Security-posture audit examples + +These three expert-tier tasks test reasoning about *configuration state* — the infra is functional but insecure. The agent must read existing config and recognize the vulnerability. + +### Public S3 bucket lockdown + +- **Setup**: bucket `public-assets` is provisioned with a bucket policy granting `Principal: *` access +- **Task**: replace the policy so only IAM role `app-role` can `s3:GetObject` +- **State checks**: bucket policy denies `Principal: *`, allows only `app-role` + +### IAM least privilege + +- **Setup**: role `app-role` exists with an inline policy `Action: *, Resource: *` +- **Task**: replace with a least-privilege policy allowing only `dynamodb:GetItem` and `dynamodb:PutItem` on the users table +- **State checks**: policy document matches the expected ARN-scoped permissions + +### Lambda secret rotation + +- **Setup**: Lambda `data-processor` has env var `DB_PASSWORD=hunter2` (plaintext) +- **Task**: create a Secrets Manager secret, add `SECRET_ARN` env var, remove `DB_PASSWORD` +- **State checks**: secret exists, Lambda has `SECRET_ARN`, no `DB_PASSWORD` remains + +These are not hypothetical scenarios — they're the most common cloud-misconfiguration findings in real audits. + +--- + +## 18. Curriculum stats API + +`Curriculum.get_stats()` returns: + +```python +{ + "episode_count": 42, + "tier": "intermediate", + "tier_episodes": 12, + "tier_success_rate": 0.75, + "graduated_tasks": [0, 2, 4], + "weak_spots": [11, 12], + "skill_profile": {0: 0.95, 1: 0.8, ...}, # per-task weighted success + "spaced_rep_due": [0, 2], # graduated tasks due for re-test + "avg_reward_last_10": 0.65, +} +``` + +Useful for: +- Dashboarding training progress +- Logging into the GRPO `EpisodeLogger` CSV (see [train_grpo.py:635](../train_grpo.py)) +- Driving the web playground's progress bar + +--- + +## 19. Web playground + +Always mounted at [http://localhost:8000/web](http://localhost:8000/web). When `POOL_SIZE>1` the playground is backed by a **dedicated lazy-spawned MiniStack** on `AWS_RL_ENV_WEB_MINISTACK_PORT` (default `4565`) — see §6. First request takes ~1–3s while that MiniStack binds; subsequent requests are fast. + +- HTML: [server/templates/index.html](templates/index.html) +- Static assets: [server/static/](static/) — CSS, JS, and **40 AWS service icons** in [server/static/img/aws/](static/img/aws/) +- The playground talks to `/web/reset`, `/web/step`, `/web/state`, and `/web/solution` (the last one reveals the next canonical solution command — handy for demos and debugging task definitions). + +The playground runs a **single shared environment instance** on its own MiniStack (or, with `POOL_SIZE=1`, the lone pool MiniStack on `:4566`). It is intentionally separate from the per-WebSocket sessions used during training so a curious user clicking around the web UI cannot interfere with an active GRPO rollout. + +--- + +## See also + +- [Main README](../README.md) — project overview, results, Colab links +- [scripts/README.md](../scripts/README.md) — client-side parallel rollout pool (`GrpoPool`, `MultiTurnEnvPool`, asyncio orchestration) +- [train/README.md](../train/README.md) — SFT + GRPO training pipeline +- [data/README.md](../data/README.md) — dataset generation + base-model selection +- [aws_infra/README.md](../aws_infra/README.md) — vendored MiniStack upstream docs (81 KB) diff --git a/server/app.py b/server/app.py index 2056d161dbe829362d2dfbac9786846177c557ba..8dfd688d3f2cf8c557cca8db3ac5cd36c171305c 100644 --- a/server/app.py +++ b/server/app.py @@ -28,8 +28,14 @@ Usage: python -m server.app """ +import asyncio import os +import shutil +import socket +import subprocess +import sys import threading +import time from pathlib import Path from typing import Any, Callable, Dict, Iterable @@ -71,6 +77,22 @@ POOL_SIZE = max(int(os.getenv("AWS_RL_ENV_POOL_SIZE", "1")), 1) BASE_MINISTACK_PORT = int(os.getenv("AWS_RL_ENV_MINISTACK_BASE_PORT", "4566")) BACKEND_TYPE = os.getenv("BACKEND_TYPE", "simulator") # "simulator" | "aws" +# Constant, dedicated MiniStack port for the web playground. Kept outside the +# pool's range so a WebSocket session can never acquire it, eliminating the +# state-bleed risk that previously gated the web UI when POOL_SIZE > 1. +WEB_MINISTACK_PORT = int(os.getenv("AWS_RL_ENV_WEB_MINISTACK_PORT", "4565")) + +if ( + BACKEND_TYPE != "aws" + and POOL_SIZE > 1 + and BASE_MINISTACK_PORT <= WEB_MINISTACK_PORT < BASE_MINISTACK_PORT + POOL_SIZE +): + raise RuntimeError( + f"AWS_RL_ENV_WEB_MINISTACK_PORT={WEB_MINISTACK_PORT} collides with pool range " + f"[{BASE_MINISTACK_PORT}..{BASE_MINISTACK_PORT + POOL_SIZE - 1}]. " + f"Pick a port outside the pool's range." + ) + class MiniStackPool: """Thread-safe free-list of MiniStack ports. @@ -156,84 +178,147 @@ app = create_app( # The web playground needs state across requests, so we maintain a shared # environment instance and expose /web/reset and /web/step. # -# Only mounted when POOL_SIZE <= 1. With a pool active, port 4566 is -# claimed by the pool and a shared web _env would collide with the -# per-session MiniStacks. -# If POOL_SIZE=8 and web mounts anyway, the module-level _env = AwsRlEnvironment() -# defaults to http://localhost:4566 — which is also in the pool's range. -# Any /web/step clobbers the MiniStack currently held by a WS session that -# acquired port 4566. State corrupts both ways: web user's bucket appears in a -# GRPO rollout; pool rollout's drift mutations show up in the web UI. +# When POOL_SIZE > 1 the pool owns [BASE..BASE+N-1]; the web UI uses a +# dedicated MiniStack on WEB_MINISTACK_PORT (constant, outside the pool's +# range) so it can never collide with a WebSocket session. That MiniStack is +# spawned lazily on the first /web/* request — training-only deployments pay +# zero cost. Subsequent requests reuse the cached _web_env. +# --------------------------------------------------------------------------- +_web_env: AwsRlEnvironment | None = None +_web_env_lock = threading.Lock() -# --------------------------------------------------------------------------- -if POOL_SIZE <= 1: - _env = AwsRlEnvironment() +def _port_listening(port: int) -> bool: + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.settimeout(0.2) + return s.connect_ex(("127.0.0.1", port)) == 0 - class WebStepRequest(BaseModel): - action: Dict[str, Any] - @app.post("/web/reset", include_in_schema=False) - async def web_reset(): - obs = _env.reset() - return { - "observation": obs.model_dump(), - "reward": obs.reward, - "done": obs.done, - } +def _resolve_ministack_bin() -> str: + """Find the ministack entry point. Prefer the same venv as the running + Python (sys.executable's bin dir) before falling back to PATH — uvicorn + invoked via /full/path/to/.venv/bin/uvicorn doesn't always have the venv + on PATH, so a bare "ministack" lookup would FileNotFoundError. + """ + candidate = Path(sys.executable).parent / "ministack" + if candidate.exists(): + return str(candidate) + on_path = shutil.which("ministack") + if on_path: + return on_path + raise RuntimeError( + "Could not find the 'ministack' executable. Install with `uv sync` " + "or ensure the active venv's bin directory is on PATH." + ) + + +def _spawn_web_ministack(port: int, timeout_s: float = 10.0) -> None: + if _port_listening(port): + return + subprocess.Popen( + [_resolve_ministack_bin(), "-d"], + env={**os.environ, "GATEWAY_PORT": str(port)}, + stdout=subprocess.DEVNULL, + stderr=subprocess.DEVNULL, + ) + deadline = time.monotonic() + timeout_s + while time.monotonic() < deadline: + if _port_listening(port): + return + time.sleep(0.1) + raise RuntimeError(f"Web MiniStack failed to bind {port} within {timeout_s}s") + + +def _get_web_env() -> AwsRlEnvironment: + global _web_env + if _web_env is not None: + return _web_env + with _web_env_lock: + if _web_env is not None: + return _web_env + if BACKEND_TYPE == "aws": + _web_env = AwsRlEnvironment(strategy=AwsStrategy()) + elif POOL_SIZE > 1: + _spawn_web_ministack(WEB_MINISTACK_PORT) + _web_env = AwsRlEnvironment( + strategy=SimulatorStrategy(f"http://localhost:{WEB_MINISTACK_PORT}") + ) + else: + _web_env = AwsRlEnvironment() + return _web_env + - @app.get("/web/solution", include_in_schema=False) - async def web_solution(): - """Return the next solution command for the current task step.""" - if not _env._current_task: - return { - "command": None, - "error": "No active task. Start a new episode first.", - } - - from server.services.task_solutions import get_next_solution - - result = get_next_solution( - task_id=_env._current_task.task_id, - backend=_env._backend, - tracker=_env._tracker, - ) - result["task_id"] = _env._current_task.task_id - return result - - @app.get("/web/state", include_in_schema=False) - async def web_state(): - """Return the full AwsRlState for the web UI.""" - return _env.state.model_dump() - - @app.post("/web/step", include_in_schema=False) - async def web_step(request: WebStepRequest = Body(...)): - action = AwsRlAction(**request.action) - obs = _env.step(action) +class WebStepRequest(BaseModel): + action: Dict[str, Any] + + +@app.post("/web/reset", include_in_schema=False) +async def web_reset(): + env = await asyncio.to_thread(_get_web_env) + obs = env.reset() + return { + "observation": obs.model_dump(), + "reward": obs.reward, + "done": obs.done, + } + + +@app.get("/web/solution", include_in_schema=False) +async def web_solution(): + """Return the next solution command for the current task step.""" + env = await asyncio.to_thread(_get_web_env) + if not env._current_task: return { - "observation": obs.model_dump(), - "reward": obs.reward, - "done": obs.done, + "command": None, + "error": "No active task. Start a new episode first.", } - # --------------------------------------------------------------------------- - # Custom web UI - # --------------------------------------------------------------------------- + from server.services.task_solutions import get_next_solution - _server_dir = Path(__file__).parent - _templates = Jinja2Templates(directory=str(_server_dir / "templates")) - app.mount( - "/static", StaticFiles(directory=str(_server_dir / "static")), name="static" + result = get_next_solution( + task_id=env._current_task.task_id, + backend=env._backend, + tracker=env._tracker, ) + result["task_id"] = env._current_task.task_id + return result + + +@app.get("/web/state", include_in_schema=False) +async def web_state(): + """Return the full AwsRlState for the web UI.""" + env = await asyncio.to_thread(_get_web_env) + return env.state.model_dump() + + +@app.post("/web/step", include_in_schema=False) +async def web_step(request: WebStepRequest = Body(...)): + env = await asyncio.to_thread(_get_web_env) + action = AwsRlAction(**request.action) + obs = env.step(action) + return { + "observation": obs.model_dump(), + "reward": obs.reward, + "done": obs.done, + } + + +_server_dir = Path(__file__).parent +_templates = Jinja2Templates(directory=str(_server_dir / "templates")) +app.mount( + "/static", StaticFiles(directory=str(_server_dir / "static")), name="static" +) + + +@app.get("/", response_class=RedirectResponse, include_in_schema=False) +async def root_redirect(): + return RedirectResponse(url="/web") - @app.get("/", response_class=RedirectResponse, include_in_schema=False) - async def root_redirect(): - return RedirectResponse(url="/web") - @app.get("/web", response_class=HTMLResponse, include_in_schema=False) - async def web_ui(request: Request): - return _templates.TemplateResponse(request=request, name="index.html") +@app.get("/web", response_class=HTMLResponse, include_in_schema=False) +async def web_ui(request: Request): + return _templates.TemplateResponse(request=request, name="index.html") def main(host: str = "0.0.0.0", port: int = 8000): diff --git a/tests/test_pool.py b/tests/test_pool.py index f637098a97c58cd03a0cdf298d5fdbe4373e2579..7f73d7f580a7b02a7a3dc003c496ffbaed30079b 100644 --- a/tests/test_pool.py +++ b/tests/test_pool.py @@ -360,3 +360,328 @@ class TestFactoryConcurrencyIntegration: t.join() assert pool.free_count == 20 + + +# --------------------------------------------------------------------------- +# Web playground coexistence with the MiniStack pool +# --------------------------------------------------------------------------- + + +def _run_in_subprocess(env_overrides: dict[str, str], code: str) -> tuple[int, str, str]: + """Run `code` in a fresh subprocess with the given env overrides. + + Mirrors the pattern used by TestServerAppImportIsSafeForLegacyPoolSizes + to avoid module-cache pollution across env-var changes. + """ + import os + import subprocess + import sys + + env = {**os.environ, **env_overrides} + result = subprocess.run( + [sys.executable, "-c", code], + env=env, + capture_output=True, + text=True, + check=False, + ) + return result.returncode, result.stdout, result.stderr + + +class TestWebRoutesMountUnconditionally: + """The web playground used to be gated on POOL_SIZE <= 1. It now mounts + regardless of pool size, with a dedicated lazy MiniStack on + AWS_RL_ENV_WEB_MINISTACK_PORT. + """ + + def test_web_routes_present_when_pool_size_8(self) -> None: + code = ( + "import server.app as m;" + "paths = {getattr(r, 'path', None) for r in m.app.routes};" + "import sys;" + "missing = {'/web', '/web/reset', '/web/state', '/web/step', '/web/solution'} - paths;" + "sys.stdout.write('MISSING=' + repr(missing))" + ) + rc, out, err = _run_in_subprocess({"AWS_RL_ENV_POOL_SIZE": "8"}, code) + assert rc == 0, f"import failed: {err}" + assert "MISSING=set()" in out, out + + def test_web_routes_present_when_pool_size_1(self) -> None: + code = ( + "import server.app as m;" + "paths = {getattr(r, 'path', None) for r in m.app.routes};" + "import sys;" + "missing = {'/web', '/web/reset', '/web/state', '/web/step', '/web/solution'} - paths;" + "sys.stdout.write('MISSING=' + repr(missing))" + ) + rc, out, err = _run_in_subprocess({"AWS_RL_ENV_POOL_SIZE": "1"}, code) + assert rc == 0, f"import failed: {err}" + assert "MISSING=set()" in out, out + + +class TestWebMiniStackPortConflictDetection: + """The startup-time guard refuses to boot if the configured web port falls + inside the pool's port range. Without it, a WebSocket session could acquire + the same port the web _env writes to and corrupt state in both directions. + """ + + def test_collision_inside_pool_range_raises(self) -> None: + code = "import server.app" + rc, _, err = _run_in_subprocess( + { + "AWS_RL_ENV_POOL_SIZE": "8", + "AWS_RL_ENV_MINISTACK_BASE_PORT": "4566", + "AWS_RL_ENV_WEB_MINISTACK_PORT": "4570", # inside [4566..4573] + }, + code, + ) + assert rc != 0 + assert "collides with pool range" in err + + def test_web_port_just_below_pool_range_is_allowed(self) -> None: + code = "import server.app" + rc, _, err = _run_in_subprocess( + { + "AWS_RL_ENV_POOL_SIZE": "8", + "AWS_RL_ENV_MINISTACK_BASE_PORT": "4566", + "AWS_RL_ENV_WEB_MINISTACK_PORT": "4565", # default + }, + code, + ) + assert rc == 0, err + + def test_web_port_just_above_pool_range_is_allowed(self) -> None: + code = "import server.app" + rc, _, err = _run_in_subprocess( + { + "AWS_RL_ENV_POOL_SIZE": "8", + "AWS_RL_ENV_MINISTACK_BASE_PORT": "4566", + "AWS_RL_ENV_WEB_MINISTACK_PORT": "4574", # one past 4573 + }, + code, + ) + assert rc == 0, err + + def test_collision_check_skipped_when_pool_size_1(self) -> None: + """POOL_SIZE=1 means no pool object exists, so the constant web port + is allowed to coincide with BASE_PORT (it just means the web env + shares the lone MiniStack). Backward-compat for legacy single-mode. + """ + code = "import server.app" + rc, _, err = _run_in_subprocess( + { + "AWS_RL_ENV_POOL_SIZE": "1", + "AWS_RL_ENV_MINISTACK_BASE_PORT": "4566", + "AWS_RL_ENV_WEB_MINISTACK_PORT": "4566", + }, + code, + ) + assert rc == 0, err + + def test_collision_check_skipped_when_backend_aws(self) -> None: + """BACKEND_TYPE=aws skips the pool entirely (all sessions share + AwsStrategy), so a "collision" with the pool's range is hypothetical + — the pool object is never constructed. Refusing to boot here would + be a false positive. + """ + code = "import server.app" + rc, _, err = _run_in_subprocess( + { + "AWS_RL_ENV_POOL_SIZE": "8", + "AWS_RL_ENV_MINISTACK_BASE_PORT": "4566", + "AWS_RL_ENV_WEB_MINISTACK_PORT": "4570", # would collide if simulator + "BACKEND_TYPE": "aws", + }, + code, + ) + assert rc == 0, err + + +class TestWebEnvLazyConstruction: + def test_web_env_is_none_immediately_after_import(self) -> None: + """Lazy: the dedicated MiniStack should NOT spawn until a /web/* + request arrives. Importing the module must not subprocess anything. + """ + code = ( + "import server.app as m;" + "import sys;" + "sys.stdout.write('\\nRESULT=' + ('NONE' if m._web_env is None else 'NOT_NONE'))" + ) + rc, out, err = _run_in_subprocess({"AWS_RL_ENV_POOL_SIZE": "8"}, code) + assert rc == 0, err + assert out.strip().splitlines()[-1] == "RESULT=NONE" + + def test_get_web_env_legacy_uses_default_port_for_pool_size_1(self) -> None: + """POOL_SIZE=1: web env shares the single MiniStack on :4566 — the + original behavior, locked down so it doesn't drift. + """ + code = ( + "import server.app as m;" + "env = m._get_web_env();" + "import sys;" + "sys.stdout.write('\\nRESULT=' + env._backend._aws_infra_url)" + ) + rc, out, err = _run_in_subprocess({"AWS_RL_ENV_POOL_SIZE": "1"}, code) + assert rc == 0, err + assert out.strip().splitlines()[-1] == "RESULT=http://localhost:4566" + + def test_get_web_env_uses_aws_strategy_when_backend_aws(self) -> None: + """BACKEND_TYPE=aws: web env wires AwsStrategy too. No MiniStack spawn. + Fixes the latent inconsistency where the web playground always used + the simulator regardless of training backend. + """ + code = ( + "import server.app as m;" + "from server.services.aws_strategy import AwsStrategy;" + "env = m._get_web_env();" + "import sys;" + "sys.stdout.write('\\nRESULT=' + ('AWS' if isinstance(env._backend, AwsStrategy) else 'NOT_AWS'))" + ) + rc, out, err = _run_in_subprocess( + {"AWS_RL_ENV_POOL_SIZE": "8", "BACKEND_TYPE": "aws"}, + code, + ) + assert rc == 0, err + assert out.strip().splitlines()[-1] == "RESULT=AWS" + + +class TestSpawnWebMiniStackShortCircuit: + """`_spawn_web_ministack` must not subprocess if the port is already + listening — otherwise a server restart would race against the existing + detached MiniStack and stall on the bind check. + """ + + def test_does_not_spawn_when_port_already_listening(self) -> None: + import socket + + from server.app import _spawn_web_ministack + + # Bind an ephemeral port to simulate a MiniStack already running. + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sentinel: + sentinel.bind(("127.0.0.1", 0)) + sentinel.listen(1) + port = sentinel.getsockname()[1] + + with patch("server.app.subprocess.Popen") as popen: + _spawn_web_ministack(port, timeout_s=0.5) + + popen.assert_not_called() + + def test_raises_on_bind_timeout(self) -> None: + """If the spawned MiniStack never binds, raise instead of hanging.""" + from server.app import _spawn_web_ministack + + # Pick a port that is almost certainly free; mock Popen so nothing + # actually starts. _spawn_web_ministack should poll and time out. + with patch("server.app.subprocess.Popen"): + with pytest.raises(RuntimeError, match="failed to bind"): + _spawn_web_ministack(port=1, timeout_s=0.3) + + +class TestGetWebEnvAdversarial: + """Stress-test _get_web_env against the failure modes a real deployment + will eventually hit: concurrent first-request races, ministack-not-installed, + and spawn timeouts. + + Each test patches at the module level inside an isolated subprocess so + real ministacks are never spawned. + """ + + def test_concurrent_first_requests_spawn_at_most_once(self) -> None: + """N threads racing on the cold start must result in exactly one + Popen call. The double-checked lock + cached _web_env enforce this. + Otherwise a busy /web/* moment at boot would spawn N ministacks all + fighting for the same port. + """ + code = """ +import sys, threading +from unittest.mock import patch +import server.app as m +with patch('server.app._spawn_web_ministack') as spawn: + spawn.return_value = None + def call(): + m._get_web_env() + threads = [threading.Thread(target=call) for _ in range(20)] + for t in threads: t.start() + for t in threads: t.join() + sys.stdout.write('\\nRESULT=' + str(spawn.call_count)) +""" + rc, out, err = _run_in_subprocess({"AWS_RL_ENV_POOL_SIZE": "8"}, code) + assert rc == 0, err + assert out.strip().splitlines()[-1] == "RESULT=1" + + def test_get_web_env_does_not_spawn_when_backend_aws(self) -> None: + """BACKEND_TYPE=aws path takes the AwsStrategy branch and never + subprocesses ministack — even with POOL_SIZE=8. + """ + code = """ +import sys +from unittest.mock import patch +import server.app as m +with patch('server.app.subprocess.Popen') as popen: + m._get_web_env() + sys.stdout.write('\\nRESULT=' + str(popen.call_count)) +""" + rc, out, err = _run_in_subprocess( + {"AWS_RL_ENV_POOL_SIZE": "8", "BACKEND_TYPE": "aws"}, + code, + ) + assert rc == 0, err + assert out.strip().splitlines()[-1] == "RESULT=0" + + def test_get_web_env_does_not_spawn_when_pool_size_1(self) -> None: + """Legacy POOL_SIZE=1 path shares the lone pool MiniStack on :4566 + and never spawns a separate web MiniStack. + """ + code = """ +import sys +from unittest.mock import patch +import server.app as m +with patch('server.app.subprocess.Popen') as popen: + m._get_web_env() + sys.stdout.write('\\nRESULT=' + str(popen.call_count)) +""" + rc, out, err = _run_in_subprocess({"AWS_RL_ENV_POOL_SIZE": "1"}, code) + assert rc == 0, err + assert out.strip().splitlines()[-1] == "RESULT=0" + + def test_get_web_env_retries_after_spawn_failure(self) -> None: + """If the first spawn fails (e.g., ministack not installed yet, or + the bind timed out), _web_env stays None so a later request can + retry instead of permanently caching the failure. + """ + code = """ +import sys +from unittest.mock import patch +import server.app as m +with patch('server.app._spawn_web_ministack', side_effect=RuntimeError('boom')): + failed = False + try: + m._get_web_env() + except RuntimeError: + failed = True + assert failed, 'expected first call to raise' + assert m._web_env is None, '_web_env must stay None after spawn failure' +sys.stdout.write('\\nRESULT=ok') +""" + rc, out, err = _run_in_subprocess({"AWS_RL_ENV_POOL_SIZE": "8"}, code) + assert rc == 0, err + assert out.strip().splitlines()[-1] == "RESULT=ok" + + def test_pool_factory_capacity_independent_of_web_env(self) -> None: + """The web _env is a module-level singleton, NOT produced by the + WebSocket factory. So a pool of 8 still hands out 8 distinct ports; + the web env doesn't steal a slot. Critical for the user's "8 WS + + web UI" goal. + """ + pool, factory = make_env_factory(pool_size=8, base_port=4566) + assert pool is not None + envs = [factory() for _ in range(8)] + assert pool.free_count == 0 + # 9th must fail — same as before this change + with pytest.raises(RuntimeError, match="exhausted"): + factory() + # Sanity: all 8 ports distinct, none equal to 4565 (web port) + ports = {int(e._backend._aws_infra_url.rsplit(":", 1)[-1]) for e in envs} + assert len(ports) == 8 + assert 4565 not in ports diff --git a/train/README.md b/train/README.md new file mode 100644 index 0000000000000000000000000000000000000000..02d85829eae42b2bab7e620c825c0daef7661e58 --- /dev/null +++ b/train/README.md @@ -0,0 +1,545 @@ +# `train/` — SFT + GRPO Training Pipeline + +[← back to main README](../README.md) + +This directory holds the **training notebooks** for the AWS RL agent. Heavy logic for the GRPO loop lives at the repo root in [train_grpo.py](../train_grpo.py); the notebooks here are thin drivers that you can run end-to-end on Colab. + +The training pipeline has two stages: + +``` + ┌────────── data/sft/ ──────────┐ + │ 1,500 train · 150 val rows │ + │ 5 trajectory types │ + └───────────────┬───────────────┘ + │ + ┌──────────────────────────────────▼──────────────────────────────────┐ + │ STAGE 1 — Supervised Fine-Tuning (train_sft_lora.ipynb) │ + │ Qwen2.5-Coder-3B-Instruct + LoRA r=8/16/32 (Optuna) → SFT adapter │ + └──────────────────────────────────┬──────────────────────────────────┘ + │ Sizzing/aws-rl-sft-qwen25coder3b-adapter + ┌──────────────────────────────────▼──────────────────────────────────┐ + │ STAGE 2 — GRPO RL (train_grpo_lora.ipynb) │ + │ G=8 parallel rollouts · multi-turn · reward = env return │ + │ Optuna over (lr, β, G, T, top_p, lora_r, max_turns) │ + └─────────────────────────────────────────────────────────────────────┘ +``` + +The two stages are intentionally separable: the SFT adapter is published to the Hugging Face Hub so anyone can pull it and start GRPO without re-running SFT. + +--- + +## Table of contents + +1. [SFT stage — supervised LoRA](#1-sft-stage--supervised-lora) +2. [GRPO stage — reinforcement learning](#2-grpo-stage--reinforcement-learning) +3. [Optuna hyperparameter search](#3-optuna-hyperparameter-search) +4. [Multi-turn rollouts + parallel envs](#4-multi-turn-rollouts--parallel-envs) +5. [Training modes (CLI)](#5-training-modes-cli) +6. [How to run](#6-how-to-run) +7. [Logging and artifacts](#7-logging-and-artifacts) +8. [Reproducing results](#8-reproducing-results) +9. [Files in this directory](#9-files-in-this-directory) + +--- + +## 1. SFT stage — supervised LoRA + +[train/train_sft_lora.ipynb](train_sft_lora.ipynb) — primary SFT notebook. + +### Why SFT before GRPO? + +Two reasons — both showed up in our base-model evaluation ([data/sft/MODEL_EVALUATION.md](../data/sft/MODEL_EVALUATION.md)): + +1. **Format-locking**. Even strong coder models occasionally wrap commands in markdown fences or quotes. SFT removes that surface noise in one epoch. +2. **Bootstrap the GRPO reward signal**. GRPO with a base model that's only 41% exact-match starts from a low-density reward landscape. Pre-training on canonical commands raises the baseline so GRPO can spend its compute on optimization, not search. + +### Base model + +| Choice | `unsloth/Qwen2.5-Coder-3B-Instruct-bnb-4bit` | +|--------|--| +| Why | Highest exact-match (41%) of 11 candidates we benchmarked, fastest viable inference (3.1 s/call), tightest output (86 chars). Full reasoning in [data/sft/MODEL_EVALUATION.md](../data/sft/MODEL_EVALUATION.md). | +| Loader | Unsloth's 4-bit quantized variant — fits comfortably on a single 24 GB GPU, 2× faster training kernels | + +### LoRA config + +```python +LoraConfig( + r = trial.suggest_categorical("lora_r", [8, 16, 32]), + lora_alpha = r * trial.suggest_categorical("lora_alpha_mul", [1, 2, 4]), + lora_dropout = trial.suggest_float("lora_dropout", 0.005, 0.031), + bias = "none", + task_type = "CAUSAL_LM", + target_modules = ["q_proj", "k_proj", "v_proj", "o_proj"], +) +``` + +- Only attention projections are adapted — MLP / output heads stay frozen, keeping the trainable parameter count tiny (~10–40 M depending on rank). +- `lora_alpha = r × multiplier` keeps the effective scaling stable across rank variations during the Optuna search. + +### Optimization + +| Hyperparameter | Value / Range | +|--------------------------|------------------------------------------| +| Optimizer | AdamW (Unsloth's fused implementation) | +| Learning rate | `[1e-4, 5e-4]` log-scale (Optuna) | +| Schedule | Cosine annealing | +| Warmup ratio | `{0.03, 0.1}` (Optuna; best 0.1) | +| Batch size | 2 per GPU | +| Epochs | 2 | +| Max sequence length | 512 | +| Packing | **Disabled** (we keep chat-template separators intact) | +| Loss masking | Assistant-only (user message tokens are masked from the loss) | + +### Dataset + +[data/sft/aws_rl_sft.train.jsonl](../data/sft/aws_rl_sft.train.jsonl) — 1,500 examples. Format: + +```json +{ + "messages": [ + {"role": "system", "content": "You are an AWS cloud engineer..."}, + {"role": "user", "content": "TASK: ...\n\nCURRENT OBSERVATION:\nProgress: 0.00 ..."}, + {"role": "assistant", "content": "aws s3 mb s3://my-app-data"} + ], + "difficulty": "intermediate", + "source": "success_first_step", + "task_id": 42 +} +``` + +The dataset is a careful mix of **5 trajectory types** (success, multi-step continuation, failure recovery, verification, hint usage). Full generation methodology in [data/README.md](../data/README.md). + +### Training graphs + +The actual SFT run shipped in [`out/`](../out/) achieved validation loss `0.052` after 188 training steps with the best Optuna trial. + +> ![SFT loss curve](../docs/figures/sft_loss_curve.png) + +--- + +## 2. GRPO stage — reinforcement learning + +The core trainer lives at [train_grpo.py](../train_grpo.py) (1,283 LOC). Notebooks call into it: + +- [train/train_grpo_lora.ipynb](train_grpo_lora.ipynb) — clean +- [train/train_grpo_lora_with_outputs.ipynb](train_grpo_lora_with_outputs.ipynb) — with execution outputs preserved +- [aws_rl_env_colab.ipynb](../aws_rl_env_colab.ipynb) — Colab driver wrapping the entire pipeline + +### What GRPO is, briefly + +**GRPO** (Group Relative Policy Optimization) is the algorithm introduced by DeepSeekMath and adopted by TRL ≥ 0.18. Unlike PPO, GRPO does **not** train a critic. Instead: + +1. For one prompt (here, one curriculum-picked task), generate `G` completions +2. Score each with the reward function(s) +3. Compute group-relative advantage: `(reward_i − group_mean) / group_std` +4. Backpropagate the policy gradient with that advantage +5. Apply a KL penalty to the SFT reference model (coefficient `β`) to prevent drift + +This is dramatically simpler than PPO (no value head, no GAE), more sample-efficient for verifier-style rewards, and a natural fit for our setup — the AWS RL env *is* the reward function. + +### TRL GRPOTrainer config + +From [train_grpo.py:_build_grpo_config()](../train_grpo.py): + +| Parameter | Default value | Notes | +|------------------------------------|---------------|-------------------------------------------------------------| +| `learning_rate` | `5e-6` | Optuna range `[1e-6, 1e-4]` log-scale | +| `beta` (KL coefficient) | `0.04` | Optuna range `[0.0, 0.1]` | +| `num_generations` (G) | `8` | Optuna `{4, 8}` | +| `temperature` | `0.9` | Optuna `[0.7, 1.0]` | +| `top_p` | `0.95` | Optuna `[0.85, 0.98]` | +| `per_device_train_batch_size` | `1` | | +| `gradient_accumulation_steps` | `8` | Effective batch 8 | +| `gradient_checkpointing` | `True` | `use_reentrant=False` — VRAM optimization | +| `max_completion_length` | `256` | Per-turn; one AWS CLI command fits comfortably | +| `max_prompt_length` | `2048` | Holds task + history + observation | +| `loss_type` | `"dapo"` | Distributional Advantage Policy Optimization (TRL default for GRPO) | +| `mask_truncated_completions` | `True` | Drop samples that hit `max_completion_length` | +| `warmup_ratio` | `0.05` | | +| `lr_scheduler_type` | `"cosine"` | | +| `max_grad_norm` | `1.0` | | +| `use_vllm` | `False` | Plain `model.generate()` — vLLM integration is future work | + +### Reward functions (TRL convention) + +Three reward functions are registered, summed by GRPO: + +```python +reward_funcs=[reward_task, reward_achieved, reward_progress] +``` + +- `reward_task(completions, **kwargs)` → episode return (sum of per-step env rewards). The dominant signal. +- `reward_achieved(completions, **kwargs)` → 1.0 if `task.task_achieved` at end of episode, else 0.0. Sparse but unambiguous. +- `reward_progress(completions, **kwargs)` → final `partial_progress` ∈ [0, 1]. Densifies the credit assignment for partial completions. + +The env's reward shaping (see [server/README.md §8](../server/README.md#8-reward-shaping--taskgrader)) does most of the work — these three TRL functions are a thin façade. + +### Episode = one rollout + +- Each rollout runs **up to `MAX_TURNS=6` sequential AWS CLI commands** +- Each command's stdout/stderr/progress is fed back as the user message for the next turn (see `build_user_prompt()` and `format_observation()` in [train_grpo.py](../train_grpo.py)) +- The episode terminates on `task_achieved`, max turns, or `max_total_tokens` (per-episode token budget) +- Token sequences (prompt_ids, completion_ids, logprobs) are accumulated **across turns**, so GRPO assigns the episode-level reward to the full multi-turn token sequence — not just the last turn + +### Curriculum integration + +``` +trainer step: + 1. task = curriculum.next_task() # one task per GRPO step + 2. results = pool.run_group(task, ...) # G rollouts on that task + 3. mean_r = sum(group_rewards) / G + 4. curriculum.record_result(task, achieved=any_achieved, reward=mean_r) + 5. trainer applies group-relative advantages # standard GRPO +``` + +The curriculum drives task selection — every rollout in a group runs the *same* task, forced through `env.reset(task=task)`. This matches GRPO's group-relative semantics (you need the same prompt across the group to compute baseline correctly). + +Full curriculum mechanics (priority scoring, mastery, spaced rep, tier promotion) live in [server/README.md §7](../server/README.md#7-curriculum-manager). + +### Training graphs + +The actual GRPO run shipped in [`out_grpo/`](../out_grpo/) ran 35 steps with the best Optuna config (`lr=1.6e-5`, `β=0.0021`, `T=0.99`). Per-step signals from [`out_grpo/final_grpo/checkpoint-35/trainer_state.json`](../out_grpo/final_grpo/checkpoint-35/trainer_state.json): + +> ![GRPO final per-step training signals](../docs/figures/grpo_final_per_step.png) +> ![GRPO env reward over training](../docs/figures/grpo_reward_curve.png) +> ![Success by tier (multi-step)](../docs/figures/grpo_per_tier_curve.png) +> ![Reward by tier (multi-step)](../docs/figures/grpo_reward_by_tier.png) + +Notable signals from the run: + +| | | +|---|---| +| `env_reward/mean` | 0.31 (mean over 16 reward-logged steps), max 0.94, min 0.13 | +| `kl` | 0.15 (mean) — KL stays small despite tiny β | +| `completion_length` | 87 tokens (mean) — agent emits compact AWS CLI commands | +| Format compliance | **100%** (`format_reward/mean = 1.0` every step) | + +Multi-step end-to-end re-eval after GRPO ([out_grpo/grpo_multi_step.json](../out_grpo/grpo_multi_step.json)): + +> ![SFT vs GRPO multi-step metrics grid](../docs/figures/sft_vs_grpo_metrics_grid.png) + +These are produced by [`plot_rewards()`](../train_grpo.py) reading `reward_log.csv` written by `EpisodeLogger`, plus the post-hoc plots generated during the GRPO notebook run. + +--- + +## 3. Optuna hyperparameter search + +[train_grpo.py:optuna_search()](../train_grpo.py) + +### Search space + +| Parameter | Range | Reason | +|-------------------|------------------------------------|------------------------------------------------------------------------| +| `learning_rate` | `[1e-6, 1e-4]` log | GRPO is sensitive to LR; log-scale is the right prior | +| `beta` | `[0.0, 0.1]` | KL coefficient. 0 = pure RL (drift risk), 0.1 = anchored to SFT | +| `num_generations` | `{4, 8}` | Group size. Larger → tighter advantage estimates but slower | +| `temperature` | `[0.7, 1.0]` | Exploration knob | +| `top_p` | `[0.85, 0.98]` | Nucleus sampling | +| `lora_r` | `{8, 16, 32}` | Adapter capacity | +| `lora_alpha_mul` | `{1, 2, 4}` | `lora_alpha = lora_r × multiplier` | +| `max_turns` | `{4, 6, 8}` | Episode length cap | + +### Objective + +``` +objective = 0.7 × achieved_rate + 0.3 × mean_progress +``` + +Calculated on the held-out validation tasks at the end of each trial. Weighting `achieved_rate` higher matches the project goal — actual task completion matters more than partial progress. + +### Sampler + +`optuna.samplers.TPESampler(seed=42)` — Tree-structured Parzen Estimator. TPE outperforms random search on 8-dim spaces with ~6 trials in our experience. + +Persisted to `outputs/.../optuna.db` (SQLite), so trials can be resumed if a Colab session disconnects. + +### Frozen validation set + +`pick_validation_task_ids(k_per_tier=2, seed=42)` picks 2 tasks per tier (≈10 tasks total) at the start of training. The same set is used by every Optuna trial and the final post-training eval — no benchmark leakage between trials. + +### SFT-stage Optuna results (6 trials) + +The SFT-stage Optuna run shipped in [`out/optuna_study.json`](../out/optuna_study.json) explored a 5-parameter space (`lora_r`, `lora_alpha_mul`, `lora_dropout`, `learning_rate`, `warmup_ratio`). 6 trials, validation loss as objective (lower = better): + +| Trial | r | α | dropout | lr | warmup | val_loss | +|------:|---:|---:|:-------:|:---------:|:------:|:--------:| +| **0** | 16 | 16 | 0.006 | 4.03e-4 | 0.10 | **0.0523** ★ | +| 1 | 16 | 16 | 0.030 | 2.33e-4 | 0.03 | 0.0790 | +| 2 | 8 | 32 | 0.020 | 2.29e-4 | 0.03 | 0.0587 | +| 3 | 8 | 16 | 0.030 | 1.17e-4 | 0.03 | 0.1199 | +| 4 | 16 | 16 | 0.031 | 2.31e-4 | 0.03 | 0.0793 | +| 5 | 8 | 32 | 0.009 | 1.37e-4 | 0.10 | 0.0828 | + +> ![SFT Optuna trial comparison table](../docs/figures/sft_optuna_trials_table.png) + +```json +{ + "best_value": 0.052, + "best_params": { + "lora_r": 16, + "lora_alpha_mul": 1, // → lora_alpha = 16 + "lora_dropout": 0.005808, + "learning_rate": 4.03e-4, + "warmup_ratio": 0.1 + } +} +``` + +Visualized: + +> ![Optuna parameter importances](../docs/figures/optuna_param_importance.png) +> ![Optuna optimization history](../docs/figures/optuna_history.png) +> ![Optuna parallel coordinate plot](../docs/figures/optuna_parallel.png) +> ![Optuna slice plot](../docs/figures/optuna_slice.png) +> ![Optuna trial training curves](../docs/figures/optuna_trial_curves.png) + +### GRPO-stage Optuna results (4 trials) + +The GRPO-stage Optuna run shipped in [`out_grpo/optuna_best.json`](../out_grpo/optuna_best.json) explored a 3-parameter space (`learning_rate`, `beta`, `temperature`). 4 trials, single-step env reward as objective (higher = better): + +| Trial | lr | β | T | env_reward | success | +|------:|:---------:|:--------:|:-----:|:----------:|:-------:| +| 0 | varied | varied | varied| 0.473 | 25.0% | +| 1 | varied | varied | varied| 0.469 | 25.0% | +| 2 | varied | varied | varied| 0.469 | 25.0% | +| **3** | 1.60e-5 | 0.0021 | 0.99 | **0.552** | **33.3%** ★ | + +> ![GRPO Optuna trial comparison](../docs/figures/grpo_optuna_trials_comparison.png) +> ![GRPO Optuna importances](../docs/figures/grpo_optuna_importances.png) +> ![GRPO Optuna parallel coordinate](../docs/figures/grpo_optuna_parallel.png) +> ![GRPO Optuna hparams](../docs/figures/grpo_optuna_hparams.png) +> ![GRPO Optuna trial curves](../docs/figures/grpo_optuna_trial_curves.png) + +The winning GRPO config uses a **much smaller learning rate** (1.6e-5, vs 4.0e-4 for SFT) and a **tiny KL coefficient** (β=0.0021) — both expected for an RL phase that is only correcting the SFT-bootstrapped policy, not retraining it. + +--- + +## 4. Multi-turn rollouts + parallel envs + +This section is a quick overview — the full mechanics, including the three pool layers and asyncio orchestration, are in [scripts/README.md](../scripts/README.md). + +### MultiTurnEnvPool + +[train_grpo.py:MultiTurnEnvPool](../train_grpo.py) — owns a background thread running an asyncio loop, opens N WebSocket sessions on startup, exposes a synchronous `run_group(task, ...)` API. + +- One pool instance lives for the duration of training +- `run_group()` calls `asyncio.gather()` over `rollout_one_episode(env, task, ...)` for each of the N envs — every rollout runs the same task in its own MiniStack (see server-side pool in [server/README.md §6](../server/README.md#6-server-side-ministack-pool-parallel-rollouts)) +- Returns a list of `{prompt_ids, completion_ids, logprobs, task_reward, task_achieved, final_progress, num_steps, transcript, task_id, difficulty}` + +### Why parallelism matters here + +GRPO's group-relative advantage requires `G` rollouts before any gradient. Running them serially at MAX_TURNS=6 turns × ~50 ms env step = ~300 ms per rollout would cost 2.4 s × G=8 = ~20 s of env time per training step. With parallel rollouts that drops to ~300 ms (the slowest of 8). The model forward pass dominates, exactly as desired. + +### Generation lock + +Because the policy lives on a single GPU, `model.generate()` calls across the asyncio.gather group are serialised behind a `_GENERATE_LOCK` (`threading.Lock`). The env step calls — the slow part — happily overlap. This is the single non-obvious detail that makes the parallel rollout approach actually work. + +--- + +## 5. Training modes (CLI) + +```bash +# Optuna search only — produces best_cfg.json +python train_grpo.py --mode optuna --n-trials 6 --trial-max-steps 30 + +# Train once with explicit hyperparams (no search) +python train_grpo.py --mode train \ + --env-url http://localhost:8000 \ + --num-generations 8 --max-turns 6 --max-steps 200 + +# Search → train: Optuna trials, then a full-length run with the best config +python train_grpo.py --mode full --n-trials 6 --max-steps 200 +``` + +All modes write to `outputs/aws-rl-grpo-/`. + +--- + +## 6. How to run + +### Prerequisites + +- A running env server: `make run` from the repo root (starts MiniStack + FastAPI on `http://localhost:8000`) +- For pool size > 1: `AWS_RL_ENV_POOL_SIZE=8 make run` +- A GPU with ≥ 24 GB VRAM (A10, T4×2, A100, L4 all confirmed working) +- HuggingFace token (`HF_TOKEN`) if you want to push the trained adapter + +### Local + +```bash +# 1. Start the env server in one terminal +AWS_RL_ENV_POOL_SIZE=8 make run + +# 2. Run training in another terminal +python train_grpo.py --mode full --n-trials 6 --max-steps 200 +``` + +### Colab + +The notebook [aws_rl_env_colab.ipynb](../aws_rl_env_colab.ipynb) wraps the full pipeline (env URL config, HF login, val set, Optuna, training, plotting, optional push-to-Hub): + +| Notebook | Open in Colab | +|----------|---------------| +| GRPO end-to-end driver | | +| SFT-only ([train/train_sft_lora.ipynb](train_sft_lora.ipynb)) | | +| GRPO-only ([train/train_grpo_lora.ipynb](train_grpo_lora.ipynb)) | | + +Note: the Colab notebooks expect the env server to be reachable. Two options: + +1. **HF Space tunnel**: deploy the env to your own HF Space and point `ENV_URL` at it (see main README's deployment section) +2. **ngrok**: run the env locally and expose it via ngrok / cloudflared so Colab can reach it + +--- + +## 7. Logging and artifacts + +### Reference SFT output: [`out/`](../out/) + +A complete SFT training run is committed (small files only) at the repo root for reproducibility: + +``` +out/ +├── baseline_metrics.json # eval scores BEFORE SFT (33% fmt, 39% exact, ...) +├── delta_summary.json # base vs post-SFT delta (the headline numbers) +├── optuna_study.json # SFT Optuna study summary (all 6 trials + best) +├── optuna/ # per-trial workspaces (trial-0..trial-5) +├── final_sft/ # final TRL SFT trainer checkpoints (gitignored) +│ ├── checkpoint-100/ # adapter + optimizer + tokenizer at step 100 +│ ├── checkpoint-150/ +│ └── checkpoint-188/ # last checkpoint (final adapter) +└── plots/ # 7 ready PNGs (loss curves, Optuna plots, eval comparison) +``` + +The contents of `out/plots/` are mirrored into [`docs/figures/`](../docs/figures/) so the READMEs render them. The full TRL checkpoints in `out/final_sft/` are kept for reproducibility but are gitignored (each is ~50 MB; total ~175 MB). + +### Reference GRPO output: [`out_grpo/`](../out_grpo/) + +A complete GRPO training run is also committed at the repo root: + +``` +out_grpo/ +├── baseline_single_step.json # post-SFT single-step eval (90% reward, 85% success) +├── baseline_multi_step.json # post-SFT multi-step eval (86.8% success, 0.88 reward, by tier) +├── grpo_multi_step.json # post-GRPO multi-step eval (86.2% success, 0.88 reward, by tier) +├── optuna_best.json # GRPO Optuna best params + resolved config +├── optuna.db # SQLite Optuna study (4 trials) +├── optuna/trial-0..3/ # per-trial trainer_state.json + single_step_metrics.json +├── qualitative_rollouts.json # 5 hand-picked sample rollouts (one per tier, post-GRPO) +├── final_grpo/ # final TRL GRPO checkpoints (gitignored) +│ ├── checkpoint-25/ +│ └── checkpoint-35/ # last checkpoint (final GRPO adapter) +├── grpo_adapter/ # exported final adapter for HF Hub upload (gitignored) +├── graphs/ # 10 ready PNGs (Optuna views, training curves, by-tier breakdowns) +└── graphs.zip +``` + +The 10 graphs from `out_grpo/graphs/` are mirrored into [`docs/figures/`](../docs/figures/) under descriptive names (`grpo_optuna_history.png`, `grpo_reward_curve.png`, `grpo_per_tier_curve.png`, `sft_vs_grpo_scalar.png`, `grpo_reward_by_tier.png`, etc.). The full TRL checkpoints in `out_grpo/final_grpo/` and the exported adapter in `out_grpo/grpo_adapter/` are gitignored (~160 MB total). + +### GRPO output layout + +Each GRPO run writes to a fresh `outputs/aws-rl-grpo-/`: + +| File | Written by | Contents | +|-------------------------|------------------------|-------------------------------------------------------------------------| +| `reward_log.csv` | `EpisodeLogger` | One row per rollout: `step, rollout_idx, task_id, difficulty, task_reward, task_achieved, final_progress, num_steps, tier, tier_success_rate, timestamp` | +| `transcripts.jsonl` | `EpisodeLogger` | Same rows + the full multi-turn transcript per rollout (commands, outputs, rewards) | +| `optuna.db` | Optuna | SQLite study (resumable) | +| `best_cfg.json` | `optuna_search()` | Final winning hyperparameters | +| `trial_NNN/` | `_run_one_trial()` | Per-trial trainer checkpoints + `trial_metrics.json` | +| `val_task_ids.json` | Notebook driver | Frozen held-out validation set (for reproducibility) | +| `post_train_val.json` | Notebook §10 | Final post-training validation metrics | +| `reward_plot.png` | `plot_rewards()` | Group mean reward + per-tier scatter | +| `/` | TRL `GRPOTrainer.save` | Trained LoRA adapter (`adapter_config.json`, `adapter_model.safetensors`, etc.) | + +Push to HF Hub: + +```python +from huggingface_hub import create_repo, upload_folder +create_repo("your-org/aws-rl-grpo-qwen25coder3b", exist_ok=True, private=False) +upload_folder(folder_path=str(OUTPUT_DIR), repo_id="your-org/aws-rl-grpo-qwen25coder3b") +``` + +--- + +## 8. Reproducing results + +### Actual SFT result (committed at [`out/`](../out/)) + +``` +SFT (188 steps, best Optuna trial, ~30 min on A10): + best val_loss : 0.052 + best lora_r : 16 + best lora_alpha : 16 (alpha_mul=1) + best lora_dropout: 0.0058 + best lr : 4.03e-4 + best warmup : 0.10 + +Held-out eval (post-SFT, same prompts as base): + format_pct : 33.3% → 100.0% (+66.7 pp) + exact_pct : 38.9% → 88.9% (+50.0 pp) + service_pct : 77.8% → 88.9% (+11.1 pp) + operation_pct : 61.1% → 88.9% (+27.8 pp) + avg_latency : 2.03s → 1.40s (−0.63s) + avg_len : 85.8 → 74.7 (tighter outputs) +``` + +Every target from [data/sft/MODEL_EVALUATION.md §11](../data/sft/MODEL_EVALUATION.md) is met or exceeded. + +### Actual GRPO result (committed at [`out_grpo/`](../out_grpo/)) + +``` +GRPO (35 steps from best Optuna trial, ~1.5 hr on A10): + best lr : 1.60e-5 + best beta : 0.0021 + best temperature : 0.99 + num_generations : 8 + +Per-step training signals (16 reward-logged steps): + env_reward (mean): 0.31 max: 0.94 min: 0.13 + KL to SFT ref : 0.15 mean (small β = 0.0021 keeps drift in check) + format_reward : 1.00 every step (perfect format compliance) + completion length: 87 tokens mean (compact AWS CLI commands) + +Multi-step end-to-end eval (n≈108 episodes): + Base+SFT Base+SFT+GRPO Δ + overall_success 86.8% 86.2% −0.5 pp + overall_reward 0.883 0.877 −0.006 + beginner_success 96.2% 100.0% +3.8 pp ✓ + intermediate_success 81.0% 87.0% +6.0 pp ✓ + warmup_success 96.0% 90.2% −5.8 pp + expert_success 22.2% 22.2% flat (bottleneck) + drift_repair 22.2% 22.2% flat + destructive_fail 15.1% 14.7% −0.4 pp + steps_to_solve 1.45 1.55 +0.10 +``` + +**Honest reading.** A 35-step GRPO run from a strong SFT starting point (already 86.8% success) is short by RL standards. It preserves the SFT gains, modestly improves the middle tiers, but does not crack the expert-tier ceiling — the 22% expert / 22% drift-repair numbers stay flat because there are too few expert episodes in 35 GRPO steps × G=8 = 280 rollouts, with the curriculum focusing primarily on warmup/beginner/intermediate. + +Variance comes mostly from Optuna trial composition. The published SFT adapter (`Sizzing/aws-rl-sft-qwen25coder3b-adapter`) is the SFT result; the GRPO adapter regenerates per-run from `out_grpo/grpo_adapter/`. + +--- + +## 9. Files in this directory + +| File | Purpose | +|-----------------------------------------|------------------------------------------------------------------------| +| [train_sft_lora.ipynb](train_sft_lora.ipynb) | Stage 1 — supervised LoRA fine-tuning | +| [train_grpo_lora.ipynb](train_grpo_lora.ipynb) | Stage 2 — GRPO RL training (clean) | +| [train_grpo_lora_with_outputs.ipynb](train_grpo_lora_with_outputs.ipynb) | Same notebook with cell outputs preserved | + +Heavy logic referenced from these notebooks: + +- [train_grpo.py](../train_grpo.py) — the `MultiTurnEnvPool`, GRPO config, Optuna search, `plot_rewards`, and the `run_training` entry point +- [aws_rl_env_colab.ipynb](../aws_rl_env_colab.ipynb) — Colab driver that imports from `train_grpo.py` +- [scripts/grpo_pool.py](../scripts/grpo_pool.py) and [scripts/grpo_train.py](../scripts/grpo_train.py) — alternative client-side pool entry point (covered in [scripts/README.md](../scripts/README.md)) + +--- + +## See also + +- [Main README](../README.md) +- [data/README.md](../data/README.md) — dataset generation, base-model selection +- [data/sft/MODEL_EVALUATION.md](../data/sft/MODEL_EVALUATION.md) — full 11-model benchmark +- [scripts/README.md](../scripts/README.md) — parallel-rollout architecture deep-dive +- [server/README.md](../server/README.md) — environment internals (curriculum, reward shaping, anti-hacking) +- [compare/README.md](../compare/README.md) — base vs SFT comparison harness diff --git a/train/train_grpo_lora.ipynb b/train/train_grpo_lora.ipynb index d3dfff4ee6de599384e57e805d0ec9c7a2de732e..5029edee72ba09ed79a9456945f6d65a9478b65d 100644 --- a/train/train_grpo_lora.ipynb +++ b/train/train_grpo_lora.ipynb @@ -16,34 +16,34 @@ "### Architecture\n", "```\n", "Hosted env server (Docker, AWS_RL_ENV_POOL_SIZE=8)\n", - " ▲ HTTPS tunnel\n", - " │ Colab / Kaggle VM (T4)\n", - " │ └─ main python\n", - " │ 8-way httpx pool (rewards) ├─ Unsloth: base + SFT adapter (trainable)\n", - " ├──────────────────────── │\n", - " │ ├─ TRL GRPOTrainer\n", - " │ 8-way GrpoPool WS (eval) │ ├─ train_ds = stream from Curriculum\n", - " └──────────────────────── │ ├─ G generations / prompt\n", - " │ ├─ reward_fn:\n", - " │ │ a) score via /reset + /step\n", - " │ │ b) curriculum.record_result(...)\n", - " │ └─ group-advantage + PPO-clip on LoRA\n", - " ├─ Optuna (sqlite, resumable)\n", - " └─ push → Sizzing/aws-rl-grpo-qwen25coder3b-adapter\n", + " \u25b2 HTTPS tunnel\n", + " \u2502 Colab / Kaggle VM (T4)\n", + " \u2502 \u2514\u2500 main python\n", + " \u2502 8-way httpx pool (rewards) \u251c\u2500 Unsloth: base + SFT adapter (trainable)\n", + " \u251c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2502\n", + " \u2502 \u251c\u2500 TRL GRPOTrainer\n", + " \u2502 8-way GrpoPool WS (eval) \u2502 \u251c\u2500 train_ds = stream from Curriculum\n", + " \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 \u2502 \u251c\u2500 G generations / prompt\n", + " \u2502 \u251c\u2500 reward_fn:\n", + " \u2502 \u2502 a) score via /reset + /step\n", + " \u2502 \u2502 b) curriculum.record_result(...)\n", + " \u2502 \u2514\u2500 group-advantage + PPO-clip on LoRA\n", + " \u251c\u2500 Optuna (sqlite, resumable)\n", + " \u2514\u2500 push \u2192 Sizzing/aws-rl-grpo-qwen25coder3b-adapter\n", "```\n", "\n", "### Why curriculum-driven GRPO?\n", - "Plain dataset iteration is agnostic to the model’s current weaknesses. The curriculum surfaces novel + weak tasks more often, spaced-repeats mastered ones, and promotes tier only when the agent demonstrates sustained competence. GRPO's group-relative advantage + the curriculum's per-task mastery signal compose: a group of G completions on a hard task yields a high-variance advantage signal exactly when it matters.\n", + "Plain dataset iteration is agnostic to the model\u2019s current weaknesses. The curriculum surfaces novel + weak tasks more often, spaced-repeats mastered ones, and promotes tier only when the agent demonstrates sustained competence. GRPO's group-relative advantage + the curriculum's per-task mastery signal compose: a group of G completions on a hard task yields a high-variance advantage signal exactly when it matters.\n", "\n", "### Headline metrics (reported in the eval cells)\n", "| Axis | SFT baseline | GRPO target | Stretch |\n", "|----------------------|-------------:|------------:|--------:|\n", - "| `env_reward_mean` | ~0.85 | ≥0.92 | ≥0.97 |\n", - "| `env_success_rate` | ~85% | ≥92% | ≥97% |\n", - "| `recovery_rate` | ~40% | ≥60% | ≥75% |\n", - "| `drift_repair_rate` | ~30% | ≥55% | ≥70% |\n", - "| `hints_per_solved` | ~0.8 | ≤0.5 | ≤0.2 |\n", - "| `steps_to_solve` | ~6 | ≤5 | ≤4 |" + "| `env_reward_mean` | ~0.85 | \u22650.92 | \u22650.97 |\n", + "| `env_success_rate` | ~85% | \u226592% | \u226597% |\n", + "| `recovery_rate` | ~40% | \u226560% | \u226575% |\n", + "| `drift_repair_rate` | ~30% | \u226555% | \u226570% |\n", + "| `hints_per_solved` | ~0.8 | \u22640.5 | \u22640.2 |\n", + "| `steps_to_solve` | ~6 | \u22645 | \u22644 |" ] }, { @@ -53,7 +53,7 @@ "id": "3f7aa285" }, "source": [ - "## 1 · Install dependencies\n", + "## 1 \u00b7 Install dependencies\n", "\n", "Mirrors the SFT notebook's pinning strategy. Key constraints: `trl>=0.16` for `GRPOTrainer`, `transformers>=4.50,<5.0` for Unsloth compatibility (the SFT notebook ran into this too), `--force-reinstall --no-deps` on `transformers` so TRL doesn't pull an incompatible version." ] @@ -75,10 +75,10 @@ "%pip install -q \"unsloth\"\n", "%pip install -q \"trl>=0.18.2,<=0.24.0,!=0.19.0\" \"peft\" \"accelerate\" \"datasets\" \"bitsandbytes\"\n", "%pip install -q \"transformers>=4.50,<5.0\" --force-reinstall --no-deps\n", - "%pip install -q \"optuna\" \"wandb\" \"plotly\" \"kaleido\"\n", + "%pip install -q \"optuna\"\n", "%pip install -q \"httpx\" \"websockets\" \"pyyaml\" \"python-dotenv\"\n", "%pip install -q \"huggingface_hub>=0.34,<1.0\"\n", - "%pip install -q \"openenv-core\"" + "%pip install -q \"openenv-core\"\n" ] }, { @@ -86,7 +86,7 @@ "id": "logging-setup-md", "metadata": {}, "source": [ - "### 1b · Logging & warning suppression\n", + "### 1b \u00b7 Logging & warning suppression\n", "\n", "Set up structured logging and suppress known benign warnings (PEFT config keys, notebook escape sequences, transformers do_sample advisory)." ] @@ -102,7 +102,7 @@ "import sys\n", "import warnings\n", "\n", - "# ── Structured logging ──────────────────────────────────────────────\n", + "# \u2500\u2500 Structured logging \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", "logging.basicConfig(\n", " level=logging.INFO,\n", " format=\"%(asctime)s | %(levelname)-7s | %(name)s | %(message)s\",\n", @@ -112,7 +112,7 @@ ")\n", "log = logging.getLogger(\"grpo\")\n", "\n", - "# ── Suppress known benign warnings ──────────────────────────────────\n", + "# \u2500\u2500 Suppress known benign warnings \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n", "# PEFT adapter was saved with a newer version; extra keys are safely ignored.\n", "warnings.filterwarnings(\n", " \"ignore\",\n", @@ -143,9 +143,9 @@ "id": "ce043e2c" }, "source": [ - "## 2 · Clone the AWS RL env repo\n", + "## 2 \u00b7 Clone the AWS RL env repo\n", "\n", - "We need the `client.AwsRlEnv` class, `models.py` pydantic types, `scripts/grpo_pool.py`, the curriculum loader, and the task YAMLs — these power the multi-step evaluator. We do **not** install or run any env server locally; the env is hosted elsewhere." + "We need the `client.AwsRlEnv` class, `models.py` pydantic types, `scripts/grpo_pool.py`, the curriculum loader, and the task YAMLs \u2014 these power the multi-step evaluator. We do **not** install or run any env server locally; the env is hosted elsewhere." ] }, { @@ -188,7 +188,7 @@ " sys.path.insert(0, str(REPO_DIR))\n", "\n", "assert (REPO_DIR / \"models.py\").exists(), f\"models.py missing under {REPO_DIR}\"\n", - "log.info(\"Repo at %s — ready. sys.path[0]=%s\", REPO_DIR, sys.path[0])\n" + "log.info(\"Repo at %s \u2014 ready. sys.path[0]=%s\", REPO_DIR, sys.path[0])\n" ] }, { @@ -198,7 +198,7 @@ "id": "253e6837" }, "source": [ - "## 3 · Runtime detection\n", + "## 3 \u00b7 Runtime detection\n", "\n", "Matches the SFT notebook so we pick `fp16` on T4 (bf16 unsupported) and `bf16` on A100/H100. Also sets the PyTorch allocator env var that cut OOMs on long Unsloth runs." ] @@ -254,7 +254,7 @@ "id": "93c46602" }, "source": [ - "## 4 · Training configuration\n", + "## 4 \u00b7 Training configuration\n", "\n", "One frozen `TrainingConfig` dataclass holds every tunable hyperparameter. Optuna hands trials a mutated copy of this same dataclass, so the trial path and the final-run path go through identical code.\n", "\n", @@ -281,7 +281,7 @@ "class ModelSpec:\n", " base_model: str = \"unsloth/Qwen2.5-Coder-3B-Instruct-bnb-4bit\"\n", " sft_adapter: str = \"Sizzing/aws-rl-sft-qwen25coder3b-adapter\"\n", - " grpo_adapter: str = \"Sizzing/aws-rl-grpo-qwen25coder3b-adapter\" # NEW repo — SFT repo untouched\n", + " grpo_adapter: str = \"Sizzing/aws-rl-grpo-qwen25coder3b-adapter\" # NEW repo \u2014 SFT repo untouched\n", " dataset_repo: str = \"Sizzing/aws-rl-sft\"\n", " max_seq_length: int = 3072\n", "\n", @@ -289,35 +289,37 @@ "@dataclass(frozen=True)\n", "class TrainingConfig:\n", " # GRPO knobs (Optuna-tunable)\n", - " learning_rate: float = 5e-6\n", + " learning_rate: float = 5e-6 # AdamW learning rate;\n", " beta: float = 0.04 # KL coef vs. reference (frozen SFT adapter)\n", " num_generations: int = 8 # G in GRPO\n", - " temperature: float = 0.9\n", - " top_p: float = 0.95\n", - " lora_r: int = 16\n", - " lora_alpha_mul: int = 2\n", - " max_prompt_length: int = 512\n", - " max_completion_length: int = 768\n", - " per_device_train_batch_size: int = 1\n", - " gradient_accumulation_steps: int = 8\n", + " temperature: float = 0.9 # Sampling temp during generation\n", + " top_p: float = 0.95 # Nucleus sampling cutoff\n", + " max_prompt_length: int = 512 # Hard truncate on the prompt side\n", + " max_completion_length: int = 768 # Max tokens on the completion side; \n", + " per_device_train_batch_size: int = 2 # Batch per GPU\n", + " gradient_accumulation_steps: int = 8 # \tEffective batch = pdtbs \u00d7 grad_accum (= 16 now)\n", " num_train_epochs: int = 1 # ignored for IterableDataset; max_steps drives termination\n", - " save_steps: int = 25\n", - " save_total_limit: int = 3\n", - " eval_steps: int = 50\n", + " save_steps: int = 25 # How often the final run writes a checkpoint-N\n", + " save_total_limit: int = 3 # Max number of checkpoints to keep; older ones get deleted\n", + " eval_steps: int = 50 # How often to run evaluation\n", " warmup_ratio: float = 0.05\n", - " seed: int = 42\n", + " seed: int = 42 # Seeds GRPOConfig + Optuna's TPESampler\n", "\n", "\n", "@dataclass(frozen=True)\n", "class PipelineConfig:\n", " env_pool_size: int = 8\n", - " n_trials: int = 6\n", - " trial_max_steps: int = 30\n", - " final_max_steps: int = 200 # curriculum-driven; bounds the infinite IterableDataset stream\n", + " n_trials: int = 4 # Optuna trials for hyperparameter search; each trial trains a GRPO agent from the same SFT starting point, but with different hyperparameters.\n", + " trial_max_steps: int = 10 # max_steps for each Optuna trial; keeps trial runtime manageable and encourages faster feedback on hyperparameter choices. The final evaluation after all trials will use a longer max_steps to allow the best trial more time to shine.\n", + " final_max_steps: int = 35 # GRPO steps for the post-Optuna final run\n", " val_subset_size: int = 20\n", " eval_reserve_cap: int = 100\n", - " wandb_project: str = \"AWS-RL-GRPO\"\n", - " wandb_entity: str = \"sizzing-sizzing\"\n", + " # 12-task pool used for both Optuna trial training and trial scoring.\n", + " # Tuple-of-tuples keeps the dataclass frozen/hashable.\n", + " optuna_tier_counts: tuple = (\n", + " (\"warmup\", 2), (\"beginner\", 2), (\"intermediate\", 2),\n", + " (\"advanced\", 3), (\"expert\", 3),\n", + " )\n", "\n", "\n", "MODEL = ModelSpec()\n", @@ -326,7 +328,7 @@ "\n", "log.info(\"ModelSpec: %s\", MODEL)\n", "log.info(\"TrainingConfig defaults: %s\", TRAIN)\n", - "log.info(\"PipelineConfig: %s\", PIPE)" + "log.info(\"PipelineConfig: %s\", PIPE)\n" ] }, { @@ -336,17 +338,7 @@ "id": "5dcff29c" }, "source": [ - "## 5 · Authenticate: HF Hub, Weights & Biases, env URL\n", - "\n", - "Three secrets are required:\n", - "\n", - "| Secret | Scope | Used for |\n", - "|-------------------------|---------------|------------------------------------------|\n", - "| `HF_TOKEN` | read + write | pull SFT adapter, push GRPO adapter |\n", - "| `WANDB_API_KEY` | default | project logging |\n", - "| `AWS_RL_ENV_BASE_URL` | — | URL of the hosted env (cloudflared/ngrok) |\n", - "\n", - "We also dummy-push a tiny file to verify the HF token has write access to the `Sizzing` org **before** spending hours training." + "## 5 \u00b7 Authenticate: HF Hub + env URL" ] }, { @@ -378,20 +370,12 @@ " return val\n", "\n", "\n", - "HF_TOKEN = _load_secret(\"HF_TOKEN\")\n", - "WANDB_API_KEY = _load_secret(\"WANDB_API_KEY\")\n", - "ENV_BASE_URL = _load_secret(\"AWS_RL_ENV_BASE_URL\").rstrip(\"/\")\n", - "\n", - "# Keep the tunnel URL out of wandb.config to avoid leaking it on the public dashboard\n", - "os.environ[\"WANDB_DISABLE_GIT\"] = \"true\"\n", + "HF_TOKEN = _load_secret(\"HF_TOKEN\")\n", + "ENV_BASE_URL = _load_secret(\"AWS_RL_ENV_BASE_URL\").rstrip(\"/\")\n", "\n", "from huggingface_hub import login as hf_login, HfApi\n", - "import wandb\n", "\n", "hf_login(token=HF_TOKEN, add_to_git_credential=False)\n", - "# Set env var first so wandb.login() doesn't warn about key-in-code\n", - "os.environ[\"WANDB_API_KEY\"] = WANDB_API_KEY\n", - "wandb.login()\n", "\n", "\n", "def verify_hub_write_scope(repo_id: str) -> None:\n", @@ -409,7 +393,7 @@ "\n", "\n", "verify_hub_write_scope(MODEL.grpo_adapter)\n", - "log.info(\"All secrets loaded; HF write access to %s verified.\", MODEL.grpo_adapter)" + "log.info(\"All secrets loaded; HF write access to %s verified.\", MODEL.grpo_adapter)\n" ] }, { @@ -419,7 +403,7 @@ "id": "a6a47eb8" }, "source": [ - "## 6 · Connect to the hosted env + health check\n", + "## 6 \u00b7 Connect to the hosted env + health check\n", "\n", "The env server runs **outside** this VM. We only assert reachability and that its internal pool has 8 slots (required for parallel rollouts). If either fails, we stop **before** loading the model." ] @@ -443,9 +427,9 @@ "def probe_env_http(base_url: str) -> dict:\n", " \"\"\"Cheap reachability check: GET /schema. Raises on HTTP error.\n", "\n", - " Does NOT try to validate pool size from /state — AwsRlState doesn't\n", + " Does NOT try to validate pool size from /state \u2014 AwsRlState doesn't\n", " expose it. Pool capacity is verified later via a real GrpoPool\n", - " connection attempt (§6b) which is the only honest way to check.\n", + " connection attempt (\u00a76b) which is the only honest way to check.\n", " \"\"\"\n", " with httpx.Client(base_url=base_url, timeout=10.0) as c:\n", " schema = c.get(\"/schema\").raise_for_status().json()\n", @@ -454,7 +438,7 @@ "\n", "probe = probe_env_http(ENV_BASE_URL)\n", "log.info(\"Env reachable. Action schema keys: %s\", list(probe['schema'].keys()))\n", - "log.info(\"POOL_SIZE=%d assumed — verified by GrpoPool connection below.\", PIPE.env_pool_size)" + "log.info(\"POOL_SIZE=%d assumed \u2014 verified by GrpoPool connection below.\", PIPE.env_pool_size)" ] }, { @@ -464,13 +448,13 @@ "id": "b35c3272" }, "source": [ - "## 7 · Curriculum-driven prompt stream + fixed val / reserve sets\n", + "## 7 \u00b7 Curriculum-driven prompt stream + fixed val / reserve sets\n", "\n", - "Instead of feeding a static dataset, we stream prompts from the repo's [`Curriculum`](https://github.com/UdayKiranPadhy/aws-rl-env/blob/master/server/services/curriculum.py) — the same priority-queue curriculum the env already implements:\n", + "Instead of feeding a static dataset, we stream prompts from the repo's [`Curriculum`](https://github.com/UdayKiranPadhy/aws-rl-env/blob/master/server/services/curriculum.py) \u2014 the same priority-queue curriculum the env already implements:\n", "\n", "- **novelty bonus** for untried tasks (+100)\n", - "- **weakness weighting** `(1 − recent_success_rate) × 50` per task\n", - "- **spaced repetition** on graduated tasks at 3→66→12→24→48 episode intervals\n", + "- **weakness weighting** `(1 \u2212 recent_success_rate) \u00d7 50` per task\n", + "- **spaced repetition** on graduated tasks at 3\u219266\u219212\u219224\u219248 episode intervals\n", "- **recency penalty** to avoid drilling the same task back-to-back\n", "- **tier promotion** with fast-track when success rate crosses threshold\n", "\n", @@ -530,17 +514,15 @@ "\n", "SYSTEM_PROMPT = (\n", " \"You are an expert AWS Operations agent. You operate a simulated AWS cloud by \"\n", - " \"emitting AWS CLI commands.\\n\\n\"\n", - " \"Given the task description, first reason about your approach inside a \"\n", - " \"... block: identify the AWS service, the right subcommand, \"\n", - " \"required arguments, and any constraints from the task. If the task needs \"\n", - " \"multiple steps, plan the full ordered sequence. Keep the reasoning concise \"\n", - " \"(a few short sentences).\\n\\n\"\n", - " \"After , output one AWS CLI command per line, each starting with \"\n", - " \"\\\"aws \\\". For a single-step task emit ONE line; for a multi-step task emit \"\n", - " \"the full ordered sequence, one command per line, in execution order. Each \"\n", - " \"line must contain only the command — no markdown, no backticks, no quotes \"\n", - " \"around it, and no trailing commentary.\"\n", + " \"emitting one AWS CLI command per turn. The conversation may include prior \"\n", + " \"commands and their outputs from earlier in this episode \u2014 use them to decide \"\n", + " \"your next move.\\n\\n\"\n", + " \"First reason about your next move inside a ... block: identify \"\n", + " \"the AWS service, the right subcommand, required arguments, and any constraints \"\n", + " \"from the task. Keep the reasoning concise (a few short sentences).\\n\\n\"\n", + " \"After , on a NEW LINE, output EXACTLY ONE AWS CLI command starting \"\n", + " \"with \\\"aws \\\". The command line must contain only the command \u2014 no markdown, \"\n", + " \"no backticks, no quotes around it, and no trailing commentary.\"\n", ")\n", "\n", "\n", @@ -565,18 +547,18 @@ "\n", " TRL's GRPOTrainer explicitly rejects IterableDataset (see TRL issue #3213:\n", " ``NotImplementedError: Iterable datasets are not yet supported``). That\n", - " kills the original on-demand `curriculum.next_task()` streaming design —\n", + " kills the original on-demand `curriculum.next_task()` streaming design \u2014\n", " the trainer must see a Dataset with a known `__len__`.\n", "\n", " Compromise: sample `n_rows` prompts up front. The curriculum's novelty +\n", " weakness + recency heuristics still apply *across the draw* (every\n", " `next_task()` pops the current top-of-queue and ages neighbouring tasks\n", - " via recency), so we get a sensibly ordered warm-start sample — not\n", + " via recency), so we get a sensibly ordered warm-start sample \u2014 not\n", " uniform-random. What we lose is live re-ranking between steps: mastery\n", " updates made by the reward function during training don't feed back\n", " into selection until a fresh dataset is built. `curriculum.record_result`\n", " still runs inside the reward function so mastery metrics remain accurate\n", - " for wandb logging and end-of-run stats.\n", + " for end-of-run stats.\n", "\n", " Size `n_rows` to `max_steps * per_device_train_batch_size *\n", " gradient_accumulation_steps`, plus a buffer so `num_train_epochs=1`\n", @@ -594,7 +576,7 @@ " instead of drawing N prompts up front (which freezes the training data\n", " to whatever tier the curriculum happened to start in), we materialise\n", " EVERY task with its `difficulty` tag and let `CurriculumTierSampler`\n", - " dynamically pick indices from the curriculum\\'s current tier at\n", + " dynamically pick indices from the curriculum's current tier at\n", " iteration time. Tier promotion inside the reward callback then\n", " immediately affects which prompts the next batch pulls.\n", " \"\"\"\n", @@ -613,9 +595,39 @@ " return ds\n", "\n", "\n", + "def make_optuna_task_dataset(task_map: dict[int, Task],\n", + " tier_counts: tuple,\n", + " seed: int = 42) -> Dataset:\n", + " \"\"\"Deterministic small task pool for Optuna trials.\n", + "\n", + " Picks N tasks per tier from `task_map` (sorted by task_id then shuffled\n", + " with a fixed seed so the pool is identical across re-runs). Returns a\n", + " Dataset with the same row schema as `make_full_curriculum_dataset`.\n", + " Used both as trial train_ds (curriculum sampler cycles within tier\n", + " pools) and as the single-step eval set for `trial_objective`.\n", + " \"\"\"\n", + " import random\n", + " rng = random.Random(seed)\n", + " rows: list[dict] = []\n", + " for tier_name, n in tier_counts:\n", + " pool = sorted(\n", + " (t for t in task_map.values() if t.difficulty.value == tier_name),\n", + " key=lambda t: int(t.task_id),\n", + " )\n", + " rng.shuffle(pool)\n", + " for t in pool[:n]:\n", + " rows.append(task_to_row(t))\n", + " if not rows:\n", + " raise RuntimeError(\"Optuna pool came out empty \u2014 check tier_counts\")\n", + " ds = Dataset.from_list(rows)\n", + " log.info(\"Optuna task pool: %d rows by tier=%s\",\n", + " len(ds), {k: n for k, n in tier_counts})\n", + " return ds\n", + "\n", + "\n", "def _load_raw_dataset(dataset_repo: str) -> dict:\n", " \"\"\"Load the HF dataset once; cached for reuse by val + reserve builders.\"\"\"\n", - " log.info(\"Loading dataset from %s …\", dataset_repo)\n", + " log.info(\"Loading dataset from %s \u2026\", dataset_repo)\n", " return load_dataset(dataset_repo, token=HF_TOKEN)\n", "\n", "\n", @@ -666,11 +678,13 @@ "VAL_DS = build_val_dataset(MODEL.dataset_repo, TASK_MAP,\n", " PIPE.val_subset_size, TRAIN.seed)\n", "RESERVE_DS = build_reserve_dataset(MODEL.dataset_repo, TASK_MAP)\n", + "OPTUNA_DS = make_optuna_task_dataset(TASK_MAP, PIPE.optuna_tier_counts, TRAIN.seed)\n", "\n", "log.info(\"TASK_MAP: %d tasks across %d tiers\", len(TASK_MAP), len({t.difficulty for t in TASK_MAP.values()}))\n", "log.info(\"DRIFT_TASK_IDS: %d drift tasks\", len(DRIFT_TASK_IDS))\n", "log.info(\"VAL_DS: %d rows (fixed, for before/after comparison)\", len(VAL_DS))\n", - "log.info(\"RESERVE_DS: %d rows (multi-step eval)\", len(RESERVE_DS) if RESERVE_DS else 0)\n" + "log.info(\"RESERVE_DS: %d rows (multi-step eval)\", len(RESERVE_DS) if RESERVE_DS else 0)\n", + "log.info(\"OPTUNA_DS: %d rows (used for trial training + trial val eval)\", len(OPTUNA_DS))\n" ] }, { @@ -680,7 +694,7 @@ "id": "ebc9f27e" }, "source": [ - "## 8 · Reward functions + curriculum feedback\n", + "## 8 \u00b7 Reward functions + curriculum feedback\n", "\n", "Three reward functions passed to `GRPOTrainer.reward_funcs`:\n", "\n", @@ -688,11 +702,11 @@ "|------------------|-------:|------------------------------------------------------------|\n", "| `env_reward` | 1.0 | Real env reward from `/reset` + `/step` against the task |\n", "| `format_reward` | 0.15 | 1.0 if completion starts with `aws `, else 0.0 |\n", - "| `length_reward` | 0.05 | Soft length prior: 1.0 ≤120 chars, decays to 0.0 by 400 |\n", + "| `length_reward` | 0.05 | Soft length prior: 1.0 \u2264120 chars, decays to 0.0 by 400 |\n", "\n", - "`env_reward` also closes the curriculum loop. TRL emits the batch as `batch_size × num_generations` flattened completions with `task_id` repeated G times per prompt. We group by task_id, and for each group call `curriculum.record_result(task, achieved=any(r≥1.0), reward=mean)`. That one line is the bridge: TRL owns iteration, the curriculum owns task selection, and the reward function owns the feedback edge. No custom training loop; all the quality-of-life of TRL (wandb, checkpoint, resume, Optuna) is preserved.\n", + "`env_reward` also closes the curriculum loop. TRL emits the batch as `batch_size \u00d7 num_generations` flattened completions with `task_id` repeated G times per prompt. We group by task_id, and for each group call `curriculum.record_result(task, achieved=any(r\u22651.0), reward=mean)`. That one line is the bridge: TRL owns iteration, the curriculum owns task selection, and the reward function owns the feedback edge. No custom training loop; all the quality-of-life of TRL (checkpoint, resume, Optuna) is preserved.\n", "\n", - "Thread safety: env HTTP calls run on the pool threads, but reward aggregation + `record_result` both happen on the main thread after the pool join, so no locking is needed." + "Thread safety: env HTTP calls run on the pool threads, but reward aggregation + `record_result` both happen on the main thread after the pool join, so no locking is needed.\n" ] }, { @@ -725,29 +739,11 @@ "_OPEN_THINK = re.compile(r\"]*>.*\", re.DOTALL | re.IGNORECASE)\n", "\n", "\n", - "def extract_aws_commands(raw: str) -> list[str]:\n", - " \"\"\"Return every `aws ...` line from a completion, in order.\n", - "\n", - " Multi-step tasks (intermediate/advanced/expert tiers) need the\n", - " model to emit a sequence of commands. We keep `extract_aws_command`\n", - " around for callers that genuinely want only the first command\n", - " (per-turn eval inside `run_episode`).\n", - " \"\"\"\n", - " cleaned = _THINK_BLOCK.sub(\"\", raw)\n", - " cleaned = _OPEN_THINK.sub(\"\", cleaned)\n", - " cmds: list[str] = []\n", - " for line in cleaned.splitlines():\n", - " line = line.strip().strip(\"`\").strip()\n", - " if line.startswith(\"aws \"):\n", - " cmds.append(line)\n", - " return cmds if cmds else [\"aws help\"]\n", - "\n", - "\n", "def extract_aws_command(raw: str) -> str:\n", " # Drop any balanced ... spans first.\n", " cleaned = _THINK_BLOCK.sub(\"\", raw)\n", " # If a is still open (no matching ), everything after\n", - " # it is reasoning-in-progress, not a command — cut it.\n", + " # it is reasoning-in-progress, not a command \u2014 cut it.\n", " cleaned = _OPEN_THINK.sub(\"\", cleaned)\n", " for line in cleaned.splitlines():\n", " line = line.strip().strip(\"`\").strip()\n", @@ -760,7 +756,7 @@ " \"\"\"Persistent-WebSocket reward client against a pooled env server.\n", "\n", " Why WebSocket and not HTTP /reset + /step: under `AWS_RL_ENV_POOL_SIZE>1`\n", - " the server's HTTP path uses an env *factory* — every request builds a\n", + " the server's HTTP path uses an env *factory* \u2014 every request builds a\n", " fresh `AwsRlEnvironment` from the pool factory, so `/step` on request 2\n", " lands on a different env than `/reset` on request 1 and trips\n", " ``assert self._episode is not None, \"Call reset() before step()\"``.\n", @@ -783,7 +779,7 @@ " Counters (success / timeout / conn_err / reconnect) let the trainer\n", " log env health without inspecting internal state. `last_error`\n", " captures the most recent exception. `verbose_errors=True` prints\n", - " full tracebacks per failure (noisy — only enable while debugging).\n", + " full tracebacks per failure (noisy \u2014 only enable while debugging).\n", " \"\"\"\n", "\n", " def __init__(\n", @@ -855,42 +851,27 @@ " pass\n", " await env.connect()\n", "\n", - " async def _reset_and_step(self, env, task: Task,\n", - " commands: list[str]) -> float:\n", - " \"\"\"Reset once, then play the planned command sequence on the same\n", - " env session. Multi-step tasks need their ordered ops to land in\n", - " the same `EpisodeTracker` for `_grade_multi_step` to mark them\n", - " achieved; resetting between commands would wipe `command_history`.\n", - " Returns the reward of the last step (or the step that flipped\n", - " `done=True`, whichever comes first).\n", - " \"\"\"\n", + " async def _reset_and_step(self, env, task: Task, command: str) -> float:\n", " await asyncio.wait_for(env.reset(task=task), timeout=self.timeout_s)\n", - " reward = 0.0\n", - " for cmd in commands:\n", - " res = await asyncio.wait_for(\n", - " env.step(AwsRlAction(command=cmd)), timeout=self.timeout_s\n", - " )\n", - " reward = float(res.reward)\n", - " if getattr(res, \"done\", False) or getattr(\n", - " getattr(res, \"observation\", None), \"task_achieved\", False\n", - " ):\n", - " break\n", - " return reward\n", - "\n", - " async def _score_one(self, task: Task, commands: list[str]) -> float:\n", + " res = await asyncio.wait_for(\n", + " env.step(AwsRlAction(command=command)), timeout=self.timeout_s\n", + " )\n", + " return float(res.reward)\n", + "\n", + " async def _score_one(self, task: Task, command: str) -> float:\n", " env = await self._queue.get()\n", " try:\n", " try:\n", - " reward = await self._reset_and_step(env, task, commands)\n", + " reward = await self._reset_and_step(env, task, command)\n", " self.success += 1\n", " return reward\n", " except ConnectionClosed as e:\n", " # Cloudflare / server idle-closed the socket. Reconnect and retry.\n", " self.last_error = f\"reconnect after {type(e).__name__}: {e}\"\n", " if self.verbose_errors:\n", - " print(f\"[reward] {self.last_error} — reconnecting\")\n", + " print(f\"[reward] {self.last_error} \u2014 reconnecting\")\n", " await self._reconnect(env)\n", - " reward = await self._reset_and_step(env, task, commands)\n", + " reward = await self._reset_and_step(env, task, command)\n", " self.success += 1\n", " return reward\n", " except asyncio.TimeoutError:\n", @@ -909,7 +890,7 @@ " self._queue.put_nowait(env)\n", "\n", " async def _score_batch_async(\n", - " self, tasks: list, commands: list[list[str]]\n", + " self, tasks: list, commands: list[str]\n", " ) -> list[float]:\n", " return list(\n", " await asyncio.gather(\n", @@ -917,21 +898,117 @@ " )\n", " )\n", "\n", - " def score_batch(self, tasks: list,\n", - " commands: list[list[str]]) -> list[float]:\n", - " \"\"\"Parallel scoring; preserves input order.\n", - "\n", - " `commands[i]` is the ordered list of AWS CLI commands extracted\n", - " from completion `i`; an empty plan should be passed as\n", - " `[\"aws help\"]` (which is what `extract_aws_commands` returns\n", - " as fallback).\n", - " \"\"\"\n", + " def score_batch(self, tasks: list, commands: list[str]) -> list[float]:\n", + " \"\"\"Parallel scoring; preserves input order.\"\"\"\n", " assert self._loop is not None\n", " fut = asyncio.run_coroutine_threadsafe(\n", " self._score_batch_async(tasks, commands), self._loop\n", " )\n", " return fut.result()\n", "\n", + " async def _rollout_one_async(\n", + " self,\n", + " task: Task,\n", + " first_command: str,\n", + " generate_next, # sync callable (history) -> str\n", + " max_steps: int,\n", + " ) -> float:\n", + " \"\"\"Interactive multi-turn rollout on a single env session.\n", + "\n", + " Plays `first_command` as turn 1 (this is what TRL just generated),\n", + " then for turns 2..max_steps asks `generate_next` for the next\n", + " command given the running (cmd, output) history. Used by\n", + " `score_batch_interactive` to give the trainer the same multi-step\n", + " rollout semantics as eval-time `run_episode`.\n", + "\n", + " `generate_next` is sync because the policy lives on the main\n", + " thread's GPU; we call it from this background-thread coroutine\n", + " via `loop.run_in_executor(None, ...)` so it doesn't block the\n", + " asyncio loop.\n", + " \"\"\"\n", + " env = await self._queue.get()\n", + " try:\n", + " try:\n", + " await asyncio.wait_for(env.reset(task=task), timeout=self.timeout_s)\n", + " history: list[tuple[str, str]] = []\n", + " reward = 0.0\n", + " cmd = first_command\n", + " loop = asyncio.get_running_loop()\n", + " for turn in range(max_steps):\n", + " res = await asyncio.wait_for(\n", + " env.step(AwsRlAction(command=cmd)),\n", + " timeout=self.timeout_s,\n", + " )\n", + " reward = float(res.reward)\n", + " obs = getattr(res, \"observation\", None)\n", + " history.append((cmd, getattr(obs, \"command_output\", \"\") or \"\"))\n", + " done_flag = getattr(res, \"done\", False) or getattr(\n", + " obs, \"task_achieved\", False\n", + " )\n", + " if done_flag or turn == max_steps - 1:\n", + " break\n", + " # Hop to a worker thread for the (sync, GPU-bound) generation.\n", + " cmd = await loop.run_in_executor(\n", + " None, generate_next, tuple(history)\n", + " )\n", + " self.success += 1\n", + " return reward\n", + " except ConnectionClosed as e:\n", + " # Don't auto-retry mid-episode: a fresh reset would wipe\n", + " # tracker state and any partial credit from earlier turns.\n", + " self.last_error = f\"{type(e).__name__}: {e} (mid-rollout)\"\n", + " if self.verbose_errors:\n", + " print(f\"[reward] {self.last_error}\")\n", + " self.conn_err += 1\n", + " return 0.0\n", + " except asyncio.TimeoutError:\n", + " self.timeout += 1\n", + " self.last_error = \"asyncio.TimeoutError\"\n", + " if self.verbose_errors:\n", + " traceback.print_exc()\n", + " return 0.0\n", + " except Exception as e:\n", + " self.conn_err += 1\n", + " self.last_error = f\"{type(e).__name__}: {e}\"\n", + " if self.verbose_errors:\n", + " traceback.print_exc()\n", + " return 0.0\n", + " finally:\n", + " self._queue.put_nowait(env)\n", + "\n", + " def score_batch_interactive(\n", + " self,\n", + " tasks: list,\n", + " first_commands: list[str],\n", + " generate_next_per_rollout: list, # list[Callable[[history], str]]\n", + " max_steps: int = 5,\n", + " ) -> list[float]:\n", + " \"\"\"Parallel multi-turn scoring; preserves input order.\n", + "\n", + " Each rollout takes ONE command at a time: TRL's completion\n", + " supplies turn 1, then `generate_next_per_rollout[i](history)`\n", + " is called for each subsequent turn of rollout `i` until\n", + " `done=True` or `max_steps` is reached. Up to `pool_size`\n", + " rollouts run in parallel against the WS pool \u2014 but the caller\n", + " is expected to serialise GPU-bound generates inside the\n", + " closures themselves (one shared lock), since concurrent\n", + " generates on a single accelerator only fight for the same\n", + " memory.\n", + " \"\"\"\n", + " assert self._loop is not None\n", + " assert len(tasks) == len(first_commands) == len(generate_next_per_rollout)\n", + "\n", + " async def _gather():\n", + " return list(await asyncio.gather(*(\n", + " self._rollout_one_async(t, c, gen, max_steps)\n", + " for t, c, gen in zip(\n", + " tasks, first_commands, generate_next_per_rollout,\n", + " )\n", + " )))\n", + "\n", + " fut = asyncio.run_coroutine_threadsafe(_gather(), self._loop)\n", + " return fut.result()\n", + "\n", " def drain_counters(self) -> dict:\n", " out = {\n", " \"success\": self.success,\n", @@ -964,23 +1041,85 @@ "\n", "def build_reward_funcs(env: EnvRewardClient,\n", " task_map: dict[int, Task],\n", - " curriculum: Optional[Curriculum] = None\n", + " curriculum: Optional[Curriculum] = None,\n", + " model=None,\n", + " tokenizer=None,\n", + " max_rollout_steps: int = 5,\n", " ) -> tuple[Callable, Callable, Callable]:\n", " \"\"\"Return (env_reward, format_reward, length_reward).\n", "\n", " When `curriculum` is provided, env_reward calls curriculum.record_result()\n", - " once per unique task_id in the batch — one record = one group = one\n", + " once per unique task_id in the batch \u2014 one record = one group = one\n", " curriculum episode. This is what makes the training loop curriculum-driven\n", " even while TRL owns the outer iteration.\n", + "\n", + " When `model` and `tokenizer` are provided, env_reward runs INTERACTIVE\n", + " multi-turn rollouts: TRL's completion supplies the first command, then\n", + " the policy is re-queried after each env step (with running command/output\n", + " history) for up to `max_rollout_steps - 1` more turns. This is what lets\n", + " multi-step (intermediate/advanced/expert) tasks actually achieve during\n", + " training. Without `model`, env_reward falls back to single-step scoring.\n", " \"\"\"\n", " def _text_of(c) -> str:\n", " return c if isinstance(c, str) else c[0][\"content\"]\n", "\n", + " # Pre-build the multi-turn generate_next closure once. Only used when\n", + " # `model` was supplied \u2014 single-step path skips it entirely.\n", + " if model is not None and tokenizer is not None:\n", + " import torch as _torch # local import to avoid hard dep if unused\n", + " _gen_lock = threading.Lock() # GPU serialisation across rollouts\n", + "\n", + " def _generate_next_for_task(task: Task, history) -> str:\n", + " \"\"\"Sync per-turn generation: build prompt with running history,\n", + " decode one command, return the extracted `aws ...` line.\n", + " Runs on a worker thread off the event loop (see\n", + " `_rollout_one_async`); the lock prevents concurrent rollouts\n", + " from racing on the same GPU.\"\"\"\n", + " messages = [\n", + " {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n", + " {\"role\": \"user\", \"content\": f\"TASK: {task.description}\"},\n", + " ]\n", + " for cmd, out in list(history)[-4:]:\n", + " messages.append({\"role\": \"assistant\", \"content\": cmd})\n", + " messages.append({\"role\": \"user\", \"content\": f\"OUTPUT:\\n{out[:400]}\"})\n", + " prompt_text = tokenizer.apply_chat_template(\n", + " messages, tokenize=False, add_generation_prompt=True,\n", + " )\n", + " with _gen_lock:\n", + " inputs = tokenizer(prompt_text, return_tensors=\"pt\").to(model.device)\n", + " with _torch.inference_mode():\n", + " ids = model.generate(\n", + " **inputs,\n", + " max_new_tokens=256,\n", + " do_sample=True, temperature=0.7, top_p=0.9,\n", + " pad_token_id=tokenizer.eos_token_id,\n", + " )\n", + " text = tokenizer.decode(\n", + " ids[0, inputs.input_ids.shape[1]:], skip_special_tokens=True,\n", + " )\n", + " return extract_aws_command(text)\n", + " else:\n", + " _generate_next_for_task = None\n", + "\n", " def env_reward(prompts, completions, task_id=None, **kw):\n", " tids = task_id if task_id is not None else kw[\"task_id\"]\n", " tasks = [task_map[int(t)] for t in tids]\n", - " cmds = [extract_aws_commands(_text_of(c)) for c in completions]\n", - " rewards = env.score_batch(tasks, cmds)\n", + " cmds = [extract_aws_command(_text_of(c)) for c in completions]\n", + "\n", + " if _generate_next_for_task is not None:\n", + " # Interactive multi-turn: one task-bound generate_next closure\n", + " # per rollout; env.step calls fan out across the WS pool, while\n", + " # the shared `_gen_lock` inside the closure keeps generates\n", + " # serial on the single GPU.\n", + " gens = [\n", + " (lambda hist, _t=t: _generate_next_for_task(_t, hist))\n", + " for t in tasks\n", + " ]\n", + " rewards = env.score_batch_interactive(\n", + " tasks, cmds, gens, max_steps=max_rollout_steps,\n", + " )\n", + " else:\n", + " rewards = env.score_batch(tasks, cmds)\n", "\n", " # Group by task_id and feed each group back to the curriculum. TRL emits\n", " # G completions per prompt consecutively (all sharing one task_id), so\n", @@ -1003,7 +1142,7 @@ " # \"first char must be aws \" check would score 0 on every\n", " # well-formed ... + aws ... output. Instead\n", " # require that *some* line of the completion starts with\n", - " # \"aws \" — the same contract extract_aws_command() relies on.\n", + " # \"aws \" \u2014 the same contract extract_aws_command() relies on.\n", " out = []\n", " for c in completions:\n", " txt = _text_of(c)\n", @@ -1042,14 +1181,14 @@ "# Re-run protection: if this cell has been run before, the old ENV_CLIENT's\n", "# background thread is still holding 8 WebSocket sessions. Close it cleanly\n", "# (sends {\"type\":\"close\"} so the server's /ws handler reaches its finally\n", - "# block and calls _destroy_session → releases the MiniStack slot). Without\n", + "# block and calls _destroy_session \u2192 releases the MiniStack slot). Without\n", "# this, every re-run compounds the leak until the server hits 8/8 capacity.\n", "try:\n", " _prev = ENV_CLIENT # noqa: F821\n", "except NameError:\n", " pass\n", "else:\n", - " log.info(\"Closing previous ENV_CLIENT to release its WS sessions…\")\n", + " log.info(\"Closing previous ENV_CLIENT to release its WS sessions\u2026\")\n", " try:\n", " _prev.close()\n", " except Exception as _e:\n", @@ -1074,7 +1213,7 @@ ")\n", "log.info(\"Reward smoke test on task %s: %s\", _smoke_task.task_id, _smoke)\n", "log.info(\"Env counters: %s\", ENV_CLIENT.drain_counters())\n", - "assert min(_smoke) > 0.5, \"Reward smoke test failed — env or reward wiring broken\"\n" + "assert min(_smoke) > 0.5, \"Reward smoke test failed \u2014 env or reward wiring broken\"\n" ] }, { @@ -1084,9 +1223,9 @@ "id": "99f34cfe" }, "source": [ - "## 9 · Load the SFT adapter as the starting policy\n", + "## 9 \u00b7 Load the SFT adapter as the starting policy\n", "\n", - "We go through `PeftModel.from_pretrained(base, sft_adapter, is_trainable=True)` explicitly (rather than `FastLanguageModel.from_pretrained(adapter_repo)`) so there is no ambiguity about the adapter landing in trainable mode — GRPO must be able to update the LoRA weights.\n", + "We go through `PeftModel.from_pretrained(base, sft_adapter, is_trainable=True)` explicitly (rather than `FastLanguageModel.from_pretrained(adapter_repo)`) so there is no ambiguity about the adapter landing in trainable mode \u2014 GRPO must be able to update the LoRA weights.\n", "\n", "This helper is also used later by the final-run and Optuna-trial paths, so it lives in its own cell." ] @@ -1223,7 +1362,7 @@ "def load_policy(spec: ModelSpec, trainable: bool = True):\n", " \"\"\"Load base (4-bit) + SFT adapter.\n", "\n", - " `trainable=True` gives a PeftModel with is_trainable=True — the correct\n", + " `trainable=True` gives a PeftModel with is_trainable=True \u2014 the correct\n", " mode for GRPO. `trainable=False` loads the adapter for inference only\n", " and invokes `FastLanguageModel.for_inference` for Unsloth's fused\n", " inference kernels (used during evaluation).\n", @@ -1242,7 +1381,7 @@ " # PeftModel.from_pretrained doesn't wire up the input-require-grads\n", " # forward hook on the embeddings. With Unsloth's gradient\n", " # checkpointing + 4-bit frozen base, that breaks the autograd path\n", - " # between the loss and the trainable LoRA adapters — backward\n", + " # between the loss and the trainable LoRA adapters \u2014 backward\n", " # errors with \"element 0 of tensors does not require grad\". The\n", " # hook marks the embedding output as requires_grad so gradients\n", " # can flow into the adapters. FastLanguageModel.get_peft_model\n", @@ -1266,7 +1405,7 @@ "_probe_model, _probe_tok = load_policy(MODEL, trainable=True)\n", "_trainable = [n for n, p in _probe_model.named_parameters() if p.requires_grad]\n", "log.info(\"Loaded %s. Trainable params: %d tensors; sample: %s\", MODEL.sft_adapter, len(_trainable), _trainable[:3])\n", - "assert any(\"lora\" in n.lower() for n in _trainable), \"No LoRA params marked trainable — load path is wrong\"\n", + "assert any(\"lora\" in n.lower() for n in _trainable), \"No LoRA params marked trainable \u2014 load path is wrong\"\n", "free_model(_probe_model)\n", "del _probe_tok\n", "gc.collect(); torch.cuda.empty_cache()\n", @@ -1280,7 +1419,7 @@ "id": "13c4aa8f" }, "source": [ - "## 10 · Baseline eval — SFT adapter, single-step env reward\n", + "## 10 \u00b7 Baseline eval \u2014 SFT adapter, single-step env reward\n", "\n", "Single-pass eval on the val set. This is the \"before\" column of the headline comparison. The richer *multi-step* eval happens later; this one is only here to confirm the SFT-loaded model outputs sane commands against the env **before** we start GRPO.\n", "\n", @@ -1322,7 +1461,7 @@ " FastLanguageModel.for_inference(model)\n", " formats: list[float] = []\n", " tasks_to_score: list[Task] = []\n", - " cmds_to_score: list[list[str]] = []\n", + " cmds_to_score: list[str] = []\n", "\n", " for row in dataset:\n", " prompt_text = tokenizer.apply_chat_template(\n", @@ -1348,7 +1487,7 @@ " )\n", " formats.append(1.0 if has_cmd else 0.0)\n", " tasks_to_score.append(task_map[int(row[\"task_id\"])])\n", - " cmds_to_score.append(extract_aws_commands(text))\n", + " cmds_to_score.append(extract_aws_command(text))\n", "\n", " # Score all env rewards in parallel across the 8 server slots\n", " rewards = env.score_batch(tasks_to_score, cmds_to_score)\n", @@ -1391,63 +1530,66 @@ "outputs": [], "source": [ "import optuna\n", + "import time\n", + "\n", + "log.info(\"Loading optuna and defining trial objective...\")\n", "\n", "\n", "def suggest_training_config(trial: optuna.Trial, defaults: TrainingConfig) -> TrainingConfig:\n", " \"\"\"Return a mutated copy of `defaults` with Optuna-sampled hparams.\n", "\n", - " One function, one diff — keeps the search space auditable.\n", + " One function, one diff \u2014 keeps the search space auditable.\n", " \"\"\"\n", " return replace(\n", " defaults,\n", " learning_rate = trial.suggest_float(\"learning_rate\", 1e-6, 5e-5, log=True),\n", " beta = trial.suggest_float(\"beta\", 0.0, 0.1),\n", - " num_generations = trial.suggest_categorical(\"num_generations\", [4, 8]),\n", " temperature = trial.suggest_float(\"temperature\", 0.7, 1.0),\n", - " lora_r = trial.suggest_categorical(\"lora_r\", [8, 16, 32]),\n", - " lora_alpha_mul = trial.suggest_categorical(\"lora_alpha_mul\", [1, 2]),\n", " )\n", "\n", "\n", "def trial_objective(trial: optuna.Trial) -> float:\n", - " \"\"\"Short curriculum-driven GRPO run + val eval. Returns mean env reward on VAL_DS.\"\"\"\n", + " \"\"\"Short curriculum-driven GRPO run + val eval. Returns mean env reward\n", + " on the small Optuna task pool.\"\"\"\n", " trial_cfg = suggest_training_config(trial, TRAIN)\n", " output_dir = str(OUT_DIR / f\"optuna/trial-{trial.number}\")\n", + " log.info(\"[trial %d] starting | cfg=%s\", trial.number, {\n", + " \"lr\": trial_cfg.learning_rate, \"beta\": trial_cfg.beta,\n", + " \"temp\": trial_cfg.temperature,\n", + " })\n", "\n", - " # Fresh curriculum per trial — otherwise mastery and tier progression bleed\n", + " # Fresh curriculum per trial \u2014 otherwise mastery and tier progression bleed\n", " # across trials, making Optuna's hparam comparison unfair.\n", " trial_curriculum = Curriculum(tasks_dir=_tasks_dir)\n", - " # Superset dataset across all tiers; CurriculumTierSampler (wired in\n", - " # build_trainer below) picks indices for the curriculum's current tier\n", - " # on every yield, so promotion takes effect immediately.\n", - " trial_train_ds = make_full_curriculum_dataset(_tasks_dir)\n", + " # Small fixed task pool (12 rows: warmup-2, beginner-2, intermediate-2,\n", + " # advanced-3, expert-3). CurriculumTierSampler still cycles within whatever\n", + " # tier the curriculum is on; with only 2-3 rows per tier the sampler\n", + " # simply re-shuffles those indices each cycle.\n", + " trial_train_ds = OPTUNA_DS\n", " trial_num_samples = int(\n", " PIPE.trial_max_steps\n", " * trial_cfg.per_device_train_batch_size\n", " * trial_cfg.gradient_accumulation_steps\n", " * 1.2\n", " )\n", - " trial_env_r, trial_fmt_r, trial_len_r = build_reward_funcs(\n", - " ENV_CLIENT, TASK_MAP, trial_curriculum,\n", - " )\n", - "\n", + " log.info(\"[trial %d] loading SFT policy (4-bit Qwen2.5-Coder-3B)...\", trial.number)\n", + " _t0 = time.time()\n", " model, tokenizer = load_policy(MODEL, trainable=True)\n", + " log.info(\"[trial %d] policy loaded in %.1fs\", trial.number, time.time() - _t0)\n", "\n", - " run = wandb.init(\n", - " project=PIPE.wandb_project, entity=PIPE.wandb_entity,\n", - " name=f\"optuna-trial-{trial.number}\",\n", - " config={**asdict(trial_cfg), \"trial_number\": trial.number, \"curriculum\": True},\n", - " reinit=True,\n", + " trial_env_r, trial_fmt_r, trial_len_r = build_reward_funcs(\n", + " ENV_CLIENT, TASK_MAP, trial_curriculum,\n", + " model=model, tokenizer=tokenizer,\n", " )\n", "\n", " trainer = build_trainer(\n", " model, tokenizer,\n", " train_ds=trial_train_ds,\n", - " eval_ds=VAL_DS,\n", + " eval_ds=OPTUNA_DS,\n", " reward_funcs=(trial_env_r, trial_fmt_r, trial_len_r),\n", " cfg=trial_cfg,\n", " output_dir=output_dir,\n", - " wandb_run_name=run.name,\n", + " run_name=f\"optuna-trial-{trial.number}\",\n", " use_fp16=RT.use_fp16, use_bf16=RT.use_bf16,\n", " max_steps=PIPE.trial_max_steps,\n", " save_strategy=\"no\",\n", @@ -1456,7 +1598,11 @@ " )\n", "\n", " try:\n", + " log.info(\"[trial %d] starting train() for %d steps...\",\n", + " trial.number, PIPE.trial_max_steps)\n", + " _t1 = time.time()\n", " trainer.train()\n", + " log.info(\"[trial %d] train() finished in %.1fs\", trial.number, time.time() - _t1)\n", " # Persist trainer_state.json for later plotting. save_strategy=\"no\"\n", " # means TRL never writes checkpoints during training, so without\n", " # this call there'd be no on-disk log history for this trial once\n", @@ -1471,23 +1617,27 @@ " indent=2, default=str,\n", " )\n", " )\n", + " # Score the trial on the same small Optuna task pool.\n", + " log.info(\"[trial %d] running single-step eval on %d tasks...\",\n", + " trial.number, len(OPTUNA_DS))\n", + " _t2 = time.time()\n", " metrics = evaluate_single_step(\n", - " trainer.model, tokenizer, VAL_DS, ENV_CLIENT, TASK_MAP,\n", + " trainer.model, tokenizer, OPTUNA_DS, ENV_CLIENT, TASK_MAP,\n", " max_new_tokens=trial_cfg.max_completion_length,\n", " )\n", + " log.info(\"[trial %d] eval finished in %.1fs\", trial.number, time.time() - _t2)\n", " score = metrics.env_reward_mean\n", " # Also capture single-step eval metrics per trial for offline plotting.\n", " (trial_out / \"single_step_metrics.json\").write_text(\n", " json.dumps(metrics.as_dict(), indent=2)\n", " )\n", - " wandb.log({\n", - " \"trial/env_reward_mean\": score,\n", - " \"trial/env_success_rate\": metrics.env_success_rate,\n", - " \"trial/curriculum_tier\": trial_curriculum.current_difficulty.value,\n", - " \"trial/graduated_tasks\": len(trial_curriculum.get_stats().get(\"graduated_tasks\", [])),\n", - " })\n", + " log.info(\n", + " \"[trial %d] DONE | env_reward_mean=%.4f success=%.3f tier=%s graduated=%d\",\n", + " trial.number, score, metrics.env_success_rate,\n", + " trial_curriculum.current_difficulty.value,\n", + " len(trial_curriculum.get_stats().get(\"graduated_tasks\", [])),\n", + " )\n", " finally:\n", - " wandb.finish()\n", " free_model(trainer); free_model(model); del tokenizer\n", " gc.collect(); torch.cuda.empty_cache()\n", "\n", @@ -1511,6 +1661,7 @@ "outputs": [], "source": [ "import random\n", + "import time\n", "from collections import defaultdict\n", "from collections.abc import Iterable\n", "\n", @@ -1520,29 +1671,29 @@ "\n", "\n", "class CurriculumTierSampler(torch.utils.data.Sampler[int]):\n", - " \"\"\"Reactive sampler: yields dataset indices from the curriculum\\'s\n", + " \"\"\"Reactive sampler: yields dataset indices from the curriculum's\n", " *current* tier, re-checked on every yield.\n", "\n", - " The usual approach — pre-materialising a fixed dataset from the\n", - " curriculum — freezes the training data to whatever tier the curriculum\n", + " The usual approach \u2014 pre-materialising a fixed dataset from the\n", + " curriculum \u2014 freezes the training data to whatever tier the curriculum\n", " started in, because `curriculum.next_task()` never calls\n", - " `record_result` and so `_maybe_promote` can\\'t fire during the draw.\n", + " `record_result` and so `_maybe_promote` can't fire during the draw.\n", " Here the dataset is a *superset* of all tiers (see\n", " make_full_curriculum_dataset) and this sampler picks indices only\n", - " from rows whose `difficulty` matches the curriculum\\'s current tier.\n", + " from rows whose `difficulty` matches the curriculum's current tier.\n", " When `env_reward` promotes the curriculum mid-training, the very\n", - " next yield flips onto the new tier\\'s index pool.\n", + " next yield flips onto the new tier's index pool.\n", "\n", " Implementation notes:\n", - " * `__len__` is required for HF Trainer\\'s max_steps math. We return\n", + " * `__len__` is required for HF Trainer's max_steps math. We return\n", " `num_samples`, which the caller sizes as\n", " `max_steps * pdtbs * grad_accum * buffer`.\n", - " * Index pools are built once at construction from the dataset\\'s\n", + " * Index pools are built once at construction from the dataset's\n", " `difficulty` column; only the active pool + cursor are mutated\n", " during iteration, which keeps per-step overhead O(1).\n", - " * If the curriculum\\'s current tier has no tasks in the dataset\n", + " * If the curriculum's current tier has no tasks in the dataset\n", " (mis-configured YAML), we fall back to the union of all tiers so\n", - " training doesn\\'t deadlock.\n", + " training doesn't deadlock.\n", " \"\"\"\n", "\n", " def __init__(self, dataset, curriculum, num_samples: int) -> None:\n", @@ -1588,10 +1739,7 @@ "\n", "\n", "class CurriculumPromotionCallback(TrainerCallback):\n", - " \"\"\"Observability: log when the curriculum promotes, and mirror the\n", - " current tier into wandb on every logging step so the dashboard\n", - " shows tier progression without scraping stdout.\n", - " \"\"\"\n", + " \"\"\"Observability: log when the curriculum promotes.\"\"\"\n", "\n", " def __init__(self, curriculum) -> None:\n", " self.curriculum = curriculum\n", @@ -1607,20 +1755,6 @@ " )\n", " self._last_tier = tier\n", "\n", - " def on_log(self, args, state, control, logs=None, **kw):\n", - " try:\n", - " stats = self.curriculum.get_stats()\n", - " wandb.log({\n", - " \"curriculum/tier\": stats[\"tier\"],\n", - " \"curriculum/tier_episodes\": stats[\"tier_episodes\"],\n", - " \"curriculum/tier_rate\": stats[\"tier_success_rate\"],\n", - " \"curriculum/graduated\": len(stats.get(\"graduated_tasks\", [])),\n", - " })\n", - " except Exception:\n", - " # wandb may not be initialised in every context; failure here\n", - " # must never block training.\n", - " pass\n", - "\n", "\n", "class EnvHealthCallback(TrainerCallback):\n", " \"\"\"Log env health counters + drain them every N steps.\n", @@ -1641,20 +1775,70 @@ " if state.global_step == 0 or state.global_step % self.probe_every != 0:\n", " return\n", " counters = self.env.drain_counters()\n", - " try:\n", - " wandb.log({f\"env/{k}\": v for k, v in counters.items()})\n", - " except Exception:\n", - " pass\n", + " log.info(\"[env counters] step=%d %s\", state.global_step, counters)\n", " if counters[\"timeout\"] + counters[\"conn_err\"] >= self.fail_threshold:\n", - " log.error(\"[EnvHealthCallback] %s at step %d — stopping training.\",\n", + " log.error(\"[EnvHealthCallback] %s at step %d \u2014 stopping training.\",\n", " counters, state.global_step)\n", " control.should_training_stop = True\n", "\n", "\n", + "class ProgressLogCallback(TrainerCallback):\n", + " \"\"\"Mirror TRL's scalar logs (loss, reward, kl, ...) to the Python logger.\n", + "\n", + " TRL writes its scalars via `Trainer.log`, which goes to `state.log_history`\n", + " and to whichever integrations are listed in `report_to`. With\n", + " `report_to=\"none\"` there is no on-screen feedback during training \u2014 just\n", + " a tqdm bar that Jupyter sometimes hides. This callback hooks `on_log` and\n", + " forwards the scalar dict through `log.info` every step, plus a heartbeat\n", + " line on `on_step_end` every `heartbeat_every` steps so you always see\n", + " *something* even when TRL hasn't emitted a scalar yet (e.g. the opening\n", + " generation phase before the first optimizer step).\n", + " \"\"\"\n", + "\n", + " def __init__(self, heartbeat_every: int = 1, run_label: str = \"\") -> None:\n", + " self.heartbeat_every = max(1, int(heartbeat_every))\n", + " self.run_label = run_label\n", + " self._t_start: float | None = None\n", + " self._t_last: float | None = None\n", + "\n", + " def on_train_begin(self, args, state, control, **kw):\n", + " self._t_start = time.time()\n", + " self._t_last = self._t_start\n", + " log.info(\"%s train_begin | max_steps=%s\", self._tag(), args.max_steps)\n", + "\n", + " def on_step_end(self, args, state, control, **kw):\n", + " if state.global_step % self.heartbeat_every != 0:\n", + " return\n", + " now = time.time()\n", + " dt = now - (self._t_last or now)\n", + " self._t_last = now\n", + " log.info(\"%s step %d/%s (+%.1fs)\",\n", + " self._tag(), state.global_step, args.max_steps, dt)\n", + "\n", + " def on_log(self, args, state, control, logs=None, **kw):\n", + " if not logs:\n", + " return\n", + " # Drop noisy / non-scalar fields and round for legibility.\n", + " scalars = {k: (round(v, 4) if isinstance(v, float) else v)\n", + " for k, v in logs.items()\n", + " if isinstance(v, (int, float))}\n", + " if scalars:\n", + " log.info(\"%s log step=%d %s\",\n", + " self._tag(), state.global_step, scalars)\n", + "\n", + " def on_train_end(self, args, state, control, **kw):\n", + " elapsed = time.time() - (self._t_start or time.time())\n", + " log.info(\"%s train_end | global_step=%d elapsed=%.1fs\",\n", + " self._tag(), state.global_step, elapsed)\n", + "\n", + " def _tag(self) -> str:\n", + " return f\"[{self.run_label}]\" if self.run_label else \"[train]\"\n", + "\n", + "\n", "def build_trainer(model, tokenizer, train_ds, eval_ds,\n", " reward_funcs: Iterable[Callable],\n", " cfg: TrainingConfig, *,\n", - " output_dir: str, wandb_run_name: str,\n", + " output_dir: str, run_name: str,\n", " use_fp16: bool, use_bf16: bool,\n", " max_steps: int | None = None,\n", " save_strategy: str = \"steps\",\n", @@ -1663,16 +1847,16 @@ " num_samples: int | None = None) -> GRPOTrainer:\n", " \"\"\"Assemble a GRPOTrainer from a typed TrainingConfig.\n", "\n", - " When `curriculum` is supplied, the trainer\\'s train sampler is\n", + " When `curriculum` is supplied, the trainer's train sampler is\n", " replaced with a CurriculumTierSampler that yields dataset indices\n", - " from the curriculum\\'s current tier — reactive to promotion. The\n", + " from the curriculum's current tier \u2014 reactive to promotion. The\n", " dataset passed in as `train_ds` must carry a `difficulty` column\n", " (use make_full_curriculum_dataset). `num_samples` sizes the\n", " sampler; callers typically set it to\n", " `max_steps * per_device_train_batch_size * gradient_accumulation_steps * 1.2`.\n", " \"\"\"\n", " args = GRPOConfig(\n", - " output_dir=output_dir, run_name=wandb_run_name,\n", + " output_dir=output_dir, run_name=run_name,\n", " num_generations=cfg.num_generations, beta=cfg.beta,\n", " temperature=cfg.temperature, top_p=cfg.top_p,\n", " max_prompt_length=cfg.max_prompt_length,\n", @@ -1685,7 +1869,7 @@ " # divisible by num_generations (one eval prompt produces G completions;\n", " # anything smaller can't form a group). Defaulting it to num_generations\n", " # is the smallest value that satisfies the check on a single-process\n", - " # setup — matches how GRPOTrainer batches eval internally.\n", + " # setup \u2014 matches how GRPOTrainer batches eval internally.\n", " per_device_eval_batch_size=cfg.num_generations,\n", " gradient_accumulation_steps=cfg.gradient_accumulation_steps,\n", " num_train_epochs=cfg.num_train_epochs,\n", @@ -1701,10 +1885,14 @@ " eval_strategy=eval_strategy, eval_steps=cfg.eval_steps,\n", " save_strategy=save_strategy, save_steps=cfg.save_steps,\n", " save_total_limit=cfg.save_total_limit,\n", - " logging_steps=1, report_to=\"wandb\", seed=cfg.seed,\n", + " logging_steps=1, report_to=\"none\", seed=cfg.seed,\n", " remove_unused_columns=False, # CRITICAL: preserves task_id for reward_fns\n", + " disable_tqdm=False,\n", " )\n", - " callbacks = [EnvHealthCallback(ENV_CLIENT)]\n", + " callbacks = [\n", + " EnvHealthCallback(ENV_CLIENT),\n", + " ProgressLogCallback(heartbeat_every=1, run_label=run_name),\n", + " ]\n", " if curriculum is not None:\n", " callbacks.append(CurriculumPromotionCallback(curriculum))\n", "\n", @@ -1722,12 +1910,12 @@ " if \"difficulty\" not in train_ds.column_names:\n", " raise ValueError(\n", " \"curriculum-driven training needs a `difficulty` column on \"\n", - " \"train_ds — use make_full_curriculum_dataset().\"\n", + " \"train_ds \u2014 use make_full_curriculum_dataset().\"\n", " )\n", " _sampler = CurriculumTierSampler(\n", " dataset=train_ds, curriculum=curriculum, num_samples=num_samples,\n", " )\n", - " # Monkey-patch the trainer\\'s sampler factory so the DataLoader,\n", + " # Monkey-patch the trainer's sampler factory so the DataLoader,\n", " # which is built lazily inside trainer.train(), pulls from our\n", " # tier-reactive sampler instead of the default RandomSampler.\n", " # Using MethodType keeps `self` binding correct on the bound call.\n", @@ -1751,15 +1939,127 @@ "id": "5a29cad6" }, "source": [ - "## 12 · Optuna hyperparameter search\n", + "## 12 \u00b7 Optuna hyperparameter search\n", "\n", - "Six short trials (30 GRPO steps each, 80-row training subset). Each trial returns the mean **env reward on the held-out val set** — the one metric we actually want to maximize.\n", + "Six short trials (30 GRPO steps each, 80-row training subset). Each trial returns the mean **env reward on the held-out val set** \u2014 the one metric we actually want to maximize.\n", "\n", "- **Resumable**: sqlite storage + `load_if_exists=True`. A dropped Colab session picks up where it left off.\n", - "- **Pruned**: `MedianPruner` — kill trials that are trending below the median after 10 steps.\n", + "- **Pruned**: `MedianPruner` \u2014 kill trials that are trending below the median after 10 steps.\n", "- **Search space** chosen to bracket the GRPO-on-3B defaults reported in the DeepSeek-Math paper." ] }, + { + "cell_type": "code", + "execution_count": null, + "id": "0b184374", + "metadata": { + "id": "0b184374", + "outputId": "18ef4275-37b0-47d3-b9b5-58a017ad908b" + }, + "outputs": [], + "source": [ + "# Reclaim VRAM before starting trials. If the user ran the final-run cell\n", + "# first (e.g. because optuna_best.json didn't exist on a prior session),\n", + "# `final_model` / `final_trainer` / `_probe_model` may still be resident\n", + "# on the GPU. Each trial loads a fresh 4-bit Qwen (~6 GB) via\n", + "# load_policy, and on a 14.5 GB T4 the second model won't fit alongside\n", + "# leftovers, so BitsAndBytes falls back to CPU offload and errors out\n", + "# (\"Some modules are dispatched on the CPU or the disk\").\n", + "for _name in (\"final_trainer\", \"final_model\", \"final_tok\", \"_probe_model\", \"_probe_tok\", \"_baseline_model\", \"_baseline_tok\"):\n", + " if _name in globals():\n", + " try:\n", + " _obj = globals().pop(_name)\n", + " del _obj\n", + " except Exception:\n", + " pass\n", + "gc.collect()\n", + "try:\n", + " torch.cuda.empty_cache()\n", + "except Exception:\n", + " pass\n", + "\n", + "STUDY_DB = OUT_DIR / \"optuna.db\"\n", + "STUDY_NAME = \"aws-rl-grpo-search\"\n", + "\n", + "study = optuna.create_study(\n", + " direction=\"maximize\",\n", + " sampler=optuna.samplers.TPESampler(seed=TRAIN.seed),\n", + " pruner=optuna.pruners.MedianPruner(n_startup_trials=2, n_warmup_steps=10),\n", + " study_name=STUDY_NAME,\n", + " storage=f\"sqlite:///{STUDY_DB}\",\n", + " load_if_exists=True,\n", + ")\n", + "\n", + "completed = sum(1 for t in study.trials if t.state.name == \"COMPLETE\")\n", + "remaining = max(0, PIPE.n_trials - completed)\n", + "print(f\"Optuna study '{STUDY_NAME}': {completed} completed, {remaining} remaining.\")\n", + "\n", + "if remaining > 0:\n", + " study.optimize(trial_objective, n_trials=remaining)\n", + "\n", + "best_cfg = replace(TRAIN, **{\n", + " k: v for k, v in study.best_params.items() if k in TrainingConfig.__dataclass_fields__\n", + "})\n", + "(OUT_DIR / \"optuna_best.json\").write_text(json.dumps({\n", + " \"best_value\": study.best_value,\n", + " \"best_params\": study.best_params,\n", + " \"resolved_config\": asdict(best_cfg),\n", + "}, indent=2))\n", + "\n", + "print(f\"Best trial env_reward_mean = {study.best_value:.4f}\")\n", + "print(f\"Best params: {study.best_params}\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "278540e2", + "metadata": { + "id": "278540e2", + "outputId": "b8c673db-e105-41e8-c228-2839ebc196ac" + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\n", + "from optuna.visualization.matplotlib import (\n", + " plot_optimization_history,\n", + " plot_parallel_coordinate,\n", + " plot_param_importances,\n", + ")\n", + "\n", + "GRAPHS_DIR = OUT_DIR / \"graphs\"\n", + "GRAPHS_DIR.mkdir(parents=True, exist_ok=True)\n", + "\n", + "for name, fn in [\n", + " (\"history\", plot_optimization_history),\n", + " (\"parallel\", plot_parallel_coordinate),\n", + " (\"importances\", plot_param_importances),\n", + "]:\n", + " try:\n", + " ax = fn(study)\n", + " fig = ax.figure\n", + " out_png = GRAPHS_DIR / f\"00_optuna_{name}.png\"\n", + " fig.savefig(out_png, dpi=150, bbox_inches=\"tight\")\n", + " plt.close(fig)\n", + " log.info(\"Saved %s\", out_png)\n", + " except Exception as e:\n", + " log.warning(\"Optuna %s plot skipped: %s\", name, e)\n" + ] + }, + { + "cell_type": "markdown", + "id": "c8528094", + "metadata": { + "id": "c8528094" + }, + "source": [ + "## 14 \u00b7 Final GRPO run \u2014 best hparams, full data, checkpointed\n", + "\n", + "Uses the Optuna winner on the full 1-epoch training set with periodic checkpoints (`save_steps=25`, `save_total_limit=3`). `CheckpointManager.latest()` auto-detects a prior checkpoint so re-running this cell after a disconnect resumes safely.\n", + "\n", + "Wandb run `final-grpo` gets a stable run id so resumed training stitches into the same panel instead of creating a fresh chart." + ] + }, { "cell_type": "code", "execution_count": null, @@ -1808,23 +2108,12 @@ " k: v for k, v in _resolved.items()\n", " if k in TrainingConfig.__dataclass_fields__\n", " })\n", - " print(f\"Recovered best_cfg from {_best_path}\")\n", + " log.info(\"Recovered best_cfg from %s\", _best_path)\n", " else:\n", " best_cfg = TRAIN\n", - " print(\"No Optuna results found; using TRAIN defaults for best_cfg\")\n", + " log.info(\"No Optuna results found; using TRAIN defaults for best_cfg\")\n", "\n", - "# Stable wandb run id across resumes — same dashboard panel\n", - "run_id_file = OUT_DIR / \"wandb_final_run_id.txt\"\n", - "if run_id_file.exists():\n", - " os.environ[\"WANDB_RUN_ID\"] = run_id_file.read_text().strip()\n", - " os.environ[\"WANDB_RESUME\"] = \"allow\"\n", - "else:\n", - " import uuid\n", - " new_id = uuid.uuid4().hex[:8]\n", - " run_id_file.write_text(new_id)\n", - " os.environ[\"WANDB_RUN_ID\"] = new_id\n", - "\n", - "# Master curriculum for the final run — single instance that progresses\n", + "# Master curriculum for the final run \u2014 single instance that progresses\n", "# through tiers as the agent demonstrates mastery. Lives for the whole run.\n", "FINAL_CURRICULUM = Curriculum(tasks_dir=_tasks_dir)\n", "# Superset dataset (all tiers). The CurriculumTierSampler (wired in\n", @@ -1838,18 +2127,11 @@ " * best_cfg.gradient_accumulation_steps\n", " * 1.2\n", ")\n", + "final_model, final_tok = load_policy(MODEL, trainable=True)\n", + "\n", "final_env_r, final_fmt_r, final_len_r = build_reward_funcs(\n", " ENV_CLIENT, TASK_MAP, FINAL_CURRICULUM,\n", - ")\n", - "\n", - "final_model, final_tok = load_policy(MODEL, trainable=True)\n", - "final_run = wandb.init(\n", - " project=PIPE.wandb_project, entity=PIPE.wandb_entity,\n", - " name=\"final-grpo\",\n", - " id=os.environ[\"WANDB_RUN_ID\"],\n", - " resume=\"allow\",\n", - " config={**asdict(best_cfg), \"phase\": \"final\", \"resume_from\": resume_from,\n", - " \"curriculum\": True, \"max_steps\": PIPE.final_max_steps},\n", + " model=final_model, tokenizer=final_tok,\n", ")\n", "\n", "final_trainer = build_trainer(\n", @@ -1859,11 +2141,11 @@ " reward_funcs=(final_env_r, final_fmt_r, final_len_r),\n", " cfg=best_cfg,\n", " output_dir=str(FINAL_RUN_DIR),\n", - " wandb_run_name=final_run.name,\n", + " run_name=\"final-grpo\",\n", " use_fp16=RT.use_fp16, use_bf16=RT.use_bf16,\n", " max_steps=PIPE.final_max_steps,\n", " save_strategy=\"steps\",\n", - " # Skip TRL's mid-training eval — its GRPO prediction_step reshapes\n", + " # Skip TRL's mid-training eval \u2014 its GRPO prediction_step reshapes\n", " # rewards as (-1, num_generations) which blows up when eval generates\n", " # a different completion count per prompt than training. We do full\n", " # env-reward eval outside TRL via evaluate_single_step anyway.\n", @@ -1873,122 +2155,18 @@ ")\n", "\n", "if resume_from:\n", - " print(f\"Resuming GRPO from {resume_from}\")\n", + " log.info(\"Resuming GRPO from %s\", resume_from)\n", "final_trainer.train(resume_from_checkpoint=resume_from)\n", "\n", - "# Log final curriculum stats so judges can see tier progression / mastery counts\n", + "# Log final curriculum stats so we can see tier progression / mastery counts\n", "final_stats = FINAL_CURRICULUM.get_stats()\n", - "print(f\"Final curriculum stats: {final_stats}\")\n", - "wandb.log({f\"curriculum/final_{k}\": v for k, v in final_stats.items()\n", - " if isinstance(v, (int, float, str))})\n", + "log.info(\"Final curriculum stats: %s\", final_stats)\n", "\n", "# Persist the final LoRA adapter locally before anything else touches VRAM\n", "adapter_local = OUT_DIR / \"grpo_adapter\"\n", "final_trainer.model.save_pretrained(str(adapter_local))\n", "final_tok.save_pretrained(str(adapter_local))\n", - "print(f\"Saved GRPO adapter to {adapter_local}\")\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "0b184374", - "metadata": { - "id": "0b184374", - "outputId": "18ef4275-37b0-47d3-b9b5-58a017ad908b" - }, - "outputs": [], - "source": [ - "# Reclaim VRAM before starting trials. If the user ran the final-run cell\n", - "# first (e.g. because optuna_best.json didn't exist on a prior session),\n", - "# `final_model` / `final_trainer` / `_probe_model` may still be resident\n", - "# on the GPU. Each trial loads a fresh 4-bit Qwen (~6 GB) via\n", - "# load_policy, and on a 14.5 GB T4 the second model won't fit alongside\n", - "# leftovers, so BitsAndBytes falls back to CPU offload and errors out\n", - "# (\"Some modules are dispatched on the CPU or the disk\").\n", - "for _name in (\"final_trainer\", \"final_model\", \"final_tok\", \"_probe_model\", \"_probe_tok\", \"_baseline_model\", \"_baseline_tok\"):\n", - " if _name in globals():\n", - " try:\n", - " _obj = globals().pop(_name)\n", - " del _obj\n", - " except Exception:\n", - " pass\n", - "gc.collect()\n", - "try:\n", - " torch.cuda.empty_cache()\n", - "except Exception:\n", - " pass\n", - "\n", - "STUDY_DB = OUT_DIR / \"optuna.db\"\n", - "STUDY_NAME = \"aws-rl-grpo-search\"\n", - "\n", - "study = optuna.create_study(\n", - " direction=\"maximize\",\n", - " sampler=optuna.samplers.TPESampler(seed=TRAIN.seed),\n", - " pruner=optuna.pruners.MedianPruner(n_startup_trials=2, n_warmup_steps=10),\n", - " study_name=STUDY_NAME,\n", - " storage=f\"sqlite:///{STUDY_DB}\",\n", - " load_if_exists=True,\n", - ")\n", - "\n", - "completed = sum(1 for t in study.trials if t.state.name == \"COMPLETE\")\n", - "remaining = max(0, PIPE.n_trials - completed)\n", - "print(f\"Optuna study '{STUDY_NAME}': {completed} completed, {remaining} remaining.\")\n", - "\n", - "if remaining > 0:\n", - " study.optimize(trial_objective, n_trials=remaining)\n", - "\n", - "best_cfg = replace(TRAIN, **{\n", - " k: v for k, v in study.best_params.items() if k in TrainingConfig.__dataclass_fields__\n", - "})\n", - "(OUT_DIR / \"optuna_best.json\").write_text(json.dumps({\n", - " \"best_value\": study.best_value,\n", - " \"best_params\": study.best_params,\n", - " \"resolved_config\": asdict(best_cfg),\n", - "}, indent=2))\n", - "\n", - "print(f\"Best trial env_reward_mean = {study.best_value:.4f}\")\n", - "print(f\"Best params: {study.best_params}\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "278540e2", - "metadata": { - "id": "278540e2", - "outputId": "b8c673db-e105-41e8-c228-2839ebc196ac" - }, - "outputs": [], - "source": [ - "import plotly.io as pio\n", - "\n", - "try:\n", - " fig_history = optuna.visualization.plot_optimization_history(study)\n", - " fig_parallel = optuna.visualization.plot_parallel_coordinate(study)\n", - " fig_import = optuna.visualization.plot_param_importances(study)\n", - " for name, fig in ((\"history\", fig_history), (\"parallel\", fig_parallel), (\"importances\", fig_import)):\n", - " out_png = OUT_DIR / f\"optuna_{name}.png\"\n", - " pio.write_image(fig, str(out_png), width=900, height=500)\n", - " print(f\"Saved {out_png}\")\n", - " # Show inline as well\n", - " fig_history.show(); fig_parallel.show(); fig_import.show()\n", - "except Exception as e:\n", - " print(f\"Optuna plots skipped: {e}\")" - ] - }, - { - "cell_type": "markdown", - "id": "c8528094", - "metadata": { - "id": "c8528094" - }, - "source": [ - "## 14 · Final GRPO run — best hparams, full data, checkpointed\n", - "\n", - "Uses the Optuna winner on the full 1-epoch training set with periodic checkpoints (`save_steps=25`, `save_total_limit=3`). `CheckpointManager.latest()` auto-detects a prior checkpoint so re-running this cell after a disconnect resumes safely.\n", - "\n", - "Wandb run `final-grpo` gets a stable run id so resumed training stitches into the same panel instead of creating a fresh chart." + "log.info(\"Saved GRPO adapter to %s\", adapter_local)\n" ] }, { @@ -1998,7 +2176,7 @@ "id": "09e8f092" }, "source": [ - "## 15 · Multi-step evaluation harness\n", + "## 15 \u00b7 Multi-step evaluation harness\n", "\n", "Training was single-step for TRL compatibility; *evaluation* runs full episodes so we can measure:\n", "\n", @@ -2076,8 +2254,8 @@ "async def run_episode(env: AwsRlEnv, model, tokenizer,\n", " task: Task, drift_ids: set[int],\n", " max_steps: int = 15,\n", - " # Bumped 96 → 512 so per-step generation has room\n", - " # for a block plus the command.\n", + " # Bumped 96 \u2192 512 so per-step generation has room\n", + " # for a \u2026 block plus the command.\n", " max_new_tokens: int = 512) -> EpisodeResult:\n", " \"\"\"Roll one episode against one env session. Sampling temperature is low\n", " to reflect deployment behaviour rather than training-time exploration.\"\"\"\n", @@ -2117,7 +2295,7 @@ " if res.done:\n", " break\n", "\n", - " # One final /state poll for chaos flag — TrackerState doesn't expose\n", + " # One final /state poll for chaos flag \u2014 TrackerState doesn't expose\n", " # rollback counts, so we skip that metric rather than report zeros.\n", " try:\n", " state = await env.state()\n", @@ -2173,7 +2351,7 @@ " \"\"\"Aggregate per-tier and overall stats from a list of EpisodeResults.\n", "\n", " Drift detection uses the per-result `is_drift` flag (set from DRIFT_TASK_IDS)\n", - " rather than a tier string — drift tasks live inside the EXPERT tier files.\n", + " rather than a tier string \u2014 drift tasks live inside the EXPERT tier files.\n", " \"\"\"\n", " by_tier: dict[str, list[EpisodeResult]] = defaultdict(list)\n", " for r in results:\n", @@ -2246,9 +2424,9 @@ "id": "e40d1ce7" }, "source": [ - "## 16 · Before / after multi-step evaluation\n", + "## 16 \u00b7 Before / after multi-step evaluation\n", "\n", - "Runs the rich multi-step evaluator once with the **SFT-only** model (baseline) and once with the **final GRPO** model, then prints a delta table and logs every metric to wandb under the `eval/*` and `eval/delta_*` namespaces for judge-facing charts." + "Runs the rich multi-step evaluator once with the **SFT-only** model (baseline) and once with the **final GRPO** model, then prints a delta table. Per-tier and overall comparisons are plotted by the matplotlib cell below.\n" ] }, { @@ -2286,11 +2464,23 @@ "\n", "\n", "EVAL_TASK_IDS = select_eval_task_ids(RESERVE_DS, DRIFT_TASK_IDS, cap=PIPE.eval_reserve_cap)\n", - "print(f\"Multi-step eval on {len(EVAL_TASK_IDS)} tasks \"\n", - " f\"({sum(1 for t in EVAL_TASK_IDS if t in DRIFT_TASK_IDS)} drift).\")\n", + "log.info(\"Multi-step eval on %d tasks (%d drift).\",\n", + " len(EVAL_TASK_IDS),\n", + " sum(1 for t in EVAL_TASK_IDS if t in DRIFT_TASK_IDS))\n", + "\n", + "# Release ENV_CLIENT's 8 WebSocket sessions so the server's MiniStack\n", + "# slots are free for GrpoPool. Without this, every eval episode dies\n", + "# instantly with ConnectionClosedOK / CAPACITY_REACHED because all 8\n", + "# slots are still held by the training reward client.\n", + "try:\n", + " ENV_CLIENT.close()\n", + " log.info(\"Closed ENV_CLIENT; waiting 3s for server to release 8 MiniStack slots.\")\n", + " await asyncio.sleep(3)\n", + "except Exception as e:\n", + " log.warning(\"ENV_CLIENT.close() raised %s: %s\", type(e).__name__, e)\n", "\n", "# --- SFT baseline ---\n", - "print(\"Evaluating SFT baseline (multi-step)...\")\n", + "log.info(\"Evaluating SFT baseline (multi-step)...\")\n", "sft_model, sft_tok = load_policy(MODEL, trainable=False)\n", "sft_metrics = await evaluate_multi_step(\n", " ENV_BASE_URL, EVAL_TASK_IDS, TASK_MAP, DRIFT_TASK_IDS,\n", @@ -2301,7 +2491,7 @@ "(OUT_DIR / \"baseline_multi_step.json\").write_text(json.dumps(sft_metrics.as_dict(), indent=2))\n", "\n", "# --- GRPO after ---\n", - "print(\"Evaluating GRPO-trained model (multi-step)...\")\n", + "log.info(\"Evaluating GRPO-trained model (multi-step)...\")\n", "from unsloth import FastLanguageModel\n", "# If the Optuna cell (or any prior VRAM reclaim) purged final_trainer/final_tok\n", "# from globals, reload the GRPO adapter that the final-run cell persisted to\n", @@ -2310,7 +2500,7 @@ "if \"final_trainer\" not in globals() or \"final_tok\" not in globals():\n", " from peft import PeftModel\n", " _grpo_dir = OUT_DIR / \"grpo_adapter\"\n", - " print(f\"final_trainer not in globals; reloading GRPO adapter from {_grpo_dir}...\")\n", + " log.info(\"final_trainer not in globals; reloading GRPO adapter from %s...\", _grpo_dir)\n", " _base, final_tok = FastLanguageModel.from_pretrained(\n", " model_name=MODEL.base_model,\n", " max_seq_length=MODEL.max_seq_length,\n", @@ -2328,26 +2518,11 @@ ")\n", "(OUT_DIR / \"grpo_multi_step.json\").write_text(json.dumps(grpo_metrics.as_dict(), indent=2))\n", "\n", - "# --- Deltas + wandb ---\n", + "# --- Deltas (logged via Python logging; matplotlib comparison happens in the plot cell) ---\n", "deltas = _delta_metrics(sft_metrics, grpo_metrics)\n", - "# Make sure there's an active wandb run: the final-run cell and Optuna trials\n", - "# both call wandb.finish(), so by the time multi-step eval runs there's no\n", - "# active run — a bare wandb.log() errors with \"You must call wandb.init()\".\n", - "# Resume the final-grpo run id if we have it, otherwise start a fresh \"eval\" run.\n", - "if wandb.run is None:\n", - " _run_id_file = OUT_DIR / \"wandb_final_run_id.txt\"\n", - " _eval_run_id = (_run_id_file.read_text().strip()\n", - " if _run_id_file.exists() else None)\n", - " wandb.init(\n", - " project=PIPE.wandb_project, entity=PIPE.wandb_entity,\n", - " name=\"multi-step-eval\",\n", - " id=_eval_run_id, resume=\"allow\" if _eval_run_id else None,\n", - " )\n", - "wandb.log({\n", - " **_flatten_metrics(sft_metrics, \"eval/sft\"),\n", - " **_flatten_metrics(grpo_metrics, \"eval/grpo\"),\n", - " **deltas,\n", - "})\n", + "log.info(\"SFT vs GRPO deltas: %s\",\n", + " {k: round(v, 4) for k, v in deltas.items()\n", + " if isinstance(v, (int, float)) and \"/\" not in k})\n", "\n", "# Judge-facing table\n", "def _render_row(name, b, a):\n", @@ -2366,7 +2541,7 @@ "for tier in sorted(set(sft_metrics.success_by_tier) | set(grpo_metrics.success_by_tier)):\n", " b = sft_metrics.success_by_tier.get(tier, 0.0)\n", " a = grpo_metrics.success_by_tier.get(tier, 0.0)\n", - " print(_render_row(f\"success[{tier}]\", b, a))" + " print(_render_row(f\"success[{tier}]\", b, a))\n" ] }, { @@ -2376,7 +2551,7 @@ "id": "00a1c8e5" }, "source": [ - "## 17 · Qualitative rollouts — one task per tier\n", + "## 17 \u00b7 Qualitative rollouts \u2014 one task per tier\n", "\n", "A small set of showable transcripts (task, generated command, env output, reward). Judges love seeing actual agent behaviour, not just numbers." ] @@ -2448,20 +2623,20 @@ "id": "graphs-md", "metadata": {}, "source": [ - "## 17.5 · Plot training curves and SFT vs GRPO comparison\n", + "## 17.5 \u00b7 Plot training curves and SFT vs GRPO comparison\n", "\n", "Emits matplotlib PNGs into `OUT_DIR / \"graphs/\"` (also zipped as `graphs.zip` for\n", "easy download):\n", "\n", - "1. `01_optuna_history.png` – per-trial objective + best-so-far.\n", - "2. `02_optuna_hparams.png` – hparam vs. objective scatter (one subplot per knob).\n", - "3. `03_optuna_trial_curves.png` – training loss / reward / reward_std / KL for\n", + "1. `01_optuna_history.png` \u2013 per-trial objective + best-so-far.\n", + "2. `02_optuna_hparams.png` \u2013 hparam vs. objective scatter (one subplot per knob).\n", + "3. `03_optuna_trial_curves.png` \u2013 training loss / reward / reward_std / KL for\n", " every trial, with the winning trial highlighted.\n", - "4. `04_final_run_curves.png` – same four metrics for the final GRPO run on the\n", + "4. `04_final_run_curves.png` \u2013 same four metrics for the final GRPO run on the\n", " best Optuna config.\n", - "5. `05_sft_vs_grpo_scalar.png` – scalar comparison (success, reward, recovery,\n", + "5. `05_sft_vs_grpo_scalar.png` \u2013 scalar comparison (success, reward, recovery,\n", " drift repair, hints/solved, steps-to-solve, destructive-fail).\n", - "6. `06_success_by_tier.png` / `07_reward_by_tier.png` – per-difficulty-tier\n", + "6. `06_success_by_tier.png` / `07_reward_by_tier.png` \u2013 per-difficulty-tier\n", " bars, SFT vs SFT+GRPO.\n", "\n", "Each section is guarded so a missing artifact (e.g. Optuna was skipped, or\n", @@ -2567,9 +2742,8 @@ " _trials = [t for t in study.trials if t.value is not None]\n", " if not _trials:\n", " raise RuntimeError(\"no completed Optuna trials\")\n", - " _params = [\"learning_rate\", \"beta\", \"num_generations\",\n", - " \"temperature\", \"lora_r\", \"lora_alpha_mul\"]\n", - " fig, axes = plt.subplots(2, 3, figsize=(13, 7))\n", + " _params = [\"learning_rate\", \"beta\", \"temperature\"]\n", + " fig, axes = plt.subplots(1, 3, figsize=(13, 4))\n", " for ax, p in zip(axes.flat, _params):\n", " xs = [t.params[p] for t in _trials if p in t.params]\n", " ys = [t.value for t in _trials if p in t.params]\n", @@ -2622,7 +2796,7 @@ " ax.set_title(title); ax.set_xlabel(\"step\")\n", " ax.grid(alpha=0.3)\n", " if not _plotted_any:\n", - " raise RuntimeError(\"no per-trial log_history on disk — re-run \"\n", + " raise RuntimeError(\"no per-trial log_history on disk \u2014 re-run \"\n", " \"Optuna after the trial_objective patch\")\n", " # One legend for the whole figure\n", " handles, labels = axes.flat[0].get_legend_handles_labels()\n", @@ -2658,7 +2832,7 @@ " ax.grid(alpha=0.3)\n", " if key == \"learning_rate\":\n", " ax.set_yscale(\"log\")\n", - " fig.suptitle(\"Final GRPO run — best Optuna config\")\n", + " fig.suptitle(\"Final GRPO run \u2014 best Optuna config\")\n", " fig.tight_layout()\n", " _save(fig, \"04_final_run_curves.png\")\n", "except Exception as e:\n", @@ -2731,7 +2905,7 @@ " print(f\"\\nGraphs: {GRAPHS_DIR} ({len(_saved)} PNGs)\")\n", " print(f\"Zipped: {_zip_path}\")\n", "else:\n", - " print(\"\\nNo graphs were produced — every section was skipped.\")\n" + " print(\"\\nNo graphs were produced \u2014 every section was skipped.\")\n" ] }, { @@ -2741,9 +2915,9 @@ "id": "3751583b" }, "source": [ - "## 18 · Publish the GRPO adapter to a new HF Hub repo\n", + "## 18 \u00b7 Publish the GRPO adapter to a new HF Hub repo\n", "\n", - "Pushes **only** to `Sizzing/aws-rl-grpo-qwen25coder3b-adapter`. The existing SFT adapter repo `Sizzing/aws-rl-sft-qwen25coder3b-adapter` is never touched — both coexist on Hub so reviewers can load either and compare side by side.\n", + "Pushes **only** to `Sizzing/aws-rl-grpo-qwen25coder3b-adapter`. The existing SFT adapter repo `Sizzing/aws-rl-sft-qwen25coder3b-adapter` is never touched \u2014 both coexist on Hub so reviewers can load either and compare side by side.\n", "\n", "The model card notes the lineage (`base_model = SFT adapter`) so anyone opening the repo on Hub sees immediately that this is a second-stage RL fine-tune." ] @@ -2798,7 +2972,6 @@ "| beta (KL coef) | {cfg.beta:.3f} |\n", "| num_generations (G) | {cfg.num_generations} |\n", "| temperature | {cfg.temperature:.2f} |\n", - "| lora_r / alpha_mul | {cfg.lora_r} / {cfg.lora_alpha_mul} |\n", "| max_completion_length | {cfg.max_completion_length} |\n", "| per-device batch | {cfg.per_device_train_batch_size} x {cfg.gradient_accumulation_steps} accum |\n", "\n", @@ -2838,7 +3011,7 @@ " commit_message=commit_msg,\n", ")\n", "print(f\"Pushed to https://huggingface.co/{MODEL.grpo_adapter}\")\n", - "print(f\"SFT adapter at {MODEL.sft_adapter} untouched — both models available on Hub.\")" + "print(f\"SFT adapter at {MODEL.sft_adapter} untouched \u2014 both models available on Hub.\")" ] }, { @@ -2848,9 +3021,9 @@ "id": "62c7435b" }, "source": [ - "## 19 · Clean shutdown + artifact bundle\n", + "## 19 \u00b7 Clean shutdown + artifact bundle\n", "\n", - "Closes wandb, releases the GPU, tars `OUT_DIR` into a single downloadable archive (Colab `files.download`). Nothing else needs to be killed — the env server is hosted externally." + "Releases the GPU, tars `OUT_DIR` into a single downloadable archive (Colab `files.download`). Nothing else needs to be killed \u2014 the env server is hosted externally.\n" ] }, { @@ -2872,8 +3045,6 @@ " keep = (\"grpo_adapter\", \"optuna.db\", \"optuna_best.json\",\n", " \"baseline_single_step.json\", \"baseline_multi_step.json\",\n", " \"grpo_multi_step.json\", \"qualitative_rollouts.json\",\n", - " \"wandb_final_run_id.txt\", \"optuna_history.png\",\n", - " \"optuna_parallel.png\", \"optuna_importances.png\",\n", " \"graphs\", \"graphs.zip\")\n", " with tarfile.open(archive, \"w:gz\") as tar:\n", " for name in keep:\n", @@ -2883,26 +3054,23 @@ " return archive\n", "\n", "\n", - "# Release GPU + wandb first\n", + "# Release GPU\n", "free_model(final_trainer)\n", "del final_trainer, final_model, final_tok\n", "gc.collect(); torch.cuda.empty_cache()\n", "\n", - "try:\n", - " wandb.finish()\n", - "except Exception as e:\n", - " print(f\"wandb.finish warning: {e}\")\n", - "\n", "archive = bundle_artifacts(OUT_DIR)\n", - "print(f\"\\nBundle: {archive}\")\n", - "print(f\"\\nHF Hub:\\n SFT: https://huggingface.co/{MODEL.sft_adapter}\\n GRPO: https://huggingface.co/{MODEL.grpo_adapter}\")\n", + "log.info(\"Bundle: %s\", archive)\n", + "log.info(\"HF Hub: SFT=https://huggingface.co/%s GRPO=https://huggingface.co/%s\",\n", + " MODEL.sft_adapter, MODEL.grpo_adapter)\n", "\n", "if IS_COLAB:\n", " try:\n", " from google.colab import files\n", " files.download(str(archive))\n", " except Exception as e:\n", - " print(f\"Colab auto-download skipped: {e}\\nDownload manually from {archive}\")" + " log.warning(\"Colab auto-download skipped: %s. Download manually from %s\",\n", + " e, archive)\n" ] }, { @@ -3165,9 +3333,9 @@ "description": "", "description_tooltip": null, "layout": "IPY_MODEL_1a29e3d931eb43139041302352cc7bfe", - "placeholder": "​", + "placeholder": "\u200b", "style": "IPY_MODEL_21a5277da9644a2483bccd7a1959180a", - "value": " 14.8M/14.8M [00:03<00:00, 73.6MB/s]" + "value": "\u200714.8M/14.8M\u2007[00:03<00:00,\u200773.6MB/s]" } }, "1a9062de6a42492daa8b404ca234c655": { @@ -3306,9 +3474,9 @@ "description": "", "description_tooltip": null, "layout": "IPY_MODEL_d2874873680144e6b5dfa1159372d275", - "placeholder": "​", + "placeholder": "\u200b", "style": "IPY_MODEL_cbc47539da1d45639d549742f4d09591", - "value": "adapter_config.json: " + "value": "adapter_config.json:\u2007" } }, "1e61c27158d840b0bb9aa8caa31c4434": { @@ -3379,9 +3547,9 @@ "description": "", "description_tooltip": null, "layout": "IPY_MODEL_7bea951bbb81490ab1e6592e6f0b4191", - "placeholder": "​", + "placeholder": "\u200b", "style": "IPY_MODEL_825eb9df100343c988040e5be1f71997", - "value": "model.safetensors: 100%" + "value": "model.safetensors:\u2007100%" } }, "21a5277da9644a2483bccd7a1959180a": { @@ -3917,9 +4085,9 @@ "description": "", "description_tooltip": null, "layout": "IPY_MODEL_5bacf4f78a684ad091852895280a8f5e", - "placeholder": "​", + "placeholder": "\u200b", "style": "IPY_MODEL_afb92811b4ee45359bb4c1acae795dab", - "value": "generation_config.json: 100%" + "value": "generation_config.json:\u2007100%" } }, "428597e1731246ddb89cd07960fd3547": { @@ -4068,9 +4236,9 @@ "description": "", "description_tooltip": null, "layout": "IPY_MODEL_52bbe88f204745f99e262e83323da551", - "placeholder": "​", + "placeholder": "\u200b", "style": "IPY_MODEL_b4db6015946742719033246978168831", - "value": " 7.03M/? [00:01<00:00, 8.98MB/s]" + "value": "\u20077.03M/?\u2007[00:01<00:00,\u20078.98MB/s]" } }, "52bbe88f204745f99e262e83323da551": { @@ -4141,9 +4309,9 @@ "description": "", "description_tooltip": null, "layout": "IPY_MODEL_370a6798b77b428c9ece10df712312c9", - "placeholder": "​", + "placeholder": "\u200b", "style": "IPY_MODEL_72c0ed8576b9477295884ea09e8cc683", - "value": " 613/613 [00:00<00:00, 58.6kB/s]" + "value": "\u2007613/613\u2007[00:00<00:00,\u200758.6kB/s]" } }, "58381f52579049b68340fd7563c86864": { @@ -4319,9 +4487,9 @@ "description": "", "description_tooltip": null, "layout": "IPY_MODEL_2eb0e975522f4fedb3b380d0266011f0", - "placeholder": "​", + "placeholder": "\u200b", "style": "IPY_MODEL_3be6f63af1334bafa8ce87ce3a755aa1", - "value": "tokenizer_config.json: " + "value": "tokenizer_config.json:\u2007" } }, "6dc9492e5ff54489a427488949fa2125": { @@ -4419,9 +4587,9 @@ "description": "", "description_tooltip": null, "layout": "IPY_MODEL_1763b25ed55c4eb380505b26875144cb", - "placeholder": "​", + "placeholder": "\u200b", "style": "IPY_MODEL_23d2a95f6a744c96ad762f2336ad4daf", - "value": "merges.txt: " + "value": "merges.txt:\u2007" } }, "7bea951bbb81490ab1e6592e6f0b4191": { @@ -4492,9 +4660,9 @@ "description": "", "description_tooltip": null, "layout": "IPY_MODEL_b245854622134f36bfe003ca703470e7", - "placeholder": "​", + "placeholder": "\u200b", "style": "IPY_MODEL_9a3f3ea17c7442ec99cfcddba05fec3d", - "value": " 7.51k/? [00:00<00:00, 354kB/s]" + "value": "\u20077.51k/?\u2007[00:00<00:00,\u2007354kB/s]" } }, "81275c361a07407996ea303ea54f06f9": { @@ -4611,9 +4779,9 @@ "description": "", "description_tooltip": null, "layout": "IPY_MODEL_1a9062de6a42492daa8b404ca234c655", - "placeholder": "​", + "placeholder": "\u200b", "style": "IPY_MODEL_428597e1731246ddb89cd07960fd3547", - "value": " 632/632 [00:00<00:00, 69.4kB/s]" + "value": "\u2007632/632\u2007[00:00<00:00,\u200769.4kB/s]" } }, "8d5e49fa38434149a90277775b4a4222": { @@ -4654,9 +4822,9 @@ "description": "", "description_tooltip": null, "layout": "IPY_MODEL_9eb16013698744e0b1bf1f7dbe2894c9", - "placeholder": "​", + "placeholder": "\u200b", "style": "IPY_MODEL_ad4d39074c2a4a11ab53d17306efaebf", - "value": " 266/266 [00:00<00:00, 20.1kB/s]" + "value": "\u2007266/266\u2007[00:00<00:00,\u200720.1kB/s]" } }, "9107f2767e9544efbc4b67ff99f07062": { @@ -4675,9 +4843,9 @@ "description": "", "description_tooltip": null, "layout": "IPY_MODEL_dd1bd3d34dab441dba20abd5113a4c53", - "placeholder": "​", + "placeholder": "\u200b", "style": "IPY_MODEL_ac866405476d464a9eddf5c34ff5e004", - "value": " 1.67M/? [00:00<00:00, 52.1MB/s]" + "value": "\u20071.67M/?\u2007[00:00<00:00,\u200752.1MB/s]" } }, "9193e29b5e7448a38df9da47d4d6d892": { @@ -4960,9 +5128,9 @@ "description": "", "description_tooltip": null, "layout": "IPY_MODEL_251a43ab3f35410e98d395830c7ef4ed", - "placeholder": "​", + "placeholder": "\u200b", "style": "IPY_MODEL_81275c361a07407996ea303ea54f06f9", - "value": "tokenizer.json: " + "value": "tokenizer.json:\u2007" } }, "ac866405476d464a9eddf5c34ff5e004": { @@ -4996,9 +5164,9 @@ "description": "", "description_tooltip": null, "layout": "IPY_MODEL_e53feefca7f44193aed6103c22c9fdb3", - "placeholder": "​", + "placeholder": "\u200b", "style": "IPY_MODEL_983ca6ddd0fc44f6b8dfb60012521d0f", - "value": "special_tokens_map.json: 100%" + "value": "special_tokens_map.json:\u2007100%" } }, "ad4d39074c2a4a11ab53d17306efaebf": { @@ -5391,9 +5559,9 @@ "description": "", "description_tooltip": null, "layout": "IPY_MODEL_28ec3ae77c554dd184f8949ae7a2d0a9", - "placeholder": "​", + "placeholder": "\u200b", "style": "IPY_MODEL_58381f52579049b68340fd7563c86864", - "value": " 2.78M/? [00:00<00:00, 26.4MB/s]" + "value": "\u20072.78M/?\u2007[00:00<00:00,\u200726.4MB/s]" } }, "c906885056f344efa132c23f75c0ee5a": { @@ -5675,9 +5843,9 @@ "description": "", "description_tooltip": null, "layout": "IPY_MODEL_01d0d1c5e9ec4ebf8fe633e531592edf", - "placeholder": "​", + "placeholder": "\u200b", "style": "IPY_MODEL_10744104a0274a9dbc225a6d55857bf8", - "value": "vocab.json: " + "value": "vocab.json:\u2007" } }, "dd1bd3d34dab441dba20abd5113a4c53": { @@ -6008,9 +6176,9 @@ "description": "", "description_tooltip": null, "layout": "IPY_MODEL_1c98c0f2f2bc420eb7500fb10961cc40", - "placeholder": "​", + "placeholder": "\u200b", "style": "IPY_MODEL_4ff7ff550d0943bca15e73cf351961ea", - "value": "adapter_model.safetensors: 100%" + "value": "adapter_model.safetensors:\u2007100%" } }, "e5e3ca609b66484088960bed1cbad3ae": { @@ -6209,9 +6377,9 @@ "description": "", "description_tooltip": null, "layout": "IPY_MODEL_675d38ebd9d4431087e09ce3c64db889", - "placeholder": "​", + "placeholder": "\u200b", "style": "IPY_MODEL_e3ec127e59674e8a85c2757a984ca865", - "value": " 2.05G/2.05G [00:16<00:00, 160MB/s]" + "value": "\u20072.05G/2.05G\u2007[00:16<00:00,\u2007160MB/s]" } }, "ee8cf678759d42868185eedf41cb62ad": { @@ -6282,9 +6450,9 @@ "description": "", "description_tooltip": null, "layout": "IPY_MODEL_e5e3ca609b66484088960bed1cbad3ae", - "placeholder": "​", + "placeholder": "\u200b", "style": "IPY_MODEL_bd77821ae1e04b97a4086994564a5df5", - "value": " 1.23k/? [00:00<00:00, 66.4kB/s]" + "value": "\u20071.23k/?\u2007[00:00<00:00,\u200766.4kB/s]" } }, "f32d404d65674580a29e86b164f6502c": { @@ -6355,9 +6523,9 @@ "description": "", "description_tooltip": null, "layout": "IPY_MODEL_e3ba7bb1541247d986af21a769802d60", - "placeholder": "​", + "placeholder": "\u200b", "style": "IPY_MODEL_e512348e70af46f29fa6d20c92238fec", - "value": "added_tokens.json: 100%" + "value": "added_tokens.json:\u2007100%" } } } diff --git a/train/train_sft_lora.ipynb b/train/train_sft_lora.ipynb index d7e799d77a2b21156b711c08e9d76d2cb244dafc..9628229fadd97e51fcbf83d45293630ac320b979 100644 --- a/train/train_sft_lora.ipynb +++ b/train/train_sft_lora.ipynb @@ -2,34 +2,37 @@ "cells": [ { "cell_type": "markdown", - "metadata": {}, + "id": "DvBYAt_QkQdY", + "metadata": { + "id": "DvBYAt_QkQdY" + }, "source": [ - "# AWS RL Agent \u2014 SFT with LoRA on Qwen2.5-Coder-3B\n", + "# AWS RL Agent — SFT with LoRA on Qwen2.5-Coder-3B\n", "\n", - "**Pipeline**: HF SFT dataset \u2192 Optuna-tuned LoRA SFT \u2192 HF Hub adapter \u2192 GRPO (next phase)\n", + "**Pipeline**: HF SFT dataset → Optuna-tuned LoRA SFT → HF Hub adapter → GRPO (next phase)\n", "\n", "| | |\n", "|---|---|\n", "| **Base model** | `Qwen/Qwen2.5-Coder-3B-Instruct` (4-bit via Unsloth) |\n", - "| **Dataset** | [`Sizzing/aws-rl-sft`](https://huggingface.co/datasets/Sizzing/aws-rl-sft) \u2014 1500 train / 150 val |\n", + "| **Dataset** | [`Sizzing/aws-rl-sft`](https://huggingface.co/datasets/Sizzing/aws-rl-sft) — 1500 train / 150 val |\n", "| **Target GPU** | Kaggle dual-T4 (single T4 is enough with 4-bit) |\n", "| **Expected runtime** | ~45 min end-to-end |\n", - "| **Logging** | Wandb `sizzing-sizzing/AWS-RL-SFT` |\n", + "| **Logging** | matplotlib PNGs in `OUT_DIR/plots/` |\n", "\n", "## What this notebook does\n", "\n", - "1. **Pre-SFT baseline eval** \u2014 zero-shot metrics on the base model (the \"before\")\n", - "2. **Optuna search** \u2014 6 trials on a 500-row subset to pick best LoRA hparams\n", - "3. **Final SFT** \u2014 full dataset with winning hparams, wandb-logged, checkpointed to disk\n", - "4. **Post-SFT eval** \u2014 same prompts, measure the delta\n", - "5. **Push adapter** \u2014 60MB LoRA adapter to HF Hub (not the full 3B model)\n", + "1. **Pre-SFT baseline eval** — zero-shot metrics on the base model (the \"before\")\n", + "2. **Optuna search** — 6 trials on a 500-row subset to pick best LoRA hparams\n", + "3. **Final SFT** — full dataset with winning hparams, checkpointed to disk\n", + "4. **Post-SFT eval** — same prompts, measure the delta\n", + "5. **Push adapter** — 60MB LoRA adapter to HF Hub (not the full 3B model)\n", "\n", "## Why this stack\n", "\n", - "- **Unsloth** \u2014 ~2\u00d7 training speed and half the VRAM via fused kernels (makes 3B fit on a single T4)\n", - "- **Optuna** \u2014 systematic hparam search instead of one-shot guessing; produces the parallel-coord plot judges love\n", - "- **TRL `SFTTrainer`** \u2014 handles the `messages` column and chat template automatically\n", - "- **Wandb** \u2014 per-trial + final run, all plots in one dashboard\n", + "- **Unsloth** — ~2× training speed and half the VRAM via fused kernels (makes 3B fit on a single T4)\n", + "- **Optuna** — systematic hparam search instead of one-shot guessing; produces the parallel-coord plot judges love\n", + "- **TRL `SFTTrainer`** — handles the `messages` column and chat template automatically\n", + "- **matplotlib** — every training/Optuna/eval figure rendered locally and saved as PNG to `OUT_DIR/plots/` for download\n", "\n", "## Expected deltas (from the pre-training eval)\n", "\n", @@ -46,7 +49,10 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "Ezws954SkQdc", + "metadata": { + "id": "Ezws954SkQdc" + }, "source": [ "## 1. Install dependencies\n", "\n", @@ -57,7 +63,9 @@ "cell_type": "code", "execution_count": null, "id": "aa29805d", - "metadata": {}, + "metadata": { + "id": "aa29805d" + }, "outputs": [], "source": [ "%%capture\n", @@ -81,13 +89,15 @@ "!pip install -q --force-reinstall --no-deps \"transformers>=4.50,<5.0\"\n", "\n", "!pip install -q --upgrade \"trl<0.12.0\" peft accelerate datasets huggingface_hub bitsandbytes\n", - "!pip install -q --upgrade optuna optuna-integration plotly kaleido wandb" + "!pip install -q --upgrade optuna optuna-integration" ] }, { "cell_type": "markdown", "id": "318f19cb", - "metadata": {}, + "metadata": { + "id": "318f19cb" + }, "source": [ "## 2. Runtime sanity check\n", "\n", @@ -98,17 +108,34 @@ "cell_type": "code", "execution_count": null, "id": "5dec74a0", - "metadata": {}, - "outputs": [], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "5dec74a0", + "outputId": "6a137f26-b499-42c7-caa7-b9dcbcdc17a9" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Environment : Colab\n", + "Output dir : /content/out\n", + "GPU : Tesla T4\n", + "VRAM : 15.6 GB\n", + "GPU count : 1\n", + "Torch : 2.10.0+cu128\n", + "CUDA : 12.8\n", + "Precision : fp16\n" + ] + } + ], "source": [ "import os, sys, json, time, gc, re\n", "from pathlib import Path\n", "import torch\n", "\n", - "# Reduce CUDA fragmentation on small GPUs (T4 has only 16 GB).\n", - "# Must be set BEFORE any CUDA allocation happens.\n", - "os.environ.setdefault('PYTORCH_ALLOC_CONF', 'expandable_segments:True')\n", - "\n", "\n", "if IS_KAGGLE:\n", " OUT_DIR = Path('/kaggle/working')\n", @@ -118,7 +145,9 @@ " OUT_DIR = Path('./out')\n", "OUT_DIR.mkdir(parents=True, exist_ok=True)\n", "\n", - "assert torch.cuda.is_available(), 'No GPU detected \u2014 enable GPU in runtime settings.'\n", + "os.environ.setdefault('PYTORCH_ALLOC_CONF', 'expandable_segments:True')\n", + "\n", + "assert torch.cuda.is_available(), 'No GPU detected — enable GPU in runtime settings.'\n", "gpu = torch.cuda.get_device_properties(0)\n", "\n", "print(f'Environment : {\"Kaggle\" if IS_KAGGLE else \"Colab\" if IS_COLAB else \"Local\"}')\n", @@ -140,7 +169,9 @@ { "cell_type": "markdown", "id": "542213a7", - "metadata": {}, + "metadata": { + "id": "542213a7" + }, "source": [ "## 3. Config\n", "\n", @@ -151,12 +182,18 @@ "cell_type": "code", "execution_count": null, "id": "c62a61cc", - "metadata": {}, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "c62a61cc", + "outputId": "636f3fdc-b5c4-4c91-d18d-4505703ffd22" + }, "outputs": [], "source": [ "CONFIG = {\n", " # --- Model ---\n", - " # Unsloth's 4-bit pre-quantized version loads ~4\u00d7 faster than bnb-on-the-fly\n", + " # Unsloth's 4-bit pre-quantized version loads ~4× faster than bnb-on-the-fly\n", " 'base_model': 'unsloth/Qwen2.5-Coder-3B-Instruct-bnb-4bit',\n", " 'max_seq_length': 512, # our dataset p99 is 453; 512 covers everything\n", " 'load_in_4bit': True,\n", @@ -165,8 +202,8 @@ " 'dataset_repo': 'Sizzing/aws-rl-sft',\n", "\n", " # --- Fixed SFT hyperparameters ---\n", - " 'per_device_train_batch_size': 4, # bs=2 left GPU at 45%; bs=4 uses ~10/15 GB on T4\n", - " 'gradient_accumulation_steps': 4, # effective batch = 16 (unchanged)\n", + " 'per_device_train_batch_size': 2,\n", + " 'gradient_accumulation_steps': 8, # effective batch = 16\n", " 'num_train_epochs': 2, # full final run\n", " 'optim': 'adamw_8bit', # Unsloth-compatible, saves VRAM\n", " 'max_grad_norm': 1.0,\n", @@ -189,63 +226,469 @@ " # --- Output ---\n", " 'adapter_repo': 'Sizzing/aws-rl-sft-qwen25coder3b-adapter',\n", " 'adapter_private': True,\n", - "\n", - " # --- Wandb ---\n", - " 'wandb_entity': 'sizzing-sizzing',\n", - " 'wandb_project': 'AWS-RL-SFT',\n", "}\n", "\n", - "os.environ['WANDB_ENTITY'] = CONFIG['wandb_entity']\n", - "os.environ['WANDB_PROJECT'] = CONFIG['wandb_project']\n", - "\n", "CONFIG" ] }, { "cell_type": "markdown", - "id": "90b842d0", + "id": "9cafd68f", + "source": [ + "## 3a. Plotting helpers (matplotlib)\n", + "\n", + "Defines the plot functions and `PLOTS_DIR` used throughout the notebook. Every figure produced later (training curves, Optuna views, eval comparison) is rendered inline **and** saved to `OUT_DIR/plots/` as a PNG so it can be downloaded." + ], + "metadata": {} + }, + { + "cell_type": "code", + "id": "24a126e5", + "source": [ + "# ─── Plotting helpers ──────────────────────────────────────────────────────\n", + "# All training-time charts (loss/eval/lr/grad-norm + Optuna views + eval bars)\n", + "# are matplotlib figures, displayed inline and saved as PNGs to OUT_DIR/plots/.\n", + "# Helpers:\n", + "# plot_training_curves(...) — train/eval loss + lr + grad_norm\n", + "# plot_optuna_history(...) — best-so-far + per-trial scatter\n", + "# plot_optuna_param_importances(...) — fANOVA-style horizontal bar\n", + "# plot_optuna_parallel_coordinates(...) — per-trial polylines\n", + "# plot_optuna_slice(...) — each param vs objective\n", + "# plot_optuna_trial_loss_curves(...) — overlay every trial's loss curves\n", + "# plot_eval_comparison(...) — baseline vs post-SFT bars + delta\n", + "import math\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import matplotlib.patches as mpatches\n", + "from matplotlib.gridspec import GridSpec\n", + "\n", + "PLOTS_DIR = OUT_DIR / 'plots'\n", + "PLOTS_DIR.mkdir(parents=True, exist_ok=True)\n", + "\n", + "# Colour palette mirrors compare_base_vs_sft.ipynb so all artefacts share one\n", + "# visual language.\n", + "COLOR_BASELINE = '#4C72B0'\n", + "COLOR_TRAINED = '#DD8452'\n", + "COLOR_POS = '#55A868'\n", + "COLOR_NEG = '#C44E52'\n", + "COLOR_TRAIN = '#4C72B0'\n", + "COLOR_EVAL = '#DD8452'\n", + "COLOR_GRAD = '#8172B2'\n", + "COLOR_LR = '#937860'\n", + "\n", + "plt.rcParams.update({\n", + " 'figure.dpi': 120,\n", + " 'font.family': 'DejaVu Sans',\n", + " 'font.size': 11,\n", + " 'axes.titlesize': 12,\n", + " 'axes.titleweight': 'bold',\n", + " 'axes.labelsize': 10,\n", + " 'axes.spines.top': False,\n", + " 'axes.spines.right': False,\n", + " 'axes.grid': True,\n", + " 'grid.alpha': 0.35,\n", + " 'legend.framealpha': 0.9,\n", + " 'legend.fontsize': 9,\n", + " 'xtick.labelsize': 9,\n", + " 'ytick.labelsize': 9,\n", + "})\n", + "\n", + "\n", + "def _save(fig, name):\n", + " \"\"\"Save a figure to PLOTS_DIR/.png at dpi=150 with white background.\"\"\"\n", + " path = PLOTS_DIR / f'{name}.png'\n", + " fig.savefig(path, dpi=150, bbox_inches='tight', facecolor='white')\n", + " print(f' saved -> {path}')\n", + " return path\n", + "\n", + "\n", + "def _split_log_history(log_history):\n", + " \"\"\"Split trainer.state.log_history into (train_records, eval_records).\n", + "\n", + " Train rows have 'loss' + 'step'; eval rows have 'eval_loss' + 'step'. The\n", + " final summary row (no step) is dropped.\n", + " \"\"\"\n", + " train, eval_ = [], []\n", + " for r in log_history:\n", + " if 'loss' in r and 'step' in r:\n", + " train.append(r)\n", + " if 'eval_loss' in r and 'step' in r:\n", + " eval_.append(r)\n", + " return train, eval_\n", + "\n", + "\n", + "def plot_training_curves(log_history, *, title, save_name):\n", + " \"\"\"Render train/eval loss + LR + grad-norm in a 2x2 grid.\"\"\"\n", + " train, eval_ = _split_log_history(log_history)\n", + " if not train:\n", + " print(f' (no training records to plot for {save_name})')\n", + " return None\n", + "\n", + " t_step = np.array([r['step'] for r in train])\n", + " t_loss = np.array([r['loss'] for r in train])\n", + " t_lr = np.array([r.get('learning_rate', np.nan) for r in train])\n", + " t_gn = np.array([r.get('grad_norm', np.nan) for r in train])\n", + "\n", + " fig = plt.figure(figsize=(14, 9))\n", + " gs = GridSpec(2, 2, figure=fig, hspace=0.36, wspace=0.28)\n", + " ax_loss = fig.add_subplot(gs[0, 0])\n", + " ax_eval = fig.add_subplot(gs[0, 1])\n", + " ax_lr = fig.add_subplot(gs[1, 0])\n", + " ax_gn = fig.add_subplot(gs[1, 1])\n", + "\n", + " ax_loss.plot(t_step, t_loss, color=COLOR_TRAIN, lw=1.6, label='train_loss')\n", + " ax_loss.set(title='Training loss vs step', xlabel='Step', ylabel='Cross-entropy loss')\n", + " ax_loss.legend(loc='upper right')\n", + "\n", + " if eval_:\n", + " e_step = np.array([r['step'] for r in eval_])\n", + " e_loss = np.array([r['eval_loss'] for r in eval_])\n", + " ax_eval.plot(e_step, e_loss, color=COLOR_EVAL, lw=1.6,\n", + " marker='o', markersize=5, label='eval_loss')\n", + " ax_eval.set(title='Eval loss vs step', xlabel='Step', ylabel='Eval cross-entropy loss')\n", + " ax_eval.legend(loc='upper right')\n", + " else:\n", + " ax_eval.text(0.5, 0.5, 'No eval records', ha='center', va='center',\n", + " transform=ax_eval.transAxes, color='#888')\n", + " ax_eval.set(title='Eval loss vs step', xlabel='Step', ylabel='Eval cross-entropy loss')\n", + "\n", + " if not np.all(np.isnan(t_lr)):\n", + " ax_lr.plot(t_step, t_lr, color=COLOR_LR, lw=1.6, label='learning_rate')\n", + " ax_lr.set(title='Learning rate schedule', xlabel='Step', ylabel='Learning rate')\n", + " ax_lr.legend(loc='upper right')\n", + " else:\n", + " ax_lr.text(0.5, 0.5, 'No LR records', ha='center', va='center',\n", + " transform=ax_lr.transAxes, color='#888')\n", + " ax_lr.set(title='Learning rate schedule', xlabel='Step', ylabel='Learning rate')\n", + "\n", + " if not np.all(np.isnan(t_gn)):\n", + " ax_gn.plot(t_step, t_gn, color=COLOR_GRAD, lw=1.6, label='grad_norm')\n", + " ax_gn.set(title='Gradient norm vs step', xlabel='Step', ylabel='||grad||₂')\n", + " ax_gn.legend(loc='upper right')\n", + " else:\n", + " ax_gn.text(0.5, 0.5, 'No grad-norm records', ha='center', va='center',\n", + " transform=ax_gn.transAxes, color='#888')\n", + " ax_gn.set(title='Gradient norm vs step', xlabel='Step', ylabel='||grad||₂')\n", + "\n", + " fig.suptitle(title, fontsize=14, fontweight='bold', y=1.00)\n", + " plt.tight_layout()\n", + " _save(fig, save_name)\n", + " plt.show()\n", + " return fig\n", + "\n", + "\n", + "def plot_optuna_history(study, *, save_name='optuna_history'):\n", + " \"\"\"Best-so-far line + per-trial scatter (matplotlib version of plot_optimization_history).\"\"\"\n", + " trials = [t for t in study.trials if t.value is not None]\n", + " if not trials:\n", + " print(' (no completed trials to plot)'); return None\n", + " nums = np.array([t.number for t in trials])\n", + " vals = np.array([t.value for t in trials])\n", + " best_so_far = np.minimum.accumulate(vals)\n", + "\n", + " fig, ax = plt.subplots(figsize=(10, 5))\n", + " ax.scatter(nums, vals, s=55, color=COLOR_TRAIN, edgecolors='white',\n", + " linewidths=0.6, label='Trial value', zorder=3)\n", + " ax.plot(nums, best_so_far, color=COLOR_NEG, lw=1.8, marker='s',\n", + " markersize=6, label='Best so far', zorder=2)\n", + " ax.set(title='Optuna optimization history',\n", + " xlabel='Trial number',\n", + " ylabel=f'Objective (eval_loss, {study.direction.name.lower()})')\n", + " ax.set_xticks(nums)\n", + " ax.legend(loc='upper right')\n", + " plt.tight_layout()\n", + " _save(fig, save_name)\n", + " plt.show()\n", + " return fig\n", + "\n", + "\n", + "def plot_optuna_param_importances(study, *, save_name='optuna_importances'):\n", + " \"\"\"fANOVA-style horizontal bar of optuna.importance.get_param_importances.\"\"\"\n", + " try:\n", + " import optuna\n", + " importances = optuna.importance.get_param_importances(study)\n", + " except Exception as e:\n", + " print(f' (param importances unavailable: {e})')\n", + " return None\n", + " params = list(importances.keys())\n", + " vals = list(importances.values())\n", + " order = np.argsort(vals)[::-1]\n", + " params = [params[i] for i in order]\n", + " vals = [vals[i] for i in order]\n", + "\n", + " fig, ax = plt.subplots(figsize=(10, max(3, 0.6 * len(params) + 1.5)))\n", + " bars = ax.barh(params[::-1], vals[::-1], color=COLOR_TRAIN,\n", + " edgecolor='white', linewidth=0.6)\n", + " for bar, v in zip(bars, vals[::-1]):\n", + " ax.text(bar.get_width() + 0.005, bar.get_y() + bar.get_height()/2,\n", + " f'{v:.3f}', va='center', fontsize=9, fontweight='bold')\n", + " ax.set(title='Hyperparameter importance (fANOVA-style)',\n", + " xlabel='Relative importance', ylabel='Hyperparameter')\n", + " if vals:\n", + " ax.set_xlim(0, max(vals) * 1.15)\n", + " plt.tight_layout()\n", + " _save(fig, save_name)\n", + " plt.show()\n", + " return fig\n", + "\n", + "\n", + "def plot_optuna_parallel_coordinates(study, *, save_name='optuna_parallel'):\n", + " \"\"\"Per-trial polyline plot. Color = objective value (lower = better).\"\"\"\n", + " trials = [t for t in study.trials if t.value is not None]\n", + " if not trials:\n", + " print(' (no completed trials to plot)'); return None\n", + "\n", + " param_names = []\n", + " for t in trials:\n", + " for k in t.params:\n", + " if k not in param_names:\n", + " param_names.append(k)\n", + "\n", + " n_trials = len(trials)\n", + " n_dims = len(param_names) + 1\n", + " matrix = np.zeros((n_trials, n_dims))\n", + " tick_labels = {}\n", + "\n", + " for d, p in enumerate(param_names):\n", + " col = [t.params.get(p) for t in trials]\n", + " if all(isinstance(v, (int, float)) and not isinstance(v, bool) for v in col):\n", + " matrix[:, d] = col\n", + " else:\n", + " uniques = sorted({str(v) for v in col})\n", + " mp = {u: i for i, u in enumerate(uniques)}\n", + " matrix[:, d] = [mp[str(v)] for v in col]\n", + " tick_labels[d] = uniques\n", + " matrix[:, -1] = [t.value for t in trials]\n", + " obj_label = 'objective (eval_loss)'\n", + "\n", + " norm = np.zeros_like(matrix)\n", + " for d in range(n_dims):\n", + " col = matrix[:, d]\n", + " lo, hi = col.min(), col.max()\n", + " norm[:, d] = (col - lo) / (hi - lo) if hi > lo else 0.5\n", + "\n", + " obj_vals = matrix[:, -1]\n", + " cmap = plt.cm.viridis_r\n", + " spread = np.ptp(obj_vals) if np.ptp(obj_vals) else 1.0\n", + " obj_norm = (obj_vals - obj_vals.min()) / spread\n", + "\n", + " fig, ax = plt.subplots(figsize=(12, 5.5))\n", + " xs = np.arange(n_dims)\n", + " for i in range(n_trials):\n", + " ax.plot(xs, norm[i], color=cmap(obj_norm[i]), alpha=0.85, lw=1.5)\n", + "\n", + " for d in range(n_dims):\n", + " ax.axvline(d, color='#bbb', lw=0.8, zorder=1)\n", + "\n", + " ax.set_xticks(xs)\n", + " ax.set_xticklabels(param_names + [obj_label], rotation=20, ha='right')\n", + " ax.set_yticks([0, 0.5, 1.0])\n", + " ax.set_yticklabels(['min', 'mid', 'max'])\n", + " ax.set(title='Optuna parallel coordinates (color = objective; lower is better)',\n", + " xlabel='Hyperparameter', ylabel='Normalised value')\n", + " for d, labels in tick_labels.items():\n", + " text = f'{param_names[d]}: ' + ', '.join(f'{i}={l}' for i, l in enumerate(labels))\n", + " ax.annotate(text, xy=(d, -0.18), xycoords=('data', 'axes fraction'),\n", + " ha='center', fontsize=7, color='#555')\n", + "\n", + " sm = plt.cm.ScalarMappable(cmap=cmap,\n", + " norm=plt.Normalize(vmin=obj_vals.min(), vmax=obj_vals.max()))\n", + " sm.set_array([])\n", + " cbar = fig.colorbar(sm, ax=ax, pad=0.02)\n", + " cbar.set_label(obj_label, fontsize=9)\n", + " plt.tight_layout()\n", + " _save(fig, save_name)\n", + " plt.show()\n", + " return fig\n", + "\n", + "\n", + "def plot_optuna_slice(study, *, save_name='optuna_slice'):\n", + " \"\"\"Per-parameter scatter: param value vs objective, colored by trial number.\"\"\"\n", + " trials = [t for t in study.trials if t.value is not None]\n", + " if not trials:\n", + " print(' (no completed trials)'); return None\n", + " param_names = []\n", + " for t in trials:\n", + " for k in t.params:\n", + " if k not in param_names:\n", + " param_names.append(k)\n", + " n = len(param_names)\n", + " cols = min(3, n)\n", + " rows = math.ceil(n / cols)\n", + " fig, axes = plt.subplots(rows, cols, figsize=(5.0 * cols, 4.0 * rows),\n", + " squeeze=False, constrained_layout=True)\n", + " sc = None\n", + " for i, p in enumerate(param_names):\n", + " ax = axes[i // cols][i % cols]\n", + " xs = [t.params.get(p) for t in trials]\n", + " ys = [t.value for t in trials]\n", + " nums = [t.number for t in trials]\n", + " if not all(isinstance(v, (int, float)) and not isinstance(v, bool) for v in xs):\n", + " uniques = sorted({str(v) for v in xs})\n", + " mp = {u: i for i, u in enumerate(uniques)}\n", + " xs_plot = [mp[str(v)] for v in xs]\n", + " ax.set_xticks(list(range(len(uniques))))\n", + " ax.set_xticklabels(uniques)\n", + " else:\n", + " xs_plot = xs\n", + " sc = ax.scatter(xs_plot, ys, c=nums, cmap='viridis', s=60,\n", + " edgecolors='white', linewidths=0.6)\n", + " ax.set(title=p, xlabel=p, ylabel='eval_loss')\n", + " for j in range(n, rows * cols):\n", + " axes[j // cols][j % cols].axis('off')\n", + " if sc is not None:\n", + " cbar = fig.colorbar(sc, ax=axes.ravel().tolist(), pad=0.02, fraction=0.04)\n", + " cbar.set_label('Trial number', fontsize=9)\n", + " fig.suptitle('Optuna slice plot (objective vs each hyperparameter)',\n", + " fontsize=14, fontweight='bold')\n", + " _save(fig, save_name)\n", + " plt.show()\n", + " return fig\n", + "\n", + "\n", + "def plot_optuna_trial_loss_curves(study, *, save_name='optuna_trial_curves'):\n", + " \"\"\"Overlay every trial's training-loss + eval-loss curves.\n", + "\n", + " Reads `log_history` from each trial's user_attrs (set inside objective()).\n", + " \"\"\"\n", + " trials_with_history = [t for t in study.trials\n", + " if t.value is not None\n", + " and 'log_history' in t.user_attrs]\n", + " if not trials_with_history:\n", + " print(' (no per-trial log_history captured — skipping trial curves)')\n", + " return None\n", + "\n", + " cmap = plt.cm.viridis\n", + " n = len(trials_with_history)\n", + "\n", + " fig, (ax_t, ax_e) = plt.subplots(1, 2, figsize=(14, 5))\n", + " for i, t in enumerate(trials_with_history):\n", + " log = t.user_attrs['log_history']\n", + " train, eval_ = _split_log_history(log)\n", + " color = cmap(i / max(1, n - 1))\n", + " if train:\n", + " ax_t.plot([r['step'] for r in train], [r['loss'] for r in train],\n", + " color=color, lw=1.4, alpha=0.9,\n", + " label=f'trial {t.number} (loss={t.value:.3f})')\n", + " if eval_:\n", + " ax_e.plot([r['step'] for r in eval_], [r['eval_loss'] for r in eval_],\n", + " color=color, lw=1.4, marker='o', markersize=4, alpha=0.9,\n", + " label=f'trial {t.number} (loss={t.value:.3f})')\n", + "\n", + " ax_t.set(title='Per-trial training loss', xlabel='Step', ylabel='Cross-entropy loss')\n", + " ax_e.set(title='Per-trial eval loss', xlabel='Step', ylabel='Eval cross-entropy loss')\n", + " ax_t.legend(loc='upper right', fontsize=7)\n", + " ax_e.legend(loc='upper right', fontsize=7)\n", + " fig.suptitle('Optuna — per-trial training & eval curves', fontweight='bold', y=1.02)\n", + " plt.tight_layout()\n", + " _save(fig, save_name)\n", + " plt.show()\n", + " return fig\n", + "\n", + "\n", + "def plot_eval_comparison(baseline, posttrain, *, save_name='eval_metrics_comparison'):\n", + " \"\"\"Grouped bar (baseline vs post-SFT) + delta bar for the 4 eval metrics.\"\"\"\n", + " keys = ['format_pct', 'exact_pct', 'service_pct', 'operation_pct']\n", + " labels = ['Format', 'Exact', 'Service', 'Operation']\n", + " base_v = [100 * baseline[k] for k in keys]\n", + " post_v = [100 * posttrain[k] for k in keys]\n", + " delta = [p - b for b, p in zip(base_v, post_v)]\n", + "\n", + " fig = plt.figure(figsize=(14, 5.5))\n", + " gs = GridSpec(1, 2, figure=fig, wspace=0.3)\n", + " ax1 = fig.add_subplot(gs[0, 0])\n", + " ax2 = fig.add_subplot(gs[0, 1])\n", + "\n", + " x, w = np.arange(len(labels)), 0.35\n", + " bars1 = ax1.bar(x - w/2, base_v, w, color=COLOR_BASELINE, label='Pre-SFT (baseline)',\n", + " edgecolor='white', linewidth=0.6)\n", + " bars2 = ax1.bar(x + w/2, post_v, w, color=COLOR_TRAINED, label='Post-SFT',\n", + " edgecolor='white', linewidth=0.6)\n", + " for bars in (bars1, bars2):\n", + " for bar in bars:\n", + " ax1.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 1,\n", + " f'{bar.get_height():.1f}%', ha='center', va='bottom',\n", + " fontsize=9, fontweight='bold')\n", + " ax1.set(title='Eval metrics — Baseline vs Post-SFT', xlabel='Metric',\n", + " ylabel='Score (%)', ylim=(0, 118))\n", + " ax1.set_xticks(x); ax1.set_xticklabels(labels)\n", + " ax1.legend(loc='lower right')\n", + "\n", + " colors = [COLOR_POS if d >= 0 else COLOR_NEG for d in delta]\n", + " bars = ax2.bar(x, delta, 0.5, color=colors, edgecolor='white', linewidth=0.6)\n", + " for bar, d in zip(bars, delta):\n", + " ax2.text(bar.get_x() + bar.get_width()/2,\n", + " bar.get_height() + (0.6 if d >= 0 else -1.6),\n", + " f'{d:+.1f}pt', ha='center',\n", + " va='bottom' if d >= 0 else 'top',\n", + " fontsize=9, fontweight='bold')\n", + " ax2.axhline(0, color='#333', lw=0.9)\n", + " ax2.set(title='Delta (Post − Pre, percentage points)', xlabel='Metric', ylabel='Δ pp')\n", + " ax2.set_xticks(x); ax2.set_xticklabels(labels)\n", + " ax2.legend(handles=[mpatches.Patch(color=COLOR_POS, label='Improvement'),\n", + " mpatches.Patch(color=COLOR_NEG, label='Regression')])\n", + " plt.tight_layout()\n", + " _save(fig, save_name)\n", + " plt.show()\n", + " return fig\n", + "\n", + "\n", + "print(f'Plot helpers ready. Figures will be saved to: {PLOTS_DIR}')" + ], "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "id": "90b842d0", + "metadata": { + "id": "90b842d0" + }, "source": [ "## 4. Authenticate\n", "\n", - "Both `HF_TOKEN` and `WANDB_API_KEY` must be set.\n", + "`HF_TOKEN` must be set so we can pull the dataset and (later) push the LoRA adapter.\n", "\n", - "**On Kaggle**: Notebook \u2192 Add-ons \u2192 Secrets \u2192 add both keys. The cell below picks them up automatically.\n", - "**On Colab**: `from google.colab import userdata; os.environ['HF_TOKEN'] = userdata.get('HF_TOKEN')`\n", - "**Locally**: export both as environment variables." + "**On Kaggle**: Notebook → Add-ons → Secrets → add `HF_TOKEN`. The cell below picks it up automatically.\n", + "**On Colab**: Sidebar → key icon → add `HF_TOKEN` to Colab Secrets.\n", + "**Locally**: `export HF_TOKEN=...` before launching the kernel." ] }, { "cell_type": "code", "execution_count": null, "id": "92b83e84", - "metadata": {}, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "92b83e84", + "outputId": "44bd34a1-7e1e-49cf-99e2-e67b85655ee7" + }, "outputs": [], "source": [ "if IS_KAGGLE:\n", " from kaggle_secrets import UserSecretsClient\n", " secrets = UserSecretsClient()\n", " os.environ['HF_TOKEN'] = secrets.get_secret('HF_TOKEN')\n", - " os.environ['WANDB_API_KEY'] = secrets.get_secret('WANDB_API_KEY')\n", "elif IS_COLAB:\n", " from google.colab import userdata\n", " os.environ['HF_TOKEN'] = userdata.get('HF_TOKEN')\n", - " os.environ['WANDB_API_KEY'] = userdata.get('WANDB_API_KEY')\n", "\n", "assert 'HF_TOKEN' in os.environ and os.environ['HF_TOKEN'], 'HF_TOKEN missing'\n", - "assert 'WANDB_API_KEY' in os.environ and os.environ['WANDB_API_KEY'], 'WANDB_API_KEY missing'\n", "\n", "from huggingface_hub import login as hf_login\n", - "import wandb\n", "hf_login(token=os.environ['HF_TOKEN'], add_to_git_credential=False)\n", - "wandb.login(key=os.environ['WANDB_API_KEY'], verify=True)\n", - "print('OK: HF + Wandb authenticated')" + "print('OK: HF authenticated')" ] }, { "cell_type": "markdown", "id": "a32d7ea4", - "metadata": {}, + "metadata": { + "id": "a32d7ea4" + }, "source": [ "## 5. Load dataset\n", "\n", @@ -256,8 +699,218 @@ "cell_type": "code", "execution_count": null, "id": "5f2a8c98", - "metadata": {}, - "outputs": [], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 684, + "referenced_widgets": [ + "29231af3a98a4913a229841d84b27422", + "27ce5b996e4742a7a835112d03a9ae17", + "eb3e7af58dc7441f9befff94cd837496", + "bd36a2a263244450b85a492f96d018fa", + "7fca6a24a44a45bb87e8cc4fd390403e", + "a3adefd3834347cdb48d9e3316a5ed48", + "a83dabfdb0324a9abc66b7bb47142fdc", + "778e34c12b4347d387dc53596a598fe2", + "bda8d508d0a24cdaab5782d2cc1335e8", + "897116c49c5c4c9591c2c77d7538e851", + "4f7701101cc24c2f90049a6fc0919d80", + "458d4b1b8efa47da9485514935fdbbf1", + "ad2af2ba3b334823a563ce1dd4b2c65f", + "8cf568edd88743b1a0cc66702873f5e6", + "c05ce0271f8e4dc7a0315601532ca955", + "4baef096df4242b48f3273c0ef46c648", + "6016e224b904438cbe154f26372d8c38", + "13d6cac54c3849f1afee12e0ef48dddf", + "b9374d73b2ac427e9c8d55949737bf4b", + "ac471c36448e42e6a4278eb212464d78", + "e1c8bb5ef082498b8fe0a66130e69035", + "481e292b38954268ace143e169dfca74", + "75124ef3b8c5400986ad002c88504834", + "bdde1deb5ae9491eae7b6152c81c059d", + "7848ff282e424293b99fc1ffc4cd2fc2", + "98925b8108c54ea28eb21503015989c1", + "d9f6cfc6a3f449b49907ff71ff293141", + "77770c5f10934573a6fbe934cfb9cb4d", + "a6dbc6baa4b44ca0b042c6449959a7f0", + "2ffe97ed07e54f17b353563bcdd48b41", + "20e75436cb7942e98f86392cb0378079", + "29da9ecefb744a6ebe187d6ad24a04ec", + "1d5e153fda8a4e38884d13b4b916edda", + "feebd174d6514ce69a24462b8cd314c4", + "3ad89276ef674026baca9d24d1296710", + "3d39bd5c62554dc98e37f26209681667", + "d8cd88776dd640b8a2790bd8222a32e5", + "2a30540f69414facb204ef8a7e6dea4a", + "376b785a2a0f425693df17708b72f866", + "13cba6f342194b9ca6288583f9ff7b7a", + "992500d0a88044f3be59f23920e19f46", + "4758f788c9894f0a94fe1263a23039b6", + "5f810f46fc1d4b93a9362bab5e1d02cb", + "eab6a31889534b9886ea848e324f1a93", + "72eecc7e741a41d695abed8c79cf885e", + "f834d546d5634bcabf4776770c6d8871", + "f5fe5f5074154467a6d5101f06b2dfc5", + "b52c54c6617d4f7294f843f02ab70f02", + "6425c2a961c74464a23986d7f52590bf", + "efeab27804f448febcf5335f0be8302d", + "c6ac84d0c64b4259be243b913caf652c", + "bd9250796f574171b657eb6da8880200", + "a6969e8ebd3d4f2aa1fb6d9153654a28", + "0ddc82e2462d4ad4b4661e55654352b3", + "275b2d90c0da458abbf59c963afb2e7e", + "de9c5e0f171e470c983d459e836ea96d", + "c08137d749274ddfa7d16d00038bbdcc", + "3a24f03afa3143448425861758e13de2", + "8a4eb795873c46188f85230e6a948795", + "14a182021a734a6399c7fd5d9da8e9c7", + "72ec2fb877254e0b9bb0b8a636c25187", + "f3ee5b5442b447539b1d7a72a9df1b58", + "ed4d26c9971d41ba821bcbf8c876c1cb", + "37f6fba6ad82421885e71b7cc4b42064", + "84eaa448117b41fcbfa3d68b0287540e", + "c73de00f6d4f456e8fb28a765df6a1fd", + "fbdf24206c1f4640be831670f4d29ed0", + "f530e71385fb41fbac41b8ac8c4e6d8e", + "e01e04ec36af435fa9af715377355e5a", + "4649e83451ae45fc9e47878075e04834", + "a9e1f270b5314d4ba6c0417313dbd226", + "73366bb0f86c4689828558a6db8160c2", + "70c43ae789a94fa8b686164510c86176", + "6332e4cac11e4456a57f49757ad7a243", + "c21a9c6799f94f3b9400ed220a0fc1e9", + "6c8e529410e94ce6af69ccfc3df6be6d", + "d97b2639afd9447eb61a6983cebe605a" + ] + }, + "id": "5f2a8c98", + "outputId": "d5057f0c-ffae-440f-d587-0cfec9dfe4b1" + }, + "outputs": [ + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "29231af3a98a4913a229841d84b27422", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "README.md: 0.00B [00:00, ?B/s]" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "458d4b1b8efa47da9485514935fdbbf1", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "data/train-00000-of-00001.parquet: 0%| | 0.00/1.92M [00:00 str:\n", " \"\"\"Strip fences/prose to find the first 'aws ...' line.\"\"\"\n", @@ -371,19 +1040,274 @@ { "cell_type": "markdown", "id": "264c8c94", - "metadata": {}, + "metadata": { + "id": "264c8c94" + }, "source": [ "## 7. Pre-SFT baseline eval\n", "\n", - "Load Qwen2.5-Coder-3B in 4-bit and run the eval set. This is our **\"before\"** snapshot \u2014 we'll compare against it after training." + "Load Qwen2.5-Coder-3B in 4-bit and run the eval set. This is our **\"before\"** snapshot — we'll compare against it after training." ] }, { "cell_type": "code", "execution_count": null, "id": "dd2ffb4b", - "metadata": {}, - "outputs": [], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 632, + "referenced_widgets": [ + "fd41dbbd73c5487d9b0d5e3751385225", + "3f871a98b3214aecb047e164dc4a2a5d", + "a419e0561e0f4b3da3f0eb8cb657755f", + "87273b19125e42d0ad471db11f600a15", + "170a45be12e84118b1499c2d5a6c1b49", + "73b2b5b571f448b6bc3bc99552b1c392", + "37924cda1a6446ffa7e3ed65c46fb0f2", + "db75caefb31b4f49876694c98de6a6ad", + "d2106145680e4083a0d3efae7309cbb8", + "b68f12d836a24d57b2708b476bfc71ad", + "3db2b92b2e844f229826b4c46dd1faf9", + "d08376eb6b62480cb85f4e0b62320210", + "5668a72966b841019572521c201ea4e2", + "1ad5f8440a414d3eb18484e567ec57e5", + "8946e4ccc6fa4cbc93fff996338aad43", + "636f00f102ee4601839ab20f63386777", + "895249c57814429e99f87e5d86907346", + "61ad1078a7cc40819cdad3bf68531b6c", + "94f05fcac46b45a88cf98017f1870ad8", + "4423b209ea8a439d9dc62bd0c85a055e", + "83e24d6711ab464daa46584dd6526e33", + "48c20c5564494cd5bac8ed6577bd91b0", + "4db1938146d24d3a8f267ad069c63baf", + "cc72718e8e344f99839589eec9388dc5", + "a336d465b4c146e68fb7f9e0414001e5", + "7309057341a74ca28a8bd6e9f1d8e0df", + "fe237eb64d7b4a71bf13753010e77cbb", + "383bb49d4cd34c2685a36c0965e9730b", + "6e1e9431d2da44648b11d4422814f4de", + "d98c35bbd1524d6bb5b3faec9f74de31", + "939163edb94b4620876de0deaf90d550", + "4c4456ede1364182b6b84bab9dbd0ceb", + "a90d649010ca43aebc1534822d3aee6a", + "75b9ddd94a41423baf0eae13d3c74f9b", + "6def0cb756d347cea530ec55079725f7", + "8582e647c2e24f91aef1aa10c80e561c", + "1bcdcc5cb631454d95ef3a2ca180fbda", + "ceb840afa0094d96a145df316807a345", + "c87be66de92644ca993361e6ca7a7cec", + "b1f7e2baa64e461e928854bde8ca37da", + "b0e7dc59392242baaad8d4ba599646e2", + "241038e98d724ee5b15b20682725b1ec", + "6f8cc86dadfa4e47a4e3ec2aeb9ef0da", + "6d290f1a029d409999a4d4f9dad9af00", + "98980e3258f148ae80e89c0b23847336", + "fcbdd1e084124303be96ca0a89a8e293", + "00ebf205de7145699686bf127480ec74", + "bb5dea14dc0c420fa06ffda49187f503", + "7e9cff4098c64cf9b95d105e1aff748c", + "512998b463a04362a4d618f503ceb95c", + "2e7179f8d86740689b94aa8af55f403d", + "4d02b3371c1d4bd6a2dd7e9df50d227b", + "4c03c750722344faad6a2636dcf2a8c4", + "e1a49fe3dcfe4c518055364a3b9654b1", + "530347c79cab4606835a0b7302e35f5b", + "857fc23cb42c4e5297b6cbc12f42bfb1", + "afbec639658a4db09b968424a52074f9", + "fa9a37a523ec459e8d02007b55b1ba20", + "f9f7b1fc79dc4bee9b6a0a946ff39bb2", + "bf421ed09e4d42c3b906c51f159eaa2c", + "f0e4397588a847af90236075a3065ac7", + "83d5c8137daf43f08389eaa70861637f", + "df691f3fe6d84515aea9eba173c19208", + "609b59d6e0544e39a92d47ef036baf47", + "1056869d6f2048b38e79ab0bdddf0d55", + "1c846669e92d4d3a9cd91c408809ba69", + "31f6a413168f45a5ab84a3e764013d78", + "ccd9559fb88e4d6ab05f4d4f47a9e364", + "f31c8cc62d4c401d8a865e6caad20c38", + "1af65eaea1dc47e49ba71128f8cc7043", + "66c2a12960974935949e3186d50d2e45", + "5d6c9aa373cb457b84bf0818e880374f", + "048621e84d3a417f803f7a3e944234a6", + "eef7a636fa3d45b0865133884b93eea9", + "9d9e8a585584449fbc2982735731b96e", + "9edb47ef9a4e4348b0e99d302f1308eb", + "c377f4bbadda4ca9a50769e7b7b83d1d", + "57553e43d221422d921c4212d71ad972", + "5463570fd1ad4f43af5e5d4a14e5bbb1", + "8d3afe0c4db14a9ab7234230d9f12e3e", + "8a6323e9aa7342e1ab3337f24a48d61e", + "21b3fb6c19f54448a9e20ece85600a5b", + "643b5f3367fc475aba8eeffe6091032c", + "e67201215c274e8684c1c088bb7edc37", + "d95d024f4dcb4bc5b0dfa92259ede3e5", + "5e2d63577b9846649c53977c1e5f67e5", + "636cba5df88940e2b92525b4c2ea00b6", + "a6f703306605483c9fe86cc203e73a5d" + ] + }, + "id": "dd2ffb4b", + "outputId": "63999ae7-fba5-469a-bd32-76385896f53f" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🦥 Unsloth: Will patch your computer to enable 2x faster free finetuning.\n", + "🦥 Unsloth Zoo will now patch everything to make training faster!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:unsloth_zoo.log:Unsloth: Could not patch trl.trainer.gkd_trainer: Direct module loading failed for UnslothGKDTrainer: parameter without a default follows parameter with a default (UnslothGKDTrainer.py, line 962)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "==((====))== Unsloth 2026.4.7: Fast Qwen2 patching. Transformers: 4.57.6.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "fd41dbbd73c5487d9b0d5e3751385225", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "model.safetensors: 0%| | 0.00/2.05G [00:00" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Tracking run with wandb version 0.26.0" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Run data is saved locally in /content/wandb/run-20260422_235902-zu5yyufj" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Syncing run optuna-trial-0 to Weights & Biases (docs)
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View project at https://wandb.ai/sizzing-sizzing/AWS-RL-SFT" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View run at https://wandb.ai/sizzing-sizzing/AWS-RL-SFT/runs/zu5yyufj" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "wandb: Detected [huggingface_hub.inference, openai] in use.\n", + "wandb: Use W&B Weave for improved LLM call tracing. Install Weave with `pip install weave` then add `import weave` to the top of your script.\n", + "wandb: For more information, check out the docs at: https://weave-docs.wandb.ai\n" + ] + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [32/32 03:08, Epoch 1/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
EpochTraining LossValidation Loss
10.1000000.052316

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [20/20 00:12]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "

Run history:


eval/loss█▁
eval/runtime█▁
eval/samples_per_second▁█
eval/steps_per_second▁█
train/epoch▁███
train/global_step▁███
train/grad_norm
train/learning_rate
train/loss

Run summary:


eval/loss0.05231
eval/runtime13.5339
eval/samples_per_second5.911
eval/steps_per_second1.478
total_flos2946293207040000.0
train/epoch1
train/global_step32
train/grad_norm0.1389
train/learning_rate8e-05
train/loss0.1
+4...

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View run optuna-trial-0 at: https://wandb.ai/sizzing-sizzing/AWS-RL-SFT/runs/zu5yyufj
View project at: https://wandb.ai/sizzing-sizzing/AWS-RL-SFT
Synced 5 W&B file(s), 0 media file(s), 0 artifact file(s) and 0 other file(s)" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Find logs at: ./wandb/run-20260422_235902-zu5yyufj/logs" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[I 2026-04-23 00:02:42,889] Trial 0 finished with value: 0.05230738967657089 and parameters: {'lora_r': 16, 'lora_alpha_mul': 1, 'lora_dropout': 0.005808361216819946, 'learning_rate': 0.00040311702880369243, 'warmup_ratio': 0.1}. Best is trial 0 with value: 0.05230738967657089.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Trial 0: r=16 alpha=16 dropout=0.006 lr=4.03e-04 warmup=0.1 -> eval_loss=0.0523\n", + "==((====))== Unsloth 2026.4.7: Fast Qwen2 patching. Transformers: 4.57.6.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unsloth: Dropout = 0 is supported for fast patching. You are using dropout = 0.030424224295953775.\n", + "Unsloth will patch all other layers, except LoRA matrices, causing a performance hit.\n", + "/usr/local/lib/python3.12/dist-packages/unsloth/models/_utils.py:2331: FutureWarning: `tokenizer` is deprecated and will be removed in version 5.0.0 for `UnslothSFTTrainer.__init__`. Use `processing_class` instead.\n", + " _original_trainer_init(self, *args, **kwargs)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🦥 Unsloth: Padding-free auto-enabled, enabling faster training.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 500 | Num Epochs = 1 | Total steps = 32\n", + "O^O/ \\_/ \\ Batch size per device = 2 | Gradient accumulation steps = 8\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (2 x 8 x 1) = 16\n", + " \"-____-\" Trainable parameters = 7,372,800 of 3,093,311,488 (0.24% trained)\n" + ] + }, + { + "data": { + "text/html": [], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Tracking run with wandb version 0.26.0" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Run data is saved locally in /content/wandb/run-20260423_000304-pfrd9n61" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Syncing run optuna-trial-1 to Weights & Biases (docs)
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View project at https://wandb.ai/sizzing-sizzing/AWS-RL-SFT" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View run at https://wandb.ai/sizzing-sizzing/AWS-RL-SFT/runs/pfrd9n61" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [32/32 03:03, Epoch 1/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
EpochTraining LossValidation Loss
10.1145000.078962

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [20/20 00:12]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "

Run history:


eval/loss█▁
eval/runtime█▁
eval/samples_per_second▁█
eval/steps_per_second▁█
train/epoch▁███
train/global_step▁███
train/grad_norm
train/learning_rate
train/loss

Run summary:


eval/loss0.07896
eval/runtime13.5401
eval/samples_per_second5.908
eval/steps_per_second1.477
total_flos2946293207040000.0
train/epoch1
train/global_step32
train/grad_norm0.14956
train/learning_rate4e-05
train/loss0.1145
+4...

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View run optuna-trial-1 at: https://wandb.ai/sizzing-sizzing/AWS-RL-SFT/runs/pfrd9n61
View project at: https://wandb.ai/sizzing-sizzing/AWS-RL-SFT
Synced 4 W&B file(s), 0 media file(s), 0 artifact file(s) and 0 other file(s)" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Find logs at: ./wandb/run-20260423_000304-pfrd9n61/logs" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[I 2026-04-23 00:06:32,284] Trial 1 finished with value: 0.0789594054222107 and parameters: {'lora_r': 16, 'lora_alpha_mul': 1, 'lora_dropout': 0.030424224295953775, 'learning_rate': 0.0002326960468194962, 'warmup_ratio': 0.03}. Best is trial 0 with value: 0.05230738967657089.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Trial 1: r=16 alpha=16 dropout=0.030 lr=2.33e-04 warmup=0.03 -> eval_loss=0.0790\n", + "==((====))== Unsloth 2026.4.7: Fast Qwen2 patching. Transformers: 4.57.6.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unsloth: Dropout = 0 is supported for fast patching. You are using dropout = 0.019967378215835975.\n", + "Unsloth will patch all other layers, except LoRA matrices, causing a performance hit.\n", + "/usr/local/lib/python3.12/dist-packages/unsloth/models/_utils.py:2331: FutureWarning: `tokenizer` is deprecated and will be removed in version 5.0.0 for `UnslothSFTTrainer.__init__`. Use `processing_class` instead.\n", + " _original_trainer_init(self, *args, **kwargs)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🦥 Unsloth: Padding-free auto-enabled, enabling faster training.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 500 | Num Epochs = 1 | Total steps = 32\n", + "O^O/ \\_/ \\ Batch size per device = 2 | Gradient accumulation steps = 8\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (2 x 8 x 1) = 16\n", + " \"-____-\" Trainable parameters = 3,686,400 of 3,089,625,088 (0.12% trained)\n" + ] + }, + { + "data": { + "text/html": [], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Tracking run with wandb version 0.26.0" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Run data is saved locally in /content/wandb/run-20260423_000654-dh2eeaxk" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Syncing run optuna-trial-2 to Weights & Biases (docs)
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View project at https://wandb.ai/sizzing-sizzing/AWS-RL-SFT" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View run at https://wandb.ai/sizzing-sizzing/AWS-RL-SFT/runs/dh2eeaxk" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [32/32 03:03, Epoch 1/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
EpochTraining LossValidation Loss
10.0966000.058720

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [20/20 00:12]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "

Run history:


eval/loss▁█
eval/runtime█▁
eval/samples_per_second▁█
eval/steps_per_second▁█
train/epoch▁███
train/global_step▁███
train/grad_norm
train/learning_rate
train/loss

Run summary:


eval/loss0.05872
eval/runtime13.3861
eval/samples_per_second5.976
eval/steps_per_second1.494
total_flos2942389309440000.0
train/epoch1
train/global_step32
train/grad_norm0.31422
train/learning_rate4e-05
train/loss0.0966
+4...

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View run optuna-trial-2 at: https://wandb.ai/sizzing-sizzing/AWS-RL-SFT/runs/dh2eeaxk
View project at: https://wandb.ai/sizzing-sizzing/AWS-RL-SFT
Synced 4 W&B file(s), 0 media file(s), 0 artifact file(s) and 0 other file(s)" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Find logs at: ./wandb/run-20260423_000654-dh2eeaxk/logs" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[I 2026-04-23 00:10:20,691] Trial 2 finished with value: 0.05872423201799393 and parameters: {'lora_r': 8, 'lora_alpha_mul': 4, 'lora_dropout': 0.019967378215835975, 'learning_rate': 0.00022878863522445903, 'warmup_ratio': 0.03}. Best is trial 0 with value: 0.05230738967657089.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Trial 2: r=8 alpha=32 dropout=0.020 lr=2.29e-04 warmup=0.03 -> eval_loss=0.0587\n", + "==((====))== Unsloth 2026.4.7: Fast Qwen2 patching. Transformers: 4.57.6.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unsloth: Dropout = 0 is supported for fast patching. You are using dropout = 0.03046137691733707.\n", + "Unsloth will patch all other layers, except LoRA matrices, causing a performance hit.\n", + "/usr/local/lib/python3.12/dist-packages/unsloth/models/_utils.py:2331: FutureWarning: `tokenizer` is deprecated and will be removed in version 5.0.0 for `UnslothSFTTrainer.__init__`. Use `processing_class` instead.\n", + " _original_trainer_init(self, *args, **kwargs)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🦥 Unsloth: Padding-free auto-enabled, enabling faster training.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 500 | Num Epochs = 1 | Total steps = 32\n", + "O^O/ \\_/ \\ Batch size per device = 2 | Gradient accumulation steps = 8\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (2 x 8 x 1) = 16\n", + " \"-____-\" Trainable parameters = 3,686,400 of 3,089,625,088 (0.12% trained)\n" + ] + }, + { + "data": { + "text/html": [], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Tracking run with wandb version 0.26.0" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Run data is saved locally in /content/wandb/run-20260423_001042-jep5c7sz" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Syncing run optuna-trial-3 to Weights & Biases (docs)
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View project at https://wandb.ai/sizzing-sizzing/AWS-RL-SFT" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View run at https://wandb.ai/sizzing-sizzing/AWS-RL-SFT/runs/jep5c7sz" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [32/32 03:04, Epoch 1/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
EpochTraining LossValidation Loss
10.1456000.119793

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [20/20 00:12]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "

Run history:


eval/loss▁█
eval/runtime█▁
eval/samples_per_second▁█
eval/steps_per_second▁█
train/epoch▁███
train/global_step▁███
train/grad_norm
train/learning_rate
train/loss

Run summary:


eval/loss0.11986
eval/runtime13.5701
eval/samples_per_second5.895
eval/steps_per_second1.474
total_flos2942389309440000.0
train/epoch1
train/global_step32
train/grad_norm0.253
train/learning_rate2e-05
train/loss0.1456
+4...

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View run optuna-trial-3 at: https://wandb.ai/sizzing-sizzing/AWS-RL-SFT/runs/jep5c7sz
View project at: https://wandb.ai/sizzing-sizzing/AWS-RL-SFT
Synced 4 W&B file(s), 0 media file(s), 0 artifact file(s) and 0 other file(s)" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Find logs at: ./wandb/run-20260423_001042-jep5c7sz/logs" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[I 2026-04-23 00:14:09,403] Trial 3 finished with value: 0.11985526233911514 and parameters: {'lora_r': 8, 'lora_alpha_mul': 2, 'lora_dropout': 0.03046137691733707, 'learning_rate': 0.00011702263636127808, 'warmup_ratio': 0.03}. Best is trial 0 with value: 0.05230738967657089.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Trial 3: r=8 alpha=16 dropout=0.030 lr=1.17e-04 warmup=0.03 -> eval_loss=0.1199\n", + "==((====))== Unsloth 2026.4.7: Fast Qwen2 patching. Transformers: 4.57.6.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unsloth: Dropout = 0 is supported for fast patching. You are using dropout = 0.031171107608941095.\n", + "Unsloth will patch all other layers, except LoRA matrices, causing a performance hit.\n", + "/usr/local/lib/python3.12/dist-packages/unsloth/models/_utils.py:2331: FutureWarning: `tokenizer` is deprecated and will be removed in version 5.0.0 for `UnslothSFTTrainer.__init__`. Use `processing_class` instead.\n", + " _original_trainer_init(self, *args, **kwargs)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🦥 Unsloth: Padding-free auto-enabled, enabling faster training.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 500 | Num Epochs = 1 | Total steps = 32\n", + "O^O/ \\_/ \\ Batch size per device = 2 | Gradient accumulation steps = 8\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (2 x 8 x 1) = 16\n", + " \"-____-\" Trainable parameters = 7,372,800 of 3,093,311,488 (0.24% trained)\n" + ] + }, + { + "data": { + "text/html": [], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Tracking run with wandb version 0.26.0" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Run data is saved locally in /content/wandb/run-20260423_001430-wvylgkh8" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Syncing run optuna-trial-4 to Weights & Biases (docs)
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View project at https://wandb.ai/sizzing-sizzing/AWS-RL-SFT" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View run at https://wandb.ai/sizzing-sizzing/AWS-RL-SFT/runs/wvylgkh8" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [32/32 03:03, Epoch 1/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
EpochTraining LossValidation Loss
10.1148000.079328

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [20/20 00:12]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "

Run history:


eval/loss▁█
eval/runtime█▁
eval/samples_per_second▁█
eval/steps_per_second▁█
train/epoch▁███
train/global_step▁███
train/grad_norm
train/learning_rate
train/loss

Run summary:


eval/loss0.07934
eval/runtime13.4903
eval/samples_per_second5.93
eval/steps_per_second1.483
total_flos2946293207040000.0
train/epoch1
train/global_step32
train/grad_norm0.14956
train/learning_rate4e-05
train/loss0.1148
+4...

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View run optuna-trial-4 at: https://wandb.ai/sizzing-sizzing/AWS-RL-SFT/runs/wvylgkh8
View project at: https://wandb.ai/sizzing-sizzing/AWS-RL-SFT
Synced 4 W&B file(s), 0 media file(s), 0 artifact file(s) and 0 other file(s)" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Find logs at: ./wandb/run-20260423_001430-wvylgkh8/logs" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[I 2026-04-23 00:17:57,673] Trial 4 finished with value: 0.0793430432677269 and parameters: {'lora_r': 16, 'lora_alpha_mul': 1, 'lora_dropout': 0.031171107608941095, 'learning_rate': 0.00023094679892576625, 'warmup_ratio': 0.03}. Best is trial 0 with value: 0.05230738967657089.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Trial 4: r=16 alpha=16 dropout=0.031 lr=2.31e-04 warmup=0.03 -> eval_loss=0.0793\n", + "==((====))== Unsloth 2026.4.7: Fast Qwen2 patching. Transformers: 4.57.6.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Unsloth: Dropout = 0 is supported for fast patching. You are using dropout = 0.00884925020519195.\n", + "Unsloth will patch all other layers, except LoRA matrices, causing a performance hit.\n", + "/usr/local/lib/python3.12/dist-packages/unsloth/models/_utils.py:2331: FutureWarning: `tokenizer` is deprecated and will be removed in version 5.0.0 for `UnslothSFTTrainer.__init__`. Use `processing_class` instead.\n", + " _original_trainer_init(self, *args, **kwargs)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "🦥 Unsloth: Padding-free auto-enabled, enabling faster training.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 500 | Num Epochs = 1 | Total steps = 32\n", + "O^O/ \\_/ \\ Batch size per device = 2 | Gradient accumulation steps = 8\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (2 x 8 x 1) = 16\n", + " \"-____-\" Trainable parameters = 3,686,400 of 3,089,625,088 (0.12% trained)\n" + ] + }, + { + "data": { + "text/html": [], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Tracking run with wandb version 0.26.0" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Run data is saved locally in /content/wandb/run-20260423_001819-n06qegrd" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Syncing run optuna-trial-5 to Weights & Biases (docs)
" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View project at https://wandb.ai/sizzing-sizzing/AWS-RL-SFT" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View run at https://wandb.ai/sizzing-sizzing/AWS-RL-SFT/runs/n06qegrd" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [32/32 03:15, Epoch 1/1]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
EpochTraining LossValidation Loss
10.1225000.082837

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [20/20 00:12]\n", + "
\n", + " " + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "

Run history:


eval/loss█▁
eval/runtime█▁
eval/samples_per_second▁█
eval/steps_per_second▁█
train/epoch▁███
train/global_step▁███
train/grad_norm
train/learning_rate
train/loss

Run summary:


eval/loss0.08283
eval/runtime13.5748
eval/samples_per_second5.893
eval/steps_per_second1.473
total_flos2942389309440000.0
train/epoch1
train/global_step32
train/grad_norm0.32769
train/learning_rate3e-05
train/loss0.1225
+4...

" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + " View run optuna-trial-5 at: https://wandb.ai/sizzing-sizzing/AWS-RL-SFT/runs/n06qegrd
View project at: https://wandb.ai/sizzing-sizzing/AWS-RL-SFT
Synced 4 W&B file(s), 0 media file(s), 0 artifact file(s) and 0 other file(s)" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "Find logs at: ./wandb/run-20260423_001819-n06qegrd/logs" + ], + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "[I 2026-04-23 00:21:57,943] Trial 5 finished with value: 0.08283159881830215 and parameters: {'lora_r': 8, 'lora_alpha_mul': 4, 'lora_dropout': 0.00884925020519195, 'learning_rate': 0.0001370838023704289, 'warmup_ratio': 0.1}. Best is trial 0 with value: 0.05230738967657089.\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + " Trial 5: r=8 alpha=32 dropout=0.009 lr=1.37e-04 warmup=0.1 -> eval_loss=0.0828\n", + "\n", + "=== OPTUNA RESULTS ===\n", + "Best eval_loss : 0.0523\n", + "Best trial : #0\n", + "Best params :\n", + " lora_r 16\n", + " lora_alpha_mul 1\n", + " lora_dropout 0.005808361216819946\n", + " learning_rate 0.00040311702880369243\n", + " warmup_ratio 0.1\n" + ] + } + ], "source": [ "study = optuna.create_study(\n", " direction='minimize',\n", @@ -627,44 +3101,57 @@ { "cell_type": "markdown", "id": "21d9c33e", - "metadata": {}, + "metadata": { + "id": "21d9c33e" + }, "source": [ "## 10. Optuna plots\n", "\n", - "Three views for the judges:\n", + "Five views, all rendered with matplotlib and saved as PNGs to `OUT_DIR/plots/`:\n", "\n", - "1. **Optimization history** \u2014 did later trials converge on lower loss?\n", - "2. **Parallel coordinates** \u2014 which hparam combinations trend toward low loss?\n", - "3. **Param importances** \u2014 which knob mattered most?" + "1. **Optimization history** — did later trials converge on lower loss?\n", + "2. **Param importances** — which knob mattered most (fANOVA-style)?\n", + "3. **Parallel coordinates** — which hparam combinations trend toward low loss?\n", + "4. **Slice plot** — per-parameter scatter against the objective.\n", + "5. **Per-trial loss curves** — overlay every trial's training/eval loss to see how the search space behaved during fitting." ] }, { "cell_type": "code", "execution_count": null, "id": "90d27d5b", - "metadata": {}, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "id": "90d27d5b", + "outputId": "96cdda6f-79f0-44fc-dd02-70368ed5bff9" + }, "outputs": [], "source": [ - "from optuna.visualization import (\n", - " plot_optimization_history, plot_parallel_coordinate, plot_param_importances,\n", - ")\n", - "\n", - "plot_optimization_history(study).show()\n", - "plot_parallel_coordinate(study).show()\n", - "plot_param_importances(study).show()" + "# All Optuna views as matplotlib PNGs in OUT_DIR/plots/.\n", + "# Each helper renders inline AND saves to disk; see PLOTS_DIR for the files.\n", + "plot_optuna_history(study)\n", + "plot_optuna_param_importances(study)\n", + "plot_optuna_parallel_coordinates(study)\n", + "plot_optuna_slice(study)\n", + "plot_optuna_trial_loss_curves(study)" ] }, { "cell_type": "markdown", "id": "7323c278", - "metadata": {}, + "metadata": { + "id": "7323c278" + }, "source": [ - "## 11. Final SFT run \u2014 best hparams, full data, checkpointed\n", + "## 11. Final SFT run — best hparams, full data, checkpointed\n", "\n", "- Full dataset (1500 train / 150 val)\n", "- 2 epochs (vs. 1 during search)\n", "- Checkpoints saved every 50 steps; last 3 kept (`save_total_limit=3`)\n", - "- `load_best_model_at_end=True` \u2014 final model = lowest eval_loss checkpoint, not last\n", + "- `load_best_model_at_end=True` — final model = lowest eval_loss checkpoint, not last\n", "- **Resume-safe**: if the session dies, rerunning this cell picks up from the latest `checkpoint-*/`" ] }, @@ -672,7 +3159,104 @@ "cell_type": "code", "execution_count": null, "id": "cbeb9145", - "metadata": {}, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 874, + "referenced_widgets": [ + "8ba25aaf330e4cecb4940f51ce4c2d91", + "a11421346cb544c3ae79e49143b3ff98", + "59cb2a9a1e0f474fb0759dce2e9254b4", + "6fa8f54bd32c4c05b39643df321bf826", + "45efca052b0948659037c654d3fa4cfc", + "b7d9cf67d7ee44ffb77a45fd4e6fe32f", + "01e6e5c1ca6b46e38b90c3437b2a338a", + "f02d91e96fe84c0781b1c6e17fd537ae", + "5aa8c08833564830a597642fdee68611", + "6acc17dc21b84d0e9d91605f8e76e1ce", + "8ce3dac1705c4d608474c0b2b29ef16c", + "2149d1d6bb244d4db8d53d5c16649563", + "0e757f51fc684a33b871c6654f1bc520", + "e86a2ac8f7d543b1ae3ecbc2f4e560f7", + "1c4fd41612f4466b853c66cfc8b77427", + "aa058deba06246f1b0003d7b073c8b1c", + "5438f243332143e38cea9fe6ac6acf40", + "f74e56c5f86046d8812584b3f4b460ce", + "f16acd23373845d3894da4abf9500e0f", + "d2babfe551ed49f9809a535092e078e4", + "601e2da7c2f3466c907c6dc975904974", + "bc086dd51c684413bcb3e40183290786", + "24df48e26dde45c78e01649c8b9b68b4", + "315ae3dd2bd441b0be55ab63d71cf2f3", + "2e2b3a77fa2444528c88527ce662ebcc", + "9531b4bcfab345b7b0235c422e7f8c18", + "2d740eedcf154502ab8ea9651603d816", + "a108eb483f0e4ed0ae36e77e2b269ce6", + "6069750771574e9c9d641c4e97d0f1a4", + "d5a7f54aab804d7c998694863e366900", + "5ae30524dc344783a7b546ac4c403239", + "b957a5477fc54821a8112428690ca3f8", + "7d3a823c2d45490e9e9505d3e399aeff", + "7f3c543649714b99a9565399839ba5e1", + "6cdce07c0aae4c80b63ba7c312c15999", + "45f43e003da84552b733938e93e76575", + "3ca5a40ba10f4ad09b23ee0339607696", + "64770e809d234b958d990ad9db262f86", + "839bcd34b3d1455c9b168f3c0eb7ee48", + "f46385b2c5dd46ebae4f130e22bc2b51", + "6cfd94dbb7a84ddf9cada7c2760a2264", + "5b6113c58c8b49459b9fe02794b461d4", + "4b3da87ff3884fbabe0e6e05af82679a", + "2e8fd49cd671471c8e59c8f2b0ecde5b", + "95d4d9080e17430687b4a52e7b704ac1", + "514d072373ed49d6900888c63d959d39", + "cff8893cc6d2490cbb1c903f22d85772", + "8874182d6efb466f9551c71306e87be2", + "00d34d841ca74436aae9d727781deb95", + "4c5ad75f54da4638a49f5d7b91a80675", + "3bedf84e5b124ca882242272cabede5c", + "90cfd352cfce435a9fb4c2ca4506ef81", + "91e66dab350841299c8785795c380366", + "8afebc1ba6cc47868b3caa994d271e2a", + "8e8c8c3211484f63a499bbe3d5f0b63d", + "875f7ae9afab4421bdeacdec71be326a", + "42c06ae8171840c8b1c73b5b489d25a7", + "7456f76578b944ec98a79f0b0dc6de65", + "45a4dce069c5478ab52ce3a35b21123c", + "3fec3c13e9224c35aef5fce6f6108e34", + "397f468d7aff48618720f3e06b9284ed", + "7a6c64ca6c284301b4308fe3f2fe9bcb", + "46e1e61959b94777953aa2dd43997a4e", + "35ed6c346ecf445f8b9307546af0b17b", + "6945c712815142f4b78b3ab735646f6e", + "a6343a6d1db84aa180e2cd42376dad35", + "00b580c294954b7789e5ec131b554bb0", + "55f2f5c7da47473497cccd4591f6f1b2", + "cd36d12e348f438e81d1def580ddc3bb", + "c7e6eb783c8f465dba5ffe4912db0735", + "0b5b82b219a8493badb13a0de16120d8", + "b2f24deee752408c9c11652cf60a84d3", + "db50c8f9fcd64b1391c751ee7697e23d", + "1c7903362174485aa575d018201c4352", + "c14897b6216b47038f9b1b5bdb941467", + "79520fc6e14b4fb7a20f4eca948dede0", + "290efeeadcc0488994d0bf7d32f4e57b", + "ba4a487089554097a60c839774eb6312", + "99c64e4279264453b7bf06e578ba7025", + "0db1cdbbb47a4d0aa8654678cda5e5c8", + "47487ef40fba4b01a29038c332fdbe6e", + "297df3af99124fe98b6699137b5f3cd8", + "51fab6cbb2574f828d0ae4b8431eeda0", + "73f33acaacc846e5b22e00e94dff8743", + "3848ca58a1b24b0489c0ed2ac572d9a2", + "497d07100389476fb3e68a6fe20e04dd", + "b8789c36105a4c6d91aa8f2f8aa2182d", + "4600b1a835694f13b580c2306d0c267b" + ] + }, + "id": "cbeb9145", + "outputId": "0f4b26e4-8a29-4de8-a86e-44de8c7831f4" + }, "outputs": [], "source": [ "# Ensure the Transformers 5.x shim is in place (idempotent).\n", @@ -716,7 +3300,7 @@ "# --- Render the full dataset with the chat template ---\n", "full_train = ds['train'].map(lambda ex: _render_messages(ex, tokenizer))\n", "full_val = ds['validation'].map(lambda ex: _render_messages(ex, tokenizer))\n", - "# Drop metadata then pre-tokenize \u2014 leaves only numeric columns for the collator.\n", + "# Drop metadata then pre-tokenize — leaves only numeric columns for the collator.\n", "full_train = full_train.remove_columns([c for c in full_train.column_names if c != 'text'])\n", "full_val = full_val.remove_columns([c for c in full_val.column_names if c != 'text'])\n", "def _tokenize_batch(batch):\n", @@ -739,9 +3323,9 @@ " resume_ckpt = str(existing[-1])\n", " print(f'Resuming from checkpoint: {resume_ckpt}')\n", " else:\n", - " print('No checkpoint found \u2014 starting fresh')\n", + " print('No checkpoint found — starting fresh')\n", "else:\n", - " print('No prior training dir \u2014 starting fresh')\n", + " print('No prior training dir — starting fresh')\n", "\n", "final_trainer = SFTTrainer(\n", " model=model,\n", @@ -772,13 +3356,13 @@ " load_best_model_at_end=True,\n", " metric_for_best_model='eval_loss',\n", " greater_is_better=False,\n", - " report_to='wandb',\n", + " report_to='none',\n", " run_name='final-sft',\n", " seed=CONFIG['seed'],\n", " dataset_num_proc=1,\n", " ),\n", ")\n", - "# Completion-only loss \u2014 same masking as Optuna trials\n", + "# Completion-only loss — same masking as Optuna trials\n", "final_trainer = train_on_responses_only(\n", " final_trainer,\n", " instruction_part='<|im_start|>user\\n',\n", @@ -793,9 +3377,39 @@ }, { "cell_type": "markdown", + "id": "707ab49e", + "source": [ + "## 11a. Final SFT — training curves\n", + "\n", + "The trainer's `log_history` carries every logged step (loss, eval_loss, learning_rate, grad_norm). Render it as a 2×2 grid and save to `OUT_DIR/plots/final_training_curves.png`." + ], + "metadata": {} + }, + { + "cell_type": "code", + "id": "fa46b4b1", + "source": [ + "# Final SFT — training curves\n", + "# (train + eval loss, learning-rate schedule, gradient-norm) extracted from\n", + "# trainer.state.log_history. Saved to OUT_DIR/plots/final_training_curves.png.\n", + "plot_training_curves(\n", + " list(final_trainer.state.log_history),\n", + " title='Final SFT — training curves (full dataset, best Optuna params)',\n", + " save_name='final_training_curves',\n", + ")" + ], "metadata": {}, + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "id": "kRib4wOVkQdh", + "metadata": { + "id": "kRib4wOVkQdh" + }, "source": [ - "## 12. Post-SFT eval \u2014 the delta that matters\n", + "## 12. Post-SFT eval — the delta that matters\n", "\n", "Same prompts as the baseline. This is the headline table for judges." ] @@ -803,7 +3417,14 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, + "id": "uOmvY2y_kQdh", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "uOmvY2y_kQdh", + "outputId": "e33f9f51-2439-43c9-b9a9-708abb482bfa" + }, "outputs": [], "source": [ "FastLanguageModel.for_inference(model)\n", @@ -832,18 +3453,18 @@ " 'delta': {k: posttrain_metrics[k] - baseline_metrics[k] for k in metric_keys},\n", " }, f, indent=2)\n", "\n", - "# Log the headline deltas to wandb so they show up in the final run's summary panel\n", - "wandb.log({\n", - " 'delta/format_pct': posttrain_metrics['format_pct'] - baseline_metrics['format_pct'],\n", - " 'delta/exact_pct': posttrain_metrics['exact_pct'] - baseline_metrics['exact_pct'],\n", - " 'delta/operation_pct': posttrain_metrics['operation_pct'] - baseline_metrics['operation_pct'],\n", - " 'delta/service_pct': posttrain_metrics['service_pct'] - baseline_metrics['service_pct'],\n", - "})" + "# Render baseline-vs-SFT grouped bars + Δpp delta bars; saved to\n", + "# OUT_DIR/plots/eval_metrics_comparison.png. The JSON dump above keeps the\n", + "# raw numbers for any downstream comparison.\n", + "plot_eval_comparison(baseline_metrics, posttrain_metrics)" ] }, { "cell_type": "markdown", - "metadata": {}, + "id": "Wp7ycEItkQdh", + "metadata": { + "id": "Wp7ycEItkQdh" + }, "source": [ "## 13. Inspect a few post-SFT generations\n", "\n", @@ -853,8 +3474,41 @@ { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], + "id": "OovPADlKkQdh", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "OovPADlKkQdh", + "outputId": "d50dd10c-4135-49f6-fe79-a8a7ef7bb807" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Post-SFT generations vs canonical:\n", + "\n", + " [OK] expected : 'aws route53 list-hosted-zones'\n", + " generated: 'aws route53 list-hosted-zones'\n", + "\n", + " [OK] expected : 'aws dynamodb put-item --table-name orders --item \\'{\"order_id\":{\"S\":\"001\"},\"status\":{\"S\":\"pending\"}}\\''\n", + " generated: 'aws dynamodb put-item --table-name orders --item \\'{\"order_id\":{\"S\":\"001\"},\"status\":{\"S\":\"pending\"}}\\''\n", + "\n", + " [~ ] expected : 'aws help --task-hint'\n", + " generated: 'aws lambda create-function --function-name scheduled-task --runtime python3.12 --handler index.handl'\n", + "\n", + " [OK] expected : 'aws sns create-topic --name notifications'\n", + " generated: 'aws sns create-topic --name notifications'\n", + "\n", + " [OK] expected : 'aws apigatewayv2 create-api --name payments-api --protocol-type HTTP'\n", + " generated: 'aws apigatewayv2 create-api --name payments-api --protocol-type HTTP'\n", + "\n", + " [OK] expected : 'aws s3api create-bucket --bucket firehose-delivery'\n", + " generated: 'aws s3api create-bucket --bucket firehose-delivery'\n" + ] + } + ], "source": [ "print('Post-SFT generations vs canonical:')\n", "for r in posttrain_metrics['_per_row'][:6]:\n", @@ -865,18 +3519,228 @@ }, { "cell_type": "markdown", - "metadata": {}, + "id": "7vLaN97EkQdh", + "metadata": { + "id": "7vLaN97EkQdh" + }, "source": [ "## 14. Push LoRA adapter to Hugging Face Hub\n", "\n", - "Just the adapter \u2014 ~60MB instead of the full 3B (~6GB). Consumers will apply it on top of `Qwen/Qwen2.5-Coder-3B-Instruct` at inference time." + "Just the adapter — ~60MB instead of the full 3B (~6GB). Consumers will apply it on top of `Qwen/Qwen2.5-Coder-3B-Instruct` at inference time." ] }, { "cell_type": "code", "execution_count": null, - "metadata": {}, - "outputs": [], + "id": "HzjnMLBMkQdh", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 315, + "referenced_widgets": [ + "b15fcea90a104c5a8fa21646638b0a12", + "bc6c6aee6b6d4cd3afe76dd00245f8db", + "49c2f2ae112f4133a434b6274ca9ffd0", + "871a4878c903463289a2283b5f649d00", + "8ea83d7a46d84e37a28890d5c61109cf", + "dd6994f094df444c9c62f84fd2da82af", + "2d642e51abf547849f6584d35b5d7a70", + "c0bc942b2dec498480f6e19344c4d203", + "30ca70060ebd492390750750e5c677bf", + "3e9b15dda7bf48c3aae394f0d68e2b10", + "9dcb1c84d9384ab3b0d9ad681646e4e9", + "003ae8232ede408d8f51453bdc63f96e", + "5c796d225e474ae2940c9106b9d64938", + "9a45bc9a77c94a66b1ff7256e8231088", + "e91e918d37a14b28beb9e16f012458f5", + "9b33c99b889543a19eef2316ac5ab0fe", + "2978d0d591544b74a9b1fc816e430e43", + "f50bbeaadfe1453fb7880dc8d725fefb", + "648646594ca74b69a29ace1fed5db1be", + "c313a139e75c4953ab62b75752bcc5d7", + "689257af48194add88f3462e44a9c9a7", + "b3f3175c19c74344a406aff51a048139", + "0ffa028e2b1e4bcdaa441a9be76de87e", + "607cf6ca93ed4f6ab23765508b5f95c1", + "4cf904670be54de0803dc23c6e3059d3", + "33c60940f8ec4a098021b70f1a76e6b5", + "5247e1b5ee1042a593e68f679f30a670", + "b3ce39f1bb0741ffbda5960559007735", + "d82962ea0d704b99a06987a6d58bc36c", + "3db4042595a1463a93d26ef4e8fd5185", + "2f180de8e1ef4040ab355cfcdd6445da", + "afef069fc3054b6bac72e05c06a9b699", + "0cdd8c9bfcce4be8b452a4e03b56cf8f", + "a3cb87314cd145cb892e64a5936d5288", + "7ed12fe7019d4facb1c8b98238805561", + "110e9a99f25f4b9f9139b495a557975b", + "25cdfd281d264f49841120ad73571197", + "b10bb711d77540678c446c980abbefb0", + "d9bd7bf387b44ed7bd859d415bc2986f", + "d3e67e65c9b44eadac8364257b7b6a4d", + "fdd57fafdc3747baa062dfce006addbf", + "240577f1ac5b475ca29ace7e5a697890", + "49b872b4786d48d5b906f03d5ffea4cf", + "4f7540961425431f895ad9f368867e76", + "2e7a725fb0da46768d271d76019af7ff", + "2f835b1be1fd4a1fa215c38ccb24fade", + "6b7d3842124e451ea5bccfd3d00aaf41", + "dbbc84a88ec54339aa0b17acaa527221", + "ffbda3ae381149c58b0f4f4ca3aba694", + "de8e98bcce6a4a32bb344467f5301c16", + "129d882ae4a340fcab1cafde0f5fafaf", + "19ce6b36b49e45e39ec255c52fba389d", + "4be4e4869d5e441486cb640177763603", + "362ca4826fc24755b7898c54334b5f7b", + "23ccb3a4752b4bc28c3f312f9537d6a4", + "a5f80d1357054b3794403ff0ea183bb1", + "ed09000d8a464e21bb0d345c9042ad60", + "ac1d67b8c8a24e619ac85998b6fbd44e", + "5ccff814bf444f0bb1622c1639072fd3", + "ac7464fbe2bd4241bcb283b8f8c2f38c", + "823885191d4c472e9f961c11a3c6ffc5", + "6eab9db0d1aa4b84b90fc3872e083dc6", + "811977f4dc4a45ebaec21ecb2882a6f5", + "5f97644a4dbb4de9b2401617cd0d405e", + "bb36946281b04834aad5e987f54ef2c5", + "d67efe136abc47dcbd9f2f7aea2870b4", + "a6c8c00476ed49c7ac1d17165dbb19e0", + "b09db1f09d6e4f98b13a1496df56f634", + "00af5c6f40494636a6f3229e0a7cfe7c", + "0e7ae2b6132647bc9017f6ac2cc342f9", + "3a1db87d4cef4e41839e92e7080813c0", + "c5c6d5fe77ae4a118d531152e752a552", + "a737b9169ce442b7a607273640ac1562", + "59c1b9d1ff41425986d2a8740cec7720", + "e8069fbac7d04e4093e3f08fdd84b9ff", + "81465b29ad7c4f9e98021f23bf6654c0", + "e0943fee62a64d16803e1ce7a015c06b" + ] + }, + "id": "HzjnMLBMkQdh", + "outputId": "eae869a8-3758-4f63-d204-76e691821fe1" + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Adapter saved locally: /content/out/adapter\n" + ] + }, + { + "data": { + "application/vnd.jupyter.widget-view+json": { + "model_id": "b15fcea90a104c5a8fa21646638b0a12", + "version_major": 2, + "version_minor": 0 + }, + "text/plain": [ + "README.md: 0%| | 0.00/573 [00:00` reasoning (R1-Zero style)\n", "\n", - "The adapter we just trained serves as both the starting policy and the KL anchor \u2014 SFT locks format and basic competence, GRPO refines task correctness with real reward signal." + "The adapter we just trained serves as both the starting policy and the KL anchor — SFT locks format and basic competence, GRPO refines task correctness with real reward signal." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "RsaNFJOpz3qj", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 106 + }, + "id": "RsaNFJOpz3qj", + "outputId": "1b6ff873-a8a0-4844-93be-4f45c7ff2984" + }, + "outputs": [], + "source": [ + "import shutil\n", + "from pathlib import Path\n", + "\n", + "STAGE = Path('/content/aws_rl_sft_export')\n", + "STAGE.mkdir(exist_ok=True)\n", + "\n", + "# Copy the output folder wholesale. `out/plots/` is included automatically.\n", + "for folder in ['out']:\n", + " src = Path('/content') / folder\n", + " if src.exists():\n", + " dest = STAGE / folder\n", + " if dest.exists():\n", + " shutil.rmtree(dest)\n", + " shutil.copytree(src, dest)\n", + " size_mb = sum(p.stat().st_size for p in dest.rglob('*') if p.is_file()) / 1e6\n", + " print(f' {folder}/ {size_mb:.1f} MB')\n", + " else:\n", + " print(f' {folder}/ MISSING')\n", + "\n", + "# Zip it\n", + "zip_path = shutil.make_archive('/content/aws_rl_sft_artifacts', 'zip', STAGE)\n", + "size_mb = Path(zip_path).stat().st_size / 1e6\n", + "print(f'\\nArchive: {zip_path} ({size_mb:.1f} MB)')\n", + "\n", + "# Download\n", + "from google.colab import files\n", + "files.download(zip_path)" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "Wkhwg6Wqz547", + "metadata": { + "id": "Wkhwg6Wqz547" + }, + "outputs": [], + "source": [] } ], "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, "kernelspec": { - "display_name": "Python 3", + "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, @@ -935,9 +3860,13013 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11" + "version": "3.12.10" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": { + "003ae8232ede408d8f51453bdc63f96e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_5c796d225e474ae2940c9106b9d64938", + "IPY_MODEL_9a45bc9a77c94a66b1ff7256e8231088", + "IPY_MODEL_e91e918d37a14b28beb9e16f012458f5" + ], + "layout": "IPY_MODEL_9b33c99b889543a19eef2316ac5ab0fe" + } + }, + "00af5c6f40494636a6f3229e0a7cfe7c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_59c1b9d1ff41425986d2a8740cec7720", + "max": 11422086, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e8069fbac7d04e4093e3f08fdd84b9ff", + "value": 11422086 + } + }, + "00b580c294954b7789e5ec131b554bb0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_55f2f5c7da47473497cccd4591f6f1b2", + "IPY_MODEL_cd36d12e348f438e81d1def580ddc3bb", + "IPY_MODEL_c7e6eb783c8f465dba5ffe4912db0735" + ], + "layout": "IPY_MODEL_0b5b82b219a8493badb13a0de16120d8" + } + }, + "00d34d841ca74436aae9d727781deb95": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "00ebf205de7145699686bf127480ec74": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4d02b3371c1d4bd6a2dd7e9df50d227b", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_4c03c750722344faad6a2636dcf2a8c4", + "value": 1 + } + }, + "01e6e5c1ca6b46e38b90c3437b2a338a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "047421bbdbf042e3927d810afbb0b565": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "048621e84d3a417f803f7a3e944234a6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "08036e0504e74efa9853b662f5bac19b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_a02f4be4f7c745aaae9727e9fb8f428c", + "IPY_MODEL_21402222e42046feb1eb6f4e64ecae50", + "IPY_MODEL_760789c0138e4adaade91c3bb73cea2d" + ], + "layout": "IPY_MODEL_643e84e16a3d4205bbc332db420f21d6" + } + }, + "0b5b82b219a8493badb13a0de16120d8": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0cdd8c9bfcce4be8b452a4e03b56cf8f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "0db1cdbbb47a4d0aa8654678cda5e5c8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3848ca58a1b24b0489c0ed2ac572d9a2", + "max": 150, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_497d07100389476fb3e68a6fe20e04dd", + "value": 150 + } + }, + "0ddc82e2462d4ad4b4661e55654352b3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0e00775c7821414fb82084db4c71aff9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0e17405c7a8e4e6ab41d3964dc5fa5b4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_afcb53065479412f8ab30274403dcd9a", + "placeholder": "​", + "style": "IPY_MODEL_d11291002423435f9ab639af145e999b", + "value": " 80/80 [00:00<00:00, 553.74 examples/s]" + } + }, + "0e757f51fc684a33b871c6654f1bc520": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5438f243332143e38cea9fe6ac6acf40", + "placeholder": "​", + "style": "IPY_MODEL_f74e56c5f86046d8812584b3f4b460ce", + "value": "Map: 100%" + } + }, + "0e7ae2b6132647bc9017f6ac2cc342f9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_81465b29ad7c4f9e98021f23bf6654c0", + "placeholder": "​", + "style": "IPY_MODEL_e0943fee62a64d16803e1ce7a015c06b", + "value": " 11.4MB / 11.4MB            " + } + }, + "0f4287efdcda4149a62718c3e8c14326": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_64500442a3d44994a3593d309cd9ab02", + "max": 80, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ee43ac368f5a4aa0813035b3d07cc399", + "value": 80 + } + }, + "0f8fc328cf5a4d56b155a64238f1a3e5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "0ffa028e2b1e4bcdaa441a9be76de87e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_607cf6ca93ed4f6ab23765508b5f95c1", + "IPY_MODEL_4cf904670be54de0803dc23c6e3059d3", + "IPY_MODEL_33c60940f8ec4a098021b70f1a76e6b5" + ], + "layout": "IPY_MODEL_5247e1b5ee1042a593e68f679f30a670" + } + }, + "10132dd4cbde4803bdd38f45dc7e8b7d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e2cdbf13de504156ae577dc40cbb48e5", + "placeholder": "​", + "style": "IPY_MODEL_f7143a33b8ec4638934f319f04daa5fe", + "value": " 500/500 [00:00<00:00, 599.43 examples/s]" + } + }, + "1056869d6f2048b38e79ab0bdddf0d55": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "110e9a99f25f4b9f9139b495a557975b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fdd57fafdc3747baa062dfce006addbf", + "max": 14783936, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_240577f1ac5b475ca29ace7e5a697890", + "value": 14783936 + } + }, + "129d882ae4a340fcab1cafde0f5fafaf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "13cba6f342194b9ca6288583f9ff7b7a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "13d6cac54c3849f1afee12e0ef48dddf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "14a182021a734a6399c7fd5d9da8e9c7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "16d4f581ec604fcc927343369c73f075": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ff0c2a46d55946459f52d2dd09e05674", + "placeholder": "​", + "style": "IPY_MODEL_75b1eff81944448ab15c7d3f25021c99", + "value": "Map (num_proc=6): 100%" + } + }, + "170a45be12e84118b1499c2d5a6c1b49": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "190841be433642759e1a669a3c1a456a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "19a0246152f9400a9bb4362fd5f563fe": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "19ce6b36b49e45e39ec255c52fba389d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "19f1fea7704742f79b50e096e08f7e30": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1ad5f8440a414d3eb18484e567ec57e5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_94f05fcac46b45a88cf98017f1870ad8", + "max": 266, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_4423b209ea8a439d9dc62bd0c85a055e", + "value": 266 + } + }, + "1af65eaea1dc47e49ba71128f8cc7043": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9edb47ef9a4e4348b0e99d302f1308eb", + "placeholder": "​", + "style": "IPY_MODEL_c377f4bbadda4ca9a50769e7b7b83d1d", + "value": " 613/613 [00:00<00:00, 12.7kB/s]" + } + }, + "1b8bdab05d574458ad302ab4d60c86e0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "1bcdcc5cb631454d95ef3a2ca180fbda": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6f8cc86dadfa4e47a4e3ec2aeb9ef0da", + "placeholder": "​", + "style": "IPY_MODEL_6d290f1a029d409999a4d4f9dad9af00", + "value": " 2.78M/? [00:00<00:00, 10.2MB/s]" + } + }, + "1c4fd41612f4466b853c66cfc8b77427": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_601e2da7c2f3466c907c6dc975904974", + "placeholder": "​", + "style": "IPY_MODEL_bc086dd51c684413bcb3e40183290786", + "value": " 150/150 [00:00<00:00, 2036.09 examples/s]" + } + }, + "1c7903362174485aa575d018201c4352": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1c846669e92d4d3a9cd91c408809ba69": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1d5e153fda8a4e38884d13b4b916edda": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "20e75436cb7942e98f86392cb0378079": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "21402222e42046feb1eb6f4e64ecae50": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7fa93872e8ce480b8f298cbcbb746916", + "max": 500, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_1b8bdab05d574458ad302ab4d60c86e0", + "value": 500 + } + }, + "2149d1d6bb244d4db8d53d5c16649563": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_0e757f51fc684a33b871c6654f1bc520", + "IPY_MODEL_e86a2ac8f7d543b1ae3ecbc2f4e560f7", + "IPY_MODEL_1c4fd41612f4466b853c66cfc8b77427" + ], + "layout": "IPY_MODEL_aa058deba06246f1b0003d7b073c8b1c" + } + }, + "21b3fb6c19f54448a9e20ece85600a5b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2258954750884ee483357f4b9c178036": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5e5e3d76fe88464aa73ead1a1c51ccc5", + "placeholder": "​", + "style": "IPY_MODEL_407a7acb4e474669bbec60ec70028736", + "value": " 500/500 [00:00<00:00, 2383.93 examples/s]" + } + }, + "23ccb3a4752b4bc28c3f312f9537d6a4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "240577f1ac5b475ca29ace7e5a697890": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "241038e98d724ee5b15b20682725b1ec": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "2479fa82f86e44efb0074bf98d677948": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_af1c80e5ed764e0dbe94a7901bfa5055", + "IPY_MODEL_50a6b112d54b4f4caf81ff51b5d47330", + "IPY_MODEL_2258954750884ee483357f4b9c178036" + ], + "layout": "IPY_MODEL_facd2d2ea3fd48f9a1ac2cc13bef64b8" + } + }, + "249df56441d74bf4ba35ca0463e8d443": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "24df48e26dde45c78e01649c8b9b68b4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_315ae3dd2bd441b0be55ab63d71cf2f3", + "IPY_MODEL_2e2b3a77fa2444528c88527ce662ebcc", + "IPY_MODEL_9531b4bcfab345b7b0235c422e7f8c18" + ], + "layout": "IPY_MODEL_2d740eedcf154502ab8ea9651603d816" + } + }, + "25cdfd281d264f49841120ad73571197": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_49b872b4786d48d5b906f03d5ffea4cf", + "placeholder": "​", + "style": "IPY_MODEL_4f7540961425431f895ad9f368867e76", + "value": " 14.8MB / 14.8MB            " + } + }, + "275b2d90c0da458abbf59c963afb2e7e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "27ce5b996e4742a7a835112d03a9ae17": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a3adefd3834347cdb48d9e3316a5ed48", + "placeholder": "​", + "style": "IPY_MODEL_a83dabfdb0324a9abc66b7bb47142fdc", + "value": "README.md: " + } + }, + "288bd1af47c34ce7afe1cf10ae64da1a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "290efeeadcc0488994d0bf7d32f4e57b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "29231af3a98a4913a229841d84b27422": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_27ce5b996e4742a7a835112d03a9ae17", + "IPY_MODEL_eb3e7af58dc7441f9befff94cd837496", + "IPY_MODEL_bd36a2a263244450b85a492f96d018fa" + ], + "layout": "IPY_MODEL_7fca6a24a44a45bb87e8cc4fd390403e" + } + }, + "2978d0d591544b74a9b1fc816e430e43": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "297df3af99124fe98b6699137b5f3cd8": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "29da9ecefb744a6ebe187d6ad24a04ec": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2a30540f69414facb204ef8a7e6dea4a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2a8681d890d3439a90403ba1b9eec927": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2d642e51abf547849f6584d35b5d7a70": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2d740eedcf154502ab8ea9651603d816": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2e2b3a77fa2444528c88527ce662ebcc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d5a7f54aab804d7c998694863e366900", + "max": 1500, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5ae30524dc344783a7b546ac4c403239", + "value": 1500 + } + }, + "2e7179f8d86740689b94aa8af55f403d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2e7a725fb0da46768d271d76019af7ff": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_2f835b1be1fd4a1fa215c38ccb24fade", + "IPY_MODEL_6b7d3842124e451ea5bccfd3d00aaf41", + "IPY_MODEL_dbbc84a88ec54339aa0b17acaa527221" + ], + "layout": "IPY_MODEL_ffbda3ae381149c58b0f4f4ca3aba694" + } + }, + "2e8fd49cd671471c8e59c8f2b0ecde5b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "2eb6cd8deed74f1cae2298c20265efd6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_867ffb288b49498281c615325c9f9320", + "placeholder": "​", + "style": "IPY_MODEL_a19ce4b328c34e1d9f84a9a70b5917d0", + "value": " 80/80 [00:00<00:00, 42.34 examples/s]" + } + }, + "2f180de8e1ef4040ab355cfcdd6445da": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "2f835b1be1fd4a1fa215c38ccb24fade": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_de8e98bcce6a4a32bb344467f5301c16", + "placeholder": "​", + "style": "IPY_MODEL_129d882ae4a340fcab1cafde0f5fafaf", + "value": "Processing Files (1 / 1)      : 100%" + } + }, + "2ffe97ed07e54f17b353563bcdd48b41": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "30ca70060ebd492390750750e5c677bf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "30ecc6450c0e4891b44c08f4e78db09c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "315ae3dd2bd441b0be55ab63d71cf2f3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a108eb483f0e4ed0ae36e77e2b269ce6", + "placeholder": "​", + "style": "IPY_MODEL_6069750771574e9c9d641c4e97d0f1a4", + "value": "Map: 100%" + } + }, + "31f6a413168f45a5ab84a3e764013d78": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ccd9559fb88e4d6ab05f4d4f47a9e364", + "IPY_MODEL_f31c8cc62d4c401d8a865e6caad20c38", + "IPY_MODEL_1af65eaea1dc47e49ba71128f8cc7043" + ], + "layout": "IPY_MODEL_66c2a12960974935949e3186d50d2e45" + } + }, + "33c60940f8ec4a098021b70f1a76e6b5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_afef069fc3054b6bac72e05c06a9b699", + "placeholder": "​", + "style": "IPY_MODEL_0cdd8c9bfcce4be8b452a4e03b56cf8f", + "value": " 14.8MB / 14.8MB, 9.24MB/s  " + } + }, + "35ed6c346ecf445f8b9307546af0b17b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "362ca4826fc24755b7898c54334b5f7b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "376b785a2a0f425693df17708b72f866": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "37924cda1a6446ffa7e3ed65c46fb0f2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "37f6fba6ad82421885e71b7cc4b42064": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "383bb49d4cd34c2685a36c0965e9730b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3848ca58a1b24b0489c0ed2ac572d9a2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "397f468d7aff48618720f3e06b9284ed": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3a1db87d4cef4e41839e92e7080813c0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3a24f03afa3143448425861758e13de2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ed4d26c9971d41ba821bcbf8c876c1cb", + "max": 150, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_37f6fba6ad82421885e71b7cc4b42064", + "value": 150 + } + }, + "3ad89276ef674026baca9d24d1296710": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_376b785a2a0f425693df17708b72f866", + "placeholder": "​", + "style": "IPY_MODEL_13cba6f342194b9ca6288583f9ff7b7a", + "value": "data/reserve-00000-of-00001.parquet: 100%" + } + }, + "3bedf84e5b124ca882242272cabede5c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3ca5a40ba10f4ad09b23ee0339607696": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4b3da87ff3884fbabe0e6e05af82679a", + "placeholder": "​", + "style": "IPY_MODEL_2e8fd49cd671471c8e59c8f2b0ecde5b", + "value": " 150/150 [00:00<00:00, 1001.93 examples/s]" + } + }, + "3d39bd5c62554dc98e37f26209681667": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_992500d0a88044f3be59f23920e19f46", + "max": 260654, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_4758f788c9894f0a94fe1263a23039b6", + "value": 260654 + } + }, + "3db2b92b2e844f229826b4c46dd1faf9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3db4042595a1463a93d26ef4e8fd5185": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "3e9b15dda7bf48c3aae394f0d68e2b10": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3f871a98b3214aecb047e164dc4a2a5d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_73b2b5b571f448b6bc3bc99552b1c392", + "placeholder": "​", + "style": "IPY_MODEL_37924cda1a6446ffa7e3ed65c46fb0f2", + "value": "model.safetensors: 100%" + } + }, + "3fec3c13e9224c35aef5fce6f6108e34": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "407a7acb4e474669bbec60ec70028736": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "42c06ae8171840c8b1c73b5b489d25a7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_397f468d7aff48618720f3e06b9284ed", + "placeholder": "​", + "style": "IPY_MODEL_7a6c64ca6c284301b4308fe3f2fe9bcb", + "value": "Filter (num_proc=5): 100%" + } + }, + "4398ec401e6340b4b5f09482759a1045": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4423b209ea8a439d9dc62bd0c85a055e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "458d4b1b8efa47da9485514935fdbbf1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ad2af2ba3b334823a563ce1dd4b2c65f", + "IPY_MODEL_8cf568edd88743b1a0cc66702873f5e6", + "IPY_MODEL_c05ce0271f8e4dc7a0315601532ca955" + ], + "layout": "IPY_MODEL_4baef096df4242b48f3273c0ef46c648" + } + }, + "45a4dce069c5478ab52ce3a35b21123c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6945c712815142f4b78b3ab735646f6e", + "placeholder": "​", + "style": "IPY_MODEL_a6343a6d1db84aa180e2cd42376dad35", + "value": " 1500/1500 [00:01<00:00, 357.86 examples/s]" + } + }, + "45efca052b0948659037c654d3fa4cfc": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "45f43e003da84552b733938e93e76575": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6cfd94dbb7a84ddf9cada7c2760a2264", + "max": 150, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5b6113c58c8b49459b9fe02794b461d4", + "value": 150 + } + }, + "4600b1a835694f13b580c2306d0c267b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4649e83451ae45fc9e47878075e04834": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6c8e529410e94ce6af69ccfc3df6be6d", + "placeholder": "​", + "style": "IPY_MODEL_d97b2639afd9447eb61a6983cebe605a", + "value": " 200/200 [00:00<00:00, 9432.93 examples/s]" + } + }, + "4696ce54235f4bd3873eeed778a4d75e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "46e1e61959b94777953aa2dd43997a4e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "47487ef40fba4b01a29038c332fdbe6e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b8789c36105a4c6d91aa8f2f8aa2182d", + "placeholder": "​", + "style": "IPY_MODEL_4600b1a835694f13b580c2306d0c267b", + "value": " 150/150 [00:00<00:00, 100.37 examples/s]" + } + }, + "4758f788c9894f0a94fe1263a23039b6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "481e292b38954268ace143e169dfca74": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "48c20c5564494cd5bac8ed6577bd91b0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "497d07100389476fb3e68a6fe20e04dd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "49b872b4786d48d5b906f03d5ffea4cf": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "49c2f2ae112f4133a434b6274ca9ffd0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c0bc942b2dec498480f6e19344c4d203", + "max": 573, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_30ca70060ebd492390750750e5c677bf", + "value": 573 + } + }, + "4b3da87ff3884fbabe0e6e05af82679a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4baef096df4242b48f3273c0ef46c648": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4be4e4869d5e441486cb640177763603": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "4c03c750722344faad6a2636dcf2a8c4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "4c4456ede1364182b6b84bab9dbd0ceb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4c5ad75f54da4638a49f5d7b91a80675": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4cf904670be54de0803dc23c6e3059d3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3db4042595a1463a93d26ef4e8fd5185", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_2f180de8e1ef4040ab355cfcdd6445da", + "value": 1 + } + }, + "4d02b3371c1d4bd6a2dd7e9df50d227b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "4db1938146d24d3a8f267ad069c63baf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_cc72718e8e344f99839589eec9388dc5", + "IPY_MODEL_a336d465b4c146e68fb7f9e0414001e5", + "IPY_MODEL_7309057341a74ca28a8bd6e9f1d8e0df" + ], + "layout": "IPY_MODEL_fe237eb64d7b4a71bf13753010e77cbb" + } + }, + "4f7540961425431f895ad9f368867e76": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4f7701101cc24c2f90049a6fc0919d80": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "50a6b112d54b4f4caf81ff51b5d47330": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7e1c3b7d0e714ee3a7d92f7bdc68f19a", + "max": 500, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_f63a0c3bd30741e389921c5a0c0257b6", + "value": 500 + } + }, + "512998b463a04362a4d618f503ceb95c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "514d072373ed49d6900888c63d959d39": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4c5ad75f54da4638a49f5d7b91a80675", + "placeholder": "​", + "style": "IPY_MODEL_3bedf84e5b124ca882242272cabede5c", + "value": "Map (num_proc=5): 100%" + } + }, + "51fab6cbb2574f828d0ae4b8431eeda0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5247e1b5ee1042a593e68f679f30a670": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "530347c79cab4606835a0b7302e35f5b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "5438f243332143e38cea9fe6ac6acf40": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5463570fd1ad4f43af5e5d4a14e5bbb1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_643b5f3367fc475aba8eeffe6091032c", + "placeholder": "​", + "style": "IPY_MODEL_e67201215c274e8684c1c088bb7edc37", + "value": "tokenizer.json: " + } + }, + "55f2f5c7da47473497cccd4591f6f1b2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b2f24deee752408c9c11652cf60a84d3", + "placeholder": "​", + "style": "IPY_MODEL_db50c8f9fcd64b1391c751ee7697e23d", + "value": "Map (num_proc=5): 100%" + } + }, + "5668a72966b841019572521c201ea4e2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_895249c57814429e99f87e5d86907346", + "placeholder": "​", + "style": "IPY_MODEL_61ad1078a7cc40819cdad3bf68531b6c", + "value": "generation_config.json: 100%" + } + }, + "572caef8e71c48cea2b9bf826256a1e3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_fc8ba4f1606743dcabc2ee0dd482b704", + "IPY_MODEL_0f4287efdcda4149a62718c3e8c14326", + "IPY_MODEL_0e17405c7a8e4e6ab41d3964dc5fa5b4" + ], + "layout": "IPY_MODEL_f803f04e1f0b4c8db5b2a571538790d3" + } + }, + "57553e43d221422d921c4212d71ad972": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_5463570fd1ad4f43af5e5d4a14e5bbb1", + "IPY_MODEL_8d3afe0c4db14a9ab7234230d9f12e3e", + "IPY_MODEL_8a6323e9aa7342e1ab3337f24a48d61e" + ], + "layout": "IPY_MODEL_21b3fb6c19f54448a9e20ece85600a5b" + } + }, + "59115df98912426b9d679bf80e3f5f6e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_c28d17bc0e2446dc89081a1a638a2484", + "IPY_MODEL_79099348a0c643e7bceaf63e6456f1f7", + "IPY_MODEL_10132dd4cbde4803bdd38f45dc7e8b7d" + ], + "layout": "IPY_MODEL_62769eb172cd4d2884c75b8e36c2d28c" + } + }, + "59c1b9d1ff41425986d2a8740cec7720": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "59cb2a9a1e0f474fb0759dce2e9254b4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f02d91e96fe84c0781b1c6e17fd537ae", + "max": 1500, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5aa8c08833564830a597642fdee68611", + "value": 1500 + } + }, + "5aa8c08833564830a597642fdee68611": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "5ae30524dc344783a7b546ac4c403239": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "5b6113c58c8b49459b9fe02794b461d4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "5c796d225e474ae2940c9106b9d64938": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2978d0d591544b74a9b1fc816e430e43", + "placeholder": "​", + "style": "IPY_MODEL_f50bbeaadfe1453fb7880dc8d725fefb", + "value": "Processing Files (1 / 1)      : 100%" + } + }, + "5ccff814bf444f0bb1622c1639072fd3": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_bb36946281b04834aad5e987f54ef2c5", + "placeholder": "​", + "style": "IPY_MODEL_d67efe136abc47dcbd9f2f7aea2870b4", + "value": "  0.00B /  0.00B,  0.00B/s  " + } + }, + "5d434b4b5a88449aaa35026f0f2fe772": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4696ce54235f4bd3873eeed778a4d75e", + "placeholder": "​", + "style": "IPY_MODEL_aecf790586e4461ca62b06581201a4db", + "value": " 500/500 [00:00<00:00, 556.09 examples/s]" + } + }, + "5d6c9aa373cb457b84bf0818e880374f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5d7559aac4da485e920ddd19859521bd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8ad0641ef6a040a99e42b838fefb13cc", + "placeholder": "​", + "style": "IPY_MODEL_19f1fea7704742f79b50e096e08f7e30", + "value": "Filter (num_proc=6): 100%" + } + }, + "5dc28d883bd046b7a7cc329b869b329e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "5e2d63577b9846649c53977c1e5f67e5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "5e5e3d76fe88464aa73ead1a1c51ccc5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5f810f46fc1d4b93a9362bab5e1d02cb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5f897a4a2d2d4134b182ca12ffedfd41": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "5f97644a4dbb4de9b2401617cd0d405e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "6016e224b904438cbe154f26372d8c38": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "601e2da7c2f3466c907c6dc975904974": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6069750771574e9c9d641c4e97d0f1a4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "607cf6ca93ed4f6ab23765508b5f95c1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b3ce39f1bb0741ffbda5960559007735", + "placeholder": "​", + "style": "IPY_MODEL_d82962ea0d704b99a06987a6d58bc36c", + "value": "New Data Upload               : 100%" + } + }, + "609b59d6e0544e39a92d47ef036baf47": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "61ad1078a7cc40819cdad3bf68531b6c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "62769eb172cd4d2884c75b8e36c2d28c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6332e4cac11e4456a57f49757ad7a243": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "633c5d5645dc4d91953efe8466dd55cd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_16d4f581ec604fcc927343369c73f075", + "IPY_MODEL_d0f184b2c8934ac0830dfeb1963b083a", + "IPY_MODEL_e4440093f346491da5d4af23c296c324" + ], + "layout": "IPY_MODEL_2a8681d890d3439a90403ba1b9eec927" + } + }, + "636cba5df88940e2b92525b4c2ea00b6": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "636f00f102ee4601839ab20f63386777": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6425c2a961c74464a23986d7f52590bf": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "643b5f3367fc475aba8eeffe6091032c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "643e84e16a3d4205bbc332db420f21d6": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "64500442a3d44994a3593d309cd9ab02": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "64770e809d234b958d990ad9db262f86": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "648646594ca74b69a29ace1fed5db1be": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "64a36df9f60c4473afd94b03803c8a1c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_5d7559aac4da485e920ddd19859521bd", + "IPY_MODEL_d2d2f9d53852463982a293f44dda3572", + "IPY_MODEL_2eb6cd8deed74f1cae2298c20265efd6" + ], + "layout": "IPY_MODEL_8cb6e3e7b5254bc085775607e1d37f0e" + } + }, + "66c2a12960974935949e3186d50d2e45": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "689257af48194add88f3462e44a9c9a7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6945c712815142f4b78b3ab735646f6e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6a2234cf25d847d586c0639407cb0422": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6acc17dc21b84d0e9d91605f8e76e1ce": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6b7d3842124e451ea5bccfd3d00aaf41": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_19ce6b36b49e45e39ec255c52fba389d", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_4be4e4869d5e441486cb640177763603", + "value": 1 + } + }, + "6c8e529410e94ce6af69ccfc3df6be6d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6cdce07c0aae4c80b63ba7c312c15999": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_839bcd34b3d1455c9b168f3c0eb7ee48", + "placeholder": "​", + "style": "IPY_MODEL_f46385b2c5dd46ebae4f130e22bc2b51", + "value": "Map: 100%" + } + }, + "6cfd94dbb7a84ddf9cada7c2760a2264": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6d290f1a029d409999a4d4f9dad9af00": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6def0cb756d347cea530ec55079725f7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c87be66de92644ca993361e6ca7a7cec", + "placeholder": "​", + "style": "IPY_MODEL_b1f7e2baa64e461e928854bde8ca37da", + "value": "vocab.json: " + } + }, + "6e1e9431d2da44648b11d4422814f4de": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6eab9db0d1aa4b84b90fc3872e083dc6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6f8cc86dadfa4e47a4e3ec2aeb9ef0da": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "6fa8f54bd32c4c05b39643df321bf826": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6acc17dc21b84d0e9d91605f8e76e1ce", + "placeholder": "​", + "style": "IPY_MODEL_8ce3dac1705c4d608474c0b2b29ef16c", + "value": " 1500/1500 [00:00<00:00, 3272.91 examples/s]" + } + }, + "70c43ae789a94fa8b686164510c86176": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "72ec2fb877254e0b9bb0b8a636c25187": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "72eecc7e741a41d695abed8c79cf885e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_f834d546d5634bcabf4776770c6d8871", + "IPY_MODEL_f5fe5f5074154467a6d5101f06b2dfc5", + "IPY_MODEL_b52c54c6617d4f7294f843f02ab70f02" + ], + "layout": "IPY_MODEL_6425c2a961c74464a23986d7f52590bf" + } + }, + "7309057341a74ca28a8bd6e9f1d8e0df": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4c4456ede1364182b6b84bab9dbd0ceb", + "placeholder": "​", + "style": "IPY_MODEL_a90d649010ca43aebc1534822d3aee6a", + "value": " 7.51k/? [00:00<00:00, 124kB/s]" + } + }, + "73366bb0f86c4689828558a6db8160c2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "73b07b37c66a41ada1a6a2aa5272398c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "73b2b5b571f448b6bc3bc99552b1c392": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "73f33acaacc846e5b22e00e94dff8743": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7456f76578b944ec98a79f0b0dc6de65": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_46e1e61959b94777953aa2dd43997a4e", + "max": 1500, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_35ed6c346ecf445f8b9307546af0b17b", + "value": 1500 + } + }, + "75124ef3b8c5400986ad002c88504834": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_bdde1deb5ae9491eae7b6152c81c059d", + "IPY_MODEL_7848ff282e424293b99fc1ffc4cd2fc2", + "IPY_MODEL_98925b8108c54ea28eb21503015989c1" + ], + "layout": "IPY_MODEL_d9f6cfc6a3f449b49907ff71ff293141" + } + }, + "75b1eff81944448ab15c7d3f25021c99": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "75b9ddd94a41423baf0eae13d3c74f9b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_6def0cb756d347cea530ec55079725f7", + "IPY_MODEL_8582e647c2e24f91aef1aa10c80e561c", + "IPY_MODEL_1bcdcc5cb631454d95ef3a2ca180fbda" + ], + "layout": "IPY_MODEL_ceb840afa0094d96a145df316807a345" + } + }, + "760789c0138e4adaade91c3bb73cea2d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_73b07b37c66a41ada1a6a2aa5272398c", + "placeholder": "​", + "style": "IPY_MODEL_f93c3a6553d1414ebc5ff9e5b18fb4dd", + "value": " 500/500 [00:00<00:00, 628.81 examples/s]" + } + }, + "776f37e27e864e3596640ad6708fe717": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "77770c5f10934573a6fbe934cfb9cb4d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "778e34c12b4347d387dc53596a598fe2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "7848ff282e424293b99fc1ffc4cd2fc2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2ffe97ed07e54f17b353563bcdd48b41", + "max": 193593, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_20e75436cb7942e98f86392cb0378079", + "value": 193593 + } + }, + "79099348a0c643e7bceaf63e6456f1f7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_eab8c43144bf40f1925820492473e9d3", + "max": 500, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ecb17e182dd84febbdcded2879fa80b7", + "value": 500 + } + }, + "79520fc6e14b4fb7a20f4eca948dede0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7a6c64ca6c284301b4308fe3f2fe9bcb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7d3a823c2d45490e9e9505d3e399aeff": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7e1c3b7d0e714ee3a7d92f7bdc68f19a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7e9cff4098c64cf9b95d105e1aff748c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7ed12fe7019d4facb1c8b98238805561": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d9bd7bf387b44ed7bd859d415bc2986f", + "placeholder": "​", + "style": "IPY_MODEL_d3e67e65c9b44eadac8364257b7b6a4d", + "value": "  ...adapter_model.safetensors: 100%" + } + }, + "7f3c543649714b99a9565399839ba5e1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_6cdce07c0aae4c80b63ba7c312c15999", + "IPY_MODEL_45f43e003da84552b733938e93e76575", + "IPY_MODEL_3ca5a40ba10f4ad09b23ee0339607696" + ], + "layout": "IPY_MODEL_64770e809d234b958d990ad9db262f86" + } + }, + "7fa93872e8ce480b8f298cbcbb746916": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7fca6a24a44a45bb87e8cc4fd390403e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "806a5a3781074d9d8201d0db61c04765": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9c688b55b9d244cd9a6ea1294670a1ad", + "placeholder": "​", + "style": "IPY_MODEL_4398ec401e6340b4b5f09482759a1045", + "value": " 80/80 [00:00<00:00, 1506.87 examples/s]" + } + }, + "811977f4dc4a45ebaec21ecb2882a6f5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "81465b29ad7c4f9e98021f23bf6654c0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "81abc2746ae8418ba793c0e15783c665": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "823885191d4c472e9f961c11a3c6ffc5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "839bcd34b3d1455c9b168f3c0eb7ee48": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "83d5c8137daf43f08389eaa70861637f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "83e24d6711ab464daa46584dd6526e33": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "84eaa448117b41fcbfa3d68b0287540e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "857fc23cb42c4e5297b6cbc12f42bfb1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_afbec639658a4db09b968424a52074f9", + "IPY_MODEL_fa9a37a523ec459e8d02007b55b1ba20", + "IPY_MODEL_f9f7b1fc79dc4bee9b6a0a946ff39bb2" + ], + "layout": "IPY_MODEL_bf421ed09e4d42c3b906c51f159eaa2c" + } + }, + "8582e647c2e24f91aef1aa10c80e561c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b0e7dc59392242baaad8d4ba599646e2", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_241038e98d724ee5b15b20682725b1ec", + "value": 1 + } + }, + "867ffb288b49498281c615325c9f9320": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "871a4878c903463289a2283b5f649d00": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3e9b15dda7bf48c3aae394f0d68e2b10", + "placeholder": "​", + "style": "IPY_MODEL_9dcb1c84d9384ab3b0d9ad681646e4e9", + "value": " 573/573 [00:00<00:00, 60.2kB/s]" + } + }, + "87273b19125e42d0ad471db11f600a15": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b68f12d836a24d57b2708b476bfc71ad", + "placeholder": "​", + "style": "IPY_MODEL_3db2b92b2e844f229826b4c46dd1faf9", + "value": " 2.05G/2.05G [00:21<00:00, 72.9MB/s]" + } + }, + "875f7ae9afab4421bdeacdec71be326a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_42c06ae8171840c8b1c73b5b489d25a7", + "IPY_MODEL_7456f76578b944ec98a79f0b0dc6de65", + "IPY_MODEL_45a4dce069c5478ab52ce3a35b21123c" + ], + "layout": "IPY_MODEL_3fec3c13e9224c35aef5fce6f6108e34" + } + }, + "8874182d6efb466f9551c71306e87be2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_8afebc1ba6cc47868b3caa994d271e2a", + "placeholder": "​", + "style": "IPY_MODEL_8e8c8c3211484f63a499bbe3d5f0b63d", + "value": " 1500/1500 [00:00<00:00, 469.61 examples/s]" + } + }, + "8946e4ccc6fa4cbc93fff996338aad43": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_83e24d6711ab464daa46584dd6526e33", + "placeholder": "​", + "style": "IPY_MODEL_48c20c5564494cd5bac8ed6577bd91b0", + "value": " 266/266 [00:00<00:00, 5.92kB/s]" + } + }, + "895249c57814429e99f87e5d86907346": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "897116c49c5c4c9591c2c77d7538e851": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8a4eb795873c46188f85230e6a948795": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_84eaa448117b41fcbfa3d68b0287540e", + "placeholder": "​", + "style": "IPY_MODEL_c73de00f6d4f456e8fb28a765df6a1fd", + "value": " 150/150 [00:00<00:00, 7213.48 examples/s]" + } + }, + "8a6323e9aa7342e1ab3337f24a48d61e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_636cba5df88940e2b92525b4c2ea00b6", + "placeholder": "​", + "style": "IPY_MODEL_a6f703306605483c9fe86cc203e73a5d", + "value": " 7.03M/? [00:00<00:00, 19.8MB/s]" + } + }, + "8ad0641ef6a040a99e42b838fefb13cc": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8afebc1ba6cc47868b3caa994d271e2a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8ba25aaf330e4cecb4940f51ce4c2d91": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_a11421346cb544c3ae79e49143b3ff98", + "IPY_MODEL_59cb2a9a1e0f474fb0759dce2e9254b4", + "IPY_MODEL_6fa8f54bd32c4c05b39643df321bf826" + ], + "layout": "IPY_MODEL_45efca052b0948659037c654d3fa4cfc" + } + }, + "8cb6e3e7b5254bc085775607e1d37f0e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8ce3dac1705c4d608474c0b2b29ef16c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8cf568edd88743b1a0cc66702873f5e6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b9374d73b2ac427e9c8d55949737bf4b", + "max": 1923495, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_ac471c36448e42e6a4278eb212464d78", + "value": 1923495 + } + }, + "8d3afe0c4db14a9ab7234230d9f12e3e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d95d024f4dcb4bc5b0dfa92259ede3e5", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5e2d63577b9846649c53977c1e5f67e5", + "value": 1 + } + }, + "8e8c8c3211484f63a499bbe3d5f0b63d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "8ea83d7a46d84e37a28890d5c61109cf": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8fa83e655f654286a77f0d64c2017e40": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "90cfd352cfce435a9fb4c2ca4506ef81": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "91e66dab350841299c8785795c380366": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "939163edb94b4620876de0deaf90d550": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "94f05fcac46b45a88cf98017f1870ad8": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9531b4bcfab345b7b0235c422e7f8c18": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b957a5477fc54821a8112428690ca3f8", + "placeholder": "​", + "style": "IPY_MODEL_7d3a823c2d45490e9e9505d3e399aeff", + "value": " 1500/1500 [00:01<00:00, 1026.90 examples/s]" + } + }, + "95d4d9080e17430687b4a52e7b704ac1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_514d072373ed49d6900888c63d959d39", + "IPY_MODEL_cff8893cc6d2490cbb1c903f22d85772", + "IPY_MODEL_8874182d6efb466f9551c71306e87be2" + ], + "layout": "IPY_MODEL_00d34d841ca74436aae9d727781deb95" + } + }, + "98925b8108c54ea28eb21503015989c1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_29da9ecefb744a6ebe187d6ad24a04ec", + "placeholder": "​", + "style": "IPY_MODEL_1d5e153fda8a4e38884d13b4b916edda", + "value": " 194k/194k [00:00<00:00, 769kB/s]" + } + }, + "98980e3258f148ae80e89c0b23847336": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_fcbdd1e084124303be96ca0a89a8e293", + "IPY_MODEL_00ebf205de7145699686bf127480ec74", + "IPY_MODEL_bb5dea14dc0c420fa06ffda49187f503" + ], + "layout": "IPY_MODEL_7e9cff4098c64cf9b95d105e1aff748c" + } + }, + "992500d0a88044f3be59f23920e19f46": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "99c64e4279264453b7bf06e578ba7025": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_51fab6cbb2574f828d0ae4b8431eeda0", + "placeholder": "​", + "style": "IPY_MODEL_73f33acaacc846e5b22e00e94dff8743", + "value": "Filter (num_proc=5): 100%" + } + }, + "9a45bc9a77c94a66b1ff7256e8231088": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_648646594ca74b69a29ace1fed5db1be", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c313a139e75c4953ab62b75752bcc5d7", + "value": 1 + } + }, + "9b33c99b889543a19eef2316ac5ab0fe": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9c688b55b9d244cd9a6ea1294670a1ad": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9d9e8a585584449fbc2982735731b96e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "9dcb1c84d9384ab3b0d9ad681646e4e9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9edb47ef9a4e4348b0e99d302f1308eb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a02f4be4f7c745aaae9727e9fb8f428c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_288bd1af47c34ce7afe1cf10ae64da1a", + "placeholder": "​", + "style": "IPY_MODEL_cb97fe53c8364943b3251e935a6b59f9", + "value": "Map: 100%" + } + }, + "a108eb483f0e4ed0ae36e77e2b269ce6": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a11421346cb544c3ae79e49143b3ff98": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b7d9cf67d7ee44ffb77a45fd4e6fe32f", + "placeholder": "​", + "style": "IPY_MODEL_01e6e5c1ca6b46e38b90c3437b2a338a", + "value": "Map: 100%" + } + }, + "a19ce4b328c34e1d9f84a9a70b5917d0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a336d465b4c146e68fb7f9e0414001e5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d98c35bbd1524d6bb5b3faec9f74de31", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_939163edb94b4620876de0deaf90d550", + "value": 1 + } + }, + "a3adefd3834347cdb48d9e3316a5ed48": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a3cb87314cd145cb892e64a5936d5288": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_7ed12fe7019d4facb1c8b98238805561", + "IPY_MODEL_110e9a99f25f4b9f9139b495a557975b", + "IPY_MODEL_25cdfd281d264f49841120ad73571197" + ], + "layout": "IPY_MODEL_b10bb711d77540678c446c980abbefb0" + } + }, + "a419e0561e0f4b3da3f0eb8cb657755f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_db75caefb31b4f49876694c98de6a6ad", + "max": 2054625552, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d2106145680e4083a0d3efae7309cbb8", + "value": 2054625552 + } + }, + "a5f80d1357054b3794403ff0ea183bb1": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ed09000d8a464e21bb0d345c9042ad60", + "IPY_MODEL_ac1d67b8c8a24e619ac85998b6fbd44e", + "IPY_MODEL_5ccff814bf444f0bb1622c1639072fd3" + ], + "layout": "IPY_MODEL_ac7464fbe2bd4241bcb283b8f8c2f38c" + } + }, + "a6343a6d1db84aa180e2cd42376dad35": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a6969e8ebd3d4f2aa1fb6d9153654a28": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "a6c5d26ad5e14dd2b3b701de1bfe2b7f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_190841be433642759e1a669a3c1a456a", + "max": 80, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e28c2ec5beb14108bf9633eb1965d233", + "value": 80 + } + }, + "a6c8c00476ed49c7ac1d17165dbb19e0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_b09db1f09d6e4f98b13a1496df56f634", + "IPY_MODEL_00af5c6f40494636a6f3229e0a7cfe7c", + "IPY_MODEL_0e7ae2b6132647bc9017f6ac2cc342f9" + ], + "layout": "IPY_MODEL_3a1db87d4cef4e41839e92e7080813c0" + } + }, + "a6dbc6baa4b44ca0b042c6449959a7f0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a6f703306605483c9fe86cc203e73a5d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a737b9169ce442b7a607273640ac1562": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a83dabfdb0324a9abc66b7bb47142fdc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a90d649010ca43aebc1534822d3aee6a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a9e1f270b5314d4ba6c0417313dbd226": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "aa058deba06246f1b0003d7b073c8b1c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "aa7bce772af442928a74629464e2fc0e": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ac1d67b8c8a24e619ac85998b6fbd44e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_811977f4dc4a45ebaec21ecb2882a6f5", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5f97644a4dbb4de9b2401617cd0d405e", + "value": 0 + } + }, + "ac471c36448e42e6a4278eb212464d78": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "ac7464fbe2bd4241bcb283b8f8c2f38c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ad2af2ba3b334823a563ce1dd4b2c65f": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6016e224b904438cbe154f26372d8c38", + "placeholder": "​", + "style": "IPY_MODEL_13d6cac54c3849f1afee12e0ef48dddf", + "value": "data/train-00000-of-00001.parquet: 100%" + } + }, + "ae5960c8a5fb4c7c8a75c7bf9a4e6ebf": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_cee47b7f9a1d4f86a51afedae1cc6185", + "placeholder": "​", + "style": "IPY_MODEL_30ecc6450c0e4891b44c08f4e78db09c", + "value": "Map (num_proc=6): 100%" + } + }, + "aecf790586e4461ca62b06581201a4db": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "af1c80e5ed764e0dbe94a7901bfa5055": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_aa7bce772af442928a74629464e2fc0e", + "placeholder": "​", + "style": "IPY_MODEL_8fa83e655f654286a77f0d64c2017e40", + "value": "Map: 100%" + } + }, + "afbec639658a4db09b968424a52074f9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f0e4397588a847af90236075a3065ac7", + "placeholder": "​", + "style": "IPY_MODEL_83d5c8137daf43f08389eaa70861637f", + "value": "added_tokens.json: 100%" + } + }, + "afcb53065479412f8ab30274403dcd9a": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "afef069fc3054b6bac72e05c06a9b699": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b09db1f09d6e4f98b13a1496df56f634": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c5c6d5fe77ae4a118d531152e752a552", + "placeholder": "​", + "style": "IPY_MODEL_a737b9169ce442b7a607273640ac1562", + "value": "  ...mpcnfz5qff/tokenizer.json: 100%" + } + }, + "b0e7dc59392242baaad8d4ba599646e2": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "b10bb711d77540678c446c980abbefb0": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b15fcea90a104c5a8fa21646638b0a12": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_bc6c6aee6b6d4cd3afe76dd00245f8db", + "IPY_MODEL_49c2f2ae112f4133a434b6274ca9ffd0", + "IPY_MODEL_871a4878c903463289a2283b5f649d00" + ], + "layout": "IPY_MODEL_8ea83d7a46d84e37a28890d5c61109cf" + } + }, + "b1f7e2baa64e461e928854bde8ca37da": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b2f24deee752408c9c11652cf60a84d3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b3ce39f1bb0741ffbda5960559007735": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b3f3175c19c74344a406aff51a048139": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "b52c54c6617d4f7294f843f02ab70f02": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0ddc82e2462d4ad4b4661e55654352b3", + "placeholder": "​", + "style": "IPY_MODEL_275b2d90c0da458abbf59c963afb2e7e", + "value": " 1500/1500 [00:00<00:00, 55111.34 examples/s]" + } + }, + "b68f12d836a24d57b2708b476bfc71ad": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b7d9cf67d7ee44ffb77a45fd4e6fe32f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b8789c36105a4c6d91aa8f2f8aa2182d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b9374d73b2ac427e9c8d55949737bf4b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b957a5477fc54821a8112428690ca3f8": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ba4a487089554097a60c839774eb6312": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_99c64e4279264453b7bf06e578ba7025", + "IPY_MODEL_0db1cdbbb47a4d0aa8654678cda5e5c8", + "IPY_MODEL_47487ef40fba4b01a29038c332fdbe6e" + ], + "layout": "IPY_MODEL_297df3af99124fe98b6699137b5f3cd8" + } + }, + "bb36946281b04834aad5e987f54ef2c5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bb5dea14dc0c420fa06ffda49187f503": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e1a49fe3dcfe4c518055364a3b9654b1", + "placeholder": "​", + "style": "IPY_MODEL_530347c79cab4606835a0b7302e35f5b", + "value": " 1.67M/? [00:00<00:00, 9.34MB/s]" + } + }, + "bc086dd51c684413bcb3e40183290786": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "bc2d4de1df5241e3949f4558b9322321": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_e441aedea1414eac9574830ee8425098", + "IPY_MODEL_a6c5d26ad5e14dd2b3b701de1bfe2b7f", + "IPY_MODEL_806a5a3781074d9d8201d0db61c04765" + ], + "layout": "IPY_MODEL_bcacc2d5bcb34e0ab2caeb2e5fddeeba" + } + }, + "bc6c6aee6b6d4cd3afe76dd00245f8db": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_dd6994f094df444c9c62f84fd2da82af", + "placeholder": "​", + "style": "IPY_MODEL_2d642e51abf547849f6584d35b5d7a70", + "value": "README.md: 100%" + } + }, + "bcacc2d5bcb34e0ab2caeb2e5fddeeba": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bd36a2a263244450b85a492f96d018fa": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_897116c49c5c4c9591c2c77d7538e851", + "placeholder": "​", + "style": "IPY_MODEL_4f7701101cc24c2f90049a6fc0919d80", + "value": " 4.89k/? [00:00<00:00, 140kB/s]" + } + }, + "bd9250796f574171b657eb6da8880200": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bda8d508d0a24cdaab5782d2cc1335e8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "bdde1deb5ae9491eae7b6152c81c059d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_77770c5f10934573a6fbe934cfb9cb4d", + "placeholder": "​", + "style": "IPY_MODEL_a6dbc6baa4b44ca0b042c6449959a7f0", + "value": "data/validation-00000-of-00001.parquet: 100%" + } + }, + "bf421ed09e4d42c3b906c51f159eaa2c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bf5d69a2795144ffb2e2c5a115e1c5b4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_776f37e27e864e3596640ad6708fe717", + "max": 500, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_5f897a4a2d2d4134b182ca12ffedfd41", + "value": 500 + } + }, + "c05ce0271f8e4dc7a0315601532ca955": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e1c8bb5ef082498b8fe0a66130e69035", + "placeholder": "​", + "style": "IPY_MODEL_481e292b38954268ace143e169dfca74", + "value": " 1.92M/1.92M [00:00<00:00, 9.64MB/s]" + } + }, + "c08137d749274ddfa7d16d00038bbdcc": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_72ec2fb877254e0b9bb0b8a636c25187", + "placeholder": "​", + "style": "IPY_MODEL_f3ee5b5442b447539b1d7a72a9df1b58", + "value": "Generating validation split: 100%" + } + }, + "c0bc942b2dec498480f6e19344c4d203": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c14897b6216b47038f9b1b5bdb941467": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "c21a9c6799f94f3b9400ed220a0fc1e9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "c28d17bc0e2446dc89081a1a638a2484": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e6c1913352514eef9cbf15cee827606b", + "placeholder": "​", + "style": "IPY_MODEL_5dc28d883bd046b7a7cc329b869b329e", + "value": "Filter (num_proc=6): 100%" + } + }, + "c313a139e75c4953ab62b75752bcc5d7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "c377f4bbadda4ca9a50769e7b7b83d1d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c5c6d5fe77ae4a118d531152e752a552": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c6ac84d0c64b4259be243b913caf652c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c73de00f6d4f456e8fb28a765df6a1fd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c7e6eb783c8f465dba5ffe4912db0735": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_79520fc6e14b4fb7a20f4eca948dede0", + "placeholder": "​", + "style": "IPY_MODEL_290efeeadcc0488994d0bf7d32f4e57b", + "value": " 150/150 [00:00<00:00, 95.55 examples/s]" + } + }, + "c87be66de92644ca993361e6ca7a7cec": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "cb97fe53c8364943b3251e935a6b59f9": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "cc72718e8e344f99839589eec9388dc5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_383bb49d4cd34c2685a36c0965e9730b", + "placeholder": "​", + "style": "IPY_MODEL_6e1e9431d2da44648b11d4422814f4de", + "value": "tokenizer_config.json: " + } + }, + "ccd9559fb88e4d6ab05f4d4f47a9e364": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5d6c9aa373cb457b84bf0818e880374f", + "placeholder": "​", + "style": "IPY_MODEL_048621e84d3a417f803f7a3e944234a6", + "value": "special_tokens_map.json: 100%" + } + }, + "cd36d12e348f438e81d1def580ddc3bb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1c7903362174485aa575d018201c4352", + "max": 150, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c14897b6216b47038f9b1b5bdb941467", + "value": 150 + } + }, + "cdb67ffc2d694e33a6612115a5974d11": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ae5960c8a5fb4c7c8a75c7bf9a4e6ebf", + "IPY_MODEL_bf5d69a2795144ffb2e2c5a115e1c5b4", + "IPY_MODEL_5d434b4b5a88449aaa35026f0f2fe772" + ], + "layout": "IPY_MODEL_6a2234cf25d847d586c0639407cb0422" + } + }, + "ceb840afa0094d96a145df316807a345": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "cee47b7f9a1d4f86a51afedae1cc6185": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "cef92c4d93074e1e9f73c527f0e1b021": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "cff8893cc6d2490cbb1c903f22d85772": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_90cfd352cfce435a9fb4c2ca4506ef81", + "max": 1500, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_91e66dab350841299c8785795c380366", + "value": 1500 + } + }, + "d08376eb6b62480cb85f4e0b62320210": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_5668a72966b841019572521c201ea4e2", + "IPY_MODEL_1ad5f8440a414d3eb18484e567ec57e5", + "IPY_MODEL_8946e4ccc6fa4cbc93fff996338aad43" + ], + "layout": "IPY_MODEL_636f00f102ee4601839ab20f63386777" + } + }, + "d0f184b2c8934ac0830dfeb1963b083a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ee900b2750c14293af20f0a47ca57f6c", + "max": 80, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_249df56441d74bf4ba35ca0463e8d443", + "value": 80 + } + }, + "d11291002423435f9ab639af145e999b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d2106145680e4083a0d3efae7309cbb8": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "d2babfe551ed49f9809a535092e078e4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "d2d2f9d53852463982a293f44dda3572": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_cef92c4d93074e1e9f73c527f0e1b021", + "max": 80, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_0f8fc328cf5a4d56b155a64238f1a3e5", + "value": 80 + } + }, + "d3e67e65c9b44eadac8364257b7b6a4d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d5a7f54aab804d7c998694863e366900": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d67efe136abc47dcbd9f2f7aea2870b4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d82962ea0d704b99a06987a6d58bc36c": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d8cd88776dd640b8a2790bd8222a32e5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5f810f46fc1d4b93a9362bab5e1d02cb", + "placeholder": "​", + "style": "IPY_MODEL_eab6a31889534b9886ea848e324f1a93", + "value": " 261k/261k [00:00<00:00, 1.03MB/s]" + } + }, + "d95d024f4dcb4bc5b0dfa92259ede3e5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "d97b2639afd9447eb61a6983cebe605a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d98c35bbd1524d6bb5b3faec9f74de31": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "d9bd7bf387b44ed7bd859d415bc2986f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d9f6cfc6a3f449b49907ff71ff293141": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "db50c8f9fcd64b1391c751ee7697e23d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "db75caefb31b4f49876694c98de6a6ad": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dbbc84a88ec54339aa0b17acaa527221": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_362ca4826fc24755b7898c54334b5f7b", + "placeholder": "​", + "style": "IPY_MODEL_23ccb3a4752b4bc28c3f312f9537d6a4", + "value": " 11.4MB / 11.4MB, 19.0MB/s  " + } + }, + "dd6994f094df444c9c62f84fd2da82af": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "de8e98bcce6a4a32bb344467f5301c16": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "de9c5e0f171e470c983d459e836ea96d": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_c08137d749274ddfa7d16d00038bbdcc", + "IPY_MODEL_3a24f03afa3143448425861758e13de2", + "IPY_MODEL_8a4eb795873c46188f85230e6a948795" + ], + "layout": "IPY_MODEL_14a182021a734a6399c7fd5d9da8e9c7" + } + }, + "df691f3fe6d84515aea9eba173c19208": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e01e04ec36af435fa9af715377355e5a": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6332e4cac11e4456a57f49757ad7a243", + "max": 200, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c21a9c6799f94f3b9400ed220a0fc1e9", + "value": 200 + } + }, + "e0943fee62a64d16803e1ce7a015c06b": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e18fbe8e72964a569c24722e35b81cb2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e1a49fe3dcfe4c518055364a3b9654b1": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e1c8bb5ef082498b8fe0a66130e69035": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e28c2ec5beb14108bf9633eb1965d233": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e2cdbf13de504156ae577dc40cbb48e5": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e441aedea1414eac9574830ee8425098": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_81abc2746ae8418ba793c0e15783c665", + "placeholder": "​", + "style": "IPY_MODEL_19a0246152f9400a9bb4362fd5f563fe", + "value": "Map: 100%" + } + }, + "e4440093f346491da5d4af23c296c324": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ee0c45ace98b42a3a5c7d39f997d749d", + "placeholder": "​", + "style": "IPY_MODEL_047421bbdbf042e3927d810afbb0b565", + "value": " 80/80 [00:00<00:00, 45.69 examples/s]" + } + }, + "e67201215c274e8684c1c088bb7edc37": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e6c1913352514eef9cbf15cee827606b": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e8069fbac7d04e4093e3f08fdd84b9ff": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "e86a2ac8f7d543b1ae3ecbc2f4e560f7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f16acd23373845d3894da4abf9500e0f", + "max": 150, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d2babfe551ed49f9809a535092e078e4", + "value": 150 + } + }, + "e91e918d37a14b28beb9e16f012458f5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_689257af48194add88f3462e44a9c9a7", + "placeholder": "​", + "style": "IPY_MODEL_b3f3175c19c74344a406aff51a048139", + "value": " 14.8MB / 14.8MB, 9.24MB/s  " + } + }, + "eab6a31889534b9886ea848e324f1a93": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "eab8c43144bf40f1925820492473e9d3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "eb3e7af58dc7441f9befff94cd837496": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_778e34c12b4347d387dc53596a598fe2", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_bda8d508d0a24cdaab5782d2cc1335e8", + "value": 1 + } + }, + "ecb17e182dd84febbdcded2879fa80b7": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "ed09000d8a464e21bb0d345c9042ad60": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_823885191d4c472e9f961c11a3c6ffc5", + "placeholder": "​", + "style": "IPY_MODEL_6eab9db0d1aa4b84b90fc3872e083dc6", + "value": "New Data Upload               : " + } + }, + "ed4d26c9971d41ba821bcbf8c876c1cb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ee0c45ace98b42a3a5c7d39f997d749d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ee43ac368f5a4aa0813035b3d07cc399": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "ee900b2750c14293af20f0a47ca57f6c": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "eef7a636fa3d45b0865133884b93eea9": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "efeab27804f448febcf5335f0be8302d": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f02d91e96fe84c0781b1c6e17fd537ae": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f0e4397588a847af90236075a3065ac7": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f16acd23373845d3894da4abf9500e0f": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f31c8cc62d4c401d8a865e6caad20c38": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_eef7a636fa3d45b0865133884b93eea9", + "max": 613, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_9d9e8a585584449fbc2982735731b96e", + "value": 613 + } + }, + "f3ee5b5442b447539b1d7a72a9df1b58": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f46385b2c5dd46ebae4f130e22bc2b51": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f50bbeaadfe1453fb7880dc8d725fefb": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f530e71385fb41fbac41b8ac8c4e6d8e": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_73366bb0f86c4689828558a6db8160c2", + "placeholder": "​", + "style": "IPY_MODEL_70c43ae789a94fa8b686164510c86176", + "value": "Generating reserve split: 100%" + } + }, + "f5fe5f5074154467a6d5101f06b2dfc5": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_bd9250796f574171b657eb6da8880200", + "max": 1500, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a6969e8ebd3d4f2aa1fb6d9153654a28", + "value": 1500 + } + }, + "f63a0c3bd30741e389921c5a0c0257b6": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "ProgressStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "f7143a33b8ec4638934f319f04daa5fe": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f74e56c5f86046d8812584b3f4b460ce": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f803f04e1f0b4c8db5b2a571538790d3": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f834d546d5634bcabf4776770c6d8871": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_efeab27804f448febcf5335f0be8302d", + "placeholder": "​", + "style": "IPY_MODEL_c6ac84d0c64b4259be243b913caf652c", + "value": "Generating train split: 100%" + } + }, + "f93c3a6553d1414ebc5ff9e5b18fb4dd": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "DescriptionStyleModel", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f9f7b1fc79dc4bee9b6a0a946ff39bb2": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1056869d6f2048b38e79ab0bdddf0d55", + "placeholder": "​", + "style": "IPY_MODEL_1c846669e92d4d3a9cd91c408809ba69", + "value": " 632/632 [00:00<00:00, 10.3kB/s]" + } + }, + "fa9a37a523ec459e8d02007b55b1ba20": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "FloatProgressModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_df691f3fe6d84515aea9eba173c19208", + "max": 632, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_609b59d6e0544e39a92d47ef036baf47", + "value": 632 + } + }, + "facd2d2ea3fd48f9a1ac2cc13bef64b8": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fbdf24206c1f4640be831670f4d29ed0": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_f530e71385fb41fbac41b8ac8c4e6d8e", + "IPY_MODEL_e01e04ec36af435fa9af715377355e5a", + "IPY_MODEL_4649e83451ae45fc9e47878075e04834" + ], + "layout": "IPY_MODEL_a9e1f270b5314d4ba6c0417313dbd226" + } + }, + "fc8ba4f1606743dcabc2ee0dd482b704": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0e00775c7821414fb82084db4c71aff9", + "placeholder": "​", + "style": "IPY_MODEL_e18fbe8e72964a569c24722e35b81cb2", + "value": "Map: 100%" + } + }, + "fcbdd1e084124303be96ca0a89a8e293": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HTMLModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_512998b463a04362a4d618f503ceb95c", + "placeholder": "​", + "style": "IPY_MODEL_2e7179f8d86740689b94aa8af55f403d", + "value": "merges.txt: " + } + }, + "fd41dbbd73c5487d9b0d5e3751385225": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_3f871a98b3214aecb047e164dc4a2a5d", + "IPY_MODEL_a419e0561e0f4b3da3f0eb8cb657755f", + "IPY_MODEL_87273b19125e42d0ad471db11f600a15" + ], + "layout": "IPY_MODEL_170a45be12e84118b1499c2d5a6c1b49" + } + }, + "fdd57fafdc3747baa062dfce006addbf": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fe237eb64d7b4a71bf13753010e77cbb": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "feebd174d6514ce69a24462b8cd314c4": { + "model_module": "@jupyter-widgets/controls", + "model_module_version": "1.5.0", + "model_name": "HBoxModel", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_3ad89276ef674026baca9d24d1296710", + "IPY_MODEL_3d39bd5c62554dc98e37f26209681667", + "IPY_MODEL_d8cd88776dd640b8a2790bd8222a32e5" + ], + "layout": "IPY_MODEL_2a30540f69414facb204ef8a7e6dea4a" + } + }, + "ff0c2a46d55946459f52d2dd09e05674": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ffbda3ae381149c58b0f4f4ca3aba694": { + "model_module": "@jupyter-widgets/base", + "model_module_version": "1.2.0", + "model_name": "LayoutModel", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + } + }, + "version_major": 2, + "version_minor": 0 + } } }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} diff --git a/train_grpo.py b/train_grpo.py new file mode 100644 index 0000000000000000000000000000000000000000..7dd9c6acaf7ca823c63811959fc08016086e72e1 --- /dev/null +++ b/train_grpo.py @@ -0,0 +1,1283 @@ +"""GRPO training for the AWS RL environment — multi-turn rollouts + parallel envs. + +Mirrors the kube-sre-gym training pattern (heavy logic in this module, thin +notebook on top): + - Each "episode" runs up to MAX_TURNS steps. + - Each step = one ``aws ...`` command; the command's stdout/stderr is fed + back into the next turn's prompt as the user message. + - Each GRPO step picks ONE curriculum task and runs G concurrent rollouts + (one per env in MultiTurnEnvPool) sharing that task. + - prompt_ids / completion_ids / logprobs are accumulated across turns so + GRPO assigns episode-level reward to the full token sequence. + +Usage (CLI):: + + # Single training pass with explicit hyperparams + python train_grpo.py --mode train \\ + --env-url http://localhost:8000 \\ + --num-generations 8 --max-turns 6 --max-steps 200 + + # Optuna search over hyperparams, then dump best_cfg.json + python train_grpo.py --mode optuna --n-trials 6 + + # Optuna search, then full-length retrain using the best config + python train_grpo.py --mode full --n-trials 6 --max-steps 200 +""" + +from __future__ import annotations + +import argparse +import asyncio +import csv +import gc +import json +import logging +import re +import threading +from dataclasses import dataclass +from datetime import datetime +from pathlib import Path +from typing import Any, Callable, Optional + +import torch +from datasets import Dataset +from peft import LoraConfig, PeftModel +from transformers import AutoTokenizer +from trl import GRPOConfig, GRPOTrainer + +from client import AwsRlEnv +from models import AwsRlAction, AwsRlObservation, Task, TaskDifficulty, TaskID +from server.services.curriculum import Curriculum + +logger = logging.getLogger(__name__) + + +# ============================================================ +# System prompt — multi-turn AWS CLI agent +# ============================================================ + +SYSTEM_PROMPT = """You are an expert AWS Operations agent. You operate a simulated AWS cloud by emitting ONE AWS CLI command per turn. + +The user message contains: + - The task description. + - (Optional) A history of your previous commands and their outputs from earlier in this episode — use them to decide your next move. + - The most recent observation (last command's stdout / stderr / progress). + +Each turn: + 1. Optionally reason inside a single ... block. Keep it concise. + 2. After , on a NEW LINE, output EXACTLY ONE AWS CLI command starting with "aws ". + +Hard rules: + - The command line must contain ONLY the command — no markdown, no backticks, no quotes around it, no trailing commentary. + - If a command failed last turn, try a DIFFERENT approach. Do not repeat the exact same command twice in a row. + - When the task description names a specific resource (a bucket, table, queue, etc.), use that exact name. +""" + + +DEFAULT_CFG: dict[str, Any] = { + "learning_rate": 5e-6, + "beta": 0.04, + "num_generations": 8, + "temperature": 0.9, + "top_p": 0.95, + "lora_r": 16, + "lora_alpha_mul": 2, + "max_turns": 6, +} + + +# ============================================================ +# Helpers — prompt formatting + command parsing +# ============================================================ + +_THINK_BLOCK = re.compile(r"]*>.*?", re.DOTALL | re.IGNORECASE) +_OPEN_THINK = re.compile(r"]*>.*", re.DOTALL | re.IGNORECASE) + + +def extract_aws_command(raw: str) -> str: + """Strip blocks + markdown fences, return the first ``aws ...`` line. + + Falls back to ``aws help`` so the env always gets a syntactically valid + command (the env will just produce a help-text observation, which is a + better RL signal than a parse error). + """ + cleaned = _THINK_BLOCK.sub("", raw) + cleaned = _OPEN_THINK.sub("", cleaned) + for line in cleaned.splitlines(): + line = line.strip().strip("`").strip() + if line.startswith("aws "): + return line + return "aws help" + + +def _truncate(text: str, n: int) -> str: + if not text: + return "" + if len(text) <= n: + return text + return text[: n - 3] + "..." + + +def format_observation(obs: AwsRlObservation) -> str: + """Render the latest env observation as a compact text block.""" + parts: list[str] = [] + if obs.command_output: + parts.append(f"Output:\n{_truncate(obs.command_output, 800)}") + if obs.error: + parts.append(f"Error:\n{_truncate(obs.error, 400)}") + parts.append( + f"Progress: {obs.partial_progress:.2f} " + f"Achieved: {obs.task_achieved} Step: {obs.step_count}" + ) + if obs.hint_text: + parts.append(f"Hint: {_truncate(obs.hint_text, 200)}") + return "\n".join(parts) + + +def format_history(history: list[dict], keep_last: int = 6) -> str: + """Render the last ``keep_last`` (cmd, output, reward) tuples for context.""" + if not history: + return "" + recent = history[-keep_last:] + rendered: list[str] = ["PREVIOUS COMMANDS:"] + for i, h in enumerate(recent, start=max(1, len(history) - keep_last + 1)): + rendered.append( + f"[{i}] $ {h['command']}\n" + f" output: {_truncate(h['output'], 300)}\n" + f" reward: {h['reward']:.2f}" + ) + return "\n".join(rendered) + + +def apply_chat_template(tokenizer: AutoTokenizer, messages: list[dict]) -> str: + """Apply a chat template; fall back to a plain rendering if none is set.""" + if getattr(tokenizer, "chat_template", None): + try: + return tokenizer.apply_chat_template( + messages, add_generation_prompt=True, tokenize=False + ) + except TypeError: + return tokenizer.apply_chat_template(messages, tokenize=False) + parts: list[str] = [] + for m in messages: + parts.append(f"<|{m['role']}|>\n{m['content']}\n") + parts.append("<|assistant|>\n") + return "".join(parts) + + +def build_user_prompt(task: Task, obs: AwsRlObservation, history: list[dict]) -> str: + desc = task.description + if task.desired_state_spec: + desc = f"{desc}\n\nDesired end state:\n{task.desired_state_spec}" + history_text = format_history(history) + obs_text = format_observation(obs) + if history_text: + return f"TASK: {desc}\n\n{history_text}\n\n---\n\nCURRENT OBSERVATION:\n{obs_text}" + return f"TASK: {desc}\n\nCURRENT OBSERVATION:\n{obs_text}" + + +# ============================================================ +# Policy loading — Unsloth 4-bit base + LoRA-from-SFT-adapter +# ============================================================ + + +@dataclass +class PolicySpec: + base_model: str = "unsloth/Qwen2.5-Coder-3B-Instruct-bnb-4bit" + sft_adapter: str = "Sizzing/aws-rl-sft-qwen25coder3b-adapter" + max_seq_length: int = 3072 + + +def load_policy( + base_model: str, + sft_adapter: Optional[str] = None, + max_seq_length: int = 3072, + trainable: bool = True, +): + """Load Unsloth 4-bit base + (optional) LoRA adapter from the SFT run. + + ``trainable=True`` returns a PeftModel ready for GRPO training (Unsloth's + training kernels enabled, input require-grads hook installed). + ``trainable=False`` returns the same stack in inference mode for eval. + """ + from unsloth import FastLanguageModel + + base, tokenizer = FastLanguageModel.from_pretrained( + model_name=base_model, + max_seq_length=max_seq_length, + load_in_4bit=True, + ) + if sft_adapter: + model = PeftModel.from_pretrained(base, sft_adapter, is_trainable=trainable) + else: + # No adapter: GRPOTrainer can attach a fresh LoRA via peft_config later. + model = base + + if trainable: + FastLanguageModel.for_training(model) + if hasattr(model, "enable_input_require_grads"): + model.enable_input_require_grads() + else: + FastLanguageModel.for_inference(model) + + if tokenizer.pad_token is None: + tokenizer.pad_token = tokenizer.eos_token + + return model, tokenizer + + +def free_model(model) -> None: + """Release VRAM held by ``model`` and any captured optimizer state.""" + try: + del model + except Exception: + pass + gc.collect() + if torch.cuda.is_available(): + torch.cuda.empty_cache() + + +# ============================================================ +# Multi-turn rollout — one episode in one env +# ============================================================ + + +@dataclass +class SamplingCfg: + temperature: float = 0.9 + top_p: float = 0.95 + max_new_tokens: int = 256 + max_prompt_length: int = 2048 + + +_GENERATE_LOCK = threading.Lock() +"""Serialise model.generate() calls across the asyncio.gather rollout group. + +The model lives on a single GPU; concurrent generate() calls would collide. +We let the env step run concurrently (the slow part — WebSocket round-trip + +MiniStack execution); only the generation is serialised. +""" + + +def _generate_with_logprobs( + model, + tokenizer, + prompt_text: str, + sampling: SamplingCfg, +) -> tuple[list[int], list[int], list[float]]: + """Generate one completion + return per-token logprobs. + + Returns: (prompt_ids, completion_ids, completion_logprobs). + """ + with _GENERATE_LOCK: + prompt_input = tokenizer( + prompt_text, + return_tensors="pt", + truncation=True, + max_length=sampling.max_prompt_length, + ).to(model.device) + + was_training = model.training + model.eval() + try: + with torch.no_grad(): + gen_out = model.generate( + **prompt_input, + max_new_tokens=sampling.max_new_tokens, + do_sample=True, + temperature=sampling.temperature, + top_p=sampling.top_p, + return_dict_in_generate=True, + output_scores=True, + pad_token_id=tokenizer.pad_token_id, + ) + finally: + if was_training: + model.train() + + prompt_ids = prompt_input.input_ids[0].tolist() + prompt_len = len(prompt_ids) + completion_seq = gen_out.sequences[0, prompt_len:].tolist() + + # Per-token logprobs from raw logits. + logprobs: list[float] = [] + for i, scores_t in enumerate(gen_out.scores): + if i >= len(completion_seq): + break + lp = torch.log_softmax(scores_t[0].float(), dim=-1) + logprobs.append(float(lp[completion_seq[i]].item())) + + return prompt_ids, completion_seq, logprobs + + +async def rollout_one_episode( + env: AwsRlEnv, + task: Task, + model, + tokenizer, + system_prompt: str, + max_turns: int, + max_total_tokens: int, + sampling: SamplingCfg, +) -> dict: + """Run one multi-turn episode in one env, accumulating tokens across turns.""" + try: + res = await env.reset(task=task) + except Exception as e: + logger.warning("reset() failed for task=%s: %s", task.task_id, e) + return { + "prompt_ids": [], + "completion_ids": [], + "logprobs": [], + "task_reward": -1.0, + "task_achieved": False, + "final_progress": 0.0, + "num_steps": 0, + "transcript": [{"error": f"reset failed: {e!r}"}], + } + obs: AwsRlObservation = res.observation + + prompt_ids: list[int] = [] + completion_ids: list[int] = [] + logprobs: list[float] = [] + step_rewards: list[float] = [] + history: list[dict] = [] + final_progress = float(getattr(obs, "partial_progress", 0.0) or 0.0) + final_achieved = bool(getattr(obs, "task_achieved", False)) + + for _turn in range(max_turns): + if res.done: + break + if len(completion_ids) >= max_total_tokens: + break + + user_text = build_user_prompt(task, obs, history) + messages = [ + {"role": "system", "content": system_prompt}, + {"role": "user", "content": user_text}, + ] + prompt_text = apply_chat_template(tokenizer, messages) + + # Generation runs on the calling thread (blocking) but env.step calls + # for other rollouts in this group can overlap because they're all + # awaiting in the same loop. + loop = asyncio.get_running_loop() + turn_prompt_ids, turn_completion_ids, turn_logprobs = await loop.run_in_executor( + None, _generate_with_logprobs, model, tokenizer, prompt_text, sampling + ) + completion_text = tokenizer.decode(turn_completion_ids, skip_special_tokens=True) + cmd = extract_aws_command(completion_text) + + try: + res = await env.step(AwsRlAction(command=cmd)) + step_reward = float(res.reward or 0.0) + except Exception as e: + logger.warning("step() error on cmd=%r: %s", cmd[:80], e) + step_reward = -0.1 + history.append( + { + "command": cmd, + "output": f"ERROR: {e!r}", + "reward": step_reward, + } + ) + prompt_ids.extend(turn_prompt_ids) + completion_ids.extend(turn_completion_ids) + logprobs.extend(turn_logprobs) + step_rewards.append(step_reward) + break + + prompt_ids.extend(turn_prompt_ids) + completion_ids.extend(turn_completion_ids) + logprobs.extend(turn_logprobs) + step_rewards.append(step_reward) + obs = res.observation + final_progress = float(getattr(obs, "partial_progress", 0.0) or 0.0) + final_achieved = bool(getattr(obs, "task_achieved", False)) + history.append( + { + "command": cmd, + "output": _truncate(getattr(obs, "command_output", "") or "", 500), + "reward": step_reward, + } + ) + + return { + "prompt_ids": prompt_ids, + "completion_ids": completion_ids, + "logprobs": logprobs, + "task_reward": float(sum(step_rewards)) if step_rewards else -1.0, + "task_achieved": final_achieved, + "final_progress": final_progress, + "num_steps": len(history), + "transcript": history, + "task_id": int(task.task_id), + "difficulty": task.difficulty.value, + } + + +# ============================================================ +# MultiTurnEnvPool — sync wrapper around N async env sessions +# ============================================================ + + +class MultiTurnEnvPool: + """N persistent WebSocket env sessions, exposed via a sync ``run_group`` API. + + Owns a background thread running an asyncio loop. Connect / close happens + once for the lifetime of training. Submitted coroutines run in the + background loop via ``asyncio.run_coroutine_threadsafe`` and the calling + thread blocks on the resulting concurrent.futures.Future. + """ + + def __init__(self, base_url: str, size: int, timeout_s: float = 120.0) -> None: + if size < 1: + raise ValueError("size must be >= 1") + self.base_url = base_url + self.size = size + self.timeout_s = timeout_s + self._envs: list[AwsRlEnv] = [] + self._loop: Optional[asyncio.AbstractEventLoop] = None + self._thread: Optional[threading.Thread] = None + self._ready = threading.Event() + self._setup_error: Optional[BaseException] = None + + def start(self) -> None: + """Open N WebSocket sessions on the background loop.""" + if self._thread is not None: + return + + def run() -> None: + loop = asyncio.new_event_loop() + self._loop = loop + asyncio.set_event_loop(loop) + try: + loop.run_until_complete(self._connect_all()) + except BaseException as e: + self._setup_error = e + self._ready.set() + return + self._ready.set() + loop.run_forever() + + self._thread = threading.Thread(target=run, daemon=True, name="env-pool") + self._thread.start() + self._ready.wait() + if self._setup_error is not None: + raise RuntimeError( + f"MultiTurnEnvPool failed to connect {self.size} sessions to " + f"{self.base_url}: {self._setup_error!r}" + ) + logger.info("MultiTurnEnvPool: %d sessions on %s", self.size, self.base_url) + + async def _connect_all(self) -> None: + envs = [AwsRlEnv(base_url=self.base_url) for _ in range(self.size)] + try: + await asyncio.gather(*(e.connect() for e in envs)) + except BaseException: + await asyncio.gather(*(e.close() for e in envs), return_exceptions=True) + raise + self._envs = envs + + def close(self) -> None: + if self._thread is None or self._loop is None: + return + loop = self._loop + + async def _shutdown() -> None: + await asyncio.gather( + *(e.close() for e in self._envs), return_exceptions=True + ) + + try: + fut = asyncio.run_coroutine_threadsafe(_shutdown(), loop) + fut.result(timeout=10.0) + except Exception as e: + logger.warning("Pool shutdown error (ignored): %s", e) + finally: + loop.call_soon_threadsafe(loop.stop) + self._thread.join(timeout=5.0) + self._thread = None + self._loop = None + self._envs = [] + + def run_group( + self, + task: Task, + model, + tokenizer, + system_prompt: str, + max_turns: int, + max_total_tokens: int, + sampling: SamplingCfg, + ) -> list[dict]: + """Run N concurrent multi-turn rollouts on the same task. Sync; blocks.""" + assert self._loop is not None and self._envs, "call start() first" + + async def _gather() -> list[dict]: + return list( + await asyncio.gather( + *( + rollout_one_episode( + env, + task, + model, + tokenizer, + system_prompt, + max_turns, + max_total_tokens, + sampling, + ) + for env in self._envs + ) + ) + ) + + fut = asyncio.run_coroutine_threadsafe(_gather(), self._loop) + return fut.result(timeout=self.timeout_s * max(1, max_turns)) + + def __enter__(self) -> "MultiTurnEnvPool": + self.start() + return self + + def __exit__(self, *exc) -> None: + self.close() + + +# ============================================================ +# Reward functions (TRL convention) + rollout_func factory +# ============================================================ + + +def reward_task(completions: list[str], **kwargs) -> list[float]: + rewards = kwargs.get("task_reward") + if rewards is None: + return [0.0 for _ in completions] + return [float(r) for r in rewards] + + +def reward_achieved(completions: list[str], **kwargs) -> list[float]: + flags = kwargs.get("task_achieved") + if flags is None: + return [0.0 for _ in completions] + return [float(f) for f in flags] + + +def reward_progress(completions: list[str], **kwargs) -> list[float]: + progress = kwargs.get("final_progress") + if progress is None: + return [0.0 for _ in completions] + return [float(p) for p in progress] + + +def make_rollout_func( + curriculum: Curriculum, + pool: MultiTurnEnvPool, + model, + tokenizer, + system_prompt: str, + max_turns: int, + max_total_tokens: int, + sampling: SamplingCfg, + log_episode: Callable[[Task, list[dict]], None], +) -> Callable: + """Build the closure GRPO calls each step. + + ``prompts`` length equals ``num_generations``. We ignore the prompt strings + because the curriculum drives task selection — every rollout in the group + runs the same task forced through ``env.reset(task=...)``. + """ + + def rollout_func(prompts: list[str], trainer: GRPOTrainer) -> dict[str, list]: + task = curriculum.next_task() + results = pool.run_group( + task, + model, + tokenizer, + system_prompt, + max_turns, + max_total_tokens, + sampling, + ) + # Pad / truncate to len(prompts) — defence in depth, group size should match. + if len(results) < len(prompts): + results.extend(results[-1:] * (len(prompts) - len(results))) + results = results[: len(prompts)] + + group_rewards = [r["task_reward"] for r in results] + group_achieved = [r["task_achieved"] for r in results] + group_progress = [r["final_progress"] for r in results] + + curriculum.record_result( + task, + achieved=any(group_achieved), + reward=float(sum(group_rewards) / len(group_rewards)) if group_rewards else 0.0, + ) + log_episode(task, results) + + return { + "prompt_ids": [r["prompt_ids"] for r in results], + "completion_ids": [r["completion_ids"] for r in results], + "logprobs": [r["logprobs"] for r in results], + "task_reward": group_rewards, + "task_achieved": [float(a) for a in group_achieved], + "final_progress": group_progress, + } + + return rollout_func + + +# ============================================================ +# CSV / JSONL logging + reward plotter +# ============================================================ + + +class EpisodeLogger: + """Append-only CSV + JSONL writer for per-rollout episode rows.""" + + HEADER = [ + "step", + "rollout_idx", + "task_id", + "difficulty", + "task_reward", + "task_achieved", + "final_progress", + "num_steps", + "tier", + "tier_success_rate", + "timestamp", + ] + + def __init__(self, output_dir: Path) -> None: + self.output_dir = output_dir + output_dir.mkdir(parents=True, exist_ok=True) + self.csv_path = output_dir / "reward_log.csv" + self.jsonl_path = output_dir / "transcripts.jsonl" + if not self.csv_path.exists(): + with open(self.csv_path, "w", newline="") as f: + csv.writer(f).writerow(self.HEADER) + self._step_counter = 0 + + def log(self, task: Task, results: list[dict], curriculum: Curriculum) -> None: + self._step_counter += 1 + stats = curriculum.get_stats() + ts = datetime.now().isoformat() + with open(self.csv_path, "a", newline="") as f: + writer = csv.writer(f) + for i, r in enumerate(results): + writer.writerow( + [ + self._step_counter, + i, + int(task.task_id), + task.difficulty.value, + f"{r['task_reward']:.4f}", + int(bool(r["task_achieved"])), + f"{r['final_progress']:.4f}", + r["num_steps"], + stats["tier"], + stats["tier_success_rate"], + ts, + ] + ) + with open(self.jsonl_path, "a") as f: + for i, r in enumerate(results): + f.write( + json.dumps( + { + "step": self._step_counter, + "rollout_idx": i, + "task_id": int(task.task_id), + "difficulty": task.difficulty.value, + "task_reward": r["task_reward"], + "task_achieved": bool(r["task_achieved"]), + "final_progress": r["final_progress"], + "num_steps": r["num_steps"], + "tier": stats["tier"], + "transcript": r["transcript"], + } + ) + + "\n" + ) + + rewards = [r["task_reward"] for r in results] + achieved = [bool(r["task_achieved"]) for r in results] + logger.info( + "Step %d task=%d (%s) rewards=%s achieved=%d/%d tier=%s tier_rate=%.2f", + self._step_counter, + int(task.task_id), + task.difficulty.value, + [round(r, 2) for r in rewards], + sum(achieved), + len(achieved), + stats["tier"], + stats["tier_success_rate"], + ) + + +def plot_rewards(csv_path: Path, out_path: Path) -> None: + """Per-step mean group reward + 10-step rolling avg + per-tier curves.""" + import matplotlib + + matplotlib.use("Agg") + import matplotlib.pyplot as plt + + if not csv_path.exists(): + logger.warning("No CSV at %s — skipping plot.", csv_path) + return + + steps_data: dict[int, list[float]] = {} + tier_data: dict[str, list[tuple[int, float]]] = {} + with open(csv_path) as f: + reader = csv.DictReader(f) + for row in reader: + step = int(row["step"]) + r = float(row["task_reward"]) + tier = row["tier"] + steps_data.setdefault(step, []).append(r) + tier_data.setdefault(tier, []).append((step, r)) + + if not steps_data: + logger.warning("CSV at %s has no rows — skipping plot.", csv_path) + return + + steps = sorted(steps_data.keys()) + means = [sum(steps_data[s]) / len(steps_data[s]) for s in steps] + + rolling = [] + window = 10 + for i in range(len(means)): + lo = max(0, i - window + 1) + rolling.append(sum(means[lo : i + 1]) / (i - lo + 1)) + + fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8)) + ax1.plot(steps, means, label="mean group reward", alpha=0.5) + ax1.plot(steps, rolling, label=f"rolling avg (k={window})", linewidth=2) + ax1.set_xlabel("GRPO step") + ax1.set_ylabel("reward") + ax1.set_title("Group mean reward over training") + ax1.legend() + ax1.grid(alpha=0.3) + + for tier, points in tier_data.items(): + xs = [p[0] for p in points] + ys = [p[1] for p in points] + ax2.scatter(xs, ys, s=10, alpha=0.5, label=tier) + ax2.set_xlabel("GRPO step") + ax2.set_ylabel("reward") + ax2.set_title("Per-rollout reward by curriculum tier") + ax2.legend() + ax2.grid(alpha=0.3) + + fig.tight_layout() + fig.savefig(out_path, dpi=120) + plt.close(fig) + logger.info("Reward plot written to %s", out_path) + + +# ============================================================ +# Validation eval + Optuna search +# ============================================================ + + +def pick_validation_task_ids( + curriculum: Optional[Curriculum] = None, + k_per_tier: int = 2, + seed: int = 42, +) -> list[int]: + """Pick a frozen list of task ids — k per tier — for held-out validation.""" + import random + + rng = random.Random(seed) + cur = curriculum or Curriculum() + chosen: list[int] = [] + for tier in TaskDifficulty: + try: + from server.services.curriculum import load_tier + + tier_tasks = load_tier(tier, cur._tasks_dir) + except Exception as e: + logger.warning("Could not load tier %s for val: %s", tier.value, e) + continue + if not tier_tasks: + continue + sample = rng.sample(tier_tasks, k=min(k_per_tier, len(tier_tasks))) + chosen.extend(int(t.task_id) for t in sample) + return chosen + + +def evaluate_on_validation( + model, + tokenizer, + pool: MultiTurnEnvPool, + val_task_ids: list[int], + system_prompt: str, + max_turns: int, + max_total_tokens: int, + sampling: SamplingCfg, + curriculum: Optional[Curriculum] = None, +) -> dict[str, float]: + """Run ONE rollout per val task on env[0] of the pool. Return aggregate metrics.""" + cur = curriculum or Curriculum() + achieved_flags: list[float] = [] + progresses: list[float] = [] + rewards: list[float] = [] + + async def _eval_one(task: Task) -> dict: + env = pool._envs[0] + return await rollout_one_episode( + env, + task, + model, + tokenizer, + system_prompt, + max_turns, + max_total_tokens, + sampling, + ) + + for tid in val_task_ids: + try: + task = cur.get_task_by_id(TaskID(int(tid))) + except KeyError: + logger.warning("val task_id=%d not found — skipping", tid) + continue + fut = asyncio.run_coroutine_threadsafe(_eval_one(task), pool._loop) + try: + res = fut.result(timeout=pool.timeout_s * max(1, max_turns)) + except Exception as e: + logger.warning("val rollout failed for task=%d: %s", tid, e) + continue + achieved_flags.append(float(res["task_achieved"])) + progresses.append(float(res["final_progress"])) + rewards.append(float(res["task_reward"])) + + n = max(1, len(achieved_flags)) + return { + "achieved_rate": sum(achieved_flags) / n, + "mean_progress": sum(progresses) / n, + "mean_reward": sum(rewards) / n, + "n_evaluated": float(len(achieved_flags)), + } + + +def _build_grpo_config( + output_dir: Path, + cfg: dict[str, Any], + max_steps: int, + max_completion_length: int, + max_prompt_length: int, + save_steps: int = 25, + save_strategy: str = "steps", + report_to: str = "none", +) -> GRPOConfig: + return GRPOConfig( + output_dir=str(output_dir), + max_steps=max_steps, + learning_rate=float(cfg["learning_rate"]), + beta=float(cfg["beta"]), + num_generations=int(cfg["num_generations"]), + generation_batch_size=int(cfg["num_generations"]), + per_device_train_batch_size=1, + gradient_accumulation_steps=8, + gradient_checkpointing=True, + gradient_checkpointing_kwargs={"use_reentrant": False}, + max_completion_length=max_completion_length, + max_prompt_length=max_prompt_length, + temperature=float(cfg["temperature"]), + top_p=float(cfg["top_p"]), + logging_steps=1, + save_strategy=save_strategy, + save_steps=save_steps, + save_total_limit=3, + report_to=report_to, + loss_type="dapo", + mask_truncated_completions=True, + warmup_ratio=0.05, + lr_scheduler_type="cosine", + max_grad_norm=1.0, + use_vllm=False, + remove_unused_columns=False, + ) + + +def _build_dummy_dataset(num_rows: int) -> Dataset: + """A length-only dataset; the prompts are ignored by ``rollout_func``.""" + return Dataset.from_dict({"prompt": ["solve"] * max(1, num_rows)}) + + +def optuna_search( + n_trials: int, + trial_max_steps: int, + val_task_ids: list[int], + base_model: str, + sft_adapter: Optional[str], + env_url: str, + output_dir: Path, + max_total_tokens: int = 2048, + max_completion_length: int = 256, + max_prompt_length: int = 2048, + seed: int = 42, +): + """TPE-sampled hyperparam search. Persists to ``output_dir/optuna.db``.""" + import optuna + + output_dir.mkdir(parents=True, exist_ok=True) + study = optuna.create_study( + direction="maximize", + study_name="aws-rl-grpo", + storage=f"sqlite:///{output_dir / 'optuna.db'}", + load_if_exists=True, + sampler=optuna.samplers.TPESampler(seed=seed), + ) + + def _objective(trial: optuna.Trial) -> float: + cfg = { + "learning_rate": trial.suggest_float("learning_rate", 1e-6, 1e-4, log=True), + "beta": trial.suggest_float("beta", 0.0, 0.1), + "num_generations": trial.suggest_categorical("num_generations", [4, 8]), + "temperature": trial.suggest_float("temperature", 0.7, 1.0), + "top_p": trial.suggest_float("top_p", 0.85, 0.98), + "lora_r": trial.suggest_categorical("lora_r", [8, 16, 32]), + "lora_alpha_mul": trial.suggest_categorical("lora_alpha_mul", [1, 2, 4]), + "max_turns": trial.suggest_categorical("max_turns", [4, 6, 8]), + } + trial_dir = output_dir / f"trial_{trial.number:03d}" + return _run_one_trial( + cfg=cfg, + trial_max_steps=trial_max_steps, + val_task_ids=val_task_ids, + base_model=base_model, + sft_adapter=sft_adapter, + env_url=env_url, + output_dir=trial_dir, + max_total_tokens=max_total_tokens, + max_completion_length=max_completion_length, + max_prompt_length=max_prompt_length, + ) + + study.optimize(_objective, n_trials=n_trials, gc_after_trial=True) + + best_path = output_dir / "best_cfg.json" + payload = {"best_value": study.best_value, "best_params": dict(study.best_params)} + with open(best_path, "w") as f: + json.dump(payload, f, indent=2) + logger.info( + "Optuna study finished. best_value=%.4f best_params=%s -> %s", + study.best_value, + study.best_params, + best_path, + ) + return study + + +def _run_one_trial( + cfg: dict[str, Any], + trial_max_steps: int, + val_task_ids: list[int], + base_model: str, + sft_adapter: Optional[str], + env_url: str, + output_dir: Path, + max_total_tokens: int, + max_completion_length: int, + max_prompt_length: int, +) -> float: + """One Optuna trial: load → train → eval on val tasks → tear down → return objective.""" + output_dir.mkdir(parents=True, exist_ok=True) + logger.info("Optuna trial cfg=%s -> %s", cfg, output_dir) + + model = tokenizer = None + pool: Optional[MultiTurnEnvPool] = None + trainer: Optional[GRPOTrainer] = None + try: + model, tokenizer = load_policy(base_model, sft_adapter, trainable=True) + + pool = MultiTurnEnvPool(env_url, size=int(cfg["num_generations"])) + pool.start() + + curriculum = Curriculum() + sampling = SamplingCfg( + temperature=float(cfg["temperature"]), + top_p=float(cfg["top_p"]), + max_new_tokens=max_completion_length, + max_prompt_length=max_prompt_length, + ) + ep_logger = EpisodeLogger(output_dir) + rollout_func = make_rollout_func( + curriculum=curriculum, + pool=pool, + model=model, + tokenizer=tokenizer, + system_prompt=SYSTEM_PROMPT, + max_turns=int(cfg["max_turns"]), + max_total_tokens=max_total_tokens, + sampling=sampling, + log_episode=lambda task, results: ep_logger.log(task, results, curriculum), + ) + + dataset = _build_dummy_dataset(trial_max_steps * int(cfg["num_generations"])) + grpo_cfg = _build_grpo_config( + output_dir=output_dir, + cfg=cfg, + max_steps=trial_max_steps, + max_completion_length=max_completion_length, + max_prompt_length=max_prompt_length, + save_strategy="no", + report_to="none", + ) + + trainer = GRPOTrainer( + model=model, + processing_class=tokenizer, + reward_funcs=[reward_task, reward_achieved, reward_progress], + train_dataset=dataset, + args=grpo_cfg, + rollout_func=rollout_func, + peft_config=None if sft_adapter else _lora_config(cfg), + ) + trainer.train() + + metrics = evaluate_on_validation( + model=trainer.model, + tokenizer=tokenizer, + pool=pool, + val_task_ids=val_task_ids, + system_prompt=SYSTEM_PROMPT, + max_turns=int(cfg["max_turns"]), + max_total_tokens=max_total_tokens, + sampling=sampling, + curriculum=curriculum, + ) + objective = 0.7 * metrics["achieved_rate"] + 0.3 * metrics["mean_progress"] + with open(output_dir / "trial_metrics.json", "w") as f: + json.dump({"cfg": cfg, "metrics": metrics, "objective": objective}, f, indent=2) + logger.info("Trial done: metrics=%s objective=%.4f", metrics, objective) + return float(objective) + finally: + if trainer is not None: + try: + del trainer + except Exception: + pass + if model is not None: + free_model(model) + if pool is not None: + try: + pool.close() + except Exception: + logger.exception("Pool close error during trial cleanup") + gc.collect() + if torch.cuda.is_available(): + torch.cuda.empty_cache() + + +def _lora_config(cfg: dict[str, Any]) -> LoraConfig: + r = int(cfg["lora_r"]) + alpha_mul = int(cfg["lora_alpha_mul"]) + return LoraConfig( + r=r, + lora_alpha=r * alpha_mul, + lora_dropout=0.05, + bias="none", + task_type="CAUSAL_LM", + target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], + ) + + +# ============================================================ +# Main training entrypoint (single training pass) +# ============================================================ + + +def run_training( + cfg: dict[str, Any], + *, + base_model: str, + sft_adapter: Optional[str], + env_url: str, + output_dir: Path, + max_steps: int, + max_total_tokens: int = 4096, + max_completion_length: int = 256, + max_prompt_length: int = 2048, + push_to_hub: bool = False, + hub_repo: Optional[str] = None, +) -> Path: + """Run a full GRPO training pass with the supplied config dict.""" + output_dir.mkdir(parents=True, exist_ok=True) + logger.info("run_training cfg=%s -> %s", cfg, output_dir) + + model, tokenizer = load_policy(base_model, sft_adapter, trainable=True) + pool = MultiTurnEnvPool(env_url, size=int(cfg["num_generations"])) + pool.start() + + curriculum = Curriculum() + sampling = SamplingCfg( + temperature=float(cfg["temperature"]), + top_p=float(cfg["top_p"]), + max_new_tokens=max_completion_length, + max_prompt_length=max_prompt_length, + ) + ep_logger = EpisodeLogger(output_dir) + rollout_func = make_rollout_func( + curriculum=curriculum, + pool=pool, + model=model, + tokenizer=tokenizer, + system_prompt=SYSTEM_PROMPT, + max_turns=int(cfg["max_turns"]), + max_total_tokens=max_total_tokens, + sampling=sampling, + log_episode=lambda task, results: ep_logger.log(task, results, curriculum), + ) + + dataset = _build_dummy_dataset(max_steps * int(cfg["num_generations"])) + grpo_cfg = _build_grpo_config( + output_dir=output_dir, + cfg=cfg, + max_steps=max_steps, + max_completion_length=max_completion_length, + max_prompt_length=max_prompt_length, + ) + + trainer = GRPOTrainer( + model=model, + processing_class=tokenizer, + reward_funcs=[reward_task, reward_achieved, reward_progress], + train_dataset=dataset, + args=grpo_cfg, + rollout_func=rollout_func, + peft_config=None if sft_adapter else _lora_config(cfg), + ) + + try: + trainer.train() + finally: + try: + pool.close() + except Exception: + logger.exception("Pool close error after training") + try: + plot_rewards(ep_logger.csv_path, output_dir / "reward_plot.png") + except Exception as e: + logger.warning("plot_rewards failed: %s", e) + + trainer.save_model(str(output_dir)) + logger.info("Adapter saved to %s", output_dir) + + if push_to_hub and hub_repo: + trainer.push_to_hub(repo_id=hub_repo) + logger.info("Adapter pushed to https://huggingface.co/%s", hub_repo) + + return output_dir + + +# ============================================================ +# CLI +# ============================================================ + + +def _parse_args() -> argparse.Namespace: + p = argparse.ArgumentParser(description=__doc__) + p.add_argument("--mode", choices=["train", "optuna", "full"], default="train") + p.add_argument("--base-model", default=PolicySpec.base_model) + p.add_argument("--sft-adapter", default=PolicySpec.sft_adapter, + help="HF repo id of the SFT adapter (use empty string to disable)") + p.add_argument("--env-url", default="http://localhost:8000") + p.add_argument("--output-dir", default=None) + + # Train-mode hyperparams (mirror DEFAULT_CFG keys) + p.add_argument("--num-generations", type=int, default=DEFAULT_CFG["num_generations"]) + p.add_argument("--max-turns", type=int, default=DEFAULT_CFG["max_turns"]) + p.add_argument("--max-steps", type=int, default=200) + p.add_argument("--learning-rate", type=float, default=DEFAULT_CFG["learning_rate"]) + p.add_argument("--beta", type=float, default=DEFAULT_CFG["beta"]) + p.add_argument("--temperature", type=float, default=DEFAULT_CFG["temperature"]) + p.add_argument("--top-p", type=float, default=DEFAULT_CFG["top_p"]) + p.add_argument("--lora-r", type=int, default=DEFAULT_CFG["lora_r"]) + p.add_argument("--lora-alpha-mul", type=int, default=DEFAULT_CFG["lora_alpha_mul"]) + p.add_argument("--max-prompt-length", type=int, default=2048) + p.add_argument("--max-completion-length", type=int, default=256) + p.add_argument("--max-total-tokens", type=int, default=4096) + + # Optuna-specific + p.add_argument("--n-trials", type=int, default=6) + p.add_argument("--trial-max-steps", type=int, default=30) + p.add_argument("--val-tasks-per-tier", type=int, default=2) + + p.add_argument("--push-to-hub", action="store_true") + p.add_argument("--hub-repo", default=None) + return p.parse_args() + + +def _resolve_output_dir(args: argparse.Namespace) -> Path: + if args.output_dir: + return Path(args.output_dir) + ts = datetime.now().strftime("%Y-%m-%d_%H-%M-%S") + return Path("outputs") / f"aws-rl-grpo-{ts}" + + +def _cli_cfg(args: argparse.Namespace) -> dict[str, Any]: + return { + "learning_rate": args.learning_rate, + "beta": args.beta, + "num_generations": args.num_generations, + "temperature": args.temperature, + "top_p": args.top_p, + "lora_r": args.lora_r, + "lora_alpha_mul": args.lora_alpha_mul, + "max_turns": args.max_turns, + } + + +def main() -> None: + logging.basicConfig( + level=logging.INFO, + format="%(asctime)s %(levelname)s %(name)s %(message)s", + ) + args = _parse_args() + output_dir = _resolve_output_dir(args) + output_dir.mkdir(parents=True, exist_ok=True) + sft_adapter = args.sft_adapter or None + + if args.mode in ("optuna", "full"): + val_ids = pick_validation_task_ids(k_per_tier=args.val_tasks_per_tier) + with open(output_dir / "val_task_ids.json", "w") as f: + json.dump(val_ids, f) + study = optuna_search( + n_trials=args.n_trials, + trial_max_steps=args.trial_max_steps, + val_task_ids=val_ids, + base_model=args.base_model, + sft_adapter=sft_adapter, + env_url=args.env_url, + output_dir=output_dir, + max_total_tokens=args.max_total_tokens, + max_completion_length=args.max_completion_length, + max_prompt_length=args.max_prompt_length, + ) + if args.mode == "optuna": + return + cfg = {**DEFAULT_CFG, **dict(study.best_params)} + else: + cfg = _cli_cfg(args) + + run_training( + cfg, + base_model=args.base_model, + sft_adapter=sft_adapter, + env_url=args.env_url, + output_dir=output_dir, + max_steps=args.max_steps, + max_total_tokens=args.max_total_tokens, + max_completion_length=args.max_completion_length, + max_prompt_length=args.max_prompt_length, + push_to_hub=args.push_to_hub, + hub_repo=args.hub_repo, + ) + + +if __name__ == "__main__": + main() diff --git a/train_grpo_lora_final.ipynb b/train_grpo_lora_final.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..5d1f937809a6d1a0b8720d844ddcc833fb20bc72 --- /dev/null +++ b/train_grpo_lora_final.ipynb @@ -0,0 +1,16195 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "c108b1a2", + "metadata": { + "id": "c108b1a2" + }, + "source": [ + "# GRPO Fine-Tuning on the AWS RL Environment\n", + "\n", + "**Curriculum-driven GRPO**, built on top of the existing SFT LoRA adapter ([`Sizzing/aws-rl-sft-qwen25coder3b-adapter`](https://huggingface.co/Sizzing/aws-rl-sft-qwen25coder3b-adapter)). The priority-queue curriculum in [`server/services/curriculum.py`](https://github.com/UdayKiranPadhy/aws-rl-env/blob/master/server/services/curriculum.py) picks each training task based on novelty, weakness, and spaced repetition; TRL's `GRPOTrainer` owns the generate/score/update loop; rewards flow back into the curriculum through the reward function to close the mastery loop.\n", + "\n", + "Hyperparameter-tuned with Optuna, logged to Weights & Biases, checkpointed for safe resume, and published to a **separate** HuggingFace Hub repo so both the SFT and GRPO adapters coexist side-by-side.\n", + "\n", + "### Architecture\n", + "```\n", + "Hosted env server (Docker, AWS_RL_ENV_POOL_SIZE=8)\n", + " ▲ HTTPS tunnel\n", + " │ Colab / Kaggle VM (T4)\n", + " │ └─ main python\n", + " │ 8-way httpx pool (rewards) ├─ Unsloth: base + SFT adapter (trainable)\n", + " ├──────────────────────── │\n", + " │ ├─ TRL GRPOTrainer\n", + " │ 8-way GrpoPool WS (eval) │ ├─ train_ds = stream from Curriculum\n", + " └──────────────────────── │ ├─ G generations / prompt\n", + " │ ├─ reward_fn:\n", + " │ │ a) score via /reset + /step\n", + " │ │ b) curriculum.record_result(...)\n", + " │ └─ group-advantage + PPO-clip on LoRA\n", + " ├─ Optuna (sqlite, resumable)\n", + " └─ push → Sizzing/aws-rl-grpo-qwen25coder3b-adapter\n", + "```\n", + "\n", + "### Why curriculum-driven GRPO?\n", + "Plain dataset iteration is agnostic to the model’s current weaknesses. The curriculum surfaces novel + weak tasks more often, spaced-repeats mastered ones, and promotes tier only when the agent demonstrates sustained competence. GRPO's group-relative advantage + the curriculum's per-task mastery signal compose: a group of G completions on a hard task yields a high-variance advantage signal exactly when it matters.\n", + "\n", + "### Headline metrics (reported in the eval cells)\n", + "| Axis | SFT baseline | GRPO target | Stretch |\n", + "|----------------------|-------------:|------------:|--------:|\n", + "| `env_reward_mean` | ~0.85 | ≥0.92 | ≥0.97 |\n", + "| `env_success_rate` | ~85% | ≥92% | ≥97% |\n", + "| `recovery_rate` | ~40% | ≥60% | ≥75% |\n", + "| `drift_repair_rate` | ~30% | ≥55% | ≥70% |\n", + "| `hints_per_solved` | ~0.8 | ≤0.5 | ≤0.2 |\n", + "| `steps_to_solve` | ~6 | ≤5 | ≤4 |" + ] + }, + { + "cell_type": "markdown", + "id": "3f7aa285", + "metadata": { + "id": "3f7aa285" + }, + "source": [ + "## 1 · Install dependencies\n", + "\n", + "Mirrors the SFT notebook's pinning strategy. Key constraints: `trl>=0.16` for `GRPOTrainer`, `transformers>=4.50,<5.0` for Unsloth compatibility (the SFT notebook ran into this too), `--force-reinstall --no-deps` on `transformers` so TRL doesn't pull an incompatible version." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "2f683e16", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "2f683e16", + "outputId": "cadbf031-23d4-4b43-fc9a-a59aa5dc7103" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "\u001b[?25l \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m0.0/1.8 MB\u001b[0m \u001b[31m?\u001b[0m eta \u001b[36m-:--:--\u001b[0m\r\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.8/1.8 MB\u001b[0m \u001b[31m68.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25h" + ] + } + ], + "source": [ + "%pip install -q --upgrade pip\n", + "%pip install -q \"unsloth\"\n", + "%pip install -q \"trl>=0.18.2,<=0.24.0,!=0.19.0\" \"peft\" \"accelerate\" \"datasets\" \"bitsandbytes\"\n", + "%pip install -q \"transformers>=4.50,<5.0\" --force-reinstall --no-deps\n", + "%pip install -q \"optuna\"\n", + "%pip install -q \"httpx\" \"websockets\" \"pyyaml\" \"python-dotenv\"\n", + "%pip install -q \"huggingface_hub>=0.34,<1.0\"\n", + "%pip install -q \"openenv-core\"\n" + ] + }, + { + "cell_type": "markdown", + "id": "logging-setup-md", + "metadata": { + "id": "logging-setup-md" + }, + "source": [ + "### 1b · Logging & warning suppression\n", + "\n", + "Set up structured logging and suppress known benign warnings (PEFT config keys, notebook escape sequences, transformers do_sample advisory)." + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "logging-setup", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "logging-setup", + "outputId": "8857f297-9d17-4e62-e663-af002807003f" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "14:52:11 | INFO | grpo | Logging configured; benign warnings suppressed.\n" + ] + } + ], + "source": [ + "import logging\n", + "import sys\n", + "import warnings\n", + "\n", + "# ── Structured logging ──────────────────────────────────────────────\n", + "logging.basicConfig(\n", + " level=logging.INFO,\n", + " format=\"%(asctime)s | %(levelname)-7s | %(name)s | %(message)s\",\n", + " datefmt=\"%H:%M:%S\",\n", + " stream=sys.stdout,\n", + " force=True,\n", + ")\n", + "log = logging.getLogger(\"grpo\")\n", + "\n", + "# ── Suppress known benign warnings ──────────────────────────────────\n", + "# PEFT adapter was saved with a newer version; extra keys are safely ignored.\n", + "warnings.filterwarnings(\n", + " \"ignore\",\n", + " message=r\"Unexpected keyword arguments.*for class LoraConfig\",\n", + " category=UserWarning,\n", + ")\n", + "# The notebook package itself has an invalid escape sequence in its banner.\n", + "warnings.filterwarnings(\n", + " \"ignore\",\n", + " message=r\"invalid escape sequence\",\n", + " category=SyntaxWarning,\n", + ")\n", + "# Transformers logs \"do_sample is False but temperature is set\" when we\n", + "# intentionally use greedy decoding with temperature=1.0 (the default).\n", + "warnings.filterwarnings(\n", + " \"ignore\",\n", + " message=r\".*`do_sample` is set to `False`.*`temperature`.*\",\n", + " category=UserWarning,\n", + ")\n", + "\n", + "log.info(\"Logging configured; benign warnings suppressed.\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "ce043e2c", + "metadata": { + "id": "ce043e2c" + }, + "source": [ + "## 2 · Clone the AWS RL env repo\n", + "\n", + "We need the `client.AwsRlEnv` class, `models.py` pydantic types, `scripts/grpo_pool.py`, the curriculum loader, and the task YAMLs — these power the multi-step evaluator. We do **not** install or run any env server locally; the env is hosted elsewhere." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "2c0842fb", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "2c0842fb", + "outputId": "5ecf6f16-713b-4d20-bfeb-1450798b90c9" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "14:52:16 | INFO | grpo | Repo at /content/aws-rl-env — ready. sys.path[0]=/content/aws-rl-env\n" + ] + } + ], + "source": [ + "from __future__ import annotations\n", + "import os, sys, subprocess, shutil\n", + "from pathlib import Path\n", + "\n", + "REPO_URL = \"https://github.com/UdayKiranPadhy/aws-rl-env.git\"\n", + "\n", + "# Detect host in priority order: Kaggle first (it often has /content too),\n", + "# then Colab, then fall back to CWD for local runs.\n", + "if Path(\"/kaggle/working\").exists():\n", + " REPO_DIR = Path(\"/kaggle/working/aws-rl-env\")\n", + "elif Path(\"/content\").exists():\n", + " REPO_DIR = Path(\"/content/aws-rl-env\")\n", + "else:\n", + " REPO_DIR = (Path.cwd() / \"aws-rl-env\").resolve()\n", + "\n", + "if not REPO_DIR.exists():\n", + " subprocess.run([\"git\", \"clone\", \"--depth\", \"1\", REPO_URL, str(REPO_DIR)], check=True)\n", + "\n", + "# If a prior partial clone left no models.py, redo it.\n", + "if not (REPO_DIR / \"models.py\").exists():\n", + " shutil.rmtree(REPO_DIR, ignore_errors=True)\n", + " subprocess.run([\"git\", \"clone\", \"--depth\", \"1\", REPO_URL, str(REPO_DIR)], check=True)\n", + "\n", + "if str(REPO_DIR) not in sys.path:\n", + " sys.path.insert(0, str(REPO_DIR))\n", + "\n", + "assert (REPO_DIR / \"models.py\").exists(), f\"models.py missing under {REPO_DIR}\"\n", + "log.info(\"Repo at %s — ready. sys.path[0]=%s\", REPO_DIR, sys.path[0])\n" + ] + }, + { + "cell_type": "markdown", + "id": "253e6837", + "metadata": { + "id": "253e6837" + }, + "source": [ + "## 3 · Runtime detection\n", + "\n", + "Matches the SFT notebook so we pick `fp16` on T4 (bf16 unsupported) and `bf16` on A100/H100. Also sets the PyTorch allocator env var that cut OOMs on long Unsloth runs." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "cf5059b1", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "cf5059b1", + "outputId": "a5d04464-de76-4ccd-ef8b-02ac996bb034" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "14:52:29 | INFO | grpo | GPU: Tesla T4 | fp16=True bf16=False | OUT_DIR=/content/out\n" + ] + } + ], + "source": [ + "from dataclasses import dataclass\n", + "import torch\n", + "\n", + "IS_COLAB = True\n", + "IS_KAGGLE = False\n", + "\n", + "OUT_DIR = Path(\"/content/out\") if IS_COLAB else Path(\"/kaggle/working\") if IS_KAGGLE else Path.cwd() / \"out\"\n", + "OUT_DIR.mkdir(parents=True, exist_ok=True)\n", + "\n", + "os.environ.setdefault(\"PYTORCH_ALLOC_CONF\", \"expandable_segments:True\")\n", + "\n", + "\n", + "@dataclass(frozen=True)\n", + "class Runtime:\n", + " gpu_name: str\n", + " use_fp16: bool\n", + " use_bf16: bool\n", + "\n", + "\n", + "def detect_runtime() -> Runtime:\n", + " if not torch.cuda.is_available():\n", + " raise RuntimeError(\"No GPU detected. This notebook needs CUDA (T4/A100/H100).\")\n", + " name = torch.cuda.get_device_name(0)\n", + " is_t4 = \"T4\" in name\n", + " return Runtime(gpu_name=name, use_fp16=is_t4, use_bf16=not is_t4)\n", + "\n", + "\n", + "RT = detect_runtime()\n", + "log.info(\"GPU: %s | fp16=%s bf16=%s | OUT_DIR=%s\", RT.gpu_name, RT.use_fp16, RT.use_bf16, OUT_DIR)" + ] + }, + { + "cell_type": "markdown", + "id": "93c46602", + "metadata": { + "id": "93c46602" + }, + "source": [ + "## 4 · Training configuration\n", + "\n", + "One frozen `TrainingConfig` dataclass holds every tunable hyperparameter. Optuna hands trials a mutated copy of this same dataclass, so the trial path and the final-run path go through identical code.\n", + "\n", + "Separate `ModelSpec` and `PathsSpec` keep non-tunable identifiers out of the search space." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "59787b12", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "59787b12", + "outputId": "eded1e8f-7933-4625-fdde-fa3352cf8b0d" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "14:52:32 | INFO | grpo | ModelSpec: ModelSpec(base_model='unsloth/Qwen2.5-Coder-3B-Instruct-bnb-4bit', sft_adapter='Sizzing/aws-rl-sft-qwen25coder3b-adapter', grpo_adapter='Sizzing/aws-rl-grpo-qwen25coder3b-adapter', dataset_repo='Sizzing/aws-rl-sft', max_seq_length=3072)\n", + "14:52:32 | INFO | grpo | TrainingConfig defaults: TrainingConfig(learning_rate=5e-06, beta=0.04, num_generations=8, temperature=0.9, top_p=0.95, max_prompt_length=512, max_completion_length=768, per_device_train_batch_size=2, gradient_accumulation_steps=8, num_train_epochs=1, save_steps=25, save_total_limit=3, eval_steps=50, warmup_ratio=0.05, seed=42)\n", + "14:52:32 | INFO | grpo | PipelineConfig: PipelineConfig(env_pool_size=8, n_trials=4, trial_max_steps=10, final_max_steps=35, val_subset_size=20, eval_reserve_cap=100, optuna_tier_counts=(('warmup', 2), ('beginner', 2), ('intermediate', 2), ('advanced', 3), ('expert', 3)))\n" + ] + } + ], + "source": [ + "from dataclasses import replace\n", + "\n", + "\n", + "@dataclass(frozen=True)\n", + "class ModelSpec:\n", + " base_model: str = \"unsloth/Qwen2.5-Coder-3B-Instruct-bnb-4bit\"\n", + " sft_adapter: str = \"Sizzing/aws-rl-sft-qwen25coder3b-adapter\"\n", + " grpo_adapter: str = \"Sizzing/aws-rl-grpo-qwen25coder3b-adapter\" # NEW repo — SFT repo untouched\n", + " dataset_repo: str = \"Sizzing/aws-rl-sft\"\n", + " max_seq_length: int = 3072\n", + "\n", + "\n", + "@dataclass(frozen=True)\n", + "class TrainingConfig:\n", + " # GRPO knobs (Optuna-tunable)\n", + " learning_rate: float = 5e-6 # AdamW learning rate;\n", + " beta: float = 0.04 # KL coef vs. reference (frozen SFT adapter)\n", + " num_generations: int = 8 # G in GRPO\n", + " temperature: float = 0.9 # Sampling temp during generation\n", + " top_p: float = 0.95 # Nucleus sampling cutoff\n", + " max_prompt_length: int = 512 # Hard truncate on the prompt side\n", + " max_completion_length: int = 768 # Max tokens on the completion side;\n", + " per_device_train_batch_size: int = 2 # Batch per GPU\n", + " gradient_accumulation_steps: int = 8 # \tEffective batch = pdtbs × grad_accum (= 16 now)\n", + " num_train_epochs: int = 1 # ignored for IterableDataset; max_steps drives termination\n", + " save_steps: int = 25 # How often the final run writes a checkpoint-N\n", + " save_total_limit: int = 3 # Max number of checkpoints to keep; older ones get deleted\n", + " eval_steps: int = 50 # How often to run evaluation\n", + " warmup_ratio: float = 0.05\n", + " seed: int = 42 # Seeds GRPOConfig + Optuna's TPESampler\n", + "\n", + "\n", + "@dataclass(frozen=True)\n", + "class PipelineConfig:\n", + " env_pool_size: int = 8\n", + " n_trials: int = 4 # Optuna trials for hyperparameter search; each trial trains a GRPO agent from the same SFT starting point, but with different hyperparameters.\n", + " trial_max_steps: int = 10 # max_steps for each Optuna trial; keeps trial runtime manageable and encourages faster feedback on hyperparameter choices. The final evaluation after all trials will use a longer max_steps to allow the best trial more time to shine.\n", + " final_max_steps: int = 35 # GRPO steps for the post-Optuna final run\n", + " val_subset_size: int = 20\n", + " eval_reserve_cap: int = 100\n", + " # 12-task pool used for both Optuna trial training and trial scoring.\n", + " # Tuple-of-tuples keeps the dataclass frozen/hashable.\n", + " optuna_tier_counts: tuple = (\n", + " (\"warmup\", 2), (\"beginner\", 2), (\"intermediate\", 2),\n", + " (\"advanced\", 3), (\"expert\", 3),\n", + " )\n", + "\n", + "\n", + "MODEL = ModelSpec()\n", + "TRAIN = TrainingConfig()\n", + "PIPE = PipelineConfig()\n", + "\n", + "log.info(\"ModelSpec: %s\", MODEL)\n", + "log.info(\"TrainingConfig defaults: %s\", TRAIN)\n", + "log.info(\"PipelineConfig: %s\", PIPE)\n" + ] + }, + { + "cell_type": "markdown", + "id": "5dcff29c", + "metadata": { + "id": "5dcff29c" + }, + "source": [ + "## 5 · Authenticate: HF Hub + env URL" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "e58946d9", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "e58946d9", + "outputId": "eb9d4b8b-05e3-4206-e14e-f170ed809a17" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "No files have been modified since last commit. Skipping to prevent empty commit.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "14:52:38 | WARNING | huggingface_hub.hf_api | No files have been modified since last commit. Skipping to prevent empty commit.\n", + "14:52:38 | INFO | grpo | All secrets loaded; HF write access to Sizzing/aws-rl-grpo-qwen25coder3b-adapter verified.\n" + ] + } + ], + "source": [ + "def _load_secret(name: str) -> str:\n", + " \"\"\"Read a secret from Colab userdata, Kaggle UserSecrets, or the env.\"\"\"\n", + " if IS_COLAB:\n", + " from google.colab import userdata\n", + " try: return userdata.get(name)\n", + " except Exception: pass\n", + " if IS_KAGGLE:\n", + " from kaggle_secrets import UserSecretsClient\n", + " try: return UserSecretsClient().get_secret(name)\n", + " except Exception: pass\n", + " val = os.environ.get(name)\n", + " if not val:\n", + " raise RuntimeError(f\"Secret {name!r} is missing. Set it in Colab/Kaggle secrets or as an env var.\")\n", + " return val\n", + "\n", + "\n", + "HF_TOKEN = _load_secret(\"HF_TOKEN\")\n", + "ENV_BASE_URL = _load_secret(\"AWS_RL_ENV_BASE_URL\").rstrip(\"/\")\n", + "\n", + "from huggingface_hub import login as hf_login, HfApi\n", + "\n", + "hf_login(token=HF_TOKEN, add_to_git_credential=False)\n", + "\n", + "\n", + "def verify_hub_write_scope(repo_id: str) -> None:\n", + " \"\"\"Ensure the HF token can create repos under the target org before training.\n", + "\n", + " Without this, we'd discover permission failures *after* a multi-hour run.\n", + " \"\"\"\n", + " api = HfApi(token=HF_TOKEN)\n", + " api.create_repo(repo_id=repo_id, private=True, exist_ok=True, repo_type=\"model\")\n", + " probe = OUT_DIR / \".hub_write_probe.txt\"\n", + " probe.write_text(\"ok\")\n", + " api.upload_file(path_or_fileobj=str(probe), path_in_repo=\".hub_write_probe.txt\",\n", + " repo_id=repo_id, commit_message=\"probe: verify write scope\")\n", + " probe.unlink()\n", + "\n", + "\n", + "verify_hub_write_scope(MODEL.grpo_adapter)\n", + "log.info(\"All secrets loaded; HF write access to %s verified.\", MODEL.grpo_adapter)\n" + ] + }, + { + "cell_type": "markdown", + "id": "a6a47eb8", + "metadata": { + "id": "a6a47eb8" + }, + "source": [ + "## 6 · Connect to the hosted env + health check\n", + "\n", + "The env server runs **outside** this VM. We only assert reachability and that its internal pool has 8 slots (required for parallel rollouts). If either fails, we stop **before** loading the model." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "e30369da", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "e30369da", + "outputId": "b9a5cfa8-eaee-4f64-c157-cd2b2b241ff5" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "14:52:44 | INFO | httpx | HTTP Request: GET https://sizzing-aws-rl-env.hf.space/schema \"HTTP/1.1 200 OK\"\n", + "14:52:44 | INFO | grpo | Env reachable. Action schema keys: ['action', 'observation', 'state']\n", + "14:52:44 | INFO | grpo | POOL_SIZE=8 assumed — verified by GrpoPool connection below.\n" + ] + } + ], + "source": [ + "import httpx\n", + "\n", + "\n", + "def probe_env_http(base_url: str) -> dict:\n", + " \"\"\"Cheap reachability check: GET /schema. Raises on HTTP error.\n", + "\n", + " Does NOT try to validate pool size from /state — AwsRlState doesn't\n", + " expose it. Pool capacity is verified later via a real GrpoPool\n", + " connection attempt (§6b) which is the only honest way to check.\n", + " \"\"\"\n", + " with httpx.Client(base_url=base_url, timeout=10.0) as c:\n", + " schema = c.get(\"/schema\").raise_for_status().json()\n", + " return {\"schema\": schema}\n", + "\n", + "\n", + "probe = probe_env_http(ENV_BASE_URL)\n", + "log.info(\"Env reachable. Action schema keys: %s\", list(probe['schema'].keys()))\n", + "log.info(\"POOL_SIZE=%d assumed — verified by GrpoPool connection below.\", PIPE.env_pool_size)" + ] + }, + { + "cell_type": "markdown", + "id": "b35c3272", + "metadata": { + "id": "b35c3272" + }, + "source": [ + "## 7 · Curriculum-driven prompt stream + fixed val / reserve sets\n", + "\n", + "Instead of feeding a static dataset, we stream prompts from the repo's [`Curriculum`](https://github.com/UdayKiranPadhy/aws-rl-env/blob/master/server/services/curriculum.py) — the same priority-queue curriculum the env already implements:\n", + "\n", + "- **novelty bonus** for untried tasks (+100)\n", + "- **weakness weighting** `(1 − recent_success_rate) × 50` per task\n", + "- **spaced repetition** on graduated tasks at 3→66→12→24→48 episode intervals\n", + "- **recency penalty** to avoid drilling the same task back-to-back\n", + "- **tier promotion** with fast-track when success rate crosses threshold\n", + "\n", + "TRL's `GRPOTrainer` accepts a `datasets.IterableDataset`; we wrap `curriculum.next_task()` in a generator and feed it in. The feedback loop closes inside the reward function (next cell): after scoring a group of G completions for a task, it calls `curriculum.record_result(task, achieved, mean_reward)`, which updates mastery, promotes tiers, and re-ranks the priority queue for the next step.\n", + "\n", + "`VAL_DS` (fixed 20-row subset from the HF dataset's `validation` split) and `RESERVE_DS` (up to 100 rows from `reserve`) stay fixed for comparable before/after evaluation." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "0d3fe743", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 647, + "referenced_widgets": [ + "17e4a25f8b0a4293b192beda65e888ab", + "312d279277ea415ba2940bc879e72e5c", + "8f3f631215e146528c4fee4c5cb4a453", + "fa9d568f23674c6e9740955ce8d0dda0", + "3a9e6d83ca3a48fcb61fbb85df7dfbc2", + "b6f758d29ec74a49b851eabb537efbab", + "a38fb4652a5e4b52b9704ba7dc0b7dc5", + "1b41774ddcdb475d9215076cc31d2857", + "693f88f916a6449ca4e6a931fad75dc7", + "780970fdf6434c24b97e97ae738eff4b", + "5c6f9b2415754d9d956f22ff9eb55d79", + "96e4ee7ccd294abc95cdda282ff68217", + "e2fc8e26f04d40f59973c2e9fce8821f", + "a1ee88211ba14bdca07d9dc4862e3780", + "c7195e122f8e49508fa9a8c766e43085", + "27584397f5d14462bd9bc3932083f044", + "a864b9a6bcb44885b956cd4b59ae1f74", + "d6eae3b5673e4f6197f2fb48601d0661", + "3bad0119c77242e98b525b075996fbd8", + "b04a5d15e84f4cd28130f233e556fd12", + "880d55cbe923497f95f7575b5e85cfad", + "aa5b6888b7f84df190935eb5efaf49d9", + "71e32bfc45574278b0f7f1956cf268bd", + "3380c456828945d9ac666617d06740fc", + "404dbe67ed784f069143c973dc845e40", + "4ce611000a534d948d455f92ecee576b", + "8c96ae914728462fbd9b32fd08cd8187", + "9040b30667794322bff110267b8ed9cd", + "b06a5846c2c04291a99d9627c47bd327", + "291744bd1f894ca8945f9be975b6e624", + "a92f2302bd6a4ac5a483b4b21ed157eb", + "d95309efa2914257be7eeb1e7ece3fde", + "2efa16125e694584b6a5438f5f925009", + "5454a54bf5af4336b3c904f563973fd6", + "6d768d2eff3e463cb8d9f51a33a7ca98", + "de2681feaa2e4b52972a37855d2ee8e5", + "d9e8fd4643044efabc576be5be5c4694", + "177a3f0d07c5494abc3d25acc492f24f", + "fd24a9a430c8476f8e70f50590541b71", + "321146c007014d4cacc70d8653036451", + "71a8a6f25a9742b19097b59e3d34cbf4", + "d54e0916ad0e43ceb348fcc06af24717", + "cdb7fb82b1f34c728b08706905c0b411", + "d0adec364aca47858042a8877918d321", + "a04ffa2985424737825292f54a43a9d4", + "ed3a163a822a461f87deb14ec2d577ed", + "da313ab92bf3493986ffcf338da00bd8", + "19d9a45f1ba642db99e239e0a8fd5bbf", + "bde264b24d2b4d52bba0980ebc4bece6", + "5e499677de5043df92f3b5653f81d59b", + "ca41efa2e37c41789257075279609832", + "79ccc0b15d4f4668801e93f0099665f2", + "c83934fee9864d9c914153a678593a84", + "7f192f04e4e44f0fa7144d7f1fa236ec", + "4d0b57cf6a1f4509955c32781dad9afd", + "f97157719bdf40a88e1730674f621bd9", + "6a381c46cd6d48a1aae6c99ab20b21e4", + "7c937e894bd841d489ec031e8be9fe2e", + "d0bd273d343b4963a3fcb3c0a67ff497", + "6aa5eabdb2d54130b03cfff6d3fcff9a", + "e25dff488fd749b4b35c06704bc51c09", + "0771f43fb5a14d38b4f6f502a64079d9", + "e2f519926c564da8bbca7de0b68abd0e", + "c81aa39a8c9441049b863b1257c1a5e8", + "0546ae7051234b8db6e970a1d3cff61b", + "8e446f7eafe6440c8d727e6956409446", + "20914c591fc74055bcca0eb8ac4e5926", + "37d9d6c95bba42e8a096cf5275a480fd", + "047c53a5b7e74be68acd1045b2e4e283", + "1fb215d781c545e1b44459499c38ad69", + "59d71306ba244bfd9f1ec700214964f8", + "f25fe777177f4969859c68717c8e3e48", + "8b8345d415254c5f9e1e9fc2d40389d0", + "a5f5680a1d76403799529cd0967ba535", + "dead8a53066c477a9782b8c7338ac848", + "0c88e7079c654e79b855aa29078a36bc", + "e753ece3c0c8413c910e36a96ba77b98", + "90147fec0d48464bbd76deb157226203", + "97dccf77527e4494818ed252eb9e96b6", + "4e7c82ed075a46fa8b9e2a57fea59fc0", + "a58cb1b5661a410fa6abe2b267579295", + "3dbb2e81f2f4447382e7355d0bd80cce", + "b019ce4903714cb3b5a1ffd059d18c6d", + "0e878c2d72104893a978a30d7ac53f1e", + "3c5334f626ca4cb7b54c7ed19ae9da7b", + "469bcc09c4224d7fb3e7c1d62e87699d", + "0cfad13926b34df0841d1d163334bad3", + "1ad2a4de697e4e3e905087ed94b921ba", + "a3e8d1e2cd794ec290dc71820af6f24f", + "67277d4907ac46b287640fff3a2eee62", + "5b1488d801d64a10bbdc28a9c011d5c3", + "cd3801cce52f41b38ecde5f781bea2b9", + "e503d1497c2b4af2b52b04113794063d", + "ac6e615ab24c4c80b47d60f31fa09430", + "f8d419e8c75649eba3f4a148da3016d3", + "792f08a4d86f4c849b429487eb286d80", + "2a194e7be5ed4e00b7adabce5f93e810", + "c66c7b3404ca4beb813036e806757136", + "381d7a2e92de47d5878e71fc2f644024", + "546dfd22f8c64319aecbcd01ac858cf6", + "c5c6b045ea13420393b303f5c7547ee2", + "f44955735e8b451f90b271d6d0b1c405", + "229a210fcb3942458bba7605de6c6b02", + "11ae5fffb510410e97093de938669e50", + "fb8b4b4e475a4783986bf9c6a54ce21a", + "4495fed8673a414ab8f9e5a2a8d355b2", + "f6254de7f5c34fb0abe37459c559eecd", + "d98452df2c144e7fa197c6bf8c7a84aa", + "a2566c92ce2f4c5ea41f523eaa517091", + "02772bbc7feb49dbb8427d4c52211b68", + "15044ec892644e459b2009de7a74f27d", + "659ca47987dc4ee4bcc9575a6f3a5d3a", + "06f127e6780f47cda98a37c538450249", + "2497ba48b5254eedbc94c0fedc50b324", + "7e977d8fd3f1475fac6b26ec618edf81", + "d521058b79b848d08dcaf3295c5b6541", + "ee90c4835dee4529bd4263fa89137ff9", + "9d37f3cc93e54609bb22c9af78552827", + "c3811a5a59cc457ab99516a13e7aa2f4", + "ebbcbcad06334b7e896371f5f0b8c8ac", + "65a4b5d545564dbaa0baea82817ae11f" + ] + }, + "id": "0d3fe743", + "outputId": "04eddbf2-9478-49a0-d0ad-7b1695250dda" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "14:52:47 | INFO | numexpr.utils | NumExpr defaulting to 2 threads.\n", + "14:52:48 | INFO | datasets | TensorFlow version 2.19.0 available.\n", + "14:52:48 | INFO | datasets | JAX version 0.7.2 available.\n", + "14:53:02 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "14:53:02 | INFO | server.services.curriculum | Loaded 25 beginner tasks total\n", + "14:53:02 | INFO | server.services.curriculum | Loaded 25 intermediate tasks total\n", + "14:53:02 | INFO | server.services.curriculum | Loaded 25 advanced tasks total\n", + "14:53:03 | INFO | server.services.curriculum | Loaded 9 supplementary expert tasks from drift.yaml\n", + "14:53:03 | INFO | server.services.curriculum | Loaded 33 expert tasks total\n", + "14:53:03 | INFO | grpo | Loading dataset from Sizzing/aws-rl-sft …\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "README.md: 0.00B [00:00, ?B/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "17e4a25f8b0a4293b192beda65e888ab" + } + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "data/train-00000-of-00001.parquet: 0%| | 0.00/1.92M [00:00 dict[int, Task]:\n", + " \"\"\"Flatten every task YAML into a dict keyed by task_id.\n", + "\n", + " The reward function only has task_id to work with; this map lets it\n", + " recover the full Task object needed to serialise over HTTP to /reset.\n", + " \"\"\"\n", + " m: dict[int, Task] = {}\n", + " for tier in TaskDifficulty:\n", + " try:\n", + " for t in load_tier(tier, tasks_dir):\n", + " m[int(t.task_id)] = t\n", + " except FileNotFoundError:\n", + " continue\n", + " return m\n", + "\n", + "\n", + "def load_drift_task_ids(tasks_dir: Path) -> set[int]:\n", + " \"\"\"Drift tasks live in drift.yaml and get folded into the EXPERT tier by\n", + " the curriculum loader. We scan the file directly so we can still identify\n", + " them for drift_repair_rate in multi-step eval.\n", + " \"\"\"\n", + " ids: set[int] = set()\n", + " drift_path = tasks_dir / \"drift.yaml\"\n", + " if drift_path.exists():\n", + " with open(drift_path) as f:\n", + " for entry in (yaml.safe_load(f) or []):\n", + " ids.add(int(entry[\"task_id\"]))\n", + " return ids\n", + "\n", + "\n", + "SYSTEM_PROMPT = (\n", + " \"You are an expert AWS Operations agent. You operate a simulated AWS cloud by \"\n", + " \"emitting one AWS CLI command per turn. The conversation may include prior \"\n", + " \"commands and their outputs from earlier in this episode — use them to decide \"\n", + " \"your next move.\\n\\n\"\n", + " \"First reason about your next move inside a ... block: identify \"\n", + " \"the AWS service, the right subcommand, required arguments, and any constraints \"\n", + " \"from the task. Keep the reasoning concise (a few short sentences).\\n\\n\"\n", + " \"After , on a NEW LINE, output EXACTLY ONE AWS CLI command starting \"\n", + " \"with \\\"aws \\\". The command line must contain only the command — no markdown, \"\n", + " \"no backticks, no quotes around it, and no trailing commentary.\"\n", + ")\n", + "\n", + "\n", + "def task_to_row(task: Task) -> dict:\n", + " \"\"\"Convert a Task into the (prompt, task_id, difficulty) schema the\n", + " curriculum-aware sampler reads. `remove_unused_columns=False` in the\n", + " trainer config keeps `difficulty` on the dataset; reward funcs accept\n", + " **kw so the extra column is harmlessly ignored there.\n", + " \"\"\"\n", + " return {\n", + " \"prompt\": [\n", + " {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n", + " {\"role\": \"user\", \"content\": f\"TASK: {task.description}\"},\n", + " ],\n", + " \"task_id\": int(task.task_id),\n", + " \"difficulty\": task.difficulty.value,\n", + " }\n", + "\n", + "\n", + "def make_curriculum_dataset(curriculum: Curriculum, n_rows: int) -> Dataset:\n", + " \"\"\"Pre-materialise N curriculum-picked prompts as a finite `datasets.Dataset`.\n", + "\n", + " TRL's GRPOTrainer explicitly rejects IterableDataset (see TRL issue #3213:\n", + " ``NotImplementedError: Iterable datasets are not yet supported``). That\n", + " kills the original on-demand `curriculum.next_task()` streaming design —\n", + " the trainer must see a Dataset with a known `__len__`.\n", + "\n", + " Compromise: sample `n_rows` prompts up front. The curriculum's novelty +\n", + " weakness + recency heuristics still apply *across the draw* (every\n", + " `next_task()` pops the current top-of-queue and ages neighbouring tasks\n", + " via recency), so we get a sensibly ordered warm-start sample — not\n", + " uniform-random. What we lose is live re-ranking between steps: mastery\n", + " updates made by the reward function during training don't feed back\n", + " into selection until a fresh dataset is built. `curriculum.record_result`\n", + " still runs inside the reward function so mastery metrics remain accurate\n", + " for end-of-run stats.\n", + "\n", + " Size `n_rows` to `max_steps * per_device_train_batch_size *\n", + " gradient_accumulation_steps`, plus a buffer so `num_train_epochs=1`\n", + " never exhausts the dataset before `max_steps` terminates training.\n", + " \"\"\"\n", + " return Dataset.from_list(\n", + " [task_to_row(curriculum.next_task()) for _ in range(n_rows)]\n", + " )\n", + "\n", + "\n", + "def make_full_curriculum_dataset(tasks_dir: Path) -> Dataset:\n", + " \"\"\"Build a *superset* dataset spanning every difficulty tier.\n", + "\n", + " This replaces `make_curriculum_dataset` for curriculum-driven training:\n", + " instead of drawing N prompts up front (which freezes the training data\n", + " to whatever tier the curriculum happened to start in), we materialise\n", + " EVERY task with its `difficulty` tag and let `CurriculumTierSampler`\n", + " dynamically pick indices from the curriculum's current tier at\n", + " iteration time. Tier promotion inside the reward callback then\n", + " immediately affects which prompts the next batch pulls.\n", + " \"\"\"\n", + " rows: list[dict] = []\n", + " for tier in TaskDifficulty:\n", + " for task in load_tier(tier, tasks_dir):\n", + " rows.append(task_to_row(task))\n", + " if not rows:\n", + " raise RuntimeError(f\"No tasks found under {tasks_dir}\")\n", + " ds = Dataset.from_list(rows)\n", + " log.info(\n", + " \"Full curriculum dataset: %d rows across tiers %s\",\n", + " len(ds),\n", + " sorted({r[\"difficulty\"] for r in rows}),\n", + " )\n", + " return ds\n", + "\n", + "\n", + "def make_optuna_task_dataset(task_map: dict[int, Task],\n", + " tier_counts: tuple,\n", + " seed: int = 42) -> Dataset:\n", + " \"\"\"Deterministic small task pool for Optuna trials.\n", + "\n", + " Picks N tasks per tier from `task_map` (sorted by task_id then shuffled\n", + " with a fixed seed so the pool is identical across re-runs). Returns a\n", + " Dataset with the same row schema as `make_full_curriculum_dataset`.\n", + " Used both as trial train_ds (curriculum sampler cycles within tier\n", + " pools) and as the single-step eval set for `trial_objective`.\n", + " \"\"\"\n", + " import random\n", + " rng = random.Random(seed)\n", + " rows: list[dict] = []\n", + " for tier_name, n in tier_counts:\n", + " pool = sorted(\n", + " (t for t in task_map.values() if t.difficulty.value == tier_name),\n", + " key=lambda t: int(t.task_id),\n", + " )\n", + " rng.shuffle(pool)\n", + " for t in pool[:n]:\n", + " rows.append(task_to_row(t))\n", + " if not rows:\n", + " raise RuntimeError(\"Optuna pool came out empty — check tier_counts\")\n", + " ds = Dataset.from_list(rows)\n", + " log.info(\"Optuna task pool: %d rows by tier=%s\",\n", + " len(ds), {k: n for k, n in tier_counts})\n", + " return ds\n", + "\n", + "\n", + "def _load_raw_dataset(dataset_repo: str) -> dict:\n", + " \"\"\"Load the HF dataset once; cached for reuse by val + reserve builders.\"\"\"\n", + " log.info(\"Loading dataset from %s …\", dataset_repo)\n", + " return load_dataset(dataset_repo, token=HF_TOKEN)\n", + "\n", + "\n", + "_RAW_DS_CACHE: dict = {}\n", + "\n", + "\n", + "def _get_raw(dataset_repo: str):\n", + " if dataset_repo not in _RAW_DS_CACHE:\n", + " _RAW_DS_CACHE[dataset_repo] = _load_raw_dataset(dataset_repo)\n", + " return _RAW_DS_CACHE[dataset_repo]\n", + "\n", + "\n", + "def build_val_dataset(dataset_repo: str, task_map: dict[int, Task],\n", + " val_size: int, seed: int = 42) -> Dataset:\n", + " \"\"\"Fixed validation subset for comparable before/after eval.\"\"\"\n", + " raw = _get_raw(dataset_repo)\n", + " val_single = raw[\"validation\"].filter(\n", + " lambda r: r[\"step_idx\"] == 0 and int(r[\"task_id\"]) in task_map\n", + " )\n", + " val = val_single.shuffle(seed=seed).select(\n", + " range(min(val_size, len(val_single)))\n", + " )\n", + " return val.map(\n", + " lambda r: {\"prompt\": r[\"messages\"][:2], \"task_id\": int(r[\"task_id\"])},\n", + " remove_columns=[c for c in val.column_names if c not in (\"prompt\", \"task_id\")],\n", + " )\n", + "\n", + "\n", + "def build_reserve_dataset(dataset_repo: str,\n", + " task_map: dict[int, Task]) -> Dataset | None:\n", + " \"\"\"Reserve split for the multi-step eval.\"\"\"\n", + " raw = _get_raw(dataset_repo)\n", + " if \"reserve\" not in raw:\n", + " return None\n", + " reserve_single = raw[\"reserve\"].filter(\n", + " lambda r: r[\"step_idx\"] == 0 and int(r[\"task_id\"]) in task_map\n", + " )\n", + " return reserve_single.map(\n", + " lambda r: {\"prompt\": r[\"messages\"][:2], \"task_id\": int(r[\"task_id\"])},\n", + " remove_columns=[c for c in reserve_single.column_names\n", + " if c not in (\"prompt\", \"task_id\")],\n", + " )\n", + "\n", + "\n", + "_tasks_dir = REPO_DIR / \"server\" / \"services\" / \"tasks\"\n", + "TASK_MAP = build_task_map(_tasks_dir)\n", + "DRIFT_TASK_IDS = load_drift_task_ids(_tasks_dir)\n", + "VAL_DS = build_val_dataset(MODEL.dataset_repo, TASK_MAP,\n", + " PIPE.val_subset_size, TRAIN.seed)\n", + "RESERVE_DS = build_reserve_dataset(MODEL.dataset_repo, TASK_MAP)\n", + "OPTUNA_DS = make_optuna_task_dataset(TASK_MAP, PIPE.optuna_tier_counts, TRAIN.seed)\n", + "\n", + "log.info(\"TASK_MAP: %d tasks across %d tiers\", len(TASK_MAP), len({t.difficulty for t in TASK_MAP.values()}))\n", + "log.info(\"DRIFT_TASK_IDS: %d drift tasks\", len(DRIFT_TASK_IDS))\n", + "log.info(\"VAL_DS: %d rows (fixed, for before/after comparison)\", len(VAL_DS))\n", + "log.info(\"RESERVE_DS: %d rows (multi-step eval)\", len(RESERVE_DS) if RESERVE_DS else 0)\n", + "log.info(\"OPTUNA_DS: %d rows (used for trial training + trial val eval)\", len(OPTUNA_DS))\n" + ] + }, + { + "cell_type": "markdown", + "id": "ebc9f27e", + "metadata": { + "id": "ebc9f27e" + }, + "source": [ + "## 8 · Reward functions + curriculum feedback\n", + "\n", + "Three reward functions passed to `GRPOTrainer.reward_funcs`:\n", + "\n", + "| Reward | Weight | Signal |\n", + "|------------------|-------:|------------------------------------------------------------|\n", + "| `env_reward` | 1.0 | Real env reward from `/reset` + `/step` against the task |\n", + "| `format_reward` | 0.15 | 1.0 if completion starts with `aws `, else 0.0 |\n", + "| `length_reward` | 0.05 | Soft length prior: 1.0 ≤120 chars, decays to 0.0 by 400 |\n", + "\n", + "`env_reward` also closes the curriculum loop. TRL emits the batch as `batch_size × num_generations` flattened completions with `task_id` repeated G times per prompt. We group by task_id, and for each group call `curriculum.record_result(task, achieved=any(r≥1.0), reward=mean)`. That one line is the bridge: TRL owns iteration, the curriculum owns task selection, and the reward function owns the feedback edge. No custom training loop; all the quality-of-life of TRL (checkpoint, resume, Optuna) is preserved.\n", + "\n", + "Thread safety: env HTTP calls run on the pool threads, but reward aggregation + `record_result` both happen on the main thread after the pool join, so no locking is needed.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "Locjvlb14umT", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "Locjvlb14umT", + "outputId": "e9ed9e06-45f1-493b-a2be-ef1bc4302c6e" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "14:53:16 | INFO | grpo | Reward smoke test on task 0: [1.0, 1.0]\n", + "14:53:16 | INFO | grpo | Env counters: {'success': 2, 'timeout': 0, 'conn_err': 0, 'reconnect': 0, 'last_error': None}\n" + ] + } + ], + "source": [ + "import asyncio\n", + "import re\n", + "import threading\n", + "import traceback\n", + "from collections import defaultdict\n", + "from typing import Callable, Optional\n", + "\n", + "from client import AwsRlEnv\n", + "from models import AwsRlAction\n", + "from websockets.exceptions import ConnectionClosed\n", + "\n", + "\n", + "_THINK_BLOCK = re.compile(r\"]*>.*?\", re.DOTALL | re.IGNORECASE)\n", + "_OPEN_THINK = re.compile(r\"]*>.*\", re.DOTALL | re.IGNORECASE)\n", + "\n", + "\n", + "def extract_aws_command(raw: str) -> str:\n", + " # Drop any balanced ... spans first.\n", + " cleaned = _THINK_BLOCK.sub(\"\", raw)\n", + " # If a is still open (no matching ), everything after\n", + " # it is reasoning-in-progress, not a command — cut it.\n", + " cleaned = _OPEN_THINK.sub(\"\", cleaned)\n", + " for line in cleaned.splitlines():\n", + " line = line.strip().strip(\"`\").strip()\n", + " if line.startswith(\"aws \"):\n", + " return line\n", + " return \"aws help\"\n", + "\n", + "\n", + "class EnvRewardClient:\n", + " \"\"\"Persistent-WebSocket reward client against a pooled env server.\n", + "\n", + " Why WebSocket and not HTTP /reset + /step: under `AWS_RL_ENV_POOL_SIZE>1`\n", + " the server's HTTP path uses an env *factory* — every request builds a\n", + " fresh `AwsRlEnvironment` from the pool factory, so `/step` on request 2\n", + " lands on a different env than `/reset` on request 1 and trips\n", + " ``assert self._episode is not None, \"Call reset() before step()\"``.\n", + " Only WebSocket sessions hold a MiniStack slot across calls.\n", + "\n", + " Design:\n", + " - Dedicated background thread owns an asyncio loop.\n", + " - On startup, N AwsRlEnv WebSocket sessions connect in parallel and\n", + " sit in an asyncio.Queue acting as a free-list.\n", + " - score_batch() is synchronous (TRL calls reward funcs sync): it\n", + " submits one async task per (task, command) pair to the loop via\n", + " run_coroutine_threadsafe, each task acquires a free session from\n", + " the queue, does reset+step, returns the env to the queue.\n", + " - Reconnect-on-failure: Cloudflare tunnels can idle-close WS\n", + " sessions, but the client keeps a reference to the (now-closed)\n", + " socket so OpenEnv's _ensure_connected() is a no-op. We catch\n", + " ConnectionClosed explicitly, call disconnect(), reconnect, and\n", + " retry once before giving up.\n", + "\n", + " Counters (success / timeout / conn_err / reconnect) let the trainer\n", + " log env health without inspecting internal state. `last_error`\n", + " captures the most recent exception. `verbose_errors=True` prints\n", + " full tracebacks per failure (noisy — only enable while debugging).\n", + " \"\"\"\n", + "\n", + " def __init__(\n", + " self,\n", + " base_url: str,\n", + " pool_size: int = 8,\n", + " timeout_s: float = 60.0,\n", + " verbose_errors: bool = False,\n", + " ):\n", + " self.base_url = base_url\n", + " self.pool_size = pool_size\n", + " self.timeout_s = timeout_s\n", + " self.verbose_errors = verbose_errors\n", + " self.success = 0\n", + " self.timeout = 0\n", + " self.conn_err = 0\n", + " self.reconnect = 0\n", + " self.last_error: Optional[str] = None\n", + " self._loop: Optional[asyncio.AbstractEventLoop] = None\n", + " self._thread: Optional[threading.Thread] = None\n", + " self._queue: Optional[asyncio.Queue] = None\n", + " self._envs: list = []\n", + " self._ready = threading.Event()\n", + " self._setup_error: Optional[BaseException] = None\n", + " self._start()\n", + "\n", + " def _start(self) -> None:\n", + " def run():\n", + " loop = asyncio.new_event_loop()\n", + " self._loop = loop\n", + " asyncio.set_event_loop(loop)\n", + " try:\n", + " loop.run_until_complete(self._setup())\n", + " except BaseException as e:\n", + " self._setup_error = e\n", + " self._ready.set()\n", + " return\n", + " self._ready.set()\n", + " loop.run_forever()\n", + "\n", + " self._thread = threading.Thread(target=run, daemon=True, name=\"env-reward\")\n", + " self._thread.start()\n", + " self._ready.wait()\n", + " if self._setup_error is not None:\n", + " raise RuntimeError(\n", + " f\"EnvRewardClient failed to connect {self.pool_size} WS sessions \"\n", + " f\"to {self.base_url}: {self._setup_error!r}\"\n", + " )\n", + "\n", + " async def _setup(self) -> None:\n", + " self._queue = asyncio.Queue(self.pool_size)\n", + " self._envs = [AwsRlEnv(base_url=self.base_url) for _ in range(self.pool_size)]\n", + " try:\n", + " await asyncio.gather(*(e.connect() for e in self._envs))\n", + " except BaseException:\n", + " await asyncio.gather(\n", + " *(e.close() for e in self._envs), return_exceptions=True\n", + " )\n", + " raise\n", + " for e in self._envs:\n", + " self._queue.put_nowait(e)\n", + "\n", + " async def _reconnect(self, env) -> None:\n", + " \"\"\"Discard the dead socket and open a fresh WS session in-place.\"\"\"\n", + " self.reconnect += 1\n", + " try:\n", + " await env.disconnect()\n", + " except Exception:\n", + " pass\n", + " await env.connect()\n", + "\n", + " async def _reset_and_step(self, env, task: Task, command: str) -> float:\n", + " await asyncio.wait_for(env.reset(task=task), timeout=self.timeout_s)\n", + " res = await asyncio.wait_for(\n", + " env.step(AwsRlAction(command=command)), timeout=self.timeout_s\n", + " )\n", + " return float(res.reward)\n", + "\n", + " async def _score_one(self, task: Task, command: str) -> float:\n", + " env = await self._queue.get()\n", + " try:\n", + " try:\n", + " reward = await self._reset_and_step(env, task, command)\n", + " self.success += 1\n", + " return reward\n", + " except ConnectionClosed as e:\n", + " # Cloudflare / server idle-closed the socket. Reconnect and retry.\n", + " self.last_error = f\"reconnect after {type(e).__name__}: {e}\"\n", + " if self.verbose_errors:\n", + " print(f\"[reward] {self.last_error} — reconnecting\")\n", + " await self._reconnect(env)\n", + " reward = await self._reset_and_step(env, task, command)\n", + " self.success += 1\n", + " return reward\n", + " except asyncio.TimeoutError:\n", + " self.timeout += 1\n", + " self.last_error = \"asyncio.TimeoutError\"\n", + " if self.verbose_errors:\n", + " traceback.print_exc()\n", + " return 0.0\n", + " except Exception as e:\n", + " self.conn_err += 1\n", + " self.last_error = f\"{type(e).__name__}: {e}\"\n", + " if self.verbose_errors:\n", + " traceback.print_exc()\n", + " return 0.0\n", + " finally:\n", + " self._queue.put_nowait(env)\n", + "\n", + " async def _score_batch_async(\n", + " self, tasks: list, commands: list[str]\n", + " ) -> list[float]:\n", + " return list(\n", + " await asyncio.gather(\n", + " *(self._score_one(t, c) for t, c in zip(tasks, commands))\n", + " )\n", + " )\n", + "\n", + " def score_batch(self, tasks: list, commands: list[str]) -> list[float]:\n", + " \"\"\"Parallel scoring; preserves input order.\"\"\"\n", + " assert self._loop is not None\n", + " fut = asyncio.run_coroutine_threadsafe(\n", + " self._score_batch_async(tasks, commands), self._loop\n", + " )\n", + " return fut.result()\n", + "\n", + " async def _rollout_one_async(\n", + " self,\n", + " task: Task,\n", + " first_command: str,\n", + " generate_next, # sync callable (history) -> str\n", + " max_steps: int,\n", + " ) -> float:\n", + " \"\"\"Interactive multi-turn rollout on a single env session.\n", + "\n", + " Plays `first_command` as turn 1 (this is what TRL just generated),\n", + " then for turns 2..max_steps asks `generate_next` for the next\n", + " command given the running (cmd, output) history. Used by\n", + " `score_batch_interactive` to give the trainer the same multi-step\n", + " rollout semantics as eval-time `run_episode`.\n", + "\n", + " `generate_next` is sync because the policy lives on the main\n", + " thread's GPU; we call it from this background-thread coroutine\n", + " via `loop.run_in_executor(None, ...)` so it doesn't block the\n", + " asyncio loop.\n", + " \"\"\"\n", + " env = await self._queue.get()\n", + " try:\n", + " try:\n", + " await asyncio.wait_for(env.reset(task=task), timeout=self.timeout_s)\n", + " history: list[tuple[str, str]] = []\n", + " reward = 0.0\n", + " cmd = first_command\n", + " loop = asyncio.get_running_loop()\n", + " for turn in range(max_steps):\n", + " res = await asyncio.wait_for(\n", + " env.step(AwsRlAction(command=cmd)),\n", + " timeout=self.timeout_s,\n", + " )\n", + " reward = float(res.reward)\n", + " obs = getattr(res, \"observation\", None)\n", + " history.append((cmd, getattr(obs, \"command_output\", \"\") or \"\"))\n", + " done_flag = getattr(res, \"done\", False) or getattr(\n", + " obs, \"task_achieved\", False\n", + " )\n", + " if done_flag or turn == max_steps - 1:\n", + " break\n", + " # Hop to a worker thread for the (sync, GPU-bound) generation.\n", + " cmd = await loop.run_in_executor(\n", + " None, generate_next, tuple(history)\n", + " )\n", + " self.success += 1\n", + " return reward\n", + " except ConnectionClosed as e:\n", + " # Don't auto-retry mid-episode: a fresh reset would wipe\n", + " # tracker state and any partial credit from earlier turns.\n", + " self.last_error = f\"{type(e).__name__}: {e} (mid-rollout)\"\n", + " if self.verbose_errors:\n", + " print(f\"[reward] {self.last_error}\")\n", + " self.conn_err += 1\n", + " return 0.0\n", + " except asyncio.TimeoutError:\n", + " self.timeout += 1\n", + " self.last_error = \"asyncio.TimeoutError\"\n", + " if self.verbose_errors:\n", + " traceback.print_exc()\n", + " return 0.0\n", + " except Exception as e:\n", + " self.conn_err += 1\n", + " self.last_error = f\"{type(e).__name__}: {e}\"\n", + " if self.verbose_errors:\n", + " traceback.print_exc()\n", + " return 0.0\n", + " finally:\n", + " self._queue.put_nowait(env)\n", + "\n", + " def score_batch_interactive(\n", + " self,\n", + " tasks: list,\n", + " first_commands: list[str],\n", + " generate_next_per_rollout: list, # list[Callable[[history], str]]\n", + " max_steps: int = 5,\n", + " ) -> list[float]:\n", + " \"\"\"Parallel multi-turn scoring; preserves input order.\n", + "\n", + " Each rollout takes ONE command at a time: TRL's completion\n", + " supplies turn 1, then `generate_next_per_rollout[i](history)`\n", + " is called for each subsequent turn of rollout `i` until\n", + " `done=True` or `max_steps` is reached. Up to `pool_size`\n", + " rollouts run in parallel against the WS pool — but the caller\n", + " is expected to serialise GPU-bound generates inside the\n", + " closures themselves (one shared lock), since concurrent\n", + " generates on a single accelerator only fight for the same\n", + " memory.\n", + " \"\"\"\n", + " assert self._loop is not None\n", + " assert len(tasks) == len(first_commands) == len(generate_next_per_rollout)\n", + "\n", + " async def _gather():\n", + " return list(await asyncio.gather(*(\n", + " self._rollout_one_async(t, c, gen, max_steps)\n", + " for t, c, gen in zip(\n", + " tasks, first_commands, generate_next_per_rollout,\n", + " )\n", + " )))\n", + "\n", + " fut = asyncio.run_coroutine_threadsafe(_gather(), self._loop)\n", + " return fut.result()\n", + "\n", + " def drain_counters(self) -> dict:\n", + " out = {\n", + " \"success\": self.success,\n", + " \"timeout\": self.timeout,\n", + " \"conn_err\": self.conn_err,\n", + " \"reconnect\": self.reconnect,\n", + " \"last_error\": self.last_error,\n", + " }\n", + " self.success = self.timeout = self.conn_err = self.reconnect = 0\n", + " self.last_error = None\n", + " return out\n", + "\n", + " def close(self) -> None:\n", + " if self._loop is None or not self._loop.is_running():\n", + " return\n", + "\n", + " async def _close():\n", + " await asyncio.gather(\n", + " *(e.disconnect() for e in self._envs), return_exceptions=True\n", + " )\n", + "\n", + " try:\n", + " asyncio.run_coroutine_threadsafe(_close(), self._loop).result(timeout=30)\n", + " except Exception:\n", + " pass\n", + " self._loop.call_soon_threadsafe(self._loop.stop)\n", + " if self._thread is not None:\n", + " self._thread.join(timeout=5)\n", + "\n", + "\n", + "def build_reward_funcs(env: EnvRewardClient,\n", + " task_map: dict[int, Task],\n", + " curriculum: Optional[Curriculum] = None,\n", + " model=None,\n", + " tokenizer=None,\n", + " max_rollout_steps: int = 5,\n", + " ) -> tuple[Callable, Callable, Callable]:\n", + " \"\"\"Return (env_reward, format_reward, length_reward).\n", + "\n", + " When `curriculum` is provided, env_reward calls curriculum.record_result()\n", + " once per unique task_id in the batch — one record = one group = one\n", + " curriculum episode. This is what makes the training loop curriculum-driven\n", + " even while TRL owns the outer iteration.\n", + "\n", + " When `model` and `tokenizer` are provided, env_reward runs INTERACTIVE\n", + " multi-turn rollouts: TRL's completion supplies the first command, then\n", + " the policy is re-queried after each env step (with running command/output\n", + " history) for up to `max_rollout_steps - 1` more turns. This is what lets\n", + " multi-step (intermediate/advanced/expert) tasks actually achieve during\n", + " training. Without `model`, env_reward falls back to single-step scoring.\n", + " \"\"\"\n", + " def _text_of(c) -> str:\n", + " return c if isinstance(c, str) else c[0][\"content\"]\n", + "\n", + " # Pre-build the multi-turn generate_next closure once. Only used when\n", + " # `model` was supplied — single-step path skips it entirely.\n", + " if model is not None and tokenizer is not None:\n", + " import torch as _torch # local import to avoid hard dep if unused\n", + " _gen_lock = threading.Lock() # GPU serialisation across rollouts\n", + "\n", + " def _generate_next_for_task(task: Task, history) -> str:\n", + " \"\"\"Sync per-turn generation: build prompt with running history,\n", + " decode one command, return the extracted `aws ...` line.\n", + " Runs on a worker thread off the event loop (see\n", + " `_rollout_one_async`); the lock prevents concurrent rollouts\n", + " from racing on the same GPU.\"\"\"\n", + " messages = [\n", + " {\"role\": \"system\", \"content\": SYSTEM_PROMPT},\n", + " {\"role\": \"user\", \"content\": f\"TASK: {task.description}\"},\n", + " ]\n", + " for cmd, out in list(history)[-4:]:\n", + " messages.append({\"role\": \"assistant\", \"content\": cmd})\n", + " messages.append({\"role\": \"user\", \"content\": f\"OUTPUT:\\n{out[:400]}\"})\n", + " prompt_text = tokenizer.apply_chat_template(\n", + " messages, tokenize=False, add_generation_prompt=True,\n", + " )\n", + " with _gen_lock:\n", + " inputs = tokenizer(prompt_text, return_tensors=\"pt\").to(model.device)\n", + " with _torch.inference_mode():\n", + " ids = model.generate(\n", + " **inputs,\n", + " max_new_tokens=256,\n", + " do_sample=True, temperature=0.7, top_p=0.9,\n", + " pad_token_id=tokenizer.eos_token_id,\n", + " )\n", + " text = tokenizer.decode(\n", + " ids[0, inputs.input_ids.shape[1]:], skip_special_tokens=True,\n", + " )\n", + " return extract_aws_command(text)\n", + " else:\n", + " _generate_next_for_task = None\n", + "\n", + " def env_reward(prompts, completions, task_id=None, **kw):\n", + " tids = task_id if task_id is not None else kw[\"task_id\"]\n", + " tasks = [task_map[int(t)] for t in tids]\n", + " cmds = [extract_aws_command(_text_of(c)) for c in completions]\n", + "\n", + " if _generate_next_for_task is not None:\n", + " # Interactive multi-turn: one task-bound generate_next closure\n", + " # per rollout; env.step calls fan out across the WS pool, while\n", + " # the shared `_gen_lock` inside the closure keeps generates\n", + " # serial on the single GPU.\n", + " gens = [\n", + " (lambda hist, _t=t: _generate_next_for_task(_t, hist))\n", + " for t in tasks\n", + " ]\n", + " rewards = env.score_batch_interactive(\n", + " tasks, cmds, gens, max_steps=max_rollout_steps,\n", + " )\n", + " else:\n", + " rewards = env.score_batch(tasks, cmds)\n", + "\n", + " # Group by task_id and feed each group back to the curriculum. TRL emits\n", + " # G completions per prompt consecutively (all sharing one task_id), so\n", + " # grouping recovers the GRPO semantics cleanly: one record per prompt,\n", + " # achieved iff any rollout hit reward>=1.0, recorded reward = group mean.\n", + " if curriculum is not None:\n", + " by_tid: dict[int, list[float]] = defaultdict(list)\n", + " for tid, r in zip(tids, rewards):\n", + " by_tid[int(tid)].append(r)\n", + " for tid, group in by_tid.items():\n", + " curriculum.record_result(\n", + " task_map[tid],\n", + " achieved=any(r >= 1.0 for r in group),\n", + " reward=sum(group) / len(group),\n", + " )\n", + " return rewards\n", + "\n", + " def format_reward(prompts, completions, **kw):\n", + " # Thinking is now allowed before the command, so the old\n", + " # \"first char must be aws \" check would score 0 on every\n", + " # well-formed ... + aws ... output. Instead\n", + " # require that *some* line of the completion starts with\n", + " # \"aws \" — the same contract extract_aws_command() relies on.\n", + " out = []\n", + " for c in completions:\n", + " txt = _text_of(c)\n", + " has_cmd = any(\n", + " line.strip().strip(\"`\").strip().startswith(\"aws \")\n", + " for line in txt.splitlines()\n", + " )\n", + " out.append(1.0 if has_cmd else 0.0)\n", + " return out\n", + "\n", + " def length_reward(prompts, completions, **kw):\n", + " # With ... the completion can reasonably run to a\n", + " # couple of thousand characters; the old 120-char cap would pin\n", + " # length_reward to ~0 on every thinking output. Grade the extracted\n", + " # command line for concision (commands themselves are still short)\n", + " # and only mildly penalise extreme verbosity in the surrounding\n", + " # reasoning so the model is nudged away from rambling.\n", + " out = []\n", + " for c in completions:\n", + " txt = _text_of(c)\n", + " cmd = extract_aws_command(txt)\n", + " cmd_n = len(cmd)\n", + " cmd_score = 1.0 if cmd_n <= 120 else max(\n", + " 0.0, 1.0 - (cmd_n - 120) / 280.0\n", + " )\n", + " total_n = len(txt)\n", + " verbosity_score = 1.0 if total_n <= 2000 else max(\n", + " 0.0, 1.0 - (total_n - 2000) / 2000.0\n", + " )\n", + " out.append(0.5 * cmd_score + 0.5 * verbosity_score)\n", + " return out\n", + "\n", + " return env_reward, format_reward, length_reward\n", + "\n", + "\n", + "# Re-run protection: if this cell has been run before, the old ENV_CLIENT's\n", + "# background thread is still holding 8 WebSocket sessions. Close it cleanly\n", + "# (sends {\"type\":\"close\"} so the server's /ws handler reaches its finally\n", + "# block and calls _destroy_session → releases the MiniStack slot). Without\n", + "# this, every re-run compounds the leak until the server hits 8/8 capacity.\n", + "try:\n", + " _prev = ENV_CLIENT # noqa: F821\n", + "except NameError:\n", + " pass\n", + "else:\n", + " log.info(\"Closing previous ENV_CLIENT to release its WS sessions…\")\n", + " try:\n", + " _prev.close()\n", + " except Exception as _e:\n", + " log.warning(\"Ignored error during previous close: %r\", _e)\n", + "\n", + "# verbose_errors=True for the first run so the smoke test surfaces any WS /\n", + "# reset / step exception with a full traceback. Flip off after it passes.\n", + "ENV_CLIENT = EnvRewardClient(\n", + " base_url=ENV_BASE_URL,\n", + " pool_size=PIPE.env_pool_size,\n", + " verbose_errors=True,\n", + ")\n", + "\n", + "# Smoke test uses a non-curriculum client to avoid polluting any curriculum state.\n", + "# Task 0 (\"List all S3 buckets\") matches the `aws s3 ls` completion.\n", + "_smoke_task = TASK_MAP[0]\n", + "_smoke_env, _smoke_fmt, _smoke_len = build_reward_funcs(ENV_CLIENT, TASK_MAP, curriculum=None)\n", + "_smoke = _smoke_env(\n", + " prompts=[None] * 2,\n", + " completions=[\"aws s3 ls\", \"aws s3 ls\"],\n", + " task_id=[_smoke_task.task_id, _smoke_task.task_id],\n", + ")\n", + "log.info(\"Reward smoke test on task %s: %s\", _smoke_task.task_id, _smoke)\n", + "log.info(\"Env counters: %s\", ENV_CLIENT.drain_counters())\n", + "assert min(_smoke) > 0.5, \"Reward smoke test failed — env or reward wiring broken\"\n" + ] + }, + { + "cell_type": "markdown", + "id": "99f34cfe", + "metadata": { + "id": "99f34cfe" + }, + "source": [ + "## 9 · Load the SFT adapter as the starting policy\n", + "\n", + "We go through `PeftModel.from_pretrained(base, sft_adapter, is_trainable=True)` explicitly (rather than `FastLanguageModel.from_pretrained(adapter_repo)`) so there is no ambiguity about the adapter landing in trainable mode — GRPO must be able to update the LoRA weights.\n", + "\n", + "This helper is also used later by the final-run and Optuna-trial paths, so it lives in its own cell." + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "e360207d", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 531, + "referenced_widgets": [ + "6f08a4702611494e9331f49a3a117c53", + "2adf38f2dd4f4c68896ab3f124fd2a10", + "118388f7fc3d4d4ba811d43a763e92b4", + "0a657273364b488b802e3c1eb6467ba5", + "307cbbbd2871496fbca0d986ad54b9ac", + "c4614ab14e1642dca6f5a4899fae90ef", + "e1808c94a664458486380230d17039af", + "d0161222380b4ec1a8c43d2498423352", + "8a5e6316093b4a05abe2710ff1d33c5e", + "b959577f9e134fb7bb41c7dd3a441d32", + "45eee0aa85594ee3a9f19cab1900093d", + "bcb703307a8246329992c3267cdcb08a", + "be412634d9b34d4d94a0807b97de39e2", + "79b86eda52fe4b12a0b54ffaf15cca96", + "f3c926804133410a9059e5cdfeb67cde", + "1d8f62c4fdf74eeb8bdc830b4af0670c", + "087774b0f7d844438df2aee7ce5fff0b", + "3f85a045eb424e8c80d9ae09e41acc9b", + "dd3eab3700ad450c8080bb5432071f7b", + "a9db83f0d10b4fd1b4ee3b90d4a7a278", + "c6eddaca9a3448ee9a25588c279f8e33", + "5d521ff47a70480f9c8b97cd826bebff", + "ebcb37ad6120423ab909be13bc4d6b84", + "28d61b8e55ff4504a285e9e1ab903089", + "844b6af01fdd4db3812f07a9f0dcc6e0", + "13c198104606425a81c28ef3a0f32242", + "c13f9ab3802c4d98b8d294809fe46469", + "5efcbdf41907478a833af69d6def7a49", + "cfd968bbff354bf88ed711f5a2ce00dd", + "a893af26a62542338423ca1a6abbb909", + "d50bf1b19f4245eb848a624107a31d35", + "a5ba2b09c1984e71bb50d7729da606ca", + "83cb6dd3b5da4834b7eceabd5d6fdef6", + "3e38fbdb2f6e48dc955399660dbebdfe", + "a7633c89057946f182f36821c4b0922e", + "95710dea79ec4ecf82d9a8f3cc14085b", + "a1dafa7165424f02bdfb5b2bf4b59645", + "9f4ac913e08240f4b74eb1eb0f272c9c", + "b77f5bf34be84809a753ea0e5f0f3b77", + "f74a9bbe540e465080e66ac51e10f1b2", + "6d71da9ff2fb48bc8c62b6fcb30bcd01", + "e78a1c8d4fe64494b51a895f9e122dbb", + "c8e70a9813584680b5ed699573e6d970", + "5059f8e3218f40ee8f240601b270d409", + "c8c63f9906cb43a481fc175377e9e60a", + "7646fb6a28b14180940f77fdfc943ce5", + "d8474024afd74bfe8d0ff74f7bc5ea43", + "78148f6b76b34c3ebfdf938adda1d4e9", + "626d457483f545919a5f79032d9abfe3", + "2390a3cfeafa498585d6003ace58cca2", + "e51bd69bca6a49ec9f70946a68417d01", + "3d4a1f40d0da4b64aef61bc8d5d30e14", + "87bfbaf9e43345078ee5bc6d2d709fa3", + "76a70e18ee6f49d1a8463637f849a74f", + "8af833fdea064d3a95d3b7c2d0b92ea9", + "1d50a009a977463e9f97635a5c4f2bbb", + "1dc52591ca824509b66a32e5bf4f6648", + "4412b8c647ae4c20801a5c265412e022", + "d4467d98b75c40d699ed4165bb75df6f", + "43dd31d1dde142fabc248ea37f94c3c9", + "b754710638044958993eb5bec000fed0", + "51a672bd7cd24564b8d8ea431d318e59", + "80542974d6a84c78a15de58878c18193", + "0ac221560f904fa98329a17b0b5166a9", + "578a784c18e64ee3b6c2d5f671c36b69", + "cdebf7a618af49e3a0c8c5057c0aeaed", + "c989e566fe0942ff8550634b750c1fbf", + "73f9006bf8214a0096bfafddabe258d6", + "140220fc61e44bd1bd775c724d3d43d9", + "f30f63c2ac614bcfb2c5fc90200785fa", + "4b2326ccbab641f78b5e162dee0f75c1", + "7fe4b6172dd149819ddf2762b87d37e9", + "c4b7ed116d494b84a133207912453294", + "5f574598039c467fb83aced764c7936a", + "18ceaac5a73049cf87a1991beae0dfdf", + "4ff08209c30b4475b4077329df0a50dc", + "a8c91fffccd149eab9be4887c94a3bc3", + "d274ca5e4dc84f4ca7bea1208cb2094f", + "51f03a809ced4e299439005861dbebee", + "7340e1e900094ac1aaf4fbf22286a9da", + "1e4e1e42ce174c38bf46c99743aec1a3", + "fc561191f4cd43d8a975602e3c4593a4", + "67b8d4f7124141bfa58fbb9cc3633773", + "a73ce2691f974691af0e5ad183accca5", + "aaf8549415914e949d716e50629ebcc6", + "9ee227074084483bb665250eef98c70e", + "598e07a9cf414c8d9416d57969b654c4", + "083d9eb499e4470fadda78b6e30ccc7c", + "a480c0315a1149a696d2064f85213810", + "0a803d22ea0f44e1a87beb30cc5e77e1", + "11722376e3ce45f683cff6a5f6e78506", + "5d11b2d362b54ae29a2fd907a3c21c38", + "8215e6b72df4433fbba64e75feab0f94", + "06be388f07064b21b25deeb7a53dda81", + "3e295a5c888642ac8e3fd245a8a97a45", + "3a2ac1f4812449a0b4259e7b4f947033", + "129041f3428e4d828b4a97132fb8baa2", + "d91bc462a3a24c1b831ea1643515ab97", + "90c96b4ed8b04448bff93459a933bfd8", + "a35302dc34af43428820d9cac53b82ad", + "74411d1cf20d443a812eb988d8166fd7", + "d1ed9ce40bde41b5bcb75dfd51e28b91", + "1da5f8f77f67429cb81ffc2bc53c3b23", + "70ae6a670fe04c2698d44c4bea2789b1", + "dabe8e2299284bbb8433ad7175694af6", + "30e8681cc91d43068ad37853fcec6b5a", + "57da93e71ec144cba2bb2c3fe97880d6", + "278b869a2efb4f449ef6f37477882234", + "dcf32037f343407a90ee026a51078efe", + "772555eaceeb44f9a94ef4b79a2b27e6" + ] + }, + "id": "e360207d", + "outputId": "e8587f47-92cf-4090-86c7-caa75d5cdabf" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "🦥 Unsloth: Will patch your computer to enable 2x faster free finetuning.\n", + "🦥 Unsloth Zoo will now patch everything to make training faster!\n", + "==((====))== Unsloth 2026.4.8: Fast Qwen2 patching. Transformers: 4.57.6.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "model.safetensors: 0%| | 0.00/2.05G [00:00 None:\n", + " \"\"\"Release GPU memory held by a model + its optimizer state.\"\"\"\n", + " del model\n", + " gc.collect()\n", + " torch.cuda.empty_cache()\n", + "\n", + "\n", + "# Sanity: load + confirm LoRA params are trainable.\n", + "_probe_model, _probe_tok = load_policy(MODEL, trainable=True)\n", + "_trainable = [n for n, p in _probe_model.named_parameters() if p.requires_grad]\n", + "log.info(\"Loaded %s. Trainable params: %d tensors; sample: %s\", MODEL.sft_adapter, len(_trainable), _trainable[:3])\n", + "assert any(\"lora\" in n.lower() for n in _trainable), \"No LoRA params marked trainable — load path is wrong\"\n", + "free_model(_probe_model)\n", + "del _probe_tok\n", + "gc.collect(); torch.cuda.empty_cache()\n", + "log.info(\"Model load path verified.\")" + ] + }, + { + "cell_type": "markdown", + "id": "13c4aa8f", + "metadata": { + "id": "13c4aa8f" + }, + "source": [ + "## 10 · Baseline eval — SFT adapter, single-step env reward\n", + "\n", + "Single-pass eval on the val set. This is the \"before\" column of the headline comparison. The richer *multi-step* eval happens later; this one is only here to confirm the SFT-loaded model outputs sane commands against the env **before** we start GRPO.\n", + "\n", + "Written as a small `evaluate_single_step` helper because GRPO's inner trial loop needs the same logic." + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "id": "eval-single-step", + "metadata": { + "id": "eval-single-step", + "colab": { + "base_uri": "https://localhost:8080/" + }, + "outputId": "41ff1041-4807-41a3-d2cc-bdc6c89a985b" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "==((====))== Unsloth 2026.4.8: Fast Qwen2 patching. Transformers: 4.57.6.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n", + "14:56:31 | INFO | grpo | SFT baseline (single-step, val): {'env_reward_mean': 0.9, 'env_success_rate': 0.85, 'format_pct': 1.0, 'n': 20}\n" + ] + } + ], + "source": [ + "import json\n", + "import statistics as _stats\n", + "from dataclasses import asdict\n", + "\n", + "\n", + "@dataclass\n", + "class SingleStepMetrics:\n", + " \"\"\"One row of headline comparison numbers.\"\"\"\n", + " env_reward_mean: float\n", + " env_success_rate: float # fraction with reward >= 1.0\n", + " format_pct: float\n", + " n: int\n", + "\n", + " def as_dict(self) -> dict:\n", + " return asdict(self)\n", + "\n", + "\n", + "def evaluate_single_step(model, tokenizer, dataset, env: EnvRewardClient,\n", + " task_map: dict[int, Task],\n", + " max_new_tokens: int = 128) -> SingleStepMetrics:\n", + " \"\"\"Generate one command per prompt, score against the env, summarize.\"\"\"\n", + " from unsloth import FastLanguageModel\n", + "\n", + " FastLanguageModel.for_inference(model)\n", + " formats: list[float] = []\n", + " tasks_to_score: list[Task] = []\n", + " cmds_to_score: list[str] = []\n", + "\n", + " for row in dataset:\n", + " prompt_text = tokenizer.apply_chat_template(\n", + " row[\"prompt\"], tokenize=False, add_generation_prompt=True,\n", + " )\n", + " inputs = tokenizer(prompt_text, return_tensors=\"pt\").to(model.device)\n", + " with torch.inference_mode():\n", + " ids = model.generate(\n", + " **inputs,\n", + " max_new_tokens=max_new_tokens,\n", + " do_sample=False,\n", + " pad_token_id=tokenizer.eos_token_id,\n", + " )\n", + " text = tokenizer.decode(\n", + " ids[0, inputs.input_ids.shape[1]:], skip_special_tokens=True,\n", + " )\n", + " # Match the training-time format_reward contract: accept any\n", + " # line starting with \"aws \" so a ... prefix does\n", + " # not score 0 for format.\n", + " has_cmd = any(\n", + " line.strip().strip(\"`\").strip().startswith(\"aws \")\n", + " for line in text.splitlines()\n", + " )\n", + " formats.append(1.0 if has_cmd else 0.0)\n", + " tasks_to_score.append(task_map[int(row[\"task_id\"])])\n", + " cmds_to_score.append(extract_aws_command(text))\n", + "\n", + " # Score all env rewards in parallel across the 8 server slots\n", + " rewards = env.score_batch(tasks_to_score, cmds_to_score)\n", + "\n", + " FastLanguageModel.for_training(model)\n", + "\n", + " return SingleStepMetrics(\n", + " env_reward_mean=float(_stats.mean(rewards)),\n", + " env_success_rate=sum(r >= 1.0 for r in rewards) / len(rewards),\n", + " format_pct=float(_stats.mean(formats)),\n", + " n=len(rewards),\n", + " )\n", + "\n", + "\n", + "# Run the SFT-only baseline and persist it alongside Optuna + checkpoints\n", + "_baseline_model, _baseline_tok = load_policy(MODEL, trainable=False)\n", + "baseline_metrics = evaluate_single_step(\n", + " _baseline_model, _baseline_tok, VAL_DS, ENV_CLIENT, TASK_MAP,\n", + " max_new_tokens=TRAIN.max_completion_length,\n", + ")\n", + "(OUT_DIR / \"baseline_single_step.json\").write_text(json.dumps(baseline_metrics.as_dict(), indent=2))\n", + "free_model(_baseline_model); del _baseline_tok\n", + "gc.collect(); torch.cuda.empty_cache()\n", + "\n", + "log.info(\"SFT baseline (single-step, val): %s\", baseline_metrics.as_dict())\n" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "id": "b439f160", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "b439f160", + "outputId": "98e86e8f-3142-46df-8403-7835d07ce8a9" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "14:56:31 | INFO | grpo | Loading optuna and defining trial objective...\n", + "14:56:31 | INFO | grpo | Curriculum-driven Optuna objective defined.\n" + ] + } + ], + "source": [ + "import optuna\n", + "import time\n", + "\n", + "log.info(\"Loading optuna and defining trial objective...\")\n", + "\n", + "\n", + "def suggest_training_config(trial: optuna.Trial, defaults: TrainingConfig) -> TrainingConfig:\n", + " \"\"\"Return a mutated copy of `defaults` with Optuna-sampled hparams.\n", + "\n", + " One function, one diff — keeps the search space auditable.\n", + " \"\"\"\n", + " return replace(\n", + " defaults,\n", + " learning_rate = trial.suggest_float(\"learning_rate\", 1e-6, 5e-5, log=True),\n", + " beta = trial.suggest_float(\"beta\", 0.0, 0.1),\n", + " temperature = trial.suggest_float(\"temperature\", 0.7, 1.0),\n", + " )\n", + "\n", + "\n", + "def trial_objective(trial: optuna.Trial) -> float:\n", + " \"\"\"Short curriculum-driven GRPO run + val eval. Returns mean env reward\n", + " on the small Optuna task pool.\"\"\"\n", + " trial_cfg = suggest_training_config(trial, TRAIN)\n", + " output_dir = str(OUT_DIR / f\"optuna/trial-{trial.number}\")\n", + " log.info(\"[trial %d] starting | cfg=%s\", trial.number, {\n", + " \"lr\": trial_cfg.learning_rate, \"beta\": trial_cfg.beta,\n", + " \"temp\": trial_cfg.temperature,\n", + " })\n", + "\n", + " # Fresh curriculum per trial — otherwise mastery and tier progression bleed\n", + " # across trials, making Optuna's hparam comparison unfair.\n", + " trial_curriculum = Curriculum(tasks_dir=_tasks_dir)\n", + " # Small fixed task pool (12 rows: warmup-2, beginner-2, intermediate-2,\n", + " # advanced-3, expert-3). CurriculumTierSampler still cycles within whatever\n", + " # tier the curriculum is on; with only 2-3 rows per tier the sampler\n", + " # simply re-shuffles those indices each cycle.\n", + " trial_train_ds = OPTUNA_DS\n", + " trial_num_samples = int(\n", + " PIPE.trial_max_steps\n", + " * trial_cfg.per_device_train_batch_size\n", + " * trial_cfg.gradient_accumulation_steps\n", + " * 1.2\n", + " )\n", + " log.info(\"[trial %d] loading SFT policy (4-bit Qwen2.5-Coder-3B)...\", trial.number)\n", + " _t0 = time.time()\n", + " model, tokenizer = load_policy(MODEL, trainable=True)\n", + " log.info(\"[trial %d] policy loaded in %.1fs\", trial.number, time.time() - _t0)\n", + "\n", + " trial_env_r, trial_fmt_r, trial_len_r = build_reward_funcs(\n", + " ENV_CLIENT, TASK_MAP, trial_curriculum,\n", + " model=model, tokenizer=tokenizer,\n", + " )\n", + "\n", + " trainer = build_trainer(\n", + " model, tokenizer,\n", + " train_ds=trial_train_ds,\n", + " eval_ds=OPTUNA_DS,\n", + " reward_funcs=(trial_env_r, trial_fmt_r, trial_len_r),\n", + " cfg=trial_cfg,\n", + " output_dir=output_dir,\n", + " run_name=f\"optuna-trial-{trial.number}\",\n", + " use_fp16=RT.use_fp16, use_bf16=RT.use_bf16,\n", + " max_steps=PIPE.trial_max_steps,\n", + " save_strategy=\"no\",\n", + " curriculum=trial_curriculum,\n", + " num_samples=trial_num_samples,\n", + " )\n", + "\n", + " try:\n", + " log.info(\"[trial %d] starting train() for %d steps...\",\n", + " trial.number, PIPE.trial_max_steps)\n", + " _t1 = time.time()\n", + " trainer.train()\n", + " log.info(\"[trial %d] train() finished in %.1fs\", trial.number, time.time() - _t1)\n", + " # Persist trainer_state.json for later plotting. save_strategy=\"no\"\n", + " # means TRL never writes checkpoints during training, so without\n", + " # this call there'd be no on-disk log history for this trial once\n", + " # the process exits.\n", + " trial_out = Path(output_dir)\n", + " trial_out.mkdir(parents=True, exist_ok=True)\n", + " (trial_out / \"trainer_state.json\").write_text(\n", + " json.dumps(\n", + " {\"log_history\": trainer.state.log_history,\n", + " \"global_step\": trainer.state.global_step,\n", + " \"trial_number\": trial.number},\n", + " indent=2, default=str,\n", + " )\n", + " )\n", + " # Score the trial on the same small Optuna task pool.\n", + " log.info(\"[trial %d] running single-step eval on %d tasks...\",\n", + " trial.number, len(OPTUNA_DS))\n", + " _t2 = time.time()\n", + " metrics = evaluate_single_step(\n", + " trainer.model, tokenizer, OPTUNA_DS, ENV_CLIENT, TASK_MAP,\n", + " max_new_tokens=trial_cfg.max_completion_length,\n", + " )\n", + " log.info(\"[trial %d] eval finished in %.1fs\", trial.number, time.time() - _t2)\n", + " score = metrics.env_reward_mean\n", + " # Also capture single-step eval metrics per trial for offline plotting.\n", + " (trial_out / \"single_step_metrics.json\").write_text(\n", + " json.dumps(metrics.as_dict(), indent=2)\n", + " )\n", + " log.info(\n", + " \"[trial %d] DONE | env_reward_mean=%.4f success=%.3f tier=%s graduated=%d\",\n", + " trial.number, score, metrics.env_success_rate,\n", + " trial_curriculum.current_difficulty.value,\n", + " len(trial_curriculum.get_stats().get(\"graduated_tasks\", [])),\n", + " )\n", + " finally:\n", + " free_model(trainer); free_model(model); del tokenizer\n", + " gc.collect(); torch.cuda.empty_cache()\n", + "\n", + " trial.report(score, step=PIPE.trial_max_steps)\n", + " if trial.should_prune():\n", + " raise optuna.TrialPruned()\n", + " return score\n", + "\n", + "\n", + "log.info(\"Curriculum-driven Optuna objective defined.\")\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "id": "6f37100a", + "metadata": { + "id": "6f37100a", + "outputId": "09fc6f50-5d1e-467a-f410-35d549bc33f4", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "14:56:32 | INFO | grpo | GRPOTrainer factory ready.\n" + ] + } + ], + "source": [ + "import random\n", + "import time\n", + "from collections import defaultdict\n", + "from collections.abc import Iterable\n", + "\n", + "import torch\n", + "from trl import GRPOConfig, GRPOTrainer\n", + "from transformers import TrainerCallback\n", + "\n", + "\n", + "class CurriculumTierSampler(torch.utils.data.Sampler[int]):\n", + " \"\"\"Reactive sampler: yields dataset indices from the curriculum's\n", + " *current* tier, re-checked on every yield.\n", + "\n", + " The usual approach — pre-materialising a fixed dataset from the\n", + " curriculum — freezes the training data to whatever tier the curriculum\n", + " started in, because `curriculum.next_task()` never calls\n", + " `record_result` and so `_maybe_promote` can't fire during the draw.\n", + " Here the dataset is a *superset* of all tiers (see\n", + " make_full_curriculum_dataset) and this sampler picks indices only\n", + " from rows whose `difficulty` matches the curriculum's current tier.\n", + " When `env_reward` promotes the curriculum mid-training, the very\n", + " next yield flips onto the new tier's index pool.\n", + "\n", + " Implementation notes:\n", + " * `__len__` is required for HF Trainer's max_steps math. We return\n", + " `num_samples`, which the caller sizes as\n", + " `max_steps * pdtbs * grad_accum * buffer`.\n", + " * Index pools are built once at construction from the dataset's\n", + " `difficulty` column; only the active pool + cursor are mutated\n", + " during iteration, which keeps per-step overhead O(1).\n", + " * If the curriculum's current tier has no tasks in the dataset\n", + " (mis-configured YAML), we fall back to the union of all tiers so\n", + " training doesn't deadlock.\n", + " \"\"\"\n", + "\n", + " def __init__(self, dataset, curriculum, num_samples: int) -> None:\n", + " self.dataset = dataset\n", + " self.curriculum = curriculum\n", + " self.num_samples = int(num_samples)\n", + " difficulties = list(dataset[\"difficulty\"])\n", + " self._pools: dict[str, list[int]] = defaultdict(list)\n", + " for idx, diff in enumerate(difficulties):\n", + " self._pools[diff].append(idx)\n", + " self._all_indices = list(range(len(difficulties)))\n", + " log.info(\n", + " \"CurriculumTierSampler: num_samples=%d, tier sizes=%s\",\n", + " self.num_samples,\n", + " {k: len(v) for k, v in self._pools.items()},\n", + " )\n", + "\n", + " def _pool_for(self, tier_value: str) -> list[int]:\n", + " pool = self._pools.get(tier_value) or self._all_indices\n", + " return list(pool)\n", + "\n", + " def __len__(self) -> int:\n", + " return self.num_samples\n", + "\n", + " def __iter__(self):\n", + " count = 0\n", + " cur_tier: str | None = None\n", + " pool: list[int] = []\n", + " cursor = 0\n", + " while count < self.num_samples:\n", + " new_tier = self.curriculum.current_difficulty.value\n", + " if new_tier != cur_tier:\n", + " cur_tier = new_tier\n", + " pool = self._pool_for(cur_tier)\n", + " random.shuffle(pool)\n", + " cursor = 0\n", + " if cursor >= len(pool):\n", + " random.shuffle(pool)\n", + " cursor = 0\n", + " yield pool[cursor]\n", + " cursor += 1\n", + " count += 1\n", + "\n", + "\n", + "class CurriculumPromotionCallback(TrainerCallback):\n", + " \"\"\"Observability: log when the curriculum promotes.\"\"\"\n", + "\n", + " def __init__(self, curriculum) -> None:\n", + " self.curriculum = curriculum\n", + " self._last_tier: str | None = None\n", + "\n", + " def on_step_end(self, args, state, control, **kw):\n", + " tier = self.curriculum.current_difficulty.value\n", + " if tier != self._last_tier:\n", + " if self._last_tier is not None:\n", + " log.info(\n", + " \"[CurriculumPromotionCallback] tier promoted %s -> %s at step %d\",\n", + " self._last_tier, tier, state.global_step,\n", + " )\n", + " self._last_tier = tier\n", + "\n", + "\n", + "class EnvHealthCallback(TrainerCallback):\n", + " \"\"\"Log env health counters + drain them every N steps.\n", + "\n", + " Also provides an early-warning bail-out: if every scoring call in a\n", + " window came back as timeout/conn_err, the hosted env is probably down\n", + " and we want to stop training rather than polluting the adapter with\n", + " zero-reward updates.\n", + " \"\"\"\n", + "\n", + " def __init__(self, env_client: EnvRewardClient, probe_every: int = 50,\n", + " fail_threshold: int = 32) -> None:\n", + " self.env = env_client\n", + " self.probe_every = probe_every\n", + " self.fail_threshold = fail_threshold\n", + "\n", + " def on_log(self, args, state, control, logs=None, **kw):\n", + " if state.global_step == 0 or state.global_step % self.probe_every != 0:\n", + " return\n", + " counters = self.env.drain_counters()\n", + " log.info(\"[env counters] step=%d %s\", state.global_step, counters)\n", + " if counters[\"timeout\"] + counters[\"conn_err\"] >= self.fail_threshold:\n", + " log.error(\"[EnvHealthCallback] %s at step %d — stopping training.\",\n", + " counters, state.global_step)\n", + " control.should_training_stop = True\n", + "\n", + "\n", + "class ProgressLogCallback(TrainerCallback):\n", + " \"\"\"Mirror TRL's scalar logs (loss, reward, kl, ...) to the Python logger.\n", + "\n", + " TRL writes its scalars via `Trainer.log`, which goes to `state.log_history`\n", + " and to whichever integrations are listed in `report_to`. With\n", + " `report_to=\"none\"` there is no on-screen feedback during training — just\n", + " a tqdm bar that Jupyter sometimes hides. This callback hooks `on_log` and\n", + " forwards the scalar dict through `log.info` every step, plus a heartbeat\n", + " line on `on_step_end` every `heartbeat_every` steps so you always see\n", + " *something* even when TRL hasn't emitted a scalar yet (e.g. the opening\n", + " generation phase before the first optimizer step).\n", + " \"\"\"\n", + "\n", + " def __init__(self, heartbeat_every: int = 1, run_label: str = \"\") -> None:\n", + " self.heartbeat_every = max(1, int(heartbeat_every))\n", + " self.run_label = run_label\n", + " self._t_start: float | None = None\n", + " self._t_last: float | None = None\n", + "\n", + " def on_train_begin(self, args, state, control, **kw):\n", + " self._t_start = time.time()\n", + " self._t_last = self._t_start\n", + " log.info(\"%s train_begin | max_steps=%s\", self._tag(), args.max_steps)\n", + "\n", + " def on_step_end(self, args, state, control, **kw):\n", + " if state.global_step % self.heartbeat_every != 0:\n", + " return\n", + " now = time.time()\n", + " dt = now - (self._t_last or now)\n", + " self._t_last = now\n", + " log.info(\"%s step %d/%s (+%.1fs)\",\n", + " self._tag(), state.global_step, args.max_steps, dt)\n", + "\n", + " def on_log(self, args, state, control, logs=None, **kw):\n", + " if not logs:\n", + " return\n", + " # Drop noisy / non-scalar fields and round for legibility.\n", + " scalars = {k: (round(v, 4) if isinstance(v, float) else v)\n", + " for k, v in logs.items()\n", + " if isinstance(v, (int, float))}\n", + " if scalars:\n", + " log.info(\"%s log step=%d %s\",\n", + " self._tag(), state.global_step, scalars)\n", + "\n", + " def on_train_end(self, args, state, control, **kw):\n", + " elapsed = time.time() - (self._t_start or time.time())\n", + " log.info(\"%s train_end | global_step=%d elapsed=%.1fs\",\n", + " self._tag(), state.global_step, elapsed)\n", + "\n", + " def _tag(self) -> str:\n", + " return f\"[{self.run_label}]\" if self.run_label else \"[train]\"\n", + "\n", + "\n", + "def build_trainer(model, tokenizer, train_ds, eval_ds,\n", + " reward_funcs: Iterable[Callable],\n", + " cfg: TrainingConfig, *,\n", + " output_dir: str, run_name: str,\n", + " use_fp16: bool, use_bf16: bool,\n", + " max_steps: int | None = None,\n", + " save_strategy: str = \"steps\",\n", + " eval_strategy: str = \"steps\",\n", + " curriculum=None,\n", + " num_samples: int | None = None) -> GRPOTrainer:\n", + " \"\"\"Assemble a GRPOTrainer from a typed TrainingConfig.\n", + "\n", + " When `curriculum` is supplied, the trainer's train sampler is\n", + " replaced with a CurriculumTierSampler that yields dataset indices\n", + " from the curriculum's current tier — reactive to promotion. The\n", + " dataset passed in as `train_ds` must carry a `difficulty` column\n", + " (use make_full_curriculum_dataset). `num_samples` sizes the\n", + " sampler; callers typically set it to\n", + " `max_steps * per_device_train_batch_size * gradient_accumulation_steps * 1.2`.\n", + " \"\"\"\n", + " args = GRPOConfig(\n", + " output_dir=output_dir, run_name=run_name,\n", + " num_generations=cfg.num_generations, beta=cfg.beta,\n", + " temperature=cfg.temperature, top_p=cfg.top_p,\n", + " max_prompt_length=cfg.max_prompt_length,\n", + " max_completion_length=cfg.max_completion_length,\n", + " learning_rate=cfg.learning_rate, lr_scheduler_type=\"cosine\",\n", + " optim=\"adamw_8bit\", weight_decay=0.0, max_grad_norm=1.0,\n", + " warmup_ratio=cfg.warmup_ratio,\n", + " per_device_train_batch_size=cfg.per_device_train_batch_size,\n", + " # TRL's GRPOConfig asserts per_device_eval_batch_size * num_processes is\n", + " # divisible by num_generations (one eval prompt produces G completions;\n", + " # anything smaller can't form a group). Defaulting it to num_generations\n", + " # is the smallest value that satisfies the check on a single-process\n", + " # setup — matches how GRPOTrainer batches eval internally.\n", + " per_device_eval_batch_size=cfg.num_generations,\n", + " gradient_accumulation_steps=cfg.gradient_accumulation_steps,\n", + " num_train_epochs=cfg.num_train_epochs,\n", + " max_steps=(max_steps if max_steps is not None else -1),\n", + " fp16=use_fp16, bf16=use_bf16,\n", + " # Mid-training eval is disabled for GRPO: TRL's prediction_step\n", + " # calls _generate_and_score_completions, which reshapes rewards\n", + " # as (-1, num_generations). At eval time the effective per-prompt\n", + " # completion count can differ from num_generations, so the view\n", + " # errors with \"shape '[-1, G]' is invalid for input of size N\".\n", + " # The notebook runs its own before/after eval via evaluate_single_step,\n", + " # so we lose nothing by skipping TRL's eval loop here.\n", + " eval_strategy=eval_strategy, eval_steps=cfg.eval_steps,\n", + " save_strategy=save_strategy, save_steps=cfg.save_steps,\n", + " save_total_limit=cfg.save_total_limit,\n", + " logging_steps=1, report_to=\"none\", seed=cfg.seed,\n", + " remove_unused_columns=False, # CRITICAL: preserves task_id for reward_fns\n", + " disable_tqdm=False,\n", + " )\n", + " callbacks = [\n", + " EnvHealthCallback(ENV_CLIENT),\n", + " ProgressLogCallback(heartbeat_every=1, run_label=run_name),\n", + " ]\n", + " if curriculum is not None:\n", + " callbacks.append(CurriculumPromotionCallback(curriculum))\n", + "\n", + " trainer = GRPOTrainer(\n", + " model=model, processing_class=tokenizer,\n", + " reward_funcs=list(reward_funcs),\n", + " reward_weights=[1.0, 0.15, 0.05],\n", + " args=args, train_dataset=train_ds, eval_dataset=eval_ds,\n", + " callbacks=callbacks,\n", + " )\n", + "\n", + " if curriculum is not None:\n", + " if num_samples is None:\n", + " raise ValueError(\"num_samples is required when curriculum is set\")\n", + " if \"difficulty\" not in train_ds.column_names:\n", + " raise ValueError(\n", + " \"curriculum-driven training needs a `difficulty` column on \"\n", + " \"train_ds — use make_full_curriculum_dataset().\"\n", + " )\n", + " _sampler = CurriculumTierSampler(\n", + " dataset=train_ds, curriculum=curriculum, num_samples=num_samples,\n", + " )\n", + " # Monkey-patch the trainer's sampler factory so the DataLoader,\n", + " # which is built lazily inside trainer.train(), pulls from our\n", + " # tier-reactive sampler instead of the default RandomSampler.\n", + " # Using MethodType keeps `self` binding correct on the bound call.\n", + " import types\n", + " def _curriculum_train_sampler(self):\n", + " return _sampler\n", + " trainer._get_train_sampler = types.MethodType(\n", + " _curriculum_train_sampler, trainer,\n", + " )\n", + "\n", + " return trainer\n", + "\n", + "\n", + "log.info(\"GRPOTrainer factory ready.\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "5a29cad6", + "metadata": { + "id": "5a29cad6" + }, + "source": [ + "## 12 · Optuna hyperparameter search\n", + "\n", + "Six short trials (30 GRPO steps each, 80-row training subset). Each trial returns the mean **env reward on the held-out val set** — the one metric we actually want to maximize.\n", + "\n", + "- **Resumable**: sqlite storage + `load_if_exists=True`. A dropped Colab session picks up where it left off.\n", + "- **Pruned**: `MedianPruner` — kill trials that are trending below the median after 10 steps.\n", + "- **Search space** chosen to bracket the GRPO-on-3B defaults reported in the DeepSeek-Math paper." + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "id": "0b184374", + "metadata": { + "id": "0b184374", + "outputId": "11dc0d5c-9899-4aa1-ee6d-749e14ea3a04", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "[I 2026-04-25 14:56:34,668] A new study created in RDB with name: aws-rl-grpo-search\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Optuna study 'aws-rl-grpo-search': 0 completed, 4 remaining.\n", + "14:56:34 | INFO | grpo | [trial 0] starting | cfg={'lr': 4.328450221293881e-06, 'beta': 0.09507143064099162, 'temp': 0.9195981825434215}\n", + "14:56:34 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "14:56:34 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "14:56:34 | INFO | grpo | [trial 0] loading SFT policy (4-bit Qwen2.5-Coder-3B)...\n", + "==((====))== Unsloth 2026.4.8: Fast Qwen2 patching. Transformers: 4.57.6.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n", + "14:56:52 | INFO | grpo | [trial 0] policy loaded in 17.9s\n", + "14:56:52 | INFO | grpo | CurriculumTierSampler: num_samples=192, tier sizes={'warmup': 2, 'beginner': 2, 'intermediate': 2, 'advanced': 3, 'expert': 3}\n", + "14:56:52 | INFO | grpo | [trial 0] starting train() for 10 steps...\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 12 | Num Epochs = 5 | Total steps = 10\n", + "O^O/ \\_/ \\ Batch size per device = 2 | Gradient accumulation steps = 8\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (2 x 8 x 1) = 16\n", + " \"-____-\" Trainable parameters = 7,372,800 of 3,093,311,488 (0.24% trained)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "14:56:55 | INFO | grpo | [optuna-trial-0] train_begin | max_steps=10\n", + "Unsloth: Will smartly offload gradients to save VRAM!\n", + "14:59:00 | INFO | server.services.curriculum | Episode 1: task=33 difficulty=warmup achieved=True tier_rate=1.00\n", + "14:59:00 | INFO | server.services.curriculum | Episode 2: task=37 difficulty=warmup achieved=True tier_rate=1.00\n", + "14:59:43 | INFO | grpo | [optuna-trial-0] step 1/10 (+168.1s)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + "
\n", + " \n", + " \n", + " [10/10 16:25, Epoch 5/5]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining LossValidation Loss

" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "14:59:43 | INFO | grpo | [optuna-trial-0] log step=1 {'loss': -0.0219, 'grad_norm': 0.2647, 'learning_rate': 0.0, 'num_tokens': 3329.0, 'completions/mean_length': 42.0625, 'completions/min_length': 24.0, 'completions/max_length': 54.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 42.0625, 'completions/min_terminated_length': 24.0, 'completions/max_terminated_length': 54.0, 'rewards/env_reward/mean': 0.9375, 'rewards/env_reward/std': 0.25, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 1.0, 'rewards/length_reward/std': 0.0, 'reward': 2.9375, 'reward_std': 0.1768, 'frac_reward_zero_std': 0.5, 'completion_length': 42.0625, 'kl': 0.1109, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 0.6667}\n", + "15:01:26 | INFO | server.services.curriculum | Loaded 25 beginner tasks total\n", + "15:01:26 | INFO | server.services.curriculum | PROMOTED from warmup to beginner (rate=1.00, FAST-TRACK)\n", + "15:01:26 | INFO | server.services.curriculum | Episode 3: task=33 difficulty=warmup achieved=True tier_rate=0.00\n", + "15:01:26 | INFO | server.services.curriculum | Episode 4: task=37 difficulty=warmup achieved=True tier_rate=1.00\n", + "15:01:29 | INFO | grpo | [optuna-trial-0] step 2/10 (+106.0s)\n", + "15:01:29 | INFO | grpo | [CurriculumPromotionCallback] tier promoted warmup -> beginner at step 2\n", + "15:01:29 | INFO | grpo | [optuna-trial-0] log step=2 {'loss': -0.009, 'grad_norm': 0.5444, 'learning_rate': 0.0, 'num_tokens': 6695.0, 'completions/mean_length': 44.375, 'completions/min_length': 33.0, 'completions/max_length': 64.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 44.375, 'completions/min_terminated_length': 33.0, 'completions/max_terminated_length': 64.0, 'rewards/env_reward/mean': 0.75, 'rewards/env_reward/std': 0.4472, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 1.0, 'rewards/length_reward/std': 0.0, 'reward': 2.75, 'reward_std': 0.4356, 'frac_reward_zero_std': 0.0, 'completion_length': 42.375, 'kl': 0.0906, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 1.0}\n", + "15:02:10 | INFO | server.services.curriculum | Episode 5: task=8 difficulty=beginner achieved=True tier_rate=1.00\n", + "15:02:10 | INFO | server.services.curriculum | Loaded 25 intermediate tasks total\n", + "15:02:10 | INFO | server.services.curriculum | PROMOTED from beginner to intermediate (rate=1.00, FAST-TRACK)\n", + "15:02:10 | INFO | server.services.curriculum | Episode 6: task=53 difficulty=beginner achieved=True tier_rate=0.00\n", + "15:02:13 | INFO | grpo | [optuna-trial-0] step 3/10 (+44.4s)\n", + "15:02:13 | INFO | grpo | [CurriculumPromotionCallback] tier promoted beginner -> intermediate at step 3\n", + "15:02:13 | INFO | grpo | [optuna-trial-0] log step=3 {'loss': -0.1569, 'grad_norm': 0.1853, 'learning_rate': 0.0, 'completion_length': 48.25, 'kl': 0.1154, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 10256.0, 'completions/mean_length': 51.5625, 'completions/min_length': 29.0, 'completions/max_length': 72.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 51.5625, 'completions/min_terminated_length': 29.0, 'completions/max_terminated_length': 72.0, 'rewards/env_reward/mean': 0.875, 'rewards/env_reward/std': 0.3416, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 1.0, 'rewards/length_reward/std': 0.0, 'reward': 2.875, 'reward_std': 0.2315, 'frac_reward_zero_std': 0.5, 'epoch': 1.6667}\n", + "15:02:16 | INFO | grpo | [optuna-trial-0] step 4/10 (+3.1s)\n", + "15:02:17 | INFO | grpo | [optuna-trial-0] log step=4 {'loss': 0.2385, 'grad_norm': 0.3908, 'learning_rate': 0.0, 'completion_length': 53.0, 'kl': 0.1076, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 2.0}\n", + "15:03:37 | INFO | server.services.curriculum | Episode 7: task=11 difficulty=intermediate achieved=True tier_rate=1.00\n", + "15:03:37 | INFO | server.services.curriculum | Episode 8: task=84 difficulty=intermediate achieved=True tier_rate=1.00\n", + "15:03:45 | INFO | grpo | [optuna-trial-0] step 5/10 (+88.1s)\n", + "15:03:45 | INFO | grpo | [optuna-trial-0] log step=5 {'loss': -0.0531, 'grad_norm': 0.3091, 'learning_rate': 0.0, 'num_tokens': 14343.0, 'completions/mean_length': 71.4375, 'completions/min_length': 47.0, 'completions/max_length': 124.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 71.4375, 'completions/min_terminated_length': 47.0, 'completions/max_terminated_length': 124.0, 'rewards/env_reward/mean': 0.8125, 'rewards/env_reward/std': 0.4031, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 1.0, 'rewards/length_reward/std': 0.0, 'reward': 2.8125, 'reward_std': 0.4082, 'frac_reward_zero_std': 0.0, 'completion_length': 71.4375, 'kl': 0.2469, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 2.6667}\n", + "15:04:56 | INFO | server.services.curriculum | Loaded 25 advanced tasks total\n", + "15:04:56 | INFO | server.services.curriculum | PROMOTED from intermediate to advanced (rate=1.00, FAST-TRACK)\n", + "15:04:56 | INFO | server.services.curriculum | Episode 9: task=84 difficulty=intermediate achieved=True tier_rate=0.00\n", + "15:04:56 | INFO | server.services.curriculum | Episode 10: task=11 difficulty=intermediate achieved=True tier_rate=1.00\n", + "15:04:59 | INFO | grpo | [optuna-trial-0] step 6/10 (+74.5s)\n", + "15:04:59 | INFO | grpo | [CurriculumPromotionCallback] tier promoted intermediate -> advanced at step 6\n", + "15:04:59 | INFO | grpo | [optuna-trial-0] log step=6 {'loss': 0.0077, 'grad_norm': 0.4035, 'learning_rate': 0.0, 'num_tokens': 18336.0, 'completions/mean_length': 65.5625, 'completions/min_length': 45.0, 'completions/max_length': 102.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 65.5625, 'completions/min_terminated_length': 45.0, 'completions/max_terminated_length': 102.0, 'rewards/env_reward/mean': 0.875, 'rewards/env_reward/std': 0.3416, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9985, 'rewards/length_reward/std': 0.0058, 'reward': 2.8735, 'reward_std': 0.353, 'frac_reward_zero_std': 0.0, 'completion_length': 68.375, 'kl': 0.2219, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 3.0}\n", + "15:08:41 | INFO | server.services.curriculum | Episode 11: task=95 difficulty=advanced achieved=True tier_rate=1.00\n", + "15:08:41 | INFO | server.services.curriculum | Episode 12: task=97 difficulty=advanced achieved=False tier_rate=0.61\n", + "15:08:41 | INFO | server.services.curriculum | Episode 13: task=96 difficulty=advanced achieved=False tier_rate=0.42\n", + "15:08:45 | INFO | grpo | [optuna-trial-0] step 7/10 (+226.0s)\n", + "15:08:45 | INFO | grpo | [optuna-trial-0] log step=7 {'loss': -0.1714, 'grad_norm': 0.2604, 'learning_rate': 0.0, 'completion_length': 73.0, 'kl': 0.2541, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 23311.0, 'completions/mean_length': 85.5625, 'completions/min_length': 41.0, 'completions/max_length': 135.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 85.5625, 'completions/min_terminated_length': 41.0, 'completions/max_terminated_length': 135.0, 'rewards/env_reward/mean': 0.6746, 'rewards/env_reward/std': 0.2689, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9403, 'rewards/length_reward/std': 0.0799, 'reward': 2.6149, 'reward_std': 0.3057, 'frac_reward_zero_std': 0.0, 'epoch': 3.6667}\n", + "15:08:49 | INFO | grpo | [optuna-trial-0] step 8/10 (+4.1s)\n", + "15:08:49 | INFO | grpo | [optuna-trial-0] log step=8 {'loss': 0.5884, 'grad_norm': 0.2926, 'learning_rate': 0.0, 'completion_length': 87.875, 'kl': 0.1595, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 4.0}\n", + "15:12:13 | INFO | server.services.curriculum | Episode 14: task=96 difficulty=advanced achieved=False tier_rate=0.31\n", + "15:12:13 | INFO | server.services.curriculum | Episode 15: task=97 difficulty=advanced achieved=False tier_rate=0.23\n", + "15:12:13 | INFO | server.services.curriculum | Episode 16: task=95 difficulty=advanced achieved=True tier_rate=0.40\n", + "15:12:21 | INFO | grpo | [optuna-trial-0] step 9/10 (+212.1s)\n", + "15:12:21 | INFO | grpo | [optuna-trial-0] log step=9 {'loss': 0.0684, 'grad_norm': 0.2102, 'learning_rate': 0.0, 'num_tokens': 28312.0, 'completions/mean_length': 87.1875, 'completions/min_length': 50.0, 'completions/max_length': 114.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 87.1875, 'completions/min_terminated_length': 50.0, 'completions/max_terminated_length': 114.0, 'rewards/env_reward/mean': 0.6315, 'rewards/env_reward/std': 0.2486, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9085, 'rewards/length_reward/std': 0.0836, 'reward': 2.5399, 'reward_std': 0.234, 'frac_reward_zero_std': 0.0, 'completion_length': 87.1875, 'kl': 0.1919, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 4.6667}\n", + "15:16:04 | INFO | server.services.curriculum | Episode 17: task=96 difficulty=advanced achieved=False tier_rate=0.32\n", + "15:16:04 | INFO | server.services.curriculum | Episode 18: task=97 difficulty=advanced achieved=False tier_rate=0.26\n", + "15:16:04 | INFO | server.services.curriculum | Task 95 GRADUATED (rate=1.00) — scheduling spaced repetition\n", + "15:16:04 | INFO | server.services.curriculum | Episode 19: task=95 difficulty=advanced achieved=True tier_rate=0.40\n", + "15:16:09 | INFO | grpo | [optuna-trial-0] step 10/10 (+227.5s)\n", + "15:16:09 | INFO | grpo | [optuna-trial-0] log step=10 {'loss': 0.1819, 'grad_norm': 0.255, 'learning_rate': 0.0, 'num_tokens': 33437.0, 'completions/mean_length': 95.1875, 'completions/min_length': 52.0, 'completions/max_length': 157.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 95.1875, 'completions/min_terminated_length': 52.0, 'completions/max_terminated_length': 157.0, 'rewards/env_reward/mean': 0.6533, 'rewards/env_reward/std': 0.2474, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9344, 'rewards/length_reward/std': 0.079, 'reward': 2.5877, 'reward_std': 0.2937, 'frac_reward_zero_std': 0.0, 'completion_length': 99.0, 'kl': 0.1798, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 5.0}\n", + "15:16:09 | INFO | grpo | [optuna-trial-0] log step=10 {'train_runtime': 1153.87, 'train_samples_per_second': 0.139, 'train_steps_per_second': 0.009, 'total_flos': 0.0, 'train_loss': 0.0673, 'epoch': 5.0}\n", + "15:16:09 | INFO | grpo | [optuna-trial-0] train_end | global_step=10 elapsed=1153.9s\n", + "15:16:10 | INFO | grpo | [trial 0] train() finished in 1157.6s\n", + "15:16:10 | INFO | grpo | [trial 0] running single-step eval on 12 tasks...\n", + "15:17:24 | INFO | grpo | [trial 0] eval finished in 74.1s\n", + "15:17:24 | INFO | grpo | [trial 0] DONE | env_reward_mean=0.4727 success=0.250 tier=advanced graduated=1\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "[I 2026-04-25 15:17:27,865] Trial 0 finished with value: 0.4726666666666667 and parameters: {'learning_rate': 4.328450221293881e-06, 'beta': 0.09507143064099162, 'temperature': 0.9195981825434215}. Best is trial 0 with value: 0.4726666666666667.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "15:17:27 | INFO | grpo | [trial 1] starting | cfg={'lr': 1.0401663679887314e-05, 'beta': 0.015601864044243652, 'temp': 0.7467983561008608}\n", + "15:17:27 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "15:17:27 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "15:17:27 | INFO | grpo | [trial 1] loading SFT policy (4-bit Qwen2.5-Coder-3B)...\n", + "==((====))== Unsloth 2026.4.8: Fast Qwen2 patching. Transformers: 4.57.6.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n", + "15:17:46 | INFO | grpo | [trial 1] policy loaded in 18.6s\n", + "15:17:46 | INFO | grpo | CurriculumTierSampler: num_samples=192, tier sizes={'warmup': 2, 'beginner': 2, 'intermediate': 2, 'advanced': 3, 'expert': 3}\n", + "15:17:46 | INFO | grpo | [trial 1] starting train() for 10 steps...\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 12 | Num Epochs = 5 | Total steps = 10\n", + "O^O/ \\_/ \\ Batch size per device = 2 | Gradient accumulation steps = 8\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (2 x 8 x 1) = 16\n", + " \"-____-\" Trainable parameters = 7,372,800 of 3,093,311,488 (0.24% trained)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "15:17:51 | INFO | grpo | [optuna-trial-1] train_begin | max_steps=10\n", + "Unsloth: Will smartly offload gradients to save VRAM!\n", + "15:19:25 | INFO | server.services.curriculum | Episode 1: task=33 difficulty=warmup achieved=True tier_rate=1.00\n", + "15:19:25 | INFO | server.services.curriculum | Episode 2: task=37 difficulty=warmup achieved=True tier_rate=1.00\n", + "15:19:35 | INFO | grpo | [optuna-trial-1] step 1/10 (+104.0s)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [10/10 15:26, Epoch 5/5]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining LossValidation Loss

" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "15:19:35 | INFO | grpo | [optuna-trial-1] log step=1 {'loss': -0.0156, 'grad_norm': 0.4741, 'learning_rate': 0.0, 'num_tokens': 3281.0, 'completions/mean_length': 39.0625, 'completions/min_length': 24.0, 'completions/max_length': 52.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 39.0625, 'completions/min_terminated_length': 24.0, 'completions/max_terminated_length': 52.0, 'rewards/env_reward/mean': 0.8125, 'rewards/env_reward/std': 0.4031, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 1.0, 'rewards/length_reward/std': 0.0, 'reward': 2.8125, 'reward_std': 0.4082, 'frac_reward_zero_std': 0.0, 'completion_length': 39.0625, 'kl': 0.1399, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 0.6667}\n", + "15:20:00 | INFO | server.services.curriculum | Loaded 25 beginner tasks total\n", + "15:20:00 | INFO | server.services.curriculum | PROMOTED from warmup to beginner (rate=1.00, FAST-TRACK)\n", + "15:20:00 | INFO | server.services.curriculum | Episode 3: task=37 difficulty=warmup achieved=True tier_rate=0.00\n", + "15:20:00 | INFO | server.services.curriculum | Episode 4: task=33 difficulty=warmup achieved=True tier_rate=1.00\n", + "15:20:03 | INFO | grpo | [optuna-trial-1] step 2/10 (+28.3s)\n", + "15:20:03 | INFO | grpo | [CurriculumPromotionCallback] tier promoted warmup -> beginner at step 2\n", + "15:20:03 | INFO | grpo | [optuna-trial-1] log step=2 {'loss': -0.1774, 'grad_norm': 0.353, 'learning_rate': 0.0, 'num_tokens': 6596.0, 'completions/mean_length': 41.1875, 'completions/min_length': 28.0, 'completions/max_length': 64.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 41.1875, 'completions/min_terminated_length': 28.0, 'completions/max_terminated_length': 64.0, 'rewards/env_reward/mean': 0.8125, 'rewards/env_reward/std': 0.4031, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 1.0, 'rewards/length_reward/std': 0.0, 'reward': 2.8125, 'reward_std': 0.4082, 'frac_reward_zero_std': 0.0, 'completion_length': 43.625, 'kl': 0.1407, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 1.0}\n", + "15:20:42 | INFO | server.services.curriculum | Episode 5: task=8 difficulty=beginner achieved=True tier_rate=1.00\n", + "15:20:42 | INFO | server.services.curriculum | Loaded 25 intermediate tasks total\n", + "15:20:42 | INFO | server.services.curriculum | PROMOTED from beginner to intermediate (rate=1.00, FAST-TRACK)\n", + "15:20:42 | INFO | server.services.curriculum | Episode 6: task=53 difficulty=beginner achieved=True tier_rate=0.00\n", + "15:20:45 | INFO | grpo | [optuna-trial-1] step 3/10 (+41.9s)\n", + "15:20:45 | INFO | grpo | [CurriculumPromotionCallback] tier promoted beginner -> intermediate at step 3\n", + "15:20:45 | INFO | grpo | [optuna-trial-1] log step=3 {'loss': 0.1491, 'grad_norm': 0.4402, 'learning_rate': 0.0, 'completion_length': 42.3125, 'kl': 0.1222, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 10133.0, 'completions/mean_length': 50.0625, 'completions/min_length': 32.0, 'completions/max_length': 71.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 50.0625, 'completions/min_terminated_length': 32.0, 'completions/max_terminated_length': 71.0, 'rewards/env_reward/mean': 0.9375, 'rewards/env_reward/std': 0.25, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 1.0, 'rewards/length_reward/std': 0.0, 'reward': 2.9375, 'reward_std': 0.1768, 'frac_reward_zero_std': 0.5, 'epoch': 1.6667}\n", + "15:20:48 | INFO | grpo | [optuna-trial-1] step 4/10 (+3.1s)\n", + "15:20:48 | INFO | grpo | [optuna-trial-1] log step=4 {'loss': -0.1253, 'grad_norm': 0.0936, 'learning_rate': 0.0, 'completion_length': 54.25, 'kl': 0.0941, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 2.0}\n", + "15:22:06 | INFO | server.services.curriculum | Episode 7: task=84 difficulty=intermediate achieved=True tier_rate=1.00\n", + "15:22:06 | INFO | server.services.curriculum | Episode 8: task=11 difficulty=intermediate achieved=True tier_rate=1.00\n", + "15:22:13 | INFO | grpo | [optuna-trial-1] step 5/10 (+85.2s)\n", + "15:22:13 | INFO | grpo | [optuna-trial-1] log step=5 {'loss': 0.0238, 'grad_norm': 0.2486, 'learning_rate': 0.0, 'num_tokens': 14299.0, 'completions/mean_length': 76.375, 'completions/min_length': 41.0, 'completions/max_length': 120.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 76.375, 'completions/min_terminated_length': 41.0, 'completions/max_terminated_length': 120.0, 'rewards/env_reward/mean': 0.75, 'rewards/env_reward/std': 0.4472, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 1.0, 'rewards/length_reward/std': 0.0, 'reward': 2.75, 'reward_std': 0.2673, 'frac_reward_zero_std': 0.5, 'completion_length': 76.375, 'kl': 0.2785, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 2.6667}\n", + "15:23:23 | INFO | server.services.curriculum | Loaded 25 advanced tasks total\n", + "15:23:23 | INFO | server.services.curriculum | PROMOTED from intermediate to advanced (rate=1.00, FAST-TRACK)\n", + "15:23:23 | INFO | server.services.curriculum | Episode 9: task=84 difficulty=intermediate achieved=True tier_rate=0.00\n", + "15:23:23 | INFO | server.services.curriculum | Episode 10: task=11 difficulty=intermediate achieved=True tier_rate=1.00\n", + "15:23:27 | INFO | grpo | [optuna-trial-1] step 6/10 (+73.4s)\n", + "15:23:27 | INFO | grpo | [CurriculumPromotionCallback] tier promoted intermediate -> advanced at step 6\n", + "15:23:27 | INFO | grpo | [optuna-trial-1] log step=6 {'loss': 0.4783, 'grad_norm': 0.742, 'learning_rate': 0.0, 'num_tokens': 18486.0, 'completions/mean_length': 77.6875, 'completions/min_length': 39.0, 'completions/max_length': 149.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 77.6875, 'completions/min_terminated_length': 39.0, 'completions/max_terminated_length': 149.0, 'rewards/env_reward/mean': 0.875, 'rewards/env_reward/std': 0.3416, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 1.0, 'rewards/length_reward/std': 0.0, 'reward': 2.875, 'reward_std': 0.3536, 'frac_reward_zero_std': 0.0, 'completion_length': 71.875, 'kl': 0.2911, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 3.0}\n", + "15:27:13 | INFO | server.services.curriculum | Episode 11: task=95 difficulty=advanced achieved=True tier_rate=1.00\n", + "15:27:13 | INFO | server.services.curriculum | Episode 12: task=96 difficulty=advanced achieved=False tier_rate=0.61\n", + "15:27:13 | INFO | server.services.curriculum | Episode 13: task=97 difficulty=advanced achieved=False tier_rate=0.42\n", + "15:27:17 | INFO | grpo | [optuna-trial-1] step 7/10 (+230.2s)\n", + "15:27:17 | INFO | grpo | [optuna-trial-1] log step=7 {'loss': -0.3887, 'grad_norm': 0.1856, 'learning_rate': 0.0, 'completion_length': 82.9375, 'kl': 0.2783, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 23490.0, 'completions/mean_length': 87.625, 'completions/min_length': 50.0, 'completions/max_length': 138.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 87.625, 'completions/min_terminated_length': 50.0, 'completions/max_terminated_length': 138.0, 'rewards/env_reward/mean': 0.571, 'rewards/env_reward/std': 0.2182, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9311, 'rewards/length_reward/std': 0.0807, 'reward': 2.5022, 'reward_std': 0.2092, 'frac_reward_zero_std': 0.0, 'epoch': 3.6667}\n", + "15:27:21 | INFO | grpo | [optuna-trial-1] step 8/10 (+4.1s)\n", + "15:27:21 | INFO | grpo | [optuna-trial-1] log step=8 {'loss': 0.4028, 'grad_norm': 0.2385, 'learning_rate': 0.0, 'completion_length': 92.875, 'kl': 0.1724, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 4.0}\n", + "15:31:04 | INFO | server.services.curriculum | Episode 14: task=97 difficulty=advanced achieved=False tier_rate=0.31\n", + "15:31:04 | INFO | server.services.curriculum | Episode 15: task=95 difficulty=advanced achieved=True tier_rate=0.47\n", + "15:31:04 | INFO | server.services.curriculum | Episode 16: task=96 difficulty=advanced achieved=False tier_rate=0.37\n", + "15:31:13 | INFO | grpo | [optuna-trial-1] step 9/10 (+231.8s)\n", + "15:31:13 | INFO | grpo | [optuna-trial-1] log step=9 {'loss': 0.0169, 'grad_norm': 0.1892, 'learning_rate': 0.0, 'num_tokens': 28516.0, 'completions/mean_length': 88.75, 'completions/min_length': 52.0, 'completions/max_length': 137.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 88.75, 'completions/min_terminated_length': 52.0, 'completions/max_terminated_length': 137.0, 'rewards/env_reward/mean': 0.6006, 'rewards/env_reward/std': 0.2428, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9484, 'rewards/length_reward/std': 0.0792, 'reward': 2.5491, 'reward_std': 0.2824, 'frac_reward_zero_std': 0.0, 'completion_length': 88.75, 'kl': 0.2088, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 4.6667}\n", + "15:34:57 | INFO | server.services.curriculum | Episode 17: task=96 difficulty=advanced achieved=False tier_rate=0.29\n", + "15:34:57 | INFO | server.services.curriculum | Task 95 GRADUATED (rate=1.00) — scheduling spaced repetition\n", + "15:34:57 | INFO | server.services.curriculum | Episode 18: task=95 difficulty=advanced achieved=True tier_rate=0.43\n", + "15:34:57 | INFO | server.services.curriculum | Episode 19: task=97 difficulty=advanced achieved=False tier_rate=0.35\n", + "15:35:01 | INFO | grpo | [optuna-trial-1] step 10/10 (+228.8s)\n", + "15:35:01 | INFO | grpo | [optuna-trial-1] log step=10 {'loss': -0.0104, 'grad_norm': 0.341, 'learning_rate': 0.0, 'num_tokens': 33471.0, 'completions/mean_length': 84.5625, 'completions/min_length': 46.0, 'completions/max_length': 127.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 84.5625, 'completions/min_terminated_length': 46.0, 'completions/max_terminated_length': 127.0, 'rewards/env_reward/mean': 0.6242, 'rewards/env_reward/std': 0.224, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9379, 'rewards/length_reward/std': 0.0828, 'reward': 2.5621, 'reward_std': 0.2517, 'frac_reward_zero_std': 0.0, 'completion_length': 85.0, 'kl': 0.1966, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 5.0}\n", + "15:35:01 | INFO | grpo | [optuna-trial-1] log step=10 {'train_runtime': 1030.7831, 'train_samples_per_second': 0.155, 'train_steps_per_second': 0.01, 'total_flos': 0.0, 'train_loss': 0.0353, 'epoch': 5.0}\n", + "15:35:01 | INFO | grpo | [optuna-trial-1] train_end | global_step=10 elapsed=1030.8s\n", + "15:35:03 | INFO | grpo | [trial 1] train() finished in 1036.9s\n", + "15:35:03 | INFO | grpo | [trial 1] running single-step eval on 12 tasks...\n", + "15:36:20 | INFO | grpo | [trial 1] eval finished in 76.5s\n", + "15:36:20 | INFO | grpo | [trial 1] DONE | env_reward_mean=0.4687 success=0.250 tier=advanced graduated=1\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "[I 2026-04-25 15:36:23,361] Trial 1 finished with value: 0.4686666666666667 and parameters: {'learning_rate': 1.0401663679887314e-05, 'beta': 0.015601864044243652, 'temperature': 0.7467983561008608}. Best is trial 0 with value: 0.4726666666666667.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "15:36:23 | INFO | grpo | [trial 2] starting | cfg={'lr': 1.255111517297383e-06, 'beta': 0.08661761457749352, 'temp': 0.8803345035229626}\n", + "15:36:23 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "15:36:23 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "15:36:23 | INFO | grpo | [trial 2] loading SFT policy (4-bit Qwen2.5-Coder-3B)...\n", + "==((====))== Unsloth 2026.4.8: Fast Qwen2 patching. Transformers: 4.57.6.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n", + "15:36:42 | INFO | grpo | [trial 2] policy loaded in 19.0s\n", + "15:36:42 | INFO | grpo | CurriculumTierSampler: num_samples=192, tier sizes={'warmup': 2, 'beginner': 2, 'intermediate': 2, 'advanced': 3, 'expert': 3}\n", + "15:36:42 | INFO | grpo | [trial 2] starting train() for 10 steps...\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 12 | Num Epochs = 5 | Total steps = 10\n", + "O^O/ \\_/ \\ Batch size per device = 2 | Gradient accumulation steps = 8\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (2 x 8 x 1) = 16\n", + " \"-____-\" Trainable parameters = 7,372,800 of 3,093,311,488 (0.24% trained)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "15:36:46 | INFO | grpo | [optuna-trial-2] train_begin | max_steps=10\n", + "Unsloth: Will smartly offload gradients to save VRAM!\n", + "15:37:10 | INFO | server.services.curriculum | Episode 1: task=33 difficulty=warmup achieved=True tier_rate=1.00\n", + "15:37:10 | INFO | server.services.curriculum | Episode 2: task=37 difficulty=warmup achieved=True tier_rate=1.00\n", + "15:37:19 | INFO | grpo | [optuna-trial-2] step 1/10 (+32.4s)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [10/10 16:00, Epoch 5/5]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining LossValidation Loss

" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "15:37:19 | INFO | grpo | [optuna-trial-2] log step=1 {'loss': -0.0615, 'grad_norm': 0.4482, 'learning_rate': 0.0, 'num_tokens': 3294.0, 'completions/mean_length': 39.875, 'completions/min_length': 24.0, 'completions/max_length': 54.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 39.875, 'completions/min_terminated_length': 24.0, 'completions/max_terminated_length': 54.0, 'rewards/env_reward/mean': 0.875, 'rewards/env_reward/std': 0.3416, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 1.0, 'rewards/length_reward/std': 0.0, 'reward': 2.875, 'reward_std': 0.3536, 'frac_reward_zero_std': 0.0, 'completion_length': 39.875, 'kl': 0.1186, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 0.6667}\n", + "15:37:45 | INFO | server.services.curriculum | Loaded 25 beginner tasks total\n", + "15:37:45 | INFO | server.services.curriculum | PROMOTED from warmup to beginner (rate=1.00, FAST-TRACK)\n", + "15:37:45 | INFO | server.services.curriculum | Episode 3: task=37 difficulty=warmup achieved=True tier_rate=0.00\n", + "15:37:45 | INFO | server.services.curriculum | Episode 4: task=33 difficulty=warmup achieved=True tier_rate=1.00\n", + "15:37:48 | INFO | grpo | [optuna-trial-2] step 2/10 (+29.2s)\n", + "15:37:48 | INFO | grpo | [CurriculumPromotionCallback] tier promoted warmup -> beginner at step 2\n", + "15:37:48 | INFO | grpo | [optuna-trial-2] log step=2 {'loss': -0.2559, 'grad_norm': 0.6131, 'learning_rate': 0.0, 'num_tokens': 6624.0, 'completions/mean_length': 42.125, 'completions/min_length': 25.0, 'completions/max_length': 61.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 42.125, 'completions/min_terminated_length': 25.0, 'completions/max_terminated_length': 61.0, 'rewards/env_reward/mean': 0.75, 'rewards/env_reward/std': 0.4472, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 1.0, 'rewards/length_reward/std': 0.0, 'reward': 2.75, 'reward_std': 0.4629, 'frac_reward_zero_std': 0.0, 'completion_length': 42.0, 'kl': 0.182, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 1.0}\n", + "15:38:32 | INFO | server.services.curriculum | Episode 5: task=53 difficulty=beginner achieved=True tier_rate=1.00\n", + "15:38:32 | INFO | server.services.curriculum | Loaded 25 intermediate tasks total\n", + "15:38:32 | INFO | server.services.curriculum | PROMOTED from beginner to intermediate (rate=1.00, FAST-TRACK)\n", + "15:38:32 | INFO | server.services.curriculum | Episode 6: task=8 difficulty=beginner achieved=True tier_rate=0.00\n", + "15:38:35 | INFO | grpo | [optuna-trial-2] step 3/10 (+47.3s)\n", + "15:38:35 | INFO | grpo | [CurriculumPromotionCallback] tier promoted beginner -> intermediate at step 3\n", + "15:38:35 | INFO | grpo | [optuna-trial-2] log step=3 {'loss': 0.2396, 'grad_norm': 0.3564, 'learning_rate': 0.0, 'completion_length': 48.1875, 'kl': 0.0953, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 10195.0, 'completions/mean_length': 52.1875, 'completions/min_length': 43.0, 'completions/max_length': 69.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 52.1875, 'completions/min_terminated_length': 43.0, 'completions/max_terminated_length': 69.0, 'rewards/env_reward/mean': 0.9375, 'rewards/env_reward/std': 0.25, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 1.0, 'rewards/length_reward/std': 0.0, 'reward': 2.9375, 'reward_std': 0.1768, 'frac_reward_zero_std': 0.5, 'epoch': 1.6667}\n", + "15:38:38 | INFO | grpo | [optuna-trial-2] step 4/10 (+3.3s)\n", + "15:38:38 | INFO | grpo | [optuna-trial-2] log step=4 {'loss': -0.2103, 'grad_norm': 0.1872, 'learning_rate': 0.0, 'completion_length': 50.25, 'kl': 0.117, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 2.0}\n", + "15:40:06 | INFO | server.services.curriculum | Episode 7: task=11 difficulty=intermediate achieved=True tier_rate=1.00\n", + "15:40:06 | INFO | server.services.curriculum | Episode 8: task=84 difficulty=intermediate achieved=True tier_rate=1.00\n", + "15:40:12 | INFO | grpo | [optuna-trial-2] step 5/10 (+93.9s)\n", + "15:40:12 | INFO | grpo | [optuna-trial-2] log step=5 {'loss': 0.0727, 'grad_norm': 0.2555, 'learning_rate': 0.0, 'num_tokens': 14229.0, 'completions/mean_length': 68.125, 'completions/min_length': 41.0, 'completions/max_length': 102.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 68.125, 'completions/min_terminated_length': 41.0, 'completions/max_terminated_length': 102.0, 'rewards/env_reward/mean': 0.875, 'rewards/env_reward/std': 0.3416, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 1.0, 'rewards/length_reward/std': 0.0, 'reward': 2.875, 'reward_std': 0.3536, 'frac_reward_zero_std': 0.0, 'completion_length': 68.125, 'kl': 0.2631, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 2.6667}\n", + "15:42:00 | INFO | server.services.curriculum | Loaded 25 advanced tasks total\n", + "15:42:00 | INFO | server.services.curriculum | PROMOTED from intermediate to advanced (rate=1.00, FAST-TRACK)\n", + "15:42:00 | INFO | server.services.curriculum | Episode 9: task=84 difficulty=intermediate achieved=True tier_rate=0.00\n", + "15:42:00 | INFO | server.services.curriculum | Episode 10: task=11 difficulty=intermediate achieved=True tier_rate=1.00\n", + "15:42:04 | INFO | grpo | [optuna-trial-2] step 6/10 (+111.3s)\n", + "15:42:04 | INFO | grpo | [CurriculumPromotionCallback] tier promoted intermediate -> advanced at step 6\n", + "15:42:04 | INFO | grpo | [optuna-trial-2] log step=6 {'loss': 0.289, 'grad_norm': 0.7695, 'learning_rate': 0.0, 'num_tokens': 18160.0, 'completions/mean_length': 61.6875, 'completions/min_length': 36.0, 'completions/max_length': 81.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 61.6875, 'completions/min_terminated_length': 36.0, 'completions/max_terminated_length': 81.0, 'rewards/env_reward/mean': 0.6875, 'rewards/env_reward/std': 0.4787, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9984, 'rewards/length_reward/std': 0.0062, 'reward': 2.6859, 'reward_std': 0.4924, 'frac_reward_zero_std': 0.0, 'completion_length': 57.875, 'kl': 0.3904, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 3.0}\n", + "15:45:46 | INFO | server.services.curriculum | Episode 11: task=95 difficulty=advanced achieved=True tier_rate=1.00\n", + "15:45:46 | INFO | server.services.curriculum | Episode 12: task=96 difficulty=advanced achieved=False tier_rate=0.61\n", + "15:45:46 | INFO | server.services.curriculum | Episode 13: task=97 difficulty=advanced achieved=False tier_rate=0.42\n", + "15:45:50 | INFO | grpo | [optuna-trial-2] step 7/10 (+225.9s)\n", + "15:45:50 | INFO | grpo | [optuna-trial-2] log step=7 {'loss': -0.1, 'grad_norm': 0.3597, 'learning_rate': 0.0, 'completion_length': 73.25, 'kl': 0.2593, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 23010.0, 'completions/mean_length': 77.625, 'completions/min_length': 41.0, 'completions/max_length': 116.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 77.625, 'completions/min_terminated_length': 41.0, 'completions/max_terminated_length': 116.0, 'rewards/env_reward/mean': 0.6021, 'rewards/env_reward/std': 0.2387, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9379, 'rewards/length_reward/std': 0.0828, 'reward': 2.54, 'reward_std': 0.2429, 'frac_reward_zero_std': 0.0, 'epoch': 3.6667}\n", + "15:45:54 | INFO | grpo | [optuna-trial-2] step 8/10 (+4.0s)\n", + "15:45:54 | INFO | grpo | [optuna-trial-2] log step=8 {'loss': 0.2722, 'grad_norm': 0.2342, 'learning_rate': 0.0, 'completion_length': 74.25, 'kl': 0.2081, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 4.0}\n", + "15:49:30 | INFO | server.services.curriculum | Episode 14: task=96 difficulty=advanced achieved=False tier_rate=0.31\n", + "15:49:30 | INFO | server.services.curriculum | Episode 15: task=95 difficulty=advanced achieved=True tier_rate=0.47\n", + "15:49:30 | INFO | server.services.curriculum | Episode 16: task=97 difficulty=advanced achieved=False tier_rate=0.37\n", + "15:49:38 | INFO | grpo | [optuna-trial-2] step 9/10 (+224.5s)\n", + "15:49:38 | INFO | grpo | [optuna-trial-2] log step=9 {'loss': 0.0158, 'grad_norm': 0.2369, 'learning_rate': 0.0, 'num_tokens': 27900.0, 'completions/mean_length': 80.125, 'completions/min_length': 36.0, 'completions/max_length': 139.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 80.125, 'completions/min_terminated_length': 36.0, 'completions/max_terminated_length': 139.0, 'rewards/env_reward/mean': 0.5644, 'rewards/env_reward/std': 0.2448, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9235, 'rewards/length_reward/std': 0.0927, 'reward': 2.4879, 'reward_std': 0.2535, 'frac_reward_zero_std': 0.0, 'completion_length': 80.125, 'kl': 0.2495, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 4.6667}\n", + "15:53:15 | INFO | server.services.curriculum | Task 95 GRADUATED (rate=1.00) — scheduling spaced repetition\n", + "15:53:15 | INFO | server.services.curriculum | Episode 17: task=95 difficulty=advanced achieved=True tier_rate=0.50\n", + "15:53:15 | INFO | server.services.curriculum | Episode 18: task=97 difficulty=advanced achieved=False tier_rate=0.40\n", + "15:53:15 | INFO | server.services.curriculum | Episode 19: task=96 difficulty=advanced achieved=False tier_rate=0.33\n", + "15:53:19 | INFO | grpo | [optuna-trial-2] step 10/10 (+221.0s)\n", + "15:53:19 | INFO | grpo | [optuna-trial-2] log step=10 {'loss': -0.3654, 'grad_norm': 0.265, 'learning_rate': 0.0, 'num_tokens': 32841.0, 'completions/mean_length': 83.3125, 'completions/min_length': 32.0, 'completions/max_length': 159.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 83.3125, 'completions/min_terminated_length': 32.0, 'completions/max_terminated_length': 159.0, 'rewards/env_reward/mean': 0.5631, 'rewards/env_reward/std': 0.3121, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9087, 'rewards/length_reward/std': 0.0968, 'reward': 2.4718, 'reward_std': 0.3662, 'frac_reward_zero_std': 0.0, 'completion_length': 65.75, 'kl': 0.3361, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 5.0}\n", + "15:53:19 | INFO | grpo | [optuna-trial-2] log step=10 {'train_runtime': 992.7264, 'train_samples_per_second': 0.161, 'train_steps_per_second': 0.01, 'total_flos': 0.0, 'train_loss': -0.0104, 'epoch': 5.0}\n", + "15:53:19 | INFO | grpo | [optuna-trial-2] train_end | global_step=10 elapsed=992.7s\n", + "15:53:20 | INFO | grpo | [trial 2] train() finished in 998.5s\n", + "15:53:20 | INFO | grpo | [trial 2] running single-step eval on 12 tasks...\n", + "15:54:35 | INFO | grpo | [trial 2] eval finished in 75.0s\n", + "15:54:35 | INFO | grpo | [trial 2] DONE | env_reward_mean=0.4687 success=0.250 tier=advanced graduated=1\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "[I 2026-04-25 15:54:38,863] Trial 2 pruned. \n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "15:54:38 | INFO | grpo | [trial 3] starting | cfg={'lr': 1.5958573588141284e-05, 'beta': 0.0020584494295802446, 'temp': 0.9909729556485982}\n", + "15:54:38 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "15:54:38 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "15:54:38 | INFO | grpo | [trial 3] loading SFT policy (4-bit Qwen2.5-Coder-3B)...\n", + "==((====))== Unsloth 2026.4.8: Fast Qwen2 patching. Transformers: 4.57.6.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n", + "15:54:57 | INFO | grpo | [trial 3] policy loaded in 18.2s\n", + "15:54:57 | INFO | grpo | CurriculumTierSampler: num_samples=192, tier sizes={'warmup': 2, 'beginner': 2, 'intermediate': 2, 'advanced': 3, 'expert': 3}\n", + "15:54:57 | INFO | grpo | [trial 3] starting train() for 10 steps...\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 12 | Num Epochs = 5 | Total steps = 10\n", + "O^O/ \\_/ \\ Batch size per device = 2 | Gradient accumulation steps = 8\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (2 x 8 x 1) = 16\n", + " \"-____-\" Trainable parameters = 7,372,800 of 3,093,311,488 (0.24% trained)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "15:55:01 | INFO | grpo | [optuna-trial-3] train_begin | max_steps=10\n", + "Unsloth: Will smartly offload gradients to save VRAM!\n", + "15:55:26 | INFO | server.services.curriculum | Episode 1: task=33 difficulty=warmup achieved=True tier_rate=1.00\n", + "15:55:26 | INFO | server.services.curriculum | Episode 2: task=37 difficulty=warmup achieved=True tier_rate=1.00\n", + "15:55:35 | INFO | grpo | [optuna-trial-3] step 1/10 (+34.0s)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [10/10 15:06, Epoch 5/5]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining LossValidation Loss

" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "15:55:35 | INFO | grpo | [optuna-trial-3] log step=1 {'loss': -0.062, 'grad_norm': 0.3466, 'learning_rate': 0.0, 'num_tokens': 3349.0, 'completions/mean_length': 43.3125, 'completions/min_length': 24.0, 'completions/max_length': 61.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 43.3125, 'completions/min_terminated_length': 24.0, 'completions/max_terminated_length': 61.0, 'rewards/env_reward/mean': 0.8125, 'rewards/env_reward/std': 0.4031, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 1.0, 'rewards/length_reward/std': 0.0, 'reward': 2.8125, 'reward_std': 0.4082, 'frac_reward_zero_std': 0.0, 'completion_length': 43.3125, 'kl': 0.1133, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 0.6667}\n", + "15:56:04 | INFO | server.services.curriculum | Loaded 25 beginner tasks total\n", + "15:56:04 | INFO | server.services.curriculum | PROMOTED from warmup to beginner (rate=1.00, FAST-TRACK)\n", + "15:56:04 | INFO | server.services.curriculum | Episode 3: task=37 difficulty=warmup achieved=True tier_rate=0.00\n", + "15:56:04 | INFO | server.services.curriculum | Episode 4: task=33 difficulty=warmup achieved=True tier_rate=1.00\n", + "15:56:07 | INFO | grpo | [optuna-trial-3] step 2/10 (+32.6s)\n", + "15:56:07 | INFO | grpo | [CurriculumPromotionCallback] tier promoted warmup -> beginner at step 2\n", + "15:56:07 | INFO | grpo | [optuna-trial-3] log step=2 {'loss': -0.0776, 'grad_norm': 0.4329, 'learning_rate': 0.0, 'num_tokens': 6727.0, 'completions/mean_length': 45.125, 'completions/min_length': 25.0, 'completions/max_length': 70.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 45.125, 'completions/min_terminated_length': 25.0, 'completions/max_terminated_length': 70.0, 'rewards/env_reward/mean': 0.75, 'rewards/env_reward/std': 0.4472, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 1.0, 'rewards/length_reward/std': 0.0, 'reward': 2.75, 'reward_std': 0.4629, 'frac_reward_zero_std': 0.0, 'completion_length': 49.75, 'kl': 0.1218, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 1.0}\n", + "15:56:38 | INFO | server.services.curriculum | Episode 5: task=53 difficulty=beginner achieved=True tier_rate=1.00\n", + "15:56:38 | INFO | server.services.curriculum | Loaded 25 intermediate tasks total\n", + "15:56:38 | INFO | server.services.curriculum | PROMOTED from beginner to intermediate (rate=1.00, FAST-TRACK)\n", + "15:56:38 | INFO | server.services.curriculum | Episode 6: task=8 difficulty=beginner achieved=True tier_rate=0.00\n", + "15:56:41 | INFO | grpo | [optuna-trial-3] step 3/10 (+34.4s)\n", + "15:56:41 | INFO | grpo | [CurriculumPromotionCallback] tier promoted beginner -> intermediate at step 3\n", + "15:56:41 | INFO | grpo | [optuna-trial-3] log step=3 {'loss': -0.0391, 'grad_norm': 0.2092, 'learning_rate': 0.0, 'completion_length': 50.875, 'kl': 0.0939, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 10356.0, 'completions/mean_length': 55.8125, 'completions/min_length': 35.0, 'completions/max_length': 80.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 55.8125, 'completions/min_terminated_length': 35.0, 'completions/max_terminated_length': 80.0, 'rewards/env_reward/mean': 1.0, 'rewards/env_reward/std': 0.0, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 1.0, 'rewards/length_reward/std': 0.0, 'reward': 3.0, 'reward_std': 0.0, 'frac_reward_zero_std': 1.0, 'epoch': 1.6667}\n", + "15:56:45 | INFO | grpo | [optuna-trial-3] step 4/10 (+3.0s)\n", + "15:56:45 | INFO | grpo | [optuna-trial-3] log step=4 {'loss': 0.0002, 'grad_norm': 0.0008, 'learning_rate': 0.0, 'completion_length': 50.375, 'kl': 0.0983, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 2.0}\n", + "15:58:11 | INFO | server.services.curriculum | Episode 7: task=11 difficulty=intermediate achieved=True tier_rate=1.00\n", + "15:58:11 | INFO | server.services.curriculum | Episode 8: task=84 difficulty=intermediate achieved=True tier_rate=1.00\n", + "15:58:18 | INFO | grpo | [optuna-trial-3] step 5/10 (+93.1s)\n", + "15:58:18 | INFO | grpo | [optuna-trial-3] log step=5 {'loss': 0.0104, 'grad_norm': 0.247, 'learning_rate': 0.0, 'num_tokens': 14590.0, 'completions/mean_length': 80.625, 'completions/min_length': 49.0, 'completions/max_length': 114.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 80.625, 'completions/min_terminated_length': 49.0, 'completions/max_terminated_length': 114.0, 'rewards/env_reward/mean': 0.75, 'rewards/env_reward/std': 0.4472, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9989, 'rewards/length_reward/std': 0.0045, 'reward': 2.7489, 'reward_std': 0.465, 'frac_reward_zero_std': 0.0, 'completion_length': 80.625, 'kl': 0.1865, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 2.6667}\n", + "15:59:38 | INFO | server.services.curriculum | Loaded 25 advanced tasks total\n", + "15:59:38 | INFO | server.services.curriculum | PROMOTED from intermediate to advanced (rate=1.00, FAST-TRACK)\n", + "15:59:38 | INFO | server.services.curriculum | Episode 9: task=84 difficulty=intermediate achieved=True tier_rate=0.00\n", + "15:59:38 | INFO | server.services.curriculum | Episode 10: task=11 difficulty=intermediate achieved=True tier_rate=1.00\n", + "15:59:41 | INFO | grpo | [optuna-trial-3] step 6/10 (+83.4s)\n", + "15:59:41 | INFO | grpo | [CurriculumPromotionCallback] tier promoted intermediate -> advanced at step 6\n", + "15:59:41 | INFO | grpo | [optuna-trial-3] log step=6 {'loss': 0.0046, 'grad_norm': 0.3215, 'learning_rate': 0.0, 'num_tokens': 18686.0, 'completions/mean_length': 72.0, 'completions/min_length': 50.0, 'completions/max_length': 121.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 72.0, 'completions/min_terminated_length': 50.0, 'completions/max_terminated_length': 121.0, 'rewards/env_reward/mean': 0.875, 'rewards/env_reward/std': 0.3416, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9961, 'rewards/length_reward/std': 0.0156, 'reward': 2.8711, 'reward_std': 0.3523, 'frac_reward_zero_std': 0.0, 'completion_length': 72.625, 'kl': 0.2362, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 3.0}\n", + "16:03:16 | INFO | server.services.curriculum | Episode 11: task=97 difficulty=advanced achieved=False tier_rate=0.46\n", + "16:03:16 | INFO | server.services.curriculum | Episode 12: task=96 difficulty=advanced achieved=False tier_rate=0.28\n", + "16:03:16 | INFO | server.services.curriculum | Episode 13: task=95 difficulty=advanced achieved=True tier_rate=0.51\n", + "16:03:20 | INFO | grpo | [optuna-trial-3] step 7/10 (+218.4s)\n", + "16:03:20 | INFO | grpo | [optuna-trial-3] log step=7 {'loss': 0.0912, 'grad_norm': 0.2479, 'learning_rate': 0.0, 'completion_length': 82.3125, 'kl': 0.1815, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 23688.0, 'completions/mean_length': 87.5, 'completions/min_length': 32.0, 'completions/max_length': 132.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 87.5, 'completions/min_terminated_length': 32.0, 'completions/max_terminated_length': 132.0, 'rewards/env_reward/mean': 0.601, 'rewards/env_reward/std': 0.2852, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9089, 'rewards/length_reward/std': 0.0832, 'reward': 2.51, 'reward_std': 0.3004, 'frac_reward_zero_std': 0.0, 'epoch': 3.6667}\n", + "16:03:24 | INFO | grpo | [optuna-trial-3] step 8/10 (+4.0s)\n", + "16:03:24 | INFO | grpo | [optuna-trial-3] log step=8 {'loss': 0.0237, 'grad_norm': 0.1846, 'learning_rate': 0.0, 'completion_length': 81.75, 'kl': 0.2095, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 4.0}\n", + "16:06:54 | INFO | server.services.curriculum | Episode 14: task=97 difficulty=advanced achieved=False tier_rate=0.37\n", + "16:06:54 | INFO | server.services.curriculum | Episode 15: task=95 difficulty=advanced achieved=True tier_rate=0.52\n", + "16:06:54 | INFO | server.services.curriculum | Episode 16: task=96 difficulty=advanced achieved=False tier_rate=0.41\n", + "16:07:03 | INFO | grpo | [optuna-trial-3] step 9/10 (+219.1s)\n", + "16:07:03 | INFO | grpo | [optuna-trial-3] log step=9 {'loss': 0.0859, 'grad_norm': 0.1679, 'learning_rate': 0.0, 'num_tokens': 28764.0, 'completions/mean_length': 91.75, 'completions/min_length': 32.0, 'completions/max_length': 141.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 91.75, 'completions/min_terminated_length': 32.0, 'completions/max_terminated_length': 141.0, 'rewards/env_reward/mean': 0.6329, 'rewards/env_reward/std': 0.268, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.918, 'rewards/length_reward/std': 0.0851, 'reward': 2.5509, 'reward_std': 0.3024, 'frac_reward_zero_std': 0.0, 'completion_length': 91.75, 'kl': 0.1948, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 4.6667}\n", + "16:10:37 | INFO | server.services.curriculum | Episode 17: task=96 difficulty=advanced achieved=False tier_rate=0.32\n", + "16:10:37 | INFO | server.services.curriculum | Episode 18: task=97 difficulty=advanced achieved=False tier_rate=0.26\n", + "16:10:37 | INFO | server.services.curriculum | Task 95 GRADUATED (rate=1.00) — scheduling spaced repetition\n", + "16:10:37 | INFO | server.services.curriculum | Episode 19: task=95 difficulty=advanced achieved=True tier_rate=0.40\n", + "16:10:41 | INFO | grpo | [optuna-trial-3] step 10/10 (+218.2s)\n", + "16:10:41 | INFO | grpo | [optuna-trial-3] log step=10 {'loss': -0.0137, 'grad_norm': 0.2202, 'learning_rate': 0.0, 'num_tokens': 33936.0, 'completions/mean_length': 98.125, 'completions/min_length': 57.0, 'completions/max_length': 143.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 98.125, 'completions/min_terminated_length': 57.0, 'completions/max_terminated_length': 143.0, 'rewards/env_reward/mean': 0.7233, 'rewards/env_reward/std': 0.2071, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9179, 'rewards/length_reward/std': 0.0851, 'reward': 2.6412, 'reward_std': 0.2571, 'frac_reward_zero_std': 0.0, 'completion_length': 99.375, 'kl': 0.1591, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 5.0}\n", + "16:10:41 | INFO | grpo | [optuna-trial-3] log step=10 {'train_runtime': 940.2587, 'train_samples_per_second': 0.17, 'train_steps_per_second': 0.011, 'total_flos': 0.0, 'train_loss': 0.0024, 'epoch': 5.0}\n", + "16:10:41 | INFO | grpo | [optuna-trial-3] train_end | global_step=10 elapsed=940.3s\n", + "16:10:42 | INFO | grpo | [trial 3] train() finished in 945.2s\n", + "16:10:42 | INFO | grpo | [trial 3] running single-step eval on 12 tasks...\n", + "16:12:01 | INFO | grpo | [trial 3] eval finished in 78.8s\n", + "16:12:01 | INFO | grpo | [trial 3] DONE | env_reward_mean=0.5520 success=0.333 tier=advanced graduated=1\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "[I 2026-04-25 16:12:04,437] Trial 3 finished with value: 0.552 and parameters: {'learning_rate': 1.5958573588141284e-05, 'beta': 0.0020584494295802446, 'temperature': 0.9909729556485982}. Best is trial 3 with value: 0.552.\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Best trial env_reward_mean = 0.5520\n", + "Best params: {'learning_rate': 1.5958573588141284e-05, 'beta': 0.0020584494295802446, 'temperature': 0.9909729556485982}\n" + ] + } + ], + "source": [ + "# Reclaim VRAM before starting trials. If the user ran the final-run cell\n", + "# first (e.g. because optuna_best.json didn't exist on a prior session),\n", + "# `final_model` / `final_trainer` / `_probe_model` may still be resident\n", + "# on the GPU. Each trial loads a fresh 4-bit Qwen (~6 GB) via\n", + "# load_policy, and on a 14.5 GB T4 the second model won't fit alongside\n", + "# leftovers, so BitsAndBytes falls back to CPU offload and errors out\n", + "# (\"Some modules are dispatched on the CPU or the disk\").\n", + "for _name in (\"final_trainer\", \"final_model\", \"final_tok\", \"_probe_model\", \"_probe_tok\", \"_baseline_model\", \"_baseline_tok\"):\n", + " if _name in globals():\n", + " try:\n", + " _obj = globals().pop(_name)\n", + " del _obj\n", + " except Exception:\n", + " pass\n", + "gc.collect()\n", + "try:\n", + " torch.cuda.empty_cache()\n", + "except Exception:\n", + " pass\n", + "\n", + "STUDY_DB = OUT_DIR / \"optuna.db\"\n", + "STUDY_NAME = \"aws-rl-grpo-search\"\n", + "\n", + "study = optuna.create_study(\n", + " direction=\"maximize\",\n", + " sampler=optuna.samplers.TPESampler(seed=TRAIN.seed),\n", + " pruner=optuna.pruners.MedianPruner(n_startup_trials=2, n_warmup_steps=10),\n", + " study_name=STUDY_NAME,\n", + " storage=f\"sqlite:///{STUDY_DB}\",\n", + " load_if_exists=True,\n", + ")\n", + "\n", + "completed = sum(1 for t in study.trials if t.state.name == \"COMPLETE\")\n", + "remaining = max(0, PIPE.n_trials - completed)\n", + "print(f\"Optuna study '{STUDY_NAME}': {completed} completed, {remaining} remaining.\")\n", + "\n", + "if remaining > 0:\n", + " study.optimize(trial_objective, n_trials=remaining)\n", + "\n", + "best_cfg = replace(TRAIN, **{\n", + " k: v for k, v in study.best_params.items() if k in TrainingConfig.__dataclass_fields__\n", + "})\n", + "(OUT_DIR / \"optuna_best.json\").write_text(json.dumps({\n", + " \"best_value\": study.best_value,\n", + " \"best_params\": study.best_params,\n", + " \"resolved_config\": asdict(best_cfg),\n", + "}, indent=2))\n", + "\n", + "print(f\"Best trial env_reward_mean = {study.best_value:.4f}\")\n", + "print(f\"Best params: {study.best_params}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "id": "278540e2", + "metadata": { + "id": "278540e2", + "outputId": "a99f73e2-0907-4a46-86fc-ccf61a361cb8", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/tmp/ipykernel_1159/2728918386.py:17: ExperimentalWarning: optuna.visualization.matplotlib._optimization_history.plot_optimization_history is experimental (supported from v2.2.0). The interface can change in the future.\n", + " ax = fn(study)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "16:12:05 | INFO | grpo | Saved /content/out/graphs/00_optuna_history.png\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/tmp/ipykernel_1159/2728918386.py:17: ExperimentalWarning: optuna.visualization.matplotlib._parallel_coordinate.plot_parallel_coordinate is experimental (supported from v2.2.0). The interface can change in the future.\n", + " ax = fn(study)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "16:12:05 | INFO | grpo | Saved /content/out/graphs/00_optuna_parallel.png\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "/tmp/ipykernel_1159/2728918386.py:17: ExperimentalWarning: optuna.visualization.matplotlib._param_importances.plot_param_importances is experimental (supported from v2.2.0). The interface can change in the future.\n", + " ax = fn(study)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "16:12:06 | INFO | grpo | Saved /content/out/graphs/00_optuna_importances.png\n" + ] + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "from optuna.visualization.matplotlib import (\n", + " plot_optimization_history,\n", + " plot_parallel_coordinate,\n", + " plot_param_importances,\n", + ")\n", + "\n", + "GRAPHS_DIR = OUT_DIR / \"graphs\"\n", + "GRAPHS_DIR.mkdir(parents=True, exist_ok=True)\n", + "\n", + "for name, fn in [\n", + " (\"history\", plot_optimization_history),\n", + " (\"parallel\", plot_parallel_coordinate),\n", + " (\"importances\", plot_param_importances),\n", + "]:\n", + " try:\n", + " ax = fn(study)\n", + " fig = ax.figure\n", + " out_png = GRAPHS_DIR / f\"00_optuna_{name}.png\"\n", + " fig.savefig(out_png, dpi=150, bbox_inches=\"tight\")\n", + " plt.close(fig)\n", + " log.info(\"Saved %s\", out_png)\n", + " except Exception as e:\n", + " log.warning(\"Optuna %s plot skipped: %s\", name, e)\n" + ] + }, + { + "cell_type": "markdown", + "id": "c8528094", + "metadata": { + "id": "c8528094" + }, + "source": [ + "## 14 · Final GRPO run — best hparams, full data, checkpointed\n", + "\n", + "Uses the Optuna winner on the full 1-epoch training set with periodic checkpoints (`save_steps=25`, `save_total_limit=3`). `CheckpointManager.latest()` auto-detects a prior checkpoint so re-running this cell after a disconnect resumes safely.\n", + "\n", + "Wandb run `final-grpo` gets a stable run id so resumed training stitches into the same panel instead of creating a fresh chart." + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "id": "74e46eed", + "metadata": { + "id": "74e46eed", + "outputId": "d0bb5912-5962-42d9-eba6-64bf73663c86", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "16:12:28 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "16:12:28 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "16:12:28 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "16:12:28 | INFO | server.services.curriculum | Loaded 25 beginner tasks total\n", + "16:12:28 | INFO | server.services.curriculum | Loaded 25 intermediate tasks total\n", + "16:12:28 | INFO | server.services.curriculum | Loaded 25 advanced tasks total\n", + "16:12:28 | INFO | server.services.curriculum | Loaded 9 supplementary expert tasks from drift.yaml\n", + "16:12:28 | INFO | server.services.curriculum | Loaded 33 expert tasks total\n", + "16:12:28 | INFO | grpo | Full curriculum dataset: 133 rows across tiers ['advanced', 'beginner', 'expert', 'intermediate', 'warmup']\n", + "==((====))== Unsloth 2026.4.8: Fast Qwen2 patching. Transformers: 4.57.6.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n", + "16:12:48 | INFO | grpo | CurriculumTierSampler: num_samples=672, tier sizes={'warmup': 25, 'beginner': 25, 'intermediate': 25, 'advanced': 25, 'expert': 33}\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "==((====))== Unsloth - 2x faster free finetuning | Num GPUs used = 1\n", + " \\\\ /| Num examples = 133 | Num Epochs = 6 | Total steps = 35\n", + "O^O/ \\_/ \\ Batch size per device = 2 | Gradient accumulation steps = 8\n", + "\\ / Data Parallel GPUs = 1 | Total batch size (2 x 8 x 1) = 16\n", + " \"-____-\" Trainable parameters = 7,372,800 of 3,093,311,488 (0.24% trained)\n" + ] + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "16:12:52 | INFO | grpo | [final-grpo] train_begin | max_steps=35\n", + "Unsloth: Will smartly offload gradients to save VRAM!\n", + "16:13:18 | INFO | server.services.curriculum | Episode 1: task=37 difficulty=warmup achieved=True tier_rate=1.00\n", + "16:13:18 | INFO | server.services.curriculum | Episode 2: task=33 difficulty=warmup achieved=False tier_rate=0.46\n", + "16:13:18 | INFO | server.services.curriculum | Episode 3: task=30 difficulty=warmup achieved=True tier_rate=0.67\n", + "16:13:18 | INFO | server.services.curriculum | Episode 4: task=40 difficulty=warmup achieved=True tier_rate=0.77\n", + "16:13:18 | INFO | server.services.curriculum | Episode 5: task=39 difficulty=warmup achieved=False tier_rate=0.56\n", + "16:13:18 | INFO | server.services.curriculum | Episode 6: task=27 difficulty=warmup achieved=False tier_rate=0.43\n", + "16:13:18 | INFO | server.services.curriculum | Episode 7: task=5 difficulty=warmup achieved=True tier_rate=0.55\n", + "16:13:18 | INFO | server.services.curriculum | Loaded 25 beginner tasks total\n", + "16:13:18 | INFO | server.services.curriculum | PROMOTED from warmup to beginner (rate=0.65)\n", + "16:13:18 | INFO | server.services.curriculum | Episode 8: task=31 difficulty=warmup achieved=True tier_rate=0.00\n", + "16:13:18 | INFO | server.services.curriculum | Episode 9: task=36 difficulty=warmup achieved=True tier_rate=1.00\n", + "16:13:18 | INFO | server.services.curriculum | Episode 10: task=42 difficulty=warmup achieved=True tier_rate=1.00\n", + "16:13:18 | INFO | server.services.curriculum | Loaded 25 intermediate tasks total\n", + "16:13:18 | INFO | server.services.curriculum | PROMOTED from beginner to intermediate (rate=1.00, FAST-TRACK)\n", + "16:13:18 | INFO | server.services.curriculum | Episode 11: task=32 difficulty=warmup achieved=True tier_rate=0.00\n", + "16:13:18 | INFO | server.services.curriculum | Episode 12: task=38 difficulty=warmup achieved=True tier_rate=1.00\n", + "16:13:18 | INFO | server.services.curriculum | Episode 13: task=1 difficulty=warmup achieved=True tier_rate=1.00\n", + "16:13:18 | INFO | server.services.curriculum | Loaded 25 advanced tasks total\n", + "16:13:18 | INFO | server.services.curriculum | PROMOTED from intermediate to advanced (rate=1.00, FAST-TRACK)\n", + "16:13:18 | INFO | server.services.curriculum | Episode 14: task=35 difficulty=warmup achieved=True tier_rate=0.00\n", + "16:13:19 | INFO | server.services.curriculum | Episode 15: task=43 difficulty=warmup achieved=True tier_rate=1.00\n", + "16:13:19 | INFO | server.services.curriculum | Episode 16: task=34 difficulty=warmup achieved=True tier_rate=1.00\n", + "16:13:25 | INFO | grpo | [final-grpo] step 1/35 (+33.1s)\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "text/html": [ + "\n", + "

\n", + " \n", + " \n", + " [35/35 1:53:41, Epoch 5/6]\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
StepTraining Lossrewardreward_stdcompletions / mean_lengthcompletions / min_lengthcompletions / max_lengthcompletions / clipped_ratiocompletions / mean_terminated_lengthcompletions / min_terminated_lengthcompletions / max_terminated_lengthklrewards / env_reward / meanrewards / env_reward / stdrewards / format_reward / meanrewards / format_reward / stdrewards / length_reward / meanrewards / length_reward / std
10.0313002.8125000.25877537.62500021.00000069.0000000.00000037.62500021.00000069.0000000.1600420.8125000.4031131.0000000.0000001.0000000.000000
20.0012002.9375000.17677744.81250017.00000075.0000000.00000044.81250017.00000075.0000000.1413180.9375000.2500001.0000000.0000001.0000000.000000
3-0.0523002.2188240.336094109.68750062.000000242.0000000.000000109.68750062.000000242.0000000.1769990.3119050.2752331.0000000.0000000.9069200.159451
40.0373002.2170830.35751280.81250040.000000144.0000000.00000080.81250040.000000144.0000000.1380930.2764580.3197581.0000000.0000000.9406250.116300
50.0571002.2306640.41972267.25000016.000000128.0000000.00000067.25000016.000000128.0000000.1941090.2813330.3708411.0000000.0000000.9493300.106090
60.3575002.3061590.49207589.37500031.000000165.0000000.00000089.37500031.000000165.0000000.1111300.3797080.4108701.0000000.0000000.9264510.142032
70.1421002.1511210.47180497.12500047.000000235.0000000.00000097.12500047.000000235.0000000.1514010.2552500.3762251.0000000.0000000.8958710.149889
8-0.1872002.1247320.50236790.18750030.000000191.0000000.00000090.18750030.000000191.0000000.1285900.2475000.3856681.0000000.0000000.8772320.184127
90.3138002.1915100.33731295.37500028.000000304.0000000.00000095.37500028.000000304.0000000.1146440.2579170.2712221.0000000.0000000.9335940.140376
100.0866002.1910760.36833890.62500043.000000164.0000000.00000090.62500043.000000164.0000000.2181850.2552500.3452821.0000000.0000000.9358260.107090
110.0820002.1781920.65114481.50000041.000000194.0000000.00000081.50000041.000000194.0000000.1610270.3662500.4546630.8750000.3415650.9369420.140284
12-0.0593000.124533
130.1211002.1702780.32731685.56250032.000000182.0000000.00000085.56250032.000000182.0000000.1531660.2295420.3329801.0000000.0000000.9407370.086682
140.0968002.2796710.47815790.50000043.000000146.0000000.00000090.50000043.000000146.0000000.1397730.3661670.4131761.0000000.0000000.9135040.121488
15-0.0866002.1602430.43954994.68750035.000000190.0000000.00000094.68750035.000000190.0000000.1344890.2556670.3670891.0000000.0000000.9045760.151924
160.2731002.0806170.31745685.25000041.000000173.0000000.00000085.25000041.000000173.0000000.0956470.1604170.2647971.0000000.0000000.9202010.136706
170.1019002.1540890.35427987.93750031.000000167.0000000.00000087.93750031.000000167.0000000.1146410.2371250.3824961.0000000.0000000.9169640.125563
180.2207000.133991
19-0.1852002.2382870.47710097.93750044.000000264.0000000.00000097.93750044.000000264.0000000.1185450.3361670.4116621.0000000.0000000.9021210.145469
200.0928002.2039350.32560878.00000017.000000193.0000000.00000078.00000017.000000193.0000000.1806820.2499170.2784801.0000000.0000000.9540180.101084
210.4222002.0309640.21812889.81250038.000000153.0000000.00000089.81250038.000000153.0000000.1115270.1265000.1236761.0000000.0000000.9044640.136333
22-0.0373002.2814300.39356093.93750028.000000291.0000000.00000093.93750028.000000291.0000000.1368680.3159170.3494661.0000000.0000000.9655130.071431
230.1686002.0889060.333982105.18750041.000000303.0000000.000000105.18750041.000000303.0000000.1558640.1881250.2463691.0000000.0000000.9007810.161908
24-0.0629000.154525
250.0519002.3053930.46643283.31250036.000000252.0000000.00000083.31250036.000000252.0000000.1323870.3732500.4133291.0000000.0000000.9321430.140355
260.0847002.1138970.425687128.18750042.000000768.0000000.06250085.53334042.000000154.0000000.1609880.2754170.3725921.0000000.0000000.8384800.198759
270.1100002.2733760.45480576.56250025.000000145.0000000.00000076.56250025.000000145.0000000.1915110.3355420.4122241.0000000.0000000.9378350.095236
28-0.0540002.0701190.43883995.25000029.000000170.0000000.00000095.25000029.000000170.0000000.1559940.2245830.3103730.9375000.2500000.9080360.120603
290.1324002.1380220.30271981.93750024.000000168.0000000.00000081.93750024.000000168.0000000.1394550.2173750.2526871.0000000.0000000.9206470.142823
300.6377002.1818480.34681173.18750038.000000151.0000000.00000073.18750038.000000151.0000000.1715760.2316250.3265691.0000000.0000000.9502230.086972
31-0.1123002.3518360.44253388.81250047.000000147.0000000.00000088.81250047.000000147.0000000.1626240.3949170.4188181.0000000.0000000.9569200.104350
320.1634002.1982890.48925883.93750029.000000182.0000000.00000083.93750029.000000182.0000000.1422020.2958330.3892471.0000000.0000000.9024550.138221
330.1873002.2624780.567792101.81250032.000000194.0000000.000000101.81250032.000000194.0000000.1585270.3893750.4482481.0000000.0000000.8731030.162099
34-0.2093002.1822460.27092380.43750026.000000129.0000000.00000080.43750026.000000129.0000000.1341070.2363750.2317561.0000000.0000000.9458710.073594
35-0.0615002.1241980.25483383.87500030.000000249.0000000.00000083.87500030.000000249.0000000.1259730.1921670.1867601.0000000.0000000.9320310.122966

" + ] + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "16:13:25 | INFO | grpo | [final-grpo] log step=1 {'loss': 0.0313, 'grad_norm': 0.5735, 'learning_rate': 0.0, 'num_tokens': 3235.0, 'completions/mean_length': 37.625, 'completions/min_length': 21.0, 'completions/max_length': 69.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 37.625, 'completions/min_terminated_length': 21.0, 'completions/max_terminated_length': 69.0, 'rewards/env_reward/mean': 0.8125, 'rewards/env_reward/std': 0.4031, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 1.0, 'rewards/length_reward/std': 0.0, 'reward': 2.8125, 'reward_std': 0.2588, 'frac_reward_zero_std': 0.5, 'completion_length': 37.625, 'kl': 0.16, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 0.1905}\n", + "16:13:51 | INFO | server.services.curriculum | Loaded 9 supplementary expert tasks from drift.yaml\n", + "16:13:51 | INFO | server.services.curriculum | Loaded 33 expert tasks total\n", + "16:13:51 | INFO | server.services.curriculum | PROMOTED from advanced to expert (rate=1.00, FAST-TRACK)\n", + "16:13:51 | INFO | server.services.curriculum | Episode 17: task=44 difficulty=warmup achieved=True tier_rate=0.00\n", + "16:13:51 | INFO | server.services.curriculum | Episode 18: task=29 difficulty=warmup achieved=True tier_rate=1.00\n", + "16:13:51 | INFO | server.services.curriculum | Episode 19: task=34 difficulty=warmup achieved=True tier_rate=1.00\n", + "16:13:51 | INFO | server.services.curriculum | Episode 20: task=38 difficulty=warmup achieved=True tier_rate=1.00\n", + "16:13:51 | INFO | server.services.curriculum | Episode 21: task=35 difficulty=warmup achieved=True tier_rate=1.00\n", + "16:13:51 | INFO | server.services.curriculum | Episode 22: task=3 difficulty=warmup achieved=True tier_rate=1.00\n", + "16:13:51 | INFO | server.services.curriculum | Episode 23: task=37 difficulty=warmup achieved=True tier_rate=1.00\n", + "16:13:51 | INFO | server.services.curriculum | Episode 24: task=43 difficulty=warmup achieved=True tier_rate=1.00\n", + "16:13:51 | INFO | server.services.curriculum | Episode 25: task=36 difficulty=warmup achieved=True tier_rate=1.00\n", + "16:13:51 | INFO | server.services.curriculum | Episode 26: task=0 difficulty=warmup achieved=True tier_rate=1.00\n", + "16:13:51 | INFO | server.services.curriculum | Episode 27: task=4 difficulty=warmup achieved=True tier_rate=1.00\n", + "16:13:51 | INFO | server.services.curriculum | Episode 28: task=28 difficulty=warmup achieved=True tier_rate=1.00\n", + "16:13:51 | INFO | server.services.curriculum | Episode 29: task=41 difficulty=warmup achieved=True tier_rate=1.00\n", + "16:13:51 | INFO | server.services.curriculum | Episode 30: task=1 difficulty=warmup achieved=True tier_rate=1.00\n", + "16:13:51 | INFO | server.services.curriculum | Episode 31: task=33 difficulty=warmup achieved=False tier_rate=0.83\n", + "16:13:51 | INFO | server.services.curriculum | Episode 32: task=5 difficulty=warmup achieved=True tier_rate=0.86\n", + "16:13:57 | INFO | grpo | [final-grpo] step 2/35 (+31.9s)\n", + "16:13:57 | INFO | grpo | [CurriculumPromotionCallback] tier promoted advanced -> expert at step 2\n", + "16:13:57 | INFO | grpo | [final-grpo] log step=2 {'loss': 0.0012, 'grad_norm': 0.2202, 'learning_rate': 0.0, 'num_tokens': 6578.0, 'completions/mean_length': 44.8125, 'completions/min_length': 17.0, 'completions/max_length': 75.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 44.8125, 'completions/min_terminated_length': 17.0, 'completions/max_terminated_length': 75.0, 'rewards/env_reward/mean': 0.9375, 'rewards/env_reward/std': 0.25, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 1.0, 'rewards/length_reward/std': 0.0, 'reward': 2.9375, 'reward_std': 0.1768, 'frac_reward_zero_std': 0.5, 'completion_length': 44.8125, 'kl': 0.1413, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 0.381}\n", + "16:17:48 | INFO | server.services.curriculum | Episode 33: task=100 difficulty=advanced achieved=False tier_rate=0.72\n", + "16:17:48 | INFO | server.services.curriculum | Episode 34: task=103 difficulty=advanced achieved=False tier_rate=0.61\n", + "16:17:48 | INFO | server.services.curriculum | Episode 35: task=97 difficulty=advanced achieved=False tier_rate=0.51\n", + "16:17:48 | INFO | server.services.curriculum | Episode 36: task=90 difficulty=advanced achieved=False tier_rate=0.43\n", + "16:17:48 | INFO | server.services.curriculum | Episode 37: task=95 difficulty=advanced achieved=False tier_rate=0.36\n", + "16:17:48 | INFO | server.services.curriculum | Episode 38: task=91 difficulty=advanced achieved=False tier_rate=0.31\n", + "16:17:48 | INFO | server.services.curriculum | Episode 39: task=101 difficulty=advanced achieved=False tier_rate=0.26\n", + "16:17:48 | INFO | server.services.curriculum | Episode 40: task=104 difficulty=advanced achieved=False tier_rate=0.22\n", + "16:17:48 | INFO | server.services.curriculum | Episode 41: task=105 difficulty=advanced achieved=False tier_rate=0.19\n", + "16:17:48 | INFO | server.services.curriculum | Episode 42: task=17 difficulty=advanced achieved=False tier_rate=0.16\n", + "16:17:48 | INFO | server.services.curriculum | Episode 43: task=107 difficulty=advanced achieved=False tier_rate=0.13\n", + "16:17:48 | INFO | server.services.curriculum | Episode 44: task=108 difficulty=advanced achieved=False tier_rate=0.11\n", + "16:17:48 | INFO | server.services.curriculum | Episode 45: task=92 difficulty=advanced achieved=False tier_rate=0.10\n", + "16:17:48 | INFO | server.services.curriculum | Episode 46: task=106 difficulty=advanced achieved=False tier_rate=0.08\n", + "16:17:58 | INFO | grpo | [final-grpo] step 3/35 (+241.3s)\n", + "16:17:58 | INFO | grpo | [final-grpo] log step=3 {'loss': -0.0523, 'grad_norm': 0.2405, 'learning_rate': 0.0, 'num_tokens': 11951.0, 'completions/mean_length': 109.6875, 'completions/min_length': 62.0, 'completions/max_length': 242.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 109.6875, 'completions/min_terminated_length': 62.0, 'completions/max_terminated_length': 242.0, 'rewards/env_reward/mean': 0.3119, 'rewards/env_reward/std': 0.2752, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9069, 'rewards/length_reward/std': 0.1595, 'reward': 2.2188, 'reward_std': 0.3361, 'frac_reward_zero_std': 0.0, 'completion_length': 109.6875, 'kl': 0.177, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 0.5714}\n", + "16:21:17 | INFO | server.services.curriculum | Episode 47: task=111 difficulty=expert achieved=False tier_rate=0.07\n", + "16:21:17 | INFO | server.services.curriculum | Episode 48: task=119 difficulty=expert achieved=True tier_rate=0.21\n", + "16:21:17 | INFO | server.services.curriculum | Episode 49: task=129 difficulty=expert achieved=False tier_rate=0.18\n", + "16:21:17 | INFO | server.services.curriculum | Episode 50: task=121 difficulty=expert achieved=False tier_rate=0.15\n", + "16:21:17 | INFO | server.services.curriculum | Episode 51: task=23 difficulty=expert achieved=False tier_rate=0.13\n", + "16:21:17 | INFO | server.services.curriculum | Episode 52: task=139 difficulty=expert achieved=False tier_rate=0.11\n", + "16:21:17 | INFO | server.services.curriculum | Episode 53: task=124 difficulty=expert achieved=False tier_rate=0.09\n", + "16:21:17 | INFO | server.services.curriculum | Episode 54: task=22 difficulty=expert achieved=False tier_rate=0.08\n", + "16:21:17 | INFO | server.services.curriculum | Episode 55: task=114 difficulty=expert achieved=False tier_rate=0.07\n", + "16:21:17 | INFO | server.services.curriculum | Episode 56: task=134 difficulty=expert achieved=False tier_rate=0.06\n", + "16:21:17 | INFO | server.services.curriculum | Episode 57: task=133 difficulty=expert achieved=False tier_rate=0.05\n", + "16:21:17 | INFO | server.services.curriculum | Episode 58: task=21 difficulty=expert achieved=True tier_rate=0.19\n", + "16:21:17 | INFO | server.services.curriculum | Episode 59: task=123 difficulty=expert achieved=False tier_rate=0.16\n", + "16:21:18 | INFO | server.services.curriculum | Episode 60: task=120 difficulty=expert achieved=False tier_rate=0.14\n", + "16:21:18 | INFO | server.services.curriculum | Episode 61: task=116 difficulty=expert achieved=False tier_rate=0.12\n", + "16:21:18 | INFO | server.services.curriculum | Episode 62: task=122 difficulty=expert achieved=False tier_rate=0.10\n", + "16:21:27 | INFO | grpo | [final-grpo] step 4/35 (+208.5s)\n", + "16:21:27 | INFO | grpo | [final-grpo] log step=4 {'loss': 0.0373, 'grad_norm': 0.248, 'learning_rate': 0.0, 'num_tokens': 17137.0, 'completions/mean_length': 80.8125, 'completions/min_length': 40.0, 'completions/max_length': 144.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 80.8125, 'completions/min_terminated_length': 40.0, 'completions/max_terminated_length': 144.0, 'rewards/env_reward/mean': 0.2765, 'rewards/env_reward/std': 0.3198, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9406, 'rewards/length_reward/std': 0.1163, 'reward': 2.2171, 'reward_std': 0.3575, 'frac_reward_zero_std': 0.0, 'completion_length': 80.8125, 'kl': 0.1381, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 0.7619}\n", + "16:24:24 | INFO | server.services.curriculum | Episode 63: task=135 difficulty=expert achieved=False tier_rate=0.08\n", + "16:24:24 | INFO | server.services.curriculum | Episode 64: task=24 difficulty=expert achieved=False tier_rate=0.07\n", + "16:24:24 | INFO | server.services.curriculum | Episode 65: task=128 difficulty=expert achieved=False tier_rate=0.06\n", + "16:24:24 | INFO | server.services.curriculum | Episode 66: task=18 difficulty=expert achieved=False tier_rate=0.05\n", + "16:24:24 | INFO | server.services.curriculum | Episode 67: task=123 difficulty=expert achieved=False tier_rate=0.04\n", + "16:24:24 | INFO | server.services.curriculum | Episode 68: task=25 difficulty=expert achieved=False tier_rate=0.04\n", + "16:24:24 | INFO | server.services.curriculum | Episode 69: task=127 difficulty=expert achieved=True tier_rate=0.18\n", + "16:24:24 | INFO | server.services.curriculum | Episode 70: task=120 difficulty=expert achieved=False tier_rate=0.15\n", + "16:24:24 | INFO | server.services.curriculum | Episode 71: task=131 difficulty=expert achieved=False tier_rate=0.13\n", + "16:24:24 | INFO | server.services.curriculum | Episode 72: task=23 difficulty=expert achieved=False tier_rate=0.11\n", + "16:24:24 | INFO | server.services.curriculum | Episode 73: task=126 difficulty=expert achieved=False tier_rate=0.09\n", + "16:24:24 | INFO | server.services.curriculum | Episode 74: task=119 difficulty=expert achieved=True tier_rate=0.23\n", + "16:24:24 | INFO | server.services.curriculum | Episode 75: task=110 difficulty=expert achieved=True tier_rate=0.35\n", + "16:24:24 | INFO | server.services.curriculum | Episode 76: task=134 difficulty=expert achieved=False tier_rate=0.29\n", + "16:24:24 | INFO | server.services.curriculum | Episode 77: task=22 difficulty=expert achieved=False tier_rate=0.25\n", + "16:24:24 | INFO | server.services.curriculum | Episode 78: task=118 difficulty=expert achieved=False tier_rate=0.21\n", + "16:24:33 | INFO | grpo | [final-grpo] step 5/35 (+186.4s)\n", + "16:24:33 | INFO | grpo | [final-grpo] log step=5 {'loss': 0.0571, 'grad_norm': 0.2858, 'learning_rate': 0.0, 'num_tokens': 21998.0, 'completions/mean_length': 67.25, 'completions/min_length': 16.0, 'completions/max_length': 128.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 67.25, 'completions/min_terminated_length': 16.0, 'completions/max_terminated_length': 128.0, 'rewards/env_reward/mean': 0.2813, 'rewards/env_reward/std': 0.3708, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9493, 'rewards/length_reward/std': 0.1061, 'reward': 2.2307, 'reward_std': 0.4197, 'frac_reward_zero_std': 0.0, 'completion_length': 67.25, 'kl': 0.1941, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 0.9524}\n", + "16:27:39 | INFO | server.services.curriculum | Episode 79: task=125 difficulty=expert achieved=False tier_rate=0.18\n", + "16:27:39 | INFO | server.services.curriculum | Episode 80: task=113 difficulty=expert achieved=False tier_rate=0.15\n", + "16:27:39 | INFO | server.services.curriculum | Episode 81: task=120 difficulty=expert achieved=False tier_rate=0.13\n", + "16:27:39 | INFO | server.services.curriculum | Task 119 GRADUATED (rate=1.00) — scheduling spaced repetition\n", + "16:27:39 | INFO | server.services.curriculum | Episode 82: task=119 difficulty=expert achieved=True tier_rate=0.26\n", + "16:27:39 | INFO | server.services.curriculum | Episode 83: task=109 difficulty=expert achieved=True tier_rate=0.37\n", + "16:27:39 | INFO | server.services.curriculum | Episode 84: task=115 difficulty=expert achieved=False tier_rate=0.32\n", + "16:27:39 | INFO | server.services.curriculum | Episode 85: task=20 difficulty=expert achieved=True tier_rate=0.42\n", + "16:27:39 | INFO | server.services.curriculum | Episode 86: task=114 difficulty=expert achieved=False tier_rate=0.36\n", + "16:27:39 | INFO | server.services.curriculum | Episode 87: task=23 difficulty=expert achieved=True tier_rate=0.45\n", + "16:27:39 | INFO | server.services.curriculum | Episode 88: task=19 difficulty=expert achieved=False tier_rate=0.38\n", + "16:27:39 | INFO | server.services.curriculum | Episode 89: task=117 difficulty=expert achieved=False tier_rate=0.33\n", + "16:27:39 | INFO | server.services.curriculum | Episode 90: task=134 difficulty=expert achieved=False tier_rate=0.28\n", + "16:27:39 | INFO | server.services.curriculum | Episode 91: task=129 difficulty=expert achieved=False tier_rate=0.24\n", + "16:27:39 | INFO | server.services.curriculum | Episode 92: task=133 difficulty=expert achieved=False tier_rate=0.20\n", + "16:27:39 | INFO | server.services.curriculum | Episode 93: task=135 difficulty=expert achieved=False tier_rate=0.17\n", + "16:27:39 | INFO | server.services.curriculum | Episode 94: task=127 difficulty=expert achieved=False tier_rate=0.15\n", + "16:27:42 | INFO | grpo | [final-grpo] step 6/35 (+188.7s)\n", + "16:27:42 | INFO | grpo | [final-grpo] log step=6 {'loss': 0.3575, 'grad_norm': 0.4507, 'learning_rate': 0.0, 'num_tokens': 27280.0, 'completions/mean_length': 89.375, 'completions/min_length': 31.0, 'completions/max_length': 165.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 89.375, 'completions/min_terminated_length': 31.0, 'completions/max_terminated_length': 165.0, 'rewards/env_reward/mean': 0.3797, 'rewards/env_reward/std': 0.4109, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9265, 'rewards/length_reward/std': 0.142, 'reward': 2.3062, 'reward_std': 0.4921, 'frac_reward_zero_std': 0.0, 'completion_length': 109.25, 'kl': 0.1111, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 1.0}\n", + "16:31:20 | INFO | server.services.curriculum | Episode 95: task=131 difficulty=expert achieved=False tier_rate=0.12\n", + "16:31:20 | INFO | server.services.curriculum | Episode 96: task=117 difficulty=expert achieved=False tier_rate=0.10\n", + "16:31:20 | INFO | server.services.curriculum | Episode 97: task=114 difficulty=expert achieved=False tier_rate=0.09\n", + "16:31:20 | INFO | server.services.curriculum | Episode 98: task=110 difficulty=expert achieved=True tier_rate=0.23\n", + "16:31:20 | INFO | server.services.curriculum | Episode 99: task=18 difficulty=expert achieved=False tier_rate=0.19\n", + "16:31:20 | INFO | server.services.curriculum | Episode 100: task=115 difficulty=expert achieved=False tier_rate=0.16\n", + "16:31:20 | INFO | server.services.curriculum | Episode 101: task=124 difficulty=expert achieved=False tier_rate=0.14\n", + "16:31:20 | INFO | server.services.curriculum | Episode 102: task=20 difficulty=expert achieved=True tier_rate=0.27\n", + "16:31:20 | INFO | server.services.curriculum | Episode 103: task=118 difficulty=expert achieved=False tier_rate=0.23\n", + "16:31:20 | INFO | server.services.curriculum | Episode 104: task=113 difficulty=expert achieved=False tier_rate=0.19\n", + "16:31:20 | INFO | server.services.curriculum | Episode 105: task=121 difficulty=expert achieved=True tier_rate=0.31\n", + "16:31:20 | INFO | server.services.curriculum | Episode 106: task=23 difficulty=expert achieved=False tier_rate=0.27\n", + "16:31:20 | INFO | server.services.curriculum | Episode 107: task=24 difficulty=expert achieved=False tier_rate=0.23\n", + "16:31:20 | INFO | server.services.curriculum | Episode 108: task=139 difficulty=expert achieved=False tier_rate=0.19\n", + "16:31:20 | INFO | server.services.curriculum | Episode 109: task=134 difficulty=expert achieved=False tier_rate=0.16\n", + "16:31:22 | INFO | grpo | [final-grpo] step 7/35 (+220.6s)\n", + "16:31:22 | INFO | grpo | [final-grpo] log step=7 {'loss': 0.1421, 'grad_norm': 0.2291, 'learning_rate': 0.0, 'completion_length': 87.5625, 'kl': 0.1514, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 32677.0, 'completions/mean_length': 97.125, 'completions/min_length': 47.0, 'completions/max_length': 235.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 97.125, 'completions/min_terminated_length': 47.0, 'completions/max_terminated_length': 235.0, 'rewards/env_reward/mean': 0.2553, 'rewards/env_reward/std': 0.3762, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.8959, 'rewards/length_reward/std': 0.1499, 'reward': 2.1511, 'reward_std': 0.4718, 'frac_reward_zero_std': 0.0, 'epoch': 1.1905}\n", + "16:35:24 | INFO | server.services.curriculum | Episode 110: task=126 difficulty=expert achieved=False tier_rate=0.14\n", + "16:35:24 | INFO | server.services.curriculum | Episode 111: task=129 difficulty=expert achieved=False tier_rate=0.12\n", + "16:35:24 | INFO | server.services.curriculum | Episode 112: task=139 difficulty=expert achieved=True tier_rate=0.25\n", + "16:35:24 | INFO | server.services.curriculum | Episode 113: task=113 difficulty=expert achieved=False tier_rate=0.21\n", + "16:35:24 | INFO | server.services.curriculum | Episode 114: task=124 difficulty=expert achieved=False tier_rate=0.18\n", + "16:35:24 | INFO | server.services.curriculum | Episode 115: task=131 difficulty=expert achieved=False tier_rate=0.15\n", + "16:35:24 | INFO | server.services.curriculum | Episode 116: task=19 difficulty=expert achieved=False tier_rate=0.13\n", + "16:35:24 | INFO | server.services.curriculum | Episode 117: task=125 difficulty=expert achieved=False tier_rate=0.11\n", + "16:35:24 | INFO | server.services.curriculum | Episode 118: task=22 difficulty=expert achieved=False tier_rate=0.09\n", + "16:35:24 | INFO | server.services.curriculum | Episode 119: task=115 difficulty=expert achieved=False tier_rate=0.08\n", + "16:35:24 | INFO | server.services.curriculum | Episode 120: task=23 difficulty=expert achieved=False tier_rate=0.07\n", + "16:35:24 | INFO | server.services.curriculum | Episode 121: task=116 difficulty=expert achieved=False tier_rate=0.06\n", + "16:35:24 | INFO | server.services.curriculum | Episode 122: task=111 difficulty=expert achieved=True tier_rate=0.20\n", + "16:35:24 | INFO | server.services.curriculum | Task 20 GRADUATED (rate=1.00) — scheduling spaced repetition\n", + "16:35:24 | INFO | server.services.curriculum | Episode 123: task=20 difficulty=expert achieved=True tier_rate=0.32\n", + "16:35:26 | INFO | grpo | [final-grpo] step 8/35 (+244.0s)\n", + "16:35:26 | INFO | grpo | [final-grpo] log step=8 {'loss': -0.1872, 'grad_norm': 0.3587, 'learning_rate': 0.0, 'completion_length': 80.6875, 'kl': 0.1286, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 38011.0, 'completions/mean_length': 90.1875, 'completions/min_length': 30.0, 'completions/max_length': 191.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 90.1875, 'completions/min_terminated_length': 30.0, 'completions/max_terminated_length': 191.0, 'rewards/env_reward/mean': 0.2475, 'rewards/env_reward/std': 0.3857, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.8772, 'rewards/length_reward/std': 0.1841, 'reward': 2.1247, 'reward_std': 0.5024, 'frac_reward_zero_std': 0.0, 'epoch': 1.381}\n", + "16:39:55 | INFO | server.services.curriculum | Episode 124: task=125 difficulty=expert achieved=False tier_rate=0.27\n", + "16:39:55 | INFO | server.services.curriculum | Episode 125: task=128 difficulty=expert achieved=False tier_rate=0.23\n", + "16:39:55 | INFO | server.services.curriculum | Episode 126: task=119 difficulty=expert achieved=True tier_rate=0.35\n", + "16:39:55 | INFO | server.services.curriculum | Episode 127: task=24 difficulty=expert achieved=False tier_rate=0.29\n", + "16:39:55 | INFO | server.services.curriculum | Episode 128: task=109 difficulty=expert achieved=False tier_rate=0.25\n", + "16:39:55 | INFO | server.services.curriculum | Episode 129: task=123 difficulty=expert achieved=False tier_rate=0.21\n", + "16:39:55 | INFO | server.services.curriculum | Episode 130: task=134 difficulty=expert achieved=False tier_rate=0.18\n", + "16:39:55 | INFO | server.services.curriculum | Episode 131: task=122 difficulty=expert achieved=False tier_rate=0.15\n", + "16:39:55 | INFO | server.services.curriculum | Episode 132: task=135 difficulty=expert achieved=False tier_rate=0.13\n", + "16:39:55 | INFO | server.services.curriculum | Episode 133: task=110 difficulty=expert achieved=False tier_rate=0.11\n", + "16:39:55 | INFO | server.services.curriculum | Episode 134: task=115 difficulty=expert achieved=False tier_rate=0.09\n", + "16:39:55 | INFO | server.services.curriculum | Episode 135: task=111 difficulty=expert achieved=False tier_rate=0.08\n", + "16:39:55 | INFO | server.services.curriculum | Episode 136: task=126 difficulty=expert achieved=False tier_rate=0.07\n", + "16:39:55 | INFO | server.services.curriculum | Episode 137: task=23 difficulty=expert achieved=False tier_rate=0.06\n", + "16:39:55 | INFO | server.services.curriculum | Episode 138: task=133 difficulty=expert achieved=False tier_rate=0.05\n", + "16:39:58 | INFO | grpo | [final-grpo] step 9/35 (+271.4s)\n", + "16:39:58 | INFO | grpo | [final-grpo] log step=9 {'loss': 0.3138, 'grad_norm': 0.3186, 'learning_rate': 0.0, 'completion_length': 102.5, 'kl': 0.1146, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 43444.0, 'completions/mean_length': 95.375, 'completions/min_length': 28.0, 'completions/max_length': 304.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 95.375, 'completions/min_terminated_length': 28.0, 'completions/max_terminated_length': 304.0, 'rewards/env_reward/mean': 0.2579, 'rewards/env_reward/std': 0.2712, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9336, 'rewards/length_reward/std': 0.1404, 'reward': 2.1915, 'reward_std': 0.3373, 'frac_reward_zero_std': 0.0, 'epoch': 1.5714}\n", + "16:43:37 | INFO | server.services.curriculum | Episode 139: task=114 difficulty=expert achieved=False tier_rate=0.04\n", + "16:43:37 | INFO | server.services.curriculum | Episode 140: task=111 difficulty=expert achieved=False tier_rate=0.04\n", + "16:43:37 | INFO | server.services.curriculum | Episode 141: task=115 difficulty=expert achieved=False tier_rate=0.03\n", + "16:43:37 | INFO | server.services.curriculum | Episode 142: task=18 difficulty=expert achieved=False tier_rate=0.03\n", + "16:43:37 | INFO | server.services.curriculum | Episode 143: task=129 difficulty=expert achieved=False tier_rate=0.02\n", + "16:43:37 | INFO | server.services.curriculum | Episode 144: task=24 difficulty=expert achieved=False tier_rate=0.02\n", + "16:43:37 | INFO | server.services.curriculum | Episode 145: task=19 difficulty=expert achieved=False tier_rate=0.02\n", + "16:43:37 | INFO | server.services.curriculum | Episode 146: task=113 difficulty=expert achieved=False tier_rate=0.01\n", + "16:43:37 | INFO | server.services.curriculum | Episode 147: task=127 difficulty=expert achieved=False tier_rate=0.01\n", + "16:43:37 | INFO | server.services.curriculum | Episode 148: task=124 difficulty=expert achieved=False tier_rate=0.01\n", + "16:43:37 | INFO | server.services.curriculum | Episode 149: task=20 difficulty=expert achieved=True tier_rate=0.16\n", + "16:43:37 | INFO | server.services.curriculum | Episode 150: task=116 difficulty=expert achieved=False tier_rate=0.13\n", + "16:43:37 | INFO | server.services.curriculum | Episode 151: task=135 difficulty=expert achieved=False tier_rate=0.11\n", + "16:43:37 | INFO | server.services.curriculum | Episode 152: task=117 difficulty=expert achieved=False tier_rate=0.10\n", + "16:43:37 | INFO | server.services.curriculum | Episode 153: task=118 difficulty=expert achieved=False tier_rate=0.08\n", + "16:43:37 | INFO | server.services.curriculum | Episode 154: task=119 difficulty=expert achieved=True tier_rate=0.22\n", + "16:43:39 | INFO | grpo | [final-grpo] step 10/35 (+221.3s)\n", + "16:43:39 | INFO | grpo | [final-grpo] log step=10 {'loss': 0.0866, 'grad_norm': 0.2433, 'learning_rate': 0.0, 'completion_length': 90.8125, 'kl': 0.2182, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 48768.0, 'completions/mean_length': 90.625, 'completions/min_length': 43.0, 'completions/max_length': 164.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 90.625, 'completions/min_terminated_length': 43.0, 'completions/max_terminated_length': 164.0, 'rewards/env_reward/mean': 0.2552, 'rewards/env_reward/std': 0.3453, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9358, 'rewards/length_reward/std': 0.1071, 'reward': 2.1911, 'reward_std': 0.3683, 'frac_reward_zero_std': 0.0, 'epoch': 1.7619}\n", + "16:47:05 | INFO | server.services.curriculum | Task 110 GRADUATED (rate=0.73) — scheduling spaced repetition\n", + "16:47:05 | INFO | server.services.curriculum | Episode 155: task=110 difficulty=expert achieved=True tier_rate=0.34\n", + "16:47:05 | INFO | server.services.curriculum | Episode 156: task=125 difficulty=expert achieved=False tier_rate=0.29\n", + "16:47:05 | INFO | server.services.curriculum | Episode 157: task=121 difficulty=expert achieved=False tier_rate=0.24\n", + "16:47:05 | INFO | server.services.curriculum | Episode 158: task=129 difficulty=expert achieved=False tier_rate=0.21\n", + "16:47:05 | INFO | server.services.curriculum | Episode 159: task=18 difficulty=expert achieved=False tier_rate=0.18\n", + "16:47:05 | INFO | server.services.curriculum | Episode 160: task=126 difficulty=expert achieved=False tier_rate=0.15\n", + "16:47:05 | INFO | server.services.curriculum | Episode 161: task=20 difficulty=expert achieved=True tier_rate=0.28\n", + "16:47:05 | INFO | server.services.curriculum | Episode 162: task=113 difficulty=expert achieved=False tier_rate=0.24\n", + "16:47:05 | INFO | server.services.curriculum | Episode 163: task=127 difficulty=expert achieved=True tier_rate=0.35\n", + "16:47:05 | INFO | server.services.curriculum | Episode 164: task=19 difficulty=expert achieved=False tier_rate=0.30\n", + "16:47:05 | INFO | server.services.curriculum | Episode 165: task=114 difficulty=expert achieved=False tier_rate=0.25\n", + "16:47:05 | INFO | server.services.curriculum | Episode 166: task=109 difficulty=expert achieved=False tier_rate=0.22\n", + "16:47:05 | INFO | server.services.curriculum | Episode 167: task=131 difficulty=expert achieved=False tier_rate=0.18\n", + "16:47:05 | INFO | server.services.curriculum | Episode 168: task=133 difficulty=expert achieved=False tier_rate=0.16\n", + "16:47:05 | INFO | server.services.curriculum | Episode 169: task=119 difficulty=expert achieved=True tier_rate=0.28\n", + "16:47:05 | INFO | server.services.curriculum | Episode 170: task=139 difficulty=expert achieved=True tier_rate=0.39\n", + "16:47:08 | INFO | grpo | [final-grpo] step 11/35 (+208.5s)\n", + "16:47:08 | INFO | grpo | [final-grpo] log step=11 {'loss': 0.082, 'grad_norm': 0.1954, 'learning_rate': 0.0, 'completion_length': 98.75, 'kl': 0.161, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 53925.0, 'completions/mean_length': 81.5, 'completions/min_length': 41.0, 'completions/max_length': 194.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 81.5, 'completions/min_terminated_length': 41.0, 'completions/max_terminated_length': 194.0, 'rewards/env_reward/mean': 0.3662, 'rewards/env_reward/std': 0.4547, 'rewards/format_reward/mean': 0.875, 'rewards/format_reward/std': 0.3416, 'rewards/length_reward/mean': 0.9369, 'rewards/length_reward/std': 0.1403, 'reward': 2.1782, 'reward_std': 0.6511, 'frac_reward_zero_std': 0.0, 'epoch': 1.9524}\n", + "16:47:10 | INFO | grpo | [final-grpo] step 12/35 (+2.4s)\n", + "16:47:10 | INFO | grpo | [final-grpo] log step=12 {'loss': -0.0593, 'grad_norm': 0.2592, 'learning_rate': 0.0, 'completion_length': 71.75, 'kl': 0.1245, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 2.0}\n", + "16:50:32 | INFO | server.services.curriculum | Episode 171: task=128 difficulty=expert achieved=False tier_rate=0.33\n", + "16:50:32 | INFO | server.services.curriculum | Episode 172: task=133 difficulty=expert achieved=False tier_rate=0.28\n", + "16:50:32 | INFO | server.services.curriculum | Episode 173: task=139 difficulty=expert achieved=False tier_rate=0.24\n", + "16:50:32 | INFO | server.services.curriculum | Episode 174: task=123 difficulty=expert achieved=True tier_rate=0.35\n", + "16:50:32 | INFO | server.services.curriculum | Episode 175: task=127 difficulty=expert achieved=True tier_rate=0.45\n", + "16:50:32 | INFO | server.services.curriculum | Episode 176: task=109 difficulty=expert achieved=False tier_rate=0.38\n", + "16:50:32 | INFO | server.services.curriculum | Episode 177: task=120 difficulty=expert achieved=False tier_rate=0.33\n", + "16:50:32 | INFO | server.services.curriculum | Episode 178: task=25 difficulty=expert achieved=False tier_rate=0.28\n", + "16:50:32 | INFO | server.services.curriculum | Episode 179: task=115 difficulty=expert achieved=False tier_rate=0.24\n", + "16:50:32 | INFO | server.services.curriculum | Episode 180: task=125 difficulty=expert achieved=False tier_rate=0.20\n", + "16:50:32 | INFO | server.services.curriculum | Episode 181: task=23 difficulty=expert achieved=False tier_rate=0.17\n", + "16:50:32 | INFO | server.services.curriculum | Episode 182: task=121 difficulty=expert achieved=False tier_rate=0.14\n", + "16:50:32 | INFO | server.services.curriculum | Episode 183: task=113 difficulty=expert achieved=False tier_rate=0.12\n", + "16:50:32 | INFO | server.services.curriculum | Episode 184: task=114 difficulty=expert achieved=False tier_rate=0.10\n", + "16:50:32 | INFO | server.services.curriculum | Episode 185: task=21 difficulty=expert achieved=False tier_rate=0.09\n", + "16:50:37 | INFO | grpo | [final-grpo] step 13/35 (+206.5s)\n", + "16:50:37 | INFO | grpo | [final-grpo] log step=13 {'loss': 0.1211, 'grad_norm': 0.3559, 'learning_rate': 0.0, 'completion_length': 73.3125, 'kl': 0.1532, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 59226.0, 'completions/mean_length': 85.5625, 'completions/min_length': 32.0, 'completions/max_length': 182.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 85.5625, 'completions/min_terminated_length': 32.0, 'completions/max_terminated_length': 182.0, 'rewards/env_reward/mean': 0.2295, 'rewards/env_reward/std': 0.333, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9407, 'rewards/length_reward/std': 0.0867, 'reward': 2.1703, 'reward_std': 0.3273, 'frac_reward_zero_std': 0.0, 'epoch': 2.1905}\n", + "16:53:50 | INFO | server.services.curriculum | Episode 186: task=114 difficulty=expert achieved=False tier_rate=0.08\n", + "16:53:50 | INFO | server.services.curriculum | Episode 187: task=139 difficulty=expert achieved=True tier_rate=0.21\n", + "16:53:50 | INFO | server.services.curriculum | Episode 188: task=113 difficulty=expert achieved=False tier_rate=0.18\n", + "16:53:50 | INFO | server.services.curriculum | Episode 189: task=128 difficulty=expert achieved=False tier_rate=0.15\n", + "16:53:50 | INFO | server.services.curriculum | Episode 190: task=120 difficulty=expert achieved=False tier_rate=0.13\n", + "16:53:50 | INFO | server.services.curriculum | Episode 191: task=135 difficulty=expert achieved=False tier_rate=0.11\n", + "16:53:50 | INFO | server.services.curriculum | Episode 192: task=21 difficulty=expert achieved=True tier_rate=0.24\n", + "16:53:50 | INFO | server.services.curriculum | Episode 193: task=117 difficulty=expert achieved=False tier_rate=0.21\n", + "16:53:50 | INFO | server.services.curriculum | Episode 194: task=19 difficulty=expert achieved=False tier_rate=0.18\n", + "16:53:50 | INFO | server.services.curriculum | Episode 195: task=116 difficulty=expert achieved=False tier_rate=0.15\n", + "16:53:50 | INFO | server.services.curriculum | Task 127 GRADUATED (rate=0.73) — scheduling spaced repetition\n", + "16:53:50 | INFO | server.services.curriculum | Episode 196: task=127 difficulty=expert achieved=True tier_rate=0.28\n", + "16:53:50 | INFO | server.services.curriculum | Episode 197: task=110 difficulty=expert achieved=True tier_rate=0.39\n", + "16:53:50 | INFO | server.services.curriculum | Episode 198: task=24 difficulty=expert achieved=False tier_rate=0.33\n", + "16:53:50 | INFO | server.services.curriculum | Episode 199: task=124 difficulty=expert achieved=False tier_rate=0.28\n", + "16:53:50 | INFO | server.services.curriculum | Episode 200: task=134 difficulty=expert achieved=False tier_rate=0.24\n", + "16:53:55 | INFO | grpo | [final-grpo] step 14/35 (+198.0s)\n", + "16:53:55 | INFO | grpo | [final-grpo] log step=14 {'loss': 0.0968, 'grad_norm': 0.252, 'learning_rate': 0.0, 'completion_length': 100.5625, 'kl': 0.1398, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 64542.0, 'completions/mean_length': 90.5, 'completions/min_length': 43.0, 'completions/max_length': 146.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 90.5, 'completions/min_terminated_length': 43.0, 'completions/max_terminated_length': 146.0, 'rewards/env_reward/mean': 0.3662, 'rewards/env_reward/std': 0.4132, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9135, 'rewards/length_reward/std': 0.1215, 'reward': 2.2797, 'reward_std': 0.4782, 'frac_reward_zero_std': 0.0, 'epoch': 2.381}\n", + "16:57:43 | INFO | server.services.curriculum | Episode 201: task=133 difficulty=expert achieved=False tier_rate=0.20\n", + "16:57:43 | INFO | server.services.curriculum | Episode 202: task=109 difficulty=expert achieved=False tier_rate=0.17\n", + "16:57:43 | INFO | server.services.curriculum | Episode 203: task=115 difficulty=expert achieved=False tier_rate=0.15\n", + "16:57:43 | INFO | server.services.curriculum | Episode 204: task=139 difficulty=expert achieved=False tier_rate=0.12\n", + "16:57:43 | INFO | server.services.curriculum | Episode 205: task=121 difficulty=expert achieved=False tier_rate=0.11\n", + "16:57:43 | INFO | server.services.curriculum | Episode 206: task=113 difficulty=expert achieved=False tier_rate=0.09\n", + "16:57:43 | INFO | server.services.curriculum | Episode 207: task=114 difficulty=expert achieved=False tier_rate=0.08\n", + "16:57:43 | INFO | server.services.curriculum | Episode 208: task=120 difficulty=expert achieved=False tier_rate=0.06\n", + "16:57:43 | INFO | server.services.curriculum | Episode 209: task=134 difficulty=expert achieved=False tier_rate=0.05\n", + "16:57:43 | INFO | server.services.curriculum | Episode 210: task=122 difficulty=expert achieved=False tier_rate=0.05\n", + "16:57:43 | INFO | server.services.curriculum | Episode 211: task=20 difficulty=expert achieved=True tier_rate=0.19\n", + "16:57:43 | INFO | server.services.curriculum | Episode 212: task=117 difficulty=expert achieved=False tier_rate=0.16\n", + "16:57:43 | INFO | server.services.curriculum | Episode 213: task=116 difficulty=expert achieved=False tier_rate=0.14\n", + "16:57:43 | INFO | server.services.curriculum | Episode 214: task=110 difficulty=expert achieved=True tier_rate=0.27\n", + "16:57:43 | INFO | server.services.curriculum | Episode 215: task=126 difficulty=expert achieved=False tier_rate=0.23\n", + "16:57:48 | INFO | grpo | [final-grpo] step 15/35 (+233.5s)\n", + "16:57:48 | INFO | grpo | [final-grpo] log step=15 {'loss': -0.0866, 'grad_norm': 0.2542, 'learning_rate': 0.0, 'completion_length': 84.375, 'kl': 0.1345, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 69954.0, 'completions/mean_length': 94.6875, 'completions/min_length': 35.0, 'completions/max_length': 190.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 94.6875, 'completions/min_terminated_length': 35.0, 'completions/max_terminated_length': 190.0, 'rewards/env_reward/mean': 0.2557, 'rewards/env_reward/std': 0.3671, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9046, 'rewards/length_reward/std': 0.1519, 'reward': 2.1602, 'reward_std': 0.4395, 'frac_reward_zero_std': 0.0, 'epoch': 2.5714}\n", + "17:01:26 | INFO | server.services.curriculum | Episode 216: task=116 difficulty=expert achieved=False tier_rate=0.19\n", + "17:01:26 | INFO | server.services.curriculum | Episode 217: task=124 difficulty=expert achieved=False tier_rate=0.16\n", + "17:01:26 | INFO | server.services.curriculum | Episode 218: task=126 difficulty=expert achieved=False tier_rate=0.14\n", + "17:01:26 | INFO | server.services.curriculum | Episode 219: task=131 difficulty=expert achieved=True tier_rate=0.27\n", + "17:01:26 | INFO | server.services.curriculum | Episode 220: task=23 difficulty=expert achieved=False tier_rate=0.23\n", + "17:01:26 | INFO | server.services.curriculum | Episode 221: task=134 difficulty=expert achieved=False tier_rate=0.19\n", + "17:01:26 | INFO | server.services.curriculum | Episode 222: task=113 difficulty=expert achieved=False tier_rate=0.16\n", + "17:01:26 | INFO | server.services.curriculum | Episode 223: task=123 difficulty=expert achieved=False tier_rate=0.14\n", + "17:01:26 | INFO | server.services.curriculum | Episode 224: task=139 difficulty=expert achieved=False tier_rate=0.12\n", + "17:01:26 | INFO | server.services.curriculum | Episode 225: task=21 difficulty=expert achieved=False tier_rate=0.10\n", + "17:01:26 | INFO | server.services.curriculum | Episode 226: task=109 difficulty=expert achieved=False tier_rate=0.09\n", + "17:01:26 | INFO | server.services.curriculum | Episode 227: task=18 difficulty=expert achieved=False tier_rate=0.07\n", + "17:01:26 | INFO | server.services.curriculum | Episode 228: task=111 difficulty=expert achieved=False tier_rate=0.06\n", + "17:01:26 | INFO | server.services.curriculum | Episode 229: task=24 difficulty=expert achieved=False tier_rate=0.05\n", + "17:01:30 | INFO | grpo | [final-grpo] step 16/35 (+222.3s)\n", + "17:01:30 | INFO | grpo | [final-grpo] log step=16 {'loss': 0.2731, 'grad_norm': 0.221, 'learning_rate': 0.0, 'completion_length': 99.0, 'kl': 0.0956, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 75206.0, 'completions/mean_length': 85.25, 'completions/min_length': 41.0, 'completions/max_length': 173.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 85.25, 'completions/min_terminated_length': 41.0, 'completions/max_terminated_length': 173.0, 'rewards/env_reward/mean': 0.1604, 'rewards/env_reward/std': 0.2648, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9202, 'rewards/length_reward/std': 0.1367, 'reward': 2.0806, 'reward_std': 0.3175, 'frac_reward_zero_std': 0.0, 'epoch': 2.7619}\n", + "17:05:28 | INFO | server.services.curriculum | Episode 230: task=115 difficulty=expert achieved=False tier_rate=0.04\n", + "17:05:28 | INFO | server.services.curriculum | Episode 231: task=114 difficulty=expert achieved=False tier_rate=0.04\n", + "17:05:28 | INFO | server.services.curriculum | Episode 232: task=125 difficulty=expert achieved=False tier_rate=0.03\n", + "17:05:28 | INFO | server.services.curriculum | Episode 233: task=128 difficulty=expert achieved=False tier_rate=0.03\n", + "17:05:28 | INFO | server.services.curriculum | Episode 234: task=135 difficulty=expert achieved=False tier_rate=0.02\n", + "17:05:28 | INFO | server.services.curriculum | Episode 235: task=134 difficulty=expert achieved=False tier_rate=0.02\n", + "17:05:28 | INFO | server.services.curriculum | Episode 236: task=133 difficulty=expert achieved=False tier_rate=0.02\n", + "17:05:28 | INFO | server.services.curriculum | Episode 237: task=126 difficulty=expert achieved=False tier_rate=0.01\n", + "17:05:28 | INFO | server.services.curriculum | Episode 238: task=23 difficulty=expert achieved=True tier_rate=0.16\n", + "17:05:28 | INFO | server.services.curriculum | Episode 239: task=110 difficulty=expert achieved=True tier_rate=0.29\n", + "17:05:28 | INFO | server.services.curriculum | Episode 240: task=117 difficulty=expert achieved=False tier_rate=0.24\n", + "17:05:28 | INFO | server.services.curriculum | Episode 241: task=19 difficulty=expert achieved=False tier_rate=0.21\n", + "17:05:28 | INFO | server.services.curriculum | Episode 242: task=109 difficulty=expert achieved=False tier_rate=0.18\n", + "17:05:28 | INFO | server.services.curriculum | Episode 243: task=119 difficulty=expert achieved=True tier_rate=0.30\n", + "17:05:28 | INFO | server.services.curriculum | Episode 244: task=124 difficulty=expert achieved=False tier_rate=0.26\n", + "17:05:28 | INFO | server.services.curriculum | Episode 245: task=18 difficulty=expert achieved=False tier_rate=0.22\n", + "17:05:32 | INFO | grpo | [final-grpo] step 17/35 (+241.9s)\n", + "17:05:32 | INFO | grpo | [final-grpo] log step=17 {'loss': 0.1019, 'grad_norm': 0.2589, 'learning_rate': 0.0, 'completion_length': 87.6875, 'kl': 0.1146, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 80407.0, 'completions/mean_length': 87.9375, 'completions/min_length': 31.0, 'completions/max_length': 167.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 87.9375, 'completions/min_terminated_length': 31.0, 'completions/max_terminated_length': 167.0, 'rewards/env_reward/mean': 0.2371, 'rewards/env_reward/std': 0.3825, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.917, 'rewards/length_reward/std': 0.1256, 'reward': 2.1541, 'reward_std': 0.3543, 'frac_reward_zero_std': 0.0, 'epoch': 2.9524}\n", + "17:05:35 | INFO | grpo | [final-grpo] step 18/35 (+2.3s)\n", + "17:05:35 | INFO | grpo | [final-grpo] log step=18 {'loss': 0.2207, 'grad_norm': 0.5284, 'learning_rate': 0.0, 'completion_length': 79.0, 'kl': 0.134, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 3.0}\n", + "17:08:52 | INFO | server.services.curriculum | Episode 246: task=126 difficulty=expert achieved=False tier_rate=0.18\n", + "17:08:52 | INFO | server.services.curriculum | Episode 247: task=109 difficulty=expert achieved=False tier_rate=0.16\n", + "17:08:52 | INFO | server.services.curriculum | Episode 248: task=23 difficulty=expert achieved=False tier_rate=0.13\n", + "17:08:52 | INFO | server.services.curriculum | Episode 249: task=129 difficulty=expert achieved=False tier_rate=0.11\n", + "17:08:52 | INFO | server.services.curriculum | Episode 250: task=24 difficulty=expert achieved=False tier_rate=0.10\n", + "17:08:52 | INFO | server.services.curriculum | Episode 251: task=118 difficulty=expert achieved=False tier_rate=0.08\n", + "17:08:52 | INFO | server.services.curriculum | Episode 252: task=119 difficulty=expert achieved=True tier_rate=0.22\n", + "17:08:52 | INFO | server.services.curriculum | Episode 253: task=22 difficulty=expert achieved=False tier_rate=0.19\n", + "17:08:52 | INFO | server.services.curriculum | Episode 254: task=18 difficulty=expert achieved=False tier_rate=0.16\n", + "17:08:52 | INFO | server.services.curriculum | Episode 255: task=139 difficulty=expert achieved=True tier_rate=0.28\n", + "17:08:52 | INFO | server.services.curriculum | Episode 256: task=21 difficulty=expert achieved=True tier_rate=0.39\n", + "17:08:52 | INFO | server.services.curriculum | Episode 257: task=133 difficulty=expert achieved=False tier_rate=0.33\n", + "17:08:52 | INFO | server.services.curriculum | Episode 258: task=122 difficulty=expert achieved=False tier_rate=0.28\n", + "17:08:52 | INFO | server.services.curriculum | Episode 259: task=110 difficulty=expert achieved=True tier_rate=0.39\n", + "17:08:52 | INFO | server.services.curriculum | Episode 260: task=123 difficulty=expert achieved=False tier_rate=0.33\n", + "17:08:52 | INFO | server.services.curriculum | Episode 261: task=115 difficulty=expert achieved=False tier_rate=0.28\n", + "17:09:00 | INFO | grpo | [final-grpo] step 19/35 (+205.3s)\n", + "17:09:00 | INFO | grpo | [final-grpo] log step=19 {'loss': -0.1852, 'grad_norm': 0.2376, 'learning_rate': 0.0, 'completion_length': 89.8125, 'kl': 0.1185, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 85782.0, 'completions/mean_length': 97.9375, 'completions/min_length': 44.0, 'completions/max_length': 264.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 97.9375, 'completions/min_terminated_length': 44.0, 'completions/max_terminated_length': 264.0, 'rewards/env_reward/mean': 0.3362, 'rewards/env_reward/std': 0.4117, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9021, 'rewards/length_reward/std': 0.1455, 'reward': 2.2383, 'reward_std': 0.4771, 'frac_reward_zero_std': 0.0, 'epoch': 3.1905}\n", + "17:12:16 | INFO | server.services.curriculum | Episode 262: task=119 difficulty=expert achieved=False tier_rate=0.24\n", + "17:12:16 | INFO | server.services.curriculum | Episode 263: task=111 difficulty=expert achieved=True tier_rate=0.35\n", + "17:12:16 | INFO | server.services.curriculum | Episode 264: task=124 difficulty=expert achieved=False tier_rate=0.30\n", + "17:12:16 | INFO | server.services.curriculum | Episode 265: task=25 difficulty=expert achieved=False tier_rate=0.26\n", + "17:12:16 | INFO | server.services.curriculum | Episode 266: task=120 difficulty=expert achieved=False tier_rate=0.22\n", + "17:12:16 | INFO | server.services.curriculum | Episode 267: task=128 difficulty=expert achieved=False tier_rate=0.18\n", + "17:12:16 | INFO | server.services.curriculum | Episode 268: task=122 difficulty=expert achieved=False tier_rate=0.16\n", + "17:12:16 | INFO | server.services.curriculum | Episode 269: task=126 difficulty=expert achieved=False tier_rate=0.13\n", + "17:12:16 | INFO | server.services.curriculum | Episode 270: task=19 difficulty=expert achieved=False tier_rate=0.11\n", + "17:12:16 | INFO | server.services.curriculum | Episode 271: task=115 difficulty=expert achieved=False tier_rate=0.10\n", + "17:12:16 | INFO | server.services.curriculum | Episode 272: task=114 difficulty=expert achieved=False tier_rate=0.08\n", + "17:12:16 | INFO | server.services.curriculum | Episode 273: task=135 difficulty=expert achieved=False tier_rate=0.07\n", + "17:12:16 | INFO | server.services.curriculum | Episode 274: task=123 difficulty=expert achieved=False tier_rate=0.06\n", + "17:12:16 | INFO | server.services.curriculum | Episode 275: task=134 difficulty=expert achieved=False tier_rate=0.05\n", + "17:12:24 | INFO | grpo | [final-grpo] step 20/35 (+203.7s)\n", + "17:12:24 | INFO | grpo | [final-grpo] log step=20 {'loss': 0.0928, 'grad_norm': 0.2356, 'learning_rate': 0.0, 'completion_length': 74.3125, 'kl': 0.1807, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 90979.0, 'completions/mean_length': 78.0, 'completions/min_length': 17.0, 'completions/max_length': 193.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 78.0, 'completions/min_terminated_length': 17.0, 'completions/max_terminated_length': 193.0, 'rewards/env_reward/mean': 0.2499, 'rewards/env_reward/std': 0.2785, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.954, 'rewards/length_reward/std': 0.1011, 'reward': 2.2039, 'reward_std': 0.3256, 'frac_reward_zero_std': 0.0, 'epoch': 3.381}\n", + "17:16:21 | INFO | server.services.curriculum | Episode 276: task=19 difficulty=expert achieved=False tier_rate=0.04\n", + "17:16:21 | INFO | server.services.curriculum | Episode 277: task=134 difficulty=expert achieved=False tier_rate=0.04\n", + "17:16:21 | INFO | server.services.curriculum | Episode 278: task=121 difficulty=expert achieved=False tier_rate=0.03\n", + "17:16:21 | INFO | server.services.curriculum | Episode 279: task=21 difficulty=expert achieved=False tier_rate=0.03\n", + "17:16:21 | INFO | server.services.curriculum | Episode 280: task=25 difficulty=expert achieved=False tier_rate=0.02\n", + "17:16:21 | INFO | server.services.curriculum | Episode 281: task=131 difficulty=expert achieved=False tier_rate=0.02\n", + "17:16:21 | INFO | server.services.curriculum | Episode 282: task=24 difficulty=expert achieved=False tier_rate=0.02\n", + "17:16:21 | INFO | server.services.curriculum | Episode 283: task=114 difficulty=expert achieved=False tier_rate=0.01\n", + "17:16:21 | INFO | server.services.curriculum | Episode 284: task=115 difficulty=expert achieved=False tier_rate=0.01\n", + "17:16:21 | INFO | server.services.curriculum | Episode 285: task=139 difficulty=expert achieved=False tier_rate=0.01\n", + "17:16:21 | INFO | server.services.curriculum | Episode 286: task=23 difficulty=expert achieved=False tier_rate=0.01\n", + "17:16:21 | INFO | server.services.curriculum | Episode 287: task=125 difficulty=expert achieved=False tier_rate=0.01\n", + "17:16:21 | INFO | server.services.curriculum | Episode 288: task=128 difficulty=expert achieved=False tier_rate=0.01\n", + "17:16:21 | INFO | server.services.curriculum | Episode 289: task=113 difficulty=expert achieved=False tier_rate=0.01\n", + "17:16:21 | INFO | server.services.curriculum | Episode 290: task=116 difficulty=expert achieved=False tier_rate=0.00\n", + "17:16:28 | INFO | grpo | [final-grpo] step 21/35 (+244.0s)\n", + "17:16:28 | INFO | grpo | [final-grpo] log step=21 {'loss': 0.4222, 'grad_norm': 0.2285, 'learning_rate': 0.0, 'completion_length': 107.375, 'kl': 0.1115, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 96292.0, 'completions/mean_length': 89.8125, 'completions/min_length': 38.0, 'completions/max_length': 153.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 89.8125, 'completions/min_terminated_length': 38.0, 'completions/max_terminated_length': 153.0, 'rewards/env_reward/mean': 0.1265, 'rewards/env_reward/std': 0.1237, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9045, 'rewards/length_reward/std': 0.1363, 'reward': 2.031, 'reward_std': 0.2181, 'frac_reward_zero_std': 0.0, 'epoch': 3.5714}\n", + "17:19:54 | INFO | server.services.curriculum | Episode 291: task=129 difficulty=expert achieved=False tier_rate=0.00\n", + "17:19:54 | INFO | server.services.curriculum | Episode 292: task=133 difficulty=expert achieved=False tier_rate=0.00\n", + "17:19:54 | INFO | server.services.curriculum | Episode 293: task=119 difficulty=expert achieved=True tier_rate=0.15\n", + "17:19:54 | INFO | server.services.curriculum | Episode 294: task=128 difficulty=expert achieved=False tier_rate=0.13\n", + "17:19:54 | INFO | server.services.curriculum | Episode 295: task=134 difficulty=expert achieved=False tier_rate=0.11\n", + "17:19:54 | INFO | server.services.curriculum | Episode 296: task=123 difficulty=expert achieved=False tier_rate=0.09\n", + "17:19:54 | INFO | server.services.curriculum | Episode 297: task=19 difficulty=expert achieved=False tier_rate=0.08\n", + "17:19:54 | INFO | server.services.curriculum | Episode 298: task=118 difficulty=expert achieved=False tier_rate=0.07\n", + "17:19:54 | INFO | server.services.curriculum | Episode 299: task=18 difficulty=expert achieved=False tier_rate=0.06\n", + "17:19:54 | INFO | server.services.curriculum | Episode 300: task=114 difficulty=expert achieved=False tier_rate=0.05\n", + "17:19:54 | INFO | server.services.curriculum | Episode 301: task=124 difficulty=expert achieved=False tier_rate=0.04\n", + "17:19:54 | INFO | server.services.curriculum | Task 127 UN-GRADUATED (rate=0.57) — resetting to active\n", + "17:19:54 | INFO | server.services.curriculum | Episode 302: task=127 difficulty=expert achieved=False tier_rate=0.04\n", + "17:19:54 | INFO | server.services.curriculum | Episode 303: task=111 difficulty=expert achieved=False tier_rate=0.03\n", + "17:19:54 | INFO | server.services.curriculum | Episode 304: task=121 difficulty=expert achieved=False tier_rate=0.03\n", + "17:19:54 | INFO | server.services.curriculum | Episode 305: task=110 difficulty=expert achieved=False tier_rate=0.02\n", + "17:20:02 | INFO | grpo | [final-grpo] step 22/35 (+214.2s)\n", + "17:20:02 | INFO | grpo | [final-grpo] log step=22 {'loss': -0.0373, 'grad_norm': 0.2382, 'learning_rate': 0.0, 'completion_length': 83.25, 'kl': 0.1369, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 101634.0, 'completions/mean_length': 93.9375, 'completions/min_length': 28.0, 'completions/max_length': 291.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 93.9375, 'completions/min_terminated_length': 28.0, 'completions/max_terminated_length': 291.0, 'rewards/env_reward/mean': 0.3159, 'rewards/env_reward/std': 0.3495, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9655, 'rewards/length_reward/std': 0.0714, 'reward': 2.2814, 'reward_std': 0.3936, 'frac_reward_zero_std': 0.0, 'epoch': 3.7619}\n", + "17:24:01 | INFO | server.services.curriculum | Episode 306: task=117 difficulty=expert achieved=False tier_rate=0.02\n", + "17:24:01 | INFO | server.services.curriculum | Episode 307: task=125 difficulty=expert achieved=False tier_rate=0.02\n", + "17:24:01 | INFO | server.services.curriculum | Episode 308: task=19 difficulty=expert achieved=False tier_rate=0.01\n", + "17:24:01 | INFO | server.services.curriculum | Episode 309: task=123 difficulty=expert achieved=False tier_rate=0.01\n", + "17:24:01 | INFO | server.services.curriculum | Episode 310: task=118 difficulty=expert achieved=False tier_rate=0.01\n", + "17:24:01 | INFO | server.services.curriculum | Episode 311: task=111 difficulty=expert achieved=False tier_rate=0.01\n", + "17:24:01 | INFO | server.services.curriculum | Episode 312: task=129 difficulty=expert achieved=False tier_rate=0.01\n", + "17:24:01 | INFO | server.services.curriculum | Episode 313: task=22 difficulty=expert achieved=True tier_rate=0.16\n", + "17:24:01 | INFO | server.services.curriculum | Task 110 UN-GRADUATED (rate=0.59) — resetting to active\n", + "17:24:01 | INFO | server.services.curriculum | Episode 314: task=110 difficulty=expert achieved=False tier_rate=0.13\n", + "17:24:01 | INFO | server.services.curriculum | Episode 315: task=115 difficulty=expert achieved=False tier_rate=0.11\n", + "17:24:01 | INFO | server.services.curriculum | Episode 316: task=109 difficulty=expert achieved=False tier_rate=0.10\n", + "17:24:01 | INFO | server.services.curriculum | Episode 317: task=18 difficulty=expert achieved=False tier_rate=0.08\n", + "17:24:01 | INFO | server.services.curriculum | Episode 318: task=133 difficulty=expert achieved=False tier_rate=0.07\n", + "17:24:01 | INFO | server.services.curriculum | Episode 319: task=128 difficulty=expert achieved=False tier_rate=0.06\n", + "17:24:01 | INFO | server.services.curriculum | Episode 320: task=120 difficulty=expert achieved=False tier_rate=0.05\n", + "17:24:01 | INFO | server.services.curriculum | Episode 321: task=126 difficulty=expert achieved=False tier_rate=0.04\n", + "17:24:09 | INFO | grpo | [final-grpo] step 23/35 (+247.2s)\n", + "17:24:09 | INFO | grpo | [final-grpo] log step=23 {'loss': 0.1686, 'grad_norm': 0.2184, 'learning_rate': 0.0, 'completion_length': 105.1875, 'kl': 0.1559, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 107148.0, 'completions/mean_length': 105.1875, 'completions/min_length': 41.0, 'completions/max_length': 303.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 105.1875, 'completions/min_terminated_length': 41.0, 'completions/max_terminated_length': 303.0, 'rewards/env_reward/mean': 0.1881, 'rewards/env_reward/std': 0.2464, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9008, 'rewards/length_reward/std': 0.1619, 'reward': 2.0889, 'reward_std': 0.334, 'frac_reward_zero_std': 0.0, 'epoch': 3.9524}\n", + "17:24:12 | INFO | grpo | [final-grpo] step 24/35 (+2.9s)\n", + "17:24:12 | INFO | grpo | [final-grpo] log step=24 {'loss': -0.0629, 'grad_norm': 0.1749, 'learning_rate': 0.0, 'completion_length': 91.25, 'kl': 0.1545, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 4.0}\n", + "17:27:15 | INFO | server.services.curriculum | Episode 322: task=20 difficulty=expert achieved=True tier_rate=0.19\n", + "17:27:15 | INFO | server.services.curriculum | Episode 323: task=134 difficulty=expert achieved=False tier_rate=0.16\n", + "17:27:15 | INFO | server.services.curriculum | Episode 324: task=18 difficulty=expert achieved=False tier_rate=0.13\n", + "17:27:15 | INFO | server.services.curriculum | Episode 325: task=126 difficulty=expert achieved=False tier_rate=0.11\n", + "17:27:15 | INFO | server.services.curriculum | Episode 326: task=121 difficulty=expert achieved=False tier_rate=0.10\n", + "17:27:15 | INFO | server.services.curriculum | Episode 327: task=127 difficulty=expert achieved=True tier_rate=0.23\n", + "17:27:15 | INFO | server.services.curriculum | Episode 328: task=19 difficulty=expert achieved=False tier_rate=0.20\n", + "17:27:15 | INFO | server.services.curriculum | Episode 329: task=25 difficulty=expert achieved=False tier_rate=0.17\n", + "17:27:15 | INFO | server.services.curriculum | Episode 330: task=131 difficulty=expert achieved=False tier_rate=0.14\n", + "17:27:15 | INFO | server.services.curriculum | Episode 331: task=23 difficulty=expert achieved=False tier_rate=0.12\n", + "17:27:15 | INFO | server.services.curriculum | Episode 332: task=21 difficulty=expert achieved=False tier_rate=0.10\n", + "17:27:15 | INFO | server.services.curriculum | Episode 333: task=119 difficulty=expert achieved=True tier_rate=0.24\n", + "17:27:15 | INFO | server.services.curriculum | Episode 334: task=128 difficulty=expert achieved=False tier_rate=0.20\n", + "17:27:15 | INFO | server.services.curriculum | Episode 335: task=118 difficulty=expert achieved=False tier_rate=0.17\n", + "17:27:15 | INFO | server.services.curriculum | Episode 336: task=116 difficulty=expert achieved=False tier_rate=0.15\n", + "17:27:15 | INFO | server.services.curriculum | Episode 337: task=22 difficulty=expert achieved=True tier_rate=0.27\n", + "17:27:25 | INFO | grpo | [final-grpo] step 25/35 (+193.1s)\n", + "17:27:25 | INFO | grpo | [final-grpo] log step=25 {'loss': 0.0519, 'grad_norm': 0.2533, 'learning_rate': 0.0, 'num_tokens': 112197.0, 'completions/mean_length': 83.3125, 'completions/min_length': 36.0, 'completions/max_length': 252.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 83.3125, 'completions/min_terminated_length': 36.0, 'completions/max_terminated_length': 252.0, 'rewards/env_reward/mean': 0.3733, 'rewards/env_reward/std': 0.4133, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9321, 'rewards/length_reward/std': 0.1404, 'reward': 2.3054, 'reward_std': 0.4664, 'frac_reward_zero_std': 0.0, 'completion_length': 83.3125, 'kl': 0.1324, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 4.1905}\n", + "17:33:40 | INFO | server.services.curriculum | Episode 338: task=115 difficulty=expert achieved=False tier_rate=0.23\n", + "17:33:40 | INFO | server.services.curriculum | Episode 339: task=126 difficulty=expert achieved=False tier_rate=0.20\n", + "17:33:40 | INFO | server.services.curriculum | Episode 340: task=122 difficulty=expert achieved=False tier_rate=0.17\n", + "17:33:40 | INFO | server.services.curriculum | Episode 341: task=118 difficulty=expert achieved=False tier_rate=0.14\n", + "17:33:40 | INFO | server.services.curriculum | Episode 342: task=133 difficulty=expert achieved=False tier_rate=0.12\n", + "17:33:40 | INFO | server.services.curriculum | Episode 343: task=129 difficulty=expert achieved=False tier_rate=0.10\n", + "17:33:40 | INFO | server.services.curriculum | Episode 344: task=114 difficulty=expert achieved=False tier_rate=0.09\n", + "17:33:40 | INFO | server.services.curriculum | Episode 345: task=18 difficulty=expert achieved=False tier_rate=0.07\n", + "17:33:40 | INFO | server.services.curriculum | Episode 346: task=116 difficulty=expert achieved=False tier_rate=0.06\n", + "17:33:40 | INFO | server.services.curriculum | Task 127 GRADUATED (rate=0.72) — scheduling spaced repetition\n", + "17:33:40 | INFO | server.services.curriculum | Episode 347: task=127 difficulty=expert achieved=True tier_rate=0.20\n", + "17:33:40 | INFO | server.services.curriculum | Episode 348: task=25 difficulty=expert achieved=False tier_rate=0.17\n", + "17:33:40 | INFO | server.services.curriculum | Episode 349: task=110 difficulty=expert achieved=True tier_rate=0.30\n", + "17:33:40 | INFO | server.services.curriculum | Episode 350: task=21 difficulty=expert achieved=True tier_rate=0.40\n", + "17:33:40 | INFO | server.services.curriculum | Episode 351: task=128 difficulty=expert achieved=False tier_rate=0.34\n", + "17:33:40 | INFO | server.services.curriculum | Episode 352: task=123 difficulty=expert achieved=False tier_rate=0.29\n", + "17:33:59 | INFO | grpo | [final-grpo] step 26/35 (+394.3s)\n", + "17:33:59 | INFO | grpo | [final-grpo] log step=26 {'loss': 0.0847, 'grad_norm': 0.2684, 'learning_rate': 0.0, 'num_tokens': 118063.0, 'completions/mean_length': 128.1875, 'completions/min_length': 42.0, 'completions/max_length': 768.0, 'completions/clipped_ratio': 0.0625, 'completions/mean_terminated_length': 85.5333, 'completions/min_terminated_length': 42.0, 'completions/max_terminated_length': 154.0, 'rewards/env_reward/mean': 0.2754, 'rewards/env_reward/std': 0.3726, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.8385, 'rewards/length_reward/std': 0.1988, 'reward': 2.1139, 'reward_std': 0.4257, 'frac_reward_zero_std': 0.0, 'completion_length': 128.1875, 'kl': 0.161, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 4.381}\n", + "17:37:05 | INFO | server.services.curriculum | Episode 353: task=127 difficulty=expert achieved=True tier_rate=0.40\n", + "17:37:05 | INFO | server.services.curriculum | Episode 354: task=19 difficulty=expert achieved=False tier_rate=0.34\n", + "17:37:05 | INFO | server.services.curriculum | Task 110 GRADUATED (rate=0.71) — scheduling spaced repetition\n", + "17:37:05 | INFO | server.services.curriculum | Episode 355: task=110 difficulty=expert achieved=True tier_rate=0.44\n", + "17:37:05 | INFO | server.services.curriculum | Episode 356: task=126 difficulty=expert achieved=False tier_rate=0.37\n", + "17:37:05 | INFO | server.services.curriculum | Episode 357: task=123 difficulty=expert achieved=True tier_rate=0.47\n", + "17:37:05 | INFO | server.services.curriculum | Episode 358: task=131 difficulty=expert achieved=False tier_rate=0.40\n", + "17:37:05 | INFO | server.services.curriculum | Episode 359: task=115 difficulty=expert achieved=False tier_rate=0.34\n", + "17:37:05 | INFO | server.services.curriculum | Episode 360: task=24 difficulty=expert achieved=False tier_rate=0.29\n", + "17:37:05 | INFO | server.services.curriculum | Episode 361: task=117 difficulty=expert achieved=False tier_rate=0.24\n", + "17:37:05 | INFO | server.services.curriculum | Episode 362: task=21 difficulty=expert achieved=False tier_rate=0.21\n", + "17:37:05 | INFO | server.services.curriculum | Episode 363: task=129 difficulty=expert achieved=False tier_rate=0.18\n", + "17:37:05 | INFO | server.services.curriculum | Episode 364: task=111 difficulty=expert achieved=False tier_rate=0.15\n", + "17:37:05 | INFO | server.services.curriculum | Episode 365: task=125 difficulty=expert achieved=False tier_rate=0.13\n", + "17:37:05 | INFO | server.services.curriculum | Episode 366: task=124 difficulty=expert achieved=False tier_rate=0.11\n", + "17:37:14 | INFO | grpo | [final-grpo] step 27/35 (+195.2s)\n", + "17:37:14 | INFO | grpo | [final-grpo] log step=27 {'loss': 0.11, 'grad_norm': 0.1977, 'learning_rate': 0.0, 'num_tokens': 123203.0, 'completions/mean_length': 76.5625, 'completions/min_length': 25.0, 'completions/max_length': 145.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 76.5625, 'completions/min_terminated_length': 25.0, 'completions/max_terminated_length': 145.0, 'rewards/env_reward/mean': 0.3355, 'rewards/env_reward/std': 0.4122, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9378, 'rewards/length_reward/std': 0.0952, 'reward': 2.2734, 'reward_std': 0.4548, 'frac_reward_zero_std': 0.0, 'completion_length': 76.5625, 'kl': 0.1915, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 4.5714}\n", + "17:41:08 | INFO | server.services.curriculum | Episode 367: task=123 difficulty=expert achieved=False tier_rate=0.09\n", + "17:41:08 | INFO | server.services.curriculum | Episode 368: task=125 difficulty=expert achieved=False tier_rate=0.08\n", + "17:41:08 | INFO | server.services.curriculum | Episode 369: task=24 difficulty=expert achieved=False tier_rate=0.07\n", + "17:41:08 | INFO | server.services.curriculum | Episode 370: task=19 difficulty=expert achieved=False tier_rate=0.06\n", + "17:41:08 | INFO | server.services.curriculum | Episode 371: task=22 difficulty=expert achieved=False tier_rate=0.05\n", + "17:41:08 | INFO | server.services.curriculum | Episode 372: task=117 difficulty=expert achieved=False tier_rate=0.04\n", + "17:41:08 | INFO | server.services.curriculum | Episode 373: task=124 difficulty=expert achieved=False tier_rate=0.03\n", + "17:41:08 | INFO | server.services.curriculum | Episode 374: task=114 difficulty=expert achieved=False tier_rate=0.03\n", + "17:41:08 | INFO | server.services.curriculum | Episode 375: task=23 difficulty=expert achieved=False tier_rate=0.02\n", + "17:41:08 | INFO | server.services.curriculum | Episode 376: task=21 difficulty=expert achieved=True tier_rate=0.17\n", + "17:41:08 | INFO | server.services.curriculum | Episode 377: task=121 difficulty=expert achieved=False tier_rate=0.15\n", + "17:41:08 | INFO | server.services.curriculum | Episode 378: task=116 difficulty=expert achieved=False tier_rate=0.12\n", + "17:41:08 | INFO | server.services.curriculum | Episode 379: task=139 difficulty=expert achieved=False tier_rate=0.11\n", + "17:41:08 | INFO | server.services.curriculum | Episode 380: task=25 difficulty=expert achieved=False tier_rate=0.09\n", + "17:41:08 | INFO | server.services.curriculum | Episode 381: task=115 difficulty=expert achieved=False tier_rate=0.08\n", + "17:41:08 | INFO | server.services.curriculum | Episode 382: task=126 difficulty=expert achieved=False tier_rate=0.06\n", + "17:41:17 | INFO | grpo | [final-grpo] step 28/35 (+243.0s)\n", + "17:41:17 | INFO | grpo | [final-grpo] log step=28 {'loss': -0.054, 'grad_norm': 0.2198, 'learning_rate': 0.0, 'num_tokens': 128577.0, 'completions/mean_length': 95.25, 'completions/min_length': 29.0, 'completions/max_length': 170.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 95.25, 'completions/min_terminated_length': 29.0, 'completions/max_terminated_length': 170.0, 'rewards/env_reward/mean': 0.2246, 'rewards/env_reward/std': 0.3104, 'rewards/format_reward/mean': 0.9375, 'rewards/format_reward/std': 0.25, 'rewards/length_reward/mean': 0.908, 'rewards/length_reward/std': 0.1206, 'reward': 2.0701, 'reward_std': 0.4388, 'frac_reward_zero_std': 0.0, 'completion_length': 95.25, 'kl': 0.156, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 4.7619}\n", + "17:44:43 | INFO | server.services.curriculum | Episode 383: task=23 difficulty=expert achieved=False tier_rate=0.05\n", + "17:44:43 | INFO | server.services.curriculum | Episode 384: task=120 difficulty=expert achieved=False tier_rate=0.05\n", + "17:44:43 | INFO | server.services.curriculum | Episode 385: task=111 difficulty=expert achieved=False tier_rate=0.04\n", + "17:44:43 | INFO | server.services.curriculum | Episode 386: task=110 difficulty=expert achieved=True tier_rate=0.18\n", + "17:44:43 | INFO | server.services.curriculum | Episode 387: task=134 difficulty=expert achieved=False tier_rate=0.16\n", + "17:44:43 | INFO | server.services.curriculum | Episode 388: task=135 difficulty=expert achieved=False tier_rate=0.13\n", + "17:44:43 | INFO | server.services.curriculum | Episode 389: task=19 difficulty=expert achieved=False tier_rate=0.11\n", + "17:44:43 | INFO | server.services.curriculum | Episode 390: task=128 difficulty=expert achieved=False tier_rate=0.10\n", + "17:44:43 | INFO | server.services.curriculum | Episode 391: task=114 difficulty=expert achieved=False tier_rate=0.08\n", + "17:44:43 | INFO | server.services.curriculum | Episode 392: task=20 difficulty=expert achieved=False tier_rate=0.07\n", + "17:44:43 | INFO | server.services.curriculum | Episode 393: task=129 difficulty=expert achieved=False tier_rate=0.06\n", + "17:44:43 | INFO | server.services.curriculum | Episode 394: task=139 difficulty=expert achieved=False tier_rate=0.05\n", + "17:44:43 | INFO | server.services.curriculum | Episode 395: task=25 difficulty=expert achieved=False tier_rate=0.04\n", + "17:44:43 | INFO | server.services.curriculum | Episode 396: task=131 difficulty=expert achieved=False tier_rate=0.04\n", + "17:44:43 | INFO | server.services.curriculum | Episode 397: task=113 difficulty=expert achieved=False tier_rate=0.03\n", + "17:44:43 | INFO | server.services.curriculum | Episode 398: task=115 difficulty=expert achieved=False tier_rate=0.03\n", + "17:44:53 | INFO | grpo | [final-grpo] step 29/35 (+215.2s)\n", + "17:44:53 | INFO | grpo | [final-grpo] log step=29 {'loss': 0.1324, 'grad_norm': 0.3037, 'learning_rate': 0.0, 'num_tokens': 133793.0, 'completions/mean_length': 81.9375, 'completions/min_length': 24.0, 'completions/max_length': 168.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 81.9375, 'completions/min_terminated_length': 24.0, 'completions/max_terminated_length': 168.0, 'rewards/env_reward/mean': 0.2174, 'rewards/env_reward/std': 0.2527, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9206, 'rewards/length_reward/std': 0.1428, 'reward': 2.138, 'reward_std': 0.3027, 'frac_reward_zero_std': 0.0, 'completion_length': 81.9375, 'kl': 0.1395, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 4.9524}\n", + "17:48:07 | INFO | server.services.curriculum | Episode 399: task=23 difficulty=expert achieved=False tier_rate=0.02\n", + "17:48:07 | INFO | server.services.curriculum | Episode 400: task=126 difficulty=expert achieved=False tier_rate=0.02\n", + "17:48:07 | INFO | server.services.curriculum | Episode 401: task=19 difficulty=expert achieved=False tier_rate=0.02\n", + "17:48:07 | INFO | server.services.curriculum | Episode 402: task=115 difficulty=expert achieved=False tier_rate=0.01\n", + "17:48:07 | INFO | server.services.curriculum | Episode 403: task=116 difficulty=expert achieved=False tier_rate=0.01\n", + "17:48:07 | INFO | server.services.curriculum | Episode 404: task=128 difficulty=expert achieved=False tier_rate=0.01\n", + "17:48:07 | INFO | server.services.curriculum | Episode 405: task=133 difficulty=expert achieved=False tier_rate=0.01\n", + "17:48:07 | INFO | server.services.curriculum | Episode 406: task=22 difficulty=expert achieved=False tier_rate=0.01\n", + "17:48:07 | INFO | server.services.curriculum | Episode 407: task=110 difficulty=expert achieved=True tier_rate=0.16\n", + "17:48:07 | INFO | server.services.curriculum | Episode 408: task=135 difficulty=expert achieved=False tier_rate=0.13\n", + "17:48:07 | INFO | server.services.curriculum | Episode 409: task=134 difficulty=expert achieved=True tier_rate=0.26\n", + "17:48:07 | INFO | server.services.curriculum | Episode 410: task=25 difficulty=expert achieved=False tier_rate=0.22\n", + "17:48:07 | INFO | server.services.curriculum | Episode 411: task=124 difficulty=expert achieved=False tier_rate=0.19\n", + "17:48:07 | INFO | server.services.curriculum | Episode 412: task=139 difficulty=expert achieved=False tier_rate=0.16\n", + "17:48:07 | INFO | server.services.curriculum | Episode 413: task=18 difficulty=expert achieved=False tier_rate=0.14\n", + "17:48:07 | INFO | server.services.curriculum | Episode 414: task=117 difficulty=expert achieved=False tier_rate=0.12\n", + "17:48:09 | INFO | grpo | [final-grpo] step 30/35 (+196.5s)\n", + "17:48:09 | INFO | grpo | [final-grpo] log step=30 {'loss': 0.6377, 'grad_norm': 0.2491, 'learning_rate': 0.0, 'num_tokens': 138737.0, 'completions/mean_length': 73.1875, 'completions/min_length': 38.0, 'completions/max_length': 151.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 73.1875, 'completions/min_terminated_length': 38.0, 'completions/max_terminated_length': 151.0, 'rewards/env_reward/mean': 0.2316, 'rewards/env_reward/std': 0.3266, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9502, 'rewards/length_reward/std': 0.087, 'reward': 2.1818, 'reward_std': 0.3468, 'frac_reward_zero_std': 0.0, 'completion_length': 84.25, 'kl': 0.1716, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'epoch': 5.0}\n", + "17:51:37 | INFO | server.services.curriculum | Episode 415: task=123 difficulty=expert achieved=False tier_rate=0.10\n", + "17:51:37 | INFO | server.services.curriculum | Episode 416: task=124 difficulty=expert achieved=False tier_rate=0.08\n", + "17:51:37 | INFO | server.services.curriculum | Episode 417: task=134 difficulty=expert achieved=False tier_rate=0.07\n", + "17:51:37 | INFO | server.services.curriculum | Episode 418: task=23 difficulty=expert achieved=True tier_rate=0.21\n", + "17:51:37 | INFO | server.services.curriculum | Episode 419: task=111 difficulty=expert achieved=False tier_rate=0.18\n", + "17:51:37 | INFO | server.services.curriculum | Episode 420: task=120 difficulty=expert achieved=False tier_rate=0.15\n", + "17:51:37 | INFO | server.services.curriculum | Episode 421: task=118 difficulty=expert achieved=False tier_rate=0.13\n", + "17:51:37 | INFO | server.services.curriculum | Episode 422: task=129 difficulty=expert achieved=False tier_rate=0.11\n", + "17:51:37 | INFO | server.services.curriculum | Episode 423: task=18 difficulty=expert achieved=False tier_rate=0.09\n", + "17:51:37 | INFO | server.services.curriculum | Episode 424: task=128 difficulty=expert achieved=False tier_rate=0.08\n", + "17:51:37 | INFO | server.services.curriculum | Episode 425: task=22 difficulty=expert achieved=True tier_rate=0.22\n", + "17:51:37 | INFO | server.services.curriculum | Episode 426: task=121 difficulty=expert achieved=False tier_rate=0.18\n", + "17:51:37 | INFO | server.services.curriculum | Episode 427: task=113 difficulty=expert achieved=False tier_rate=0.16\n", + "17:51:37 | INFO | server.services.curriculum | Episode 428: task=139 difficulty=expert achieved=True tier_rate=0.28\n", + "17:51:37 | INFO | server.services.curriculum | Episode 429: task=25 difficulty=expert achieved=False tier_rate=0.24\n", + "17:51:37 | INFO | server.services.curriculum | Episode 430: task=20 difficulty=expert achieved=True tier_rate=0.35\n", + "17:51:40 | INFO | grpo | [final-grpo] step 31/35 (+210.4s)\n", + "17:51:40 | INFO | grpo | [final-grpo] log step=31 {'loss': -0.1123, 'grad_norm': 0.2871, 'learning_rate': 0.0, 'completion_length': 70.0625, 'kl': 0.1626, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 144036.0, 'completions/mean_length': 88.8125, 'completions/min_length': 47.0, 'completions/max_length': 147.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 88.8125, 'completions/min_terminated_length': 47.0, 'completions/max_terminated_length': 147.0, 'rewards/env_reward/mean': 0.3949, 'rewards/env_reward/std': 0.4188, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9569, 'rewards/length_reward/std': 0.1044, 'reward': 2.3518, 'reward_std': 0.4425, 'frac_reward_zero_std': 0.0, 'epoch': 5.1905}\n", + "17:55:22 | INFO | server.services.curriculum | Task 127 UN-GRADUATED (rate=0.62) — resetting to active\n", + "17:55:22 | INFO | server.services.curriculum | Episode 431: task=127 difficulty=expert achieved=False tier_rate=0.30\n", + "17:55:22 | INFO | server.services.curriculum | Episode 432: task=120 difficulty=expert achieved=False tier_rate=0.26\n", + "17:55:22 | INFO | server.services.curriculum | Episode 433: task=111 difficulty=expert achieved=True tier_rate=0.37\n", + "17:55:22 | INFO | server.services.curriculum | Episode 434: task=133 difficulty=expert achieved=False tier_rate=0.31\n", + "17:55:22 | INFO | server.services.curriculum | Episode 435: task=118 difficulty=expert achieved=False tier_rate=0.27\n", + "17:55:22 | INFO | server.services.curriculum | Episode 436: task=124 difficulty=expert achieved=False tier_rate=0.23\n", + "17:55:22 | INFO | server.services.curriculum | Episode 437: task=115 difficulty=expert achieved=False tier_rate=0.19\n", + "17:55:22 | INFO | server.services.curriculum | Episode 438: task=114 difficulty=expert achieved=False tier_rate=0.16\n", + "17:55:22 | INFO | server.services.curriculum | Episode 439: task=25 difficulty=expert achieved=False tier_rate=0.14\n", + "17:55:22 | INFO | server.services.curriculum | Episode 440: task=110 difficulty=expert achieved=True tier_rate=0.27\n", + "17:55:22 | INFO | server.services.curriculum | Episode 441: task=20 difficulty=expert achieved=True tier_rate=0.38\n", + "17:55:22 | INFO | server.services.curriculum | Episode 442: task=113 difficulty=expert achieved=False tier_rate=0.32\n", + "17:55:22 | INFO | server.services.curriculum | Episode 443: task=126 difficulty=expert achieved=False tier_rate=0.27\n", + "17:55:22 | INFO | server.services.curriculum | Episode 444: task=123 difficulty=expert achieved=False tier_rate=0.23\n", + "17:55:22 | INFO | server.services.curriculum | Episode 445: task=117 difficulty=expert achieved=False tier_rate=0.20\n", + "17:55:24 | INFO | grpo | [final-grpo] step 32/35 (+224.6s)\n", + "17:55:24 | INFO | grpo | [final-grpo] log step=32 {'loss': 0.1634, 'grad_norm': 0.3088, 'learning_rate': 0.0, 'completion_length': 101.25, 'kl': 0.1422, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 149315.0, 'completions/mean_length': 83.9375, 'completions/min_length': 29.0, 'completions/max_length': 182.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 83.9375, 'completions/min_terminated_length': 29.0, 'completions/max_terminated_length': 182.0, 'rewards/env_reward/mean': 0.2958, 'rewards/env_reward/std': 0.3892, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9025, 'rewards/length_reward/std': 0.1382, 'reward': 2.1983, 'reward_std': 0.4893, 'frac_reward_zero_std': 0.0, 'epoch': 5.381}\n", + "17:58:55 | INFO | server.services.curriculum | Episode 446: task=131 difficulty=expert achieved=False tier_rate=0.17\n", + "17:58:55 | INFO | server.services.curriculum | Episode 447: task=110 difficulty=expert achieved=True tier_rate=0.29\n", + "17:58:55 | INFO | server.services.curriculum | Episode 448: task=111 difficulty=expert achieved=False tier_rate=0.25\n", + "17:58:55 | INFO | server.services.curriculum | Episode 449: task=21 difficulty=expert achieved=False tier_rate=0.21\n", + "17:58:55 | INFO | server.services.curriculum | Episode 450: task=113 difficulty=expert achieved=False tier_rate=0.18\n", + "17:58:55 | INFO | server.services.curriculum | Episode 451: task=125 difficulty=expert achieved=False tier_rate=0.15\n", + "17:58:55 | INFO | server.services.curriculum | Episode 452: task=118 difficulty=expert achieved=False tier_rate=0.13\n", + "17:58:55 | INFO | server.services.curriculum | Episode 453: task=20 difficulty=expert achieved=True tier_rate=0.26\n", + "17:58:55 | INFO | server.services.curriculum | Episode 454: task=119 difficulty=expert achieved=True tier_rate=0.37\n", + "17:58:55 | INFO | server.services.curriculum | Episode 455: task=128 difficulty=expert achieved=False tier_rate=0.32\n", + "17:58:55 | INFO | server.services.curriculum | Episode 456: task=124 difficulty=expert achieved=True tier_rate=0.42\n", + "17:58:55 | INFO | server.services.curriculum | Task 127 GRADUATED (rate=0.72) — scheduling spaced repetition\n", + "17:58:55 | INFO | server.services.curriculum | Episode 457: task=127 difficulty=expert achieved=True tier_rate=0.51\n", + "17:58:55 | INFO | server.services.curriculum | Episode 458: task=116 difficulty=expert achieved=False tier_rate=0.43\n", + "17:58:55 | INFO | server.services.curriculum | Episode 459: task=115 difficulty=expert achieved=False tier_rate=0.37\n", + "17:58:55 | INFO | server.services.curriculum | Episode 460: task=109 difficulty=expert achieved=False tier_rate=0.31\n", + "17:58:58 | INFO | grpo | [final-grpo] step 33/35 (+213.5s)\n", + "17:58:58 | INFO | grpo | [final-grpo] log step=33 {'loss': 0.1873, 'grad_norm': 0.2613, 'learning_rate': 0.0, 'completion_length': 87.125, 'kl': 0.1585, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 154858.0, 'completions/mean_length': 101.8125, 'completions/min_length': 32.0, 'completions/max_length': 194.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 101.8125, 'completions/min_terminated_length': 32.0, 'completions/max_terminated_length': 194.0, 'rewards/env_reward/mean': 0.3894, 'rewards/env_reward/std': 0.4482, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.8731, 'rewards/length_reward/std': 0.1621, 'reward': 2.2625, 'reward_std': 0.5678, 'frac_reward_zero_std': 0.0, 'epoch': 5.5714}\n", + "18:02:28 | INFO | server.services.curriculum | Episode 461: task=139 difficulty=expert achieved=False tier_rate=0.26\n", + "18:02:28 | INFO | server.services.curriculum | Episode 462: task=122 difficulty=expert achieved=False tier_rate=0.22\n", + "18:02:28 | INFO | server.services.curriculum | Episode 463: task=129 difficulty=expert achieved=False tier_rate=0.19\n", + "18:02:28 | INFO | server.services.curriculum | Episode 464: task=117 difficulty=expert achieved=False tier_rate=0.16\n", + "18:02:28 | INFO | server.services.curriculum | Episode 465: task=134 difficulty=expert achieved=False tier_rate=0.14\n", + "18:02:28 | INFO | server.services.curriculum | Episode 466: task=125 difficulty=expert achieved=False tier_rate=0.12\n", + "18:02:28 | INFO | server.services.curriculum | Episode 467: task=133 difficulty=expert achieved=False tier_rate=0.10\n", + "18:02:28 | INFO | server.services.curriculum | Episode 468: task=126 difficulty=expert achieved=False tier_rate=0.08\n", + "18:02:28 | INFO | server.services.curriculum | Episode 469: task=23 difficulty=expert achieved=False tier_rate=0.07\n", + "18:02:28 | INFO | server.services.curriculum | Episode 470: task=124 difficulty=expert achieved=False tier_rate=0.06\n", + "18:02:28 | INFO | server.services.curriculum | Episode 471: task=20 difficulty=expert achieved=False tier_rate=0.05\n", + "18:02:28 | INFO | server.services.curriculum | Episode 472: task=25 difficulty=expert achieved=False tier_rate=0.04\n", + "18:02:28 | INFO | server.services.curriculum | Episode 473: task=114 difficulty=expert achieved=False tier_rate=0.04\n", + "18:02:28 | INFO | server.services.curriculum | Episode 474: task=135 difficulty=expert achieved=False tier_rate=0.03\n", + "18:02:28 | INFO | server.services.curriculum | Episode 475: task=131 difficulty=expert achieved=False tier_rate=0.03\n", + "18:02:30 | INFO | grpo | [final-grpo] step 34/35 (+212.6s)\n", + "18:02:30 | INFO | grpo | [final-grpo] log step=34 {'loss': -0.2093, 'grad_norm': 0.2516, 'learning_rate': 0.0, 'completion_length': 94.5, 'kl': 0.1341, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 160004.0, 'completions/mean_length': 80.4375, 'completions/min_length': 26.0, 'completions/max_length': 129.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 80.4375, 'completions/min_terminated_length': 26.0, 'completions/max_terminated_length': 129.0, 'rewards/env_reward/mean': 0.2364, 'rewards/env_reward/std': 0.2318, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.9459, 'rewards/length_reward/std': 0.0736, 'reward': 2.1822, 'reward_std': 0.2709, 'frac_reward_zero_std': 0.0, 'epoch': 5.7619}\n", + "18:07:03 | INFO | server.services.curriculum | Episode 476: task=122 difficulty=expert achieved=False tier_rate=0.02\n", + "18:07:03 | INFO | server.services.curriculum | Episode 477: task=25 difficulty=expert achieved=False tier_rate=0.02\n", + "18:07:03 | INFO | server.services.curriculum | Episode 478: task=131 difficulty=expert achieved=False tier_rate=0.02\n", + "18:07:03 | INFO | server.services.curriculum | Episode 479: task=129 difficulty=expert achieved=False tier_rate=0.01\n", + "18:07:03 | INFO | server.services.curriculum | Episode 480: task=115 difficulty=expert achieved=False tier_rate=0.01\n", + "18:07:03 | INFO | server.services.curriculum | Episode 481: task=120 difficulty=expert achieved=False tier_rate=0.01\n", + "18:07:03 | INFO | server.services.curriculum | Episode 482: task=126 difficulty=expert achieved=False tier_rate=0.01\n", + "18:07:03 | INFO | server.services.curriculum | Episode 483: task=117 difficulty=expert achieved=False tier_rate=0.01\n", + "18:07:03 | INFO | server.services.curriculum | Episode 484: task=128 difficulty=expert achieved=False tier_rate=0.01\n", + "18:07:03 | INFO | server.services.curriculum | Episode 485: task=134 difficulty=expert achieved=False tier_rate=0.01\n", + "18:07:03 | INFO | server.services.curriculum | Episode 486: task=23 difficulty=expert achieved=False tier_rate=0.00\n", + "18:07:03 | INFO | server.services.curriculum | Episode 487: task=123 difficulty=expert achieved=False tier_rate=0.00\n", + "18:07:03 | INFO | server.services.curriculum | Task 20 UN-GRADUATED (rate=0.57) — resetting to active\n", + "18:07:03 | INFO | server.services.curriculum | Episode 488: task=20 difficulty=expert achieved=False tier_rate=0.00\n", + "18:07:03 | INFO | server.services.curriculum | Episode 489: task=116 difficulty=expert achieved=False tier_rate=0.00\n", + "18:07:03 | INFO | server.services.curriculum | Episode 490: task=133 difficulty=expert achieved=False tier_rate=0.00\n", + "18:07:03 | INFO | server.services.curriculum | Episode 491: task=125 difficulty=expert achieved=False tier_rate=0.00\n", + "18:07:06 | INFO | grpo | [final-grpo] step 35/35 (+275.5s)\n", + "18:07:06 | INFO | grpo | [final-grpo] log step=35 {'loss': -0.0615, 'grad_norm': 0.2404, 'learning_rate': 0.0, 'completion_length': 74.375, 'kl': 0.126, 'clip_ratio/low_mean': 0.0, 'clip_ratio/low_min': 0.0, 'clip_ratio/high_mean': 0.0, 'clip_ratio/high_max': 0.0, 'clip_ratio/region_mean': 0.0, 'num_tokens': 165202.0, 'completions/mean_length': 83.875, 'completions/min_length': 30.0, 'completions/max_length': 249.0, 'completions/clipped_ratio': 0.0, 'completions/mean_terminated_length': 83.875, 'completions/min_terminated_length': 30.0, 'completions/max_terminated_length': 249.0, 'rewards/env_reward/mean': 0.1922, 'rewards/env_reward/std': 0.1868, 'rewards/format_reward/mean': 1.0, 'rewards/format_reward/std': 0.0, 'rewards/length_reward/mean': 0.932, 'rewards/length_reward/std': 0.123, 'reward': 2.1242, 'reward_std': 0.2548, 'frac_reward_zero_std': 0.0, 'epoch': 5.9524}\n", + "18:07:07 | INFO | grpo | [final-grpo] log step=35 {'train_runtime': 6855.0451, 'train_samples_per_second': 0.082, 'train_steps_per_second': 0.005, 'total_flos': 0.0, 'train_loss': 0.0819, 'epoch': 5.9524}\n", + "18:07:07 | INFO | grpo | [final-grpo] train_end | global_step=35 elapsed=6855.0s\n", + "18:07:08 | INFO | grpo | Final curriculum stats: {'episode_count': 491, 'tier': 'expert', 'tier_episodes': 474, 'tier_success_rate': 0.002, 'graduated_tasks': [110, 119, 127], 'weak_spots': [18, 19, 20, 21, 22, 23, 109, 111, 113, 114, 115, 116, 117, 118, 120, 121, 122, 123, 124, 125, 126, 24, 25, 128, 129, 131, 133, 134, 135, 139], 'skill_profile': {37: 1.0, 33: 0.0, 30: 1.0, 40: 1.0, 39: 0.0, 27: 0.0, 5: 1.0, 31: 1.0, 36: 1.0, 42: 1.0, 32: 1.0, 38: 1.0, 1: 1.0, 35: 1.0, 43: 1.0, 34: 1.0, 44: 1.0, 29: 1.0, 3: 1.0, 0: 1.0, 4: 1.0, 28: 1.0, 41: 1.0, 100: 0.0, 103: 0.0, 97: 0.0, 90: 0.0, 95: 0.0, 91: 0.0, 101: 0.0, 104: 0.0, 105: 0.0, 17: 0.0, 107: 0.0, 108: 0.0, 92: 0.0, 106: 0.0, 111: 0.22, 119: 0.89, 129: 0.0, 121: 0.05, 23: 0.18, 139: 0.27, 124: 0.16, 22: 0.42, 114: 0.0, 134: 0.11, 133: 0.0, 21: 0.39, 123: 0.1, 120: 0.0, 116: 0.0, 122: 0.0, 135: 0.0, 24: 0.0, 128: 0.0, 18: 0.0, 25: 0.0, 127: 0.72, 131: 0.06, 126: 0.0, 110: 0.87, 118: 0.0, 125: 0.0, 113: 0.0, 109: 0.04, 115: 0.0, 20: 0.57, 19: 0.0, 117: 0.0}, 'spaced_rep_due': [110, 119, 127], 'avg_reward_last_10': 0.176}\n", + "18:07:09 | INFO | grpo | Saved GRPO adapter to /content/out/grpo_adapter\n" + ] + } + ], + "source": [ + "import json\n", + "from dataclasses import asdict\n", + "\n", + "\n", + "class CheckpointManager:\n", + " \"\"\"Find the latest `checkpoint-N/` under `root` for safe resume.\"\"\"\n", + "\n", + " def __init__(self, root: Path) -> None:\n", + " self.root = root\n", + "\n", + " def latest(self) -> str | None:\n", + " if not self.root.exists():\n", + " return None\n", + " ckpts = sorted(\n", + " (d for d in self.root.glob(\"checkpoint-*\") if d.is_dir()),\n", + " key=lambda d: int(d.name.split(\"-\")[-1]),\n", + " )\n", + " return str(ckpts[-1]) if ckpts else None\n", + "\n", + "\n", + "FINAL_RUN_DIR = OUT_DIR / \"final_grpo\"\n", + "ckpt_mgr = CheckpointManager(FINAL_RUN_DIR)\n", + "resume_from = ckpt_mgr.latest()\n", + "\n", + "# Make the final-run cell re-runnable after a kernel restart: if `best_cfg` is\n", + "# not in the namespace (Optuna didn't run this session), recover it from the\n", + "# persisted optuna_best.json; if that's missing too, fall back to TRAIN\n", + "# defaults so the run still launches on the sane baseline hparams.\n", + "try:\n", + " best_cfg\n", + "except NameError:\n", + " _best_path = OUT_DIR / \"optuna_best.json\"\n", + " if _best_path.exists():\n", + " _resolved = json.loads(_best_path.read_text())[\"resolved_config\"]\n", + " best_cfg = replace(TRAIN, **{\n", + " k: v for k, v in _resolved.items()\n", + " if k in TrainingConfig.__dataclass_fields__\n", + " })\n", + " log.info(\"Recovered best_cfg from %s\", _best_path)\n", + " else:\n", + " best_cfg = TRAIN\n", + " log.info(\"No Optuna results found; using TRAIN defaults for best_cfg\")\n", + "\n", + "# Master curriculum for the final run — single instance that progresses\n", + "# through tiers as the agent demonstrates mastery. Lives for the whole run.\n", + "FINAL_CURRICULUM = Curriculum(tasks_dir=_tasks_dir)\n", + "# Superset dataset (all tiers). The CurriculumTierSampler (wired in\n", + "# build_trainer) filters indices by FINAL_CURRICULUM.current_difficulty\n", + "# on every yield, so promotion during training takes effect on the very\n", + "# next batch instead of being frozen out by an up-front materialisation.\n", + "FINAL_TRAIN_DS = make_full_curriculum_dataset(_tasks_dir)\n", + "_final_num_samples = int(\n", + " PIPE.final_max_steps\n", + " * best_cfg.per_device_train_batch_size\n", + " * best_cfg.gradient_accumulation_steps\n", + " * 1.2\n", + ")\n", + "final_model, final_tok = load_policy(MODEL, trainable=True)\n", + "\n", + "final_env_r, final_fmt_r, final_len_r = build_reward_funcs(\n", + " ENV_CLIENT, TASK_MAP, FINAL_CURRICULUM,\n", + " model=final_model, tokenizer=final_tok,\n", + ")\n", + "\n", + "final_trainer = build_trainer(\n", + " final_model, final_tok,\n", + " train_ds=FINAL_TRAIN_DS,\n", + " eval_ds=VAL_DS,\n", + " reward_funcs=(final_env_r, final_fmt_r, final_len_r),\n", + " cfg=best_cfg,\n", + " output_dir=str(FINAL_RUN_DIR),\n", + " run_name=\"final-grpo\",\n", + " use_fp16=RT.use_fp16, use_bf16=RT.use_bf16,\n", + " max_steps=PIPE.final_max_steps,\n", + " save_strategy=\"steps\",\n", + " # Skip TRL's mid-training eval — its GRPO prediction_step reshapes\n", + " # rewards as (-1, num_generations) which blows up when eval generates\n", + " # a different completion count per prompt than training. We do full\n", + " # env-reward eval outside TRL via evaluate_single_step anyway.\n", + " eval_strategy=\"no\",\n", + " curriculum=FINAL_CURRICULUM,\n", + " num_samples=_final_num_samples,\n", + ")\n", + "\n", + "if resume_from:\n", + " log.info(\"Resuming GRPO from %s\", resume_from)\n", + "final_trainer.train(resume_from_checkpoint=resume_from)\n", + "\n", + "# Log final curriculum stats so we can see tier progression / mastery counts\n", + "final_stats = FINAL_CURRICULUM.get_stats()\n", + "log.info(\"Final curriculum stats: %s\", final_stats)\n", + "\n", + "# Persist the final LoRA adapter locally before anything else touches VRAM\n", + "adapter_local = OUT_DIR / \"grpo_adapter\"\n", + "final_trainer.model.save_pretrained(str(adapter_local))\n", + "final_tok.save_pretrained(str(adapter_local))\n", + "log.info(\"Saved GRPO adapter to %s\", adapter_local)\n" + ] + }, + { + "cell_type": "markdown", + "id": "09e8f092", + "metadata": { + "id": "09e8f092" + }, + "source": [ + "## 15 · Multi-step evaluation harness\n", + "\n", + "Training was single-step for TRL compatibility; *evaluation* runs full episodes so we can measure:\n", + "\n", + "- per-tier task success\n", + "- hints used per solved task\n", + "- recovery rate after chaos injection\n", + "- drift repair rate\n", + "- steps to solve\n", + "- rollback count (safety)\n", + "- generalization gap (reserve vs train-held-out)\n", + "\n", + "The pattern mirrors [`scripts/grpo_train.py`](https://github.com/UdayKiranPadhy/aws-rl-env/blob/master/scripts/grpo_train.py)'s `run_single_rollout`, but uses `GrpoPool` for 8-way concurrent rollouts so a 100-task eval finishes in ~7 minutes." + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "d18fb6e4", + "metadata": { + "id": "d18fb6e4", + "outputId": "7503d657-b50e-4704-a31a-08a47c0f3c77", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "18:07:19 | INFO | grpo | run_episode defined.\n" + ] + } + ], + "source": [ + "import asyncio\n", + "from collections import defaultdict\n", + "from models import AwsRlAction\n", + "from client import AwsRlEnv\n", + "from scripts.grpo_pool import GrpoPool\n", + "\n", + "\n", + "# Multi-step eval uses a richer prompt that includes command history.\n", + "# Separate from the single-step SYSTEM_PROMPT to avoid shadowing it.\n", + "EVAL_SYSTEM_PROMPT = (\n", + " \"You are an expert AWS SRE agent. You operate a simulated AWS cloud by \"\n", + " \"emitting one AWS CLI command at a time. You will see the task description \"\n", + " \"and the most recent command output.\\n\\n\"\n", + " \"First reason about your next move inside a ... block: use \"\n", + " \"the latest OUTPUT to decide what to do next, pick the AWS service and \"\n", + " \"subcommand, and list the arguments you need. Keep the reasoning brief.\\n\\n\"\n", + " \"After , on a NEW LINE, output EXACTLY ONE AWS CLI command starting \"\n", + " \"with 'aws '. The command line must contain only the command \\u2014 no \"\n", + " \"markdown, no backticks, no quotes around it, and no trailing commentary.\"\n", + ")\n", + "\n", + "\n", + "def build_multi_step_prompt(tokenizer, task: Task,\n", + " history: list[tuple[str, str]]) -> str:\n", + " \"\"\"Assemble chat-style prompt including the last few (cmd, output) turns.\"\"\"\n", + " messages = [\n", + " {\"role\": \"system\", \"content\": EVAL_SYSTEM_PROMPT},\n", + " {\"role\": \"user\", \"content\": f\"TASK: {task.description}\"},\n", + " ]\n", + " for cmd, out in history[-4:]: # last 4 turns fit in 512 tokens\n", + " messages.append({\"role\": \"assistant\", \"content\": cmd})\n", + " messages.append({\"role\": \"user\", \"content\": f\"OUTPUT:\\n{out[:400]}\"})\n", + " return tokenizer.apply_chat_template(\n", + " messages, tokenize=False, add_generation_prompt=True,\n", + " )\n", + "\n", + "\n", + "@dataclass\n", + "class EpisodeResult:\n", + " task_id: int\n", + " tier: str\n", + " is_drift: bool\n", + " achieved: bool\n", + " terminal_reward: float\n", + " steps_taken: int\n", + " hints_used: int\n", + " chaos_occurred: bool\n", + " command_failures: int\n", + "\n", + "\n", + "async def run_episode(env: AwsRlEnv, model, tokenizer,\n", + " task: Task, drift_ids: set[int],\n", + " max_steps: int = 15,\n", + " # Bumped 96 → 512 so per-step generation has room\n", + " # for a block plus the command.\n", + " max_new_tokens: int = 512) -> EpisodeResult:\n", + " \"\"\"Roll one episode against one env session. Sampling temperature is low\n", + " to reflect deployment behaviour rather than training-time exploration.\"\"\"\n", + " device = next(model.parameters()).device\n", + " res = await env.reset(task=task)\n", + " history: list[tuple[str, str]] = []\n", + " steps_taken = 0\n", + " command_failures = 0\n", + " terminal_reward = 0.0\n", + " achieved = False\n", + "\n", + " for _ in range(max_steps):\n", + " steps_taken += 1\n", + " prompt = build_multi_step_prompt(tokenizer, task, history)\n", + " inputs = tokenizer(prompt, return_tensors=\"pt\").to(device)\n", + " with torch.inference_mode():\n", + " ids = model.generate(\n", + " **inputs,\n", + " max_new_tokens=max_new_tokens,\n", + " do_sample=True,\n", + " temperature=0.4,\n", + " top_p=0.9,\n", + " pad_token_id=tokenizer.eos_token_id,\n", + " )\n", + " text = tokenizer.decode(\n", + " ids[0, inputs.input_ids.shape[1]:], skip_special_tokens=True,\n", + " )\n", + " cmd = extract_aws_command(text)\n", + " res = await env.step(AwsRlAction(command=cmd))\n", + " terminal_reward = float(res.reward)\n", + " obs = res.observation\n", + " if not obs.command_success:\n", + " command_failures += 1\n", + " history.append((cmd, obs.command_output or \"\"))\n", + " if obs.task_achieved:\n", + " achieved = True\n", + " if res.done:\n", + " break\n", + "\n", + " # One final /state poll for chaos flag — TrackerState doesn't expose\n", + " # rollback counts, so we skip that metric rather than report zeros.\n", + " try:\n", + " state = await env.state()\n", + " chaos = bool(getattr(state, \"chaos_occurred\", False))\n", + " except Exception:\n", + " chaos = False\n", + "\n", + " return EpisodeResult(\n", + " task_id=int(task.task_id),\n", + " tier=task.difficulty.value,\n", + " is_drift=int(task.task_id) in drift_ids,\n", + " achieved=achieved,\n", + " terminal_reward=terminal_reward,\n", + " steps_taken=steps_taken,\n", + " hints_used=int(getattr(res.observation, \"hints_used\", 0) or 0),\n", + " chaos_occurred=chaos,\n", + " command_failures=command_failures,\n", + " )\n", + "\n", + "\n", + "log.info(\"run_episode defined.\")" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "4f4dacfe", + "metadata": { + "id": "4f4dacfe", + "outputId": "b702b6ec-93bb-4d62-cdaf-d04b6e9f872c", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "18:26:40 | INFO | grpo | evaluate_multi_step defined.\n" + ] + } + ], + "source": [ + "@dataclass\n", + "class RichMetrics:\n", + " \"\"\"All the metrics the hackathon judges care about.\"\"\"\n", + " success_by_tier: dict\n", + " reward_by_tier: dict\n", + " overall_success_rate: float\n", + " overall_reward_mean: float\n", + " hints_per_solved: float\n", + " recovery_rate: float\n", + " drift_repair_rate: float\n", + " steps_to_solve: float\n", + " destructive_fail_rate: float\n", + " n_episodes: int\n", + "\n", + " def as_dict(self) -> dict:\n", + " return asdict(self)\n", + "\n", + "\n", + "def summarize_episodes(results: list[EpisodeResult]) -> RichMetrics:\n", + " \"\"\"Aggregate per-tier and overall stats from a list of EpisodeResults.\n", + "\n", + " Drift detection uses the per-result `is_drift` flag (set from DRIFT_TASK_IDS)\n", + " rather than a tier string — drift tasks live inside the EXPERT tier files.\n", + " \"\"\"\n", + " by_tier: dict[str, list[EpisodeResult]] = defaultdict(list)\n", + " for r in results:\n", + " by_tier[r.tier].append(r)\n", + "\n", + " success_by_tier = {tier: sum(r.achieved for r in xs) / max(1, len(xs))\n", + " for tier, xs in by_tier.items()}\n", + " reward_by_tier = {tier: (sum(r.terminal_reward for r in xs) / max(1, len(xs)))\n", + " for tier, xs in by_tier.items()}\n", + "\n", + " solved = [r for r in results if r.achieved]\n", + " chaos_episodes = [r for r in results if r.chaos_occurred]\n", + " drift_episodes = [r for r in results if r.is_drift]\n", + "\n", + " return RichMetrics(\n", + " success_by_tier=success_by_tier,\n", + " reward_by_tier=reward_by_tier,\n", + " overall_success_rate=len(solved) / max(1, len(results)),\n", + " overall_reward_mean=sum(r.terminal_reward for r in results) / max(1, len(results)),\n", + " hints_per_solved=(sum(r.hints_used for r in solved) / len(solved)) if solved else 0.0,\n", + " recovery_rate=(sum(r.achieved for r in chaos_episodes) / len(chaos_episodes))\n", + " if chaos_episodes else 0.0,\n", + " drift_repair_rate=(sum(r.achieved for r in drift_episodes) / len(drift_episodes))\n", + " if drift_episodes else 0.0,\n", + " steps_to_solve=(sum(r.steps_taken for r in solved) / len(solved)) if solved else 0.0,\n", + " destructive_fail_rate=sum(r.command_failures > 0 for r in results) / max(1, len(results)),\n", + " n_episodes=len(results),\n", + " )\n", + "\n", + "\n", + "async def evaluate_multi_step(base_url: str, task_ids: list[int],\n", + " task_map: dict[int, Task],\n", + " drift_ids: set[int],\n", + " model, tokenizer,\n", + " pool_size: int = 8,\n", + " max_steps: int = 15) -> RichMetrics:\n", + " \"\"\"Run one episode per task_id across `pool_size` concurrent env sessions.\n", + "\n", + " Opens a fresh GrpoPool per chunk. Reusing a single pool across chunks\n", + " fails because the env server / Cloudflare tunnel closes the WebSocket\n", + " (code 1000) once an episode terminates or the connection idles during\n", + " a long generate() call; the next chunk's reset() then raises\n", + " ConnectionClosedOK on a dead socket. Per-chunk pools cost N WebSocket\n", + " handshakes per chunk but keep the eval correct.\n", + " \"\"\"\n", + " results: list[EpisodeResult] = []\n", + " chunks = [task_ids[i:i + pool_size]\n", + " for i in range(0, len(task_ids), pool_size)]\n", + " log.info(\"multi-step eval: %d tasks in %d chunks (pool_size=%d)\",\n", + " len(task_ids), len(chunks), pool_size)\n", + " for ci, chunk in enumerate(chunks, 1):\n", + " async with GrpoPool(base_url=base_url, size=len(chunk)) as pool:\n", + " coros = [run_episode(env, model, tokenizer, task_map[tid],\n", + " drift_ids, max_steps=max_steps)\n", + " for env, tid in zip(pool.envs, chunk)]\n", + " chunk_results = await asyncio.gather(*coros, return_exceptions=True)\n", + " ok = sum(1 for r in chunk_results if isinstance(r, EpisodeResult))\n", + " log.info(\"chunk %d/%d: %d/%d episodes ok\",\n", + " ci, len(chunks), ok, len(chunk))\n", + " for r in chunk_results:\n", + " if isinstance(r, EpisodeResult):\n", + " results.append(r)\n", + " else:\n", + " log.warning(\"[eval] episode raised %s: %s\",\n", + " type(r).__name__, r)\n", + " if not results:\n", + " log.error(\"multi-step eval produced 0 results — env connection problem?\")\n", + " return summarize_episodes(results)\n", + "\n", + "\n", + "def select_eval_task_ids(reserve_ds, drift_ids: set[int], cap: int) -> list[int]:\n", + " \"\"\"Task ids for the multi-step eval: reserve split + every drift task.\"\"\"\n", + " tids = [int(r[\"task_id\"]) for r in reserve_ds][:cap] if reserve_ds else []\n", + " for did in drift_ids:\n", + " if did not in tids:\n", + " tids.append(did)\n", + " return tids\n", + "\n", + "\n", + "log.info(\"evaluate_multi_step defined.\")" + ] + }, + { + "cell_type": "markdown", + "id": "e40d1ce7", + "metadata": { + "id": "e40d1ce7" + }, + "source": [ + "## 16 · Before / after multi-step evaluation\n", + "\n", + "Runs the rich multi-step evaluator once with the **SFT-only** model (baseline) and once with the **final GRPO** model, then prints a delta table. Per-tier and overall comparisons are plotted by the matplotlib cell below.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "69073028", + "metadata": { + "id": "69073028", + "outputId": "673ea74b-90bc-4de1-84c8-2c38bafe1779", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "18:26:42 | INFO | grpo | Multi-step eval on 109 tasks (9 drift).\n", + "18:26:43 | INFO | grpo | Closed ENV_CLIENT; waiting 3s for server to release 8 MiniStack slots.\n", + "18:26:46 | INFO | grpo | Evaluating SFT baseline (multi-step)...\n", + "==((====))== Unsloth 2026.4.8: Fast Qwen2 patching. Transformers: 4.57.6.\n", + " \\\\ /| Tesla T4. Num GPUs = 1. Max memory: 14.563 GB. Platform: Linux.\n", + "O^O/ \\_/ \\ Torch: 2.10.0+cu128. CUDA: 7.5. CUDA Toolkit: 12.8. Triton: 3.6.0\n", + "\\ / Bfloat16 = FALSE. FA [Xformers = 0.0.35. FA2 = False]\n", + " \"-____-\" Free license: http://github.com/unslothai/unsloth\n", + "Unsloth: Fast downloading is enabled - ignore downloading bars which are red colored!\n", + "18:27:05 | INFO | grpo | multi-step eval: 109 tasks in 14 chunks (pool_size=8)\n", + "18:27:05 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:27:05 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:27:06 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:27:50 | INFO | grpo | chunk 1/14: 8/8 episodes ok\n", + "18:27:50 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:27:50 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:27:51 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:29:02 | INFO | grpo | chunk 2/14: 8/8 episodes ok\n", + "18:29:02 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:29:02 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:29:03 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:30:40 | INFO | grpo | chunk 3/14: 8/8 episodes ok\n", + "18:30:40 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:30:40 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:30:41 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:31:13 | INFO | grpo | chunk 4/14: 8/8 episodes ok\n", + "18:31:13 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:31:13 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:31:14 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:31:39 | INFO | grpo | chunk 5/14: 8/8 episodes ok\n", + "18:31:39 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:31:39 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:31:40 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:32:33 | INFO | grpo | chunk 6/14: 8/8 episodes ok\n", + "18:32:33 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:32:33 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:32:34 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:33:21 | INFO | grpo | chunk 7/14: 5/8 episodes ok\n", + "18:33:21 | WARNING | grpo | [eval] episode raised ConnectionClosedError: received 1011 (internal error) keepalive ping timeout; then sent 1011 (internal error) keepalive ping timeout\n", + "18:33:21 | WARNING | grpo | [eval] episode raised ConnectionClosedError: received 1011 (internal error) keepalive ping timeout; then sent 1011 (internal error) keepalive ping timeout\n", + "18:33:21 | WARNING | grpo | [eval] episode raised ConnectionClosedError: received 1011 (internal error) keepalive ping timeout; then sent 1011 (internal error) keepalive ping timeout\n", + "18:33:21 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:33:21 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:33:22 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:34:27 | INFO | grpo | chunk 8/14: 8/8 episodes ok\n", + "18:34:27 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:34:27 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:34:28 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:35:18 | INFO | grpo | chunk 9/14: 8/8 episodes ok\n", + "18:35:18 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:35:18 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:35:19 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:36:00 | INFO | grpo | chunk 10/14: 8/8 episodes ok\n", + "18:36:00 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:36:00 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:36:01 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:36:31 | INFO | grpo | chunk 11/14: 8/8 episodes ok\n", + "18:36:31 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:36:31 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:36:32 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:37:07 | INFO | grpo | chunk 12/14: 8/8 episodes ok\n", + "18:37:07 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:37:07 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:37:08 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:39:41 | INFO | grpo | chunk 13/14: 8/8 episodes ok\n", + "18:39:41 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:39:41 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:39:42 | INFO | scripts.grpo_pool | GrpoPool connected: 5 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:43:13 | INFO | grpo | chunk 14/14: 5/5 episodes ok\n", + "18:43:15 | INFO | grpo | Evaluating GRPO-trained model (multi-step)...\n", + "18:43:15 | INFO | grpo | multi-step eval: 109 tasks in 14 chunks (pool_size=8)\n", + "18:43:15 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:43:15 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:43:17 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:44:18 | INFO | grpo | chunk 1/14: 8/8 episodes ok\n", + "18:44:18 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:44:18 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:44:19 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:46:05 | INFO | grpo | chunk 2/14: 8/8 episodes ok\n", + "18:46:05 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:46:05 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:46:06 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:46:56 | INFO | grpo | chunk 3/14: 8/8 episodes ok\n", + "18:46:56 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:46:56 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:46:57 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:47:48 | INFO | grpo | chunk 4/14: 8/8 episodes ok\n", + "18:47:48 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:47:48 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:47:49 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:48:12 | INFO | grpo | chunk 5/14: 8/8 episodes ok\n", + "18:48:12 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:48:12 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:48:13 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:49:06 | INFO | grpo | chunk 6/14: 8/8 episodes ok\n", + "18:49:06 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:49:06 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:49:07 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:49:48 | INFO | grpo | chunk 7/14: 8/8 episodes ok\n", + "18:49:48 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:49:48 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:49:49 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:50:54 | INFO | grpo | chunk 8/14: 8/8 episodes ok\n", + "18:50:54 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:50:54 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:50:55 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:51:55 | INFO | grpo | chunk 9/14: 8/8 episodes ok\n", + "18:51:55 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:51:55 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:51:56 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:52:41 | INFO | grpo | chunk 10/14: 8/8 episodes ok\n", + "18:52:41 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:52:41 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:52:43 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:53:11 | INFO | grpo | chunk 11/14: 8/8 episodes ok\n", + "18:53:11 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:53:11 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:53:12 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:53:50 | INFO | grpo | chunk 12/14: 8/8 episodes ok\n", + "18:53:50 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:53:50 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:53:51 | INFO | scripts.grpo_pool | GrpoPool connected: 8 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:56:21 | INFO | grpo | chunk 13/14: 8/8 episodes ok\n", + "18:56:21 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:56:21 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:56:22 | INFO | scripts.grpo_pool | GrpoPool connected: 5 sessions against https://sizzing-aws-rl-env.hf.space\n", + "18:58:59 | INFO | grpo | chunk 14/14: 5/5 episodes ok\n", + "18:58:59 | INFO | grpo | SFT vs GRPO deltas: {}\n", + "\n", + "| Metric | SFT baseline | GRPO | Delta |\n", + "|----------------------------|-------------:|------------:|-------:|\n", + "| overall_success_rate | 0.868 | 0.862 | -0.006 |\n", + "| overall_reward_mean | 0.883 | 0.877 | -0.006 |\n", + "| hints_per_solved | 0.000 | 0.000 | +0.000 |\n", + "| recovery_rate | 0.333 | 0.000 | -0.333 |\n", + "| drift_repair_rate | 0.222 | 0.222 | +0.000 |\n", + "| steps_to_solve | 1.446 | 1.553 | +0.108 |\n", + "| destructive_fail_rate | 0.151 | 0.147 | -0.004 |\n", + "| success[beginner] | 0.962 | 1.000 | +0.038 |\n", + "| success[expert] | 0.222 | 0.222 | +0.000 |\n", + "| success[intermediate] | 0.810 | 0.870 | +0.060 |\n", + "| success[warmup] | 0.960 | 0.902 | -0.058 |\n" + ] + } + ], + "source": [ + "def _flatten_metrics(m: RichMetrics, prefix: str) -> dict:\n", + " out = {}\n", + " for k, v in m.as_dict().items():\n", + " if isinstance(v, dict):\n", + " for tier, val in v.items():\n", + " out[f\"{prefix}/{k}/{tier}\"] = val\n", + " else:\n", + " out[f\"{prefix}/{k}\"] = v\n", + " return out\n", + "\n", + "\n", + "def _delta_metrics(before: RichMetrics, after: RichMetrics) -> dict:\n", + " b, a = before.as_dict(), after.as_dict()\n", + " delta: dict[str, float] = {}\n", + " for k in a:\n", + " if isinstance(a[k], dict):\n", + " for tier, v in a[k].items():\n", + " bv = b.get(k, {}).get(tier, 0.0)\n", + " delta[f\"eval/delta_{k}/{tier}\"] = v - bv\n", + " elif isinstance(a[k], (int, float)):\n", + " delta[f\"eval/delta_{k}\"] = a[k] - b[k]\n", + " return delta\n", + "\n", + "\n", + "EVAL_TASK_IDS = select_eval_task_ids(RESERVE_DS, DRIFT_TASK_IDS, cap=PIPE.eval_reserve_cap)\n", + "log.info(\"Multi-step eval on %d tasks (%d drift).\",\n", + " len(EVAL_TASK_IDS),\n", + " sum(1 for t in EVAL_TASK_IDS if t in DRIFT_TASK_IDS))\n", + "\n", + "# Release ENV_CLIENT's 8 WebSocket sessions so the server's MiniStack\n", + "# slots are free for GrpoPool. Without this, every eval episode dies\n", + "# instantly with ConnectionClosedOK / CAPACITY_REACHED because all 8\n", + "# slots are still held by the training reward client.\n", + "try:\n", + " ENV_CLIENT.close()\n", + " log.info(\"Closed ENV_CLIENT; waiting 3s for server to release 8 MiniStack slots.\")\n", + " await asyncio.sleep(3)\n", + "except Exception as e:\n", + " log.warning(\"ENV_CLIENT.close() raised %s: %s\", type(e).__name__, e)\n", + "\n", + "# --- SFT baseline ---\n", + "log.info(\"Evaluating SFT baseline (multi-step)...\")\n", + "sft_model, sft_tok = load_policy(MODEL, trainable=False)\n", + "sft_metrics = await evaluate_multi_step(\n", + " ENV_BASE_URL, EVAL_TASK_IDS, TASK_MAP, DRIFT_TASK_IDS,\n", + " sft_model, sft_tok, pool_size=PIPE.env_pool_size,\n", + ")\n", + "free_model(sft_model); del sft_tok\n", + "gc.collect(); torch.cuda.empty_cache()\n", + "(OUT_DIR / \"baseline_multi_step.json\").write_text(json.dumps(sft_metrics.as_dict(), indent=2))\n", + "\n", + "# --- GRPO after ---\n", + "log.info(\"Evaluating GRPO-trained model (multi-step)...\")\n", + "from unsloth import FastLanguageModel\n", + "if \"final_trainer\" not in globals() or \"final_tok\" not in globals():\n", + " from peft import PeftModel\n", + " _grpo_dir = OUT_DIR / \"grpo_adapter\"\n", + " log.info(\"final_trainer not in globals; reloading GRPO adapter from %s...\", _grpo_dir)\n", + " _base, final_tok = FastLanguageModel.from_pretrained(\n", + " model_name=MODEL.base_model,\n", + " max_seq_length=MODEL.max_seq_length,\n", + " load_in_4bit=True,\n", + " )\n", + " _grpo_model = PeftModel.from_pretrained(_base, str(_grpo_dir), is_trainable=False)\n", + " class _TrainerShim:\n", + " pass\n", + " final_trainer = _TrainerShim()\n", + " final_trainer.model = _grpo_model\n", + "FastLanguageModel.for_inference(final_trainer.model)\n", + "grpo_metrics = await evaluate_multi_step(\n", + " ENV_BASE_URL, EVAL_TASK_IDS, TASK_MAP, DRIFT_TASK_IDS,\n", + " final_trainer.model, final_tok, pool_size=PIPE.env_pool_size,\n", + ")\n", + "(OUT_DIR / \"grpo_multi_step.json\").write_text(json.dumps(grpo_metrics.as_dict(), indent=2))\n", + "\n", + "deltas = _delta_metrics(sft_metrics, grpo_metrics)\n", + "log.info(\"SFT vs GRPO deltas: %s\",\n", + " {k: round(v, 4) for k, v in deltas.items()\n", + " if isinstance(v, (int, float)) and \"/\" not in k})\n", + "\n", + "def _render_row(name, b, a):\n", + " return f\"| {name:<26} | {b:>12.3f} | {a:>12.3f} | {a - b:+.3f} |\"\n", + "\n", + "print(\"\\n| Metric | SFT baseline | GRPO | Delta |\")\n", + "print(\"|----------------------------|-------------:|------------:|-------:|\")\n", + "print(_render_row(\"overall_success_rate\", sft_metrics.overall_success_rate, grpo_metrics.overall_success_rate))\n", + "print(_render_row(\"overall_reward_mean\", sft_metrics.overall_reward_mean, grpo_metrics.overall_reward_mean))\n", + "print(_render_row(\"hints_per_solved\", sft_metrics.hints_per_solved, grpo_metrics.hints_per_solved))\n", + "print(_render_row(\"recovery_rate\", sft_metrics.recovery_rate, grpo_metrics.recovery_rate))\n", + "print(_render_row(\"drift_repair_rate\", sft_metrics.drift_repair_rate, grpo_metrics.drift_repair_rate))\n", + "print(_render_row(\"steps_to_solve\", sft_metrics.steps_to_solve, grpo_metrics.steps_to_solve))\n", + "print(_render_row(\"destructive_fail_rate\", sft_metrics.destructive_fail_rate, grpo_metrics.destructive_fail_rate))\n", + "\n", + "for tier in sorted(set(sft_metrics.success_by_tier) | set(grpo_metrics.success_by_tier)):\n", + " b = sft_metrics.success_by_tier.get(tier, 0.0)\n", + " a = grpo_metrics.success_by_tier.get(tier, 0.0)\n", + " print(_render_row(f\"success[{tier}]\", b, a))" + ] + }, + { + "cell_type": "markdown", + "id": "00a1c8e5", + "metadata": { + "id": "00a1c8e5" + }, + "source": [ + "## 17 · Qualitative rollouts — one task per tier\n", + "\n", + "A small set of showable transcripts (task, generated command, env output, reward). Judges love seeing actual agent behaviour, not just numbers." + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "5c75fb46", + "metadata": { + "id": "5c75fb46", + "outputId": "99f3a5c1-e1d4-4308-c281-8c5f8f69720e", + "colab": { + "base_uri": "https://localhost:8080/" + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "18:59:10 | INFO | server.services.curriculum | Loaded 25 warmup tasks total\n", + "18:59:10 | INFO | server.services.curriculum | Curriculum initialised — starting at warmup with 25 tasks\n", + "18:59:11 | INFO | scripts.grpo_pool | GrpoPool connected: 5 sessions against https://sizzing-aws-rl-env.hf.space\n", + "[\n", + " {\n", + " \"tier\": \"warmup\",\n", + " \"task_id\": 0,\n", + " \"description\": \"List all S3 buckets in the environment.\",\n", + " \"achieved\": false,\n", + " \"terminal_reward\": 0.0,\n", + " \"steps_taken\": 8\n", + " },\n", + " {\n", + " \"tier\": \"beginner\",\n", + " \"task_id\": 6,\n", + " \"description\": \"Create an S3 bucket named 'my-test-bucket'.\",\n", + " \"achieved\": true,\n", + " \"terminal_reward\": 1.0,\n", + " \"steps_taken\": 1\n", + " },\n", + " {\n", + " \"tier\": \"intermediate\",\n", + " \"task_id\": 11,\n", + " \"description\": \"Create an S3 bucket named 'data-pipeline' and upload a file to it.\",\n", + " \"achieved\": true,\n", + " \"terminal_reward\": 1.0,\n", + " \"steps_taken\": 2\n", + " },\n", + " {\n", + " \"tier\": \"advanced\",\n", + " \"task_id\": 15,\n", + " \"description\": \"Create a Lambda function 'processor' with an IAM execution role, then create an SQS queue 'work-items' and configure it as an event source for the Lambda function.\\n\",\n", + " \"achieved\": false,\n", + " \"terminal_reward\": 0.02,\n", + " \"steps_taken\": 8\n", + " },\n", + " {\n", + " \"tier\": \"expert\",\n", + " \"task_id\": 18,\n", + " \"description\": \"SRE Incident: A Lambda function 'order-processor' exists but its IAM role is missing the required SQS permissions. The function's event source mapping to the 'incoming-orders' SQS queue is failing. Diagnose the issue, attach the correct SQS policy to the role, and create the event source mapping.\\n\",\n", + " \"achieved\": false,\n", + " \"terminal_reward\": 0.06,\n", + " \"steps_taken\": 8\n", + " }\n", + "]\n" + ] + }, + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "1347" + ] + }, + "metadata": {}, + "execution_count": 30 + } + ], + "source": [ + "async def qualitative_rollouts(model, tokenizer, task_map: dict[int, Task],\n", + " drift_ids: set[int],\n", + " samples_per_tier: int = 1) -> list[dict]:\n", + " \"\"\"Pick one task per difficulty tier and print a full rollout transcript.\"\"\"\n", + " per_tier: dict[str, list[Task]] = defaultdict(list)\n", + " for t in task_map.values():\n", + " per_tier[t.difficulty.value].append(t)\n", + " chosen: list[Task] = []\n", + " for tier in [\"warmup\", \"beginner\", \"intermediate\", \"advanced\", \"expert\"]:\n", + " if per_tier.get(tier):\n", + " chosen.extend(per_tier[tier][:samples_per_tier])\n", + "\n", + " transcripts = []\n", + " async with GrpoPool(base_url=ENV_BASE_URL, size=min(len(chosen), PIPE.env_pool_size)) as pool:\n", + " for env, task in zip(pool.envs, chosen):\n", + " ep = await run_episode(env, model, tokenizer, task, drift_ids, max_steps=8)\n", + " transcripts.append({\n", + " \"tier\": task.difficulty.value,\n", + " \"task_id\": int(task.task_id),\n", + " \"description\": task.description,\n", + " \"achieved\": ep.achieved,\n", + " \"terminal_reward\": ep.terminal_reward,\n", + " \"steps_taken\": ep.steps_taken,\n", + " })\n", + " return transcripts\n", + "\n", + "\n", + "# Reload the GRPO adapter from disk if final_trainer was purged by an\n", + "# earlier VRAM reclaim (e.g. the Optuna cell). Same fallback as the\n", + "# multi-step eval cell: the final-run cell persists the adapter to\n", + "# OUT_DIR/\"grpo_adapter\", so that's the source of truth.\n", + "if \"final_trainer\" not in globals() or \"final_tok\" not in globals():\n", + " from unsloth import FastLanguageModel\n", + " from peft import PeftModel\n", + " _grpo_dir = OUT_DIR / \"grpo_adapter\"\n", + " print(f\"final_trainer not in globals; reloading GRPO adapter from {_grpo_dir}...\")\n", + " _base, final_tok = FastLanguageModel.from_pretrained(\n", + " model_name=MODEL.base_model,\n", + " max_seq_length=MODEL.max_seq_length,\n", + " load_in_4bit=True,\n", + " )\n", + " _grpo_model = PeftModel.from_pretrained(_base, str(_grpo_dir), is_trainable=False)\n", + " class _TrainerShim:\n", + " pass\n", + " final_trainer = _TrainerShim()\n", + " final_trainer.model = _grpo_model\n", + "\n", + "qual = await qualitative_rollouts(final_trainer.model, final_tok, TASK_MAP, DRIFT_TASK_IDS)\n", + "print(json.dumps(qual, indent=2, default=str))\n", + "(OUT_DIR / \"qualitative_rollouts.json\").write_text(json.dumps(qual, indent=2, default=str))" + ] + }, + { + "cell_type": "markdown", + "id": "graphs-md", + "metadata": { + "id": "graphs-md" + }, + "source": [ + "## 17.5 · Plot training curves and SFT vs GRPO comparison\n", + "\n", + "Emits matplotlib PNGs into `OUT_DIR / \"graphs/\"` (also zipped as `graphs.zip` for\n", + "easy download):\n", + "\n", + "1. `01_optuna_history.png` – per-trial objective + best-so-far.\n", + "2. `02_optuna_hparams.png` – hparam vs. objective scatter (one subplot per knob).\n", + "3. `03_optuna_trial_curves.png` – training loss / reward / reward_std / KL for\n", + " every trial, with the winning trial highlighted.\n", + "4. `04_final_run_curves.png` – same four metrics for the final GRPO run on the\n", + " best Optuna config.\n", + "5. `05_sft_vs_grpo_scalar.png` – scalar comparison (success, reward, recovery,\n", + " drift repair, hints/solved, steps-to-solve, destructive-fail).\n", + "6. `06_success_by_tier.png` / `07_reward_by_tier.png` – per-difficulty-tier\n", + " bars, SFT vs SFT+GRPO.\n", + "\n", + "Each section is guarded so a missing artifact (e.g. Optuna was skipped, or\n", + "multi-step eval hasn\\'t run yet) only skips that plot instead of failing.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "graphs-plot", + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/" + }, + "id": "graphs-plot", + "outputId": "abab8fac-d13a-42e6-edaa-1b8746f8988a" + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + " saved 01_optuna_history.png\n", + " saved 02_optuna_hparams.png\n", + " saved 03_optuna_trial_curves.png\n", + " saved 04_final_run_curves.png\n", + " saved 05_sft_vs_grpo_scalar.png\n", + " saved 06_success_by_tier.png\n", + " saved 07_reward_by_tier.png\n", + "\n", + "Graphs: /content/out/graphs (7 PNGs)\n", + "Zipped: /content/out/graphs.zip\n" + ] + } + ], + "source": [ + "import json\n", + "import math\n", + "import shutil\n", + "from pathlib import Path\n", + "\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "\n", + "GRAPHS_DIR = OUT_DIR / \"graphs\"\n", + "GRAPHS_DIR.mkdir(parents=True, exist_ok=True)\n", + "\n", + "# Canonical tier ordering so bar plots read hardest-to-easiest consistently.\n", + "_TIER_ORDER = [\"warmup\", \"beginner\", \"intermediate\", \"advanced\", \"expert\"]\n", + "\n", + "\n", + "def _tier_key(t: str) -> int:\n", + " return _TIER_ORDER.index(t) if t in _TIER_ORDER else 99\n", + "\n", + "\n", + "def _load_log_history(run_dir: Path) -> list[dict]:\n", + " \"\"\"Prefer a top-level trainer_state.json (written by trial_objective) and\n", + " fall back to the latest checkpoint-N/trainer_state.json (the layout TRL\n", + " uses when save_strategy != \"no\", i.e. the final run).\"\"\"\n", + " top = run_dir / \"trainer_state.json\"\n", + " if top.exists():\n", + " return json.loads(top.read_text()).get(\"log_history\", [])\n", + " ckpts = sorted(\n", + " (d for d in run_dir.glob(\"checkpoint-*\") if d.is_dir()),\n", + " key=lambda d: int(d.name.split(\"-\")[-1]),\n", + " )\n", + " if not ckpts:\n", + " return []\n", + " state_path = ckpts[-1] / \"trainer_state.json\"\n", + " if not state_path.exists():\n", + " return []\n", + " return json.loads(state_path.read_text()).get(\"log_history\", [])\n", + "\n", + "\n", + "def _series(hist: list[dict], key: str) -> tuple[list[int], list[float]]:\n", + " \"\"\"Pull (step, value) pairs for a key from TRL's log_history, skipping\n", + " entries that don't carry it (eval rows only have eval_* keys, etc.).\"\"\"\n", + " xs, ys = [], []\n", + " for row in hist:\n", + " if key in row and isinstance(row[key], (int, float)):\n", + " xs.append(row.get(\"step\", len(xs)))\n", + " ys.append(float(row[key]))\n", + " return xs, ys\n", + "\n", + "\n", + "_saved: list[Path] = []\n", + "\n", + "\n", + "def _save(fig, name: str) -> None:\n", + " out = GRAPHS_DIR / name\n", + " fig.savefig(out, dpi=150, bbox_inches=\"tight\")\n", + " plt.close(fig)\n", + " _saved.append(out)\n", + " print(f\" saved {out.name}\")\n", + "\n", + "\n", + "# ---------- 1) Optuna optimization history ----------\n", + "try:\n", + " _trials = [t for t in study.trials if t.value is not None]\n", + " if not _trials:\n", + " raise RuntimeError(\"no completed Optuna trials\")\n", + " _nums = [t.number for t in _trials]\n", + " _vals = [t.value for t in _trials]\n", + " _best = []\n", + " _cur = -math.inf\n", + " for v in _vals:\n", + " _cur = max(_cur, v)\n", + " _best.append(_cur)\n", + " fig, ax = plt.subplots(figsize=(8, 4))\n", + " ax.plot(_nums, _vals, \"o-\", label=\"trial env_reward_mean\")\n", + " ax.plot(_nums, _best, \"r--\", label=\"best so far\")\n", + " ax.scatter([study.best_trial.number], [study.best_value],\n", + " s=120, facecolors=\"none\", edgecolors=\"red\", linewidths=2,\n", + " label=f\"best (trial {study.best_trial.number})\")\n", + " ax.set_xlabel(\"trial\"); ax.set_ylabel(\"val env_reward_mean\")\n", + " ax.set_title(\"Optuna optimization history\")\n", + " ax.legend(); ax.grid(alpha=0.3)\n", + " _save(fig, \"01_optuna_history.png\")\n", + "except Exception as e:\n", + " print(f\" skipped 01_optuna_history.png: {e}\")\n", + "\n", + "\n", + "# ---------- 2) Hparam vs objective scatter ----------\n", + "try:\n", + " _trials = [t for t in study.trials if t.value is not None]\n", + " if not _trials:\n", + " raise RuntimeError(\"no completed Optuna trials\")\n", + " _params = [\"learning_rate\", \"beta\", \"temperature\"]\n", + " fig, axes = plt.subplots(1, 3, figsize=(13, 4))\n", + " for ax, p in zip(axes.flat, _params):\n", + " xs = [t.params[p] for t in _trials if p in t.params]\n", + " ys = [t.value for t in _trials if p in t.params]\n", + " if not xs:\n", + " ax.set_visible(False); continue\n", + " ax.scatter(xs, ys, s=35)\n", + " # Highlight best trial\n", + " if p in study.best_params:\n", + " ax.scatter([study.best_params[p]], [study.best_value],\n", + " s=120, facecolors=\"none\", edgecolors=\"red\",\n", + " linewidths=2, label=\"best\")\n", + " ax.legend(fontsize=8)\n", + " if p == \"learning_rate\":\n", + " ax.set_xscale(\"log\")\n", + " ax.set_xlabel(p); ax.set_ylabel(\"env_reward_mean\")\n", + " ax.grid(alpha=0.3)\n", + " fig.suptitle(\"Hyperparameter vs objective (Optuna)\")\n", + " fig.tight_layout()\n", + " _save(fig, \"02_optuna_hparams.png\")\n", + "except Exception as e:\n", + " print(f\" skipped 02_optuna_hparams.png: {e}\")\n", + "\n", + "\n", + "# ---------- 3) Per-trial training curves ----------\n", + "try:\n", + " _trials = [t for t in study.trials if t.value is not None]\n", + " if not _trials:\n", + " raise RuntimeError(\"no completed Optuna trials\")\n", + " _metrics = [(\"loss\", \"training loss\"),\n", + " (\"reward\", \"reward mean\"),\n", + " (\"reward_std\", \"reward std (GRPO group)\"),\n", + " (\"kl\", \"KL to reference\")]\n", + " fig, axes = plt.subplots(2, 2, figsize=(13, 8))\n", + " _best_num = study.best_trial.number if study.best_trial else None\n", + " _plotted_any = False\n", + " for ax, (key, title) in zip(axes.flat, _metrics):\n", + " for t in _trials:\n", + " trial_dir = OUT_DIR / f\"optuna/trial-{t.number}\"\n", + " hist = _load_log_history(trial_dir)\n", + " xs, ys = _series(hist, key)\n", + " if not xs:\n", + " continue\n", + " _plotted_any = True\n", + " if t.number == _best_num:\n", + " ax.plot(xs, ys, color=\"tab:red\", lw=2.2,\n", + " label=f\"trial {t.number} (best)\")\n", + " else:\n", + " ax.plot(xs, ys, alpha=0.45, lw=1.2,\n", + " label=f\"trial {t.number}\")\n", + " ax.set_title(title); ax.set_xlabel(\"step\")\n", + " ax.grid(alpha=0.3)\n", + " if not _plotted_any:\n", + " raise RuntimeError(\"no per-trial log_history on disk — re-run \"\n", + " \"Optuna after the trial_objective patch\")\n", + " # One legend for the whole figure\n", + " handles, labels = axes.flat[0].get_legend_handles_labels()\n", + " if handles:\n", + " fig.legend(handles, labels, loc=\"lower center\",\n", + " ncol=min(6, len(handles)), fontsize=8,\n", + " bbox_to_anchor=(0.5, -0.02))\n", + " fig.suptitle(\"Optuna trial training curves\")\n", + " fig.tight_layout(rect=(0, 0.04, 1, 1))\n", + " _save(fig, \"03_optuna_trial_curves.png\")\n", + "except Exception as e:\n", + " print(f\" skipped 03_optuna_trial_curves.png: {e}\")\n", + "\n", + "\n", + "# ---------- 4) Final GRPO run curves ----------\n", + "try:\n", + " hist = _load_log_history(FINAL_RUN_DIR)\n", + " if not hist:\n", + " raise RuntimeError(f\"no log_history under {FINAL_RUN_DIR}\")\n", + " _metrics = [(\"loss\", \"training loss\"),\n", + " (\"reward\", \"reward mean\"),\n", + " (\"reward_std\", \"reward std (GRPO group)\"),\n", + " (\"kl\", \"KL to reference\"),\n", + " (\"learning_rate\", \"learning rate\"),\n", + " (\"completion_length\", \"completion length (tokens)\")]\n", + " fig, axes = plt.subplots(3, 2, figsize=(13, 10))\n", + " for ax, (key, title) in zip(axes.flat, _metrics):\n", + " xs, ys = _series(hist, key)\n", + " if not xs:\n", + " ax.set_visible(False); continue\n", + " ax.plot(xs, ys, color=\"tab:blue\")\n", + " ax.set_title(title); ax.set_xlabel(\"step\")\n", + " ax.grid(alpha=0.3)\n", + " if key == \"learning_rate\":\n", + " ax.set_yscale(\"log\")\n", + " fig.suptitle(\"Final GRPO run — best Optuna config\")\n", + " fig.tight_layout()\n", + " _save(fig, \"04_final_run_curves.png\")\n", + "except Exception as e:\n", + " print(f\" skipped 04_final_run_curves.png: {e}\")\n", + "\n", + "\n", + "# ---------- 5) SFT vs GRPO scalar comparison (multi-step eval) ----------\n", + "try:\n", + " sft = json.loads((OUT_DIR / \"baseline_multi_step.json\").read_text())\n", + " grpo = json.loads((OUT_DIR / \"grpo_multi_step.json\").read_text())\n", + " _keys = [\"overall_success_rate\", \"overall_reward_mean\",\n", + " \"recovery_rate\", \"drift_repair_rate\",\n", + " \"hints_per_solved\", \"steps_to_solve\",\n", + " \"destructive_fail_rate\"]\n", + " x = np.arange(len(_keys))\n", + " fig, ax = plt.subplots(figsize=(12, 5))\n", + " w = 0.38\n", + " sft_vals = [float(sft.get(k, 0.0)) for k in _keys]\n", + " grpo_vals = [float(grpo.get(k, 0.0)) for k in _keys]\n", + " b1 = ax.bar(x - w/2, sft_vals, width=w, label=\"SFT only\", color=\"tab:gray\")\n", + " b2 = ax.bar(x + w/2, grpo_vals, width=w, label=\"SFT + GRPO\", color=\"tab:blue\")\n", + " for bars, vals in ((b1, sft_vals), (b2, grpo_vals)):\n", + " for bar, v in zip(bars, vals):\n", + " ax.text(bar.get_x() + bar.get_width() / 2, v,\n", + " f\"{v:.2f}\", ha=\"center\", va=\"bottom\", fontsize=8)\n", + " ax.set_xticks(x); ax.set_xticklabels(_keys, rotation=25, ha=\"right\")\n", + " ax.set_title(\"Multi-step eval: SFT vs SFT+GRPO\")\n", + " ax.legend(); ax.grid(axis=\"y\", alpha=0.3)\n", + " fig.tight_layout()\n", + " _save(fig, \"05_sft_vs_grpo_scalar.png\")\n", + "except Exception as e:\n", + " print(f\" skipped 05_sft_vs_grpo_scalar.png: {e}\")\n", + "\n", + "\n", + "# ---------- 6/7) Per-tier SFT vs GRPO ----------\n", + "def _per_tier_plot(metric_key: str, ylabel: str, fname: str) -> None:\n", + " try:\n", + " sft = json.loads((OUT_DIR / \"baseline_multi_step.json\").read_text())\n", + " grpo = json.loads((OUT_DIR / \"grpo_multi_step.json\").read_text())\n", + " sft_t = sft.get(metric_key, {}) or {}\n", + " grpo_t = grpo.get(metric_key, {}) or {}\n", + " tiers = sorted(set(sft_t) | set(grpo_t), key=_tier_key)\n", + " if not tiers:\n", + " raise RuntimeError(f\"no tiers in {metric_key}\")\n", + " x = np.arange(len(tiers))\n", + " fig, ax = plt.subplots(figsize=(9, 4.5))\n", + " w = 0.38\n", + " ax.bar(x - w/2, [float(sft_t.get(t, 0.0)) for t in tiers],\n", + " width=w, label=\"SFT only\", color=\"tab:gray\")\n", + " ax.bar(x + w/2, [float(grpo_t.get(t, 0.0)) for t in tiers],\n", + " width=w, label=\"SFT + GRPO\", color=\"tab:blue\")\n", + " ax.set_xticks(x); ax.set_xticklabels(tiers)\n", + " ax.set_title(f\"{metric_key} by tier\")\n", + " ax.set_ylabel(ylabel)\n", + " ax.legend(); ax.grid(axis=\"y\", alpha=0.3)\n", + " fig.tight_layout()\n", + " _save(fig, fname)\n", + " except Exception as e:\n", + " print(f\" skipped {fname}: {e}\")\n", + "\n", + "\n", + "_per_tier_plot(\"success_by_tier\", \"success rate\", \"06_success_by_tier.png\")\n", + "_per_tier_plot(\"reward_by_tier\", \"mean terminal reward\", \"07_reward_by_tier.png\")\n", + "\n", + "\n", + "# ---------- Zip for easy download ----------\n", + "if _saved:\n", + " _zip_base = str(OUT_DIR / \"graphs\")\n", + " _zip_path = shutil.make_archive(_zip_base, \"zip\", root_dir=GRAPHS_DIR)\n", + " print(f\"\\nGraphs: {GRAPHS_DIR} ({len(_saved)} PNGs)\")\n", + " print(f\"Zipped: {_zip_path}\")\n", + "else:\n", + " print(\"\\nNo graphs were produced — every section was skipped.\")\n" + ] + }, + { + "cell_type": "markdown", + "id": "3751583b", + "metadata": { + "id": "3751583b" + }, + "source": [ + "## 18 · Publish the GRPO adapter to a new HF Hub repo\n", + "\n", + "Pushes **only** to `Sizzing/aws-rl-grpo-qwen25coder3b-adapter`. The existing SFT adapter repo `Sizzing/aws-rl-sft-qwen25coder3b-adapter` is never touched — both coexist on Hub so reviewers can load either and compare side by side.\n", + "\n", + "The model card notes the lineage (`base_model = SFT adapter`) so anyone opening the repo on Hub sees immediately that this is a second-stage RL fine-tune." + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "7fbbbdd6", + "metadata": { + "id": "7fbbbdd6", + "outputId": "a62895fb-a8f0-4c62-c77a-0ee2a5791e63", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 308, + "referenced_widgets": [ + "46b9bba731834909914b99d55a2da59d", + "fd1263b4b2d540b5a6a80166c69167a3", + "dd9c86af517f4978af54e3dc45e3b022", + "a4308e4a03a541c38431eaa38f5fc334", + "4351f13bdf114a34b35551c477cbf1ed", + "33cfb692bf9c442d9481c204f94a4c70", + "1e4d6d97d08744ffb9bdfea0ac7355ce", + "7f32887fa2044b5d92ab4a77472f013f", + "e9fbb06afbfd47eab898e5150244dae6", + "4aa1e204bb86413891a0ce71e20c2c9b", + "5cf99dc423964598bcad65bd7af8f7d4", + "bec2b4f29cce4f1085a82823db2b0073", + "3a81ac9c0dfb4c95bb7a97b1490606d9", + "bdd3140586e045a4a484a728e345a95f", + "9a4b10b7e8cc4563a0859a8552e7ed73", + "3b6cbba8bec747acbad7e12f92de3694", + "a7380cd1b08b43e486c91260adba5efe", + "d7b73cdc816e45d78f3771bf98b73899", + "69c5fdb32b844bcf836da6bc9f7cdf47", + "c2948d5555874761a5c45b720c2ed084", + "88c852627f3a4fb0a8a1d1726d9333b0", + "52be3eb253344d549d951b42cd9ce321", + "4a2b386ee0a64e809f34b6e7a3522818", + "a4fb91c546e4496ea8814b01aceab236", + "5e02c1d5070d427494b82d8f0bc3428a", + "8bd8c1e82f054c1497d3647deda9ca12", + "5b10d8b29d784346a1d4947f1711718b", + "493202a8d8d34627a7a57ecdee0fa053", + "507a940c4788478894dfdbecb513389c", + "732702a1f01040ae9e616bd17a61f6a4", + "4e3ad0c2409540c784730101f0776d83", + "039f29287a874456a1d13f61b22deb50", + "c9e9cfde8a8243b392045da4b8aaa55f", + "fc3b7aaf6479452eb741845671e99030", + "d2e71087ced043abad9b917af5ee1137", + "67edaf56a9354569b0af1600082a04b3", + "49e589279da8407dacb922ee2fb97ec3", + "548d50a9465a4555bd06f0cdbf1ad76a", + "d383baec718a4c47b345df191bb1a3de", + "c2530298234545b68a5342a424bb55bc", + "692660feb4b6428c90b3e358dafc9ec6", + "b524bb64d9cb44eb9fba0a5fcab08027", + "9bfac3a984134969af1865e9e3247b3e", + "4ee1326ee8fa442ebccafd7055b9e94d", + "c51561b11eb142f2b92673b9f75480c2", + "aedeac83077c4555bab4d5bf82f8726a", + "5796c6f124e640afa197b2253b62a36d", + "eb164ffe4e9b47769274f144b9e2031c", + "74435e5413084059b4ab842e1289a293", + "0f73f8ba0c204af8a545b1065c2990d8", + "297c55455f7e4894887778c3ec6f2711", + "fe759eb163c44a6ea679da581e82e6f1", + "9877073f10c0451dbcfa43cdc07201c3", + "ab85d65ba3fd4658844b9366022338d8", + "882262dabe9441a899518008bc7100a3", + "95c7b80740ce4522834126e4f7f5b49c", + "ec02ced862304ff2b9595bc051776874", + "aa35b2a3818e4613a6d8a18c5383ef59", + "22af1447c21141a48431f7d429262b1d", + "0b6f3bb5c27844d9bb815d0687b37bfd", + "e14797502f8f496aa6f26da771f7651a", + "eee874569ebf4f5bbd95ac34094f07e1", + "818503f0a2f048d1b67cd190c29cd6d0", + "fcf4f286b3524fdfb4766bbdf28e05be", + "2952ff29012543c3a2b20e2f898a55ad", + "2e54e4b260904f9fabe745935a7437f2", + "788cce98cead47d29ea695a55360a43c", + "cb2aeb717cf84dfaa3d9ca99b45ee968", + "668cbfcd95fe47f9a144de97328129aa", + "349d72fcd4c4485f9719e03752b61fe8", + "46ceb017a2c14b37bb9a7061c5524d1a", + "57f648441a004caca6e6913588e038ba", + "0d0d7df23f8c407eafe46a73d3acc72a", + "dd7fd0f32f044c519f62957617bea80e", + "7246e69bbb244e29847a3378f8c60caa", + "b31cf85620ee44e0ba93500e3d07a1a4", + "a633898377b34182a54b18ce80bd6746", + "cc03a92eb183446996cc113b8403567c", + "e50206c1412144bb8cd9ee76e3aabfbd", + "9e67a0b81c7e47f5a854e38707dcb1a4", + "ed19cea4fb784412b33fdda4bdcda32e", + "f557a171fc6144708debd0a7d6cc6465", + "80b611532eaa43fd9985f591ed6889fc", + "bf34158a130e4a85ba1ca1302af907fd", + "a93a7f0819d948e8a8d72de18634060c", + "328a1f397d8046e59160c6b1544c0ee8", + "98d493b3fcc245deb295dd7a565de85c", + "0c4f462fa39945bd868690367a03f4aa" + ] + } + }, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "README.md: 0.00B [00:00, ?B/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "46b9bba731834909914b99d55a2da59d" + } + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Processing Files (0 / 0) : | | 0.00B / 0.00B " + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "bec2b4f29cce4f1085a82823db2b0073" + } + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "New Data Upload : | | 0.00B / 0.00B " + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "4a2b386ee0a64e809f34b6e7a3522818" + } + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + " ...adapter_model.safetensors: 2%|1 | 563kB / 29.5MB " + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "fc3b7aaf6479452eb741845671e99030" + } + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "README.md: 0.00B [00:00, ?B/s]" + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "c51561b11eb142f2b92673b9f75480c2" + } + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "Processing Files (0 / 0) : | | 0.00B / 0.00B " + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "95c7b80740ce4522834126e4f7f5b49c" + } + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "New Data Upload : | | 0.00B / 0.00B " + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "788cce98cead47d29ea695a55360a43c" + } + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + " ...mp7c5v_5a_/tokenizer.json: 100%|##########| 11.4MB / 11.4MB " + ], + "application/vnd.jupyter.widget-view+json": { + "version_major": 2, + "version_minor": 0, + "model_id": "cc03a92eb183446996cc113b8403567c" + } + }, + "metadata": {} + }, + { + "output_type": "stream", + "name": "stdout", + "text": [ + "Pushed to https://huggingface.co/Sizzing/aws-rl-grpo-qwen25coder3b-adapter\n", + "SFT adapter at Sizzing/aws-rl-sft-qwen25coder3b-adapter untouched — both models available on Hub.\n" + ] + } + ], + "source": [ + "from datetime import datetime, timezone\n", + "\n", + "\n", + "def write_model_card(adapter_dir: Path, model_spec: ModelSpec,\n", + " cfg: TrainingConfig, grpo: RichMetrics, sft: RichMetrics) -> Path:\n", + " \"\"\"Emit a README.md for the pushed repo documenting training recipe + metrics.\"\"\"\n", + " card = f\"\"\"---\n", + "library_name: peft\n", + "base_model: {model_spec.sft_adapter}\n", + "pipeline_tag: text-generation\n", + "tags: [grpo, lora, aws, reinforcement-learning]\n", + "---\n", + "\n", + "# aws-rl-grpo-qwen25coder3b-adapter\n", + "\n", + "GRPO (Group Relative Policy Optimization) LoRA adapter continuing from\n", + "[`{model_spec.sft_adapter}`](https://huggingface.co/{model_spec.sft_adapter}).\n", + "Trained single-step with live AWS RL env rewards; evaluated multi-step.\n", + "\n", + "## How to load\n", + "\n", + "```python\n", + "from unsloth import FastLanguageModel\n", + "from peft import PeftModel\n", + "\n", + "base, tok = FastLanguageModel.from_pretrained(\n", + " \"{model_spec.base_model}\", max_seq_length={model_spec.max_seq_length}, load_in_4bit=True,\n", + ")\n", + "model = PeftModel.from_pretrained(base, \"{model_spec.grpo_adapter}\")\n", + "FastLanguageModel.for_inference(model)\n", + "```\n", + "\n", + "## Training recipe\n", + "\n", + "| Knob | Value |\n", + "|-----------------------|--------------------|\n", + "| learning_rate | {cfg.learning_rate:.2e} |\n", + "| beta (KL coef) | {cfg.beta:.3f} |\n", + "| num_generations (G) | {cfg.num_generations} |\n", + "| temperature | {cfg.temperature:.2f} |\n", + "| max_completion_length | {cfg.max_completion_length} |\n", + "| per-device batch | {cfg.per_device_train_batch_size} x {cfg.gradient_accumulation_steps} accum |\n", + "\n", + "## Multi-step eval (reserve + drift)\n", + "\n", + "| Metric | SFT baseline | GRPO | Delta |\n", + "|-----------------------|-------------:|-------:|--------:|\n", + "| overall_success_rate | {sft.overall_success_rate:.3f} | {grpo.overall_success_rate:.3f} | {grpo.overall_success_rate - sft.overall_success_rate:+.3f} |\n", + "| overall_reward_mean | {sft.overall_reward_mean:.3f} | {grpo.overall_reward_mean:.3f} | {grpo.overall_reward_mean - sft.overall_reward_mean:+.3f} |\n", + "| hints_per_solved | {sft.hints_per_solved:.3f} | {grpo.hints_per_solved:.3f} | {grpo.hints_per_solved - sft.hints_per_solved:+.3f} |\n", + "| recovery_rate | {sft.recovery_rate:.3f} | {grpo.recovery_rate:.3f} | {grpo.recovery_rate - sft.recovery_rate:+.3f} |\n", + "| drift_repair_rate | {sft.drift_repair_rate:.3f} | {grpo.drift_repair_rate:.3f} | {grpo.drift_repair_rate - sft.drift_repair_rate:+.3f} |\n", + "| steps_to_solve | {sft.steps_to_solve:.3f} | {grpo.steps_to_solve:.3f} | {grpo.steps_to_solve - sft.steps_to_solve:+.3f} |\n", + "\n", + "Trained {datetime.now(timezone.utc).isoformat(timespec='minutes')} on {RT.gpu_name}.\n", + "\"\"\"\n", + " card_path = adapter_dir / \"README.md\"\n", + " card_path.write_text(card)\n", + " return card_path\n", + "\n", + "\n", + "# Write card locally, then push both adapter files + card\n", + "adapter_local = OUT_DIR / \"grpo_adapter\"\n", + "write_model_card(adapter_local, MODEL, best_cfg, grpo_metrics, sft_metrics)\n", + "\n", + "commit_msg = f\"GRPO run {datetime.now(timezone.utc).isoformat(timespec='minutes')}\"\n", + "final_trainer.model.push_to_hub(\n", + " MODEL.grpo_adapter, private=True, token=HF_TOKEN, commit_message=commit_msg,\n", + ")\n", + "final_tok.push_to_hub(\n", + " MODEL.grpo_adapter, private=True, token=HF_TOKEN, commit_message=commit_msg,\n", + ")\n", + "HfApi(token=HF_TOKEN).upload_file(\n", + " path_or_fileobj=str(adapter_local / \"README.md\"),\n", + " path_in_repo=\"README.md\",\n", + " repo_id=MODEL.grpo_adapter,\n", + " commit_message=commit_msg,\n", + ")\n", + "print(f\"Pushed to https://huggingface.co/{MODEL.grpo_adapter}\")\n", + "print(f\"SFT adapter at {MODEL.sft_adapter} untouched — both models available on Hub.\")" + ] + }, + { + "cell_type": "markdown", + "id": "62c7435b", + "metadata": { + "id": "62c7435b" + }, + "source": [ + "## 19 · Clean shutdown + artifact bundle\n", + "\n", + "Releases the GPU, tars `OUT_DIR` into a single downloadable archive (Colab `files.download`). Nothing else needs to be killed — the env server is hosted externally.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "ae82230e", + "metadata": { + "id": "ae82230e", + "outputId": "ba084f01-0c7b-444a-8984-a7a0369b0ab8", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 263 + } + }, + "outputs": [ + { + "output_type": "stream", + "name": "stdout", + "text": [ + "19:05:30 | INFO | grpo | Found 10 PNGs in /content/out/graphs:\n", + "19:05:30 | INFO | grpo | 00_optuna_history.png (38 KB)\n", + "19:05:30 | INFO | grpo | 00_optuna_importances.png (39 KB)\n", + "19:05:30 | INFO | grpo | 00_optuna_parallel.png (97 KB)\n", + "19:05:30 | INFO | grpo | 01_optuna_history.png (53 KB)\n", + "19:05:30 | INFO | grpo | 02_optuna_hparams.png (52 KB)\n", + "19:05:30 | INFO | grpo | 03_optuna_trial_curves.png (270 KB)\n", + "19:05:30 | INFO | grpo | 04_final_run_curves.png (254 KB)\n", + "19:05:30 | INFO | grpo | 05_sft_vs_grpo_scalar.png (84 KB)\n", + "19:05:30 | INFO | grpo | 06_success_by_tier.png (33 KB)\n", + "19:05:30 | INFO | grpo | 07_reward_by_tier.png (34 KB)\n", + "19:05:41 | INFO | grpo | Zip bundle: /content/out.zip (122.2 MB)\n", + "19:05:41 | INFO | grpo | HF Hub: SFT=https://huggingface.co/Sizzing/aws-rl-sft-qwen25coder3b-adapter GRPO=https://huggingface.co/Sizzing/aws-rl-grpo-qwen25coder3b-adapter\n" + ] + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "\n", + " async function download(id, filename, size) {\n", + " if (!google.colab.kernel.accessAllowed) {\n", + " return;\n", + " }\n", + " const div = document.createElement('div');\n", + " const label = document.createElement('label');\n", + " label.textContent = `Downloading \"${filename}\": `;\n", + " div.appendChild(label);\n", + " const progress = document.createElement('progress');\n", + " progress.max = size;\n", + " div.appendChild(progress);\n", + " document.body.appendChild(div);\n", + "\n", + " const buffers = [];\n", + " let downloaded = 0;\n", + "\n", + " const channel = await google.colab.kernel.comms.open(id);\n", + " // Send a message to notify the kernel that we're ready.\n", + " channel.send({})\n", + "\n", + " for await (const message of channel.messages) {\n", + " // Send a message to notify the kernel that we're ready.\n", + " channel.send({})\n", + " if (message.buffers) {\n", + " for (const buffer of message.buffers) {\n", + " buffers.push(buffer);\n", + " downloaded += buffer.byteLength;\n", + " progress.value = downloaded;\n", + " }\n", + " }\n", + " }\n", + " const blob = new Blob(buffers, {type: 'application/binary'});\n", + " const a = document.createElement('a');\n", + " a.href = window.URL.createObjectURL(blob);\n", + " a.download = filename;\n", + " div.appendChild(a);\n", + " a.click();\n", + " div.remove();\n", + " }\n", + " " + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "text/plain": [ + "" + ], + "application/javascript": [ + "download(\"download_464556f1-c59e-4dd9-8519-ffe991d7155a\", \"out.zip\", 122164368)" + ] + }, + "metadata": {} + } + ], + "source": [ + "import shutil\n", + "from pathlib import Path\n", + "\n", + "# Verify graphs were exported\n", + "graphs_dir = OUT_DIR / \"graphs\"\n", + "if graphs_dir.exists():\n", + " pngs = sorted(graphs_dir.glob(\"*.png\"))\n", + " log.info(\"Found %d PNGs in %s:\", len(pngs), graphs_dir)\n", + " for p in pngs:\n", + " log.info(\" %s (%d KB)\", p.name, p.stat().st_size // 1024)\n", + "else:\n", + " log.warning(\"No graphs dir at %s — run the matplotlib plot cell first.\", graphs_dir)\n", + "\n", + "# Release GPU\n", + "try:\n", + " free_model(final_trainer)\n", + " del final_trainer, final_model, final_tok\n", + "except Exception:\n", + " pass\n", + "gc.collect(); torch.cuda.empty_cache()\n", + "\n", + "# Build a single zip of OUT_DIR (grpo_adapter, JSON metrics, graphs/, etc.)\n", + "zip_path = shutil.make_archive(\n", + " base_name=str(OUT_DIR.parent / OUT_DIR.name),\n", + " format=\"zip\",\n", + " root_dir=OUT_DIR,\n", + ")\n", + "log.info(\"Zip bundle: %s (%.1f MB)\",\n", + " zip_path, Path(zip_path).stat().st_size / 1e6)\n", + "log.info(\"HF Hub: SFT=https://huggingface.co/%s GRPO=https://huggingface.co/%s\",\n", + " MODEL.sft_adapter, MODEL.grpo_adapter)\n", + "\n", + "if IS_COLAB:\n", + " try:\n", + " from google.colab import files\n", + " files.download(zip_path)\n", + " except Exception as e:\n", + " log.warning(\"Colab auto-download skipped: %s. Download manually from %s\",\n", + " e, zip_path)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "15b65aff", + "metadata": { + "id": "15b65aff" + }, + "outputs": [], + "source": [] + } + ], + "metadata": { + "accelerator": "GPU", + "colab": { + "gpuType": "T4", + "provenance": [] + }, + "kernelspec": { + "display_name": "Python 3", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.7" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "17e4a25f8b0a4293b192beda65e888ab": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_312d279277ea415ba2940bc879e72e5c", + "IPY_MODEL_8f3f631215e146528c4fee4c5cb4a453", + "IPY_MODEL_fa9d568f23674c6e9740955ce8d0dda0" + ], + "layout": "IPY_MODEL_3a9e6d83ca3a48fcb61fbb85df7dfbc2" + } + }, + "312d279277ea415ba2940bc879e72e5c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b6f758d29ec74a49b851eabb537efbab", + "placeholder": "​", + "style": "IPY_MODEL_a38fb4652a5e4b52b9704ba7dc0b7dc5", + "value": "README.md: " + } + }, + "8f3f631215e146528c4fee4c5cb4a453": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_1b41774ddcdb475d9215076cc31d2857", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_693f88f916a6449ca4e6a931fad75dc7", + "value": 1 + } + }, + "fa9d568f23674c6e9740955ce8d0dda0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_780970fdf6434c24b97e97ae738eff4b", + "placeholder": "​", + "style": "IPY_MODEL_5c6f9b2415754d9d956f22ff9eb55d79", + "value": " 4.89k/? [00:00<00:00, 97.6kB/s]" + } + }, + "3a9e6d83ca3a48fcb61fbb85df7dfbc2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b6f758d29ec74a49b851eabb537efbab": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a38fb4652a5e4b52b9704ba7dc0b7dc5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1b41774ddcdb475d9215076cc31d2857": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "693f88f916a6449ca4e6a931fad75dc7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "780970fdf6434c24b97e97ae738eff4b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5c6f9b2415754d9d956f22ff9eb55d79": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "96e4ee7ccd294abc95cdda282ff68217": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_e2fc8e26f04d40f59973c2e9fce8821f", + "IPY_MODEL_a1ee88211ba14bdca07d9dc4862e3780", + "IPY_MODEL_c7195e122f8e49508fa9a8c766e43085" + ], + "layout": "IPY_MODEL_27584397f5d14462bd9bc3932083f044" + } + }, + "e2fc8e26f04d40f59973c2e9fce8821f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a864b9a6bcb44885b956cd4b59ae1f74", + "placeholder": "​", + "style": "IPY_MODEL_d6eae3b5673e4f6197f2fb48601d0661", + "value": "data/train-00000-of-00001.parquet: 100%" + } + }, + "a1ee88211ba14bdca07d9dc4862e3780": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3bad0119c77242e98b525b075996fbd8", + "max": 1923495, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_b04a5d15e84f4cd28130f233e556fd12", + "value": 1923495 + } + }, + "c7195e122f8e49508fa9a8c766e43085": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_880d55cbe923497f95f7575b5e85cfad", + "placeholder": "​", + "style": "IPY_MODEL_aa5b6888b7f84df190935eb5efaf49d9", + "value": " 1.92M/1.92M [00:01<00:00, 9.78MB/s]" + } + }, + "27584397f5d14462bd9bc3932083f044": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a864b9a6bcb44885b956cd4b59ae1f74": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d6eae3b5673e4f6197f2fb48601d0661": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3bad0119c77242e98b525b075996fbd8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b04a5d15e84f4cd28130f233e556fd12": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "880d55cbe923497f95f7575b5e85cfad": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "aa5b6888b7f84df190935eb5efaf49d9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "71e32bfc45574278b0f7f1956cf268bd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_3380c456828945d9ac666617d06740fc", + "IPY_MODEL_404dbe67ed784f069143c973dc845e40", + "IPY_MODEL_4ce611000a534d948d455f92ecee576b" + ], + "layout": "IPY_MODEL_8c96ae914728462fbd9b32fd08cd8187" + } + }, + "3380c456828945d9ac666617d06740fc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9040b30667794322bff110267b8ed9cd", + "placeholder": "​", + "style": "IPY_MODEL_b06a5846c2c04291a99d9627c47bd327", + "value": "data/validation-00000-of-00001.parquet: 100%" + } + }, + "404dbe67ed784f069143c973dc845e40": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_291744bd1f894ca8945f9be975b6e624", + "max": 193593, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a92f2302bd6a4ac5a483b4b21ed157eb", + "value": 193593 + } + }, + "4ce611000a534d948d455f92ecee576b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d95309efa2914257be7eeb1e7ece3fde", + "placeholder": "​", + "style": "IPY_MODEL_2efa16125e694584b6a5438f5f925009", + "value": " 194k/194k [00:00<00:00, 967kB/s]" + } + }, + "8c96ae914728462fbd9b32fd08cd8187": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "9040b30667794322bff110267b8ed9cd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b06a5846c2c04291a99d9627c47bd327": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "291744bd1f894ca8945f9be975b6e624": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a92f2302bd6a4ac5a483b4b21ed157eb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "d95309efa2914257be7eeb1e7ece3fde": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2efa16125e694584b6a5438f5f925009": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "5454a54bf5af4336b3c904f563973fd6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_6d768d2eff3e463cb8d9f51a33a7ca98", + "IPY_MODEL_de2681feaa2e4b52972a37855d2ee8e5", + "IPY_MODEL_d9e8fd4643044efabc576be5be5c4694" + ], + "layout": "IPY_MODEL_177a3f0d07c5494abc3d25acc492f24f" + } + }, + "6d768d2eff3e463cb8d9f51a33a7ca98": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fd24a9a430c8476f8e70f50590541b71", + "placeholder": "​", + "style": "IPY_MODEL_321146c007014d4cacc70d8653036451", + "value": "data/reserve-00000-of-00001.parquet: 100%" + } + }, + "de2681feaa2e4b52972a37855d2ee8e5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_71a8a6f25a9742b19097b59e3d34cbf4", + "max": 260654, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d54e0916ad0e43ceb348fcc06af24717", + "value": 260654 + } + }, + "d9e8fd4643044efabc576be5be5c4694": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_cdb7fb82b1f34c728b08706905c0b411", + "placeholder": "​", + "style": "IPY_MODEL_d0adec364aca47858042a8877918d321", + "value": " 261k/261k [00:01<00:00, 1.29MB/s]" + } + }, + "177a3f0d07c5494abc3d25acc492f24f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fd24a9a430c8476f8e70f50590541b71": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "321146c007014d4cacc70d8653036451": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "71a8a6f25a9742b19097b59e3d34cbf4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d54e0916ad0e43ceb348fcc06af24717": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "cdb7fb82b1f34c728b08706905c0b411": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d0adec364aca47858042a8877918d321": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a04ffa2985424737825292f54a43a9d4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ed3a163a822a461f87deb14ec2d577ed", + "IPY_MODEL_da313ab92bf3493986ffcf338da00bd8", + "IPY_MODEL_19d9a45f1ba642db99e239e0a8fd5bbf" + ], + "layout": "IPY_MODEL_bde264b24d2b4d52bba0980ebc4bece6" + } + }, + "ed3a163a822a461f87deb14ec2d577ed": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5e499677de5043df92f3b5653f81d59b", + "placeholder": "​", + "style": "IPY_MODEL_ca41efa2e37c41789257075279609832", + "value": "Generating train split: 100%" + } + }, + "da313ab92bf3493986ffcf338da00bd8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_79ccc0b15d4f4668801e93f0099665f2", + "max": 1500, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c83934fee9864d9c914153a678593a84", + "value": 1500 + } + }, + "19d9a45f1ba642db99e239e0a8fd5bbf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7f192f04e4e44f0fa7144d7f1fa236ec", + "placeholder": "​", + "style": "IPY_MODEL_4d0b57cf6a1f4509955c32781dad9afd", + "value": " 1500/1500 [00:00<00:00, 22075.83 examples/s]" + } + }, + "bde264b24d2b4d52bba0980ebc4bece6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5e499677de5043df92f3b5653f81d59b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ca41efa2e37c41789257075279609832": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "79ccc0b15d4f4668801e93f0099665f2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c83934fee9864d9c914153a678593a84": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "7f192f04e4e44f0fa7144d7f1fa236ec": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4d0b57cf6a1f4509955c32781dad9afd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f97157719bdf40a88e1730674f621bd9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_6a381c46cd6d48a1aae6c99ab20b21e4", + "IPY_MODEL_7c937e894bd841d489ec031e8be9fe2e", + "IPY_MODEL_d0bd273d343b4963a3fcb3c0a67ff497" + ], + "layout": "IPY_MODEL_6aa5eabdb2d54130b03cfff6d3fcff9a" + } + }, + "6a381c46cd6d48a1aae6c99ab20b21e4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e25dff488fd749b4b35c06704bc51c09", + "placeholder": "​", + "style": "IPY_MODEL_0771f43fb5a14d38b4f6f502a64079d9", + "value": "Generating validation split: 100%" + } + }, + "7c937e894bd841d489ec031e8be9fe2e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e2f519926c564da8bbca7de0b68abd0e", + "max": 150, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c81aa39a8c9441049b863b1257c1a5e8", + "value": 150 + } + }, + "d0bd273d343b4963a3fcb3c0a67ff497": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0546ae7051234b8db6e970a1d3cff61b", + "placeholder": "​", + "style": "IPY_MODEL_8e446f7eafe6440c8d727e6956409446", + "value": " 150/150 [00:00<00:00, 2299.97 examples/s]" + } + }, + "6aa5eabdb2d54130b03cfff6d3fcff9a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e25dff488fd749b4b35c06704bc51c09": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0771f43fb5a14d38b4f6f502a64079d9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "e2f519926c564da8bbca7de0b68abd0e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c81aa39a8c9441049b863b1257c1a5e8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "0546ae7051234b8db6e970a1d3cff61b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8e446f7eafe6440c8d727e6956409446": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "20914c591fc74055bcca0eb8ac4e5926": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_37d9d6c95bba42e8a096cf5275a480fd", + "IPY_MODEL_047c53a5b7e74be68acd1045b2e4e283", + "IPY_MODEL_1fb215d781c545e1b44459499c38ad69" + ], + "layout": "IPY_MODEL_59d71306ba244bfd9f1ec700214964f8" + } + }, + "37d9d6c95bba42e8a096cf5275a480fd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f25fe777177f4969859c68717c8e3e48", + "placeholder": "​", + "style": "IPY_MODEL_8b8345d415254c5f9e1e9fc2d40389d0", + "value": "Generating reserve split: 100%" + } + }, + "047c53a5b7e74be68acd1045b2e4e283": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a5f5680a1d76403799529cd0967ba535", + "max": 200, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_dead8a53066c477a9782b8c7338ac848", + "value": 200 + } + }, + "1fb215d781c545e1b44459499c38ad69": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0c88e7079c654e79b855aa29078a36bc", + "placeholder": "​", + "style": "IPY_MODEL_e753ece3c0c8413c910e36a96ba77b98", + "value": " 200/200 [00:00<00:00, 4656.66 examples/s]" + } + }, + "59d71306ba244bfd9f1ec700214964f8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f25fe777177f4969859c68717c8e3e48": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8b8345d415254c5f9e1e9fc2d40389d0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a5f5680a1d76403799529cd0967ba535": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dead8a53066c477a9782b8c7338ac848": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "0c88e7079c654e79b855aa29078a36bc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e753ece3c0c8413c910e36a96ba77b98": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "90147fec0d48464bbd76deb157226203": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_97dccf77527e4494818ed252eb9e96b6", + "IPY_MODEL_4e7c82ed075a46fa8b9e2a57fea59fc0", + "IPY_MODEL_a58cb1b5661a410fa6abe2b267579295" + ], + "layout": "IPY_MODEL_3dbb2e81f2f4447382e7355d0bd80cce" + } + }, + "97dccf77527e4494818ed252eb9e96b6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b019ce4903714cb3b5a1ffd059d18c6d", + "placeholder": "​", + "style": "IPY_MODEL_0e878c2d72104893a978a30d7ac53f1e", + "value": "Filter: 100%" + } + }, + "4e7c82ed075a46fa8b9e2a57fea59fc0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3c5334f626ca4cb7b54c7ed19ae9da7b", + "max": 150, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_469bcc09c4224d7fb3e7c1d62e87699d", + "value": 150 + } + }, + "a58cb1b5661a410fa6abe2b267579295": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0cfad13926b34df0841d1d163334bad3", + "placeholder": "​", + "style": "IPY_MODEL_1ad2a4de697e4e3e905087ed94b921ba", + "value": " 150/150 [00:00<00:00, 2718.53 examples/s]" + } + }, + "3dbb2e81f2f4447382e7355d0bd80cce": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b019ce4903714cb3b5a1ffd059d18c6d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0e878c2d72104893a978a30d7ac53f1e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3c5334f626ca4cb7b54c7ed19ae9da7b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "469bcc09c4224d7fb3e7c1d62e87699d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "0cfad13926b34df0841d1d163334bad3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1ad2a4de697e4e3e905087ed94b921ba": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a3e8d1e2cd794ec290dc71820af6f24f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_67277d4907ac46b287640fff3a2eee62", + "IPY_MODEL_5b1488d801d64a10bbdc28a9c011d5c3", + "IPY_MODEL_cd3801cce52f41b38ecde5f781bea2b9" + ], + "layout": "IPY_MODEL_e503d1497c2b4af2b52b04113794063d" + } + }, + "67277d4907ac46b287640fff3a2eee62": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ac6e615ab24c4c80b47d60f31fa09430", + "placeholder": "​", + "style": "IPY_MODEL_f8d419e8c75649eba3f4a148da3016d3", + "value": "Map: 100%" + } + }, + "5b1488d801d64a10bbdc28a9c011d5c3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_792f08a4d86f4c849b429487eb286d80", + "max": 20, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_2a194e7be5ed4e00b7adabce5f93e810", + "value": 20 + } + }, + "cd3801cce52f41b38ecde5f781bea2b9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c66c7b3404ca4beb813036e806757136", + "placeholder": "​", + "style": "IPY_MODEL_381d7a2e92de47d5878e71fc2f644024", + "value": " 20/20 [00:00<00:00, 524.31 examples/s]" + } + }, + "e503d1497c2b4af2b52b04113794063d": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ac6e615ab24c4c80b47d60f31fa09430": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f8d419e8c75649eba3f4a148da3016d3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "792f08a4d86f4c849b429487eb286d80": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2a194e7be5ed4e00b7adabce5f93e810": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "c66c7b3404ca4beb813036e806757136": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "381d7a2e92de47d5878e71fc2f644024": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "546dfd22f8c64319aecbcd01ac858cf6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_c5c6b045ea13420393b303f5c7547ee2", + "IPY_MODEL_f44955735e8b451f90b271d6d0b1c405", + "IPY_MODEL_229a210fcb3942458bba7605de6c6b02" + ], + "layout": "IPY_MODEL_11ae5fffb510410e97093de938669e50" + } + }, + "c5c6b045ea13420393b303f5c7547ee2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fb8b4b4e475a4783986bf9c6a54ce21a", + "placeholder": "​", + "style": "IPY_MODEL_4495fed8673a414ab8f9e5a2a8d355b2", + "value": "Filter: 100%" + } + }, + "f44955735e8b451f90b271d6d0b1c405": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_f6254de7f5c34fb0abe37459c559eecd", + "max": 200, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d98452df2c144e7fa197c6bf8c7a84aa", + "value": 200 + } + }, + "229a210fcb3942458bba7605de6c6b02": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a2566c92ce2f4c5ea41f523eaa517091", + "placeholder": "​", + "style": "IPY_MODEL_02772bbc7feb49dbb8427d4c52211b68", + "value": " 200/200 [00:00<00:00, 3002.27 examples/s]" + } + }, + "11ae5fffb510410e97093de938669e50": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "fb8b4b4e475a4783986bf9c6a54ce21a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4495fed8673a414ab8f9e5a2a8d355b2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "f6254de7f5c34fb0abe37459c559eecd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d98452df2c144e7fa197c6bf8c7a84aa": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "a2566c92ce2f4c5ea41f523eaa517091": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "02772bbc7feb49dbb8427d4c52211b68": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "15044ec892644e459b2009de7a74f27d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_659ca47987dc4ee4bcc9575a6f3a5d3a", + "IPY_MODEL_06f127e6780f47cda98a37c538450249", + "IPY_MODEL_2497ba48b5254eedbc94c0fedc50b324" + ], + "layout": "IPY_MODEL_7e977d8fd3f1475fac6b26ec618edf81" + } + }, + "659ca47987dc4ee4bcc9575a6f3a5d3a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d521058b79b848d08dcaf3295c5b6541", + "placeholder": "​", + "style": "IPY_MODEL_ee90c4835dee4529bd4263fa89137ff9", + "value": "Map: 100%" + } + }, + "06f127e6780f47cda98a37c538450249": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9d37f3cc93e54609bb22c9af78552827", + "max": 112, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c3811a5a59cc457ab99516a13e7aa2f4", + "value": 112 + } + }, + "2497ba48b5254eedbc94c0fedc50b324": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ebbcbcad06334b7e896371f5f0b8c8ac", + "placeholder": "​", + "style": "IPY_MODEL_65a4b5d545564dbaa0baea82817ae11f", + "value": " 112/112 [00:00<00:00, 1274.38 examples/s]" + } + }, + "7e977d8fd3f1475fac6b26ec618edf81": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d521058b79b848d08dcaf3295c5b6541": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "ee90c4835dee4529bd4263fa89137ff9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "9d37f3cc93e54609bb22c9af78552827": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c3811a5a59cc457ab99516a13e7aa2f4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "ebbcbcad06334b7e896371f5f0b8c8ac": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "65a4b5d545564dbaa0baea82817ae11f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6f08a4702611494e9331f49a3a117c53": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_2adf38f2dd4f4c68896ab3f124fd2a10", + "IPY_MODEL_118388f7fc3d4d4ba811d43a763e92b4", + "IPY_MODEL_0a657273364b488b802e3c1eb6467ba5" + ], + "layout": "IPY_MODEL_307cbbbd2871496fbca0d986ad54b9ac" + } + }, + "2adf38f2dd4f4c68896ab3f124fd2a10": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c4614ab14e1642dca6f5a4899fae90ef", + "placeholder": "​", + "style": "IPY_MODEL_e1808c94a664458486380230d17039af", + "value": "model.safetensors: 100%" + } + }, + "118388f7fc3d4d4ba811d43a763e92b4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d0161222380b4ec1a8c43d2498423352", + "max": 2054625552, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_8a5e6316093b4a05abe2710ff1d33c5e", + "value": 2054625552 + } + }, + "0a657273364b488b802e3c1eb6467ba5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b959577f9e134fb7bb41c7dd3a441d32", + "placeholder": "​", + "style": "IPY_MODEL_45eee0aa85594ee3a9f19cab1900093d", + "value": " 2.05G/2.05G [00:15<00:00, 156MB/s]" + } + }, + "307cbbbd2871496fbca0d986ad54b9ac": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c4614ab14e1642dca6f5a4899fae90ef": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e1808c94a664458486380230d17039af": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d0161222380b4ec1a8c43d2498423352": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8a5e6316093b4a05abe2710ff1d33c5e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "b959577f9e134fb7bb41c7dd3a441d32": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "45eee0aa85594ee3a9f19cab1900093d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "bcb703307a8246329992c3267cdcb08a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_be412634d9b34d4d94a0807b97de39e2", + "IPY_MODEL_79b86eda52fe4b12a0b54ffaf15cca96", + "IPY_MODEL_f3c926804133410a9059e5cdfeb67cde" + ], + "layout": "IPY_MODEL_1d8f62c4fdf74eeb8bdc830b4af0670c" + } + }, + "be412634d9b34d4d94a0807b97de39e2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_087774b0f7d844438df2aee7ce5fff0b", + "placeholder": "​", + "style": "IPY_MODEL_3f85a045eb424e8c80d9ae09e41acc9b", + "value": "generation_config.json: 100%" + } + }, + "79b86eda52fe4b12a0b54ffaf15cca96": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_dd3eab3700ad450c8080bb5432071f7b", + "max": 266, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_a9db83f0d10b4fd1b4ee3b90d4a7a278", + "value": 266 + } + }, + "f3c926804133410a9059e5cdfeb67cde": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c6eddaca9a3448ee9a25588c279f8e33", + "placeholder": "​", + "style": "IPY_MODEL_5d521ff47a70480f9c8b97cd826bebff", + "value": " 266/266 [00:00<00:00, 22.4kB/s]" + } + }, + "1d8f62c4fdf74eeb8bdc830b4af0670c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "087774b0f7d844438df2aee7ce5fff0b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3f85a045eb424e8c80d9ae09e41acc9b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "dd3eab3700ad450c8080bb5432071f7b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a9db83f0d10b4fd1b4ee3b90d4a7a278": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "c6eddaca9a3448ee9a25588c279f8e33": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5d521ff47a70480f9c8b97cd826bebff": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "ebcb37ad6120423ab909be13bc4d6b84": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_28d61b8e55ff4504a285e9e1ab903089", + "IPY_MODEL_844b6af01fdd4db3812f07a9f0dcc6e0", + "IPY_MODEL_13c198104606425a81c28ef3a0f32242" + ], + "layout": "IPY_MODEL_c13f9ab3802c4d98b8d294809fe46469" + } + }, + "28d61b8e55ff4504a285e9e1ab903089": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5efcbdf41907478a833af69d6def7a49", + "placeholder": "​", + "style": "IPY_MODEL_cfd968bbff354bf88ed711f5a2ce00dd", + "value": "tokenizer_config.json: " + } + }, + "844b6af01fdd4db3812f07a9f0dcc6e0": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a893af26a62542338423ca1a6abbb909", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_d50bf1b19f4245eb848a624107a31d35", + "value": 1 + } + }, + "13c198104606425a81c28ef3a0f32242": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a5ba2b09c1984e71bb50d7729da606ca", + "placeholder": "​", + "style": "IPY_MODEL_83cb6dd3b5da4834b7eceabd5d6fdef6", + "value": " 7.51k/? [00:00<00:00, 670kB/s]" + } + }, + "c13f9ab3802c4d98b8d294809fe46469": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5efcbdf41907478a833af69d6def7a49": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "cfd968bbff354bf88ed711f5a2ce00dd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a893af26a62542338423ca1a6abbb909": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "d50bf1b19f4245eb848a624107a31d35": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "a5ba2b09c1984e71bb50d7729da606ca": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "83cb6dd3b5da4834b7eceabd5d6fdef6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3e38fbdb2f6e48dc955399660dbebdfe": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_a7633c89057946f182f36821c4b0922e", + "IPY_MODEL_95710dea79ec4ecf82d9a8f3cc14085b", + "IPY_MODEL_a1dafa7165424f02bdfb5b2bf4b59645" + ], + "layout": "IPY_MODEL_9f4ac913e08240f4b74eb1eb0f272c9c" + } + }, + "a7633c89057946f182f36821c4b0922e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b77f5bf34be84809a753ea0e5f0f3b77", + "placeholder": "​", + "style": "IPY_MODEL_f74a9bbe540e465080e66ac51e10f1b2", + "value": "vocab.json: " + } + }, + "95710dea79ec4ecf82d9a8f3cc14085b": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_6d71da9ff2fb48bc8c62b6fcb30bcd01", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e78a1c8d4fe64494b51a895f9e122dbb", + "value": 1 + } + }, + "a1dafa7165424f02bdfb5b2bf4b59645": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_c8e70a9813584680b5ed699573e6d970", + "placeholder": "​", + "style": "IPY_MODEL_5059f8e3218f40ee8f240601b270d409", + "value": " 2.78M/? [00:00<00:00, 59.8MB/s]" + } + }, + "9f4ac913e08240f4b74eb1eb0f272c9c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b77f5bf34be84809a753ea0e5f0f3b77": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "f74a9bbe540e465080e66ac51e10f1b2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "6d71da9ff2fb48bc8c62b6fcb30bcd01": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "e78a1c8d4fe64494b51a895f9e122dbb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "c8e70a9813584680b5ed699573e6d970": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5059f8e3218f40ee8f240601b270d409": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c8c63f9906cb43a481fc175377e9e60a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_7646fb6a28b14180940f77fdfc943ce5", + "IPY_MODEL_d8474024afd74bfe8d0ff74f7bc5ea43", + "IPY_MODEL_78148f6b76b34c3ebfdf938adda1d4e9" + ], + "layout": "IPY_MODEL_626d457483f545919a5f79032d9abfe3" + } + }, + "7646fb6a28b14180940f77fdfc943ce5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2390a3cfeafa498585d6003ace58cca2", + "placeholder": "​", + "style": "IPY_MODEL_e51bd69bca6a49ec9f70946a68417d01", + "value": "merges.txt: " + } + }, + "d8474024afd74bfe8d0ff74f7bc5ea43": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3d4a1f40d0da4b64aef61bc8d5d30e14", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_87bfbaf9e43345078ee5bc6d2d709fa3", + "value": 1 + } + }, + "78148f6b76b34c3ebfdf938adda1d4e9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_76a70e18ee6f49d1a8463637f849a74f", + "placeholder": "​", + "style": "IPY_MODEL_8af833fdea064d3a95d3b7c2d0b92ea9", + "value": " 1.67M/? [00:00<00:00, 50.6MB/s]" + } + }, + "626d457483f545919a5f79032d9abfe3": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2390a3cfeafa498585d6003ace58cca2": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e51bd69bca6a49ec9f70946a68417d01": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3d4a1f40d0da4b64aef61bc8d5d30e14": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "87bfbaf9e43345078ee5bc6d2d709fa3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "76a70e18ee6f49d1a8463637f849a74f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "8af833fdea064d3a95d3b7c2d0b92ea9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "1d50a009a977463e9f97635a5c4f2bbb": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_1dc52591ca824509b66a32e5bf4f6648", + "IPY_MODEL_4412b8c647ae4c20801a5c265412e022", + "IPY_MODEL_d4467d98b75c40d699ed4165bb75df6f" + ], + "layout": "IPY_MODEL_43dd31d1dde142fabc248ea37f94c3c9" + } + }, + "1dc52591ca824509b66a32e5bf4f6648": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b754710638044958993eb5bec000fed0", + "placeholder": "​", + "style": "IPY_MODEL_51a672bd7cd24564b8d8ea431d318e59", + "value": "added_tokens.json: 100%" + } + }, + "4412b8c647ae4c20801a5c265412e022": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_80542974d6a84c78a15de58878c18193", + "max": 632, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_0ac221560f904fa98329a17b0b5166a9", + "value": 632 + } + }, + "d4467d98b75c40d699ed4165bb75df6f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_578a784c18e64ee3b6c2d5f671c36b69", + "placeholder": "​", + "style": "IPY_MODEL_cdebf7a618af49e3a0c8c5057c0aeaed", + "value": " 632/632 [00:00<00:00, 37.7kB/s]" + } + }, + "43dd31d1dde142fabc248ea37f94c3c9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b754710638044958993eb5bec000fed0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "51a672bd7cd24564b8d8ea431d318e59": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "80542974d6a84c78a15de58878c18193": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0ac221560f904fa98329a17b0b5166a9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "578a784c18e64ee3b6c2d5f671c36b69": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "cdebf7a618af49e3a0c8c5057c0aeaed": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c989e566fe0942ff8550634b750c1fbf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_73f9006bf8214a0096bfafddabe258d6", + "IPY_MODEL_140220fc61e44bd1bd775c724d3d43d9", + "IPY_MODEL_f30f63c2ac614bcfb2c5fc90200785fa" + ], + "layout": "IPY_MODEL_4b2326ccbab641f78b5e162dee0f75c1" + } + }, + "73f9006bf8214a0096bfafddabe258d6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7fe4b6172dd149819ddf2762b87d37e9", + "placeholder": "​", + "style": "IPY_MODEL_c4b7ed116d494b84a133207912453294", + "value": "special_tokens_map.json: 100%" + } + }, + "140220fc61e44bd1bd775c724d3d43d9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_5f574598039c467fb83aced764c7936a", + "max": 613, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_18ceaac5a73049cf87a1991beae0dfdf", + "value": 613 + } + }, + "f30f63c2ac614bcfb2c5fc90200785fa": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4ff08209c30b4475b4077329df0a50dc", + "placeholder": "​", + "style": "IPY_MODEL_a8c91fffccd149eab9be4887c94a3bc3", + "value": " 613/613 [00:00<00:00, 43.4kB/s]" + } + }, + "4b2326ccbab641f78b5e162dee0f75c1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "7fe4b6172dd149819ddf2762b87d37e9": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c4b7ed116d494b84a133207912453294": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "5f574598039c467fb83aced764c7936a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "18ceaac5a73049cf87a1991beae0dfdf": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "4ff08209c30b4475b4077329df0a50dc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a8c91fffccd149eab9be4887c94a3bc3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "d274ca5e4dc84f4ca7bea1208cb2094f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_51f03a809ced4e299439005861dbebee", + "IPY_MODEL_7340e1e900094ac1aaf4fbf22286a9da", + "IPY_MODEL_1e4e1e42ce174c38bf46c99743aec1a3" + ], + "layout": "IPY_MODEL_fc561191f4cd43d8a975602e3c4593a4" + } + }, + "51f03a809ced4e299439005861dbebee": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_67b8d4f7124141bfa58fbb9cc3633773", + "placeholder": "​", + "style": "IPY_MODEL_a73ce2691f974691af0e5ad183accca5", + "value": "tokenizer.json: " + } + }, + "7340e1e900094ac1aaf4fbf22286a9da": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_aaf8549415914e949d716e50629ebcc6", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_9ee227074084483bb665250eef98c70e", + "value": 1 + } + }, + "1e4e1e42ce174c38bf46c99743aec1a3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_598e07a9cf414c8d9416d57969b654c4", + "placeholder": "​", + "style": "IPY_MODEL_083d9eb499e4470fadda78b6e30ccc7c", + "value": " 7.03M/? [00:00<00:00, 87.3MB/s]" + } + }, + "fc561191f4cd43d8a975602e3c4593a4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "67b8d4f7124141bfa58fbb9cc3633773": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a73ce2691f974691af0e5ad183accca5": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "aaf8549415914e949d716e50629ebcc6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "9ee227074084483bb665250eef98c70e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "598e07a9cf414c8d9416d57969b654c4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "083d9eb499e4470fadda78b6e30ccc7c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a480c0315a1149a696d2064f85213810": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_0a803d22ea0f44e1a87beb30cc5e77e1", + "IPY_MODEL_11722376e3ce45f683cff6a5f6e78506", + "IPY_MODEL_5d11b2d362b54ae29a2fd907a3c21c38" + ], + "layout": "IPY_MODEL_8215e6b72df4433fbba64e75feab0f94" + } + }, + "0a803d22ea0f44e1a87beb30cc5e77e1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_06be388f07064b21b25deeb7a53dda81", + "placeholder": "​", + "style": "IPY_MODEL_3e295a5c888642ac8e3fd245a8a97a45", + "value": "adapter_config.json: " + } + }, + "11722376e3ce45f683cff6a5f6e78506": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_3a2ac1f4812449a0b4259e7b4f947033", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_129041f3428e4d828b4a97132fb8baa2", + "value": 1 + } + }, + "5d11b2d362b54ae29a2fd907a3c21c38": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d91bc462a3a24c1b831ea1643515ab97", + "placeholder": "​", + "style": "IPY_MODEL_90c96b4ed8b04448bff93459a933bfd8", + "value": " 1.23k/? [00:00<00:00, 108kB/s]" + } + }, + "8215e6b72df4433fbba64e75feab0f94": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "06be388f07064b21b25deeb7a53dda81": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "3e295a5c888642ac8e3fd245a8a97a45": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "3a2ac1f4812449a0b4259e7b4f947033": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "129041f3428e4d828b4a97132fb8baa2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "d91bc462a3a24c1b831ea1643515ab97": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "90c96b4ed8b04448bff93459a933bfd8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a35302dc34af43428820d9cac53b82ad": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_74411d1cf20d443a812eb988d8166fd7", + "IPY_MODEL_d1ed9ce40bde41b5bcb75dfd51e28b91", + "IPY_MODEL_1da5f8f77f67429cb81ffc2bc53c3b23" + ], + "layout": "IPY_MODEL_70ae6a670fe04c2698d44c4bea2789b1" + } + }, + "74411d1cf20d443a812eb988d8166fd7": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_dabe8e2299284bbb8433ad7175694af6", + "placeholder": "​", + "style": "IPY_MODEL_30e8681cc91d43068ad37853fcec6b5a", + "value": "adapter_model.safetensors: 100%" + } + }, + "d1ed9ce40bde41b5bcb75dfd51e28b91": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_57da93e71ec144cba2bb2c3fe97880d6", + "max": 14783936, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_278b869a2efb4f449ef6f37477882234", + "value": 14783936 + } + }, + "1da5f8f77f67429cb81ffc2bc53c3b23": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_dcf32037f343407a90ee026a51078efe", + "placeholder": "​", + "style": "IPY_MODEL_772555eaceeb44f9a94ef4b79a2b27e6", + "value": " 14.8M/14.8M [00:00<00:00, 73.7MB/s]" + } + }, + "70ae6a670fe04c2698d44c4bea2789b1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "dabe8e2299284bbb8433ad7175694af6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "30e8681cc91d43068ad37853fcec6b5a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "57da93e71ec144cba2bb2c3fe97880d6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "278b869a2efb4f449ef6f37477882234": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "dcf32037f343407a90ee026a51078efe": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "772555eaceeb44f9a94ef4b79a2b27e6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "46b9bba731834909914b99d55a2da59d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_fd1263b4b2d540b5a6a80166c69167a3", + "IPY_MODEL_dd9c86af517f4978af54e3dc45e3b022", + "IPY_MODEL_a4308e4a03a541c38431eaa38f5fc334" + ], + "layout": "IPY_MODEL_4351f13bdf114a34b35551c477cbf1ed" + } + }, + "fd1263b4b2d540b5a6a80166c69167a3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_33cfb692bf9c442d9481c204f94a4c70", + "placeholder": "​", + "style": "IPY_MODEL_1e4d6d97d08744ffb9bdfea0ac7355ce", + "value": "README.md: " + } + }, + "dd9c86af517f4978af54e3dc45e3b022": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_7f32887fa2044b5d92ab4a77472f013f", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_e9fbb06afbfd47eab898e5150244dae6", + "value": 1 + } + }, + "a4308e4a03a541c38431eaa38f5fc334": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_4aa1e204bb86413891a0ce71e20c2c9b", + "placeholder": "​", + "style": "IPY_MODEL_5cf99dc423964598bcad65bd7af8f7d4", + "value": " 1.81k/? [00:00<00:00, 144kB/s]" + } + }, + "4351f13bdf114a34b35551c477cbf1ed": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "33cfb692bf9c442d9481c204f94a4c70": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "1e4d6d97d08744ffb9bdfea0ac7355ce": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "7f32887fa2044b5d92ab4a77472f013f": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "e9fbb06afbfd47eab898e5150244dae6": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "4aa1e204bb86413891a0ce71e20c2c9b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "5cf99dc423964598bcad65bd7af8f7d4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "bec2b4f29cce4f1085a82823db2b0073": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_3a81ac9c0dfb4c95bb7a97b1490606d9", + "IPY_MODEL_bdd3140586e045a4a484a728e345a95f", + "IPY_MODEL_9a4b10b7e8cc4563a0859a8552e7ed73" + ], + "layout": "IPY_MODEL_3b6cbba8bec747acbad7e12f92de3694" + } + }, + "3a81ac9c0dfb4c95bb7a97b1490606d9": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a7380cd1b08b43e486c91260adba5efe", + "placeholder": "​", + "style": "IPY_MODEL_d7b73cdc816e45d78f3771bf98b73899", + "value": "Processing Files (1 / 1)      : 100%" + } + }, + "bdd3140586e045a4a484a728e345a95f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_69c5fdb32b844bcf836da6bc9f7cdf47", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_c2948d5555874761a5c45b720c2ed084", + "value": 1 + } + }, + "9a4b10b7e8cc4563a0859a8552e7ed73": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_88c852627f3a4fb0a8a1d1726d9333b0", + "placeholder": "​", + "style": "IPY_MODEL_52be3eb253344d549d951b42cd9ce321", + "value": " 29.5MB / 29.5MB, 4.22MB/s  " + } + }, + "3b6cbba8bec747acbad7e12f92de3694": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a7380cd1b08b43e486c91260adba5efe": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d7b73cdc816e45d78f3771bf98b73899": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "69c5fdb32b844bcf836da6bc9f7cdf47": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "c2948d5555874761a5c45b720c2ed084": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "88c852627f3a4fb0a8a1d1726d9333b0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "52be3eb253344d549d951b42cd9ce321": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "4a2b386ee0a64e809f34b6e7a3522818": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_a4fb91c546e4496ea8814b01aceab236", + "IPY_MODEL_5e02c1d5070d427494b82d8f0bc3428a", + "IPY_MODEL_8bd8c1e82f054c1497d3647deda9ca12" + ], + "layout": "IPY_MODEL_5b10d8b29d784346a1d4947f1711718b" + } + }, + "a4fb91c546e4496ea8814b01aceab236": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_493202a8d8d34627a7a57ecdee0fa053", + "placeholder": "​", + "style": "IPY_MODEL_507a940c4788478894dfdbecb513389c", + "value": "New Data Upload               : 100%" + } + }, + "5e02c1d5070d427494b82d8f0bc3428a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_732702a1f01040ae9e616bd17a61f6a4", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_4e3ad0c2409540c784730101f0776d83", + "value": 1 + } + }, + "8bd8c1e82f054c1497d3647deda9ca12": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_039f29287a874456a1d13f61b22deb50", + "placeholder": "​", + "style": "IPY_MODEL_c9e9cfde8a8243b392045da4b8aaa55f", + "value": " 29.5MB / 29.5MB, 4.22MB/s  " + } + }, + "5b10d8b29d784346a1d4947f1711718b": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "493202a8d8d34627a7a57ecdee0fa053": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "507a940c4788478894dfdbecb513389c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "732702a1f01040ae9e616bd17a61f6a4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "4e3ad0c2409540c784730101f0776d83": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "039f29287a874456a1d13f61b22deb50": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c9e9cfde8a8243b392045da4b8aaa55f": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "fc3b7aaf6479452eb741845671e99030": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_d2e71087ced043abad9b917af5ee1137", + "IPY_MODEL_67edaf56a9354569b0af1600082a04b3", + "IPY_MODEL_49e589279da8407dacb922ee2fb97ec3" + ], + "layout": "IPY_MODEL_548d50a9465a4555bd06f0cdbf1ad76a" + } + }, + "d2e71087ced043abad9b917af5ee1137": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_d383baec718a4c47b345df191bb1a3de", + "placeholder": "​", + "style": "IPY_MODEL_c2530298234545b68a5342a424bb55bc", + "value": "  ...adapter_model.safetensors: 100%" + } + }, + "67edaf56a9354569b0af1600082a04b3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_692660feb4b6428c90b3e358dafc9ec6", + "max": 29529752, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_b524bb64d9cb44eb9fba0a5fcab08027", + "value": 29529752 + } + }, + "49e589279da8407dacb922ee2fb97ec3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_9bfac3a984134969af1865e9e3247b3e", + "placeholder": "​", + "style": "IPY_MODEL_4ee1326ee8fa442ebccafd7055b9e94d", + "value": " 29.5MB / 29.5MB            " + } + }, + "548d50a9465a4555bd06f0cdbf1ad76a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "d383baec718a4c47b345df191bb1a3de": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "c2530298234545b68a5342a424bb55bc": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "692660feb4b6428c90b3e358dafc9ec6": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "b524bb64d9cb44eb9fba0a5fcab08027": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "9bfac3a984134969af1865e9e3247b3e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "4ee1326ee8fa442ebccafd7055b9e94d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "c51561b11eb142f2b92673b9f75480c2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_aedeac83077c4555bab4d5bf82f8726a", + "IPY_MODEL_5796c6f124e640afa197b2253b62a36d", + "IPY_MODEL_eb164ffe4e9b47769274f144b9e2031c" + ], + "layout": "IPY_MODEL_74435e5413084059b4ab842e1289a293" + } + }, + "aedeac83077c4555bab4d5bf82f8726a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_0f73f8ba0c204af8a545b1065c2990d8", + "placeholder": "​", + "style": "IPY_MODEL_297c55455f7e4894887778c3ec6f2711", + "value": "README.md: " + } + }, + "5796c6f124e640afa197b2253b62a36d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_fe759eb163c44a6ea679da581e82e6f1", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_9877073f10c0451dbcfa43cdc07201c3", + "value": 1 + } + }, + "eb164ffe4e9b47769274f144b9e2031c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_ab85d65ba3fd4658844b9366022338d8", + "placeholder": "​", + "style": "IPY_MODEL_882262dabe9441a899518008bc7100a3", + "value": " 1.81k/? [00:00<00:00, 162kB/s]" + } + }, + "74435e5413084059b4ab842e1289a293": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0f73f8ba0c204af8a545b1065c2990d8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "297c55455f7e4894887778c3ec6f2711": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "fe759eb163c44a6ea679da581e82e6f1": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "9877073f10c0451dbcfa43cdc07201c3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "ab85d65ba3fd4658844b9366022338d8": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "882262dabe9441a899518008bc7100a3": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "95c7b80740ce4522834126e4f7f5b49c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_ec02ced862304ff2b9595bc051776874", + "IPY_MODEL_aa35b2a3818e4613a6d8a18c5383ef59", + "IPY_MODEL_22af1447c21141a48431f7d429262b1d" + ], + "layout": "IPY_MODEL_0b6f3bb5c27844d9bb815d0687b37bfd" + } + }, + "ec02ced862304ff2b9595bc051776874": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_e14797502f8f496aa6f26da771f7651a", + "placeholder": "​", + "style": "IPY_MODEL_eee874569ebf4f5bbd95ac34094f07e1", + "value": "Processing Files (1 / 1)      : 100%" + } + }, + "aa35b2a3818e4613a6d8a18c5383ef59": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_818503f0a2f048d1b67cd190c29cd6d0", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_fcf4f286b3524fdfb4766bbdf28e05be", + "value": 1 + } + }, + "22af1447c21141a48431f7d429262b1d": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_2952ff29012543c3a2b20e2f898a55ad", + "placeholder": "​", + "style": "IPY_MODEL_2e54e4b260904f9fabe745935a7437f2", + "value": " 11.4MB / 11.4MB, 7.14MB/s  " + } + }, + "0b6f3bb5c27844d9bb815d0687b37bfd": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "e14797502f8f496aa6f26da771f7651a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "eee874569ebf4f5bbd95ac34094f07e1": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "818503f0a2f048d1b67cd190c29cd6d0": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "fcf4f286b3524fdfb4766bbdf28e05be": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "2952ff29012543c3a2b20e2f898a55ad": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "2e54e4b260904f9fabe745935a7437f2": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "788cce98cead47d29ea695a55360a43c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_cb2aeb717cf84dfaa3d9ca99b45ee968", + "IPY_MODEL_668cbfcd95fe47f9a144de97328129aa", + "IPY_MODEL_349d72fcd4c4485f9719e03752b61fe8" + ], + "layout": "IPY_MODEL_46ceb017a2c14b37bb9a7061c5524d1a" + } + }, + "cb2aeb717cf84dfaa3d9ca99b45ee968": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_57f648441a004caca6e6913588e038ba", + "placeholder": "​", + "style": "IPY_MODEL_0d0d7df23f8c407eafe46a73d3acc72a", + "value": "New Data Upload               : " + } + }, + "668cbfcd95fe47f9a144de97328129aa": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_dd7fd0f32f044c519f62957617bea80e", + "max": 1, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_7246e69bbb244e29847a3378f8c60caa", + "value": 0 + } + }, + "349d72fcd4c4485f9719e03752b61fe8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_b31cf85620ee44e0ba93500e3d07a1a4", + "placeholder": "​", + "style": "IPY_MODEL_a633898377b34182a54b18ce80bd6746", + "value": "  0.00B /  0.00B,  0.00B/s  " + } + }, + "46ceb017a2c14b37bb9a7061c5524d1a": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "57f648441a004caca6e6913588e038ba": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0d0d7df23f8c407eafe46a73d3acc72a": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "dd7fd0f32f044c519f62957617bea80e": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": "20px" + } + }, + "7246e69bbb244e29847a3378f8c60caa": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "b31cf85620ee44e0ba93500e3d07a1a4": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "a633898377b34182a54b18ce80bd6746": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "cc03a92eb183446996cc113b8403567c": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HBoxModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HBoxModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HBoxView", + "box_style": "", + "children": [ + "IPY_MODEL_e50206c1412144bb8cd9ee76e3aabfbd", + "IPY_MODEL_9e67a0b81c7e47f5a854e38707dcb1a4", + "IPY_MODEL_ed19cea4fb784412b33fdda4bdcda32e" + ], + "layout": "IPY_MODEL_f557a171fc6144708debd0a7d6cc6465" + } + }, + "e50206c1412144bb8cd9ee76e3aabfbd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_80b611532eaa43fd9985f591ed6889fc", + "placeholder": "​", + "style": "IPY_MODEL_bf34158a130e4a85ba1ca1302af907fd", + "value": "  ...mp7c5v_5a_/tokenizer.json: 100%" + } + }, + "9e67a0b81c7e47f5a854e38707dcb1a4": { + "model_module": "@jupyter-widgets/controls", + "model_name": "FloatProgressModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "FloatProgressModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "ProgressView", + "bar_style": "success", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_a93a7f0819d948e8a8d72de18634060c", + "max": 11422086, + "min": 0, + "orientation": "horizontal", + "style": "IPY_MODEL_328a1f397d8046e59160c6b1544c0ee8", + "value": 11422086 + } + }, + "ed19cea4fb784412b33fdda4bdcda32e": { + "model_module": "@jupyter-widgets/controls", + "model_name": "HTMLModel", + "model_module_version": "1.5.0", + "state": { + "_dom_classes": [], + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "HTMLModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/controls", + "_view_module_version": "1.5.0", + "_view_name": "HTMLView", + "description": "", + "description_tooltip": null, + "layout": "IPY_MODEL_98d493b3fcc245deb295dd7a565de85c", + "placeholder": "​", + "style": "IPY_MODEL_0c4f462fa39945bd868690367a03f4aa", + "value": " 11.4MB / 11.4MB            " + } + }, + "f557a171fc6144708debd0a7d6cc6465": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "80b611532eaa43fd9985f591ed6889fc": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "bf34158a130e4a85ba1ca1302af907fd": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + }, + "a93a7f0819d948e8a8d72de18634060c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "328a1f397d8046e59160c6b1544c0ee8": { + "model_module": "@jupyter-widgets/controls", + "model_name": "ProgressStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "ProgressStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "bar_color": null, + "description_width": "" + } + }, + "98d493b3fcc245deb295dd7a565de85c": { + "model_module": "@jupyter-widgets/base", + "model_name": "LayoutModel", + "model_module_version": "1.2.0", + "state": { + "_model_module": "@jupyter-widgets/base", + "_model_module_version": "1.2.0", + "_model_name": "LayoutModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "LayoutView", + "align_content": null, + "align_items": null, + "align_self": null, + "border": null, + "bottom": null, + "display": null, + "flex": null, + "flex_flow": null, + "grid_area": null, + "grid_auto_columns": null, + "grid_auto_flow": null, + "grid_auto_rows": null, + "grid_column": null, + "grid_gap": null, + "grid_row": null, + "grid_template_areas": null, + "grid_template_columns": null, + "grid_template_rows": null, + "height": null, + "justify_content": null, + "justify_items": null, + "left": null, + "margin": null, + "max_height": null, + "max_width": null, + "min_height": null, + "min_width": null, + "object_fit": null, + "object_position": null, + "order": null, + "overflow": null, + "overflow_x": null, + "overflow_y": null, + "padding": null, + "right": null, + "top": null, + "visibility": null, + "width": null + } + }, + "0c4f462fa39945bd868690367a03f4aa": { + "model_module": "@jupyter-widgets/controls", + "model_name": "DescriptionStyleModel", + "model_module_version": "1.5.0", + "state": { + "_model_module": "@jupyter-widgets/controls", + "_model_module_version": "1.5.0", + "_model_name": "DescriptionStyleModel", + "_view_count": null, + "_view_module": "@jupyter-widgets/base", + "_view_module_version": "1.2.0", + "_view_name": "StyleView", + "description_width": "" + } + } + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file diff --git a/uv.lock b/uv.lock index 5ebfa927deb5bcb986105c5e152c9ce485d43b52..4fb1f9800442ca2a1f3549ffe0a9ecdff30499d7 100644 --- a/uv.lock +++ b/uv.lock @@ -7,6 +7,24 @@ resolution-markers = [ "sys_platform != 'emscripten' and sys_platform != 'win32'", ] +[[package]] +name = "accelerate" +version = "1.13.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyyaml" }, + { name = "safetensors" }, + { name = "torch" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/14/787e5498cd062640f0f3d92ef4ae4063174f76f9afd29d13fc52a319daae/accelerate-1.13.0.tar.gz", hash = "sha256:d631b4e0f5b3de4aff2d7e9e6857d164810dfc3237d54d017f075122d057b236", size = 402835, upload-time = "2026-03-04T19:34:12.359Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/46/02ac5e262d4af18054b3e922b2baedbb2a03289ee792162de60a865defc5/accelerate-1.13.0-py3-none-any.whl", hash = "sha256:cf1a3efb96c18f7b152eb0fa7490f3710b19c3f395699358f08decca2b8b62e0", size = 383744, upload-time = "2026-03-04T19:34:10.313Z" }, +] + [[package]] name = "aiofile" version = "3.9.0" @@ -84,6 +102,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, ] +[[package]] +name = "alembic" +version = "1.18.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mako" }, + { name = "sqlalchemy" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/94/13/8b084e0f2efb0275a1d534838844926f798bd766566b1375174e2448cd31/alembic-1.18.4.tar.gz", hash = "sha256:cb6e1fd84b6174ab8dbb2329f86d631ba9559dd78df550b57804d607672cedbc", size = 2056725, upload-time = "2026-02-10T16:00:47.195Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/29/6533c317b74f707ea28f8d633734dbda2119bbadfc61b2f3640ba835d0f7/alembic-1.18.4-py3-none-any.whl", hash = "sha256:a5ed4adcf6d8a4cb575f3d759f071b03cd6e5c7618eb796cb52497be25bfe19a", size = 263893, upload-time = "2026-02-10T16:00:49.997Z" }, +] + [[package]] name = "annotated-doc" version = "0.0.4" @@ -240,6 +272,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721, upload-time = "2025-11-30T15:08:24.087Z" }, ] +[[package]] +name = "bitsandbytes" +version = "0.49.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "packaging" }, + { name = "torch" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/7d/f1fe0992334b18cd8494f89aeec1dcc674635584fcd9f115784fea3a1d05/bitsandbytes-0.49.2-py3-none-macosx_14_0_arm64.whl", hash = "sha256:87be5975edeac5396d699ecbc39dfc47cf2c026daaf2d5852a94368611a6823f", size = 131940, upload-time = "2026-02-16T21:26:04.572Z" }, + { url = "https://files.pythonhosted.org/packages/29/71/acff7af06c818664aa87ff73e17a52c7788ad746b72aea09d3cb8e424348/bitsandbytes-0.49.2-py3-none-manylinux_2_24_aarch64.whl", hash = "sha256:2fc0830c5f7169be36e60e11f2be067c8f812dfcb829801a8703735842450750", size = 31442815, upload-time = "2026-02-16T21:26:06.783Z" }, + { url = "https://files.pythonhosted.org/packages/19/57/3443d6f183436fbdaf5000aac332c4d5ddb056665d459244a5608e98ae92/bitsandbytes-0.49.2-py3-none-manylinux_2_24_x86_64.whl", hash = "sha256:54b771f06e1a3c73af5c7f16ccf0fc23a846052813d4b008d10cb6e017dd1c8c", size = 60651714, upload-time = "2026-02-16T21:26:11.579Z" }, + { url = "https://files.pythonhosted.org/packages/b6/d4/501655842ad6771fb077f576d78cbedb5445d15b1c3c91343ed58ca46f0e/bitsandbytes-0.49.2-py3-none-win_amd64.whl", hash = "sha256:2e0ddd09cd778155388023cbe81f00afbb7c000c214caef3ce83386e7144df7d", size = 55372289, upload-time = "2026-02-16T21:26:16.267Z" }, +] + [[package]] name = "bleach" version = "6.3.0" @@ -375,6 +423,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, ] +[[package]] +name = "colorlog" +version = "6.10.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a2/61/f083b5ac52e505dfc1c624eafbf8c7589a0d7f32daa398d2e7590efa5fda/colorlog-6.10.1.tar.gz", hash = "sha256:eb4ae5cb65fe7fec7773c2306061a8e63e02efc2c72eba9d27b0fa23c94f1321", size = 17162, upload-time = "2025-10-16T16:14:11.978Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/c1/e419ef3723a074172b68aaa89c9f3de486ed4c2399e2dbd8113a4fdcaf9e/colorlog-6.10.1-py3-none-any.whl", hash = "sha256:2d7e8348291948af66122cff006c9f8da6255d224e7cf8e37d8de2df3bad8c9c", size = 11743, upload-time = "2025-10-16T16:14:10.512Z" }, +] + [[package]] name = "comm" version = "0.2.3" @@ -384,6 +444,28 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, ] +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, + { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, +] + [[package]] name = "coverage" version = "7.13.5" @@ -447,6 +529,91 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1b/82/ca4893968aeb2709aacfb57a30dec6fa2ab25b10fa9f064b8882ce33f599/cryptography-46.0.6-cp38-abi3-win_amd64.whl", hash = "sha256:79e865c642cfc5c0b3eb12af83c35c5aeff4fa5c672dc28c43721c2c9fdd2f0f", size = 3471160, upload-time = "2026-03-25T23:34:37.191Z" }, ] +[[package]] +name = "cuda-bindings" +version = "13.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cuda-pathfinder", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/52/c8/b2589d68acf7e3d63e2be330b84bc25712e97ed799affbca7edd7eae25d6/cuda_bindings-13.2.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e865447abfb83d6a98ad5130ed3c70b1fc295ae3eeee39fd07b4ddb0671b6788", size = 5722404, upload-time = "2026-03-11T00:12:44.041Z" }, + { url = "https://files.pythonhosted.org/packages/1f/92/f899f7bbb5617bb65ec52a6eac1e9a1447a86b916c4194f8a5001b8cde0c/cuda_bindings-13.2.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:46d8776a55d6d5da9dd6e9858fba2efcda2abe6743871dee47dd06eb8cb6d955", size = 6320619, upload-time = "2026-03-11T00:12:45.939Z" }, +] + +[[package]] +name = "cuda-pathfinder" +version = "1.5.3" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/d6/ac63065d33dd700fee7ebd7d287332401b54e31b9346e142f871e1f0b116/cuda_pathfinder-1.5.3-py3-none-any.whl", hash = "sha256:dff021123aedbb4117cc7ec81717bbfe198fb4e8b5f1ee57e0e084fec5c8577d", size = 49991, upload-time = "2026-04-14T20:09:27.037Z" }, +] + +[[package]] +name = "cuda-toolkit" +version = "13.0.2" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/b2/453099f5f3b698d7d0eab38916aac44c7f76229f451709e2eb9db6615dcd/cuda_toolkit-13.0.2-py2.py3-none-any.whl", hash = "sha256:b198824cf2f54003f50d64ada3a0f184b42ca0846c1c94192fa269ecd97a66eb", size = 2364, upload-time = "2025-12-19T23:24:07.328Z" }, +] + +[package.optional-dependencies] +cublas = [ + { name = "nvidia-cublas", marker = "sys_platform == 'linux'" }, +] +cudart = [ + { name = "nvidia-cuda-runtime", marker = "sys_platform == 'linux'" }, +] +cufft = [ + { name = "nvidia-cufft", marker = "sys_platform == 'linux'" }, +] +cufile = [ + { name = "nvidia-cufile", marker = "sys_platform == 'linux'" }, +] +cupti = [ + { name = "nvidia-cuda-cupti", marker = "sys_platform == 'linux'" }, +] +curand = [ + { name = "nvidia-curand", marker = "sys_platform == 'linux'" }, +] +cusolver = [ + { name = "nvidia-cusolver", marker = "sys_platform == 'linux'" }, +] +cusparse = [ + { name = "nvidia-cusparse", marker = "sys_platform == 'linux'" }, +] +nvjitlink = [ + { name = "nvidia-nvjitlink", marker = "sys_platform == 'linux'" }, +] +nvrtc = [ + { name = "nvidia-cuda-nvrtc", marker = "sys_platform == 'linux'" }, +] +nvtx = [ + { name = "nvidia-nvtx", marker = "sys_platform == 'linux'" }, +] + +[[package]] +name = "cut-cross-entropy" +version = "25.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "torch" }, + { name = "triton", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7e/97/45ff09cfcda7b200389204daa0125168e6544fba257adbbcdf728501d4f9/cut_cross_entropy-25.1.1.tar.gz", hash = "sha256:5fe5924509248b1aea5c890f8887c6a7759f7c8b1ebc0490e42c247c4f7c1e34", size = 22972, upload-time = "2025-01-07T12:21:53.896Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/5f/62fdb048f84d19e2123b6bbd722fe09c8c79b4964c50094d1e979db808e2/cut_cross_entropy-25.1.1-py3-none-any.whl", hash = "sha256:e46f26d348f6a67927d17e65c5a212e795be13dcad5b10a77a200d6b8102d9d1", size = 22672, upload-time = "2025-01-07T12:21:51.678Z" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + [[package]] name = "cyclopts" version = "4.10.1" @@ -518,6 +685,26 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, ] +[[package]] +name = "diffusers" +version = "0.37.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "httpx" }, + { name = "huggingface-hub" }, + { name = "importlib-metadata" }, + { name = "numpy" }, + { name = "pillow" }, + { name = "regex" }, + { name = "requests" }, + { name = "safetensors" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/5c/f4c2eb8d481fe8784a7e2331fbaab820079c06676185fa6d2177b386d590/diffusers-0.37.1.tar.gz", hash = "sha256:2346c21f77f835f273b7aacbaada1c34a596a3a2cc6ddc99d149efcd0ec298fa", size = 4135139, upload-time = "2026-03-25T08:04:04.515Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/dd/51c38785ce5e1c287b5ad17ba550edaaaffce0deb0da4857019c6700fbaf/diffusers-0.37.1-py3-none-any.whl", hash = "sha256:0537c0b28cb53cf39d6195489bcf8f833986df556c10f5e28ab7427b86fc8b90", size = 5001536, upload-time = "2026-03-25T08:04:02.385Z" }, +] + [[package]] name = "dill" version = "0.4.1" @@ -672,6 +859,23 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a4/a5/842ae8f0c08b61d6484b52f99a03510a3a72d23141942d216ebe81fefbce/filelock-3.25.2-py3-none-any.whl", hash = "sha256:ca8afb0da15f229774c9ad1b455ed96e85a81373065fb10446672f64444ddf70", size = 26759, upload-time = "2026-03-11T20:45:37.437Z" }, ] +[[package]] +name = "fonttools" +version = "4.62.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/08/7012b00a9a5874311b639c3920270c36ee0c445b69d9989a85e5c92ebcb0/fonttools-4.62.1.tar.gz", hash = "sha256:e54c75fd6041f1122476776880f7c3c3295ffa31962dc6ebe2543c00dca58b5d", size = 3580737, upload-time = "2026-03-13T13:54:25.52Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/d4/dbacced3953544b9a93088cc10ef2b596d348c983d5c67a404fa41ec51ba/fonttools-4.62.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:90365821debbd7db678809c7491ca4acd1e0779b9624cdc6ddaf1f31992bf974", size = 2870219, upload-time = "2026-03-13T13:52:53.664Z" }, + { url = "https://files.pythonhosted.org/packages/66/9e/a769c8e99b81e5a87ab7e5e7236684de4e96246aae17274e5347d11ebd78/fonttools-4.62.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:12859ff0b47dd20f110804c3e0d0970f7b832f561630cd879969011541a464a9", size = 2414891, upload-time = "2026-03-13T13:52:56.493Z" }, + { url = "https://files.pythonhosted.org/packages/69/64/f19a9e3911968c37e1e620e14dfc5778299e1474f72f4e57c5ec771d9489/fonttools-4.62.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c125ffa00c3d9003cdaaf7f2c79e6e535628093e14b5de1dccb08859b680936", size = 5033197, upload-time = "2026-03-13T13:52:59.179Z" }, + { url = "https://files.pythonhosted.org/packages/9b/8a/99c8b3c3888c5c474c08dbfd7c8899786de9604b727fcefb055b42c84bba/fonttools-4.62.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:149f7d84afca659d1a97e39a4778794a2f83bf344c5ee5134e09995086cc2392", size = 4988768, upload-time = "2026-03-13T13:53:02.761Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c6/0f904540d3e6ab463c1243a0d803504826a11604c72dd58c2949796a1762/fonttools-4.62.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0aa72c43a601cfa9273bb1ae0518f1acadc01ee181a6fc60cd758d7fdadffc04", size = 4971512, upload-time = "2026-03-13T13:53:05.678Z" }, + { url = "https://files.pythonhosted.org/packages/29/0b/5cbef6588dc9bd6b5c9ad6a4d5a8ca384d0cea089da31711bbeb4f9654a6/fonttools-4.62.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:19177c8d96c7c36359266e571c5173bcee9157b59cfc8cb0153c5673dc5a3a7d", size = 5122723, upload-time = "2026-03-13T13:53:08.662Z" }, + { url = "https://files.pythonhosted.org/packages/4a/47/b3a5342d381595ef439adec67848bed561ab7fdb1019fa522e82101b7d9c/fonttools-4.62.1-cp312-cp312-win32.whl", hash = "sha256:a24decd24d60744ee8b4679d38e88b8303d86772053afc29b19d23bb8207803c", size = 2281278, upload-time = "2026-03-13T13:53:10.998Z" }, + { url = "https://files.pythonhosted.org/packages/28/b1/0c2ab56a16f409c6c8a68816e6af707827ad5d629634691ff60a52879792/fonttools-4.62.1-cp312-cp312-win_amd64.whl", hash = "sha256:9e7863e10b3de72376280b515d35b14f5eeed639d1aa7824f4cf06779ec65e42", size = 2331414, upload-time = "2026-03-13T13:53:13.992Z" }, + { url = "https://files.pythonhosted.org/packages/fd/ba/56147c165442cc5ba7e82ecf301c9a68353cede498185869e6e02b4c264f/fonttools-4.62.1-py3-none-any.whl", hash = "sha256:7487782e2113861f4ddcc07c3436450659e3caa5e470b27dc2177cade2d8e7fd", size = 1152647, upload-time = "2026-03-13T13:54:22.735Z" }, +] + [[package]] name = "fqdn" version = "1.5.1" @@ -776,6 +980,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/f0/b3/10cb03cf684aab2bec97cb0b9bbba4f93e7a20c6e0f3b4100c235a55ad93/gradio_client-2.4.0-py3-none-any.whl", hash = "sha256:7c170807b924ed6056b2a1fa9d659d349dd20567c00ee0b4dc249dc1e2def620", size = 59156, upload-time = "2026-03-24T21:20:24.018Z" }, ] +[[package]] +name = "greenlet" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/94/a5935717b307d7c71fe877b52b884c6af707d2d2090db118a03fbd799369/greenlet-3.4.0.tar.gz", hash = "sha256:f50a96b64dafd6169e595a5c56c9146ef80333e67d4476a65a9c55f400fc22ff", size = 195913, upload-time = "2026-04-08T17:08:00.863Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/65/8b/3669ad3b3f247a791b2b4aceb3aa5a31f5f6817bf547e4e1ff712338145a/greenlet-3.4.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:1a54a921561dd9518d31d2d3db4d7f80e589083063ab4d3e2e950756ef809e1a", size = 286902, upload-time = "2026-04-08T15:52:12.138Z" }, + { url = "https://files.pythonhosted.org/packages/38/3e/3c0e19b82900873e2d8469b590a6c4b3dfd2b316d0591f1c26b38a4879a5/greenlet-3.4.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:16dec271460a9a2b154e3b1c2fa1050ce6280878430320e85e08c166772e3f97", size = 606099, upload-time = "2026-04-08T16:24:38.408Z" }, + { url = "https://files.pythonhosted.org/packages/b5/33/99fef65e7754fc76a4ed14794074c38c9ed3394a5bd129d7f61b705f3168/greenlet-3.4.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:90036ce224ed6fe75508c1907a77e4540176dcf0744473627785dd519c6f9996", size = 618837, upload-time = "2026-04-08T16:30:58.298Z" }, + { url = "https://files.pythonhosted.org/packages/44/57/eae2cac10421feae6c0987e3dc106c6d86262b1cb379e171b017aba893a6/greenlet-3.4.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6f0def07ec9a71d72315cf26c061aceee53b306c36ed38c35caba952ea1b319d", size = 624901, upload-time = "2026-04-08T16:40:38.981Z" }, + { url = "https://files.pythonhosted.org/packages/36/f7/229f3aed6948faa20e0616a0b8568da22e365ede6a54d7d369058b128afd/greenlet-3.4.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a1c4f6b453006efb8310affb2d132832e9bbb4fc01ce6df6b70d810d38f1f6dc", size = 615062, upload-time = "2026-04-08T15:56:33.766Z" }, + { url = "https://files.pythonhosted.org/packages/6a/8a/0e73c9b94f31d1cc257fe79a0eff621674141cdae7d6d00f40de378a1e42/greenlet-3.4.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:0e1254cf0cbaa17b04320c3a78575f29f3c161ef38f59c977108f19ffddaf077", size = 423927, upload-time = "2026-04-08T16:43:05.293Z" }, + { url = "https://files.pythonhosted.org/packages/08/97/d988180011aa40135c46cd0d0cf01dd97f7162bae14139b4a3ef54889ba5/greenlet-3.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9b2d9a138ffa0e306d0e2b72976d2fb10b97e690d40ab36a472acaab0838e2de", size = 1573511, upload-time = "2026-04-08T16:26:20.058Z" }, + { url = "https://files.pythonhosted.org/packages/d4/0f/a5a26fe152fb3d12e6a474181f6e9848283504d0afd095f353d85726374b/greenlet-3.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8424683caf46eb0eb6f626cb95e008e8cc30d0cb675bdfa48200925c79b38a08", size = 1640396, upload-time = "2026-04-08T15:57:30.88Z" }, + { url = "https://files.pythonhosted.org/packages/42/cf/bb2c32d9a100e36ee9f6e38fad6b1e082b8184010cb06259b49e1266ca01/greenlet-3.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:a0a53fb071531d003b075c444014ff8f8b1a9898d36bb88abd9ac7b3524648a2", size = 238892, upload-time = "2026-04-08T17:03:10.094Z" }, + { url = "https://files.pythonhosted.org/packages/b7/47/6c41314bac56e71436ce551c7fbe3cc830ed857e6aa9708dbb9c65142eb6/greenlet-3.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:f38b81880ba28f232f1f675893a39cf7b6db25b31cc0a09bb50787ecf957e85e", size = 235599, upload-time = "2026-04-08T15:52:54.3Z" }, +] + [[package]] name = "groovy" version = "0.1.2" @@ -820,6 +1042,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4c/52/04816d2a15691a63cec3187e3e592c4493448eb4834492eadd532972b035/hf_gradio-0.3.0-py3-none-any.whl", hash = "sha256:159d33d1f0affae8164d29c0c51a63dfcc0bbc90803b07c6f139137206a796ae", size = 4154, upload-time = "2026-03-23T19:50:08.586Z" }, ] +[[package]] +name = "hf-transfer" +version = "0.1.9" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1a/eb/8fc64f40388c29ce8ce3b2b180a089d4d6b25b1d0d232d016704cb852104/hf_transfer-0.1.9.tar.gz", hash = "sha256:035572865dab29d17e783fbf1e84cf1cb24f3fcf8f1b17db1cfc7fdf139f02bf", size = 25201, upload-time = "2025-01-07T10:05:12.947Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/f5/461d2e5f307e5048289b1168d5c642ae3bb2504e88dff1a38b92ed990a21/hf_transfer-0.1.9-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:e66acf91df4a8b72f60223059df3003062a5ae111757187ed1a06750a30e911b", size = 1393046, upload-time = "2025-01-07T10:04:51.003Z" }, + { url = "https://files.pythonhosted.org/packages/41/ba/8d9fd9f1083525edfcb389c93738c802f3559cb749324090d7109c8bf4c2/hf_transfer-0.1.9-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:8669dbcc7a3e2e8d61d42cd24da9c50d57770bd74b445c65123291ca842a7e7a", size = 1348126, upload-time = "2025-01-07T10:04:45.712Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a2/cd7885bc9959421065a6fae0fe67b6c55becdeda4e69b873e52976f9a9f0/hf_transfer-0.1.9-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8fd0167c4407a3bc4cdd0307e65ada2294ec04f1813d8a69a5243e379b22e9d8", size = 3728604, upload-time = "2025-01-07T10:04:14.173Z" }, + { url = "https://files.pythonhosted.org/packages/f6/2e/a072cf196edfeda3310c9a5ade0a0fdd785e6154b3ce24fc738c818da2a7/hf_transfer-0.1.9-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee8b10afedcb75f71091bcc197c526a6ebf5c58bbbadb34fdeee6160f55f619f", size = 3064995, upload-time = "2025-01-07T10:04:18.663Z" }, + { url = "https://files.pythonhosted.org/packages/c2/84/aec9ef4c0fab93c1ea2b1badff38c78b4b2f86f0555b26d2051dbc920cde/hf_transfer-0.1.9-cp38-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5828057e313de59300dd1abb489444bc452efe3f479d3c55b31a8f680936ba42", size = 3580908, upload-time = "2025-01-07T10:04:32.834Z" }, + { url = "https://files.pythonhosted.org/packages/29/63/b560d39651a56603d64f1a0212d0472a44cbd965db2fa62b99d99cb981bf/hf_transfer-0.1.9-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc6bd19e1cc177c66bdef15ef8636ad3bde79d5a4f608c158021153b4573509d", size = 3400839, upload-time = "2025-01-07T10:04:26.122Z" }, + { url = "https://files.pythonhosted.org/packages/d6/d8/f87ea6f42456254b48915970ed98e993110521e9263472840174d32c880d/hf_transfer-0.1.9-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdca9bfb89e6f8f281890cc61a8aff2d3cecaff7e1a4d275574d96ca70098557", size = 3552664, upload-time = "2025-01-07T10:04:40.123Z" }, + { url = "https://files.pythonhosted.org/packages/d6/56/1267c39b65fc8f4e2113b36297320f102718bf5799b544a6cbe22013aa1d/hf_transfer-0.1.9-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:89a23f58b7b7effbc047b8ca286f131b17728c99a9f972723323003ffd1bb916", size = 4073732, upload-time = "2025-01-07T10:04:55.624Z" }, + { url = "https://files.pythonhosted.org/packages/82/1a/9c748befbe3decf7cb415e34f8a0c3789a0a9c55910dea73d581e48c0ce5/hf_transfer-0.1.9-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:dc7fff1345980d6c0ebb92c811d24afa4b98b3e07ed070c8e38cc91fd80478c5", size = 3390096, upload-time = "2025-01-07T10:04:59.98Z" }, + { url = "https://files.pythonhosted.org/packages/72/85/4c03da147b6b4b7cb12e074d3d44eee28604a387ed0eaf7eaaead5069c57/hf_transfer-0.1.9-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:1a6bd16c667ebe89a069ca163060127a794fa3a3525292c900b8c8cc47985b0d", size = 3664743, upload-time = "2025-01-07T10:05:05.416Z" }, + { url = "https://files.pythonhosted.org/packages/e7/6e/e597b04f753f1b09e6893075d53a82a30c13855cbaa791402695b01e369f/hf_transfer-0.1.9-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:d2fde99d502093ade3ab1b53f80da18480e9902aa960dab7f74fb1b9e5bc5746", size = 3695243, upload-time = "2025-01-07T10:05:11.411Z" }, + { url = "https://files.pythonhosted.org/packages/09/89/d4e234727a26b2546c8fb70a276cd924260d60135f2165bf8b9ed67bb9a4/hf_transfer-0.1.9-cp38-abi3-win32.whl", hash = "sha256:435cc3cdc8524ce57b074032b8fd76eed70a4224d2091232fa6a8cef8fd6803e", size = 1086605, upload-time = "2025-01-07T10:05:18.873Z" }, + { url = "https://files.pythonhosted.org/packages/a1/14/f1e15b851d1c2af5b0b1a82bf8eb10bda2da62d98180220ba6fd8879bb5b/hf_transfer-0.1.9-cp38-abi3-win_amd64.whl", hash = "sha256:16f208fc678911c37e11aa7b586bc66a37d02e636208f18b6bc53d29b5df40ad", size = 1160240, upload-time = "2025-01-07T10:05:14.324Z" }, +] + [[package]] name = "hf-xet" version = "1.4.3" @@ -884,22 +1127,21 @@ wheels = [ [[package]] name = "huggingface-hub" -version = "1.9.0" +version = "0.36.2" source = { registry = "https://pypi.org/simple" } dependencies = [ { name = "filelock" }, { name = "fsspec" }, - { name = "hf-xet", marker = "platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, - { name = "httpx" }, + { name = "hf-xet", marker = "platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, { name = "packaging" }, { name = "pyyaml" }, + { name = "requests" }, { name = "tqdm" }, - { name = "typer" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/88/bb/62c7aa86f63a05e2f9b96642fdef9b94526a23979820b09f5455deff4983/huggingface_hub-1.9.0.tar.gz", hash = "sha256:0ea5be7a56135c91797cae6ad726e38eaeb6eb4b77cefff5c9d38ba0ecf874f7", size = 750326, upload-time = "2026-04-03T08:35:55.888Z" } +sdist = { url = "https://files.pythonhosted.org/packages/7c/b7/8cb61d2eece5fb05a83271da168186721c450eb74e3c31f7ef3169fa475b/huggingface_hub-0.36.2.tar.gz", hash = "sha256:1934304d2fb224f8afa3b87007d58501acfda9215b334eed53072dd5e815ff7a", size = 649782, upload-time = "2026-02-06T09:24:13.098Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/73/37/0d15d16150e1829f3e90962c99f28257f6de9e526a680b4c6f5acdb54fd2/huggingface_hub-1.9.0-py3-none-any.whl", hash = "sha256:2999328c058d39fd19ab748dd09bd4da2fbaa4f4c1ddea823eab103051e14a1f", size = 637355, upload-time = "2026-04-03T08:35:53.897Z" }, + { url = "https://files.pythonhosted.org/packages/a8/af/48ac8483240de756d2438c380746e7130d1c6f75802ef22f3c6d49982787/huggingface_hub-0.36.2-py3-none-any.whl", hash = "sha256:48f0c8eac16145dfce371e9d2d7772854a4f591bcb56c9cf548accf531d54270", size = 566395, upload-time = "2026-02-06T09:24:11.133Z" }, ] [[package]] @@ -1392,6 +1634,33 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", size = 39160, upload-time = "2025-11-16T16:26:08.402Z" }, ] +[[package]] +name = "kiwisolver" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/b2/818b74ebea34dabe6d0c51cb1c572e046730e64844da6ed646d5298c40ce/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9", size = 123158, upload-time = "2026-03-09T13:13:23.127Z" }, + { url = "https://files.pythonhosted.org/packages/bf/d9/405320f8077e8e1c5c4bd6adc45e1e6edf6d727b6da7f2e2533cf58bff71/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588", size = 66388, upload-time = "2026-03-09T13:13:24.765Z" }, + { url = "https://files.pythonhosted.org/packages/99/9f/795fedf35634f746151ca8839d05681ceb6287fbed6cc1c9bf235f7887c2/kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819", size = 64068, upload-time = "2026-03-09T13:13:25.878Z" }, + { url = "https://files.pythonhosted.org/packages/c4/13/680c54afe3e65767bed7ec1a15571e1a2f1257128733851ade24abcefbcc/kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f", size = 1477934, upload-time = "2026-03-09T13:13:27.166Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2f/cebfcdb60fd6a9b0f6b47a9337198bcbad6fbe15e68189b7011fd914911f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf", size = 1278537, upload-time = "2026-03-09T13:13:28.707Z" }, + { url = "https://files.pythonhosted.org/packages/f2/0d/9b782923aada3fafb1d6b84e13121954515c669b18af0c26e7d21f579855/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d", size = 1296685, upload-time = "2026-03-09T13:13:30.528Z" }, + { url = "https://files.pythonhosted.org/packages/27/70/83241b6634b04fe44e892688d5208332bde130f38e610c0418f9ede47ded/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083", size = 1346024, upload-time = "2026-03-09T13:13:32.818Z" }, + { url = "https://files.pythonhosted.org/packages/e4/db/30ed226fb271ae1a6431fc0fe0edffb2efe23cadb01e798caeb9f2ceae8f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6", size = 987241, upload-time = "2026-03-09T13:13:34.435Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bd/c314595208e4c9587652d50959ead9e461995389664e490f4dce7ff0f782/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1", size = 2227742, upload-time = "2026-03-09T13:13:36.4Z" }, + { url = "https://files.pythonhosted.org/packages/c1/43/0499cec932d935229b5543d073c2b87c9c22846aab48881e9d8d6e742a2d/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0", size = 2323966, upload-time = "2026-03-09T13:13:38.204Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6f/79b0d760907965acfd9d61826a3d41f8f093c538f55cd2633d3f0db269f6/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15", size = 1977417, upload-time = "2026-03-09T13:13:39.966Z" }, + { url = "https://files.pythonhosted.org/packages/ab/31/01d0537c41cb75a551a438c3c7a80d0c60d60b81f694dac83dd436aec0d0/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314", size = 2491238, upload-time = "2026-03-09T13:13:41.698Z" }, + { url = "https://files.pythonhosted.org/packages/e4/34/8aefdd0be9cfd00a44509251ba864f5caf2991e36772e61c408007e7f417/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9", size = 2294947, upload-time = "2026-03-09T13:13:43.343Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/0348374369ca588f8fe9c338fae49fa4e16eeb10ffb3d012f23a54578a9e/kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384", size = 73569, upload-time = "2026-03-09T13:13:45.792Z" }, + { url = "https://files.pythonhosted.org/packages/28/26/192b26196e2316e2bd29deef67e37cdf9870d9af8e085e521afff0fed526/kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7", size = 64997, upload-time = "2026-03-09T13:13:46.878Z" }, + { url = "https://files.pythonhosted.org/packages/1c/fa/2910df836372d8761bb6eff7d8bdcb1613b5c2e03f260efe7abe34d388a7/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797", size = 130262, upload-time = "2026-03-09T13:15:35.629Z" }, + { url = "https://files.pythonhosted.org/packages/0f/41/c5f71f9f00aabcc71fee8b7475e3f64747282580c2fe748961ba29b18385/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203", size = 138036, upload-time = "2026-03-09T13:15:36.894Z" }, + { url = "https://files.pythonhosted.org/packages/fa/06/7399a607f434119c6e1fdc8ec89a8d51ccccadf3341dee4ead6bd14caaf5/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7", size = 194295, upload-time = "2026-03-09T13:15:38.22Z" }, + { url = "https://files.pythonhosted.org/packages/b5/91/53255615acd2a1eaca307ede3c90eb550bae9c94581f8c00081b6b1c8f44/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57", size = 75987, upload-time = "2026-03-09T13:15:39.65Z" }, +] + [[package]] name = "lark" version = "1.3.1" @@ -1422,6 +1691,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/c7/7c/c614252f9acda59b01a66e2ddfd243ed1c7e1deab0293332dfbccf862808/librt-0.8.1-cp312-cp312-win_arm64.whl", hash = "sha256:0f2ae3725904f7377e11cc37722d5d401e8b3d5851fb9273d7f4fe04f6b3d37d", size = 52441, upload-time = "2026-02-17T16:11:56.801Z" }, ] +[[package]] +name = "mako" +version = "1.3.11" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/59/8a/805404d0c0b9f3d7a326475ca008db57aea9c5c9f2e1e39ed0faa335571c/mako-1.3.11.tar.gz", hash = "sha256:071eb4ab4c5010443152255d77db7faa6ce5916f35226eb02dc34479b6858069", size = 399811, upload-time = "2026-04-14T20:19:51.493Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/a5/19d7aaa7e433713ffe881df33705925a196afb9532efc8475d26593921a6/mako-1.3.11-py3-none-any.whl", hash = "sha256:e372c6e333cf004aa736a15f425087ec977e1fcbd2966aae7f17c8dc1da27a77", size = 78503, upload-time = "2026-04-14T20:19:53.233Z" }, +] + [[package]] name = "markdown-it-py" version = "4.0.0" @@ -1453,6 +1734,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, ] +[[package]] +name = "matplotlib" +version = "3.10.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "contourpy" }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/1b/4be5be87d43d327a0cf4de1a56e86f7f84c89312452406cf122efe2839e6/matplotlib-3.10.9.tar.gz", hash = "sha256:fd66508e8c6877d98e586654b608a0456db8d7e8a546eb1e2600efd957302358", size = 34811233, upload-time = "2026-04-24T00:14:13.539Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/35/c6/5581e26c72233ebb2a2a6fed2d24fb7c66b4700120b813f51b0555acf0b6/matplotlib-3.10.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f0c3c28d9fbcc1fe7a03be236d73430cf6409c41fb2383a7ac52fe932b072cb1", size = 8319908, upload-time = "2026-04-24T00:12:21.323Z" }, + { url = "https://files.pythonhosted.org/packages/b7/18/4880dd762e40cd360c1bf06e890c5a97b997e91cb324602b1a19950ad5ce/matplotlib-3.10.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cb28c2bd769aa3e98322c6ab09854cbcc52ab69d2759d681bba3e327b2b320", size = 8216016, upload-time = "2026-04-24T00:12:23.4Z" }, + { url = "https://files.pythonhosted.org/packages/32/91/d024616abdba99e83120e07a20658976f6a343646710760c4a51df126029/matplotlib-3.10.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae20801130378b82d647ff5047c07316295b68dc054ca6b3c13519d0ea624285", size = 8789336, upload-time = "2026-04-24T00:12:26.096Z" }, + { url = "https://files.pythonhosted.org/packages/5c/04/030a2f61ef2158f5e4c259487a92ac877732499fb33d871585d89e03c42d/matplotlib-3.10.9-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c63ebcd8b4b169eb2f5c200552ae6b8be8999a005b6b507ed76fb8d7d674fe2", size = 9604602, upload-time = "2026-04-24T00:12:29.052Z" }, + { url = "https://files.pythonhosted.org/packages/fc/c2/541e4d09d87bb6b5830fc28b4c887a9a8cf4e1c6cee698a8c05552ae2003/matplotlib-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d75d11c949914165976c621b2324f9ef162af7ebf4b057ddf95dd1dba7e5edcf", size = 9670966, upload-time = "2026-04-24T00:12:32.131Z" }, + { url = "https://files.pythonhosted.org/packages/04/a1/4571fc46e7702de8d0c2dc54ad1b2f8e29328dea3ee90831181f7353d93c/matplotlib-3.10.9-cp312-cp312-win_amd64.whl", hash = "sha256:d091f9d758b34aaaaa6331d13574bf01891d903b3dec59bfff458ef7551de5d6", size = 8217462, upload-time = "2026-04-24T00:12:35.226Z" }, + { url = "https://files.pythonhosted.org/packages/4b/d0/2269edb12aa30c13c8bcc9382892e39943ce1d28aab4ec296e0381798e81/matplotlib-3.10.9-cp312-cp312-win_arm64.whl", hash = "sha256:10cc5ce06d10231c36f40e875f3c7e8050362a4ee8f0ee5d29a6b3277d57bb42", size = 8136688, upload-time = "2026-04-24T00:12:37.442Z" }, +] + [[package]] name = "matplotlib-inline" version = "0.2.1" @@ -1551,6 +1858,31 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/d8/f4/5e52c7319b8087acef603ed6e50dc325c02eaa999355414830468611f13c/more_itertools-11.0.1-py3-none-any.whl", hash = "sha256:eaf287826069452a8f61026c597eae2428b2d1ba2859083abbf240b46842ce6d", size = 72182, upload-time = "2026-04-02T16:17:43.724Z" }, ] +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, +] + +[[package]] +name = "msgspec" +version = "0.21.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/60/f79b9b013a16fa3a58350c9295ddc6789f2e335f36ea61ed10a21b215364/msgspec-0.21.1.tar.gz", hash = "sha256:2313508e394b0d208f8f56892ca9b2799e2561329de9763b19619595a6c0f72c", size = 319193, upload-time = "2026-04-12T21:44:50.394Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/cf/317224852c00248c620a9bcf4b26e2e4ab8afd752f18d2a6ef73ebd423b6/msgspec-0.21.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d4248cf0b6129b7d230eacd493c17cc2d4f3989f3bb7f633a928a85b7dcfa251", size = 196188, upload-time = "2026-04-12T21:44:07.181Z" }, + { url = "https://files.pythonhosted.org/packages/6d/81/074612945c0666078f7366f40000013de9f6ba687491d450df699bceebc9/msgspec-0.21.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5102c7e9b3acff82178449b85006d96310e690291bb1ea0142f1b24bcb8aabcb", size = 188473, upload-time = "2026-04-12T21:44:08.736Z" }, + { url = "https://files.pythonhosted.org/packages/8a/37/655101799590bcc5fddb2bd3fe0e6194e816c2d1da7c361725f5eb89a910/msgspec-0.21.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:846758412e9518252b2ac9bffd6f0e54d9ff614f5f9488df7749f81ff5c80920", size = 218871, upload-time = "2026-04-12T21:44:09.917Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d1/d4cd9fe89c7d400d7a18f86ccc94daa3f0927f53558846fcb60791dce5d6/msgspec-0.21.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:21995e74b5c598c2e004110ad66ec7f1b8c20bf2bcf3b2de8fd9a3094422d3ff", size = 225025, upload-time = "2026-04-12T21:44:11.191Z" }, + { url = "https://files.pythonhosted.org/packages/24/bf/e20549e602b9edccadeeff98760345a416f9cce846a657e8b18e3396b212/msgspec-0.21.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6129f0cca52992e898fd5344187f7c8127b63d810b2fd73e36fca73b4c6475ee", size = 222672, upload-time = "2026-04-12T21:44:12.481Z" }, + { url = "https://files.pythonhosted.org/packages/b4/68/04d7a8f0f786545cf9b8c280c57aa6befb5977af6e884b8b54191cbe44b3/msgspec-0.21.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ef3ec2296248d1f8b9231acb051b6d471dfde8f21819e86c9adaaa9f42918521", size = 227303, upload-time = "2026-04-12T21:44:13.709Z" }, + { url = "https://files.pythonhosted.org/packages/cc/4d/619866af2840875be408047bf9e70ceafbae6ab50660de7134ed1b25eb86/msgspec-0.21.1-cp312-cp312-win_amd64.whl", hash = "sha256:d4ab834a054c6f0cbeef6df9e7e1b33d5f1bc7b86dea1d2fd7cad003873e783d", size = 190017, upload-time = "2026-04-12T21:44:14.977Z" }, + { url = "https://files.pythonhosted.org/packages/5e/2e/a8f9eca8fd00e097d7a9e99ba8a4685db994494448e3d4f0b7f6e9a3c0f7/msgspec-0.21.1-cp312-cp312-win_arm64.whl", hash = "sha256:628aaa35c74950a8c59da330d7e98917e1c7188f983745782027748ee4ca573e", size = 175345, upload-time = "2026-04-12T21:44:16.431Z" }, +] + [[package]] name = "multidict" version = "6.7.1" @@ -1688,6 +2020,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, ] +[[package]] +name = "networkx" +version = "3.6.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", size = 2517025, upload-time = "2025-12-08T17:02:39.908Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762", size = 2068504, upload-time = "2025-12-08T17:02:38.159Z" }, +] + [[package]] name = "notebook-shim" version = "0.2.4" @@ -1719,6 +2060,155 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/58/89/e4e856ac82a68c3ed64486a544977d0e7bdd18b8da75b78a577ca31c4395/numpy-2.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:846300f379b5b12cc769334464656bc882e0735d27d9726568bc932fdc49d5ec", size = 10221450, upload-time = "2026-03-29T13:19:18.994Z" }, ] +[[package]] +name = "nvidia-cublas" +version = "13.1.0.3" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/a5/fce49e2ae977e0ccc084e5adafceb4f0ac0c8333cb6863501618a7277f67/nvidia_cublas-13.1.0.3-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:c86fc7f7ae36d7528288c5d88098edcb7b02c633d262e7ddbb86b0ad91be5df2", size = 542851226, upload-time = "2025-10-09T08:59:04.818Z" }, + { url = "https://files.pythonhosted.org/packages/e7/44/423ac00af4dd95a5aeb27207e2c0d9b7118702149bf4704c3ddb55bb7429/nvidia_cublas-13.1.0.3-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:ee8722c1f0145ab246bccb9e452153b5e0515fd094c3678df50b2a0888b8b171", size = 423133236, upload-time = "2025-10-09T08:59:32.536Z" }, +] + +[[package]] +name = "nvidia-cuda-cupti" +version = "13.0.85" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/2a/80353b103fc20ce05ef51e928daed4b6015db4aaa9162ed0997090fe2250/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_aarch64.whl", hash = "sha256:796bd679890ee55fb14a94629b698b6db54bcfd833d391d5e94017dd9d7d3151", size = 10310827, upload-time = "2025-09-04T08:26:42.012Z" }, + { url = "https://files.pythonhosted.org/packages/33/6d/737d164b4837a9bbd202f5ae3078975f0525a55730fe871d8ed4e3b952b0/nvidia_cuda_cupti-13.0.85-py3-none-manylinux_2_25_x86_64.whl", hash = "sha256:4eb01c08e859bf924d222250d2e8f8b8ff6d3db4721288cf35d14252a4d933c8", size = 10715597, upload-time = "2025-09-04T08:26:51.312Z" }, +] + +[[package]] +name = "nvidia-cuda-nvrtc" +version = "13.0.88" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/68/483a78f5e8f31b08fb1bb671559968c0ca3a065ac7acabfc7cee55214fd6/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:ad9b6d2ead2435f11cbb6868809d2adeeee302e9bb94bcf0539c7a40d80e8575", size = 90215200, upload-time = "2025-09-04T08:28:44.204Z" }, + { url = "https://files.pythonhosted.org/packages/b7/dc/6bb80850e0b7edd6588d560758f17e0550893a1feaf436807d64d2da040f/nvidia_cuda_nvrtc-13.0.88-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d27f20a0ca67a4bb34268a5e951033496c5b74870b868bacd046b1b8e0c3267b", size = 43015449, upload-time = "2025-09-04T08:28:20.239Z" }, +] + +[[package]] +name = "nvidia-cuda-runtime" +version = "13.0.96" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/4f/17d7b9b8e285199c58ce28e31b5c5bbaa4d8271af06a89b6405258245de2/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ef9bcbe90493a2b9d810e43d249adb3d02e98dd30200d86607d8d02687c43f55", size = 2261060, upload-time = "2025-10-09T08:55:15.78Z" }, + { url = "https://files.pythonhosted.org/packages/2e/24/d1558f3b68b1d26e706813b1d10aa1d785e4698c425af8db8edc3dced472/nvidia_cuda_runtime-13.0.96-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7f82250d7782aa23b6cfe765ecc7db554bd3c2870c43f3d1821f1d18aebf0548", size = 2243632, upload-time = "2025-10-09T08:55:36.117Z" }, +] + +[[package]] +name = "nvidia-cudnn-cu13" +version = "9.19.0.56" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/84/26025437c1e6b61a707442184fa0c03d083b661adf3a3eecfd6d21677740/nvidia_cudnn_cu13-9.19.0.56-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:6ed29ffaee1176c612daf442e4dd6cfeb6a0caa43ddcbeb59da94953030b1be4", size = 433781201, upload-time = "2026-02-03T20:40:53.805Z" }, + { url = "https://files.pythonhosted.org/packages/a3/22/0b4b932655d17a6da1b92fa92ab12844b053bb2ac2475e179ba6f043da1e/nvidia_cudnn_cu13-9.19.0.56-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:d20e1734305e9d68889a96e3f35094d733ff1f83932ebe462753973e53a572bf", size = 366066321, upload-time = "2026-02-03T20:44:52.837Z" }, +] + +[[package]] +name = "nvidia-cufft" +version = "12.0.0.61" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-nvjitlink", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/ae/f417a75c0259e85c1d2f83ca4e960289a5f814ed0cea74d18c353d3e989d/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2708c852ef8cd89d1d2068bdbece0aa188813a0c934db3779b9b1faa8442e5f5", size = 214053554, upload-time = "2025-09-04T08:31:38.196Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2f/7b57e29836ea8714f81e9898409196f47d772d5ddedddf1592eadb8ab743/nvidia_cufft-12.0.0.61-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6c44f692dce8fd5ffd3e3df134b6cdb9c2f72d99cf40b62c32dde45eea9ddad3", size = 214085489, upload-time = "2025-09-04T08:31:56.044Z" }, +] + +[[package]] +name = "nvidia-cufile" +version = "1.15.1.6" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/70/4f193de89a48b71714e74602ee14d04e4019ad36a5a9f20c425776e72cd6/nvidia_cufile-1.15.1.6-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:08a3ecefae5a01c7f5117351c64f17c7c62efa5fffdbe24fc7d298da19cd0b44", size = 1223672, upload-time = "2025-09-04T08:32:22.779Z" }, + { url = "https://files.pythonhosted.org/packages/ab/73/cc4a14c9813a8a0d509417cf5f4bdaba76e924d58beb9864f5a7baceefbf/nvidia_cufile-1.15.1.6-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:bdc0deedc61f548bddf7733bdc216456c2fdb101d020e1ab4b88d232d5e2f6d1", size = 1136992, upload-time = "2025-09-04T08:32:14.119Z" }, +] + +[[package]] +name = "nvidia-curand" +version = "10.4.0.35" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/72/7c2ae24fb6b63a32e6ae5d241cc65263ea18d08802aaae087d9f013335a2/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:133df5a7509c3e292aaa2b477afd0194f06ce4ea24d714d616ff36439cee349a", size = 61962106, upload-time = "2025-08-04T10:21:41.128Z" }, + { url = "https://files.pythonhosted.org/packages/a5/9f/be0a41ca4a4917abf5cb9ae0daff1a6060cc5de950aec0396de9f3b52bc5/nvidia_curand-10.4.0.35-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:1aee33a5da6e1db083fe2b90082def8915f30f3248d5896bcec36a579d941bfc", size = 59544258, upload-time = "2025-08-04T10:22:03.992Z" }, +] + +[[package]] +name = "nvidia-cusolver" +version = "12.0.4.66" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "nvidia-cusparse", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "nvidia-nvjitlink", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/c8/c3/b30c9e935fc01e3da443ec0116ed1b2a009bb867f5324d3f2d7e533e776b/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_aarch64.whl", hash = "sha256:02c2457eaa9e39de20f880f4bd8820e6a1cfb9f9a34f820eb12a155aa5bc92d2", size = 223467760, upload-time = "2025-09-04T08:33:04.222Z" }, + { url = "https://files.pythonhosted.org/packages/5f/67/cba3777620cdacb99102da4042883709c41c709f4b6323c10781a9c3aa34/nvidia_cusolver-12.0.4.66-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:0a759da5dea5c0ea10fd307de75cdeb59e7ea4fcb8add0924859b944babf1112", size = 200941980, upload-time = "2025-09-04T08:33:22.767Z" }, +] + +[[package]] +name = "nvidia-cusparse" +version = "12.6.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-nvjitlink", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/94/5c26f33738ae35276672f12615a64bd008ed5be6d1ebcb23579285d960a9/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:80bcc4662f23f1054ee334a15c72b8940402975e0eab63178fc7e670aa59472c", size = 162155568, upload-time = "2025-09-04T08:33:42.864Z" }, + { url = "https://files.pythonhosted.org/packages/fa/18/623c77619c31d62efd55302939756966f3ecc8d724a14dab2b75f1508850/nvidia_cusparse-12.6.3.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2b3c89c88d01ee0e477cb7f82ef60a11a4bcd57b6b87c33f789350b59759360b", size = 145942937, upload-time = "2025-09-04T08:33:58.029Z" }, +] + +[[package]] +name = "nvidia-cusparselt-cu13" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/46/10/8dcd1175260706a2fc92a16a52e306b71d4c1ea0b0cc4a9484183399818a/nvidia_cusparselt_cu13-0.8.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:400c6ed1cf6780fc6efedd64ec9f1345871767e6a1a0a552a1ea0578117ea77c", size = 220791277, upload-time = "2025-08-13T19:22:40.982Z" }, + { url = "https://files.pythonhosted.org/packages/fd/53/43b0d71f4e702fa9733f8b4571fdca50a8813f1e450b656c239beff12315/nvidia_cusparselt_cu13-0.8.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:25e30a8a7323935d4ad0340b95a0b69926eee755767e8e0b1cf8dd85b197d3fd", size = 169884119, upload-time = "2025-08-13T19:23:41.967Z" }, +] + +[[package]] +name = "nvidia-nccl-cu13" +version = "2.28.9" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/55/1920646a2e43ffd4fc958536b276197ed740e9e0c54105b4bb3521591fc7/nvidia_nccl_cu13-2.28.9-py3-none-manylinux_2_18_aarch64.whl", hash = "sha256:01c873ba1626b54caa12272ed228dc5b2781545e0ae8ba3f432a8ef1c6d78643", size = 196561677, upload-time = "2025-11-18T05:49:03.45Z" }, + { url = "https://files.pythonhosted.org/packages/b0/b4/878fefaad5b2bcc6fcf8d474a25e3e3774bc5133e4b58adff4d0bca238bc/nvidia_nccl_cu13-2.28.9-py3-none-manylinux_2_18_x86_64.whl", hash = "sha256:e4553a30f34195f3fa1da02a6da3d6337d28f2003943aa0a3d247bbc25fefc42", size = 196493177, upload-time = "2025-11-18T05:49:17.677Z" }, +] + +[[package]] +name = "nvidia-nvjitlink" +version = "13.0.88" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/7a/123e033aaff487c77107195fa5a2b8686795ca537935a24efae476c41f05/nvidia_nvjitlink-13.0.88-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:13a74f429e23b921c1109976abefacc69835f2f433ebd323d3946e11d804e47b", size = 40713933, upload-time = "2025-09-04T08:35:43.553Z" }, + { url = "https://files.pythonhosted.org/packages/ab/2c/93c5250e64df4f894f1cbb397c6fd71f79813f9fd79d7cd61de3f97b3c2d/nvidia_nvjitlink-13.0.88-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e931536ccc7d467a98ba1d8b89ff7fa7f1fa3b13f2b0069118cd7f47bff07d0c", size = 38768748, upload-time = "2025-09-04T08:35:20.008Z" }, +] + +[[package]] +name = "nvidia-nvshmem-cu13" +version = "3.4.5" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/0f/05cc9c720236dcd2db9c1ab97fff629e96821be2e63103569da0c9b72f19/nvidia_nvshmem_cu13-3.4.5-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6dc2a197f38e5d0376ad52cd1a2a3617d3cdc150fd5966f4aee9bcebb1d68fe9", size = 60215947, upload-time = "2025-09-06T00:32:20.022Z" }, + { url = "https://files.pythonhosted.org/packages/3c/35/a9bf80a609e74e3b000fef598933235c908fcefcef9026042b8e6dfde2a9/nvidia_nvshmem_cu13-3.4.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:290f0a2ee94c9f3687a02502f3b9299a9f9fe826e6d0287ee18482e78d495b80", size = 60412546, upload-time = "2025-09-06T00:32:41.564Z" }, +] + +[[package]] +name = "nvidia-nvtx" +version = "13.0.85" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c2/f3/d86c845465a2723ad7e1e5c36dcd75ddb82898b3f53be47ebd429fb2fa5d/nvidia_nvtx-13.0.85-py3-none-manylinux1_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4936d1d6780fbe68db454f5e72a42ff64d1fd6397df9f363ae786930fd5c1cd4", size = 148047, upload-time = "2025-09-04T08:29:01.761Z" }, + { url = "https://files.pythonhosted.org/packages/a8/64/3708a90d1ebe202ffdeb7185f878a3c84d15c2b2c31858da2ce0583e2def/nvidia_nvtx-13.0.85-py3-none-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cb7780edb6b14107373c835bf8b72e7a178bac7367e23da7acb108f973f157a6", size = 148878, upload-time = "2025-09-04T08:28:53.627Z" }, +] + [[package]] name = "openai" version = "2.30.0" @@ -1769,28 +2259,44 @@ dev = [ { name = "types-pyyaml" }, ] train = [ + { name = "accelerate" }, + { name = "bitsandbytes" }, { name = "datasets" }, { name = "huggingface-hub" }, { name = "ipykernel" }, { name = "ipywidgets" }, { name = "jupyterlab" }, + { name = "matplotlib" }, + { name = "optuna" }, + { name = "peft" }, + { name = "transformers" }, + { name = "trl" }, + { name = "unsloth" }, ] [package.metadata] requires-dist = [ + { name = "accelerate", marker = "extra == 'train'" }, + { name = "bitsandbytes", marker = "extra == 'train'" }, { name = "datasets", marker = "extra == 'train'", specifier = ">=4.8.4" }, - { name = "huggingface-hub", marker = "extra == 'train'", specifier = ">=1.9.0" }, + { name = "huggingface-hub", marker = "extra == 'train'", specifier = ">=0.34,<1.0" }, { name = "ipykernel", marker = "extra == 'train'" }, { name = "ipywidgets", marker = "extra == 'train'", specifier = ">=8.1.0" }, { name = "jupyterlab", marker = "extra == 'train'" }, + { name = "matplotlib", marker = "extra == 'train'" }, { name = "ministack", editable = "aws_infra" }, { name = "mypy", marker = "extra == 'dev'", specifier = ">=1.10.0" }, { name = "openenv-core", extras = ["core"], specifier = ">=0.2.2" }, + { name = "optuna", marker = "extra == 'train'" }, + { name = "peft", marker = "extra == 'train'" }, { name = "pytest", marker = "extra == 'dev'", specifier = ">=8.0.0" }, { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=4.0.0" }, { name = "python-dotenv", specifier = ">=1.0.0" }, { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.4.0" }, + { name = "transformers", marker = "extra == 'train'", specifier = ">=4.50,<5.0" }, + { name = "trl", marker = "extra == 'train'", specifier = ">=0.18.2,!=0.19.0,<=0.24.0" }, { name = "types-pyyaml", marker = "extra == 'dev'", specifier = ">=6.0.0" }, + { name = "unsloth", marker = "extra == 'train'" }, ] provides-extras = ["dev", "train"] @@ -1842,6 +2348,24 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5f/bf/93795954016c522008da367da292adceed71cca6ee1717e1d64c83089099/opentelemetry_api-1.40.0-py3-none-any.whl", hash = "sha256:82dd69331ae74b06f6a874704be0cfaa49a1650e1537d4a813b86ecef7d0ecf9", size = 68676, upload-time = "2026-03-04T14:17:01.24Z" }, ] +[[package]] +name = "optuna" +version = "4.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "alembic" }, + { name = "colorlog" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "sqlalchemy" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bf/9b/62f120fb2ecbc4338bee70c5a3671c8e561714f3aa1a046b897ff142050e/optuna-4.8.0.tar.gz", hash = "sha256:6f7043e9f8ecb5e607af86a7eb00fb5ec2be26c3b08c201209a73d36aff37a38", size = 482603, upload-time = "2026-03-16T04:59:58.659Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/24/7c731839566d30dc70556d9824ef17692d896c15e3df627bce8c16f753e1/optuna-4.8.0-py3-none-any.whl", hash = "sha256:c57a7682679c36bfc9bca0da430698179e513874074b71bebedb0334964ab930", size = 419456, upload-time = "2026-03-16T04:59:56.977Z" }, +] + [[package]] name = "orjson" version = "3.11.8" @@ -1931,6 +2455,27 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, ] +[[package]] +name = "peft" +version = "0.19.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "accelerate" }, + { name = "huggingface-hub" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyyaml" }, + { name = "safetensors" }, + { name = "torch" }, + { name = "tqdm" }, + { name = "transformers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/86/cf/037f1e3d5186496c05513a6754639e2dab3038a05f384284d49a9bd06a2d/peft-0.19.1.tar.gz", hash = "sha256:0d97542fe96dcdaa20d3b81c06f26f988618f416a73544ab23c3618ccb674a40", size = 763738, upload-time = "2026-04-16T15:46:45.105Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/b6/f54d676ed93cc2dd2234c3b172ea9c8c3d7d29361e66b1b23dec57a67465/peft-0.19.1-py3-none-any.whl", hash = "sha256:2113f72a81621b5913ef28f9022204c742df111890c5f49d812716a4a301e356", size = 680692, upload-time = "2026-04-16T15:46:42.886Z" }, +] + [[package]] name = "pexpect" version = "4.9.0" @@ -2034,6 +2579,21 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, ] +[[package]] +name = "protobuf" +version = "7.34.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/6b/a0e95cad1ad7cc3f2c6821fcab91671bd5b78bd42afb357bb4765f29bc41/protobuf-7.34.1.tar.gz", hash = "sha256:9ce42245e704cc5027be797c1db1eb93184d44d1cdd71811fb2d9b25ad541280", size = 454708, upload-time = "2026-03-20T17:34:47.036Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/11/3325d41e6ee15bf1125654301211247b042563bcc898784351252549a8ad/protobuf-7.34.1-cp310-abi3-macosx_10_9_universal2.whl", hash = "sha256:d8b2cc79c4d8f62b293ad9b11ec3aebce9af481fa73e64556969f7345ebf9fc7", size = 429247, upload-time = "2026-03-20T17:34:37.024Z" }, + { url = "https://files.pythonhosted.org/packages/eb/9d/aa69df2724ff63efa6f72307b483ce0827f4347cc6d6df24b59e26659fef/protobuf-7.34.1-cp310-abi3-manylinux2014_aarch64.whl", hash = "sha256:5185e0e948d07abe94bb76ec9b8416b604cfe5da6f871d67aad30cbf24c3110b", size = 325753, upload-time = "2026-03-20T17:34:38.751Z" }, + { url = "https://files.pythonhosted.org/packages/92/e8/d174c91fd48e50101943f042b09af9029064810b734e4160bbe282fa1caa/protobuf-7.34.1-cp310-abi3-manylinux2014_s390x.whl", hash = "sha256:403b093a6e28a960372b44e5eb081775c9b056e816a8029c61231743d63f881a", size = 340198, upload-time = "2026-03-20T17:34:39.871Z" }, + { url = "https://files.pythonhosted.org/packages/53/1b/3b431694a4dc6d37b9f653f0c64b0a0d9ec074ee810710c0c3da21d67ba7/protobuf-7.34.1-cp310-abi3-manylinux2014_x86_64.whl", hash = "sha256:8ff40ce8cd688f7265326b38d5a1bed9bfdf5e6723d49961432f83e21d5713e4", size = 324267, upload-time = "2026-03-20T17:34:41.1Z" }, + { url = "https://files.pythonhosted.org/packages/85/29/64de04a0ac142fb685fd09999bc3d337943fb386f3a0ec57f92fd8203f97/protobuf-7.34.1-cp310-abi3-win32.whl", hash = "sha256:34b84ce27680df7cca9f231043ada0daa55d0c44a2ddfaa58ec1d0d89d8bf60a", size = 426628, upload-time = "2026-03-20T17:34:42.536Z" }, + { url = "https://files.pythonhosted.org/packages/4d/87/cb5e585192a22b8bd457df5a2c16a75ea0db9674c3a0a39fc9347d84e075/protobuf-7.34.1-cp310-abi3-win_amd64.whl", hash = "sha256:e97b55646e6ce5cbb0954a8c28cd39a5869b59090dfaa7df4598a7fba869468c", size = 437901, upload-time = "2026-03-20T17:34:44.112Z" }, + { url = "https://files.pythonhosted.org/packages/88/95/608f665226bca68b736b79e457fded9a2a38c4f4379a4a7614303d9db3bc/protobuf-7.34.1-py3-none-any.whl", hash = "sha256:bb3812cd53aefea2b028ef42bd780f5b96407247f20c6ef7c679807e9d188f11", size = 170715, upload-time = "2026-03-20T17:34:45.384Z" }, +] + [[package]] name = "psutil" version = "7.2.2" @@ -2212,6 +2772,15 @@ crypto = [ { name = "cryptography" }, ] +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + [[package]] name = "pyperclip" version = "1.11.0" @@ -2381,6 +2950,30 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, ] +[[package]] +name = "regex" +version = "2026.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cb/0e/3a246dbf05666918bd3664d9d787f84a9108f6f43cc953a077e4a7dfdb7e/regex-2026.4.4.tar.gz", hash = "sha256:e08270659717f6973523ce3afbafa53515c4dc5dcad637dc215b6fd50f689423", size = 416000, upload-time = "2026-04-03T20:56:28.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/28/b972a4d3df61e1d7bcf1b59fdb3cddef22f88b6be43f161bb41ebc0e4081/regex-2026.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c07ab8794fa929e58d97a0e1796b8b76f70943fa39df225ac9964615cf1f9d52", size = 490434, upload-time = "2026-04-03T20:53:40.219Z" }, + { url = "https://files.pythonhosted.org/packages/84/20/30041446cf6dc3e0eab344fc62770e84c23b6b68a3b657821f9f80cb69b4/regex-2026.4.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2c785939dc023a1ce4ec09599c032cc9933d258a998d16ca6f2b596c010940eb", size = 292061, upload-time = "2026-04-03T20:53:41.862Z" }, + { url = "https://files.pythonhosted.org/packages/62/c8/3baa06d75c98c46d4cc4262b71fd2edb9062b5665e868bca57859dadf93a/regex-2026.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b1ce5c81c9114f1ce2f9288a51a8fd3aeea33a0cc440c415bf02da323aa0a76", size = 289628, upload-time = "2026-04-03T20:53:43.701Z" }, + { url = "https://files.pythonhosted.org/packages/31/87/3accf55634caad8c0acab23f5135ef7d4a21c39f28c55c816ae012931408/regex-2026.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:760ef21c17d8e6a4fe8cf406a97cf2806a4df93416ccc82fc98d25b1c20425be", size = 796651, upload-time = "2026-04-03T20:53:45.379Z" }, + { url = "https://files.pythonhosted.org/packages/f6/0c/aaa2c83f34efedbf06f61cb1942c25f6cf1ee3b200f832c4d05f28306c2e/regex-2026.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7088fcdcb604a4417c208e2169715800d28838fefd7455fbe40416231d1d47c1", size = 865916, upload-time = "2026-04-03T20:53:47.064Z" }, + { url = "https://files.pythonhosted.org/packages/d9/f6/8c6924c865124643e8f37823eca845dc27ac509b2ee58123685e71cd0279/regex-2026.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:07edca1ba687998968f7db5bc355288d0c6505caa7374f013d27356d93976d13", size = 912287, upload-time = "2026-04-03T20:53:49.422Z" }, + { url = "https://files.pythonhosted.org/packages/11/0e/a9f6f81013e0deaf559b25711623864970fe6a098314e374ccb1540a4152/regex-2026.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:993f657a7c1c6ec51b5e0ba97c9817d06b84ea5fa8d82e43b9405de0defdc2b9", size = 801126, upload-time = "2026-04-03T20:53:51.096Z" }, + { url = "https://files.pythonhosted.org/packages/71/61/3a0cc8af2dc0c8deb48e644dd2521f173f7e6513c6e195aad9aa8dd77ac5/regex-2026.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:2b69102a743e7569ebee67e634a69c4cb7e59d6fa2e1aa7d3bdbf3f61435f62d", size = 776788, upload-time = "2026-04-03T20:53:52.889Z" }, + { url = "https://files.pythonhosted.org/packages/64/0b/8bb9cbf21ef7dee58e49b0fdb066a7aded146c823202e16494a36777594f/regex-2026.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6dac006c8b6dda72d86ea3d1333d45147de79a3a3f26f10c1cf9287ca4ca0ac3", size = 785184, upload-time = "2026-04-03T20:53:55.627Z" }, + { url = "https://files.pythonhosted.org/packages/99/c2/d3e80e8137b25ee06c92627de4e4d98b94830e02b3e6f81f3d2e3f504cf5/regex-2026.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:50a766ee2010d504554bfb5f578ed2e066898aa26411d57e6296230627cdefa0", size = 859913, upload-time = "2026-04-03T20:53:57.249Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/9d5d876157d969c804622456ef250017ac7a8f83e0e14f903b9e6df5ce95/regex-2026.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:9e2f5217648f68e3028c823df58663587c1507a5ba8419f4fdfc8a461be76043", size = 765732, upload-time = "2026-04-03T20:53:59.428Z" }, + { url = "https://files.pythonhosted.org/packages/82/80/b568935b4421388561c8ed42aff77247285d3ae3bb2a6ca22af63bae805e/regex-2026.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:39d8de85a08e32632974151ba59c6e9140646dcc36c80423962b1c5c0a92e244", size = 852152, upload-time = "2026-04-03T20:54:01.505Z" }, + { url = "https://files.pythonhosted.org/packages/39/29/f0f81217e21cd998245da047405366385d5c6072048038a3d33b37a79dc0/regex-2026.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:55d9304e0e7178dfb1e106c33edf834097ddf4a890e2f676f6c5118f84390f73", size = 789076, upload-time = "2026-04-03T20:54:03.323Z" }, + { url = "https://files.pythonhosted.org/packages/49/1d/1d957a61976ab9d4e767dd4f9d04b66cc0c41c5e36cf40e2d43688b5ae6f/regex-2026.4.4-cp312-cp312-win32.whl", hash = "sha256:04bb679bc0bde8a7bfb71e991493d47314e7b98380b083df2447cda4b6edb60f", size = 266700, upload-time = "2026-04-03T20:54:05.639Z" }, + { url = "https://files.pythonhosted.org/packages/c5/5c/bf575d396aeb58ea13b06ef2adf624f65b70fafef6950a80fc3da9cae3bc/regex-2026.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:db0ac18435a40a2543dbb3d21e161a6c78e33e8159bd2e009343d224bb03bb1b", size = 277768, upload-time = "2026-04-03T20:54:07.312Z" }, + { url = "https://files.pythonhosted.org/packages/c9/27/049df16ec6a6828ccd72add3c7f54b4df029669bea8e9817df6fff58be90/regex-2026.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:4ce255cc05c1947a12989c6db801c96461947adb7a59990f1360b5983fab4983", size = 270568, upload-time = "2026-04-03T20:54:09.484Z" }, +] + [[package]] name = "requests" version = "2.33.1" @@ -2515,6 +3108,28 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2e/a3/0f0b7d78e2f1eb9e8e1afbff1d2bff8d60144aee17aca51c065b516743dd/safehttpx-0.1.7-py3-none-any.whl", hash = "sha256:c4f4a162db6993464d7ca3d7cc4af0ffc6515a606dfd220b9f82c6945d869cde", size = 8959, upload-time = "2025-10-24T18:30:08.733Z" }, ] +[[package]] +name = "safetensors" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/29/9c/6e74567782559a63bd040a236edca26fd71bc7ba88de2ef35d75df3bca5e/safetensors-0.7.0.tar.gz", hash = "sha256:07663963b67e8bd9f0b8ad15bb9163606cd27cc5a1b96235a50d8369803b96b0", size = 200878, upload-time = "2025-11-19T15:18:43.199Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/47/aef6c06649039accf914afef490268e1067ed82be62bcfa5b7e886ad15e8/safetensors-0.7.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c82f4d474cf725255d9e6acf17252991c3c8aac038d6ef363a4bf8be2f6db517", size = 467781, upload-time = "2025-11-19T15:18:35.84Z" }, + { url = "https://files.pythonhosted.org/packages/e8/00/374c0c068e30cd31f1e1b46b4b5738168ec79e7689ca82ee93ddfea05109/safetensors-0.7.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:94fd4858284736bb67a897a41608b5b0c2496c9bdb3bf2af1fa3409127f20d57", size = 447058, upload-time = "2025-11-19T15:18:34.416Z" }, + { url = "https://files.pythonhosted.org/packages/f1/06/578ffed52c2296f93d7fd2d844cabfa92be51a587c38c8afbb8ae449ca89/safetensors-0.7.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e07d91d0c92a31200f25351f4acb2bc6aff7f48094e13ebb1d0fb995b54b6542", size = 491748, upload-time = "2025-11-19T15:18:09.79Z" }, + { url = "https://files.pythonhosted.org/packages/ae/33/1debbbb70e4791dde185edb9413d1fe01619255abb64b300157d7f15dddd/safetensors-0.7.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8469155f4cb518bafb4acf4865e8bb9d6804110d2d9bdcaa78564b9fd841e104", size = 503881, upload-time = "2025-11-19T15:18:16.145Z" }, + { url = "https://files.pythonhosted.org/packages/8e/1c/40c2ca924d60792c3be509833df711b553c60effbd91da6f5284a83f7122/safetensors-0.7.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54bef08bf00a2bff599982f6b08e8770e09cc012d7bba00783fc7ea38f1fb37d", size = 623463, upload-time = "2025-11-19T15:18:21.11Z" }, + { url = "https://files.pythonhosted.org/packages/9b/3a/13784a9364bd43b0d61eef4bea2845039bc2030458b16594a1bd787ae26e/safetensors-0.7.0-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42cb091236206bb2016d245c377ed383aa7f78691748f3bb6ee1bfa51ae2ce6a", size = 532855, upload-time = "2025-11-19T15:18:25.719Z" }, + { url = "https://files.pythonhosted.org/packages/a0/60/429e9b1cb3fc651937727befe258ea24122d9663e4d5709a48c9cbfceecb/safetensors-0.7.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac7252938f0696ddea46f5e855dd3138444e82236e3be475f54929f0c510d48", size = 507152, upload-time = "2025-11-19T15:18:33.023Z" }, + { url = "https://files.pythonhosted.org/packages/3c/a8/4b45e4e059270d17af60359713ffd83f97900d45a6afa73aaa0d737d48b6/safetensors-0.7.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1d060c70284127fa805085d8f10fbd0962792aed71879d00864acda69dbab981", size = 541856, upload-time = "2025-11-19T15:18:31.075Z" }, + { url = "https://files.pythonhosted.org/packages/06/87/d26d8407c44175d8ae164a95b5a62707fcc445f3c0c56108e37d98070a3d/safetensors-0.7.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cdab83a366799fa730f90a4ebb563e494f28e9e92c4819e556152ad55e43591b", size = 674060, upload-time = "2025-11-19T15:18:37.211Z" }, + { url = "https://files.pythonhosted.org/packages/11/f5/57644a2ff08dc6325816ba7217e5095f17269dada2554b658442c66aed51/safetensors-0.7.0-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:672132907fcad9f2aedcb705b2d7b3b93354a2aec1b2f706c4db852abe338f85", size = 771715, upload-time = "2025-11-19T15:18:38.689Z" }, + { url = "https://files.pythonhosted.org/packages/86/31/17883e13a814bd278ae6e266b13282a01049b0c81341da7fd0e3e71a80a3/safetensors-0.7.0-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:5d72abdb8a4d56d4020713724ba81dac065fedb7f3667151c4a637f1d3fb26c0", size = 714377, upload-time = "2025-11-19T15:18:40.162Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d8/0c8a7dc9b41dcac53c4cbf9df2b9c83e0e0097203de8b37a712b345c0be5/safetensors-0.7.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b0f6d66c1c538d5a94a73aa9ddca8ccc4227e6c9ff555322ea40bdd142391dd4", size = 677368, upload-time = "2025-11-19T15:18:41.627Z" }, + { url = "https://files.pythonhosted.org/packages/05/e5/cb4b713c8a93469e3c5be7c3f8d77d307e65fe89673e731f5c2bfd0a9237/safetensors-0.7.0-cp38-abi3-win32.whl", hash = "sha256:c74af94bf3ac15ac4d0f2a7c7b4663a15f8c2ab15ed0fc7531ca61d0835eccba", size = 326423, upload-time = "2025-11-19T15:18:45.74Z" }, + { url = "https://files.pythonhosted.org/packages/5d/e6/ec8471c8072382cb91233ba7267fd931219753bb43814cbc71757bfd4dab/safetensors-0.7.0-cp38-abi3-win_amd64.whl", hash = "sha256:d1239932053f56f3456f32eb9625590cc7582e905021f94636202a864d470755", size = 341380, upload-time = "2025-11-19T15:18:44.427Z" }, +] + [[package]] name = "secretstorage" version = "3.5.0" @@ -2546,13 +3161,29 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/1c/78/504fdd027da3b84ff1aecd9f6957e65f35134534ccc6da8628eb71e76d3f/send2trash-2.1.0-py3-none-any.whl", hash = "sha256:0da2f112e6d6bb22de6aa6daa7e144831a4febf2a87261451c4ad849fe9a873c", size = 17610, upload-time = "2026-01-14T06:27:35.218Z" }, ] +[[package]] +name = "sentencepiece" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/15/2e7a025fc62d764b151ae6d0f2a92f8081755ebe8d4a64099accc6f77ba6/sentencepiece-0.2.1.tar.gz", hash = "sha256:8138cec27c2f2282f4a34d9a016e3374cd40e5c6e9cb335063db66a0a3b71fad", size = 3228515, upload-time = "2025-08-12T07:00:51.718Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/be/32ce495aa1d0e0c323dcb1ba87096037358edee539cac5baf8755a6bd396/sentencepiece-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:57cae326c8727de58c85977b175af132a7138d84c764635d7e71bbee7e774133", size = 1943152, upload-time = "2025-08-12T06:59:40.048Z" }, + { url = "https://files.pythonhosted.org/packages/88/7e/ff23008899a58678e98c6ff592bf4d368eee5a71af96d0df6b38a039dd4f/sentencepiece-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:56dd39a3c4d6493db3cdca7e8cc68c6b633f0d4195495cbadfcf5af8a22d05a6", size = 1325651, upload-time = "2025-08-12T06:59:41.536Z" }, + { url = "https://files.pythonhosted.org/packages/19/84/42eb3ce4796777a1b5d3699dfd4dca85113e68b637f194a6c8d786f16a04/sentencepiece-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d9381351182ff9888cc80e41c632e7e274b106f450de33d67a9e8f6043da6f76", size = 1253645, upload-time = "2025-08-12T06:59:42.903Z" }, + { url = "https://files.pythonhosted.org/packages/89/fa/d3d5ebcba3cb9e6d3775a096251860c41a6bc53a1b9461151df83fe93255/sentencepiece-0.2.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99f955df238021bf11f0fc37cdb54fd5e5b5f7fd30ecc3d93fb48b6815437167", size = 1316273, upload-time = "2025-08-12T06:59:44.476Z" }, + { url = "https://files.pythonhosted.org/packages/04/88/14f2f4a2b922d8b39be45bf63d79e6cd3a9b2f248b2fcb98a69b12af12f5/sentencepiece-0.2.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cdfecef430d985f1c2bcbfff3defd1d95dae876fbd0173376012d2d7d24044b", size = 1387881, upload-time = "2025-08-12T06:59:46.09Z" }, + { url = "https://files.pythonhosted.org/packages/fd/b8/903e5ccb77b4ef140605d5d71b4f9e0ad95d456d6184688073ed11712809/sentencepiece-0.2.1-cp312-cp312-win32.whl", hash = "sha256:a483fd29a34c3e34c39ac5556b0a90942bec253d260235729e50976f5dba1068", size = 999540, upload-time = "2025-08-12T06:59:48.023Z" }, + { url = "https://files.pythonhosted.org/packages/2d/81/92df5673c067148c2545b1bfe49adfd775bcc3a169a047f5a0e6575ddaca/sentencepiece-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:4cdc7c36234fda305e85c32949c5211faaf8dd886096c7cea289ddc12a2d02de", size = 1054671, upload-time = "2025-08-12T06:59:49.895Z" }, + { url = "https://files.pythonhosted.org/packages/fe/02/c5e3bc518655d714622bec87d83db9cdba1cd0619a4a04e2109751c4f47f/sentencepiece-0.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:daeb5e9e9fcad012324807856113708614d534f596d5008638eb9b40112cd9e4", size = 1033923, upload-time = "2025-08-12T06:59:51.952Z" }, +] + [[package]] name = "setuptools" -version = "82.0.1" +version = "81.0.0" source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4f/db/cfac1baf10650ab4d1c111714410d2fbb77ac5a616db26775db562c8fab2/setuptools-82.0.1.tar.gz", hash = "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9", size = 1152316, upload-time = "2026-03-09T12:47:17.221Z" } +sdist = { url = "https://files.pythonhosted.org/packages/0d/1c/73e719955c59b8e424d015ab450f51c0af856ae46ea2da83eba51cc88de1/setuptools-81.0.0.tar.gz", hash = "sha256:487b53915f52501f0a79ccfd0c02c165ffe06631443a886740b91af4b7a5845a", size = 1198299, upload-time = "2026-02-06T21:10:39.601Z" } wheels = [ - { url = "https://files.pythonhosted.org/packages/9d/76/f789f7a86709c6b087c5a2f52f911838cad707cc613162401badc665acfe/setuptools-82.0.1-py3-none-any.whl", hash = "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb", size = 1006223, upload-time = "2026-03-09T12:47:15.026Z" }, + { url = "https://files.pythonhosted.org/packages/e1/e3/c164c88b2e5ce7b24d667b9bd83589cf4f3520d97cad01534cd3c4f55fdb/setuptools-81.0.0-py3-none-any.whl", hash = "sha256:fdd925d5c5d9f62e4b74b30d6dd7828ce236fd6ed998a08d81de62ce5a6310d6", size = 1062021, upload-time = "2026-02-06T21:10:37.175Z" }, ] [[package]] @@ -2591,6 +3222,26 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/46/2c/1462b1d0a634697ae9e55b3cecdcb64788e8b7d63f54d923fcd0bb140aed/soupsieve-2.8.3-py3-none-any.whl", hash = "sha256:ed64f2ba4eebeab06cc4962affce381647455978ffc1e36bb79a545b91f45a95", size = 37016, upload-time = "2026-01-20T04:27:01.012Z" }, ] +[[package]] +name = "sqlalchemy" +version = "2.0.49" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/45/461788f35e0364a8da7bda51a1fe1b09762d0c32f12f63727998d85a873b/sqlalchemy-2.0.49.tar.gz", hash = "sha256:d15950a57a210e36dd4cec1aac22787e2a4d57ba9318233e2ef8b2daf9ff2d5f", size = 9898221, upload-time = "2026-04-03T16:38:11.704Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/b3/2de412451330756aaaa72d27131db6dde23995efe62c941184e15242a5fa/sqlalchemy-2.0.49-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4bbccb45260e4ff1b7db0be80a9025bb1e6698bdb808b83fff0000f7a90b2c0b", size = 2157681, upload-time = "2026-04-03T16:53:07.132Z" }, + { url = "https://files.pythonhosted.org/packages/50/84/b2a56e2105bd11ebf9f0b93abddd748e1a78d592819099359aa98134a8bf/sqlalchemy-2.0.49-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fb37f15714ec2652d574f021d479e78cd4eb9d04396dca36568fdfffb3487982", size = 3338976, upload-time = "2026-04-03T17:07:40Z" }, + { url = "https://files.pythonhosted.org/packages/2c/fa/65fcae2ed62f84ab72cf89536c7c3217a156e71a2c111b1305ab6f0690e2/sqlalchemy-2.0.49-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3bb9ec6436a820a4c006aad1ac351f12de2f2dbdaad171692ee457a02429b672", size = 3351937, upload-time = "2026-04-03T17:12:23.374Z" }, + { url = "https://files.pythonhosted.org/packages/f8/2f/6fd118563572a7fe475925742eb6b3443b2250e346a0cc27d8d408e73773/sqlalchemy-2.0.49-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8d6efc136f44a7e8bc8088507eaabbb8c2b55b3dbb63fe102c690da0ddebe55e", size = 3281646, upload-time = "2026-04-03T17:07:41.949Z" }, + { url = "https://files.pythonhosted.org/packages/c5/d7/410f4a007c65275b9cf82354adb4bb8ba587b176d0a6ee99caa16fe638f8/sqlalchemy-2.0.49-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e06e617e3d4fd9e51d385dfe45b077a41e9d1b033a7702551e3278ac597dc750", size = 3316695, upload-time = "2026-04-03T17:12:25.642Z" }, + { url = "https://files.pythonhosted.org/packages/d9/95/81f594aa60ded13273a844539041ccf1e66c5a7bed0a8e27810a3b52d522/sqlalchemy-2.0.49-cp312-cp312-win32.whl", hash = "sha256:83101a6930332b87653886c01d1ee7e294b1fe46a07dd9a2d2b4f91bcc88eec0", size = 2117483, upload-time = "2026-04-03T17:05:40.896Z" }, + { url = "https://files.pythonhosted.org/packages/47/9e/fd90114059175cac64e4fafa9bf3ac20584384d66de40793ae2e2f26f3bb/sqlalchemy-2.0.49-cp312-cp312-win_amd64.whl", hash = "sha256:618a308215b6cececb6240b9abde545e3acdabac7ae3e1d4e666896bf5ba44b4", size = 2144494, upload-time = "2026-04-03T17:05:42.282Z" }, + { url = "https://files.pythonhosted.org/packages/e5/30/8519fdde58a7bdf155b714359791ad1dc018b47d60269d5d160d311fdc36/sqlalchemy-2.0.49-py3-none-any.whl", hash = "sha256:ec44cfa7ef1a728e88ad41674de50f6db8cfdb3e2af84af86e0041aaf02d43d0", size = 1942158, upload-time = "2026-04-03T16:53:44.135Z" }, +] + [[package]] name = "sse-starlette" version = "3.3.4" @@ -2631,6 +3282,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0b/c9/584bc9651441b4ba60cc4d557d8a547b5aff901af35bda3a4ee30c819b82/starlette-1.0.0-py3-none-any.whl", hash = "sha256:d3ec55e0bb321692d275455ddfd3df75fff145d009685eb40dc91fc66b03d38b", size = 72651, upload-time = "2026-03-22T18:29:45.111Z" }, ] +[[package]] +name = "sympy" +version = "1.14.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mpmath" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, +] + [[package]] name = "terminado" version = "0.18.1" @@ -2657,6 +3320,32 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e6/34/ebdc18bae6aa14fbee1a08b63c015c72b64868ff7dae68808ab500c492e2/tinycss2-1.4.0-py3-none-any.whl", hash = "sha256:3a49cf47b7675da0b15d0c6e1df8df4ebd96e9394bb905a5775adb0d884c5289", size = 26610, upload-time = "2024-10-24T14:58:28.029Z" }, ] +[[package]] +name = "tokenizers" +version = "0.22.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "huggingface-hub" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/73/6f/f80cfef4a312e1fb34baf7d85c72d4411afde10978d4657f8cdd811d3ccc/tokenizers-0.22.2.tar.gz", hash = "sha256:473b83b915e547aa366d1eee11806deaf419e17be16310ac0a14077f1e28f917", size = 372115, upload-time = "2026-01-05T10:45:15.988Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/97/5dbfabf04c7e348e655e907ed27913e03db0923abb5dfdd120d7b25630e1/tokenizers-0.22.2-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:544dd704ae7238755d790de45ba8da072e9af3eea688f698b137915ae959281c", size = 3100275, upload-time = "2026-01-05T10:41:02.158Z" }, + { url = "https://files.pythonhosted.org/packages/2e/47/174dca0502ef88b28f1c9e06b73ce33500eedfac7a7692108aec220464e7/tokenizers-0.22.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:1e418a55456beedca4621dbab65a318981467a2b188e982a23e117f115ce5001", size = 2981472, upload-time = "2026-01-05T10:41:00.276Z" }, + { url = "https://files.pythonhosted.org/packages/d6/84/7990e799f1309a8b87af6b948f31edaa12a3ed22d11b352eaf4f4b2e5753/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2249487018adec45d6e3554c71d46eb39fa8ea67156c640f7513eb26f318cec7", size = 3290736, upload-time = "2026-01-05T10:40:32.165Z" }, + { url = "https://files.pythonhosted.org/packages/78/59/09d0d9ba94dcd5f4f1368d4858d24546b4bdc0231c2354aa31d6199f0399/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25b85325d0815e86e0bac263506dd114578953b7b53d7de09a6485e4a160a7dd", size = 3168835, upload-time = "2026-01-05T10:40:38.847Z" }, + { url = "https://files.pythonhosted.org/packages/47/50/b3ebb4243e7160bda8d34b731e54dd8ab8b133e50775872e7a434e524c28/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfb88f22a209ff7b40a576d5324bf8286b519d7358663db21d6246fb17eea2d5", size = 3521673, upload-time = "2026-01-05T10:40:56.614Z" }, + { url = "https://files.pythonhosted.org/packages/e0/fa/89f4cb9e08df770b57adb96f8cbb7e22695a4cb6c2bd5f0c4f0ebcf33b66/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c774b1276f71e1ef716e5486f21e76333464f47bece56bbd554485982a9e03e", size = 3724818, upload-time = "2026-01-05T10:40:44.507Z" }, + { url = "https://files.pythonhosted.org/packages/64/04/ca2363f0bfbe3b3d36e95bf67e56a4c88c8e3362b658e616d1ac185d47f2/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df6c4265b289083bf710dff49bc51ef252f9d5be33a45ee2bed151114a56207b", size = 3379195, upload-time = "2026-01-05T10:40:51.139Z" }, + { url = "https://files.pythonhosted.org/packages/2e/76/932be4b50ef6ccedf9d3c6639b056a967a86258c6d9200643f01269211ca/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:369cc9fc8cc10cb24143873a0d95438bb8ee257bb80c71989e3ee290e8d72c67", size = 3274982, upload-time = "2026-01-05T10:40:58.331Z" }, + { url = "https://files.pythonhosted.org/packages/1d/28/5f9f5a4cc211b69e89420980e483831bcc29dade307955cc9dc858a40f01/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:29c30b83d8dcd061078b05ae0cb94d3c710555fbb44861139f9f83dcca3dc3e4", size = 9478245, upload-time = "2026-01-05T10:41:04.053Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fb/66e2da4704d6aadebf8cb39f1d6d1957df667ab24cff2326b77cda0dcb85/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:37ae80a28c1d3265bb1f22464c856bd23c02a05bb211e56d0c5301a435be6c1a", size = 9560069, upload-time = "2026-01-05T10:45:10.673Z" }, + { url = "https://files.pythonhosted.org/packages/16/04/fed398b05caa87ce9b1a1bb5166645e38196081b225059a6edaff6440fac/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:791135ee325f2336f498590eb2f11dc5c295232f288e75c99a36c5dbce63088a", size = 9899263, upload-time = "2026-01-05T10:45:12.559Z" }, + { url = "https://files.pythonhosted.org/packages/05/a1/d62dfe7376beaaf1394917e0f8e93ee5f67fea8fcf4107501db35996586b/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38337540fbbddff8e999d59970f3c6f35a82de10053206a7562f1ea02d046fa5", size = 10033429, upload-time = "2026-01-05T10:45:14.333Z" }, + { url = "https://files.pythonhosted.org/packages/fd/18/a545c4ea42af3df6effd7d13d250ba77a0a86fb20393143bbb9a92e434d4/tokenizers-0.22.2-cp39-abi3-win32.whl", hash = "sha256:a6bf3f88c554a2b653af81f3204491c818ae2ac6fbc09e76ef4773351292bc92", size = 2502363, upload-time = "2026-01-05T10:45:20.593Z" }, + { url = "https://files.pythonhosted.org/packages/65/71/0670843133a43d43070abeb1949abfdef12a86d490bea9cd9e18e37c5ff7/tokenizers-0.22.2-cp39-abi3-win_amd64.whl", hash = "sha256:c9ea31edff2968b44a88f97d784c2f16dc0729b8b143ed004699ebca91f05c48", size = 2747786, upload-time = "2026-01-05T10:45:18.411Z" }, + { url = "https://files.pythonhosted.org/packages/72/f4/0de46cfa12cdcbcd464cc59fde36912af405696f687e53a091fb432f694c/tokenizers-0.22.2-cp39-abi3-win_arm64.whl", hash = "sha256:9ce725d22864a1e965217204946f830c37876eee3b2ba6fc6255e8e903d5fcbc", size = 2612133, upload-time = "2026-01-05T10:45:17.232Z" }, +] + [[package]] name = "tomli" version = "2.4.1" @@ -2693,6 +3382,58 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901, upload-time = "2025-06-05T07:13:43.546Z" }, ] +[[package]] +name = "torch" +version = "2.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cuda-bindings", marker = "sys_platform == 'linux'" }, + { name = "cuda-toolkit", extra = ["cublas", "cudart", "cufft", "cufile", "cupti", "curand", "cusolver", "cusparse", "nvjitlink", "nvrtc", "nvtx"], marker = "sys_platform == 'linux'" }, + { name = "filelock" }, + { name = "fsspec" }, + { name = "jinja2" }, + { name = "networkx" }, + { name = "nvidia-cudnn-cu13", marker = "sys_platform == 'linux'" }, + { name = "nvidia-cusparselt-cu13", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nccl-cu13", marker = "sys_platform == 'linux'" }, + { name = "nvidia-nvshmem-cu13", marker = "sys_platform == 'linux'" }, + { name = "setuptools" }, + { name = "sympy" }, + { name = "triton", marker = "sys_platform == 'linux'" }, + { name = "typing-extensions" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/6f/8b/69e3008d78e5cee2b30183340cc425081b78afc5eff3d080daab0adda9aa/torch-2.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4b5866312ee6e52ea625cd211dcb97d6a2cdc1131a5f15cc0d87eec948f6dd34", size = 80606338, upload-time = "2026-03-23T18:11:34.781Z" }, + { url = "https://files.pythonhosted.org/packages/13/16/42e5915ebe4868caa6bac83a8ed59db57f12e9a61b7d749d584776ed53d5/torch-2.11.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f99924682ef0aa6a4ab3b1b76f40dc6e273fca09f367d15a524266db100a723f", size = 419731115, upload-time = "2026-03-23T18:11:06.944Z" }, + { url = "https://files.pythonhosted.org/packages/1a/c9/82638ef24d7877510f83baf821f5619a61b45568ce21c0a87a91576510aa/torch-2.11.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:0f68f4ac6d95d12e896c3b7a912b5871619542ec54d3649cf48cc1edd4dd2756", size = 530712279, upload-time = "2026-03-23T18:10:31.481Z" }, + { url = "https://files.pythonhosted.org/packages/1c/ff/6756f1c7ee302f6d202120e0f4f05b432b839908f9071157302cedfc5232/torch-2.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:fbf39280699d1b869f55eac536deceaa1b60bd6788ba74f399cc67e60a5fab10", size = 114556047, upload-time = "2026-03-23T18:10:55.931Z" }, +] + +[[package]] +name = "torchao" +version = "0.17.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/fe/a4036a8e80fa800c92dbcbf75f541cd4c106248b6b579db6dab1800f616a/torchao-0.17.0-cp310-abi3-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:87a418ce0ec064a821ceab83c921b501acef0ce9a6ccd1be358fcd16c3ae8c58", size = 3206172, upload-time = "2026-03-30T22:25:52.974Z" }, + { url = "https://files.pythonhosted.org/packages/c9/37/ef37ca885265e5f79a168616767dd416a3cea1cc3b28bb6b503ce4a5b652/torchao-0.17.0-py3-none-any.whl", hash = "sha256:02eba449036715b9ae784fbaa1a6f97994bb7b0421ce92d1d5d1c08e5bd6d349", size = 1200680, upload-time = "2026-03-30T22:25:54.457Z" }, +] + +[[package]] +name = "torchvision" +version = "0.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "pillow" }, + { name = "torch" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/e7/56b47cc3b132aea90ccce22bcb8975dec688b002150012acc842846039d0/torchvision-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:c409e1c3fdebec7a3834465086dbda8bf7680eff79abf7fd2f10c6b59520a7a4", size = 1863502, upload-time = "2026-03-23T18:12:57.326Z" }, + { url = "https://files.pythonhosted.org/packages/f4/ec/5c31c92c08b65662fe9604a4067ae8232582805949f11ddc042cebe818ed/torchvision-0.26.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:406557718e62fdf10f5706e88d8a5ec000f872da913bf629aab9297622585547", size = 7767944, upload-time = "2026-03-23T18:12:42.805Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d8/cb6ccda1a1f35a6597645818641701207b3e8e13553e75fce5d86bac74b2/torchvision-0.26.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d61a5abb6b42a0c0c311996c2ac4b83a94418a97182c83b055a2a4ae985e05aa", size = 7522205, upload-time = "2026-03-23T18:12:54.654Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a9/c272623a0f735c35f0f6cd6dc74784d4f970e800cf063bb76687895a2ab9/torchvision-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:7993c01648e7c61d191b018e84d38fe0825c8fcb2720cd0f37caf7ba14404aa1", size = 4255155, upload-time = "2026-03-23T18:12:32.652Z" }, +] + [[package]] name = "tornado" version = "6.5.5" @@ -2731,6 +3472,70 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, ] +[[package]] +name = "transformers" +version = "4.57.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "huggingface-hub" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "regex" }, + { name = "requests" }, + { name = "safetensors" }, + { name = "tokenizers" }, + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/98/cf2515dba32791abe0540a252ccae7dc4f12fdeb03258182b6f014a78360/transformers-4.57.2.tar.gz", hash = "sha256:172a455ad5a570ecad89bea510a6c924c45fa90e46e859225fac07305d7946fc", size = 10141231, upload-time = "2025-11-24T17:54:14.293Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/21/15c69470cf94857d4664e74554fa01248eb57428fed831929405a0a63b0a/transformers-4.57.2-py3-none-any.whl", hash = "sha256:0918df354853c9931a637792cec519e137aceb150effd4c7924d6b8d36918fab", size = 11993097, upload-time = "2025-11-24T17:54:10.472Z" }, +] + +[[package]] +name = "triton" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/5d/08201db32823bdf77a0e2b9039540080b2e5c23a20706ddba942924ebcd6/triton-3.6.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:374f52c11a711fd062b4bfbb201fd9ac0a5febd28a96fb41b4a0f51dde3157f4", size = 176128243, upload-time = "2026-01-20T16:16:07.857Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a8/cdf8b3e4c98132f965f88c2313a4b493266832ad47fb52f23d14d4f86bb5/triton-3.6.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74caf5e34b66d9f3a429af689c1c7128daba1d8208df60e81106b115c00d6fca", size = 188266850, upload-time = "2026-01-20T16:00:43.041Z" }, +] + +[[package]] +name = "triton-windows" +version = "3.6.0.post26" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/1e/8d9814e67ba3f20094cf3c69e7815a491f20beb86469a647550ba86728b0/triton_windows-3.6.0.post26-cp312-cp312-win_amd64.whl", hash = "sha256:189d8c57911aa9d2ff983a715e5c967b325f576307db60924cab22b501a36515", size = 47402104, upload-time = "2026-03-10T02:51:40.997Z" }, +] + +[[package]] +name = "trl" +version = "0.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "accelerate" }, + { name = "datasets" }, + { name = "transformers" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/45/18/c18e27f6156cf961791ca7abcd4ee5fc8c5ae0fbb936c59827852ee118f5/trl-0.23.0.tar.gz", hash = "sha256:abfe0ecfa6b7e46022552b9dd0cc288bf2c4ef19364ce7765d10218b62b618f1", size = 515765, upload-time = "2025-09-10T04:16:42.377Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/81/035cace9b8853df794db0499299273abef30de889602587efa2a95c7dccb/trl-0.23.0-py3-none-any.whl", hash = "sha256:bb8f35a6a1531bad2d52032add29380413bd9b032d133ab6df16d2191f14f9e6", size = 564734, upload-time = "2025-09-10T04:16:40.34Z" }, +] + +[[package]] +name = "typeguard" +version = "4.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/2b/e8/66e25efcc18542d58706ce4e50415710593721aae26e794ab1dec34fb66f/typeguard-4.5.1.tar.gz", hash = "sha256:f6f8ecbbc819c9bc749983cc67c02391e16a9b43b8b27f15dc70ed7c4a007274", size = 80121, upload-time = "2026-02-19T16:09:03.392Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/88/b55b3117287a8540b76dbdd87733808d4d01c8067a3b339408c250bb3600/typeguard-4.5.1-py3-none-any.whl", hash = "sha256:44d2bf329d49a244110a090b55f5f91aa82d9a9834ebfd30bcc73651e4a8cc40", size = 36745, upload-time = "2026-02-19T16:09:01.6Z" }, +] + [[package]] name = "typer" version = "0.24.1" @@ -2776,6 +3581,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, ] +[[package]] +name = "tyro" +version = "1.0.13" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "docstring-parser" }, + { name = "typeguard" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/24/d6/7126f9e7de139632134d59b5d1972e93c610ee2cb13829e8f4f48f6613cb/tyro-1.0.13.tar.gz", hash = "sha256:731a90c9836b77fffe7c3fa0477ef2d3b6fa91252ddc0bb4d32dadd4fcc143d4", size = 489479, upload-time = "2026-04-14T18:21:52.888Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/4f/c43a0a8f0c66fd40a1d6cc47332a5a1d1043e9b331f7070ea701b91a7598/tyro-1.0.13-py3-none-any.whl", hash = "sha256:a0bdb8462c551dd84fc00a76916ce4d37e879c84eefaf34e2165312407cc6c09", size = 185221, upload-time = "2026-04-14T18:21:54.328Z" }, +] + [[package]] name = "tzdata" version = "2025.3" @@ -2794,6 +3613,76 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ff/7f/4320d9ce3be404e6310b915c3629fe27bf1e2f438a1a7a3cb0396e32e9a9/uncalled_for-0.2.0-py3-none-any.whl", hash = "sha256:2c0bd338faff5f930918f79e7eb9ff48290df2cb05fcc0b40a7f334e55d4d85f", size = 11351, upload-time = "2026-02-27T17:40:56.804Z" }, ] +[[package]] +name = "unsloth" +version = "2025.11.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "accelerate" }, + { name = "bitsandbytes" }, + { name = "datasets" }, + { name = "diffusers" }, + { name = "hf-transfer" }, + { name = "huggingface-hub" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "peft" }, + { name = "protobuf" }, + { name = "psutil" }, + { name = "sentencepiece" }, + { name = "torch" }, + { name = "torchvision" }, + { name = "tqdm" }, + { name = "transformers" }, + { name = "triton", marker = "'linux' in sys_platform" }, + { name = "triton-windows", marker = "(platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'x86_64' and sys_platform == 'win32')" }, + { name = "trl" }, + { name = "tyro" }, + { name = "unsloth-zoo" }, + { name = "wheel" }, + { name = "xformers", marker = "(platform_machine == 'AMD64' and 'linux' in sys_platform) or (platform_machine == 'x86_64' and 'linux' in sys_platform) or (platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'x86_64' and sys_platform == 'win32')" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/14/85/d3adac4a02021ffd08c0fd0cc4214a5f98647c139ec3a1ee9ad5722093ee/unsloth-2025.11.1.tar.gz", hash = "sha256:c06a1003484fd2c5dbd00752d7f2490de489df348ac129bb6a83364c125f3dc4", size = 4744603, upload-time = "2025-11-03T14:49:41.128Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/09/e52c139f75ba2bd2fed3834238fcdaf5ae5f38f168a8f68d5ab052fa09fb/unsloth-2025.11.1-py3-none-any.whl", hash = "sha256:67ab663e4f89817647ee343bffb400eeca3a1725470bbfc1509ef2c42ef0f418", size = 348780, upload-time = "2025-11-03T14:49:37.91Z" }, +] + +[[package]] +name = "unsloth-zoo" +version = "2025.11.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "accelerate" }, + { name = "cut-cross-entropy" }, + { name = "datasets" }, + { name = "filelock" }, + { name = "hf-transfer" }, + { name = "huggingface-hub" }, + { name = "msgspec" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "peft" }, + { name = "pillow" }, + { name = "protobuf" }, + { name = "psutil" }, + { name = "regex" }, + { name = "sentencepiece" }, + { name = "torch" }, + { name = "torchao" }, + { name = "tqdm" }, + { name = "transformers" }, + { name = "triton", marker = "'linux' in sys_platform" }, + { name = "triton-windows", marker = "(platform_machine == 'AMD64' and sys_platform == 'win32') or (platform_machine == 'x86_64' and sys_platform == 'win32')" }, + { name = "trl" }, + { name = "typing-extensions" }, + { name = "tyro" }, + { name = "wheel" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fb/9c/6918f568ae91b1c2e56d3820784e538fe39acbc0b3a86f5ae9c25b8245c3/unsloth_zoo-2025.11.2.tar.gz", hash = "sha256:7cfc1b76c1abc6f7e41ef84648dd923fbd92b38ed0e1272562356ad9a7f7acc3", size = 259407, upload-time = "2025-11-06T13:48:12.231Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/c4/5971b0bf52885021da67af1879a8db7d7c3dcd7d576cf1e58fda462d575f/unsloth_zoo-2025.11.2-py3-none-any.whl", hash = "sha256:eba103c75e00439cc19b33ca0319e018dae43ecd414fc1c39981e75a4b2cdf4d", size = 278200, upload-time = "2025-11-06T13:48:10.42Z" }, +] + [[package]] name = "uri-template" version = "1.3.0" @@ -2903,6 +3792,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", size = 171598, upload-time = "2026-01-10T09:23:45.395Z" }, ] +[[package]] +name = "wheel" +version = "0.47.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/39/62/75f18a0f03b4219c456652c7780e4d749b929eb605c098ce3a5b6b6bc081/wheel-0.47.0.tar.gz", hash = "sha256:cc72bd1009ba0cf63922e28f94d9d83b920aa2bb28f798a31d0691b02fa3c9b3", size = 63854, upload-time = "2026-04-22T15:51:27.727Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/1b/9e33c09813d65e248f7f773119148a612516a4bea93e9c6f545f78455b7c/wheel-0.47.0-py3-none-any.whl", hash = "sha256:212281cab4dff978f6cedd499cd893e1f620791ca6ff7107cf270781e587eced", size = 32218, upload-time = "2026-04-22T15:51:26.296Z" }, +] + [[package]] name = "widgetsnbextension" version = "4.0.15" @@ -2924,6 +3825,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl", hash = "sha256:61eea322cdf56e8cc904bd3ad7573359a242ba65688716b0710a5eb12beab584", size = 24405, upload-time = "2025-11-20T18:18:00.454Z" }, ] +[[package]] +name = "xformers" +version = "0.0.35" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "torch" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/de/5a/6e27734bd793adc44d0b8d294e67cfacf4ec590572c1aef51d683fc7a791/xformers-0.0.35.tar.gz", hash = "sha256:f7fc183a58e4bf0e2ae339a18fb1b1d4a37854c0f2545b4f360fef001646ab76", size = 4258182, upload-time = "2026-02-20T20:33:05.417Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/85/6d71f9b16f2ac647877e66ed4af723b3fbd477806ab8b8a89d39a362b85f/xformers-0.0.35-py39-none-manylinux_2_28_x86_64.whl", hash = "sha256:ccc73c7db9890224ab05f5fb60e2034f9e6c8672a10be0cf00e95cbbae3eda7c", size = 3264751, upload-time = "2026-02-20T20:33:02.444Z" }, + { url = "https://files.pythonhosted.org/packages/49/0b/88c39c128a05d5b553a67cb9c4c3fc32eefb91f836f838befab9e78f8364/xformers-0.0.35-py39-none-win_amd64.whl", hash = "sha256:57381ce3cbb79b593e6b62cb20a937885345fad2796de2aa6fbb66c033601179", size = 2638618, upload-time = "2026-02-20T20:33:04.104Z" }, +] + [[package]] name = "xxhash" version = "3.6.0"