From 26f7512d37558a85b0df7f056f1e42c5cb251ce5 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Mon, 23 Jun 2025 20:33:49 -0700 Subject: [PATCH 01/43] add lora test --- .github/workflows/kernel-test.yml | 198 +++++++++++ .github/workflows/pr-test.yml | 90 ++--- fastvideo/v1/tests/__init__.py | 0 .../lora/test_lora_inference_similarity.py | 327 ++++++++++++++++++ .../tests/ssim/test_inference_similarity.py | 2 +- .../tests/{ssim/compute_ssim.py => utils.py} | 79 ++--- 6 files changed, 589 insertions(+), 107 deletions(-) create mode 100644 .github/workflows/kernel-test.yml create mode 100644 fastvideo/v1/tests/__init__.py create mode 100644 fastvideo/v1/tests/lora/test_lora_inference_similarity.py rename fastvideo/v1/tests/{ssim/compute_ssim.py => utils.py} (60%) diff --git a/.github/workflows/kernel-test.yml b/.github/workflows/kernel-test.yml new file mode 100644 index 0000000000..25cfb7a4dd --- /dev/null +++ b/.github/workflows/kernel-test.yml @@ -0,0 +1,198 @@ +name: Kernel Test + +on: + push: + branches: [main] + paths: + - "fastvideo/**/*.py" + - "csrc/**" + - ".github/workflows/kernel-test.yml" + pull_request: + branches: [main] + types: [opened, ready_for_review, synchronize, reopened] + paths: + - "fastvideo/**/*.py" + - "csrc/**" + - ".github/workflows/kernel-test.yml" + - "pyproject.toml" + - "docker/Dockerfile.python3.12" + workflow_dispatch: + inputs: + run_training_test_VSA: + description: "Run training-test-VSA" + required: false + default: false + type: boolean + run_inference_test_STA: + description: "Run inference-test-STA" + required: false + default: false + type: boolean + run_precision_test_STA: + description: "Run precision-test-STA" + required: false + default: false + type: boolean + run_precision_test_VSA: + description: "Run precision-test-VSA" + required: false + default: false + type: boolean + +env: + PYTHONUNBUFFERED: "1" + +concurrency: + group: kernel-test-${{ github.ref }} + cancel-in-progress: true + +jobs: + pre-commit: + uses: ./.github/workflows/pre-commit.yml + + change-filter: + runs-on: ubuntu-latest + needs: pre-commit + if: ${{ github.event.pull_request.draft == false || github.event_name == 'workflow_dispatch' }} + outputs: + training-test-VSA: ${{ steps.filter.outputs.training-test-VSA }} + inference-test-STA: ${{ steps.filter.outputs.inference-test-STA }} + precision-test-STA: ${{ steps.filter.outputs.precision-test-STA }} + precision-test-VSA: ${{ steps.filter.outputs.precision-test-VSA }} + steps: + - uses: actions/checkout@v4 + - uses: dorny/paths-filter@v3 + id: filter + with: + filters: | + # Define reusable path patterns + common-paths: &common-paths + - 'pyproject.toml' + - 'docker/Dockerfile.python3.12' + sta-kernel-paths: &sta-kernel-paths + - 'csrc/attn/st_attn/**' + - 'csrc/attn/setup_sta.py' + - 'csrc/attn/config_sta.py' + - 'csrc/attn/st_attn.cpp' + vsa-kernel-paths: &vsa-kernel-paths + - 'csrc/attn/vsa/**' + - 'csrc/attn/tk/**' + - 'csrc/attn/setup_vsa.py' + - 'csrc/attn/config_vsa.py' + - 'csrc/attn/vsa.cpp' + + # Kernel tests + training-test-VSA: + - 'fastvideo/v1/**' + - *common-paths + - *vsa-kernel-paths + inference-test-STA: + - 'fastvideo/v1/**' + - *common-paths + - *sta-kernel-paths + precision-test-STA: + - *common-paths + - *sta-kernel-paths + precision-test-VSA: + - *common-paths + - *vsa-kernel-paths + + training-test-VSA: + needs: change-filter + if: >- + (github.event_name != 'workflow_dispatch' && github.event.pull_request.draft == false) || + (github.event_name == 'workflow_dispatch' && github.event.inputs.run_training_test_VSA == 'true') + uses: ./.github/workflows/runpod-test.yml + with: + job_id: "training-test-VSA" + gpu_type: "NVIDIA H100 NVL" + gpu_count: 1 + volume_size: 100 + disk_size: 100 + image: "ghcr.io/${{ github.repository }}/fastvideo-dev:py3.12-latest" + test_command: "wandb login $WANDB_API_KEY && uv pip install -e .[test] && pytest ./fastvideo/v1/tests/training/VSA -srP" + timeout_minutes: 30 + secrets: + RUNPOD_API_KEY: ${{ secrets.RUNPOD_API_KEY }} + RUNPOD_PRIVATE_KEY: ${{ secrets.RUNPOD_PRIVATE_KEY }} + WANDB_API_KEY: ${{ secrets.WANDB_API_KEY }} + + inference-test-STA: + needs: change-filter + if: >- + (github.event_name != 'workflow_dispatch' && github.event.pull_request.draft == false) || + (github.event_name == 'workflow_dispatch' && github.event.inputs.run_inference_test_STA == 'true') + uses: ./.github/workflows/runpod-test.yml + with: + job_id: "inference-test-STA" + gpu_type: "NVIDIA H100 NVL" + gpu_count: 1 + volume_size: 100 + disk_size: 100 + image: "ghcr.io/${{ github.repository }}/fastvideo-dev:py3.12-latest" + test_command: "uv pip install -e .[test] && pytest ./fastvideo/v1/tests/inference/STA -srP" + timeout_minutes: 30 + secrets: + RUNPOD_API_KEY: ${{ secrets.RUNPOD_API_KEY }} + RUNPOD_PRIVATE_KEY: ${{ secrets.RUNPOD_PRIVATE_KEY }} + + precision-test-STA: + needs: change-filter + if: >- + (github.event_name != 'workflow_dispatch' && github.event.pull_request.draft == false) || + (github.event_name == 'workflow_dispatch' && github.event.inputs.run_precision_test_STA == 'true') + uses: ./.github/workflows/runpod-test.yml + with: + job_id: "precision-test-STA" + gpu_type: "NVIDIA H100 NVL" + gpu_count: 1 + volume_size: 100 + disk_size: 100 + image: "ghcr.io/${{ github.repository }}/fastvideo-dev:py3.12-latest" + test_command: "uv pip install -e .[test] && python csrc/attn/tests/test_sta.py" + timeout_minutes: 30 + secrets: + RUNPOD_API_KEY: ${{ secrets.RUNPOD_API_KEY }} + RUNPOD_PRIVATE_KEY: ${{ secrets.RUNPOD_PRIVATE_KEY }} + + precision-test-VSA: + needs: change-filter + if: >- + (github.event_name != 'workflow_dispatch' && github.event.pull_request.draft == false) || + (github.event_name == 'workflow_dispatch' && github.event.inputs.run_precision_test_VSA == 'true') + uses: ./.github/workflows/runpod-test.yml + with: + job_id: "precision-test-VSA" + gpu_type: "NVIDIA H100 NVL" + gpu_count: 1 + volume_size: 100 + disk_size: 100 + image: "ghcr.io/${{ github.repository }}/fastvideo-dev:py3.12-latest" + test_command: "uv pip install -e .[test] && python csrc/attn/tests/test_block_sparse.py" + timeout_minutes: 30 + secrets: + RUNPOD_API_KEY: ${{ secrets.RUNPOD_API_KEY }} + RUNPOD_PRIVATE_KEY: ${{ secrets.RUNPOD_PRIVATE_KEY }} + + runpod-cleanup: + needs: [training-test-VSA, inference-test-STA, precision-test-STA, precision-test-VSA] + if: ${{ always() && ((github.event_name != 'workflow_dispatch' && github.event.pull_request.draft == false) || github.event_name == 'workflow_dispatch') }} + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.10" + + - name: Install dependencies + run: pip install requests + + - name: Cleanup all RunPod instances + env: + JOB_IDS: '["training-test-VSA", "inference-test-STA", "precision-test-STA", "precision-test-VSA"]' + RUNPOD_API_KEY: ${{ secrets.RUNPOD_API_KEY }} + GITHUB_RUN_ID: ${{ github.run_id }} + run: python .github/scripts/runpod_cleanup.py \ No newline at end of file diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index 9a2a74f512..9be08638ab 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -14,7 +14,6 @@ on: - ".github/workflows/pr-test.yml" - "pyproject.toml" - "docker/Dockerfile.python3.12" - - "csrc/**" workflow_dispatch: inputs: run_encoder_test: @@ -37,28 +36,13 @@ on: required: false default: false type: boolean - run_training_test: - description: "Run training-test" - required: false - default: false - type: boolean - run_training_test_VSA: - description: "Run training-test-VSA" - required: false - default: false - type: boolean - run_inference_test_STA: - description: "Run inference-test-STA" - required: false - default: false - type: boolean - run_precision_test_STA: - description: "Run precision-test-STA" + run_lora_test: + description: "Run lora-test" required: false default: false type: boolean - run_precision_test_VSA: - description: "Run precision-test-VSA" + run_training_test: + description: "Run training-test" required: false default: false type: boolean @@ -89,10 +73,7 @@ jobs: vae-test: ${{ steps.filter.outputs.vae-test }} transformer-test: ${{ steps.filter.outputs.transformer-test }} training-test: ${{ steps.filter.outputs.training-test }} - training-test-VSA: ${{ steps.filter.outputs.training-test-VSA }} - inference-test-STA: ${{ steps.filter.outputs.inference-test-STA }} - precision-test-STA: ${{ steps.filter.outputs.precision-test-STA }} - precision-test-VSA: ${{ steps.filter.outputs.precision-test-VSA }} + lora-test: ${{ steps.filter.outputs.lora-test }} steps: - uses: actions/checkout@v4 - uses: dorny/paths-filter@v3 @@ -103,21 +84,6 @@ jobs: common-paths: &common-paths - 'pyproject.toml' - 'docker/Dockerfile.python3.12' - sta-kernel-paths: &sta-kernel-paths - - 'csrc/attn/st_attn/**' - - 'csrc/attn/setup_sta.py' - - 'csrc/attn/config_sta.py' - - 'csrc/attn/st_attn.cpp' - vsa-kernel-paths: &vsa-kernel-paths - - 'csrc/attn/vsa/**' - - 'csrc/attn/tk/**' - - 'csrc/attn/setup_vsa.py' - - 'csrc/attn/config_vsa.py' - - 'csrc/attn/vsa.cpp' - vsa-paths: &vsa-paths - - 'fastvideo/v1/**' - - *common-paths - - *vsa-kernel-paths # Actual tests encoder-test: @@ -140,20 +106,11 @@ jobs: training-test: - 'fastvideo/v1/**' - *common-paths - training-test-VSA: - - 'fastvideo/v1/**' - - *common-paths - - *vsa-kernel-paths - inference-test-STA: - - 'fastvideo/v1/**' - - *common-paths - - *sta-kernel-paths - precision-test-STA: - - *common-paths - - *sta-kernel-paths - precision-test-VSA: + lora-test: + - 'fastvideo/v1/models/loaders/**' + - 'fastvideo/v1/tests/lora/**' + - 'fastvideo/v1/tests/utils.py' - *common-paths - - *vsa-kernel-paths encoder-test: needs: change-filter @@ -234,6 +191,31 @@ jobs: secrets: RUNPOD_API_KEY: ${{ secrets.RUNPOD_API_KEY }} RUNPOD_PRIVATE_KEY: ${{ secrets.RUNPOD_PRIVATE_KEY }} + + lora-test: + needs: change-filter + if: >- + (github.event_name != 'workflow_dispatch' && needs.change-filter.outputs.lora-test == 'true') || + (github.event_name == 'workflow_dispatch' && github.event.inputs.run_lora_test == 'true') + strategy: + fail-fast: false + matrix: + python-version: [ + {version: "3.12", tag: "py3.12-latest"} + ] + uses: ./.github/workflows/runpod-test.yml + with: + job_id: "lora-test-py${{ matrix.python-version.version }}" + gpu_type: "NVIDIA A40" + gpu_count: 2 + volume_size: 200 + disk_size: 200 + image: "ghcr.io/${{ github.repository }}/fastvideo-dev:${{ matrix.python-version.tag }}" + test_command: "uv pip install -e .[test] && pytest ./fastvideo/v1/tests/ssim/test_lora_inference_similarity.py -vs" + timeout_minutes: 60 + secrets: + RUNPOD_API_KEY: ${{ secrets.RUNPOD_API_KEY }} + RUNPOD_PRIVATE_KEY: ${{ secrets.RUNPOD_PRIVATE_KEY }} training-test: needs: change-filter @@ -352,7 +334,7 @@ jobs: runpod-cleanup: # Add other jobs to this list as you create them - needs: [encoder-test, vae-test, transformer-test, ssim-test, training-test, training-test-VSA, inference-test-STA, precision-test-STA, precision-test-VSA] + needs: [encoder-test, vae-test, transformer-test, ssim-test, lora-test, training-test] if: ${{ always() && ((github.event_name != 'workflow_dispatch' && github.event.pull_request.draft == false) || github.event_name == 'workflow_dispatch') }} runs-on: ubuntu-latest steps: @@ -369,7 +351,7 @@ jobs: - name: Cleanup all RunPod instances env: - JOB_IDS: '["encoder-test", "vae-test", "transformer-test", "ssim-test-py3.10", "ssim-test-py3.11", "ssim-test-py3.12", "training-test", "training-test-VSA", "inference-test-STA", "precision-test-STA", "precision-test-VSA"]' + JOB_IDS: '["encoder-test", "vae-test", "transformer-test", "ssim-test-py3.10", "ssim-test-py3.11", "ssim-test-py3.12", "lora-test-py3.12", "training-test"]' RUNPOD_API_KEY: ${{ secrets.RUNPOD_API_KEY }} GITHUB_RUN_ID: ${{ github.run_id }} run: python .github/scripts/runpod_cleanup.py diff --git a/fastvideo/v1/tests/__init__.py b/fastvideo/v1/tests/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py new file mode 100644 index 0000000000..fed16618cb --- /dev/null +++ b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py @@ -0,0 +1,327 @@ +# SPDX-License-Identifier: Apache-2.0 +import json +import os + +import pytest + +from fastvideo import VideoGenerator +from fastvideo.v1.logger import init_logger +from fastvideo.v1.tests.utils import compute_video_ssim_torchvision +from fastvideo.v1.worker.multiproc_executor import MultiprocExecutor + +logger = init_logger(__name__) + +# Base parameters for LoRA inference tests +WAN_LORA_PARAMS = { + "num_gpus": 2, + "model_path": "Wan-AI/Wan2.1-T2V-1.3B-Diffusers", + "height": 480, + "width": 832, + "num_frames": 81, + "num_inference_steps": 32, + "guidance_scale": 5.0, + "embedded_cfg_scale": 6, + "flow_shift": 7.0, + "seed": 1024, + "sp_size": 2, + "tp_size": 2, + "vae_sp": True, + "fps": 24, + "neg_prompt": "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走", + "text-encoder-precision": ("fp32",) +} + +# LoRA configurations for testing +LORA_CONFIGS = [ + { + "lora_path": "benjamin-paine/steamboat-willie-1.3b", + "lora_nickname": "steamboat", + "prompt": "steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a melting red candle. the mood is one of wonder and curiosity, as the monster gazes at the flame with wide eyes and open mouth. Its pose and expression convey a sense of innocence and playfulness, as if it is exploring the world around it for the first time. The use of warm colors and dramatic lighting further enhances the cozy atmosphere of the image.", + "negative_prompt": "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走" + }, + { + "lora_path": "motimalu/wan-flat-color-1.3b-v2", + "lora_nickname": "flat_color", + "prompt": "flat color, no lineart, blending, negative space, artist:[john kafka|ponsuke kaikai|hara id 21|yoneyama mai|fuzichoco], 1girl, sakura miko, pink hair, cowboy shot, white shirt, floral print, off shoulder, outdoors, cherry blossom, tree shade, wariza, looking up, falling petals, half-closed eyes, white sky, clouds, live2d animation, upper body, high quality cinematic video of a woman sitting under a sakura tree. Dreamy and lonely, the camera close-ups on the face of the woman as she turns towards the viewer. The Camera is steady, This is a cowboy shot. The animation is smooth and fluid.", + "negative_prompt": "bad quality video,色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走" + } +] + +MODEL_TO_PARAMS = { + "Wan2.1-T2V-1.3B-Diffusers": WAN_LORA_PARAMS, +} + + +def write_ssim_results(output_dir, ssim_values, reference_path, generated_path, + num_inference_steps, prompt, lora_nickname): + """ + Write SSIM results to a JSON file in the same directory as the generated videos. + """ + try: + logger.info( + f"Attempting to write SSIM results to directory: {output_dir}") + + if not os.path.exists(output_dir): + os.makedirs(output_dir, exist_ok=True) + + mean_ssim, min_ssim, max_ssim = ssim_values + + result = { + "mean_ssim": mean_ssim, + "min_ssim": min_ssim, + "max_ssim": max_ssim, + "reference_video": reference_path, + "generated_video": generated_path, + "parameters": { + "num_inference_steps": num_inference_steps, + "prompt": prompt, + "lora_nickname": lora_nickname + } + } + + test_name = f"lora_{lora_nickname}_steps{num_inference_steps}_{prompt[:50]}" + result_file = os.path.join(output_dir, f"{test_name}_ssim.json") + logger.info(f"Writing JSON results to: {result_file}") + with open(result_file, 'w') as f: + json.dump(result, f, indent=2) + + logger.info(f"SSIM results written to {result_file}") + return True + except Exception as e: + logger.error(f"ERROR writing SSIM results: {str(e)}") + return False + + +@pytest.mark.parametrize("lora_config", LORA_CONFIGS) +@pytest.mark.parametrize("ATTENTION_BACKEND", ["FLASH_ATTN", "TORCH_SDPA"]) +@pytest.mark.parametrize("model_id", list(MODEL_TO_PARAMS.keys())) +def test_lora_inference_similarity(lora_config, ATTENTION_BACKEND, model_id): + """ + Test that runs LoRA inference with different parameters and compares the output + to reference videos using SSIM. + """ + os.environ["FASTVIDEO_ATTENTION_BACKEND"] = ATTENTION_BACKEND + + script_dir = os.path.dirname(os.path.abspath(__file__)) + + base_output_dir = os.path.join(script_dir, 'generated_videos', model_id) + output_dir = os.path.join(base_output_dir, ATTENTION_BACKEND, 'lora') + output_video_name = f"lora_{lora_config['lora_nickname']}_{lora_config['prompt'][:50]}.mp4" + + os.makedirs(output_dir, exist_ok=True) + + BASE_PARAMS = MODEL_TO_PARAMS[model_id] + num_inference_steps = BASE_PARAMS["num_inference_steps"] + prompt = lora_config["prompt"] + negative_prompt = lora_config["negative_prompt"] + lora_path = lora_config["lora_path"] + lora_nickname = lora_config["lora_nickname"] + + init_kwargs = { + "num_gpus": BASE_PARAMS["num_gpus"], + "flow_shift": BASE_PARAMS["flow_shift"], + "sp_size": BASE_PARAMS["sp_size"], + "tp_size": BASE_PARAMS["tp_size"], + "lora_path": lora_path, + "lora_nickname": lora_nickname, + } + if BASE_PARAMS.get("vae_sp"): + init_kwargs["vae_sp"] = True + init_kwargs["vae_tiling"] = True + if "text-encoder-precision" in BASE_PARAMS: + init_kwargs["text_encoder_precisions"] = BASE_PARAMS["text-encoder-precision"] + + generation_kwargs = { + "num_inference_steps": num_inference_steps, + "output_path": output_dir, + "height": BASE_PARAMS["height"], + "width": BASE_PARAMS["width"], + "num_frames": BASE_PARAMS["num_frames"], + "guidance_scale": BASE_PARAMS["guidance_scale"], + "embedded_cfg_scale": BASE_PARAMS["embedded_cfg_scale"], + "seed": BASE_PARAMS["seed"], + "fps": BASE_PARAMS["fps"], + "negative_prompt": negative_prompt, + "save_video": True, + } + + generator = VideoGenerator.from_pretrained(model_path=BASE_PARAMS["model_path"], **init_kwargs) + generator.generate_video(prompt, **generation_kwargs) + + if isinstance(generator.executor, MultiprocExecutor): + generator.executor.shutdown() + + assert os.path.exists( + output_dir), f"Output video was not generated at {output_dir}" + + reference_folder = os.path.join(script_dir, 'reference_videos', model_id, ATTENTION_BACKEND, 'lora') + + if not os.path.exists(reference_folder): + logger.error("Reference folder missing") + raise FileNotFoundError( + f"Reference video folder does not exist: {reference_folder}") + + # Find the matching reference video based on the LoRA nickname and prompt + reference_video_name = None + expected_filename = f"lora_{lora_nickname}_{prompt[:50]}.mp4" + + for filename in os.listdir(reference_folder): + if filename.endswith('.mp4') and lora_nickname in filename and prompt[:50] in filename: + reference_video_name = filename + break + + if not reference_video_name: + logger.error(f"Reference video not found for LoRA: {lora_nickname} with prompt: {prompt[:50]} and backend: {ATTENTION_BACKEND}") + raise FileNotFoundError(f"Reference video missing for LoRA {lora_nickname}") + + reference_video_path = os.path.join(reference_folder, reference_video_name) + generated_video_path = os.path.join(output_dir, output_video_name) + + logger.info( + f"Computing SSIM between {reference_video_path} and {generated_video_path}" + ) + ssim_values = compute_video_ssim_torchvision(reference_video_path, + generated_video_path, + use_ms_ssim=True) + + mean_ssim = ssim_values[0] + logger.info(f"SSIM mean value: {mean_ssim}") + logger.info(f"Writing SSIM results to directory: {output_dir}") + + success = write_ssim_results(output_dir, ssim_values, reference_video_path, + generated_video_path, num_inference_steps, + prompt, lora_nickname) + + if not success: + logger.error("Failed to write SSIM results to file") + + min_acceptable_ssim = 0.95 + assert mean_ssim >= min_acceptable_ssim, f"SSIM value {mean_ssim} is below threshold {min_acceptable_ssim} for LoRA {lora_nickname}" + + +@pytest.mark.parametrize("lora_config", LORA_CONFIGS) +@pytest.mark.parametrize("ATTENTION_BACKEND", ["FLASH_ATTN", "TORCH_SDPA"]) +@pytest.mark.parametrize("model_id", list(MODEL_TO_PARAMS.keys())) +def test_lora_switching_similarity(lora_config, ATTENTION_BACKEND, model_id): + """ + Test that runs LoRA inference with LoRA switching and compares the output + to reference videos using SSIM. + """ + os.environ["FASTVIDEO_ATTENTION_BACKEND"] = ATTENTION_BACKEND + + script_dir = os.path.dirname(os.path.abspath(__file__)) + + base_output_dir = os.path.join(script_dir, 'generated_videos', model_id) + output_dir = os.path.join(base_output_dir, ATTENTION_BACKEND, 'lora_switching') + output_video_name = f"lora_switch_{lora_config['lora_nickname']}_{lora_config['prompt'][:50]}.mp4" + + os.makedirs(output_dir, exist_ok=True) + + BASE_PARAMS = MODEL_TO_PARAMS[model_id] + num_inference_steps = BASE_PARAMS["num_inference_steps"] + prompt = lora_config["prompt"] + negative_prompt = lora_config["negative_prompt"] + lora_path = lora_config["lora_path"] + lora_nickname = lora_config["lora_nickname"] + + init_kwargs = { + "num_gpus": BASE_PARAMS["num_gpus"], + "flow_shift": BASE_PARAMS["flow_shift"], + "sp_size": BASE_PARAMS["sp_size"], + "tp_size": BASE_PARAMS["tp_size"], + "lora_path": lora_path, + "lora_nickname": lora_nickname, + } + if BASE_PARAMS.get("vae_sp"): + init_kwargs["vae_sp"] = True + init_kwargs["vae_tiling"] = True + if "text-encoder-precision" in BASE_PARAMS: + init_kwargs["text_encoder_precisions"] = BASE_PARAMS["text-encoder-precision"] + + generation_kwargs = { + "num_inference_steps": num_inference_steps, + "output_path": output_dir, + "height": BASE_PARAMS["height"], + "width": BASE_PARAMS["width"], + "num_frames": BASE_PARAMS["num_frames"], + "guidance_scale": BASE_PARAMS["guidance_scale"], + "embedded_cfg_scale": BASE_PARAMS["embedded_cfg_scale"], + "seed": BASE_PARAMS["seed"], + "fps": BASE_PARAMS["fps"], + "negative_prompt": negative_prompt, + "save_video": True, + } + + generator = VideoGenerator.from_pretrained(model_path=BASE_PARAMS["model_path"], **init_kwargs) + + # Generate first video with initial LoRA + generator.generate_video(prompt, **generation_kwargs) + + # Switch to a different LoRA and generate second video + if lora_nickname == "steamboat": + new_lora_path = "motimalu/wan-flat-color-1.3b-v2" + new_lora_nickname = "flat_color" + new_prompt = "flat color, no lineart, blending, negative space, artist:[john kafka|ponsuke kaikai|hara id 21|yoneyama mai|fuzichoco], 1girl, sakura miko, pink hair, cowboy shot, white shirt, floral print, off shoulder, outdoors, cherry blossom, tree shade, wariza, looking up, falling petals, half-closed eyes, white sky, clouds, live2d animation, upper body, high quality cinematic video of a woman sitting under a sakura tree. Dreamy and lonely, the camera close-ups on the face of the woman as she turns towards the viewer. The Camera is steady, This is a cowboy shot. The animation is smooth and fluid." + new_negative_prompt = "bad quality video,色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走" + else: + new_lora_path = "benjamin-paine/steamboat-willie-1.3b" + new_lora_nickname = "steamboat" + new_prompt = "steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a melting red candle. the mood is one of wonder and curiosity, as the monster gazes at the flame with wide eyes and open mouth. Its pose and expression convey a sense of innocence and playfulness, as if it is exploring the world around it for the first time. The use of warm colors and dramatic lighting further enhances the cozy atmosphere of the image." + new_negative_prompt = "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走" + + generator.set_lora_adapter(lora_nickname=new_lora_nickname, lora_path=new_lora_path) + + generation_kwargs["negative_prompt"] = new_negative_prompt + output_video_name_switch = f"lora_switch_{new_lora_nickname}_{new_prompt[:50]}.mp4" + generation_kwargs["output_path"] = output_dir + + generator.generate_video(new_prompt, **generation_kwargs) + + if isinstance(generator.executor, MultiprocExecutor): + generator.executor.shutdown() + + assert os.path.exists( + output_dir), f"Output video was not generated at {output_dir}" + + reference_folder = os.path.join(script_dir, 'reference_videos', model_id, ATTENTION_BACKEND, 'lora_switching') + + if not os.path.exists(reference_folder): + logger.error("Reference folder missing") + raise FileNotFoundError( + f"Reference video folder does not exist: {reference_folder}") + + # Find the matching reference video for the switched LoRA + reference_video_name = None + + for filename in os.listdir(reference_folder): + if filename.endswith('.mp4') and new_lora_nickname in filename and new_prompt[:50] in filename: + reference_video_name = filename + break + + if not reference_video_name: + logger.error(f"Reference video not found for switched LoRA: {new_lora_nickname} with prompt: {new_prompt[:50]} and backend: {ATTENTION_BACKEND}") + raise FileNotFoundError(f"Reference video missing for switched LoRA {new_lora_nickname}") + + reference_video_path = os.path.join(reference_folder, reference_video_name) + generated_video_path = os.path.join(output_dir, output_video_name_switch) + + logger.info( + f"Computing SSIM between {reference_video_path} and {generated_video_path}" + ) + ssim_values = compute_video_ssim_torchvision(reference_video_path, + generated_video_path, + use_ms_ssim=True) + + mean_ssim = ssim_values[0] + logger.info(f"SSIM mean value: {mean_ssim}") + logger.info(f"Writing SSIM results to directory: {output_dir}") + + success = write_ssim_results(output_dir, ssim_values, reference_video_path, + generated_video_path, num_inference_steps, + new_prompt, new_lora_nickname) + + if not success: + logger.error("Failed to write SSIM results to file") + + min_acceptable_ssim = 0.95 + assert mean_ssim >= min_acceptable_ssim, f"SSIM value {mean_ssim} is below threshold {min_acceptable_ssim} for switched LoRA {new_lora_nickname}" \ No newline at end of file diff --git a/fastvideo/v1/tests/ssim/test_inference_similarity.py b/fastvideo/v1/tests/ssim/test_inference_similarity.py index 41076378ea..45d6e6f36f 100644 --- a/fastvideo/v1/tests/ssim/test_inference_similarity.py +++ b/fastvideo/v1/tests/ssim/test_inference_similarity.py @@ -7,7 +7,7 @@ from fastvideo import VideoGenerator from fastvideo.v1.logger import init_logger -from fastvideo.v1.tests.ssim.compute_ssim import compute_video_ssim_torchvision +from fastvideo.v1.tests.utils import compute_video_ssim_torchvision from fastvideo.v1.worker.multiproc_executor import MultiprocExecutor logger = init_logger(__name__) diff --git a/fastvideo/v1/tests/ssim/compute_ssim.py b/fastvideo/v1/tests/utils.py similarity index 60% rename from fastvideo/v1/tests/ssim/compute_ssim.py rename to fastvideo/v1/tests/utils.py index 4910363e64..de45691c68 100644 --- a/fastvideo/v1/tests/ssim/compute_ssim.py +++ b/fastvideo/v1/tests/utils.py @@ -9,6 +9,14 @@ def compute_video_ssim_torchvision(video1_path, video2_path, use_ms_ssim=True): + """ + Compute SSIM between two videos. + + Args: + video1_path: Path to the first video. + video2_path: Path to the second video. + use_ms_ssim: Whether to use Multi-Scale Structural Similarity(MS-SSIM) instead of SSIM. + """ print(f"Computing SSIM between {video1_path} and {video2_path}...") frames1, _, _ = read_video(video1_path, @@ -65,7 +73,26 @@ def compute_video_ssim_torchvision(video1_path, video2_path, use_ms_ssim=True): def compare_folders(reference_folder, generated_folder, use_ms_ssim=True): """ Compare videos with the same filename between reference_folder and generated_folder + + Example usage: + results = compare_folders(reference_folder, generated_folder, + args.use_ms_ssim) + for video_name, ssim_value in results.items(): + if ssim_value is not None: + print( + f"{video_name}: {ssim_value[0]:.4f}, Min SSIM: {ssim_value[1]:.4f}, Max SSIM: {ssim_value[2]:.4f}" + ) + else: + print(f"{video_name}: Error during comparison") + + valid_ssims = [v for v in results.values() if v is not None] + if valid_ssims: + avg_ssim = np.mean([v[0] for v in valid_ssims]) + print(f"\nAverage SSIM across all videos: {avg_ssim:.4f}") + else: + print("\nNo valid SSIM values to average") """ + reference_videos = [ f for f in os.listdir(reference_folder) if f.endswith('.mp4') ] @@ -91,55 +118,3 @@ def compare_folders(reference_folder, generated_folder, use_ms_ssim=True): ) return results - - -if __name__ == "__main__": - parser = argparse.ArgumentParser( - description='Compare videos using SSIM/MS-SSIM metrics') - parser.add_argument('--reference', - '-r', - type=str, - help='Path to reference videos directory') - parser.add_argument('--generated', - '-g', - type=str, - help='Path to generated videos directory') - parser.add_argument('--use-ms-ssim', - action='store_true', - help='Use MS-SSIM instead of SSIM') - args = parser.parse_args() - - script_dir = os.path.dirname(os.path.abspath(__file__)) - - reference_folder = args.reference if args.reference else os.path.join( - script_dir, 'reference_videos') - generated_folder = args.generated if args.generated else os.path.join( - script_dir, 'generated_videos') - - if not os.path.exists(reference_folder): - print(f"ERROR: Reference folder {reference_folder} does not exist!") - exit(1) - - if not os.path.exists(generated_folder): - print(f"ERROR: Generated folder {generated_folder} does not exist!") - exit(1) - - print(f"Comparing videos between {reference_folder} and {generated_folder}") - results = compare_folders(reference_folder, generated_folder, - args.use_ms_ssim) - - print("\n===== SSIM Results Summary =====") - for video_name, ssim_value in results.items(): - if ssim_value is not None: - print( - f"{video_name}: {ssim_value[0]:.4f}, Min SSIM: {ssim_value[1]:.4f}, Max SSIM: {ssim_value[2]:.4f}" - ) - else: - print(f"{video_name}: Error during comparison") - - valid_ssims = [v for v in results.values() if v is not None] - if valid_ssims: - avg_ssim = np.mean([v[0] for v in valid_ssims]) - print(f"\nAverage SSIM across all videos: {avg_ssim:.4f}") - else: - print("\nNo valid SSIM values to average") From 3dc90b4e504aea387f88ac3e25da6d110822a809 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Mon, 23 Jun 2025 20:39:20 -0700 Subject: [PATCH 02/43] add comments --- fastvideo/v1/tests/lora/test_lora_inference_similarity.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py index fed16618cb..7a4fd43c6e 100644 --- a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py +++ b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py @@ -153,7 +153,8 @@ def test_lora_inference_similarity(lora_config, ATTENTION_BACKEND, model_id): assert os.path.exists( output_dir), f"Output video was not generated at {output_dir}" - + + # Generated using A40 reference_folder = os.path.join(script_dir, 'reference_videos', model_id, ATTENTION_BACKEND, 'lora') if not os.path.exists(reference_folder): From a7544d14d20b200aeaf5defa378c479c5d0195dd Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Sun, 29 Jun 2025 17:58:00 -0700 Subject: [PATCH 03/43] fix vae precision; unify param name mapping; reload weights after unmerge; remove mypy --- .github/workflows/matchers/mypy.json | 16 - .github/workflows/pre-commit.yml | 1 - .pre-commit-config.yaml | 6 - examples/inference/lora/wan_lora_inference.py | 3 +- fastvideo/utils/collect_env.py | 1 - fastvideo/v1/configs/fasthunyuan_t2v.json | 2 +- fastvideo/v1/layers/lora/linear.py | 17 +- fastvideo/v1/models/loader/fsdp_load.py | 42 +-- fastvideo/v1/models/loader/utils.py | 48 ++- fastvideo/v1/pipelines/lora_pipeline.py | 7 +- .../lora/test_lora_inference_similarity.py | 293 +++++------------- .../tests/ssim/test_inference_similarity.py | 40 +-- fastvideo/v1/tests/utils.py | 42 +++ fastvideo/v1/training/training_utils.py | 18 +- pyproject.toml | 6 - 15 files changed, 199 insertions(+), 343 deletions(-) delete mode 100644 .github/workflows/matchers/mypy.json diff --git a/.github/workflows/matchers/mypy.json b/.github/workflows/matchers/mypy.json deleted file mode 100644 index f048fce528..0000000000 --- a/.github/workflows/matchers/mypy.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "problemMatcher": [ - { - "owner": "mypy", - "pattern": [ - { - "regexp": "^(.+):(\\d+):\\s(error|warning):\\s(.+)$", - "file": 1, - "line": 2, - "severity": 3, - "message": 4 - } - ] - } - ] -} diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 6db44912d9..8285599b25 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -12,7 +12,6 @@ jobs: with: python-version: "3.12" - run: echo "::add-matcher::.github/workflows/matchers/actionlint.json" - - run: echo "::add-matcher::.github/workflows/matchers/mypy.json" - uses: pre-commit/action@v3.0.1 with: extra_args: --all-files --hook-stage manual \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index d412c2b181..cec0a22231 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -56,12 +56,6 @@ repos: rev: v1.7.7 hooks: - id: actionlint -- repo: https://github.com/pre-commit/mirrors-mypy - rev: v1.15.0 - hooks: - - id: mypy - args: [--python-version, '3.10', --follow-imports, "skip", ] - additional_dependencies: [types-cachetools, types-setuptools, types-PyYAML, types-requests] - repo: local hooks: - id: check-filenames diff --git a/examples/inference/lora/wan_lora_inference.py b/examples/inference/lora/wan_lora_inference.py index cc3fa8dfce..6e9d3405ef 100644 --- a/examples/inference/lora/wan_lora_inference.py +++ b/examples/inference/lora/wan_lora_inference.py @@ -6,7 +6,7 @@ def main(): # Initialize VideoGenerator with the Wan model generator = VideoGenerator.from_pretrained( "Wan-AI/Wan2.1-T2V-1.3B-Diffusers", - num_gpus=2, + num_gpus=1, lora_path="benjamin-paine/steamboat-willie-1.3b", lora_nickname="steamboat" ) @@ -16,6 +16,7 @@ def main(): "num_frames": 81, "guidance_scale": 5.0, "num_inference_steps": 32, + "seed": 42, } # Generate video with LoRA style prompt = "steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a melting red candle. the mood is one of wonder and curiosity, as the monster gazes at the flame with wide eyes and open mouth. Its pose and expression convey a sense of innocence and playfulness, as if it is exploring the world around it for the first time. The use of warm colors and dramatic lighting further enhances the cozy atmosphere of the image." diff --git a/fastvideo/utils/collect_env.py b/fastvideo/utils/collect_env.py index d44bb15b32..cb796ad462 100644 --- a/fastvideo/utils/collect_env.py +++ b/fastvideo/utils/collect_env.py @@ -80,7 +80,6 @@ DEFAULT_PIP_PATTERNS = { "torch", "numpy", - "mypy", "flake8", "triton", "optree", diff --git a/fastvideo/v1/configs/fasthunyuan_t2v.json b/fastvideo/v1/configs/fasthunyuan_t2v.json index f7dca37fe4..e58aa0d499 100644 --- a/fastvideo/v1/configs/fasthunyuan_t2v.json +++ b/fastvideo/v1/configs/fasthunyuan_t2v.json @@ -4,7 +4,7 @@ "use_cpu_offload": false, "disable_autocast": false, "precision": "bf16", - "vae_precision": "fp16", + "vae_precision": "fp32", "vae_tiling": true, "vae_sp": true, "vae_config": { diff --git a/fastvideo/v1/layers/lora/linear.py b/fastvideo/v1/layers/lora/linear.py index ffc33f879b..da608f228a 100644 --- a/fastvideo/v1/layers/lora/linear.py +++ b/fastvideo/v1/layers/lora/linear.py @@ -7,7 +7,8 @@ from torch import nn from torch.distributed.tensor import DTensor, distribute_tensor -from fastvideo.v1.distributed import (get_tp_rank, split_tensor_along_last_dim, +from fastvideo.v1.distributed import (get_torch_device, get_tp_rank, + split_tensor_along_last_dim, tensor_model_parallel_all_gather, tensor_model_parallel_all_reduce) from fastvideo.v1.layers.linear import (ColumnParallelLinear, LinearBase, @@ -30,7 +31,6 @@ def __init__( self.merged: bool = False self.weight = base_layer.weight self.cpu_weight = base_layer.weight.to("cpu") - self.unmerge_count = 0 # indicates adapter weights don't contain this layer # (which shouldn't normally happen, but we want to separate it from the case of erroneous merging) self.disable_lora: bool = False @@ -68,7 +68,7 @@ def merge_lora_weights(self) -> None: placements = self.base_layer.weight.data.placements current_device = self.base_layer.weight.data.device data = self.base_layer.weight.data.to( - f"cuda:{torch.cuda.current_device()}").full_tensor() + get_torch_device()).full_tensor() data += (self.slice_lora_b_weights(self.lora_B) @ self.slice_lora_a_weights(self.lora_A)).to(data) self.base_layer.weight = nn.Parameter( @@ -76,8 +76,7 @@ def merge_lora_weights(self) -> None: placements=placements).to(current_device)) else: current_device = self.base_layer.weight.data.device - data = self.base_layer.weight.to( - f"cuda:{torch.cuda.current_device()}") + data = self.base_layer.weight.data.to(get_torch_device()) data += \ (self.slice_lora_b_weights(self.lora_B) @ self.slice_lora_a_weights(self.lora_A)).to(data) self.base_layer.weight = nn.Parameter(data.to(current_device)) @@ -92,19 +91,17 @@ def unmerge_lora_weights(self) -> None: raise ValueError( "LoRA weights not merged. Please merge them first before unmerging." ) - self.unmerge_count += 1 # Avoid precision loss - if self.unmerge_count % 3 == 0: - self.base_layer.weight.data = self.cpu_weight.data.to( - self.base_layer.weight) + self.base_layer.weight.data = self.cpu_weight.data.to( + self.base_layer.weight) if isinstance(self.base_layer.weight, DTensor): mesh = self.base_layer.weight.data.device_mesh placement = self.base_layer.weight.data.placements device = self.base_layer.weight.data.device data = self.base_layer.weight.data.to( - f"cuda:{torch.cuda.current_device()}").full_tensor() + get_torch_device()).full_tensor() data -= self.slice_lora_b_weights( self.lora_B) @ self.slice_lora_a_weights(self.lora_A) self.base_layer.weight = nn.Parameter( diff --git a/fastvideo/v1/models/loader/fsdp_load.py b/fastvideo/v1/models/loader/fsdp_load.py index 23375baf85..dd2de91303 100644 --- a/fastvideo/v1/models/loader/fsdp_load.py +++ b/fastvideo/v1/models/loader/fsdp_load.py @@ -5,10 +5,9 @@ # Copyright 2025 The FastVideo Authors. import contextlib -from collections import defaultdict from itertools import chain -from typing import (Any, Callable, DefaultDict, Dict, Generator, List, Optional, - Tuple, Type, Union) +from typing import (Any, Callable, Dict, Generator, List, Optional, Tuple, Type, + Union) import torch from torch import nn @@ -19,7 +18,8 @@ from torch.nn.modules.module import _IncompatibleKeys from fastvideo.v1.logger import init_logger -from fastvideo.v1.models.loader.utils import get_param_names_mapping +from fastvideo.v1.models.loader.utils import (get_param_names_mapping, + hf_to_custom_param_sd) from fastvideo.v1.models.loader.weight_utils import safetensors_weights_iterator from fastvideo.v1.utils import set_mixed_precision_policy @@ -233,36 +233,14 @@ def load_model_from_full_model_state_dict( NotImplementedError: If got FSDP with more than 1D. """ meta_sd = model.state_dict() - # Find new params - used_keys = set() sharded_sd = {} - to_merge_params: DefaultDict[str, Dict[Any, Any]] = defaultdict(dict) - reverse_param_names_mapping = {} - assert param_names_mapping is not None - for source_param_name, full_tensor in full_sd_iterator: - target_param_name, merge_index, num_params_to_merge = param_names_mapping( - source_param_name) - reverse_param_names_mapping[target_param_name] = (source_param_name, - merge_index, - num_params_to_merge) - used_keys.add(target_param_name) - if merge_index is not None: - to_merge_params[target_param_name][merge_index] = full_tensor - if len(to_merge_params[target_param_name]) == num_params_to_merge: - # cat at output dim according to the merge_index order - sorted_tensors = [ - to_merge_params[target_param_name][i] - for i in range(num_params_to_merge) - ] - full_tensor = torch.cat(sorted_tensors, dim=0) - del to_merge_params[target_param_name] - else: - continue - + custom_param_sd, reverse_param_names_mapping = hf_to_custom_param_sd( + full_sd_iterator, param_names_mapping) + for target_param_name, full_tensor in custom_param_sd.items(): meta_sharded_param = meta_sd.get(target_param_name) if meta_sharded_param is None: raise ValueError( - f"Parameter {source_param_name}-->{target_param_name} not found in meta sharded state dict" + f"Parameter {target_param_name} not found in custom model state dict. The hf to custom mapping may be incorrect." ) if not hasattr(meta_sharded_param, "device_mesh"): full_tensor = full_tensor.to(device=device, dtype=param_dtype) @@ -280,9 +258,9 @@ def load_model_from_full_model_state_dict( sharded_sd[target_param_name] = nn.Parameter(sharded_tensor) model._reverse_param_names_mapping = reverse_param_names_mapping - unused_keys = set(meta_sd.keys()) - used_keys + unused_keys = set(meta_sd.keys()) - set(sharded_sd.keys()) if unused_keys: - logger.warning("Found new parameters in meta state dict: %s", + logger.warning("Found unloaded parameters in meta state dict: %s", unused_keys) # List of allowed parameter name patterns diff --git a/fastvideo/v1/models/loader/utils.py b/fastvideo/v1/models/loader/utils.py index 8da6a88f78..1a9db8e965 100644 --- a/fastvideo/v1/models/loader/utils.py +++ b/fastvideo/v1/models/loader/utils.py @@ -2,7 +2,8 @@ """Utilities for selecting and loading models.""" import contextlib import re -from typing import Any, Callable, Dict +from collections import defaultdict +from typing import Any, Callable, Dict, Iterator, Tuple, Union import torch @@ -34,7 +35,6 @@ def get_param_names_mapping( """ def mapping_fn(name: str) -> tuple[str, Any, Any]: - # Try to match and transform the name using the regex patterns in mapping_dict for pattern, replacement in mapping_dict.items(): match = re.match(pattern, name) @@ -51,4 +51,46 @@ def mapping_fn(name: str) -> tuple[str, Any, Any]: # If no pattern matches, return the original name return name, None, None - return mapping_fn \ No newline at end of file + return mapping_fn + + +def hf_to_custom_param_sd( + hf_param_sd: Union[Dict[str, torch.Tensor], Iterator[Tuple[str, + torch.Tensor]]], + param_names_mapping: Callable[[str], tuple[str, Any, Any]] +) -> Dict[str, torch.Tensor]: + """ + Converts a Hugging Face parameter state dictionary to a custom parameter state dictionary. + + Args: + hf_param_sd (Dict[str, torch.Tensor]): The Hugging Face parameter state dictionary + param_names_mapping (Callable[[str], tuple[str, Any, Any]]): A function that maps parameter names from source to target format + + Returns: + Dict[str, torch.Tensor]: The custom parameter state dictionary + """ + custom_param_sd = {} + to_merge_params = defaultdict(dict) + reverse_param_names_mapping = {} + if isinstance(hf_param_sd, Dict): + hf_param_sd = hf_param_sd.items() + for source_param_name, full_tensor in hf_param_sd: + target_param_name, merge_index, num_params_to_merge = param_names_mapping( + source_param_name) + reverse_param_names_mapping[target_param_name] = (source_param_name, + merge_index, + num_params_to_merge) + if merge_index is not None: + to_merge_params[target_param_name][merge_index] = full_tensor + if len(to_merge_params[target_param_name]) == num_params_to_merge: + # cat at output dim according to the merge_index order + sorted_tensors = [ + to_merge_params[target_param_name][i] + for i in range(num_params_to_merge) + ] + full_tensor = torch.cat(sorted_tensors, dim=0) + del to_merge_params[target_param_name] + else: + continue + custom_param_sd[target_param_name] = full_tensor + return custom_param_sd, reverse_param_names_mapping diff --git a/fastvideo/v1/pipelines/lora_pipeline.py b/fastvideo/v1/pipelines/lora_pipeline.py index 7a251fc6fe..d0d7e0aff1 100644 --- a/fastvideo/v1/pipelines/lora_pipeline.py +++ b/fastvideo/v1/pipelines/lora_pipeline.py @@ -97,7 +97,7 @@ def set_lora_adapter(self, to_merge_params: DefaultDict[Hashable, Dict[Any, Any]] = defaultdict(dict) - for name, weight in lora_state_dict.items(): + for name, weight in sorted(lora_state_dict.items()): name = ".".join( name.split(".") [1:-1]) # remove the transformer prefix and .weight suffix @@ -118,6 +118,11 @@ def set_lora_adapter(self, del to_merge_params[target_name] else: continue + if target_name in self.lora_adapters[lora_nickname]: + raise ValueError( + f"Target name {target_name} already exists in lora_adapters[{lora_nickname}]" + ) + self.lora_adapters[lora_nickname][target_name] = weight.to( self.device) adapter_updated = True diff --git a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py index 7a4fd43c6e..b68254887e 100644 --- a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py +++ b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py @@ -6,8 +6,10 @@ from fastvideo import VideoGenerator from fastvideo.v1.logger import init_logger -from fastvideo.v1.tests.utils import compute_video_ssim_torchvision +from fastvideo.v1.tests.utils import compute_video_ssim_torchvision, write_ssim_results from fastvideo.v1.worker.multiproc_executor import MultiprocExecutor +from diffusers import AutoencoderKLWan, WanPipeline +from diffusers.schedulers.scheduling_unipc_multistep import UniPCMultistepScheduler logger = init_logger(__name__) @@ -51,157 +53,23 @@ "Wan2.1-T2V-1.3B-Diffusers": WAN_LORA_PARAMS, } - -def write_ssim_results(output_dir, ssim_values, reference_path, generated_path, - num_inference_steps, prompt, lora_nickname): - """ - Write SSIM results to a JSON file in the same directory as the generated videos. - """ - try: - logger.info( - f"Attempting to write SSIM results to directory: {output_dir}") - - if not os.path.exists(output_dir): - os.makedirs(output_dir, exist_ok=True) - - mean_ssim, min_ssim, max_ssim = ssim_values - - result = { - "mean_ssim": mean_ssim, - "min_ssim": min_ssim, - "max_ssim": max_ssim, - "reference_video": reference_path, - "generated_video": generated_path, - "parameters": { - "num_inference_steps": num_inference_steps, - "prompt": prompt, - "lora_nickname": lora_nickname - } - } - - test_name = f"lora_{lora_nickname}_steps{num_inference_steps}_{prompt[:50]}" - result_file = os.path.join(output_dir, f"{test_name}_ssim.json") - logger.info(f"Writing JSON results to: {result_file}") - with open(result_file, 'w') as f: - json.dump(result, f, indent=2) - - logger.info(f"SSIM results written to {result_file}") - return True - except Exception as e: - logger.error(f"ERROR writing SSIM results: {str(e)}") - return False - - -@pytest.mark.parametrize("lora_config", LORA_CONFIGS) -@pytest.mark.parametrize("ATTENTION_BACKEND", ["FLASH_ATTN", "TORCH_SDPA"]) -@pytest.mark.parametrize("model_id", list(MODEL_TO_PARAMS.keys())) -def test_lora_inference_similarity(lora_config, ATTENTION_BACKEND, model_id): - """ - Test that runs LoRA inference with different parameters and compares the output - to reference videos using SSIM. - """ - os.environ["FASTVIDEO_ATTENTION_BACKEND"] = ATTENTION_BACKEND - - script_dir = os.path.dirname(os.path.abspath(__file__)) - - base_output_dir = os.path.join(script_dir, 'generated_videos', model_id) - output_dir = os.path.join(base_output_dir, ATTENTION_BACKEND, 'lora') - output_video_name = f"lora_{lora_config['lora_nickname']}_{lora_config['prompt'][:50]}.mp4" - - os.makedirs(output_dir, exist_ok=True) - - BASE_PARAMS = MODEL_TO_PARAMS[model_id] - num_inference_steps = BASE_PARAMS["num_inference_steps"] - prompt = lora_config["prompt"] - negative_prompt = lora_config["negative_prompt"] - lora_path = lora_config["lora_path"] - lora_nickname = lora_config["lora_nickname"] - - init_kwargs = { - "num_gpus": BASE_PARAMS["num_gpus"], - "flow_shift": BASE_PARAMS["flow_shift"], - "sp_size": BASE_PARAMS["sp_size"], - "tp_size": BASE_PARAMS["tp_size"], - "lora_path": lora_path, - "lora_nickname": lora_nickname, - } - if BASE_PARAMS.get("vae_sp"): - init_kwargs["vae_sp"] = True - init_kwargs["vae_tiling"] = True - if "text-encoder-precision" in BASE_PARAMS: - init_kwargs["text_encoder_precisions"] = BASE_PARAMS["text-encoder-precision"] - - generation_kwargs = { - "num_inference_steps": num_inference_steps, - "output_path": output_dir, - "height": BASE_PARAMS["height"], - "width": BASE_PARAMS["width"], - "num_frames": BASE_PARAMS["num_frames"], - "guidance_scale": BASE_PARAMS["guidance_scale"], - "embedded_cfg_scale": BASE_PARAMS["embedded_cfg_scale"], - "seed": BASE_PARAMS["seed"], - "fps": BASE_PARAMS["fps"], - "negative_prompt": negative_prompt, - "save_video": True, +LORA_SWITCH_CONFIGS = [ + { + "lora_path": "motimalu/wan-flat-color-1.3b-v2", + "lora_nickname": "flat_color", + "prompt": "flat color, no lineart, blending, negative space, artist:[john kafka|ponsuke kaikai|hara id 21|yoneyama mai|fuzichoco], 1girl, sakura miko, pink hair, cowboy shot, white shirt, floral print, off shoulder, outdoors, cherry blossom, tree shade, wariza, looking up, falling petals, half-closed eyes, white sky, clouds, live2d animation, upper body, high quality cinematic video of a woman sitting under a sakura tree. Dreamy and lonely, the camera close-ups on the face of the woman as she turns towards the viewer. The Camera is steady, This is a cowboy shot. The animation is smooth and fluid.", + "negative_prompt": "bad quality video,色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走" + }, + { + "lora_path": "benjamin-paine/steamboat-willie-1.3b", + "lora_nickname": "steamboat", + "prompt": "steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a melting red candle. the mood is one of wonder and curiosity, as the monster gazes at the flame with wide eyes and open mouth. Its pose and expression convey a sense of innocence and playfulness, as if it is exploring the world around it for the first time. The use of warm colors and dramatic lighting further enhances the cozy atmosphere of the image.", + "negative_prompt": "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走" } - - generator = VideoGenerator.from_pretrained(model_path=BASE_PARAMS["model_path"], **init_kwargs) - generator.generate_video(prompt, **generation_kwargs) - - if isinstance(generator.executor, MultiprocExecutor): - generator.executor.shutdown() - - assert os.path.exists( - output_dir), f"Output video was not generated at {output_dir}" - - # Generated using A40 - reference_folder = os.path.join(script_dir, 'reference_videos', model_id, ATTENTION_BACKEND, 'lora') - - if not os.path.exists(reference_folder): - logger.error("Reference folder missing") - raise FileNotFoundError( - f"Reference video folder does not exist: {reference_folder}") - - # Find the matching reference video based on the LoRA nickname and prompt - reference_video_name = None - expected_filename = f"lora_{lora_nickname}_{prompt[:50]}.mp4" - - for filename in os.listdir(reference_folder): - if filename.endswith('.mp4') and lora_nickname in filename and prompt[:50] in filename: - reference_video_name = filename - break - - if not reference_video_name: - logger.error(f"Reference video not found for LoRA: {lora_nickname} with prompt: {prompt[:50]} and backend: {ATTENTION_BACKEND}") - raise FileNotFoundError(f"Reference video missing for LoRA {lora_nickname}") - - reference_video_path = os.path.join(reference_folder, reference_video_name) - generated_video_path = os.path.join(output_dir, output_video_name) - - logger.info( - f"Computing SSIM between {reference_video_path} and {generated_video_path}" - ) - ssim_values = compute_video_ssim_torchvision(reference_video_path, - generated_video_path, - use_ms_ssim=True) - - mean_ssim = ssim_values[0] - logger.info(f"SSIM mean value: {mean_ssim}") - logger.info(f"Writing SSIM results to directory: {output_dir}") - - success = write_ssim_results(output_dir, ssim_values, reference_video_path, - generated_video_path, num_inference_steps, - prompt, lora_nickname) - - if not success: - logger.error("Failed to write SSIM results to file") - - min_acceptable_ssim = 0.95 - assert mean_ssim >= min_acceptable_ssim, f"SSIM value {mean_ssim} is below threshold {min_acceptable_ssim} for LoRA {lora_nickname}" - +] @pytest.mark.parametrize("lora_config", LORA_CONFIGS) -@pytest.mark.parametrize("ATTENTION_BACKEND", ["FLASH_ATTN", "TORCH_SDPA"]) +@pytest.mark.parametrize("ATTENTION_BACKEND", ["TORCH_SDPA"]) @pytest.mark.parametrize("model_id", list(MODEL_TO_PARAMS.keys())) def test_lora_switching_similarity(lora_config, ATTENTION_BACKEND, model_id): """ @@ -214,7 +82,7 @@ def test_lora_switching_similarity(lora_config, ATTENTION_BACKEND, model_id): base_output_dir = os.path.join(script_dir, 'generated_videos', model_id) output_dir = os.path.join(base_output_dir, ATTENTION_BACKEND, 'lora_switching') - output_video_name = f"lora_switch_{lora_config['lora_nickname']}_{lora_config['prompt'][:50]}.mp4" + output_video_name = f"lora_{lora_config['lora_path']}_{lora_config['prompt'][:50]}.mp4" os.makedirs(output_dir, exist_ok=True) @@ -232,6 +100,7 @@ def test_lora_switching_similarity(lora_config, ATTENTION_BACKEND, model_id): "tp_size": BASE_PARAMS["tp_size"], "lora_path": lora_path, "lora_nickname": lora_nickname, + "use_cpu_offload": True, } if BASE_PARAMS.get("vae_sp"): init_kwargs["vae_sp"] = True @@ -252,77 +121,65 @@ def test_lora_switching_similarity(lora_config, ATTENTION_BACKEND, model_id): "negative_prompt": negative_prompt, "save_video": True, } - generator = VideoGenerator.from_pretrained(model_path=BASE_PARAMS["model_path"], **init_kwargs) - - # Generate first video with initial LoRA - generator.generate_video(prompt, **generation_kwargs) - - # Switch to a different LoRA and generate second video - if lora_nickname == "steamboat": - new_lora_path = "motimalu/wan-flat-color-1.3b-v2" - new_lora_nickname = "flat_color" - new_prompt = "flat color, no lineart, blending, negative space, artist:[john kafka|ponsuke kaikai|hara id 21|yoneyama mai|fuzichoco], 1girl, sakura miko, pink hair, cowboy shot, white shirt, floral print, off shoulder, outdoors, cherry blossom, tree shade, wariza, looking up, falling petals, half-closed eyes, white sky, clouds, live2d animation, upper body, high quality cinematic video of a woman sitting under a sakura tree. Dreamy and lonely, the camera close-ups on the face of the woman as she turns towards the viewer. The Camera is steady, This is a cowboy shot. The animation is smooth and fluid." - new_negative_prompt = "bad quality video,色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走" - else: - new_lora_path = "benjamin-paine/steamboat-willie-1.3b" - new_lora_nickname = "steamboat" - new_prompt = "steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a melting red candle. the mood is one of wonder and curiosity, as the monster gazes at the flame with wide eyes and open mouth. Its pose and expression convey a sense of innocence and playfulness, as if it is exploring the world around it for the first time. The use of warm colors and dramatic lighting further enhances the cozy atmosphere of the image." - new_negative_prompt = "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走" - - generator.set_lora_adapter(lora_nickname=new_lora_nickname, lora_path=new_lora_path) - - generation_kwargs["negative_prompt"] = new_negative_prompt - output_video_name_switch = f"lora_switch_{new_lora_nickname}_{new_prompt[:50]}.mp4" - generation_kwargs["output_path"] = output_dir - - generator.generate_video(new_prompt, **generation_kwargs) - - if isinstance(generator.executor, MultiprocExecutor): - generator.executor.shutdown() - - assert os.path.exists( - output_dir), f"Output video was not generated at {output_dir}" - - reference_folder = os.path.join(script_dir, 'reference_videos', model_id, ATTENTION_BACKEND, 'lora_switching') - - if not os.path.exists(reference_folder): - logger.error("Reference folder missing") - raise FileNotFoundError( - f"Reference video folder does not exist: {reference_folder}") + for lora_config in LORA_SWITCH_CONFIGS: + lora_nickname = lora_config["lora_nickname"] + lora_path = lora_config["lora_path"] + prompt = lora_config["prompt"] + negative_prompt = lora_config["negative_prompt"] + + generator.set_lora_adapter(lora_nickname=lora_nickname, lora_path=lora_path) + generation_kwargs["negative_prompt"] = negative_prompt + output_video_name_switch = f"lora_switch_{lora_nickname}_{prompt[:50]}.mp4" + generation_kwargs["output_path"] = output_dir + + generator.generate_video(prompt, **generation_kwargs) + + if isinstance(generator.executor, MultiprocExecutor): + generator.executor.shutdown() + + assert os.path.exists( + output_dir), f"Output video was not generated at {output_dir}" + + reference_folder = os.path.join(script_dir, 'reference_videos', model_id, ATTENTION_BACKEND, 'lora_switching') + + if not os.path.exists(reference_folder): + logger.error("Reference folder missing") + raise FileNotFoundError( + f"Reference video folder does not exist: {reference_folder}") + + # Find the matching reference video for the switched LoRA + reference_video_name = None + + for filename in os.listdir(reference_folder): + if filename.endswith('.mp4') and lora_nickname in filename and prompt[:50] in filename: + reference_video_name = filename + break + + if not reference_video_name: + logger.error(f"Reference video not found for adapter: {lora_path} with prompt: {prompt[:50]} and backend: {ATTENTION_BACKEND}") + raise FileNotFoundError(f"Reference video missing for adapter {lora_path}") + + reference_video_path = os.path.join(reference_folder, reference_video_name) + generated_video_path = os.path.join(output_dir, output_video_name_switch) - # Find the matching reference video for the switched LoRA - reference_video_name = None - - for filename in os.listdir(reference_folder): - if filename.endswith('.mp4') and new_lora_nickname in filename and new_prompt[:50] in filename: - reference_video_name = filename - break - - if not reference_video_name: - logger.error(f"Reference video not found for switched LoRA: {new_lora_nickname} with prompt: {new_prompt[:50]} and backend: {ATTENTION_BACKEND}") - raise FileNotFoundError(f"Reference video missing for switched LoRA {new_lora_nickname}") - - reference_video_path = os.path.join(reference_folder, reference_video_name) - generated_video_path = os.path.join(output_dir, output_video_name_switch) - - logger.info( - f"Computing SSIM between {reference_video_path} and {generated_video_path}" - ) - ssim_values = compute_video_ssim_torchvision(reference_video_path, - generated_video_path, - use_ms_ssim=True) + logger.info( + f"Computing SSIM between {reference_video_path} and {generated_video_path}" + ) + ssim_values = compute_video_ssim_torchvision(reference_video_path, + generated_video_path, + use_ms_ssim=True) - mean_ssim = ssim_values[0] - logger.info(f"SSIM mean value: {mean_ssim}") - logger.info(f"Writing SSIM results to directory: {output_dir}") + mean_ssim = ssim_values[0] + logger.info(f"SSIM mean value: {mean_ssim}") + logger.info(f"Writing SSIM results to directory: {output_dir}") - success = write_ssim_results(output_dir, ssim_values, reference_video_path, - generated_video_path, num_inference_steps, - new_prompt, new_lora_nickname) + success = write_ssim_results(output_dir, ssim_values, reference_video_path, + generated_video_path, num_inference_steps, + prompt, lora_nickname) - if not success: - logger.error("Failed to write SSIM results to file") + if not success: + logger.error("Failed to write SSIM results to file") - min_acceptable_ssim = 0.95 - assert mean_ssim >= min_acceptable_ssim, f"SSIM value {mean_ssim} is below threshold {min_acceptable_ssim} for switched LoRA {new_lora_nickname}" \ No newline at end of file + min_acceptable_ssim = 0.95 + assert mean_ssim >= min_acceptable_ssim, f"SSIM value {mean_ssim} is below threshold {min_acceptable_ssim} for adapter {lora_config['lora_path']}" diff --git a/fastvideo/v1/tests/ssim/test_inference_similarity.py b/fastvideo/v1/tests/ssim/test_inference_similarity.py index 45d6e6f36f..2913e4f27b 100644 --- a/fastvideo/v1/tests/ssim/test_inference_similarity.py +++ b/fastvideo/v1/tests/ssim/test_inference_similarity.py @@ -7,7 +7,7 @@ from fastvideo import VideoGenerator from fastvideo.v1.logger import init_logger -from fastvideo.v1.tests.utils import compute_video_ssim_torchvision +from fastvideo.v1.tests.utils import compute_video_ssim_torchvision, write_ssim_results from fastvideo.v1.worker.multiproc_executor import MultiprocExecutor logger = init_logger(__name__) @@ -99,44 +99,6 @@ ] -def write_ssim_results(output_dir, ssim_values, reference_path, generated_path, - num_inference_steps, prompt): - """ - Write SSIM results to a JSON file in the same directory as the generated videos. - """ - try: - logger.info( - f"Attempting to write SSIM results to directory: {output_dir}") - - if not os.path.exists(output_dir): - os.makedirs(output_dir, exist_ok=True) - - mean_ssim, min_ssim, max_ssim = ssim_values - - result = { - "mean_ssim": mean_ssim, - "min_ssim": min_ssim, - "max_ssim": max_ssim, - "reference_video": reference_path, - "generated_video": generated_path, - "parameters": { - "num_inference_steps": num_inference_steps, - "prompt": prompt - } - } - - test_name = f"steps{num_inference_steps}_{prompt[:100]}" - result_file = os.path.join(output_dir, f"{test_name}_ssim.json") - logger.info(f"Writing JSON results to: {result_file}") - with open(result_file, 'w') as f: - json.dump(result, f, indent=2) - - logger.info(f"SSIM results written to {result_file}") - return True - except Exception as e: - logger.error(f"ERROR writing SSIM results: {str(e)}") - return False - @pytest.mark.parametrize("prompt", I2V_TEST_PROMPTS) @pytest.mark.parametrize("ATTENTION_BACKEND", ["FLASH_ATTN", "TORCH_SDPA"]) diff --git a/fastvideo/v1/tests/utils.py b/fastvideo/v1/tests/utils.py index de45691c68..c08ba44f8a 100644 --- a/fastvideo/v1/tests/utils.py +++ b/fastvideo/v1/tests/utils.py @@ -1,12 +1,16 @@ # SPDX-License-Identifier: Apache-2.0 import argparse import os +import json +from fastvideo.v1.logger import init_logger import numpy as np import torch from pytorch_msssim import ms_ssim, ssim from torchvision.io import read_video +logger = init_logger(__name__) + def compute_video_ssim_torchvision(video1_path, video2_path, use_ms_ssim=True): """ @@ -118,3 +122,41 @@ def compare_folders(reference_folder, generated_folder, use_ms_ssim=True): ) return results + +def write_ssim_results(output_dir, ssim_values, reference_path, generated_path, + num_inference_steps, prompt): + """ + Write SSIM results to a JSON file in the same directory as the generated videos. + """ + try: + logger.info( + f"Attempting to write SSIM results to directory: {output_dir}") + + if not os.path.exists(output_dir): + os.makedirs(output_dir, exist_ok=True) + + mean_ssim, min_ssim, max_ssim = ssim_values + + result = { + "mean_ssim": mean_ssim, + "min_ssim": min_ssim, + "max_ssim": max_ssim, + "reference_video": reference_path, + "generated_video": generated_path, + "parameters": { + "num_inference_steps": num_inference_steps, + "prompt": prompt + } + } + + test_name = f"steps{num_inference_steps}_{prompt[:100]}" + result_file = os.path.join(output_dir, f"{test_name}_ssim.json") + logger.info(f"Writing JSON results to: {result_file}") + with open(result_file, 'w') as f: + json.dump(result, f, indent=2) + + logger.info(f"SSIM results written to {result_file}") + return True + except Exception as e: + logger.error(f"ERROR writing SSIM results: {str(e)}") + return False \ No newline at end of file diff --git a/fastvideo/v1/training/training_utils.py b/fastvideo/v1/training/training_utils.py index 3fd00af445..158dc82527 100644 --- a/fastvideo/v1/training/training_utils.py +++ b/fastvideo/v1/training/training_utils.py @@ -3,7 +3,7 @@ import math import os import time -from typing import Any, Dict, List, Optional, Tuple, Union +from typing import Any, Dict, Iterator, List, Optional, Tuple, Union import torch import torch.distributed as dist @@ -162,9 +162,8 @@ def save_checkpoint(transformer, weight_path, local_main_process_only=False) - # Convert fastvideo custom format to diffusers format and save - diffusers_state_dict = convert_custom_format_to_diffusers_format( - cpu_state, transformer) + # Convert training format to diffusers format and save + diffusers_state_dict = custom_to_hf_param_sd(cpu_state, transformer) save_file(diffusers_state_dict, weight_path) logger.info("rank: %s, consolidated checkpoint saved to %s", @@ -487,18 +486,21 @@ def _has_foreach_support(tensors: List[torch.Tensor], t is None or type(t) in [torch.Tensor] for t in tensors) -def convert_custom_format_to_diffusers_format(state_dict: Dict[str, Any], - transformer) -> Dict[str, Any]: +def custom_to_hf_param_sd(state_dict: Union[Dict[str, Any], + Iterator[Tuple[str, torch.Tensor]]], + transformer) -> Dict[str, Any]: """ - Convert fastvideo custom format state dict to diffusers format using reverse_param_names_mapping. + Convert fastvideo's custom model format to diffusers format using reverse_param_names_mapping. Args: - state_dict: State dict in training format + state_dict: State dict in fastvideo's custom format transformer: Transformer model object with _reverse_param_names_mapping Returns: State dict in diffusers format """ + if isinstance(state_dict, Dict): + state_dict = state_dict.items() new_state_dict = {} # Get the reverse mapping from the transformer diff --git a/pyproject.toml b/pyproject.toml index e22db6a912..7475ce916e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -78,12 +78,6 @@ exclude = ["assets*", "docker*", "docs", "scripts*"] [tool.wheel] exclude = ["assets*", "docker*", "docs", "scripts*"] -[tool.mypy] -warn_unused_configs = true -ignore_missing_imports = true -disallow_untyped_calls = true -check_untyped_defs = true -follow_imports = "silent" [tool.codespell] skip ="./data,./wandb,./csrc/sliding_tile_attention/tk" From 518ad09700ca08ba1bc5dc524bc3351e5e9a7f33 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Sun, 29 Jun 2025 18:32:50 -0700 Subject: [PATCH 04/43] fix fsdp lora merging bug --- fastvideo/v1/layers/lora/linear.py | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/fastvideo/v1/layers/lora/linear.py b/fastvideo/v1/layers/lora/linear.py index da608f228a..fe9c610aae 100644 --- a/fastvideo/v1/layers/lora/linear.py +++ b/fastvideo/v1/layers/lora/linear.py @@ -66,6 +66,7 @@ def merge_lora_weights(self) -> None: if isinstance(self.base_layer.weight, DTensor): mesh = self.base_layer.weight.data.device_mesh placements = self.base_layer.weight.data.placements + # Using offload param is on CPU, so current_device is for "CPU -> GPU -> merge -> CPU" current_device = self.base_layer.weight.data.device data = self.base_layer.weight.data.to( get_torch_device()).full_tensor() @@ -76,7 +77,8 @@ def merge_lora_weights(self) -> None: placements=placements).to(current_device)) else: current_device = self.base_layer.weight.data.device - data = self.base_layer.weight.data.to(get_torch_device()) + data = self.base_layer.weight.data.to( + get_torch_device()).full_tensor() data += \ (self.slice_lora_b_weights(self.lora_B) @ self.slice_lora_a_weights(self.lora_A)).to(data) self.base_layer.weight = nn.Parameter(data.to(current_device)) @@ -92,24 +94,18 @@ def unmerge_lora_weights(self) -> None: "LoRA weights not merged. Please merge them first before unmerging." ) - # Avoid precision loss - self.base_layer.weight.data = self.cpu_weight.data.to( - self.base_layer.weight) - + # To avoid precision loss we do not subtract the LoRA weights here if isinstance(self.base_layer.weight, DTensor): mesh = self.base_layer.weight.data.device_mesh placement = self.base_layer.weight.data.placements device = self.base_layer.weight.data.device - data = self.base_layer.weight.data.to( - get_torch_device()).full_tensor() - data -= self.slice_lora_b_weights( - self.lora_B) @ self.slice_lora_a_weights(self.lora_A) self.base_layer.weight = nn.Parameter( - distribute_tensor(data, mesh, placements=placement).to(device)) + distribute_tensor(self.cpu_weight.to(get_torch_device()), + mesh, + placements=placement).to(device)) else: - self.base_layer.weight.data -= \ - self.slice_lora_b_weights(self.lora_B) @\ - self.slice_lora_a_weights(self.lora_A) + self.base_layer.weight.data = self.cpu_weight.data.to( + self.base_layer.weight) self.merged = False From 3c24e6234e1fe015c117f5a8c1c808d76d1571d7 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Mon, 30 Jun 2025 12:35:02 -0700 Subject: [PATCH 05/43] fix --- fastvideo/v1/pipelines/lora_pipeline.py | 4 ++-- fastvideo/v1/pipelines/stages/text_encoding.py | 1 - fastvideo/v1/tests/lora/test_lora_inference_similarity.py | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/fastvideo/v1/pipelines/lora_pipeline.py b/fastvideo/v1/pipelines/lora_pipeline.py index d0d7e0aff1..cf7f4a9879 100644 --- a/fastvideo/v1/pipelines/lora_pipeline.py +++ b/fastvideo/v1/pipelines/lora_pipeline.py @@ -6,6 +6,7 @@ import torch.distributed as dist from safetensors.torch import load_file +from fastvideo.v1.distributed import get_torch_device from fastvideo.v1.fastvideo_args import FastVideoArgs from fastvideo.v1.layers.lora.linear import (BaseLayerWithLoRA, get_lora_layer, replace_submodule) @@ -28,7 +29,7 @@ class LoRAPipeline(ComposedPipelineBase): lora_layers: Dict[str, BaseLayerWithLoRA] = {} fastvideo_args: FastVideoArgs exclude_lora_layers: List[str] = [] - device: torch.device = torch.device(f"cuda:{torch.cuda.current_device()}") + device: torch.device = get_torch_device() def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -52,7 +53,6 @@ def convert_to_lora_layers(self) -> None: """ Converts the transformer to a LoRA transformer. """ - for name, layer in self.modules["transformer"].named_modules(): if not self.is_target_layer(name): continue diff --git a/fastvideo/v1/pipelines/stages/text_encoding.py b/fastvideo/v1/pipelines/stages/text_encoding.py index 0e5e141257..5d0328d05e 100644 --- a/fastvideo/v1/pipelines/stages/text_encoding.py +++ b/fastvideo/v1/pipelines/stages/text_encoding.py @@ -79,7 +79,6 @@ def forward( output_hidden_states=True, ) prompt_embeds = postprocess_func(outputs) - batch.prompt_embeds.append(prompt_embeds) if batch.prompt_attention_mask is not None: batch.prompt_attention_mask.append(attention_mask) diff --git a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py index b68254887e..6e453f7c51 100644 --- a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py +++ b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py @@ -15,7 +15,7 @@ # Base parameters for LoRA inference tests WAN_LORA_PARAMS = { - "num_gpus": 2, + "num_gpus": 1, "model_path": "Wan-AI/Wan2.1-T2V-1.3B-Diffusers", "height": 480, "width": 832, From e6607da5926c724dbad5e6795e47456ec42bebb5 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Tue, 1 Jul 2025 14:02:31 -0700 Subject: [PATCH 06/43] addd weight check --- .../lora/test_lora_inference_similarity.py | 71 ++++++++++++------- 1 file changed, 47 insertions(+), 24 deletions(-) diff --git a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py index 6e453f7c51..bcd1f1ec81 100644 --- a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py +++ b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py @@ -8,8 +8,12 @@ from fastvideo.v1.logger import init_logger from fastvideo.v1.tests.utils import compute_video_ssim_torchvision, write_ssim_results from fastvideo.v1.worker.multiproc_executor import MultiprocExecutor -from diffusers import AutoencoderKLWan, WanPipeline +from diffusers import AutoencoderKL, DiffusionPipeline from diffusers.schedulers.scheduling_unipc_multistep import UniPCMultistepScheduler +from fastvideo.v1.fastvideo_args import FastVideoArgs +from fastvideo.v1.pipelines import build_pipeline +from fastvideo.v1.models.loader.utils import hf_to_custom_param_sd +from torch.testing import assert_close logger = init_logger(__name__) @@ -19,18 +23,16 @@ "model_path": "Wan-AI/Wan2.1-T2V-1.3B-Diffusers", "height": 480, "width": 832, - "num_frames": 81, + "num_frames": 45, "num_inference_steps": 32, "guidance_scale": 5.0, "embedded_cfg_scale": 6, "flow_shift": 7.0, "seed": 1024, - "sp_size": 2, - "tp_size": 2, - "vae_sp": True, "fps": 24, "neg_prompt": "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走", - "text-encoder-precision": ("fp32",) + "text-encoder-precision": ("fp32",), + "use_cpu_offload": True, } # LoRA configurations for testing @@ -53,25 +55,10 @@ "Wan2.1-T2V-1.3B-Diffusers": WAN_LORA_PARAMS, } -LORA_SWITCH_CONFIGS = [ - { - "lora_path": "motimalu/wan-flat-color-1.3b-v2", - "lora_nickname": "flat_color", - "prompt": "flat color, no lineart, blending, negative space, artist:[john kafka|ponsuke kaikai|hara id 21|yoneyama mai|fuzichoco], 1girl, sakura miko, pink hair, cowboy shot, white shirt, floral print, off shoulder, outdoors, cherry blossom, tree shade, wariza, looking up, falling petals, half-closed eyes, white sky, clouds, live2d animation, upper body, high quality cinematic video of a woman sitting under a sakura tree. Dreamy and lonely, the camera close-ups on the face of the woman as she turns towards the viewer. The Camera is steady, This is a cowboy shot. The animation is smooth and fluid.", - "negative_prompt": "bad quality video,色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走" - }, - { - "lora_path": "benjamin-paine/steamboat-willie-1.3b", - "lora_nickname": "steamboat", - "prompt": "steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a melting red candle. the mood is one of wonder and curiosity, as the monster gazes at the flame with wide eyes and open mouth. Its pose and expression convey a sense of innocence and playfulness, as if it is exploring the world around it for the first time. The use of warm colors and dramatic lighting further enhances the cozy atmosphere of the image.", - "negative_prompt": "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走" - } -] -@pytest.mark.parametrize("lora_config", LORA_CONFIGS) @pytest.mark.parametrize("ATTENTION_BACKEND", ["TORCH_SDPA"]) @pytest.mark.parametrize("model_id", list(MODEL_TO_PARAMS.keys())) -def test_lora_switching_similarity(lora_config, ATTENTION_BACKEND, model_id): +def test_lora_switching_similarity(ATTENTION_BACKEND, model_id): """ Test that runs LoRA inference with LoRA switching and compares the output to reference videos using SSIM. @@ -100,7 +87,7 @@ def test_lora_switching_similarity(lora_config, ATTENTION_BACKEND, model_id): "tp_size": BASE_PARAMS["tp_size"], "lora_path": lora_path, "lora_nickname": lora_nickname, - "use_cpu_offload": True, + "use_cpu_offload": BASE_PARAMS["use_cpu_offload"], } if BASE_PARAMS.get("vae_sp"): init_kwargs["vae_sp"] = True @@ -122,7 +109,7 @@ def test_lora_switching_similarity(lora_config, ATTENTION_BACKEND, model_id): "save_video": True, } generator = VideoGenerator.from_pretrained(model_path=BASE_PARAMS["model_path"], **init_kwargs) - for lora_config in LORA_SWITCH_CONFIGS: + for lora_config in LORA_CONFIGS: lora_nickname = lora_config["lora_nickname"] lora_path = lora_config["lora_path"] prompt = lora_config["prompt"] @@ -183,3 +170,39 @@ def test_lora_switching_similarity(lora_config, ATTENTION_BACKEND, model_id): min_acceptable_ssim = 0.95 assert mean_ssim >= min_acceptable_ssim, f"SSIM value {mean_ssim} is below threshold {min_acceptable_ssim} for adapter {lora_config['lora_path']}" + +@pytest.mark.parametrize("model_id", list(MODEL_TO_PARAMS.keys())) +@pytest.mark.parametrize("lora_config", LORA_CONFIGS) +def test_lora_weights(model_id, lora_config): + """ + Test that saves the LoRA weights to a file. + """ + hf_pipe = DiffusionPipeline.from_pretrained(model_id) + hf_pipe.enable_cpu_offload() + + for lora_config in LORA_CONFIGS: + lora_nickname = lora_config["lora_nickname"] + lora_path = lora_config["lora_path"] + args = FastVideoArgs.from_kwargs( + model_path=model_id, + use_cpu_offload=True, + ) + pipe = build_pipeline(args) + pipe.set_lora_adapter(lora_nickname, lora_path) + custom_transformer = pipe.modules["transformer"] + custom_state_dict = custom_transformer.state_dict() + + hf_pipe.load_lora_weights(lora_path, adapter_name=lora_nickname) + for name, layer in hf_pipe.named_modules(): + if hasattr(layer, "unmerge"): + layer.unmerge() + layer.merge(adapter_names=[lora_nickname]) + + hf_transformer = hf_pipe.transformer + hf_state_dict = hf_to_custom_param_sd(hf_transformer.state_dict()) + for key in hf_state_dict.keys(): + assert_close(hf_state_dict[key], custom_state_dict[key], atol=1e-4, rtol=1e-4) + + + + From 301c33770bd7aba65a95b1566bc875d5303987d4 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Wed, 2 Jul 2025 19:37:54 -0700 Subject: [PATCH 07/43] fix default text precision --- fastvideo/v1/configs/pipelines/base.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fastvideo/v1/configs/pipelines/base.py b/fastvideo/v1/configs/pipelines/base.py index 3e07e5c5a4..44bf5023c8 100644 --- a/fastvideo/v1/configs/pipelines/base.py +++ b/fastvideo/v1/configs/pipelines/base.py @@ -61,11 +61,11 @@ class PipelineConfig: image_encoder_precision: str = "fp32" # Text encoder configuration - DEFAULT_TEXT_ENCODER_PRECISIONS = ("fp16", ) + DEFAULT_TEXT_ENCODER_PRECISIONS = ("fp32", ) text_encoder_configs: Tuple[EncoderConfig, ...] = field( default_factory=lambda: (EncoderConfig(), )) text_encoder_precisions: Tuple[str, ...] = field( - default_factory=lambda: ("fp16", )) + default_factory=lambda: ("fp32", )) preprocess_text_funcs: Tuple[Callable[[str], str], ...] = field( default_factory=lambda: (preprocess_text, )) postprocess_text_funcs: Tuple[Callable[[BaseEncoderOutput], torch.tensor], From 4f8d699aef405f26a69d1f85f57621b9308bb603 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Thu, 3 Jul 2025 18:18:53 -0700 Subject: [PATCH 08/43] fixes --- fastvideo/v1/configs/models/dits/base.py | 6 +- .../v1/configs/models/dits/hunyuanvideo.py | 6 +- fastvideo/v1/configs/models/dits/stepvideo.py | 2 +- fastvideo/v1/configs/models/dits/wanvideo.py | 8 +- fastvideo/v1/entrypoints/video_generator.py | 2 +- fastvideo/v1/fastvideo_args.py | 2 +- fastvideo/v1/models/dits/base.py | 12 +- fastvideo/v1/models/dits/hunyuanvideo.py | 8 +- fastvideo/v1/models/dits/stepvideo.py | 12 +- fastvideo/v1/models/dits/wanvideo.py | 6 +- .../v1/models/loader/component_loader.py | 3 +- fastvideo/v1/models/loader/fsdp_load.py | 23 +- fastvideo/v1/models/loader/utils.py | 7 +- .../v1/pipelines/composed_pipeline_base.py | 2 +- fastvideo/v1/pipelines/lora_pipeline.py | 5 +- .../lora/test_lora_inference_similarity.py | 216 +++++++++--------- fastvideo/v1/training/training_utils.py | 4 +- fastvideo/v1/utils.py | 11 +- tests/test_data_preprocess.py | 113 --------- tests/test_save_checkpoint.py | 39 ---- tests/test_sequence_parallel.py | 111 --------- 21 files changed, 170 insertions(+), 428 deletions(-) delete mode 100644 tests/test_data_preprocess.py delete mode 100644 tests/test_save_checkpoint.py delete mode 100644 tests/test_sequence_parallel.py diff --git a/fastvideo/v1/configs/models/dits/base.py b/fastvideo/v1/configs/models/dits/base.py index fdc4c61ec7..4afdef30d8 100644 --- a/fastvideo/v1/configs/models/dits/base.py +++ b/fastvideo/v1/configs/models/dits/base.py @@ -11,9 +11,9 @@ class DiTArchConfig(ArchConfig): _fsdp_shard_conditions: list = field(default_factory=list) _compile_conditions: list = field(default_factory=list) - _param_names_mapping: dict = field(default_factory=dict) - _reverse_param_names_mapping: dict = field(default_factory=dict) - _lora_param_names_mapping: dict = field(default_factory=dict) + param_names_mapping: dict = field(default_factory=dict) + reverse_param_names_mapping: dict = field(default_factory=dict) + lora_param_names_mapping: dict = field(default_factory=dict) _supported_attention_backends: Tuple[AttentionBackendEnum, ...] = ( AttentionBackendEnum.SLIDING_TILE_ATTN, AttentionBackendEnum.SAGE_ATTN, AttentionBackendEnum.FLASH_ATTN, AttentionBackendEnum.TORCH_SDPA, diff --git a/fastvideo/v1/configs/models/dits/hunyuanvideo.py b/fastvideo/v1/configs/models/dits/hunyuanvideo.py index eaea9f9f7e..2c9a98c33d 100644 --- a/fastvideo/v1/configs/models/dits/hunyuanvideo.py +++ b/fastvideo/v1/configs/models/dits/hunyuanvideo.py @@ -32,7 +32,7 @@ class HunyuanVideoArchConfig(DiTArchConfig): _compile_conditions: list = field( default_factory=lambda: [is_double_block, is_single_block, is_txt_in]) - _param_names_mapping: dict = field( + param_names_mapping: dict = field( default_factory=lambda: { # 1. context_embedder.time_text_embed submodules (specific rules, applied first): r"^context_embedder\.time_text_embed\.timestep_embedder\.linear_1\.(.*)$": @@ -147,8 +147,8 @@ class HunyuanVideoArchConfig(DiTArchConfig): r"final_layer.linear.\1", }) - # Reverse mapping for saving checkpoints: training -> diffusers - _reverse_param_names_mapping: dict = field(default_factory=lambda: {}) + # Reverse mapping for saving checkpoints: custom -> hf + reverse_param_names_mapping: dict = field(default_factory=lambda: {}) patch_size: int = 2 patch_size_t: int = 1 diff --git a/fastvideo/v1/configs/models/dits/stepvideo.py b/fastvideo/v1/configs/models/dits/stepvideo.py index 78fc6b0b3f..72345689b7 100644 --- a/fastvideo/v1/configs/models/dits/stepvideo.py +++ b/fastvideo/v1/configs/models/dits/stepvideo.py @@ -11,7 +11,7 @@ class StepVideoArchConfig(DiTArchConfig): default_factory=lambda: [lambda n, m: "transformer_blocks" in n and n.split(".")[-1].isdigit()]) - _param_names_mapping: dict = field( + param_names_mapping: dict = field( default_factory=lambda: { # transformer block r"^transformer_blocks\.(\d+)\.norm1\.(weight|bias)$": diff --git a/fastvideo/v1/configs/models/dits/wanvideo.py b/fastvideo/v1/configs/models/dits/wanvideo.py index ea1048c1b0..4310d3c943 100644 --- a/fastvideo/v1/configs/models/dits/wanvideo.py +++ b/fastvideo/v1/configs/models/dits/wanvideo.py @@ -13,7 +13,7 @@ def is_blocks(n: str, m) -> bool: class WanVideoArchConfig(DiTArchConfig): _fsdp_shard_conditions: list = field(default_factory=lambda: [is_blocks]) - _param_names_mapping: dict = field( + param_names_mapping: dict = field( default_factory=lambda: { r"^patch_embedding\.(.*)$": r"patch_embedding.proj.\1", @@ -53,12 +53,12 @@ class WanVideoArchConfig(DiTArchConfig): r"blocks.\1.self_attn_residual_norm.norm.\2", }) - # Reverse mapping for saving checkpoints: training -> diffusers - _reverse_param_names_mapping: dict = field(default_factory=lambda: {}) + # Reverse mapping for saving checkpoints: custom -> hf + reverse_param_names_mapping: dict = field(default_factory=lambda: {}) # Some LoRA adapters use the original official layer names instead of hf layer names, # so apply this before the param_names_mapping - _lora_param_names_mapping: dict = field( + lora_param_names_mapping: dict = field( default_factory=lambda: { r"^blocks\.(\d+)\.self_attn\.q\.(.*)$": r"blocks.\1.attn1.to_q.\2", r"^blocks\.(\d+)\.self_attn\.k\.(.*)$": r"blocks.\1.attn1.to_k.\2", diff --git a/fastvideo/v1/entrypoints/video_generator.py b/fastvideo/v1/entrypoints/video_generator.py index 3f540bccae..9221b8c2ac 100644 --- a/fastvideo/v1/entrypoints/video_generator.py +++ b/fastvideo/v1/entrypoints/video_generator.py @@ -71,7 +71,7 @@ def from_pretrained(cls, """ # If users also provide some kwargs, it will override the FastVideoArgs and PipelineConfig. kwargs['model_path'] = model_path - fastvideo_args = FastVideoArgs.from_kwargs(kwargs) + fastvideo_args = FastVideoArgs.from_kwargs(**kwargs) return cls.from_fastvideo_args(fastvideo_args) diff --git a/fastvideo/v1/fastvideo_args.py b/fastvideo/v1/fastvideo_args.py index 616466e708..11acfc2025 100644 --- a/fastvideo/v1/fastvideo_args.py +++ b/fastvideo/v1/fastvideo_args.py @@ -280,7 +280,7 @@ def from_cli_args(cls, args: argparse.Namespace) -> "FastVideoArgs": return cls(**kwargs) # type: ignore @classmethod - def from_kwargs(cls, kwargs: Dict[str, Any]) -> "FastVideoArgs": + def from_kwargs(cls, **kwargs: Any) -> "FastVideoArgs": kwargs['pipeline_config'] = PipelineConfig.from_kwargs(kwargs) return cls(**kwargs) diff --git a/fastvideo/v1/models/dits/base.py b/fastvideo/v1/models/dits/base.py index e6ae9cd80b..f5bb2e47ef 100644 --- a/fastvideo/v1/models/dits/base.py +++ b/fastvideo/v1/models/dits/base.py @@ -13,8 +13,8 @@ class BaseDiT(nn.Module, ABC): _fsdp_shard_conditions: list = [] _compile_conditions: list = [] - _param_names_mapping: dict - _reverse_param_names_mapping: dict + param_names_mapping: dict + reverse_param_names_mapping: dict hidden_size: int num_attention_heads: int num_channels_latents: int @@ -24,7 +24,7 @@ class BaseDiT(nn.Module, ABC): def __init_subclass__(cls) -> None: required_class_attrs = [ - "_fsdp_shard_conditions", "_param_names_mapping", + "_fsdp_shard_conditions", "param_names_mapping", "_compile_conditions" ] super().__init_subclass__() @@ -78,9 +78,9 @@ class CachableDiT(BaseDiT): """ # These are required class attributes that should be overridden by concrete implementations _fsdp_shard_conditions = [] - _param_names_mapping = {} - _reverse_param_names_mapping = {} - _lora_param_names_mapping: dict = {} + param_names_mapping = {} + reverse_param_names_mapping = {} + lora_param_names_mapping: dict = {} # Ensure these instance attributes are properly defined in subclasses hidden_size: int num_attention_heads: int diff --git a/fastvideo/v1/models/dits/hunyuanvideo.py b/fastvideo/v1/models/dits/hunyuanvideo.py index 3a04fee2f8..7355ae92ce 100644 --- a/fastvideo/v1/models/dits/hunyuanvideo.py +++ b/fastvideo/v1/models/dits/hunyuanvideo.py @@ -441,10 +441,10 @@ class HunyuanVideoTransformer3DModel(CachableDiT): _compile_conditions = HunyuanVideoConfig()._compile_conditions _supported_attention_backends = HunyuanVideoConfig( )._supported_attention_backends - _param_names_mapping = HunyuanVideoConfig()._param_names_mapping - _reverse_param_names_mapping = HunyuanVideoConfig( - )._reverse_param_names_mapping - _lora_param_names_mapping = HunyuanVideoConfig()._lora_param_names_mapping + param_names_mapping = HunyuanVideoConfig().param_names_mapping + reverse_param_names_mapping = HunyuanVideoConfig( + ).reverse_param_names_mapping + lora_param_names_mapping = HunyuanVideoConfig().lora_param_names_mapping def __init__(self, config: HunyuanVideoConfig, hf_config: dict[str, Any]): super().__init__(config=config, hf_config=hf_config) diff --git a/fastvideo/v1/models/dits/stepvideo.py b/fastvideo/v1/models/dits/stepvideo.py index d0ad9854ae..072c3164ac 100644 --- a/fastvideo/v1/models/dits/stepvideo.py +++ b/fastvideo/v1/models/dits/stepvideo.py @@ -455,11 +455,13 @@ def forward(self, class StepVideoModel(BaseDiT): # (Optional) Keep the same attribute for compatibility with splitting, etc. - _fsdp_shard_conditions = StepVideoConfig()._fsdp_shard_conditions - _param_names_mapping = StepVideoConfig()._param_names_mapping - _reverse_param_names_mapping = StepVideoConfig( - )._reverse_param_names_mapping - _lora_param_names_mapping = StepVideoConfig()._lora_param_names_mapping + _fsdp_shard_conditions = [ + lambda n, m: "transformer_blocks" in n and n.split(".")[-1].isdigit(), + # lambda n, m: "pos_embed" in n # If needed for the patch embedding. + ] + param_names_mapping = StepVideoConfig().param_names_mapping + reverse_param_names_mapping = StepVideoConfig().reverse_param_names_mapping + lora_param_names_mapping = StepVideoConfig().lora_param_names_mapping _supported_attention_backends = StepVideoConfig( )._supported_attention_backends diff --git a/fastvideo/v1/models/dits/wanvideo.py b/fastvideo/v1/models/dits/wanvideo.py index 039f57aba6..1e7d18e758 100644 --- a/fastvideo/v1/models/dits/wanvideo.py +++ b/fastvideo/v1/models/dits/wanvideo.py @@ -517,9 +517,9 @@ class WanTransformer3DModel(CachableDiT): _compile_conditions = WanVideoConfig()._compile_conditions _supported_attention_backends = WanVideoConfig( )._supported_attention_backends - _param_names_mapping = WanVideoConfig()._param_names_mapping - _reverse_param_names_mapping = WanVideoConfig()._reverse_param_names_mapping - _lora_param_names_mapping = WanVideoConfig()._lora_param_names_mapping + param_names_mapping = WanVideoConfig().param_names_mapping + reverse_param_names_mapping = WanVideoConfig().reverse_param_names_mapping + lora_param_names_mapping = WanVideoConfig().lora_param_names_mapping def __init__(self, config: WanVideoConfig, hf_config: dict[str, Any]) -> None: diff --git a/fastvideo/v1/models/loader/component_loader.py b/fastvideo/v1/models/loader/component_loader.py index 16bbf1efc1..c9506637af 100644 --- a/fastvideo/v1/models/loader/component_loader.py +++ b/fastvideo/v1/models/loader/component_loader.py @@ -428,9 +428,8 @@ def load(self, model_path: str, fastvideo_args: FastVideoArgs): hsdp_shard_dim=fastvideo_args.hsdp_shard_dim, cpu_offload=fastvideo_args.use_cpu_offload, fsdp_inference=fastvideo_args.use_fsdp_inference, - default_dtype=default_dtype, # TODO(will): make these configurable - param_dtype=torch.bfloat16, + param_dtype=default_dtype, reduce_dtype=torch.float32, output_dtype=None, training_mode=fastvideo_args.training_mode) diff --git a/fastvideo/v1/models/loader/fsdp_load.py b/fastvideo/v1/models/loader/fsdp_load.py index dd2de91303..5cbbba500b 100644 --- a/fastvideo/v1/models/loader/fsdp_load.py +++ b/fastvideo/v1/models/loader/fsdp_load.py @@ -19,7 +19,7 @@ from fastvideo.v1.logger import init_logger from fastvideo.v1.models.loader.utils import (get_param_names_mapping, - hf_to_custom_param_sd) + hf_to_custom_state_dict) from fastvideo.v1.models.loader.weight_utils import safetensors_weights_iterator from fastvideo.v1.utils import set_mixed_precision_policy @@ -62,7 +62,6 @@ def maybe_load_fsdp_model( device: torch.device, hsdp_replicate_dim: int, hsdp_shard_dim: int, - default_dtype: torch.dtype, param_dtype: torch.dtype, reduce_dtype: torch.dtype, cpu_offload: bool = False, @@ -81,12 +80,13 @@ def maybe_load_fsdp_model( output_dtype, cast_forward_inputs=False) - set_mixed_precision_policy(master_dtype=default_dtype, - param_dtype=param_dtype, - reduce_dtype=reduce_dtype, - output_dtype=output_dtype) + set_mixed_precision_policy( + param_dtype=param_dtype, + reduce_dtype=reduce_dtype, + output_dtype=output_dtype, + ) - with set_default_dtype(default_dtype), torch.device("meta"): + with set_default_dtype(param_dtype), torch.device("meta"): model = model_cls(**init_params) world_size = hsdp_replicate_dim * hsdp_shard_dim if not training_mode and not fsdp_inference: @@ -106,9 +106,8 @@ def maybe_load_fsdp_model( fsdp_shard_conditions=model._fsdp_shard_conditions, pin_cpu_memory=pin_cpu_memory) - weight_iterator = safetensors_weights_iterator(weight_dir_list, - to_cpu=cpu_offload) - param_names_mapping_fn = get_param_names_mapping(model._param_names_mapping) + weight_iterator = safetensors_weights_iterator(weight_dir_list) + param_names_mapping_fn = get_param_names_mapping(model.param_names_mapping) load_model_from_full_model_state_dict( model, weight_iterator, @@ -234,7 +233,7 @@ def load_model_from_full_model_state_dict( """ meta_sd = model.state_dict() sharded_sd = {} - custom_param_sd, reverse_param_names_mapping = hf_to_custom_param_sd( + custom_param_sd, reverse_param_names_mapping = hf_to_custom_state_dict( full_sd_iterator, param_names_mapping) for target_param_name, full_tensor in custom_param_sd.items(): meta_sharded_param = meta_sd.get(target_param_name) @@ -257,7 +256,7 @@ def load_model_from_full_model_state_dict( sharded_tensor = sharded_tensor.cpu() sharded_sd[target_param_name] = nn.Parameter(sharded_tensor) - model._reverse_param_names_mapping = reverse_param_names_mapping + model.reverse_param_names_mapping = reverse_param_names_mapping unused_keys = set(meta_sd.keys()) - set(sharded_sd.keys()) if unused_keys: logger.warning("Found unloaded parameters in meta state dict: %s", diff --git a/fastvideo/v1/models/loader/utils.py b/fastvideo/v1/models/loader/utils.py index 1a9db8e965..847d39ef0e 100644 --- a/fastvideo/v1/models/loader/utils.py +++ b/fastvideo/v1/models/loader/utils.py @@ -54,11 +54,11 @@ def mapping_fn(name: str) -> tuple[str, Any, Any]: return mapping_fn -def hf_to_custom_param_sd( +def hf_to_custom_state_dict( hf_param_sd: Union[Dict[str, torch.Tensor], Iterator[Tuple[str, torch.Tensor]]], param_names_mapping: Callable[[str], tuple[str, Any, Any]] -) -> Dict[str, torch.Tensor]: +) -> Tuple[Dict[str, torch.Tensor], Dict[str, Tuple[str, Any, Any]]]: """ Converts a Hugging Face parameter state dictionary to a custom parameter state dictionary. @@ -67,7 +67,8 @@ def hf_to_custom_param_sd( param_names_mapping (Callable[[str], tuple[str, Any, Any]]): A function that maps parameter names from source to target format Returns: - Dict[str, torch.Tensor]: The custom parameter state dictionary + custom_param_sd (Dict[str, torch.Tensor]): The custom formatted parameter state dict + reverse_param_names_mapping (Dict[str, Tuple[str, Any, Any]]): Maps back from custom to hf """ custom_param_sd = {} to_merge_params = defaultdict(dict) diff --git a/fastvideo/v1/pipelines/composed_pipeline_base.py b/fastvideo/v1/pipelines/composed_pipeline_base.py index 2d33ff6210..47b69b5bec 100644 --- a/fastvideo/v1/pipelines/composed_pipeline_base.py +++ b/fastvideo/v1/pipelines/composed_pipeline_base.py @@ -115,7 +115,7 @@ def from_pretrained(cls, if args is None or args.inference_mode: kwargs['model_path'] = model_path - fastvideo_args = FastVideoArgs.from_kwargs(kwargs) + fastvideo_args = FastVideoArgs.from_kwargs(**kwargs) else: assert args is not None, "args must be provided for training mode" fastvideo_args = TrainingArgs.from_cli_args(args) diff --git a/fastvideo/v1/pipelines/lora_pipeline.py b/fastvideo/v1/pipelines/lora_pipeline.py index cf7f4a9879..51d0483861 100644 --- a/fastvideo/v1/pipelines/lora_pipeline.py +++ b/fastvideo/v1/pipelines/lora_pipeline.py @@ -91,9 +91,9 @@ def set_lora_adapter(self, lora_state_dict = load_file(lora_local_path) # Map the hf layer names to our custom layer names param_names_mapping_fn = get_param_names_mapping( - self.modules["transformer"]._param_names_mapping) + self.modules["transformer"].param_names_mapping) lora_param_names_mapping_fn = get_param_names_mapping( - self.modules["transformer"]._lora_param_names_mapping) + self.modules["transformer"].lora_param_names_mapping) to_merge_params: DefaultDict[Hashable, Dict[Any, Any]] = defaultdict(dict) @@ -119,6 +119,7 @@ def set_lora_adapter(self, else: continue if target_name in self.lora_adapters[lora_nickname]: + torch.distributed.breakpoint() raise ValueError( f"Target name {target_name} already exists in lora_adapters[{lora_nickname}]" ) diff --git a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py index bcd1f1ec81..9d053dfdb5 100644 --- a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py +++ b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py @@ -12,10 +12,12 @@ from diffusers.schedulers.scheduling_unipc_multistep import UniPCMultistepScheduler from fastvideo.v1.fastvideo_args import FastVideoArgs from fastvideo.v1.pipelines import build_pipeline -from fastvideo.v1.models.loader.utils import hf_to_custom_param_sd +from fastvideo.v1.models.loader.utils import hf_to_custom_state_dict, get_param_names_mapping from torch.testing import assert_close logger = init_logger(__name__) +os.environ["MASTER_ADDR"] = "localhost" +os.environ["MASTER_PORT"] = "29500" # Base parameters for LoRA inference tests WAN_LORA_PARAMS = { @@ -52,133 +54,133 @@ ] MODEL_TO_PARAMS = { - "Wan2.1-T2V-1.3B-Diffusers": WAN_LORA_PARAMS, + "Wan-AI/Wan2.1-T2V-1.3B-Diffusers": WAN_LORA_PARAMS, } -@pytest.mark.parametrize("ATTENTION_BACKEND", ["TORCH_SDPA"]) -@pytest.mark.parametrize("model_id", list(MODEL_TO_PARAMS.keys())) -def test_lora_switching_similarity(ATTENTION_BACKEND, model_id): - """ - Test that runs LoRA inference with LoRA switching and compares the output - to reference videos using SSIM. - """ - os.environ["FASTVIDEO_ATTENTION_BACKEND"] = ATTENTION_BACKEND - - script_dir = os.path.dirname(os.path.abspath(__file__)) - - base_output_dir = os.path.join(script_dir, 'generated_videos', model_id) - output_dir = os.path.join(base_output_dir, ATTENTION_BACKEND, 'lora_switching') - output_video_name = f"lora_{lora_config['lora_path']}_{lora_config['prompt'][:50]}.mp4" - - os.makedirs(output_dir, exist_ok=True) - - BASE_PARAMS = MODEL_TO_PARAMS[model_id] - num_inference_steps = BASE_PARAMS["num_inference_steps"] - prompt = lora_config["prompt"] - negative_prompt = lora_config["negative_prompt"] - lora_path = lora_config["lora_path"] - lora_nickname = lora_config["lora_nickname"] - - init_kwargs = { - "num_gpus": BASE_PARAMS["num_gpus"], - "flow_shift": BASE_PARAMS["flow_shift"], - "sp_size": BASE_PARAMS["sp_size"], - "tp_size": BASE_PARAMS["tp_size"], - "lora_path": lora_path, - "lora_nickname": lora_nickname, - "use_cpu_offload": BASE_PARAMS["use_cpu_offload"], - } - if BASE_PARAMS.get("vae_sp"): - init_kwargs["vae_sp"] = True - init_kwargs["vae_tiling"] = True - if "text-encoder-precision" in BASE_PARAMS: - init_kwargs["text_encoder_precisions"] = BASE_PARAMS["text-encoder-precision"] - - generation_kwargs = { - "num_inference_steps": num_inference_steps, - "output_path": output_dir, - "height": BASE_PARAMS["height"], - "width": BASE_PARAMS["width"], - "num_frames": BASE_PARAMS["num_frames"], - "guidance_scale": BASE_PARAMS["guidance_scale"], - "embedded_cfg_scale": BASE_PARAMS["embedded_cfg_scale"], - "seed": BASE_PARAMS["seed"], - "fps": BASE_PARAMS["fps"], - "negative_prompt": negative_prompt, - "save_video": True, - } - generator = VideoGenerator.from_pretrained(model_path=BASE_PARAMS["model_path"], **init_kwargs) - for lora_config in LORA_CONFIGS: - lora_nickname = lora_config["lora_nickname"] - lora_path = lora_config["lora_path"] - prompt = lora_config["prompt"] - negative_prompt = lora_config["negative_prompt"] - - generator.set_lora_adapter(lora_nickname=lora_nickname, lora_path=lora_path) - generation_kwargs["negative_prompt"] = negative_prompt - output_video_name_switch = f"lora_switch_{lora_nickname}_{prompt[:50]}.mp4" - generation_kwargs["output_path"] = output_dir +# @pytest.mark.parametrize("ATTENTION_BACKEND", ["TORCH_SDPA"]) +# @pytest.mark.parametrize("model_id", list(MODEL_TO_PARAMS.keys())) +# def test_lora_switching_similarity(ATTENTION_BACKEND, model_id): +# """ +# Test that runs LoRA inference with LoRA switching and compares the output +# to reference videos using SSIM. +# """ +# os.environ["FASTVIDEO_ATTENTION_BACKEND"] = ATTENTION_BACKEND + +# script_dir = os.path.dirname(os.path.abspath(__file__)) + +# base_output_dir = os.path.join(script_dir, 'generated_videos', model_id) +# output_dir = os.path.join(base_output_dir, ATTENTION_BACKEND, 'lora_switching') +# output_video_name = f"lora_{lora_config['lora_path']}_{lora_config['prompt'][:50]}.mp4" + +# os.makedirs(output_dir, exist_ok=True) + +# BASE_PARAMS = MODEL_TO_PARAMS[model_id] +# num_inference_steps = BASE_PARAMS["num_inference_steps"] +# prompt = lora_config["prompt"] +# negative_prompt = lora_config["negative_prompt"] +# lora_path = lora_config["lora_path"] +# lora_nickname = lora_config["lora_nickname"] + +# init_kwargs = { +# "num_gpus": BASE_PARAMS["num_gpus"], +# "flow_shift": BASE_PARAMS["flow_shift"], +# "sp_size": BASE_PARAMS["sp_size"], +# "tp_size": BASE_PARAMS["tp_size"], +# "lora_path": lora_path, +# "lora_nickname": lora_nickname, +# "use_cpu_offload": BASE_PARAMS["use_cpu_offload"], +# } +# if BASE_PARAMS.get("vae_sp"): +# init_kwargs["vae_sp"] = True +# init_kwargs["vae_tiling"] = True +# if "text-encoder-precision" in BASE_PARAMS: +# init_kwargs["text_encoder_precisions"] = BASE_PARAMS["text-encoder-precision"] + +# generation_kwargs = { +# "num_inference_steps": num_inference_steps, +# "output_path": output_dir, +# "height": BASE_PARAMS["height"], +# "width": BASE_PARAMS["width"], +# "num_frames": BASE_PARAMS["num_frames"], +# "guidance_scale": BASE_PARAMS["guidance_scale"], +# "embedded_cfg_scale": BASE_PARAMS["embedded_cfg_scale"], +# "seed": BASE_PARAMS["seed"], +# "fps": BASE_PARAMS["fps"], +# "negative_prompt": negative_prompt, +# "save_video": True, +# } +# generator = VideoGenerator.from_pretrained(model_path=BASE_PARAMS["model_path"], **init_kwargs) +# for lora_config in LORA_CONFIGS: +# lora_nickname = lora_config["lora_nickname"] +# lora_path = lora_config["lora_path"] +# prompt = lora_config["prompt"] +# negative_prompt = lora_config["negative_prompt"] + +# generator.set_lora_adapter(lora_nickname=lora_nickname, lora_path=lora_path) +# generation_kwargs["negative_prompt"] = negative_prompt +# output_video_name_switch = f"lora_switch_{lora_nickname}_{prompt[:50]}.mp4" +# generation_kwargs["output_path"] = output_dir - generator.generate_video(prompt, **generation_kwargs) +# generator.generate_video(prompt, **generation_kwargs) - if isinstance(generator.executor, MultiprocExecutor): - generator.executor.shutdown() +# if isinstance(generator.executor, MultiprocExecutor): +# generator.executor.shutdown() - assert os.path.exists( - output_dir), f"Output video was not generated at {output_dir}" +# assert os.path.exists( +# output_dir), f"Output video was not generated at {output_dir}" - reference_folder = os.path.join(script_dir, 'reference_videos', model_id, ATTENTION_BACKEND, 'lora_switching') +# reference_folder = os.path.join(script_dir, 'reference_videos', model_id, ATTENTION_BACKEND, 'lora_switching') - if not os.path.exists(reference_folder): - logger.error("Reference folder missing") - raise FileNotFoundError( - f"Reference video folder does not exist: {reference_folder}") +# if not os.path.exists(reference_folder): +# logger.error("Reference folder missing") +# raise FileNotFoundError( +# f"Reference video folder does not exist: {reference_folder}") - # Find the matching reference video for the switched LoRA - reference_video_name = None +# # Find the matching reference video for the switched LoRA +# reference_video_name = None - for filename in os.listdir(reference_folder): - if filename.endswith('.mp4') and lora_nickname in filename and prompt[:50] in filename: - reference_video_name = filename - break +# for filename in os.listdir(reference_folder): +# if filename.endswith('.mp4') and lora_nickname in filename and prompt[:50] in filename: +# reference_video_name = filename +# break - if not reference_video_name: - logger.error(f"Reference video not found for adapter: {lora_path} with prompt: {prompt[:50]} and backend: {ATTENTION_BACKEND}") - raise FileNotFoundError(f"Reference video missing for adapter {lora_path}") +# if not reference_video_name: +# logger.error(f"Reference video not found for adapter: {lora_path} with prompt: {prompt[:50]} and backend: {ATTENTION_BACKEND}") +# raise FileNotFoundError(f"Reference video missing for adapter {lora_path}") - reference_video_path = os.path.join(reference_folder, reference_video_name) - generated_video_path = os.path.join(output_dir, output_video_name_switch) +# reference_video_path = os.path.join(reference_folder, reference_video_name) +# generated_video_path = os.path.join(output_dir, output_video_name_switch) - logger.info( - f"Computing SSIM between {reference_video_path} and {generated_video_path}" - ) - ssim_values = compute_video_ssim_torchvision(reference_video_path, - generated_video_path, - use_ms_ssim=True) +# logger.info( +# f"Computing SSIM between {reference_video_path} and {generated_video_path}" +# ) +# ssim_values = compute_video_ssim_torchvision(reference_video_path, +# generated_video_path, +# use_ms_ssim=True) - mean_ssim = ssim_values[0] - logger.info(f"SSIM mean value: {mean_ssim}") - logger.info(f"Writing SSIM results to directory: {output_dir}") +# mean_ssim = ssim_values[0] +# logger.info(f"SSIM mean value: {mean_ssim}") +# logger.info(f"Writing SSIM results to directory: {output_dir}") - success = write_ssim_results(output_dir, ssim_values, reference_video_path, - generated_video_path, num_inference_steps, - prompt, lora_nickname) +# success = write_ssim_results(output_dir, ssim_values, reference_video_path, +# generated_video_path, num_inference_steps, +# prompt, lora_nickname) - if not success: - logger.error("Failed to write SSIM results to file") +# if not success: +# logger.error("Failed to write SSIM results to file") - min_acceptable_ssim = 0.95 - assert mean_ssim >= min_acceptable_ssim, f"SSIM value {mean_ssim} is below threshold {min_acceptable_ssim} for adapter {lora_config['lora_path']}" +# min_acceptable_ssim = 0.95 +# assert mean_ssim >= min_acceptable_ssim, f"SSIM value {mean_ssim} is below threshold {min_acceptable_ssim} for adapter {lora_config['lora_path']}" @pytest.mark.parametrize("model_id", list(MODEL_TO_PARAMS.keys())) -@pytest.mark.parametrize("lora_config", LORA_CONFIGS) +@pytest.mark.parametrize("lora_config", LORA_CONFIGS[0]) # test only one def test_lora_weights(model_id, lora_config): """ Test that saves the LoRA weights to a file. """ hf_pipe = DiffusionPipeline.from_pretrained(model_id) - hf_pipe.enable_cpu_offload() + hf_pipe.enable_model_cpu_offload() for lora_config in LORA_CONFIGS: lora_nickname = lora_config["lora_nickname"] @@ -186,6 +188,7 @@ def test_lora_weights(model_id, lora_config): args = FastVideoArgs.from_kwargs( model_path=model_id, use_cpu_offload=True, + dit_precision="fp32", ) pipe = build_pipeline(args) pipe.set_lora_adapter(lora_nickname, lora_path) @@ -193,13 +196,14 @@ def test_lora_weights(model_id, lora_config): custom_state_dict = custom_transformer.state_dict() hf_pipe.load_lora_weights(lora_path, adapter_name=lora_nickname) - for name, layer in hf_pipe.named_modules(): + for name, layer in hf_pipe.transformer.named_modules(): if hasattr(layer, "unmerge"): layer.unmerge() layer.merge(adapter_names=[lora_nickname]) hf_transformer = hf_pipe.transformer - hf_state_dict = hf_to_custom_param_sd(hf_transformer.state_dict()) + param_names_mapping = get_param_names_mapping(custom_transformer.param_names_mapping) + hf_state_dict, _ = hf_to_custom_state_dict(hf_transformer.state_dict(), param_names_mapping) for key in hf_state_dict.keys(): assert_close(hf_state_dict[key], custom_state_dict[key], atol=1e-4, rtol=1e-4) diff --git a/fastvideo/v1/training/training_utils.py b/fastvideo/v1/training/training_utils.py index 158dc82527..ffcf528ca5 100644 --- a/fastvideo/v1/training/training_utils.py +++ b/fastvideo/v1/training/training_utils.py @@ -494,7 +494,7 @@ def custom_to_hf_param_sd(state_dict: Union[Dict[str, Any], Args: state_dict: State dict in fastvideo's custom format - transformer: Transformer model object with _reverse_param_names_mapping + transformer: Transformer model object with reverse_param_names_mapping Returns: State dict in diffusers format @@ -504,7 +504,7 @@ def custom_to_hf_param_sd(state_dict: Union[Dict[str, Any], new_state_dict = {} # Get the reverse mapping from the transformer - reverse_param_names_mapping = transformer._reverse_param_names_mapping + reverse_param_names_mapping = transformer.reverse_param_names_mapping assert reverse_param_names_mapping != {}, "reverse_param_names_mapping is empty" # Group parameters that need to be split (merged parameters) diff --git a/fastvideo/v1/utils.py b/fastvideo/v1/utils.py index 2abd2ab7b8..a7e925c02c 100644 --- a/fastvideo/v1/utils.py +++ b/fastvideo/v1/utils.py @@ -684,7 +684,6 @@ def remote_breakpoint() -> None: @dataclass class MixedPrecisionState: - master_dtype: Optional[torch.dtype] = None param_dtype: Optional[torch.dtype] = None reduce_dtype: Optional[torch.dtype] = None output_dtype: Optional[torch.dtype] = None @@ -702,10 +701,11 @@ def get_mixed_precision_state() -> MixedPrecisionState: return cast(MixedPrecisionState, _mixed_precision_state.state) -def set_mixed_precision_policy(master_dtype: torch.dtype, - param_dtype: torch.dtype, - reduce_dtype: torch.dtype, - output_dtype: Optional[torch.dtype] = None): +def set_mixed_precision_policy( + param_dtype: torch.dtype, + reduce_dtype: torch.dtype, + output_dtype: Optional[torch.dtype] = None, +): """Set mixed precision policy globally. Args: @@ -714,7 +714,6 @@ def set_mixed_precision_policy(master_dtype: torch.dtype, output_dtype: Optional output dtype """ state = MixedPrecisionState( - master_dtype=master_dtype, param_dtype=param_dtype, reduce_dtype=reduce_dtype, output_dtype=output_dtype, diff --git a/tests/test_data_preprocess.py b/tests/test_data_preprocess.py deleted file mode 100644 index 3fdf33b60a..0000000000 --- a/tests/test_data_preprocess.py +++ /dev/null @@ -1,113 +0,0 @@ -import os -import unittest - -import torch -from transformers import AutoTokenizer, T5EncoderModel - -from fastvideo.models.hunyuan.vae.autoencoder_kl_causal_3d import AutoencoderKLCausal3D - - -class TestAutoencoderKLCausal3D(unittest.TestCase): - - @classmethod - def setUpClass(cls): - """ - setUpClass is called once, before any test is run. - We can set environment variables or load heavy resources here. - """ - os.environ["HF_HUB_DISABLE_PROGRESS_BARS"] = "1" - - # Load tokenizer/model that can be reused across all tests - cls.tokenizer = AutoTokenizer.from_pretrained("hf-internal-testing/tiny-random-t5") - cls.text_encoder = T5EncoderModel.from_pretrained("hf-internal-testing/tiny-random-t5") - - def setUp(self): - """ - setUp is called before each test method to prepare fresh state. - """ - self.batch_size = 1 - self.init_time_len = 9 - self.init_height = 16 - self.init_width = 16 - self.latent_channels = 4 - self.spatial_compression_ratio = 8 - self.time_compression_ratio = 4 - - # Model initialization config - self.init_dict = { - "in_channels": - 3, - "out_channels": - 3, - "latent_channels": - self.latent_channels, - "down_block_types": ( - "DownEncoderBlockCausal3D", - "DownEncoderBlockCausal3D", - "DownEncoderBlockCausal3D", - "DownEncoderBlockCausal3D", - ), - "up_block_types": ( - "UpDecoderBlockCausal3D", - "UpDecoderBlockCausal3D", - "UpDecoderBlockCausal3D", - "UpDecoderBlockCausal3D", - ), - "block_out_channels": (8, 8, 8, 8), - "layers_per_block": - 1, - "act_fn": - "silu", - "norm_num_groups": - 4, - "scaling_factor": - 0.476986, - "spatial_compression_ratio": - self.spatial_compression_ratio, - "time_compression_ratio": - self.time_compression_ratio, - "mid_block_add_attention": - True, - } - - # Instantiate the model - self.model = AutoencoderKLCausal3D(**self.init_dict) - - # Create a random input tensor - self.input_tensor = torch.rand(self.batch_size, 3, self.init_time_len, self.init_height, self.init_width) - - def test_encode_shape(self): - """ - Check that the shape of the encoded output matches expectations. - """ - vae_encoder_output = self.model.encode(self.input_tensor) - - # The distribution from the VAE has a .sample() method - # so we verify the shape of that sample. - sample_shape = vae_encoder_output["latent_dist"].sample().shape - - # We expect shape: [batch_size, latent_channels, - # (init_time_len // time_compression_ratio) + 1, - # init_height // spatial_compression_ratio, - # init_width // spatial_compression_ratio] - expected_shape = ( - self.batch_size, - self.latent_channels, - (self.init_time_len // self.time_compression_ratio) + 1, - self.init_height // self.spatial_compression_ratio, - self.init_width // self.spatial_compression_ratio, - ) - - # (Optional) Print them if you like, or just rely on assertions: - print(f"sample_shape: {sample_shape}") - print(f"expected_shape: {expected_shape}") - - self.assertEqual( - sample_shape, - expected_shape, - f"Encoded sample shape {sample_shape} does not match {expected_shape}.", - ) - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/test_save_checkpoint.py b/tests/test_save_checkpoint.py deleted file mode 100644 index 49b47d18ad..0000000000 --- a/tests/test_save_checkpoint.py +++ /dev/null @@ -1,39 +0,0 @@ -import os -import shutil - -import pytest -import torch -import torch.distributed as dist -from torch.distributed.fsdp import FullyShardedDataParallel as FSDP - - -@pytest.fixture(scope="module", autouse=True) -def setup_distributed(): - os.environ["RANK"] = "0" - os.environ["WORLD_SIZE"] = "1" - os.environ["LOCAL_RANK"] = "0" - os.environ["MASTER_ADDR"] = "127.0.0.1" - os.environ["MASTER_PORT"] = "12345" - - dist.init_process_group("nccl") - yield - dist.destroy_process_group() - - -@pytest.mark.skipif(not torch.cuda.is_available(), reason="Requires at least 2 GPUs to run NCCL tests") -def test_save_and_remove_checkpoint(): - from fastvideo.models.mochi_hf.modeling_mochi import MochiTransformer3DModel - from fastvideo.utils.checkpoint import save_checkpoint - from fastvideo.utils.fsdp_util import get_dit_fsdp_kwargs - - transformer = MochiTransformer3DModel(num_layers=0) - fsdp_kwargs, _ = get_dit_fsdp_kwargs(transformer, "none") - transformer = FSDP(transformer, **fsdp_kwargs) - - test_folder = "./test_checkpoint" - save_checkpoint(transformer, 0, test_folder, 0) - - assert os.path.exists(test_folder), "Checkpoint folder was not created." - - shutil.rmtree(test_folder) - assert not os.path.exists(test_folder), "Checkpoint folder still exists." diff --git a/tests/test_sequence_parallel.py b/tests/test_sequence_parallel.py deleted file mode 100644 index 3f83782901..0000000000 --- a/tests/test_sequence_parallel.py +++ /dev/null @@ -1,111 +0,0 @@ -from functools import partial -from multiprocessing import Manager - -import pytest -import torch -import torch.distributed as dist -import torch.multiprocessing as mp - -from fastvideo.utils.communications import nccl_info, prepare_sequence_parallel_data - - -def _init_distributed_test_gpu(rank, world_size, backend, port, data, results): - dist.init_process_group( - backend=backend, - init_method=f"tcp://127.0.0.1:{port}", - world_size=world_size, - rank=rank, - ) - - device = torch.device(f"cuda:{rank}") - - nccl_info.sp_size = world_size - nccl_info.rank_within_group = rank - nccl_info.group_id = 0 - - seq_group = dist.new_group(ranks=list(range(world_size))) - nccl_info.group = seq_group - - hidden_states, encoder_hidden_states, attention_mask, encoder_attention_mask = data - hidden_states = hidden_states[rank].unsqueeze(dim=0).to(device) - encoder_hidden_states = encoder_hidden_states.to(device) - attention_mask = attention_mask.to(device) - encoder_attention_mask = encoder_attention_mask.to(device) - print(f"Rank {rank} input hidden_states:\n", hidden_states) - print(f"Rank {rank} input hidden_states shape:\n", hidden_states.shape) - out_hidden, out_encoder, out_attn_mask, out_encoder_mask = prepare_sequence_parallel_data( - hidden_states, encoder_hidden_states, attention_mask, encoder_attention_mask) - print(f"Rank {rank} output out_hidden:\n", out_hidden) - - shapes = ( - out_hidden.shape, - out_encoder.shape, - out_attn_mask.shape, - out_encoder_mask.shape, - ) - shape_tensor = torch.tensor([*shapes[0], *shapes[1], *shapes[2], *shapes[3]], dtype=torch.int32, device=device) - shape_list = [torch.zeros_like(shape_tensor) for _ in range(world_size)] - dist.all_gather(shape_list, shape_tensor, group=seq_group) - gathered_shapes = [tuple(s.tolist()) for s in shape_list] - out_hidden_cpu = out_hidden.to("cpu") - - results[rank] = { - "shapes": gathered_shapes, - "out_hidden": out_hidden_cpu, - } - - dist.barrier() - dist.destroy_process_group() - - -@pytest.mark.skipif(not torch.cuda.is_available() or torch.cuda.device_count() < 2, - reason="Requires at least 2 GPUs to run NCCL tests") -def test_prepare_sequence_parallel_data_gpu(): - world_size = 2 - backend = "nccl" - port = 12355 # or use a random free port if collisions occur - - # Create test tensors on CPU; the dimension at index=2 should be divisible by world_size=2 (if applicable). - hidden_states = torch.randn(2, 1, 2, 1, 1) - encoder_hidden_states = torch.randn(2, 2) - attention_mask = torch.randn(2, 2) - encoder_attention_mask = torch.randn(2, 2) - - print("init hidden states", hidden_states) - - manager = Manager() - results_dict = manager.dict() - - # Wrap our helper function with partial - mp_func = partial(_init_distributed_test_gpu, - world_size=world_size, - backend=backend, - port=port, - data=(hidden_states, encoder_hidden_states, attention_mask, encoder_attention_mask), - results=results_dict) - - # Spawn two GPU processes (rank=0, rank=1) - mp.spawn(mp_func, nprocs=world_size) - - first_rank_shapes = None - - overall_hidden_out = [] - - for rank in sorted(results_dict.keys()): - rank_data = results_dict[rank] - rank_shapes = rank_data["shapes"] - if first_rank_shapes is None: - first_rank_shapes = rank_shapes - assert rank_shapes == first_rank_shapes, ( - f"Mismatch in shapes across ranks: {rank_shapes} != {first_rank_shapes}") - overall_hidden_out.append(rank_data["out_hidden"]) - - overall_hidden_out = torch.cat(overall_hidden_out, dim=2) - print("overall_hidden_out", overall_hidden_out) - print("overall_hidden_out_shape", overall_hidden_out.shape) - - assert torch.allclose(hidden_states, torch.tensor(overall_hidden_out), rtol=1e-7, atol=1e-6) - - -if __name__ == "__main__": - test_prepare_sequence_parallel_data_gpu() From bbd388e395ef5defdf8dd16b1ccf84b81e1353db Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Thu, 3 Jul 2025 21:29:10 -0700 Subject: [PATCH 09/43] weight test passed --- fastvideo/v1/layers/lora/linear.py | 5 +- fastvideo/v1/pipelines/lora_pipeline.py | 3 +- .../lora/test_lora_inference_similarity.py | 67 ++++++++++--------- fastvideo/v1/training/training_utils.py | 20 +++--- 4 files changed, 47 insertions(+), 48 deletions(-) diff --git a/fastvideo/v1/layers/lora/linear.py b/fastvideo/v1/layers/lora/linear.py index fe9c610aae..c7ff948ff3 100644 --- a/fastvideo/v1/layers/lora/linear.py +++ b/fastvideo/v1/layers/lora/linear.py @@ -29,7 +29,6 @@ def __init__( self.lora_A: torch.Tensor = None self.lora_B: torch.Tensor = None self.merged: bool = False - self.weight = base_layer.weight self.cpu_weight = base_layer.weight.to("cpu") # indicates adapter weights don't contain this layer # (which shouldn't normally happen, but we want to separate it from the case of erroneous merging) @@ -104,8 +103,8 @@ def unmerge_lora_weights(self) -> None: mesh, placements=placement).to(device)) else: - self.base_layer.weight.data = self.cpu_weight.data.to( - self.base_layer.weight) + self.base_layer.weight = nn.Parameter( + self.cpu_weight.data.to(self.base_layer.weight)) self.merged = False diff --git a/fastvideo/v1/pipelines/lora_pipeline.py b/fastvideo/v1/pipelines/lora_pipeline.py index 51d0483861..fb7433005d 100644 --- a/fastvideo/v1/pipelines/lora_pipeline.py +++ b/fastvideo/v1/pipelines/lora_pipeline.py @@ -118,12 +118,11 @@ def set_lora_adapter(self, del to_merge_params[target_name] else: continue + if target_name in self.lora_adapters[lora_nickname]: - torch.distributed.breakpoint() raise ValueError( f"Target name {target_name} already exists in lora_adapters[{lora_nickname}]" ) - self.lora_adapters[lora_nickname][target_name] = weight.to( self.device) adapter_updated = True diff --git a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py index 9d053dfdb5..ed43fe7f7a 100644 --- a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py +++ b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py @@ -7,14 +7,12 @@ from fastvideo import VideoGenerator from fastvideo.v1.logger import init_logger from fastvideo.v1.tests.utils import compute_video_ssim_torchvision, write_ssim_results -from fastvideo.v1.worker.multiproc_executor import MultiprocExecutor -from diffusers import AutoencoderKL, DiffusionPipeline -from diffusers.schedulers.scheduling_unipc_multistep import UniPCMultistepScheduler +from diffusers import DiffusionPipeline from fastvideo.v1.fastvideo_args import FastVideoArgs from fastvideo.v1.pipelines import build_pipeline from fastvideo.v1.models.loader.utils import hf_to_custom_state_dict, get_param_names_mapping from torch.testing import assert_close - +from torch.distributed.tensor import DTensor logger = init_logger(__name__) os.environ["MASTER_ADDR"] = "localhost" os.environ["MASTER_PORT"] = "29500" @@ -174,39 +172,42 @@ # assert mean_ssim >= min_acceptable_ssim, f"SSIM value {mean_ssim} is below threshold {min_acceptable_ssim} for adapter {lora_config['lora_path']}" @pytest.mark.parametrize("model_id", list(MODEL_TO_PARAMS.keys())) -@pytest.mark.parametrize("lora_config", LORA_CONFIGS[0]) # test only one -def test_lora_weights(model_id, lora_config): +def test_lora_weights(model_id): """ Test that saves the LoRA weights to a file. """ + lora_config = LORA_CONFIGS[0] # test only one hf_pipe = DiffusionPipeline.from_pretrained(model_id) hf_pipe.enable_model_cpu_offload() - for lora_config in LORA_CONFIGS: - lora_nickname = lora_config["lora_nickname"] - lora_path = lora_config["lora_path"] - args = FastVideoArgs.from_kwargs( - model_path=model_id, - use_cpu_offload=True, - dit_precision="fp32", - ) - pipe = build_pipeline(args) - pipe.set_lora_adapter(lora_nickname, lora_path) - custom_transformer = pipe.modules["transformer"] - custom_state_dict = custom_transformer.state_dict() - - hf_pipe.load_lora_weights(lora_path, adapter_name=lora_nickname) - for name, layer in hf_pipe.transformer.named_modules(): - if hasattr(layer, "unmerge"): - layer.unmerge() - layer.merge(adapter_names=[lora_nickname]) - - hf_transformer = hf_pipe.transformer - param_names_mapping = get_param_names_mapping(custom_transformer.param_names_mapping) - hf_state_dict, _ = hf_to_custom_state_dict(hf_transformer.state_dict(), param_names_mapping) - for key in hf_state_dict.keys(): - assert_close(hf_state_dict[key], custom_state_dict[key], atol=1e-4, rtol=1e-4) - - - + lora_nickname = lora_config["lora_nickname"] + lora_path = lora_config["lora_path"] + args = FastVideoArgs.from_kwargs( + model_path=model_id, + use_cpu_offload=True, + dit_precision="fp32", + ) + pipe = build_pipeline(args) + pipe.set_lora_adapter(lora_nickname, lora_path) + custom_transformer = pipe.modules["transformer"] + custom_state_dict = custom_transformer.state_dict() + + hf_pipe.load_lora_weights(lora_path, adapter_name=lora_nickname) + for name, layer in hf_pipe.transformer.named_modules(): + if hasattr(layer, "unmerge"): + layer.unmerge() + layer.merge(adapter_names=[lora_nickname]) + + hf_transformer = hf_pipe.transformer + param_names_mapping = get_param_names_mapping(custom_transformer.param_names_mapping) + hf_state_dict, _ = hf_to_custom_state_dict(hf_transformer.state_dict(), param_names_mapping) + for key in hf_state_dict.keys(): + if "base_layer" not in key: + continue + hf_param = hf_state_dict[key] + custom_param = custom_state_dict[key].to_local() if isinstance(custom_state_dict[key], DTensor) else custom_state_dict[key] + assert_close(hf_param, custom_param, atol=1e-4, rtol=1e-4) + + + diff --git a/fastvideo/v1/training/training_utils.py b/fastvideo/v1/training/training_utils.py index ffcf528ca5..5b1b1713a5 100644 --- a/fastvideo/v1/training/training_utils.py +++ b/fastvideo/v1/training/training_utils.py @@ -163,7 +163,8 @@ def save_checkpoint(transformer, local_main_process_only=False) # Convert training format to diffusers format and save - diffusers_state_dict = custom_to_hf_param_sd(cpu_state, transformer) + diffusers_state_dict = custom_to_hf_state_dict( + cpu_state, transformer.reverse_param_names_mapping) save_file(diffusers_state_dict, weight_path) logger.info("rank: %s, consolidated checkpoint saved to %s", @@ -486,27 +487,26 @@ def _has_foreach_support(tensors: List[torch.Tensor], t is None or type(t) in [torch.Tensor] for t in tensors) -def custom_to_hf_param_sd(state_dict: Union[Dict[str, Any], - Iterator[Tuple[str, torch.Tensor]]], - transformer) -> Dict[str, Any]: +def custom_to_hf_state_dict( + state_dict: Union[Dict[str, Any], Iterator[Tuple[str, torch.Tensor]]], + reverse_param_names_mapping: Dict[str, Tuple[str, int, + int]]) -> Dict[str, Any]: """ Convert fastvideo's custom model format to diffusers format using reverse_param_names_mapping. Args: state_dict: State dict in fastvideo's custom format - transformer: Transformer model object with reverse_param_names_mapping + reverse_param_names_mapping: Reverse mapping from fastvideo's custom format to diffusers format Returns: State dict in diffusers format """ + assert len( + reverse_param_names_mapping) > 0, "reverse_param_names_mapping is empty" + if isinstance(state_dict, Dict): state_dict = state_dict.items() new_state_dict = {} - - # Get the reverse mapping from the transformer - reverse_param_names_mapping = transformer.reverse_param_names_mapping - assert reverse_param_names_mapping != {}, "reverse_param_names_mapping is empty" - # Group parameters that need to be split (merged parameters) merge_groups: Dict[str, List[Tuple[str, int, int]]] = {} From 649ec92190e1c052f66f1f11f01170f89608e20d Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Thu, 3 Jul 2025 21:35:55 -0700 Subject: [PATCH 10/43] fix --- .../lora/test_lora_inference_similarity.py | 205 +++++++++--------- 1 file changed, 101 insertions(+), 104 deletions(-) diff --git a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py index ed43fe7f7a..d1ab7481be 100644 --- a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py +++ b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py @@ -56,126 +56,123 @@ } -# @pytest.mark.parametrize("ATTENTION_BACKEND", ["TORCH_SDPA"]) -# @pytest.mark.parametrize("model_id", list(MODEL_TO_PARAMS.keys())) -# def test_lora_switching_similarity(ATTENTION_BACKEND, model_id): -# """ -# Test that runs LoRA inference with LoRA switching and compares the output -# to reference videos using SSIM. -# """ -# os.environ["FASTVIDEO_ATTENTION_BACKEND"] = ATTENTION_BACKEND - -# script_dir = os.path.dirname(os.path.abspath(__file__)) - -# base_output_dir = os.path.join(script_dir, 'generated_videos', model_id) -# output_dir = os.path.join(base_output_dir, ATTENTION_BACKEND, 'lora_switching') -# output_video_name = f"lora_{lora_config['lora_path']}_{lora_config['prompt'][:50]}.mp4" - -# os.makedirs(output_dir, exist_ok=True) - -# BASE_PARAMS = MODEL_TO_PARAMS[model_id] -# num_inference_steps = BASE_PARAMS["num_inference_steps"] -# prompt = lora_config["prompt"] -# negative_prompt = lora_config["negative_prompt"] -# lora_path = lora_config["lora_path"] -# lora_nickname = lora_config["lora_nickname"] - -# init_kwargs = { -# "num_gpus": BASE_PARAMS["num_gpus"], -# "flow_shift": BASE_PARAMS["flow_shift"], -# "sp_size": BASE_PARAMS["sp_size"], -# "tp_size": BASE_PARAMS["tp_size"], -# "lora_path": lora_path, -# "lora_nickname": lora_nickname, -# "use_cpu_offload": BASE_PARAMS["use_cpu_offload"], -# } -# if BASE_PARAMS.get("vae_sp"): -# init_kwargs["vae_sp"] = True -# init_kwargs["vae_tiling"] = True -# if "text-encoder-precision" in BASE_PARAMS: -# init_kwargs["text_encoder_precisions"] = BASE_PARAMS["text-encoder-precision"] - -# generation_kwargs = { -# "num_inference_steps": num_inference_steps, -# "output_path": output_dir, -# "height": BASE_PARAMS["height"], -# "width": BASE_PARAMS["width"], -# "num_frames": BASE_PARAMS["num_frames"], -# "guidance_scale": BASE_PARAMS["guidance_scale"], -# "embedded_cfg_scale": BASE_PARAMS["embedded_cfg_scale"], -# "seed": BASE_PARAMS["seed"], -# "fps": BASE_PARAMS["fps"], -# "negative_prompt": negative_prompt, -# "save_video": True, -# } -# generator = VideoGenerator.from_pretrained(model_path=BASE_PARAMS["model_path"], **init_kwargs) -# for lora_config in LORA_CONFIGS: -# lora_nickname = lora_config["lora_nickname"] -# lora_path = lora_config["lora_path"] -# prompt = lora_config["prompt"] -# negative_prompt = lora_config["negative_prompt"] - -# generator.set_lora_adapter(lora_nickname=lora_nickname, lora_path=lora_path) -# generation_kwargs["negative_prompt"] = negative_prompt -# output_video_name_switch = f"lora_switch_{lora_nickname}_{prompt[:50]}.mp4" -# generation_kwargs["output_path"] = output_dir +@pytest.mark.parametrize("ATTENTION_BACKEND", ["TORCH_SDPA"]) +@pytest.mark.parametrize("model_id", list(MODEL_TO_PARAMS.keys())) +def test_lora_switching_similarity(ATTENTION_BACKEND, model_id): + """ + Test that runs LoRA inference with LoRA switching and compares the output + to reference videos using SSIM. + """ + os.environ["FASTVIDEO_ATTENTION_BACKEND"] = ATTENTION_BACKEND + + script_dir = os.path.dirname(os.path.abspath(__file__)) + + base_output_dir = os.path.join(script_dir, 'generated_videos', model_id) + output_dir = os.path.join(base_output_dir, ATTENTION_BACKEND, 'lora_switching') + output_video_name = f"lora_{lora_config['lora_path']}_{lora_config['prompt'][:50]}.mp4" + + os.makedirs(output_dir, exist_ok=True) + + BASE_PARAMS = MODEL_TO_PARAMS[model_id] + num_inference_steps = BASE_PARAMS["num_inference_steps"] + prompt = lora_config["prompt"] + negative_prompt = lora_config["negative_prompt"] + lora_path = lora_config["lora_path"] + lora_nickname = lora_config["lora_nickname"] + + init_kwargs = { + "num_gpus": BASE_PARAMS["num_gpus"], + "flow_shift": BASE_PARAMS["flow_shift"], + "sp_size": BASE_PARAMS["sp_size"], + "tp_size": BASE_PARAMS["tp_size"], + "lora_path": lora_path, + "lora_nickname": lora_nickname, + "use_cpu_offload": BASE_PARAMS["use_cpu_offload"], + } + if BASE_PARAMS.get("vae_sp"): + init_kwargs["vae_sp"] = True + init_kwargs["vae_tiling"] = True + if "text-encoder-precision" in BASE_PARAMS: + init_kwargs["text_encoder_precisions"] = BASE_PARAMS["text-encoder-precision"] + + generation_kwargs = { + "num_inference_steps": num_inference_steps, + "output_path": output_dir, + "height": BASE_PARAMS["height"], + "width": BASE_PARAMS["width"], + "num_frames": BASE_PARAMS["num_frames"], + "guidance_scale": BASE_PARAMS["guidance_scale"], + "embedded_cfg_scale": BASE_PARAMS["embedded_cfg_scale"], + "seed": BASE_PARAMS["seed"], + "fps": BASE_PARAMS["fps"], + "negative_prompt": negative_prompt, + "save_video": True, + } + generator = VideoGenerator.from_pretrained(model_path=BASE_PARAMS["model_path"], **init_kwargs) + for lora_config in LORA_CONFIGS: + lora_nickname = lora_config["lora_nickname"] + lora_path = lora_config["lora_path"] + prompt = lora_config["prompt"] + negative_prompt = lora_config["negative_prompt"] + + generator.set_lora_adapter(lora_nickname=lora_nickname, lora_path=lora_path) + generation_kwargs["negative_prompt"] = negative_prompt + output_video_name_switch = f"lora_switch_{lora_nickname}_{prompt[:50]}.mp4" + generation_kwargs["output_path"] = output_dir -# generator.generate_video(prompt, **generation_kwargs) + generator.generate_video(prompt, **generation_kwargs) -# if isinstance(generator.executor, MultiprocExecutor): -# generator.executor.shutdown() + if isinstance(generator.executor, MultiprocExecutor): + generator.executor.shutdown() -# assert os.path.exists( -# output_dir), f"Output video was not generated at {output_dir}" + assert os.path.exists( + output_dir), f"Output video was not generated at {output_dir}" -# reference_folder = os.path.join(script_dir, 'reference_videos', model_id, ATTENTION_BACKEND, 'lora_switching') + reference_folder = os.path.join(script_dir, 'reference_videos', model_id, ATTENTION_BACKEND, 'lora_switching') -# if not os.path.exists(reference_folder): -# logger.error("Reference folder missing") -# raise FileNotFoundError( -# f"Reference video folder does not exist: {reference_folder}") + if not os.path.exists(reference_folder): + logger.error("Reference folder missing") + raise FileNotFoundError( + f"Reference video folder does not exist: {reference_folder}") -# # Find the matching reference video for the switched LoRA -# reference_video_name = None + # Find the matching reference video for the switched LoRA + reference_video_name = None -# for filename in os.listdir(reference_folder): -# if filename.endswith('.mp4') and lora_nickname in filename and prompt[:50] in filename: -# reference_video_name = filename -# break + for filename in os.listdir(reference_folder): + if filename.endswith('.mp4') and lora_nickname in filename and prompt[:50] in filename: + reference_video_name = filename + break -# if not reference_video_name: -# logger.error(f"Reference video not found for adapter: {lora_path} with prompt: {prompt[:50]} and backend: {ATTENTION_BACKEND}") -# raise FileNotFoundError(f"Reference video missing for adapter {lora_path}") + if not reference_video_name: + logger.error(f"Reference video not found for adapter: {lora_path} with prompt: {prompt[:50]} and backend: {ATTENTION_BACKEND}") + raise FileNotFoundError(f"Reference video missing for adapter {lora_path}") -# reference_video_path = os.path.join(reference_folder, reference_video_name) -# generated_video_path = os.path.join(output_dir, output_video_name_switch) + reference_video_path = os.path.join(reference_folder, reference_video_name) + generated_video_path = os.path.join(output_dir, output_video_name_switch) -# logger.info( -# f"Computing SSIM between {reference_video_path} and {generated_video_path}" -# ) -# ssim_values = compute_video_ssim_torchvision(reference_video_path, -# generated_video_path, -# use_ms_ssim=True) + logger.info( + f"Computing SSIM between {reference_video_path} and {generated_video_path}" + ) + ssim_values = compute_video_ssim_torchvision(reference_video_path, + generated_video_path, + use_ms_ssim=True) -# mean_ssim = ssim_values[0] -# logger.info(f"SSIM mean value: {mean_ssim}") -# logger.info(f"Writing SSIM results to directory: {output_dir}") + mean_ssim = ssim_values[0] + logger.info(f"SSIM mean value: {mean_ssim}") + logger.info(f"Writing SSIM results to directory: {output_dir}") -# success = write_ssim_results(output_dir, ssim_values, reference_video_path, -# generated_video_path, num_inference_steps, -# prompt, lora_nickname) + success = write_ssim_results(output_dir, ssim_values, reference_video_path, + generated_video_path, num_inference_steps, + prompt, lora_nickname) -# if not success: -# logger.error("Failed to write SSIM results to file") + if not success: + logger.error("Failed to write SSIM results to file") -# min_acceptable_ssim = 0.95 -# assert mean_ssim >= min_acceptable_ssim, f"SSIM value {mean_ssim} is below threshold {min_acceptable_ssim} for adapter {lora_config['lora_path']}" + min_acceptable_ssim = 0.95 + assert mean_ssim >= min_acceptable_ssim, f"SSIM value {mean_ssim} is below threshold {min_acceptable_ssim} for adapter {lora_config['lora_path']}" @pytest.mark.parametrize("model_id", list(MODEL_TO_PARAMS.keys())) -def test_lora_weights(model_id): - """ - Test that saves the LoRA weights to a file. - """ +def test_merge_lora_weights(model_id): lora_config = LORA_CONFIGS[0] # test only one hf_pipe = DiffusionPipeline.from_pretrained(model_id) hf_pipe.enable_model_cpu_offload() From 6493f177010b06a67a9f7a98f1cfddcaf6f6b070 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Fri, 4 Jul 2025 10:47:21 -0700 Subject: [PATCH 11/43] add modal --- fastvideo/v1/tests/modal/pr_test.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/fastvideo/v1/tests/modal/pr_test.py b/fastvideo/v1/tests/modal/pr_test.py index 08cc962bcd..7f4bf77092 100644 --- a/fastvideo/v1/tests/modal/pr_test.py +++ b/fastvideo/v1/tests/modal/pr_test.py @@ -94,6 +94,7 @@ def run_inference_tests_STA(): def run_precision_tests_STA(): run_test("python csrc/attn/tests/test_sta.py") -@app.function(gpu="H100:1", image=image, timeout=900) -def run_precision_tests_VSA(): - run_test("python csrc/attn/tests/test_block_sparse.py") + +@app.function(gpu="L40S:1", image=image, timeout=3600) +def run_lora_tests(): + run_test("pytest ./fastvideo/v1/tests/ssim/test_lora_inference_similarity.py -vs") \ No newline at end of file From 8b43e1b41ef1e48c1fea2ff371d4eb02cba3f0ac Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Fri, 4 Jul 2025 15:46:01 -0700 Subject: [PATCH 12/43] add ssim test --- fastvideo/v1/entrypoints/video_generator.py | 9 +++- fastvideo/v1/pipelines/lora_pipeline.py | 5 +- fastvideo/v1/pipelines/pipeline_batch_info.py | 2 +- .../lora/test_lora_inference_similarity.py | 36 +++++--------- fastvideo/v1/tests/utils.py | 4 ++ fastvideo/v1/worker/__init__.py | 5 ++ fastvideo/v1/worker/executor.py | 4 +- fastvideo/v1/worker/gpu_worker.py | 4 +- fastvideo/v1/worker/multiproc_executor.py | 4 +- hf_lora.py | 47 +++++++++++++++++++ 10 files changed, 87 insertions(+), 33 deletions(-) create mode 100644 fastvideo/v1/worker/__init__.py create mode 100644 hf_lora.py diff --git a/fastvideo/v1/entrypoints/video_generator.py b/fastvideo/v1/entrypoints/video_generator.py index 9221b8c2ac..17cfb465a3 100644 --- a/fastvideo/v1/entrypoints/video_generator.py +++ b/fastvideo/v1/entrypoints/video_generator.py @@ -110,6 +110,7 @@ def generate_video( prompt: The prompt to use for generation negative_prompt: The negative prompt to use (overrides the one in fastvideo_args) output_path: Path to save the video (overrides the one in fastvideo_args) + output_video_name: Name of the video file to save. Default is the first 100 characters of the prompt. save_video: Whether to save the video to disk return_frames: Whether to return the raw frames num_inference_steps: Number of denoising steps (overrides fastvideo_args) @@ -229,6 +230,7 @@ def generate_video( n_tokens=n_tokens, VSA_sparsity=fastvideo_args.VSA_sparsity, extra={}, + output_video_name=kwargs.get("output_video_name", prompt[:100]), ) # Run inference @@ -252,7 +254,8 @@ def generate_video( output_path = batch.output_path if output_path: os.makedirs(output_path, exist_ok=True) - video_path = os.path.join(output_path, f"{prompt[:100]}.mp4") + video_path = os.path.join(output_path, + f"{batch.output_video_name}.mp4") imageio.mimsave(video_path, frames, fps=batch.fps, format="mp4") logger.info("Saved video to %s", video_path) else: @@ -268,7 +271,9 @@ def generate_video( "generation_time": gen_time } - def set_lora_adapter(self, lora_nickname: str, lora_path: str) -> None: + def set_lora_adapter(self, + lora_nickname: str, + lora_path: str = None) -> None: self.executor.set_lora_adapter(lora_nickname, lora_path) def shutdown(self): diff --git a/fastvideo/v1/pipelines/lora_pipeline.py b/fastvideo/v1/pipelines/lora_pipeline.py index fb7433005d..2a383002e0 100644 --- a/fastvideo/v1/pipelines/lora_pipeline.py +++ b/fastvideo/v1/pipelines/lora_pipeline.py @@ -6,7 +6,7 @@ import torch.distributed as dist from safetensors.torch import load_file -from fastvideo.v1.distributed import get_torch_device +from fastvideo.v1.distributed import get_local_torch_device from fastvideo.v1.fastvideo_args import FastVideoArgs from fastvideo.v1.layers.lora.linear import (BaseLayerWithLoRA, get_lora_layer, replace_submodule) @@ -29,7 +29,7 @@ class LoRAPipeline(ComposedPipelineBase): lora_layers: Dict[str, BaseLayerWithLoRA] = {} fastvideo_args: FastVideoArgs exclude_lora_layers: List[str] = [] - device: torch.device = get_torch_device() + device: torch.device = get_local_torch_device() def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) @@ -84,6 +84,7 @@ def set_lora_adapter(self, raise ValueError( f"Adapter {lora_nickname} not found in the pipeline. Please provide lora_path to load it." ) + adapter_updated = False rank = dist.get_rank() if lora_path is not None: diff --git a/fastvideo/v1/pipelines/pipeline_batch_info.py b/fastvideo/v1/pipelines/pipeline_batch_info.py index 260f9c86d5..dda25fca00 100644 --- a/fastvideo/v1/pipelines/pipeline_batch_info.py +++ b/fastvideo/v1/pipelines/pipeline_batch_info.py @@ -46,7 +46,7 @@ class ForwardBatch: negative_prompt: Optional[Union[str, List[str]]] = None prompt_path: Optional[str] = None output_path: str = "outputs/" - + output_video_name: Optional[str] = None # Primary encoder embeddings prompt_embeds: List[torch.Tensor] = field(default_factory=list) negative_prompt_embeds: Optional[List[torch.Tensor]] = None diff --git a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py index d1ab7481be..99a61c5ae9 100644 --- a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py +++ b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py @@ -13,6 +13,8 @@ from fastvideo.v1.models.loader.utils import hf_to_custom_state_dict, get_param_names_mapping from torch.testing import assert_close from torch.distributed.tensor import DTensor +from fastvideo.v1.worker import MultiprocExecutor + logger = init_logger(__name__) os.environ["MASTER_ADDR"] = "localhost" os.environ["MASTER_PORT"] = "29500" @@ -26,9 +28,8 @@ "num_frames": 45, "num_inference_steps": 32, "guidance_scale": 5.0, - "embedded_cfg_scale": 6, - "flow_shift": 7.0, - "seed": 1024, + "flow_shift": 3.0, + "seed": 42, "fps": 24, "neg_prompt": "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走", "text-encoder-precision": ("fp32",), @@ -67,31 +68,18 @@ def test_lora_switching_similarity(ATTENTION_BACKEND, model_id): script_dir = os.path.dirname(os.path.abspath(__file__)) - base_output_dir = os.path.join(script_dir, 'generated_videos', model_id) - output_dir = os.path.join(base_output_dir, ATTENTION_BACKEND, 'lora_switching') - output_video_name = f"lora_{lora_config['lora_path']}_{lora_config['prompt'][:50]}.mp4" + output_dir = os.path.join(script_dir, 'generated_videos', model_id.split('/')[-1], ATTENTION_BACKEND) os.makedirs(output_dir, exist_ok=True) BASE_PARAMS = MODEL_TO_PARAMS[model_id] num_inference_steps = BASE_PARAMS["num_inference_steps"] - prompt = lora_config["prompt"] - negative_prompt = lora_config["negative_prompt"] - lora_path = lora_config["lora_path"] - lora_nickname = lora_config["lora_nickname"] init_kwargs = { "num_gpus": BASE_PARAMS["num_gpus"], "flow_shift": BASE_PARAMS["flow_shift"], - "sp_size": BASE_PARAMS["sp_size"], - "tp_size": BASE_PARAMS["tp_size"], - "lora_path": lora_path, - "lora_nickname": lora_nickname, "use_cpu_offload": BASE_PARAMS["use_cpu_offload"], } - if BASE_PARAMS.get("vae_sp"): - init_kwargs["vae_sp"] = True - init_kwargs["vae_tiling"] = True if "text-encoder-precision" in BASE_PARAMS: init_kwargs["text_encoder_precisions"] = BASE_PARAMS["text-encoder-precision"] @@ -102,10 +90,8 @@ def test_lora_switching_similarity(ATTENTION_BACKEND, model_id): "width": BASE_PARAMS["width"], "num_frames": BASE_PARAMS["num_frames"], "guidance_scale": BASE_PARAMS["guidance_scale"], - "embedded_cfg_scale": BASE_PARAMS["embedded_cfg_scale"], "seed": BASE_PARAMS["seed"], "fps": BASE_PARAMS["fps"], - "negative_prompt": negative_prompt, "save_video": True, } generator = VideoGenerator.from_pretrained(model_path=BASE_PARAMS["model_path"], **init_kwargs) @@ -113,12 +99,12 @@ def test_lora_switching_similarity(ATTENTION_BACKEND, model_id): lora_nickname = lora_config["lora_nickname"] lora_path = lora_config["lora_path"] prompt = lora_config["prompt"] - negative_prompt = lora_config["negative_prompt"] + generation_kwargs["negative_prompt"] = lora_config["negative_prompt"] generator.set_lora_adapter(lora_nickname=lora_nickname, lora_path=lora_path) - generation_kwargs["negative_prompt"] = negative_prompt - output_video_name_switch = f"lora_switch_{lora_nickname}_{prompt[:50]}.mp4" + output_video_name = f"{lora_path.split('/')[-1]}_{prompt[:50]}.mp4" generation_kwargs["output_path"] = output_dir + generation_kwargs["output_video_name"] = output_video_name generator.generate_video(prompt, **generation_kwargs) @@ -128,7 +114,7 @@ def test_lora_switching_similarity(ATTENTION_BACKEND, model_id): assert os.path.exists( output_dir), f"Output video was not generated at {output_dir}" - reference_folder = os.path.join(script_dir, 'reference_videos', model_id, ATTENTION_BACKEND, 'lora_switching') + reference_folder = os.path.join(script_dir, 'L40S_reference_videos', model_id.split('/')[-1], ATTENTION_BACKEND) if not os.path.exists(reference_folder): logger.error("Reference folder missing") @@ -139,7 +125,7 @@ def test_lora_switching_similarity(ATTENTION_BACKEND, model_id): reference_video_name = None for filename in os.listdir(reference_folder): - if filename.endswith('.mp4') and lora_nickname in filename and prompt[:50] in filename: + if filename == output_video_name: reference_video_name = filename break @@ -148,7 +134,7 @@ def test_lora_switching_similarity(ATTENTION_BACKEND, model_id): raise FileNotFoundError(f"Reference video missing for adapter {lora_path}") reference_video_path = os.path.join(reference_folder, reference_video_name) - generated_video_path = os.path.join(output_dir, output_video_name_switch) + generated_video_path = os.path.join(output_dir, output_video_name) logger.info( f"Computing SSIM between {reference_video_path} and {generated_video_path}" diff --git a/fastvideo/v1/tests/utils.py b/fastvideo/v1/tests/utils.py index c08ba44f8a..aa2f3b388b 100644 --- a/fastvideo/v1/tests/utils.py +++ b/fastvideo/v1/tests/utils.py @@ -22,6 +22,10 @@ def compute_video_ssim_torchvision(video1_path, video2_path, use_ms_ssim=True): use_ms_ssim: Whether to use Multi-Scale Structural Similarity(MS-SSIM) instead of SSIM. """ print(f"Computing SSIM between {video1_path} and {video2_path}...") + if not os.path.exists(video1_path): + raise FileNotFoundError(f"Video1 not found: {video1_path}") + if not os.path.exists(video2_path): + raise FileNotFoundError(f"Video2 not found: {video2_path}") frames1, _, _ = read_video(video1_path, pts_unit='sec', diff --git a/fastvideo/v1/worker/__init__.py b/fastvideo/v1/worker/__init__.py new file mode 100644 index 0000000000..85413d3ca5 --- /dev/null +++ b/fastvideo/v1/worker/__init__.py @@ -0,0 +1,5 @@ +from .executor import Executor +from .gpu_worker import run_worker_process +from .multiproc_executor import MultiprocExecutor + +__all__ = ["Executor", "run_worker_process", "MultiprocExecutor"] \ No newline at end of file diff --git a/fastvideo/v1/worker/executor.py b/fastvideo/v1/worker/executor.py index 224e69ed9a..84fef31234 100644 --- a/fastvideo/v1/worker/executor.py +++ b/fastvideo/v1/worker/executor.py @@ -49,7 +49,9 @@ def execute_forward( return cast(ForwardBatch, outputs[0]["output_batch"]) @abstractmethod - def set_lora_adapter(self, lora_nickname: str, lora_path: str) -> None: + def set_lora_adapter(self, + lora_nickname: str, + lora_path: str = None) -> None: """ Set the LoRA adapter for the workers. """ diff --git a/fastvideo/v1/worker/gpu_worker.py b/fastvideo/v1/worker/gpu_worker.py index 6b8bc918a1..9cb3df79ba 100644 --- a/fastvideo/v1/worker/gpu_worker.py +++ b/fastvideo/v1/worker/gpu_worker.py @@ -90,7 +90,9 @@ def execute_forward(self, forward_batch: ForwardBatch, output_batch = self.pipeline.forward(forward_batch, self.fastvideo_args) return cast(ForwardBatch, output_batch) - def set_lora_adapter(self, lora_nickname: str, lora_path: str) -> None: + def set_lora_adapter(self, + lora_nickname: str, + lora_path: str = None) -> None: self.pipeline.set_lora_adapter(lora_nickname, lora_path) def shutdown(self) -> Dict[str, Any]: diff --git a/fastvideo/v1/worker/multiproc_executor.py b/fastvideo/v1/worker/multiproc_executor.py index 9b92472461..19db1e362a 100644 --- a/fastvideo/v1/worker/multiproc_executor.py +++ b/fastvideo/v1/worker/multiproc_executor.py @@ -74,7 +74,9 @@ def execute_forward(self, forward_batch: ForwardBatch, }) return cast(ForwardBatch, responses[0]["output_batch"]) - def set_lora_adapter(self, lora_nickname: str, lora_path: str) -> None: + def set_lora_adapter(self, + lora_nickname: str, + lora_path: str = None) -> None: self.collective_rpc("set_lora_adapter", kwargs={ "lora_nickname": lora_nickname, diff --git a/hf_lora.py b/hf_lora.py new file mode 100644 index 0000000000..af30d80944 --- /dev/null +++ b/hf_lora.py @@ -0,0 +1,47 @@ +import torch +from diffusers import AutoencoderKLWan, WanPipeline +from diffusers.schedulers.scheduling_unipc_multistep import ( + UniPCMultistepScheduler) +from diffusers.utils import export_to_video + +model_id = "Wan-AI/Wan2.1-T2V-1.3B-Diffusers" +vae = AutoencoderKLWan.from_pretrained(model_id, + subfolder="vae", + torch_dtype=torch.float32) +pipe = WanPipeline.from_pretrained(model_id, + vae=vae, + torch_dtype=torch.bfloat16) +pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config, + flow_shift=3.0) +pipe.text_encoder = pipe.text_encoder.to(torch.float32) +pipe.to("cuda") +lora_path = "benjamin-paine/steamboat-willie-1.3b" +pipe.load_lora_weights(lora_path) +prompt = "steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a melting red candle. the mood is one of wonder and curiosity, as the monster gazes at the flame with wide eyes and open mouth. Its pose and expression convey a sense of innocence and playfulness, as if it is exploring the world around it for the first time. The use of warm colors and dramatic lighting further enhances the cozy atmosphere of the image." +negative_prompt = "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走" +output = pipe(prompt=prompt, + negative_prompt=negative_prompt, + height=480, + width=832, + num_frames=45, + guidance_scale=5.0, + num_inference_steps=32, + generator=torch.Generator(device="cpu").manual_seed(42)).frames[0] + +export_to_video(output, f"{lora_path.split('/')[-1]}_{prompt[:50]}.mp4", fps=24) + +lora_path = "motimalu/wan-flat-color-1.3b-v2" +pipe.load_lora_weights(lora_path) +prompt = "flat color, no lineart, blending, negative space, artist:[john kafka|ponsuke kaikai|hara id 21|yoneyama mai|fuzichoco], 1girl, sakura miko, pink hair, cowboy shot, white shirt, floral print, off shoulder, outdoors, cherry blossom, tree shade, wariza, looking up, falling petals, half-closed eyes, white sky, clouds, live2d animation, upper body, high quality cinematic video of a woman sitting under a sakura tree. Dreamy and lonely, the camera close-ups on the face of the woman as she turns towards the viewer. The Camera is steady, This is a cowboy shot. The animation is smooth and fluid." +negative_prompt = "bad quality video,色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走" + +output = pipe(prompt=prompt, + negative_prompt=negative_prompt, + height=480, + width=832, + num_frames=45, + guidance_scale=5.0, + num_inference_steps=32, + generator=torch.Generator(device="cpu").manual_seed(42)).frames[0] + +export_to_video(output, f"{lora_path.split('/')[-1]}_{prompt[:50]}.mp4", fps=24) From e58ab7336de817bcae16dbf640aaf6df8eebcaff Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Fri, 4 Jul 2025 22:55:41 +0000 Subject: [PATCH 13/43] ref videos --- ...illie style, golden era animation, clos.mp4 | Bin 0 -> 120886 bytes ... no lineart, blending, negative space, .mp4 | Bin 0 -> 92417 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 fastvideo/v1/tests/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steamboat-willie-1.3b_steamboat willie style, golden era animation, clos.mp4 create mode 100644 fastvideo/v1/tests/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/wan-flat-color-1.3b-v2_flat color, no lineart, blending, negative space, .mp4 diff --git a/fastvideo/v1/tests/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steamboat-willie-1.3b_steamboat willie style, golden era animation, clos.mp4 b/fastvideo/v1/tests/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steamboat-willie-1.3b_steamboat willie style, golden era animation, clos.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0e48e9aa19f1ca5cbc2e2af6daf514f20a57eaa9 GIT binary patch literal 120886 zcmX_mV{~Rs&~0qnwr$(CjftPwnb@{%PB5`;+jcUsbMt=Rz4yoIF6`P}Ro&~XUh5nn zARrnU0y6$imp!#n92&#@g{e#QzdFIT|`xSU8)z@YAypxmW>yB7TV2 ziEJGlY>cgbG{gUAWFd04wKn}p=KmR(i0lFXvxup+ow3V*iCEjam;-E$e?UKW6I)k+ zv8SP_gPo(X%a3mQ(<2vvv9gvMJ#`IsB0OS993NUxJ`UwY^8vg%s|MLS(`Aq>9M0O@Wjs35z zALWOUfr-fJzhd~A7&v}J$Nz}`XEyfW=ivS^IJ=lT^0N_HJO1p_&x!ci#2+qWr=J7x z-*y5800H5+n1=@g8Gc>O?5ffi!|nC#<=`U0O&YMF)LH-f%*G=U`ZYf}^|xgsdwI6qV3rJjzW2g)Qcepb1X)`%7qgHQu%Z@| z@a*d0jvwQ2b{YLm|0xE>5V8vbp-CFE|CrABW|cvVKDK{u< z^sED&%J{zW!2_1b|gc}E?tMwEX%>k@ZZ@F;WS(EU8 zZm0J)(Y4}#QwJ-0HR|z^%%nuHK$xnNV4T@1uXwCldYg<>|!_QgSpkJ z?SP-5giA854r!B$m2I&*)sBqQIxN8#_zB+wYXTNpM|;V4`QNtq z^_X)*8&BWRPyiH1?vVV^7%Z8EmO_%kI_Lvc*X`+1P7sj^Ls9xJ^=d=bOv$ByZ$a8H zGx4Q4!;_*^Ke66mL z9BgZB>Jkh;qa*GmuUj`K08scFQ;(C(CzrH$^YeEYg&IvF^rN!|_$4|b(dsW;4N}N} zwzM$oI4fbdHV)4U zSKSomcedn7p7+PTW+pPzp|0a$f{5z%*)ubvW8Xsgl=sm5W0qZPf1;+aLu_vj!saup zw-%~d(xBX(IlY8ID7gp~vCVGd1F4I4IEKp4c3=k%uoPbpQ5O}B_p@`$6`4Xulqoy* z&XMh)C=m>9zd5~n$hA)wsEFb$lf`+$oy&@uN>o1CgoZ2H~F`5QaNQa zfGuYUHw%GYrfbZ8Ug){{QGW=Ch_2sIdWVLPxQOV0?{+Y&A9w58t)uEiH&qM~Q3lmV zz_*v~o-%eP!WR+qJREM&Ry`KDZe`4|vDMLOUO&NaLe_yHRFT4);ltQbiUBR28_B6O zf)Bqd2&byOYJh^ht!V2b%Jby&oa>C~yR7Ju*<{}sc;b9)koMU%ZAFzr8t?RlTf#lg zNjgC8u&#??FRm0yU0z$%uN|+Zs-_p6k`o%sAq-pNj`ZII`vAG{{4JL7F{!`JC$WD{uSWzW6*Il0 z+dK-NDHmxx;jRTGkvxAoz}p^ggSawK+MKWaFQkqiT{lEvb2BDqbU(-9(v%~Q4C)9b z_%Fjyw23&vYv9c~|Bw>k*GeR=K*;cWMkY?7E|o}}0$Gv_G*E{d;LVJU*g7w-z6 z)c5iHSs|AJG=mns>XWI;g_?YsW2Oz=zN%|WjJ{rKf{kD#>l88#%#25)LHOTnQz|xeJc*jMCXeaB6eE%9c|eU)BSuo=$C7BDyhSA zW$v{wZ%%h?zP>zn-g7S<)Rksx%6g=sk876q7nhv&x% zn^Qnoi0iSo2_@p5!;E@qG}Uo&e|d|s^`p))1ZJ%=s{F8*Nz|DEs#8MSIA@Eeh52G1 z5t+Ai2Cd%_Foi3jaSTwg6KvRp07cZ`R&C*+#R0hjWXZ*1bVEkQ$wTF$L(BE`Pq-(WTVjUR&<5Gx9-(8O0ibPV#9vie zC>IAqp6!Zt)L`?0*$qGI#nV`?eP_rXeH%VapC;`&!@8ALt2YelmgJf0 z>rw{;28DGH3sl&#ah1l8L%H-(P;~-wTwHamFVWQXBG!BsOL|zpsW;qEnbp9`Du#85 zJU=8hg`V?-V`l$5Z{GS*u=wfKSz{w!I?S9eBZr^2sBvU8D6$@wb zubGA$kNdJ*c#L@d7I^!RF@sF=S9)u178*i;p@vuGaT9$aUe5Ta-wmAiv!mYB=&2acaT0=$aS?muVd`Sr|>P zo&(<_eQh6jxt=zF_C1!JYPVPManb7l^6Pf7ulTkU?@Dbw>fa9kGu*r)iA@hm8F56+ zuxUFb>y6wN5&3jrts-0vx@JfbbC0iQiTz~F$LR*Jfck_ev2Wvr;|7}<4%M0XJWCU=5O7UyMzorb5VBPjDzYiM9XpSU86mI=V6z3sK^5FTCh&_C*xad1A8iVON~ zV!P_pvBHD`ha7k`eC+%YonYi*<(kBV~hTMq#&u*Bt0OH z_36kFc36QiTp^3~=aDp`9BfL^^m@SOmA3d{<|O=LnxX_MkJ)YmA01yzvr93TU5uGR4eT|fQagen?>YE10uBK zmk4<|@@0!;8t%5Ym!@l%z<=)QhHx@rqIkA9HoIhZ!LP)_;3fD@r{E0*JqQ+N1rAn7 zGTZ|$>ZS;D7wLU%nIy3v=osdap5ts1Hz;wRD0U7V%U!6SN~vN4^YZ^NBS+TTGI&+c)XxtLbV;r-^pfThbjdB4|O$XAK< zzTRBg>V#`tg<5&hgOQA5e^^uzT-S2O2zZ^BKAUHz;d-hvb5LuoDZl0XJE)$U@DT~h z1ju7=F-vO_*H^xXijiE^L9}wgy70>1-e*RP&p5JA2Jb1yiDX^Mv)=vyJnY$Q2*QAQaGLClu^s>_zN8q!AxsYvl@4To>Fj4hus}x^QsTpz><(cwYo!s@oZbaF2r&kkC_u{;P1hl=_<+)JI+ss|N3M4YTU@9Yo6IZk@G9B2V z?iU~o(nF!PF+loxXX81%v$!>zM+eTpUlt_IYgKqWKK=t&%oUKvP>OnhDRSpSoZ!A# zt#Fv|Iw~s-s&DPZI5pWieHcYX;`AzlRNM=->LsgctdzXQ?)Pj-#%<9Bwnhx^t7mz^ z^fZFW;CCwt@fFnYfoWN&V+{n`Azwz~RzA1_iIE8BUer~p%`NH|cC?G&r)}G?;H3Sl zqbV?Kw&MvWHvk$nI8G%}sw}`&R-6%Yy{Sz1>^-0y-lu>W96j&ww3==1%>5t8vb6-v zxlcyC(M`q}&VB3D5X3(yssM2iYKh87L~MV~ad-r?qAu;iS)8yw1XWfQ^L?9G(o*p+ zu`83`LaChy!Lrk7nizgyC=X=`Q2iKU1 zU#}Cg*mhO$J6`H)c5*D;D^b9eB@>BO=rNvN((acmH?*j3qIKWCn^JZe2QJsAroUH8 zEKkcI5cF3Ai>w7q?Dz|^h8t4srX}&TGT4IWpR`Qm$&f!`2(%rzPL)z1)BB{t(7dC9 z{>U}EL*Z0We^PO~4QOs|18I&jid`KAUvd;0PvkiQnVvWBzKG=74SimXzL3rEJ^UNd zQdJC3%Ju}VFC2G!MARds>^iv`;vGv^Y0wQEoD#m_D+y`y9+(9(lY^)2jxJTgG4($B zRU2*g?E@j~MY!>v#C2>%?odPfx`fiywYOAAP#F`6)ZR^SKQKa`%QutY^_#GmDI=B! zYZr_fm%F?ID7qD3hR7Kd1Vt??*M)m8niK55)tX~8Pui9x9wh!$>YWY*9D|p}x)-ww z3Ml|$m$V{H)BNiMOb*0vVm#X?iE1Nq>REqrvJSB)<0eh9Iu2=gImED+nn>{|Bh~2Y zi2fW*HxhF82r@0=IIkH0>lAM;6F%9$!Z=~sO;nL?I@fqPKh)XSJH+(X-3LPn`578= zzjOv_urN18#@e%{1Csk*j9ra%jLvyPB&qxUY$37kdHsfFiz$By!a9&uU^htG`ze@5 zFjZ#QBal_9aS-AXb;Q{%R?g{d-k4@fuZuMu^486gPC<+G> z)Z46w=m8pPi`ma0CgYR$4X*F8_f}pQIQ4A(G#ouUBByhUMAvE}5iPDK-iC#xY^oH= zNd;}jpM(~g#horR1Fh>!J3x#CKj>UU>Z zAuRiVm7INj97)<-Rg}pDk0`lS47@6=pDz%@`H?KX=pCnoiCSO4@xZ`miQ^2;l>a`V z!HYK&?sZdkha1x6DqiEbahNZiyc#^*0LPGFhn<`l*n1=PSv?2u*{70Es(@9#NSk7X ziLuduYJdg*{2e{+g`fB~Gy|xDv^NXpivcW4xuDy9LhUouUX<;|m&ohOePmVZfntwR zXWEOR_BFo!d4O0A^^sk|<*yE!B8GPx205W`DeN7Fb1L6BJzXZ(-}FlQ12ZI|G)RCX z|77-x6Kk*jE$K5~m;24Fwqc)9i*h@>Jn3QBFHp*(i0WAt4t=ccKk>xH-}(LCSafQB7XNv=FyG52Wq-tWM!l~Yta z!){Ca)9+B;UFQm2g=F)G*c^-0*%lRsy5HWn*U4~Tz{zqvwfSIPT<|R!OH7gANB7Ua>*RSet1)b+~5;nr!gM{91|cab-C zo)rt3x*2^F8v<08L@*GH_*yAwgHuPV{V@H@0(4 z?Y-oDlS?H}InpRy)hqC%IPZCoH$SMBZFCSb3|;-?&~nC(TxILz+M`FG!1h^-QMt)9 z-o=HP1}SU%sLbeTXpV`}n>L)(iEs!i_^>}u*5v<8%6Th<=(+nc++7z?R&>+)`n@Kq zLVBB}TK7!Ez&?7Vzy>^7ln;6Q>6=Mmi3xB7pRSBvv3GCPDhfs7xO5Rrd?a2kTteKe zt~_6cq5$FBL6p>|2&2A?F4fVKw226g*hc;{Pso_p^e-6ORcQ7__o}KGw340^9!)(k zdS3;m9jQ!yB`cGcWF_KTY*!=m=q*r>*W?7z7;=)S&jLp1Yx3mn%`=7W+U$k++ojew zcK*StbDIIdX$yjAf7v|K&xXv~iNVj>FtjsYXR9DOsM)5Yo66u*kB0r_S4DIg`6H*u#`2g>B8@rkokGA%lhR zr#ToZBrs$+e2~e0sK`Lqq^ z@`T|MTydp+L6i@-uG{k(^v?=r$#3p!?>Wthl&BIJcW4}(gS7)63lb};Miq-QAJqIm zY0euI=zb$=D zx#@Ph-#^Z`X7X9=%zvXOkm;A%WIul+-LbdMZxBG&1jA%0owybSH2?qE_{v58%?@L|_8}A#n?55}T%iVE2I`gDJ(`Q$V!w zgMur4zZ>ZHt>EEM4fw_q-JtIHCtAEb4z=p~r}aR0zEKE;hXCt#WcxGDHLP8h%_l>n z#3@Wtglz`slAV-2*QOoLI zoxF(oDoWy7_vW{K_g9L7ai>~lzU#oynu7R>v@y#x+&nWHE^@y5eS`H>KKEiw=W$Mv zHPvY8R91a#q|}OjS9N5pe@fWagbBsc_o&dpmwDM6-VmUGt&`o>YN50^Rm3V{fY@iI zE4LX~ttxmAP_qX{0s^t7`y6&g2+wl7m70sHYv^x{zm?jq#aE%NW%T!sBmHY?rmKzP2QVNCE5M!-5(6P}_%ca&de=rOgA=2Kv-A%% z3vA73obXmd(3*OLouO`>zE(q947qHUkEJlL-u*3TNTBoiK?5NTB4!s6QC=x1ff6mS z1DTHOU=Uz#`Uhz0act<$w3OXF;>w{Y=zQgGB;&Jd8)T2VF}7o zI|m;*Y~<(28+H|Z5=oyjRUcr^$ffg3zEYPs3geg@^~k1J=-jSX#xn;b9F^*xI<>U8 zW#&wwg=3a&HVGGOaGc(Ps+}yOASSuPNQok)`LRL;jN57xCkNnK)}NTK6p{A8N?m>2H^EdOVV&Y6 z5L9YA0yUo<)()~0(Thq8Yrrz%t&591DN1#sGid;PK%EjO*wxJ8hBn+xa(OinWXG5) z3R>nY%dIuw0CtgtfCB~6xWhDI(t6?##()fQRry}z5-@dulEyBiDZi0yZ7WaFv$O{| z)8_Y8<0nt^>y7Kt0497`{S?Su z%76~k{mZGq=M`Zk+dk~LhT{gOEI+8s#C?|IORj?e_E?*uc0Yu0-o=Kr>hgpW+cYZT zRA~b$LnXc@*tVyDaQavFw7>&Wi$iRk-%~XT53#;B6F|k)^0W9`k?J{n%}Ic)3Ny~Q zVCUE)Attcv?;S|XO-F>DZoViO#UNq1<@C08NHxtL$pYYq(9;6KiuU1G3VZTu@zRtN7|gP{{nSaQ$F~U6T-9o7k**ZjFBO4=s$&^?cBKnM<*3fl z<_2*x#YctLD9@ZF0WoW2)3aM3L#>}-O+pnsEy{LDLRR6p1eNHilnV50r%t#>(t%co zIii42SKa`@W$JnHf&-`AioAt+zs%#SN9TIdtkr7X*1g$&`(3iTz$|dqmI!;iJTy&8 z1FQZS2+6~^CprAc-XyUk*n9+*Sc|oXp;|A;ddfdih|PM)*8*FgK_}fk*pctxpD3Ty z3q6__wX0pplJ|X|q5KxLabL{%C$x$^g>z7$K1#Jy9H!+<{tgrbSQC2IB$(ttfDVT< z_gxCd^AgAR4Q2;|;7sScU;8AevYBpfy*psOeIfTtd2BGFBE`y2kSSeibFtiYJ1$sS zVs~?K+6Z4Sz&Q98InN61Z#^_zj^IRyC-Oq{v!p-S)}76Un2gUpy(jFigOLIU>418x z1&@^U8n9xgF*mT(;ycza!3yT0cBl zO#Z45Usp+uvTGrgf*7>!cv}+Ak8sE(uXoh;6m*4YzA=sTjdR+O?@Q)}S7)K>K;AhT zxU9_u2P}70Cym!SPMU=$mdeD=syDwZBB6M#RVEn|ou!oBokV5)MtkI#hqCZD$i|pVaU>d z85_p48G73jKO4_LXw3uEGyAp8mnuUvF2!8Jj)^%~Na<9wP3)~%v!;ox=fdSeq)SEa zAdJK>NIvR)=bpCAR`jceQQQ`nXL;&2>z~I7_s88LT{k}@sxn=g5sad_eL(S?qi*{} zCeo^wsg1dp#k`JD$$r+x%x|2hOVAtHM2m$u^XJDMP&+@?IyuEiFiVhTFs3O?K+l%G zt7Kl8%ip%|5%&Q0<|lDl;X*!Wu~HO zORfBuiB@BYIcfcT3eEW8&sJ^fzLFu4`R+n8w)6t#TqyKv$@DCttX*p4uEe+P!=9K$ zt3hPGsTzY%;&aj6`94%@vxn4g9IEF{#`8@qDDpe?ZB$5m1)nVQF7M1Dxx zQa*8o#f-$K3xFW=O%*SkKBc4bhh!FDoA|22YnaWCo6f%LvOqWf8@e1wN()W1?_5cR zj?J2W>UHl=0#_MT6zjZSgQKk$byDy_Rv`*2#hY$bPa;w;r^c zkL_b$HsttZxFTOUzP^Oco%`ZY+Q|b?PH;%pBL?@a0k&UB)f)?to9BCXg+O4wL z61q+SI<;XWaQJ9LsKk18#2&IfdE_h^$6x;Y7mR#g=WOf}NwV)W0|%^5#os~@M1x9s z6(1-W(kM2qmocoxIaGTxmOm$Px)CCoiy-XevH&`5PA&5IzOozA8wC3|KehYgm-Q^A_x=BU7rVNe)7_x69i%X2@lqH$`o*f+Pro4$CWd&XO(@d;QAK=N7@RONp8!M8UZFBM*bE<2APYN1UP_m+=4v5f0CB zBTFIku`BsW4-^J;PZ7a-7=BsvcqVZMKXADmO@8i9?4I%*(q}upzqX{z$)4^uUNyk! zbm+f4l;)^b?gj*B) zRzIpArF~KF@dOS&TpFa7BS9sG@8DSsT!gNLoenCiBFv2@23R#9MLOvk+3$DD+f6N6MSO^-kiSV6 z>|Bq~{vl-jii-zIkx9bhuTdL0nt4*M?HmJ6Z7!h%=lE+d!;HtIk<#ry3p=kp7uLM1 z_kZ;AH9ZY+1GQi)`t@ID3~x{%5wL*EuwGKTA)H ztx(Z{_VgB|?^I^ddw$M)PzRq5j=@@Sqv70S#xnRQ(9r;y@EDFh3xjlSPZ2}LdF6ifa<9~ascV8y%_GCT8hlgs`9Oi<4jZNS;-8@E&?&? zdyCQ)(Hh%+jp+=$$@-0@ck5Fgnss`jM}B?2N8dTpi;n5az?s>oqB_z5#9DeTNxu-} ziD5F7QUiMen;VtXL^;_dih2u{E`^_MB_5gWwz8VM`eE=*pg?X<|pd>mbzsG_Ea_>4$Glg#c1+@NQr76bbs>n z0LLL;QU*|$s~x>nJG|uqu7w@KseXI_2MYso7Q2vPI^Hhv2GU?wx~vnpT2|QCybca4 zMQ1TPl6gj~qP2B`w+v*`!X#=p(*Sk%RcB&Ax2H5Ue1)-D~xalEF zW>^Bx;@BaUIT6goiH7dKhkJkVwId`8W+G#7;xn7gH2%#(%R8(g1Cj-0Rsb{vPjy(! zJpFaT!A2L=Fn=jCs)YAsOx!>TCJQj;yDHByu#vQ&2f&JDTcYrkgT$Q<)(#PGt1*hS zH1@-zru(XJCfr`1ZhS95R=lUEQwcGjzAYkSnd{Wz&i_3`MSosiNE#%FHTutz=qK# z#u&rS*qKuPAV*6Vx^7TOk%oj^9qo!7@Zd@#q`ve+gZuSK2emEq`=0JCH5_b7Y*BfM zCRmOA6dYbwQLXq((L19=`pZRPDUbP*%P&&pWnbBM*~tQ|`~EHNuRAv(@6q?mjBKo; z#OTRI^>%J43fVTqFmcJ1W51#O=N_m{f^_ItfONhNUntCb7qB!7&<;bU56T9Ti@Nz} zN|ep*EV6V4Qu-h&b)iiTVQe&~() zzK+U^t6GdDDw0OSOwFQGa4BN&amA9ZawF+dEmBafN{MAx0hU7DTa9VeV(vU$qO5Wa zfn=}TtM&r63WU1TJTc`1Lt_m4DmZtfF_F7R6@5cc$kr--CVh8JI%XB-HP23WJwnOq z9>#(ln+{?hT*s_?jS>%0>!#$Qm5Jyq+y2Dz6GJZky!_E-Cm-tX%v(wrh9EU zXhy7$7=g0(>$q9@YzU^*KZjqwL<2+9b$%Vh4cLbX!2CA> zRr7Bd`!-Nr6O%IWC4&`2M#+(2IA62k>Ve6B5rZp5Uk{x~w|}>Uc4vncIt_$c7dPUb zVV`b$L#~A=je>}9SSCf`{1+G@K(Em7+?vF5@VPZjP`bjn59Fnp)7j-g=O|?cn#%~B z4kJ;j>SpW!-^Vd+b`nU*@6k}EI3X{5^`6O`2nIcIzBGCJb*34Tbo?{!ZmG^tf0TO+Du~?C>sL7ojZIXHA&_l;7_|jyye*kX{pnL9DI#4EwJ$h#NI+1DMx(mM$T9 z0#?8ZG3ny|;gXudBj=<@4J7ZAvgpu7jQ6iCg(X zw#BXVJv86 zPVii+fp#=DPN0P!B72B+g%_8Q#anG3Rpc#sa5_hf(KY#NTf|&Bqe0PBZ@VSW>yZZh zYyWgtZpVBuD+qXe7_r{~!w-iZJg=uL8y|dnBO&47mQ1Crg0H7JVKfjKESg5V%ir=J z{xDtJzl~MUa`A$#=X+e08$cSIhbc0z?sctAyNdc(tp4OGt@qqwROt!4=-gRU)s{sn z37CA#ztY+mh`wvPM6#f+GR$75N_3%!$vm5(qY7^5V3_SSj4Pib%MRFZ0Q3zp2?OUN zh|1w>j0jk=?iK)8#>lI`f@6F?%C19Q^({=b_zp4gb7qr$r@i@xcer`J=uOp!VW1s3 zicOn?%oeJ=ityjxdhOstCW&17=@aj`6r#hF?-qoFDf(ZU)>XGkYC~67p|}zs*~>w< z8FUu>u)C|~F<0h6jwGs#FIpQL6Zdf@;OpRk<3H*}-$lE#(x~5r;#tU^622etHLCwe z(?6@2d18hYR7ZrNvx;TRK@)0TpC3mH5Y=U9cakW$9j3!a3vu5$pYDu~gWR|3;=B_z z^Say4H8^>AJA==hg90}mR8UXEOq@wZss&+R3aXF0QsiALd1kaPrJ@wP@I}VH$_RG1 zlO6=#ViOZ(xmk_FCNsf6PVvE(5_yoz6cQ>J`v%mAGc6gWJmK~s*q14oDCeC&kfic3^+>K(sp@V>@II14jSTGQ9o+8#u>`8@frMy<4|b%rN3iE)4Qpuy8FMqBi6Df00$v^qFP(UKoDqsl-@dqFSU=%lF~ zr_IJlLwAEuMBOTC)b(kOKpg;KW@NV)wpHvZ(mUk(k9m`7B#Mg7VLMUDds>ItTc4NQ z9`W%N!`~;V6A14M*-*slLNJXEmp;-uqecM%eVAko{K{v1~N9lk6#ED@3L30InU zSiV+k$X?6rW@rP(dKLJ?Jdt2FvLjA& zTmm@Z&D-EeBq9X!4!m6}iDzEG#M8ZCSVqv(t4lXBTw`*`x6L=CF7?%~_S)TO%3Tbd zl4!MQKy?DbN+#V|acTz~NCF~0Qn?oVV}(WPd)jl?g}p-&YJC(YU|CNp7lJA>$rtvP zpKtB@#p>*Zgh230Rb_xiBy0GOHW*PvG*5Cf3dkZ+_QPg6{jf`%)D# z>d6`V`_L~1qX3Cz3n zRlI33Q?UPFdW2&xu-G56vCRk%yN;M?eM1TrVkxe=t0Mz!0cNaIP(VFOHo?`_5p3R$4pW*tJ<*(=Gzr5VpDJ@Z+5B* zl4`2#E7sx73#Z&*1G-0!#O)L|!;UlM4-_+1*+;A`*EN~C{jG1Pf9K9J@+wD%u@zIr zhVxA=t6pt|N;s7SdYi#qiOAHen6=~xUesNk!p+MHzWd|klGpcDfT_;(=a8Y8$;Os& zsz9oCf0i|x=74F0pvrEN#JInuOFP5s0gj;1rVdFrUkgF`F2KOx^jysEC3ArGTUEWO zBZi!YHzwVq;|pP-fwXkaJ*VJT^>tZp4&RiC+q941P!)5h`V=FX$j4BE5x{2V?HqNo#LF$>8LG`G?q zqS3p9)pmwMY z?jPkEqCxK42W99X+ylqMTPW=6-wAl{ynnyQYpzr$2%%q9K<$0GIfdv{f(3Sv{Z(d%yMOrwN^z+ zY-cw$JmfuIxYxn}r~bQlcKFor{dek^Fuy8U#&loqbPnD9!x*{|lNqd4C4PWD7b5(r zxlb){GadBA}{=pe$( zXM>)QP~XhuGuL_sakuKd_RR5QeCPdNRXDPz~S!iCG=nLT`h@RvK(JLTT%F$jZm@P*LAchLeqxh?PRdz2;28grw<X^SdPktaBX1d zM+DV~BS`j8K{6DN)Oq;t(({Be+%-m^6R<;{m+T>-5F8(LR zoI>Fc`7!sfjBtGTndwzpoXhia-i7v4LAQHh#xdyVdcs@EnKJ)g+=lfg7h1c+OG!Pn0q^dMbdIrrdh zwJx|1{pYxB^N+82vyzvi6PG_pV0u{F!I%2|0y!mFsmoNL=!WkxAXG_t7%k+j`!cw1 z!UE!>f;c?u_UJ7X0n_7tf5RY?0$rVJY12k^R#_uQZ|6fbO4@MuE0hUP=Ber#G@h1cui%P zLrA43R{Dy>2Yo|<`T=TeZ6@GYtmGWq!jpWsv=+oR49^})#|c-kt+pgeeks6w>gt zB3>-tz!A_8>u_HCIDR3SH|1X~BG{{PCELtktXxlrV zf&VO2e~=a4vNvs2h9b%`0DPjg>U~BTU)vHEo944N?P00go(@dD1Ie-yb|V#^8Itc` zz-Kd7Vmb@{0rFybX&lS{XDw%Th>1pE7|QHuWfkH^@T%^snI3yYj8v{pSAJxhTCAr5 zRzB6xFm1h$ZN%r3TcxvF>@C8WuMVRO5TKtUX`c!#e2JX89!cWs~3M*L(wl1%|06e>s;v>sfWxRk$UMe+I)|z`t zn$lcD_1A3W(GJraNCWy@r?qk1FB%=OZ4StMvpV4j z2w|ccYlJu~;I|wiawYeMdHWF{ZbKca(@HH3A7SV`^$et0j6EQoA_(?oV4rx8m?0Q` zHGAzFYV|C58-J7v0a*c@s-2XdvyP75FspWw-QAk)2+<>VP3F*_Fn4YiY0yIE_?<^N zozy)iSzVXxacV`M0A~M17tUQSN(vsyr?6$L3vh7E$76$9#pbTGSA?@l?LJgE?^OXp zQ8p!m9~&7OzF?G)BHKH97E^W-;dZP1uXe0=Fip1cTK@^%XJ9>K&<6$DGEndIVp~ig zn|pA}lf*(9_h5`;QOb5#08wtFQtusCMhPI}f+n|yb2Or1k%!de z!ciz!rOp-zZfzMRV3*gDJ#c~n)s%JQ0yH}+2$`$s(3g~!%KSybiky?{B*c9$&s2Gl z3QG6vcG_2)!S9$dbkSO*wZ=$0T`Z(jAI4Pv6>s3ZdRkZ==ce8nHD1xJkt*il&vg8L zH1EEOeiwg#pG3?TW-fVLYM`HK$!b<<+%7&4HI=_Ji^%+Kq|93*t^8{CD#TqUA4H@aMy}BnD)V z?@RJNv%eN^y(Kut{xMErCa_#j7uOu^0hYMGYyj_9=#0JQp2ynNwEHEi6BQ0L zP!G$f7}kEQ*=pksU}zieWU$=ru;NKk^x_0){Lj81gj%csy z)fbVJ;Jp-%e;XQ@H_zjQGt$?Oh$%<}h49KA(&mRrg$N3U_jk?VCy#zDDZbqMPXE!T zVbH-~oUSRHI+P`T5$WW`x9foOqie%i2eww_B zBPC8(jpeI?fG4HlC0o!Aeb*Xg$nyp@a5-Z<{(X-S&(`hYUGW$rnw^aO>sAGUei3b{ z#cn&34^8B3^?0}GJLY;2?!FqOT$w{QkRrAtKj-NwqZt}{Ck#D~{VWNI{48H?G6{Ll zn6p|Px{f`0N*JAI{JcXy{K3d=y?qcAq`Q$%Yu%m-M9W2_HG2Kn8Qz@v>!eC_meVED z;$7*O?q?*?ob$u!rzlrMhsX3nGQT5lyA>lT^~5`ywL#x;>iT4JOwcr(5#t<)P~Wb!_tM?R z4tXLvB%3ivH9w88*TLNQ6zekX=hh`RhDt%wgbJM1_I;?PGNuB4@u z1Up)z`Z>XvDaUiVIZ?)>2txU5bcfRm%kX79Sl+Z^j_U@=Kk%_H({aXVU1k)Vtep?E z=gQb6#umwUKq>qm;%A6kVl55_NUem(88Q$Z0fQwU)$jzmLG6gLC#LqZx51EZF)j(Q z24N>3bs9eB8tBiBi=pl8QrsHz2m_w3CU^izwwSILP)NIiAf-jy4enle*FaxMwO8 zKZ7r@i~w%3fE=~3_&5jc?(I7>z>BTMlB31c=LJPDKyL+J>R~DTln4#!!lt14y)f7p z*|DD?`Mq_$D#)&I81k%C2J3b3bcG>GJ|Ed(ANom3)A-`0 zB5nlScf=wWswYBPtg3Irhy!(x&Oh<5O&>QzG_t6YvmIn1s0{0kX?Cgmg@R1iSgrBI zJRM`=W?`e6MON^ZSW$RCCjcocLxWcSPqmT`0)6-iz}gtHAof(7$6n^j4wEhyv3WQ9 zdX9s89e1RP3c&AzI{Z0d?>?qo9*?%2f#QyPL!ckPoY=7hBT%&yKzkkawD%k-P&&yl_eK#l zP`VmGdH7>kmEECC=0_QR$dYki5?BzmCwi2R#UZ`3CI5y;@;zcbx54B{As_O#8$55f z7SZR6J8E=#%-Jrljy?H`4HHfP8K(`urfEC7{5~f~T*EY#x($j+{HJoge}F6c6ux#} zn{wwwSXyHLQyD!#(4Pk0Nu5~PQlsiyOgIYFdW9EX1NXp7t{xr&n=x7AQ+EcCmrxl{ z0Im)9M_Gbdv_%4X*YqC#w+Fx8 zSi;V4r$oEnrp$jE@0)|T;dm6UU!)h@2HK&0sI{y2?1hM+l-5Oy2Oe)LwAl4?d@+6I zo}|UuIn+jt@#P#Fu3Ovy10Ti}vL!|0E=?`mab@+%*&vXKS}x_-UF=~p+?L-}x?D@a z-lf3~E-p^hyF;9QhW-73>Q!ngi}Q^efOPK@R)#>`v3Xv04@W#7tN(W%GL)_bdI7bWd@h!k5b7LIe!i32AhVV4rq+BcK3*<;2Us2BpZ zAkg{etZkhxt56O)??#d1`jKA$zZw>+3?Bf%r?3Xj7IhB6BsK_IUNz_S37KJy^`V_a zQ!TDO1A)~5yRC=Y4zaTb>;Jg>t`QxR6q z6k0+i&+>8Ax)4QSXXE|!wWSPY8!(<3qNNHub7ezHH*39v3xOe3sxU_S@uDaM&W@hq z99RhNC;8CnO&b|ftb+-W!2ww4yM|{fe5O7RzaXtt@4rGNd@%Sq4ps9V%5>@YZDzR) zS{;zO7HQ#pCh*5!2^_#)9s|VrtnS6dI4)+EOvAoW^|$g3*QYbh5B;e8HBl$=PV+|B zsj?G?D!IDdNE!WzDok1SL*tdyXNGsyR9B2KdeemVIsK?~?bw>T-A@0xGzAo;S0sw= z;+(E%S%xmu+BG=wzk_)y(ivecl9{24qq}2yAX>jrra{+*UHIv$j8LuA0e9+huAmLQ z4Us4}j!WERg!H#ls(YcJ9vD2kHOBrZZ@=TcS4p!OSm2j`0Q~k}a`ROkY!rEsiq`3D zfmLEls%|9@8ft}O*u;r-`6Ku2H*jndBP0jkO?#XKY)m6w|m2z!~}e=%;Zdx4S+?wdvM_#fegk}#ZDo-0Kdv2o zE&v(nezYv?qZ-|~yQn~m54A5(<>+%|`YXL}9W<)$`Y3Yyf~}PQVoF|pY?NFTvDwOT z#2+6x_kFUA%H@P(_mbv^BTXu&lVXpcV2{E;JOl5=-2q1wKht_=8FZD{T^X3VLswY3 zmD*dbB25&7%lg_AJyiVf8MY{DB^p|y{rp|0nMZNZZB>p=5jVAs9Q|BYog+Pxmtptv zRVahJDn7|sjIq8(WqpUMWGPod>rJuE&d!9FKOpo&BB9^Z|4U1WhEXmSv2;X6`A5Sq zSs>LR=(>E*3sF|b--K6=3n0*(*0ZHHS=Zj%C&r*e?Vi``*lddPuxK4Kv5{_7!z(5|j@7Qk@0A;y*?Q3ABWjbI1$=4B~fWH^zD z98!$K?NOt>hW&3lbRJ#_?ukwVqqzX2UWYn{?PCwJwt96}Xk2WOT;}w$;}JMcNS!oI zT2K^=iM7M#?&~)G7%^+{l(e)vhn09SOFlIvp6sBCbwujF4VU>kZ+Zvp?9(gbFHg_c z+$YS2j{Fl7KVQgD3NUO`sGyytHFH2ZaSKJx1|547@t+1vNGW#Wr)1!|$okM(|;<<6s^j4+bsNrAbFg-oD7r%Kh-f2H*71E7& zKEBnx-{%8JoKUFSZ<+R^M$rW0xdxL^f$AG=gb4;VBc!sV`u8;KUq29}Z;3j|Ijv=Y zM?hAx9~^5m4@e}vi(!^x0Dn!Ydm1Cd<%Ks6@5`Pk;2N}KM?U$2(vM`~_vzmUg=DYC2zfv4QPT&l zPV|8?!GSQTFJ}@~T;c)vCQ|5bfl~9)mmmi${0Am71N@1g52&2|XvFFyK~-CHdjJ3l z?g5^JYDfQddr6u2kV%~#xT~*m#aq8N++jkMdi_&Lggg1%HzfGDp9C1O!uIv8p+v#i zs(fwnFOaca8oc3CvEW$tQY%=#QvtrKA{grlk8uA)3Kx%b6d?FY&Cn@~w1tsj0Yyou zPm_pikLlxAlZW9{;xufRXExS$wtR)=q$FV|Vhg3o8w}X^I_@-(+Vk?!E`uYhpdzEY znP#N+K;Iqt->4<0&ZoHX$7E4ryo0A`%-0NuvW*dK=0gK%HuXUC^n|b$?!+831lM1~ z$0yF;a=cEJZHQyn13Ga30cW&_EIBbeb3P~@Ja&V-_OL9hq7r(0%9Jhjzw@8Lcd8=m zKt>QO8Agxc>TwKJn#g2{Sd7tEl|R4JTX1mR0b2|6BXuT%g-J!kA)5*qBrC*t9)}>p z;(9^raMqIll^iXoLcH1}>D$2rG#eCPIKI@*BNcVm5ELHn9?BZhUevQ51D%k%+@ z8hphBnL#m8GKj|rd&+6#<(Y-WBtC%QU4!QJpiT_W8iH&;r|kY1AVJ_Ku9dzYC#6wEB#I^zjhi+b*s&D)%*{dHtdY@pj&GmJM+bKbu=lg05>H*WX zT9WJ&9uCr}$XWjZBBeT@|MZf6Se%(|35zuMGYxEe#b0k$9kI3jw|+oX8N}5I#u|@} zVj~L$m9c|wE&NK9!o8z;?;goWOT%a_Z-k4?j5rQ}AY>l&NoLu}`je7JGC#FM5kg*a z#55Y`^7Wb0Rm~-d`iSfrH*`rBOZB z{+4^lv?)cmR^Q6i2q4oWSN|R$G<7sw2c0X-?$jaQn5p|c0z3O-D7jDEKN}B=$@iED&8sh5Gz?-@CLqMA!~#VEg0MWE*2))a zuPJzqLz0z0+9t%5%AcBw($L<=A@Zg&LWR!_y@nwWNv0s0;pH%o*Q?GCdH1-|j&vvAaEl+@_QnY6m`PJF%7CR+Fz0reZaU zJt}$PMK}FaNu^M9SHOTKrDO@I#F7)Ae&`5#_jB*3QNn%^USY{s@ydhGj>-V3{FRaq zDp%)lT2dWQvBQ{PG@HCE%_(g5_L@qK)1aXje@aDA>c{V4u^j zINlzVEO}JCYpWQ_G%XN;a?^iB@AE>Q!=-@f#E5GkC4PGpQehwg+g=J($;*T?(WVdv z?$4x`^>{%>lwjlL@7`FcZS`{!p4Eq8E0#DK$1}$zi;bpMWlZ2{QPu}uk;zG=Ntfn; zA+-B5+*kg-A?~`mkG=?W+-u6ccM6Cg{N> zte{OOqI1iHV+t2o!`HnhBd?kov10E2c}6go-=aNchm;6Y)%W)vOOUj%n&~`U zG+><=4H8LU;~Qe+-g{T3ar%~mYW%1m%c~)Jk2Cm05!M|Vuy#bO=TA9{l6nh>!{=I@ zcjBCg74FA{?lG8Geh5Nt%c#0AY_R`-*=}$aNG^$eQ|=t7WC7R@K!`@RCDvvmNHT%) z2uTZsjn9TWx%RrWW7In7y@Y15C!vMmeY8NHUH?A{jl^ZtctN4I3Q!l{cMxcR0O2Hu=XFd6pE2GoEAUXBitrJG5Ckl<+OE4$32cb7SPD z>?Fb1jV6z32dL-!V6yxy^E%bU)y5p|yZpO56w?Y=r-6=Z-LP3`t#D4~szwI%cVPGJ zdu*f<#j%mF#eK5j7Ino*g%3-UB7j_wpXccQe@>P2H`LCK(RF1Sx8|gZ`G8zVXnLQH zw0X>2!*DIHBPI15!{{2YCrqIOAGgxz*4j{%B?8m0E<1K zFD&ecpTA@{0nd(Y|0JYECD<<4KESe(>Dbu2vgh`ou_`Q~Y^7@+dD^N%{Y@Gb&ts<^ zBQCs`!I_|K$rt1sb1~}8z!3g*al<40&MrlHU+cy=fcF*_t;g#?8@hb?N6doA^nRe? zeT~~0C+$IM*7vw2v7g|MTa9?pAAHt{r5JP>`*nP&Toq0@Q;Q5Q7oggHRW@SJU#9_Yqr_( z+?;Bn@P!NVxH`^J<0JFUU5nyfa3#x}Hhx{_S~7Whdf6%n{oqB`&7{-SNWzFihDg^Q zl{(f2K)9SO#W>!J=V6dyx!d0Q16<}LCwE?Xjgw8U#Jo1bRL_gM4!bEJs;wOvR+LgY zK?zVYfc9$$$PWX6;LKP9xC##M%R3A^;vdyadh(H$6KENgj5)y0ahD?*GZjEWWK`5h7+*0N%mElQuC8&O*2V5a*R3h)*V`4jtCIPEryXQ;;D z2<(WM=Hp$seepMR zZWf4tIqtwNYsfsP#zf=k)A*OJIXSx){#<%*2?s!Wg`2NF*Xvm7a5eRU{2D?i{z35qzkqfFXX>5Udqd@ABDExN9 zdcfugZoStmbv3Y2?=q+Lrr%W}kY;&E^x}HPo~)cRb_u}81xmwrN<@5xjCuf+m2qX- zF($+y%85@NUotSTHc09%V8v@nnXv2PFowbT&MAI}l0O#^`GNaz8f)Fuueg+Od?aW1 zJ7ln9-}K~aP>b#>36fOE(I_h;GrLB|;Efc_KbZAZE4NZ?h8$QJYx0IwYP3+b5DR1 z$~!s6_9F$AF&Lyy9|;0NyIKH#Kz!kxE$&q4`NNoEA8drm6QuyVa&YL;@2d~y#(k+V zEk(;b%H$Eq0C6}2^tCmO%($H?@^QTDX=VO|7xO4l%`IP5aCy; z;a#>o#zl|8V}yaF4Jw^jvvWyA8WE=vA7j3+gUKt78Ade9g;v@9R;Z!iru*9~rpekz z0Rh8cvIXF0j%B>#a+qjQf@~U01%q{x6m_Lkkrg~H5s`Cv($j0Po2H7O-=qx3i88X> zr(+6lnc`e?3as;U%v%57$^opna8x<#{~2{yD>2_0UM0ta z4=qyHUKl}q+# zzzV=mAbmzzc_Z2I++3*rt2OJc85=)qbj6!)pVMkfc>f2H5Z7eM+ z%TK{utbK6mb2rFGMI=FpU$Kz0wx-yrelagIk*Ib4Jwqp0aa6so=Y^|vJD>8ddd zY5ZxiGx=zXmai&g&tN2{&t_DWcTY@b-eHfSIzjxOSI|Q?h;&ZT#`>B~VN9`BI8xCu zEH3f#y*MBVmVENnWr)mkuhmP|^!C2Rpvw>#n8I`Rb&Ab>RgEGA3MJFRJqN1b$bm-w z!Rl6x5W=oO*=vES-{sGl1CO5XuKl2_P*I-xCcog{#aw*;O01!hM@0rBz#5~fOxtmi zdK?rBwHSt2uEk~eD>0vzwl(+&cNHM0?;}gCEwvwMXWJplevh&%(sG(R zVWey_Zw&mPJ@|1>9}`ibS^b4O0Q%U7YVWd$JTcb}zPA60C^--M+CTz~-?XErfS-K)ydld*Kn8xw7tn_-;gH2-zZsSZk6{trcl(W}mQ7R{ z1H&w}Nb701wC2!X<6c*t7$6J4a#-8G$1wnlf==2|pDM_4&eVVGvCrGQTAr<4uRPUZ zoStpXd{q%(;Ne;dq<_QlnTRk^p8xR<8VaeRbrfQ?Bq3@Czh6nZt~d=E&|9Rqr-arp z0T0by4i=yqfZ2H?hsU|D%#sXjoFZ*Dzor|ub@6HXv8sQN*?!giLd9qA=I~=xk>VlF z`XRZ$Y|b>zHHjWGHc^TvJ12k94bULutD}VbVo7Cva8u8Kqg_-MtXFGq4$5#3SV>h%^pJ{!}(EAK+HqSP%Ir6!yR$%a#aD^rqRUH@56( zdv@da-iT*2cTe=YX(HhQWS6q2*~DjcL-X-{eZ|Mr$wCBC%vGhZV4knMN%(p;lSmE z-srPc%FM1bgO|0P4LXyEpAX&7MLEZqm)#yq&`HGIK7tbjU zOuD}y_Cctu16i#~RpI5c_LF!7&_BP}?hwR1^u<>K{Ew4roj*>KiMTOIZSAXe-;m|G zT>!HhvZ_99TpTboYqGH=lp}`hYdq52D?w0V5u=B%f>4@NemUx0%9qWE)f9-uS%2NM z{&Gg7ZDX?*RW%xwY7r&Sg@uPHlDh&R7I$) z-I*EcmghmxAL`BM%U0a%HyKC>`${$ND7K$_c!D%U zE$yf(6MuOfLoqKI@PNQXm(M8y$r|WZ=jtSHtZOqc0-R?}SuD!ZQ8U75fPiowujE82 ziu8e_`0+P!riWa#PR+(BuxsUxbgAQ&>YWAhv(Y4?Z7Lmnauj*4FHb)QHfEy*mq6j( zMsvFC@l%u03H=;3x7)Z%CI(4_L-y=ZUkw2Fjj7i;&>q)nE3YjkJgPy zWip2ag_UOT&Y|Zfv7lR2JecCBib~U)k(Yr@jEqUCqSikL(pXaO+vdaLtg@}2I;r|T zsH$0t+IDhb>@XT8_2d#>zj2CQ9B0DI=r(RNgJg1> zru~fF5r~aeqm_`(p;YeIlFADII&>P+7MbOfYKCjq7kf1np#1?I59$#|8BTt>%4#Do z<{mRcNH)w|>TxCG#*3%VAlLytraj3iNS3r$54wB8FA;)+5!!yvW3322LY6Ok*{u?S z1UoAjU=Dbe!@c2}cVx6$0jQp!|MIu6C;&Yysgql_XpUNRCj!CRVlRT6gn4)1>E?OJ zoU1YM{;Jv2o%}J$Cn4SLKxlM<1MS14uGkE0&`&wxEV`DwISP|h#%x{2`z8QPvQu0w zxJ#6(?MDBOAdz;A+f?Ct{S4b%R!adk05{y zm&-j~4OP5W;?udI4~(^9??(CCTq>n#*xHAfYG(4o!;Tg(ADVVy-r!Rsj~gL^VgHZi zsVi$yleoE#zYnWNwv zv2gN!XW$zEisUx@_gmp)@(yRw^*i@j+=V9q1d|$Qo5Wt9@i(pHoSvXv-4c7q%R|8d z^sA*0zAXtpxIW_Qf{3F5M?eDD#a!+iv+N4YjId6M$deQ<@HNp(Au+rj-hMhX>&H^<5#?!qI!oHV`i`|E=b6Of`n znaGq6>sM9OtjrwdATgPgwFQ!MOSDU@3B`%1h^UvtasGmNkJY?0N^|O9a=`K4?i4<{ z-0I2Q*nWkOyD$k?s!d2D8eU8u+e~&k?a%p*FZqK0H!&hE7+FE1D(`SN+C1@Eknd&9 z_qd>oT(|e%we!y6^E5+hDD0ccwGpuC{BWZ4;alONNCHHtRiPO1V16~*yWzwpACi*-dK09}e2<9OYH2>_F zDigQ&x&tNDnlvGlzw^iWDH)IB$9WUNDMIN}lRP2YVlceegt-mbJ6W9=+K>!icw>qS zRT+arlHOhtlk5KeFQ(66w1KWGU{yYw|2LSEk)BH#;zko%c7ip5#v4*!G@~M1Gq;M%jiI6=MoDO?dcFtnSvV9l z1V4wJcV&q4!GcTP0Y|L#JqIf@33n$vgkmcUk{CJhK}tG4smmsx^mSm`h>ZD@#dGmKFAvU6i@NOBxx>3m!T6i|ssa1e8 zCqQ7>SbW9jIWkL|3S)J;rQ_9G#iiC&-6N!+lc&>uT)Wka@Sdr_u5X{8)?C#-j}PTE zGx46+P$9YbSBggJQ8?gKE(=8C={+jVDP>_;FPSgo$l)>C0m~Fofgtq16`i zUxW0Yw48^c-VkdM2GmwqAadK?{`9i+fj079EY6;C=@~QD3Fy{dMyi1+_lnomwv+i` zT3wxY;Mcrp106H49CSlziq-FMt)c2H$L&J<)cgKe&4q}cMMP;mhV!o;Ta-r68l32` zb70s<^xb~U6)kTUFN#3S=H!%pO`)Mg?u%vi6J64uE-6}nizqZ&Esxrn<+)3 zMVHUik7!E4ZjJLKahzrZP-5c82p60{7AF1F7!h1bs&BApTk}ruObKQtC%6F(aDCmT z-?}Xm000L-L7t{X5iEZ@p-fh52c>nO9|Cm{Qj7tLYM6=0V(pO{ZGJirDu^rS`JcL& zi1EP8SzS|P9;Q9ThMP3<6_NqVOR$nt12Lpzpw_i`97)3}bXXlgkS?=B@&tb}4C_qC z&naEhp4_OoVN-+e6N1YRe|v4D4(jUUCqW6Y~Iw;Uo+NANT(=_YNMO1V^?g2*1@LF^N0 zM~6z@Cq9dI?Vfcv0-aBxNj@0Mq(UXrZQGl?YBg?J*n$;maaV7>*};nAx#QYEht39x z+dnf}LFLQp{~K(pog=XndJm#7{I`+%W#u}`3jxETL3$W2G(j+g4n&iftL~e0M zVjvVy$4`ayu)E~+Hsi?9o~U!wdJ9suDai}_Gzd*7FK+3grXMOF^NKayj50#!8a6&h zFnhu%(lGi{u(3yTN}#X;AI9H$T{`|u_TfZHv==4Kr-8amQ@5AoFZ~BLx|jn-Th{RP16P z{cb{B;OzEan&A7UnbX6OZ9MY0w1y`cK5RE54+30l&fa}-fAg-XRxRMoWl%R8w9E*S zWcd(ZsSGm-n9<|?+>Js)r|;d!Pq567h<8zr3*iDx*@7)E=cmc9add<%R#(ghrz}_B zUas_p;qo;&7;U6raVyS}Dl!YuU7Ib`ph@O+&6inp73Tj@2+4#A*3e?&;=}g4ZR<-wG@&w|)Pym#L230I*7=UJ z#fGqGqdA*0u5oUFPeZJRUg~+2P~wDuHWd*P#(pa}SSC;{&V(iyIvo7_=&X())&yfo z6SpQHG?oYm8_v)Io{)XjliJ)l_mr5>bTyV_p6=bG<&okaa%Fl~IoYkz%Tkh`h`uC8 zQuDTpZZXF3<-tWIna14>5wV>safv$=fn*()^@f=WA ztiw>m$P$=owS(-s%TBPYr`40Ymo~N${pE>!oS|sb_d#){nuL_|onw%5hw-RF6gSPCeZCyj_!|kBl_-Hpt$MZMflqHv?*kJSGNkF;A zT#CCEm+Q*Ahq@QL4HvFpHeQOv`E%4R+svkF@&i5mOxl<;J9N?IFcR9bM_z0g3G}>(&z`;}w z5&QISI7L5c)vo!Zp0OS3l%tN`=kk z`}GA4AtLrkCgsa~xL3((mKo{z6*OKwbuKVt5ZC3HKoj*^`_X>}d=`^5A_y-SdvwT3$ax=ev!_QkK> zJZ^S6siC#tK{UY6(2s-&VwQrBHNuS{(rThv63)<+2&62J(dNr zJUYLztT5oeG2}m8p{kx!EY&<6L(217z9+T%eUjh5IyiL{@evl=D9XiJp*fju8gp=! zRFxGp-nDpAXxP55iqSMEKj~6@HY7)*7Gx#df>$J8ld(uUC9PYZ@Vz2rM=FPsft_5-|@{8X)GEVK@MJ=y%K>Zu&@vXF5g~(1GRt0|o)|)ZXkgBsZpQ624~I zFBS~qBBucH5s<;kp(kfw#?)(1#0DI3rGT$AbwgYGXh=uT5LA+3Q9Cdeiz%CQOA&=9 zuxh4}0SjgZ5M-or!e7BUXkd{cma0zDg~*}vC?R`S0Xenl6T|ywBoSq&5QUqV)fnk2 z&(^VMSsQ)Q(vA!bY%d7-Ed$lkYc1d*14GGrqfe8qY z@WU7Xk{`N}5lDbSvBWq%p5esyS^nT97{xR2MF{;`~l z0M5qBMS)k^Bc0*h@$$r;>qKyz&sd9}9_)TTINn9=>(GYDCF69rBG9Z9fc45P! z5O%vNtZYawTzIoK7cTZ`arh-tl0eoqkHR^-4$D!TnN6ig^{L997vl_Jd=K|TZh1LK zFz9N?7rHUX`~isyA?)q}-sn8qcR#mnQ4d~R!ubAhw-o~@+x*}Ve{X6QU2)ymkB9Y) zd}=<;xnKb=4LJqT6p>lH`|CjC%~j_wW`-WX?d3++W6)5rfJ{7uy$565s~o5&mi-yl z(XqESgsLzdVEkq?BQ%+>>z^O{$XG1L8}j6mk2S=udUCW!hy;A&5`p@kM0Wpi3N%xVi?>OLdriY)cFHSXeAK8n9 zRkd$)bOZ;k4ApGJQrjMcg-XROvRCQ>f!;8yyDSNw!4@F~_p3Ygisx_|L*x6s-~`ZR zJf6Kjs`0ZB3t00LZ##BI+KAp>PZirdSK2|2G9IPy+YBYi+~fhBCjW^RS?sLbgR zn>azW{OLC~H%geA56!CecYOvs}Ge&_82~9K8HUz3Ss0 z`}iqX<)|WXT-DbRYw0$?@HdGM4!U+>#NCkOfV#zbdLK`zev^yn4S zi>REBOLvcjRqTR36C=NGOK|;7fl16mj}N)6Nnlse9fL{D2>Kr_R3*c{BfWC}h4Ju> zJzQfE0~P~cKl>sloeZ+Zv`mSgoNU^47vrCm(g<3n!_alT3{boqyr8^VX0-FW0q65G z^id6*nX0T}b@!tX=lo&^lL;0Ne+NxK*Cs55z&1EZP@);p=+<`k-L# z3?gX58DtLS0O=LHp_Z31)hC?q!ZB6TYXvTxY29YEa=o=xx>`2C0P`C* z+W_t*AK4T2c!4=dLp+eK_d?gBipru3gfCmugPGVPPNo}m;OQ$>dNjqWjocWrhv8Cf z+yCy~S~m&Dzmz!>^r6r_Sa)GKk;mUaMX}_FM3&eB|UA@O|=M4{L_ z6bCF(T6=L|y_ojk`D&eS+Z?V-xeW)5I}(pS7MH;s=CZM`o+qyK=FzJktqg?@4jDHH zdvRvr;FW}Ke?jZCktL8uXHfTWnmAD9s|+K*Du-lsl_5?MfY?bIdc9amzMfwf<{yM# z3EpJVtS}=s7t!LY!l4O{8kx%4%j{yd$bu$2c?v$Jw9H=he83Dm-%=7R*PFy4RG*ZFA5sM$VCa9A0C%>}Y!e`VEPLS(?^4=gibQJY0l_W_vHxQ$EFmrlaxlx)oLXt? zhmLF&j^K6lyCgvjq>?O~9S?cFje9KjKP#xrLL`6_LBdf&B+iLN2CElF< zYjlfe;lBRHf2VU%{JWMtn~8UUpA|PyRw-+1{IMB0arU=aZ^K?*3){1i%>2E{1Br2D zg%F&-IrOiP$7ZG^gu;B{W(d5G=1_GpO&d3TBl}SCXsdo;F+Fwwkswd1bcEo~KEJvN zU`<^gF?GW^M{`F8N>@DAhBKNDG0+H1{2z=2*LSj&?9qT)lm%fnJNDRE_dB8N%B+?> zBAQpAe5;2O((8Y}@#$RLDVu&s*zJnVkJ@%%5B@4huSS_eqk z<_S0?t){T7z~bvJ6SVmY@_jYbv^&D(3uwBdsOY-tCPK2Fah|;wB;!Q#>{EiEXl#WY zm}`siKPFG!JLMtAASiycq=qlIBR-|0JrM1yezLGBsB&mFz9P+%$?4(63YLj#u({r- zVJ7ZdOH)*h`gt`|EXdyqzQ4T4`&;P`8BLTESoIt_&fgd65>OBQKkHIOLGvRgwy)8V^M#yqh$-ZiR?)~Rxh zEN~ctDVB!8z!m5YI-9On6R7U3;3a&dN=v0SHgt<6AH~jGyCdX?v%wg4U_-JOSsrH? z-K&Jp%2qK&nKYmy3YbIoP3Y~Bw<-BOS5Vvv5qJk+f1op@n;DKsIi`HkF)@CgZQn8$o7D(i-)jz25YO{k@I4Wg_0ZE95 zw5D)N9j3i;4)?HlNiiG*9P|m|&@r;=cEI3tUd;YGusx{$FH*W~d$nrRW1c7$Fr_2O z*sNXSN3jMZ+mzB>Q#e)~&(m?b6Wzb}0PTL!wBnj%n036$3 z5B0My5wcUM6b#a7N{3Mu(2k<(ZzvoHp!dosrT~gk%D6S#>|Hn9(`xBmH6OV(>G%G%{5X)H>8%hinGU4MD=(9?cvLE z#sQ)4Vn@i%FK$rpM`>Nl!6^TrhUj#}`JO6vU(q(nMarO^B~~DbzS$hiZ%xUv<6Zvu z;li)qd>$ptVHWCu;e`Y-fDg2zs2I(cQ$7EQ>%8|JDJm4uD$?w0baQA3IB#j`f9eP}DXYly<-T;TXG3?^HOlq~o5U(O7j3h9hr@AZW#rFInFh>27=XFpa<=q*Lw z*Tvo0vOD|D8L9z^^e|!W<>J377{Oou^Rq2Xx0<$vL{Xy|M^PQs*ySMa)xIOs7Ts)e zA`c5-n-oi(69CVb#Vb7SEw8jU2H&Zb#<4@R|M1Y@nU7hup+7CX4^m;AR`qcJ{nRec z+cqiT1`aj)m>aKFDxAPj3WJSWPN>9zS?YE(N}5nUKQ|Q$Nng~$gDG{qltRjw`zx#Z z5Mf^4Ep(Nt0fnG|!XfGVR|^fcmQ7$EV2hc8Q@HO$|FfciM_SFHudOnb3(5%XPJ1s? z6{nh)1SyF7-ids+(F;qfARbOemK_%Qs~enFzjL*F#!Ou@PAv%6%blwM7X8!wBhhZ7 zU(wy;I0$M<$o!=soWknD``b0}MsfgCK&-!nM@SiY_k#Dxa!5W%G+j&zmORa2%0LB~ z#CoS&f~+pCdQ7j<`!yMc2jT7mAgZX&Q|!T)+?b+nnb_9GK}&y^6z7OD2)WO_0dA7L zya88`pUmwNW2mUxEUfArcZlEa!;;f6bWS)^ECixgr#DWh8{n=dI9yqiO*yD29(yG5 zPbvUd965Z6+D%z?`O9%ER_9}lk18PRPg_s7+`9*R@~*QZY#2z(V@Rxekj5dGMp}9f zyiMF2S}_3+M0#2A^>^-d*%|NJtXB$R+2XRUX=dK?vK2fIRlWx$XM`x_c9u%VWmv%4 zD5+f>fd=@9xu2b#$t&mr&GB_`e`Kme2c&rnRBMVC;4-h;vR?PMaSOOloheC5sJ?9G zjkA`&vU>Cy!hlWFUTwY&5Bs1%-f}k^-*$W|MLv5$Ny%K)kLjGek7%|q--)FSv-v#7 z-T#`1gqj%KrZk0bM}937de&<*5R<#mG?J6G zWfvoGA4-xJ=@Qm6iN4?lAW1x%g`~yA??ka$j_~9g2Bi-2*Cgwj9r!uc#H><4r#fQs z&!LIbp^ps)J~{YVO3jvYwndY=hI=^BF3+s$&`~kKLx$GKsDIjB0hokp?HG)SkGVHox1w+#*%8Z}INu18QRB*Cec1`A%M@bW-OmA@f$kUELus zo)T&Uf&3HESJvijNOo9MXo>QLWW0sU=hiB1BVB?~y@hMVk?;et)oPdr+po|7PqZeV zkqOmPif`k-OJn{GH24rJws-gqeI~RNhd;>xZaEIagxhuh{Zo$~NA$4IUzrS3mRTUe zg0y#zD0IyPvDbaXbbBDi@%<6~e&fAE!z)*NC^K|N3JM`KNX-ML+nRh#s87g`hRmI zX>+h?_C&*yxxQFZEVvW#w3WPNRTWSz)H%A#XIQ%|vZdz^r66u}Wav+LF07*!$yTAe z)clQ^;{=*xey4MY^tDotVo9rI028I;zh1#sRfPOvyiMKL#XxQ}FN3{@xrAH2+S;yQ`dMg_w@TT)f5KKPzGgm!pkPT$wAlih{o7LF*(# z2hr(D$dNRzKJP3#$q5#Bw)FD$4it+xrWoXa=Ey)Bb)w1R{WX3D3q^ixImhTjg&Dqw z06sPr7SDUQ4u*pHuQU<*P#h7|cQXdrQpAIu36Hm-3;Mj#eoqL>{{ybH zK+7Ip7O=~aL~S`Y-o4>iG1mX*;V3iu5y3&KQCtnNJ{UO!@asi*hy@reaxtO~FWurS zJL#}liYY{DcKV6iC7tA9h1ekr6U)|_FS2!Ys_ESkHR9Z}+8)9S^y++(h`MqVl3olT z0F+dNsvy!U!T|Qp6#_jxvrN~h2TaMKFjiPvtn3;IzYSUd;l$eddm5BQ&;@3d(?9a* z7c06#T&MG>b;n2+Ktr zRML<`tPw8z{cRX}13P^YQ#adwr+e}(X5m0_XBB)f1YKtV;T9d>K&TM){{g5>Ti&q;wL~bAOkesGxp2=f7&$ESzC{si8MVi{ zt)OZ7+%NAzJ2@jOFD@2QQZvh^#s#kY9(zc;=ov4o5+2%LF8rD`C~#X{cd-^Ch=^-K zQyKg-IL^{sO!?yjJAX_lP+sF76Z@a|Ob=-Ff3BZ?Ey38uF+j4@X_n$=A8Q1^CQg#+ zXY9d;Rz!J0lSC+$Ivja@h_N%wB~(GvSLw|ELk6F~FRf;^qIX3EwG<#r*^m6r2S9h@DAD zt0!L)+nJhRRifMq6+wstbPih63?HQLD9dYS1#N!b(j?a;z#)fIB_lEe6T;`0sRY_> z)rQITD)pJcB^dED@VCHixzxm9bec0mTifdFGbl+Nh~y9cDjT977DKbBnbRC5dz7IrHX-L`2!xavDcv#T4lnHqasyC<|7bl)*c?fl3; z)(&(kGnbw`8EX@TsM6(lj9(4@533%h683&S;#BBIXhuH3OxZr%5W3Lypl_dzFiZ za$&En^9>jUE;&kYfVF02U(xiD4O)`l2XI)V;9)<>Sk&?hPmTsyNmKZ+ss!YypY2ZS z<*z3;ouvVA@TE0OC&b72z|HV{`$lqCJ2JPWuSOR&k|6h&W_Y|U$xud*vkGk87=(#| zY&x2GqJ`VT_LL*p47RT~DV`#+q(FQ!HRcVA5L)g4D@)#w`BTt@K*DD+vV)~HtcL*y zrPb__4eL+TThm#DBGto{ix3gS(@twvGa027!48?KYndd<8Esc11}T73s8OXf^&w{4 z+D-NW_{gCt%Y_#;$3a@+ynbqprly>Emci0)Sa%id`exd98=}UGbb@IrMn{Xy>9DFf z5O~4eD^(=`01!Swp6W#vEF=GMa?S#7b3Y}Ddg4#uXx|<5M#MoGRBL$#vxHCT^$)hton)>`wWb)MJAKMhwb-Hu+9qb_rO`WTbD_UyPy_fovg3v zZMaX0mZOQRatjR(AWoKG>jCrCrnfg#a+m}OjlWgvGmarkrlT}j{E@!1-FFnXqy%3L zzmsSR2#R`SHcKH`_Lg+!{*F63uzWfGnXutVGJe@r73dNpttfHg- z)x8Poeh;>WYBOwpUJNlb8P-ambXElex9RZ?G@ky&O2d6WR8r+?^({WPQi3;-s4LW%vP*6ax^4*xpW&n&W+GVWHTD3ls%X!jD;XlT~B^+Fa zpo`Vt7X_HkrQa*Sgj?sDl|2mzrKMBuWqmxKU0EWW=J z{ypW0Z62&T#qkR2H@NX0pLBH{$Xtot_oKA>Y_@$Qqmme5D0+^M*&!Dh&rI*L)l)nacpHyO=C&u-a@L45I{uySAM^*SyM zgB9d}{rb=1_&n7q8U{k@WRdJH!`R0+r*N_&-RfaaKa4l}smYKhaBlkpx<9CoFPo#Q zZaXk(HAaQ<&_)S;kX7!%eb+v>e}d? z+Z!7tkEES!qlu-1PYkWew1G!SFK$$%V$C}i{p`B%3EcJ)VI2bF3;aUmPA0))v)%B6 zZ9(?hX@EXfCHfnbNky6-i%nUD24Z@G8?MGK6faRTXPtz!vuD#TUl=hlZ68a1T8Q_W zLIC-pIN|tCpC_pA9PHg@h*;{@4AAq@^Rj35Z;X#SkS=b{s43;i`7jbGZ-5TDIn+=jgtZMn?K7 zST3GtVSZ@pGsb&$uJ`oowsvDbB}nzyQgCx$`+`-Ojw_hy1#py)O@WLA;D1Q{+5Jvh!X@Q>y{XsQ{7a z*7ZXv7*hl?u&E}r77J|xnL2D^NhD5e$8WvZ_Qm3>DZe@xw+O3}%3@$f>Q%d1e9RC- z*X%y*HEh#^atZ{OY+eZ*tf;gi-z;pEh(okzKul;A03kPbrYqI)C5jlJTxAc@2P)bA za3D6dv%_N4Aa&!`*z*HOhUoAZSFIk#XD4a+9&EJcj6aRcrp1JXtK1|pbw$}BLT>r6 z%RDy6{$7!)@IVQWm-aNwZslpv#K=CFCVndAl^mF9`J2CfD+?CJQ*6)WWfmQQy=18oxxX&_7@8`LGj1mI|IKh z$EFUQ2SqxZTi4-PXHR$?n)Izsnz=1x_-XcoRW$o8;48aCf^;mk)sKa#FKx=IWlIXY}mc{oB-lRG!d6Y(M z3t8vXxw-P&fV*FlR4y>S=vN@(i#4>L_MGOnjxz!gaT>t-&pokMc*hjj#|E@ioP{tJ z9eB1B;mnos>{3!fUigbT(~bTi`Q5wgF6IuDyy&XB*fL`BHmGj8ckxGRVrm6_Xcpd?DzY?}7B>tJt`J z<8O>eekWytlWBZVZg?%;Wv8f-O+E35YEkU#zB_Ri^I47{#dnM=@dG`6%MGsjbb-#V4uV~}V4J>?j0#YJvQ}Ox~e4xhQ8wJW-&3gv2fe39V zO0UXMP9^ut0P;)!we6>S>G)CuoA2gohKwoUlhsPb$!ffNyWm+{ACbO}{35CS0bwUk zpuz0iQ-~(n!~Ge>08i8+|4$@v^L^sVv$yQGV)CR^Jr^Y09mo$reDGM`pn^?+9plIn z?}{!APn)Byz1bNZOg+-jKNqp-HUQ8p%CXqu&;_4XZOFv6(X<7??h=WIPC;gBnKWc^ zjpY2oHr( z7GX%LAIr!LTHsJez?%s|Ia#tNq+R@%t3TAXLS$h9?O%?>y1_R{s_cLWw2Xa2w;(or zNO33uX}DdVBs{b;SXF6-NDs7cUt~I!zYUQMG{*zL**ka8zTv;!k>g+NQa|x8@AYas zv~*F(2hGuUKF0@MSz!oWzjUk7#Xr^8l$8J07t!l|&yn-oGdQ7}D&n&E@A%e-LZTvb zh7za6a&!j^CQojSMg^th9L9X0gcUg{Egipz_};LL4PyBX&T*Nfq14pM;}0?8do>!0 zZ%!!?Qnkerq|b!qMvalcsj<3V%^op5j}a=cUNg4f_P)vlzTnYaSJ;u`Sww{C&q`8OgKkd|v;bcJwio z&P2)f*i1;r%&ataR&&cn=ym&p{DKdvbo%KXjaJ*rb~u_9l6u51>m&DGPUQvVqDmaB zcySRCE;UvZGXR=HQP0A(*C?rw?+N?iaTbfR*hK<_3c~e)bCP*`JiPI;RmCXFKJNNM z+;!8Xej^IFepU)5B4EoTZ5~52lpwI97>0dHhX|KbiopI?M*vrLI@6!7CA(*+Z!@4- zJ2A-|5C({izkFyxx7lucdsAD}#BYz@5exHuh2)I`DC6RTF_1v367Oz&?JOH{A8;NVGs zitO&c5vUd|#|r+Sos71^v^-m$(BHpH5R%Xfg~&*m8i00t%mU<45K{RvQ$igxr`81M zQXg);@^GlYJ@p{EQg%tSCQDf?@Xr9)4OfJV@h8e@ljs98T|yLpg2D>eS`(dtwPdTV z{8zGb)b+rrkrH$+J5jygCPd;d-?J>Gsw?7HPyZ~Kp#QB98^&u*e$N^vAmHwi-ep5* z4DPf$?=$d2p^vdyX<`|rb|LX^eCrkWhu*14yJRW43b6n!_7-1+&kVRNrc5~KuxWCE z&t-pMXfgio!_r~IpA0pT;2QpE$7kuLYip@N%?LBQWSP2OVq&Iyi8H+6Dk+x3kakBN z0OkX0yO-4pHgu1!c8$KX;Fql(AZZJ)mBnDi_3O^*$qWS0RHJm^nH0UpdYkzo%=sxlfa~1{B7@6`^WIbey zIOb5%kiy{xB&6qaNzA^%l6*Z#J$2qrK2TNfd%+DnG8zD;6C}MO5b51&k=NueV4==l z{d)(~Z_?Zh8yy(~FGFz>b7s7VYG%g?%$nj&^Q9G~7?N(+efI@+)4N|Tudvs|wbPlk z251%r0>^AfpTDeq+P@xe*_X&=WYrcg0lBH~-aHlXlT?34u32O`t0K+3F8Z@z29b6N z(FuO4sbgT-^)?BINp|VpsKT6JSrryOFs%Iq_KILQsDiUDixbIHarsTX9!&~~-}7P& z|B)A0$UcAjHd|2Lj@MqNZZUkC!E5Fq=K8tSi+xr@Tbe5UYq8Q5$Wm=rF4jA7_<{4L ziSy9E#w1t>*#c47Ap9YT_se7_O=)8LN~!92ywvY-#kD>0rGk6_uC5+JPnxOMZ48hv za0!aWUq(lUO=gqncXuT10^Q_vqU z$5h&+&H5+5cKK(+gpR)^v3=@O=qTYC{c*3x z!|8h)f@|o}$QC~XM0^Z*%T&mf@0!JH@u3d00PGrw*1 z8uh!(TjoNWUnX{=91{Vir9{LLdq9J*Wxx>lGPcBzf2>%_c=CzI^Qo24YkP*ELGW1XoTx{pJL|8z;h`ggT@US*z zx*{rfdN7-aTeZ%!hvRDSJq9U+S}GZS5SL4~Szv$!DXKW0*)cWrdKS zBzis)-1bI-n@J>AWP@Ki1n3Q$y|BTSfD|%XDQ+>?c1!Ku(mHSDF$LYib{0`n&T}UO zH?`1F;(pF!GXZ%JYLnJLb;al6-=|i@lZJv<@+en_;do1>@G4RZn(2YVXNlAj{i&pA zIX8CicX$)?lZbNRtr3E+OjA4-jOZ&j)6ChVn&3IHLYuWMTYefFY%6<8D3OQ&E&uKq zC}Fm>!hPj8(wJ+eaBvC}odmLELt%vQZ(b?UDh}TA$_HatH8VPuvEFIqQ!cG7A~@lS+e}e~GI# z3RkYYjDsZQMM54%YA+6#JeO5uMyj)uvs zHD~j`kM|0v!2kdVE&-njbVvVpYtoX$v8e?DlV+%lb>d`SBB=IAsMi;Lv^pNz4>dmz zfHx)zt1}lT*qFTY1!@@&+XaxEh@w_1TuM=CMPjSLe6>USRJu?Ggixtk3`;6}umqy) zqbQETtgZ^ao>U}|SUjml9ZNU0sA-7mf_NJow7vhKjH&4eh)lUDb=p;=BK);PP0(w7X%`FbQHalTq|ZrU*%Uz}Xnf_(nlqOEqzr0;h}QiP>L z7U^Vo9BufGaT-|VBw0z4=4;frJ`diQ9yquX?Fd@npv%;5GcO`#1vz1)Od(jTKbqH8 zOi{Z#y8eAk>NZgLKFZaS14is~(w8Blr@}MGb%BPKyOC`b4y^i%C&$+_Jntd3 zCcn5aEZBK-ib4|3?YdS2mS(1W_7Hn^G~iN_{*(BnDOvR8p|S zelNB#E(cu^c!{T!2QZ4&_rx%=_r%k&Tn5+Ez24n63p)Gkguj0+rIw2mI3I#B@_vwYRS4ze{{r^=(Cza2{ zR5KQCSgz_G4`?Ho?Bx^DIk+psWj#S3H>IfVJ9MyL*tk%|Q>A>YmQCJVsCVdtX1(Ht zPanmw3qsZ+rEC;>*%_3e2I8x9XIh!HRoc^qMuzXMxr$V2m#3&2VPE(QQk<8h;&^Jx zIFBSz!G7XgI=v}Z#g&yCnu~0`cWG(Ethbl@?a~7BVST~|Y)B8_k>2)RYxXfQ#ihzIZiqHT%)*{;_4S!6TdH<O6r2tTUcc+NQ)v&A-k@0{pLR! zJOq$#uSXJS-)~tULGAP&tU`6qIjGO=cFJGAD=)rSZ4@lV^#m%nW8i3s(7HE0yAY#Y zQF5KuI{Hm6?crnfx{gyISJ!Tlw`mU#hVAqr>3qB~owRXKl|NupjaHfJZGOTu8cT2a zn*fzb%wmyLBRk2i9jn$P{(0*7vK7hX&PA!(p#D<#O0cA7G^{9yP_W!5hPx@Vbv%m7 z+%0fYfj?;XK9z~LUW7~3*4|EjtBuRAR56CiY{MYAfskUd)43*y4yUV) zR9{xoh+RwQ^xQ@aFmSK)t-Juj@Yx`B+RW_#1b5s24N$>i8d+S%g+hJtI_dF^Q&_4^ zO35(RrChAREZFLQ&9N?z*l)w&4*bj$EVE-FpE;Rw)iex9b7>{05~`UICA1B{>`HjH zp~2uE4@}Lr?-`%hx@lcyIB@}14<<(?PIr%aqC*49st6K48 zq+JLFEB>s;wE&|(Rd_CiRBQsB*OQ@sRU;4svmojWZ5fng>ihufqI4?hCrbM(*a0Op zsbl{Z0wn1IAGB{Pi@P*RLHCEf_V7jL;igW3U#-s-9aGd1F+fU=Sdh^DNj@8Tjf{?* zE_z&D*aMG~M(aaK5uwG9Ok++{EzIPWqYq%a-;Jc`-yv3{4}{!< zKS`Rf99gkkLGZ+PH0>`q=VG8|r?bXxjdUtIrk-rBw?;F<<95E%ahv;jFH`lsa=3i1 z<;`X>Df83ZC%p;e0QHN1MJVk%(d^mPTw!qEP*v_ADLJ>yC}zGY%MlfvB}GLNP5+cv>dSt@G&zeyV@5U)e?vf ztC0;R6X(9LJUWcaboK@uUm30NAzZ5HbCzK6RU%xwnre;HGZ;a~ac~fD935`~$65vl zJQCjm=8pTT9PY>*3aARxY5HlFZKlgq=7zuk00$TWp9^Y7|BMxf$l*i+Dgrc2U6nl? zeA|=_6jt_u7PzP-tsH-|h%+9R3xoi$T9Pb6`CKi(u(2qh_!gc9DSio7n~!j4PsNJ&Q@I#SL%d0Zk#Vg^+Gl08@+Bi?7IQO4 z-TaAgSzGAUq6MYn!zl8g*EM!jPVYOnSnQz_@YPo#4! zL7nZwjR<@+Gdm^p8WP1e=iI4~_QwmsFy??E>?aCyp}RC+ntc*7l>0kpwUo{xW$Ca@ z$hjg_SHrE{jKwT49K9slyjp}1Rw%5*O!)CybB#hyuKG+bJR@n|2?G_8h?nmyXJb8O zVF`nuFcoiB_~iXrU&Hf? zf@4b2KGQJtR)!;g2x=7h>(8Y1Qqvnt6l`xuK5n4oAsXA_&iB40_(r-rzy~7)S(}M2 z`15RpaCtL#uM1ZrbjB1b?g@gKYt7|ohV~+6%bZ^5t#i=_&u3oUg;{Urj=95@`X9x) zK;$Y__{mG!GVknzr`u_y$lJ0b>>SRD*L?y(mMJaL_->-ylXY|2T`KLujd#&fkMo$) zEtu*qr{_b<=Ayl7A}sgN0Ai!sp5D12@~ShIW@H@d?BU++MdYmV2HF-zv8G~w_Xk~H z36|b7BvQvQ;mS zd}EMrh-?w`T`Xg3iqmqlGVgrV6AOUt`a*Zt=sg#+U((&VFLPy`0JOADMJ;tROPETM z&o-!HDx`it!=i*yc1(a$c!{_%@3Z|IT*P5T)z}5+vM{IxE-x}Jt%xg36Q#c>Y8L+z z(w?w%@~SM!$UFG2bCjbsZbh)Hj$`-&QyA+JnceuN5gUWi1~d1DdrJ;QI>@Kw9;L}p zW2MD*XJ0%6sz_D22L3;L@`+lL14zXvgnnN&5B1|IFkR1d&r>Mr6)#;de|*LN*4y#D77jG~h(B5VTHDN|4u-ny`9ZzK*Jv_i#^eh;+L-V|}VCo^`Gd@X?CP z=Z`JMGKceE6a9fg#%KE{7hyk5hE*pnK%liA_ zsGdfX^gr(T?fTDnxW4sCgV3K;1DXs)%(%q`#HC-f_~Qa00+)3hcm7&*_|pvJOeB3A+kc`K?@J9h87#)MLY9j&N^i@~kXr|7JB-OE{;< zTZotVwYn#EEuTM-C>|dDrbt`aljxT?+ip18reYJhVyGfwXb#SOS0PV@&V0Enj!HNh zj=anKVAu z>*45mvl4)q3(On_p#PP~i%eMoL)I3ix7*bf-6={Nk4^nK=%Ovz4cmbuTNkgC+#qMo zE_rpEzF@t+9M95<9o2)}th8;{{7$VKXlN**U5@rpGSHDrtX~}9W)RPoQ3I_yTTB(X zS;>W@^n2{7j9HxL=yY5la%cwTm#qr&i(azztx*VI?H#_%=9a2&o-0FFL}VJ?s^W>E zPz^oj1<0%McUm%D6%OXMM6^l6Nd*RAq}lpH*GEa`>kufF43l6^;7u%CE2im9VzuqM@ zg4Qkya8h`AU2fHkJik=FZk+{@EF=vemhuELzCbo7d^DEW2~4v?Bk zI;a4mH;IGxp0vsF%;TMd@$IHgPdXNL;-j?&J2* zn{d@UnQZ8Gg$Q>72#=xRQ8_Ktk~kD;z>x__Fen#!)EP^|4HVwX)-c#h#wcz>YYo~O zak4GcU%h`+jCPV0@l%dTY3R`;!|x*muv6(&cd zIr{-fo~iuO1UC>ugrM{u9?bIa^#hT_XR6=NgQtwFgkO_^!(@Z&+k8-|cX-oGA%NS> zFMq0%XbPfJZ*-mDGaA6E*jP>Y4id@I*#AlY2Bdv#;{~pdwQVoZWPTj(t1s0{vuG?P z5t#l9TxQ}Y0Ku94O={t%eecqY-CK(0XJeOY^Vw-}u@mXq>Dv}>2x{Xr&U1GEp8S&O zFvaMvD__Bxy+;Mg571D}5hwDU_ILL%l_!}gG{==jV9{`h!c|6GWj|uhr^w~P9}*&a)}#!i4pTtTLLv(tx>MgGc~q)4sl}rr%GO9 zD=Oe{*>kX1zDZBVZ)sP#;LSz(3V8HHJIAO}v*tW$F_q)jVoLRROMs{8Nyvie@KT~L z6Hq0b7=gdZgy>Pgn6z`;8;jkvf6=j+hZgMpw4DJ!42VCNWg`|N)Tj^5EV_LaqPni6SZ3QTA6b@A3klK-P#FZ1byvF1Ab zfsDdwP;Y(Ch9Bb#sfHFw>U^r~Jq5GEZ+?n;oeE@Ja^M$kp~6piD21cQ##1S@TA;1G zh2Ba$hV6!wU;Ru)Z??@J z58=JnQ#R0aeuIw9KHQ$ywx81My@#m~{8Vd?F zn1YLxmdKGnRvnGMTZT;ypson#!blgV@R&a~bi?8l*(*)L~B1yo9R&+2vff7Is6?>oSwf)!ul> zgL>QQb(vazf`mFGo|uI5ZNUfHW(Wd~TE)P^1jf-EfrdI;AIZK@outpc^+}vJ$Lad2 zB+zC-UNI)v$T$iAL|t4Mr%9#1JjzGsG+=UQ)0U0F{YABnr?kx5R^~@LBcgVY`U%!P?(nbW zpICp`IVD^zL|KMLFpopvX@r#zf^h57HzAMr0Nd&`UkZ~zF%Zy(CWis5t-o)_tuW(@ z1{J>#!W;VEn%hK{a8|$9=uY~XQW)1*?kS?4)F1wiNiN$vy^}qctMk?y35Vgdh>RT5 z`97mc0_iogMLXA-PK7A6LSSg5i#QGgT1F4hOkuZ$Q37Lpss66j8q|vByUaA-DG%do z4_u9B@L)~WBzfI4j6x77LSWm<9Exxn#m3@OTuW5Wvv=^xSCf+R1~4>yx)C-Gu__5#jiBtgG_Mna1TWkMTXdUmHt506 z9}qHcXWOB3-{G5t=9p$6->6Hq0KweTW&R0f3=Eoh<5j?4oC7CWf^!)w-ixW zv{e2NWN6!?j!xT4PCdR~o}!i`geC+ksK*2>@}h{#V>79N&%ivobY%6`Q2>^bKrS`& zBcv1ngrDDzN_JZEZoNjIxN7@PDlH{$z-aBN$!%#clAK3;5k4Lg7+I^WHk9*L>Tm2Z z2o6OTdY}aUd?+Abd|!e=lBLJ zbMO72g9aH>-#USTb;xX?*W}-7B+f>Vay<#;I(l~wfR=4(r8!Bm#5AeQSQ{)DyDQC8 zjC!4qhFzXVN>3G7<9$#5IuPchU_a#(pawbn{5zUgA^$A3Quo4C<8y@vNQ9*+fU^2k8`ax|9EV?a6F zXirJO{=0W;7R^~_r+$9DMtNIJ!D}ix`Ql~M7(#k z4cC(!2YWU)G>aKqD>jOvgWCg&(5%+^Ydu^#uOQ<`*7Szp&3>257Z=NZF zjt3Eye$)-(KfUyoptdFY)2Zc~eWi1-Nnl7)_c9sKQ37tpGh&~qdn2yY%OI6ytI6q% z!|0)Va;cOn<0Enf$(FKsEflV-GEl9$TCYN=eg$=Vh?YhBR{O_0rd3%I3r&bbm89M9 zWM{-nzR|L&+3+^HR5+(>@dX>DEBP3M*I&R^k6;<8IJCs25d9E{I>bwlX2_%nAY*?% z09ZUP-iQtNeq$#Bb(a4EiUj|9WToQkH1&-mUa4LLJ4{8*xc+gh(7qr4XC)Uc#q%8k ziqu}LkHRtYptZR+!bb|`^@j@g7%K~Bz5@M^%OqQ9Rd+0|zzS1#=(?MdICR3HI3ErDKm$iY^hTe(kE1Hr+YS><%%TQ|26hGqa2Mi_I8E=a@+*z7O=PS4eBjXzd7 zE_m8>U9g|Yc~tG~0=GJ_gjY0+!iC5Or1g#LjHn6Wk<~Xl3n2dPkg=vAmWhZ*XJC;> z)D?^8yyJTwGF?f?wvnTfN{CFOV^Rg>b|xqKgLT}BdT%RxG^}Y7Une6MNgI-aI?_Fn zW-hNAz-`FbF8zjpL8IzKZ#;o*#o-#u-+oK^Vslz|h6v!b)OE4;j#1vwLUpo5DqR)T zL)9Nwi3r3js{DE)O?6q{f}DeBNtB)uhHB7S1g)Wzx*8NXQz}GD=v)>$`@?7?-PaU< zMn~b!zs`|eNt~g-caIFy=|LcXvN=>#s@r!3TFt}kd@bbnpm#3S5@fF&wF5-2l6w;` zo=Lr<4PngkJUw7d{>`b1Y$x~gSP^xieb7=dU0-Zg#1nIZin06ar7-!fpppK=bz_ty zpm;OVU;+}2wIfGprHVcyru_iQuvv|-%l;E9ca~0m#{{-T&u%4qdY0;ds~I6OrrAoB z*j-n>CuJ1yjizi&s)Y(~&;Ld+jEUb+mW4yVv_W*6Ynqf{yB#gZpigA*B|C7+P7wb-L4&R|pNS+MA|~ ztLs47%a_tyIBcM>jA+qcdHTf=3H#+Hkwpz(>13$Zlm#-?SyMNC`2 zf^;K%$Mi2rAL%fYt7z9X6m6k;Nw33yI|k%D+AR^{jmdYoIS0=2u%rSx&a7*YJ>)<9 zO83)vbE55o;~Z-~(g%WeEFCAQXpmjMnNH1!%r}3(Nl->uk<+9R2O;I{UC(LUI9JHF zDd2v2f(o`S2q3i+B|SC13u%b+{2O$or=mXz6ynd}$eh5HE6fY((VEsfzppAE@QNMY zo|S+hg|-#CSq#(c14j)Uos8NuSJv5^H}?r5QCCMn3DO%8vFQD?brq>x1B%aWm+P|C z7Q%_saM9tfD5a;OH>72W^-qiSC9!dToID!u{uqx293ncXx;KoGhIR(o_lw=BZe&3) ze5k%7o^I}n)lL?H)W8ECA`ML(a7u!LKJUsGk zStf@jDd8k2VgKI(qGdx{-Mj5q=B;-6)|4L4|GLz-U$ge0PmQZuPY+Ms*=aFPDi?Nx zrXch@Y$*XC*nd6Pi=WGflNg76%YP`Fu_XRx$~dk_!6&YA<26vx07U^n-!tcOm%Vw7 znW(*E0`{g-iR&?N8B-VV1EjazdpD=^qEl#xf})S?A~1wlD+%eT^xe!%oF;UAk53CG zEyyuaxwR8UKN%Cl@@okVYE(ULreqS!GCe?z88$2aOC{N2EOlb=_4yMmvwf&dt`p!9 z!wr)7+qf%Lah0uxxfnL?5()$23f}RgY2lcuM8MsXG?u$r#iO?ZBuv^Ml10oi1G+^i zyL(el#U#z!!1D6-ieaE0Vb6+=I&SPj9=MxmHR*F#3mOq5=B7*2T3gIOj{AodW%Y9cl&e*&zI!tA)R}g@S?W)ijogikdnE(`Zr9Ypr-2ZHM!HehB^S zqZ>Wj&`EDio^2zMQLm?b3en$h`?02+RCLk54swWV%owc?2sQTbtKFEGFdkvf6qA zj)|Jdi*Yysehz*=zs48f?2CpDuL9hR%bl$(A7K<3b6BKgSd3dRFo5H4Q66B=tfwhOX9 zl8i?0%?}MWbD0NpySY&VkroMR!PKtR)3?t1a)Ib|<$Ezn31;xiFQn8p%(AYdz`9y! zm6O~i1V6&cy8r+Q&_SOrMHMV3|AI}9nbg3*Efu%xz?|U$`=0e0;TOO@@S^fWe6GYg zNdhW_*Y}}0PpoMCcW~2&-&!sgxlb}xpRdEQFNHzNkf8@ZJm1$;d=PmXy6^NgM$Tr{ zFMN?VuOBw+3d2Oxlc~l8Cf{FeD|2baw)HP~l-7jk62#_)Q*0$5=xS(Mb1$5ga^_n< zR1x>5ROlq^ zDd_eSzQGHqKb5C6PVFNBd0WSZ| zTZ4=%Okz z(NU$=)_aGW(M$P3s9jtrn#u94D#_<#ay*i2y7zNf5KLzS=@0>6dla1nA;D!>jrw{b zN5#{LT4L9*0eh%8)r*4ElCSGsLb7%3ry5K)F>Kmoej=DCu=Tby_r#9k&;m7<+4{`* zBF_%zDtWbWm!wG#>5w#QQ}S;<)`T=xB(D z3Vt?5;nBiBf(w$EJoU|IUr!%_tfL&EJY5+D=o~Is{1)ai>|E}*$8I|KQUe&-nxnk4 z)K9rtuvEeRS#|(#K#;#1_}(jw?let#%x3;pA@}{J;#HhZ>-a{e>-RK%a~fDenK(y{uN-hPNp)@=wOd*I|tLI2#+#Bu_Cppi+nNgn)Q%}9T9hH2 z`$=;@B6{CpA%m&u524Y30cXAI`=h<08M*d~0iYXi!J}%`Mh-ybi&b#(RhAuL`VrWBtiF6kFsAp@i;OAq{F@J<4`-M$0He!}>o9 z6@nHl+!U?`Lc3u>HyLw+*Ye8gR&WimAUFK>~`)bJyq>kL6G6fk&C@iAg0>OkmZ zo{0pnNYV^tn~ze&YHOO6B4K6He#YaL3`teJO&$=Kwso|kCQj_>1@iUv)T`~Bb!D&- zw7keD?{C%90c4`%BvLK5s&yrFJYeT~d^pHUfl>$iXN(T6$Qv!%xnet!uehT+<-i>f z_+Ug61MF_iCE|3B5_aGZr^_U^y2H>Ijp6UUT63av^LOg4-qY}qFVU8g4ckE>Fl)Vj zZ->FToWAT69sm}pvv~#@p144a3;~tS-H(t!$U>tWOi&%zOCRM;S8(~~0I&(|Mfn~G z;v*KkfPROf0A|zZAFpaUC^?l3`exG8_J%w~^wM)}aLQ9{>oN2K z)cc$wfv8p@{ehp&)iC?iZ5sl8)Z;!UTjqr2VB2zUCo!ZIS*CAZkr4I8^GZkyzUjx4 z;=#0p%l-g}-r@QMp=G`$lCEAoH^|{|eW57v$oJal(m`(CaDa=BZS@dtB*O=de6-{Q zX7bq5{VX)z&;vTUI541TrEyxD<{!s*ear(fu*wG)ZGk?*lVcThlpjnoK%TT_Ada-M z(ME|Yext03daS34Cdj4*r&&Zm#xUrd*$c4CI8w2DOC8C;ZW0@ZrhScZE?Y^o8c`xd z8Q+PpA4qOCB@ePT2X1#zLzOkv#IV5P=?#96Mc)G@lao8fiL=fW9FI^Iu&8Ysk~@?} zi9o$Lq-Yr2YJ&HML1acbW?}KhejG2Q&{eI7J?@RlMfXl6fp|C^XNskI+4s96F9Irk97HH%tmCi z^l%No3NTBrnf?hurT}rO%^pyJDg3rIEv36o?pvq+mkkS4)kqklq45Mu63C*1FW(_lU0r%0Cui#7|3UVK} z)T$sSHXk{k_vTexbUsvwEG|^$s?MSQb7j%Vae0ck_ZxS{Bpi>P&#LadsIfkQo^5uuEx3a>Vlf8A1(9EwD@QDW2;4o38Sjyjt;@ob*BLQ>Z zTbV#Z`D3g)qB@Z(KVHR8%h@UUm$+496YcW{8F|EO0n%A?vA*e{Hj(nU(Zt1-c1Weg z#br}zI0)il$HA!Lf**NhDDYtYmwt;_r6_iTf^OOmoD}&pYQHAjHB-`xH;_+PldBQ9 z5Dm^IcnZTH3cF=P(TshAUmph^+ts1mgjpO>{^9j+SsgiInou z!{j2a-+#0w-mVw&fv&e?(GagY^wv6F#H{_?mrX)&KRSI7lL#DCT?P_S1ArckKyZYS zZ9*qKz*Ocx7#=Yh?07RTvtcWrT!wpWGS0b8J0u%zFE^llH?7MTu>(W>{u?EW z$ojR}eY!YZw0S0-k>E~ZPkJTIaThqJ*fP7n#b7w##NNLIOfmwUJ9|q2a)#1a%3SxY zus8jWa|r%WwT#{IRhfN+05S526$MX%x?7RKKh4R$>EJ-rhU3hQLlzX|i<{hhWDnAb z0j%QC5~g#}3&5l8+Y^C`I879JbMkc6=O+-TT9?7CXvf;gwP zL>x3hh7!($xy4o2YBKe+1(fD~n(h#6lauh_rWCNp&YmOQq2|wII&>7mJUu|wu`+0$ zVbms~ySM@;HfrT4)FY@dE#qI%Ngtr(WGlqwndr2XbC@erx91ZRN(n1v^ZFO8`DhC$ z!+*liblga#wN>{!msJ|m5bMEmR|yd4OA!+*h$^e?2=+?$-PjJW_P@;}I6M-+F|K_f zueh`&5n9QL9l42aFj;PyaJ@yD!`F|x1i9J02L$E} z87Q2{WBAtBoet$H@EMxZit>AS=TygO$O|KmtDd=j!ivE*j;<=f{t%lRvwW zv~)Gkew<=0>Pb$_oQy1>waNIzP7x{1L1U@r+zWsa|N}|}9{~(?jWODfuyX85y8VT&V8Fri&sGGX?pI{4FT!K95poB7m@2<9feDNl- zZu_(zJ9D+uDcy{gGWtzf0sMNxF61s6>7b{}>L?aE^CYfOP)FCD*ENDqni;<2e_&Wp zCFczn^3`2v7?dW(GuP+wkd)RZ@WY_0%+?8XeIlEyp1D2JAh9x#3h;2m@x?rMn9;J# zOwIAK=$3MNaeFGe8K5M#{CompWxAcBZ&K)>MrR!_e4{^Ur4d`Sm!s&*b7ab7z?nsb z=&d;hka+`{gy%9Y-Jahdv!A)cbO#_=4|lY3t2pqFws2go|>$D3YDm2SL- zlz$e-HSNZZSND6fJ?y7v#TEbUscwd2Q3PH@q?DCO9A0)*odmNz9l>v3Za>v4Ov~mS zxsv;lR&lDhfyVsSUJa}?V%`+i6V&!)R1zGSl3JXcw_B^bwB$IV&WmY%rXP69;}4QU zc6iS@--H9-%s|Z&vhXaA&c*sf3c=Uu1Z#%VoCvFX`yaMb6Egx?W0rc(1P71ayI%ZY zo~B@O`p!6_N>Ri%m&GCr6AdZW3|9t{^QmL@M=TM4R6o%y_@PH&(7+;)d$)RQb((8l z(p#gf5))Ts2D-T}Gv4dpK?cB>Px%cv02){bG{- z5e}Ge_eGJVO(v)F$$^d*xuJK~Gk~Q0wQP6b6^qMpjJ=d5v>2EGt%7L2>4`_x>Qi-= zLpa@v$qtNY*tM0ycFL^_SyV-AEhZslV`MDN?yIK;S`X!+9#qUj`7`3IrJV`|ud=zj z8*Gd!(T`&5eqRW4F(jwh{iaP6PtR|)O?nitqO<~7!<7Zg2e;-=w2?G6Qri6|l%8Dx z=g9dF$?eg2kyI=WqGGZX2_UJPt6E+xMV=3HXz!HJb)gLpoO_g;U6pbJ1IrQ(Mqv)} zgNH6N0~CP*kX5Z&AC28L^MVY>ChrTv!yA|MS?k=ivdjTOv!2`2?=MnMJNKYg24NFV z&zC{crASKBj$L&CGib2T6Hz5c#~C}Yk?v(aL2n43{r0Dle3!?#34njt%P&0*%`z}` z@67T^cj#Eq-1Fr&*&)$UlnyzG#qDD6xC_&3eQ?0ER%82?$5M%rfqiJy3^owED^u59 ztGl2Pz>6uvGZ|0?towY}-uuB@wd?#B7RlDKQ5H|(%29CpkaNTJxOlEx$iJ!Vh;vKn zuYadY^KH+g^x@u5*e}J5R(QSg+Wnw!Gc#8TLUWkjzR~%!%=)zphBK9I(~atBA>_4o7-q;pnM+>#H&f!8n_6+_aE6gwAj5&APT{E^f3A<9l#J zB2v}Y9Dya_!WTgq>h6FJY#?|QnWi=`S^L2@nePIePLh#Dd^#;o=8cndzdl<-kGBR9 z6*&88h?$SoqQ-lWP?P4a^4?XC&g08meyR@a!btnXCK7r;pWs+Ccpv7IkSM#vfAjQf z+sUo5Y;-<`G%#@_9`Q_$KkTIs>@I8%ZEoc`xJTdlPk+q~jYfk)7C70xYjw*w(jWY` z7V8AuLGM|9taylcGjh>qnu^H+Zkej>oFc`^S?7oer__+CQ#nU(j^ZD4Q-Sq8Pp42~ zz((6w0Dq#IkY~{d6YbliY#l6#M>oh4^7&I?uJ~%k-kW?tA$_P>hIQ+A9sYgxE(zt`G zdYO$_bzludbb>&t*C9$f>C+C#DxYn1BShjv{`$G!T^#Oh2;7f4i3|u}uf{_{x@SOV zF}(~Y+J!?(kCr};rbjZC|z5l?k^*BZhHUL|dw z-DUIjpzY&+RxxQ@MU!Vrx<6u%Fg77Cli=Q02hgv9O8T0mrcU$VIr8Mf^e6$@7%jAS zTfa&8>{UWl!F>NA35MGcI7{V7&(6@<(r>7NSRxLerBjI|nn}I896!$Ouq3pDDOCuk{=D9aUA5fImY0NGHMNk+(8K-&%&}FIdVom!IJ zQa66Dy>yzlRx(1FOxgIdH5@pA000)HL7P-bs6lL*ObAc^{DLb14*guC!6C1=;xgmm z-Rlbx6@=?9vCM7z$ME-48oNPGbIonj*dDBEAMK4PV=GiW@4$6Xot8vPg=Klsa1GEX zbv8=9QY#9z+~h0)JMFCy^!+hpiN!V8E6tY5PEOs2Rn2nld$wQ9Y@D;8hjh-`YRgP_ z<+=!CBB7IIZY!Gs>U_&`gysxe^AA^ z3q|2S(nVk)EZH|I1fZKaJ^PEUdR0FFfciCY@i&^Ngg&a@A=85sh-WZD(XFEWIi~3l zO5-1oxr7ek6~3|}RJ|k{{YWR*yeuAm1f7`zoW-{YNvB0-y4*Py$MYCXt1S!Ybo8rcRUN5h^4ei59D~EEJPTf%4;<`b0W4Rk(L`kc3M#N$G`^EdS-u`YDu> zlk=xpah|CWuwd$q2t}C6*JUe?H7nmp34k5d20wrg=qLCm!hZZP=(ig!Qypfo&`w5- ziG5uQS&2@;r?0Mjat8RHDj*_CA!CYqI6|uG>&~F1l#wh%2;KEjM2;mKF-mymT>+5^*5{# z@iiR$8XVt&=UN5NFr zYN1GLn?CM`5PSaG!bk>o*3*;iRJR|hqu&v+Ycxt6b~1jC2WB8?z6E1#(17#sD8>WP zUJd;)9-^ANMoFr(-EZ^Nn9y5O4&1~kBEN9n2D=JFg_c36smv0MWssp8!$%=}R9nzx zcBinOv$7R6U6c-*{to+W!RUsO4tfjnq0-xY_e8c51h`SSzF@l&SHgQ$(aMnayUJpR zc(@=I`l4@{xEMJ16R(8O*U3R4dw^v;cZ|8-?h}RFuq7Dg@IDmyX)kll_ZGf45prn) z+u)Lp{vKApk^!ndPK*b&^y)Xk(ty}_MX=XwQGqj@RGR#UEpI=#lV!+ZBEWFkhGida zGplev1;3x?ssggD*I$A(O}%U&lq^KeW=oA?U!3d4ku^~>)lBBHYL=b!yR`IoUHgKO z?70qLp~(%?8c3mA_WzYr=&)`rhQb?zHQ`0j`+Hd?>d-~nI{esdC6(*qJizkBjYp^N z&hwZX?NEcKiT-q}UO3rP&h6~633yx* zD^Dx}wNSFoGQBBsoM1keqcYf_9*$RKOnanOln;0 zOCrLnIL-uy?|Vj*Jh&<)BXZy4rPG0gF=m`2jxJ+C!dQ1GrHd&LMH5})6!|R-nz=i$ zNkE?QP#1XgZh$j2qltRG?a+CpAg#h9pz?!Rnnq7 zYZz@39$KZwOpI} zgkMS=lv|^hr&*Q2D*HuTOfx<888&b;W3Cl|N7vylo2L1LX~IfK^Y9q4Sog0nNH})S z?}z1MtmG)!G4BQ6>cmRqt)_0^_U~y`R150vp!`3~8h3#n<+!uk*md3fUHm1twLmIcJ6Up{P7?bc;QE)2BSqt0qFsvd z(s~FLv;-)HP&Y8H#`P(cVbtN+hV5w%eF!M?zv!G4>lmywaj;8R8Euc~?%vufWapCT zl9oXYe_eD$psCCtKWcm4I@9g5CDlwBXb!;kVi^%iq~r?ZAq3p^DA!^ad z=xJ_Ve9C>r)ltC17=sq~+68HoQjk1FjYJX7ri*nUK4>yX4b2?JSSrF%w?$PI`Sm47tP%sq#cqSrIKQ75bSwV%#8P4r`m!cIv>)U}2p+)>sn+?O7e^9# zlpLpZS3x1SxM`(^%0=aLU*Hr*5U`9`GE7#Lw@e9xAWz4p%XX^am&G!2RAyH=w?fG|>7Z=+TJ4_D$Qig?2d45)f z1c7?~I;zYTBEp=eMr{mmj%-n}^5J7-x43#R$5hoE40B##0P0&OsmwDkxwxg6MS0Uy zq>my%Ni+rPAwNrdYIa9&At60vqLb*f{i{kkD>d#(zWM9tTC1`ui?blSg)juI^qm9p z>%UWFXuPJ1lMf&FXbRQ=@VOpp+Z8wWomFt;H zjvF`ntRMyAj9(a=_S>&{i|UeHYeYA8zP;^~otoK3iYSUkNJFZb#K(Bm9W10RX+U?P zt$^wQzYZpm<#}lpW3e(V-OWx}*a6ik%3NDzK5;{iyKTggiG1rvoJtlKWWCA#2aw)& z_OT1xz{(vUL1_Q-_%|mfY9<2WX>wZHp%hB9Dd24BepEP^;jFtaXZom4$xquje}RQR ztjj4-7m*F&)_V9Uy?wP+eaQCCGB!3@AOSlb#_j!}d&0pRrvJlv(Bc$N*M3X+n>JZ~ z#v05lSauc3oh+mwo4M)gFxM(hU`E4njh;`#(g9vZZ#Mf@3*{)@@AM8pM9?NpE+{>N70BkyLw zvc}z7kWM)fJF*RZ6TH3@V0=W&(R0Ylk#={t5Wkk$ zd-53qzTRjxU|?o!U+`6T30eo*^M?393+;}nQH$n2G&mb)>`tC=9;N|Eu2QYWgs2NPP3<}(a}Z-GWd z2^c^4)|HA=--!rsuxJykaOhNGPgH_Qc<_Y0mqq5`?Xm9kR;!v-V)-1LZ7GfUHCihC zpNXpVrYr5m#l{24uRM4+|8U*w2`R4^=YAW%_a25a7>bmD+=63=InYTN|DtylU%W}8 ztRG7(M*&y4->l%TbR|s7O_3EwoTg}*Lq7U@+aaLWjqJ=82W4BR<}-CLW2(<}@N| zId-ijm+|nj{^{=H)CaIWvOK=8@)QA3Y`F=-)zSySqsWxDC@M@)4842lHs{KF+O1qb ziQ4)B9ydjcbag~~jTk3E1F;u@g{e)Ys|DBYy8-%M$pJ@DT0#0HK&MN}*1=~PL=^Z5 z9jY>?FfL~i^`l@&?Q65~3>(QwYjt;FV3xJr`QprB)sNG z7n2#pe9eC$fU9|$zx!8VvbE3=nw~W{Qvx+UUO}H(mn$;pqaOqmP4_t(S=OD_l&#ep z)25Z#1Z4us%lW@=4?QARIGvvvd9CvKF$?(7 z#HA??Y}8Z~kSZxuQ`HI$YY>)Aw|z*bM3~NYxrGPSG0u?a<#VIR0`Ew0mzSDtl5NZB zE!-WE2uJ$TWFxJKd5h3zh%)Cf*)~S_KES_Bx8S_KGsD(TQi$738-NNnkGr?4O9BSO z64W>hK94RAevual8og*bxNCX@6#+pqbQnbq$5;N_2uCE`jtXm~==1hbLIkr7+Rg-L z+}Oy(ht}_X)^Lt_!N3d^H8K>)*q`YH((fGu zJx}epLF3$wHRsKJ+{4aPpz{f@snOy5l!!}oJ%!^gssCq#L&E!2iM}~16jJ0np5hmm zy1S?f-G6-2ko4bw^;qP~*<9_0c(b(7JTLkKW>`jf49!h-lf6y8EnU*T&GaA#HW+z$ z={SA}H#zVtmLy2s&_X)!dbCAW61&O zjDHLGa|omcGYj_`4lQ5$lK@2GYFkeXl;>HB%Gci59%t}-`Z%#ByKGIxGGQv;vy&hO z0peUXJ2VQoyDKN%%-$(4B0GhsIX;JT0-Tbe>>`0_VY|_77URfFeyC7iv&zN2qh~~l z7z8O5{ZKOcHuQlQK6u5{h~28~WAaki(-Ah<_f+j?VSkRL2?av<^Z2|akRV+(2h}ls zi>U`+4nO2blh*7gxzBxj?1K6zdq%C(rs2s7#x-2$ow~h?T zW4kaFUcVx$#}P5hAOj~MGsw1@*H<(s3HeR{D$uTerIX{Ny-r*X&S(^60(hzt8W+kA z)iN3j@~xZt66pUtXRtjF`G~-M;blr@aum)es$_*%g@%W=9V(ibDIvfW8rCimD-P?N zGaPb5pz_4UZ)qHKE7m4&9p zeqh-AjS%k(qQEvQ7&B((@HF&+d6e3IcT3_{-i(Wl*_(0Ka)UIs^f0PdGEK;9I%*?$xK4M~e3OE`MD440W}bVNV<#`^!=L!>j}{PqGmor%Q4rF%70+b#x zNe)NCg>*KqLXpR3Ev~NeU8f%cn#|0IGyDkUw zXF;EGMHMV3|5=(dOWu|+gn@I@9@s>mVJSpAL%%EO1o!YdhL6R93<`NeGlt?nK@)bg zu(+wp5{rG_hyu&OJvKFe$W^Xf3|V@e6Z0yu@7LFaKSWRe@W}>-RMAON;hRXxP8LE3 z1#?sxw9Z7-{_~z>H6d^_!NVVpvQsWQDh`F^ZCZ!pFxD2{R*`>M4=R)*_HYgR1Hq;c z;$G~!d85Dv@PG4pFX@^V#3e=gmlgEq$Y4lxFqy9j;;bT1;r@GM(OVlV& zb&kbE8H6*~w#WLl49;IqZuAXlCIN1^{CH+}=vIB(^WXQUSj69BhkqXNO`;@QOaGVE zo(bV39ey~H-c*9pClSNNE?ye&Z!QDIb3GD}JtxD8bks>oph;Ua$CV4veF zkAdr?6UhiidR?-q%-HdDEnxQiQC00XR;!bxFm#9U981ZjZCNGZ0Q>c3V44?q!Ig1? zH1wkNs*r5iqvPN4AB1Fs<|zuYCw`fj`>Z>Q<_ z7Oa&7GgnrYo`4c-4|I8?7Uq+(GGS3|q{&gLg?c#f=Z%U>axM~~x^g@4puQ&k6Zpd; zq^bIw_Ag%*K#<^b@Q{n*FR^v9n%}T_edf-mxOebDj684<)n2(F2gIsIa>5}=^{T*t zP|jh~BCSRWe~LWsz$5DMQ5%SU@AN`g$W#Ss9vblCh)o$f-mAe>`C? zU-!JpE{OA$W#aH+Ze*j6)LwdNtk;Jx6liiFd;|4q#q{9cauD^A|^P28$c`bae_k5{924<9$)4)w?w@o zc}o|S?Z@mNzF7K18dj{5(GZD^)e*e!^mD69l~zt;x*YpxR!6bc16r$*ta}7@vImsP zPJ6RZy!6fwO5@yy^UXqdt?ITe<>e8lZ4c5+Lm%oPLyAYxNP&3yq0JB@o*h#u+j6}F zDMkR;?CD)X0w6}pmWld<%}%p6mSC}>f5dt^$h^9OkGz%AWjN3sa}}^0d88(XO||qI zOY*xUSzbO?N8?`ne$nNccK5;>wPJ17h&UbF|kB3e}(ax&*UXWf*+V_xkFWhfu3Gar8wR7RfsKuEXA zp+PnHmn1awJ3E}zvF6B^(b_&5QYRI3|Jkl$TvW*P!tk7x9{aO8(!PWnCc)osr?VJX zDt$82Wd7aw;ac~A870k8xa`#N6@^KA`V10>cdDv9G+Z!4KGtzmo{(WoVJTuG-gEk4`yD zH8&#eL~Pl#7+>PMTD2eDcu;9HjxbR~Vo=So?rzj9T_3$$551Ei&l>O+XHj?&sXDY2K+L?r%z8X;-w&C=ePl$lV%G;4XD^MeTEY0#&@L#V7KXZW|M&b0e?~YB z3GwJ^I{9Zd;GR@1{-q9}?mjVkuVTsMp53OcFH$k{h`3wixN?(^lzwv(smXJpq006EXhBj`9U z%j6>T95<1CT}DWpw!W$dej43XElb0iT&)AK4rG$IGlqi8StQA!ejU=YNU|M66Q~36 zux(*-iIrzkn8e4^*|uKNd;qh-me<2N2U7Jh1Rp<7sKy#ZcygH4>iie~wUq29-9mF( zvD&bD+D71`cSjhza}1K1N3D}AX8rTb;_9hDkxK%ikG~yQG;fGE%?{pwCrzE%?Gua1i#9rJp3K|``QqL`k2!jaHr;U&oEM8;x#e%Zu#XwI4j){ zae*sk9Sctpd_F1oQZoJH8C_uR>D+II4-oFWmeX)BP0JnOHuPCjI=#K zTt$;~AVt_*ItpHC2#bG2MQROh&#U%N)rBJ*irwwH!T<{ek`i>Z3ufK5v0@^DMIgVr zMmlM-v1+Vg9ZfYYbUImdJ!lXkaM z^uR?ty*Rp^|Ak?rCGhVjcpNSoY6aC0$a;|syoj6Sv0Z11HrqJ@8EC0xSYzn6n1LVP z-$^h>bVv+?000G60iTg{NB?IGY~;#yJ$bAwdE)k}+OaC(K&5sd`Hfu%pVVd;e@^P# zdp-00Qwe-%Rr9bBVI;mKlC08Bw3FH&$vPX~f=|avKEiC;xQo9cxrKkTDZ(1zA?uQt zV7{T;J)k4f9S<_M&KMJ=1IMe;wPefotmp5JxY0P&Onkca0SM`$b0orVt*phs3Q^nJ zLIqJ(ltn@YDK@$g4qQv%due!}!Y?+&4`wvd;V2ijOy<%I;!MIT(@<>(gokrel;`Ga zD*tg{qvG}g65)5-m;*lboKs@yxh6=q#=ihOeoIW3`KNFWh=baS*ierL5=_E)j{Sns zSt#&G>e$vx_&1&4sXX6HU&c8di-L}hoyJ^YrM$&IR1*|}Zdnz&=Na+o43b9=g^#cF zNvk6YZQ$)q{XWZNivW`tWnnOQq~EX`6Ay$@hBnJw%#uCm^V*N8@^LkRUm^H!V`rX7 zxkBJ2#}CB{RHg?U)XS_Oodh9^7Wao(Cux?R%XwQ?@1@d!4w=)>t?_1eM&oG~B4})< zxJJXeE-Z@kZ=Qv$`Q?_!xEqGn*NeWto3{1=v48|*Gw~F#9~+5NXllZ>_;z^=I@2Q? zK%1GFOj?^ybcm8XL}>g?x&xY+3GgJJ{Okovtym~;Ki4#$l2XFP!H+g)AcVLo_>KfF z3pgovjXTo2S`4ODOu}WR5cwU)PdZwdDx}$Bg1!R2ZG_Z#S~kSj#98Egk(E`u2>f~{ zP6B}Nq{eW;9vR0@R-&iU{2=MtSiu8+RV8}y)!l_m5T-b8Z27@B&j}JS3gzX1U&ZkG z;P-^STDs|j0we9{|cqLEZ>Kd-RhiPtVY4WVV9`aINVV7cVsm2 zv~$)Y0M3S?=*8Q&S}r6OgOLa`~k9#%f+;WKvhOlJjY*MDOe^76K+?)e7&g(_+bt;M+3a%il{RjwGJ} zrQ4-1zkLI>Ayj^Cr`>T|ZoSS?9xY5*FxZd6(@iyW%Y{_oFYVU92<0ZJxjrJtYbsox z@TX4^=&_*3^ZhJsaU!$*R9xVTc!N|=LY!g=aodFLAc_bWcnXA|_R}pIV{M~w3ejUjFb_$)31(Ckk2d|EgW3U zfKpo@>Rtf=Ssks9qQ8CJn0_49QHhbuVOe(aS`q@=KsR8cH@IU}9TfVo+xs&re1N&; zZeKUbhT~mruY$6 zHmjJRbA#b%SSsv@NWF2)m};vfAwI`(Q8NVD&zA~z8qhS6lvC`5JzQ0@sdE1yEr6F* z>O0e&Ge&n=@21TO@_BR?i|5FEd|!jMHAPtK`v0?MEe@%5D0b86bAWWgjwzD|o?{FV zDRsBlfq=k~yEsOWBYYS3r!TNw9d8ga>Oo56YUuLMPx#|AywI3*hw$hvs5Q_^z06@! zS}xaKBGn*7{CFDP_Pu=X-y%u$yOyMYbbtT=1knMXlWIr*XogaE+50)N1TihuD4a@m zu_{&kjpoh$B!kM3vnjtv9;LP9G&|f?J{#0=&L69wam0QG++U)tNL%8s*lS9Rs-R(I z7~4GZ<01$i%v6m+=fBmTHSaBB^qPc zw$WpE(-B4zccWVAL6`LF_^xJsi~0m$eF#a*mOaBz91w{vEM{SFte-S+1fdw|coj?^ z;r<8_YN)N(u#(Mhl)${QamvKq|9`y26zwu-a*ix~&B(h>xcpjlvMeK{&rq?%tivaB zOM0D{8OKPkz&!!nUA)TEv2r?^DdV(TmUM&O3t|teZztPJ>pTBBs0C#V%I-BduyOX1 zXjNb?eNSI*Mb8MJH!NV6gBN(A?w;~e1caX4Yt zS`;1j0$SRp%zT#!||>Dk<&p5vh#M{ zO0xGE-x8rkEt~#ChvH~->NYrN_sTcqD5q&IZE5r41IK8gFroZ9s-8v?s_-4e*1vJi ziYe%IswDxq_?d~gcTLyy&rLy4PkOB*QQ==oXL4?hbXyOtkCg}OTbC&h}wH*zyQU$Dlo;lj_gQ`si*NZM8S32GV(D*51B^MD+&$|;wZ#W}# zR}mL7hcYe94Tn?!OhT3T_@uD#bcJSEFQ(0Bsei>>AvCt7j? z^n~SKHxZap4|9U-uZb?RRT=8?o~S^{6dQvtm}G3;f+vUCokfmOql~#GYH2=UoFkM# zGwsB(&}XH~{kWBe1rRPoyN|}4!q!hMfk$R~MjCKObnjJWv7bdE>#KPmtKH~Du>qt_ z`l%43*t=cZ#{0{9gY#YXGOexeqflQ`rFvpO{>37v?<~-j+iQKBCRl<1OOepu%09C@ zHg+v~=(@Ho0qmAcB8|1BLWcZ#C~2&AwbRaEemodr^3GRGf2KJ4Ic+;VSc#{)IZc2|2W98F2eS=^69r$$e+SY z&7Mnz_VeW+RS;47@_fAB^k8lQ9US*~`QcV=8-BMUZ=p&YoQ`x34g~wCNdix&T#2Un zBL`hwbi)HRu=Vpcnv^yy>Pf1rBSE&*Riy^FZA+k>70VxOjifgiKC(X8xihP&+^B;v zSk%kS%;W?A+*~ZMZF@gY5M7xiWFh6w8f76xp*jx`9;wJg36yGkt-+0a-wrYV`g!0) zBye;qhxu6Oi`dYfE?)E#O=`Z#ymfUs`#!g_K#r7h=*51jq37N&GOce6y;s{tI@8BnL@UtvKpJ`J&EsNEA^#iH?$# z*`DPe6D4BD4n+?~@&v#D02QG@o0v(cL2Q{!2>0Y=$0GkT(!XjxDwqRe zS+_OMK)5~~srxjTxkSoN{;U%?PHbWnLpud#B@Ty)BmTx{)LGi^keP;#t+ew#Zp0c& z^H_np>iWw!!v%8NKsC^PbKfTXFYEqxuL9Q=QHVV6;MY z$Mpz3NKrN}LZ{?6qKd|k8}n!OjGAQHmGVGqv8Z;M4upLeZ`2a3t%vJfvYLl46Cct) zX4#_3JWVOvQq}y}p%WTf(_2-T5HR~F@81AkK%u{4emy>i*Jy2!E@!_A{0^`mT@fFS zE!~Yf!NbVvo-ulEW6Y>%xr@WwnC09Z=-D9!x42XsHoy%6P@m9~kr>Qv?GDBQHFh=j zmntB89TRAo_RjD;WWfR7X?wH?yVNVFEPm-;KX^C~HPc~@?6`5JSJl-rlfH<<3(_Z!I4p%mDUw7bQPReUf_liEUeEgJf{Y7E z5wWG&AdNu_@KRvIsr27;03~$WiN%)H^bEfi*+ZB@E{Qjt_|Qd)X-amKs=mh&!p|&c zA*;DdkPwy-hR;(pm_cK|B zUE?G2;eY5}(d>@8Vr__}!}g$W;d;c`JTk{qXSQ5wQ2#AoN5D4Ld#8YCRGSbQ{*VXJ z8M&w{SeD187vhWp6!R80K;MxOdztZRy^(WQTl5YMSV)U$vjx<3U`6>CMN zr+RM6l%4{QHOG1g&q~z-XZ+?^Z96e|3Yv+KI1DN+AH^}mXcx~`#_Jm_Hf(_XI^vHg^d>C8Ba6KQC(ui1Y-OP60eqwul(!Do=cG&OC8ex_M7-bX8%Az3ms|M zHy%et&R~F>VijSa-Isj=Z&Lhs$}R(v0V7r3sx!WNBXCOVzHGCiBV4FXjUas2=Gpdh z^4ti5q6Y!Yud$my`o`j&SM9K=4#i{{QFvv$A?f zltWk3--x`^gYqa=aU}#7*d3TsC#UPn#%1PB49C8we2Fk@fR6(2ISGU+G{THkW{xWc z9SDL}!X=2?0+@hBpoWVf2W2%4BEoe1s=c)_*iBJuhAu`beP~E#wYx6+1|eeW!Nl4z z>U$KJq!9HaMKls4*I_SY6$*AZ%!9r?Uj?I|Qy=1dovVDf7;KVT$&J0J2u=L_Nf%!# zM~Vl#)P7AOJjq3%<>5F|)D!DQqW)q)=zorI3S^jTPOZ7dF0b@K-Tv-GeOgVGLyJV^ z&23|%A+T>aYHc|=CIjtrAuoH7T}m={qrjIMB=3>=BbQND)sZJ!-qo}bGjh$Y#ETrU zVe<`YruI9aXl-<1B4uJEW!c-xyqW0Ae(05|Ss6|2A~iuf~8B!%sH1E{9% zzSi4SA~tRf_-5lE(xBk^0a`bCFM54OZu)X^N`vl(l{--G(IujQe*TP;ZVvm9;TaYL zCHiYU7U2c3O}erj`bMD=_w0P#@3Q_C&Ts8SufR>{+S0Pldar{wlR?4`c}%Tgr*mq4 zB!Lkt52DUrx0uO3ZqF6Z$h?prO>X7{u8%SL92KZ~hl;hO*(CGFyqq9Zeq&a|0#Lz7 ziq!RxpuHWB{Sx{0!J>M^M5|vYE27KxrD3yIm3X=~?wAVQ*SlPyea_+%4WXpb@!>(zA&CMogsWT`Rp7ipMko)TsC0wC?BZ=kg9f#c z&oFeiT^)6lBJKBz*nuGp7B*)~{mt_=R%#UKAiv^MeqMdVtmo_xTJJ_p0et;=Rpuzc zCr8l+ITXyqu^%h{k1z@9J${B2!2MX<9&iTy6XE)+-lW|^H6)wBAxUSo3OlOi#SdCF zvJmw!JXCDicp&4N(Zn{*dg9hCvq;!8Y31|U!7Ub0SsWzcD8QYY{{Pqs)`tw}syE3^ zXd8P(u=#i$5Lv#^eJ8H*WjN{g?k1R{R6@lA#|sWNv^uW_5ob|Uqsd}qf7B?zgSHKv zl{{iA3ZWZ!ZS6$$2}MM~+kZnXeQDMX<20as_}_o^Qw~tlvp9v@wfCWdoj!V#`_0Ih zP0U&O9YJQ9yUHs45z>Nh8UssNvRHFs8TMqd)5rVh#8$rP^Xk`)<~i$_r~MESxFmkvVMP~8H42wr|Mnyoyh~{L0e*LVq<=#qOOGgluQGR zgPVc_6t)!v%%TN=x}y?$ONJ3h2=pKp;lli|nkc~1m$}3pSCcoLH={2XEIBFptKTdN zrveFSloFv~sSu~G<&NBGc#~V?(~`8MDlgUx_KD1Md9^{E{BkX>a00yLXNG(X?7Lqn z(?=9QwUxpNScf#u|K$^TY9kwxi+2driNGr8n#IdZ-CG>U>2TKIpyCO9A-s?lTr{l& z6Zd1Ka77|Use#O9V4!=2P37hexlm%XL7y0eu6Z;xS?o9O(`TFhkr0wyaJ@7Y4fdxs z1j*+y&(*@y=KTX(&ya1(*w1oNS5y9!B8eYxaT*E~sYe46#MW7X`wUwwaB_$)#`;xi za>z;1M}0Yxfk|y>Wz|rz)RiLB2LcVbD!fCy3oMXIPdooNkmur(Y>@d$i42Mlhl6 za?ID%s@TnkKbY>n8r(-Hm8PF-My_kZ`)W_V5||u1*R6Tn@6-ZT6hc+Y2#d~ThZ1_7 ziPI(T@Ai^$-epY7(l-kT?Sq_1a>5sHmoPMqYpozo(T-gmjt>n4zl7U^7rO{g+Zix9 zC~R#iESYqq(1@(2)u+16i9axbYwiw9%~SnrhXpuAYF$`J5-dF4O2w=0PI(on=?nW) za_T_^6h^RCDMBSRj#D<54U``@NK9oP45}5I`piP9dfBY;{aieoj<^~`7s53~s61EL zASeu}lKOs^w{?dZ%J^j2JNb2StVdHeCc#=&i60^O2FY|_7+)V4MnGf|VOTb=bdOjt z&7fwDxk499qI4WV%Q=X93^3)73}l#pvXNH(aM4C14It34tTk)MP&d}n*s%5gZ-Tjl z|G@5dp$PkXvLI!PFL^&H%cVwsX3wRs3QAwg8)^nVo{yYCX}Rx3)zEIQWPh2Eqk2Tyl9;DM5Pc$vN85-j~L>#Zx|`@pXGla@pgs-WgaRmC ze*UZ#Z@*_y9VNl+)^9O6qKZxWS0MuXynr)qIr%K2>}s1Ri|uG{DrBDF4*%Bc6jv?9 z-H{+~F6C6#K`=NDEx(2r$Hf`GHTMl}O+xWNfB?670CA@LS6BgEXMRzSu#a+}1+wfU z7Rx2Mjzm}D2T|+*Y6zrqQN>5)C3im8e6F4r5K=K~X5lR{RjmqrW;YIqEQa8qBQ=)! zP$I=sp}|)x?k^EK`w}FSX9XHtKV$(=B|*bbApx=#v(RZ*s1;+ZoOY&zioT9%)yB~B z1Xam-C4#TGw56W<;)MYH*IHG77t&o2%xKfo%!4?BH`DR&_lx9_>5dVO;5f+lE7#jf z{`bQiHh&QwBUW~ z+m~rf*4i`;OWc%z(}7bOJz$<|3)0kf?ZmTC0sYDY8lJIHR=Ns>Ti?p1AM^e`Opj#) z)U~LTD!nZ|S;0Db;MWBQ{nUo&0zBy5rdL!%2EkJOPwy-S`*VY4K6?Sd>kB)kGq@+j zhy&f;@Bp0oCBlsHjPYT8u89%xZs(W`e|n>r?7BpH-vH^6gCU4UYJidm&qf|d8SSy~ zQ62fy41(&e2$L&OL^18Ve}BHG1f-+;>IzE}wC-@dD|z?Y1r=w(#yqL^lai+LT$iDQ z09HZ`d0~gZN}FsTrI7pmH(EQ!)0ZlMu~N_hJYl}1BCBO5+LXu6*JDQ+Hh$noRpLFA zDfw2}Mqy9WC#1fy#~lF?VgdmcyqR(ldm+%iw}2SZFsaG_Bc_BFJ?iRvnMFHb#6M(V zN-kJjya7&w!g2fIaOd!bAgr-ilP&+2{BBTK&uns&6(J6cnXRwTIS7nh`TJF_cEqpx zuRpTtrCjhPbX+}15Jn`RfRqwz_$+WADR)nDLR@LeS(_}96uJ=8L{c;JeSe`IcmbG$ zd5(dY>%QC<$mp^4QDK+)9l9d@Xf0f(oo)zet#cjDL@$-y`Cm%idDRH#2zS4reP^8h zQDP7H45FAHHW({{vr{l_@Yzuipi3k)lMo+h)ur9mo!|L*7Ef{2WQD|Ff`+mOw4?|E z|57IPa$r-eUbJ;47G*3IbKXTacM+qv3uI!S)leCES_I2Ln4q74UD(+kp&oWGNTT&7VTZ9Z zL})6EKFu!0t9nu-3%FnSb8C%RUcL8Xt^#w~+y<^D+Z~ z37%M`&LUkmrevJaRX{ML8`&Iy;m*`}*q}`*(;-RZxa=n@GK|+=@8_g_jy`u91QqlBGcV}M9aNdtMuK)jfzvC@h1a}w$9tHEUrO``o(**Pk* zhq-a)5?rKeD6imlol0oU;KQOH?dZ%Yy~mxO>@zYb0m3x)s-!;i;?jaZ;ZVX*Myz(a z%wSPGY3cA8g!bzIs=K|kx9j=u9T&qqaMZ(zUblAVQD6Hj2r;TL2Vq!B=Pd8B6~PRZ%AYHxKvuYCd`cRzH@6r6ZE^L;rmRxdf7?DC z0GesX6NnLraI1*wm$VZ@^_2KuD(R##WgmTq>f3i5sWFo%OOFAhEMj1nO2T_L{a1g@87;flsw`;K z&3W9FiMsflD1eQ>Ow4dNkucHP|p$zm>|jO|6XItWw^|zgLW6!r79q#wupEt zi^&F0#?}ufs1)G}YI*6uSf-x0JUh+uPJNnX0o6+QNI@`SP5dY^IGS`+f?VI2x9#j~ z)+HxmBjL6wMS9we)5Zg!i_u@Bm=;jRO0F6md~E#K8#y> z1`oztmUS{zFMSxmT+hMul0IKxgT*4^%~8%uy%CblH?N1>dxcGc$lL-|VTeTEzq<{u z=L*E|es1_Cw$gdCr^w6t6l`pGlns4Ym5)APfThm`r?>)u;;hB>0pU~1XBE35yAqQd+4>kBZSimqN;p*;US?fLHnwrl&KaV+WO<3vV zf8k4u(4@J`}YQ4hB|sm>#!yz{53Ti4w8_+|0S20BF}>J&GHTm-YK-a4HcL zrpfhU?je}L!OoU6!fwP^G*@SxYKe%-=KH`kdNNq~uO?g^_DJp$lkKijRSgB?P&&8| z)e+9`Rp84IlRV!g z^+BJuMHMU~|8b?FfR$1_Wn^t6igtrHWZEncD+HZ^-Gg20?2D#ahoh=$%zGeCuiALCW za@-@w-f+(nDYGdUH$7{86PjQc6gdkgr<&5^9b+S6r4VA>hHh6&iq5MBOhq$ zg8H>cP&TlEJn*|XoJ5Pp9WV-s^^12M&xE`?&RE)ftvKl1R;%mE&yx

>ZtJ3~9f_tVr!w)Ltc(N9=tMoGl(UYl9nP;@o4WamRiZB$O8(@Zae( z1M7 z>F#0Dz3wO{cavNs?lCEas6v@0L2zKP8Z%1N95;WW-&x4F8uM zF1_>~BtU{6o4~|KJ=1O1)&*iZkms4RLC`%r0(qsa-gVWhqn&?dX#06%7uf!@zhD}uHY zO7@cI>xF>kkYH0q!yn=}w`huZK;RQQLWE*8i3TLR&gTs~L+G%C^ zve_hfLjr1JLriuJpjnZQKMOt>!Nu787osyZ#(g#AX-&V9UnhR+Yz63I;(j;dmS!P# zf+iXvLaH#Ehjqy>7Ywzj_<7kS@EL1k)XTIY_^cIHNAL_QmT%{RqhLb zDud`|JE!H7y`RGnrz}GUNKss zmnF+!cm`1Lv+puDWtP4t$la0%t2plruF#qe-LOGC z84ok=4H0{*W-!(|Xp>Vn>{VJioG>E49-;&!>nmW1_xlkIF_$+vxH$`y3Z0_9Z< zdA)W5y1=`tL7-IsyIFLchUmXg%JgWJp2$bB+m9zM%Hf;9ye&sMLZ!mWX@0^`&O|79+6_E z@o|xj^Yz)9K|ns4CHQwn6os{(U+7G&DdzqCz`$(*dl_9Ea-=6^+1OR^@M3&5LD~%J z%|{pXL#RkQ1BT%ha*LaKFwDXavC}cDKUsODbxreJtTKOI1k=N)<+w@=@9ej*S_)vU z$i2o4X6sXQW(Jbwr%pxYc6Nho1_KW4iEGZd^) zZ0m|9TtIr146_`1t_DZ@`86bPutQZ;9KQ}#0?XT}n~L`l_q&f~B?X*73&Rqs_YCq% ziWK}z6ZV$e0U{t2_QIsycKGEiA`ghy4KE*j>76wAhf0Ze^7d}M=o=73GaSU&tbTdW z-8(hGTY1rE#;nY1PcpMj>I1w_o`UVgxI~q7A~9+=XT9 zN<_IH80a%u(3($nLZq({DVkdwX%0~JxVej~wsJ4EddGC=;?jdY{ix@$!%fn(TvrVh1t?7Ej0JB=$^7C0<;&5zs`84&6?9KGb`{1lf*?xQD+3;Gd>yM zxxGN^>QQ@T5n+9 zGV1(o)Eldx%Tj3lT@tL!1@!#G-h$Z}Io|gMs=D1;8mPEo>==zR@;deZzxt9({fkMp z(_gWgH=KV`Az^KF%-2ICC-TT6rU`bq*cN?b8ECmq1|BY%tb%ST46qw7+4&gY=2Wj% zdE-f&yv^xM4{U3neJ5xOU;GyY7b3~lFW0XMRvl5EwXW4==rJBEV{ zhsO|*C2Ve_GbLsuxmM~qNfIWxH{07F^OS6aw7n{zM4=dE)2z^*0K5hxGSiGBZw?-m zSI_Pm*9`&&8;;FwT6DekL7KqH_uFbWiMKxzjh}T(z+K8Ft~nOSVtNZwfD?`8YrDsI&MoQa9`k&=iYAhcxI{?C*= za||KD4`yj;>_@#y(w zC%M`tY|)KU(72Lv#o?htZciRG_;fJVCDLTY`yTxyeRfJEkKz3&EvbXM45;=)Pb}*A zl@kA%L=ahEkM<{GDsoX~MarPD9#0g%L6jskWg9ubh+`ClzVcu=yQsh`dxMG`Aq9Aa zU4lB7(>Ct_6WXGbhzDxdsbq**#`X7Hpfd@?ySW^oVTF5-1b!=k`NLnlktL>^<@tCj(ex!Pgvj%YLxY0naZu5mKJ5te86d7 zFXmG*eEJ$XZyl&ZwZie)-?eSAMq&kT6tNBW0J@U>L`Ej9@A3)dAh%+?llghaNRsq0 z6DJCFR(_uR-PShYPmO=|d;~aEr#Yh#JFWTmCDwsq+0h}=7T%OU=h0^t(u+%RR>^0- zXCet^Qvf2qR;En+RxG1H{>blJ14fVQv%A>6K0cs(E58{NeZQGg=q^@}PR~I}Lch6eNLc4h%AQg8EVdcQrD=Wv5>s?(Jvtf%1^6ma z+6_Jh60B<*xEllvfqWA0a|ae|^IwZFtq`yGf8Tzu`>IZlw5auS{QvM+d8u4I=tN8_ zH+fVg2=OoHe!ZZ~TGI9Lww=VA`NeQ7?jaLCZSvnUu%;H}e4mWxmq}>v@wuAxomixt9dWyp^P-vZ?;x!HxVAq0Ki z>b%LxL;V`qj{`_sMs%ib#4Zax5(OKhpnteSJqo@<6s*P;&AW-qo;m6t-LKR9uM z#C(Uzrlza-Vr1GeT&ctXp)5Q*d`#QV3SgP%$O^~6F7TXfA}qh}$CuTjelu@q zCYc8%T%KNfdsMW*A=$T%QSx(pPWtf$G$zn1k7h3mitm=&;nVg;pW zLYOSp?df{9iVy-QO$2luN{=st>K4yZdG}OJ+QdRr2(j~8(=$SDXiwWP<*(N94fI#W zeRl$CR8MxoT6miHNyI35p}*_>%P}Q~;%JPYz)LqR;CymW+J1miOdYUq!`ifMfz^Uz zfqD(Q9kc^XfM<87ZI+Z|l#A|-d+n;4sGDlF*f2QHLt^*KnTB*zV4wmA=_b4@jAd0H zJ+u?&!TE~{T;ql+_iAAhppI~>U9t=fTI=W`Yi$#j{a0iIROdrU+wbONV<3FbZ9@p4 z-G>igNd)I6dM&js(U>hTv)(!NOliA%HJxwWiESPVtv0ikTBHw%&ifC6cS^If{-^4+ zhc=WPp^>qU!4CAHx4_guk!XrrjefQX#)O909?C(m9iXfNZ)?O09`>B5$FispY(ifBaOz__b2gAV}gq=e6tigp{2L1YK zSc@Fb!nq~`&%r-4)3}3T?0+l2c!~vG+c}cK9KFrmw$tC99r!t_1VIhaY#JjyH1)F6 z1YqaKj9tma)lAL<%W)xJIXbW6wvX{;6t7`1yo_dgDkEyT!FRCUTbr@CpU-@Kz~_(% z4u2-j<7<1+li#LOxOs+wZM2gUHYQ;_rQ2We0007(0iV}uM*nMX9)KH=|B#1RPSFj_ zIQf6nG_>1VHB-PZdH^Oku$de~f#Jyyya5^}XDg|- z3KZP5rBCiA_+4>@$J`BETcf+m&I|v!)6!?<^AiHt)l@=>FMw5sCoiCSq(YeNFnQ6q z_+tkYIB+c5b6mBn%u7bcz@La@a!i9n%x&WruU36%sl3r9|QWB%u4%Rh!WV1G}hJ|2AHg zrw0V)muGPhM-_wDYdfi@!iU6ESE_@~vB*^El`E8Vrud;yg1Mxm7@-HLYk zw{2A7c+lBMHLSuL?U=w_hI`B+YmBN0WnJYI)V~KuOq2(%F9rwI$iuI9s4V#P=NkMp!riQ z&*}~Q5DhuU$RycxwZ>W2p&a4W0<~;1c~>NCqT}svFY{_ zrlmbp{?KXQrSu=1=`95;fJ@5MjT(jk$8~2`@Pkz^D)x2W^T7EzDBD*@!F6I(3_P=T zcz(f6Or=N}lO={4uXGz10Z{+|42MCR+)1cGY?(|5SO5Jm?!bw1;8O*VFWtcgQg8O~ z8z$zP7tn{XpZv_6-XL6c3L{E<7%;(ZUbM`B=i-_UUu(739`-=ilYX+C>Pft>ZQDA( z-MzZI!4v{;Xg&RnE}D0-$$zEoZz4#x8=hL^b$}}p2{xaSn+dQ(v!iYBAIXdty~rjX zxfUc5GutV>^+T2&hi!o1)1sdj(t>DwzoVwJf@6z(x>7Q6U}T%r8@!G=MQV77B#-x) zsA?b>|H^j5p#TYT=`4F0c$CG^OUy&O?PAET>*B*mqgwmF3&bpOd{D#%pU+&4i<qR@cLgJqtWz-|ql=z&c$bYuEBPf|TuX*qC!y!Sv$b@ocIc z;L>5O_mQaL%fsD(A{=$WQgr8q(wjJ+3Ha7~i{V|Ms!UvdoJTO&=q61Nw`WNmXUP;d z2+RdH@cGDNa-`U=Jgkb$h*eLQZW9p1hi?88qyJ07Qf``8*OACr2HzZG>YkX63i%=Q zNb|;;eGgN$b0WnCIVqD7RmheL?kef@Bq7hYhR&HM&Zwa|3VxQ4O=1af#Qs9 zc3fn^&klze5DLUf*V2UN_&+cW%b5mzpNM_}#e7`Bfu|9t=j!caE1 z-$5NH6!wn*V`KLFnBjic^p^t?JD7+0x!$E6&5p}yAx>99pSQzGKowFR%U@jYZdL!) zw5r<>Wmu^SFr>js2?qAXc;4hG2hgm1Nd&I)Hrvm!m7H?z zuFR($K_`8W~OK$vaxIX2ligEb2h*)RZIlkf{VCI;uI9{e25s8qJ1f z!Jfw=fIe|AforJ)nc!9j4G(?Ld}~BSwqvj({+X6LM6PBorW~=N(b1dd(45X4B9)ok z6{`M3fJ(6hD671LXY#+(+D`) z6|cQDn}7Sfc9xGtxr*u*xpE1c)8~74gxX}vo^F#opck_IDhJB`dmVj=TKd%zLRr)! zUXuPPM#kVW-g5(v6(c8xxw=-jg0C~^nEtj~vNFK|%NwOhv1bi5A^I$UH!AZQ<2$mX z4BNEjEXab!WE=;IY)UUa5%vjs#G7{Vsz>ciP>Akp9 zyuz6K&K4ewfZBME+=27>BhZzNw1uk$)dWIi!CVHBW>_sFuX6W$fnXgZ1y&(s@NYBY zwsGSpGS+{Bb0gdEER^w91CSc{s|If5b?0pS(!ih25P+t12~f}%LJt*5gMpsOmAY*o z^Z_hr!qxYuY<#L$=uA!-TyF5WB5k|B7AQBAkws!J;>R=Dj9~bazKEp88++0)X5egn z$Cgk|Y4qjcoQnMWqzp8(BVr0;sSh|u+2ESY%+3O!|921k6@6b98M{H?sMaRra3;fn zj%@$X8m^jCDiqaKhJZsxr6Fb%6ZHy1=dMov@Mn@Mb;bNb9 z+~c0y+b}e+e>Gbk=rGOx(zbKTPnY{X4Pn2es@*4#!+|Z7yU%u$=K>rawm8{(u4%6w zhbKhaJMK0STy@zV?YuyY(#~Su0HL)M>Wx~k2fgWREXbgaf#|ZHAGQTtPrWSziXBfn zip7lZ>@)&ub)KdqT-wOpU3QNRcszC8MHR=e&mneZ)<}eF(UGm=7wR@Uu$DO+5!&KR zMZTqgE>PdR2)qVWw)0tmhxHx~O6&otzrqIuP(w!3rnH~+X^_wrp#ZYf7*@+G`A4Ie zlh(3}VUhqSLu$?DgWGd9afbWC(w9Os8~&BF zbrJJGj<2f;l~T+z>-Xr5|D=OCK&sGL3Pmw$kv9bvYe1*E;%Sfk=FvY6jUn!!m?8>H zwH7y<2QK&)r+0^G6XZ$ms9xP93|4rk>K?I$&)wIq*9W@z8EAf@nw+A*;VemHEL1H* zEQM#vu>O(9JHIzDD8?UDKF0FJk?Ub4EG0Dayd*xs{4wtP_PL>E>h|Hz0F(N!#yKXvg|z>IS@1s{|Yt zCCs~Vh!^mg1XZzzA9uae@Ic$N##<{SSs7LF82K7~nNBjydSWuztrsy#nhvH)B0cVn z_IIyhv^`2UU#da1=ra2($1a*cNb!m1}&1!Knb^W7nO+zitY z&c*K*{+qY`Tu|V0`4^T+gXeqRn)l2m^(HX-U5*wckA9b#3Lhr_quen!#%lO;de0Jc z4s>BO(a(c6g6|e$h+=+Z)Sqe32{xoIr7=3^6B*f8{eD?wHE4vlCwZZLV`{D z+gPh=m00SAMIp6%^#YI+(m6!l7N?OlVk=%eAp6osWEC2=OBxxs$C3tR zAK1uvuSJdZNcZo+6Iccg?8tkGhrR~`u$dFkBO!Z1G?#KS6+&)m4t8zm{B{;ox7!nF z8*1<}=v6qK!~wgdEQl=6z+}Fh_5`8i4yfmF9=WCv^yda)nqRL-AD-OU7yLF?!Wos)`LzW~eAl^Yd?B`2pI0Upp#^r? z6SoJsiO6~TUW4Pw#72S?{Yd58Ki$WcQ_?f$R*MU@2rsiDe7@HodYq2kLn&%)D3`g` zk<0cR=o`{58-$YtDE=hsu&Ug{oD3Kkg5tP4f?3-&Bs-nAgc24qqcrW=@IIbn|S}U zf98JsW-#W(yOA6eLUmkNc7&kl6c&T~1akjpCQ$8&nm3Z@#Z%~a^p|dfPp2_j*o6wK z!17B9&Js{N>1P1}9ll~z6eBdW*B zC*Nk`zyJUQ;6b1IMHMU~|3#jV2_N#zU3{8;eVN?OQz}MKpDCY3GNd$!qOxosnlDt< z^NZiR34ls{96{jrREV~miM0<{GtBO+JvJS#Hvg3O#Rtu@5yTr=G+_g@EjZ@+f177h zc*9PXHE-2@X)E1tKHk4dY2a7hf(3kS6kw*dbgBTQC$KoXr<}3RT@l3EKm$n}2fxyY zbriKwY3oc7^*suU_y+M{{^7KOk(gx3X4s&38o}dfr3MZAi0_RlU9k=9vtsO z?s1J`U%nlBX0jHwrs)kr}11)`?25QEgN%Ruy zygpiD9zV=e@JN}pzE+z;1nNa24@Xi95ps|G=^gpnDL_E~V6$iV@28lXsFo6<)xwxT zh%iC25ZI%5wqgq%J4hlv5rh)j_Wr6@!)vT9f8o+q>r!VLP-i5*@(^ehDD}PI*C%0SXt_eC-Sb*$l%L(?1FuG6?%O~8F z_Dz<`H@`<%&~u&aBx7@CYs$xAhhJZL2cPwC?5n{#a#CAOgBGmi4Va`OQa2?~C@Hi_ z)`}}QTS!jc&GhqkR`+d*Vb_`$6r@!>0nN0K@&o?=o|m=MV65{cIi`%be6;->i}d@! zX~4_4cnFrfs#a^CyI{D6&FOkUZ88GL`(=qen?FtlMm(Q~I{D=}Y{1lA?!{@x#59H8 z<~ur9kpJp(kLEp{lz8IDc4AC32$SSeDW?>Krg;$(_cfTxg0u@xa{=k)ydZh-cACwX zIa~|ghR^L)njx*^xBe zB`3&tvGbgXxJ<+1;c_)ZB`~s>2w_fn)u>DGDk8R?aY|pK4?#a|*u)-$&A{3_+5gjp zRZqN~IXw+7KT`O%;ZgD2+E$qi_MPB~Q)2Syp=((Snv6M`xKNO;PPAV`@SI?DS zNve^xt{{p|AJc*2s@Mb2&SZR1DZWt%b}kk^d##Tev#plV z%fP_A;-q6R9{>ObuK}JJbVvVc9mkB}j0F+=!A`fl8e-W(4LPTPtA-vbo-@!*b$DA! zb(b=e6m?!6FaQtdz_~AkR!VxGM-lysUsl{#3M%n~h(K8MPmbW0yP*0zyPKNVC5mt4 zKm6+bl~O0kkr%WZAMuca2BW`*Gm?);UsmVB;>M{JZIfA$45%+km?JVi;2c1a?hrM3 z={1g6#@H9y5HDU4V5lK^B56es^D#zAUODiMU;f|e5eMtN5G6yaBd%Wzfb)WUh|M?b zq3@PMp$5oZ(-qM3BfIPKJ+G=9Cg~)uP<@!{Y9&JIC5di&U1Y+%4=%qE%5dzqv^->< zOKej|5dI{WXD9Vpt+X8N(>)@d5>MYG06K+hHU#jucH~XbNKKZW;q#tCMIEd8yzx-O zchx>kZXye&p{VOC7Y@)M!?1lyfI8^4PRW_!25Y*rPgYB|%x+SM8=OZ1jX@_oupWts zf`rAC_CdQDb?Lk@XvV{c^-jq@F8M&W32-xn7DI=hrSFC4Mf8X=Bc=^VLf^>LIZ@QK zu97>f`F3wV%w>2Kpm(>7Mh+6ho>J%h88FNflNdwC^T{2`sm#0=4RiI9x6oD;D4(d8 zOA|9$4E|A5O*tc7#%Uao2kC+BU`e>KA5?V(Wf{xJWWWJw@M&bAO8q^3PRI#%-{fME z^~w4nmmZfjlI5Ru2UnP-k;yB|l@ki4J8yj6=#Qw<^hoqjrD*uDiWm#u+2}bq@dru_ zz-)eDZJKxz6obK&cYxwYd4~qj)2BB5&7(O!d4AUT&AZ2o4O_|u2DR)ho0!8kZnW5)%rE_ic=II01HbxZDKh<+NY^z`V9 zIU)uu7g0}=Zq5%|XPDHvM6_y8P6s=?FaUX>I8SG`K03J0RP}w2BZINOX#?CXy1#WLbo~@5WiM~o zdVDVYDz(wHPMR-`EcP^o*?w;#p8R45EF(8fi(Pq2K6gAFj$=8u_1OOtG>8dhNH4vZ zeA9eXkP;V2%uDf-U|_xDeZSGSl9G+jcD@+a3+uiF3#q4y2!7Ti*Em~nDs-*YCIdt$ z)YS7Cum2ptgW?TQiyeMmH_KS!rLCMF@lIl;xl- zF+joh$>*$*>PXoI$&vwnK0vg;>TrPO>LB*}QH9Y(Lvki$*_U};kDRo0%R^Bhm$!C$ zvYg;k3MJw+`fSeMY{0j8!VuKvI%j>dbb~Pl0=#dK9V4>LsHrjSa^w|@y0O=@p0TLZ zKav;(dJeI%wtv^nxqxqQPLFMgVt%tGlY_&ArkT2c;9VjHq*7dBtE0dx8!hSV=p&^s zl>n~~=9OJ^pe#y_O!}N*@m)zGsfaBah8ZsBTvN7S!9Hc9w~%WG zIE3(NSq7Rb_ia*35d{xjo2m_7n6`GPn!=aI`fM*T0y5Sx&$`$c&$z$p7xE0jH>fwns!Pk-d31r2khqv)- z9s&;}Ot}YP?Et7~uNw*kxI*lFjqh~Dm7p%4uf2+H()9xhzfa9T?U9QEj+Wcgf82WM z%nf}ui|~(#?-tKCXyJ&2E+B_3iwdpa6H!Ff;v-4LqipIE6sru`_%_AdASmbc9LitTF4$Cv3%N7F&Bz zKE@z{H#>KRDQzIZ7g_W~9H;f$(G_KM{w^(B??ml(X$6G8WjlxfL8v z&MeG7RjMWWG+EP3#)SVEl}a{AT87nWrK}dx5Lx+uy;B*9ua4^QcFbzO4H=FO`-{D! zZnwdsHBf`|&GbYT=OnKb^Q5}@5C^bpo>w#(s1%I*_g^ zugxW%$c_7m0tkFE1-T_bUnR=l_icYiyS70#jxn5U1UWjwN)ET~aqKI*)C<_Yv$~&) zxh2*3=K5oM-xaH4o;HS-mk$B=+J`{cCvdpw{o){GQ}3ZHy#^EAXo^0^&Km*HLgn6% z9f!NrWQQB|E`Nu{2pj~ucc+E2itgxWK#`Cxk-f*c)LvDXbWGKlTE#30IGs1e$@8P* z`>~a(vC(@=jzdoNV;}*Sv37pV;yMk*bG>kbMw<=36)OT6X_IkA{uxp8a<)u7@+|A* zO)i%P_d`-0Y(;oAE-nuSl2#ECa)~{ZJ+ehucwW0 zE7$ulrc$n>UyjMKghb7UYTqFeOQ-~9Y@lB6j0YcCJJNnx*uSQBa=MAac! zT>+8wXWz?U#!w5h(wL&Wpw$HkGiv`_e zD`W@xx~^3?TD!}!mTce`LsJ-8&{ZWAQsz&ff)m&aD*-LmW#?y;N=6OBQ>=tLS8p*T zZMLpjBSLf$I7TS60L2f+z-;2i*IjjdOt~E6f)^plo&q8$`6sa4Nu7x6RolE_i=a8W z70MfwE5a~$#r>JM7sk6@I?LO5inbNQl|j&YV^n1whmhCHLs183x``=;Jj(2Om*IT* zvQH|m{=;nIyR3;|NoLhf+I%c9<5X9VF%NA~P@4f?#8@;El492XVS>MV0~kI&h}w($ zqc*f@+Lwq>pgO!4${j#j_>pJFsKy264G+bPH%{3wTM+DdKFWuBlQ5$E{dn-z4L`=4 z^U1@&@|W3x?-u^egnPgNi3FDaA#wl-s)~9e;!F%(q-sBK2l7jd9CX*^Cfwj4QDH2-!1}OCo1J8 zRIUz0M|Y%}>$S_23hP^k`?o!frRLP(P87d6%fgW;!c*k%Z*rDwyIaGVR?P8TVoJJ} zO4YC1pzA8@zXmCl01kD*vRg6y^>1gX9;XE%8t~(^$X9+=as-{%^{} zLb;4zT=l~b#aWvM%ECmgq&gh>f!CKaP#t~Q0h~0{D=q~pB=Szsur-zsJU1Bvnj34F zn-D|E^hoDM*VVIgw>36?*;d}cMnrNurTLTY;e1R)IxSg0!R0BdzE1y}(?f(tD-qrJ*@`*c!bG=*5)ow8WM;Syk_gUMbCzcBY zRG-4Bd0-vSY=X=;ae-YI<_-ey(&gp0RSX;w!Hyn^cqTKtHZ{`=vWXu zW`ec9NvLP{NogiU1*W0C30H}L#VVT*D}t>2FA})GJ_(#!)Rylla=fFDi86OHsJ-y0 z6zdP!VH-5M*?4Ll69U$K^~=|l9Q!@ZWYjLiNpWtcTb#wzoQxhtNibR2hT7! zDin`@(Hc5I0-nn6$a;58*9x==7++`p5_;v2pM1j}z2Dt|JL=6iPK>Uhum+bXPh=x< z!~X+4&=WhEFo*3SD7HMW9KX?$0?)zU2qjA|s*2(ZbAr^Ckx^;*l7gZbnUk?>ofEDC zmaqTTC7>=Yx=f+!uXVefOeag}?C2)pC)3$c3vd$!J)+^2l4qxpyv%Uf1ecS-(4nPh z*1-dJSYZ9TPrY)ZzY}4%M~QON39SvE%gq{O<>wX={z-StV!q5{6ol8VY{a4Fop<~s z(E>nW)FaR^Kf#pLg>*iyN_=QP!TlOnbDq3nN(*J)CBw)dgycFQxO3U*_WYZ zwf?X}ROF2$!hF#231haIc;;sCS^=oDd)DEUO4cpgaYuN(-B z=!Wv^{Z!qi{p!_An5Jxx2Wv=j!{Yu-xLXtqU`}dR7^k8o;4YJ{tL=K`o@@iHn zs6Y3dec%?%MqSe2CJjg_GLVmKMjp->wc$5Jo-iPyc;q=*;mw}Sc+je8#PeB}p`3rI z^tI5M{s~y1a6H8PX}Xu?J9l@KU5~+aqihTGmY{38tG`kEM-xpP>B?l_G? zpLzn$sSeXqMx|spA#KNGqVj?&q1f%Pu;uX@M&?v9uAws5y(MxWwqYmvD#s+})&*n6 z=`A*_rVo!C-^rwcrOkryk;j7(7patLyK>U6>Yc_Qc$8*%b59XS3-G*7P7 zs}@jW$FS~E>eJG(9bigP7ogi;;E$gVi6ir**@el*M%@Idl2g|&UmI4lUW0Woq?2#} zn}}y7)Z}*T1Vz2PEC?U?zvB?0z`?U|%Ag{!>Y>7 z2v%zP$qGAZVth?ngJX4d0!<({;=CJg5bh>l14`3PwK#Iiz=rJSYecKM>6VhpWRNS+ z15V|nu@=Vf-;|&yYlL+|F`h3cWrvU>+K;rt5n^E8NGB19=$MO47z5xy@BUs6$5J)u zU^XM6e+B;hCV=$1Vc$Zw#>ip!W=g0m{?J)?n!RDMF-r6hO1K?7ap=XfN%%!cJY&6iucd%v_BC#DXduW0cW6T2ig0?`>Tji8KI2@MOT!FE*t3*g!k1*?Ddk-DaC$U)CxWl`r&*wG0s{u z(*`|ZS3WEn3DABShAPug`?PNfwxOz*;t*#PL&!4$9%vDY`5mZJeXsG*dM9csy z{&U(k{-&~wVzxqWj3+}9``x61&iN*1Qs-M}!&&eG<^SPu62>7oKNfb{w6_zliHMR9 zj-3&JNoV!OW6ChD6}+ogM!2F=x`i_Gzd8-QtbtP{5gQG?cAGqM15eT##jR-S^YQRkDcZGQ zS$P-%TJj4n@VpJc5TLyD47%Q~#gHv%L*(T?_ z`A#;C{%GfIquVVING)>8kP05h@kQwB-YJ-&b3)E}8dfIHju(WlOOyRP7M|Ok4o>g9 zVc0F_f{hoOsV1YB!vC6 zXN{=>igKv=Rjt(gwbYC~GJW8*EWm_`oO6*SuHiqa>`+R3Qf`H8AufJ7e}1qA*; zdQn=P8LWt*Ofy;4S1n}?B_at%*B*$_df0NsbHAJ~i6dOLpy$L$Mn6YWf;yVbrgU(| zRZJ*iuFvg{Wcj7MSK=l( zoRl3+ym)XUFX7vA!IBY61c7N!=GCuR>(;&*Y&kbmGbr=}g7+nl5;{7+nK5HGbIB_V zlQ^w37a!Hdl#-d@uvvNQatrl`nS3>QtBOG|>C@CSr%~$yzntMAosTs3LKo`U%Um&; z=NTT6d~m1hF4c{#hsYB1+`uAOivfAKO3C+skZH;TjYFXpgwOBP-Gc#QKK*^0uiUxiu!2e|Jx7U@A&E+~0>Id6*0gr%&C6sS9{?7=VJ#YKF zboXkumV3td@+g(UI+_m>zzT2%WKyI=*R{IP$ohsO=5%1msKe@*)LCE(!52Z9X|5-f z!Z*W1g}48;-o1X_{5uO;C%dS9Jey6))*~_Nil5R(=Ko?nBy8Ht8-u_dpsB7h>J&j2 z1xaCMKsxbb;RmPNJru8pG~}xV7B$p6H(Jr|b#kBSD!K#2ds(nQ(PSLPDS-e02PXlZ zJ!(b&YK5s(eDp@)peqD(1dD5sbPLAc1!cU1Z>fKdY@(mrl#%3o(f~E*NoBrpUB$`m z^jY|S8CTH8pWq@l)4T+_AQxGw7b%fSY$t=1<{M${dt#cj$~o{0@zLh0f)NH{T8ETD zYjz(koHRb>qd!d;7BI%jQfO8U?My&3S7!0GcH&yXTPLGmx!EW)!xjwq7O}B@q*10@ zb>C4B+Nqr|G#hDvBUcbVJ6YcPB1b+&x`I3j{W%%lBcPM9#Q;s0f4mEr+S3s>*=0<& zNi+?WX?3iy%l)hq^u(R|cbQ-*2?luIyDjPpI6hC14G+U+ zvNkprAydyZ#s<`W4EUO{hIBWj5+mQO0?+Y1PHTZOp}UQ}CSaO;2@frTk^G>Mx!<=^tNtFAbOIr% za&u53wCfHX3|bcO89T7Mq1us?!~qeTK<|m}D3Q+st7}0}^hJO@MrXKtudQoszWH+^ z$mn}x9;p)YkwYrStjY_310}LuxVJB8a+Ycb*-wLejvizu*u=)!2F$Ic`z=|vI?o0! zuXPqU?5ZhA^`J<~Eg226Q0vBdE^@b!Fv)%v(UP*D>{nv6_6wP~ry-lV^Q>sg0e~Wq zJXs&zE(bN9&9=+UzIyK{N&$^vQudOMDxPa=#fVUT5mX+xFY0#xB8U^TKEE#?0p{Sx zDp%u@J_Z#Ho@-1PSJLa8|bW9PX&czjEH> zD~%o1@RtIkg?+$qs-@jIr6`!OAEZn}eN{rZ7A6ubNQ8ukEd8r-$cDfe&f;hp(n_M3 zc93N2YU~=pyJ%m8by<#Wy<(Drl1&<{wjo|SP&yPrMSkcRrC^7U+Hg{3`+-`+!7iXv z-`M2)+lcv5dp^pXXOfGPz+4^O%yeLA3FL?q@sSHxom97d-~ETo-XOPZ+gs!|IWJV$ zJ`~CUHJP`LH=FowcY846aMlaWf^n@@NfC7Zzu6~`-zAeH-vcm89M6XzI}#8WiB4|IL!{e5;S zy`z`xCsYWa`JH;SS)`7AKM~DtghUr)x16x#c%IQ;oXK3+7KmrDl?hjT0zPi1+1>aN zmP8XYLLL3@oDOVG{?RK%#aWmHXa7}w7cfqk@XhLmV}s0lCg5y1C?Ox)J)jihYfKA- zKk@@hVGv7ARJU#XA6rU0b0UvMb$GnZjcKEV2C3{v%U3dp`nw$I z3qE!8y_tW?Wtrg&Ug%bmwz`M3hxeVp(6c65j?S)=sd9NW9i)cb{sN`H(1!whH<#6h zSE0fkw4+SRXCU-QjjXu8oB` z1X>U^=Pm)Y9<(HeDL<}_m2rxEbPUuNyhma!K?o6t_Ap_^o4G;pS1j%Lcn~4|)d4W7 zUJrrC`TD~2-z0ErDvXF*GsDihJ{H&ECJbGBh%sM6!X}bZPcyG?O0Io$|Ic>EC|Xu$ ztb%ft_m}bi2<+fs=FG=kU1{>kM0Y$z=Z~ig;{5`~Y@(;+v8stoLS>(UqT85#$3zVK zz$Yc0%;Y>b^OPOq{MpE-T$4murExapu{BUq-?CosTX1#90cuMgMUu8CWE33dF7#v- zR9agp$7x3mnU_b*z-<^a7J~eL%6`|^gwKtIh`+XHKmsh@ zePJThq6hm?_ZL}^$7AlSLd?9|n-viaPX#2*bIojV+67I-G`gc#tmXt=o*c(wGeB7R zOswAOHXkkU^RvN#P1oWiTOM`~vF6RXjYfHgnr!wg8n%8U$1+aEdsz`jwm1 ze104#?)Jxv+ERcckkYhj(1<25Wkvjul7^l(Y?4GC%&~kOllrP25@~B5-DN{kk02MA z;h*cDwH#tfSNKW0rsA}%Nx&6_T3RxB6dXoo^BCbJPJ(>|V#VS06f%;?bLo;q_uzbq zm!fGI3tXcVK!idgj-a05B4v&ZTlB&2WKTxA8}eOw;oYqT0&WHNQtHX<@`%Ar2d;Sh zwSv9-7xCmg37_>H(_do^3ZRV{p5)F1fO7J zvk2YF9C|UGTPv)4P42kZ6i0wnmd}zzD`8)J0alZEf;ph=FS!q@IKPej6XyJ$H_!n< zm|kIu{u4}@Og_5bbBn*5Nnu^HxlgV;1E>em=`is+R$PgkS{hDPJ|vT+Q#6w+^mS*+S&dp*`G(KALKeB|1>ei=9K_>0nC>jwTMPFG8xR!!*e4tqv2T? zyJ+zrXv|rwA%R1sQhTJNvFBV0H#kOUF^W?r8+I?Pn9WuE6^POE1pq^cm|fONP&Skh zh;!Gv@+q-QMmkDfPMZR6i__V7jGXf9`;;h>P9JyQ=LQ znN3tsi;k75ziq)UUF7vt<8wG#(AJED+kUgY8FSm(yK%xFJ?0GvvW$S~y-+?yO5K7p zLtMMlk$px>gQL9c@=UBbwewf+@3J*nTqx}KwvCK}RmW?1erl)R$3n9NSPa%f@>5ObwaX+Z5lb^cvT|Mj5^!$hQn}-2^-EM z%;h>Kfn0xnS{RbWebg@nPg61(*vqq_8xa0l7Ia~P&xiqT2`8%SJSvNKP+b~!@Yem2s}ObNIXR?s>v40uk2 z3QRkpSfs(fr*@LbPXVomL_oi!2QSjsarP$=q>LqAjil2)LpJP^hiZg)Tm(22(_s_# z!%4g6;b!lIeB?lF!jY|008^dh&&k6|UO^|qUk{jTP>xLN%JTBokv#n2BEj_g|Es}F z@?H#DBNbGP6O3jpqQRCaGAgG=wbTTA-%=6_Fvcl(5B_S0z`=n0W<2C4m#z=^G^G8# zt{dF0xBl$&g*fQUcsr8*O@=x%zdjiseFqFm;*iTzw%zk3CO^RAEsQ!PPDAM4*HG$N zvy8!}RyrpjO9ffC$6z)@@Ud#%-5u-^0_8^?F1A#R)m*?3wXA=|IVTS4Oq(ToOXmXy zQM`9>UZNS2x>yDC+0~HyVRna$;eW<1Zgo5FrkLE|hHXt~$<#{nFnv>}C>9N>6j^ICUa%_a-^lSJY8 z_TZlHG1tV$5ol!@nN&3scXBTML5@f7lnGonAts*{*$;|*jcNHyC6Iaml*^C7^)M8v z1gxx7xd}?^yi!Bdn*Dh*ahm0R&t^y;+MApcHgK4_& zOy2cAsTR2z5hD+^$!|4D+l`QY99$RaY~caUXxSeT*;H>jKK=QO5u2AW6NY>9C6&xp4EjykL}S2DEKrHA|Y{`p`wV-6=3=MaS5iHx zfmbulDfwfcL~Q#m%+REpf;i!Pwff)zZ`rX=cD~tSi`y4wgvP-!5btkmvpj618c?8* z0wS{`8<3Mad}=EU%IVxD$h&&{pSVre-l;QC1Zey04PR5!0aCn71n(+7iRm4= z%&GCzHUJmkmP^$7e16LyFWlX{z_Q^Z!Ma#6VnqQ{;rm_P2Mx^Cex{(bN)(Nu2lT+f+Oo-HG0^e6XEyv9J@@?9mPMXdgk}QEr zp0}#PfU*rBNED^&gq(hknRpG|M0Ch=T`Pl3OJ*BjEVE>@Ozo0T^(4zf5b@J-WrT2C zW%kK*IkEJm3U_18aFPP{TTW7$^sI6}KAw~}!=b4RcvE6N=cv7)=r%9q0+y5qw%df2 zuS<0JpCpEguQ_kUBP-A%Z7;kmHfhG*4+Uhy6Vi%_9ZbG0VxAAnown^03regQ1GB`| zZ>>XF%ZsT!YwKiS!5_Hd<{%!*&Pg_Wy;s91O{3ck1S9WvSF7cSMr#SBk;D-QBSbw4 zIiatHv>%HRM1e>x;GFC(DF zq)p!DbwY;2Oogt>QbT@l_Gov33BXviDX55d`Hs|2K_4w4pg}5C)9u4ElvX8I3yzcl zIuCs*dqwnd{C+1~y^b@9=7%`J+6x{A2MM2=Npm+$3D)^n;CwgV!@}zaN{+N7=q_lgBZ1<)hrV@SU=I8G6xBt+Dhsx50m1_Vz-yvGfTLPlG3x z0kP6c8yRA}Aan!Lr@@`ZxaXIwY*j)vJVDF^TUzY0>>qiR4*sg@V^0o=%Bg4=SUF}k z<3A45wwhABk8*M9(Zx1t?&4Iq2PEiHyrhrmpT(2Q${L$+s6d3pE8Sk6EyBXAJzknE z;a15`mCOvrV|Y~P6}cE)uV9;#VR;_|WbKwTIt{JD${7S#BiS)*gtRBgE}`S;G!3}# z+|T&b@tNIcd^uu&2bs4R0?42qJ^Z+gBD=s}gOK7gEzXz!2Ne)2CD?ilZ?)FFgC;i&R>csMT+F&K8rQ_q3X$Cmx=^h5^VxCX+jzV_v+@b z8Iby};9c72KfA3MlmV&_2cBGVlVgY1D*sIKxGlL}y?xfVV=lkzmbOfku)VW*rJHM#06Ptj_;&Nam(Cj_cLOs`}+x9Hhn*LBlD&9%LaVaYHE^r4i_;3xwEi8 z^u&IO5#d7nWkP|19vKHtlg4kG6=Kj;N;Qm3<$sMQcH zNs?CpMU+=ePkAfHXR**YC7de6lYz}xCxzBhlaCWhkvWE;G)YWX8+vr2u+!`E7RAMU?r`@JC&Z6>wRV zE+CB)IIK{%b=d>Bdo0*-eMR}z$2sJwv*guDlo(DmRI0niAmu7x8zkv-!+)mGsi(fG zcnc|~qK7P%l##vr&OClZBKafSg6*LV_7x+^CC{gqzeZf(Z<49DfRSSoZb|0nOLt$= zhFmv=jgR& zf8rdh7RGV(sFKHEG9UiiETGvpDN5KUO=lg5W!OUgsDh1~G~ExG)vBv^d8I&IrHy1b zhXPG1f}PKv2HNI-UpSEOKF;8n(wnw#U1L8tMBv38eiPdM8-C*jhg=verj{BrAkY>d zT<#hZSR2Phakc0~C1I45Qy7)fv|ktmumXz2CnAjtDFqezDp^&Zc@QHG$BJ6kPlJ<3 zwBFe-zqM$8Hzgat z?_a0gVQ+ADK=HxgC_VFeD|eRC-pV#fK7{47q^^@mHu6}Q4B>(M0znL3!>=d|nIQh| z4w*z1t-J?Z@}v$!KE@t=H7p>xQrd^hiRhRO8-&pOv~TTl(tKC&6f>dW)2T+Y6dhIL%+Do@jMj^+De~USm7Maf=I|s(bY{^tISH^!F>p)7thvi8J^; z_#7r(;k=XjSC?m|)HELMSeU*;IU-|Jv(z7-f}Qtd=Wn8*USxgrLmJxu1%t5GL*<&3 z3``g5R3owJ;{sM1D3dcWKn)bt^kHk@9X*y|9XglYTTPrhxlE|>RgEh81J@LptgtPy z3H8)7(@mPAzAZUZM@O$NmK1*21nyet-K7PdbJgNifo$jRf2f&oTWnuLfCBup&PgYN z3m%)w7J!5T%c}9RtMbfc%iAN=QItS+eN4W@I!RH5)vcsID_%KhG$-o&x1kdKeeFb4^>XUCBLVnBd=HV=7Eanp z(6sSUw|jGF^wA8V-3qudh6SZ%kiW1G1o*7wc{N%nl8p)4FFp!}`67{C{YmVN}AoT_dF zN}-Nm`__Aio@Y`h?A3VUiDy?h@BFD^F~1B??>2e9M_J1z`U-55B4|%nkVbK)X?~Zn zLE#~uJIP1{4^ago<)59Mmf#4PhcWVND0b?3bfJ4^d+|TG0yeThdJ;pKbP~N5xrLHE z#)a!AF0idlZ96`&LvNPVOVFDp`)7_eCVH_we^)wKx?(zB!C0JeQc;lh7h?`B zUb#npGtaZX6hrM(ls3gVOBjkG)?>^4_8;K7}VB5*sD`e{D<9>LN!pjh?o&$|rinO- z$s(`PIunI_=H5e}PR3eQ_=S=1KH(bL+UOLpX%L_o>1EiLjfpEzL2#kA>!&;|7~Sql zkooV|M?Bv;ixE2u;z&t%5Sy+YvwH{Gry<=BWQ)wTzWRp5=&aKBCKCR`=}tMkrhxze z1o;7;e{@CvhD9zng<$^gYjVu1K)VX@n@*H*%%()z0r+B{!K5?0VsA>&!9j9DOH=OE zUF~>-cpl!kE)jJ|6I_wxGn98KCv1ZsA1$p1rvwyK#%p%;OPqD>#u(xKTcnF*yWXE+@Ms;YltadP`lU z4{j$XYOgr#pBlyuDM4Lvh|BcJg;nParKmP<0(Sk!#ek)RsdOP5_Ur7n1VwFg-dHdJ zUcd5Y1O*-S2TFur#jqm1L6;D}ot-(}A6Tqn34`h1)Q@uJJDS!t)CLm6^KD z0Qi#Wq;~51xyv+B6`U{*Az0{BXM4$zBVL!gMBxjPXilVeHsGM(%=bX2bX`^8I(wpu((& z3742Fu1v;Lk~}H&&v9AzUqJwMV7uj`h?P+$yd3(~o{h7e$E0TcA$Y6IR# z;g8+$TFfM|Yh^-dH-knGR5b0_?x{yf>^%ePwJl+U)6tTuNi0XWy90CnAo~gJ^Qi18 z3l>c{6f^_`{#~T@09}ka9AQA_l&U$ykdEw|eZd4aL%C{xIS4hf(resD{LF&U+i5O3 zeUnte54XJsKRlri*N|I1>PV8r#+PrK#|xAtV;SCF`$5<`Ad_tV zAxf%Pph8S9pjB8o=zsjxqEP<1G_;pwS*g3f6Y!Ao$#jDsCNI2mitg>ZKfi5#c7b=4aVl(;?iXjxG5{AJk8_wPhqI(wh(uq%n1@nOoIqEjmAR5L4nAWw=j?-d zemn^kTV8DIQ6JK6`Xlp;!=c)>M{lh{tayq}j^Y$Top~4|R%%tyP}PXQdThx1%mWKZ zLr;FO1(MXU8h;X69M+6?dg!`))RIQ~diH4GjOZCtd%&^C3wf#Ygs$yqQRuW~-c2_( z`fb8Exc{pmQ%--akJAb!8mwy2%DF9C_xh*>0%9Q)2o`X_*P6-4voO{A(&_W$tC)1I z09t3WW82I{^}Ilfl2L~t+>jmqmBm7quj(KG00Ybco?&W5|8r4o53`30zPYDt;~PHF zC@yo#b%?D>xWYipRs29LM%T=ajy{up11{i z8SOkk6>=`aMH$Zj@g`?^Da@6W{x6Ys69@8E>rIX2i$J5=n4U0G6EAo#eSwtd2lQeS zr%f-Pdb!&AQ?!>l#!*3BfqJ6g_fg+)AgHbtE!PKDih+@i%aDK!f#LRo2XOMwoP4@7 zYc-PxHVno>xCS7VOVQ9$2o#`>3R#-})Srb05I!eGQyke^#;JJDOF3txm}8y1Z3BMz zDbCV4O=uBZMcg5YHd|3%9X9*+DqX^o0*3g!h^Z3`t(p{PvvvAz+rzkx+`r5+M4|=8 zmd`c=FPPY}%!eadtCeuw)B1OBH)Qg3KUckz7*`Q?6nvH!l~HU{erx{5*SJHqFoCMeR(ySaWt38+w)AJ7-MjQKdF=gI6|Z{e?829s;BHrY^XnU$PLdU|C+EB{xB z^ibb_!El<_?X|A}x5^{WcjPwN@VNuta_tt`PdQ2LN`_?)1BEhLFS0Y-{Hs% z8|~Uml%{0Af(ka^6Givbi<$P7|4;Y{7-c^oJX8?hY;g6UxVKT4#@gNBWlm0YJ}A+5 zJ80F#egqm7OUGs^(v%UqAhiyi7T(Lsx~5~A`Z96mrR$*SLEA(_H7%@6g*FUJ3x+|z z>r|G2dqxBdAHq6*i$RYF$6g}o&L(VntR0Y=u%+uemh1%hVLRnQjX5)>yXsXmFG>_V z)CLLgK$FkL0foq2@rdRh+4VvuoO4L|k386G6FgY*J8Ur0G;MBRyOWc)`$7cqQQN8H zUNaSFXwp+=ik%q6fZJv4P zIIrzaL+8Eqd<<0!(j&FVoH&43nO)D)-BZkF@k#);JiY}KKRU9<&{u@=$X?Frb(U8& z2wzI?0E5c_01>i5nr2C;L1>vw2v`66)Ki@cU<>qY;k%r+-JMp#l6b1) z>J19Ic9vg^$l{p~aZEF_!zXDS#Q?iY@C_&Zf~*R@AtTBJP;%IkRedj!a{b)LjD0mZ zDdvO@d40f_9;v#rQsVTQ@WTuf^xOBsz2KILr}MsHmR97Pul8^0s}(q@>0lb?V34M;D421;+G2K*J&6&6(pU!n6ye_u<`d0#d38bZN_b^HvlxKkXuJSv z%<5C|q`f)OE#q5(Fw(9c&~!JC3iB^Gbkg4+H1hpTZnlb!)p!x!5uWGOnLxN_K^nXl z6TDEza(J^8V4dgcSWItzF3X~XG?qm}{U3bZ?X-uwDRSCErxn1;>>4O&Bxw_Lpfdek z?3}+J)j$uPhnd3OI>2QvLo&<;?sR{-6nBQrVU{ zopG9ohFM5Z2q`0()$#FR#8ot_5Xyxe$kMHBZr!LE+&rfTM$+}U+>4-DAzfB?03n^_ z51WH7!xoeEc22@-O#^2Bji!b&nGs+q#|Kds8%=&~z%T$z((fWnnR=tpbDj3Im3bJ1 zVCp9Nj5cTP5%IL(Vn;kDM|(z%;TuD~Ny~kejmT%ap}JxNA8jOHFumh$j%O*{BR4Sa zpyaE4*Z`3NiAQ%K{Su~a_$g+K2DU;mjHW*3(~V_m-M{I;5S5uP`( zK!{y3Qi@eWAgkj#MTF1<%|x&2+;hpRS zthL>@^Pk$@R0FYXn3xw)nSfLMAVnd-M6ZO*4DUG=20eDkZ><^K^@6lf29))+sEI>t zu=RkB@F}W4>UxD18Uc`HGOaSn<9qE5o@@b{lGFPc}iqg}e-P!lH4d z^5odjk~Stf42l@I_a-D@!6GS0Pw0S8oz`gEayAO2fQD_DlC!IKS#SjKpi&23bWfB_ zKjoTUY`H^bV5*V)9fIJK+dSyS6x;$ysenSDC3Q8h-1XCHhVPq4jQt)N2J0!kK zr?zIv+I7EVC1Lg`br_66ORhUi)IE6ZYEBZ~97p$f7crjp!rV==+lG8 z5X8DQ?Gr1WI+p8apS|zgh1(1|kSo(DL}SVUee*WyUI7uiYR`Jdd6B}1W^E9k+XsRh zMlT=wzXcrdE>o2L>`|jIV?sU>3DXTH6}(!zUj`zN22Z4%^O?8%g_VRlUtyzNjk8s3 zx?26B_egAfC3dIMMC`y4);aO#*e^sW0b3g-q!XLSe5eeOfJaHcCBkrY7^<6sYGsQs zIw^xo&;$$niqzS=^1{wI5PxScWbb8T;;_Kd~^QR<4Gc|k=H zX(1deYZm4-J(5o)ibnIb)6V-Z6cH*pd!%z={7;~k$VNiW>I&i+$Imzdd)}MDa^3j^ zsgXEhPVjoyR}#7zC_Q<6AmlqJdwAc+^shJJ~r_e`Eco|Ut|CQ#*kf)9K4xM z5jZUJEXyP4LzozA;LvGuT;OPOZcBj$+vAbuH7$`_Hdhl&B0sTFSw0<~$4)!dVVtCv zVt$fo^;k9cLx03V1^sekc<144+1#Z`N3#$WrWd&0gnG0ey&J$dbC4fSw0KDgbc(7W2Ce>nV zE7FQo8^QxA35Y1>W4$l42^lNq2XQw}EK}JW`TCECXDO=-jcUN$j5;c!+*`^>BnNd8xyq}d&lz5-oo+)VY<_^{ZpR@qq=&W4Y9;xrZwBo@C>|^ZG zK(8JKKFa&Thvrpe@*z8T+huC&O((HfneW@STxKkSk7ykwLKrZ+XC;{ok7zA?LEiGG zJ;Trz{Mcm76VjsCBVi5#4<)@*Us0Pd+u;@3$?yMd+ltV9h0FB5@q5o}_*=K1gtsMQ zB>h}htFvh+p@AksCikdr_KQ?P0RE{>(!Rhg|O<~OX~R@4ZR0BOpfz;K_@|?fO-j2 zN5BKN`*wcR1SSTKlLG}zl!E|nFzR;Bg%2rC<2BT1Fu47N+$SabSkR$9o^dbci-2kw z-;#%d29a>yKLflYT&p23`rk^kQu@G3+wDSKx=-5=Z<6w;CL^u1S<97Lph^+OD+gqvF=|~@=w|#N z{4+(*-6*Y~k3pa81=w@{@r(5}>`-FI*lDUltMXU0tIx(BMxfV|i?`*6)Rlia$#Xy; zAIk9Weef}?X&kBSFYT1ET-vm%Yds62@ik!6UYv;P^RkDpL22EFO$1Nl1 zRM;DkF~5O%z7I2W7^N>o?X&wAwAv!I)~#pqCvqQrK5K0Hw>h8>&=F`tx=4|ig{~R; zE_T?tyRaUOfNK1T)XcYFwvCaizQD6fv(Q1L%Sge?9pJ+vT^-P4uIQCs`J4%j_mAeUVkK6ty4ArIa z==P061XGAlND;>04U}ZwFJ3oda*@kf-WG7C6uBhN_P3r7(U#0gF(hw}aXW1S1(}k~ zx-Jk1(|LV&2Ao#HYG*HblN;lSK}pvKXU3wQ4cw?EQMlv2J|(c7>1+zer~lI7B)%>0 zn|-NYqFZP$hclRfnEC&&p)AMiqdCiOFnj^CY9Yi|ij`mlU&=)PU(ke6*z-5U_J(s5 z*X}&d@Vqa+9(cyQrPb}IztM|9Bl|MD?CE%cPi?54_oRAfTDg!1fc*!!%T+(Q z^Ag|$xNXj|$-vqXCA%-gN4S@=egFJ*_*6GmgqD1Ea&C4X%pH+4n=Aa}hi4gMpSqkp zwv1evacwE;849pzu>eg#vcH2PLnpG}S~}#k?L535Dae|GNukaY>_=8fjSHP={fAsA ztCAOyIS!aO0uc`5A*b=<15NaTBr~{V;~-PVD3wkOO`o^SDQiAn6M#5zO6ud1bBjD? zi&^=p(K)Gm8mQn+F3BQvp|H#t_=(w}X8Jv16KJ<+2}%glIBiA6qNFnDx1p!q+V${o zF^RT#e|0%+{+gi@nEeAPLz&oxvXn?8WQ0)E9k^zBn=S4s-WHkZg#&Ox?@YUEM}WL) z+7hcAL7&T##!VR!uQW>TqOW%3Auj%I`I4EgxWXR9N)IjeN-ysvObt{9B>>d_FLUD)m6UTfPk!nrUjlzwzFveoBt@vZ$e83 z;}H6ePtR6K4rtU|FC!kWz8_eR?6%qYX~K2&X;3-NOeX?>PE*zyWbPdpH{{!cGPfV1 zqBS=rgMi4o3R2ySWH2p8wGZbPBpkXBo4>da`Uv~)xVdY5=A4byBWxZ0zK;Zga=Ybo zt0AQ@bjM{TZAyFo}M`6<~n?b@)KP{~bi%Jj|` zf(Rl7f5$U6b=yQ+M8)Z0JvX0=Xsx0|1P?7Y$WlH#tnIX!9yAIHY^R(#!V@MEkwfN! zs5z<^dYO>_8+-(%ScxFwD(^uZVKFL#N`*W`64nb?WQ_iaza}mTPpMg7ofgA~faJsmW17ouG(@3bBn_q3JdTT}B04Vdk z;;sKb3ef(SYmMODvMi_&$5B9iSGoYko|Suk3ktqso7)R*ue%r3AsmzTmg0inSZVk) zFn=v82+K*fLRf#iGfM22jiSqI+Dx*;PP`Eh)g;jV7Vlc4Afu_jk{42D)FT6@O3h|A z>tHrDr+qOfiluFy-X+Rzn9uc7#{|!RG<7e@6-3hQ|AQhTRC3fehIZM&j!`pegsJ7% zx;9Tey06^f_(kI4>3E3Fkzno;_;E^>zz?5~>fXjiIbi^DQkD^7Er%%q4+NWJ@yinTkJ78EbUW1>y& zLsky_=}G{+rP<>#7HVzw^(dpnM_->gDB2(FQhH^wBudOsf$R8tFaUw7jGL}d03Kxf zs}@d$i87cdys4uQX(^N!o`szi!{R}(`;Axp%S|*_w`u`XvMGAHnhw-tj2S7mE{vp# z^xGoO=Rye4B_gf<10uBs4${s>!|^6pqg;s;JT3EXk7*iA4T22|>t6A$ za3yYEEgukcRNdXZZ6^Z``}>$6P64#>FVg6Xu z(&ocle{$beo1o#-yM7vdvD9`wZxJhD3b%)6U|5|Ft+Dy)DKOemG*Go1K%Um0vQ5%AHI%go6au%-bD*qq-sKax z2d&()HRUYV4kjXqqMoz<2XU8*fT^IJ+o|PwTW2!2(UJ$?BxN^BHJy8)fn^#^;Y#S* zpm~sbxf8ft_YH;p%-AT`m2V|scpepZeL=bU+OYPoJ@&m_N4=%Vugudm=JKx(Kd68C;MQP`~C zRz)8Vc$K9^XuIL}h=gyTrDOa@9Uh|ImiYJ zykH>DiKq(Rj!F$tEia;j_6k%Ej{9HE_dUF&*F6)Rg%o&&+crn0ae!EsqBjWW@Cg(< z1g6iB8e3NXz)s``UoKIxbSj-VGu{@W*y$Q=$4sfA_*__LrFG)9&Xe#N@Es1RPiNo> zV9s3(%prIJ=*`={b6znh`Q|n*QvVi4RS*C|lB1I`hA*xZE z=^&EK#pHpeJzDdAl;??(7p~R!@k%Y{-a)JI+V}U+CV$#|Y)Tmm0M{Nq*)4jQ=W?O> z8z&5m=G)bAH&g$;qfb|dDbW0dzoRhne{5rQ#p?%|u$SK8Kfh8GJKgFCbLFrOu zuVBRCr+S;#gOey=i4F0D;oRQSRTX-`7Wvl;*vCF27{?DIx7jJ|3lgJQ>|82SGXurX(bZu_~H zMPLKQEv!+GWhq0^dK(FbJ4u?p8yM`(_f+1JNodu}BfTnfr^Ao3-72U|E2!Ax*MO@L znEwPiM(uql46b&L;e23f=z&2*Xf?>Oez1oge_dCd__U4{cpVuRI*(5xz`3A^QSNS3 zihNPLw&ln}=yBtTz+mXEh-?vV8v1xAK2l>lyhGVB4^scK4$t$JheF&;R~4G=QsW!PWv>ZHT`m$93@C6v-QDxUeY zC$J{Cm`2@Z^p;^Grhbbkw@fF6ZW=N#Iq9Y-PKHt})NP~{*3=d2ek3BcKQr1;U4~bn zpCpOQn%%$4E=y&c6?BU$2`T*7tB7wk9adeblUm9VN=E?~k?or{gHtNH<*U3Txi)?Y z(j-qOSdk29r=O(=YozEhr0z~p8#HPoA{Ly00mw;oMH0CW1i``jXl&LS!5xFuUwhVHnv?kn zrU_+D?hAMv&dgzMN3<{G5v|I{%>6yGue5*_Q=? zp_2)ubJEpv-aj3+0lrofB~LI@hvKCaz^q@_x#W(X^S}6zCvExy`B8kwyAE1MIQ9ua z0r97A;Bn2OyG-?IZN}pUQdj3$jKm{WPh5hpmA%x@e7>}TR=Lo3O);aR`h2j;1%T_# z>y93=={L6fRt`2vY!Rq$af6`1b9hj!`n}Ppvj)WpTgjC=uT>eLi_@;fdQVQbVvVNgy5#LDNbxgh}4__mQ4Qx14o1W z<;@?Py8?<#a_(c{jkYqGk8#PWZwrN0y>F)^U238v6}IWK>|T+fCs3m`PJzn_%newI zs}k+qJORk-w^7MPyX@nF(-8srB$f>{xZ_At+4p!^aDW!eb}bwCe#at`0naTc>Ibs< z^)9@()!xoz=A>7!HlIOfOEDMbJn#yvhM}4;qHx38vBpdNj3kRjax(iU_OyrCL_VdX z2~l^~SO2T2ao`VuIb)kyE}R*#+a91|Laoy5z&|JWR7#oSQdIdtT{tp~2hRFuI~E$l z7*ryXi=NQ~9#r^Ra|(dF;G(U23%V7dglTiEF6`nU8)C0{5YG*fIFAi)qEGD-+{_3H z(2MW)rmfcYAJ{%x?S`d0xBq3@3EA7uxzo@aY@1kX(`a}S?ZNby!QzxNZ6(wlW6M$8 z5t{Fh-_?g{iG`|!9jBC9LiwmYzM7j^=R4#p(f&nViD!I*B(n(Ai0;pjnrX);AS%+o z5nRM849)mZFd}M`E^n1QBBmWiK{OcuVDs$ExfVbwADlDu%?278&Q{kzGL1#)Me3!n z0F& zi7mw0wTRVJOfhj zM-EY5c%g?6$!@b=trRPSwXq>VJCU&#OqADjXY+Vy#?;awA1Ctc@p};l*>8ave(mBW z_HW{T-D#F-`GWEtD62OcaNOg`m|uOuW78mf=+ouP!|!v^hD;?z@_^u()R81gYEKV4 zIdk}-nijhE@qBg|w&m3bzij@j-@9piovK+oVNxFY73)VOi5}G{5pp;mWT*Mg&|2lB zgYLBw^7bCzzDot1RGYC0>o8OwpW+Fana3*0NT^9&9eG5kG#bSB)%sCe?027?sTU&# zve6{8Nn>y<+grXA60F<G#`d$%HfAK zJS3QLQ~33=%;QCvM&|`XjIiss8mWqxzjT_p{->ZE0&3;JT>Kz z+`@)0{+TEl8{ZKc!B6a8C+*EgcFI4tzR|>86Z_wUc8buO9pnk4AOol%2J)1Y2ji1X zB{~U%+zKH6aI3)KWdCrCNvTxoJc92nZV^8o1=8S)7yq{ZK)aH_1vgv6Ecbt%21y^Y zD+EuuI6m5h@)BSqmQdEuI?3p9#e{$`{u2~^E?K6ZC;xKDt&DI7nc966orJx4=z`l_ z#lMI7c!B#>wBuQc1#U=kdaq-oEQ$I0+Yg9~GMNgRZf?wLm9zHQWK)@Bk_V*w=g$GIqz)WwZ$K`Uu{9e6-ZG`i=N0z8BjnD#@PUler3 z@d_!SkF3W1d`Jo~)oM0HO%p4UiJspEm6-9d2SL`HJn=SOda~dA9=q|X$tJAT18GJR z2@0V>KeUsyD6|d#?OE+GeafQzD7V)h-~9 zv-u{tmns(9qKjQtN?O!Irq|FDyWU|kV=myQ%+xNj_aP7o=*Dmi--KJR{ZDRrLOyag z;DxDTct6?6n!{B1`rfz+fVH0*&!!VS0vK zD+kTkjJ8VOyipCHaS`3{kFJhqVKr%>pDotQef{Kmctq1yY#@ShBUXa~9yuQo!VC9} zBU)n+B;QcRawsq%+pz|GMmzES=30H!+Z?8*?VlT}f251EA}wh-@uMn2z^1!x_{Jp*l@f%)&J4yFo>OsP}GufR7?^S zQU)Ag5idamZc$xd`{C*`c#)yr6?1*7m^2OX>tl$GApei)^k!7`+lE|p0U_VL=$B4J zc`}1bBe0DYtrv&29$DfhY8}F(QBrh*{?*qRQd8ZJ(y5gOJOtCC6gK-}Ww@}{+(8&T z{9|^r?F?-Ap|fj1R+O;^fnsE8DM0`L1115UrD{k2CW5%DC~#vkepysOix{y)1(-N! z^Aow&!$9q!O}9u6J6XOU@!Ba++%zX_SKd$?ec3K&Pz1vfh-{~?{4 zv(`TIE<5<_ffwU=w1<6*ZE}b4b6RB+l}WvIUaeAh5uOB)6TxTmvTt6U*7rwxvscmF zUB)W(a=$AYN5>HNjq2f`E>X@9JN9$26d|LkKLl^W{7EF+#%*8HSKIPSjLQ_clBwUR z$J$fw$FU+X5Z%><>!G1RB98d`ci3?O2tl_w&G8U0&M5uF>K&X4VB@xKB8-^O;l!iR z)ls@>&GtMWUD^Iear%g1ZR!ZCB@x&;^Qbjv+&~8ZRkYc>H$XE_AN(|hBS$D&dV2`X zSQAmBi+{ItMAKlo4L7pf({bMvXP0Cj+{~UA<+gUdRP_!%S{U{H3e&GHW|dFm#u1mn$-Z zhyTEfki1E8c_<2$x32nMjdBwkOApd&%Ku}mq5oQduev5DE*p`OR!S73@AI{xm+9C( zp`MDUnT)1pw_feV@7X`{N_?tddZ+$CR$H~i9ByA~z@Qm(mUCQ7G0V!T@fU~;?zp1=cc!Zu`pWPvs*8jTb>YAXX07l4MfQPvZA@zsKpVfxx%fpeDyZd135`1+V*Ka;wn`H} zfVW{*c7$*Sy@VZYQl_jasS_xst%S&m;)f1xU9sb(3`#{SFgkcpBRgT309f1+rdk|Z zSA-o(J``phC!$E9s6d_)x-Wd@)ex3C_Zp+n+Yp0MTL1DNadfs@4lTDFC_Mr)&RHRH z*LH4zM$wX1#@1$CLEAW~uT+2!&1P|JY@u$WFvB7cW8GfbnD}1`cn}s}ZJKED8R@}^ z7CA?jEF+Q(fC9|QqNcn%kh$v?XFREl3r6VTaF|p`_N+~rN*BzmXZ=6)o=gd)J7~0U z&{S%W3ru;HS6pKX0EOLfk+3n=E z&A1YWU%9XXE|eOaJPHlZe3v_OnOI#a3z&qKINsUz%KO$gBKEf|zB+y*ow|_Womw1ZYa1gdHzKv_2h->a=_%$4bIIFT8qoAJ)aXPxwft zhwx`CCD$k^xRI7%$|eH6*i%(Ljn25w>505oVxB;e*vQEjp={>?)nu1OUsq?6T&-g$ z8(Q)VVIT^(CaN*E!D+Qpo)a)R3+vJ(`GA{OKon}d8^%*cJ&hB(+Xy~tL*Ndyl<)9Q z*U=erz-q%bU}-`be?;CvOkEX^SACy%5^t26qdAp)6P3*0@L?B=ZNwE6Q`|T z!7hOLmnd^Wra7Z357K_!`88+v+be$}1GeXb)fLYg_CO4|s_hLX*0qV=%7A6tFT#nq zOrN?FvIrGcEr39Uqx-wB*G8Fuk`d(h4`1FRK#D!Lcs$WUAp4snL6S-m5YQ}l5A%*i z7ZfeFG({q8U}XpO8X05sf?0QpNp_Y6Dn;!$F$?NZW8G4O-3w5lQ-vVch$m`q#hv;< z)jZnF-xhuCyCJU-#yt<*Uk3)}N?s~U_oUe^HOh+^N_R$MN z-{A1G2Ai2QaCmo;wEX?2-CXAuVRe=9qGtrn`Hk&2{*Cg8#noE5!rRgb@;JqTE#tg1 zL};%!ya5!&knu~2>0lx^@F;AQv-2gQa|SMw7$4dJ?n9W8E-Vgz{NL)1Ladm?yI7YM z6JHCC_;3$>qsE^FKY9bLtp0h#&YWLM`CarBNu}!j_iog$iH?5ECGVCN<&iP7)h+i$B=?XhfEc8l`Z!$XueBC zQ7^k*B?Z@#y~$xz0mw}Pi(2!McbxZo(Yz#E<_bu{wqQR(h~6NU+(uGpn)F3;3<=&U zl=tp!&fqd3mLHHo++Wts@KGLJ*vONs#z;U?EKZje?ghf|I(?CABB5k}=gPIf>YQ&z5z)W;d>m}KN#hgb&|Wh5JQoB z=}zlpH$Qc(on!H1>t|jDSW9~c6OxsQwtVF%kA%2B%f+(M@q_6|ji`sjRzcNx#N%Wo zVgs+c5K=nXtX#?FL}81PZXbMZSKpg-4!pA|lwpeyw~S=Zt$)1WLpORPZ=dS(#D3=^ z7&k{qV;;h9W1~5=XyqMg_`$+ip!Vvao!`ENLrPnrdW9VmS1v}YA3YFO&QcY9Z&-hD!%g}NsxBm=%XNFRJ-UU1B6!d3>azJ%4-?9Q<@fPh&{w=aG{{aEkHZf5z}lI zJ@8yg2?;=%4%z|w?RjYwG(^8re~Q228%&46P*T5&Ga7}*cEde z+h(12_vsx<;mna|KVGKpNEw-mycpC3jWdApj@zmD2RkR>*#LG?Rm@!siW6s?mdS2| zVh*2=pqxB_mNKGBF|B7Xc%djxUyBZ3>2vkq2s6UUgz<0Ejnm7U^8i`ut>I9&&zK*s zM+e>daU*f;pWnh#GhXZb@p#qWAstmRy`tc8m@ecBYO_U_{i3z?jw;(+hXfi?(j*Or z%#VGq_|~>%bXzkO*_}FsOrw7g=2Z|P=Yp7|2M=Lee4dx82Wpk_GztZRd=V~%4d{OUC1LnwJrlD+bi1d*jBWo zH}L#@3{tLPMQwS~6TR)CO`i=ZH%Rml>@`PG7W#_=^PRFfK?F%sZq?kLKqCR>Nsj65 zqvD=n4W6&5Dx~02h}{T+GNlsKy7a!MJCW9pPT;mGrMy|cKeSQb;v8L60!!?m%Qc@l zz^r>0@;v^2HT)h%TTz>i+)nlqLVXJ>#qZ}rnY*i8412m)cN>4T*6J`1kbWKD%2R_^ zywN@qt|v`?Q<9!cugIYl-NF@EqMklXQ#yI$!uLw(ym_Ns>wnf8=S&BmF!rIG)*Uu; zJ68dRTT3YnJgku%eN&)jG6zUc_+1Dv3U+bK?GB!?FLp2N$^s5snvnX5=vAZm#QlhH zHfE^4C&%#*J1AOF}M6?KP=sU>fIbjHb4VA6E(r^9^dbWsZ;1$F zdQOk0Gw^XM!a%E%>#_cReH5TPX)zo1-6zm-m-L$^doff`-&_B>QgS}b;7k%kAU4cv z0o{4lN){aTMsdAs5*K#nN6)i?8EHjjMBkv^k76Do#hW$Unz-fPmzu)w0|)Bf7tbA4 z@S2ezf4d5@a_)`u@NtC(BODXjdJsjkJaR!SOPq>S(^y{0!K@`SeUv5kamTzQLe)!< zU#Gi`4m4H2NHYoRsFCu@BPd4hY_`-wjk<-06E&>45;{6*48VU#vlz2J!o)IvvHt+G zHUVm;DmpU6tne~1F^$fy^In+6|8DQ0Gzsvlj$gMSCKI zuEF_F*m5`oI1gt%o9G8j?No)!XY%DbI({%e1a}f^r)SYNGR{2fK@EIDMeSwCSez#O zA1ChSW%~-}SN)W+!1vrF=>08Kd?;ZXB9yRVPxY80+ee#bCa^%5-gY3hM+EMK$M8B@ zeDxI9smMhDfea`;!y{bH=}ChW2B$m>W#=KI%J!zfsyOgq2LI`R=>A9dv*~c!Ie)4z zJrBvl-qIB{^|H;QF>s%r7_&1*w_-({pKMma6JRo9ayejkl0ka-_jQSss zHRshAK?vd1bGbhDPvIss(v3=@s#!0d#8M;XI(C{ofQvRN=5)_N{9z0Zzl<4!BD<>n zqlUOz=;y8Z{_AE2^r|uEN;GkEP6?}vDG`i)$oGR}=F#byqb#Dw!K=%E>QSXpVg~9% zALZ_t?w)V_L3k(xJ$c6N5nqYDEzy`6cShd0E2|&i?rRIH%Ue{|7Hn}1XQ$AY3bB=G zkc=J=BBn}OozCgs?s>#m+jn z4j;{;!oyWvn!~Pd>#8!juclXwD#9kCI?Xx?LaR7XH+W~tJ^eJO42VgYv-&qtb>OEj z*)aXc799O;F105f-~WBaaHCzGO;krS`Z`BQcScFT&uhSC@d@bNdhVE%5X&y%=|gWU^3*H}P~*VlIzHKW_+OzqgIU;`>Wyj0iD)>zHp@Ee+UU zj;M+u=v-WKrxQ%B8dvVQbww;sy>$BM=FP*8h$4T{Zl18^KM4{IAh@mIEza&CXXCuh zuUeme#Mb;cclEAzNNE7v86!C5i^3&gBQE5Ha2|tUV4K@VJp^Ohg@*L`P`6^<^Arfc zzx~Domy&%#KB->_){NK7LVn1)h`_!Z(#}5cx$Px)SZfMq0&&kQ=4wi7A_yz2<_ZuAfV1EMbn*aBulDMe zE47b?>7EDOdWb?l`9|sJE(ccKN185QgO4BdJIVibwX)1R&U7=AE)&#labQ}Tz0t4~ z9DoQ-<&S^lk7|p@d&q`p|2Sl*dUk9+2YYnUM&b|Mp=UGG|&Jq>d^JZa*3RS8iJ^Ty6Ev^zeuuC5rsIxvD0bWRTC*IivTjhAR{r zjzk)jvJu3_jXL(}84LIe`URl!SH~cEI+>(55Cy*#Y?owOT7+vFXeG zn$xqTaZA!`1GPu}^aS5rih=gaX?%@XRU&V0~c05uHhRR4d;CA)*B3}@+PZx+q zBf@fSsefeO2_h4Y*wW1|-&n{PCmB@ny{%ja1a6;Cy*PF&*aF9VlQTSis zHcRuxv*%6YD5w}e{Yzr8l3*ZcKLIA)23itw9 zCe&ST5iz-88&ardPEAxq7;~?TBV;uq~abTb^N;k{kl_8lV$zr(K}wB&lld zEL}i%*HZL2#hVLPB!>Jw1h5-NYBUYcl9vZ)vCF8a-j}`rW0BjAW88$RkILCzc5!kg z!c-UdrvS`9i0=@Z;YcW+47Y3S4<7&k3hP0h$VC+_BmZ+A_hUMk{uXGh58>fU$eJ*+ zzw+0>@wY89er-`@X3sMyp!W$|aEHmaI}GxS9L4b3fS{?w+TsWMu%sn9iBX9X1@yl4 zIa)9Pd@!~Jm=YE4{Y^UFhFC)KA2C3*km^&|R5PXMH{1~dWYYSx=z0Gg38yt%6)hx& zjbLxdafUkA{zFpw*{|^5PmFs|f<~(?Q-SB%3un(dOx8HBF+)OIS?3RdETLJTP+D!4 zwh6MKvWCcp2nBJQXzifMs?yDf-xzYCjqS!kLSv@j!h(OqsTS}wGe#Vw+2|C;z&?2Q z(?fJ|mw3izhfVlc2E7Z`!IG}ei?Xl!D7E0lzhsUhbIhCuCVpO@C<%=MY^gw)%OIizX4k+9)rnV8^xxLr6XOKH8_i>2%!9|Za-}`TXg5N3EWbr0 zO>h#PNZSL4EC)02p$ZsOst66?7nsA`YDr|e7tEIh3kH_OfglNQd>fjP^F^Q{?Sr=Q z<(wzdOyuq|MTGxaJrDv_-Xckimn`FX;rW zUb3pd-p;n?VwspHLyTFb-ePB4#ehtID9tL;0>)D-!3$?xFK}H?c!`s`*tN=H%f>B$QLO5du8{g^Sk zX!6m9j?=!wIgif=&N--lielA+T)rV^WStU4?dPBhLmG@xRv4?g5VcTA_5C)YkV@>} zO|>uuX%3m;SU7LM=GaZxV=^n{_(r!OAJ+}W+aX1MH`wDP+pdB9{=~Zo8$D{IhAJT% zr_=u7I;G#TgDw?@UGKl@4Khu@y|jT@^8;**k?tvp!_B+kzG~Tc9f6MQ>K%0L z@{)ehDE9$-mEbb=ZC=hL)>`0Y=0XgPUK zdew9lezgL$y#rb<5)wQs}1k|EjFh7VPtj?>nC zh)=+edQqVo5-;z~#Ubb)J$uX`x;PxDUK7%XnDJzb8!AsWL-8Hxnf!>{Z191^g=W?T zM--K^w+7{W6NE-0{)qE$s6hyb(lOez-$%^kRYCdzkdRyukK8)}f3w=MJWzQMY#_RI z44DTjpM5PT3l!~!Ycc@x;nh{e==b7@_uHD1_5@9#K&li>%twg5A|3TMY-c41ZL5#k z1Y3-4+xi1+NVT*G0GOrhrM*+-Z^HM+B*z>GDnVRK((qfnT~`3qt0>1B)r02D|4dVe z4H=Ab{73)@^NO9a5`}o@QoozoLE;FOQwKr`y3}TH={$wi($mubry|w< zZ_>vyHg``)mx+fSKC={db9h)|O>Ar*_dafnSc5FrK+WXZ`{@?88Yj6Bi(;YcUe(9W z>J%=!#|+Q2FWE>?HYpw#Tl=AC)zqLcevOr^&CXN*Z5YcXCv0w47;e|xABLb(Mc}CM zcB{_j@Rp9PqUInD+w>sA;$#@o*uw^II^4_IQU`Z&p)zI-6n+9&nm?S{e@P()$vhHv z=^@cMKN7r&WH|iBtl>Hbye?U3y#C=lJ7gHmk;bRyhQr}UOWxFN9mqM;J*Wh< zKE9r$H3%otPW=IInF@K65)|K&7(VCr&|Rp2Qpq-4^7!S7cfKb&cC%+ z%;)^M?h8BC2_v8QC!R2deefC0(YKRBvA!0r3AGC@i*s=wG$7{l_4J;At`>%K1goPL{&lfQr!9v>;zqAaat30mJl?CInKH!t`bwP(64uNYGH=Yl{kl&Ea<#Ao<=S<@vM51eVQ&;`P!uS zS@lT*qXTWh`%DS*9B=ocqe}GLZXAbTHx;o|Y;`}^?4U1u-jC0CXB2ql{dh^eyaL3Ue-MiT6EL+(lV@Og0&oR0Mv_GG5!r_G$ zLpN=xoLU7@_q~CPL=W&$?m@1^Z&+j^}%R&bZ`$oXhlrdl)Z+FRpDeM;U8#;-^N|{l(!KJ#s;9y zYd91--Zd{I)sR3d##o9`HefWWRsPx|ph1+z4$jDUn|DpulqnFIUO2}iv{fy+_pZm< zG*o4Z6uNu;w2!oA?0Vu@0VWuo1UIMVSRiJrzuXa>?Y*jVlvQ{lJ0TP9{k!+Ff8Yh@ zUIwm$kJ0q>L#dXpvw!8{4PD$+ za)gE@1USvFzA>33A2wR-A+26QBX0A>r3P|BpOZ?Aljv&{Uc0*vjAwH;aKOAIrztAg z818#=>7mB(=^^jJLtHcQwf_f+upbAwi$7Z;u%=*jWjIq*TRZFKJ7qETOgaZ>N5hE5 zbA-%f>QL}cXlPR^7ytkXUICuxbVvU$>M! zXq|SC!gT~=RAfbxE)p^<4q-W(&>Map|HghPM(o1}{H`Y+@z)VaFWr$HLvK24uL75- z;9$EV>z&jTXdtkS5Xw4B+V|zrACS}Ukdho}yUEVh4GjLkIr2VRMZ_MaJ9&;JRP81( z)xD6Tg+6;204X$f!q0h*2q~Q(7xQkyeFh5`)+PPx`a958q9Y+v=hh_K&#?3$Cmv=j zVALAivLn1z?#8O^?Z6J=xM{yr!5^8%6Tm!(0@jy@j@hTZm1a6D)G#a^drH@pgWn%< zoz8cl8N)*5$MrY{`0gNLh|79#ER60Q>ep!_Gg z2ja|;`$-k5?tw^@1{=;LI+y16^#UEa(}?qV&V$Bi%NBY>E#Wa>dMcD%q1wnj5Kad= zMq2!r;*9xU7Hlu}sf2=9*L0m*ufCu>RAojqqG@y=e`Yknh*Pv89?TZWF8g1k{N*o( zqQ7s-2kItfpn4G;ett6YV4A47-q+fF_$&0An>y<*CCjOo`KbVle-MTzz9 zq<7tb;xs+Sud2@g!3>aoEyUCJI?AO(`5HMWbHdng@Kqxt_@voa9A`%*A5{CA*gS_uUvz2Kg)VR615G4zCm`Y42E<1ZZ?FvU`TzcY{T6-iL>G3+ zb^x!|eH4nIEYPc~i5(^?1C5`A0=UhJ9y$WmK0h$$-M$bA?W%X}vczy2@eJ|_vH7t1 zlWMKX)fIzZwNWzHr3wNyv{brkhu~M)i z5A*>(?#|kU3PLl6?~d%09sUXtkU-HDL-+#7Ol zbR3UnOa%j~{p*diY4za9%*@J~!|cCXclNQtyy;&QN>_)OojH6-|9aMpss-h*|9BAO zyP%5*AffY=+dtLl(1e=xjwL7gXjBpR8q3G-4zoGwD;z%RCd5+IFzD6JLAS98sSAyL zy-)e?l>Nn(q~GHm5p*p{=tjF^6u=mMmcu*~!4~GNNAj`Wal#yu zZ5{C0Ak?Xus;MgRKbIr6qVn3S8u3c@OKxmy6T*!RCZ>&LtA^P`PMEB`wOvtc!H&6r z50GeRGWUxZ2_ia-!xacBe4z?i05&8g{#%f52c;r&L0ZH5fQ^+fL1}s7*6t*(?D zC9NkgfhS(gS_8#vq<90CR7|pnWAnZ$GY1}pI6teIV=PZnSw<+9Q}*18LI@&9eB6Kt zBlSHJy)QcT(PLH0Ur`OhJ|mp>&A;2;Gag!JDKQOY&p43&=TOJ4jqMRJa zbPim}TQ%pGzsJe8T2TSRvJ|9a4oAg48uXj|Z$f2A<&|ylUkvQ#F4+|`BI1DxSm$YY z1;E)0pH2oR8k@nXZRW#Zwlo za?j&km{&z9VlG?rJg&t z@U3caWrD<78-RS2cwLbbvy)e3e<(9U#oacpv65KVSnaag)e1M5Qj+Y?vwfa_XpKZx zPiyPE_0ewk+lzYG%$fuGre|z*n)+Z9y^aBGo=!?&%E~5KhV`nn3}xU-S00y5>C%#o z7xiBY`-%!l6-#f^#3*(Ya2{uiU7T8aVgP2fZ|0U}PyK>;gVouIf1_^Wc%|6tWH~E= z?pun6;BhV<6w2r%jH|%C*)0g}mOlFLjb__5&?*VsA0Y|TBImeQpZ}{!`4UQG_crew zCLl_567feZhMzWBv6(|7t^vs_#Dg=!=riwg-&nB4>{de%NQv9x^-W%*S0S8UXjLa} zd$^QH^hNQfOz`Tro4`t$ChQ@SH1YeXftKM}Vpq@7Qm(9k1y_~D7&Daz9y4wnA-Bp> zTHhM5>=F1_dmLTszY6Zm#Sm0X{P90Cgb1Lb+$Z7=X9mlO6sRC|@d~mhCSljC6l9974CSLGWbVDNso$J9pnl&fgnxi}t8o zV5f4K=tj^@zZk}5c6Nyu&xx{>Q4A*l00z4Op6O~u|73$T_n({XGhVN&^sbBXmmU&M zq-SXknvL> z8n%wyJX$b^{3`ysKkky2_k}f=G9r-2TjnivOQf-V#e?$yK>VitO(66+?$Iq0&&pda zPSdY{yINNaWa=vP2w7}8rL`4Wy-%DD^`AVZYb=&Pt(LV;s!9}tRnCD6KH064ldRQj z(Z%>d4j2~4eP|cEE#Gdw6p^WIU)|`x3$GkW!q9P9ab9oSSc%A3j8SI(n@mg%F;mC@A zMe|Zr>Ex(&G1{WWy~?lDhodN+sr^+!tMfJ|ZW!Kzl+t@9xp*olESWStle(qX71Tf5w7Qb=_XkF-LhTS(_IqigZg2G55m`^8m75N6{=+5zKfoleaFMk z0=3K--sPqD3(hl-T4jbAQ;~JpBWJ^1=piEsev!!nwx6~y|Bx*rR4^Ivz|snuDeCMc~Cioi>x^3_A4bL1^{RsG@Jie=ko zR;h8S)r^FXJC`LIVt2W6hf^aIsThb!2oK(^^9Pw0HW8c48bpaaAVfaQQ7z#*c$7IY zdNQV0`SoCbX#1-lT-|>#bymbZ$at-~rb)vvtxsx-M|buGQ)c2^_t(geeinxuv8EU1 zopvc3kt_mp(-5%eH$_ja#p&DfE~?^BprE8zT_gylg2_&{{=;JM{YyRQvzwsM+q#VE zh6?q9v&%Y?W1BwU=_rcxoTm_w&~X%ZhQRuvCc6vp)uoa3p(Hl?z~+Sr)Lo-iG3 zElW4nN#Eq2X7-k65h`V9&Ixov+vwdrixFnx-8YFM5hdsNCxZC03 zKeZ)CN$X1edcjnIev5<82V}pg1syb!``D^_tYawCvc^p|_fz4(+gsNhk0tsL7e%sV zfDIZ#&XXg=Ym?x&R5Z;v53REMDq8!KP3zegj*L_#ysh)@zBX|`^)dYdEqG|&ggt%6 zpXtuS`0Nv;JUE{7$k2MM?zLg%ADf-Bv$|NBM%8LfGH&bF^X4Rs?gLIE5~yl;U-QM{UqkBB|j126wEcDN+h z?uvCHJX*ANBe{n5_Qx)hN73>qcaH<6jVTK1lO4vOpGI1d^=bpHgyOlkbP0)YhGiP@ z&tU5+T$#7qZR{ zN6IGmoaM$g=c2UZFe8n559&lV;(1tTdruZYT$^@hn1@{lQLb^Ih7s*T$Aref1ukUC zm7K;ZKnWp-m;|+oTw8qU=+yS3N|kD-!)wxp*_%t?AbTevBu=Ax!E?8(MvtuLi~ve7 z7S1YuAM`#ulsdGJ7g{f9k$Jk}x?RcEBew&R1Zj7N(sWC)mfb2Sh&G6i(X7}cK_bhV zR)~o09be@oYQBW?^_+d*`?4iYm*wa|(1t@l^BkJyL^B*S`R=l~Dxj<`z=&RgHUV1U zmlp11&=pJu{BPaGpbm~LQbE&?d|hE%()LjX?gqc9CWSY*k>}G~rsdSc$J45JSDivm z4<;e{!3=Kf9rW+1R%XqSOtg``(<0NuQEh>HPjwu9w;1HIuARq1b&{OBS|hnt$n@6> zb@fGa(6;EL2i_>&4zF4$H*q+92Bp4NT&s>0XAO*RcSHBsHIN!UJE|q3-t~AA(X<_9GYz}03kiPNjZfjaq^TVg53uV_Ux}OmVyuSo1V6heQs#gaG zto=A5r`YwruM79ikD$mQm<|r*v5vOry&Tgy=u9@72Z?PZ8rl>xNDPED3NN~>rrHkh z9~;#Ypx&_KWXV`3X0eMx5|Ep#FEjKYJA-chW zUH*1cTQ#DAfuyg6_C^t2fK^xD)-6MiA2o^fl)BAQKGBS4&`1N8vD)ruTESf9icufR zK@pivTsvKbPZjJ@Z2{s0tb~DST`xxx4I*!cP_BZh$Ib#IexBlHDb&8ylumt+tGdtf zhURwk#i6>lbid%AqOkbd8*{AWi-Ws|nKSk5^h1wJ+grMwjSZYlb63`kjtdIaVruD^D>aDF7wD^WBJ~EG_e?ZY1 z2C7q7DtT8U#uZh%_D%lVmvtg9bnJTd6xE}as_&#ZB14|#tY^-`mWAxS)(&OxiM!8w zArn1@wR`WM-{shS{0>{^Nf{k=hBxWm8*fJxr@k> zRVU|XZ35TIdZqAB@9XQCv6rq*JvM*q6U%-14!GYLX@tL~4hqub?RLR?k$<0^T)C*8 zSIB=jrS&izBJJa{%r$DtvWP@TA=aS-yu_|`f-mGE;VL{d(RkFuk2NbkY#PsZNEAm$ z%6|T^sh)+sZGvZJ-N8*6 zxuXPXBr3VCzQ>=FaMTR9l$yDz_Krfiw!eFDI;Esr`eRcpT>zECfKZU=Ol!Ag;*>?C zn!xq8-Fr}3&(|{B>Y0$aSfTRMj7RJTySu^*Pg!F|P42eobk0Uy*E5sHUDJ6)@2PcQ z^h(v=&fQ;54zin@6E-Grc!3sz|7n|Y+l%PVp~_gfZP?_y3Af{61OM9=QxzYthZ7_iCu>hjr_E zj^E1BjLb8dI;$#<`9u49%4ORw>QW%C^TUunP0{LNhxh@7L|tZPcAGT*gdc5rS)C`3S_q zX;8&>PWYFaESo*)4Lq{D&aMY{YU<5`mX=o)pLYJqLwu=GGjs36iKg#c&g-HO-5z?A zk=n(ju8^J@)dHRpiqwp{;kDG{Om&~xGw*7HtB^BB5%Eh_ zKGS~X6QTIcq&@g7VPoa9Q({=-Sez0p(fxlCf)793qKR$XsaE!TL-KuePuv#QnBcME zvS6>z__Un0!mfo(1p3?U`@CO?=mzND(BM(W*6*3^-pgC-uyLNNP30N+rpQx&-oa0N zFMOD}gHm#FBA8Tnxo@hLEL&vqbn!*K8?rW$Hvm5?;rS_eUf6v=;sZ}iWRbM2O9U1y zMtCqg-hXcM2E?yFBGIddq9hfYc8s#bhnGX%B(8XxjwB2&P@W7TQl17AUCVsPs>H$< zd;07}>0DRD*ZMh;q}^_o^mKDC4pSTU&~d{kY5(nMW}NQ?Bt%VQqLU^oTVmL(Rt=+5 z7x;D3Of)oQ?Af)?^Dn_T0!L+N;c-1S+uh<`Nt+kM*nIc-OUFZ92*L$r;TvFZluRu@ z`)s1c+gJ?;@QO)*vy=8*$bM%-86)4Sf>McI0*QfgAHPm94qY~$jp+CAJiCe0o1#n~ zU!IiS_&}u~SG$E;B@bTd&9GqPq9H%sO^V)zg4vbC>qc7en_um!Jrs67fY2Sno`jy) ze6~HI4i})4s|imyE|7P8RC_u!R$V9A+-0k+jRtn^nPR;p0lwgceWJVnttvRepUq?+ zU%IG_h?U0V+H9ATPcaW^_!{qe+R?#{DrY9A{v=5mPjM#fq|~b1U>O>c2)~9gB8njq|@I z?LNn)e40NR8jZ#6ZV_`V4XLh`wAf9~PReSBQ{yuim0W0|$ul3us|{L&rhjc9NvVD0 zYsg6NE7|T2Q+EBsmE_P*8UK>~vEXGp)&?@M5JBw+xpqveZPGdPV}+NG(fUc=Y6pu@ z%BX(llAg6L2a_6fzU(Z~%^nIb5T=haUXkE5rj7~KFMXLnA0fKSEFza8h= zq%PQq$F!oOsL_V5+8}T_RcO(Yl_yv$agpG5WrCM*x1Xi8kZ#dwoWBB~8cLCoDheN*vdGh~?AfL)DS ze#x{`RK}q=Elq>b&!QG~fAbT(`K{=~uS4mCM$2d8 zDPF4T#jH*Vwz>o=`Lgoh>mTJ=&8_2C=y!Ep(1ydJbt#`w29|x6mfafCZLG#tjG^nY zh;utqAAa?$xL;h)LjQ=?I{O|!*2Q2k9;0<8%MgvadY?Cc2wfgBt?ZQ%g^8{n(}A5pbISRl;nU+`}XApQq0 z^DoQ)L}3F@g;7AcSt0?Y2?}`?6X$P+zr6u*{|Wzy^Pl44$N=elzZ%GifTP?2iV5N1 zj=GXuWs32O`#Wcxc1O6KC7@$2_U>#n0_^GCQCHK7afFG%2Lb^d1*!$I#Y{H_Fmm9) zvbFk`?HxddY5i|K@o)SWk6|%mu6zNQ5W@q^U;O`O|NpJW|407+*ZKTgJSJf7tuP4y z@O$nteYv7P06L#5&94(6X9jvfDFy8H1tysYSo%1&0R9OA(E$5@3FH8t6a>0<0@yqR z`XB_zn1J>I1rdD#`nL@H==vE1qALM`NPs1bX9UPb0Q&;K?ie^=K+n>F3mUjqa2EjE zT7c&OfygHT9T1m15s<9{x^p1TAn;6u1|UWNpbG-LLlpt`d|p#vwD@ X@@g=~DM;1Q(^^D~Ur3x^5CZux<}-9- literal 0 HcmV?d00001 diff --git a/fastvideo/v1/tests/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/wan-flat-color-1.3b-v2_flat color, no lineart, blending, negative space, .mp4 b/fastvideo/v1/tests/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/wan-flat-color-1.3b-v2_flat color, no lineart, blending, negative space, .mp4 new file mode 100644 index 0000000000000000000000000000000000000000..cc1fee2832f31f8c43c5318bc2ed3021f09b1979 GIT binary patch literal 92417 zcmX_mV{~Rs&~2=V?L4t2wr$(CZ5tC!Y}>YtiEZ0>N!13@jV~M@9|~1^@#a8-pPW%a1{v_6I;G zBQGLG!we8m75YIMn;88VgzW4+tW8Xv0gUwYOf-!23>-g7b7yCJPC7a_H#b^W3u6;I zYXe(aJ4Z9R|7M{zceb(q!Pwb5TiDq;aRQ7C3=NEU7yynYraVjlV-rJbJ0mL|22OfT zdVqngfwhN|2@kzH6DPep0|OJl#)QY*#2w(|V)!Gm0qmVTeq4WAJx60623q}XM`a>)AV5S=j%F_+J7Cdp$c-QzsK=9vVh~v$^As#}5$; zz}n8v%E0_*r1$@ni~uKV3!|T4{-1&#VC(ollNedp7&!kIh=r}QiKDf_59mj4Xzk)? z;Gt(^XJc>R{4+NCsgbjzfraf4#ShTY;6IG1qk)Zy(@(Vw_3S-+#vj?h*ueh3 zGz|3&EexFgo5aG=Y3Tu|5*Q5Y5(JDW#aL}&BMq-|9?e2 z8w*<=MrMGMk%_H|k&81AGyQ*IIvV^}Q%4gg^B;FdBfbBh?tgYiBOW71Q-F=(PhtN{ z>u2!8NJ|fJ_%9hAdRo>W(f&W;|LG0fd007q6i&`2_B_l03;Ul{`q>dbi}=H3;PA5n z{##BUe;^?9U6b%&U_TX!3e?(phr@eU7^|_y_5JG-KnrTNL(JkcSN8{Zl06e>qU%Uu zb%mO_bpb*=PIo&nQw`b!@KZQ(8$#STeUZ$s%4S4u2FM+n%RLG)_HLrXgXifZBa+Ig z`maY8xUMzFfsNc^I1NGxK(8}q8o946SMBrWnUvv5K=#p z_5u&<0Dr=fTxtMVVo6iJv5WQYubUk-2&y4CPYr=aK7Om?ru4771vn~n`PI5pQ7k=u zm$1X3b8TEDPV3&{*9+5LSzsSLzNpOCT0p(M;ibu>u~kn7b%nUv*J0O zSRG}lbNrpmzvoyVz@7VnSSi2gCs|ANWQcfcM(FWj--lr z&XGsa(yH`Iag?x9b3(sa&~&?b41-E96jL_^IngvvFXxMGRHd6JfPIq*MOdSD z!l6Tk)HEHe_cIe{Y)WUI)mpYhD>QB&IKH*CFU5c6>zw7OxF^?cLPji8s7pxBU_*Mh+8)a<3c$+)iB~zbWu{lhz0<(3-k~?;T5Z};atH{I0;OQ=SQ5+0OT87)l$nx0 zTX!D6HSq-Ec=y@LBTxwQulYq!UlbnCP~bndK+x^bjrMGmTyrP|QXn$gOa7LGRoAD= z%42hWz2Z)c`(6R6oe?z*S;}`qAP=4LAh!=*u-n|8A*@C|ETEGbXxjAyC*rqIk#|9J zrRVdHfj*;#CvtKs1WFf|&#YR!)1D&1`$sZ?s?65>2M#?psoWb(ajS%t_uNrb!8s?A z7AHYVVeLH?p-(m7HxU~);V^!dgd^?)?-ez~M$b_h=S+y^1sn(>5RAAITQ*^{eVPAG zpnvQwp2cxW$5unpVuqN6(g69cgb3<`H|ei;1d<%}Xkm~B-uncILm4uM^j2F-9QYeg zOZ(=3A><&XzDH~3TZQ{sF0od+k}5E6^wZeEc*Hc&##rArY|YMsprP?gT0($IL1@^k?s%FHFvHnZ}7 zlL?d_T~vbpYJ)jqz=hou%$t^`mCY>g*lI~sFx>#BABG#x?hN$7 zxD)03>mZW9H)-!T@37U!92U8yKU<_8#JFivB%xnOT+bA0(1AWQgTnr5VNoUl;ypFj zDN8+tteo!2q4Jyk3qzFFIyzq1@ez(?!&?eyynwqy6OnBnm-%Mj!WMunDn$V8-QS#m zlRU?h$7e#t#3EbzWI#4<4~_VjF2w*%fkudr6TxMFRI%Jkj`+#*o9?E*8_GIVhnH76 z@4_zMRZ8dHkx)}=4yK!E3Y{zya36&p3#z?sS ze7V93Yq0Ln&{h4WRB<`8Ob6xL?T%~!T?Y5AMp~Va+gcIojB7|75bm844DG6%Qrw*g zc-YB=5@jIK=eg)b*S|lONYPF`b#CT9Xd>dy^@^MVO~q{1o2T*{>s~bRgc*1%H4Ta| z2AB{7Jky5wD>w^@xhvsq%-8#qlC9d3IeaavIxJ~vYP1GTcFzL<6F*t>G+hwxe&@>J5-msLtjlgb&lcPz`akUJvsvNVQ@)Y8d z%?hsfz4-oRvvR5%iZh~afdW$q^v{8P;mjSiD$u@s283Zjk;W8#*X$3A9MH7MHJKR5 zlywpuZrfO()bH{qtH5NK*<>c~kw8pK&XEtJP>AQ$ z9$J63uea$u1x8QMJ_4Pwvu6FR46aUCTR!UXN!nA$x z6({ewiJ?Zc&g9*o^g0&h?<(@DF1Xnh?|SK8*l~;^tjn7{!^L7DWH8Czd~s+bB2&4z zj>=0+WaS|i*v+J^e{3T3)9qDzMjyq85{i_Pv5UkTwdT=K7dZe&hpo%5fi7{lLZf4myD$xTYDxJ zi3AV+0D4G=ebZ)SFl{F}G;8WL>RU6vO3?wTf#EZqw((V>BeWD=j}u6FMsU(-@1i<7i?1R`{5|7Hty=QGqc2 znuP1sI*Xo+@~<;!jUqXK3jycyc3uoQUhF-}R{l6|djEc=igR}Q(!z-Rw5o&9)YL~- zX42LK`!_hasZ82JKAho5t|XD8xcQRKcr#uodR1W$j(!RsL?5;HwfS z^$@Zect~5Q!1U`>32bMUs4RJcxu_6s(nN$ftjA^_ITg+`m9W?10n^s6u*Uc}AR~3$ z9!#5~1{H=gSbE1A2;pDYuN91kCjxN~^G{vs@a(pc%}SCWJq1*l3e;RV4x3kKF64P; z750TO?o`u^wf)x9mZOcz>EXgo9r~H05br!XY|-Ati2Xy(`RXVnba#o|1qVLVFZ)$? zWz?IgXK=UUNS1X1{Iz}uY-(Ms6NJLTE+Ax?>|mbd@?t8|s)4!B1m*kEb? z48ci!^0^n=HMZJ5ZcUlRbRhpi)LWd&YdS4!AjCQ;>Ih{tU{d;)uY|Nxi(XzN%+rz% zbcg8UvBfsRs!1!E0tfAXagl)bK<780;U0~V+v=qOs3_Mq`6BL_u@~Hvu=m(vr36&W z9yb2&P{}>tJLL~FZBAE?xmKNf$=U9PoZOcSi*RnSoTk+aGkbEN>l}uhf(jJqD&r+Q z?YT^qGcH4cXzhc%7ppX)_yUT8V-!x53_6m(Rv+u!JXjj~XszbTpw!#9X@bVBsld9* zGRz~_K@^tFGObniyyy#8Ou%_kAZ|pAOWA58xd`oS~0imb1~p{5w%=3Xm3 zl{|9@OF|Ma7pTF5c?zEG{+ECtBmY6K-{ZQ^zUTPxa6A>928n%qO9}t)G9k9ktyV1Eo2W)3OV7xI5@*vSc zx`p0VX2k|SLXw^am z)AF8PANi}{!A(z$xrqYP71eb9v{tju02uOZje zivkJHnir@2M(VuYNH@}qjY2X6ACu4Txe=C_m693$GRa5xG5K%#?fzzpyzN)iJHN|B zLW-FP3tv$uxD2CaeVvcUdYjdS)0xbzHZ{Ywk@9kd_8m5}dEa5twrFWVxd$uzv}Q)W zspe6M7giJ6wMB@;D1)zFhZBLjD4h^!I_=|9g{e%W3;GGq7N=5gaa_&Wk)4X@9+Qm704c1#w(JzK

bEAZptxK4h4n^vRCU4LfBYvBs0#jh#g>S{ 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

q9;*iuu^GUB?uWOEZu#WF;| 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 literal 0 HcmV?d00001 From 03969986fe0964dfe15aa68cee3b07814dca848c Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Fri, 4 Jul 2025 23:03:29 +0000 Subject: [PATCH 14/43] fix --- fastvideo/v1/tests/lora/test_lora_inference_similarity.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py index 99a61c5ae9..966d86e384 100644 --- a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py +++ b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py @@ -149,7 +149,7 @@ def test_lora_switching_similarity(ATTENTION_BACKEND, model_id): success = write_ssim_results(output_dir, ssim_values, reference_video_path, generated_video_path, num_inference_steps, - prompt, lora_nickname) + prompt) if not success: logger.error("Failed to write SSIM results to file") From b20d629a247e96a58c5d0ef269910deb19a6bb54 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Fri, 4 Jul 2025 23:49:16 +0000 Subject: [PATCH 15/43] add threshold --- .pre-commit-config.yaml | 2 +- .../lora/test_lora_inference_similarity.py | 17 ++++--- fastvideo/v1/worker/multiproc_executor.py | 2 +- hf_lora.py | 47 ------------------- 4 files changed, 12 insertions(+), 56 deletions(-) delete mode 100644 hf_lora.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index cec0a22231..31dc1149d3 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -63,7 +63,7 @@ repos: entry: bash args: - -c - - 'git ls-files | grep -v "^fastvideo/v1/tests/ssim/" | grep " " && echo "Filenames should not contain spaces!" && exit 1 || exit 0' + - 'git ls-files | grep -v "^fastvideo/v1/tests/ssim/" | grep -v "^fastvideo/v1/tests/lora/L40S_reference_videos/" | grep " " && echo "Filenames should not contain spaces!" && exit 1 || exit 0' language: system always_run: true pass_filenames: false diff --git a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py index 966d86e384..8fae364d28 100644 --- a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py +++ b/fastvideo/v1/tests/lora/test_lora_inference_similarity.py @@ -42,13 +42,15 @@ "lora_path": "benjamin-paine/steamboat-willie-1.3b", "lora_nickname": "steamboat", "prompt": "steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a melting red candle. the mood is one of wonder and curiosity, as the monster gazes at the flame with wide eyes and open mouth. Its pose and expression convey a sense of innocence and playfulness, as if it is exploring the world around it for the first time. The use of warm colors and dramatic lighting further enhances the cozy atmosphere of the image.", - "negative_prompt": "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走" + "negative_prompt": "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走", + "ssim_threshold": 0.79 }, { "lora_path": "motimalu/wan-flat-color-1.3b-v2", "lora_nickname": "flat_color", "prompt": "flat color, no lineart, blending, negative space, artist:[john kafka|ponsuke kaikai|hara id 21|yoneyama mai|fuzichoco], 1girl, sakura miko, pink hair, cowboy shot, white shirt, floral print, off shoulder, outdoors, cherry blossom, tree shade, wariza, looking up, falling petals, half-closed eyes, white sky, clouds, live2d animation, upper body, high quality cinematic video of a woman sitting under a sakura tree. Dreamy and lonely, the camera close-ups on the face of the woman as she turns towards the viewer. The Camera is steady, This is a cowboy shot. The animation is smooth and fluid.", - "negative_prompt": "bad quality video,色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走" + "negative_prompt": "bad quality video,色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走", + "ssim_threshold": 0.79 } ] @@ -102,7 +104,7 @@ def test_lora_switching_similarity(ATTENTION_BACKEND, model_id): generation_kwargs["negative_prompt"] = lora_config["negative_prompt"] generator.set_lora_adapter(lora_nickname=lora_nickname, lora_path=lora_path) - output_video_name = f"{lora_path.split('/')[-1]}_{prompt[:50]}.mp4" + output_video_name = f"{lora_path.split('/')[-1]}_{prompt[:50]}" generation_kwargs["output_path"] = output_dir generation_kwargs["output_video_name"] = output_video_name @@ -125,8 +127,9 @@ def test_lora_switching_similarity(ATTENTION_BACKEND, model_id): reference_video_name = None for filename in os.listdir(reference_folder): - if filename == output_video_name: - reference_video_name = filename + # Check if the filename starts with the expected output_video_name and ends with .mp4 + if filename.startswith(output_video_name) and filename.endswith('.mp4'): + reference_video_name = filename # Remove .mp4 extension to match the logic below break if not reference_video_name: @@ -134,7 +137,7 @@ def test_lora_switching_similarity(ATTENTION_BACKEND, model_id): raise FileNotFoundError(f"Reference video missing for adapter {lora_path}") reference_video_path = os.path.join(reference_folder, reference_video_name) - generated_video_path = os.path.join(output_dir, output_video_name) + generated_video_path = os.path.join(output_dir, output_video_name + ".mp4") logger.info( f"Computing SSIM between {reference_video_path} and {generated_video_path}" @@ -154,7 +157,7 @@ def test_lora_switching_similarity(ATTENTION_BACKEND, model_id): if not success: logger.error("Failed to write SSIM results to file") - min_acceptable_ssim = 0.95 + min_acceptable_ssim = lora_config["ssim_threshold"] assert mean_ssim >= min_acceptable_ssim, f"SSIM value {mean_ssim} is below threshold {min_acceptable_ssim} for adapter {lora_config['lora_path']}" @pytest.mark.parametrize("model_id", list(MODEL_TO_PARAMS.keys())) diff --git a/fastvideo/v1/worker/multiproc_executor.py b/fastvideo/v1/worker/multiproc_executor.py index 19db1e362a..ef3366d8a0 100644 --- a/fastvideo/v1/worker/multiproc_executor.py +++ b/fastvideo/v1/worker/multiproc_executor.py @@ -76,7 +76,7 @@ def execute_forward(self, forward_batch: ForwardBatch, def set_lora_adapter(self, lora_nickname: str, - lora_path: str = None) -> None: + lora_path: Optional[str] = None) -> None: self.collective_rpc("set_lora_adapter", kwargs={ "lora_nickname": lora_nickname, diff --git a/hf_lora.py b/hf_lora.py deleted file mode 100644 index af30d80944..0000000000 --- a/hf_lora.py +++ /dev/null @@ -1,47 +0,0 @@ -import torch -from diffusers import AutoencoderKLWan, WanPipeline -from diffusers.schedulers.scheduling_unipc_multistep import ( - UniPCMultistepScheduler) -from diffusers.utils import export_to_video - -model_id = "Wan-AI/Wan2.1-T2V-1.3B-Diffusers" -vae = AutoencoderKLWan.from_pretrained(model_id, - subfolder="vae", - torch_dtype=torch.float32) -pipe = WanPipeline.from_pretrained(model_id, - vae=vae, - torch_dtype=torch.bfloat16) -pipe.scheduler = UniPCMultistepScheduler.from_config(pipe.scheduler.config, - flow_shift=3.0) -pipe.text_encoder = pipe.text_encoder.to(torch.float32) -pipe.to("cuda") -lora_path = "benjamin-paine/steamboat-willie-1.3b" -pipe.load_lora_weights(lora_path) -prompt = "steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a melting red candle. the mood is one of wonder and curiosity, as the monster gazes at the flame with wide eyes and open mouth. Its pose and expression convey a sense of innocence and playfulness, as if it is exploring the world around it for the first time. The use of warm colors and dramatic lighting further enhances the cozy atmosphere of the image." -negative_prompt = "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走" -output = pipe(prompt=prompt, - negative_prompt=negative_prompt, - height=480, - width=832, - num_frames=45, - guidance_scale=5.0, - num_inference_steps=32, - generator=torch.Generator(device="cpu").manual_seed(42)).frames[0] - -export_to_video(output, f"{lora_path.split('/')[-1]}_{prompt[:50]}.mp4", fps=24) - -lora_path = "motimalu/wan-flat-color-1.3b-v2" -pipe.load_lora_weights(lora_path) -prompt = "flat color, no lineart, blending, negative space, artist:[john kafka|ponsuke kaikai|hara id 21|yoneyama mai|fuzichoco], 1girl, sakura miko, pink hair, cowboy shot, white shirt, floral print, off shoulder, outdoors, cherry blossom, tree shade, wariza, looking up, falling petals, half-closed eyes, white sky, clouds, live2d animation, upper body, high quality cinematic video of a woman sitting under a sakura tree. Dreamy and lonely, the camera close-ups on the face of the woman as she turns towards the viewer. The Camera is steady, This is a cowboy shot. The animation is smooth and fluid." -negative_prompt = "bad quality video,色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走" - -output = pipe(prompt=prompt, - negative_prompt=negative_prompt, - height=480, - width=832, - num_frames=45, - guidance_scale=5.0, - num_inference_steps=32, - generator=torch.Generator(device="cpu").manual_seed(42)).frames[0] - -export_to_video(output, f"{lora_path.split('/')[-1]}_{prompt[:50]}.mp4", fps=24) From bfb1df1696ca44adcc50059207cd2bf484a455b5 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Fri, 4 Jul 2025 18:01:00 -0700 Subject: [PATCH 16/43] add to buildkite --- .buildkite/pipeline.yml | 15 +++++++++++++++ .buildkite/scripts/pr_test.sh | 4 ++++ 2 files changed, 19 insertions(+) diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 6cf2bb9ffb..1cc9328171 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -65,6 +65,21 @@ steps: - TEST_TYPE=ssim agents: queue: "default" + - path: + - "fastvideo/v1/tests/lora/**" + - "fastvideo/v1/models/loader/**" + - "fastvideo/v1/tests/transformers/**" + - "fastvideo/v1/pipelines/**" + - "fastvideo/v1/layers/lora/**" + - "pyproject.toml" + - "docker/Dockerfile.python3.12" + config: + command: "timeout 15m .buildkite/scripts/pr_test.sh" + label: "LoRA Tests" + env: + - TEST_TYPE=lora + agents: + queue: "default" - path: - "fastvideo/v1/**" - "pyproject.toml" diff --git a/.buildkite/scripts/pr_test.sh b/.buildkite/scripts/pr_test.sh index baf1bc1cce..5e6ed53b33 100755 --- a/.buildkite/scripts/pr_test.sh +++ b/.buildkite/scripts/pr_test.sh @@ -97,6 +97,10 @@ case "$TEST_TYPE" in log "Running precision VSA tests..." MODAL_COMMAND="$MODAL_ENV python3 -m modal run $MODAL_TEST_FILE::run_precision_tests_VSA" ;; + "lora") + log "Running LoRA tests..." + MODAL_COMMAND="$MODAL_ENV python3 -m modal run $MODAL_TEST_FILE::run_lora_tests" + ;; *) log "Error: Unknown test type: $TEST_TYPE" exit 1 From 1dcc5dfe50ab29a9b40fa3e91860aa9ede408fb3 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Fri, 4 Jul 2025 18:05:33 -0700 Subject: [PATCH 17/43] add back mypy --- .github/workflows/matchers/mypy.json | 17 +++++++++++++++++ .github/workflows/pre-commit.yml | 2 ++ 2 files changed, 19 insertions(+) create mode 100644 .github/workflows/matchers/mypy.json diff --git a/.github/workflows/matchers/mypy.json b/.github/workflows/matchers/mypy.json new file mode 100644 index 0000000000..71aa6025d3 --- /dev/null +++ b/.github/workflows/matchers/mypy.json @@ -0,0 +1,17 @@ + +{ + "problemMatcher": [ + { + "owner": "mypy", + "pattern": [ + { + "regexp": "^(.+):(\\d+):\\s(error|warning):\\s(.+)$", + "file": 1, + "line": 2, + "severity": 3, + "message": 4 + } + ] + } + ] + } \ No newline at end of file diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 8285599b25..646acb3d97 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -12,6 +12,8 @@ jobs: with: python-version: "3.12" - run: echo "::add-matcher::.github/workflows/matchers/actionlint.json" + - run: echo "::add-matcher::.github/workflows/matchers/mypy.json" + - uses: pre-commit/action@v3.0.1 - uses: pre-commit/action@v3.0.1 with: extra_args: --all-files --hook-stage manual \ No newline at end of file From 150913e363686bc2a425caf50513e01d9d9a7dd1 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Sat, 5 Jul 2025 01:26:54 +0000 Subject: [PATCH 18/43] fix pr test --- .github/workflows/pr-test.yml | 92 +++++++++++++++++++++-------------- 1 file changed, 55 insertions(+), 37 deletions(-) diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index 9be08638ab..532f7e4934 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -14,6 +14,7 @@ on: - ".github/workflows/pr-test.yml" - "pyproject.toml" - "docker/Dockerfile.python3.12" + - "csrc/**" workflow_dispatch: inputs: run_encoder_test: @@ -36,13 +37,28 @@ on: required: false default: false type: boolean - run_lora_test: - description: "Run lora-test" + run_training_test: + description: "Run training-test" required: false default: false type: boolean - run_training_test: - description: "Run training-test" + run_training_test_VSA: + description: "Run training-test-VSA" + required: false + default: false + type: boolean + run_inference_test_STA: + description: "Run inference-test-STA" + required: false + default: false + type: boolean + run_precision_test_STA: + description: "Run precision-test-STA" + required: false + default: false + type: boolean + run_precision_test_VSA: + description: "Run precision-test-VSA" required: false default: false type: boolean @@ -73,7 +89,10 @@ jobs: vae-test: ${{ steps.filter.outputs.vae-test }} transformer-test: ${{ steps.filter.outputs.transformer-test }} training-test: ${{ steps.filter.outputs.training-test }} - lora-test: ${{ steps.filter.outputs.lora-test }} + training-test-VSA: ${{ steps.filter.outputs.training-test-VSA }} + inference-test-STA: ${{ steps.filter.outputs.inference-test-STA }} + precision-test-STA: ${{ steps.filter.outputs.precision-test-STA }} + precision-test-VSA: ${{ steps.filter.outputs.precision-test-VSA }} steps: - uses: actions/checkout@v4 - uses: dorny/paths-filter@v3 @@ -84,6 +103,21 @@ jobs: common-paths: &common-paths - 'pyproject.toml' - 'docker/Dockerfile.python3.12' + sta-kernel-paths: &sta-kernel-paths + - 'csrc/attn/st_attn/**' + - 'csrc/attn/setup_sta.py' + - 'csrc/attn/config_sta.py' + - 'csrc/attn/st_attn.cpp' + vsa-kernel-paths: &vsa-kernel-paths + - 'csrc/attn/vsa/**' + - 'csrc/attn/tk/**' + - 'csrc/attn/setup_vsa.py' + - 'csrc/attn/config_vsa.py' + - 'csrc/attn/vsa.cpp' + vsa-paths: &vsa-paths + - 'fastvideo/v1/**' + - *common-paths + - *vsa-kernel-paths # Actual tests encoder-test: @@ -106,11 +140,20 @@ jobs: training-test: - 'fastvideo/v1/**' - *common-paths - lora-test: - - 'fastvideo/v1/models/loaders/**' - - 'fastvideo/v1/tests/lora/**' - - 'fastvideo/v1/tests/utils.py' + training-test-VSA: + - 'fastvideo/v1/**' + - *common-paths + - *vsa-kernel-paths + inference-test-STA: + - 'fastvideo/v1/**' + - *common-paths + - *sta-kernel-paths + precision-test-STA: + - *common-paths + - *sta-kernel-paths + precision-test-VSA: - *common-paths + - *vsa-kernel-paths encoder-test: needs: change-filter @@ -191,31 +234,6 @@ jobs: secrets: RUNPOD_API_KEY: ${{ secrets.RUNPOD_API_KEY }} RUNPOD_PRIVATE_KEY: ${{ secrets.RUNPOD_PRIVATE_KEY }} - - lora-test: - needs: change-filter - if: >- - (github.event_name != 'workflow_dispatch' && needs.change-filter.outputs.lora-test == 'true') || - (github.event_name == 'workflow_dispatch' && github.event.inputs.run_lora_test == 'true') - strategy: - fail-fast: false - matrix: - python-version: [ - {version: "3.12", tag: "py3.12-latest"} - ] - uses: ./.github/workflows/runpod-test.yml - with: - job_id: "lora-test-py${{ matrix.python-version.version }}" - gpu_type: "NVIDIA A40" - gpu_count: 2 - volume_size: 200 - disk_size: 200 - image: "ghcr.io/${{ github.repository }}/fastvideo-dev:${{ matrix.python-version.tag }}" - test_command: "uv pip install -e .[test] && pytest ./fastvideo/v1/tests/ssim/test_lora_inference_similarity.py -vs" - timeout_minutes: 60 - secrets: - RUNPOD_API_KEY: ${{ secrets.RUNPOD_API_KEY }} - RUNPOD_PRIVATE_KEY: ${{ secrets.RUNPOD_PRIVATE_KEY }} training-test: needs: change-filter @@ -334,7 +352,7 @@ jobs: runpod-cleanup: # Add other jobs to this list as you create them - needs: [encoder-test, vae-test, transformer-test, ssim-test, lora-test, training-test] + needs: [encoder-test, vae-test, transformer-test, ssim-test, training-test, training-test-VSA, inference-test-STA, precision-test-STA, precision-test-VSA] if: ${{ always() && ((github.event_name != 'workflow_dispatch' && github.event.pull_request.draft == false) || github.event_name == 'workflow_dispatch') }} runs-on: ubuntu-latest steps: @@ -351,7 +369,7 @@ jobs: - name: Cleanup all RunPod instances env: - JOB_IDS: '["encoder-test", "vae-test", "transformer-test", "ssim-test-py3.10", "ssim-test-py3.11", "ssim-test-py3.12", "lora-test-py3.12", "training-test"]' + JOB_IDS: '["encoder-test", "vae-test", "transformer-test", "ssim-test-py3.10", "ssim-test-py3.11", "ssim-test-py3.12", "training-test", "training-test-VSA", "inference-test-STA", "precision-test-STA", "precision-test-VSA"]' RUNPOD_API_KEY: ${{ secrets.RUNPOD_API_KEY }} GITHUB_RUN_ID: ${{ github.run_id }} - run: python .github/scripts/runpod_cleanup.py + run: python .github/scripts/runpod_cleanup.py \ No newline at end of file From a611c08897337c51f2a0f6a0b6824f54735af2ad Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Sat, 5 Jul 2025 01:46:47 +0000 Subject: [PATCH 19/43] fixes --- .github/workflows/kernel-test.yml | 198 ------------------------------ .github/workflows/pr-test.yml | 3 +- .github/workflows/pre-commit.yml | 1 - 3 files changed, 2 insertions(+), 200 deletions(-) delete mode 100644 .github/workflows/kernel-test.yml diff --git a/.github/workflows/kernel-test.yml b/.github/workflows/kernel-test.yml deleted file mode 100644 index 25cfb7a4dd..0000000000 --- a/.github/workflows/kernel-test.yml +++ /dev/null @@ -1,198 +0,0 @@ -name: Kernel Test - -on: - push: - branches: [main] - paths: - - "fastvideo/**/*.py" - - "csrc/**" - - ".github/workflows/kernel-test.yml" - pull_request: - branches: [main] - types: [opened, ready_for_review, synchronize, reopened] - paths: - - "fastvideo/**/*.py" - - "csrc/**" - - ".github/workflows/kernel-test.yml" - - "pyproject.toml" - - "docker/Dockerfile.python3.12" - workflow_dispatch: - inputs: - run_training_test_VSA: - description: "Run training-test-VSA" - required: false - default: false - type: boolean - run_inference_test_STA: - description: "Run inference-test-STA" - required: false - default: false - type: boolean - run_precision_test_STA: - description: "Run precision-test-STA" - required: false - default: false - type: boolean - run_precision_test_VSA: - description: "Run precision-test-VSA" - required: false - default: false - type: boolean - -env: - PYTHONUNBUFFERED: "1" - -concurrency: - group: kernel-test-${{ github.ref }} - cancel-in-progress: true - -jobs: - pre-commit: - uses: ./.github/workflows/pre-commit.yml - - change-filter: - runs-on: ubuntu-latest - needs: pre-commit - if: ${{ github.event.pull_request.draft == false || github.event_name == 'workflow_dispatch' }} - outputs: - training-test-VSA: ${{ steps.filter.outputs.training-test-VSA }} - inference-test-STA: ${{ steps.filter.outputs.inference-test-STA }} - precision-test-STA: ${{ steps.filter.outputs.precision-test-STA }} - precision-test-VSA: ${{ steps.filter.outputs.precision-test-VSA }} - steps: - - uses: actions/checkout@v4 - - uses: dorny/paths-filter@v3 - id: filter - with: - filters: | - # Define reusable path patterns - common-paths: &common-paths - - 'pyproject.toml' - - 'docker/Dockerfile.python3.12' - sta-kernel-paths: &sta-kernel-paths - - 'csrc/attn/st_attn/**' - - 'csrc/attn/setup_sta.py' - - 'csrc/attn/config_sta.py' - - 'csrc/attn/st_attn.cpp' - vsa-kernel-paths: &vsa-kernel-paths - - 'csrc/attn/vsa/**' - - 'csrc/attn/tk/**' - - 'csrc/attn/setup_vsa.py' - - 'csrc/attn/config_vsa.py' - - 'csrc/attn/vsa.cpp' - - # Kernel tests - training-test-VSA: - - 'fastvideo/v1/**' - - *common-paths - - *vsa-kernel-paths - inference-test-STA: - - 'fastvideo/v1/**' - - *common-paths - - *sta-kernel-paths - precision-test-STA: - - *common-paths - - *sta-kernel-paths - precision-test-VSA: - - *common-paths - - *vsa-kernel-paths - - training-test-VSA: - needs: change-filter - if: >- - (github.event_name != 'workflow_dispatch' && github.event.pull_request.draft == false) || - (github.event_name == 'workflow_dispatch' && github.event.inputs.run_training_test_VSA == 'true') - uses: ./.github/workflows/runpod-test.yml - with: - job_id: "training-test-VSA" - gpu_type: "NVIDIA H100 NVL" - gpu_count: 1 - volume_size: 100 - disk_size: 100 - image: "ghcr.io/${{ github.repository }}/fastvideo-dev:py3.12-latest" - test_command: "wandb login $WANDB_API_KEY && uv pip install -e .[test] && pytest ./fastvideo/v1/tests/training/VSA -srP" - timeout_minutes: 30 - secrets: - RUNPOD_API_KEY: ${{ secrets.RUNPOD_API_KEY }} - RUNPOD_PRIVATE_KEY: ${{ secrets.RUNPOD_PRIVATE_KEY }} - WANDB_API_KEY: ${{ secrets.WANDB_API_KEY }} - - inference-test-STA: - needs: change-filter - if: >- - (github.event_name != 'workflow_dispatch' && github.event.pull_request.draft == false) || - (github.event_name == 'workflow_dispatch' && github.event.inputs.run_inference_test_STA == 'true') - uses: ./.github/workflows/runpod-test.yml - with: - job_id: "inference-test-STA" - gpu_type: "NVIDIA H100 NVL" - gpu_count: 1 - volume_size: 100 - disk_size: 100 - image: "ghcr.io/${{ github.repository }}/fastvideo-dev:py3.12-latest" - test_command: "uv pip install -e .[test] && pytest ./fastvideo/v1/tests/inference/STA -srP" - timeout_minutes: 30 - secrets: - RUNPOD_API_KEY: ${{ secrets.RUNPOD_API_KEY }} - RUNPOD_PRIVATE_KEY: ${{ secrets.RUNPOD_PRIVATE_KEY }} - - precision-test-STA: - needs: change-filter - if: >- - (github.event_name != 'workflow_dispatch' && github.event.pull_request.draft == false) || - (github.event_name == 'workflow_dispatch' && github.event.inputs.run_precision_test_STA == 'true') - uses: ./.github/workflows/runpod-test.yml - with: - job_id: "precision-test-STA" - gpu_type: "NVIDIA H100 NVL" - gpu_count: 1 - volume_size: 100 - disk_size: 100 - image: "ghcr.io/${{ github.repository }}/fastvideo-dev:py3.12-latest" - test_command: "uv pip install -e .[test] && python csrc/attn/tests/test_sta.py" - timeout_minutes: 30 - secrets: - RUNPOD_API_KEY: ${{ secrets.RUNPOD_API_KEY }} - RUNPOD_PRIVATE_KEY: ${{ secrets.RUNPOD_PRIVATE_KEY }} - - precision-test-VSA: - needs: change-filter - if: >- - (github.event_name != 'workflow_dispatch' && github.event.pull_request.draft == false) || - (github.event_name == 'workflow_dispatch' && github.event.inputs.run_precision_test_VSA == 'true') - uses: ./.github/workflows/runpod-test.yml - with: - job_id: "precision-test-VSA" - gpu_type: "NVIDIA H100 NVL" - gpu_count: 1 - volume_size: 100 - disk_size: 100 - image: "ghcr.io/${{ github.repository }}/fastvideo-dev:py3.12-latest" - test_command: "uv pip install -e .[test] && python csrc/attn/tests/test_block_sparse.py" - timeout_minutes: 30 - secrets: - RUNPOD_API_KEY: ${{ secrets.RUNPOD_API_KEY }} - RUNPOD_PRIVATE_KEY: ${{ secrets.RUNPOD_PRIVATE_KEY }} - - runpod-cleanup: - needs: [training-test-VSA, inference-test-STA, precision-test-STA, precision-test-VSA] - if: ${{ always() && ((github.event_name != 'workflow_dispatch' && github.event.pull_request.draft == false) || github.event_name == 'workflow_dispatch') }} - runs-on: ubuntu-latest - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: Set up Python - uses: actions/setup-python@v5 - with: - python-version: "3.10" - - - name: Install dependencies - run: pip install requests - - - name: Cleanup all RunPod instances - env: - JOB_IDS: '["training-test-VSA", "inference-test-STA", "precision-test-STA", "precision-test-VSA"]' - RUNPOD_API_KEY: ${{ secrets.RUNPOD_API_KEY }} - GITHUB_RUN_ID: ${{ github.run_id }} - run: python .github/scripts/runpod_cleanup.py \ No newline at end of file diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index 532f7e4934..080a859949 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -372,4 +372,5 @@ jobs: JOB_IDS: '["encoder-test", "vae-test", "transformer-test", "ssim-test-py3.10", "ssim-test-py3.11", "ssim-test-py3.12", "training-test", "training-test-VSA", "inference-test-STA", "precision-test-STA", "precision-test-VSA"]' RUNPOD_API_KEY: ${{ secrets.RUNPOD_API_KEY }} GITHUB_RUN_ID: ${{ github.run_id }} - run: python .github/scripts/runpod_cleanup.py \ No newline at end of file + run: python .github/scripts/runpod_cleanup.py + \ No newline at end of file diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 646acb3d97..6db44912d9 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -13,7 +13,6 @@ jobs: python-version: "3.12" - run: echo "::add-matcher::.github/workflows/matchers/actionlint.json" - run: echo "::add-matcher::.github/workflows/matchers/mypy.json" - - uses: pre-commit/action@v3.0.1 - uses: pre-commit/action@v3.0.1 with: extra_args: --all-files --hook-stage manual \ No newline at end of file From 9359b3ec6341ff12edf1b4778ceab270c15e0e9b Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Sat, 5 Jul 2025 01:47:19 +0000 Subject: [PATCH 20/43] fixes --- .github/workflows/matchers/mypy.json | 30 ++++++++++++++-------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/.github/workflows/matchers/mypy.json b/.github/workflows/matchers/mypy.json index 71aa6025d3..b9644b68a7 100644 --- a/.github/workflows/matchers/mypy.json +++ b/.github/workflows/matchers/mypy.json @@ -1,17 +1,17 @@ { - "problemMatcher": [ - { - "owner": "mypy", - "pattern": [ - { - "regexp": "^(.+):(\\d+):\\s(error|warning):\\s(.+)$", - "file": 1, - "line": 2, - "severity": 3, - "message": 4 - } - ] - } - ] - } \ No newline at end of file + "problemMatcher": [ + { + "owner": "mypy", + "pattern": [ + { + "regexp": "^(.+):(\\d+):\\s(error|warning):\\s(.+)$", + "file": 1, + "line": 2, + "severity": 3, + "message": 4 + } + ] + } + ] +} \ No newline at end of file From 02767495fdf5a08c6c967be7ca4329a4807ff4f3 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Fri, 4 Jul 2025 19:21:51 -0700 Subject: [PATCH 21/43] fix --- fastvideo/v1/layers/lora/linear.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/fastvideo/v1/layers/lora/linear.py b/fastvideo/v1/layers/lora/linear.py index c7ff948ff3..77730c1ce7 100644 --- a/fastvideo/v1/layers/lora/linear.py +++ b/fastvideo/v1/layers/lora/linear.py @@ -7,7 +7,7 @@ from torch import nn from torch.distributed.tensor import DTensor, distribute_tensor -from fastvideo.v1.distributed import (get_torch_device, get_tp_rank, +from fastvideo.v1.distributed import (get_local_torch_device, get_tp_rank, split_tensor_along_last_dim, tensor_model_parallel_all_gather, tensor_model_parallel_all_reduce) @@ -68,7 +68,7 @@ def merge_lora_weights(self) -> None: # Using offload param is on CPU, so current_device is for "CPU -> GPU -> merge -> CPU" current_device = self.base_layer.weight.data.device data = self.base_layer.weight.data.to( - get_torch_device()).full_tensor() + get_local_torch_device()).full_tensor() data += (self.slice_lora_b_weights(self.lora_B) @ self.slice_lora_a_weights(self.lora_A)).to(data) self.base_layer.weight = nn.Parameter( @@ -77,7 +77,7 @@ def merge_lora_weights(self) -> None: else: current_device = self.base_layer.weight.data.device data = self.base_layer.weight.data.to( - get_torch_device()).full_tensor() + get_local_torch_device()).full_tensor() data += \ (self.slice_lora_b_weights(self.lora_B) @ self.slice_lora_a_weights(self.lora_A)).to(data) self.base_layer.weight = nn.Parameter(data.to(current_device)) @@ -99,7 +99,7 @@ def unmerge_lora_weights(self) -> None: placement = self.base_layer.weight.data.placements device = self.base_layer.weight.data.device self.base_layer.weight = nn.Parameter( - distribute_tensor(self.cpu_weight.to(get_torch_device()), + distribute_tensor(self.cpu_weight.to(get_local_torch_device()), mesh, placements=placement).to(device)) else: From 924cb72293ef03655f2fc8260863ba27c5e63728 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Fri, 4 Jul 2025 22:12:02 -0700 Subject: [PATCH 22/43] fix --- fastvideo/v1/distributed/parallel_state.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastvideo/v1/distributed/parallel_state.py b/fastvideo/v1/distributed/parallel_state.py index 0ec9a655ea..90bd80a044 100644 --- a/fastvideo/v1/distributed/parallel_state.py +++ b/fastvideo/v1/distributed/parallel_state.py @@ -594,7 +594,7 @@ def send_tensor_dict( def recv_tensor_dict( self, src: int | None = None, - all_gather_group: "GroupCoordinator" | None = None, + all_gather_group: Optional["GroupCoordinator"] = None, ) -> dict[str, torch.Tensor | Any] | None: """Recv the input tensor dictionary. NOTE: `src` is the local rank of the source rank. From e94f104667f831b4848162e28402af36648a714b Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Sat, 5 Jul 2025 11:17:02 -0700 Subject: [PATCH 23/43] fix --- fastvideo/v1/fastvideo_args.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastvideo/v1/fastvideo_args.py b/fastvideo/v1/fastvideo_args.py index 0c9eba8788..fef24158d9 100644 --- a/fastvideo/v1/fastvideo_args.py +++ b/fastvideo/v1/fastvideo_args.py @@ -280,7 +280,7 @@ def from_cli_args(cls, args: argparse.Namespace) -> "FastVideoArgs": return cls(**kwargs) # type: ignore @classmethod - def from_kwargs(cls, kwargs: dict[str, Any]) -> "FastVideoArgs": + def from_kwargs(cls, **kwargs: dict[str, Any]) -> "FastVideoArgs": kwargs['pipeline_config'] = PipelineConfig.from_kwargs(kwargs) return cls(**kwargs) From b6f3af111da158126b447314155d2f0021f9734a Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Sat, 5 Jul 2025 14:14:14 -0700 Subject: [PATCH 24/43] revert dtype --- fastvideo/v1/models/loader/component_loader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fastvideo/v1/models/loader/component_loader.py b/fastvideo/v1/models/loader/component_loader.py index 4218bc6415..426a91cbbf 100644 --- a/fastvideo/v1/models/loader/component_loader.py +++ b/fastvideo/v1/models/loader/component_loader.py @@ -430,7 +430,7 @@ def load(self, model_path: str, fastvideo_args: FastVideoArgs): cpu_offload=fastvideo_args.use_cpu_offload, fsdp_inference=fastvideo_args.use_fsdp_inference, # TODO(will): make these configurable - param_dtype=default_dtype, + param_dtype=torch.bfloat16, reduce_dtype=torch.float32, output_dtype=None, training_mode=fastvideo_args.training_mode) From d0519aca1d875704302c69ba655a2dd2730de2c3 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Sat, 5 Jul 2025 14:51:15 -0700 Subject: [PATCH 25/43] fix --- fastvideo/v1/training/training_utils.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/fastvideo/v1/training/training_utils.py b/fastvideo/v1/training/training_utils.py index b68067993c..84b7bbcbe1 100644 --- a/fastvideo/v1/training/training_utils.py +++ b/fastvideo/v1/training/training_utils.py @@ -505,8 +505,6 @@ def custom_to_hf_state_dict( assert len( reverse_param_names_mapping) > 0, "reverse_param_names_mapping is empty" - if isinstance(state_dict, dict): - state_dict = state_dict.items() new_state_dict = {} # Group parameters that need to be split (merged parameters) merge_groups: dict[str, list[tuple[str, int, int]]] = {} From 462cfd9d134a694c8cee6e88930846f0f3619702 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Sat, 5 Jul 2025 14:51:43 -0700 Subject: [PATCH 26/43] fix --- fastvideo/v1/training/training_utils.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/fastvideo/v1/training/training_utils.py b/fastvideo/v1/training/training_utils.py index 84b7bbcbe1..93eefee420 100644 --- a/fastvideo/v1/training/training_utils.py +++ b/fastvideo/v1/training/training_utils.py @@ -504,7 +504,8 @@ def custom_to_hf_state_dict( """ assert len( reverse_param_names_mapping) > 0, "reverse_param_names_mapping is empty" - + if isinstance(state_dict, Iterator): + state_dict = dict(state_dict) new_state_dict = {} # Group parameters that need to be split (merged parameters) merge_groups: dict[str, list[tuple[str, int, int]]] = {} From d5af4397ffdbe1c7facd159d3e0a6a02a61bd739 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Tue, 8 Jul 2025 12:29:29 -0700 Subject: [PATCH 27/43] rename test --- .buildkite/pipeline.yml | 4 ++-- .buildkite/scripts/pr_test.sh | 4 ++-- .../lora/test_lora_inference_similarity.py | 0 ...illie style, golden era animation, clos.mp4 | Bin 120886 -> 0 bytes ... no lineart, blending, negative space, .mp4 | Bin 92417 -> 0 bytes fastvideo/v1/tests/modal/pr_test.py | 4 ++-- 6 files changed, 6 insertions(+), 6 deletions(-) rename fastvideo/v1/tests/{ => inference}/lora/test_lora_inference_similarity.py (100%) delete mode 100644 fastvideo/v1/tests/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steamboat-willie-1.3b_steamboat willie style, golden era animation, clos.mp4 delete mode 100644 fastvideo/v1/tests/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/wan-flat-color-1.3b-v2_flat color, no lineart, blending, negative space, .mp4 diff --git a/.buildkite/pipeline.yml b/.buildkite/pipeline.yml index 1cc9328171..bbb11c2d27 100644 --- a/.buildkite/pipeline.yml +++ b/.buildkite/pipeline.yml @@ -75,9 +75,9 @@ steps: - "docker/Dockerfile.python3.12" config: command: "timeout 15m .buildkite/scripts/pr_test.sh" - label: "LoRA Tests" + label: "LoRA Inference Tests" env: - - TEST_TYPE=lora + - TEST_TYPE=inference_lora agents: queue: "default" - path: diff --git a/.buildkite/scripts/pr_test.sh b/.buildkite/scripts/pr_test.sh index 5e6ed53b33..f43f08711c 100755 --- a/.buildkite/scripts/pr_test.sh +++ b/.buildkite/scripts/pr_test.sh @@ -97,9 +97,9 @@ case "$TEST_TYPE" in log "Running precision VSA tests..." MODAL_COMMAND="$MODAL_ENV python3 -m modal run $MODAL_TEST_FILE::run_precision_tests_VSA" ;; - "lora") + "inference_lora") log "Running LoRA tests..." - MODAL_COMMAND="$MODAL_ENV python3 -m modal run $MODAL_TEST_FILE::run_lora_tests" + MODAL_COMMAND="$MODAL_ENV python3 -m modal run $MODAL_TEST_FILE::run_inference_lora_tests" ;; *) log "Error: Unknown test type: $TEST_TYPE" diff --git a/fastvideo/v1/tests/lora/test_lora_inference_similarity.py b/fastvideo/v1/tests/inference/lora/test_lora_inference_similarity.py similarity index 100% rename from fastvideo/v1/tests/lora/test_lora_inference_similarity.py rename to fastvideo/v1/tests/inference/lora/test_lora_inference_similarity.py diff --git a/fastvideo/v1/tests/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steamboat-willie-1.3b_steamboat willie style, golden era animation, clos.mp4 b/fastvideo/v1/tests/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steamboat-willie-1.3b_steamboat willie style, golden era animation, clos.mp4 deleted file mode 100644 index 0e48e9aa19f1ca5cbc2e2af6daf514f20a57eaa9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 120886 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 X@@g=~DM;1Q(^^D~Ur3x^5CZux<}-9- diff --git a/fastvideo/v1/tests/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/wan-flat-color-1.3b-v2_flat color, no lineart, blending, negative space, .mp4 b/fastvideo/v1/tests/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/wan-flat-color-1.3b-v2_flat color, no lineart, blending, negative space, .mp4 deleted file mode 100644 index cc1fee2832f31f8c43c5318bc2ed3021f09b1979..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 92417 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

bEAZptxK4h4n^vRCU4LfBYvBs0#jh#g>S{ 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

q9;*iuu^GUB?uWOEZu#WF;| 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 diff --git a/fastvideo/v1/tests/modal/pr_test.py b/fastvideo/v1/tests/modal/pr_test.py index 7f4bf77092..a6bd54347a 100644 --- a/fastvideo/v1/tests/modal/pr_test.py +++ b/fastvideo/v1/tests/modal/pr_test.py @@ -96,5 +96,5 @@ def run_precision_tests_STA(): @app.function(gpu="L40S:1", image=image, timeout=3600) -def run_lora_tests(): - run_test("pytest ./fastvideo/v1/tests/ssim/test_lora_inference_similarity.py -vs") \ No newline at end of file +def run_inference_lora_tests(): + run_test("pytest ./fastvideo/v1/tests/inference/lora/test_lora_inference_similarity.py -vs") \ No newline at end of file From 36d6f69a2c630be221e3a760bc2b249a15cbba40 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Wed, 9 Jul 2025 14:48:51 -0700 Subject: [PATCH 28/43] revert pre-commit --- .pre-commit-config.yaml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 31dc1149d3..e6454ae046 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -56,6 +56,12 @@ repos: rev: v1.7.7 hooks: - id: actionlint +- repo: https://github.com/pre-commit/mirrors-mypy + rev: v1.15.0 + hooks: + - id: mypy + args: [--python-version, '3.10', --follow-imports, "skip", ] + additional_dependencies: [types-cachetools, types-setuptools, types-PyYAML, types-requests] - repo: local hooks: - id: check-filenames From c367d8ec69187b8c2b0ba73cc127b899550da050 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Wed, 9 Jul 2025 15:16:11 -0700 Subject: [PATCH 29/43] add back ref videos --- .pre-commit-config.yaml | 2 +- ...illie style, golden era animation, clos.mp4 | Bin 0 -> 120886 bytes ... no lineart, blending, negative space, .mp4 | Bin 0 -> 92417 bytes 3 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 fastvideo/v1/tests/inference/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steamboat-willie-1.3b_steamboat willie style, golden era animation, clos.mp4 create mode 100644 fastvideo/v1/tests/inference/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/wan-flat-color-1.3b-v2_flat color, no lineart, blending, negative space, .mp4 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index e6454ae046..47a3066116 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -69,7 +69,7 @@ repos: entry: bash args: - -c - - 'git ls-files | grep -v "^fastvideo/v1/tests/ssim/" | grep -v "^fastvideo/v1/tests/lora/L40S_reference_videos/" | grep " " && echo "Filenames should not contain spaces!" && exit 1 || exit 0' + - 'git ls-files | grep -v "^fastvideo/v1/tests/ssim/" | grep -v "^fastvideo/v1/tests/inference/lora/L40S_reference_videos/" | grep " " && echo "Filenames should not contain spaces!" && exit 1 || exit 0' language: system always_run: true pass_filenames: false diff --git a/fastvideo/v1/tests/inference/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steamboat-willie-1.3b_steamboat willie style, golden era animation, clos.mp4 b/fastvideo/v1/tests/inference/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steamboat-willie-1.3b_steamboat willie style, golden era animation, clos.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..0e48e9aa19f1ca5cbc2e2af6daf514f20a57eaa9 GIT binary patch literal 120886 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 X@@g=~DM;1Q(^^D~Ur3x^5CZux<}-9- literal 0 HcmV?d00001 diff --git a/fastvideo/v1/tests/inference/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/wan-flat-color-1.3b-v2_flat color, no lineart, blending, negative space, .mp4 b/fastvideo/v1/tests/inference/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/wan-flat-color-1.3b-v2_flat color, no lineart, blending, negative space, .mp4 new file mode 100644 index 0000000000000000000000000000000000000000..cc1fee2832f31f8c43c5318bc2ed3021f09b1979 GIT binary patch literal 92417 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

bEAZptxK4h4n^vRCU4LfBYvBs0#jh#g>S{ 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

q9;*iuu^GUB?uWOEZu#WF;| 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 literal 0 HcmV?d00001 From a1d13a1ce074187fd5d50196a5864902f6f7c6c6 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Wed, 9 Jul 2025 15:29:19 -0700 Subject: [PATCH 30/43] revert mypy in pyproject.toml --- .github/workflows/matchers/mypy.json | 1 - .github/workflows/pr-test.yml | 3 +-- .pre-commit-config.yaml | 2 +- fastvideo/v1/models/loader/utils.py | 6 +++--- pyproject.toml | 7 +++++++ 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/.github/workflows/matchers/mypy.json b/.github/workflows/matchers/mypy.json index b9644b68a7..7c479786d9 100644 --- a/.github/workflows/matchers/mypy.json +++ b/.github/workflows/matchers/mypy.json @@ -1,4 +1,3 @@ - { "problemMatcher": [ { diff --git a/.github/workflows/pr-test.yml b/.github/workflows/pr-test.yml index 080a859949..532f7e4934 100644 --- a/.github/workflows/pr-test.yml +++ b/.github/workflows/pr-test.yml @@ -372,5 +372,4 @@ jobs: JOB_IDS: '["encoder-test", "vae-test", "transformer-test", "ssim-test-py3.10", "ssim-test-py3.11", "ssim-test-py3.12", "training-test", "training-test-VSA", "inference-test-STA", "precision-test-STA", "precision-test-VSA"]' RUNPOD_API_KEY: ${{ secrets.RUNPOD_API_KEY }} GITHUB_RUN_ID: ${{ github.run_id }} - run: python .github/scripts/runpod_cleanup.py - \ No newline at end of file + run: python .github/scripts/runpod_cleanup.py \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 47a3066116..11aac6eca1 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -60,7 +60,7 @@ repos: rev: v1.15.0 hooks: - id: mypy - args: [--python-version, '3.10', --follow-imports, "skip", ] + args: [--python-version, '3.10', --follow-imports, "skip", "--namespace-packages" ] additional_dependencies: [types-cachetools, types-setuptools, types-PyYAML, types-requests] - repo: local hooks: diff --git a/fastvideo/v1/models/loader/utils.py b/fastvideo/v1/models/loader/utils.py index 320d25af2b..9294d8759f 100644 --- a/fastvideo/v1/models/loader/utils.py +++ b/fastvideo/v1/models/loader/utils.py @@ -71,11 +71,11 @@ def hf_to_custom_state_dict( reverse_param_names_mapping (Dict[str, Tuple[str, Any, Any]]): Maps back from custom to hf """ custom_param_sd = {} - to_merge_params = defaultdict(dict) + to_merge_params = defaultdict(dict) # type: ignore reverse_param_names_mapping = {} if isinstance(hf_param_sd, dict): - hf_param_sd = hf_param_sd.items() - for source_param_name, full_tensor in hf_param_sd: + hf_param_sd = hf_param_sd.items() # type: ignore + for source_param_name, full_tensor in hf_param_sd: # type: ignore target_param_name, merge_index, num_params_to_merge = param_names_mapping( source_param_name) reverse_param_names_mapping[target_param_name] = (source_param_name, diff --git a/pyproject.toml b/pyproject.toml index 5e60af706f..2768492a7c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -79,6 +79,13 @@ exclude = ["assets*", "docker*", "docs", "scripts*"] exclude = ["assets*", "docker*", "docs", "scripts*"] +[tool.mypy] +warn_unused_configs = true +ignore_missing_imports = true +disallow_untyped_calls = true +check_untyped_defs = true +follow_imports = "silent" + [tool.codespell] skip ="./data,./wandb,./csrc/sliding_tile_attention/tk" From e0a5a4d716c056283eb65a20a081f28d045a78e7 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Wed, 9 Jul 2025 15:30:30 -0700 Subject: [PATCH 31/43] pre-commit --- fastvideo/v1/entrypoints/video_generator.py | 2 +- fastvideo/v1/fastvideo_args.py | 2 +- fastvideo/v1/models/loader/fsdp_load.py | 2 +- fastvideo/v1/worker/executor.py | 2 +- fastvideo/v1/worker/gpu_worker.py | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/fastvideo/v1/entrypoints/video_generator.py b/fastvideo/v1/entrypoints/video_generator.py index 798c42c633..5c44adc7ff 100644 --- a/fastvideo/v1/entrypoints/video_generator.py +++ b/fastvideo/v1/entrypoints/video_generator.py @@ -272,7 +272,7 @@ def generate_video( def set_lora_adapter(self, lora_nickname: str, - lora_path: str = None) -> None: + lora_path: str | None = None) -> None: self.executor.set_lora_adapter(lora_nickname, lora_path) def shutdown(self): diff --git a/fastvideo/v1/fastvideo_args.py b/fastvideo/v1/fastvideo_args.py index fef24158d9..c16ba25231 100644 --- a/fastvideo/v1/fastvideo_args.py +++ b/fastvideo/v1/fastvideo_args.py @@ -280,7 +280,7 @@ def from_cli_args(cls, args: argparse.Namespace) -> "FastVideoArgs": return cls(**kwargs) # type: ignore @classmethod - def from_kwargs(cls, **kwargs: dict[str, Any]) -> "FastVideoArgs": + def from_kwargs(cls, **kwargs: Any) -> "FastVideoArgs": kwargs['pipeline_config'] = PipelineConfig.from_kwargs(kwargs) return cls(**kwargs) diff --git a/fastvideo/v1/models/loader/fsdp_load.py b/fastvideo/v1/models/loader/fsdp_load.py index a55df84d09..9f31bc58e3 100644 --- a/fastvideo/v1/models/loader/fsdp_load.py +++ b/fastvideo/v1/models/loader/fsdp_load.py @@ -234,7 +234,7 @@ def load_model_from_full_model_state_dict( meta_sd = model.state_dict() sharded_sd = {} custom_param_sd, reverse_param_names_mapping = hf_to_custom_state_dict( - full_sd_iterator, param_names_mapping) + full_sd_iterator, param_names_mapping) # type: ignore for target_param_name, full_tensor in custom_param_sd.items(): meta_sharded_param = meta_sd.get(target_param_name) if meta_sharded_param is None: diff --git a/fastvideo/v1/worker/executor.py b/fastvideo/v1/worker/executor.py index 84947a0722..276dfe8d0a 100644 --- a/fastvideo/v1/worker/executor.py +++ b/fastvideo/v1/worker/executor.py @@ -51,7 +51,7 @@ def execute_forward( @abstractmethod def set_lora_adapter(self, lora_nickname: str, - lora_path: str = None) -> None: + lora_path: str | None = None) -> None: """ Set the LoRA adapter for the workers. """ diff --git a/fastvideo/v1/worker/gpu_worker.py b/fastvideo/v1/worker/gpu_worker.py index df9a7729f4..b0f2a0bee3 100644 --- a/fastvideo/v1/worker/gpu_worker.py +++ b/fastvideo/v1/worker/gpu_worker.py @@ -89,7 +89,7 @@ def execute_forward(self, forward_batch: ForwardBatch, def set_lora_adapter(self, lora_nickname: str, - lora_path: str = None) -> None: + lora_path: str | None = None) -> None: self.pipeline.set_lora_adapter(lora_nickname, lora_path) def shutdown(self) -> dict[str, Any]: From 2d1b2d86b955a4198cae2f10163b1362379b6b21 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Wed, 9 Jul 2025 15:35:37 -0700 Subject: [PATCH 32/43] fix --- .pre-commit-config.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 11aac6eca1..a276ec9785 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -60,7 +60,7 @@ repos: rev: v1.15.0 hooks: - id: mypy - args: [--python-version, '3.10', --follow-imports, "skip", "--namespace-packages" ] + args: [--python-version, '3.10', --follow-imports, "skip" ] additional_dependencies: [types-cachetools, types-setuptools, types-PyYAML, types-requests] - repo: local hooks: From 59d2a91ac97f54ede9db02f62cbbb71605475fc2 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Wed, 9 Jul 2025 15:38:36 -0700 Subject: [PATCH 33/43] fix vsa test --- fastvideo/v1/tests/modal/pr_test.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fastvideo/v1/tests/modal/pr_test.py b/fastvideo/v1/tests/modal/pr_test.py index a6bd54347a..75422d1575 100644 --- a/fastvideo/v1/tests/modal/pr_test.py +++ b/fastvideo/v1/tests/modal/pr_test.py @@ -94,6 +94,10 @@ def run_inference_tests_STA(): def run_precision_tests_STA(): run_test("python csrc/attn/tests/test_sta.py") +@app.function(gpu="H100:1", image=image, timeout=900) +def run_precision_tests_VSA(): + run_test("python csrc/attn/tests/test_block_sparse.py") + @app.function(gpu="L40S:1", image=image, timeout=3600) def run_inference_lora_tests(): From df8774774ee37c2c90a964b413e7237fb5868d35 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Fri, 11 Jul 2025 00:54:58 +0000 Subject: [PATCH 34/43] fix rpc and lora pipeline device --- fastvideo/v1/layers/lora/linear.py | 1 + fastvideo/v1/pipelines/lora_pipeline.py | 11 +++++++---- ...hn kafka|ponsuke kaikai|hara id 21|yoney_ssim.json | 11 +++++++++++ ...short fluffy monster kneeling beside a m_ssim.json | 11 +++++++++++ .../inference/lora/test_lora_inference_similarity.py | 7 ++----- ...short fluffy monster kneeling beside a m_ssim.json | 11 +++++++++++ fastvideo/v1/worker/gpu_worker.py | 7 +++++++ fastvideo/v1/worker/multiproc_executor.py | 5 ++++- 8 files changed, 54 insertions(+), 10 deletions(-) create mode 100644 fastvideo/v1/tests/inference/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_flat color, no lineart, blending, negative space, artist:[john kafka|ponsuke kaikai|hara id 21|yoney_ssim.json create mode 100644 fastvideo/v1/tests/inference/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a m_ssim.json create mode 100644 fastvideo/v1/tests/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a m_ssim.json diff --git a/fastvideo/v1/layers/lora/linear.py b/fastvideo/v1/layers/lora/linear.py index e1a2dea3a2..334ca9c071 100644 --- a/fastvideo/v1/layers/lora/linear.py +++ b/fastvideo/v1/layers/lora/linear.py @@ -79,6 +79,7 @@ def merge_lora_weights(self) -> None: data += \ (self.slice_lora_b_weights(self.lora_B) @ self.slice_lora_a_weights(self.lora_A)).to(data) self.base_layer.weight = nn.Parameter(data.to(current_device)) + self.merged = True @torch.no_grad() diff --git a/fastvideo/v1/pipelines/lora_pipeline.py b/fastvideo/v1/pipelines/lora_pipeline.py index f14d1de648..ce380e6858 100644 --- a/fastvideo/v1/pipelines/lora_pipeline.py +++ b/fastvideo/v1/pipelines/lora_pipeline.py @@ -1,6 +1,7 @@ # SPDX-License-Identifier: Apache-2.0 from collections import defaultdict from collections.abc import Hashable +from pickle import NONE from typing import Any import torch @@ -14,7 +15,7 @@ from fastvideo.v1.models.loader.utils import get_param_names_mapping from fastvideo.v1.pipelines.composed_pipeline_base import ComposedPipelineBase from fastvideo.v1.utils import maybe_download_lora - +from fastvideo.v1.distributed import get_local_torch_device logger = init_logger(__name__) @@ -29,13 +30,14 @@ class LoRAPipeline(ComposedPipelineBase): lora_layers: dict[str, BaseLayerWithLoRA] = {} fastvideo_args: FastVideoArgs exclude_lora_layers: list[str] = [] - device: torch.device = torch.device(f"cuda:{torch.cuda.current_device()}") + device: torch.device = None def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.exclude_lora_layers = self.modules[ "transformer"].config.arch_config.exclude_lora_layers - + # Must assign after ComposedPipelineBase initializes distributed + self.device = get_local_torch_device() self.convert_to_lora_layers() if self.fastvideo_args.pipeline_config.lora_path is not None: self.set_lora_adapter( @@ -89,7 +91,7 @@ def set_lora_adapter(self, rank = dist.get_rank() if lora_path is not None: lora_local_path = maybe_download_lora(lora_path) - lora_state_dict = load_file(lora_local_path) + lora_state_dict = load_file(lora_local_path, device=str(self.device)) # Map the hf layer names to our custom layer names param_names_mapping_fn = get_param_names_mapping( self.modules["transformer"].param_names_mapping) @@ -154,4 +156,5 @@ def set_lora_adapter(self, layer.disable_lora = True logger.info("Rank %d: LoRA adapter %s applied to %d layers", rank, lora_path, adapted_count) + self.cur_adapter_name = lora_nickname diff --git a/fastvideo/v1/tests/inference/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_flat color, no lineart, blending, negative space, artist:[john kafka|ponsuke kaikai|hara id 21|yoney_ssim.json b/fastvideo/v1/tests/inference/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_flat color, no lineart, blending, negative space, artist:[john kafka|ponsuke kaikai|hara id 21|yoney_ssim.json new file mode 100644 index 0000000000..da3fd4f65c --- /dev/null +++ b/fastvideo/v1/tests/inference/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_flat color, no lineart, blending, negative space, artist:[john kafka|ponsuke kaikai|hara id 21|yoney_ssim.json @@ -0,0 +1,11 @@ +{ + "mean_ssim": 0.37694887982474434, + "min_ssim": 0.37098798155784607, + "max_ssim": 0.38819071650505066, + "reference_video": "/FastVideo/fastvideo/v1/tests/inference/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/wan-flat-color-1.3b-v2_flat color, no lineart, blending, negative space, .mp4", + "generated_video": "/FastVideo/fastvideo/v1/tests/inference/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/wan-flat-color-1.3b-v2_flat color, no lineart, blending, negative space, .mp4", + "parameters": { + "num_inference_steps": 32, + "prompt": "flat color, no lineart, blending, negative space, artist:[john kafka|ponsuke kaikai|hara id 21|yoneyama mai|fuzichoco], 1girl, sakura miko, pink hair, cowboy shot, white shirt, floral print, off shoulder, outdoors, cherry blossom, tree shade, wariza, looking up, falling petals, half-closed eyes, white sky, clouds, live2d animation, upper body, high quality cinematic video of a woman sitting under a sakura tree. Dreamy and lonely, the camera close-ups on the face of the woman as she turns towards the viewer. The Camera is steady, This is a cowboy shot. The animation is smooth and fluid." + } +} \ No newline at end of file diff --git a/fastvideo/v1/tests/inference/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a m_ssim.json b/fastvideo/v1/tests/inference/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a m_ssim.json new file mode 100644 index 0000000000..5d81d9aabd --- /dev/null +++ b/fastvideo/v1/tests/inference/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a m_ssim.json @@ -0,0 +1,11 @@ +{ + "mean_ssim": 0.7929211007224188, + "min_ssim": 0.7694870829582214, + "max_ssim": 0.8078609704971313, + "reference_video": "/FastVideo/fastvideo/v1/tests/inference/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steamboat-willie-1.3b_steamboat willie style, golden era animation, clos.mp4", + "generated_video": "/FastVideo/fastvideo/v1/tests/inference/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steamboat-willie-1.3b_steamboat willie style, golden era animation, clos.mp4", + "parameters": { + "num_inference_steps": 32, + "prompt": "steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a melting red candle. the mood is one of wonder and curiosity, as the monster gazes at the flame with wide eyes and open mouth. Its pose and expression convey a sense of innocence and playfulness, as if it is exploring the world around it for the first time. The use of warm colors and dramatic lighting further enhances the cozy atmosphere of the image." + } +} \ No newline at end of file diff --git a/fastvideo/v1/tests/inference/lora/test_lora_inference_similarity.py b/fastvideo/v1/tests/inference/lora/test_lora_inference_similarity.py index 8fae364d28..f99437a9c0 100644 --- a/fastvideo/v1/tests/inference/lora/test_lora_inference_similarity.py +++ b/fastvideo/v1/tests/inference/lora/test_lora_inference_similarity.py @@ -14,7 +14,7 @@ from torch.testing import assert_close from torch.distributed.tensor import DTensor from fastvideo.v1.worker import MultiprocExecutor - +import torch logger = init_logger(__name__) os.environ["MASTER_ADDR"] = "localhost" os.environ["MASTER_PORT"] = "29500" @@ -107,11 +107,8 @@ def test_lora_switching_similarity(ATTENTION_BACKEND, model_id): output_video_name = f"{lora_path.split('/')[-1]}_{prompt[:50]}" generation_kwargs["output_path"] = output_dir generation_kwargs["output_video_name"] = output_video_name - - generator.generate_video(prompt, **generation_kwargs) - if isinstance(generator.executor, MultiprocExecutor): - generator.executor.shutdown() + generator.generate_video(prompt, **generation_kwargs) assert os.path.exists( output_dir), f"Output video was not generated at {output_dir}" diff --git a/fastvideo/v1/tests/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a m_ssim.json b/fastvideo/v1/tests/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a m_ssim.json new file mode 100644 index 0000000000..2c2bcf22b7 --- /dev/null +++ b/fastvideo/v1/tests/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a m_ssim.json @@ -0,0 +1,11 @@ +{ + "mean_ssim": 0.7929211007224188, + "min_ssim": 0.7694870829582214, + "max_ssim": 0.8078609704971313, + "reference_video": "/FastVideo/fastvideo/v1/tests/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steamboat-willie-1.3b_steamboat willie style, golden era animation, clos.mp4", + "generated_video": "/FastVideo/fastvideo/v1/tests/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steamboat-willie-1.3b_steamboat willie style, golden era animation, clos.mp4", + "parameters": { + "num_inference_steps": 32, + "prompt": "steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a melting red candle. the mood is one of wonder and curiosity, as the monster gazes at the flame with wide eyes and open mouth. Its pose and expression convey a sense of innocence and playfulness, as if it is exploring the world around it for the first time. The use of warm colors and dramatic lighting further enhances the cozy atmosphere of the image." + } +} \ No newline at end of file diff --git a/fastvideo/v1/worker/gpu_worker.py b/fastvideo/v1/worker/gpu_worker.py index b0f2a0bee3..0490e57584 100644 --- a/fastvideo/v1/worker/gpu_worker.py +++ b/fastvideo/v1/worker/gpu_worker.py @@ -134,6 +134,13 @@ def event_loop(self) -> None: output_batch = self.execute_forward(forward_batch, fastvideo_args) self.pipe.send({"output_batch": output_batch.output.cpu()}) + elif method_name == 'set_lora_adapter': + lora_nickname = recv_rpc['kwargs']['lora_nickname'] + lora_path = recv_rpc['kwargs']['lora_path'] + self.set_lora_adapter(lora_nickname, lora_path) + logger.info("Worker %d set LoRA adapter %s with path %s", + self.rank, lora_nickname, lora_path) + self.pipe.send({"status": "lora_adapter_set"}) else: # Handle other methods dynamically if needed args = recv_rpc.get('args', ()) diff --git a/fastvideo/v1/worker/multiproc_executor.py b/fastvideo/v1/worker/multiproc_executor.py index b18278735d..d24cc3142a 100644 --- a/fastvideo/v1/worker/multiproc_executor.py +++ b/fastvideo/v1/worker/multiproc_executor.py @@ -78,11 +78,14 @@ def execute_forward(self, forward_batch: ForwardBatch, def set_lora_adapter(self, lora_nickname: str, lora_path: str | None = None) -> None: - self.collective_rpc("set_lora_adapter", + responses = self.collective_rpc("set_lora_adapter", kwargs={ "lora_nickname": lora_nickname, "lora_path": lora_path }) + for i, response in enumerate(responses): + if response["status"] != "lora_adapter_set": + raise RuntimeError(f"Worker {i} failed to set LoRA adapter to {lora_path}") def collective_rpc(self, method: str | Callable, From 855112a45720b901fb9ea175a6ab648a268363a4 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Thu, 10 Jul 2025 21:30:57 -0700 Subject: [PATCH 35/43] fix fsdp param re-register bug... --- fastvideo/v1/layers/lora/linear.py | 33 ++++++++++++------- fastvideo/v1/pipelines/lora_pipeline.py | 13 ++++---- ...|ponsuke kaikai|hara id 21|yoney_ssim.json | 11 ------- ...uffy monster kneeling beside a m_ssim.json | 11 ------- ...uffy monster kneeling beside a m_ssim.json | 11 ------- 5 files changed, 28 insertions(+), 51 deletions(-) delete mode 100644 fastvideo/v1/tests/inference/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_flat color, no lineart, blending, negative space, artist:[john kafka|ponsuke kaikai|hara id 21|yoney_ssim.json delete mode 100644 fastvideo/v1/tests/inference/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a m_ssim.json delete mode 100644 fastvideo/v1/tests/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a m_ssim.json diff --git a/fastvideo/v1/layers/lora/linear.py b/fastvideo/v1/layers/lora/linear.py index 334ca9c071..74fb384344 100644 --- a/fastvideo/v1/layers/lora/linear.py +++ b/fastvideo/v1/layers/lora/linear.py @@ -31,6 +31,7 @@ def __init__( # indicates adapter weights don't contain this layer # (which shouldn't normally happen, but we want to separate it from the case of erroneous merging) self.disable_lora: bool = False + self.lora_path: str | None = None def forward(self, x: torch.Tensor) -> torch.Tensor: return self.base_layer.forward(x) @@ -44,12 +45,14 @@ def slice_lora_b_weights(self, B: torch.Tensor) -> torch.Tensor: def set_lora_weights(self, A: torch.Tensor, B: torch.Tensor, - training_mode: bool = False) -> None: + training_mode: bool = False, + lora_path: str | None = None) -> None: self.lora_A = A # share storage with weights in the pipeline self.lora_B = B self.disable_lora = False if not training_mode: self.merge_lora_weights() + self.lora_path = lora_path @torch.no_grad() def merge_lora_weights(self) -> None: @@ -69,17 +72,19 @@ def merge_lora_weights(self) -> None: get_local_torch_device()).full_tensor() data += (self.slice_lora_b_weights(self.lora_B) @ self.slice_lora_a_weights(self.lora_A)).to(data) - self.base_layer.weight = nn.Parameter( - distribute_tensor(data, mesh, - placements=placements).to(current_device)) + # self.base_layer.weight = nn.Parameter(distribute_tensor(data, mesh, + # placements=placements).to(current_device)) + self.base_layer.weight._sharded_local_tensor = distribute_tensor( + data, mesh, + placements=placements).to(current_device).to_local() else: current_device = self.base_layer.weight.data.device data = self.base_layer.weight.data.to( get_local_torch_device()).full_tensor() data += \ (self.slice_lora_b_weights(self.lora_B) @ self.slice_lora_a_weights(self.lora_A)).to(data) - self.base_layer.weight = nn.Parameter(data.to(current_device)) - + self.base_layer.weight.data = data.to(current_device) + self.merged = True @torch.no_grad() @@ -97,13 +102,17 @@ def unmerge_lora_weights(self) -> None: mesh = self.base_layer.weight.data.device_mesh placement = self.base_layer.weight.data.placements device = self.base_layer.weight.data.device - self.base_layer.weight = nn.Parameter( - distribute_tensor(self.cpu_weight.to(get_local_torch_device()), - mesh, - placements=placement).to(device)) + # self.base_layer.weight = nn.Parameter( + # distribute_tensor(self.cpu_weight.to(get_local_torch_device()), + # mesh, + # placements=placement).to(device)) + self.base_layer.weight._sharded_local_tensor = distribute_tensor( + self.cpu_weight.to(get_local_torch_device()), + mesh, + placements=placement).to(device).to_local() else: - self.base_layer.weight = nn.Parameter( - self.cpu_weight.data.to(self.base_layer.weight)) + self.base_layer.weight.data = self.cpu_weight.data.to( + self.base_layer.weight) self.merged = False diff --git a/fastvideo/v1/pipelines/lora_pipeline.py b/fastvideo/v1/pipelines/lora_pipeline.py index ce380e6858..a19a76866d 100644 --- a/fastvideo/v1/pipelines/lora_pipeline.py +++ b/fastvideo/v1/pipelines/lora_pipeline.py @@ -1,13 +1,13 @@ # SPDX-License-Identifier: Apache-2.0 from collections import defaultdict from collections.abc import Hashable -from pickle import NONE from typing import Any import torch import torch.distributed as dist from safetensors.torch import load_file +from fastvideo.v1.distributed import get_local_torch_device from fastvideo.v1.fastvideo_args import FastVideoArgs from fastvideo.v1.layers.lora.linear import (BaseLayerWithLoRA, get_lora_layer, replace_submodule) @@ -15,7 +15,7 @@ from fastvideo.v1.models.loader.utils import get_param_names_mapping from fastvideo.v1.pipelines.composed_pipeline_base import ComposedPipelineBase from fastvideo.v1.utils import maybe_download_lora -from fastvideo.v1.distributed import get_local_torch_device + logger = init_logger(__name__) @@ -30,13 +30,12 @@ class LoRAPipeline(ComposedPipelineBase): lora_layers: dict[str, BaseLayerWithLoRA] = {} fastvideo_args: FastVideoArgs exclude_lora_layers: list[str] = [] - device: torch.device = None + device: torch.device | None = None def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.exclude_lora_layers = self.modules[ "transformer"].config.arch_config.exclude_lora_layers - # Must assign after ComposedPipelineBase initializes distributed self.device = get_local_torch_device() self.convert_to_lora_layers() if self.fastvideo_args.pipeline_config.lora_path is not None: @@ -91,7 +90,8 @@ def set_lora_adapter(self, rank = dist.get_rank() if lora_path is not None: lora_local_path = maybe_download_lora(lora_path) - lora_state_dict = load_file(lora_local_path, device=str(self.device)) + lora_state_dict = load_file(lora_local_path, + device=str(self.device)) # Map the hf layer names to our custom layer names param_names_mapping_fn = get_param_names_mapping( self.modules["transformer"].param_names_mapping) @@ -146,7 +146,8 @@ def set_lora_adapter(self, layer.set_lora_weights( self.lora_adapters[lora_nickname][lora_A_name], self.lora_adapters[lora_nickname][lora_B_name], - training_mode=self.fastvideo_args.training_mode) + training_mode=self.fastvideo_args.training_mode, + lora_path=lora_path) adapted_count += 1 else: if rank == 0: diff --git a/fastvideo/v1/tests/inference/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_flat color, no lineart, blending, negative space, artist:[john kafka|ponsuke kaikai|hara id 21|yoney_ssim.json b/fastvideo/v1/tests/inference/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_flat color, no lineart, blending, negative space, artist:[john kafka|ponsuke kaikai|hara id 21|yoney_ssim.json deleted file mode 100644 index da3fd4f65c..0000000000 --- a/fastvideo/v1/tests/inference/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_flat color, no lineart, blending, negative space, artist:[john kafka|ponsuke kaikai|hara id 21|yoney_ssim.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "mean_ssim": 0.37694887982474434, - "min_ssim": 0.37098798155784607, - "max_ssim": 0.38819071650505066, - "reference_video": "/FastVideo/fastvideo/v1/tests/inference/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/wan-flat-color-1.3b-v2_flat color, no lineart, blending, negative space, .mp4", - "generated_video": "/FastVideo/fastvideo/v1/tests/inference/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/wan-flat-color-1.3b-v2_flat color, no lineart, blending, negative space, .mp4", - "parameters": { - "num_inference_steps": 32, - "prompt": "flat color, no lineart, blending, negative space, artist:[john kafka|ponsuke kaikai|hara id 21|yoneyama mai|fuzichoco], 1girl, sakura miko, pink hair, cowboy shot, white shirt, floral print, off shoulder, outdoors, cherry blossom, tree shade, wariza, looking up, falling petals, half-closed eyes, white sky, clouds, live2d animation, upper body, high quality cinematic video of a woman sitting under a sakura tree. Dreamy and lonely, the camera close-ups on the face of the woman as she turns towards the viewer. The Camera is steady, This is a cowboy shot. The animation is smooth and fluid." - } -} \ No newline at end of file diff --git a/fastvideo/v1/tests/inference/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a m_ssim.json b/fastvideo/v1/tests/inference/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a m_ssim.json deleted file mode 100644 index 5d81d9aabd..0000000000 --- a/fastvideo/v1/tests/inference/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a m_ssim.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "mean_ssim": 0.7929211007224188, - "min_ssim": 0.7694870829582214, - "max_ssim": 0.8078609704971313, - "reference_video": "/FastVideo/fastvideo/v1/tests/inference/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steamboat-willie-1.3b_steamboat willie style, golden era animation, clos.mp4", - "generated_video": "/FastVideo/fastvideo/v1/tests/inference/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steamboat-willie-1.3b_steamboat willie style, golden era animation, clos.mp4", - "parameters": { - "num_inference_steps": 32, - "prompt": "steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a melting red candle. the mood is one of wonder and curiosity, as the monster gazes at the flame with wide eyes and open mouth. Its pose and expression convey a sense of innocence and playfulness, as if it is exploring the world around it for the first time. The use of warm colors and dramatic lighting further enhances the cozy atmosphere of the image." - } -} \ No newline at end of file diff --git a/fastvideo/v1/tests/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a m_ssim.json b/fastvideo/v1/tests/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a m_ssim.json deleted file mode 100644 index 2c2bcf22b7..0000000000 --- a/fastvideo/v1/tests/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steps32_steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a m_ssim.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "mean_ssim": 0.7929211007224188, - "min_ssim": 0.7694870829582214, - "max_ssim": 0.8078609704971313, - "reference_video": "/FastVideo/fastvideo/v1/tests/lora/L40S_reference_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steamboat-willie-1.3b_steamboat willie style, golden era animation, clos.mp4", - "generated_video": "/FastVideo/fastvideo/v1/tests/lora/generated_videos/Wan2.1-T2V-1.3B-Diffusers/TORCH_SDPA/steamboat-willie-1.3b_steamboat willie style, golden era animation, clos.mp4", - "parameters": { - "num_inference_steps": 32, - "prompt": "steamboat willie style, golden era animation, close-up of a short fluffy monster kneeling beside a melting red candle. the mood is one of wonder and curiosity, as the monster gazes at the flame with wide eyes and open mouth. Its pose and expression convey a sense of innocence and playfulness, as if it is exploring the world around it for the first time. The use of warm colors and dramatic lighting further enhances the cozy atmosphere of the image." - } -} \ No newline at end of file From cb66430108dfcb6c82464b621c674587db4e1ef8 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Thu, 10 Jul 2025 21:33:51 -0700 Subject: [PATCH 36/43] add comments --- fastvideo/v1/layers/lora/linear.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/fastvideo/v1/layers/lora/linear.py b/fastvideo/v1/layers/lora/linear.py index 74fb384344..ad0e08d81c 100644 --- a/fastvideo/v1/layers/lora/linear.py +++ b/fastvideo/v1/layers/lora/linear.py @@ -106,6 +106,11 @@ def unmerge_lora_weights(self) -> None: # distribute_tensor(self.cpu_weight.to(get_local_torch_device()), # mesh, # placements=placement).to(device)) + + # TODO(Wenxuan): This is quite a hack because fsdp doesn't allow re-registering params + # after initialization (the first forward). + # This depends on all_gather_inputs(https://github.com/pytorch/pytorch/blob/ecd73c58eeaf7e919316f9b9596f8c677af96c66/torch/distributed/fsdp/_fully_shard/_fsdp_param.py#L682) + # and might break in a future version. self.base_layer.weight._sharded_local_tensor = distribute_tensor( self.cpu_weight.to(get_local_torch_device()), mesh, From c218951abb3c13b9de8c2d29f5d2229ce46bb37d Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Thu, 10 Jul 2025 21:35:50 -0700 Subject: [PATCH 37/43] pre-commit --- fastvideo/v1/worker/multiproc_executor.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/fastvideo/v1/worker/multiproc_executor.py b/fastvideo/v1/worker/multiproc_executor.py index d24cc3142a..2a2d488563 100644 --- a/fastvideo/v1/worker/multiproc_executor.py +++ b/fastvideo/v1/worker/multiproc_executor.py @@ -79,13 +79,14 @@ def set_lora_adapter(self, lora_nickname: str, lora_path: str | None = None) -> None: responses = self.collective_rpc("set_lora_adapter", - kwargs={ - "lora_nickname": lora_nickname, - "lora_path": lora_path - }) + kwargs={ + "lora_nickname": lora_nickname, + "lora_path": lora_path + }) for i, response in enumerate(responses): if response["status"] != "lora_adapter_set": - raise RuntimeError(f"Worker {i} failed to set LoRA adapter to {lora_path}") + raise RuntimeError( + f"Worker {i} failed to set LoRA adapter to {lora_path}") def collective_rpc(self, method: str | Callable, From f3e6b333c151bd2786fc748500e41c3394f7026a Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Fri, 11 Jul 2025 22:07:50 -0700 Subject: [PATCH 38/43] use fully_shard to re-register --- fastvideo/v1/layers/lora/linear.py | 40 +++++++++++-------------- fastvideo/v1/models/loader/fsdp_load.py | 1 + fastvideo/v1/pipelines/lora_pipeline.py | 2 -- fastvideo/v1/utils.py | 5 +++- 4 files changed, 23 insertions(+), 25 deletions(-) diff --git a/fastvideo/v1/layers/lora/linear.py b/fastvideo/v1/layers/lora/linear.py index ad0e08d81c..e578401d19 100644 --- a/fastvideo/v1/layers/lora/linear.py +++ b/fastvideo/v1/layers/lora/linear.py @@ -3,6 +3,8 @@ import torch from torch import nn +from torch.distributed._composable.fsdp import (CPUOffloadPolicy, OffloadPolicy, + fully_shard) from torch.distributed.tensor import DTensor, distribute_tensor from fastvideo.v1.distributed import (get_local_torch_device, get_tp_rank, @@ -14,6 +16,7 @@ QKVParallelLinear, ReplicatedLinear, RowParallelLinear) from fastvideo.v1.layers.vocab_parallel_embedding import VocabParallelEmbedding +from fastvideo.v1.utils import get_mixed_precision_state class BaseLayerWithLoRA(nn.Module): @@ -60,8 +63,7 @@ def merge_lora_weights(self) -> None: return if self.merged: - raise ValueError( - "LoRA weights already merged. Please unmerge them first.") + self.unmerge_lora_weights() assert self.lora_A is not None and self.lora_B is not None, "LoRA weights not set. Please set them first." if isinstance(self.base_layer.weight, DTensor): mesh = self.base_layer.weight.data.device_mesh @@ -72,11 +74,19 @@ def merge_lora_weights(self) -> None: get_local_torch_device()).full_tensor() data += (self.slice_lora_b_weights(self.lora_B) @ self.slice_lora_a_weights(self.lora_A)).to(data) - # self.base_layer.weight = nn.Parameter(distribute_tensor(data, mesh, - # placements=placements).to(current_device)) - self.base_layer.weight._sharded_local_tensor = distribute_tensor( - data, mesh, - placements=placements).to(current_device).to_local() + + # Must re-register updated weights for FSDP to recognize them + self.base_layer.weight = nn.Parameter( + distribute_tensor(data, mesh, + placements=placements).to(current_device)) + offload_policy = CPUOffloadPolicy() if "cpu" in str( + current_device) else OffloadPolicy(device=current_device, + offload_params=True) + mp_policy = get_mixed_precision_state().mp_policy + fully_shard(self.base_layer, + mesh=mesh, + mp_policy=mp_policy, + offload_policy=offload_policy) else: current_device = self.base_layer.weight.data.device data = self.base_layer.weight.data.to( @@ -99,22 +109,8 @@ def unmerge_lora_weights(self) -> None: # To avoid precision loss we do not subtract the LoRA weights here if isinstance(self.base_layer.weight, DTensor): - mesh = self.base_layer.weight.data.device_mesh - placement = self.base_layer.weight.data.placements device = self.base_layer.weight.data.device - # self.base_layer.weight = nn.Parameter( - # distribute_tensor(self.cpu_weight.to(get_local_torch_device()), - # mesh, - # placements=placement).to(device)) - - # TODO(Wenxuan): This is quite a hack because fsdp doesn't allow re-registering params - # after initialization (the first forward). - # This depends on all_gather_inputs(https://github.com/pytorch/pytorch/blob/ecd73c58eeaf7e919316f9b9596f8c677af96c66/torch/distributed/fsdp/_fully_shard/_fsdp_param.py#L682) - # and might break in a future version. - self.base_layer.weight._sharded_local_tensor = distribute_tensor( - self.cpu_weight.to(get_local_torch_device()), - mesh, - placements=placement).to(device).to_local() + self.base_layer.weight.data = self.cpu_weight.to(device) else: self.base_layer.weight.data = self.cpu_weight.data.to( self.base_layer.weight) diff --git a/fastvideo/v1/models/loader/fsdp_load.py b/fastvideo/v1/models/loader/fsdp_load.py index 9f31bc58e3..f0f1c925ff 100644 --- a/fastvideo/v1/models/loader/fsdp_load.py +++ b/fastvideo/v1/models/loader/fsdp_load.py @@ -84,6 +84,7 @@ def maybe_load_fsdp_model( param_dtype=param_dtype, reduce_dtype=reduce_dtype, output_dtype=output_dtype, + mp_policy=mp_policy, ) with set_default_dtype(param_dtype), torch.device("meta"): diff --git a/fastvideo/v1/pipelines/lora_pipeline.py b/fastvideo/v1/pipelines/lora_pipeline.py index a19a76866d..38352a6096 100644 --- a/fastvideo/v1/pipelines/lora_pipeline.py +++ b/fastvideo/v1/pipelines/lora_pipeline.py @@ -141,8 +141,6 @@ def set_lora_adapter(self, lora_B_name = name + ".lora_B" if lora_A_name in self.lora_adapters[lora_nickname]\ and lora_B_name in self.lora_adapters[lora_nickname]: - if layer.merged: - layer.unmerge_lora_weights() layer.set_lora_weights( self.lora_adapters[lora_nickname][lora_A_name], self.lora_adapters[lora_nickname][lora_B_name], diff --git a/fastvideo/v1/utils.py b/fastvideo/v1/utils.py index 20cbf74ae0..1591d9cbee 100644 --- a/fastvideo/v1/utils.py +++ b/fastvideo/v1/utils.py @@ -29,6 +29,7 @@ _best_guess_weight_name) # watch out for potetential removal from diffusers from huggingface_hub import snapshot_download from remote_pdb import RemotePdb +from torch.distributed.fsdp import MixedPrecisionPolicy import fastvideo.v1.envs as envs from fastvideo.v1.logger import init_logger @@ -684,11 +685,11 @@ def remote_breakpoint() -> None: @dataclass class MixedPrecisionState: - master_dtype: torch.dtype | None = None param_dtype: torch.dtype | None = None reduce_dtype: torch.dtype | None = None output_dtype: torch.dtype | None = None compute_dtype: torch.dtype | None = None + mp_policy: MixedPrecisionPolicy | None = None # Thread-local storage for mixed precision state @@ -706,6 +707,7 @@ def set_mixed_precision_policy( param_dtype: torch.dtype, reduce_dtype: torch.dtype, output_dtype: torch.dtype | None = None, + mp_policy: MixedPrecisionPolicy | None = None, ): """Set mixed precision policy globally. @@ -718,6 +720,7 @@ def set_mixed_precision_policy( param_dtype=param_dtype, reduce_dtype=reduce_dtype, output_dtype=output_dtype, + mp_policy=mp_policy, ) _mixed_precision_state.state = state From 4fefab9864bd6280439bcd4043579aaca69d4715 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Sat, 12 Jul 2025 13:09:09 -0700 Subject: [PATCH 39/43] use unshard --- fastvideo/v1/layers/lora/linear.py | 34 ++++++++++++++++++------------ 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/fastvideo/v1/layers/lora/linear.py b/fastvideo/v1/layers/lora/linear.py index e578401d19..99b7b6990a 100644 --- a/fastvideo/v1/layers/lora/linear.py +++ b/fastvideo/v1/layers/lora/linear.py @@ -5,7 +5,7 @@ from torch import nn from torch.distributed._composable.fsdp import (CPUOffloadPolicy, OffloadPolicy, fully_shard) -from torch.distributed.tensor import DTensor, distribute_tensor +from torch.distributed.tensor import DTensor from fastvideo.v1.distributed import (get_local_torch_device, get_tp_rank, split_tensor_along_last_dim, @@ -67,21 +67,27 @@ def merge_lora_weights(self) -> None: assert self.lora_A is not None and self.lora_B is not None, "LoRA weights not set. Please set them first." if isinstance(self.base_layer.weight, DTensor): mesh = self.base_layer.weight.data.device_mesh - placements = self.base_layer.weight.data.placements # Using offload param is on CPU, so current_device is for "CPU -> GPU -> merge -> CPU" current_device = self.base_layer.weight.data.device data = self.base_layer.weight.data.to( get_local_torch_device()).full_tensor() - data += (self.slice_lora_b_weights(self.lora_B) - @ self.slice_lora_a_weights(self.lora_A)).to(data) + data += (self.slice_lora_b_weights(self.lora_B).to(data) + @ self.slice_lora_a_weights(self.lora_A).to(data)) # Must re-register updated weights for FSDP to recognize them - self.base_layer.weight = nn.Parameter( - distribute_tensor(data, mesh, - placements=placements).to(current_device)) + self.base_layer.weight = nn.Parameter(data.to(current_device)) + if isinstance(getattr(self.base_layer, "bias", None), DTensor): + self.base_layer.bias = nn.Parameter( + self.base_layer.bias.to( + get_local_torch_device(), + non_blocking=True).full_tensor().to(current_device)) + offload_policy = CPUOffloadPolicy() if "cpu" in str( - current_device) else OffloadPolicy(device=current_device, - offload_params=True) + current_device) else OffloadPolicy() + # see https://github.com/pytorch/torchtune/pull/2714/files#diff-909ee7ef184b0d834c40a1980ca4149afc38612ec7a4b344d8e2fc27641758c9R69-R79 + # After the 1st forward, self.base_layer becomes a FSDP module and needs to be resharded + if hasattr(self.base_layer, "unshard"): + self.base_layer.unshard() mp_policy = get_mixed_precision_state().mp_policy fully_shard(self.base_layer, mesh=mesh, @@ -89,11 +95,11 @@ def merge_lora_weights(self) -> None: offload_policy=offload_policy) else: current_device = self.base_layer.weight.data.device - data = self.base_layer.weight.data.to( - get_local_torch_device()).full_tensor() + data = self.base_layer.weight.data.to(get_local_torch_device()) data += \ - (self.slice_lora_b_weights(self.lora_B) @ self.slice_lora_a_weights(self.lora_A)).to(data) - self.base_layer.weight.data = data.to(current_device) + (self.slice_lora_b_weights(self.lora_B.to(data)) @ self.slice_lora_a_weights(self.lora_A.to(data))) + self.base_layer.weight.data = data.to(current_device, + non_blocking=True) self.merged = True @@ -110,7 +116,7 @@ def unmerge_lora_weights(self) -> None: # To avoid precision loss we do not subtract the LoRA weights here if isinstance(self.base_layer.weight, DTensor): device = self.base_layer.weight.data.device - self.base_layer.weight.data = self.cpu_weight.to(device) + self.base_layer.weight = nn.Parameter(self.cpu_weight.to(device)) else: self.base_layer.weight.data = self.cpu_weight.data.to( self.base_layer.weight) From a85aa2d88648f79bf09e19e1730edbe5dd6d98b5 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Mon, 14 Jul 2025 20:32:37 -0700 Subject: [PATCH 40/43] use single lora in tests --- examples/inference/lora/wan_lora_inference.py | 12 ++++++++++-- .../lora/test_lora_inference_similarity.py | 14 +++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/examples/inference/lora/wan_lora_inference.py b/examples/inference/lora/wan_lora_inference.py index 6e9d3405ef..aae907e708 100644 --- a/examples/inference/lora/wan_lora_inference.py +++ b/examples/inference/lora/wan_lora_inference.py @@ -30,8 +30,16 @@ def main(): negative_prompt=negative_prompt, **kwargs ) - - generator.set_lora_adapter(lora_nickname="flat_color", lora_path="motimalu/wan-flat-color-1.3b-v2") + del generator + + # Until FSDP resharding bug is fixed, multi-lora requires reloading the model + generator = VideoGenerator.from_pretrained( + "Wan-AI/Wan2.1-T2V-1.3B-Diffusers", + num_gpus=1, + lora_path="motimalu/wan-flat-color-1.3b-v2", + lora_nickname="flat_color" + ) + # generator.set_lora_adapter(lora_nickname="flat_color", lora_path="motimalu/wan-flat-color-1.3b-v2") prompt = "flat color, no lineart, blending, negative space, artist:[john kafka|ponsuke kaikai|hara id 21|yoneyama mai|fuzichoco], 1girl, sakura miko, pink hair, cowboy shot, white shirt, floral print, off shoulder, outdoors, cherry blossom, tree shade, wariza, looking up, falling petals, half-closed eyes, white sky, clouds, live2d animation, upper body, high quality cinematic video of a woman sitting under a sakura tree. Dreamy and lonely, the camera close-ups on the face of the woman as she turns towards the viewer. The Camera is steady, This is a cowboy shot. The animation is smooth and fluid." negative_prompt = "bad quality video,色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走" video = generator.generate_video( diff --git a/fastvideo/v1/tests/inference/lora/test_lora_inference_similarity.py b/fastvideo/v1/tests/inference/lora/test_lora_inference_similarity.py index f99437a9c0..89c2aa5462 100644 --- a/fastvideo/v1/tests/inference/lora/test_lora_inference_similarity.py +++ b/fastvideo/v1/tests/inference/lora/test_lora_inference_similarity.py @@ -45,13 +45,13 @@ "negative_prompt": "色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走", "ssim_threshold": 0.79 }, - { - "lora_path": "motimalu/wan-flat-color-1.3b-v2", - "lora_nickname": "flat_color", - "prompt": "flat color, no lineart, blending, negative space, artist:[john kafka|ponsuke kaikai|hara id 21|yoneyama mai|fuzichoco], 1girl, sakura miko, pink hair, cowboy shot, white shirt, floral print, off shoulder, outdoors, cherry blossom, tree shade, wariza, looking up, falling petals, half-closed eyes, white sky, clouds, live2d animation, upper body, high quality cinematic video of a woman sitting under a sakura tree. Dreamy and lonely, the camera close-ups on the face of the woman as she turns towards the viewer. The Camera is steady, This is a cowboy shot. The animation is smooth and fluid.", - "negative_prompt": "bad quality video,色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走", - "ssim_threshold": 0.79 - } + # { + # "lora_path": "motimalu/wan-flat-color-1.3b-v2", + # "lora_nickname": "flat_color", + # "prompt": "flat color, no lineart, blending, negative space, artist:[john kafka|ponsuke kaikai|hara id 21|yoneyama mai|fuzichoco], 1girl, sakura miko, pink hair, cowboy shot, white shirt, floral print, off shoulder, outdoors, cherry blossom, tree shade, wariza, looking up, falling petals, half-closed eyes, white sky, clouds, live2d animation, upper body, high quality cinematic video of a woman sitting under a sakura tree. Dreamy and lonely, the camera close-ups on the face of the woman as she turns towards the viewer. The Camera is steady, This is a cowboy shot. The animation is smooth and fluid.", + # "negative_prompt": "bad quality video,色调艳丽,过曝,静态,细节模糊不清,字幕,风格,作品,画作,画面,静止,整体发灰,最差质量,低质量,JPEG压缩残留,丑陋的,残缺的,多余的手指,画得不好的手部,画得不好的脸部,畸形的,毁容的,形态畸形的肢体,手指融合,静止不动的画面,杂乱的背景,三条腿,背景人很多,倒着走", + # "ssim_threshold": 0.79 + # } ] MODEL_TO_PARAMS = { From 36dddbafca88f692fb0c7e5ae4bb501ad54ab394 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Mon, 14 Jul 2025 20:33:36 -0700 Subject: [PATCH 41/43] add comments --- examples/inference/lora/wan_lora_inference.py | 1 + 1 file changed, 1 insertion(+) diff --git a/examples/inference/lora/wan_lora_inference.py b/examples/inference/lora/wan_lora_inference.py index aae907e708..b96599e300 100644 --- a/examples/inference/lora/wan_lora_inference.py +++ b/examples/inference/lora/wan_lora_inference.py @@ -33,6 +33,7 @@ def main(): del generator # Until FSDP resharding bug is fixed, multi-lora requires reloading the model + # see https://github.com/pytorch/pytorch/issues/157209 generator = VideoGenerator.from_pretrained( "Wan-AI/Wan2.1-T2V-1.3B-Diffusers", num_gpus=1, From e8feddd2a471c5d39beb89577d23ed16ba9e1a28 Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Mon, 14 Jul 2025 20:53:09 -0700 Subject: [PATCH 42/43] fix test precision --- .../lora/test_lora_inference_similarity.py | 69 +++++++++---------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/fastvideo/v1/tests/inference/lora/test_lora_inference_similarity.py b/fastvideo/v1/tests/inference/lora/test_lora_inference_similarity.py index 89c2aa5462..82b7546882 100644 --- a/fastvideo/v1/tests/inference/lora/test_lora_inference_similarity.py +++ b/fastvideo/v1/tests/inference/lora/test_lora_inference_similarity.py @@ -58,10 +58,43 @@ "Wan-AI/Wan2.1-T2V-1.3B-Diffusers": WAN_LORA_PARAMS, } +@pytest.mark.parametrize("model_id", list(MODEL_TO_PARAMS.keys())) +def test_merge_lora_weights(model_id): + lora_config = LORA_CONFIGS[0] # test only one + hf_pipe = DiffusionPipeline.from_pretrained(model_id, torch_dtype=torch.bfloat16) + hf_pipe.enable_model_cpu_offload() + + lora_nickname = lora_config["lora_nickname"] + lora_path = lora_config["lora_path"] + args = FastVideoArgs.from_kwargs( + model_path=model_id, + use_cpu_offload=True, + dit_precision="bf16", + ) + pipe = build_pipeline(args) + pipe.set_lora_adapter(lora_nickname, lora_path) + custom_transformer = pipe.modules["transformer"] + custom_state_dict = custom_transformer.state_dict() + + hf_pipe.load_lora_weights(lora_path, adapter_name=lora_nickname) + for name, layer in hf_pipe.transformer.named_modules(): + if hasattr(layer, "unmerge"): + layer.unmerge() + layer.merge(adapter_names=[lora_nickname]) + + hf_transformer = hf_pipe.transformer + param_names_mapping = get_param_names_mapping(custom_transformer.param_names_mapping) + hf_state_dict, _ = hf_to_custom_state_dict(hf_transformer.state_dict(), param_names_mapping) + for key in hf_state_dict.keys(): + if "base_layer" not in key: + continue + hf_param = hf_state_dict[key] + custom_param = custom_state_dict[key].to_local() if isinstance(custom_state_dict[key], DTensor) else custom_state_dict[key] + assert_close(hf_param, custom_param, atol=7e-4, rtol=7e-4) @pytest.mark.parametrize("ATTENTION_BACKEND", ["TORCH_SDPA"]) @pytest.mark.parametrize("model_id", list(MODEL_TO_PARAMS.keys())) -def test_lora_switching_similarity(ATTENTION_BACKEND, model_id): +def test_lora_inference_similarity(ATTENTION_BACKEND, model_id): """ Test that runs LoRA inference with LoRA switching and compares the output to reference videos using SSIM. @@ -157,40 +190,6 @@ def test_lora_switching_similarity(ATTENTION_BACKEND, model_id): min_acceptable_ssim = lora_config["ssim_threshold"] assert mean_ssim >= min_acceptable_ssim, f"SSIM value {mean_ssim} is below threshold {min_acceptable_ssim} for adapter {lora_config['lora_path']}" -@pytest.mark.parametrize("model_id", list(MODEL_TO_PARAMS.keys())) -def test_merge_lora_weights(model_id): - lora_config = LORA_CONFIGS[0] # test only one - hf_pipe = DiffusionPipeline.from_pretrained(model_id) - hf_pipe.enable_model_cpu_offload() - - lora_nickname = lora_config["lora_nickname"] - lora_path = lora_config["lora_path"] - args = FastVideoArgs.from_kwargs( - model_path=model_id, - use_cpu_offload=True, - dit_precision="fp32", - ) - pipe = build_pipeline(args) - pipe.set_lora_adapter(lora_nickname, lora_path) - custom_transformer = pipe.modules["transformer"] - custom_state_dict = custom_transformer.state_dict() - - hf_pipe.load_lora_weights(lora_path, adapter_name=lora_nickname) - for name, layer in hf_pipe.transformer.named_modules(): - if hasattr(layer, "unmerge"): - layer.unmerge() - layer.merge(adapter_names=[lora_nickname]) - - hf_transformer = hf_pipe.transformer - param_names_mapping = get_param_names_mapping(custom_transformer.param_names_mapping) - hf_state_dict, _ = hf_to_custom_state_dict(hf_transformer.state_dict(), param_names_mapping) - for key in hf_state_dict.keys(): - if "base_layer" not in key: - continue - hf_param = hf_state_dict[key] - custom_param = custom_state_dict[key].to_local() if isinstance(custom_state_dict[key], DTensor) else custom_state_dict[key] - assert_close(hf_param, custom_param, atol=1e-4, rtol=1e-4) - From 289b5786108f96a94e3f95c4c15612a6be1812fd Mon Sep 17 00:00:00 2001 From: Edenzzzz Date: Tue, 15 Jul 2025 13:06:32 -0700 Subject: [PATCH 43/43] revert --- fastvideo/utils/collect_env.py | 1 + 1 file changed, 1 insertion(+) diff --git a/fastvideo/utils/collect_env.py b/fastvideo/utils/collect_env.py index cb796ad462..a0b4dc91f6 100644 --- a/fastvideo/utils/collect_env.py +++ b/fastvideo/utils/collect_env.py @@ -62,6 +62,7 @@ DEFAULT_CONDA_PATTERNS = { "torch", "numpy", + "mypy" "cudatoolkit", "soumith", "mkl",