From c3f0b3f442106bd7f79b8d5b76a774fb6dd6d1d9 Mon Sep 17 00:00:00 2001 From: Wenzhe Wang Date: Thu, 27 Aug 2026 12:00:57 +0800 Subject: [PATCH 01/11] [cfg, recipe, tests] feat: add Thinker DAPO phase one Signed-off-by: Wenzhe Wang --- examples/dapo_trainer/README.md | 47 ++++++++ .../run_qwen3_omni_thinker_dapo_lora_v1.sh | 81 +++++++++++++ ...n_dapo_qwen3_omni_thinker_lora_v1_smoke.sh | 111 ++++++++++++++++++ tests/utils/test_config_on_cpu.py | 25 ++++ .../test_qwen3_omni_dapo_launcher_on_cpu.py | 60 ++++++++++ .../workers/config/test_omni_config_on_cpu.py | 32 +++++ verl_omni/trainer/config/algorithm.py | 4 +- verl_omni/utils/config.py | 12 ++ 8 files changed, 370 insertions(+), 2 deletions(-) create mode 100644 examples/dapo_trainer/README.md create mode 100755 examples/dapo_trainer/qwen3_omni/run_qwen3_omni_thinker_dapo_lora_v1.sh create mode 100755 tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh create mode 100644 tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py diff --git a/examples/dapo_trainer/README.md b/examples/dapo_trainer/README.md new file mode 100644 index 000000000..40b121eb6 --- /dev/null +++ b/examples/dapo_trainer/README.md @@ -0,0 +1,47 @@ +# Qwen3-Omni Thinker DAPO Trainer + +This example provides the first Qwen3-Omni Thinker DAPO milestone on the V1 +omni trainer: GPU LoRA training on GSM8K with clip-higher, token-level policy +gradient, GRPO advantages, and the registered DAPO reward manager. + +The Phase 1 launcher intentionally disables dynamic sampling: + +```text +algorithm.filter_groups.enable=false +``` + +It also does not enable the overlong reward buffer. Those components are kept +out of this baseline so the token-level DAPO policy path can be validated +independently. Do not use the reward-manager name alone to identify an +algorithm: `reward.reward_manager.name=dapo` with `policy_loss.loss_mode=gspo` +still runs GSPO and now emits a configuration warning. + +## Run + +Prepare GSM8K parquet files under `~/data/gsm8k`, then launch from the +repository root: + +```bash +bash examples/dapo_trainer/qwen3_omni/run_qwen3_omni_thinker_dapo_lora_v1.sh +``` + +The default model is `~/models/Qwen/Qwen3-Omni-30B-A3B-Instruct`. Override the +model, data, or any Hydra setting without editing the script: + +```bash +MODEL_PATH=/path/to/Qwen3-Omni-30B-A3B-Instruct \ +TRAIN_FILE=/path/to/train.parquet \ +VAL_FILE=/path/to/test.parquet \ +bash examples/dapo_trainer/qwen3_omni/run_qwen3_omni_thinker_dapo_lora_v1.sh \ + trainer.total_training_steps=2 +``` + +Only the Thinker LoRA adapters are trained. Talker, code2wav, code predictor, +visual projection, and audio-tower modules are excluded, and the vision tower +is frozen, matching the existing GSPO V1 baseline. + +The corresponding tiny-random two-step smoke is: + +```bash +bash tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh +``` diff --git a/examples/dapo_trainer/qwen3_omni/run_qwen3_omni_thinker_dapo_lora_v1.sh b/examples/dapo_trainer/qwen3_omni/run_qwen3_omni_thinker_dapo_lora_v1.sh new file mode 100755 index 000000000..0da47aa8c --- /dev/null +++ b/examples/dapo_trainer/qwen3_omni/run_qwen3_omni_thinker_dapo_lora_v1.sh @@ -0,0 +1,81 @@ +#!/usr/bin/env bash +# Qwen3-Omni Thinker DAPO + LoRA training without dynamic sampling. + +set -xeuo pipefail + +# Make verl_omni available to Ray workers. +export VERL_USE_EXTERNAL_MODULES=verl_omni + +MODEL_PATH=${MODEL_PATH:-"$HOME/models/Qwen/Qwen3-Omni-30B-A3B-Instruct"} +TRAIN_FILE=${TRAIN_FILE:-"$HOME/data/gsm8k/train.parquet"} +VAL_FILE=${VAL_FILE:-"$HOME/data/gsm8k/test.parquet"} + +python3 -m verl_omni.trainer.main_omni \ + data.train_files="${TRAIN_FILE}" \ + data.val_files="${VAL_FILE}" \ + data.train_batch_size=128 \ + data.max_prompt_length=2048 \ + data.max_response_length=8192 \ + data.truncation='error' \ + data.filter_overlong_prompts=true \ + actor_rollout_ref.model.path="${MODEL_PATH}" \ + actor_rollout_ref.model.lora_rank=32 \ + actor_rollout_ref.model.lora_alpha=64 \ + actor_rollout_ref.model.lora_dtype=float32 \ + actor_rollout_ref.model.lora.merge=true \ + actor_rollout_ref.model.enable_gradient_checkpointing=true \ + actor_rollout_ref.model.use_remove_padding=true \ + actor_rollout_ref.model.exclude_modules=".*talker.*|.*code2wav.*|.*code_predictor.*|.*visual.*|.*audio_tower.*" \ + actor_rollout_ref.model.target_modules="['q_proj','k_proj','v_proj','o_proj']" \ + actor_rollout_ref.actor.freeze_vision_tower=true \ + actor_rollout_ref.actor.strategy=fsdp2 \ + actor_rollout_ref.actor.optim.lr=3e-6 \ + actor_rollout_ref.actor.optim.weight_decay=0.01 \ + actor_rollout_ref.actor.optim.clip_grad=1.0 \ + actor_rollout_ref.actor.ppo_mini_batch_size=16 \ + actor_rollout_ref.actor.use_dynamic_bsz=true \ + actor_rollout_ref.actor.ppo_max_token_len_per_gpu=20480 \ + actor_rollout_ref.actor.use_kl_loss=false \ + actor_rollout_ref.actor.entropy_coeff=0 \ + actor_rollout_ref.actor.policy_loss.loss_mode=vanilla \ + actor_rollout_ref.actor.clip_ratio_low=0.2 \ + actor_rollout_ref.actor.clip_ratio_high=0.28 \ + actor_rollout_ref.actor.clip_ratio_c=10.0 \ + actor_rollout_ref.actor.loss_agg_mode=token-mean \ + actor_rollout_ref.actor.fsdp_config.model_dtype=bfloat16 \ + actor_rollout_ref.actor.fsdp_config.param_offload=true \ + actor_rollout_ref.actor.fsdp_config.optimizer_offload=true \ + actor_rollout_ref.rollout.name=vllm_omni \ + actor_rollout_ref.rollout.n=16 \ + actor_rollout_ref.rollout.tensor_model_parallel_size=2 \ + actor_rollout_ref.rollout.gpu_memory_utilization=0.8 \ + actor_rollout_ref.rollout.load_format=safetensors \ + actor_rollout_ref.rollout.log_prob_use_dynamic_bsz=true \ + actor_rollout_ref.rollout.log_prob_max_token_len_per_gpu=20480 \ + actor_rollout_ref.rollout.enable_prefix_caching=false \ + +actor_rollout_ref.rollout.engine_kwargs.vllm_omni.output_mode="ar" \ + +actor_rollout_ref.rollout.engine_kwargs.vllm_omni.pipeline_name="qwen3_omni_moe" \ + actor_rollout_ref.rollout.val_kwargs.n=1 \ + actor_rollout_ref.rollout.val_kwargs.temperature=1.0 \ + actor_rollout_ref.rollout.val_kwargs.top_p=0.7 \ + actor_rollout_ref.ref.log_prob_use_dynamic_bsz=true \ + actor_rollout_ref.ref.log_prob_max_token_len_per_gpu=20480 \ + actor_rollout_ref.ref.fsdp_config.param_offload=true \ + actor_rollout_ref.ref.fsdp_config.model_dtype=bfloat16 \ + algorithm.adv_estimator=grpo \ + algorithm.use_kl_in_reward=false \ + algorithm.filter_groups.enable=false \ + reward.reward_manager.source=register \ + reward.reward_manager.name=dapo \ + trainer.val_before_train=false \ + trainer.balance_batch=true \ + trainer.critic_warmup=0 \ + trainer.logger='["console","wandb"]' \ + trainer.project_name=dapo \ + trainer.experiment_name=qwen3_omni_thinker_lora_wo_dynamic_sampling \ + trainer.n_gpus_per_node=4 \ + trainer.nnodes=1 \ + trainer.save_freq=50 \ + trainer.test_freq=10 \ + trainer.total_epochs=10 \ + "$@" diff --git a/tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh b/tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh new file mode 100755 index 000000000..ced864c6d --- /dev/null +++ b/tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh @@ -0,0 +1,111 @@ +#!/usr/bin/env bash +# Qwen3-Omni Thinker DAPO + LoRA V1 smoke without dynamic sampling. + +set -xeuo pipefail + +if [[ "${SKIP_COMPAT_DEPS_INSTALL:-0}" != "1" ]]; then + uv pip install --system --break-system-packages transformers==5.12.1 accelerate==1.14.0 peft==0.19.1 +fi + +export NCCL_IB_DISABLE=1 +export CPATH=/usr/include${CPATH:+:$CPATH} +export RAY_ACCEL_ENV_VAR_OVERRIDE_ON_ZERO=0 +export VERL_USE_EXTERNAL_MODULES=verl_omni + +NUM_GPUS=${NUM_GPUS:-2} +MODEL_PATH=${MODEL_PATH:-} +DATA_DIR=${DATA_DIR:-${HOME}/data/gsm8k} +TOTAL_TRAIN_STEPS=${TOTAL_TRAIN_STEPS:-2} + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +EXCLUDE_MODULES=".*talker.*|.*code2wav.*|.*code_predictor.*|.*visual.*|.*audio_tower.*" + +MODEL_PATH="${MODEL_PATH:-${HOME}/models/tiny-random/Qwen3-Omni}" +python3 "${REPO_ROOT}/tests/special_e2e/build_qwen3_omni_tiny_random.py" \ + --output-dir "${MODEL_PATH}" --force + +if [ ! -f "${DATA_DIR}/train.parquet" ]; then + python3 "${REPO_ROOT}/tests/special_e2e/create_dummy_math_data.py" \ + --local_save_dir "${DATA_DIR}" +fi + +python3 -m verl_omni.trainer.main_omni \ + data.train_files="${DATA_DIR}/train.parquet" \ + data.val_files="${DATA_DIR}/test.parquet" \ + data.train_batch_size=4 \ + data.max_prompt_length=256 \ + data.max_response_length=512 \ + data.val_max_samples=4 \ + data.truncation='error' \ + data.filter_overlong_prompts=true \ + actor_rollout_ref.model.path="${MODEL_PATH}" \ + +actor_rollout_ref.model.override_config.attn_implementation=sdpa \ + actor_rollout_ref.model.lora_rank=8 \ + actor_rollout_ref.model.lora_alpha=16 \ + actor_rollout_ref.model.lora_dtype=float32 \ + actor_rollout_ref.model.lora.merge=true \ + actor_rollout_ref.model.enable_gradient_checkpointing=true \ + actor_rollout_ref.model.use_remove_padding=true \ + actor_rollout_ref.model.exclude_modules="${EXCLUDE_MODULES}" \ + actor_rollout_ref.model.target_modules="['q_proj','k_proj','v_proj','o_proj']" \ + actor_rollout_ref.actor.freeze_vision_tower=true \ + actor_rollout_ref.actor.strategy=fsdp2 \ + actor_rollout_ref.actor.optim.lr=3e-6 \ + actor_rollout_ref.actor.optim.weight_decay=0.01 \ + actor_rollout_ref.actor.optim.clip_grad=1.0 \ + actor_rollout_ref.actor.ppo_mini_batch_size=4 \ + actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu=1 \ + actor_rollout_ref.actor.use_dynamic_bsz=true \ + actor_rollout_ref.actor.ppo_max_token_len_per_gpu=20480 \ + actor_rollout_ref.actor.use_kl_loss=false \ + actor_rollout_ref.actor.entropy_coeff=0 \ + actor_rollout_ref.actor.policy_loss.loss_mode=vanilla \ + actor_rollout_ref.actor.clip_ratio_low=0.2 \ + actor_rollout_ref.actor.clip_ratio_high=0.28 \ + actor_rollout_ref.actor.clip_ratio_c=10.0 \ + actor_rollout_ref.actor.loss_agg_mode=token-mean \ + actor_rollout_ref.actor.fsdp_config.model_dtype=bfloat16 \ + actor_rollout_ref.actor.fsdp_config.param_offload=true \ + actor_rollout_ref.actor.fsdp_config.optimizer_offload=true \ + actor_rollout_ref.rollout.name=vllm_omni \ + actor_rollout_ref.rollout.n=2 \ + actor_rollout_ref.rollout.temperature=0.8 \ + actor_rollout_ref.rollout.tensor_model_parallel_size="${NUM_GPUS}" \ + actor_rollout_ref.rollout.gpu_memory_utilization=0.4 \ + actor_rollout_ref.rollout.max_num_seqs=16 \ + actor_rollout_ref.rollout.load_format=safetensors \ + actor_rollout_ref.rollout.log_prob_use_dynamic_bsz=true \ + actor_rollout_ref.rollout.log_prob_max_token_len_per_gpu=20480 \ + actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu=2 \ + actor_rollout_ref.rollout.enable_prefix_caching=false \ + +actor_rollout_ref.rollout.engine_kwargs.vllm_omni.output_mode="ar" \ + +actor_rollout_ref.rollout.engine_kwargs.vllm_omni.pipeline_name="qwen3_omni_moe" \ + actor_rollout_ref.rollout.val_kwargs.n=1 \ + actor_rollout_ref.rollout.val_kwargs.temperature=1.0 \ + actor_rollout_ref.rollout.val_kwargs.top_p=0.7 \ + actor_rollout_ref.ref.strategy=fsdp2 \ + actor_rollout_ref.ref.log_prob_use_dynamic_bsz=true \ + actor_rollout_ref.ref.log_prob_max_token_len_per_gpu=20480 \ + actor_rollout_ref.ref.log_prob_micro_batch_size_per_gpu=2 \ + actor_rollout_ref.ref.fsdp_config.param_offload=true \ + actor_rollout_ref.ref.fsdp_config.model_dtype=bfloat16 \ + algorithm.adv_estimator=grpo \ + algorithm.use_kl_in_reward=false \ + algorithm.filter_groups.enable=false \ + reward.reward_manager.source=register \ + reward.reward_manager.name=dapo \ + trainer.val_before_train=false \ + trainer.balance_batch=true \ + trainer.critic_warmup=0 \ + trainer.logger=console \ + trainer.project_name=verl-test \ + trainer.experiment_name=dapo-qwen3-omni-thinker-lora-e2e-v1-wo-dynamic-sampling \ + trainer.n_gpus_per_node="${NUM_GPUS}" \ + trainer.nnodes=1 \ + trainer.test_freq=1 \ + trainer.save_freq=-1 \ + trainer.resume_mode=disable \ + trainer.total_training_steps="${TOTAL_TRAIN_STEPS}" \ + "$@" + +echo "Qwen3-Omni Thinker DAPO+LoRA e2e V1 smoke without dynamic sampling passed." diff --git a/tests/utils/test_config_on_cpu.py b/tests/utils/test_config_on_cpu.py index 5240e1eb5..f223a3d4f 100644 --- a/tests/utils/test_config_on_cpu.py +++ b/tests/utils/test_config_on_cpu.py @@ -31,3 +31,28 @@ def test_validate_config_rejects_unknown_resume_mode(): def test_validate_config_requires_resume_path(): with pytest.raises(ValueError, match="resume_from_path"): validate_config(_config(resume_mode="resume_path")) + + +def test_validate_config_warns_when_dapo_reward_manager_is_used_with_gspo(): + config = OmegaConf.create( + { + "trainer": {"resume_mode": "disable"}, + "reward": {"reward_manager": {"name": "dapo"}}, + "actor_rollout_ref": {"actor": {"policy_loss": {"loss_mode": "gspo"}}}, + } + ) + + with pytest.warns(UserWarning, match="still runs GSPO, not DAPO"): + validate_config(config) + + +def test_validate_config_accepts_dapo_reward_manager_with_vanilla_loss(): + config = OmegaConf.create( + { + "trainer": {"resume_mode": "disable"}, + "reward": {"reward_manager": {"name": "dapo"}}, + "actor_rollout_ref": {"actor": {"policy_loss": {"loss_mode": "vanilla"}}}, + } + ) + + validate_config(config) diff --git a/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py b/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py new file mode 100644 index 000000000..326d5dcf3 --- /dev/null +++ b/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py @@ -0,0 +1,60 @@ +# Copyright 2026 Bytedance Ltd. and/or its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from pathlib import Path + +DAPO_WITHOUT_DYNAMIC_SAMPLING_SETTINGS = ( + "python3 -m verl_omni.trainer.main_omni", + "actor_rollout_ref.actor.policy_loss.loss_mode=vanilla", + "actor_rollout_ref.actor.clip_ratio_low=0.2", + "actor_rollout_ref.actor.clip_ratio_high=0.28", + "actor_rollout_ref.actor.clip_ratio_c=10.0", + "actor_rollout_ref.actor.loss_agg_mode=token-mean", + "actor_rollout_ref.actor.use_kl_loss=false", + "actor_rollout_ref.actor.entropy_coeff=0", + "algorithm.adv_estimator=grpo", + "algorithm.use_kl_in_reward=false", + "algorithm.filter_groups.enable=false", + "reward.reward_manager.source=register", + "reward.reward_manager.name=dapo", + 'engine_kwargs.vllm_omni.pipeline_name="qwen3_omni_moe"', +) + + +def _assert_dapo_without_dynamic_sampling_contract(script: str) -> None: + assert all(setting in script for setting in DAPO_WITHOUT_DYNAMIC_SAMPLING_SETTINGS) + assert "policy_loss.loss_mode=gspo" not in script + assert "algorithm.filter_groups.enable=true" not in script + assert "overlong_buffer_cfg" not in script + + +def test_dapo_example_launcher_has_phase_one_contract(): + repo_root = Path(__file__).parents[2] + launcher = (repo_root / "examples/dapo_trainer/qwen3_omni/run_qwen3_omni_thinker_dapo_lora_v1.sh").read_text( + encoding="utf-8" + ) + + _assert_dapo_without_dynamic_sampling_contract(launcher) + assert ".*talker.*|.*code2wav.*|.*code_predictor.*|.*visual.*|.*audio_tower.*" in launcher + assert "actor_rollout_ref.actor.freeze_vision_tower=true" in launcher + + +def test_dapo_tiny_random_smoke_matches_example_contract(): + repo_root = Path(__file__).parents[2] + smoke = (repo_root / "tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh").read_text(encoding="utf-8") + + _assert_dapo_without_dynamic_sampling_contract(smoke) + assert "build_qwen3_omni_tiny_random.py" in smoke + assert "SKIP_COMPAT_DEPS_INSTALL:-0" in smoke + assert 'trainer.total_training_steps="${TOTAL_TRAIN_STEPS}"' in smoke diff --git a/tests/workers/config/test_omni_config_on_cpu.py b/tests/workers/config/test_omni_config_on_cpu.py index a73e34a4e..a139345e4 100644 --- a/tests/workers/config/test_omni_config_on_cpu.py +++ b/tests/workers/config/test_omni_config_on_cpu.py @@ -17,6 +17,7 @@ import os import pytest +from verl.trainer.config.algorithm import AlgoConfig, FilterGroupsConfig from verl.workers.config.model import MtpConfig from verl_omni.trainer.config.algorithm import OmniAlgoConfig @@ -33,6 +34,10 @@ def test_defaults(self): assert cfg.adv_estimator == "dpo" assert cfg.norm_adv_by_std_in_grpo is True assert cfg.global_std is True + assert isinstance(cfg, AlgoConfig) + assert cfg.use_kl_in_reward is False + assert cfg.filter_groups is None + assert cfg.kl_ctrl.type == "fixed" @pytest.mark.parametrize( "field_name, value", @@ -45,6 +50,33 @@ def test_invalid_values_raise(self, field_name, value): with pytest.raises(ValueError): OmniAlgoConfig(**{field_name: value}) + def test_instantiate_online_algorithm_via_hydra(self): + from hydra import compose, initialize_config_dir + from verl.utils.config import omega_conf_to_dataclass + + import verl_omni + + config_dir = os.path.join(os.path.dirname(verl_omni.__file__), "trainer/config") + with initialize_config_dir(config_dir=config_dir, version_base=None): + cfg = compose( + config_name="omni_trainer", + overrides=[ + "algorithm.filter_groups.enable=false", + "algorithm.filter_groups.metric=acc", + "algorithm.use_kl_in_reward=false", + ], + ) + + algorithm_cfg: OmniAlgoConfig = omega_conf_to_dataclass(cfg.algorithm) + + assert isinstance(algorithm_cfg, OmniAlgoConfig) + assert isinstance(algorithm_cfg, AlgoConfig) + assert isinstance(algorithm_cfg.filter_groups, FilterGroupsConfig) + assert algorithm_cfg.filter_groups.enable is False + assert algorithm_cfg.filter_groups.metric == "acc" + assert algorithm_cfg.use_kl_in_reward is False + assert algorithm_cfg.rollout_correction is not None + class TestOmniLossConfig: def test_defaults(self): diff --git a/verl_omni/trainer/config/algorithm.py b/verl_omni/trainer/config/algorithm.py index 5eaf4f137..3b97f9a31 100644 --- a/verl_omni/trainer/config/algorithm.py +++ b/verl_omni/trainer/config/algorithm.py @@ -18,7 +18,7 @@ from typing import Optional from verl.base_config import BaseConfig -from verl.trainer.config.algorithm import RolloutCorrectionConfig +from verl.trainer.config.algorithm import AlgoConfig, RolloutCorrectionConfig from verl_omni.trainer.diffusion.diffusion_trainer_utils import OLD_POLICY_DECAY_SCHEDULES @@ -60,7 +60,7 @@ def __post_init__(self): @dataclass -class OmniAlgoConfig(BaseConfig): +class OmniAlgoConfig(AlgoConfig): """Omni-specific algorithm config.""" trainer_type: str = "direct_preference" diff --git a/verl_omni/utils/config.py b/verl_omni/utils/config.py index 90e53c1e6..9387167d4 100644 --- a/verl_omni/utils/config.py +++ b/verl_omni/utils/config.py @@ -6,6 +6,7 @@ from __future__ import annotations +import warnings from typing import Any @@ -38,3 +39,14 @@ def validate_config(config: Any) -> None: raise ValueError("trainer.total_training_steps must be a positive integer or null.") from exc if total_steps <= 0: raise ValueError("trainer.total_training_steps must be a positive integer or null.") + + reward_manager_name = _select(config, "reward.reward_manager.name") + policy_loss_mode = _select(config, "actor_rollout_ref.actor.policy_loss.loss_mode") + if reward_manager_name == "dapo" and policy_loss_mode == "gspo": + warnings.warn( + "reward.reward_manager.name='dapo' only selects the DAPO reward manager; " + "actor_rollout_ref.actor.policy_loss.loss_mode='gspo' still runs GSPO, not DAPO. " + "Use loss_mode='vanilla' with the DAPO clip-higher and token-mean settings for DAPO training.", + UserWarning, + stacklevel=2, + ) From bef712ed7d91084e9608622b20059140da22ac5e Mon Sep 17 00:00:00 2001 From: Wenzhe Wang Date: Thu, 27 Aug 2026 12:09:00 +0800 Subject: [PATCH 02/11] [doc] fix: expose DAPO example in docs Signed-off-by: Wenzhe Wang --- docs/examples/dapo_trainer.md | 1 + docs/index.md | 1 + examples/dapo_trainer/README.md | 2 ++ 3 files changed, 4 insertions(+) create mode 120000 docs/examples/dapo_trainer.md diff --git a/docs/examples/dapo_trainer.md b/docs/examples/dapo_trainer.md new file mode 120000 index 000000000..7e662ccd6 --- /dev/null +++ b/docs/examples/dapo_trainer.md @@ -0,0 +1 @@ +../../examples/dapo_trainer/README.md \ No newline at end of file diff --git a/docs/index.md b/docs/index.md index 7541bbc27..ddbf995d7 100644 --- a/docs/index.md +++ b/docs/index.md @@ -72,6 +72,7 @@ algo/performance.md examples/flowgrpo_trainer.md examples/flowdppo_trainer.md examples/dpo_trainer.md +examples/dapo_trainer.md examples/dancegrpo_trainer.md examples/diffusionnft_trainer.md examples/grpoguard_trainer.md diff --git a/examples/dapo_trainer/README.md b/examples/dapo_trainer/README.md index 40b121eb6..248c1051f 100644 --- a/examples/dapo_trainer/README.md +++ b/examples/dapo_trainer/README.md @@ -1,5 +1,7 @@ # Qwen3-Omni Thinker DAPO Trainer +Last updated: 08/27/2026 + This example provides the first Qwen3-Omni Thinker DAPO milestone on the V1 omni trainer: GPU LoRA training on GSM8K with clip-higher, token-level policy gradient, GRPO advantages, and the registered DAPO reward manager. From 8323ead3a8ef563bd52f7c3dc05ff4ab8d629778 Mon Sep 17 00:00:00 2001 From: Wenzhe Wang Date: Fri, 28 Aug 2026 15:59:23 +0800 Subject: [PATCH 03/11] [cfg, recipe, tests] fix: address AVQA validation feedback Signed-off-by: Wenzhe Wang --- examples/dapo_trainer/README.md | 39 ++++++++++++---- .../run_qwen3_omni_thinker_dapo_lora_v1.sh | 44 ++++++++++++++----- .../test_qwen3_omni_dapo_launcher_on_cpu.py | 16 ++++++- .../workers/config/test_omni_config_on_cpu.py | 8 ++-- 4 files changed, 83 insertions(+), 24 deletions(-) diff --git a/examples/dapo_trainer/README.md b/examples/dapo_trainer/README.md index 248c1051f..bc688715a 100644 --- a/examples/dapo_trainer/README.md +++ b/examples/dapo_trainer/README.md @@ -1,10 +1,10 @@ # Qwen3-Omni Thinker DAPO Trainer -Last updated: 08/27/2026 +Last updated: 08/28/2026 This example provides the first Qwen3-Omni Thinker DAPO milestone on the V1 -omni trainer: GPU LoRA training on GSM8K with clip-higher, token-level policy -gradient, GRPO advantages, and the registered DAPO reward manager. +omni trainer: GPU LoRA training on multimodal AVQA with clip-higher, +token-level policy gradient, GRPO advantages, and the AVQA choice reward. The Phase 1 launcher intentionally disables dynamic sampling: @@ -14,14 +14,29 @@ algorithm.filter_groups.enable=false It also does not enable the overlong reward buffer. Those components are kept out of this baseline so the token-level DAPO policy path can be validated -independently. Do not use the reward-manager name alone to identify an -algorithm: `reward.reward_manager.name=dapo` with `policy_loss.loss_mode=gspo` -still runs GSPO and now emits a configuration warning. +independently. In this Phase 1 recipe, DAPO refers to vanilla token-level +policy loss with asymmetric clipping, GRPO advantages, and no KL penalty. The +registered naive reward manager calls the AVQA `choice_reward`; the reward +manager name alone does not select the optimization algorithm. ## Run -Prepare GSM8K parquet files under `~/data/gsm8k`, then launch from the -repository root: +Download and extract the AVQA-R1-6K data, then convert it from the repository +root: + +```bash +python examples/gspo_trainer/data_process/avqa.py \ + --input_dir /path/to/raw/AVQA_R1 \ + --output_dir ~/data/avqa_r1_6k +``` + +Install the audio and multimodal processing dependencies on every Ray worker, +then launch: + +```bash +pip install -e ".[audio]" +pip install qwen-vl-utils +``` ```bash bash examples/dapo_trainer/qwen3_omni/run_qwen3_omni_thinker_dapo_lora_v1.sh @@ -33,11 +48,17 @@ model, data, or any Hydra setting without editing the script: ```bash MODEL_PATH=/path/to/Qwen3-Omni-30B-A3B-Instruct \ TRAIN_FILE=/path/to/train.parquet \ -VAL_FILE=/path/to/test.parquet \ +VAL_FILE=/path/to/validation.parquet \ bash examples/dapo_trainer/qwen3_omni/run_qwen3_omni_thinker_dapo_lora_v1.sh \ trainer.total_training_steps=2 ``` +Validation runs once before training and every 10 steps by default. It uses +greedy decoding (`n=1`, `do_sample=false`, `temperature=0`, `top_p=1`, +`top_k=-1`) over the full validation split. Plot +`val-core/avqa_r1_6k/reward/mean@1` against the trainer step for the directly +comparable in-trainer validation curve. + Only the Thinker LoRA adapters are trained. Talker, code2wav, code predictor, visual projection, and audio-tower modules are excluded, and the vision tower is frozen, matching the existing GSPO V1 baseline. diff --git a/examples/dapo_trainer/qwen3_omni/run_qwen3_omni_thinker_dapo_lora_v1.sh b/examples/dapo_trainer/qwen3_omni/run_qwen3_omni_thinker_dapo_lora_v1.sh index 0da47aa8c..fd4b3ddfe 100755 --- a/examples/dapo_trainer/qwen3_omni/run_qwen3_omni_thinker_dapo_lora_v1.sh +++ b/examples/dapo_trainer/qwen3_omni/run_qwen3_omni_thinker_dapo_lora_v1.sh @@ -1,5 +1,13 @@ #!/usr/bin/env bash -# Qwen3-Omni Thinker DAPO + LoRA training without dynamic sampling. +# Qwen3-Omni Thinker DAPO + LoRA training on AVQA without dynamic sampling. +# Data preparation (run once): +# python examples/gspo_trainer/data_process/avqa.py \ +# --input_dir \ +# --output_dir ~/data/avqa_r1_6k +# +# Runtime dependencies (all Ray worker nodes): +# pip install -e ".[audio]" +# pip install qwen-vl-utils set -xeuo pipefail @@ -7,17 +15,24 @@ set -xeuo pipefail export VERL_USE_EXTERNAL_MODULES=verl_omni MODEL_PATH=${MODEL_PATH:-"$HOME/models/Qwen/Qwen3-Omni-30B-A3B-Instruct"} -TRAIN_FILE=${TRAIN_FILE:-"$HOME/data/gsm8k/train.parquet"} -VAL_FILE=${VAL_FILE:-"$HOME/data/gsm8k/test.parquet"} +TRAIN_FILE=${TRAIN_FILE:-"$HOME/data/avqa_r1_6k/train.parquet"} +VAL_FILE=${VAL_FILE:-"$HOME/data/avqa_r1_6k/validation.parquet"} python3 -m verl_omni.trainer.main_omni \ data.train_files="${TRAIN_FILE}" \ data.val_files="${VAL_FILE}" \ data.train_batch_size=128 \ - data.max_prompt_length=2048 \ - data.max_response_length=8192 \ + data.max_prompt_length=4096 \ + data.max_response_length=12288 \ + data.shuffle=true \ + data.seed=42 \ + data.val_max_samples=-1 \ + data.validation_shuffle=false \ data.truncation='error' \ data.filter_overlong_prompts=true \ + data.custom_cls.path=pkg://verl_omni.utils.dataset.omni_rl_datasets \ + data.custom_cls.name=QwenOmniRLHFDataset \ + +data.mm_processor_kwargs.sampling_rate=16000 \ actor_rollout_ref.model.path="${MODEL_PATH}" \ actor_rollout_ref.model.lora_rank=32 \ actor_rollout_ref.model.lora_alpha=64 \ @@ -48,16 +63,21 @@ python3 -m verl_omni.trainer.main_omni \ actor_rollout_ref.rollout.name=vllm_omni \ actor_rollout_ref.rollout.n=16 \ actor_rollout_ref.rollout.tensor_model_parallel_size=2 \ - actor_rollout_ref.rollout.gpu_memory_utilization=0.8 \ + actor_rollout_ref.rollout.gpu_memory_utilization=0.7 \ actor_rollout_ref.rollout.load_format=safetensors \ + actor_rollout_ref.rollout.prompt_length=4160 \ actor_rollout_ref.rollout.log_prob_use_dynamic_bsz=true \ actor_rollout_ref.rollout.log_prob_max_token_len_per_gpu=20480 \ actor_rollout_ref.rollout.enable_prefix_caching=false \ +actor_rollout_ref.rollout.engine_kwargs.vllm_omni.output_mode="ar" \ +actor_rollout_ref.rollout.engine_kwargs.vllm_omni.pipeline_name="qwen3_omni_moe" \ + +actor_rollout_ref.rollout.engine_kwargs.vllm_omni.max_num_seqs=256 \ + actor_rollout_ref.rollout.cudagraph_capture_sizes=[1,2,4,8,16,32,64,128,256] \ actor_rollout_ref.rollout.val_kwargs.n=1 \ - actor_rollout_ref.rollout.val_kwargs.temperature=1.0 \ - actor_rollout_ref.rollout.val_kwargs.top_p=0.7 \ + actor_rollout_ref.rollout.val_kwargs.do_sample=false \ + actor_rollout_ref.rollout.val_kwargs.temperature=0 \ + actor_rollout_ref.rollout.val_kwargs.top_p=1.0 \ + actor_rollout_ref.rollout.val_kwargs.top_k=-1 \ actor_rollout_ref.ref.log_prob_use_dynamic_bsz=true \ actor_rollout_ref.ref.log_prob_max_token_len_per_gpu=20480 \ actor_rollout_ref.ref.fsdp_config.param_offload=true \ @@ -66,13 +86,15 @@ python3 -m verl_omni.trainer.main_omni \ algorithm.use_kl_in_reward=false \ algorithm.filter_groups.enable=false \ reward.reward_manager.source=register \ - reward.reward_manager.name=dapo \ - trainer.val_before_train=false \ + reward.reward_manager.name=naive \ + reward.custom_reward_function.path=verl_omni/utils/reward_score/choice_reward.py \ + reward.custom_reward_function.name=compute_score \ + trainer.val_before_train=true \ trainer.balance_batch=true \ trainer.critic_warmup=0 \ trainer.logger='["console","wandb"]' \ trainer.project_name=dapo \ - trainer.experiment_name=qwen3_omni_thinker_lora_wo_dynamic_sampling \ + trainer.experiment_name=qwen3_omni_thinker_lora_avqa_wo_dynamic_sampling \ trainer.n_gpus_per_node=4 \ trainer.nnodes=1 \ trainer.save_freq=50 \ diff --git a/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py b/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py index 326d5dcf3..df00ff83f 100644 --- a/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py +++ b/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py @@ -27,7 +27,6 @@ "algorithm.use_kl_in_reward=false", "algorithm.filter_groups.enable=false", "reward.reward_manager.source=register", - "reward.reward_manager.name=dapo", 'engine_kwargs.vllm_omni.pipeline_name="qwen3_omni_moe"', ) @@ -48,6 +47,20 @@ def test_dapo_example_launcher_has_phase_one_contract(): _assert_dapo_without_dynamic_sampling_contract(launcher) assert ".*talker.*|.*code2wav.*|.*code_predictor.*|.*visual.*|.*audio_tower.*" in launcher assert "actor_rollout_ref.actor.freeze_vision_tower=true" in launcher + assert 'TRAIN_FILE=${TRAIN_FILE:-"$HOME/data/avqa_r1_6k/train.parquet"}' in launcher + assert 'VAL_FILE=${VAL_FILE:-"$HOME/data/avqa_r1_6k/validation.parquet"}' in launcher + assert "data.custom_cls.name=QwenOmniRLHFDataset" in launcher + assert "reward.reward_manager.name=naive" in launcher + assert "reward.custom_reward_function.path=verl_omni/utils/reward_score/choice_reward.py" in launcher + assert "reward.custom_reward_function.name=compute_score" in launcher + assert "trainer.val_before_train=true" in launcher + assert "actor_rollout_ref.rollout.val_kwargs.n=1" in launcher + assert "actor_rollout_ref.rollout.val_kwargs.do_sample=false" in launcher + assert "actor_rollout_ref.rollout.val_kwargs.temperature=0" in launcher + assert "actor_rollout_ref.rollout.val_kwargs.top_p=1.0" in launcher + assert "actor_rollout_ref.rollout.val_kwargs.top_k=-1" in launcher + assert "actor_rollout_ref.rollout.val_kwargs.temperature=1.0" not in launcher + assert "actor_rollout_ref.rollout.val_kwargs.top_p=0.7" not in launcher def test_dapo_tiny_random_smoke_matches_example_contract(): @@ -55,6 +68,7 @@ def test_dapo_tiny_random_smoke_matches_example_contract(): smoke = (repo_root / "tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh").read_text(encoding="utf-8") _assert_dapo_without_dynamic_sampling_contract(smoke) + assert "reward.reward_manager.name=dapo" in smoke assert "build_qwen3_omni_tiny_random.py" in smoke assert "SKIP_COMPAT_DEPS_INSTALL:-0" in smoke assert 'trainer.total_training_steps="${TOTAL_TRAIN_STEPS}"' in smoke diff --git a/tests/workers/config/test_omni_config_on_cpu.py b/tests/workers/config/test_omni_config_on_cpu.py index a139345e4..609258430 100644 --- a/tests/workers/config/test_omni_config_on_cpu.py +++ b/tests/workers/config/test_omni_config_on_cpu.py @@ -50,7 +50,7 @@ def test_invalid_values_raise(self, field_name, value): with pytest.raises(ValueError): OmniAlgoConfig(**{field_name: value}) - def test_instantiate_online_algorithm_via_hydra(self): + def test_enabled_filter_groups_survive_hydra_conversion(self): from hydra import compose, initialize_config_dir from verl.utils.config import omega_conf_to_dataclass @@ -61,8 +61,9 @@ def test_instantiate_online_algorithm_via_hydra(self): cfg = compose( config_name="omni_trainer", overrides=[ - "algorithm.filter_groups.enable=false", + "algorithm.filter_groups.enable=true", "algorithm.filter_groups.metric=acc", + "algorithm.filter_groups.max_num_gen_batches=7", "algorithm.use_kl_in_reward=false", ], ) @@ -72,8 +73,9 @@ def test_instantiate_online_algorithm_via_hydra(self): assert isinstance(algorithm_cfg, OmniAlgoConfig) assert isinstance(algorithm_cfg, AlgoConfig) assert isinstance(algorithm_cfg.filter_groups, FilterGroupsConfig) - assert algorithm_cfg.filter_groups.enable is False + assert algorithm_cfg.filter_groups.enable is True assert algorithm_cfg.filter_groups.metric == "acc" + assert algorithm_cfg.filter_groups.max_num_gen_batches == 7 assert algorithm_cfg.use_kl_in_reward is False assert algorithm_cfg.rollout_correction is not None From 6969a3c27236a24c744e9fa493fe886420bd9c19 Mon Sep 17 00:00:00 2001 From: Wenzhe Wang Date: Fri, 28 Aug 2026 16:16:29 +0800 Subject: [PATCH 04/11] [cfg, recipe, tests] fix: harden DAPO contracts Signed-off-by: Wenzhe Wang --- examples/dapo_trainer/README.md | 8 +++ .../run_qwen3_omni_thinker_dapo_lora_v1.sh | 2 + ...n_dapo_qwen3_omni_thinker_lora_v1_smoke.sh | 2 + .../test_qwen3_omni_dapo_launcher_on_cpu.py | 53 ++++++++++++------- .../workers/config/test_omni_config_on_cpu.py | 18 +++++-- 5 files changed, 62 insertions(+), 21 deletions(-) diff --git a/examples/dapo_trainer/README.md b/examples/dapo_trainer/README.md index bc688715a..0cc04c0a3 100644 --- a/examples/dapo_trainer/README.md +++ b/examples/dapo_trainer/README.md @@ -30,6 +30,10 @@ python examples/gspo_trainer/data_process/avqa.py \ --output_dir ~/data/avqa_r1_6k ``` +The converted parquet stores absolute image and audio paths. Every Ray worker +must mount the converted dataset and its media files at the same absolute path +used during conversion. + Install the audio and multimodal processing dependencies on every Ray worker, then launch: @@ -68,3 +72,7 @@ The corresponding tiny-random two-step smoke is: ```bash bash tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh ``` + +The smoke uses dummy GSM8K data and the registered DAPO reward manager only to +exercise the training path. It is not a substitute for the AVQA validation +curve or evidence of convergence. diff --git a/examples/dapo_trainer/qwen3_omni/run_qwen3_omni_thinker_dapo_lora_v1.sh b/examples/dapo_trainer/qwen3_omni/run_qwen3_omni_thinker_dapo_lora_v1.sh index fd4b3ddfe..57cbd73db 100755 --- a/examples/dapo_trainer/qwen3_omni/run_qwen3_omni_thinker_dapo_lora_v1.sh +++ b/examples/dapo_trainer/qwen3_omni/run_qwen3_omni_thinker_dapo_lora_v1.sh @@ -82,6 +82,8 @@ python3 -m verl_omni.trainer.main_omni \ actor_rollout_ref.ref.log_prob_max_token_len_per_gpu=20480 \ actor_rollout_ref.ref.fsdp_config.param_offload=true \ actor_rollout_ref.ref.fsdp_config.model_dtype=bfloat16 \ + algorithm.trainer_type=policy_gradient \ + algorithm.sample_source=online \ algorithm.adv_estimator=grpo \ algorithm.use_kl_in_reward=false \ algorithm.filter_groups.enable=false \ diff --git a/tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh b/tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh index ced864c6d..9bb2a0aaa 100755 --- a/tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh +++ b/tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh @@ -89,6 +89,8 @@ python3 -m verl_omni.trainer.main_omni \ actor_rollout_ref.ref.log_prob_micro_batch_size_per_gpu=2 \ actor_rollout_ref.ref.fsdp_config.param_offload=true \ actor_rollout_ref.ref.fsdp_config.model_dtype=bfloat16 \ + algorithm.trainer_type=policy_gradient \ + algorithm.sample_source=online \ algorithm.adv_estimator=grpo \ algorithm.use_kl_in_reward=false \ algorithm.filter_groups.enable=false \ diff --git a/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py b/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py index df00ff83f..3c1684c0f 100644 --- a/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py +++ b/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py @@ -23,18 +23,25 @@ "actor_rollout_ref.actor.loss_agg_mode=token-mean", "actor_rollout_ref.actor.use_kl_loss=false", "actor_rollout_ref.actor.entropy_coeff=0", + "algorithm.trainer_type=policy_gradient", + "algorithm.sample_source=online", "algorithm.adv_estimator=grpo", "algorithm.use_kl_in_reward=false", "algorithm.filter_groups.enable=false", "reward.reward_manager.source=register", - 'engine_kwargs.vllm_omni.pipeline_name="qwen3_omni_moe"', + '+actor_rollout_ref.rollout.engine_kwargs.vllm_omni.pipeline_name="qwen3_omni_moe"', ) +def _script_settings(script: str) -> set[str]: + return {line.strip().removesuffix("\\").rstrip() for line in script.splitlines()} + + def _assert_dapo_without_dynamic_sampling_contract(script: str) -> None: - assert all(setting in script for setting in DAPO_WITHOUT_DYNAMIC_SAMPLING_SETTINGS) - assert "policy_loss.loss_mode=gspo" not in script - assert "algorithm.filter_groups.enable=true" not in script + settings = _script_settings(script) + assert set(DAPO_WITHOUT_DYNAMIC_SAMPLING_SETTINGS) <= settings + assert "actor_rollout_ref.actor.policy_loss.loss_mode=gspo" not in settings + assert "algorithm.filter_groups.enable=true" not in settings assert "overlong_buffer_cfg" not in script @@ -45,22 +52,32 @@ def test_dapo_example_launcher_has_phase_one_contract(): ) _assert_dapo_without_dynamic_sampling_contract(launcher) + settings = _script_settings(launcher) assert ".*talker.*|.*code2wav.*|.*code_predictor.*|.*visual.*|.*audio_tower.*" in launcher - assert "actor_rollout_ref.actor.freeze_vision_tower=true" in launcher + assert "actor_rollout_ref.actor.freeze_vision_tower=true" in settings assert 'TRAIN_FILE=${TRAIN_FILE:-"$HOME/data/avqa_r1_6k/train.parquet"}' in launcher assert 'VAL_FILE=${VAL_FILE:-"$HOME/data/avqa_r1_6k/validation.parquet"}' in launcher - assert "data.custom_cls.name=QwenOmniRLHFDataset" in launcher - assert "reward.reward_manager.name=naive" in launcher - assert "reward.custom_reward_function.path=verl_omni/utils/reward_score/choice_reward.py" in launcher - assert "reward.custom_reward_function.name=compute_score" in launcher - assert "trainer.val_before_train=true" in launcher - assert "actor_rollout_ref.rollout.val_kwargs.n=1" in launcher - assert "actor_rollout_ref.rollout.val_kwargs.do_sample=false" in launcher - assert "actor_rollout_ref.rollout.val_kwargs.temperature=0" in launcher - assert "actor_rollout_ref.rollout.val_kwargs.top_p=1.0" in launcher - assert "actor_rollout_ref.rollout.val_kwargs.top_k=-1" in launcher - assert "actor_rollout_ref.rollout.val_kwargs.temperature=1.0" not in launcher - assert "actor_rollout_ref.rollout.val_kwargs.top_p=0.7" not in launcher + assert { + "data.custom_cls.name=QwenOmniRLHFDataset", + "data.seed=42", + "data.val_max_samples=-1", + "data.validation_shuffle=false", + "reward.reward_manager.name=naive", + "reward.custom_reward_function.path=verl_omni/utils/reward_score/choice_reward.py", + "reward.custom_reward_function.name=compute_score", + "trainer.val_before_train=true", + "trainer.test_freq=10", + "actor_rollout_ref.rollout.val_kwargs.n=1", + "actor_rollout_ref.rollout.val_kwargs.do_sample=false", + "actor_rollout_ref.rollout.val_kwargs.temperature=0", + "actor_rollout_ref.rollout.val_kwargs.top_p=1.0", + "actor_rollout_ref.rollout.val_kwargs.top_k=-1", + } <= settings + assert "actor_rollout_ref.rollout.val_kwargs.temperature=1.0" not in settings + assert "actor_rollout_ref.rollout.val_kwargs.top_p=0.7" not in settings + assert "data.val_max_samples=4" not in settings + assert "data.validation_shuffle=true" not in settings + assert "trainer.val_before_train=false" not in settings def test_dapo_tiny_random_smoke_matches_example_contract(): @@ -68,7 +85,7 @@ def test_dapo_tiny_random_smoke_matches_example_contract(): smoke = (repo_root / "tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh").read_text(encoding="utf-8") _assert_dapo_without_dynamic_sampling_contract(smoke) - assert "reward.reward_manager.name=dapo" in smoke + assert "reward.reward_manager.name=dapo" in _script_settings(smoke) assert "build_qwen3_omni_tiny_random.py" in smoke assert "SKIP_COMPAT_DEPS_INSTALL:-0" in smoke assert 'trainer.total_training_steps="${TOTAL_TRAIN_STEPS}"' in smoke diff --git a/tests/workers/config/test_omni_config_on_cpu.py b/tests/workers/config/test_omni_config_on_cpu.py index 609258430..982f239b3 100644 --- a/tests/workers/config/test_omni_config_on_cpu.py +++ b/tests/workers/config/test_omni_config_on_cpu.py @@ -50,7 +50,7 @@ def test_invalid_values_raise(self, field_name, value): with pytest.raises(ValueError): OmniAlgoConfig(**{field_name: value}) - def test_enabled_filter_groups_survive_hydra_conversion(self): + def test_inherited_online_fields_survive_hydra_conversion(self): from hydra import compose, initialize_config_dir from verl.utils.config import omega_conf_to_dataclass @@ -64,7 +64,13 @@ def test_enabled_filter_groups_survive_hydra_conversion(self): "algorithm.filter_groups.enable=true", "algorithm.filter_groups.metric=acc", "algorithm.filter_groups.max_num_gen_batches=7", - "algorithm.use_kl_in_reward=false", + "algorithm.use_kl_in_reward=true", + "algorithm.kl_penalty=low_var_kl", + "algorithm.kl_ctrl.type=adaptive", + "algorithm.kl_ctrl.kl_coef=0.02", + "algorithm.kl_ctrl.target_kl=0.03", + "algorithm.rollout_correction.rollout_is=token", + "algorithm.rollout_correction.rollout_is_threshold=3.0", ], ) @@ -76,8 +82,14 @@ def test_enabled_filter_groups_survive_hydra_conversion(self): assert algorithm_cfg.filter_groups.enable is True assert algorithm_cfg.filter_groups.metric == "acc" assert algorithm_cfg.filter_groups.max_num_gen_batches == 7 - assert algorithm_cfg.use_kl_in_reward is False + assert algorithm_cfg.use_kl_in_reward is True + assert algorithm_cfg.kl_penalty == "low_var_kl" + assert algorithm_cfg.kl_ctrl.type == "adaptive" + assert algorithm_cfg.kl_ctrl.kl_coef == pytest.approx(0.02) + assert algorithm_cfg.kl_ctrl.target_kl == pytest.approx(0.03) assert algorithm_cfg.rollout_correction is not None + assert algorithm_cfg.rollout_correction.rollout_is == "token" + assert algorithm_cfg.rollout_correction.rollout_is_threshold == pytest.approx(3.0) class TestOmniLossConfig: From c4671984d6975f0ccbdae77ee6c87c105b1db55e Mon Sep 17 00:00:00 2001 From: Wenzhe Wang Date: Fri, 28 Aug 2026 16:58:08 +0800 Subject: [PATCH 05/11] [tests] fix: match rollout correction mapping contract Signed-off-by: Wenzhe Wang --- tests/workers/config/test_omni_config_on_cpu.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/workers/config/test_omni_config_on_cpu.py b/tests/workers/config/test_omni_config_on_cpu.py index 982f239b3..ffbd7c077 100644 --- a/tests/workers/config/test_omni_config_on_cpu.py +++ b/tests/workers/config/test_omni_config_on_cpu.py @@ -88,8 +88,8 @@ def test_inherited_online_fields_survive_hydra_conversion(self): assert algorithm_cfg.kl_ctrl.kl_coef == pytest.approx(0.02) assert algorithm_cfg.kl_ctrl.target_kl == pytest.approx(0.03) assert algorithm_cfg.rollout_correction is not None - assert algorithm_cfg.rollout_correction.rollout_is == "token" - assert algorithm_cfg.rollout_correction.rollout_is_threshold == pytest.approx(3.0) + assert algorithm_cfg.rollout_correction.get("rollout_is") == "token" + assert algorithm_cfg.rollout_correction.get("rollout_is_threshold") == pytest.approx(3.0) class TestOmniLossConfig: From 4a8eaf7b21da158c0e0034c9e26ae84288b3de99 Mon Sep 17 00:00:00 2001 From: Wenzhe Wang Date: Tue, 1 Sep 2026 17:33:36 +0800 Subject: [PATCH 06/11] [doc, tests] fix: address DAPO review feedback Assisted-by: AI tooling Signed-off-by: Wenzhe Wang --- docs/algo/performance.md | 23 +++- ...n3_omni_thinker_dapo_avqa_reward_curve.csv | 52 ++++++++ ...n3_omni_thinker_dapo_avqa_reward_curve.png | Bin 0 -> 149246 bytes examples/dapo_trainer/README.md | 10 -- ...n_dapo_qwen3_omni_thinker_lora_v1_smoke.sh | 113 ------------------ .../test_qwen3_omni_dapo_launcher_on_cpu.py | 11 -- 6 files changed, 74 insertions(+), 135 deletions(-) create mode 100644 docs/assets/qwen3_omni_thinker_dapo_avqa_reward_curve.csv create mode 100644 docs/assets/qwen3_omni_thinker_dapo_avqa_reward_curve.png delete mode 100755 tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh diff --git a/docs/algo/performance.md b/docs/algo/performance.md index d22a4fe77..85e42a1b2 100644 --- a/docs/algo/performance.md +++ b/docs/algo/performance.md @@ -1,10 +1,31 @@ (performance)= # Performance Reference -Last updated: 06/17/2026 +Last updated: 09/01/2026 Below are reference benchmark results for VeRL-Omni training runs. +## DAPO Phase 1: Qwen3-Omni Thinker LoRA on AVQA + +> This single-seed reference used 4 NVIDIA A800-80G GPUs, FSDP2 LoRA rank 32, +> train batch size 128, rollout `n=16`, tensor parallel size 2, and seed 42. +> Greedy validation ran over all 1,911 AVQA examples before training and every +> 10 steps. + +| Script | Model | Dataset | # GPUs | Train Batch Size | Rollouts per Prompt | LoRA Rank | LR | +|--------|-------|---------|--------|------------------|---------------------|-----------|----| +| `run_qwen3_omni_thinker_dapo_lora_v1.sh` | Qwen3-Omni-30B-A3B-Instruct | AVQA-R1-6K | 4 | 128 | 16 | 32 | 3e-6 | + +### Training and Validation Reward Curves + +![Qwen3-Omni Thinker DAPO training and AVQA validation reward curves](../assets/qwen3_omni_thinker_dapo_avqa_reward_curve.png) + +The full-validation mean choice reward increased from `0.728414` at step 0 to +`0.824176` at step 50. The plot shows unsmoothed points; the corresponding +[step-indexed metrics](../assets/qwen3_omni_thinker_dapo_avqa_reward_curve.csv) +are included for reproducibility. This is a single-seed reward trend, not a +multi-seed convergence or final-quality result. + ## FlowGRPO: LoRA Training on Qwen-Image OCR > All experiments used NVIDIA H800 GPUs, LoRA rank 64, `ppo_micro_batch_size_per_gpu` 16, and the full 1k validation set. Training images per step = batch size × images per prompt = 32 × 16 = 512. diff --git a/docs/assets/qwen3_omni_thinker_dapo_avqa_reward_curve.csv b/docs/assets/qwen3_omni_thinker_dapo_avqa_reward_curve.csv new file mode 100644 index 000000000..4c2d17eb3 --- /dev/null +++ b/docs/assets/qwen3_omni_thinker_dapo_avqa_reward_curve.csv @@ -0,0 +1,52 @@ +global_step,critic/score/mean,val-core/avqa_r1_6k/reward/mean@1 +0,,0.728414442700157 +1,0.7412109375, +2,0.771484375, +3,0.77099609375, +4,0.75634765625, +5,0.7216796875, +6,0.7861328125, +7,0.79833984375, +8,0.783203125, +9,0.77197265625, +10,0.80224609375,0.8048142333856619 +11,0.7890625, +12,0.7626953125, +13,0.79736328125, +14,0.7978515625, +15,0.81103515625, +16,0.806640625, +17,0.7802734375, +18,0.84130859375, +19,0.7666015625, +20,0.7783203125,0.815803244374673 +21,0.8115234375, +22,0.82861328125, +23,0.80029296875, +24,0.73876953125, +25,0.78662109375, +26,0.82080078125, +27,0.78759765625, +28,0.76708984375, +29,0.80224609375, +30,0.8046875,0.8126635269492413 +31,0.80517578125, +32,0.7939453125, +33,0.79248046875, +34,0.8271484375, +35,0.82275390625, +36,0.82470703125, +37,0.7900390625, +38,0.75341796875, +39,0.8203125, +40,0.8251953125,0.8142333856619571 +41,0.8046875, +42,0.83251953125, +43,0.828125, +44,0.85546875, +45,0.802734375, +46,0.79443359375, +47,0.8095703125, +48,0.810546875, +49,0.77392578125, +50,0.87158203125,0.8241758241758241 diff --git a/docs/assets/qwen3_omni_thinker_dapo_avqa_reward_curve.png b/docs/assets/qwen3_omni_thinker_dapo_avqa_reward_curve.png new file mode 100644 index 0000000000000000000000000000000000000000..403765faba8405fe7c0665c8cde0604ce513b0a0 GIT binary patch literal 149246 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

C)d~4=~ecTYS)AgO#>a6gHMb!Fz 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

v zwEgA!@&+_0mH}}yEfX+{1C#yR+Rpu#iu9q#45dbxLBU>r1T$;C88lxGSRtYlMP?G) zJL|!?2+>!z9iKC5V9cv^BaP$W=rN2PX@uTE6Wz};H;{?9HZa7+-bF0Vefugxwg2U@ zksbwfBHb50Io!|*&MQHvNmdt~{#NY<>l+f>@h5+Ii4o_{t!^Ua%MYw|-8uz!PA}iC zHF#IdLIP$=ac=d!pd(QsVhhNV{T78gh=njR9Zh&~by5obx#bw|e zJr)%@lkt4j+5X$Lb4_TI+TsyPs72OS?(Q50{R-VTFKQyGGu4(5Sf=Yzz!Rq0aig?n z5@NZ+4|If7hY?b?ptY#U`2KpwNZ|7~VE@c~oq zQbh2*XXLeHjxV{-JGmO+0C6B`mAmSrbC$8aC%K!Bj@!8(t6W_Y8zZb8>q0-eRBpP` zUZgka8oUQ8Tr8*co`xsLT(tny$3)H~marKB0rag?5f?+&=NI{P-t$>TMt^U1pkG8# z8R#we34vr32GlHVbeR8h5o6BzM`E;Wq!yt&Bk#pOT|$$EF7Qs-X({qr#R9a@9PVTKbOO#Q?` z!O(9fDAB?mZgfQbq(WK4Go6A&HClYfdw9^^>3YA~4q_3tB zfSZ?Lse+Lq*g%SL9?PFw?Fn1oFYhjnmoifqSN=xF6y$W^rOT}Ro$dK8whzL=e_u%}bVicS1?W?q}vl_N_@Y#%j7{|%Nm6nhcBd>^pl9u144sO|)BRR@* zpk|12M4oSy)68bod6E+?4KOdTMin|aS$sAg`i&49aB;NhXYFl1HNwF|0V~IZg1-J8 zM$W-04?WKo7O3E=uPGV2nXn5qW+4Z$zD*ko7nu&{c9auWo`Q)0{l3U)Aq`wC*}I%Q zvulgJbZKLJd5Bq<6z;L>2zTv8S1fmUKXIWRCLX7|y4O zmik^laU=hk;05DqILs~a2?>F9Skk`8!ek6M;U{4Vy-g|mLq}X{6pV`Zf$HYO(!t`i z%qJNV>gp7bx5>=RjPEnGDE5O9i!kXYG&Xj%lfo4rF$0#!1{}LlGZGY|WBQ@@2uhYI zlrO(MFvuTIRu)&b?u7WYdjBzc94+F%p4`7k3EIALvhiN#=BptmYUHViX~|!&X((Pf zivkv(M*ql%>q;)O29M+d2-j8xg95oQTxBcBvw#vLkyoe6QzdpU>yT^Xk<8h?Vsy8w(5*V3@|W(z)fvlbFQWPX4U+YsF^I{5R9v!A-8 z^70t?)>N|6P9tXVQscvOqq^#I`Jp*E$^15pf=DCIp;elBKL>C$0%MH!oy0LCPymwy z=Fyp^d1dU3y?8|Jaw{8;ELLCqQ~vin?fC-O0&TJDgbx#9ZFq{*4U-%$T3rgwG9i!> zuGzbipQDL;DrfD4HYUz{T5%^^bSQN2KrQmh?%L#U-}Rk9{5!tB!hHz2MJ2mh;ghXo zKzDgWGFoke2q;BXcUQl()f++MMngbeli}Ifv{yvT;g7H|i03)frXy3h<9il;meIR1t?Z&HnJALP@-ANuY3;X>Caa-f0C zU&_hJ2^}2j+eBi~mb1!TN&Fj)@Q^*0yD0TI-Vq%H(FGtxGBInL<{a(l9C+C5z ztzp7itg@&8wMEaa0%W`E>*cpbIC+SnEL5>Cxk!NXA_|I*59ELk4QPqaQRTDU%8gfA zk{fi&zaT3mQEqK83QTH9an<#bVTX^@sAFN#v*d(9^HWNpMM_;b6eKiWKUEn=JX>xx zW`9x)*>{~zM-!0;c=I8wNQlzGe^(XA5PAA$keU>}!$;a-*^=knk=!4(J~FH9WPYD=^6e-ew;B|2 zdYfa&(hHP-P>fxpU&Phd$F&(Kyn$3H&bm#F-L+R-6$rwl+Kt_|244B7bt&JFQ{oIx zq9NKor2N9#(6~G1vc!G}TAbhcPqM%rsDMMJMj%tHkO>}8C0_2n9Q$-)ejbY6)M3^Z zw6}Z1RFlNAAuhRcBIQ)N7p`y0ci_$OzfhvfhdfZ`6F)CG&1NQ!|%Gx zMeJ%g$+w17%Jhw6FF{8R%~w13!glZi+kldkPWsC=$rQZ{{b_766g{zh3Q)CzMazA|Fbk)jaAbdObbp|nJyr`0HS2?}TUVp|X{4sWnRibkiOjX5 zS0g*(;p-D^;ftX-t2&116`~`qXQ593rd|W|w4cHtoR}jClwA-|#eZurPWgEHJM_A7 zGV^4w;YlR|Igrx?(9o%ww?Wb9iZY1~SLzrL>Cti=el{x*1+L(^+tjDVaWtKOewDJS z11Lk?G4a${SCI+SE_D4uEqgniaMQ}0VnhT|i@o0-^c={-OP)@kd0re zxxHd{zITPB_nAUX5HvNx=#<*VxsmQ>pd`pkUnQob^q-iRpru1YuP{V(C@*N--#w_X zTDT5eaZNEuHD?yI)nt2`LO&?K%`5dg^9eVFO}j2gsyTFd4mtc7p$*se=j_6Py3%(*F~6?5Y01MXZ6T`R7qU${e53MpKZz*RAl6O4 zi#-{&HzN4je|{+`Wt%yhgO>N4TCkr@#raSND7_Uf;*{PjoByZ0nO12vV&rY}4Li+* zhS&fff*)}W_1nXx+9`=j0W~@8h0eDC!47!;7O%|Uad0Nk$qhmBK*ibM$wV+DD?U;{ zvO>v7bX3oGOCy|jDNdWabo?|H5~EH|I%JgDtj98p->2|#fz!2?ozBfv!fesmY54Z z@ZYI8ugJGdMWCAaU4Q0-pVRNILCtzuV9#xZDOIG8YH`lFV8R&P?376arT;T!Us)A|23&8bW{IV+c}O5YBD1|-)|PyYOYcD!thE`YPpCI%de z#fGY{``H3lb zp@C!0$u{li0uK#xT!2N@lH`$X@n2@C*M_c5|1e99SiIF?+@eH~FCKa{0SGYL%NzRU z*{+Y*Kc>8d(CFYM2~3Ho--nJFWQssY+%j+EY4~&LP4}KY{iHmn(z!zBSMPym?JpyI z@(XE5b6T(Lsz<0w?*CT5SzSaj_9cSMyC$0X`1q@D6Ag?$K}>JgHS;g%%O{#2W>w<| z>c`M7Y{^b5z-y?l!bVRYvCC6&ifxC~Z_J^2{hYP{)9~ccI#7wM|IFhGSV4LqMJGA$70m3i7AH&R13ypbjq7qo)Ib==rrk2F3JC zHL|T#aMvr#3hvqcATcJ8KxPC?y?DFt@XX;8ukrdXChU1l&+v;OzhuQ9ocl@DYYW0M zHm2gGAM-RF$4iT;QQtw#@~0A{RNk5?3})Bpo1RK#_5o-jrWI{jyHPU}-^GeTq5i9{ zU>GSmbsZ;4UUl-P*aeIJaRGMXo{z#6rv6nAkCc>-k5dWcGM~VGSF5fN?IMb zj>$8fxlMifbqWK+@4iMHA#Xn4bg^{P?#YKj;e-r_;fTgMU2)&+Jyq72XLWk4IJafZfp@)5||aL4akTR zaf!{zzXJ!I|LKSqFw4VWkY~zyb;JNPf4M~d4tU-#(M-&2l8hi61N$NascA1Np!isw zlfn7kcAQn`JhnZz2YHiYRDd_(4;6hK%#)O4U0{-nxsnrn3HTP0HoDbyL!%)9l-mmPN= zE`|R1t|?%B2J(Z*t0d}69GN%ORqzpro{Xi}htxNP*Ji%giwXXro@W;HT)`eS|> zu%HVU+{D|W#H>pJDl{!y@<^O;bG>B zm3Z4UhX&%-L)-gbTZcalx`w!nzEi(N$<=fQp}R7JkC!FRsBT-Sy}3=r)R34iudlr4 z0yAkKy6Yzwzp;o6DEUizsn(in{DY)sIQCMhsRYaHLAYk&gD$n%if8X~t|VY*7b(Y} zekPos@JY(SdsOTceO&BA_w!4ycnc78#RZh_^G&y9+vNfpWPE`C0{9q}l_D3?$0Fjf-qqLEr%v z_MM24>2Jn}-vHEq`R&av;nE7yR~UIs4q|zdIil5q0lE8^6rZNmj@>N+?vjm8sR~FQ z(?&-0=QtQm)51|C$Me61TlgsQG!)%XCsfDUl70pd7MiMf)$nk?r!dgl)KhfeCznz| zn?0N-n1m2$Dzv6GjCf&v`udlqr~R41nO5>tg@r0d$tONcmehF#-JOvU7w8Pfz4^h+ zf#EhEi}T)N#R5%eJjHi%!%M_vaKZJ3*YxI1nOBe*H219fJ|4hF#$AlYFXQ-+K{pqO z?`cmMsnS@Zh?8$i{R?9!aN-inG2^^-BJ~+#Qri0=WRfUpPayeWZqorQcUd1hbh5C+ z&L>pn9fTysJ@Uo^;SxAVp-MP9vC(_%X%_%IlqyVo2Ottc(8btQwqmgV7NEnmW!6hE zcBVTg%cG8NF@}3$>q`dQ4>5LY-6Hdeit$%kQqLGRDH0P)N?xj~9e9ts#m4HtuJTly zA^xcAT6p2rxgEUCLGA^ayYjYwJZf|+-Bu5rV-LzczIfQa z7kwb;E;CnZ{j}rkc#%QvaE{Grod!>}@nC|XrJL1Z{5(_TeTG3*U1Ik9g0G`gHdeQX zF7ZA7s%&xWI)zvN&GJ3L_6SWvPy~5yz)k%A`tBgi_TE^m#m1D-)LAJ!tz6!Rt$d#w z_~@c&Nh_vrH*QUKIj+b+OzN$`G$ZuTQjxQO2G%EpI+2tN z?=%i!`fC*42SQRUK8fZLwHN(V9d&O^I;1-YtfaH@w-#eTksa6EnGY zaTT8VrEN7>g=f3^)g3vVe9UK7T*2Z%H1#-#AfKXaxU*Stg93AVW*&h;nkxGw?64$x zT&~aA@W)J36(=rf!{a>+732*iOU_z7z)%*@A5r(|{nFITnWYyR><_4f0$2NZMfp-4 zhY#|V`F1Mv_-Ui6^M?vTiP{^OXXz6z6!J+iqsy8n4=5oH^Q2o=5q|OJ0)g>R?)mr)9bQ%{|D8*hA%~? zwug3;%OD%>YOT+8v>N-Ei2}(42x>MY;Uk(IAIbmH)7qNrMucI`h%o5ZZy7J#C-5t= z>cVTWaTN|B12mWtcelLr@3))HPf;u4;t<9sFtWAiV?Iu@L~gwL^eghR)?6huCZdWY zH1*_`QOUxS6w*icPr5>NI^FgY(IbWIq_eON+1_o1>&$G#4CSN^^J6QMA1vQv2lzhM zu~j%@t6ifiOZTT=7x#@z7mQhD#D-^E!oaxk6jjv;;(2>aIv>M z(sfEoc*Af{g`-W6iccX{&*Hee$48FL+a5qcj~^Z z7`}$Pb^R+d*dpmvHM5w$8vWK?EFKlwz2lhWW|r^Tv6)nmP>}mk-Eq+Ho9wc$)o#io zd&86Jr5+tPze7jyruZUn)T@UVqQ2+h?p)*lu-_3?rF%2nx!x)k zJ@#Wei+K~hGcJvju16Z)yt^{(?0QklbLkU~jd4hEklK}H5ar%`UT+(Ut17uZTign2 zF_2KDr)LZG&Cd2+mYA%Xl8}I6JD&D-my@qM9fn4Xl`@WAY+5DUr2QsBU3Ym5c15`D8Zi#j(%$%+b0xpGgAtsVdXdQV5xv ztGLVKH3yr%^G9Y?x*#0ym&PzA;>K@Bon87DOYK{Jm~P;`QkVv5uW^0uQOWPAQ)Ej= z-7RoiG+&J}(=?WqHH_0_dvO<2n8H*19CMwG*k-skW-5uHLb{dA^?2`2!mMPp(2-ZQmCd*Vk1drc+9(;>h4=idCJd^KV$y^*R$Eu@5wqE;g5&s z*o8y8dU`?xHoA0SsEnt&dXQI)+2i21c;VM+uj}7&crH!Eb5<4E=^y^C-^+U*p|INr zd!6ra!NH)0?$pEg!k7J;S{@~zqUU*kKYv^-E-s8lyu3J=WZ&`InO%?ckz$@lvo*)# z-x{JLlH4q|Xs3f1OIp32vVHoD8ys9Y<|Cz=%NMm>|Jh=O)4ti;$-ZmELiWv;;yg!!SL#$6chJgOVUbz9kft`0HX*=l zII#T+Sc?&45iB&%8(+dbNK57GAtAp`vP@1+j=@Se3dCDq?A z4B)K7NH?k;(>B?Khp$wkn-h8#y`EZ=@jLixjq2;;) zlkzAc5EF%l*xqcF3XAjPSY6jDe8Q!x%mnl5Q)Gv(_*QP#GIP7V#Gp@RUG=g1r3+oTngar z9n{o!6m>A(;Wv`tJE60(!PL3V@U{lX|n%E4jY#CQYA{vQKDpb@VQ90V%IABkmBWm!=)J0=RJqf z*}Dr@#S<~2r(=xy1Ny`3bkH2Zi8E2#PCCeA!4l)uf5?5GQ3jGi^jM3G#Qz;1ik?2T za=axuHKH5j|N3pQRE4VJ7ETdX7KU>Y%ArU|rN^ zP`!l@4ZKHr`i?<2mCEehUHl&!NP3_{Ge&tXoTa5 z%3>$?Y>o_PyqJ+?32hI%I0_6}oI&l&P_a2%2x3ok^(qfOv!)TOQj^o{$Mmrk>`?2zkf~RpY+E zwATmtMQ2m> z(=QK!z6*v2{zE2N%xO9yEEGJV9nue7mS%Y$5e z)oyMz6eDH!U)g>=ZZ_bGb#hc0Ick_3Eq=Oi;2|5H>uQqmq;R=Pw}q#uX`yemYTeu6 z$p?=VLsIOF=au@;D=Lon1oe$0_=~N4b}&iV0pYIB`gUr5PM&E52?VC!UiB33HYD{V zxka#VG;CUutHpGR$*HK=FSX)NE)1Dvw#D(si)(v49&h0A6=BUv4@4dyvX7kn<>CR$ z5*OE0zw8@Ku@7Z*7eJ(~jcMQIv=jl``yHJ`cX5>3c55N92{X&G{B48ELoJ zIEw9sxc8}D9%Rxyvcz-WCA5Pb{A@K$7F8TBeL~2dQbJW5-KRCl7dE%D9hMFLBcciF zx++XExGWaDcV`N0ld`?nrQ){FU`K7~_8!r%C&wY22N`m|%8W{gHTin?K*>yNdk^DbiVn zuB2?}$*$z)*|)bU;j~N!`h9yA-?c!hD>+A=mk3#+9<@%f zk@#=#W^9cP5fAg1D^yU7${N3QSJPA_MwB1#Csm8cezf@g!|BcICaxszGpQEX7|%A} zkNKG=o=u<;Ld2Y`H!a7x*zJ{s?y6Y?pX@9qekmz7h|47(L!~cvP0rY?^``K|9t4C}Zs!nvK{IP;5Mw^K z4`z_Id>SlH=BJO0&5_O5vX?1(pwai-;BY+JLFp?dwS|YAX6$Y|bw3aL)_vtqptr=< za{VjD)t~5JW0;mH-O*0VDUqeF9O($%$Rbh<95 zhxMEk+V3a=?mHx4Hd)OV(a@mt=7Erqt#QQeyY;j8cwC25R>Gt=1MhnGA8&=%R9EvK z^XMCfmn~=e>cxr(3zm%8M#-bR%GWcw@8P;4j^a`Hd!?QOzp^2}-5-P16{EvqF|P^= zCU=i%rr=8-iF{z=u#<;Hc~#!LxI#~#N>vs<(?PyAO(W>i2v?~ax0WvLl?7GU+wOUj zDsjzK>40x0@7G<1mNHyOmCCu!D8&2+kQ+3?qZ7`qR})>K7{hxok6DH(47=1g9@IUO z$x-QO+D9)hG#Id|NaZI%FM20g_TuV@pvTeSh`NTjY&h8WNeJYa8;Dk~AkJFQ@1WN) zWB68u=D!;a_!VOW3eAKCZ2K&=ni%O{7!UMwraB%_j8?>Sp52?aY;{Y{y=uR`Z=3Idbeiat+y0WZ^uWecbhg7P8qMK1lAX<8M20TN9?BPqjn)vkBW(H1=r;i>zINy} zuIV#8!bNdVa;|B&Gq4ejzP>*ymvkrZ%I>zMZ2*<`$FvUifv8tM9mXZF- z{bQRy`3`o!_pOj*NAcD;UEwQNlTWv!%X?NSIi!ac&ukq>yN6>k6s}x!vT_W1^IBTk zV@)ZvkG`hCOz&$AuVt)o&G6x0>~MLN@bTfFA7ApV-E&r{M#@y&mOi}> zI%c9)bgkHC82@{QVYjk$!b}#Vdj25ZR}!<4O4Lc`w_KawzeT8Wg83rMeW{q*GI+;ra(u8P0AboYCHP>RjYk}UW%1fgLuz9H1zBBFL)D}(2(;~&DaJ<-*nKFPT5L`-b6 z$5}O1hjT#o>aa%^AN)_V%wIDz2KDIntE+R5VXyXbXyb9r+0edXm8I8ohoI_TWO%wB ziHmQ)mt!j$XXRjSrx@mur|V|)|7_)dQdz+|re1k{`_t)L?C8LgU)rQ6k!7q%ScM3r z^tLJakVcUwmNW9P)KH5+o_(4sOA7vYU^)wC4V`g2|BsfmM@^T~or!tly<=?0R5(fA!f6ECo1Xo){X5mlp|wuTc{8#BsFlil0e~e;4)BI1ad-j@R4~Kx97$G5@1fN1^G8B;Df%wb@(!vDYW>!NMePA0H2n;>#c?OC1@cFf z%Vns}PX>mJFn`27DVs~f!f2$$pw5b^BM2SGe~oZysCc+)1AMhS(z&6Z6~i+ZfEvnU z5tYs?*~;4>*U=XAF~5bfL(f`0gkR|G0omNkni7JUK@XZ20Bk}O+Q;cUHVlB(#!k{V zJIT!v#Va}E?m}duPp`~Gy_ArbG+|IXij}a`1=QoPY83hCZ*ZigEgQ!OwvD!Au>OPj zRg28bB-pW4s(VLlO>My(Gy{Cz4i+?yRn`1k84EvMi-Qm_PjlKpKAq6Z+YxLx_E&UY zUUl-~sx9(IxkBzT20ZsF08(xNQYK9J~9V3_qi8&O_Ip)ujU95fg{%girS z$`R(-uW}Q)CR68T8~79`6<5T$cWTO#hc#C&yqYY0E5v79g+d9DOrX;7!d{|-F?t#l zq&xN(vfzf`-f=0!f-w==#PN7W;Ao4StyU^iYSIlW7H2AZ2A>kgZPidRJV zu1H2%u=S|w1?1vp6+UQQLmBn~-ZAvIb@W@69p`ONoK$19n7&9a2b)a?So z(xkhBXv{9ai369%8mM$py_z1D4sM6vVzG@8WKSdYzUAJCjVxf2zuKFj8&{H1DC{BR z>`}Bb0(b)i_mWYEBQEZ=D1$fA%h|heB>Rm)VY3olf8*+W!@A-84O8;8GViEQ`w7+aV z4sqg`wmnV|>3&Mg%>jEnHT`YfC% zPgQ5gW{r-g*az^N+-q!LB}ZMOheN%M+5XeA`!is}Y&qyEaTmY_+U|e8&ue}eD1Fb9 z|3@w>$)NocfTMq0PlVRO(?`m$i_{w!N<;XpqM1-QFUWFP15e8J-5IlzhUqf1thPAL zWLeOH{6bzRl%gZzlGsn*$Npq~sTw)1u1QPc{~01wv2@+ojWtJARm{E!{R^3he(Z1Y z@`2X7sB2+h-Vj{ZH%>m9v_MUbK=<=!wT2F+_Fy7{HOc~jJsj5de71d~mvN_f7*X+i zmnKkyL{yIu1>T;q9WYM#6VNVnY^Rv!jA6fCLGzy#rSgfkLBTmVUXNxU`{jq*cB?AL z`@9`9dz;Vjt!u}(sl_a^*kyZmEJHTa!hKYbLr9dn(oAy^2lecP0DP$iNFi{v>!}$Y zkFRA1DxY=mx3u^J(FzhsA@6A`X>a{|F7pctad5o=n~I_t7j%AhIGv%9_e|$uxUE(z z>*O(C)>?H}mX1f@3Z^>m(P@-SbG9QH4rT2}0!Evk$pU$%8{3o}ah)~d+JdQ$VG8ri zVa+UBA~h|mlqvXQz6Q>1dXD0l*l@ZmNMzt7$@|NTH%i?<;S9wj7-^ag(Sa9ViqXy7 zDyrv2p@NovD2V_zu%v$=&;Ey%m0{IG{~;(yoP(-Wz>RG-rk$0PG>%3{8#nV@sZhO7 zvMQr@S4;0>r7W56kofL<%q= zragRJ$>s)@$b&^!A+ui|Rz5-gL2$A=GF6XWJj95gDPjH5k@Ne zB5I-rk@Bv)0P9(xZ)IbZtpzmvN+-XFau)0PG;o-U-C$#Tftj4#!NgaVR5TQ)^e}v^ z;N3N*9(o^>iD)NRgSy%1QpZ1)gX)^PGsE_PNh8~Y9IKAvGbR}&#kyZ=iicsUAu%0Y zUqSO)?Kx@^JaH9J+%Or z21V^VOgfERvOWY{TFj`um}tu?73$vpIcwB1lHE8M*QN})0%(rg5_rPd*L(onqNXW}IZ!#McT!*SU5gWB$#peV1yqZ2 zQXOovn8zzs?YowWo2H)6eE1P}VBB;*MG!z}ik=FcDe}{(dsQv1&B6H6TY=+McWPP= z6Sq= z4{nvSsB7PGzDZ+R*`|m%+Cy&Q4-7c{mn-Qix`VdC$GmM>VN?=431ZDrZ0W!CSW5&} zUj@(Pds0&T$(N=zcXflJ!IEue5e!)!r0=N3oL{LzB5WUjtD*bPZnN^*3P2g|t==qE zy29Ai7WIPG032ds2t9k!1W+ihy20v|DL+TGhUGr3tY0Sz+KUC zapZ=ieU9}NfN|q4IufFc7X?e&1I!wT{OQC5?rzm4ycx;f?G43CDdR%Lmw_D|3<^py z#Cn47xJ|!Ii1@eYm_aekwVwfb1dJfB0QqJv=PH#OYf4D&jagZuH1^&rb)KXH-u?zh zA3)y-!JMHgIgi7M!dj53EKk-KJ;na;Q3@t2rp`)^6XNOm>TeYPaVkyUZ)caL?&bB~ z<;FwZYmm8d*#;Y0HHio2($HfA-gAIyom7_I9$un!tS;vNY|fIy>j_Y=T&fBKikop1 zGu=pFL=eDilO+0Cemygx~(PSbEFf_icm@s^-xs~Dr}E4sr0IM4*L{1;oFGd-E2 zN>u6;VxvjNX~gdAJDRJkb>s$|mu%HH(~t}=lc*e!B?Vi@1%M-euAa{qVf13h91@Q- z5G+bvvPCsOs=J%Uai`CEd3Os!NF$W&THcC6$q>U6ki`Cxv*{_Y&8osy z|CE+?2-zT9=$}~O_&8&zR6d^rvQ*3wHx%D75*A%NI)>4hI{GGczlMQlP{l73be!n?;mT#OWk5ILU<+F>+cF*4Nt6G55Us(Y;&1PI7DdfDTpF??hZ)252 zCi_6YYB?L4A|BH!A6X-x0@uvk zxxiMnF-Mt9O44x47EwiqUqo%pan1FjA2TJntt9rgQ!?77N-P`>FleZ{ZQi)-R;uXoTau?XJj4b5JP|D`Y9re zluo1}`ftC91jB z>cMJ_B|iKaBSWP zLwVINdZe(gfSE?C2+=$I9)G5@)vHak!fjJP_Kxa?Y_^(l7hy)B=P!*aMgY-rhYusg zD2L4!tE+o)bIJ%iCyF6&M!Eo@~>V47{alw-_$H{Vf3~F6pUK$-AtG+gAzkVE_uUj za5jn9pvaW&%u%C6EBM^CUYy9mY_iljsqp7cCS=#DBa){=RLsj;qv|4cNM2oHg=8Pf0;K^5| zsu^7XeJAsiT+`flgka_I*z?w?w&8~E{N4Jyw)*{x>^!k_-6{5ND|N?Rf>z@v<+sL5 zxxjOAK8cG+G8oHJ(#X%Nev})t9Nn~LKks@!Xa|>yy_~Scm;5b;bh^5Pq!CVEvv+3B zOVDWz1Ys{5`Q#}tF_f1KwOt^XYGb6*Z}4yHn-vqxcb%SF)FVW7QX^?)P?(ut$}$(% zt`b!j-3neAxL&OGw1H0dtKLdApkQd~0S?XL^;ZP2WNv9)V$@g2XFi(pepsMCGrPhQ zD+UL+ba{R(G%BVD!^7HIEV=L|L&af$MT-ZW@MtV+B)BT8_`!m!lR;6_NcE5f{;R2j zG(!KS*sr7k{b~d@=4hFQppIXD5Ou|CqOsmjlr%P0sX%Mh!@1*m1h-ArgTOT)M3|*| zXU#F|m(`Fiv8Su8$*nO(N>DRTE7qobwgPctG=Ejhlld9PHyn z6Nx$qD+7q=x~p2`NdXyeQEhkU$mTS9WFE8e%3N#r<&9P|LND$@3EeD~dA@ScZDlLv zX(^xWOvB=+z^3tg2->LLQdfI2qpcyy<$+y}-d#L@H1#dkf~xZK++1!(F_nx&-TNdL z)dhP()V} zzW?;8s#rt}sm)%O`()`cP11`cZ&1E1o>~dNVlI=&FM7U zyrU6JyBb+;NcSH~kG;W%2X977Uzo=Q8rz?P#Vw0LdBo672s&GIbj9SJewH3z*_aHA ziI9%+<7-?NQ}A1nHA+tV?%QP9GgGC?lJUJ^zUj7cH19Pzm8D9W>%l{uNc1uX;JZza zt?d+B<5ma&7(7iICxESHv)#<%_3ZjBQgw+4)%m!HttrS>$}Rx>oN|oW<-Y-&6a;Jy zY!_iE{MV2}(oS48TyI3!9!wtR%H?8t%RhE$JeU^ZXiLe5HyB=sGYo_^nGo-}6QYMN zq$ulI?XUTKW`8vabwLdsaj_&w@bEXfh3rQ|MDPkZWSP+ebC$Q*1Ed4go<@mfI#y8h zmf2T{;-kD$X95#+AR&~c-#7bJi^IdopoF47=UZsjDOe7n1ZbOvtbcOpx=8(+8DpoxC~jWtxJtR;dYAcS_MrBRwjtMKN!Xk;{4?lbPh@io zqfSX;gwEs@vwSu;KgLwkzJ!bF+@t}t_u|s9VCvdtfeGT4cH6i!2(`Am!eYO>UWNk} zxk^8APgz@=nn5a1CMdw)|Hbb5ZUuVy1sMG7cY zy4e=l`uYAfr$4-c?Ohtsu~Ag$TiSYtx5b#*JnUDk-GAYrWQNo=$!eTEbir~8xD>X9 zur+Q6dC+L3R@{PRPoU`kmRO|IX&F^t3h=OZcxtXu(XnGtvPw~PJQr##U~FDw`!}ex z)&#d3qxLJeMZc2I7MTvWiHRd$xF|&(XGz0p1AJ#(SWBNt!YOXwoV$9yXZQj`3^Yt~ zRsOfheKc?@0_bbG|au#y(w75fnmA zVHt8bmX?oo^7DrGFuEF7K-We)tXJc4K+^pB%iPQ{viU>t3Ta(=hnPjgdV>|*LvA*@ zDDA14ReY1jv~FF>A&XE&D`At4W+-QvZ+OFm8aWz$fZ6~!7cf9(k?wHJfxaCKXdRx< zvPd2BnOxIU$K9vmi}!5YPJ*|daQwYAsx1J8r-){K#M`h>zV^uRYDGj0)m{}*065@@ zh(D!sR)RiM#?g=)!G%f}caM?q7~Aq=tFL_=s;1J@A2&q)EMK*WK`KM?gZeOg+WeVD z21a|1=l|ZoYZwB7#Xj$5N2ym@Tg8_bK4LOD4k}D5$1kMpq&Jy{#;xYdBrRu4xb2mC zAZhc)znG=x4wYv(P}x5_@@@Pyzn6P1>Lst1@qmj$B)MS+cS} zmP;w5nXoCsm5+acYFdMvPU9bcH#A(P?yhbBQ=yYit=1%PpAW^y@oj|pElePnk^M>z zN+r(tY#C>N{P(ho$YonvtZ4EQj{93JG3@(C6EjUKgIcZ^DBT2`K-^Ey*oF6|$r8f5;-mjQ|tM0cY=zL8HK-g6v3SpCAGDkoyVU8ZopH*Ku{ z?N`XIl|sfaG)AV*69m=axNCuJa;VIVzO2=)b!3@;?Zax2@{PZjL0x5M8$E-HOlb?H z%NXC1@+{OHcsu&=#%1h67hXM{k6kYI5W-SZ+quAb%A5^@>;HU~bRn>+xjz?+xk3oKG$4q!GFEJN@7{x48w8}<1<+)Uf$7_ zn4XnJpE%!mCA6J6*Ya$f@vjaiu%9rO<>3V z{rq7)wg zqeqWkbSFPVDBl~{(3O{AjA00L$VwU-8Wx!qVih-|A1 zZx8BsK{My>$ebv-nvT87=IUsLZa?0?Z};_;f#P0+@__V!y^Xm>BG28Qr9l0eR9WeU z9w-4e&~m$l%V*A<35|##2To=sxN4Sajz7Cr@iOFYqoa50m_>;PbX_erS1={C)u#w0 z>g(${U)1^bmIA4aHxXTIga5y`YBG@H{hs&yr}yso$JZ*m_$-iQmLmTT{3_S z`<}z?dT!PBura3C!rjA!8U+FJKQH6Qa$MhSpq06vuV$}JJ@18N_#P~ng3nSL;h?r@ z7nqYslaE2iMSWVb9w5Ns;nplt-Z7Fo%-hwI^jf~P-BdR7$}I9(Hj)Z+fT zsGyr5q`mdPu`^YSu?!HfovqseHifeURuU3+Yhxn0WwT$u+%=LPv1z2Sfr$cq^Be!Z z(`z>2;aUE2$2HoLkyo;h<3vSnmrZ|cYHPFTotvAUt}_zdh-A5aJ6P;!L4kml`afCa z(h4(A$OpkR?#omuZ_f$w%z)dAaO=mrExH8M9d_8c3};{oiF>65ju-BT)Cgg1i3jD_JAV zBH?3rIB9rzIAryQ3?n2}Re!!zvMihVd{&3<-@h`h{?}*TmR=jH((g)?BqrwcJU*O< z^Zr(pBUC0iIBLEmP!rjDVg{+?29Qlox7~Ga)qn4QkI5{b{ps0@6dwd*g&ZyacSq8r z0?%3hioDDGznjq;^uHVb)lkAq{D1Z){${H$%7^AZ+4f4k#XNdu8I6N`Rzg=-S3=^J zMt*W_oFj0saPQvz?}N`~G@s=MK}HU4&~{~q+w9$-ZN#HSUh&Q*u&#f;2OReO|8eL4 zV~-;L??2X%FUOZDL72)irjW~;{D17dd05VQ`#v59gRz84D+*DREn29?q^y;+AeE7n zqNGK88Dq4^kZ4h4YnP=>i87;Lt$qKU*X_RJncwGmzQ^yM@9+2=$J6l~ z&(Y{!-mmSt&g;C+>w3izIHsTR`6^k#o|}QxUn1rU2rzK3m=5#i&6~Ja%t=W4iyuK| z32^$$`*{AXY5q4B`~Qc3hLc!So86OOb9;PqMP0M%oe+p#3CgugIRoK&70xfk{r%th zo-3C+CJI&Ic4pJMOy^{@xvk7}MqN^-0&Odu93JRW0axQ*Yl}Z;;Rn=H=xl(qXWX)VKT;!9^Ke7MlxeOJZE=6!&-H$HBo46cq|pm6F)=3q-)Pl^oZ z4Nnt8?Pml}UFf!2ndPIUwtxRyu_Rm=X7tFWUU~ZT>EbFXD$psR!iDEA2Sgr4+b-VQPLg(tjsz$qGT*0%SpIb#h&WS)kI zts2~$()1ZK`qIkLZ_vvtbdH)faZOcPg9Qlek; z&}2nWz{q}&r3acVu>SsQc7?M$=h?g>Fllup-AEm=|_8E=n*f| z=f5wFVMYfjXZ#Vl@#xE||M+useEdp>gZuVXzALhVI}RwC^5wle_h!S@7H7K;m9pC2 zJ`^5yet7g%EbA@juRJ~ExqkaW@OQ=Rk=|la^0b2y03a=sOFpP#I zYp%O}em=#u+;g-mGVS9PLrb>}oENIPTi}K0Mz-XXot=dEVJxIATBzpZ9trfbdIFG6FRy-ffVHtI#!H@AMY;tsNM z@x_|RTYpW6%FNtEyQDTn>lpSq0UGoTo|om)<2y@KQO(1{<3m%E2I3<^n5$L=IJB1M z{dsPN=^wvLUgOYGibmP)0j=(TpIzv$vCw_}sZ*zf{*G%<-ShwAYlscRkJqm9BX7P} zP*7k!lL*Si{c3a3yUpftS8GL5(DqBq%3eHF9(b;mpO9K7mC5zR>%Et~-C}lrcz8Ii z>AGvf`|}F}f10ImtFA(&`}I#u+-VT-q$5N6^XJbk?&EvUdzsj~%J*##ivo|mxs!*h z*&6mn4(i&sRodoMv{WXW(zR{0T^VQ}!i;}d7|Ynf{kqr}SFbNZGz7pEF5eVx2QMIw zW+Vw$*O;o4^&)g9ywTeKRoF(xl~sn~;y3l;^o!AN%mSONyR%+}jM`7_fQz#dvv}M>k}{#;t*^N7EHE zK=DsC>304i3TuCxDSV|o!?6b!=c(J;+Q#oo7B46$xM|7=ECvkzR2;4GgYbrx82THd z!)j{(!NtO8Xy6Ro#NkD?S7G3~LV1bAvKu^0Cl1 zP_YB24i^JFw@$LE&2SKLDBZ&<4)R!^{r5T9^@q=)EQd3zudl+`M5m?6CuV*waKZtO zjc6^oy_1|4+m=t044-rE+_|BV@R`CJavv5c3(r;=KDq1a>cwb~YSHN3=ZgHv79^1|7-I=Kk2z%VKat0!|Eos0dKS2ng*D4Pd2hjn~N;DB38|}+s z`mZb87J$G`7iA?CW0 z#$227<6Fqa;umaou@84B2lKDxb~tr{Pd+K+VPpMiuI2iM>c^C6U$?Qc;Z<#H|ClUr zE1!%MtlP7Kg4jMGM6e6-54$I;W0m+378Ij}l8dMQPjlaKo*-(C8GNp}Re8Kmh>3>+ zIq9p)?k+DQRaCBEm|+`j0#8(@Y=w6xNJycd`%rHH0_Z#(f99v?pg?$(TTh0ijByqT z$5__jEB0mBAA4j`d^o6Y>80lj1Cl3Q>0r%T%!w-Y+V@mafV(g$vbd3{+^m>YnY{{izs+ zM;Js4Lb1~wHNY!0$|9IWm;_0`HdS>b64?VQnitsVc zzuvhiLb2@8L$Yfy0ehK=Mvyn1s6IU0&$4~KG^A}qCb%9r`$*6}OmB%mZ;%{ihPyda z@>;j@OtcT1%diFfu*%9$>|1G)ovA6;e!REsEi&MHnSr88`TNZy_+)Y2hGpW;5EP@1?_g6auoe%DEe+u@;}1NJ)$e)ZhhZSjisS-xUL z%-X^iFXDQHp42^T4RuIA8y>pJe@OSq^qy5u9h3W|KZ`5(iq!ZUX4=200*p-#I;>_o_rx>5q)3g(U?~p zs~0E51pP;!7bu)yn3}kEx2vHQt`%5w7IT2_MJ#fdGGhvY?aI%6gu83bl9p!?%Q^BpsAwe z`rC)*jP$1KVM2WXzT2&nIet;~&7!BpYA~Yd1y0Q+w;vmuR=7GEJ(K|2$ujfkD+u)*+m-8cFv(M9o`g{opE65i zpIKtc3FDOGZ*|OS?(7aztl)yY-DhYP0nrw0ayl8D4wLE}+3Cp)*mxK&B!R8t_=hdg zx1a|zh3hF$@PnA3kS1^(S?N>vhRe8PG>xB z`RkhbbwOum=NJ~EMNuG<>btJ=^(Qng0?{NJBZ15Q@tPEjk(_EvX6PS_et>yRLx0^~ zmwIN9iWq1otpH5ED9GTrzClE~%wJ~6YzqK~JB*05?yjp%_CVuuSy`=s^RpLPPvtUp zp#f@${_i~bzPFZqynwOO&us7QG}N9N4I?3EoC6kO0U*!I2&Ij3r|CE&ns`uQUJEKR z8EaA6PXRfCLzkewmHX~5nx)+Tt}^9>A+B9UH2FqLMHE+04qJCR;{-6_(zR+K@g5tk zAM^8*&2~zX+i)2WXTh4oYL*9eb?5(eezuk&H|jo;0_^RCi=ayehgnR<-S)SLynu5I zZ`VE}s+1y>#XtR~o9>9)*I4god&=L@j0g=CCbj|n2rouNWL22Y6kNNc4r42&o|d+5 zov!uOt?m^E?RF1?rq~@&{pi@d)H)X{;(p5#-7&ch0Jio-Imn&HSLf60?%&^By$B)| z&N}2@22In;h`D<`w7lu=x~|^=R_a_k155)ImXU|%j3|GDR12_;9 z2rv=9!|-=9#gk@ly07&d^APxk2`Nnk0)3gc8CBB{h!|3-p)7V5)Q*)TPaLl{Ny~ED7Gpp}TBe)e{Z>QA008yn4mIVi;I_dGzqU)lv+5LwJT){R9fg1?2uFc4! zh+xvxSv5&=!a4}EaD|z;oXr2gdi`*+Ee@x4Gr0*|U+LG@)c5xua&bZ&xI-8Co9K|sM{{!T|=EYDh_TyyQR)qpt6{9iCnL%y>RW?r)yk$+e%qa z&rE8~tShu?%lt~*JbT8&fNj=cz$7{tCxIn#$b@NAOyZ_S?mzVZ;pB(L#yf#*kd&0# zB?MdPV9d=+95NRad?)`Y>Z}d}9ZSt4DxS0^KG9)pcI}Ptg3#~FkJ1Z#&2!1faK%w< z`UP0=29G2;=g%LAN77;L)l|5x`It*gv`I-!5)m+Qvu#PED69XE+4)!qomK~mAn!(c zxajKY-fC3tiP0+C88H40M}XM@LG`wXfSC2QD^!qVzq1|@3oysq_AJ9x>wxoOF3UBQ z+8@bxW_D5R8DkeY(q>Na!|~TuT!7dpiS2u-S?1`hA>6Le2UPC5D=YWUH5n`kfxu(^;jer0(ih_O;;a`TvOx$X^T0GnfJuSb zp(9=lKx7}1KjHs0)?ZbSPDNKc7zWIpZShtCy(f3DB!6<@|I-PJvFs-Oe+uX@a{BXR zOZI({j6fe%$39jUf_v&^TPgN5UCLc`*AVP|uy|mt-HLaU=W^cQl|>sA*zKw!U9=FIzhnH9Wbjn*pl(E)@ba=bqGix& zH~Mm4;V6q&z$SEnqXd2W6QE^2Aqq+mzcJz>RMh|+Lj*=nf4_6W{F}aedWN=-Jn%~c z0qLn?PK$8tFLiw8ey+}`5+l{06v%vv-@Jc+wOk*(H-p?EFYjiTZf|%o^)I&hKtjUO z8JxFiN3PxQl=bHfM8LxcC`^I=0(7~y;Aw~1@$uXh0wJzPwrt+;K-ak3 zfJZgp0ZrTB+aeGCg@dopv-Mf@9bS_Tlw~M@hCmVNx_w*dl^7eZN^E61c$_mIz=X?gW>MWSM(HNYnd)e=T&ip4l-J}pBY>5j7P)T+PcN5DJs7ZNwx?@iX_A;KtH}vHW}aBhHy2X zz-qTR;W7-@tfM$Et_N*EHO4TBTCaFo^a<9^}>mZ`#bHfN<(A*4S%Dn`pBEcOdIebCP~NtAG)bjI$^%Cu*H2 zgh$x$RSslw;1U$%Iv|4xhp{hyXkLW4>jWE8f=1CzH?Mkhj1bn8F`;cq{{-=-TR9JU z_Liw8d(cV<1kK}c4xGV#OiX6|eG-ACTypZujJ!sASUxh5VX=hc_f=W?& zOF}>F1PTJmn{cLBHNJs?0pdl7LCbi-0kS-6!+98*6m)@o(>%?kxK!6gOL7g&ze)`9 zr^u5`gCsSkZy%U7%S`4x?V%t}wm@hL{GjM;aQVmv3y{QzghEv*C&KazET;SV`I+W= z^Tycj*|UdYg#Z-fv41W+haEFDfBW_=kqWmaisFzQ2dT30l!M5pZ#d3ZGEbA^km*^V z%)4vt|%AYx34*S!-=Zg?UE6fr`tQd z$#(vhxjc?<2k*lgY)!g5QIyCgByro`WEnki+jGefa_Hk7qW3 zL-z|Yc3Hvq$qAt%DUBjKL{}eDB@*Y1^pe_dpMEW#9&S93asXN?Blf_!YwA3P+AH6r z=B2Le`X-|QC-(GA6x>&#Vrx8kJ8|*DAlq5+c?=uRq3WxfoKJ<0%M{i|U>%{b3b%|~ z3m`>^C1WQS=!Tv-D*A3;s+n@@Hy%4;FO+PMz9dI!?xNMsq zcK}C_A}4ayR#{R~G7$HY>mD*~t4xN5tKwN17yS+!U~@XkA!$bbMEGum;{gO!%W6Mz zzLe+I`Y;}LI*;OH5zk>3drVOEP*UXLwk0J-TuAl$rP*;W3VGmgV_%*?KJ~g&gAe{E z2}A+T#kOF@U2M@wQ-0W{5ySa-)pa3X0AKMOSm3z`@($8uEYl2MKvJ(P_ZaM-?dKH8 zKad(rLhr?yJO2Uan&Q&M0}qex-ZawvCPtNkJanIvJJPHq%9$uiW^q10{|24Mx5CCH zEdeoazms=-eDeLDx>uP96$2rYYG)0SNDO4UzwkyGva9N`zuSKkdC67tFcM*9u1~k$ z1eS>OY_-O%hF1o@*|z(eW!|Zh_^j`$M=*0qAYu@8F!UlsXm-}lG<;Ar(uGK@b#G|nNRr)*jLTd`^P7 zH(d7^Y~J_SvP`+w0GdHE3p5g%#wm$h7;0g?R`Dq%uABy&@9w=3;M~>N{>B|yWa1aU zZkDHI+#U5w51WOAdGs8JH#>T&(A49+$f<4I%`T4^BKrRQ`@FGStnus}4}&}aql*@P z@&@)wg6EJx+3A-bZTeKlG9Y_=Cw6r)s0;fL?)&HP3W~g=5GNcv2}k1o&wrH|aYq1{ z3o#*RDR8#Xk8?hd$2B;4+SIS^B<8{??qB{zy+$Z8;8;&f8C`3{AaMvOEgxG|X&X0%D-Ta0LV;4k{6zp?LhfYEBa9%bahcp)v3Q3)FIm_mCbS2a9 z9ys6}AJDFw2(ceHzfoMA*u#DI5B=B@i8Rrad)&cT6k<7SU&&SE>KPdE!9G@Z%2C>0 z9jPBn3Lq*pj&aAa0%)1|z=pdjBgcZ%0n?SOvwF%YaTJf-TV(k$U?EzRnB?(|u3gWD z_#`)=Y_yy;PFM}BDC=U7+mW1dVVvn=7X5C$|@8+ zUBg>HRM)4&1Ubt1`MjvUi5d4`s;T`pMV=PMTxDp#W#-{LU*f?UrmFP+h}4K>QlAzn zMUluQwu+P&SjGnr8j#*Nai3Elz~j{@jdkYbMas+gphKBn3=26NCb6g_Nu_*qh>_!d z7@^VuQo6Cz(Kw7$H$Cr<&&f^ji!N7iF3$Yo?gcbz9bb zg*6CjmssCB|0$9;J^jwxDXINAvfg5;wT_0c-Q|O$fByMrT2Hy*IVy#r9|*~dCj^QT z!rF%{!$HrH9um!V_6*i#xiaJ`4$kXpDheXzGeCRsm$&e|4mX1!t#*I5n{#G&$Kmmj8=3wMah19nsC0j9M?x8~;hmVQaGaaw<>M$e z6x*A4<`{5L{fx44?vH2c@A1g4&Ux@)bja-OG44K=e~mnF^xnIgF-++F{y`RK^mWwk zWh`B~^jJLiSRU%6kbq!cAPna9e{cwdkx?)+)T#9k`T|K;1+YZCyzJcluCNWOUUAVR zPn$805^bZzCmp^dddEQvcWH@XLEC(rU4_M-Zy`LWgm?onwg?N?QevCb;7I+-5KWeM zYx^bAnS7PX-$JDT@H`|Q$btbu9Ul1n5dsrIvJp&*dnl;`Y1mv*B}acOFZ2bE54eJg z>M`L4c(0EGT#((VYfp!fC6`j>UB+2WJa~QzSIx|0AvNxVc}iBA8r~zj^;MYJb_vug zsW_TtxbF2(gz zJ-vmuxzm5^2$mKo*3ZU`DXiBB%@coxiKqLfz8X8ds+(=wk^XD=b)M$7fO>c83?LG0Uu5J${GQZ+G>98`kpoGmtB&2xBNAMkGVnbIq&aU@#XhHc zi(8JB*lV`9&5(ioURHgpD8yVbOd!CrbY;$Ky&}xu&VZm+I=CU1UA_Xjc}m5WvI>Hw zTOV;5x2K6Xjx1!8Zw1Q25-BDDvOFmz8`_%5g%D2*@tWi=89``Q;C0}yc8G%N$trB+ zPDR^F*kA&6q5}N<9laT9;>lXAClHrLmUHbygER!ljmj7nLQD}tFzVA1F*9*<(jk+#j!4U1Kl_0;7QvW{DGJVqKo zjk>VWH7K*vbP`M8B2u=H>n2<>>q-5HOhB;yW31MKwMVwWIp_~GU5Xq&lChIBGOtIJ zZva5MXz8GXQIl(<__Dlp)9~Mau^``&lM_Qo4D#(xT}!;54M+;x=G!6p*n+VyC8=L` z>>wipxVXP0BzwMrv9p=!l{7=#kn8X=Y@=+g8E1<;ogjf_qX{8PAH(`(@{ERi(Sg2{ z|3|INgNh*tFN92n8w8l7NQFw}c4HEPiYe$&Lw>M7XKW}(%8qO{q;S&7m~JEyd`KBA zlhs`!^~9e|sgW8az{r}9bUZ5fmtzUsZ8K{ z>=;-~JEA#3h>1`l3{j|VdZ%Iipgy_H0R5p3)DSE|etiL|1!B@ECuCcuXHe!eg6y?m z$zVE2DuFV>!# z8YoJ@RUR8O?&XQM50(-mn+8y5+SFEH7GlJ&GW52n0Rp8Y{<<{i;g|$?qf0Y4ssI_q z{<=}QH#w-C8X~ z(ljL^C5B;7b_IZAs8AjmzaX2*Wu1S55k$oZUdubZrAW~AV=RiM*7>|`+IttL0UiCzh-V!!_oRr5C;M`T;F>4$p=eH0!uML{+dU2;*8oc!2xd%klc0k zKBHW^r#Y;C_$cwo;^LsCgh}ou{4t$#0AA}7OE3#*34#_>Qhs{H<6ej<^#p_9(<3`; zd#bRz7Z<#EAt8D9=P|yk^0tR-PQ6$aL%ezy=~&MybM1O)sK3pP-&auO8|eET0d{tF zR(xA%OeExzlR=z}im6hofG0421-NQ>Asr0i?rYqKnNRAMbw^*`TdRyjp}2IMqo*6B zpowceU;tVUR$Rv-)O$~!!4G{diRP(HOHI5us)z%vyzXp+bm;0v8{=SGu%(uyuWHLU z>K=-RrWfxBNJ4=Y*_^YRxzu*(15(V*K^)ScR6n3;S%Y9kidofD6oDmc)qT@(yy{WRj@HYhBOrnt<>yAJ`T_#0QCmJ_rD_HGA4A!)qYespY*yMa477syrmZ@Gj-!Ap91B$mk5ucPckw5{O8oM38o7*yvFQRifX*B!Jk-Wnsi+0j@j!ts%0%!|!FYB#eBe7wg} zG~eEU?#Z^+p`xsHT?zU(byW0mOFMhXwGfNPE;fs(fQtN}6x?i8Knx72UOp@tSGJUx zJ=&ARfY5#~lQOlWib^Wl7J@py&NBj>?ZXatp=R1Hx)2N({3}G|F-$CHxpUUY7kSpm zw3DDYbp6AXh=y|8a&n6nRvga3`Ob(BBQ)xVv=y z5jQVNX(A2I2L1Mv<#DhK%`&?x(vln#vJkvF#2z~jZB#xAT|$LYVF(_ZK0gzM;G`Ie zTl)~MIeS8pCdzsg>1aTdrE}V{*XLAUSYP4ojij(;U+L*E?u5wCAv6I3FZsyx-@U!}r5xWMVQ8|_ zFeSdAs(Cfi9#YJuJFloAP5?W9i_2V&mvWGMC1yeKaZ*S%J*!<8AGLy&%)t%Q)7rUIe7Aq$*kvE9&540 zy)I*DCji~!wc*jA*8;asw0SKF=>`*IQX52YcRgujP%oxLJQtnHK zxn>x5R%bX^1=p^2H0D~6dny!x++f#$bb5{{AyUXLts(sz5hWt0o-HN|!N53gB0T^- zgU84qRk>!u3$j3O85njVQg%WiVdSw}EvGxlj@F<;BpCu1U>i)c)q-ES2HErIg%;fhg;mTsgYX}X{D!U=a#4bG1*Vm^a3rZz8K|B^)4$5ZN76HL#Rzxz#|=G1Y)!)=>v%EP;hlZhK1-3_}85=H9tFLrZ3qr7L{Gq;c1;d z1{+Y`gs4?-ZwfZZ^-{P;s(YxO)*ED=CVitDl_-&z0Lj^89MJ>B)#2{Xg zY1g4}UAwghLSjA&dIAi=(?ouxf|S_!92Ks%NOc*f3LW=z{d*PG+cOoyTn;4a+BhfA z^Doryf6xUCk<=`1LtkT$;?K;odvdsQ)Ke*4cvF4>dBhctJj%0gj@pSL%3I~t5Y zQL1h#esa2Vy#Y7NxL)$rvZqwM+23yCDLi{~w>Byp?Sm@da@Hw-z8I8CmX}B@3BB>R z7zoyHF~jHD=J6TiUReB71LmR5%IS+(n+1@!Y|3mg5sFo!Z{51ZE5&7NL*sy%Vf0r9 z$~SnEjtT@hFf(1oL`rF@iQtpgU$1(OJ9UCJTg;Hiv_)=#0sOkR{U8W(Hfe-&zZJ+1 z8P8kmKY7+tixaZ1!CR~p5^)8|bJjePxO_7P#Yb4~KCjjk^ zJj#`jaV~W-0U<{yldX7wh&(bh5>+_ED+9^*LKaqE&Y@p2#MhP{7 z#50_kD&`G-wZbw2$VQ4yzv3Cem!jqdhk;!~&=;z3|38#kvE@TV5#ISz7|9eCbTsJE z1JVHQfSnDKY|0AQ0sO{KE0$Hxt!X7;9mzr++-PZ_%L2+H5g+PoE()n&kPfl!V-HU^ z73=9Yjot73b@dB>|C`Id7hmMWFQxo_lXk-Vm6mb8 z_|7YA(9N4*JCS$(f$(^yooufnzh+x+7SM&o#TJ3H=II^}2DtrIo$~6tD6K%&n(U+dz3_G_*?p_zIGA zcUJ_dj5;MZxxyEem~=jRqxp{)*;f91{&o)4m-;zOXP~r#U5=6prL<9e75DqtqcRQJ zya5zA(!(fQv;B1Ad_JOjy${Z$9Dr=k0`(M|zT`Ttng*^YKETCVQjnP-6CCtLQ)yN0 zb<{4Br2}1>aaF~0^eDp$^kOzYSHHGVK}?&_H5~Yp)|?L4v(MxPq~J&rba=6ZL5QiK_MLL1Lm)MeViOd}t&n z9ALTtBt-aK5>XyQ=9~iTk?n*154<4;%H%RQYV^PS_UOCTGO4 zW%Ld zo(-#%nkVk~tDnVuV`73bw68+YYx;{P5m~&$(;a1tOTTI*8|iE#&5YBC)Xp@0uCc!F zi~$rQ!`59v(eHh3j??QE9d_u8Bu9FnxxIL3DR(x)4Dc1^;kN37tss+@{p(jSfUxF+ zoAgvu8wM+QYC4x@*1kgz08~cHAS7owpUUXKbLJx5c1eaSfI1Y7kt3moC1kytC*yyO01+rIS7a|O^ZTpG_(MCD$70g^?j?SlO@?#q_uf8E=2zextH{$`th zTw@h(wd!StEN)FnDO-W@vs6j zFA~%=Cj}|C+|w~h@*Ep&PKw~R2;#Z?=#=0)`hvmMTF2^y(h6YkTJ;Jp2w6VuBN7IH zDR*4=u`WJC28JYXe!dWlKS*yzyh>^g`YH)d?$Y%bO9 z%R?pvZtks=80kTReqT!~NTHq0NlFeay8rkPBJc)VNzO&^+0qK!#VU!X$)n>wcj=9T zQ{)3NP4{$e?@&{tdK;>t&@pU9=|m7{8WgbLWKmH6FH3<3fE&zRaX0*TYa|ceu%LW> zoLiAj1To-nb1#YvqOk>*W^>iL_fJUUP2S$r0jYT}+|nq7(F|e;yN?OxkxgaC?v$&} zNTQ{M`b@ypnlomv;er!h(Rdyfc;*$+os^tJv7|By+%%+ur9Ova3mRkhRYF9+LB5zO z1OrGX7viu!>1`-Z6PK2b%k`X6aOe3YNe!f>OWM)Pfy!{^#dGO2-}r;% zdg%#B!kO9M;5XUW0F5{9!5Ne$8Y#iE9>y+WC%EBR&mjNaa*ry#qcQfS`!|?{kMjkF zd(+{IWn&GJ#7I5Nj#^`MZtpfu1x6w^l$5&&i~Z>LGw%b!!^7E4HsDcs>$nDKhhF+@ zP7wgbp`@B)q9KHAuN$dcGa;L?MQoXIf(v@JTL_*kX$M!puINGTxWQy>&|nx00?DD& ze(sq2u-f{`R;m#~*5O5(1NQ)_9*fh)NhR0=V&yuRDMXc|aw7aksc*_=1$lcz!>BPb z*b|M(ONL}d9b(=~E4kpM@;5jT#-PxK;|uVbof%xe?X|l=GlM%QuM-jDv!wdx*X;7Y zv$+2TSbWXfPWvW4z53se=HdD8gkY~N`uTs)4p}MLJaKt8%F@|g2q1F`K%+Z#gew%t zK^+xDtVPR2gYp;^7)7vVfJe=^dp06{I~M8S0bm z;rgGb_<|jP<+uEzK2g*JB_gGN=C=$^nJJV@icD0vEDv@e$^|@@h8w=uaQ!GK<3MzE zQb(G7XWD~R>rg;OR9MF5VApgS2&}6QQ=IqNGKuz$O9#ThOTtPp(yhQ5&6|L z758*wbVyu}80tp19BB+C0_DYtO#@rAf)xsF{skI(JkW(6~CoS%w+|C5|?hhQck(^b4aSo!+eh31^NQ@Cb zrtvrR{Q)VRs%BL^SMwdmI3BVhL+RV7f?gZyPNtwG11bDC`!@tq5Z5&zrQ}T*qIM(l zACxnTDNO+!$|GvE-mPmlWdXx}fI<+@BR2}YNG=HcE5)Am?tP@(*m;{9=PZx=PQKtG zTr<5jviLMSc%CDq0?*d~iu+)lj&|3Ax+Fd8+=K)qtcX-%`+BIGmv^TD!pQd`p0!s3 zl|vPka}&lloFX>d2jE>3r~{O0>yURQg+Z8T1y-gKLw?ha-Ay6v&PORAF}7lPQZ3rx z_^uUuz@6>5xr8$t%QwwMQZ<&HaGUU z@B@84k~{?#3(?EuoLJac6@sH=HA|^!07Wk>WD$iT1u{35>-tiZ@eWc^fgkes&qlp- z>T6~nZ8hU8my8jNG7lPr9r4)>&paE{u?*r$)eCoXo-swVZmFy!IdXqT1kyJl;y5Q3 zdFj$TNT)K~a zLS-lG20?gS(w5`Anmww+tcEXxzj#^)&eO7gIjA5xJefaalSBW(L|At zxxReTYpV?BzPkrZq^^WkX)raE{0R(}Hn=lH;O2CVt%gsM97^LBthdlkZlt&fC-nBO zQk>{DYJEGTy4ypvkI)C={cEf6W|_|-1CzcVXsQXNbbLQPa_u0AH!PsE-NMJWGI+;U zso)*s077axmgpvU3c+@i)Cf2S4x4^1N`G8~f@ap!Nwbf1i$Y6J4P%z*X#I>FEk$4@ zW}KmD|A-9ZJZx?wb=RE}MWC*eI$4(!r#TT3&LMdUBz^ zN`y5rV;?_zi*i1#U@AQdR!OiO6O2azQG4W3s-qXxTKP~gB$z7R4D3&et35CaI){Ij}q&c|!9?O)szQr4>2`gPCk8EQr*Ao z=^jmLej{a&7;ZfVK6UGK+v9D6pir;ua}QgKYU58xk&)c3)&OB0HSNL6GfFEsp`h1i zRj=sqdk51`5#bSSgP`r4mJmQ zgyS#hYy+E{KO%NyOOQJ{j7|@ayR`~jA+h4rk|QGt`E?dHNB)GVBHFQ5oH$w4S>oxQ zz#kT@UKG6YC;r1 z{UvnExv9s`GSb02ZvQUx%b%{){sCP)njJyquyaT#ay{NXn3O#zMJAJ77}H5U7Szgd z#{`n{QhyxlNR+AAzFfnYFW*Q>e+uFS-Ki(kL63otVMa+S{}V46{&Y{F2<#pC^t;tK z_0)fE2?)nhAtjwF^khNMm6-dtV)qYY2&;la zl|gn;n}&6RWGsMUioOq@Uk)Xwm}0#hXdZ=HEDyxj z2HX|bSx3Di@4=qMly+mKj=x4P)N9f#Z_r}of}(#sJ7t#h9o81a@XEUJWIroIQ-IIm1j=NOBq_!nQGlGlTynBihL zR(n^pxTeOA-*H>EMv2>ft1zKl{c5 zir_$?^HWi5o}T~%I+Vj0%uW;PH!Y7|gsB6AoM(uNx1AAus*xBbh?3X28~zU7nOz|Z zSS6e_3INS+7Kd;zxC5bj-{Bn4zsp*sSEh0+f(}`ony8^*N0pU>*TT>*;mD=;-rn8_ zKk`k$ILvHZzRE0XoM!L?E)66B4w5pLtnnqAiL?SVTXC`m70A&bc9NY~4fgdAkKY8# zUajlC_5F9;^h3%r$&;5Q5LP3W2bB~y6S@)vmrJQ--MfQJZ^Vx;su|k5DSQT}a`X`> zeZx=5;76WYsGyp7sm`0h0vC7A1ZeA1EC@)-3Y0&p~sUzLvUmuq+yXd_LIJR)fp z#dg;a%p_YLF!^RF*HQ>aQib*&t+?g!!=`AbWfUJ;ZcyIJ#jy`|A<*iFCVL&GssbT1 z0*V3)S!DnA$t5IxGk8jiYReD&^#itq^k)%-$g(F38aNH8n#P54Z;8?i0`D zXwEH05J>8>=&Yp^e1=W2@%GSnUuhLan(zmq_4oGKp*OK~EM{B0hdXx}j*txB+PRz_ zU0hPKYb>^=rbfJoh3&*AZ*F_JXV4cx(7y)m_a1c3QkYzYny9r^6nTFZL2M#JPuJSR zXMjmZw7%4cOU3Y^Yoo$Nm6sP(+O!u8{KR(~{iApGptVJgAKK;K*k($!2h^GN>^y7m z3kgTgvn^jpYzh{|?2*9AecB%sAV%8vES{1H9--s ztwMDcCYHFfGj{wM|5zWARtmO5Xs`iV$NisJQ01<{KA70FGVp;hH|uNgf8;$yzc@lmU;BE7l)*q{>NRG(R> zAfjN?SHpI}zkc(5dK9#xWR)L9JiAgQQG9}2YWYzHgaGDiuvP7!AcseqkrRpI=a5bJ zLHEHxHFR+CX|#r6U{7sSfPPjMci+_bXHytzS&^9awufw^6S`)-8AEr|xLxCRknbE8 z$By2LwzOBRwP5L}eJq9FQ>Z>`0|kVz8O9k&$U0M-C_c*scF_x}jc<*)LKjq^JAM%N zd{|<{vvn^{6E!fTCb2{q^YT(5%_CfrL#@q8_(N^{slbMMu!HW|*qjXJnyv%6rx#bg z!Ek&PwqjOZgC>|mJs_y#L$cezXOzjo5tzP?`Y}voFFMvb;Teb)u67%Lj`Fl~I}{vH z`I(EHp9liH+P24NfaZ@yT#a$2C1}4b`eu2q$b+1wR{bQ*Sz}gkncZgRf1>QstQgs} zpZyv;G1Kdhl`N^PLw5Mv894Gqxum+E$Z-Ed&#BZC4=`=~o|CPO-_5F|Mh8b8p||Xn zagOtN3=H&EScBhXqP4%1KO_O$5mBr>_$m6*3N9hBO8!R;|MkO{wmG z2ra5pYeH&CJLKBrQs%|qYoIVcf7LOHoWa>@CNA=tUf?m~zC)$WgcLDXnWyDH=S;3t zY)duN!jZm-(x~krdzQls^O)_yIWT?dHDP;5@^0et($kyft2!V3@^T)-pv?k@TJP6S zJTBU6C|)zJ)mUWve?2bR2b0NDeT5P%BslZmz_YaIe;VTPT^#4nnZ~CnFaOUXk^ehL zma;}(Cm3k|U|Mi_MKTtW^Z;npJu4X|Uju7-NoMAuu#k`t0TYh_GjzIJM^|wXJ4XkM z?n8l&dV9!JZA;Re5OYZI0ahX!#CLI;Ewd8Y197D%_R3wWVfOmb;=BQgXK#4Od>oAh zNagsUY%`?5g=ahU2q40YI?<5=n~E4<-AfY;Hy(Io!TY4`!OocYC#amDYzdKz(EQAY z;Le9`aDbiJX|~zxL>YQhnSvf6B@5WZ0LW9+;m(Pq*&Z@Q`v&#&Q-)c+ieejT?TP-s z^XN(!67V&bEdLSL=fzON66%k@rmNPP6-=p50?42aaFi=oZz_yP^*F<0rVHgCnUggD z3Z#q!!_(bIjX;qTS#{BYE>Ixqjha{DU_APx58gtEw6q5S*pdN?LY{^4Y##)QXrP-@ zD2qhxHT!|vHo6#LW{3i`t#fY5!%K|YR##(a>`HJfjZL%_V4xC_ylE}5aW_%In0H{t zqGPDC@`hABhqSFUO|)XTlw+f_JF@K2Ai!88*d>7*pH(|bQ=CwkPjzKJ5OT^ho$b}s zpjlz}{-iEobe+uMgvr|1iLj&ejej;$2f2StU6`3?M=CmYe`#oWd65u&(Qk~^vTv`F z^MFu^0U?OH{CCUy&|Bjnp5!xs5Ebrpx4pIV%h!b6C#s%OX~Uq8h23&6XRPY_(GAoT z0X%m;f5o=97lI4Mk`{Q)U5l(6yMF?x=&H8Iq|2m+8ORlWc)scWt80)yY=YsUb?Ekl z)}rcNUXY3ZLX~W_EjFlqWA{%(W7zDsR%mIx5ajrwZv0Z&I&sO*VAMz+O1B*xhBRlZ zP&KR-o8^VH&+t(%b}*6o-XJAydaJPEasxKjEr775nIH4QPhU%IbdDESQX6u*5`&~R zpDS@8K|U4YLeaUZvc9!CD+9={dL+orIu6Y|qKc%oNM@sgQVj0b# zA57-c(U(6nX*u6KTwe!JE{|jNdvOjOYgk-1Gl>>U-6}%Z9?ai_t-UD*0Pg>Nx!|HT zcu!4>O=&IgJKe~3q+1V=8N#3W7#+2xp{qtp##WQ4gG@CGeYf%fGIR8-CNG~xs!F=D zLb%%;GD&I_iPJ;suzpmaG@vpr5M#ZaTyg`9tQgN8r^cB7NeA>X2Z%H%pHl0 z>1a`^TJ(+~Izq6|4(gt$4R6L|l@+RQFGE4cKEaNai|I5=>&JUj+bkgJVA~z+t~@ja z)F0Ooa=0x;RI?0$&xC zqyOk+x-$VbgHm6}Y;IgTh|)F@Xw`$roFPxQwwFl)acI^TkQ9{-8C!TN`46JD%NCrz zc{i+~Bh{N?&;3ZZtkCJ`?xWy;UGncGoAO268nsiW$XYq!n`?b_Lhem@CHF)1<9z#R)BqQCOZN8wn8a3)hp@3k$ z39Mrc1h!O%oCk#M601-;*C3*b#{LP z9De(H>Ig?EM7mQ-x-e+^g?nUO*u8%t2$(cWei03_&UqUncaT1VF?cAwD4Lh)&c zIUm6ZS3Y%W!`Npts3yZt{y9z1hQ9-@i&{LM3~;nIc<& z75+ZPEn*21(-VX7M=f)F-U* zyQ5KCsPFAf$e7M$dm!5*TQZEpTfZoiJu}oZ2tn%hzTMcngpa#d*rRB`RK)J(8tM`| z)3`Ir?c@x;sN50sUM%c?bOX5)Mx$v~>;{MyPm&W-@ zb||4UG-&}UAzJu-HQFci)1@p_E=hIM{_y73jxVvLZz8k#CA@|~r+yzYrJ*o0#`(>s zriz?YrHdrNHbRGYqK@@jE$YOA&YZRPTd zUsDy@Fnm>gTjg+)G{IZaf&ecw)ssB2M1-=NpKe2|Y&S#<$>=N0AFJ>6nIc}wf^;_v zQ__U~*4!!3!_U4>17XW;75@+<&#Ct_R?jrL!V^Ba7}2kP#d<1%LesH7uMErc_!M}~ z2quXnT(+TSNw(#J707+)uBPjZ-JmMtL(4@7~7^30kUR3DKCw=A(Sa;d-9ETlLIE4Q8%gfzR zd>>gt&%~ZA`h|cLb=LCF#wpn#8a3$qGf9LO&de=gv-TZo1E@Te&)IT4(_AS!UVPy$?$-Q)CAA` ztd??Pan);jYQtT)iq7B=JOlo9qit|Idq#oK^Wwy0^bc1(~?OcMu%0ktcXLsV8HuK$C!BXY3r zEGT6)a*I-ri9+an@fU}ISJ0}^Z9Mi*AW0#lXzf^oewSBSo16fyw<`8bI%Ifh$8EaT z=J}@~6s%^xt=4*s=6+1)zk!&k+vRN?iQ7B9CN1C7s^Sym-T%tQWA8m%h?0D0Ussb- ziCTfFSxu@eUxhpK;K0C$aoDVT$)wiLSD8ykjG8C;RD7?^|8Y$B{UAfrrr?UQtTK9o zMMEOi+)I7h0e#L1&Csr+h6d3QJ8rL4c1~Mkm{Gssc;#vmrLuK7c-HhS`qQ;jXmHG1 zH%L6Iz3_qbw$YIk$g4@iy(QpP&PLqu6ua*+kM0p%Ho(4fskRQAIvOYVoKTp`oD(^# zB5}j;+=oE#)blbUA~;y@Q;x2ViE61n+O-wItjQI4!hnO;g7Qa zP%i-uL;Bk{8$E2FPMCV6Cc^>Ek66e#U$$_+tc+`^bKM}>73@UnHq#PKV8GxMBx-#}fgV5&_7pf5U~ zBvr~y&{fNOYlGU3%s+f~lDf~QG_PC&hw3WW5bMuZO%mUvSkTW&_IP}HyCvPEdt}v;wA-|r}@siC(yio7~6RW)^24CUv%#3OhufyqGXyKukl_U zsXHW-1fXE|?WCJ_Sb(2=tyh*}`f3hkR-8=Td@ktLq~q$Nrk!Xxa9%us;y;Q*C0=a? zcqH(){qofNucSMaBgR}95fiI_q4MWw^3{YaXNc^r8A$<7Mgvej2-L;JVV(rwlZ{aJ z^=Mlc&t-Nv9S%H7L5qDoHO(NrbcX5sq<(a5BPzjbKZNsq%*z1~pyJ<>cKAgJsG|3Y z+l7>R7{10IUx8}AZmX2jBZqV1(%U8|aPZ`hB#u9K-3~W$G*?W7h>&Grch{@YJZIGy z`}~2>^6!O8&)|asFz*w89*t3j36*ORn!kPbrh04b-7XWGpea%r8*!Z$;e_JTP(-OA z;+igEP}7tL-fRyzBiswsv#ja6F`!Du%3Lght%nFU5N7gKSOMMW&Duy<45D(q}= z@cyOoyXCV1`oidH=8|@*2m+I(f4HmKX2OO?F%T!_0%9?5oEP(@CjIQ1R+K<&lpi=@ z`nfXzM1&s|E5^tSofwd$T^%rzr=vU2d7@R8-|P3}nQT^`LZaAn+pqOQkUE@l!~G7?zq`*w(`JEr6tt9l(>kbYjz^`nkB7`f?Oh zYDXU-+ByINf6VN|s~^37zvvkhxO`AK!ZWB4>;!0bn_`tEJOvK`Z(e& z&IBS*v^YDm8mTOpxdjM-tTv$?X!9tfwz)7>VpMJjcWrwKtKfrDrybg((YLx5mYFPo zyOchu$&>OjzxU0}jyD5+pLV~3s{rCOBPp4GHpVPZi?k)6FLS}6pXhSi!S4bg5h7zv z4ULFnA^wHJS~!h4WPGV+o#aIDuB%RJk_ilh)GvRUEyB#xbQj;!Y?!=74Rr4 zCH8LPOE^Oy(F1TkHqpDu%efSV!}3vk5*8No#Hq}YE8oMqeD`r|eZ!!JvOqZkvgzUT zyjDHr?u-l&`?!(DC_aOyAe1iB1k4Qd&qhQ;%~%e6QrILrrSdgOJ~md3k%kMu5$F4* zAd19=1cZqiN9)ttWmw^f)ekUSHed$Eg_`N^p9Iu@KeKoF&u$GFi!Un`$YAe_iF9p;aAy#@G78 zvy0S9$()^NqJH1vS#yl%7WsAMY%?vIEENl8m;neXKqYT<6~d6fssr<>JN#g2U;s<; zyZftz5gbxv+1v}7Nhm_;v`p~hwp1R&M!Ncea(L05Xqr;4NBbyVWD1G&;x#e`ZtKe3J79L+$nsdl5ZqS_S{PM9m?zn zMz4N1^95Z{d2E)~=R3fdEa=kAGM{cj6f`mDs!WH6@OuRrZDn^v$W#S?i#V7-!2QJ1 z@`oULuc6r!osD&a<+JNQhIrZx!|)wOdz!5W-gp>}rk|UxefV>Im?J6(w+c~k?=KLG z43QW(x8)bBc>0|qJpiRk+G!&v)z@r(KB2%bNO^EMJM#dX#8yaBr?}&DJf!`pj}KH` zZ`vC=QXy*Z^AS80_8Lqfm8ubR+uj#|+blKZ-~Sq5Y*JIP7?s1QYrgwbVM4)8B#-ad zM9k%-t^iJG4!=RE1AFPEg)DB)p*~vv*^rDYVsBn4#xTOynQMYGBu%pYEBK`pJ#6z= z7EPX`>DfeELXS@sGg^Iwy~y-`>S;^;7|Ao0h8yCDbSQ=k_u=mdj%A~K$3m}FltY0{ zx9w~Gr9)$uwy_&J7u!O!Xr9Sa_y4f>m0?+~-L`fYHX$yT;KBf;L$E;zFlr6r}i(*#8UX=wyeT0u(kjQOs;_u2dWK0o)mzUx~dyzdkDJ?}Bc7;{cgS&Yu! zILfpH4P_7TW?&6_q8ZnP1)|8i(>|C!$ZajdxXkT&8i-jq_qN;@Tzv5KUNYt)EqPo_ zXDGD`b}OJdX_Qv-PcWosWE@1L;*^8@0z>@H$~!+LiWg?6{du$Lk5XuPBJOJt;61Vt zqDNz!@ScUqtxsHAm>0^)Bd7{A1YaJKrBdC`9r#!OiUD}~?^Q2+Sw8f$3jEjZN{2~7 z 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 u}o`v`>U9Gk+<0dtL~6M%&M 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 Date: Tue, 1 Sep 2026 18:15:44 +0800 Subject: [PATCH 07/11] [cfg, doc, tests] fix: simplify DAPO review scope Assisted-by: AI tooling Signed-off-by: Wenzhe Wang --- docs/algo/performance.md | 23 +------- ...n3_omni_thinker_dapo_avqa_reward_curve.csv | 52 ------------------ ...n3_omni_thinker_dapo_avqa_reward_curve.png | Bin 149246 -> 0 bytes tests/utils/test_config_on_cpu.py | 25 --------- verl_omni/utils/config.py | 12 ---- 5 files changed, 1 insertion(+), 111 deletions(-) delete mode 100644 docs/assets/qwen3_omni_thinker_dapo_avqa_reward_curve.csv delete mode 100644 docs/assets/qwen3_omni_thinker_dapo_avqa_reward_curve.png diff --git a/docs/algo/performance.md b/docs/algo/performance.md index 85e42a1b2..d22a4fe77 100644 --- a/docs/algo/performance.md +++ b/docs/algo/performance.md @@ -1,31 +1,10 @@ (performance)= # Performance Reference -Last updated: 09/01/2026 +Last updated: 06/17/2026 Below are reference benchmark results for VeRL-Omni training runs. -## DAPO Phase 1: Qwen3-Omni Thinker LoRA on AVQA - -> This single-seed reference used 4 NVIDIA A800-80G GPUs, FSDP2 LoRA rank 32, -> train batch size 128, rollout `n=16`, tensor parallel size 2, and seed 42. -> Greedy validation ran over all 1,911 AVQA examples before training and every -> 10 steps. - -| Script | Model | Dataset | # GPUs | Train Batch Size | Rollouts per Prompt | LoRA Rank | LR | -|--------|-------|---------|--------|------------------|---------------------|-----------|----| -| `run_qwen3_omni_thinker_dapo_lora_v1.sh` | Qwen3-Omni-30B-A3B-Instruct | AVQA-R1-6K | 4 | 128 | 16 | 32 | 3e-6 | - -### Training and Validation Reward Curves - -![Qwen3-Omni Thinker DAPO training and AVQA validation reward curves](../assets/qwen3_omni_thinker_dapo_avqa_reward_curve.png) - -The full-validation mean choice reward increased from `0.728414` at step 0 to -`0.824176` at step 50. The plot shows unsmoothed points; the corresponding -[step-indexed metrics](../assets/qwen3_omni_thinker_dapo_avqa_reward_curve.csv) -are included for reproducibility. This is a single-seed reward trend, not a -multi-seed convergence or final-quality result. - ## FlowGRPO: LoRA Training on Qwen-Image OCR > All experiments used NVIDIA H800 GPUs, LoRA rank 64, `ppo_micro_batch_size_per_gpu` 16, and the full 1k validation set. Training images per step = batch size × images per prompt = 32 × 16 = 512. diff --git a/docs/assets/qwen3_omni_thinker_dapo_avqa_reward_curve.csv b/docs/assets/qwen3_omni_thinker_dapo_avqa_reward_curve.csv deleted file mode 100644 index 4c2d17eb3..000000000 --- a/docs/assets/qwen3_omni_thinker_dapo_avqa_reward_curve.csv +++ /dev/null @@ -1,52 +0,0 @@ -global_step,critic/score/mean,val-core/avqa_r1_6k/reward/mean@1 -0,,0.728414442700157 -1,0.7412109375, -2,0.771484375, -3,0.77099609375, -4,0.75634765625, -5,0.7216796875, -6,0.7861328125, -7,0.79833984375, -8,0.783203125, -9,0.77197265625, -10,0.80224609375,0.8048142333856619 -11,0.7890625, -12,0.7626953125, -13,0.79736328125, -14,0.7978515625, -15,0.81103515625, -16,0.806640625, -17,0.7802734375, -18,0.84130859375, -19,0.7666015625, -20,0.7783203125,0.815803244374673 -21,0.8115234375, -22,0.82861328125, -23,0.80029296875, -24,0.73876953125, -25,0.78662109375, -26,0.82080078125, -27,0.78759765625, -28,0.76708984375, -29,0.80224609375, -30,0.8046875,0.8126635269492413 -31,0.80517578125, -32,0.7939453125, -33,0.79248046875, -34,0.8271484375, -35,0.82275390625, -36,0.82470703125, -37,0.7900390625, -38,0.75341796875, -39,0.8203125, -40,0.8251953125,0.8142333856619571 -41,0.8046875, -42,0.83251953125, -43,0.828125, -44,0.85546875, -45,0.802734375, -46,0.79443359375, -47,0.8095703125, -48,0.810546875, -49,0.77392578125, -50,0.87158203125,0.8241758241758241 diff --git a/docs/assets/qwen3_omni_thinker_dapo_avqa_reward_curve.png b/docs/assets/qwen3_omni_thinker_dapo_avqa_reward_curve.png deleted file mode 100644 index 403765faba8405fe7c0665c8cde0604ce513b0a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149246 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

C)d~4=~ecTYS)AgO#>a6gHMb!Fz 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

v zwEgA!@&+_0mH}}yEfX+{1C#yR+Rpu#iu9q#45dbxLBU>r1T$;C88lxGSRtYlMP?G) zJL|!?2+>!z9iKC5V9cv^BaP$W=rN2PX@uTE6Wz};H;{?9HZa7+-bF0Vefugxwg2U@ zksbwfBHb50Io!|*&MQHvNmdt~{#NY<>l+f>@h5+Ii4o_{t!^Ua%MYw|-8uz!PA}iC zHF#IdLIP$=ac=d!pd(QsVhhNV{T78gh=njR9Zh&~by5obx#bw|e zJr)%@lkt4j+5X$Lb4_TI+TsyPs72OS?(Q50{R-VTFKQyGGu4(5Sf=Yzz!Rq0aig?n z5@NZ+4|If7hY?b?ptY#U`2KpwNZ|7~VE@c~oq zQbh2*XXLeHjxV{-JGmO+0C6B`mAmSrbC$8aC%K!Bj@!8(t6W_Y8zZb8>q0-eRBpP` zUZgka8oUQ8Tr8*co`xsLT(tny$3)H~marKB0rag?5f?+&=NI{P-t$>TMt^U1pkG8# z8R#we34vr32GlHVbeR8h5o6BzM`E;Wq!yt&Bk#pOT|$$EF7Qs-X({qr#R9a@9PVTKbOO#Q?` z!O(9fDAB?mZgfQbq(WK4Go6A&HClYfdw9^^>3YA~4q_3tB zfSZ?Lse+Lq*g%SL9?PFw?Fn1oFYhjnmoifqSN=xF6y$W^rOT}Ro$dK8whzL=e_u%}bVicS1?W?q}vl_N_@Y#%j7{|%Nm6nhcBd>^pl9u144sO|)BRR@* zpk|12M4oSy)68bod6E+?4KOdTMin|aS$sAg`i&49aB;NhXYFl1HNwF|0V~IZg1-J8 zM$W-04?WKo7O3E=uPGV2nXn5qW+4Z$zD*ko7nu&{c9auWo`Q)0{l3U)Aq`wC*}I%Q zvulgJbZKLJd5Bq<6z;L>2zTv8S1fmUKXIWRCLX7|y4O zmik^laU=hk;05DqILs~a2?>F9Skk`8!ek6M;U{4Vy-g|mLq}X{6pV`Zf$HYO(!t`i z%qJNV>gp7bx5>=RjPEnGDE5O9i!kXYG&Xj%lfo4rF$0#!1{}LlGZGY|WBQ@@2uhYI zlrO(MFvuTIRu)&b?u7WYdjBzc94+F%p4`7k3EIALvhiN#=BptmYUHViX~|!&X((Pf zivkv(M*ql%>q;)O29M+d2-j8xg95oQTxBcBvw#vLkyoe6QzdpU>yT^Xk<8h?Vsy8w(5*V3@|W(z)fvlbFQWPX4U+YsF^I{5R9v!A-8 z^70t?)>N|6P9tXVQscvOqq^#I`Jp*E$^15pf=DCIp;elBKL>C$0%MH!oy0LCPymwy z=Fyp^d1dU3y?8|Jaw{8;ELLCqQ~vin?fC-O0&TJDgbx#9ZFq{*4U-%$T3rgwG9i!> zuGzbipQDL;DrfD4HYUz{T5%^^bSQN2KrQmh?%L#U-}Rk9{5!tB!hHz2MJ2mh;ghXo zKzDgWGFoke2q;BXcUQl()f++MMngbeli}Ifv{yvT;g7H|i03)frXy3h<9il;meIR1t?Z&HnJALP@-ANuY3;X>Caa-f0C zU&_hJ2^}2j+eBi~mb1!TN&Fj)@Q^*0yD0TI-Vq%H(FGtxGBInL<{a(l9C+C5z ztzp7itg@&8wMEaa0%W`E>*cpbIC+SnEL5>Cxk!NXA_|I*59ELk4QPqaQRTDU%8gfA zk{fi&zaT3mQEqK83QTH9an<#bVTX^@sAFN#v*d(9^HWNpMM_;b6eKiWKUEn=JX>xx zW`9x)*>{~zM-!0;c=I8wNQlzGe^(XA5PAA$keU>}!$;a-*^=knk=!4(J~FH9WPYD=^6e-ew;B|2 zdYfa&(hHP-P>fxpU&Phd$F&(Kyn$3H&bm#F-L+R-6$rwl+Kt_|244B7bt&JFQ{oIx zq9NKor2N9#(6~G1vc!G}TAbhcPqM%rsDMMJMj%tHkO>}8C0_2n9Q$-)ejbY6)M3^Z zw6}Z1RFlNAAuhRcBIQ)N7p`y0ci_$OzfhvfhdfZ`6F)CG&1NQ!|%Gx zMeJ%g$+w17%Jhw6FF{8R%~w13!glZi+kldkPWsC=$rQZ{{b_766g{zh3Q)CzMazA|Fbk)jaAbdObbp|nJyr`0HS2?}TUVp|X{4sWnRibkiOjX5 zS0g*(;p-D^;ftX-t2&116`~`qXQ593rd|W|w4cHtoR}jClwA-|#eZurPWgEHJM_A7 zGV^4w;YlR|Igrx?(9o%ww?Wb9iZY1~SLzrL>Cti=el{x*1+L(^+tjDVaWtKOewDJS z11Lk?G4a${SCI+SE_D4uEqgniaMQ}0VnhT|i@o0-^c={-OP)@kd0re zxxHd{zITPB_nAUX5HvNx=#<*VxsmQ>pd`pkUnQob^q-iRpru1YuP{V(C@*N--#w_X zTDT5eaZNEuHD?yI)nt2`LO&?K%`5dg^9eVFO}j2gsyTFd4mtc7p$*se=j_6Py3%(*F~6?5Y01MXZ6T`R7qU${e53MpKZz*RAl6O4 zi#-{&HzN4je|{+`Wt%yhgO>N4TCkr@#raSND7_Uf;*{PjoByZ0nO12vV&rY}4Li+* zhS&fff*)}W_1nXx+9`=j0W~@8h0eDC!47!;7O%|Uad0Nk$qhmBK*ibM$wV+DD?U;{ zvO>v7bX3oGOCy|jDNdWabo?|H5~EH|I%JgDtj98p->2|#fz!2?ozBfv!fesmY54Z z@ZYI8ugJGdMWCAaU4Q0-pVRNILCtzuV9#xZDOIG8YH`lFV8R&P?376arT;T!Us)A|23&8bW{IV+c}O5YBD1|-)|PyYOYcD!thE`YPpCI%de z#fGY{``H3lb zp@C!0$u{li0uK#xT!2N@lH`$X@n2@C*M_c5|1e99SiIF?+@eH~FCKa{0SGYL%NzRU z*{+Y*Kc>8d(CFYM2~3Ho--nJFWQssY+%j+EY4~&LP4}KY{iHmn(z!zBSMPym?JpyI z@(XE5b6T(Lsz<0w?*CT5SzSaj_9cSMyC$0X`1q@D6Ag?$K}>JgHS;g%%O{#2W>w<| z>c`M7Y{^b5z-y?l!bVRYvCC6&ifxC~Z_J^2{hYP{)9~ccI#7wM|IFhGSV4LqMJGA$70m3i7AH&R13ypbjq7qo)Ib==rrk2F3JC zHL|T#aMvr#3hvqcATcJ8KxPC?y?DFt@XX;8ukrdXChU1l&+v;OzhuQ9ocl@DYYW0M zHm2gGAM-RF$4iT;QQtw#@~0A{RNk5?3})Bpo1RK#_5o-jrWI{jyHPU}-^GeTq5i9{ zU>GSmbsZ;4UUl-P*aeIJaRGMXo{z#6rv6nAkCc>-k5dWcGM~VGSF5fN?IMb zj>$8fxlMifbqWK+@4iMHA#Xn4bg^{P?#YKj;e-r_;fTgMU2)&+Jyq72XLWk4IJafZfp@)5||aL4akTR zaf!{zzXJ!I|LKSqFw4VWkY~zyb;JNPf4M~d4tU-#(M-&2l8hi61N$NascA1Np!isw zlfn7kcAQn`JhnZz2YHiYRDd_(4;6hK%#)O4U0{-nxsnrn3HTP0HoDbyL!%)9l-mmPN= zE`|R1t|?%B2J(Z*t0d}69GN%ORqzpro{Xi}htxNP*Ji%giwXXro@W;HT)`eS|> zu%HVU+{D|W#H>pJDl{!y@<^O;bG>B zm3Z4UhX&%-L)-gbTZcalx`w!nzEi(N$<=fQp}R7JkC!FRsBT-Sy}3=r)R34iudlr4 z0yAkKy6Yzwzp;o6DEUizsn(in{DY)sIQCMhsRYaHLAYk&gD$n%if8X~t|VY*7b(Y} zekPos@JY(SdsOTceO&BA_w!4ycnc78#RZh_^G&y9+vNfpWPE`C0{9q}l_D3?$0Fjf-qqLEr%v z_MM24>2Jn}-vHEq`R&av;nE7yR~UIs4q|zdIil5q0lE8^6rZNmj@>N+?vjm8sR~FQ z(?&-0=QtQm)51|C$Me61TlgsQG!)%XCsfDUl70pd7MiMf)$nk?r!dgl)KhfeCznz| zn?0N-n1m2$Dzv6GjCf&v`udlqr~R41nO5>tg@r0d$tONcmehF#-JOvU7w8Pfz4^h+ zf#EhEi}T)N#R5%eJjHi%!%M_vaKZJ3*YxI1nOBe*H219fJ|4hF#$AlYFXQ-+K{pqO z?`cmMsnS@Zh?8$i{R?9!aN-inG2^^-BJ~+#Qri0=WRfUpPayeWZqorQcUd1hbh5C+ z&L>pn9fTysJ@Uo^;SxAVp-MP9vC(_%X%_%IlqyVo2Ottc(8btQwqmgV7NEnmW!6hE zcBVTg%cG8NF@}3$>q`dQ4>5LY-6Hdeit$%kQqLGRDH0P)N?xj~9e9ts#m4HtuJTly zA^xcAT6p2rxgEUCLGA^ayYjYwJZf|+-Bu5rV-LzczIfQa z7kwb;E;CnZ{j}rkc#%QvaE{Grod!>}@nC|XrJL1Z{5(_TeTG3*U1Ik9g0G`gHdeQX zF7ZA7s%&xWI)zvN&GJ3L_6SWvPy~5yz)k%A`tBgi_TE^m#m1D-)LAJ!tz6!Rt$d#w z_~@c&Nh_vrH*QUKIj+b+OzN$`G$ZuTQjxQO2G%EpI+2tN z?=%i!`fC*42SQRUK8fZLwHN(V9d&O^I;1-YtfaH@w-#eTksa6EnGY zaTT8VrEN7>g=f3^)g3vVe9UK7T*2Z%H1#-#AfKXaxU*Stg93AVW*&h;nkxGw?64$x zT&~aA@W)J36(=rf!{a>+732*iOU_z7z)%*@A5r(|{nFITnWYyR><_4f0$2NZMfp-4 zhY#|V`F1Mv_-Ui6^M?vTiP{^OXXz6z6!J+iqsy8n4=5oH^Q2o=5q|OJ0)g>R?)mr)9bQ%{|D8*hA%~? zwug3;%OD%>YOT+8v>N-Ei2}(42x>MY;Uk(IAIbmH)7qNrMucI`h%o5ZZy7J#C-5t= z>cVTWaTN|B12mWtcelLr@3))HPf;u4;t<9sFtWAiV?Iu@L~gwL^eghR)?6huCZdWY zH1*_`QOUxS6w*icPr5>NI^FgY(IbWIq_eON+1_o1>&$G#4CSN^^J6QMA1vQv2lzhM zu~j%@t6ifiOZTT=7x#@z7mQhD#D-^E!oaxk6jjv;;(2>aIv>M z(sfEoc*Af{g`-W6iccX{&*Hee$48FL+a5qcj~^Z z7`}$Pb^R+d*dpmvHM5w$8vWK?EFKlwz2lhWW|r^Tv6)nmP>}mk-Eq+Ho9wc$)o#io zd&86Jr5+tPze7jyruZUn)T@UVqQ2+h?p)*lu-_3?rF%2nx!x)k zJ@#Wei+K~hGcJvju16Z)yt^{(?0QklbLkU~jd4hEklK}H5ar%`UT+(Ut17uZTign2 zF_2KDr)LZG&Cd2+mYA%Xl8}I6JD&D-my@qM9fn4Xl`@WAY+5DUr2QsBU3Ym5c15`D8Zi#j(%$%+b0xpGgAtsVdXdQV5xv ztGLVKH3yr%^G9Y?x*#0ym&PzA;>K@Bon87DOYK{Jm~P;`QkVv5uW^0uQOWPAQ)Ej= z-7RoiG+&J}(=?WqHH_0_dvO<2n8H*19CMwG*k-skW-5uHLb{dA^?2`2!mMPp(2-ZQmCd*Vk1drc+9(;>h4=idCJd^KV$y^*R$Eu@5wqE;g5&s z*o8y8dU`?xHoA0SsEnt&dXQI)+2i21c;VM+uj}7&crH!Eb5<4E=^y^C-^+U*p|INr zd!6ra!NH)0?$pEg!k7J;S{@~zqUU*kKYv^-E-s8lyu3J=WZ&`InO%?ckz$@lvo*)# z-x{JLlH4q|Xs3f1OIp32vVHoD8ys9Y<|Cz=%NMm>|Jh=O)4ti;$-ZmELiWv;;yg!!SL#$6chJgOVUbz9kft`0HX*=l zII#T+Sc?&45iB&%8(+dbNK57GAtAp`vP@1+j=@Se3dCDq?A z4B)K7NH?k;(>B?Khp$wkn-h8#y`EZ=@jLixjq2;;) zlkzAc5EF%l*xqcF3XAjPSY6jDe8Q!x%mnl5Q)Gv(_*QP#GIP7V#Gp@RUG=g1r3+oTngar z9n{o!6m>A(;Wv`tJE60(!PL3V@U{lX|n%E4jY#CQYA{vQKDpb@VQ90V%IABkmBWm!=)J0=RJqf z*}Dr@#S<~2r(=xy1Ny`3bkH2Zi8E2#PCCeA!4l)uf5?5GQ3jGi^jM3G#Qz;1ik?2T za=axuHKH5j|N3pQRE4VJ7ETdX7KU>Y%ArU|rN^ zP`!l@4ZKHr`i?<2mCEehUHl&!NP3_{Ge&tXoTa5 z%3>$?Y>o_PyqJ+?32hI%I0_6}oI&l&P_a2%2x3ok^(qfOv!)TOQj^o{$Mmrk>`?2zkf~RpY+E zwATmtMQ2m> z(=QK!z6*v2{zE2N%xO9yEEGJV9nue7mS%Y$5e z)oyMz6eDH!U)g>=ZZ_bGb#hc0Ick_3Eq=Oi;2|5H>uQqmq;R=Pw}q#uX`yemYTeu6 z$p?=VLsIOF=au@;D=Lon1oe$0_=~N4b}&iV0pYIB`gUr5PM&E52?VC!UiB33HYD{V zxka#VG;CUutHpGR$*HK=FSX)NE)1Dvw#D(si)(v49&h0A6=BUv4@4dyvX7kn<>CR$ z5*OE0zw8@Ku@7Z*7eJ(~jcMQIv=jl``yHJ`cX5>3c55N92{X&G{B48ELoJ zIEw9sxc8}D9%Rxyvcz-WCA5Pb{A@K$7F8TBeL~2dQbJW5-KRCl7dE%D9hMFLBcciF zx++XExGWaDcV`N0ld`?nrQ){FU`K7~_8!r%C&wY22N`m|%8W{gHTin?K*>yNdk^DbiVn zuB2?}$*$z)*|)bU;j~N!`h9yA-?c!hD>+A=mk3#+9<@%f zk@#=#W^9cP5fAg1D^yU7${N3QSJPA_MwB1#Csm8cezf@g!|BcICaxszGpQEX7|%A} zkNKG=o=u<;Ld2Y`H!a7x*zJ{s?y6Y?pX@9qekmz7h|47(L!~cvP0rY?^``K|9t4C}Zs!nvK{IP;5Mw^K z4`z_Id>SlH=BJO0&5_O5vX?1(pwai-;BY+JLFp?dwS|YAX6$Y|bw3aL)_vtqptr=< za{VjD)t~5JW0;mH-O*0VDUqeF9O($%$Rbh<95 zhxMEk+V3a=?mHx4Hd)OV(a@mt=7Erqt#QQeyY;j8cwC25R>Gt=1MhnGA8&=%R9EvK z^XMCfmn~=e>cxr(3zm%8M#-bR%GWcw@8P;4j^a`Hd!?QOzp^2}-5-P16{EvqF|P^= zCU=i%rr=8-iF{z=u#<;Hc~#!LxI#~#N>vs<(?PyAO(W>i2v?~ax0WvLl?7GU+wOUj zDsjzK>40x0@7G<1mNHyOmCCu!D8&2+kQ+3?qZ7`qR})>K7{hxok6DH(47=1g9@IUO z$x-QO+D9)hG#Id|NaZI%FM20g_TuV@pvTeSh`NTjY&h8WNeJYa8;Dk~AkJFQ@1WN) zWB68u=D!;a_!VOW3eAKCZ2K&=ni%O{7!UMwraB%_j8?>Sp52?aY;{Y{y=uR`Z=3Idbeiat+y0WZ^uWecbhg7P8qMK1lAX<8M20TN9?BPqjn)vkBW(H1=r;i>zINy} zuIV#8!bNdVa;|B&Gq4ejzP>*ymvkrZ%I>zMZ2*<`$FvUifv8tM9mXZF- z{bQRy`3`o!_pOj*NAcD;UEwQNlTWv!%X?NSIi!ac&ukq>yN6>k6s}x!vT_W1^IBTk zV@)ZvkG`hCOz&$AuVt)o&G6x0>~MLN@bTfFA7ApV-E&r{M#@y&mOi}> zI%c9)bgkHC82@{QVYjk$!b}#Vdj25ZR}!<4O4Lc`w_KawzeT8Wg83rMeW{q*GI+;ra(u8P0AboYCHP>RjYk}UW%1fgLuz9H1zBBFL)D}(2(;~&DaJ<-*nKFPT5L`-b6 z$5}O1hjT#o>aa%^AN)_V%wIDz2KDIntE+R5VXyXbXyb9r+0edXm8I8ohoI_TWO%wB ziHmQ)mt!j$XXRjSrx@mur|V|)|7_)dQdz+|re1k{`_t)L?C8LgU)rQ6k!7q%ScM3r z^tLJakVcUwmNW9P)KH5+o_(4sOA7vYU^)wC4V`g2|BsfmM@^T~or!tly<=?0R5(fA!f6ECo1Xo){X5mlp|wuTc{8#BsFlil0e~e;4)BI1ad-j@R4~Kx97$G5@1fN1^G8B;Df%wb@(!vDYW>!NMePA0H2n;>#c?OC1@cFf z%Vns}PX>mJFn`27DVs~f!f2$$pw5b^BM2SGe~oZysCc+)1AMhS(z&6Z6~i+ZfEvnU z5tYs?*~;4>*U=XAF~5bfL(f`0gkR|G0omNkni7JUK@XZ20Bk}O+Q;cUHVlB(#!k{V zJIT!v#Va}E?m}duPp`~Gy_ArbG+|IXij}a`1=QoPY83hCZ*ZigEgQ!OwvD!Au>OPj zRg28bB-pW4s(VLlO>My(Gy{Cz4i+?yRn`1k84EvMi-Qm_PjlKpKAq6Z+YxLx_E&UY zUUl-~sx9(IxkBzT20ZsF08(xNQYK9J~9V3_qi8&O_Ip)ujU95fg{%girS z$`R(-uW}Q)CR68T8~79`6<5T$cWTO#hc#C&yqYY0E5v79g+d9DOrX;7!d{|-F?t#l zq&xN(vfzf`-f=0!f-w==#PN7W;Ao4StyU^iYSIlW7H2AZ2A>kgZPidRJV zu1H2%u=S|w1?1vp6+UQQLmBn~-ZAvIb@W@69p`ONoK$19n7&9a2b)a?So z(xkhBXv{9ai369%8mM$py_z1D4sM6vVzG@8WKSdYzUAJCjVxf2zuKFj8&{H1DC{BR z>`}Bb0(b)i_mWYEBQEZ=D1$fA%h|heB>Rm)VY3olf8*+W!@A-84O8;8GViEQ`w7+aV z4sqg`wmnV|>3&Mg%>jEnHT`YfC% zPgQ5gW{r-g*az^N+-q!LB}ZMOheN%M+5XeA`!is}Y&qyEaTmY_+U|e8&ue}eD1Fb9 z|3@w>$)NocfTMq0PlVRO(?`m$i_{w!N<;XpqM1-QFUWFP15e8J-5IlzhUqf1thPAL zWLeOH{6bzRl%gZzlGsn*$Npq~sTw)1u1QPc{~01wv2@+ojWtJARm{E!{R^3he(Z1Y z@`2X7sB2+h-Vj{ZH%>m9v_MUbK=<=!wT2F+_Fy7{HOc~jJsj5de71d~mvN_f7*X+i zmnKkyL{yIu1>T;q9WYM#6VNVnY^Rv!jA6fCLGzy#rSgfkLBTmVUXNxU`{jq*cB?AL z`@9`9dz;Vjt!u}(sl_a^*kyZmEJHTa!hKYbLr9dn(oAy^2lecP0DP$iNFi{v>!}$Y zkFRA1DxY=mx3u^J(FzhsA@6A`X>a{|F7pctad5o=n~I_t7j%AhIGv%9_e|$uxUE(z z>*O(C)>?H}mX1f@3Z^>m(P@-SbG9QH4rT2}0!Evk$pU$%8{3o}ah)~d+JdQ$VG8ri zVa+UBA~h|mlqvXQz6Q>1dXD0l*l@ZmNMzt7$@|NTH%i?<;S9wj7-^ag(Sa9ViqXy7 zDyrv2p@NovD2V_zu%v$=&;Ey%m0{IG{~;(yoP(-Wz>RG-rk$0PG>%3{8#nV@sZhO7 zvMQr@S4;0>r7W56kofL<%q= zragRJ$>s)@$b&^!A+ui|Rz5-gL2$A=GF6XWJj95gDPjH5k@Ne zB5I-rk@Bv)0P9(xZ)IbZtpzmvN+-XFau)0PG;o-U-C$#Tftj4#!NgaVR5TQ)^e}v^ z;N3N*9(o^>iD)NRgSy%1QpZ1)gX)^PGsE_PNh8~Y9IKAvGbR}&#kyZ=iicsUAu%0Y zUqSO)?Kx@^JaH9J+%Or z21V^VOgfERvOWY{TFj`um}tu?73$vpIcwB1lHE8M*QN})0%(rg5_rPd*L(onqNXW}IZ!#McT!*SU5gWB$#peV1yqZ2 zQXOovn8zzs?YowWo2H)6eE1P}VBB;*MG!z}ik=FcDe}{(dsQv1&B6H6TY=+McWPP= z6Sq= z4{nvSsB7PGzDZ+R*`|m%+Cy&Q4-7c{mn-Qix`VdC$GmM>VN?=431ZDrZ0W!CSW5&} zUj@(Pds0&T$(N=zcXflJ!IEue5e!)!r0=N3oL{LzB5WUjtD*bPZnN^*3P2g|t==qE zy29Ai7WIPG032ds2t9k!1W+ihy20v|DL+TGhUGr3tY0Sz+KUC zapZ=ieU9}NfN|q4IufFc7X?e&1I!wT{OQC5?rzm4ycx;f?G43CDdR%Lmw_D|3<^py z#Cn47xJ|!Ii1@eYm_aekwVwfb1dJfB0QqJv=PH#OYf4D&jagZuH1^&rb)KXH-u?zh zA3)y-!JMHgIgi7M!dj53EKk-KJ;na;Q3@t2rp`)^6XNOm>TeYPaVkyUZ)caL?&bB~ z<;FwZYmm8d*#;Y0HHio2($HfA-gAIyom7_I9$un!tS;vNY|fIy>j_Y=T&fBKikop1 zGu=pFL=eDilO+0Cemygx~(PSbEFf_icm@s^-xs~Dr}E4sr0IM4*L{1;oFGd-E2 zN>u6;VxvjNX~gdAJDRJkb>s$|mu%HH(~t}=lc*e!B?Vi@1%M-euAa{qVf13h91@Q- z5G+bvvPCsOs=J%Uai`CEd3Os!NF$W&THcC6$q>U6ki`Cxv*{_Y&8osy z|CE+?2-zT9=$}~O_&8&zR6d^rvQ*3wHx%D75*A%NI)>4hI{GGczlMQlP{l73be!n?;mT#OWk5ILU<+F>+cF*4Nt6G55Us(Y;&1PI7DdfDTpF??hZ)252 zCi_6YYB?L4A|BH!A6X-x0@uvk zxxiMnF-Mt9O44x47EwiqUqo%pan1FjA2TJntt9rgQ!?77N-P`>FleZ{ZQi)-R;uXoTau?XJj4b5JP|D`Y9re zluo1}`ftC91jB z>cMJ_B|iKaBSWP zLwVINdZe(gfSE?C2+=$I9)G5@)vHak!fjJP_Kxa?Y_^(l7hy)B=P!*aMgY-rhYusg zD2L4!tE+o)bIJ%iCyF6&M!Eo@~>V47{alw-_$H{Vf3~F6pUK$-AtG+gAzkVE_uUj za5jn9pvaW&%u%C6EBM^CUYy9mY_iljsqp7cCS=#DBa){=RLsj;qv|4cNM2oHg=8Pf0;K^5| zsu^7XeJAsiT+`flgka_I*z?w?w&8~E{N4Jyw)*{x>^!k_-6{5ND|N?Rf>z@v<+sL5 zxxjOAK8cG+G8oHJ(#X%Nev})t9Nn~LKks@!Xa|>yy_~Scm;5b;bh^5Pq!CVEvv+3B zOVDWz1Ys{5`Q#}tF_f1KwOt^XYGb6*Z}4yHn-vqxcb%SF)FVW7QX^?)P?(ut$}$(% zt`b!j-3neAxL&OGw1H0dtKLdApkQd~0S?XL^;ZP2WNv9)V$@g2XFi(pepsMCGrPhQ zD+UL+ba{R(G%BVD!^7HIEV=L|L&af$MT-ZW@MtV+B)BT8_`!m!lR;6_NcE5f{;R2j zG(!KS*sr7k{b~d@=4hFQppIXD5Ou|CqOsmjlr%P0sX%Mh!@1*m1h-ArgTOT)M3|*| zXU#F|m(`Fiv8Su8$*nO(N>DRTE7qobwgPctG=Ejhlld9PHyn z6Nx$qD+7q=x~p2`NdXyeQEhkU$mTS9WFE8e%3N#r<&9P|LND$@3EeD~dA@ScZDlLv zX(^xWOvB=+z^3tg2->LLQdfI2qpcyy<$+y}-d#L@H1#dkf~xZK++1!(F_nx&-TNdL z)dhP()V} zzW?;8s#rt}sm)%O`()`cP11`cZ&1E1o>~dNVlI=&FM7U zyrU6JyBb+;NcSH~kG;W%2X977Uzo=Q8rz?P#Vw0LdBo672s&GIbj9SJewH3z*_aHA ziI9%+<7-?NQ}A1nHA+tV?%QP9GgGC?lJUJ^zUj7cH19Pzm8D9W>%l{uNc1uX;JZza zt?d+B<5ma&7(7iICxESHv)#<%_3ZjBQgw+4)%m!HttrS>$}Rx>oN|oW<-Y-&6a;Jy zY!_iE{MV2}(oS48TyI3!9!wtR%H?8t%RhE$JeU^ZXiLe5HyB=sGYo_^nGo-}6QYMN zq$ulI?XUTKW`8vabwLdsaj_&w@bEXfh3rQ|MDPkZWSP+ebC$Q*1Ed4go<@mfI#y8h zmf2T{;-kD$X95#+AR&~c-#7bJi^IdopoF47=UZsjDOe7n1ZbOvtbcOpx=8(+8DpoxC~jWtxJtR;dYAcS_MrBRwjtMKN!Xk;{4?lbPh@io zqfSX;gwEs@vwSu;KgLwkzJ!bF+@t}t_u|s9VCvdtfeGT4cH6i!2(`Am!eYO>UWNk} zxk^8APgz@=nn5a1CMdw)|Hbb5ZUuVy1sMG7cY zy4e=l`uYAfr$4-c?Ohtsu~Ag$TiSYtx5b#*JnUDk-GAYrWQNo=$!eTEbir~8xD>X9 zur+Q6dC+L3R@{PRPoU`kmRO|IX&F^t3h=OZcxtXu(XnGtvPw~PJQr##U~FDw`!}ex z)&#d3qxLJeMZc2I7MTvWiHRd$xF|&(XGz0p1AJ#(SWBNt!YOXwoV$9yXZQj`3^Yt~ zRsOfheKc?@0_bbG|au#y(w75fnmA zVHt8bmX?oo^7DrGFuEF7K-We)tXJc4K+^pB%iPQ{viU>t3Ta(=hnPjgdV>|*LvA*@ zDDA14ReY1jv~FF>A&XE&D`At4W+-QvZ+OFm8aWz$fZ6~!7cf9(k?wHJfxaCKXdRx< zvPd2BnOxIU$K9vmi}!5YPJ*|daQwYAsx1J8r-){K#M`h>zV^uRYDGj0)m{}*065@@ zh(D!sR)RiM#?g=)!G%f}caM?q7~Aq=tFL_=s;1J@A2&q)EMK*WK`KM?gZeOg+WeVD z21a|1=l|ZoYZwB7#Xj$5N2ym@Tg8_bK4LOD4k}D5$1kMpq&Jy{#;xYdBrRu4xb2mC zAZhc)znG=x4wYv(P}x5_@@@Pyzn6P1>Lst1@qmj$B)MS+cS} zmP;w5nXoCsm5+acYFdMvPU9bcH#A(P?yhbBQ=yYit=1%PpAW^y@oj|pElePnk^M>z zN+r(tY#C>N{P(ho$YonvtZ4EQj{93JG3@(C6EjUKgIcZ^DBT2`K-^Ey*oF6|$r8f5;-mjQ|tM0cY=zL8HK-g6v3SpCAGDkoyVU8ZopH*Ku{ z?N`XIl|sfaG)AV*69m=axNCuJa;VIVzO2=)b!3@;?Zax2@{PZjL0x5M8$E-HOlb?H z%NXC1@+{OHcsu&=#%1h67hXM{k6kYI5W-SZ+quAb%A5^@>;HU~bRn>+xjz?+xk3oKG$4q!GFEJN@7{x48w8}<1<+)Uf$7_ zn4XnJpE%!mCA6J6*Ya$f@vjaiu%9rO<>3V z{rq7)wg zqeqWkbSFPVDBl~{(3O{AjA00L$VwU-8Wx!qVih-|A1 zZx8BsK{My>$ebv-nvT87=IUsLZa?0?Z};_;f#P0+@__V!y^Xm>BG28Qr9l0eR9WeU z9w-4e&~m$l%V*A<35|##2To=sxN4Sajz7Cr@iOFYqoa50m_>;PbX_erS1={C)u#w0 z>g(${U)1^bmIA4aHxXTIga5y`YBG@H{hs&yr}yso$JZ*m_$-iQmLmTT{3_S z`<}z?dT!PBura3C!rjA!8U+FJKQH6Qa$MhSpq06vuV$}JJ@18N_#P~ng3nSL;h?r@ z7nqYslaE2iMSWVb9w5Ns;nplt-Z7Fo%-hwI^jf~P-BdR7$}I9(Hj)Z+fT zsGyr5q`mdPu`^YSu?!HfovqseHifeURuU3+Yhxn0WwT$u+%=LPv1z2Sfr$cq^Be!Z z(`z>2;aUE2$2HoLkyo;h<3vSnmrZ|cYHPFTotvAUt}_zdh-A5aJ6P;!L4kml`afCa z(h4(A$OpkR?#omuZ_f$w%z)dAaO=mrExH8M9d_8c3};{oiF>65ju-BT)Cgg1i3jD_JAV zBH?3rIB9rzIAryQ3?n2}Re!!zvMihVd{&3<-@h`h{?}*TmR=jH((g)?BqrwcJU*O< z^Zr(pBUC0iIBLEmP!rjDVg{+?29Qlox7~Ga)qn4QkI5{b{ps0@6dwd*g&ZyacSq8r z0?%3hioDDGznjq;^uHVb)lkAq{D1Z){${H$%7^AZ+4f4k#XNdu8I6N`Rzg=-S3=^J zMt*W_oFj0saPQvz?}N`~G@s=MK}HU4&~{~q+w9$-ZN#HSUh&Q*u&#f;2OReO|8eL4 zV~-;L??2X%FUOZDL72)irjW~;{D17dd05VQ`#v59gRz84D+*DREn29?q^y;+AeE7n zqNGK88Dq4^kZ4h4YnP=>i87;Lt$qKU*X_RJncwGmzQ^yM@9+2=$J6l~ z&(Y{!-mmSt&g;C+>w3izIHsTR`6^k#o|}QxUn1rU2rzK3m=5#i&6~Ja%t=W4iyuK| z32^$$`*{AXY5q4B`~Qc3hLc!So86OOb9;PqMP0M%oe+p#3CgugIRoK&70xfk{r%th zo-3C+CJI&Ic4pJMOy^{@xvk7}MqN^-0&Odu93JRW0axQ*Yl}Z;;Rn=H=xl(qXWX)VKT;!9^Ke7MlxeOJZE=6!&-H$HBo46cq|pm6F)=3q-)Pl^oZ z4Nnt8?Pml}UFf!2ndPIUwtxRyu_Rm=X7tFWUU~ZT>EbFXD$psR!iDEA2Sgr4+b-VQPLg(tjsz$qGT*0%SpIb#h&WS)kI zts2~$()1ZK`qIkLZ_vvtbdH)faZOcPg9Qlek; z&}2nWz{q}&r3acVu>SsQc7?M$=h?g>Fllup-AEm=|_8E=n*f| z=f5wFVMYfjXZ#Vl@#xE||M+useEdp>gZuVXzALhVI}RwC^5wle_h!S@7H7K;m9pC2 zJ`^5yet7g%EbA@juRJ~ExqkaW@OQ=Rk=|la^0b2y03a=sOFpP#I zYp%O}em=#u+;g-mGVS9PLrb>}oENIPTi}K0Mz-XXot=dEVJxIATBzpZ9trfbdIFG6FRy-ffVHtI#!H@AMY;tsNM z@x_|RTYpW6%FNtEyQDTn>lpSq0UGoTo|om)<2y@KQO(1{<3m%E2I3<^n5$L=IJB1M z{dsPN=^wvLUgOYGibmP)0j=(TpIzv$vCw_}sZ*zf{*G%<-ShwAYlscRkJqm9BX7P} zP*7k!lL*Si{c3a3yUpftS8GL5(DqBq%3eHF9(b;mpO9K7mC5zR>%Et~-C}lrcz8Ii z>AGvf`|}F}f10ImtFA(&`}I#u+-VT-q$5N6^XJbk?&EvUdzsj~%J*##ivo|mxs!*h z*&6mn4(i&sRodoMv{WXW(zR{0T^VQ}!i;}d7|Ynf{kqr}SFbNZGz7pEF5eVx2QMIw zW+Vw$*O;o4^&)g9ywTeKRoF(xl~sn~;y3l;^o!AN%mSONyR%+}jM`7_fQz#dvv}M>k}{#;t*^N7EHE zK=DsC>304i3TuCxDSV|o!?6b!=c(J;+Q#oo7B46$xM|7=ECvkzR2;4GgYbrx82THd z!)j{(!NtO8Xy6Ro#NkD?S7G3~LV1bAvKu^0Cl1 zP_YB24i^JFw@$LE&2SKLDBZ&<4)R!^{r5T9^@q=)EQd3zudl+`M5m?6CuV*waKZtO zjc6^oy_1|4+m=t044-rE+_|BV@R`CJavv5c3(r;=KDq1a>cwb~YSHN3=ZgHv79^1|7-I=Kk2z%VKat0!|Eos0dKS2ng*D4Pd2hjn~N;DB38|}+s z`mZb87J$G`7iA?CW0 z#$227<6Fqa;umaou@84B2lKDxb~tr{Pd+K+VPpMiuI2iM>c^C6U$?Qc;Z<#H|ClUr zE1!%MtlP7Kg4jMGM6e6-54$I;W0m+378Ij}l8dMQPjlaKo*-(C8GNp}Re8Kmh>3>+ zIq9p)?k+DQRaCBEm|+`j0#8(@Y=w6xNJycd`%rHH0_Z#(f99v?pg?$(TTh0ijByqT z$5__jEB0mBAA4j`d^o6Y>80lj1Cl3Q>0r%T%!w-Y+V@mafV(g$vbd3{+^m>YnY{{izs+ zM;Js4Lb1~wHNY!0$|9IWm;_0`HdS>b64?VQnitsVc zzuvhiLb2@8L$Yfy0ehK=Mvyn1s6IU0&$4~KG^A}qCb%9r`$*6}OmB%mZ;%{ihPyda z@>;j@OtcT1%diFfu*%9$>|1G)ovA6;e!REsEi&MHnSr88`TNZy_+)Y2hGpW;5EP@1?_g6auoe%DEe+u@;}1NJ)$e)ZhhZSjisS-xUL z%-X^iFXDQHp42^T4RuIA8y>pJe@OSq^qy5u9h3W|KZ`5(iq!ZUX4=200*p-#I;>_o_rx>5q)3g(U?~p zs~0E51pP;!7bu)yn3}kEx2vHQt`%5w7IT2_MJ#fdGGhvY?aI%6gu83bl9p!?%Q^BpsAwe z`rC)*jP$1KVM2WXzT2&nIet;~&7!BpYA~Yd1y0Q+w;vmuR=7GEJ(K|2$ujfkD+u)*+m-8cFv(M9o`g{opE65i zpIKtc3FDOGZ*|OS?(7aztl)yY-DhYP0nrw0ayl8D4wLE}+3Cp)*mxK&B!R8t_=hdg zx1a|zh3hF$@PnA3kS1^(S?N>vhRe8PG>xB z`RkhbbwOum=NJ~EMNuG<>btJ=^(Qng0?{NJBZ15Q@tPEjk(_EvX6PS_et>yRLx0^~ zmwIN9iWq1otpH5ED9GTrzClE~%wJ~6YzqK~JB*05?yjp%_CVuuSy`=s^RpLPPvtUp zp#f@${_i~bzPFZqynwOO&us7QG}N9N4I?3EoC6kO0U*!I2&Ij3r|CE&ns`uQUJEKR z8EaA6PXRfCLzkewmHX~5nx)+Tt}^9>A+B9UH2FqLMHE+04qJCR;{-6_(zR+K@g5tk zAM^8*&2~zX+i)2WXTh4oYL*9eb?5(eezuk&H|jo;0_^RCi=ayehgnR<-S)SLynu5I zZ`VE}s+1y>#XtR~o9>9)*I4god&=L@j0g=CCbj|n2rouNWL22Y6kNNc4r42&o|d+5 zov!uOt?m^E?RF1?rq~@&{pi@d)H)X{;(p5#-7&ch0Jio-Imn&HSLf60?%&^By$B)| z&N}2@22In;h`D<`w7lu=x~|^=R_a_k155)ImXU|%j3|GDR12_;9 z2rv=9!|-=9#gk@ly07&d^APxk2`Nnk0)3gc8CBB{h!|3-p)7V5)Q*)TPaLl{Ny~ED7Gpp}TBe)e{Z>QA008yn4mIVi;I_dGzqU)lv+5LwJT){R9fg1?2uFc4! zh+xvxSv5&=!a4}EaD|z;oXr2gdi`*+Ee@x4Gr0*|U+LG@)c5xua&bZ&xI-8Co9K|sM{{!T|=EYDh_TyyQR)qpt6{9iCnL%y>RW?r)yk$+e%qa z&rE8~tShu?%lt~*JbT8&fNj=cz$7{tCxIn#$b@NAOyZ_S?mzVZ;pB(L#yf#*kd&0# zB?MdPV9d=+95NRad?)`Y>Z}d}9ZSt4DxS0^KG9)pcI}Ptg3#~FkJ1Z#&2!1faK%w< z`UP0=29G2;=g%LAN77;L)l|5x`It*gv`I-!5)m+Qvu#PED69XE+4)!qomK~mAn!(c zxajKY-fC3tiP0+C88H40M}XM@LG`wXfSC2QD^!qVzq1|@3oysq_AJ9x>wxoOF3UBQ z+8@bxW_D5R8DkeY(q>Na!|~TuT!7dpiS2u-S?1`hA>6Le2UPC5D=YWUH5n`kfxu(^;jer0(ih_O;;a`TvOx$X^T0GnfJuSb zp(9=lKx7}1KjHs0)?ZbSPDNKc7zWIpZShtCy(f3DB!6<@|I-PJvFs-Oe+uX@a{BXR zOZI({j6fe%$39jUf_v&^TPgN5UCLc`*AVP|uy|mt-HLaU=W^cQl|>sA*zKw!U9=FIzhnH9Wbjn*pl(E)@ba=bqGix& zH~Mm4;V6q&z$SEnqXd2W6QE^2Aqq+mzcJz>RMh|+Lj*=nf4_6W{F}aedWN=-Jn%~c z0qLn?PK$8tFLiw8ey+}`5+l{06v%vv-@Jc+wOk*(H-p?EFYjiTZf|%o^)I&hKtjUO z8JxFiN3PxQl=bHfM8LxcC`^I=0(7~y;Aw~1@$uXh0wJzPwrt+;K-ak3 zfJZgp0ZrTB+aeGCg@dopv-Mf@9bS_Tlw~M@hCmVNx_w*dl^7eZN^E61c$_mIz=X?gW>MWSM(HNYnd)e=T&ip4l-J}pBY>5j7P)T+PcN5DJs7ZNwx?@iX_A;KtH}vHW}aBhHy2X zz-qTR;W7-@tfM$Et_N*EHO4TBTCaFo^a<9^}>mZ`#bHfN<(A*4S%Dn`pBEcOdIebCP~NtAG)bjI$^%Cu*H2 zgh$x$RSslw;1U$%Iv|4xhp{hyXkLW4>jWE8f=1CzH?Mkhj1bn8F`;cq{{-=-TR9JU z_Liw8d(cV<1kK}c4xGV#OiX6|eG-ACTypZujJ!sASUxh5VX=hc_f=W?& zOF}>F1PTJmn{cLBHNJs?0pdl7LCbi-0kS-6!+98*6m)@o(>%?kxK!6gOL7g&ze)`9 zr^u5`gCsSkZy%U7%S`4x?V%t}wm@hL{GjM;aQVmv3y{QzghEv*C&KazET;SV`I+W= z^Tycj*|UdYg#Z-fv41W+haEFDfBW_=kqWmaisFzQ2dT30l!M5pZ#d3ZGEbA^km*^V z%)4vt|%AYx34*S!-=Zg?UE6fr`tQd z$#(vhxjc?<2k*lgY)!g5QIyCgByro`WEnki+jGefa_Hk7qW3 zL-z|Yc3Hvq$qAt%DUBjKL{}eDB@*Y1^pe_dpMEW#9&S93asXN?Blf_!YwA3P+AH6r z=B2Le`X-|QC-(GA6x>&#Vrx8kJ8|*DAlq5+c?=uRq3WxfoKJ<0%M{i|U>%{b3b%|~ z3m`>^C1WQS=!Tv-D*A3;s+n@@Hy%4;FO+PMz9dI!?xNMsq zcK}C_A}4ayR#{R~G7$HY>mD*~t4xN5tKwN17yS+!U~@XkA!$bbMEGum;{gO!%W6Mz zzLe+I`Y;}LI*;OH5zk>3drVOEP*UXLwk0J-TuAl$rP*;W3VGmgV_%*?KJ~g&gAe{E z2}A+T#kOF@U2M@wQ-0W{5ySa-)pa3X0AKMOSm3z`@($8uEYl2MKvJ(P_ZaM-?dKH8 zKad(rLhr?yJO2Uan&Q&M0}qex-ZawvCPtNkJanIvJJPHq%9$uiW^q10{|24Mx5CCH zEdeoazms=-eDeLDx>uP96$2rYYG)0SNDO4UzwkyGva9N`zuSKkdC67tFcM*9u1~k$ z1eS>OY_-O%hF1o@*|z(eW!|Zh_^j`$M=*0qAYu@8F!UlsXm-}lG<;Ar(uGK@b#G|nNRr)*jLTd`^P7 zH(d7^Y~J_SvP`+w0GdHE3p5g%#wm$h7;0g?R`Dq%uABy&@9w=3;M~>N{>B|yWa1aU zZkDHI+#U5w51WOAdGs8JH#>T&(A49+$f<4I%`T4^BKrRQ`@FGStnus}4}&}aql*@P z@&@)wg6EJx+3A-bZTeKlG9Y_=Cw6r)s0;fL?)&HP3W~g=5GNcv2}k1o&wrH|aYq1{ z3o#*RDR8#Xk8?hd$2B;4+SIS^B<8{??qB{zy+$Z8;8;&f8C`3{AaMvOEgxG|X&X0%D-Ta0LV;4k{6zp?LhfYEBa9%bahcp)v3Q3)FIm_mCbS2a9 z9ys6}AJDFw2(ceHzfoMA*u#DI5B=B@i8Rrad)&cT6k<7SU&&SE>KPdE!9G@Z%2C>0 z9jPBn3Lq*pj&aAa0%)1|z=pdjBgcZ%0n?SOvwF%YaTJf-TV(k$U?EzRnB?(|u3gWD z_#`)=Y_yy;PFM}BDC=U7+mW1dVVvn=7X5C$|@8+ zUBg>HRM)4&1Ubt1`MjvUi5d4`s;T`pMV=PMTxDp#W#-{LU*f?UrmFP+h}4K>QlAzn zMUluQwu+P&SjGnr8j#*Nai3Elz~j{@jdkYbMas+gphKBn3=26NCb6g_Nu_*qh>_!d z7@^VuQo6Cz(Kw7$H$Cr<&&f^ji!N7iF3$Yo?gcbz9bb zg*6CjmssCB|0$9;J^jwxDXINAvfg5;wT_0c-Q|O$fByMrT2Hy*IVy#r9|*~dCj^QT z!rF%{!$HrH9um!V_6*i#xiaJ`4$kXpDheXzGeCRsm$&e|4mX1!t#*I5n{#G&$Kmmj8=3wMah19nsC0j9M?x8~;hmVQaGaaw<>M$e z6x*A4<`{5L{fx44?vH2c@A1g4&Ux@)bja-OG44K=e~mnF^xnIgF-++F{y`RK^mWwk zWh`B~^jJLiSRU%6kbq!cAPna9e{cwdkx?)+)T#9k`T|K;1+YZCyzJcluCNWOUUAVR zPn$805^bZzCmp^dddEQvcWH@XLEC(rU4_M-Zy`LWgm?onwg?N?QevCb;7I+-5KWeM zYx^bAnS7PX-$JDT@H`|Q$btbu9Ul1n5dsrIvJp&*dnl;`Y1mv*B}acOFZ2bE54eJg z>M`L4c(0EGT#((VYfp!fC6`j>UB+2WJa~QzSIx|0AvNxVc}iBA8r~zj^;MYJb_vug zsW_TtxbF2(gz zJ-vmuxzm5^2$mKo*3ZU`DXiBB%@coxiKqLfz8X8ds+(=wk^XD=b)M$7fO>c83?LG0Uu5J${GQZ+G>98`kpoGmtB&2xBNAMkGVnbIq&aU@#XhHc zi(8JB*lV`9&5(ioURHgpD8yVbOd!CrbY;$Ky&}xu&VZm+I=CU1UA_Xjc}m5WvI>Hw zTOV;5x2K6Xjx1!8Zw1Q25-BDDvOFmz8`_%5g%D2*@tWi=89``Q;C0}yc8G%N$trB+ zPDR^F*kA&6q5}N<9laT9;>lXAClHrLmUHbygER!ljmj7nLQD}tFzVA1F*9*<(jk+#j!4U1Kl_0;7QvW{DGJVqKo zjk>VWH7K*vbP`M8B2u=H>n2<>>q-5HOhB;yW31MKwMVwWIp_~GU5Xq&lChIBGOtIJ zZva5MXz8GXQIl(<__Dlp)9~Mau^``&lM_Qo4D#(xT}!;54M+;x=G!6p*n+VyC8=L` z>>wipxVXP0BzwMrv9p=!l{7=#kn8X=Y@=+g8E1<;ogjf_qX{8PAH(`(@{ERi(Sg2{ z|3|INgNh*tFN92n8w8l7NQFw}c4HEPiYe$&Lw>M7XKW}(%8qO{q;S&7m~JEyd`KBA zlhs`!^~9e|sgW8az{r}9bUZ5fmtzUsZ8K{ z>=;-~JEA#3h>1`l3{j|VdZ%Iipgy_H0R5p3)DSE|etiL|1!B@ECuCcuXHe!eg6y?m z$zVE2DuFV>!# z8YoJ@RUR8O?&XQM50(-mn+8y5+SFEH7GlJ&GW52n0Rp8Y{<<{i;g|$?qf0Y4ssI_q z{<=}QH#w-C8X~ z(ljL^C5B;7b_IZAs8AjmzaX2*Wu1S55k$oZUdubZrAW~AV=RiM*7>|`+IttL0UiCzh-V!!_oRr5C;M`T;F>4$p=eH0!uML{+dU2;*8oc!2xd%klc0k zKBHW^r#Y;C_$cwo;^LsCgh}ou{4t$#0AA}7OE3#*34#_>Qhs{H<6ej<^#p_9(<3`; zd#bRz7Z<#EAt8D9=P|yk^0tR-PQ6$aL%ezy=~&MybM1O)sK3pP-&auO8|eET0d{tF zR(xA%OeExzlR=z}im6hofG0421-NQ>Asr0i?rYqKnNRAMbw^*`TdRyjp}2IMqo*6B zpowceU;tVUR$Rv-)O$~!!4G{diRP(HOHI5us)z%vyzXp+bm;0v8{=SGu%(uyuWHLU z>K=-RrWfxBNJ4=Y*_^YRxzu*(15(V*K^)ScR6n3;S%Y9kidofD6oDmc)qT@(yy{WRj@HYhBOrnt<>yAJ`T_#0QCmJ_rD_HGA4A!)qYespY*yMa477syrmZ@Gj-!Ap91B$mk5ucPckw5{O8oM38o7*yvFQRifX*B!Jk-Wnsi+0j@j!ts%0%!|!FYB#eBe7wg} zG~eEU?#Z^+p`xsHT?zU(byW0mOFMhXwGfNPE;fs(fQtN}6x?i8Knx72UOp@tSGJUx zJ=&ARfY5#~lQOlWib^Wl7J@py&NBj>?ZXatp=R1Hx)2N({3}G|F-$CHxpUUY7kSpm zw3DDYbp6AXh=y|8a&n6nRvga3`Ob(BBQ)xVv=y z5jQVNX(A2I2L1Mv<#DhK%`&?x(vln#vJkvF#2z~jZB#xAT|$LYVF(_ZK0gzM;G`Ie zTl)~MIeS8pCdzsg>1aTdrE}V{*XLAUSYP4ojij(;U+L*E?u5wCAv6I3FZsyx-@U!}r5xWMVQ8|_ zFeSdAs(Cfi9#YJuJFloAP5?W9i_2V&mvWGMC1yeKaZ*S%J*!<8AGLy&%)t%Q)7rUIe7Aq$*kvE9&540 zy)I*DCji~!wc*jA*8;asw0SKF=>`*IQX52YcRgujP%oxLJQtnHK zxn>x5R%bX^1=p^2H0D~6dny!x++f#$bb5{{AyUXLts(sz5hWt0o-HN|!N53gB0T^- zgU84qRk>!u3$j3O85njVQg%WiVdSw}EvGxlj@F<;BpCu1U>i)c)q-ES2HErIg%;fhg;mTsgYX}X{D!U=a#4bG1*Vm^a3rZz8K|B^)4$5ZN76HL#Rzxz#|=G1Y)!)=>v%EP;hlZhK1-3_}85=H9tFLrZ3qr7L{Gq;c1;d z1{+Y`gs4?-ZwfZZ^-{P;s(YxO)*ED=CVitDl_-&z0Lj^89MJ>B)#2{Xg zY1g4}UAwghLSjA&dIAi=(?ouxf|S_!92Ks%NOc*f3LW=z{d*PG+cOoyTn;4a+BhfA z^Doryf6xUCk<=`1LtkT$;?K;odvdsQ)Ke*4cvF4>dBhctJj%0gj@pSL%3I~t5Y zQL1h#esa2Vy#Y7NxL)$rvZqwM+23yCDLi{~w>Byp?Sm@da@Hw-z8I8CmX}B@3BB>R z7zoyHF~jHD=J6TiUReB71LmR5%IS+(n+1@!Y|3mg5sFo!Z{51ZE5&7NL*sy%Vf0r9 z$~SnEjtT@hFf(1oL`rF@iQtpgU$1(OJ9UCJTg;Hiv_)=#0sOkR{U8W(Hfe-&zZJ+1 z8P8kmKY7+tixaZ1!CR~p5^)8|bJjePxO_7P#Yb4~KCjjk^ zJj#`jaV~W-0U<{yldX7wh&(bh5>+_ED+9^*LKaqE&Y@p2#MhP{7 z#50_kD&`G-wZbw2$VQ4yzv3Cem!jqdhk;!~&=;z3|38#kvE@TV5#ISz7|9eCbTsJE z1JVHQfSnDKY|0AQ0sO{KE0$Hxt!X7;9mzr++-PZ_%L2+H5g+PoE()n&kPfl!V-HU^ z73=9Yjot73b@dB>|C`Id7hmMWFQxo_lXk-Vm6mb8 z_|7YA(9N4*JCS$(f$(^yooufnzh+x+7SM&o#TJ3H=II^}2DtrIo$~6tD6K%&n(U+dz3_G_*?p_zIGA zcUJ_dj5;MZxxyEem~=jRqxp{)*;f91{&o)4m-;zOXP~r#U5=6prL<9e75DqtqcRQJ zya5zA(!(fQv;B1Ad_JOjy${Z$9Dr=k0`(M|zT`Ttng*^YKETCVQjnP-6CCtLQ)yN0 zb<{4Br2}1>aaF~0^eDp$^kOzYSHHGVK}?&_H5~Yp)|?L4v(MxPq~J&rba=6ZL5QiK_MLL1Lm)MeViOd}t&n z9ALTtBt-aK5>XyQ=9~iTk?n*154<4;%H%RQYV^PS_UOCTGO4 zW%Ld zo(-#%nkVk~tDnVuV`73bw68+YYx;{P5m~&$(;a1tOTTI*8|iE#&5YBC)Xp@0uCc!F zi~$rQ!`59v(eHh3j??QE9d_u8Bu9FnxxIL3DR(x)4Dc1^;kN37tss+@{p(jSfUxF+ zoAgvu8wM+QYC4x@*1kgz08~cHAS7owpUUXKbLJx5c1eaSfI1Y7kt3moC1kytC*yyO01+rIS7a|O^ZTpG_(MCD$70g^?j?SlO@?#q_uf8E=2zextH{$`th zTw@h(wd!StEN)FnDO-W@vs6j zFA~%=Cj}|C+|w~h@*Ep&PKw~R2;#Z?=#=0)`hvmMTF2^y(h6YkTJ;Jp2w6VuBN7IH zDR*4=u`WJC28JYXe!dWlKS*yzyh>^g`YH)d?$Y%bO9 z%R?pvZtks=80kTReqT!~NTHq0NlFeay8rkPBJc)VNzO&^+0qK!#VU!X$)n>wcj=9T zQ{)3NP4{$e?@&{tdK;>t&@pU9=|m7{8WgbLWKmH6FH3<3fE&zRaX0*TYa|ceu%LW> zoLiAj1To-nb1#YvqOk>*W^>iL_fJUUP2S$r0jYT}+|nq7(F|e;yN?OxkxgaC?v$&} zNTQ{M`b@ypnlomv;er!h(Rdyfc;*$+os^tJv7|By+%%+ur9Ova3mRkhRYF9+LB5zO z1OrGX7viu!>1`-Z6PK2b%k`X6aOe3YNe!f>OWM)Pfy!{^#dGO2-}r;% zdg%#B!kO9M;5XUW0F5{9!5Ne$8Y#iE9>y+WC%EBR&mjNaa*ry#qcQfS`!|?{kMjkF zd(+{IWn&GJ#7I5Nj#^`MZtpfu1x6w^l$5&&i~Z>LGw%b!!^7E4HsDcs>$nDKhhF+@ zP7wgbp`@B)q9KHAuN$dcGa;L?MQoXIf(v@JTL_*kX$M!puINGTxWQy>&|nx00?DD& ze(sq2u-f{`R;m#~*5O5(1NQ)_9*fh)NhR0=V&yuRDMXc|aw7aksc*_=1$lcz!>BPb z*b|M(ONL}d9b(=~E4kpM@;5jT#-PxK;|uVbof%xe?X|l=GlM%QuM-jDv!wdx*X;7Y zv$+2TSbWXfPWvW4z53se=HdD8gkY~N`uTs)4p}MLJaKt8%F@|g2q1F`K%+Z#gew%t zK^+xDtVPR2gYp;^7)7vVfJe=^dp06{I~M8S0bm z;rgGb_<|jP<+uEzK2g*JB_gGN=C=$^nJJV@icD0vEDv@e$^|@@h8w=uaQ!GK<3MzE zQb(G7XWD~R>rg;OR9MF5VApgS2&}6QQ=IqNGKuz$O9#ThOTtPp(yhQ5&6|L z758*wbVyu}80tp19BB+C0_DYtO#@rAf)xsF{skI(JkW(6~CoS%w+|C5|?hhQck(^b4aSo!+eh31^NQ@Cb zrtvrR{Q)VRs%BL^SMwdmI3BVhL+RV7f?gZyPNtwG11bDC`!@tq5Z5&zrQ}T*qIM(l zACxnTDNO+!$|GvE-mPmlWdXx}fI<+@BR2}YNG=HcE5)Am?tP@(*m;{9=PZx=PQKtG zTr<5jviLMSc%CDq0?*d~iu+)lj&|3Ax+Fd8+=K)qtcX-%`+BIGmv^TD!pQd`p0!s3 zl|vPka}&lloFX>d2jE>3r~{O0>yURQg+Z8T1y-gKLw?ha-Ay6v&PORAF}7lPQZ3rx z_^uUuz@6>5xr8$t%QwwMQZ<&HaGUU z@B@84k~{?#3(?EuoLJac6@sH=HA|^!07Wk>WD$iT1u{35>-tiZ@eWc^fgkes&qlp- z>T6~nZ8hU8my8jNG7lPr9r4)>&paE{u?*r$)eCoXo-swVZmFy!IdXqT1kyJl;y5Q3 zdFj$TNT)K~a zLS-lG20?gS(w5`Anmww+tcEXxzj#^)&eO7gIjA5xJefaalSBW(L|At zxxReTYpV?BzPkrZq^^WkX)raE{0R(}Hn=lH;O2CVt%gsM97^LBthdlkZlt&fC-nBO zQk>{DYJEGTy4ypvkI)C={cEf6W|_|-1CzcVXsQXNbbLQPa_u0AH!PsE-NMJWGI+;U zso)*s077axmgpvU3c+@i)Cf2S4x4^1N`G8~f@ap!Nwbf1i$Y6J4P%z*X#I>FEk$4@ zW}KmD|A-9ZJZx?wb=RE}MWC*eI$4(!r#TT3&LMdUBz^ zN`y5rV;?_zi*i1#U@AQdR!OiO6O2azQG4W3s-qXxTKP~gB$z7R4D3&et35CaI){Ij}q&c|!9?O)szQr4>2`gPCk8EQr*Ao z=^jmLej{a&7;ZfVK6UGK+v9D6pir;ua}QgKYU58xk&)c3)&OB0HSNL6GfFEsp`h1i zRj=sqdk51`5#bSSgP`r4mJmQ zgyS#hYy+E{KO%NyOOQJ{j7|@ayR`~jA+h4rk|QGt`E?dHNB)GVBHFQ5oH$w4S>oxQ zz#kT@UKG6YC;r1 z{UvnExv9s`GSb02ZvQUx%b%{){sCP)njJyquyaT#ay{NXn3O#zMJAJ77}H5U7Szgd z#{`n{QhyxlNR+AAzFfnYFW*Q>e+uFS-Ki(kL63otVMa+S{}V46{&Y{F2<#pC^t;tK z_0)fE2?)nhAtjwF^khNMm6-dtV)qYY2&;la zl|gn;n}&6RWGsMUioOq@Uk)Xwm}0#hXdZ=HEDyxj z2HX|bSx3Di@4=qMly+mKj=x4P)N9f#Z_r}of}(#sJ7t#h9o81a@XEUJWIroIQ-IIm1j=NOBq_!nQGlGlTynBihL zR(n^pxTeOA-*H>EMv2>ft1zKl{c5 zir_$?^HWi5o}T~%I+Vj0%uW;PH!Y7|gsB6AoM(uNx1AAus*xBbh?3X28~zU7nOz|Z zSS6e_3INS+7Kd;zxC5bj-{Bn4zsp*sSEh0+f(}`ony8^*N0pU>*TT>*;mD=;-rn8_ zKk`k$ILvHZzRE0XoM!L?E)66B4w5pLtnnqAiL?SVTXC`m70A&bc9NY~4fgdAkKY8# zUajlC_5F9;^h3%r$&;5Q5LP3W2bB~y6S@)vmrJQ--MfQJZ^Vx;su|k5DSQT}a`X`> zeZx=5;76WYsGyp7sm`0h0vC7A1ZeA1EC@)-3Y0&p~sUzLvUmuq+yXd_LIJR)fp z#dg;a%p_YLF!^RF*HQ>aQib*&t+?g!!=`AbWfUJ;ZcyIJ#jy`|A<*iFCVL&GssbT1 z0*V3)S!DnA$t5IxGk8jiYReD&^#itq^k)%-$g(F38aNH8n#P54Z;8?i0`D zXwEH05J>8>=&Yp^e1=W2@%GSnUuhLan(zmq_4oGKp*OK~EM{B0hdXx}j*txB+PRz_ zU0hPKYb>^=rbfJoh3&*AZ*F_JXV4cx(7y)m_a1c3QkYzYny9r^6nTFZL2M#JPuJSR zXMjmZw7%4cOU3Y^Yoo$Nm6sP(+O!u8{KR(~{iApGptVJgAKK;K*k($!2h^GN>^y7m z3kgTgvn^jpYzh{|?2*9AecB%sAV%8vES{1H9--s ztwMDcCYHFfGj{wM|5zWARtmO5Xs`iV$NisJQ01<{KA70FGVp;hH|uNgf8;$yzc@lmU;BE7l)*q{>NRG(R> zAfjN?SHpI}zkc(5dK9#xWR)L9JiAgQQG9}2YWYzHgaGDiuvP7!AcseqkrRpI=a5bJ zLHEHxHFR+CX|#r6U{7sSfPPjMci+_bXHytzS&^9awufw^6S`)-8AEr|xLxCRknbE8 z$By2LwzOBRwP5L}eJq9FQ>Z>`0|kVz8O9k&$U0M-C_c*scF_x}jc<*)LKjq^JAM%N zd{|<{vvn^{6E!fTCb2{q^YT(5%_CfrL#@q8_(N^{slbMMu!HW|*qjXJnyv%6rx#bg z!Ek&PwqjOZgC>|mJs_y#L$cezXOzjo5tzP?`Y}voFFMvb;Teb)u67%Lj`Fl~I}{vH z`I(EHp9liH+P24NfaZ@yT#a$2C1}4b`eu2q$b+1wR{bQ*Sz}gkncZgRf1>QstQgs} zpZyv;G1Kdhl`N^PLw5Mv894Gqxum+E$Z-Ed&#BZC4=`=~o|CPO-_5F|Mh8b8p||Xn zagOtN3=H&EScBhXqP4%1KO_O$5mBr>_$m6*3N9hBO8!R;|MkO{wmG z2ra5pYeH&CJLKBrQs%|qYoIVcf7LOHoWa>@CNA=tUf?m~zC)$WgcLDXnWyDH=S;3t zY)duN!jZm-(x~krdzQls^O)_yIWT?dHDP;5@^0et($kyft2!V3@^T)-pv?k@TJP6S zJTBU6C|)zJ)mUWve?2bR2b0NDeT5P%BslZmz_YaIe;VTPT^#4nnZ~CnFaOUXk^ehL zma;}(Cm3k|U|Mi_MKTtW^Z;npJu4X|Uju7-NoMAuu#k`t0TYh_GjzIJM^|wXJ4XkM z?n8l&dV9!JZA;Re5OYZI0ahX!#CLI;Ewd8Y197D%_R3wWVfOmb;=BQgXK#4Od>oAh zNagsUY%`?5g=ahU2q40YI?<5=n~E4<-AfY;Hy(Io!TY4`!OocYC#amDYzdKz(EQAY z;Le9`aDbiJX|~zxL>YQhnSvf6B@5WZ0LW9+;m(Pq*&Z@Q`v&#&Q-)c+ieejT?TP-s z^XN(!67V&bEdLSL=fzON66%k@rmNPP6-=p50?42aaFi=oZz_yP^*F<0rVHgCnUggD z3Z#q!!_(bIjX;qTS#{BYE>Ixqjha{DU_APx58gtEw6q5S*pdN?LY{^4Y##)QXrP-@ zD2qhxHT!|vHo6#LW{3i`t#fY5!%K|YR##(a>`HJfjZL%_V4xC_ylE}5aW_%In0H{t zqGPDC@`hABhqSFUO|)XTlw+f_JF@K2Ai!88*d>7*pH(|bQ=CwkPjzKJ5OT^ho$b}s zpjlz}{-iEobe+uMgvr|1iLj&ejej;$2f2StU6`3?M=CmYe`#oWd65u&(Qk~^vTv`F z^MFu^0U?OH{CCUy&|Bjnp5!xs5Ebrpx4pIV%h!b6C#s%OX~Uq8h23&6XRPY_(GAoT z0X%m;f5o=97lI4Mk`{Q)U5l(6yMF?x=&H8Iq|2m+8ORlWc)scWt80)yY=YsUb?Ekl z)}rcNUXY3ZLX~W_EjFlqWA{%(W7zDsR%mIx5ajrwZv0Z&I&sO*VAMz+O1B*xhBRlZ zP&KR-o8^VH&+t(%b}*6o-XJAydaJPEasxKjEr775nIH4QPhU%IbdDESQX6u*5`&~R zpDS@8K|U4YLeaUZvc9!CD+9={dL+orIu6Y|qKc%oNM@sgQVj0b# zA57-c(U(6nX*u6KTwe!JE{|jNdvOjOYgk-1Gl>>U-6}%Z9?ai_t-UD*0Pg>Nx!|HT zcu!4>O=&IgJKe~3q+1V=8N#3W7#+2xp{qtp##WQ4gG@CGeYf%fGIR8-CNG~xs!F=D zLb%%;GD&I_iPJ;suzpmaG@vpr5M#ZaTyg`9tQgN8r^cB7NeA>X2Z%H%pHl0 z>1a`^TJ(+~Izq6|4(gt$4R6L|l@+RQFGE4cKEaNai|I5=>&JUj+bkgJVA~z+t~@ja z)F0Ooa=0x;RI?0$&xC zqyOk+x-$VbgHm6}Y;IgTh|)F@Xw`$roFPxQwwFl)acI^TkQ9{-8C!TN`46JD%NCrz zc{i+~Bh{N?&;3ZZtkCJ`?xWy;UGncGoAO268nsiW$XYq!n`?b_Lhem@CHF)1<9z#R)BqQCOZN8wn8a3)hp@3k$ z39Mrc1h!O%oCk#M601-;*C3*b#{LP z9De(H>Ig?EM7mQ-x-e+^g?nUO*u8%t2$(cWei03_&UqUncaT1VF?cAwD4Lh)&c zIUm6ZS3Y%W!`Npts3yZt{y9z1hQ9-@i&{LM3~;nIc<& z75+ZPEn*21(-VX7M=f)F-U* zyQ5KCsPFAf$e7M$dm!5*TQZEpTfZoiJu}oZ2tn%hzTMcngpa#d*rRB`RK)J(8tM`| z)3`Ir?c@x;sN50sUM%c?bOX5)Mx$v~>;{MyPm&W-@ zb||4UG-&}UAzJu-HQFci)1@p_E=hIM{_y73jxVvLZz8k#CA@|~r+yzYrJ*o0#`(>s zriz?YrHdrNHbRGYqK@@jE$YOA&YZRPTd zUsDy@Fnm>gTjg+)G{IZaf&ecw)ssB2M1-=NpKe2|Y&S#<$>=N0AFJ>6nIc}wf^;_v zQ__U~*4!!3!_U4>17XW;75@+<&#Ct_R?jrL!V^Ba7}2kP#d<1%LesH7uMErc_!M}~ z2quXnT(+TSNw(#J707+)uBPjZ-JmMtL(4@7~7^30kUR3DKCw=A(Sa;d-9ETlLIE4Q8%gfzR zd>>gt&%~ZA`h|cLb=LCF#wpn#8a3$qGf9LO&de=gv-TZo1E@Te&)IT4(_AS!UVPy$?$-Q)CAA` ztd??Pan);jYQtT)iq7B=JOlo9qit|Idq#oK^Wwy0^bc1(~?OcMu%0ktcXLsV8HuK$C!BXY3r zEGT6)a*I-ri9+an@fU}ISJ0}^Z9Mi*AW0#lXzf^oewSBSo16fyw<`8bI%Ifh$8EaT z=J}@~6s%^xt=4*s=6+1)zk!&k+vRN?iQ7B9CN1C7s^Sym-T%tQWA8m%h?0D0Ussb- ziCTfFSxu@eUxhpK;K0C$aoDVT$)wiLSD8ykjG8C;RD7?^|8Y$B{UAfrrr?UQtTK9o zMMEOi+)I7h0e#L1&Csr+h6d3QJ8rL4c1~Mkm{Gssc;#vmrLuK7c-HhS`qQ;jXmHG1 zH%L6Iz3_qbw$YIk$g4@iy(QpP&PLqu6ua*+kM0p%Ho(4fskRQAIvOYVoKTp`oD(^# zB5}j;+=oE#)blbUA~;y@Q;x2ViE61n+O-wItjQI4!hnO;g7Qa zP%i-uL;Bk{8$E2FPMCV6Cc^>Ek66e#U$$_+tc+`^bKM}>73@UnHq#PKV8GxMBx-#}fgV5&_7pf5U~ zBvr~y&{fNOYlGU3%s+f~lDf~QG_PC&hw3WW5bMuZO%mUvSkTW&_IP}HyCvPEdt}v;wA-|r}@siC(yio7~6RW)^24CUv%#3OhufyqGXyKukl_U zsXHW-1fXE|?WCJ_Sb(2=tyh*}`f3hkR-8=Td@ktLq~q$Nrk!Xxa9%us;y;Q*C0=a? zcqH(){qofNucSMaBgR}95fiI_q4MWw^3{YaXNc^r8A$<7Mgvej2-L;JVV(rwlZ{aJ z^=Mlc&t-Nv9S%H7L5qDoHO(NrbcX5sq<(a5BPzjbKZNsq%*z1~pyJ<>cKAgJsG|3Y z+l7>R7{10IUx8}AZmX2jBZqV1(%U8|aPZ`hB#u9K-3~W$G*?W7h>&Grch{@YJZIGy z`}~2>^6!O8&)|asFz*w89*t3j36*ORn!kPbrh04b-7XWGpea%r8*!Z$;e_JTP(-OA z;+igEP}7tL-fRyzBiswsv#ja6F`!Du%3Lght%nFU5N7gKSOMMW&Duy<45D(q}= z@cyOoyXCV1`oidH=8|@*2m+I(f4HmKX2OO?F%T!_0%9?5oEP(@CjIQ1R+K<&lpi=@ z`nfXzM1&s|E5^tSofwd$T^%rzr=vU2d7@R8-|P3}nQT^`LZaAn+pqOQkUE@l!~G7?zq`*w(`JEr6tt9l(>kbYjz^`nkB7`f?Oh zYDXU-+ByINf6VN|s~^37zvvkhxO`AK!ZWB4>;!0bn_`tEJOvK`Z(e& z&IBS*v^YDm8mTOpxdjM-tTv$?X!9tfwz)7>VpMJjcWrwKtKfrDrybg((YLx5mYFPo zyOchu$&>OjzxU0}jyD5+pLV~3s{rCOBPp4GHpVPZi?k)6FLS}6pXhSi!S4bg5h7zv z4ULFnA^wHJS~!h4WPGV+o#aIDuB%RJk_ilh)GvRUEyB#xbQj;!Y?!=74Rr4 zCH8LPOE^Oy(F1TkHqpDu%efSV!}3vk5*8No#Hq}YE8oMqeD`r|eZ!!JvOqZkvgzUT zyjDHr?u-l&`?!(DC_aOyAe1iB1k4Qd&qhQ;%~%e6QrILrrSdgOJ~md3k%kMu5$F4* zAd19=1cZqiN9)ttWmw^f)ekUSHed$Eg_`N^p9Iu@KeKoF&u$GFi!Un`$YAe_iF9p;aAy#@G78 zvy0S9$()^NqJH1vS#yl%7WsAMY%?vIEENl8m;neXKqYT<6~d6fssr<>JN#g2U;s<; zyZftz5gbxv+1v}7Nhm_;v`p~hwp1R&M!Ncea(L05Xqr;4NBbyVWD1G&;x#e`ZtKe3J79L+$nsdl5ZqS_S{PM9m?zn zMz4N1^95Z{d2E)~=R3fdEa=kAGM{cj6f`mDs!WH6@OuRrZDn^v$W#S?i#V7-!2QJ1 z@`oULuc6r!osD&a<+JNQhIrZx!|)wOdz!5W-gp>}rk|UxefV>Im?J6(w+c~k?=KLG z43QW(x8)bBc>0|qJpiRk+G!&v)z@r(KB2%bNO^EMJM#dX#8yaBr?}&DJf!`pj}KH` zZ`vC=QXy*Z^AS80_8Lqfm8ubR+uj#|+blKZ-~Sq5Y*JIP7?s1QYrgwbVM4)8B#-ad zM9k%-t^iJG4!=RE1AFPEg)DB)p*~vv*^rDYVsBn4#xTOynQMYGBu%pYEBK`pJ#6z= z7EPX`>DfeELXS@sGg^Iwy~y-`>S;^;7|Ao0h8yCDbSQ=k_u=mdj%A~K$3m}FltY0{ zx9w~Gr9)$uwy_&J7u!O!Xr9Sa_y4f>m0?+~-L`fYHX$yT;KBf;L$E;zFlr6r}i(*#8UX=wyeT0u(kjQOs;_u2dWK0o)mzUx~dyzdkDJ?}Bc7;{cgS&Yu! zILfpH4P_7TW?&6_q8ZnP1)|8i(>|C!$ZajdxXkT&8i-jq_qN;@Tzv5KUNYt)EqPo_ zXDGD`b}OJdX_Qv-PcWosWE@1L;*^8@0z>@H$~!+LiWg?6{du$Lk5XuPBJOJt;61Vt zqDNz!@ScUqtxsHAm>0^)Bd7{A1YaJKrBdC`9r#!OiUD}~?^Q2+Sw8f$3jEjZN{2~7 z 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 u}o`v`>U9Gk+<0dtL~6M%&M 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 None: raise ValueError("trainer.total_training_steps must be a positive integer or null.") from exc if total_steps <= 0: raise ValueError("trainer.total_training_steps must be a positive integer or null.") - - reward_manager_name = _select(config, "reward.reward_manager.name") - policy_loss_mode = _select(config, "actor_rollout_ref.actor.policy_loss.loss_mode") - if reward_manager_name == "dapo" and policy_loss_mode == "gspo": - warnings.warn( - "reward.reward_manager.name='dapo' only selects the DAPO reward manager; " - "actor_rollout_ref.actor.policy_loss.loss_mode='gspo' still runs GSPO, not DAPO. " - "Use loss_mode='vanilla' with the DAPO clip-higher and token-mean settings for DAPO training.", - UserWarning, - stacklevel=2, - ) From 7822a5028fdae8165c2b538072450d2023d92292 Mon Sep 17 00:00:00 2001 From: onepunchmonk Date: Mon, 31 Aug 2026 20:41:59 +0530 Subject: [PATCH 08/11] [cfg, recipe, tests] feat: wire DAPO overlong reward buffer on V1 omni loop (#446 Phase 2) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Phase 1 (#456) left the overlong reward buffer disabled everywhere; verl's registered DAPORewardManager already reads reward.reward_kwargs.overlong_buffer_cfg and reward.reward_kwargs.max_resp_len off the config, but verl_omni's reward.yaml never declared reward_kwargs, so any override there was silently dropped for the autogenerated trainer configs. - Add reward.reward_kwargs (overlong_buffer_cfg + max_resp_len) to reward.yaml and regenerate the four _generated_*.yaml trainer configs. - Enable overlong shaping in the DAPO tiny-random smoke test (reward.reward_manager.name=dapo path only; the naive-manager AVQA example is unaffected and documented as such). - Add a CPU test that drives DAPORewardManager directly and asserts the overlong penalty changes the reward on a truncated dummy response — the Phase 2 exit criterion from #446. - Split the shared launcher-contract test helper so the "no overlong" check only applies to the naive-manager example, and add overlong-specific assertions for the dapo-manager smoke test. This does not touch dynamic sampling (Phase 3) or the reward-loop metrics plumbing beyond what DAPORewardManager already logs in reward_extra_info. Draft: opened for early feedback while GPU LoRA validation on real Qwen3-Omni-30B-A3B-Instruct + gsm8k is still pending (see PR description). Co-authored-by: Claude Code --- examples/dapo_trainer/README.md | 9 ++ ...n_dapo_qwen3_omni_thinker_lora_v1_smoke.sh | 118 ++++++++++++++++++ .../utils/test_dapo_overlong_reward_on_cpu.py | 85 +++++++++++++ .../test_qwen3_omni_dapo_launcher_on_cpu.py | 27 +++- .../config/_generated_diffusion_trainer.yaml | 7 ++ .../_generated_diffusion_veomni_trainer.yaml | 7 ++ .../_generated_omni_megatron_trainer.yaml | 7 ++ .../config/_generated_omni_trainer.yaml | 7 ++ verl_omni/trainer/config/reward/reward.yaml | 12 ++ 9 files changed, 278 insertions(+), 1 deletion(-) create mode 100755 tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh create mode 100644 tests/utils/test_dapo_overlong_reward_on_cpu.py diff --git a/examples/dapo_trainer/README.md b/examples/dapo_trainer/README.md index fc07b80f3..e0dd97c75 100644 --- a/examples/dapo_trainer/README.md +++ b/examples/dapo_trainer/README.md @@ -19,6 +19,15 @@ policy loss with asymmetric clipping, GRPO advantages, and no KL penalty. The registered naive reward manager calls the AVQA `choice_reward`; the reward manager name alone does not select the optimization algorithm. +**Phase 2 (#446): overlong reward buffer.** Overlong shaping is wired through +`reward.reward_kwargs` and only applies with `reward.reward_manager.name=dapo` +(`source=register`) — it is a no-op under the `naive` manager this example +uses. See `tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh` for +a working `name=dapo` recipe with overlong shaping enabled, and +`tests/utils/test_dapo_overlong_reward_on_cpu.py` for the reward-shape +contract: `reward.reward_kwargs.overlong_buffer_cfg.{enable,len,penalty_factor,log}` +and `reward.reward_kwargs.max_resp_len`. + ## Run Download and extract the AVQA-R1-6K data, then convert it from the repository diff --git a/tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh b/tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh new file mode 100755 index 000000000..cdab2bd31 --- /dev/null +++ b/tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh @@ -0,0 +1,118 @@ +#!/usr/bin/env bash +# Qwen3-Omni Thinker DAPO + LoRA V1 smoke without dynamic sampling. + +set -xeuo pipefail + +if [[ "${SKIP_COMPAT_DEPS_INSTALL:-0}" != "1" ]]; then + uv pip install --system --break-system-packages transformers==5.12.1 accelerate==1.14.0 peft==0.19.1 +fi + +export NCCL_IB_DISABLE=1 +export CPATH=/usr/include${CPATH:+:$CPATH} +export RAY_ACCEL_ENV_VAR_OVERRIDE_ON_ZERO=0 +export VERL_USE_EXTERNAL_MODULES=verl_omni + +NUM_GPUS=${NUM_GPUS:-2} +MODEL_PATH=${MODEL_PATH:-} +DATA_DIR=${DATA_DIR:-${HOME}/data/gsm8k} +TOTAL_TRAIN_STEPS=${TOTAL_TRAIN_STEPS:-2} + +REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" +EXCLUDE_MODULES=".*talker.*|.*code2wav.*|.*code_predictor.*|.*visual.*|.*audio_tower.*" + +MODEL_PATH="${MODEL_PATH:-${HOME}/models/tiny-random/Qwen3-Omni}" +python3 "${REPO_ROOT}/tests/special_e2e/build_qwen3_omni_tiny_random.py" \ + --output-dir "${MODEL_PATH}" --force + +if [ ! -f "${DATA_DIR}/train.parquet" ]; then + python3 "${REPO_ROOT}/tests/special_e2e/create_dummy_math_data.py" \ + --local_save_dir "${DATA_DIR}" +fi + +python3 -m verl_omni.trainer.main_omni \ + data.train_files="${DATA_DIR}/train.parquet" \ + data.val_files="${DATA_DIR}/test.parquet" \ + data.train_batch_size=4 \ + data.max_prompt_length=256 \ + data.max_response_length=512 \ + data.val_max_samples=4 \ + data.truncation='error' \ + data.filter_overlong_prompts=true \ + actor_rollout_ref.model.path="${MODEL_PATH}" \ + +actor_rollout_ref.model.override_config.attn_implementation=sdpa \ + actor_rollout_ref.model.lora_rank=8 \ + actor_rollout_ref.model.lora_alpha=16 \ + actor_rollout_ref.model.lora_dtype=float32 \ + actor_rollout_ref.model.lora.merge=true \ + actor_rollout_ref.model.enable_gradient_checkpointing=true \ + actor_rollout_ref.model.use_remove_padding=true \ + actor_rollout_ref.model.exclude_modules="${EXCLUDE_MODULES}" \ + actor_rollout_ref.model.target_modules="['q_proj','k_proj','v_proj','o_proj']" \ + actor_rollout_ref.actor.freeze_vision_tower=true \ + actor_rollout_ref.actor.strategy=fsdp2 \ + actor_rollout_ref.actor.optim.lr=3e-6 \ + actor_rollout_ref.actor.optim.weight_decay=0.01 \ + actor_rollout_ref.actor.optim.clip_grad=1.0 \ + actor_rollout_ref.actor.ppo_mini_batch_size=4 \ + actor_rollout_ref.actor.ppo_micro_batch_size_per_gpu=1 \ + actor_rollout_ref.actor.use_dynamic_bsz=true \ + actor_rollout_ref.actor.ppo_max_token_len_per_gpu=20480 \ + actor_rollout_ref.actor.use_kl_loss=false \ + actor_rollout_ref.actor.entropy_coeff=0 \ + actor_rollout_ref.actor.policy_loss.loss_mode=vanilla \ + actor_rollout_ref.actor.clip_ratio_low=0.2 \ + actor_rollout_ref.actor.clip_ratio_high=0.28 \ + actor_rollout_ref.actor.clip_ratio_c=10.0 \ + actor_rollout_ref.actor.loss_agg_mode=token-mean \ + actor_rollout_ref.actor.fsdp_config.model_dtype=bfloat16 \ + actor_rollout_ref.actor.fsdp_config.param_offload=true \ + actor_rollout_ref.actor.fsdp_config.optimizer_offload=true \ + actor_rollout_ref.rollout.name=vllm_omni \ + actor_rollout_ref.rollout.n=2 \ + actor_rollout_ref.rollout.temperature=0.8 \ + actor_rollout_ref.rollout.tensor_model_parallel_size="${NUM_GPUS}" \ + actor_rollout_ref.rollout.gpu_memory_utilization=0.4 \ + actor_rollout_ref.rollout.max_num_seqs=16 \ + actor_rollout_ref.rollout.load_format=safetensors \ + actor_rollout_ref.rollout.log_prob_use_dynamic_bsz=true \ + actor_rollout_ref.rollout.log_prob_max_token_len_per_gpu=20480 \ + actor_rollout_ref.rollout.log_prob_micro_batch_size_per_gpu=2 \ + actor_rollout_ref.rollout.enable_prefix_caching=false \ + +actor_rollout_ref.rollout.engine_kwargs.vllm_omni.output_mode="ar" \ + +actor_rollout_ref.rollout.engine_kwargs.vllm_omni.pipeline_name="qwen3_omni_moe" \ + actor_rollout_ref.rollout.val_kwargs.n=1 \ + actor_rollout_ref.rollout.val_kwargs.temperature=1.0 \ + actor_rollout_ref.rollout.val_kwargs.top_p=0.7 \ + actor_rollout_ref.ref.strategy=fsdp2 \ + actor_rollout_ref.ref.log_prob_use_dynamic_bsz=true \ + actor_rollout_ref.ref.log_prob_max_token_len_per_gpu=20480 \ + actor_rollout_ref.ref.log_prob_micro_batch_size_per_gpu=2 \ + actor_rollout_ref.ref.fsdp_config.param_offload=true \ + actor_rollout_ref.ref.fsdp_config.model_dtype=bfloat16 \ + algorithm.trainer_type=policy_gradient \ + algorithm.sample_source=online \ + algorithm.adv_estimator=grpo \ + algorithm.use_kl_in_reward=false \ + algorithm.filter_groups.enable=false \ + reward.reward_manager.source=register \ + reward.reward_manager.name=dapo \ + reward.reward_kwargs.max_resp_len=512 \ + reward.reward_kwargs.overlong_buffer_cfg.enable=true \ + reward.reward_kwargs.overlong_buffer_cfg.len=128 \ + reward.reward_kwargs.overlong_buffer_cfg.penalty_factor=1.0 \ + reward.reward_kwargs.overlong_buffer_cfg.log=true \ + trainer.val_before_train=false \ + trainer.balance_batch=true \ + trainer.critic_warmup=0 \ + trainer.logger=console \ + trainer.project_name=verl-test \ + trainer.experiment_name=dapo-qwen3-omni-thinker-lora-e2e-v1-wo-dynamic-sampling \ + trainer.n_gpus_per_node="${NUM_GPUS}" \ + trainer.nnodes=1 \ + trainer.test_freq=1 \ + trainer.save_freq=-1 \ + trainer.resume_mode=disable \ + trainer.total_training_steps="${TOTAL_TRAIN_STEPS}" \ + "$@" + +echo "Qwen3-Omni Thinker DAPO+LoRA e2e V1 smoke without dynamic sampling passed." diff --git a/tests/utils/test_dapo_overlong_reward_on_cpu.py b/tests/utils/test_dapo_overlong_reward_on_cpu.py new file mode 100644 index 000000000..a11427e2a --- /dev/null +++ b/tests/utils/test_dapo_overlong_reward_on_cpu.py @@ -0,0 +1,85 @@ +# Copyright 2026 Bytedance Ltd. and/or its affiliates +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Exit-criterion test for DAPO Phase 2 (#446): overlong penalty must change the +reward on a truncated dummy response through the exact ``reward.reward_kwargs`` +path the Thinker DAPO recipe sets (see run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh). +""" + +import numpy as np +import torch +from omegaconf import OmegaConf +from transformers import AutoTokenizer +from verl import DataProto +from verl.experimental.reward_loop.reward_manager.dapo import DAPORewardManager + +MAX_RESP_LEN = 16 +OVERLONG_BUFFER_LEN = 4 +OVERLONG_PENALTY_FACTOR = 1.0 + + +def _compute_score(data_source, solution_str, ground_truth, extra_info=None): + return 1.0 + + +def _build_manager(overlong_enable: bool) -> DAPORewardManager: + config = OmegaConf.create( + { + "reward": { + "reward_kwargs": { + "overlong_buffer_cfg": { + "enable": overlong_enable, + "len": OVERLONG_BUFFER_LEN, + "penalty_factor": OVERLONG_PENALTY_FACTOR, + "log": True, + }, + "max_resp_len": MAX_RESP_LEN, + } + } + } + ) + tokenizer = AutoTokenizer.from_pretrained("gpt2") + return DAPORewardManager(config, tokenizer, _compute_score) + + +def _make_truncated_response() -> DataProto: + # valid_len == MAX_RESP_LEN, i.e. exceed_len == OVERLONG_BUFFER_LEN -> full penalty. + response_ids = torch.randint(0, 100, (1, MAX_RESP_LEN)) + attention_mask = torch.ones(1, MAX_RESP_LEN, dtype=torch.long) + non_tensors = { + "data_source": np.array(["dummy"], dtype=object), + "reward_model": np.array([{"ground_truth": "x"}], dtype=object), + "extra_info": np.array([{}], dtype=object), + } + return DataProto.from_dict( + tensors={"responses": response_ids, "attention_mask": attention_mask}, + non_tensors=non_tensors, + ) + + +def test_overlong_penalty_changes_reward_on_truncated_response(): + batch = _make_truncated_response() + + disabled = _build_manager(overlong_enable=False) + enabled = _build_manager(overlong_enable=True) + + result_disabled = disabled.loop.run_until_complete(disabled.run_single(batch)) + result_enabled = enabled.loop.run_until_complete(enabled.run_single(batch)) + + assert result_disabled["reward_score"] == 1.0 + assert "overlong" not in result_disabled["reward_extra_info"] + + assert result_enabled["reward_score"] < result_disabled["reward_score"] + assert result_enabled["reward_extra_info"]["overlong"] + assert result_enabled["reward_extra_info"]["overlong_reward"] < 0 diff --git a/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py b/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py index 3b8ab0973..2b0c7b385 100644 --- a/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py +++ b/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py @@ -42,7 +42,6 @@ def _assert_dapo_without_dynamic_sampling_contract(script: str) -> None: assert set(DAPO_WITHOUT_DYNAMIC_SAMPLING_SETTINGS) <= settings assert "actor_rollout_ref.actor.policy_loss.loss_mode=gspo" not in settings assert "algorithm.filter_groups.enable=true" not in settings - assert "overlong_buffer_cfg" not in script def test_dapo_example_launcher_has_phase_one_contract(): @@ -63,6 +62,8 @@ def test_dapo_example_launcher_has_phase_one_contract(): "data.val_max_samples=-1", "data.validation_shuffle=false", "reward.reward_manager.name=naive", + # naive reward manager doesn't read reward_kwargs.overlong_buffer_cfg; + # overlong shaping needs reward_manager.name=dapo (see the smoke test). "reward.custom_reward_function.path=verl_omni/utils/reward_score/choice_reward.py", "reward.custom_reward_function.name=compute_score", "trainer.val_before_train=true", @@ -78,3 +79,27 @@ def test_dapo_example_launcher_has_phase_one_contract(): assert "data.val_max_samples=4" not in settings assert "data.validation_shuffle=true" not in settings assert "trainer.val_before_train=false" not in settings + assert "overlong_buffer_cfg" not in launcher + + +def test_dapo_tiny_random_smoke_matches_example_contract(): + repo_root = Path(__file__).parents[2] + smoke = (repo_root / "tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh").read_text(encoding="utf-8") + + _assert_dapo_without_dynamic_sampling_contract(smoke) + settings = _script_settings(smoke) + assert "reward.reward_manager.name=dapo" in settings + assert "build_qwen3_omni_tiny_random.py" in smoke + assert "SKIP_COMPAT_DEPS_INSTALL:-0" in smoke + assert 'trainer.total_training_steps="${TOTAL_TRAIN_STEPS}"' in smoke + + # Phase 2 (#446): overlong shaping is wired through reward.reward_kwargs and + # sized against this smoke's own data.max_response_length=512. + assert "data.max_response_length=512" in settings + assert { + "reward.reward_kwargs.max_resp_len=512", + "reward.reward_kwargs.overlong_buffer_cfg.enable=true", + "reward.reward_kwargs.overlong_buffer_cfg.len=128", + "reward.reward_kwargs.overlong_buffer_cfg.penalty_factor=1.0", + "reward.reward_kwargs.overlong_buffer_cfg.log=true", + } <= settings diff --git a/verl_omni/trainer/config/_generated_diffusion_trainer.yaml b/verl_omni/trainer/config/_generated_diffusion_trainer.yaml index 5037b7875..235383b16 100644 --- a/verl_omni/trainer/config/_generated_diffusion_trainer.yaml +++ b/verl_omni/trainer/config/_generated_diffusion_trainer.yaml @@ -468,6 +468,13 @@ reward: name: compute_score reward_functions: {} aggregation: weighted_sum + reward_kwargs: + overlong_buffer_cfg: + enable: false + len: 0 + penalty_factor: 0.0 + log: true + max_resp_len: null reward_manager: _target_: verl.workers.config.reward_model.RewardManagerConfig source: importlib diff --git a/verl_omni/trainer/config/_generated_diffusion_veomni_trainer.yaml b/verl_omni/trainer/config/_generated_diffusion_veomni_trainer.yaml index ca59c25e2..cbad00ed0 100644 --- a/verl_omni/trainer/config/_generated_diffusion_veomni_trainer.yaml +++ b/verl_omni/trainer/config/_generated_diffusion_veomni_trainer.yaml @@ -509,6 +509,13 @@ reward: name: compute_score reward_functions: {} aggregation: weighted_sum + reward_kwargs: + overlong_buffer_cfg: + enable: false + len: 0 + penalty_factor: 0.0 + log: true + max_resp_len: null reward_manager: _target_: verl.workers.config.reward_model.RewardManagerConfig source: importlib diff --git a/verl_omni/trainer/config/_generated_omni_megatron_trainer.yaml b/verl_omni/trainer/config/_generated_omni_megatron_trainer.yaml index 4784af554..e0f782bb0 100644 --- a/verl_omni/trainer/config/_generated_omni_megatron_trainer.yaml +++ b/verl_omni/trainer/config/_generated_omni_megatron_trainer.yaml @@ -912,6 +912,13 @@ reward: name: compute_score reward_functions: {} aggregation: weighted_sum + reward_kwargs: + overlong_buffer_cfg: + enable: false + len: 0 + penalty_factor: 0.0 + log: true + max_resp_len: null reward_manager: _target_: verl.workers.config.reward_model.RewardManagerConfig source: register diff --git a/verl_omni/trainer/config/_generated_omni_trainer.yaml b/verl_omni/trainer/config/_generated_omni_trainer.yaml index d25b41e55..a3721152c 100644 --- a/verl_omni/trainer/config/_generated_omni_trainer.yaml +++ b/verl_omni/trainer/config/_generated_omni_trainer.yaml @@ -872,6 +872,13 @@ reward: name: compute_score reward_functions: {} aggregation: weighted_sum + reward_kwargs: + overlong_buffer_cfg: + enable: false + len: 0 + penalty_factor: 0.0 + log: true + max_resp_len: null reward_manager: _target_: verl.workers.config.reward_model.RewardManagerConfig source: importlib diff --git a/verl_omni/trainer/config/reward/reward.yaml b/verl_omni/trainer/config/reward/reward.yaml index c53ec73fb..cb28f5085 100644 --- a/verl_omni/trainer/config/reward/reward.yaml +++ b/verl_omni/trainer/config/reward/reward.yaml @@ -29,6 +29,18 @@ reward_functions: {} # Aggregation method for multi-reward. Only "weighted_sum" is supported. aggregation: weighted_sum +# Extra kwargs read directly by the reward manager (e.g. verl's registered +# "dapo" manager). Disabled by default; only the DAPO recipe overrides these. +reward_kwargs: + # Overlong response penalty (DAPO). max_resp_len must exceed + # overlong_buffer_cfg.len whenever overlong_buffer_cfg.enable is true. + overlong_buffer_cfg: + enable: false + len: 0 + penalty_factor: 0.0 + log: true + max_resp_len: null + # reward manager configuration reward_manager: _target_: verl.workers.config.reward_model.RewardManagerConfig From 7dc3bd9701e6ce036cdb9e449cbca3e4f541ab32 Mon Sep 17 00:00:00 2001 From: onepunchmonk Date: Tue, 1 Sep 2026 20:34:28 +0530 Subject: [PATCH 09/11] [cfg, tests] chore: trim redundant comments Co-authored-by: Claude Code --- tests/utils/test_dapo_overlong_reward_on_cpu.py | 5 +---- tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py | 4 ---- verl_omni/trainer/config/reward/reward.yaml | 6 ++---- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/tests/utils/test_dapo_overlong_reward_on_cpu.py b/tests/utils/test_dapo_overlong_reward_on_cpu.py index a11427e2a..87d4a3574 100644 --- a/tests/utils/test_dapo_overlong_reward_on_cpu.py +++ b/tests/utils/test_dapo_overlong_reward_on_cpu.py @@ -12,10 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -"""Exit-criterion test for DAPO Phase 2 (#446): overlong penalty must change the -reward on a truncated dummy response through the exact ``reward.reward_kwargs`` -path the Thinker DAPO recipe sets (see run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh). -""" +"""Overlong penalty must change the reward on a truncated response (#446 Phase 2).""" import numpy as np import torch diff --git a/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py b/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py index 2b0c7b385..b8d83f81a 100644 --- a/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py +++ b/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py @@ -62,8 +62,6 @@ def test_dapo_example_launcher_has_phase_one_contract(): "data.val_max_samples=-1", "data.validation_shuffle=false", "reward.reward_manager.name=naive", - # naive reward manager doesn't read reward_kwargs.overlong_buffer_cfg; - # overlong shaping needs reward_manager.name=dapo (see the smoke test). "reward.custom_reward_function.path=verl_omni/utils/reward_score/choice_reward.py", "reward.custom_reward_function.name=compute_score", "trainer.val_before_train=true", @@ -93,8 +91,6 @@ def test_dapo_tiny_random_smoke_matches_example_contract(): assert "SKIP_COMPAT_DEPS_INSTALL:-0" in smoke assert 'trainer.total_training_steps="${TOTAL_TRAIN_STEPS}"' in smoke - # Phase 2 (#446): overlong shaping is wired through reward.reward_kwargs and - # sized against this smoke's own data.max_response_length=512. assert "data.max_response_length=512" in settings assert { "reward.reward_kwargs.max_resp_len=512", diff --git a/verl_omni/trainer/config/reward/reward.yaml b/verl_omni/trainer/config/reward/reward.yaml index cb28f5085..03414a5e7 100644 --- a/verl_omni/trainer/config/reward/reward.yaml +++ b/verl_omni/trainer/config/reward/reward.yaml @@ -29,11 +29,9 @@ reward_functions: {} # Aggregation method for multi-reward. Only "weighted_sum" is supported. aggregation: weighted_sum -# Extra kwargs read directly by the reward manager (e.g. verl's registered -# "dapo" manager). Disabled by default; only the DAPO recipe overrides these. +# Extra kwargs read directly by the reward manager (e.g. verl's "dapo" manager). reward_kwargs: - # Overlong response penalty (DAPO). max_resp_len must exceed - # overlong_buffer_cfg.len whenever overlong_buffer_cfg.enable is true. + # max_resp_len must exceed overlong_buffer_cfg.len when enable is true. overlong_buffer_cfg: enable: false len: 0 From 7fdf1dde413be3acba847bcd501307ce4d6de460 Mon Sep 17 00:00:00 2001 From: onepunchmonk Date: Fri, 11 Sep 2026 22:06:24 +0530 Subject: [PATCH 10/11] address review comments: local tokenizer in CPU test, trim README phase/issue refs - Replace AutoTokenizer.from_pretrained("gpt2") with an in-memory WordLevel tokenizer so the overlong-reward CPU test needs no network access (Copilot, wtomin). - Rewrite the overlong reward buffer section of examples/dapo_trainer/README.md as plain usage instructions instead of phase/issue references (wtomin). --- examples/dapo_trainer/README.md | 24 ++++++++++++----- .../utils/test_dapo_overlong_reward_on_cpu.py | 26 ++++++++++++++----- 2 files changed, 37 insertions(+), 13 deletions(-) diff --git a/examples/dapo_trainer/README.md b/examples/dapo_trainer/README.md index e0dd97c75..331fbad78 100644 --- a/examples/dapo_trainer/README.md +++ b/examples/dapo_trainer/README.md @@ -19,14 +19,24 @@ policy loss with asymmetric clipping, GRPO advantages, and no KL penalty. The registered naive reward manager calls the AVQA `choice_reward`; the reward manager name alone does not select the optimization algorithm. -**Phase 2 (#446): overlong reward buffer.** Overlong shaping is wired through -`reward.reward_kwargs` and only applies with `reward.reward_manager.name=dapo` -(`source=register`) — it is a no-op under the `naive` manager this example -uses. See `tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh` for -a working `name=dapo` recipe with overlong shaping enabled, and +**Overlong reward buffer.** Overlong shaping penalizes responses that run past +`reward.reward_kwargs.max_resp_len`, tapering the reward to zero (then to a +full penalty) over the trailing `reward.reward_kwargs.overlong_buffer_cfg.len` +tokens. It is wired through `reward.reward_kwargs` and only applies with +`reward.reward_manager.name=dapo` (`source=register`) — it is a no-op under +the `naive` manager this example uses. Enable it with: + +```text +reward.reward_kwargs.overlong_buffer_cfg.enable=true +reward.reward_kwargs.overlong_buffer_cfg.len= +reward.reward_kwargs.overlong_buffer_cfg.penalty_factor= +reward.reward_kwargs.max_resp_len= +``` + +See `tests/special_e2e/run_dapo_qwen3_omni_thinker_lora_v1_smoke.sh` for a +working `name=dapo` recipe with overlong shaping enabled, and `tests/utils/test_dapo_overlong_reward_on_cpu.py` for the reward-shape -contract: `reward.reward_kwargs.overlong_buffer_cfg.{enable,len,penalty_factor,log}` -and `reward.reward_kwargs.max_resp_len`. +contract. ## Run diff --git a/tests/utils/test_dapo_overlong_reward_on_cpu.py b/tests/utils/test_dapo_overlong_reward_on_cpu.py index 87d4a3574..c6b1343cf 100644 --- a/tests/utils/test_dapo_overlong_reward_on_cpu.py +++ b/tests/utils/test_dapo_overlong_reward_on_cpu.py @@ -17,7 +17,10 @@ import numpy as np import torch from omegaconf import OmegaConf -from transformers import AutoTokenizer +from tokenizers import Tokenizer +from tokenizers.models import WordLevel +from tokenizers.pre_tokenizers import Whitespace +from transformers import AutoTokenizer, PreTrainedTokenizerFast from verl import DataProto from verl.experimental.reward_loop.reward_manager.dapo import DAPORewardManager @@ -26,11 +29,22 @@ OVERLONG_PENALTY_FACTOR = 1.0 +def _build_local_tokenizer(tmp_path) -> AutoTokenizer: + # A tiny in-memory tokenizer, so this test needs no network access or + # downloaded artifacts (the DAPO manager only calls tokenizer.decode()). + vocab = {"[UNK]": 0, **{str(i): i + 1 for i in range(100)}} + tokenizer = Tokenizer(WordLevel(vocab=vocab, unk_token="[UNK]")) + tokenizer.pre_tokenizer = Whitespace() + fast_tokenizer = PreTrainedTokenizerFast(tokenizer_object=tokenizer, unk_token="[UNK]") + fast_tokenizer.save_pretrained(tmp_path) + return AutoTokenizer.from_pretrained(tmp_path) + + def _compute_score(data_source, solution_str, ground_truth, extra_info=None): return 1.0 -def _build_manager(overlong_enable: bool) -> DAPORewardManager: +def _build_manager(overlong_enable: bool, tokenizer) -> DAPORewardManager: config = OmegaConf.create( { "reward": { @@ -46,7 +60,6 @@ def _build_manager(overlong_enable: bool) -> DAPORewardManager: } } ) - tokenizer = AutoTokenizer.from_pretrained("gpt2") return DAPORewardManager(config, tokenizer, _compute_score) @@ -65,11 +78,12 @@ def _make_truncated_response() -> DataProto: ) -def test_overlong_penalty_changes_reward_on_truncated_response(): +def test_overlong_penalty_changes_reward_on_truncated_response(tmp_path): batch = _make_truncated_response() + tokenizer = _build_local_tokenizer(tmp_path) - disabled = _build_manager(overlong_enable=False) - enabled = _build_manager(overlong_enable=True) + disabled = _build_manager(overlong_enable=False, tokenizer=tokenizer) + enabled = _build_manager(overlong_enable=True, tokenizer=tokenizer) result_disabled = disabled.loop.run_until_complete(disabled.run_single(batch)) result_enabled = enabled.loop.run_until_complete(enabled.run_single(batch)) From c929a51b24f0e590e9cb6fa9122087bab7c2796c Mon Sep 17 00:00:00 2001 From: onepunchmonk Date: Fri, 11 Sep 2026 22:18:22 +0530 Subject: [PATCH 11/11] fix: shared launcher contract still forbade overlong_buffer_cfg for both scripts The PR description says the "no overlong config" assertion was split so it only applies to the naive-manager example, but the shared helper _assert_dapo_without_dynamic_sampling_contract() still carried a blanket "overlong_buffer_cfg not in script" check, so it failed for the dapo smoke script that legitimately enables it. The phase-1 naive-example test already has its own standalone assertion for this, so drop the duplicate from the shared helper. --- tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py b/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py index 6a8f4eb9f..b8d83f81a 100644 --- a/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py +++ b/tests/utils/test_qwen3_omni_dapo_launcher_on_cpu.py @@ -42,7 +42,6 @@ def _assert_dapo_without_dynamic_sampling_contract(script: str) -> None: assert set(DAPO_WITHOUT_DYNAMIC_SAMPLING_SETTINGS) <= settings assert "actor_rollout_ref.actor.policy_loss.loss_mode=gspo" not in settings assert "algorithm.filter_groups.enable=true" not in settings - assert "overlong_buffer_cfg" not in script def test_dapo_example_launcher_has_phase_one_contract():