From ff42f2f0a4bf335db0696050e2ce2520853a632a Mon Sep 17 00:00:00 2001 From: Jack Su Date: Fri, 1 Aug 2025 15:27:51 +0100 Subject: [PATCH 1/2] the original GPU github baseline --- .DS_Store | Bin 0 -> 8196 bytes CODE_OF_CONDUCT.md | 126 +++ CONTRIBUTING.md | 112 +++ Dockerfile | 121 +++ LICENSE | 201 +++++ MANIFEST.in | 3 + README.en.md | 99 ++- README.md | 98 ++- benchmarks/.DS_Store | Bin 0 -> 6148 bytes benchmarks/README.md | 120 +++ benchmarks/benchmark_random_load.sh | 102 +++ benchmarks/benchmark_utils.py | 129 +++ benchmarks/download_models.py | 99 +++ benchmarks/fio-config.ini | 14 + .../images/random_small_loading_latency.png | Bin 0 -> 100751 bytes benchmarks/plot.py | 152 ++++ .../facebook_opt-6.7b_phantom_30_random.json | 212 +++++ ...cebook_opt-6.7b_safetensors_30_random.json | 212 +++++ benchmarks/server-specs.md | 10 + benchmarks/test_loading.py | 106 +++ blogs/README.md | 1 + blogs/serverless-llm-architecture/README.md | 113 +++ .../images/arch_full.jpg | Bin 0 -> 684213 bytes .../images/arch_overview.jpg | Bin 0 -> 367465 bytes .../images/arch_step1.jpg | Bin 0 -> 432684 bytes .../images/arch_step2.jpg | Bin 0 -> 471769 bytes .../images/arch_step3.jpg | Bin 0 -> 541439 bytes .../images/load_model.jpg | Bin 0 -> 276084 bytes .../images/outlines1.png | Bin 0 -> 117407 bytes .../images/outlines2.png | Bin 0 -> 56650 bytes .../images/save_model.jpg | Bin 0 -> 213737 bytes .../images/sllm-store.jpg | Bin 0 -> 359863 bytes configs/.linkcheck.json | 28 + docs/.DS_Store | Bin 0 -> 6148 bytes docs/README.md | 39 + docs/api/cli.md | 323 +++++++ docs/api/intro.md | 9 + docs/api/sllm-store-cli.md | 242 ++++++ docs/images/favicon.ico | Bin 0 -> 46169 bytes docs/images/logo.svg | 302 +++++++ docs/images/serverlessllm.jpg | Bin 0 -> 102673 bytes docs/images/wechat.png | Bin 0 -> 7417 bytes docs/stable/.DS_Store | Bin 0 -> 6148 bytes docs/stable/community/_category_.json | 4 + docs/stable/community/meetups.md | 11 + docs/stable/community/talks.md | 8 + docs/stable/deployment/_category_.json | 4 + docs/stable/deployment/multi_machine.md | 296 +++++++ docs/stable/deployment/single_machine.md | 217 +++++ docs/stable/deployment/slurm_cluster.md | 411 +++++++++ docs/stable/developer/_category_.json | 4 + .../developer/supporting_a_new_hardware.md | 25 + docs/stable/features/_category_.json | 4 + docs/stable/features/live_migration.md | 211 +++++ docs/stable/features/peft_lora_serving.md | 116 +++ docs/stable/features/quantized_models.md | 175 ++++ .../features/storage_aware_scheduling.md | 123 +++ docs/stable/getting_started.md | 136 +++ docs/stable/intro.md | 38 + docs/stable/models/_category_.json | 4 + docs/stable/models/supported_models.md | 13 + docs/stable/store/_category_.json | 4 + docs/stable/store/quantization.md | 102 +++ docs/stable/store/quickstart.md | 245 ++++++ docs/stable/store/rocm_quickstart.md | 164 ++++ entrypoint.sh | 112 +++ examples/.DS_Store | Bin 0 -> 6148 bytes examples/docker/README.md | 35 + examples/docker/docker-compose.yml | 46 + examples/embedding/docker-compose.yml | 46 + .../embedding/transformers_backend_example.md | 107 +++ .../embedding/transformers_embed_config.json | 17 + examples/embedding/vllm_backend_example.md | 115 +++ examples/embedding/vllm_embed_config.json | 19 + examples/live_migration/README.md | 39 + examples/live_migration/config-qwen-1.5b.json | 27 + examples/live_migration/config-qwen-3b.json | 27 + examples/live_migration/docker-compose.yml | 70 ++ examples/live_migration/enable-migration.yml | 5 + .../config-opt-1.3b.json | 19 + .../config-opt-2.7b.json | 19 + .../docker-compose.yml | 70 ++ examples/windows_wsl/README.md | 155 ++++ py.typed | 0 pyproject.toml | 44 + requirements-lint.txt | 13 + requirements-test.txt | 2 + requirements-worker.txt | 12 + requirements.txt | 11 + setup.py | 87 ++ sllm/.DS_Store | Bin 0 -> 6148 bytes sllm/_cli_utils.py | 308 +++++++ sllm/cli/default_ft_config.json | 27 + sllm/cli/delete.py | 73 ++ sllm/cli/deploy.py | 212 +++++ sllm/cli/encode.py | 97 +++ sllm/cli/fine_tuning.py | 94 ++ sllm/cli/generate.py | 93 ++ sllm/cli/replay.py | 149 ++++ sllm/cli/sllm_cli.py | 66 ++ sllm/cli/status.py | 72 ++ sllm/cli/update.py | 85 ++ sllm/clic.py | 142 +++ sllm/default_config.json | 18 + sllm/serve/.DS_Store | Bin 0 -> 6148 bytes sllm/serve/__init__.py | 17 + sllm/serve/app_lib.py | 178 ++++ sllm/serve/backends/__init__.py | 22 + sllm/serve/backends/backend_utils.py | 67 ++ sllm/serve/backends/dummy_backend.py | 116 +++ sllm/serve/backends/transformers_backend.py | 633 ++++++++++++++ sllm/serve/backends/vllm_backend.py | 367 ++++++++ sllm/serve/commands/__init__.py | 17 + sllm/serve/commands/serve/__init__.py | 17 + sllm/serve/commands/serve/sllm_serve.py | 84 ++ sllm/serve/controller.py | 326 +++++++ sllm/serve/hardware_info_collector.py | 169 ++++ sllm/serve/inference_instance.py | 54 ++ sllm/serve/logger.py | 81 ++ sllm/serve/model_downloader.py | 246 ++++++ sllm/serve/routers/__init__.py | 22 + sllm/serve/routers/migration_router.py | 252 ++++++ sllm/serve/routers/roundrobin_router.py | 459 ++++++++++ sllm/serve/routers/router_utils.py | 60 ++ sllm/serve/schedulers/__init__.py | 22 + sllm/serve/schedulers/fcfs_scheduler.py | 203 +++++ sllm/serve/schedulers/scheduler_utils.py | 49 ++ .../schedulers/storage_aware_scheduler.py | 504 +++++++++++ sllm/serve/store_manager.py | 546 ++++++++++++ sllm/serve/utils.py | 101 +++ sllm_store/.DS_Store | Bin 0 -> 6148 bytes sllm_store/.gitignore | 166 ++++ sllm_store/CMakeLists.txt | 210 +++++ sllm_store/Dockerfile.builder | 60 ++ sllm_store/Dockerfile.rocm | 108 +++ sllm_store/MANIFEST.in | 6 + sllm_store/README.md | 31 + sllm_store/cmake/hipify.py | 78 ++ sllm_store/cmake/utils.cmake | 367 ++++++++ sllm_store/cpp_build.sh | 30 + sllm_store/csrc/.DS_Store | Bin 0 -> 6148 bytes sllm_store/csrc/checkpoint/aligned_buffer.cpp | 113 +++ sllm_store/csrc/checkpoint/aligned_buffer.h | 40 + sllm_store/csrc/checkpoint/checkpoint.cpp | 250 ++++++ sllm_store/csrc/checkpoint/checkpoint.h | 48 ++ sllm_store/csrc/checkpoint/checkpoint_py.cpp | 84 ++ sllm_store/csrc/checkpoint/progress_bar.h | 41 + sllm_store/csrc/checkpoint/tensor_writer.cpp | 49 ++ sllm_store/csrc/checkpoint/tensor_writer.h | 42 + sllm_store/csrc/sllm_store/binary_utils.cpp | 32 + sllm_store/csrc/sllm_store/binary_utils.h | 23 + .../csrc/sllm_store/checkpoint_store.cpp | 339 ++++++++ sllm_store/csrc/sllm_store/checkpoint_store.h | 107 +++ .../csrc/sllm_store/checkpoint_store_py.cpp | 83 ++ sllm_store/csrc/sllm_store/concurrent_queue.h | 65 ++ .../csrc/sllm_store/concurrent_vector.h | 89 ++ sllm_store/csrc/sllm_store/cuda_memory.cpp | 70 ++ sllm_store/csrc/sllm_store/cuda_memory.h | 44 + .../csrc/sllm_store/cuda_memory_pool.cpp | 102 +++ sllm_store/csrc/sllm_store/cuda_memory_pool.h | 43 + sllm_store/csrc/sllm_store/error_handling.h | 58 ++ sllm_store/csrc/sllm_store/gpu_replica.cpp | 36 + sllm_store/csrc/sllm_store/gpu_replica.h | 36 + sllm_store/csrc/sllm_store/memory_state.cpp | 40 + sllm_store/csrc/sllm_store/memory_state.h | 28 + sllm_store/csrc/sllm_store/model.cpp | 610 +++++++++++++ sllm_store/csrc/sllm_store/model.h | 92 ++ sllm_store/csrc/sllm_store/pinned_memory.cpp | 41 + sllm_store/csrc/sllm_store/pinned_memory.h | 44 + .../csrc/sllm_store/pinned_memory_pool.cpp | 100 +++ .../csrc/sllm_store/pinned_memory_pool.h | 42 + sllm_store/csrc/sllm_store/types_and_defs.h | 74 ++ sllm_store/examples/load_lora_adapter.py | 65 ++ .../load_quantized_transformers_model.py | 66 ++ .../examples/load_transformers_model.py | 48 ++ sllm_store/examples/load_vllm_model.py | 44 + sllm_store/examples/save_lora_adapter.py | 56 ++ .../examples/save_transformers_model.py | 37 + sllm_store/examples/save_vllm_model.py | 135 +++ sllm_store/proto/storage.proto | 94 ++ sllm_store/py.typed | 0 sllm_store/pyproject.toml | 39 + sllm_store/requirements-build.txt | 7 + sllm_store/requirements.txt | 8 + sllm_store/setup.py | 246 ++++++ sllm_store/sllm_store/__init__.py | 17 + sllm_store/sllm_store/cli.py | 484 +++++++++++ sllm_store/sllm_store/client.py | 157 ++++ sllm_store/sllm_store/device_map_utils.py | 309 +++++++ sllm_store/sllm_store/logger.py | 81 ++ sllm_store/sllm_store/proto/__init__.py | 17 + sllm_store/sllm_store/proto/storage.proto | 1 + sllm_store/sllm_store/proto/storage_pb2.py | 68 ++ .../sllm_store/proto/storage_pb2_grpc.py | 307 +++++++ sllm_store/sllm_store/server.py | 238 ++++++ sllm_store/sllm_store/torch.py | 162 ++++ sllm_store/sllm_store/transformers.py | 498 +++++++++++ sllm_store/sllm_store/utils.py | 349 ++++++++ sllm_store/tests/.DS_Store | Bin 0 -> 6148 bytes sllm_store/tests/cpp/CMakeLists.txt | 32 + sllm_store/tests/cpp/test_load_to_host.cpp | 98 +++ sllm_store/tests/cpp/test_pinned_memory.cpp | 194 +++++ sllm_store/tests/python/test_cli.py | 605 +++++++++++++ sllm_store/tests/python/test_save_lora.py | 78 ++ sllm_store/tests/python/test_save_model.py | 76 ++ .../tests/python/test_save_vllm_model.py | 114 +++ sllm_store/tests/python/test_utils.py | 129 +++ sllm_store/using_existing_torch.py | 20 + sllm_store/vllm_patch/check_patch.sh | 44 + sllm_store/vllm_patch/patch.sh | 51 ++ sllm_store/vllm_patch/remove_patch.sh | 40 + sllm_store/vllm_patch/sllm_load.patch | 426 +++++++++ tests/.DS_Store | Bin 0 -> 8196 bytes tests/__init__.py | 17 + .../backend_test/transformers_backend_test.py | 809 ++++++++++++++++++ tests/backend_test/vllm_backend_test.py | 275 ++++++ tests/cli_test/__init__.py | 0 tests/cli_test/delete_test.py | 122 +++ tests/cli_test/deploy_test.py | 273 ++++++ tests/cli_test/fine_tuning_test.py | 111 +++ tests/cli_test/generate_test.py | 107 +++ tests/cli_test/sllm_cli_test.py | 119 +++ tests/cli_test/status_test.py | 155 ++++ tests/cli_test/update_test.py | 94 ++ tests/conftest.py | 25 + tests/inference_test/inference_test.py | 47 + tests/inference_test/store_test.py | 76 ++ tests/inference_test/supported_models.json | 10 + tests/new_cli_test/test_delete.py | 63 ++ tests/new_cli_test/test_deploy.py | 135 +++ tests/new_cli_test/test_start.py | 39 + tests/new_cli_test/test_status.py | 61 ++ tests/quantize_test/quantize_test.py | 132 +++ tests/replay_test/README.md | 62 ++ tests/replay_test/convert_gsm8k.py | 64 ++ tests/replay_test/deploy_dummy_models.py | 112 +++ tests/replay_test/generate_random_workload.py | 77 ++ tests/utils.py | 30 + 238 files changed, 24761 insertions(+), 48 deletions(-) create mode 100644 .DS_Store create mode 100644 CODE_OF_CONDUCT.md create mode 100644 CONTRIBUTING.md create mode 100644 Dockerfile create mode 100644 LICENSE create mode 100644 MANIFEST.in create mode 100644 benchmarks/.DS_Store create mode 100644 benchmarks/README.md create mode 100644 benchmarks/benchmark_random_load.sh create mode 100644 benchmarks/benchmark_utils.py create mode 100644 benchmarks/download_models.py create mode 100644 benchmarks/fio-config.ini create mode 100644 benchmarks/images/random_small_loading_latency.png create mode 100644 benchmarks/plot.py create mode 100644 benchmarks/results/facebook_opt-6.7b_phantom_30_random.json create mode 100644 benchmarks/results/facebook_opt-6.7b_safetensors_30_random.json create mode 100644 benchmarks/server-specs.md create mode 100644 benchmarks/test_loading.py create mode 100644 blogs/README.md create mode 100644 blogs/serverless-llm-architecture/README.md create mode 100644 blogs/serverless-llm-architecture/images/arch_full.jpg create mode 100644 blogs/serverless-llm-architecture/images/arch_overview.jpg create mode 100644 blogs/serverless-llm-architecture/images/arch_step1.jpg create mode 100644 blogs/serverless-llm-architecture/images/arch_step2.jpg create mode 100644 blogs/serverless-llm-architecture/images/arch_step3.jpg create mode 100644 blogs/serverless-llm-architecture/images/load_model.jpg create mode 100644 blogs/serverless-llm-architecture/images/outlines1.png create mode 100644 blogs/serverless-llm-architecture/images/outlines2.png create mode 100644 blogs/serverless-llm-architecture/images/save_model.jpg create mode 100644 blogs/serverless-llm-architecture/images/sllm-store.jpg create mode 100644 configs/.linkcheck.json create mode 100644 docs/.DS_Store create mode 100644 docs/README.md create mode 100644 docs/api/cli.md create mode 100644 docs/api/intro.md create mode 100644 docs/api/sllm-store-cli.md create mode 100644 docs/images/favicon.ico create mode 100644 docs/images/logo.svg create mode 100644 docs/images/serverlessllm.jpg create mode 100644 docs/images/wechat.png create mode 100644 docs/stable/.DS_Store create mode 100644 docs/stable/community/_category_.json create mode 100644 docs/stable/community/meetups.md create mode 100644 docs/stable/community/talks.md create mode 100644 docs/stable/deployment/_category_.json create mode 100644 docs/stable/deployment/multi_machine.md create mode 100644 docs/stable/deployment/single_machine.md create mode 100644 docs/stable/deployment/slurm_cluster.md create mode 100644 docs/stable/developer/_category_.json create mode 100644 docs/stable/developer/supporting_a_new_hardware.md create mode 100644 docs/stable/features/_category_.json create mode 100644 docs/stable/features/live_migration.md create mode 100644 docs/stable/features/peft_lora_serving.md create mode 100644 docs/stable/features/quantized_models.md create mode 100644 docs/stable/features/storage_aware_scheduling.md create mode 100644 docs/stable/getting_started.md create mode 100644 docs/stable/intro.md create mode 100644 docs/stable/models/_category_.json create mode 100644 docs/stable/models/supported_models.md create mode 100644 docs/stable/store/_category_.json create mode 100644 docs/stable/store/quantization.md create mode 100644 docs/stable/store/quickstart.md create mode 100644 docs/stable/store/rocm_quickstart.md create mode 100755 entrypoint.sh create mode 100644 examples/.DS_Store create mode 100644 examples/docker/README.md create mode 100644 examples/docker/docker-compose.yml create mode 100644 examples/embedding/docker-compose.yml create mode 100644 examples/embedding/transformers_backend_example.md create mode 100644 examples/embedding/transformers_embed_config.json create mode 100644 examples/embedding/vllm_backend_example.md create mode 100644 examples/embedding/vllm_embed_config.json create mode 100644 examples/live_migration/README.md create mode 100644 examples/live_migration/config-qwen-1.5b.json create mode 100644 examples/live_migration/config-qwen-3b.json create mode 100644 examples/live_migration/docker-compose.yml create mode 100644 examples/live_migration/enable-migration.yml create mode 100644 examples/storage_aware_scheduling/config-opt-1.3b.json create mode 100644 examples/storage_aware_scheduling/config-opt-2.7b.json create mode 100644 examples/storage_aware_scheduling/docker-compose.yml create mode 100644 examples/windows_wsl/README.md create mode 100644 py.typed create mode 100644 pyproject.toml create mode 100644 requirements-lint.txt create mode 100644 requirements-test.txt create mode 100644 requirements-worker.txt create mode 100644 requirements.txt create mode 100644 setup.py create mode 100644 sllm/.DS_Store create mode 100644 sllm/_cli_utils.py create mode 100644 sllm/cli/default_ft_config.json create mode 100644 sllm/cli/delete.py create mode 100644 sllm/cli/deploy.py create mode 100644 sllm/cli/encode.py create mode 100644 sllm/cli/fine_tuning.py create mode 100644 sllm/cli/generate.py create mode 100644 sllm/cli/replay.py create mode 100644 sllm/cli/sllm_cli.py create mode 100644 sllm/cli/status.py create mode 100644 sllm/cli/update.py create mode 100644 sllm/clic.py create mode 100644 sllm/default_config.json create mode 100644 sllm/serve/.DS_Store create mode 100644 sllm/serve/__init__.py create mode 100644 sllm/serve/app_lib.py create mode 100644 sllm/serve/backends/__init__.py create mode 100644 sllm/serve/backends/backend_utils.py create mode 100644 sllm/serve/backends/dummy_backend.py create mode 100644 sllm/serve/backends/transformers_backend.py create mode 100644 sllm/serve/backends/vllm_backend.py create mode 100644 sllm/serve/commands/__init__.py create mode 100644 sllm/serve/commands/serve/__init__.py create mode 100644 sllm/serve/commands/serve/sllm_serve.py create mode 100644 sllm/serve/controller.py create mode 100644 sllm/serve/hardware_info_collector.py create mode 100644 sllm/serve/inference_instance.py create mode 100644 sllm/serve/logger.py create mode 100644 sllm/serve/model_downloader.py create mode 100644 sllm/serve/routers/__init__.py create mode 100644 sllm/serve/routers/migration_router.py create mode 100644 sllm/serve/routers/roundrobin_router.py create mode 100644 sllm/serve/routers/router_utils.py create mode 100644 sllm/serve/schedulers/__init__.py create mode 100644 sllm/serve/schedulers/fcfs_scheduler.py create mode 100644 sllm/serve/schedulers/scheduler_utils.py create mode 100644 sllm/serve/schedulers/storage_aware_scheduler.py create mode 100644 sllm/serve/store_manager.py create mode 100644 sllm/serve/utils.py create mode 100644 sllm_store/.DS_Store create mode 100644 sllm_store/.gitignore create mode 100644 sllm_store/CMakeLists.txt create mode 100644 sllm_store/Dockerfile.builder create mode 100644 sllm_store/Dockerfile.rocm create mode 100644 sllm_store/MANIFEST.in create mode 100644 sllm_store/README.md create mode 100755 sllm_store/cmake/hipify.py create mode 100644 sllm_store/cmake/utils.cmake create mode 100644 sllm_store/cpp_build.sh create mode 100644 sllm_store/csrc/.DS_Store create mode 100644 sllm_store/csrc/checkpoint/aligned_buffer.cpp create mode 100644 sllm_store/csrc/checkpoint/aligned_buffer.h create mode 100644 sllm_store/csrc/checkpoint/checkpoint.cpp create mode 100644 sllm_store/csrc/checkpoint/checkpoint.h create mode 100644 sllm_store/csrc/checkpoint/checkpoint_py.cpp create mode 100644 sllm_store/csrc/checkpoint/progress_bar.h create mode 100644 sllm_store/csrc/checkpoint/tensor_writer.cpp create mode 100644 sllm_store/csrc/checkpoint/tensor_writer.h create mode 100644 sllm_store/csrc/sllm_store/binary_utils.cpp create mode 100644 sllm_store/csrc/sllm_store/binary_utils.h create mode 100644 sllm_store/csrc/sllm_store/checkpoint_store.cpp create mode 100644 sllm_store/csrc/sllm_store/checkpoint_store.h create mode 100644 sllm_store/csrc/sllm_store/checkpoint_store_py.cpp create mode 100644 sllm_store/csrc/sllm_store/concurrent_queue.h create mode 100644 sllm_store/csrc/sllm_store/concurrent_vector.h create mode 100644 sllm_store/csrc/sllm_store/cuda_memory.cpp create mode 100644 sllm_store/csrc/sllm_store/cuda_memory.h create mode 100644 sllm_store/csrc/sllm_store/cuda_memory_pool.cpp create mode 100644 sllm_store/csrc/sllm_store/cuda_memory_pool.h create mode 100644 sllm_store/csrc/sllm_store/error_handling.h create mode 100644 sllm_store/csrc/sllm_store/gpu_replica.cpp create mode 100644 sllm_store/csrc/sllm_store/gpu_replica.h create mode 100644 sllm_store/csrc/sllm_store/memory_state.cpp create mode 100644 sllm_store/csrc/sllm_store/memory_state.h create mode 100644 sllm_store/csrc/sllm_store/model.cpp create mode 100644 sllm_store/csrc/sllm_store/model.h create mode 100644 sllm_store/csrc/sllm_store/pinned_memory.cpp create mode 100644 sllm_store/csrc/sllm_store/pinned_memory.h create mode 100644 sllm_store/csrc/sllm_store/pinned_memory_pool.cpp create mode 100644 sllm_store/csrc/sllm_store/pinned_memory_pool.h create mode 100644 sllm_store/csrc/sllm_store/types_and_defs.h create mode 100644 sllm_store/examples/load_lora_adapter.py create mode 100644 sllm_store/examples/load_quantized_transformers_model.py create mode 100644 sllm_store/examples/load_transformers_model.py create mode 100644 sllm_store/examples/load_vllm_model.py create mode 100644 sllm_store/examples/save_lora_adapter.py create mode 100644 sllm_store/examples/save_transformers_model.py create mode 100644 sllm_store/examples/save_vllm_model.py create mode 100644 sllm_store/proto/storage.proto create mode 100644 sllm_store/py.typed create mode 100644 sllm_store/pyproject.toml create mode 100644 sllm_store/requirements-build.txt create mode 100644 sllm_store/requirements.txt create mode 100644 sllm_store/setup.py create mode 100644 sllm_store/sllm_store/__init__.py create mode 100644 sllm_store/sllm_store/cli.py create mode 100644 sllm_store/sllm_store/client.py create mode 100644 sllm_store/sllm_store/device_map_utils.py create mode 100644 sllm_store/sllm_store/logger.py create mode 100644 sllm_store/sllm_store/proto/__init__.py create mode 120000 sllm_store/sllm_store/proto/storage.proto create mode 100644 sllm_store/sllm_store/proto/storage_pb2.py create mode 100644 sllm_store/sllm_store/proto/storage_pb2_grpc.py create mode 100644 sllm_store/sllm_store/server.py create mode 100644 sllm_store/sllm_store/torch.py create mode 100644 sllm_store/sllm_store/transformers.py create mode 100644 sllm_store/sllm_store/utils.py create mode 100644 sllm_store/tests/.DS_Store create mode 100644 sllm_store/tests/cpp/CMakeLists.txt create mode 100644 sllm_store/tests/cpp/test_load_to_host.cpp create mode 100644 sllm_store/tests/cpp/test_pinned_memory.cpp create mode 100644 sllm_store/tests/python/test_cli.py create mode 100644 sllm_store/tests/python/test_save_lora.py create mode 100644 sllm_store/tests/python/test_save_model.py create mode 100644 sllm_store/tests/python/test_save_vllm_model.py create mode 100644 sllm_store/tests/python/test_utils.py create mode 100644 sllm_store/using_existing_torch.py create mode 100755 sllm_store/vllm_patch/check_patch.sh create mode 100755 sllm_store/vllm_patch/patch.sh create mode 100755 sllm_store/vllm_patch/remove_patch.sh create mode 100644 sllm_store/vllm_patch/sllm_load.patch create mode 100644 tests/.DS_Store create mode 100644 tests/__init__.py create mode 100644 tests/backend_test/transformers_backend_test.py create mode 100644 tests/backend_test/vllm_backend_test.py create mode 100644 tests/cli_test/__init__.py create mode 100644 tests/cli_test/delete_test.py create mode 100644 tests/cli_test/deploy_test.py create mode 100644 tests/cli_test/fine_tuning_test.py create mode 100644 tests/cli_test/generate_test.py create mode 100644 tests/cli_test/sllm_cli_test.py create mode 100644 tests/cli_test/status_test.py create mode 100644 tests/cli_test/update_test.py create mode 100644 tests/conftest.py create mode 100644 tests/inference_test/inference_test.py create mode 100644 tests/inference_test/store_test.py create mode 100644 tests/inference_test/supported_models.json create mode 100644 tests/new_cli_test/test_delete.py create mode 100644 tests/new_cli_test/test_deploy.py create mode 100644 tests/new_cli_test/test_start.py create mode 100644 tests/new_cli_test/test_status.py create mode 100644 tests/quantize_test/quantize_test.py create mode 100644 tests/replay_test/README.md create mode 100644 tests/replay_test/convert_gsm8k.py create mode 100644 tests/replay_test/deploy_dummy_models.py create mode 100644 tests/replay_test/generate_random_workload.py create mode 100644 tests/utils.py diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..7b13b55343ac6d916719422b3a964fe447137315 GIT binary patch literal 8196 zcmeHMJ#Q015S_i870WbKC>7jKND2@Q(h-bAL6;u@_#+A6EptCiwvV?z?YKUKZy+Ty4jWei=L6mHFqGk~-iyp`3PT7O=bc>2v6noLLOFEWrn@x`6kV$$B#$q>XC;rNc_f#1RKUk=k}-|IXSk$Bd~gCL zl}~bbf4Sly{0k+T{6XH%98+Vb9@8T{=gDY_^%yVZr`bvqM)J7w>fE9KoYdx$YWxTn z@G|SnE5=i&30_(7=~y|vAbpa@*XVh<58f}g1|Lg6~|1C%dRX`Q^Hx)2(f2+TV_vUNs+PmahJ3+sV q&W&+}vo-_+L-@We$6>2K3~`-!U+Qh)EIerXL%_: + +(optional) + +``` +- **Type**: Choose from `build`, `ci`, `docs`, `feat`, `fix`, `perf`, `refactor`, `test`, `chore`. +- **Summary**: A brief description of the change. +- **Body**: Mandatory for all commits except those of type "docs". Must be at least 20 characters long. + + +Examples: + +``` +feat: add logging in sllm worker +``` + +``` +docs: add new example for serving vision model + +Vision mode: xxx +Implemented xxx in `xxx.py` +``` + +For more details, read the [Angular Commit Format](https://github.com/angular/angular/blob/main/CONTRIBUTING.md#-commit-message-format). diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..82a3bf3 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,121 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # + +# Adapted from https://github.com/vllm-project/vllm/blob/23c1b10a4c8cd77c5b13afa9242d67ffd055296b/Dockerfile +ARG CUDA_VERSION=12.1.1 +#################### BASE BUILD IMAGE #################### +# prepare basic build environment +FROM nvidia/cuda:${CUDA_VERSION}-devel-ubuntu20.04 AS builder +ARG CUDA_VERSION=12.1.1 +ARG PYTHON_VERSION=3.10 +ARG TARGETPLATFORM +ENV DEBIAN_FRONTEND=noninteractive + +# Install Python and other dependencies +RUN echo 'tzdata tzdata/Areas select America' | debconf-set-selections \ + && echo 'tzdata tzdata/Zones/America select Los_Angeles' | debconf-set-selections \ + && apt-get update -y \ + && apt-get install -y ccache software-properties-common git curl sudo \ + && add-apt-repository ppa:deadsnakes/ppa \ + && apt-get update -y \ + && apt-get install -y python${PYTHON_VERSION} python${PYTHON_VERSION}-dev python${PYTHON_VERSION}-venv \ + && update-alternatives --install /usr/bin/python3 python3 /usr/bin/python${PYTHON_VERSION} 1 \ + && update-alternatives --set python3 /usr/bin/python${PYTHON_VERSION} \ + && ln -sf /usr/bin/python${PYTHON_VERSION}-config /usr/bin/python3-config \ + && curl -sS https://bootstrap.pypa.io/get-pip.py | python${PYTHON_VERSION} \ + && python3 --version && python3 -m pip --version + +# Set the working directory +WORKDIR /app + +# Build checkpoint store +ENV TORCH_CUDA_ARCH_LIST="8.0 8.6 8.9 9.0" +COPY sllm_store/requirements-build.txt /app/sllm_store/requirements-build.txt +RUN cd sllm_store && \ + pip install -r requirements-build.txt && \ + pip install setuptools wheel + +COPY sllm_store/cmake /app/sllm_store/cmake +COPY sllm_store/CMakeLists.txt /app/sllm_store/CMakeLists.txt +COPY sllm_store/csrc /app/sllm_store/csrc +COPY sllm_store/sllm_store /app/sllm_store/sllm_store +COPY sllm_store/setup.py /app/sllm_store/setup.py +COPY sllm_store/pyproject.toml /app/sllm_store/pyproject.toml +COPY sllm_store/MANIFEST.in /app/sllm_store/MANIFEST.in +COPY sllm_store/requirements.txt /app/sllm_store/requirements.txt +COPY sllm_store/README.md /app/sllm_store/README.md +COPY sllm_store/proto/storage.proto /app/sllm_store/proto/storage.proto +RUN cd sllm_store && python3 setup.py bdist_wheel + +COPY requirements.txt requirements-worker.txt /app/ +COPY pyproject.toml setup.py py.typed /app/ +COPY sllm/serve /app/sllm/serve +COPY sllm/cli /app/sllm/cli +COPY README.md /app/ +RUN python3 setup.py bdist_wheel + +# Stage 2: Runner with conda environments +FROM pytorch/pytorch:2.3.0-cuda12.1-cudnn8-devel + +# Set non-interactive installation +ENV DEBIAN_FRONTEND=noninteractive \ + PYTHONUNBUFFERED=1 \ + PYTHONDONTWRITEBYTECODE=1 + +# Set the working directory +WORKDIR /app + +# Create conda environments for head and worker +RUN conda create -n head python=3.10 -y && \ + conda create -n worker python=3.10 -y + +RUN conda run -n head pip install -U pip +RUN conda run -n worker pip install -U pip + +# Copy requirements files +COPY requirements.txt /app/ + +RUN conda run -n head pip install -r /app/requirements.txt +COPY requirements-worker.txt /app/ + +RUN conda run -n worker pip install -r /app/requirements-worker.txt + +# Copy vllm patch for worker +COPY sllm_store/vllm_patch /app/vllm_patch + +# Copy the built wheels from the builder +COPY --from=builder /app/sllm_store/dist /app/sllm_store/dist +COPY --from=builder /app/dist /app/dist + +# Install packages in head environment +RUN conda run -n head pip install /app/sllm_store/dist/*.whl && \ + conda run -n head pip install /app/dist/*.whl + +# Install packages in worker environment +RUN conda run -n worker pip install /app/sllm_store/dist/*.whl && \ + conda run -n worker pip install /app/dist/*.whl + +# Apply vLLM patch in worker environment +RUN conda run -n worker bash -c "cd /app && ./vllm_patch/patch.sh" + +# Copy the entrypoint +COPY entrypoint.sh . +RUN chmod +x entrypoint.sh + +# Set the entrypoint directly to the entrypoint script +ENTRYPOINT ["/app/entrypoint.sh"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..29c75df --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [2024] [ServerlessLLM Team] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..15bfe5d --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,3 @@ +include LICENSE +include requirements.txt +include requirements-worker.txt \ No newline at end of file diff --git a/README.en.md b/README.en.md index 7c33233..cc01193 100644 --- a/README.en.md +++ b/README.en.md @@ -1,36 +1,87 @@ +

+ + ServerlessLLM + +

+ +

+| Documentation | Paper | Discord | WeChat | + +

+ # ServerlessLLM -#### Description -ServerlessLLM is a distributed model deployment system that supports efficient multi-checkpoint saving, offering fast cold starts and serverless deployment capabilities +ServerlessLLM (`sllm`, pronounced "slim") is an open-source serverless framework designed to make custom and elastic LLM deployment easy, fast, and affordable. As LLMs grow in size and complexity, deploying them on AI hardware has become increasingly costly and technically challenging, limiting custom LLM deployment to only a select few. ServerlessLLM solves these challenges with a full-stack, LLM-centric serverless system design, optimizing everything from checkpoint formats and inference runtimes to the storage layer and cluster scheduler. + +Curious about how it works under the hood? Check out our [System Walkthrough](https://github.com/ServerlessLLM/ServerlessLLM/tree/main/blogs/serverless-llm-architecture) for a deep dive into the technical design—perfect if you're exploring your own research or building with ServerlessLLM. + +## News + +- **[03/25]** We're excited to share that we'll be giving a ServerlessLLM tutorial at the SESAME workshop, co-located with ASPLOS/EuroSys 2025 in Rotterdam, Netherlands, on March 31. [Slides](https://docs.google.com/presentation/d/1ioGCVpsg0x3oCxX19EiE820aMiY22X5MG6jgImZ1W18/edit?usp=sharing) | [More info](https://sesame25.github.io/) +- **[11/24]** We have added experimental support of fast checkpoint loading for AMD GPUs (ROCm) when using with vLLM, PyTorch and HuggingFace Accelerate. Please refer to the [documentation](https://serverlessllm.github.io/docs/stable/store/rocm_quickstart) for more details. +- **[10/24]** ServerlessLLM was invited to present at a global AI tech vision forum in Singapore. +- **[10/24]** We hosted the first ServerlessLLM developer meetup in Edinburgh, attracting over 50 attendees both offline and online. Together, we brainstormed many exciting new features to develop. If you have great ideas, we’d love for you to join us! +- **[10/24]** We made the first public release of ServerlessLLM. Check out the details of the release [here](https://github.com/ServerlessLLM/ServerlessLLM/releases/tag/v0.5.0). +- **[09/24]** ServerlessLLM now supports embedding-based RAG + LLM deployment. We’re preparing a blog and demo—stay tuned! +- **[08/24]** ServerlessLLM added support for vLLM. +- **[07/24]** We presented ServerlessLLM at Nvidia's headquarters. +- **[06/24]** ServerlessLLM officially went public. + +## Goals + +ServerlessLLM is designed to support multiple LLMs in efficiently sharing limited AI hardware and dynamically switching between them on demand, which can increase hardware utilization and reduce the cost of LLM services. This multi-LLM scenario, commonly referred to as Serverless, is highly sought after by AI practitioners, as seen in solutions like [Serverless Inference](https://docs.aws.amazon.com/sagemaker/latest/dg/serverless-endpoints.html), [Inference Endpoints](https://huggingface.co/inference-endpoints/dedicated), and [Model Endpoints](https://learn.microsoft.com/en-us/azure/machine-learning/concept-endpoints?view=azureml-api-2). However, these existing offerings often face performance overhead and scalability challenges, which ServerlessLLM effectively addresses through three key capabilities: + +**ServerlessLLM is Fast**: +- Supports leading LLM inference libraries like [vLLM](https://github.com/vllm-project/vllm) and [HuggingFace Transformers](https://huggingface.co/docs/transformers/en/index). Through vLLM, ServerlessLLM can support various types of AI hardware (summarized by vLLM at [here](https://docs.vllm.ai/en/stable/getting_started/installation.html)) +- Achieves 5-10X faster loading speeds compared to [Safetensors](https://github.com/huggingface/safetensors) and the PyTorch Checkpoint Loader. +- Features an optimized model loading scheduler, offering 5-100X lower start-up latency than [Ray Serve](https://docs.ray.io/en/latest/serve/index.html) and [KServe](https://github.com/kserve/kserve). + +**ServerlessLLM is Cost-Efficient**: +- Allows multiple LLM models to share GPUs with minimal model switching overhead and supports seamless inference live migration. +- Maximizes the use of local storage on multi-GPU servers, reducing the need for expensive storage servers and excessive network bandwidth. + +**ServerlessLLM is Easy-to-Use**: +- Simplifies deployment through [Ray Cluster](https://docs.ray.io/en/latest/cluster/getting-started.html) and [Kubernetes](https://kubernetes.io/) via [KubeRay](https://github.com/ray-project/kuberay). +- Supports seamless deployment of [HuggingFace Transformers](https://huggingface.co/docs/transformers/en/index) and custom LLM models. +- Supports NVIDIA and AMD GPUs +- Easily integrates with the [OpenAI Query API](https://platform.openai.com/docs/overview). + +## Getting Started + +1. Install ServerlessLLM with pip or [from source](https://serverlessllm.github.io/docs/stable/deployment/single_machine#installation). + +```bash +conda create -n sllm python=3.10 -y +conda activate sllm +pip install serverless-llm +``` + +2. Start a local ServerlessLLM cluster using the [Quick Start Guide](https://serverlessllm.github.io/docs/stable/getting_started). -#### Software Architecture -Software architecture description +3. Want to try fast checkpoint loading in your own code? Check out the [ServerlessLLM Store Guide](https://serverlessllm.github.io/docs/stable/store/quickstart). -#### Installation +## Documentation -1. xxxx -2. xxxx -3. xxxx +To install ServerlessLLM, please follow the steps outlined in our [documentation](https://serverlessllm.github.io). ServerlessLLM also offers Python APIs for loading and unloading checkpoints, as well as CLI tools to launch an LLM cluster. Both the CLI tools and APIs are demonstrated in the documentation. -#### Instructions +## Benchmark -1. xxxx -2. xxxx -3. xxxx +Benchmark results for ServerlessLLM can be found [here](./benchmarks/README.md). -#### Contribution +## Community -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request +ServerlessLLM is maintained by a global team of over 10 developers, and this number is growing. If you're interested in learning more or getting involved, we invite you to join our community on [Discord](https://discord.gg/AEF8Gduvm8) and [WeChat](./docs/images/wechat.png). Share your ideas, ask questions, and contribute to the development of ServerlessLLM. For becoming a contributor, please refer to our [Contributor Guide](./CONTRIBUTING.md). +## Citation -#### Gitee Feature +If you use ServerlessLLM for your research, please cite our [paper](https://arxiv.org/abs/2401.14351): -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +```bibtex +@inproceedings{fu2024serverlessllm, + title={ServerlessLLM: Low-Latency Serverless Inference for Large Language Models}, + author={Fu, Yao and Xue, Leyang and Huang, Yeqi and Brabete, Andrei-Octavian and Ustiugov, Dmitrii and Patel, Yuvraj and Mai, Luo}, + booktitle={18th USENIX Symposium on Operating Systems Design and Implementation (OSDI 24)}, + pages={135--153}, + year={2024} +} +``` diff --git a/README.md b/README.md index 07adb89..cc01193 100644 --- a/README.md +++ b/README.md @@ -1,37 +1,87 @@ +

+ + ServerlessLLM + +

+ +

+| Documentation | Paper | Discord | WeChat | + +

+ # ServerlessLLM -#### 介绍 -ServerlessLLM is a distributed model deployment system that supports efficient multi-checkpoint saving, offering fast cold starts and serverless deployment capabilities +ServerlessLLM (`sllm`, pronounced "slim") is an open-source serverless framework designed to make custom and elastic LLM deployment easy, fast, and affordable. As LLMs grow in size and complexity, deploying them on AI hardware has become increasingly costly and technically challenging, limiting custom LLM deployment to only a select few. ServerlessLLM solves these challenges with a full-stack, LLM-centric serverless system design, optimizing everything from checkpoint formats and inference runtimes to the storage layer and cluster scheduler. + +Curious about how it works under the hood? Check out our [System Walkthrough](https://github.com/ServerlessLLM/ServerlessLLM/tree/main/blogs/serverless-llm-architecture) for a deep dive into the technical design—perfect if you're exploring your own research or building with ServerlessLLM. + +## News + +- **[03/25]** We're excited to share that we'll be giving a ServerlessLLM tutorial at the SESAME workshop, co-located with ASPLOS/EuroSys 2025 in Rotterdam, Netherlands, on March 31. [Slides](https://docs.google.com/presentation/d/1ioGCVpsg0x3oCxX19EiE820aMiY22X5MG6jgImZ1W18/edit?usp=sharing) | [More info](https://sesame25.github.io/) +- **[11/24]** We have added experimental support of fast checkpoint loading for AMD GPUs (ROCm) when using with vLLM, PyTorch and HuggingFace Accelerate. Please refer to the [documentation](https://serverlessllm.github.io/docs/stable/store/rocm_quickstart) for more details. +- **[10/24]** ServerlessLLM was invited to present at a global AI tech vision forum in Singapore. +- **[10/24]** We hosted the first ServerlessLLM developer meetup in Edinburgh, attracting over 50 attendees both offline and online. Together, we brainstormed many exciting new features to develop. If you have great ideas, we’d love for you to join us! +- **[10/24]** We made the first public release of ServerlessLLM. Check out the details of the release [here](https://github.com/ServerlessLLM/ServerlessLLM/releases/tag/v0.5.0). +- **[09/24]** ServerlessLLM now supports embedding-based RAG + LLM deployment. We’re preparing a blog and demo—stay tuned! +- **[08/24]** ServerlessLLM added support for vLLM. +- **[07/24]** We presented ServerlessLLM at Nvidia's headquarters. +- **[06/24]** ServerlessLLM officially went public. + +## Goals + +ServerlessLLM is designed to support multiple LLMs in efficiently sharing limited AI hardware and dynamically switching between them on demand, which can increase hardware utilization and reduce the cost of LLM services. This multi-LLM scenario, commonly referred to as Serverless, is highly sought after by AI practitioners, as seen in solutions like [Serverless Inference](https://docs.aws.amazon.com/sagemaker/latest/dg/serverless-endpoints.html), [Inference Endpoints](https://huggingface.co/inference-endpoints/dedicated), and [Model Endpoints](https://learn.microsoft.com/en-us/azure/machine-learning/concept-endpoints?view=azureml-api-2). However, these existing offerings often face performance overhead and scalability challenges, which ServerlessLLM effectively addresses through three key capabilities: + +**ServerlessLLM is Fast**: +- Supports leading LLM inference libraries like [vLLM](https://github.com/vllm-project/vllm) and [HuggingFace Transformers](https://huggingface.co/docs/transformers/en/index). Through vLLM, ServerlessLLM can support various types of AI hardware (summarized by vLLM at [here](https://docs.vllm.ai/en/stable/getting_started/installation.html)) +- Achieves 5-10X faster loading speeds compared to [Safetensors](https://github.com/huggingface/safetensors) and the PyTorch Checkpoint Loader. +- Features an optimized model loading scheduler, offering 5-100X lower start-up latency than [Ray Serve](https://docs.ray.io/en/latest/serve/index.html) and [KServe](https://github.com/kserve/kserve). + +**ServerlessLLM is Cost-Efficient**: +- Allows multiple LLM models to share GPUs with minimal model switching overhead and supports seamless inference live migration. +- Maximizes the use of local storage on multi-GPU servers, reducing the need for expensive storage servers and excessive network bandwidth. + +**ServerlessLLM is Easy-to-Use**: +- Simplifies deployment through [Ray Cluster](https://docs.ray.io/en/latest/cluster/getting-started.html) and [Kubernetes](https://kubernetes.io/) via [KubeRay](https://github.com/ray-project/kuberay). +- Supports seamless deployment of [HuggingFace Transformers](https://huggingface.co/docs/transformers/en/index) and custom LLM models. +- Supports NVIDIA and AMD GPUs +- Easily integrates with the [OpenAI Query API](https://platform.openai.com/docs/overview). + +## Getting Started + +1. Install ServerlessLLM with pip or [from source](https://serverlessllm.github.io/docs/stable/deployment/single_machine#installation). + +```bash +conda create -n sllm python=3.10 -y +conda activate sllm +pip install serverless-llm +``` -#### 软件架构 -软件架构说明 +2. Start a local ServerlessLLM cluster using the [Quick Start Guide](https://serverlessllm.github.io/docs/stable/getting_started). +3. Want to try fast checkpoint loading in your own code? Check out the [ServerlessLLM Store Guide](https://serverlessllm.github.io/docs/stable/store/quickstart). -#### 安装教程 +## Documentation -1. xxxx -2. xxxx -3. xxxx +To install ServerlessLLM, please follow the steps outlined in our [documentation](https://serverlessllm.github.io). ServerlessLLM also offers Python APIs for loading and unloading checkpoints, as well as CLI tools to launch an LLM cluster. Both the CLI tools and APIs are demonstrated in the documentation. -#### 使用说明 +## Benchmark -1. xxxx -2. xxxx -3. xxxx +Benchmark results for ServerlessLLM can be found [here](./benchmarks/README.md). -#### 参与贡献 +## Community -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request +ServerlessLLM is maintained by a global team of over 10 developers, and this number is growing. If you're interested in learning more or getting involved, we invite you to join our community on [Discord](https://discord.gg/AEF8Gduvm8) and [WeChat](./docs/images/wechat.png). Share your ideas, ask questions, and contribute to the development of ServerlessLLM. For becoming a contributor, please refer to our [Contributor Guide](./CONTRIBUTING.md). +## Citation -#### 特技 +If you use ServerlessLLM for your research, please cite our [paper](https://arxiv.org/abs/2401.14351): -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 -5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +```bibtex +@inproceedings{fu2024serverlessllm, + title={ServerlessLLM: Low-Latency Serverless Inference for Large Language Models}, + author={Fu, Yao and Xue, Leyang and Huang, Yeqi and Brabete, Andrei-Octavian and Ustiugov, Dmitrii and Patel, Yuvraj and Mai, Luo}, + booktitle={18th USENIX Symposium on Operating Systems Design and Implementation (OSDI 24)}, + pages={135--153}, + year={2024} +} +``` diff --git a/benchmarks/.DS_Store b/benchmarks/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..3ca77a83b7a955cad35c25dae697b1e570f8ca07 GIT binary patch literal 6148 zcmeHKOHRW;47E!IL2SBYg@z;a2B8Wk=mj7Y6{JL|fbLk#7B+ALj>Ac~1S_7$R>_Bo z9YU2YdEUfhPn?%%91{`G){808gorYz;OG#;4)_#} t)&}SWR7Cuu;wA)>REps%rT7?{1oj{kU~U){VS)IMK%&71XW&m6_yS{jPpAL@ literal 0 HcmV?d00001 diff --git a/benchmarks/README.md b/benchmarks/README.md new file mode 100644 index 0000000..eb92562 --- /dev/null +++ b/benchmarks/README.md @@ -0,0 +1,120 @@ +# Benchmarking for ServerlessLLM Store + +Welcome to the benchmarking suite for ServerlessLLM Store. This suite is designed to measure the model loading performance of ServerlessLLM Store and compare it against several baselines on a variety of State-of-the-Art Large Language Models (LLMs). + +## Table of Contents + +- [Hardware Requirements](#hardware-requirements) +- [Prerequisites](#prerequisites) +- [Setting Up the Environment](#setting-up-the-environment) +- [Running the Benchmarks](#running-the-benchmarks) + - [1. Random Multi-Model Load Test](#1-random-multi-model-load-test) + - [1.1 Small Models](#11-small-models) + - [1.2 Large Models](#12-large-models) +- [Contact](#contact) + +## Hardware Requirements + +To ensure optimal performance and reliability of the ServerlessLLM Store benchmarking tests, we recommend the following hardware setup: + +- **RAM:** A minimum of 32GB is required for small model tests. For large model tests, at least 150GB of RAM is recommended to effectively manage the pinned memory pool utilized by the ServerlessLLM Store server. + +- **GPU:** An NVIDIA GPU with at least 24GB of VRAM is necessary for small model tests. For large model tests, a setup with at least 160GB of available VRAM is essential to handle the extensive model parameters. + +- **Storage:** A minimum of 500GB of disk space is required for small model tests, while at least 1.5TB is necessary for large model tests. Utilizing an NVMe SSD is highly recommended for its superior bandwidth, which is critical for optimizing ServerlessLLM Store's performance. + +The specifications used to obtain the following benchmark results are detailed in [this document](./server-specs.md). + + +## Prerequisites + +Before running the benchmarks, ensure the following dependencies are installed: + +```bash +pip install seaborn matplotlib pandas sentencepiece +``` + +Additionally, you will need to log in to the Hugging Face CLI to enable loading models such as meta-llama/Meta-Llama-3-8B: + +```bash +huggingface-cli login +``` + +## Setting Up the Environment + +Create a directory to store the models and establish a symbolic link to it. We highly recommend using a fast storage device such as an NVMe SSD to store the models: +```bash +mkdir /mnt/raid0nvme1/models +ln -s /mnt/raid0nvme1/models models +``` + +Optionally, you can install the Flexible I/O Tester (FIO) to benchmark the storage device's performance: +```bash +apt install fio +fio fio-config.ini +``` + +## Running the Benchmarks + +### 1. Random Multi-Model Load Test + +The random load test emulates **model serving scenarios** (such as Serverless LLM Inference), where a variety of different models are requested in random order, simulating a real-world use case. + +#### 1.1 Small Models + +Start the ServerlessLLM Store server with a 18GB memory pool: + +```bash +sllm-store start --chunk-size=16MB --mem-pool-size=18GB --num-thread=4 --storage-path=./models +``` + +In a separate terminal, run the following commands to benchmark the loading performance of several small models. We repeat each test 30 times to ensure statistical stability: +```bash +CUDA_VISIBLE_DEVICES=0 bash benchmark_random_load.sh facebook/opt-6.7b ./models 30 +CUDA_VISIBLE_DEVICES=0 bash benchmark_random_load.sh meta-llama/Meta-Llama-3-8B ./models 30 +CUDA_VISIBLE_DEVICES=0 bash benchmark_random_load.sh mistralai/Mistral-7B-v0.3 ./models 30 +CUDA_VISIBLE_DEVICES=0 bash benchmark_random_load.sh google/gemma-7b ./models 30 +``` + +Plot the results with the following command, saving the output for review and documentation: + +```bash +python plot.py --models facebook/opt-6.7b meta-llama/Meta-Llama-3-8B mistralai/Mistral-7B-v0.3 google/gemma-7b \ +--test-name random --num-repeats 30 --results-dir results --output-file images/random_small_loading_latency.png +``` + +Here is an example of the output visualization: + +![Random Small Loading Latency](images/random_small_loading_latency.png) + +#### 1.2 Large Models + +Restart the ServerlessLLM Store server with an increased memory pool size to accommodate large models. Please note that the server startup can be lengthy due to the initialization of a 140GB memory pool: + +```bash +sllm-store start --chunk-size=16MB --mem-pool-size=140GB --num-thread=4 --storage-path=./models +``` + +To benchmark the loading performance of several large models, run the following commands. We limit the number of repeats to 10 to manage disk capacity efficiently +```bash +bash benchmark_random_load.sh facebook/opt-66b ./models 10 +bash benchmark_random_load.sh meta-llama/Meta-Llama-3-70B ./models 10 +bash benchmark_random_load.sh mistralai/Mixtral-8x7B-v0.1 ./models 10 +bash benchmark_random_load.sh tiiuae/falcon-40b ./models 10 +``` + +Plot the results using the following command: + +```bash +python plot.py --models facebook/opt-66b meta-llama/Meta-Llama-3-70B mistralai/Mixtral-8x7B-v0.1 tiiuae/falcon-40b \ +--test-name random --num-repeats 10 --results-dir results --output-file images/random_large_loading_latency.png +``` + + + + +## Contact + +If you have any questions or need help with the benchmarks, please feel free to reach out to [Y.Fu@ed.ac.uk](mailto:y.fu@ed.ac.uk) or submit an issue on GitHub. \ No newline at end of file diff --git a/benchmarks/benchmark_random_load.sh b/benchmarks/benchmark_random_load.sh new file mode 100644 index 0000000..85f9907 --- /dev/null +++ b/benchmarks/benchmark_random_load.sh @@ -0,0 +1,102 @@ +#!/bin/bash + +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # + +set -e + +# Check if the correct number of arguments is provided +if [ "$#" -ne 3 ]; then + echo "Usage: $0 model_name models_directory num_replicas" + echo "Example: $0 facebook/opt-6.7b ./models 30" + exit 1 +fi + +# Assign arguments to variables +MODEL_NAME=$1 +MODELS_DIR=$2 +NUM_REPLICAS=$3 + +# Validate number of replicas +if [[ ! "$NUM_REPLICAS" =~ ^[0-9]+$ ]]; then + echo "Error: Number of replicas must be a positive integer." + exit 1 +fi + +# Check if models directory exists +if [ ! -d "$MODELS_DIR" ]; then + echo "Error: Models directory $MODELS_DIR does not exist. Please create it before running this script." + exit 1 +fi + +# Function to download models +download_models() { + local model_name="$1" + local save_format="$2" + local save_dir="$3" + local num_replicas="$4" + + echo "Downloading $model_name model..." + python3 download_models.py \ + --model-name "$model_name" \ + --save-format "$save_format" \ + --save-dir "$save_dir" \ + --num-replicas "$num_replicas" +} + +# Function to run benchmark +run_benchmark() { + local model_name="$1" + local model_format="$2" + local model_dir="$3" + local num_replicas="$4" + local benchmark_type="$5" + + echo "Running benchmark for $model_name..." + python3 test_loading.py \ + --model-name "$model_name" \ + --model-format "$model_format" \ + --model-dir "$model_dir" \ + --num-replicas "$num_replicas" \ + --benchmark-type "$benchmark_type" +} + +# Function to clean models directory +clean_models_dir() { + echo "Cleaning models directory..." + rm -rf "$MODELS_DIR"/* +} + +# Check if models directory exists +if [ ! -d "$MODELS_DIR" ]; then + echo "Error: Models directory does not exist. Please create it before running this script." + exit 1 +fi + +# Clean models directory before starting benchmarks +clean_models_dir + +# Start measuring performance for each format +for MODEL_FORMAT in safetensors sllm; do + echo "Measuring $MODEL_FORMAT performance for $MODEL_NAME..." + download_models "$MODEL_NAME" "$MODEL_FORMAT" "$MODELS_DIR" "$NUM_REPLICAS" + run_benchmark "$MODEL_NAME" "$MODEL_FORMAT" "$MODELS_DIR" "$NUM_REPLICAS" "random" + clean_models_dir +done + +echo "Benchmark completed successfully." diff --git a/benchmarks/benchmark_utils.py b/benchmarks/benchmark_utils.py new file mode 100644 index 0000000..b1befae --- /dev/null +++ b/benchmarks/benchmark_utils.py @@ -0,0 +1,129 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # +import gc +import os +import time + +import torch +from torch import nn +from tqdm import tqdm +from transformers import AutoModelForCausalLM, AutoTokenizer + +from sllm_store.transformers import load_model + + +def _warmup_cuda(): + num_gpus = torch.cuda.device_count() + print(f"Warming up {num_gpus} GPUs") + for i in tqdm(range(num_gpus)): + torch.ones(1).to(f"cuda:{i}") + torch.cuda.synchronize() + + +def _warmup_inference(): + print("Warming up inference") + model_name = "facebook/opt-6.7b" + model = AutoModelForCausalLM.from_pretrained( + model_name, torch_dtype=torch.float16, device_map="auto" + ) + prompts = [ + "The quick brown fox jumps over the lazy dog.", + ] + tokenizer = AutoTokenizer.from_pretrained(model_name) + inputs = tokenizer(prompts, return_tensors="pt").to("cuda") + with torch.no_grad(): + outputs = model.generate(**inputs, max_new_tokens=50) + del outputs, tokenizer, inputs, model + gc.collect() + torch.cuda.empty_cache() + + +def benchmark_inference(model: nn.Module, model_path: str): + # Inference + prompts = [ + "The quick brown fox jumps over the lazy dog.", + ] + tokenizer = AutoTokenizer.from_pretrained(model_path) + inputs = tokenizer(prompts, return_tensors="pt").to("cuda") + with torch.no_grad(): + start_time = time.time() + outputs = model.generate(**inputs, max_new_tokens=50) + end_time = time.time() + output_text = tokenizer.decode(outputs[0], skip_special_tokens=True) + end_to_end_time = end_time - start_time + throughput = outputs.shape[1] / end_to_end_time + + del outputs, tokenizer, inputs + gc.collect() + torch.cuda.empty_cache() + + return end_to_end_time, throughput, output_text + + +def measure( + model_name: str, model_format: str, model_dir: str, loading_order: list +): + results = [] + print( + f"Measuring loading time for {model_format} model={model_name}, repeating {len(loading_order)} times" + ) + # loading_order = torch.randperm(num_replicas) + for model_idx in loading_order: + print(f"Loading {model_name}_{model_idx}") + model_record = {"model_name": f"{model_name}_{model_idx}"} + + # Model Loading + if model_format == "sllm": + model_path = os.path.join(model_dir, f"{model_name}_{model_idx}") + start_time = time.time() + model = load_model( + f"{model_name}_{model_idx}", + storage_path=model_dir, + device_map="auto", + torch_dtype=torch.float16, + ) + end_time = time.time() + elif model_format == "safetensors": + model_path = os.path.join( + model_dir, f"{model_name}_safetensors_{model_idx}" + ) + start_time = time.time() + model = AutoModelForCausalLM.from_pretrained( + model_path, + torch_dtype=torch.float16, + device_map="auto", + ) + end_time = time.time() + model_record["loading_time"] = end_time - start_time + + # Inference + end_to_end_time, throughput, output_text = benchmark_inference( + model, model_path + ) + + model_record["end_to_end_time"] = end_to_end_time + model_record["throughput"] = throughput + model_record["output_text"] = output_text + + results.append(model_record) + + del model + gc.collect() + torch.cuda.empty_cache() + + return results diff --git a/benchmarks/download_models.py b/benchmarks/download_models.py new file mode 100644 index 0000000..ff25919 --- /dev/null +++ b/benchmarks/download_models.py @@ -0,0 +1,99 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # +import argparse +import os + +import torch +from tqdm import tqdm +from transformers import AutoModelForCausalLM, AutoTokenizer + +from sllm_store.transformers import save_model + + +def get_args(): + parser = argparse.ArgumentParser( + description="Save a model with ServerlessLLM" + ) + parser.add_argument( + "--model-name", + type=str, + required=True, + help="Name of the model to save", + ) + parser.add_argument( + "--save-format", + type=str, + required=True, + choices=["sllm", "safetensors"], + help="Format to save the model in", + ) + parser.add_argument( + "--save-dir", + type=str, + required=True, + help="Directory to save models", + ) + parser.add_argument( + "--num-replicas", + type=int, + default=1, + help="Number of replicas to save", + ) + return parser.parse_args() + + +def main(): + args = get_args() + + save_dir = args.save_dir + save_format = args.save_format + model_name = args.model_name + replicas = args.num_replicas + + # Check if save_dir exists + if not os.path.exists(save_dir): + raise FileNotFoundError(f"Directory {save_dir} does not exist") + + # Load model into memory + print(f"Loading model {model_name} into memory") + model = AutoModelForCausalLM.from_pretrained( + args.model_name, torch_dtype=torch.float16, trust_remote_code=True + ) + tokenizer = AutoTokenizer.from_pretrained(args.model_name) + + # # Save model + if save_format == "sllm": + print(f"Saving {replicas} sllm models to {save_dir}") + for i in tqdm(range(replicas)): + model_dir = os.path.join(save_dir, f"{model_name}_{i}") + save_model(model, model_dir) + tokenizer.save_pretrained(model_dir) + elif save_format == "safetensors": + print(f"Saving {replicas} safetensors models to {save_dir}") + for i in tqdm(range(replicas)): + model_dir = os.path.join(save_dir, f"{model_name}_safetensors_{i}") + model.save_pretrained(model_dir) + tokenizer.save_pretrained(model_dir) + else: + raise ValueError(f"Invalid save format {save_format}") + + print("Done!") + + +if __name__ == "__main__": + main() diff --git a/benchmarks/fio-config.ini b/benchmarks/fio-config.ini new file mode 100644 index 0000000..7e9f35f --- /dev/null +++ b/benchmarks/fio-config.ini @@ -0,0 +1,14 @@ +[global] +ioengine=libaio +iodepth=16 +rw=read +bs=1M +direct=1 +size=13GB +numjobs=4 +runtime=60 +group_reporting + +[job1] +name=Sequential Read Test +filename=./models/fio_testfile diff --git a/benchmarks/images/random_small_loading_latency.png b/benchmarks/images/random_small_loading_latency.png new file mode 100644 index 0000000000000000000000000000000000000000..5c5c13f4302e6fac69d7680992c0c229633cb98a GIT binary patch literal 100751 zcmeFaby$_@7d4DJ>Zl+yqoRO_j)8?3lt`$EiYVQwBArS%>WHI=flW$xNjHj!igX-l zP^3fR(DAMNAo_Ez_uub&|9QEtnNi@J^E~%+-+QmU*4le+NlTt$Sjn=Ij*gB&{PYP~ zI=WS9bacNP{=N*~VP7SihyNV56jQd8Gt;%Sxo|~??%V}Sb7M10V}pyEt#z(g7?_zJ z+IM*0{=J*^EiKJ01h}|Ne*D5dvnzUB+`pYp!JDiwKdoXxN4IY)`Dc-Bh=?`aB04(p z6UXFjeR>=9&dXO%rVJj*Rub6u@1s8!bycjrzvEg($myLcZ~yyZ6RUE`qO}EXOJ$Dz zdCbf5k3a609lO0VTj|&t{jThfQ?J&~eh&WV=SgoqBm6v>Vqf#{e(xRg0iJz39=_j( zkN)-R_A?_HzF)tEzqy{sWBcznTekh4w&cIx^jW;f=D*)_mD}91`oG^aU-?@D?(o+y z$*ZnMe*F#|UEZ!g%$NW7oBT@`_y6~MbYVyT4;Q)i|6Sz5LjB)e$$qiM?-%0w`oP6E zzjLZ4z56_2R1+u_C;Q|2VKM{jUC zK=h{Jr}zu2BZRDbm96^fsy|OGyrJ4Ej{nnE{PE2^PTkhmHw0|@eF}z)9`7lHAe z7T(iUjc(zHH0;-YOP{&CVf|j^^KxnAfZZtSTrr`MVcB}&#Qe2HH(ed^VCC!n`23J{ z)X$UDGJ101xbQs}amlHutn8CDnjGn}j`(@1TS|VMDZX1C9@V8HbH*0Fm0?mwMNc@b zJAeQF891fB*A|ZM$B#aTEBEo7-SLnuRZLCQ%b#Esmpo^*!jntKu(+vK_t>99}>FyL5E?D59BgGhB9-}9|ng4SI9RG6#J_ipT* zidkZQ{Qdj)w{P8&!Dqy3W=CQ-g@lFe;p9Ab`0(MOk&#DXVPVIQAD7Rvy?o>5%_z&R z3bDqN%KgvJ3Rtw?De)JHb6?N38=n>t5pm`6{g6^wp$@G7-u$0Axbf$CpL3sGM@w<=?R?m^3ZeMmYro=LPA5C(%$Chi&jS| zQLZxzhhsw=>FZcl|K`mb{i)GD0rM8uyX+#dxSsA0kN1!TwYSd@6cYN{*B4V(CjEGq z+(|5|Jhi*ps@Z95*WSG!FE~9vyTez|P8Kh(OwcYQm&JC(`t16B>e7;ucLT_+M=B=- zcGtv2=@xrMs3hv%V6v4ubEX2jC0VD4iA~s1nf&sVD=!5F1=s%Z$BUKgc8A+jyA7MN z(pk9m&v*K{a2&=$)x>H9gCmEaEY$IosOWx_W>E z%h5xLqqG-$Tj7R%g&Y*|#IIOcDI7iO`Z_;fA=yxY$D~f4QSh5=Y1CW#u!i%5j={^yra%3kx=`*ohP2cEjz4lvv+N=VD1e!H8rd zO7~c^3+2`t4ohmcLP$u+uKoL^3vREIi;xYeO1rGhW7edu5GlW_s_Dv=D@iVM&VBW% zQp*`PRn;cyVXIqwu`50nAJ4&{w-O3?4Wv1)x)q{1E@J-zzmn^?q8oNw&g z-u*c<{^j1}*QZ*RUq7siGPJd~j}(8nqq`|PQ#DDywQPSU?sMclhkqwU%OzPq$KBn1 z6P|(4-1KmyN@Dvt%E>z$0>s>zRI*Zqa{6~X6yKv5U6y1}ndC5L>TQTi495@c`_nt* zgHAGd8;V!FzOjlr*%PNGICqoXSvud1!K8_@X>znL3L8mTF!$K?WnRKg8B2~F+_z=R zF?S};3eW8lmMwXUqIynXk@0k}xx9~yiuP61yD_kGJB%9l)g?<@zI@p_V!~|EqDAD& z{TzqHAMaJE*y6Bl+qO<5yc(aw7LR;f8>M@;4nE(>s0o-@w4Ykt#W<_l1QWZ^yM>A^y;{THs0y@g$c<5w2yMV2$es>isW zQ{>jITjc4re|#RaUdypudVj@VrHMSEr^d$>F{38@aZ7gwfT{<86}vK$2x zI^X>JCzHte5viVvsj+6PC@k zr}oyYS;=cuvv>QB9Rim3f==Bt#QS*hns_xi3Vtn zD6oz+o)?c{)y_XMwqB6aYIYp

jbnzqPzl^#6U%Ok7-??D9}aUqfnFF!C@t?ARF{ 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 literal 0 HcmV?d00001 diff --git a/benchmarks/plot.py b/benchmarks/plot.py new file mode 100644 index 0000000..7a3f3d7 --- /dev/null +++ b/benchmarks/plot.py @@ -0,0 +1,152 @@ +import argparse +import json +import os + +import matplotlib.pyplot as plt +import pandas as pd +import seaborn as sns + +pattern = "{model_name}_{model_format}_{num_repeats}_{test_name}.json" + + +def get_args(): + parser = argparse.ArgumentParser(description="Plot benchmark results.") + parser.add_argument( + "--models", + type=str, + nargs="+", + required=True, + help="Model names to show in the plot.", + ) + parser.add_argument( + "--test-name", + type=str, + required=True, + choices=["random", "single"], + help="Name of the test.", + ) + parser.add_argument( + "--num-repeats", + type=int, + required=True, + help="Number of repeats for the benchmark.", + ) + parser.add_argument( + "--results-dir", + type=str, + default="./results", + help="Directory to load results from.", + ) + parser.add_argument( + "--output-filename", + type=str, + default="loading_latency.png", + help="Output filename for the plot.", + ) + return parser.parse_args() + + +def load_results(models, model_format, num_repeats, test_name, results_dir): + """Load results from files and check for the expected number of repeats.""" + all_results = {} + for model in models: + model = model.replace("/", "_") + filename = pattern.format( + model_name=model, + model_format=model_format, + num_repeats=num_repeats, + test_name=test_name, + ) + filename = os.path.join(results_dir, filename) + with open(filename) as f: + results = json.load(f) + if len(results) != num_repeats: + print( + f"Error: Expected {num_repeats} repeats, but found {len(results)} in {filename}." + ) + exit(1) + all_results[model] = results + return all_results + + +def create_dataframe(sllm_results, safetensors_results): + """Convert results list to pandas DataFrame.""" + sllm_loading_latency = [] + safetensors_loading_latency = [] + sllm_model_list = [] + safetensors_model_list = [] + for model_name, results in sllm_results.items(): + for result in results: + sllm_loading_latency.append(result["loading_time"]) + sllm_model_list.append(model_name) + for result in safetensors_results[model_name]: + safetensors_loading_latency.append(result["loading_time"]) + safetensors_model_list.append(model_name) + sllm_model_list = [model.split("_")[1] for model in sllm_model_list] + safetensors_model_list = [ + model.split("_")[1] for model in safetensors_model_list + ] + df = pd.DataFrame( + { + "Model": sllm_model_list + safetensors_model_list, + "System": ["Sllm"] * len(sllm_model_list) + + ["SafeTensors"] * len(safetensors_model_list), + "Loading Time": list(sllm_loading_latency) + + list(safetensors_loading_latency), + } + ) + return df + + +def plot_results(df, output_filename): + """Plot the results using seaborn's boxplot for loading latency.""" + # Set the style for the plot + sns.set_theme(style="whitegrid", palette="pastel", font_scale=1.2) + + # Create a box plot using seaborn + plt.figure(figsize=(12, 8)) + # box_plot = sns.boxplot(x='Model', y='Loading Time', hue='System', data=df, showmeans=True, meanprops={"marker":"o", "markerfacecolor":"black", "markeredgecolor":"black"}) + # use bar plot instead of box plot + sns.barplot(x="Model", y="Loading Time", hue="System", data=df) + + # Customize the plot + plt.title("Model Loading Latency", fontsize=16, weight="bold") + plt.xlabel("Model") + plt.ylabel("Loading Time (s)") + plt.legend(title="System") + + # Remove top and right spines for better aesthetics + sns.despine(trim=True) + + # Save the plot as an image file + plt.savefig(output_filename, bbox_inches="tight", dpi=300) + + +def main(): + args = get_args() + + models = args.models + test_name = args.test_name + num_repeats = args.num_repeats + results_dir = args.results_dir + output_filename = args.output_filename + + if not os.path.exists(results_dir): + raise FileNotFoundError(f"Directory {results_dir} does not exist.") + + output_dir = os.path.dirname(output_filename) + if not os.path.exists(output_dir): + os.makedirs(output_dir) + + sllm_results = load_results( + models, "sllm", num_repeats, test_name, results_dir + ) + safetensors_results = load_results( + models, "safetensors", num_repeats, test_name, results_dir + ) + df = create_dataframe(sllm_results, safetensors_results) + plot_results(df, output_filename) + + +if __name__ == "__main__": + main() diff --git a/benchmarks/results/facebook_opt-6.7b_phantom_30_random.json b/benchmarks/results/facebook_opt-6.7b_phantom_30_random.json new file mode 100644 index 0000000..6249a47 --- /dev/null +++ b/benchmarks/results/facebook_opt-6.7b_phantom_30_random.json @@ -0,0 +1,212 @@ +[ + { + "model_name": "facebook/opt-6.7b_16", + "loading_time": 1.0603504180908203, + "end_to_end_time": 1.898390769958496, + "throughput": 32.13247818379017, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_10", + "loading_time": 1.0053458213806152, + "end_to_end_time": 2.425994873046875, + "throughput": 25.144323542361153, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_18", + "loading_time": 1.068990707397461, + "end_to_end_time": 2.372910261154175, + "throughput": 25.7068297097463, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_3", + "loading_time": 1.0486304759979248, + "end_to_end_time": 2.239630699157715, + "throughput": 27.236633264109575, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_4", + "loading_time": 1.8052313327789307, + "end_to_end_time": 2.1210079193115234, + "throughput": 28.75991147633269, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_22", + "loading_time": 1.9855210781097412, + "end_to_end_time": 2.2109146118164062, + "throughput": 27.590391629772007, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_25", + "loading_time": 1.0989010334014893, + "end_to_end_time": 2.0908117294311523, + "throughput": 29.175271566223845, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_13", + "loading_time": 1.0800120830535889, + "end_to_end_time": 2.2011797428131104, + "throughput": 27.71241203684799, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_5", + "loading_time": 1.0510895252227783, + "end_to_end_time": 2.2066802978515625, + "throughput": 27.643333771271703, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_17", + "loading_time": 1.0642368793487549, + "end_to_end_time": 2.160844564437866, + "throughput": 28.22970286891916, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_29", + "loading_time": 1.0636045932769775, + "end_to_end_time": 2.189013719558716, + "throughput": 27.866431103180574, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_12", + "loading_time": 1.0601158142089844, + "end_to_end_time": 2.238553762435913, + "throughput": 27.249736425191777, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_27", + "loading_time": 1.0342729091644287, + "end_to_end_time": 2.213266134262085, + "throughput": 27.561077746458057, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_1", + "loading_time": 1.0532996654510498, + "end_to_end_time": 2.3837199211120605, + "throughput": 25.59025473577537, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_11", + "loading_time": 1.0353169441223145, + "end_to_end_time": 2.4344098567962646, + "throughput": 25.057407580610647, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_7", + "loading_time": 1.0830974578857422, + "end_to_end_time": 2.432058334350586, + "throughput": 25.081635229891955, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_28", + "loading_time": 1.00742769241333, + "end_to_end_time": 2.2210607528686523, + "throughput": 27.46435455275787, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_20", + "loading_time": 1.013396978378296, + "end_to_end_time": 2.121671199798584, + "throughput": 28.750920503511992, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_19", + "loading_time": 1.0360965728759766, + "end_to_end_time": 2.096001148223877, + "throughput": 29.10303749198352, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_2", + "loading_time": 2.090054750442505, + "end_to_end_time": 2.1884405612945557, + "throughput": 27.873729393827315, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_15", + "loading_time": 1.947800874710083, + "end_to_end_time": 2.1587047576904297, + "throughput": 28.257685439700012, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_23", + "loading_time": 1.2132229804992676, + "end_to_end_time": 1.3594067096710205, + "throughput": 44.872516492700065, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_9", + "loading_time": 1.0096378326416016, + "end_to_end_time": 2.3395631313323975, + "throughput": 26.073243839015397, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_24", + "loading_time": 1.0526819229125977, + "end_to_end_time": 2.381564140319824, + "throughput": 25.613418915439418, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_8", + "loading_time": 1.0283787250518799, + "end_to_end_time": 2.4220774173736572, + "throughput": 25.18499184313622, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_14", + "loading_time": 1.0534887313842773, + "end_to_end_time": 2.424642562866211, + "throughput": 25.158347434060907, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_0", + "loading_time": 1.0570142269134521, + "end_to_end_time": 2.218724489212036, + "throughput": 27.49327385919092, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_26", + "loading_time": 1.061762809753418, + "end_to_end_time": 2.2024800777435303, + "throughput": 27.696050745891558, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_6", + "loading_time": 1.0514404773712158, + "end_to_end_time": 2.1386401653289795, + "throughput": 28.522797331180108, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_21", + "loading_time": 1.0297183990478516, + "end_to_end_time": 2.2441351413726807, + "throughput": 27.181963721974356, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + } +] \ No newline at end of file diff --git a/benchmarks/results/facebook_opt-6.7b_safetensors_30_random.json b/benchmarks/results/facebook_opt-6.7b_safetensors_30_random.json new file mode 100644 index 0000000..48b9e5c --- /dev/null +++ b/benchmarks/results/facebook_opt-6.7b_safetensors_30_random.json @@ -0,0 +1,212 @@ +[ + { + "model_name": "facebook/opt-6.7b_26", + "loading_time": 5.315510511398315, + "end_to_end_time": 2.43576717376709, + "throughput": 25.04344448720815, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_11", + "loading_time": 4.825915098190308, + "end_to_end_time": 2.2741358280181885, + "throughput": 26.823375828504876, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_12", + "loading_time": 4.599301338195801, + "end_to_end_time": 2.1387481689453125, + "throughput": 28.521356972139976, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_25", + "loading_time": 5.044696092605591, + "end_to_end_time": 2.2212560176849365, + "throughput": 27.461940233065135, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_27", + "loading_time": 4.907486915588379, + "end_to_end_time": 2.1005144119262695, + "throughput": 29.040505341765382, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_24", + "loading_time": 5.455355644226074, + "end_to_end_time": 2.221276044845581, + "throughput": 27.46169263453278, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_10", + "loading_time": 4.681467533111572, + "end_to_end_time": 2.2695939540863037, + "throughput": 26.877054325145778, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_2", + "loading_time": 5.696061134338379, + "end_to_end_time": 2.241537094116211, + "throughput": 27.213468900478297, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_13", + "loading_time": 3.9381392002105713, + "end_to_end_time": 1.9413731098175049, + "throughput": 31.421059502433405, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_3", + "loading_time": 5.191221714019775, + "end_to_end_time": 2.068458318710327, + "throughput": 29.4905628255701, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_22", + "loading_time": 6.379522085189819, + "end_to_end_time": 2.100472927093506, + "throughput": 29.041078898554396, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_0", + "loading_time": 6.706932067871094, + "end_to_end_time": 2.339123010635376, + "throughput": 26.078149683727222, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_16", + "loading_time": 4.864023208618164, + "end_to_end_time": 2.1991493701934814, + "throughput": 27.737997621613676, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_18", + "loading_time": 3.9082493782043457, + "end_to_end_time": 2.186828136444092, + "throughput": 27.894281669152797, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_1", + "loading_time": 5.857372045516968, + "end_to_end_time": 2.213028907775879, + "throughput": 27.564032166803344, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_4", + "loading_time": 5.022972106933594, + "end_to_end_time": 2.510160446166992, + "throughput": 24.301235442199253, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_21", + "loading_time": 6.8377602100372314, + "end_to_end_time": 2.33209490776062, + "throughput": 26.156739932413334, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_20", + "loading_time": 4.595490455627441, + "end_to_end_time": 2.221282720565796, + "throughput": 27.461610102680822, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_29", + "loading_time": 5.144659042358398, + "end_to_end_time": 2.1676270961761475, + "throughput": 28.141371782816545, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_5", + "loading_time": 4.985952377319336, + "end_to_end_time": 2.1304242610931396, + "throughput": 28.632794469163787, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_6", + "loading_time": 5.69625186920166, + "end_to_end_time": 1.8594741821289062, + "throughput": 32.804972817724895, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_23", + "loading_time": 5.118912220001221, + "end_to_end_time": 2.108344554901123, + "throughput": 28.932652330567844, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_15", + "loading_time": 5.045670509338379, + "end_to_end_time": 2.1164777278900146, + "throughput": 28.82147031181513, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_9", + "loading_time": 4.685817241668701, + "end_to_end_time": 2.2286877632141113, + "throughput": 27.370366099210145, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_28", + "loading_time": 4.862567663192749, + "end_to_end_time": 2.0547993183135986, + "throughput": 29.686597351055926, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_19", + "loading_time": 4.807375907897949, + "end_to_end_time": 2.1207022666931152, + "throughput": 28.76405658542508, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_14", + "loading_time": 4.883404731750488, + "end_to_end_time": 2.1128876209259033, + "throughput": 28.870442230746168, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_8", + "loading_time": 4.704470634460449, + "end_to_end_time": 2.209514856338501, + "throughput": 27.6078704902153, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_17", + "loading_time": 4.310231924057007, + "end_to_end_time": 1.579456090927124, + "throughput": 38.620890033222544, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + }, + { + "model_name": "facebook/opt-6.7b_7", + "loading_time": 4.768707990646362, + "end_to_end_time": 2.080918073654175, + "throughput": 29.313984424615803, + "output_text": "The quick brown fox jumps over the lazy dog.\nI'm not sure if this is a joke or not, but I'm going to assume it is.\nIt's a joke. The joke is that the dog is lazy. The fox is quick. The dog is brown." + } +] \ No newline at end of file diff --git a/benchmarks/server-specs.md b/benchmarks/server-specs.md new file mode 100644 index 0000000..f276d6d --- /dev/null +++ b/benchmarks/server-specs.md @@ -0,0 +1,10 @@ +# Server Specifications + +This document outlines the detailed hardware specifications utilized for the ServerlessLLM Store benchmarking tests. + +## Hardware Overview + +- **CPU:** 2 x AMD EPYC 7453 +- **GPU:** 8 x NVIDIA A5000 24GB +- **Memory:** 1TB DDR4 3200MHz +- **Storage:** 2 x 3.84TB NVMe SSD, Intel P5510, PCIe 4.0 interface, configured in RAID 0 \ No newline at end of file diff --git a/benchmarks/test_loading.py b/benchmarks/test_loading.py new file mode 100644 index 0000000..8445e68 --- /dev/null +++ b/benchmarks/test_loading.py @@ -0,0 +1,106 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # +import argparse +import json +import os + +import torch +from benchmark_utils import _warmup_cuda, _warmup_inference, measure + + +def get_args(): + parser = argparse.ArgumentParser(description="Load test") + parser.add_argument( + "--model-name", + type=str, + required=True, + help="Name of the model to serve", + ) + parser.add_argument( + "--model-format", + type=str, + required=True, + choices=["sllm", "safetensors"], + help="Format to save the model in", + ) + parser.add_argument( + "--model-dir", + type=str, + required=True, + help="Directory to load models", + ) + parser.add_argument( + "--num-replicas", + type=int, + default=1, + help="Number of replicas to load", + ) + parser.add_argument( + "--output-dir", + type=str, + default="./results", + help="Directory to save results", + ) + parser.add_argument( + "--benchmark-type", + type=str, + required=True, + choices=["random", "single"], + help="Name of the test.", + ) + return parser.parse_args() + + +def main(): + args = get_args() + _warmup_cuda() + _warmup_inference() + + model_format = args.model_format + model_name = args.model_name + model_dir = args.model_dir + num_replicas = args.num_replicas + output_dir = args.output_dir + benchmark_type = args.benchmark_type + + # Check if model_dir exists + if not os.path.exists(model_dir): + raise FileNotFoundError(f"Directory {model_dir} does not exist") + + if benchmark_type == "random": + loading_order = torch.randperm(num_replicas) + elif benchmark_type == "single": + loading_order = [0] * num_replicas + else: + raise ValueError(f"Unknown benchmark type {benchmark_type}") + + results = measure(model_name, model_format, model_dir, loading_order) + + output_filename = ( + f"{model_name}_{model_format}_{num_replicas}_{benchmark_type}.json" + ) + output_filename = output_filename.replace("/", "_") + output_filename = os.path.join(output_dir, output_filename) + + with open(output_filename, "w") as f: + json.dump(results, f, indent=4) + print(f"Results saved to {output_filename}") + + +if __name__ == "__main__": + main() diff --git a/blogs/README.md b/blogs/README.md new file mode 100644 index 0000000..22820fb --- /dev/null +++ b/blogs/README.md @@ -0,0 +1 @@ +All ServerlessLLM blogs are available in this directory. \ No newline at end of file diff --git a/blogs/serverless-llm-architecture/README.md b/blogs/serverless-llm-architecture/README.md new file mode 100644 index 0000000..2d41053 --- /dev/null +++ b/blogs/serverless-llm-architecture/README.md @@ -0,0 +1,113 @@ +# ServerlessLLM Architecture Overview + +## Table of Contents + +- [ServerlessLLM Architecture Overview](#serverlessllm-architecture-overview) + - [Table of Contents](#table-of-contents) + - [Introduction](#introduction) + - [ServerlessLLM Serve](#serverlessllm-serve) + - [ServerlessLLM Store](#serverlessllm-store) + - [Conclusion and Future Work](#conclusion-and-future-work) + + +## Introduction + +ServerlessLLM (SLLM, pronounced “slim”) enables low-latency, serverless LLM inference via two core components: **sllm-serve** and **sllm-store**. **sllm-serve** is a serving platform that manages auto-scaling, load-balancing, and resource allocation for deployed LLMs across a distributed GPU cluster. *sllm-store*, built in C++, serves as a high-performance checkpoint store optimized for cold-start with efficient model loading and caching. + +This article will walk you through the system architecture of *sllm* and aims to answer the following questions: + +- What happens when we **deploy a model** in our cluster? +- How is an **inference** request served? +- How to handle **cold start**? +- How do we **save and load model** checkpoints? + +The goal is to offer a clear picture of how ServerlessLLM functions under the hood, providing insights that will help readers both understand the architecture and potentially contribute to its development. + +## ServerlessLLM Serve + +

+ arch_overview.jpg +

+ +The above figure outlines ServerlessLLM Serve, divided into three planes: user interface, control, and data. + +- **User Interface**: Includes a CLI for model and cluster management and an API gateway that routes control messages to the controller and inference requests to the appropriate router. +- **Control Plane**: Contains the controller, storage-aware scheduler, and store manager, managing cluster status and model lifecycles. +- **Data Plane**: Comprises the request router, inference backend for processing requests, and checkpoint store for efficient model loading and caching. + +We’ll next walk through these planes from a user’s perspective: first deploying an LLM on the control plane, then processing an inference request on the data plane without cold-start, and finally examining the cold-start process. + +![image.png](./images/outlines1.png) + +**Step 1: Deploy an LLM** + +![arch_step1.jpg](./images/arch_step1.jpg) + +Starting with the control plane, model developers use *sllm* to deploy a model, specifying its name on the HuggingFace hub. Upon receiving the model registration request, the controller processes configurations such as backend choice (e.g., [Transformers](https://github.com/huggingface/transformers) or [vLLM](https://github.com/vllm-project/vllm)), auto-scaling settings (e.g., concurrency limits, minimum/maximum instances), and resource requirements (e.g., CPU and GPU allocation). + +Once configured, the controller creates a router for the model and registers its checkpoint with the store manager. The store manager determines an initial server for downloading model checkpoints, then instructs *sllm-store* to download and convert the model into the optimized format. This approach ensures the model is ready for rapid loading and minimal latency during cold starts. + +**Step 2: Query the LLM (Simple Case, No Cold Start)** + +![arch_step2.jpg](./images/arch_step2.jpg) + +In the data plane, when a model inference request is received, the API gateway routes it to the corresponding model router. The router selects one of the available backend instances and forwards the request. Each backend instance operates on one or more dedicated GPUs within a shared server, processing the inference request with an inference engine (such as *Transformers* or *vLLM*) and returning the result to the client. + +**Step 3: Query the Model with Cold Start** + +![arch_step3.jpg](./images/arch_step3.jpg) + +In a cold-start scenario, when traffic exceeds capacity, the router scales up by creating additional backend instances. It issues a resource allocation request to the storage-aware scheduler, which selects an optimal server based on model details (e.g., size), hardware specifications (e.g., PCIe and disk bandwidth), and storage status (e.g., whether the model is stored on the server’s local disks or host memory). The request router then initiates a new inference backend, which loads the model from the checkpoint store before becoming available. + +In summary, these steps illustrate how ServerlessLLM efficiently deploys, serves, and scales LLMs, achieving low-latency serverless inference even with frequent cold starts. The figure below illustrates the interplay between these components. + +![arch_full.jpg](./images/arch_full.jpg) + +## ServerlessLLM Store + +

+ sllm-store.jpg +

+ +ServerlessLLM Store enables fast checkpoint loading with two core modules: + +- A checkpoint parser that saves and restores model checkpoints in a cold-start optimized format (detailed in Step 1 below). +- A dedicated checkpoint manager on each GPU server that loads checkpoints into GPUs efficiently and caches frequently used ones in host memory. + +Built on these core modules, ServerlessLLM Store offers a two-level Python API: + +- A lower-level tensor API that saves and restore tensors for each specific deep learning library. For examples, PyTorch API for saving and loading a PyTorch `state_dict` . +- A higher-level model API, built on the tensor API, that saves and loads models for inference libraries like *Transformers* and *vLLM*. + +To illustrate, let’s walk through two steps: 1) saving a *Transformers* pre-trained model into the *sllm* cold-start optimized format, and 2) loading the *sllm* checkpoint to restore a *Transformers* pre-trained model. + +

+ outlines2.png +

+ +**Step 1: Save a Model** + +

+ save_model.jpg +

+ +The`save_model`function takes a *Transformers* pre-trained model and an output path as inputs. It first saves model configurations using *Transformers*’ built-in API, then calls the PyTorch API (`sllm_store.torch.save_dict`) to save the model’s `state_dict` in a cold-start optimized format. + +The `save_dict` function uses the checkpoint parser via `save_tensors`, which saves each tensor’s data in a binary file and returns its offset within that file. After saving tensors, the `save_dict` function records tensor metadata and offsets to an index file. This setup enables efficient retrieval during model loading. + +**Step 2: Load a Model** + +

+ load_model.jpg +

+ + +The `load_model`function takes a model path as input and returns a *Transformers* pre-trained model. It initializes the model with saved configurations and concurrently calls the PyTorch API (`sllm_store.torch.load_dict`) to load the tensors. + +The PyTorch API allocates GPU memory for each tensor, calling the standalone checkpoint manager (via gRPC) to load tensor data into designated addresses. Simultaneously, `load_model` uses the checkpoint parser to restore tensors based on the saved tensor metadata, inferring actual GPU memory addresses using the base GPU memory address and saved tensor offsets. + +Before returning the model, a final sync call is sent to the checkpoint manager to ensure all data has loaded correctly. + +## Conclusion and Future Work + +In the next blog post, we’ll demonstrate a deployment example of Serverless RAG. Future posts will also explore specific topics in greater detail, including the scheduling algorithm, cold-start optimized checkpoint format, and the efficient multi-tier checkpoint loading pipeline. diff --git a/blogs/serverless-llm-architecture/images/arch_full.jpg b/blogs/serverless-llm-architecture/images/arch_full.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3564f2d26ca45c30b838c4616b14ac9bdd96baff GIT binary patch literal 684213 zcmeFa2Uru|wl+QpNL2*sEl3fiN)xF8l_t_edWnh%h=`yx1wxS`RZu`t2!e=$7?EB> z@6wBalmOBL31A4MedF(*bIbXkd+#~lcb?~eo_pO76J~~;nOS>wS?gWzT2Q}H=YV6E z^o{fZ8XAD+63rz5prU~Uy+Ds!0AOMQNC5!A2+-4T0JPv9SOxsx2k8IU2Y^d70{^;y zh33?s>Kp=q7!QE%Pj&3U-@kUjEC2EBfB8+DL-TJ}%sKSu+DA|4(EfR!>F}@bQ8Ba`8d2a7I}I&64Yd`3fKNeB^GEsPYv2dXAzC{6!wif}%q(Dq@?*du8d};zbhPyJ zzivYl0{$JKW2fghp`d&CxW#n_Q6Eml@RT=3Yk}-Q)KC2Y&tmfk6)=A4f&U#6F2j zefB&pJ>$j8%-p=U`R@wee<=J?T2@|BSyf%r+|t_C-qG3BJv2NrIyU}oViG;Su=rzX zd1ZACx4pCb6Te5;KlmjV*q;9)7WnxulKq8T?4VqS=;&za7=Fn`b12}K;OuntCln5I z=vpvb_c<=A7|zIfKIKhG6O)+I6)e{c-$7<>ab>gw?w4qPNcOi07V&>2*}n?*Z*olm z7l1>56xu_FXz6KbY3UEsgXJ*e;a`Q3nemUp{HMbDM>+bdu>EVHf)}9yuR%vg#{m8u zV_{-B_IDTRG}tW{sFMIIEe+V2XxRZMKwcX$Vt#RMam;z?r^<&9AtMKwT{#SQy)E^Z zekxC%qM3R%GFV-2ayAa|2Ty?KO>)D8z!L(mMuy#gSNz>PzdOb6q3}O$rl4Iw#?Mw( zZj58)I|62pG>8+T*UiSucB75nBsH(0&wtnd@`jD`PJvVlifeZ{yv{2pSRd;jztGR* zSU!`8oYZ^dCN0+5&$=eWWI*$LZkzEdTo!`0lHb>o=cWSV+0UrJTML_AGa@e)=qeyd zP=OLp6Dlysq60D6{5|*nUU7b}v;Ql!i*onY?QMr z_s=?FWG1LUM|UW+yK?%+>$iky|@<(0aE zXIgkCV`Hmmba(;ldQQMX@Avjk&;~TO{yf}mx#75NMDlj=0dOie4xkSGW5@me-oh+K z4{L+>99$UHmRetRx&I&mpBc>ThN@+0+RkzIUryY#qM7@Q{F*#nZokn^a(9i+gTIx4zYUen^e znPQfu<4A#bY3oJ~t&iVnwQFHFRK62+CSP#U96)hJ6c(j<%z4}{6$lgNs2qBLc^gve z3@dY1&>EUyx~RZT8SZ7vLH46~LZ{&sJgw5?Jt}bgXOV~G2@WAq*hcw}=uxW@TO+kb zx*y5sO-orZ4Ryd(3b(xnITGUbAx_nn)s?~2@WrzIQ^VHl5jv)wI?_Je{9 zwwFtrBg<33vj672NVR^`+X^^O{6~U&#kk2l72pfJrPy{u5q6uqq@-^e*Ll7>KUZIY z^yKqDZ(GH4cK&pw&;np7PQMO9if^xm@r|Zy2_> ztm1H1=4dTo)?bvWjdg3zfL{NrWOEcv8BbBN!NUXg_fDs(w(5lAE=P)8z2)dLFU(9w6mP-a)&F z`_hoPRwVFfR}1KboH9eQID2YdK#y6(}%jUyL&@IhoG%AM^S z6=*G8Ik;GAlHa(+wG~~C(6n#=5uTEMsB>&jFytq&yj2t)N6DoEx2V9R4Y~jWojXPH z#%}NIeZG@yF`R#{W_Xh?AjlW#r@4_5Y5>eFo-t?3c@GYeU&G}0_Rre}`_TCUObbzt zbR3sI+tUAJMupOjqmR=QADf-1No;S+qDw(2&P*EiS%ssM)CKtuq?@u8u*D8e_=E z$fYO`St$Mn0rD|$LI~2T`W|mDPM_NY>wau-I!WJB++5H|#N71oIR>%)WO6#(4aQ5E zfC#+BexFRJz+M_!%iJs$RsNKs8P++`WU1NLD&k9{CMm+MBiuw}rZk0$k_%O$ao%x@ zuPzYo=U*19uF zMbY1mXE|AoW+cdMzX@9qr>zv)0x!FoVbMa)nBQV>tS`pAp30ouoYAAteR`z9wGQ{C zOW zn>4<>X!)U|-9pZ4&gep;iW*j-A?!>%t^}DLk z-B@@@`Dw`?Gn-9TtWlq7gHoP9)7<_h{`q8sF}MbH1#7~NkpS#?tMnruiP^_~`H4T4 zA6P$peoIXuGC>(P6`8Ucp~lb(or`nUdJSH>mjJsj6(o%px;3T=5R-_H()$#9!huCn zLC$_65c>0~spMhqlKN)qC3QY9RXT-_XdE!_aANtpRa{lP4GTmKkxX#Qt zaIX<4%wc64t4Fqk3Jlai&}5C~2Hui*lOg5!K#Z5{8v&PS-se)H$vO<de zHxpGPU$fHgOilGD3hS<{up!^EsgR?`annTLHvXX`CK>x>oA5cw#G*KQ@Y#}6lMFjW zV9_zVC6m(X4&=t2`pb`g$zeaDly=B}Z$=afoW=q?(JdjC#1Wu7J)+-)DHf(T=PKx`P zvBMj4=kGZidCzqU3R}@?YecE+LqKud2lMO5`N3u%%WJh7ve2ISJHF>Tl=mvaX_^+l z$h=@kVhc8B*lhv5bH6-vzqfzi23#q~z(`%}r{sWndCuF`liF$5vR&Jz7rVT@nUAU( z$wXP$e1Ce1);W&!iBL%e=zYkUB*r~{c-RRPA^g40+N)x*v;LAxqGr4CQAhn3B2pA9 z^vBu_2|KM&tOJ|C_tu4G6w3pQ`uUy`q~B@e)l-l&qUXGxi0`WL?kdxenJr*n`$^jI z3ms%e3O@-6-4{(Jgz$7EAFz{D_MPF|AOvSPVzYA}G`4aHI4W=+8jX_frx@l@AbPk3 z%47JEP#Xj(MF%pZ!bSQ{1zJ`bG~oluXk_;e6-Yfr1!4w+1F66pNDC}&nF@%59U)N< zt_sB-$R|T~#R#6;byQ$64vOA|2}4&5u;V|1KxPLg4O#5>ll^Y9|D>PIw1FcbkFX?h z0U92B4i_zu7W(a@jb_;8McSko2I1&>o)#F^LH3r~#ZU!;rMHhj_sjGat3dm6r8_Bt z728a_M|EbxcE$a2*k&iCcV_4MNt{!7TSC20fqNzYXvbp}j9%^&neteEWse_TuQ=A^ z6RO-CxUw{j_J;J-=A#2fSSc+%7A&WF@co| zFsVG*3yeg!#2(Y&*jWvb>A$n!v)tu{J(kB9&mH8W11VCr&;vOCVhdFSb(mWXC)@IZ zMX~VaBIBy`oz|K>*!K%9m%Nk-opcF8al@A$3r4gtI)=?xLkOaXF#D-y7)Qft)3~1Z zvvwMGK#WA#1LR<&ywA@sFjzrSe zy+2mX$Rv2hUF(z_wOd=Kk3y|252fCGJ% zVcz$KI|V0bS*10kRCo68K<~f_r$K_)Px(^k^2*1%#4rqNsa8W&zBFPw$BM51oHNnc zas=a?LO9+G<44VXfR?2#KdE!_BO}n$Vx5$MbPhUo(-)gd0>)O?0!-v4&T=!{Kb%6~ zMXn+nXAWWATA(bp1nEY8m5RtWs~^6w7~8h`Ad3Wj`#P2aZrFWGzhV2#`K0HoLg7V~ zj75L+z1Ni83aDlS6WDoAqi&(1@%}axXn7SO64_c(_XXBDXe-mxwOxEdiq-9n-Q=~9 z8k^}*2tf=BYxaFh;li@T?0Sf@z8|x<%CD8G?g3m9?=h{fJ0tXhL+&`)C+$3QLo!<= zbvA)uzGX8N*kvfC0*#>l)tpSw)0C$II**_vhGdfT!?>20nYMpJHMJMNYyC@u{cedr zcb$K5ODwx$;g1WR%poq8q^i+aTUW#uo#qvZs1k|Wfpb#6Qi0N~#GEsMNHi*@T>feM z7vpyhL7i_GV}CG;o5E|F>kH$2K1dYa@G-lOn_Ac+aU4e*#64K`lb<*slej+W$Mlpm zWIy_P_LhLo5t(R*7Y`L=SnINn(ZmtV&9H08lU&EY0|%h8_W*J7R*5%a$gVdZWjE)v>rL zBJNVwm8+VH*}6aJj<1xHP?T;ISDg=NSMQNOs(43G0Uo)ig2z7v%0G`O8r$bwe8 zJ966kN^8QtT+?{39urx|W>Wu>kxI#eirX!4oiva5I}jPRMJn*$b09tUL4rcW2YAH1bx=&8XnAtHy*DM+9yqx5cii_ka`p>3ly22lqzpmmP;O*3Kel*n znX-WySJ@*UWK|Xy-rcB()%>W`K3A)|rUyI<;UcswzzDLCW+AyHLrwZQS(jGEm_rT| zbHf(okyF)o9^N$%(fI`Vg=|l`r+$wbYhZV@pIXkS92-J6;tfh;A;h&XsNZ{JKRgnF zwM?EcoB#2hU$4Cy8u8O1f=l)%A${_!%f#K3#Y$Q&)y~Iwp`u+5zBg4-aX1afNF&920CQMn@rx(ySm2dS&m)#5ub&&gSM{o@ydSyU3EaGQ^k^5SAgE!x z{oJ<#)pJpD^e4Ex6Eid(!h%U_5D5&O?MWZ?N8-y|u%s_(w~SmeF0%-w@o`5E_43dHv5cr_F@CLu<78ljT{XgEf4E|3&}MOkVWP3EqE~O^#%u<+E!@r+WQ2g+@0(hlRa+s#ZhtNJ4iwXm% z=yX^aE{u75eSb47D^AnPxMpy0aW(3W+s(_Q_tK!>?bLUgvrNglK?M^apbKPv{dA4<=MCFwfLwZtGC@(4?`5fL!@|{0ny7 z#rTk!pzC`#ZJYWQl2@DSh-kOwE&5z9;%jfQAxBzj#tmkT|F_ z{uIa0*B}1vmj6pSGszyD*}6%tH6W?41N!l6qE4CH*|k|%{Z6pq#=*9L3NeSin1*t$Q|AK9PcvEjIEbKA?S10%?~xOgp0 z|G2*mUGf+>w@8{b5@8YWQikZZudk*&De}6XZr^fckt3ELX6)>eDw&FHZ}t_e<+8qI zv1esdUS9sWJi5J|v$CR6FX>dCd2DPXb73BEiWWEu6mjh*KJ0t@eb#dI4LxTn=*9kW z>c5^h|9+Ah2?jPwOEAOGPgD%QB!=d#!(01~=ua-gev;;eZo`{h$4Z~|C?7|gA01ZH zJk>Ey1+XTw@jNgvn(k&l^X%=)t@mpb!Ju8^3D^7LwHx1fFO*pIgk&0;;RM;!Wixk? zQ}Qhqgi8EXLUCRf+axpLAq8_>hAF*U%uo2NudSv|_`qx0CYAjHa4?wQSWM9UaWkAj zQ(jp!X^#ZO6RWF}=GBA@uE2f6s~Y!1JTX-dYtwjm2D9a~xwD9f>Rk)HM;(lRhu`$K z5AXkHf1~sd3DsaSMnvhEIxUlwcsX&9A$rBnqzh=@}p|1Z10r6uLydByDE8R;#-APVnLHA6p zM|%5+XCh<$JeX2#F}<(eg0wvLsk;=0`u+~uS;I5XG zg5a5p>WKLOm!8h$41b9isYYLcP>o>FITj%ks5sMixJ*yD#p}QaF8tUxG~Pcf0Qf2y0zWK4@edIS54AGQ1~wC`<;p zaWq%d_>%^q?;SXS^X07Dvae+i7jPUk7EtV80twld-}-C$(>R9^1u3&2e;a=5$gT0_ z8S%`8RsrO(^_ z#O86s-u8tq=bk+5R7w{4BmVBMdG`)WJ_$C;A!xK5B*)cR!nt3*^*Cd6 z-_K9uP8{zIftTM70H|pQwckB*8Q|i;kE6 z-M(Vp=rExwA~ESKSq)TA;N*8(cl~PFCSsa1ZfQu1$5`NK5=)l)ML6v38=%q3ts6&m zW%<_9JSj|GL^k&WJi?QBndC5>zD;{tTVQze_=B6xQ}&dr*P~k^KGQaebVU-s0NUo{ z*YLRvgfK{q(j6%gwc%ew(*ofX#xA1f z#6%$>qpjiOs2nc(QP3TXsN{&g*SqV4PS2l|IDm8+bf1yf-Oz2*&y%sJ`NKu|Gr*;j zC9FJy3LE*wV-rsyPQ}R=U@0g;xa;hs7+xEvmtH*o%C2l>{;*)2)_7QAlD}?p7HY@Ja%fqF)w+EF~tt(j?)Y$6{%yoa*Ui$z< zFdhzribCfQaO{=S4N|ag!R&-RKfzGxSI1V>yIA;dUp~jZ2VA!XtwCCV8&(^BQnP=e zo1z2vLQJ^XkyAnyPrl4E)6C`_-GQTt+pU*A2qX^FeuBd9wCP?Sy#%HI49)faCV)@P zz^9WDyZy)3OPMsS(0i2bu}6GzC(K={I>@RCMXv$XEsN#>hN-`VbN}+#4g{|LC9HFd z{?F?7A1V>_9~|HbRe^f35hUfq;2ykkB=0%;3Q+q_ZxLvzmhn5Do$-Ocnk`}e!Flp) z!$VP&pr2aD@rmRo6gj;h85;@%?pFGaZ2nyQ**zcHk{Rwaeu1KZ1x-ca1X@-$%+YFy zU?4*il!K(~UPoMIO=*&{wRz78{@V@uLjgf|Ilvk~&tW15oLX99&+fw8A*_5uu;Lbb@G4@ZDa59+~nGmaa%ZoHW+bm7Te`_~{B( zhwC#S<^yE&CX@s4OJ`BM+8nbwmDbK@2R2UxV*-ClyIDp?Mu>~dCD>@pvrTH?L$Pno zDIV@u@)5t^xY}>(xo_71&bA?x3H8u^DEjVO$}OM8`Z}`0 zc+bm{@q`7f8XFTZWTr_O?&WpkJ~K)Ekut1aqA#zYHBTg^sp|W*!ggemQn(JJ9K{8l z`-u8d87^z5Dc}cR!04sK=@mF=)z_Tkv&wu_!p&8>muqCWsniy#6FLN%zh=oWNZC4q z**!{=7VTNQF8eM+IeKkgvQxovCOBc`D(2?JL_s&-l*R)VbU%qba(<@dha<@h*N}#O z@4$L}cs|3jingX=t5m;u^V6K)a(-w*FfAyHALT0q@D>|?P|pwJBt&qt3Fm!!vAGx? z6DWE$iLq0&h_N@4xJyHT6UE_8Dxorz0n3TN+Kv>HIRs$5L;mE)0)P184vR(rU6eT6 zOgGn=sb{@S_LLXe$AiVO3{7mb--0y>o^RXUuHaer%-Iw@3~83L4!Wf0?)opz9R+}g zCciyte@&mX*-;|ihIe04h7nl zX#vYXT>i^B=|3LB#3-Y%3Rp98;==g|ICtq9MQkJ`vqi7Wl}G7R=Z@>GdENk4K3)#f z^U_ashSE-(UOHoQv-^_N#=(3X#YX!Syy+?xxIHU8(?bOq+lxHryp&56rdIt2yX5-O z9FC4p96t+P3c7|s3rV*W!|%>c9`s?5*9jj!mL>RJOnqBIVXskSYx4XabJY4a=B+f?`oG$A)G%#qedORa}j-lSL zMNt6`k_0ZMkzcYEb!b}PD;q4bzcS@{UV?&wf#sgFsfI_*_1;f&s&W^~6U+HbPlQFv*xQ!?H&jrL5dzef^sKa(f;UPrhRd6>8l( zE~lEUN^Ts%!8+jl@LO!Gfy8;!JaRE|`YW7u-1+Lgm)tXJhIuki3s0UuMHj`_Zluns0{gSm<#z-u;hn|35k;gXBAA_fJ6C zslbNA7<4zup5z2h1t;O1gE$uuE=?x$-G`OIAn?VM6;Nw3Hp1r)AydoNR3i(cR;BNq^{_HWNUGjbcuYhh0V;{9uYSR&( zExhtN?p$j4Hgn8S?&eLqr|KLxqQ;l5u-Wgy83~mwGn&};j0Gr@v)r3J&$Fw3Zubg1 zzqFkCp2XGsna)>{2KgiAzek3DN5}ttNDU1`H6pufB67+aVxa_?va_mbl)RDphfu#&?WAB=;KE=x-;VJtJW(y zZ1bpj?&J@YUPKwb^xewQp8MFH)?$gsbd5|6X~fxy7gV5}_k3tMImbgi>r;8Yo#$EE zhDi$Vrl|MTvfUAd@y_)q>11Pg=%6nEjm=@Z_}2$RQ3z-0gyRKTuT;b7s|N~nwEF`LxS$1D z11oYq>bA-G`O`g4q>DJ43CxSE8GG1ttk(#MovOD-7hHpS3Oz4sKSQXL;W5^zJlE%J^GYKqIe7Z2vTQd7UJJS#MkgH~PtrbGn}x#qB~z5Dmj>0jCZFF3RR z;A9F?^`q0p2}k@MDLOR2_`ZEckMA6xWO%9%Of|3)-%C!@WUmU0oX-vuH>u4luQOiN zr@TxW|LU_o93BxU8m9d+7p0=93%2b|a#EQWYGSgz2u?qctT+#h&W3v{C|j2llyf(%U<$5r1Vw9QxBawljoboY@6}1h%M^3UCEq zRGkR)?KVb8`?qM;$()fE3>)h1;YV0=k$ea(Z3qsy2Q0ycpYmROjO4UnqAMEB_~pLL zhFHW5m*kH`nyb3moUGaJPyukTzZ{bo)IJg@kN#R#ED)GylfG$QaL71B?!2=u zXRWw!lD|CIA&3OHd$C!^KmYL39k?Imf5!=)NMw8C?v8fm&kgO zLklwE?)q^l{WQZ{fYZu-k^q4X-E+jI!(I=Os2LBdA-mCnG!$pVo>db*!hm6|V%w_hMT)c%(&M&_2qMNfBdTuq+KANRsYP#}b zFfK#U9?>&S;+mqEf~q-e7`3am{&R}LgHYP)U8sQJ4`kacLDY?u z2;qjV_Zxzl>@rk{dbmA`p;;@O$o(^!ES8SqfzLfbY%2$YS|d^mluh4peEi;c6ZC43 zTKWnl0(2=HxP1M4V&r~D6#hM}^$)E}0#VC|!Qj(1BbxGa(1e2r62k`BA^ha9F7{~} zl~RbFO_G%)u`dq=tr}fI@rH5-x-Gc1$R8ug;2yi~qK-|L*M13emh5zYcNy1kn(L+` zu3A4Zhpn@pAm-L#eB?sY%t{xhXGGv&e#I|l zm~w0>{sVTp?xEL+y?mnAJP22v&(=99*nc5XqJb-|0SI+OtjD?Jw81&$2W4U(*=tkJp5uy=e%cJ8hxLqh4hu z5VH#sZPVY2SQU`93bY{PaU~GQq})KwDLj=8P4yq{w#h+m?t@M8MG zoySVw6%jRi;&Oe8qI`YgBB6bM3TWYK3^pWuz^5^iEv+aZVAp2BpmmlYGu{kgn>KdARyNgS#Mgbf>Nwq7;{?K+7eg)s(6)=MrTIuo@MSh9VZbw;bbCTQ%b~sc^OBZE%XPEDhPTN~O!7pWDu5odsm*fcO zT`e>GRoq1iKhECdL$Jp9l1+VO@=|*H0!`@n-M4dDIZT#`YcveLVLH%{_R>jMo>mAQ z$pTxCNYoZyx1Pj539ZeoDSxVdJjp8Ns$U-;?_tXpAn;Q=s7oQ!ptm8DQ~)i%QG)jH zljns=P=VM_qOt|<{@bVPYC_Ma3+|s;-nz6vOLyv4^Ha7s)ZAx?kc=is$uuQE3LI%a z66TkrAr)p%CM;s0s056pyE@z-Fm ze|PRbCz}5waw;KH!O3N7%3)4*qwV-a;GV5#KfCgI+Xqfs7x(%;YF}A@`n1U3!^u~B zbMraP&-|c_R%8Om1*aTcZMjOwo1a!~Ia8yVQjF==Q*P46Msoyry@30xxL{!Y3>bQ_ z)88eG;!ZM=pxEd(Z6WvVyZY5h7Jh}7UW%}*=@}}X@!{vO9I_m1P$oRW3gAJc>E{&k z7{SG0l;q{#%e`(pa@Q;^ZGkQ1k!X=(^4!t>q<9@j1%d}USAwF`lp6K`F*%afd&1hP z0E?d*rTeq1*p}F(WZzcd!ZF-(sm+pEE0Q1;gYjDcO}UNj%wl zZ5;@8H9FV42aAW^1oeZ|IY#(g{J4okLmsZb<5Wsfdw;=-MY`N8#g*{@=2{0hL`LQe z6N9)HS)E`B=ELZw0t|DN+5*@k(Qn@C#G$-L^Y{~o6*+<%$7xbk)zlP3eZms}fML7m zXgJZFGOQlI&i;*noVV&Ej!Vd^s3e@+pgl1YTa?Oqljb!|pY$pWOp7E9zXRv$IW`ik z>Vl4yxS@%$v+1<;O+l;pVLB@L-&x34;Y$#6%2*F1~33L16QBZ zkTwFnDU2U*=hxkSW!>da4pBNci)S&8-+0icIqdm5_}l91qc6|lLzF0th`HF@_EMa& zMa{F@q_KlLXVltXHSs9(G&y{TaOvlrl-kDI8|w0ce(I-;Wb4VQF_&!0j*yP)-oQ< zzXfL{*;kdD7u*TRR5!Kze1-%%sQsB*$C<6~~9$sk9md0*Ym#`>b z>ALTxbT-hoDcZ2l!2bbq)jAHKK!fjt7u+U)Ceh0@6VYw>V!BJVCU2GPQ#*4Oq|*Dg zmj^E$*7Au%*9j2yLq}ny#d~;$m|z%^aK+dJg_EhD889fLbDVINZaq`TLx$K%*;3R;(60$P8Tm5$cw z%15YpM(Kr2>%l&DTcU7?v4duJ6cBGhzGTN>VU8tMv*^^)C+{^(uD^j`g) zfDyv4LyV0oJXKjKH0ZpW|I-jOlQ2qau- zVefUONj1qxphXAU=%SCTEK|Ac^!#BUO0dM~VmkNI>@T?3*o1J z2xzZ;KTSfN3@U>ri|uNI@O*}r*iHt8xd=2%J?G7cj2^Iqt7-dSdL=rLu=?y17};9l zX%5+ace5QhvBtKS0lBF(@5a5I8fM)2pGyGfmd-w|R_CW#zG0F_Fn0yw6 zn}?fSwa^Q$Uj3zu{b!r7@qceBVtD?0--J^OjE-!vxa5#`zz7=2tI5isQTaC~joW`U z58Ln|DwD3`y!w+U;spLFhjApwsim6KM=vJEI2prY-|6jNr5UQ9ZPw<%?uC&Q@(D`K z)}93`lPWd#6H`S>AI)3O<{tL#)e&S(_00X9uK8aF>E8(0Y1@zs;Wy#YuyT0hv-7wF zH?y%_Y=`lf*PzMQSCv*G3%yZEs;#ZGqnAFjLSG`2p(O~65K(G9#%@fx_T_FoUvLkM z-F?ZR+^OIcMwCXPG}-9T>t&DYU6d9NKC6+uue(+uzAP z9n*I9DZs8$d$r~nEpeRDr7HNKF2Qri4@m$)6O3!&M0t54Dn>bo_nL`ELH7{t8vWPS zE<|AptRY*4oJ0j&`(tesoe4$gq!=&(X7976+ZE5$eg?_b6}W5~skE%Zv1Z=i`VFdi ztPw0_t3sweKC+|T@Y&h_8A zgIHCih$|>JO|dyMIudmFaN?X9+bTuq^BfsrS{^qflSFfx>O}q z@RvLAs*01P*}!h?S5NCKuR9M2H>;{%_Hm!fy|TFx!lipMO#2GC1nP-AOzA?f>DPbA zUCWjn-D}J9(8a%cVt!<(+u$^v9sSe?@l!v(Kr=A+TcKrcn0j1=+nvAS>N+aBuy{hi5%y z;kxHo+bTOB^4z-1V79uB*CjvKA-K1*x1SykQPsI>mE161S7k8s=!~t7&}*#cIykdM zn1ptCy5U{k-u`-0VOhu&rnDaZxSzzpbzr9lgz}NDfmO}~-kxs<6}xa}mFm(4b2}No zA4YR2s2Vx1L1Bf}7jO5p*0<%>dO(IvEJa>_m}QHWP-(KC=XWBfwoAEvy=Rlt4FjE0m(L03@$=~XjXiCXfvllS-1N{&BEb{Y(r0GnI4(q#*Al&>`c*5p5ekKxq+#~h5?(1ckbZEi5()GI>I{JYwti7q=b>?PAa zeo~*dq-MB47U}@&(T_Sy4cz2%)ZE({c5;@td;=dzwLBhlLmU%}=O{gUN4Z)cr)u(o z(J8@wDgARZjidtX$(eEdb8=OKoY5kvswCCfguE0?<(}-G)iTn!R$gftrahl7!deUH zXpfWgpmW6tUTraQQOhj7EEEk}QFPTFuf8?9bfG=?dyxOWP#*orZhC_~IU98YHYtFA zH~P$WV7Kc5`7qu(eYw>h^-`#a!&pPVl~3-bOA7IGi_iYVVcXC#3h2NEm8NJI1NUqj zia)e#VT(J8-fL3nWXjFCWd%K{4^?*&nw-?HL zu}5L@CTfs)vyTL{l|Wlz$8^inL#!nnc&BxG^lq?7N~SC;zx9b=>>`VmmHh?z{t3TG zbK(0&W}uNaOseg_!wMGC%$*}x^g6q_0r*^UK24V&6gA(e)NnZ2M{8$3yolGpb|7PRLnhn zMr81=u$u7Ls_L7-7m8~`KYz0t!FBtRVJ?+8yvf6S~dGta1&8mtjz0}h#*H%T(b%ViPQo5aD z5mIe%3HTQTiSzgZbfXE*7WLE46=xH1#WojVI3k|*qa^z5iT3P`Ifn`+^2A}qhwojg z;N}PhZ3P1DLPwbL))VNFa;}jFiF)^Ro4@$ls%F z{*SDS{BajLHI9!azt)D5E)0=0inAWI93voX8T3Zu9qkKQCIZ91h*vJ0WB+`4yK|Iy zoCx|6nm}aU4VeUU9UvJ8fPrpQpiSv|Xh&gp?vNdu=cDg3Ue6ji7++^|nb`wm0pyY! zeuN40`Suk?q&x6VhI1o)QzY1i04Rc85WJ8Y4hwAJg69I+cYdO^?1wT000?;99D6 zE-Phk)4RgwfgkHLT|2y%rfIOK*XQaq(h7tIe~xdA677S<$OXaDUPT0X%eW~g+ce~^ z(V|6&+ez)~pXa)SLpR=^O&RxeH5eWxxe=!D#^ev7?6-Tsd$F}l`}TRdO$+^qs-4l{ zGh@v-8+!BF9^{P5MI(?P+YQ+enNb}-kt~gOTnmtDn1S^&408=zo+yy~YMNU)<0|+d zJvFIdcb%wDnT7$VTSVzsUU0i)XPl zPGfEK2z8m#fx&A-POW45@Uqyi#jQ_o8h_Dhia1P+q)X{jgl9n_5ZKGm$;kOOa(zdf zGMu2JtacA{6GLU&hesq*5t^ub;_M$N1mvp0oMe+XYiK{5Sy}#Z1ADsXt0P?Ey?b_P~)HvxDfG{+x)FClN#+#Vaps3COO|h zHa!Eo+)?4bVq}XRQn4N2@V!@bOb~G!U;kJdeZnkDHc2~x`Aga-_$^KwTs7Fs&G6%( zjm|R9Lt*~uO;Lr}g|@($QJ%#N_yVkO@jQ~5&~G?^*>qFg&=RR3vrJrii@DhAY z8~$v7p9EU`5f;IMgi18qq_H_pHNKAL%+O;s1=h3r14TGh(C9tUwppj1 zVbJcZ5GnN_OHoghiNUiLk$FyS?me5xg2F;3KwN9^Ba{>ED18Xp-U<-w4-P2s7{|H! zC79mb3g0+VUX^OquVbgPw+{Pi){#s&)qzpP&3Np#jyp6_Ag|M$l+L?V%p^A2eWKa< zA%3qV@WKScrCx$6X!hX9McQXSs%K}RZLpiq?(ZBiaCULwJJRX;B<<5p%Mrzk-68I@ zKWXRTB<>hAC4GAW^e4*V>lUOcAAVfDeiU9;a#1p6d?Hh67a3Cr;&Jr8TuPyEm)S!Gyu;djt2GHv#!PH_M|vPvD!rxHa?G{f)9zP|!sl|}6{eq; zj8Sp+uU%`%S+bazIguv-Nh&G>vp~GIx*ha1*lNr+3I0g*GW0Zi6x<=xpcxkB3`x8( z5X_gm`o5lf%CzD!TaICyJB*}3fEN~I6b8B&*EzZzx6>8r7<>w*hnz+u2vTs&EA-xl zkoj7zQ1On>?`&&=LD(1tlb{6h(rrYUWh9$>R@YQi#f}mD#(B^s7e3&{9)`T z`bHPblKdD7R%byJpmfhD7#(*cSfS^K$g8q*0D+!1i2_`gEzD z@Fo>lJ;s+~wHM&5!Ax9lX^_Ou#_zr_pJiGb%N%><(;HxI*>N9y)LQX7-Edl1AEXUT zWRuZ>V0pWTVhz5KPnew4d>(OmH3PZAB_YqStUlh9%!W}To**MtO#9E2R!MO20M~W9G?PhO70pXq zc%AyHFphNfv6sqKE5}M(l`z%gxE!_~1VLQBMOvPZGBnE_TD?Lscu^r4uXQx1f`dVpr|yZ zSwNy7(nM_Z5*3jqqS7HGiUQIF1r(GBNRtveQbVr-(t8UaHIPt3AjLa9=j{ER_jT`c z_9^%KzI(2J_*=4IWv$FL=a^$WV~po9d-y@s8XL>hojg4vpX#{7|JU|S&N)UP??Py8 ztDE4X3K1{Ya&Zv@;+3+yu5Yclre2V+rcJXE)4ESBz>~oCqze@pCAX2(yEn>P*z!H~ zZehC_55%n1$&B8noUrg0eabLgbp`A=!;9`ADO8EBHTItNtj_Qy!R#cL<%TaiP+by= zEPg($9lP9v3mJN5l0!9in|=Q6MSj7JI$|^R7~^Jlxd1FNBL2dOoR$-e1AzWbc-3<)FM{lUr%*Y3=wTdRYHuvuU*T zk&6#(U%xtudW$|ty$pD?96R~7(w6vkChA4ZF3W4AnKem#t9$L&WoDipd_-W@?^x6L z`FX}2O>!ET*Gja=D*ku)+eAHb-St56_hO`VVV{KP>50AA$yew?+py&4*T_NX_Eik|vAdH$ z&?k_ey`hIkw=Go^7q!&SO>cxuVW`|fq&tMr$NJOnHsQin$3$9aO)u{l$0p82V(Ol3>>U))I)?W2hGX@^=gdY+|Ep_%Jj!No`hW^#%-@Q z0$3F`xYRfg#AKlC4_t@LRql0nJq- z_j^jaA6i#MNRmSpSltab8Af+(Q;_~t8QK?^O++ZSrtKsso;Zi_elf^ulOEHPqlccn zRK~R(_5)(kW?T*B23hb4_Duujr75lOO_4n}W6Ygyuxzrp(E6g}3YtS!E(I>ZKfpm2 zJ{DUPSUZ^3t2nlgQ)uCpU!&8Wn~zUg4HZRNf4RTOmHce!0 zzrf*6T?Z396xr8AaweZW`g#iB=mq5UhM}S!wi{Y=rgc9cGMIhJ--kc%6Jw?4J!5iG z+7W;^H&G8h$Kh8S(8FzwEZw$O39e0b{g3@-4)qL0O@5d{-Y=DZ{VeqMuIfF9__29& z%VEaI$&Zee_PygxE@Ii}+))%l95kf}0zmK~)Aqkqn(W zqsl`lxlsH~@k?$;uH@=NiG6(SU*61qfAf^Vr<1=WxF!;1|!cS*hIXr4VIWNX;*M1tewO~N!uot8>*Ym-rE;!U zNQAE~!Y{HuA{H4RH>nzfapX)PgUCglFA%$0j-{)>L8(E_399K7Iv7>JQ}ryzt~k~V z^9+;LJ@X}jKPAdj0%l)wS6h0QM1nSRp*7QbM0Y3oV#NXQ5p<9`eERAKgs8|sC86pT zkV-!w-~6XmDJ!c0|LgkoR^QOnL*siv*n|RwuGQKoavW@G55a)Ox`U$c(g4y^-t7A*l1{KV4V&%eNiakOXPk(|)LVcn{boxuNu<5xRZ9nQ)q@KM{_w$B>8V2TMwc zdlKE!+YWlIO-HR5y^Hp^hu@tm?-D$_G@u5n?Cc>N))Qt6BTK@US1IRdv1a;m^aGqc7X#>h zeO)%Enqk4i6K@l1X3g0T{eUC{U=M?;t3OZ!bd*%L2F%lA(vyOz6+5?+e$`O>3!%<` z_Q=?RR0Dbo2jtU}fwe@+5#(T%JS|cQ%Dt$@`E6OLgs5oLbw%#$$ICKi zmv1E8l#~2=w(}!q5er!CU!heG4{=a9iVoEyV(2gAI8hTGD5^Wq^O9@C?(DBP4@k7f0BAT&e*vnu z{{a61$ncL4TGiWigSmqLj!yzTO`X3y0g(H`3jTo1s}r_pTOL0kO^!PN*ZdQZsP$*e z5<>U+B)#fYw;dyuqK5MChMUOUCWxUoQljW`7ttY$EIzBoXx| z(DEba{}IFFxKT%9pyeTKD3%MN3cZLsiGy|#Q}33OUYH1Izp|9hYM}N%)QUM3anmZ1 zV(kg5HA3Z=G&pAJb2siyB79G3UU1^h&-Kr}$ofhP5Xf`>1+jA>iZX$nliZ2=9J6H`%e)TP^cW zN{!743(KPFcVX>iSE{$4oS5XTu3mu4{R)U4p*S`i1c>o1%foxS?g6sJTHV%a9vdkK zmP3S#BAO`e|LZ5s@3r;Y1pQ)ge_QI`8`?kOLHyqL{~<@~_b~k)CP>i#AztKfhv2tE z@Y^BybFBQ^g#R|-zfCwmn*ImjCBJvN-#gv!o$mkToz8Jbx%f@H^TDqt?`hs;{?hJ( z{u6BLm;qsUc47CeUL{tMqqTE}eX`<(1qDIh6YNbS9%~B5c(|Y0_xWR#0mQJ3`Vr(Q z$`SW^tDwlvVcWV&j;ZV%x)@xksP1^3$hr1QB`hp+bMF4;dFrj6iVTF)_!IyqULdB` z<27!O9~1VhIkS^xmFM}mpq2Ew4UayA7Sc4C`<`V z7Zv2b^QiI2kPkBXnid$&bgWUKt{`VQ{lrA~@^wun9kyfQ;U{?vFZ0}b1jr5!GOY0d zI$bt;C#)b;c`JdNu;Va(_~owQ{&e0&is$0pBkC7_KpsS2RU~j`QYj6+4FU0PL^+~XmiiFFn7;9=m5JZ9$$(nqJa%O`3*}(tg zsC^kc_xY9F!&*D4orE5p$$&Xb_;XVq(mqsp5jwh0$&j*B zoBMT9!KA*J@4Y_v?Yj%$$$jk^q(TwP5`0kboOX!B0|Ap=EN7WSUkK7|0nOP&-gqJbgWEmVgk>}-OkgFt z)x=&iiIqxSbP=v1s4W{y>m|E#^InyIRtY#fx4_#x)^Za` z;B#4c8Y03egB;LTu)FYza)psRheUM1#dlYGp^pkabUj5PKvGAq>ii($2`#0FzvAo@ z*^2X%UoMB(9u{s=%q>6P+p5K+__aBULx9V~4KuGn;v#Fg5zI*@gwrpIOxUZk-5iEf zc1{j2Jx)LSWo^{mE;34dC7KLM!I?&A;hUTw_jJIiN}OC<9}!r^S*nv}Z@lFlwqfF# zeLz+IcwJ|&Q?2MdCe*E44C}Udaf-aB3Mr|Zsx*aq8N2n^)8%3>s_=V$!JPwES0YtU zNwv2fKG94mW^YoJpH^Cgv(pbEl*t!AO8V3J$q(D=ydA7hnbz-bzI9s>)7A=zf65g^ zzgO=0l|yQKYZ|>=LO4wd?h$Ol#RkZ%=F~n2yz#eGFu;eqmc(`Y91fGE?$5rSc%8c`1qU6s%ju?Y#?)e#v?Pf7pCIg265f|VBK zNtxW;7x)w@*#--)5?L{Mqaq+zSh!F&G&qa9-oNJz1i73hhE0oLBgbDLq61wgcs(?QE_!xBAx1dx>x=k(t3fvZO_*iV^7jO{5^Qb(+>Evqg`jHjBKH zYp+;?`VyqRe7keg>qgYGrzXh^Q8N?|Dp&F}ZyF97IDV2WmvyyAYf9y%8~bUm7Cpx` zoLy`e_q~bDH{Y1?K+xoG5_|E2Zu);#ncaM5`&TxSe`-SE{L%NHSDdBGBA|?jE3_O} zJ zV6XXCc&lIZSf1w~13IA}FQ6l?qW$32sb%b z1i?gZTaf~z2)O=$(70SKK;=+1+-^Y)0}bsA0rRGc=FzI`S*duT;;WO!SRwBxj$5r* zH0sa1*)*m%uR4M>>cN!r73LqCMH-Wk&}yDV%D2eq>Sw=9;L;Y zXT;qt&W+}}w7-~#^bR(H$+H7p#s9q|fPZO>`i~wtkB})pAQF-|7%jxRi5}So55W>H zb#4o)Nuvf5B7Z=VWgST&e@=^oiBbz_1+4iBQ_xv^c#q6~sKM&*4c7mp z^E_leVAD(QpT;s@L%-3&ygJ_koDj@}E)^6*`i=g8G;2(*(w+=pH>3n1pg)R*@DiIJ zlhg{4!}(r7yO10&qMMBuE0KnP5ePfe>kKrX?gPnygnq1{-QO!1VHB#j68VO(OoV${ zHwYrm<-E?QC0Lq`evA@GdK_SE)O=`QeSl(&syTwNnetic6hO8MRcIz^n_d2v`i5Qo zo2c$cix}%;{$>843)Qr#HscL*O$dq)$wr=_Ttl{%Rg4P}241>NFj|_QwRg?@GPHS0)u7(L3<%lB|Bj@{ztJYz|6kb7Pr-n9u&o*q z01AcF=6^tT+=2nuFd&}#<@8fnLD@e@B>7k3Noo#Q4K=_*g5t=*wlq+z6B0+ej%i&b zOY>3Ve9^SfG8FwKXp@bC{i05>!3FQcQn?i9mm@-;n{%H~^KEfJr{eFej{j@U{|ySJ zIP5$0$W8i^YTC?BEA z7tR~J_7X?xIu;AKdCA)Bxl7!CwH=-522@3-h+3r2WZP7-vhxtCZorJzm?*Qh=r^G2 zd#ye)>*%f;o{Gu_G}C5Nk#FXtvw$6(OI0YzbG>%0Vp!{?^kh|`hlWrgABza9_>)f= z0?a9HhW-MSv*Xt*%jD-o?S>S#Q;2iagRJy@rwC;#$B{?u(rR1M-|-F=!8nCZoei;n zED&w%KGyc$RzP40UXIFdst59^CbWbKR-#ZNx0Z4d#(v4gm3aAZXtQO2Av5H*E2fQ; zEE7n5O6NumbbxL8qnYtMc3A`z5IrLl(5pdPYO-i$sCSyQ^ohp3$~%Y-UE$Wu5D&Ey zOcQ!|Vj4WnfoiOXTPHhWH{pI_mZ$8nlyYI|^SbVd#?>Pg&L4WYBv zmk)>UPeeVo!5v?@-LpYI}usK4)$|3}`u~rnSL~jhj}<_a}gfsfTf8nZfXld#yid9UH}@TiRG3 zxys1$Mm4Llj|IaHY>^A%A)sZXXdu*xd_XH;!05HTvvx*c zvMMwJ{sBrb#01A-8zv&g57Oc)ILpXn-;ZIFp>v)6Za4hS(DsHO4L!cxeMX5=Kv0>o ziX;GuB7Y>0UAfsrUGXXNir|w+-&5DyBTQ{$AyT2LE(v*5n=t*h3i5iFHPJ`bt4a6g_TMKj}e2{7Ouaakmecc zIi8+b>>HtpG`EKmj4?y78|CJXZ78mV>jh2<77Ij02Ux`=KJF^DV1puLIGL|Wjh7rd z#V*y9z)~fc;GeB7D(XE!0N_!E(RclH6V!f^F?!D-r~_aA4UJ8^cjV`Y#P zR0r_qFOZ#32wiLu%BG4^OOG3W`%33zalV3PG49B_laxlJk-+qGIGa5d3bym;suScc zYa%ZvlU2*KzQOfilQ|zL|6<35PeS*7;Dx^NUawZ9?@D@nMLu-wYfFEUcB1h8YcqSA z@0{#m5BtkTu*cCQ#~yG+z87Ub7c5n$qW-V8{{MNwj2iVKEfZ!7xQvdXYtZ|tKB@C& zWBFPV#jzZ42+)u&G^ zz2fK>ejcuglA0hG%59&Q;|1jE39mtQ^mXG60}AlETGD=MOXN8Ms+BI*3(zZn!Wsp3 zPCOvA@AfgH8De5l_ne0kdPvvFrm#98x&5#par6!Jb;_-n+TQ1?kF^SJM_o-Yaw&hm zfk{vQ8$RB42q~C`K{C_7n!$(F#Fs8^dL_%7&66$|q>pmcYrYcK=#YqxJadQ}=v$>Z zHdIN`yWos;W^tbh>iT+beLfU0XFeqZtG4?sSwGRM7|uc!ODBJxdXn^=HlSZfvblEjT~mRC z?RXUfae~TIKq?~MijoUh*+4T_5A9Q=FeO~5TJ?U&pf+VZxR1g&WlZIA)GXN#M>r6v z0}(Y*P3kYypN1#nJ;a9I03wWQfg&`RMg;=}f^0@{SVvGKr>Z_=j2=}`%MrTeeut|0 za9F$d2c#_c{B8(JK5hb^K`|#M+;vuyA_s|TY(2ny$`>G+-{glr%~B?>QcTQ2sD;oV z7G6NLS!X)v!d5ZL*!(fpS}Ptx;o*_Gb4oFh+@VYb#o=QYHtHRc%JxC%%8JmD*Q9d7 zNG5Qdcs7T0T`4x5BY`;C7a!?L8yG*Jl>je72UsZ)CCW~RB=K{SmKc~`_$a+LPgk2| zAz>EKfNqFzI^74j#;ErF*J+Codf7Z?CV~WN+x^0TkUWEANq3G?05LWI-+Z}yGtDdb&}0^$#5>%f zN69XiVRP>=^FkyztpZH*-u-o-=8XgE#^r{}EIF^)m<~RRQSN3tQX6j25(u%0)P(qE z{|(HNdCr!~qes6|(tzFE{sc(Z9vE(yfE5Ywr>Hg}BfXjnwQ$RgVo$k-U@E4i(AgKU zEDtx+z8&s6TJ&aIV%O~JxerM5 z*4G{J8)m6(&0l3Z8VmE_uLk6A^G<()wf>-``U7H|*#CKjP{CN=z#? z10QK?KuQygmm`Sc^=f-#^nA^v_!CX{Pk`2;@XPWnhl~ddBXR7E znna^O)D(tmNHcxG>=U=SrTLY_={SK~naRf&`MKF0FFPoN##O#kFxD5}P6Vs;9+it0 zt0qqltXGB!+XUVqDivH%^c7rOz~B866djtMlq_y=_!V;uKOTDO<||{82OM1FhHOj_ zD^f0jvS&Z&P&1WYd5E_(NI!K2WRLrw>kI7)`qEJT?d}B+B=!SZlPJ zTLwG`9Wx->r8bL`AFHD1)92yDZ8An)Z5$fLAHz}FasCeHXeYaTQX za0gPZ_$7c!i^bEiR0ZJfk)mnp18bWU;8V0}-v^l54+tBuYv)r?*NRr|Pt+zZ(6xB^ zaOe!e1odD%{R$cfr#|_%`*IJT(RgQhE63`R{NGg$+_WLJrGIBR_2P8R9!5&;RC4 zkPiJgl%*<5(_PS*>Ib^rmO@cGESN@4vb1fJ!Lq?_PiGRUD@S>Z9DXs=Avi74#$nbe z`3`N!b~imY!facZS7^8|OrbyfW|XW}JB)Az8|XcO-%GhgjweMBakM_4iROU{b?k`QM{$l4zTlL@ z4=3wb!sTHVSv~{9Ma7OmhEmGKW^$4IW{6zlQ7RQI!B_OIozCTT!XAyurPsDNG`|JP zW^h!jJ|^#toXewx(3i?$!kJ~c3-D;5Sb-%=l42=Z3nefCx}t#xC|r3}7A2%|=0j4f z;k&)-vr&&cvX1?L$hEAi1PI0683Pl5V16d2J+@{$7G`6rG>bg5&TsOjb5aNzhJ1>u zIlJPTi5|pGC3aPt07>$2P3AKnoO76lHje7IlLwObg$L}unh@eJ^Cq4~G&kV1tSnD1iJA|o&{u$?5ar<@E zmOp`Sy#=KON3BEYLa;wC;mt}!B!wB(@)05Z1Co0VHQ$8EUW(wOn(kn~4#(C;#8e%l zH=qijjS>8#0Bpg*{jB@lDD}Z-bHecWQa695$9}I21QDMh9ix*jaF80q8xYE?(R;8D z=aEo^Qg>t66b*KrK&f#!67wib)xEpfqhsyt=(2(I z)~@Q8rd!52mzfKf;P~$urFcjV*IU0B0 zcKpBG5)N*Ow1@7uxy7QXMc%e z(O{+jyFHI66#!!Wj*|aBj^>TuP~FJEYFt!7BBs9j^BUP%r=rqdXr+R9>B=$RIQ`Ga zLWb=?VETdi_lvMXi1cC9_9FJh99Om6x7_FEZWwd^)cboEcL^ttPWmlZXQ4bC)ezXm z&S$_b8sM2J_sGLr*9gm}1<~lo<%UF#OzD8(o%nQLYB)JQcqSgk2lS=ZzCQV?BN3(Zk@GqB{sj3bs+#i|m)TN+L;)O1E|xx3 z)pz)&BinPjZ&r(45A&;TuW(MW*c4>QiO=bV{ESbTFC4e~C8@?4in8Y%giSKzC7oT; zJp;8YnH%K&Zd&y4+$obA?D**A!I+AuHW!w{n9-lW?6HH`Y1DEEMl;KybtfWFv-Sh5 z-t6JVOKlEo?%S)y=%?y=HD}kx2>PhoMXxb-=Olw&9Va-*QMK$h^?L8xJ#>0#ZF(n8 zlK-CTZ4JhGpf7b8Sq*miG4lrR@o0hq>1Bm^nEH0qfHslog;e{gZR_I7Wy{Xi*N;qd zb67<-Dar7r0sII>)fD*^T6i^iij%c4l8m|$AY-l7c0fXTfMaRaSrvWMZtP%`N&1be zI+%qX(nWHHFENv3Peu{Njb3;37Rj8^^b%V-GWI6IQ8jREHYgrYMSlXe>mSz5`?s`) zzWuicQDpNvIN>UE2v%!#y1VMIU4meFh-Ft1zmmCq{Ec!q^K$za#8Qo;wM@Z#Z=CeD zKFF}8|97IlzeIt*9FZV{eH%N|1H6r8o1Pz#4b66B`alHLiOfToAO#Ryk&NV&JF>~i znjRwa!N+GxoX;I`)u=jZRLwDJdys()9Kk;u^^d{Z<&%=j?+7rGeObRVlFP2g-o=2|A zaQ+BJt3yJ1eL0HFvPzY@QeJF#7e@^C>^=FoRJG-L>kju*v@XSZGNK9N543r-o@<3y z@icM%YV7ReN(9XXJ`uZMDY z-mIbjwUbBI(q0EVbT})Eq2yIY&8c@bLBTsBA4QXcf$Q#!} zw7kr)*}QDWNV!RtA)>2M&?-@Y6CFSbjkS0rJFrVQ&RxC}clOTRD6PZLvR17OrrUlO z_f#5TPhx@4+nU`g)Sw3_wi$NY@%iK1LY;vX2jYnoL#h-lo$5Gg03o-#qB+UP#c?U~ zQ)wn&6ZH#kC~w6vN0umXKcU)&K8AN~qM%s9b?CP04@fX{ljaOUi$~X(Hz$%T+tTg& z`PQe~OG|={s;fum`KL#Y7A~>Y{(!7WFMy0R_|v5Rl7BAOz$lV?aOdGQ6U?d}IQ*{b z&Y$hPIWm0h#S9!_AlPZYhTERFtJ31xKa->s?pWBnbXg>s+#+>(G<&Lb++iwg8gb{FZ%2zr#16-6c{ z@JX~W?$|Z7a-S{bDcpkR9 zF6rZIpS3C6p1N2q389u!L{T-G6{jesp6fTrPpUXd2|1az)<+Xrm4?Ub6i>DYKTLUX zE&t5=!Doej3eATYH?{EM1m-$eA-2}ZU`i_(BdfUNxFD7wRqm8(B3bfie#(O9PM@iP zp(K+q*E)0=Y_?2zg26I+I!p_9BrVuk^?H_-Nfny!gR@B1Ne$^B@mIm!ye_lpOt}!- za8C&B!2bq-*-OI6VzOMFOG6%cew3J>nm?Mz#02^iP60? zZ}RQu%Klp(S{nr*qMmK)`K#qcG*K*(-%d{yNY;d4LwE%hy{R!CF)`n}O~cB{EOhc- zMj8?>EUd-tJjp9s@p3}iBV&eynYD9^=`*Mx>EUg3J)^{;Or;R`4Jft7=^c4v= zh`bjAZ~;VJp4P0@v!8)8k}N{_yoCP&;i%Y~?1|iB^8MW1Dp5LonPr`{{gyNqOgcXO z=*?{BzK2U+XQBo3E%IXmJHV#q{A^s7%uZ3X9~U8x6__~2&2Bd4JqF0al8k0+lkj70 zl{4W-Y^^@mXUqr!#2h(J-%pFGfG3eP>aBRI22%U8^w;zp6|a9j7M(PF>HX{Ic3+~E z+qA)RpaZ2QVP(Dun-GE?&4xlReOs!9OInTTqYZFeo?w;$e=^P4Sp2KT;Hh6MD&g)!X~wPYdO83h(YLW}J0#aD(rrAG1dbR`Gf| z;!-1QmC?31Jw)c;xXX)cdJ@trO{EfXYxB2~ zQpdE5%N*RUD%d}%G?>)_si9;=Kp9>njD{9gicahIj8E&Lmv5d^9qhpcC=12TZiilq zxUvq<9Txv=e$y1nb+NaN%8)8cAHI{=Yj!%)Ct z>pDb0(GTnZ2%kR#kGc;X`rP_mYDDhEI9JJ+61S+c;@=){b$y#PHBo0d6zX?&PvyDo zaKTU30yn*-WUkuXS=1~}DFxEh{{X18sa1~@Ak2ljnq%0><+_CfiXq=JAKUsec_{bn zzP%_BY=68h?+EyNhjW@h4{K3wABp|=%myIupL`c_@4;SUJh3g8@F-G*4Q^c*!7yBjr_ zkKQqNfn&{>Yp^fW4icru6$mBI3T2@6d`EA}CflZ(jf`vCs-(!MKF$iOSQ~PFyV)+P zNIp#n#GR)KV(MXxc2>tKi$j`&eT}aaRmPkt;T^=NK5Q+2`{CoXM8f81fgSCxQmLzM zquf4Py#LOJ=nw6cF@d{hM>E;>n@dM&&zwj)Ve>9%60%1J^WA!iR@6y7$VlHOemY2r zWq7XEXrMh^JDj8b+eTD|(}Cj)BtLOu=y-G(vL87LZGqS_%Mb1=yc zcV2#M&c{*3-?^~0jsM84+U))3<20Le37q635z9?DIX@Vi+o~|)Qde3R!W_4Rm0B)& z%%3AuNI7hzbkF%6TYf>Q@Wbl@8|l>@igs6vXmd$)Y<8gK*^ZM7r8@u*Fb;Nya?vN? z1)!G#f0l4!x^A3*FE9o0z?D5|p8{`(sOBY0#59EO+V0BRcNOx;|D{D7^*AjW>tqlD z&0Q(TLdX+Q0XDs^yyfhUb%olM?A%<#@z58_47;!D(6cf-5FP~7lvcy; zFr+wHMVol)rBm3Z5dTA~Q}3rlHSb$tYc;*Us5YKVo$rfKG;K5I7%jyucQ&KBfDdU; z_=R10HwV-36hde(etFtJ4IeA}gb1%?6s8{YTaFuk2a1-O7bV%jA9dDZbHQm)CO zsCYh~f`$XXdRS%b-pY4*{ww$F5^vM}qNif4^Eu4Xd1Rs%nr|Gk z0cY_HsT~;J814(I(s8;Utfa|ZXs-P_>Pac4zH_9LG)gGJd!>=(JL`~wm4t0VMai1( z!`blb$I4CA{nvJ!*1}zu;610q)HtaUaa;PEfr0Q{`Zqr|((g)cjgY&AM!f0_O6k6-*+zkD`jI zF|2|D08Vm>(?2flS&_c(YMr~D~^ts{Fae@rf@YU_063#3zCW3j{l$ure38bVeQ)arr~%k z$tJv<)|VdFtuNhal!F}+%8KN~uz=ZZq&1g#kLtjtWe&0fTd*3m>4V+x89No>zv*;? zt|8MfHXdSqzP|gkag?c;t^4^FiGJh1vB#9>dW8#y=RL2?F7>xKuQNZJxIHw50U&Z6 z=r4%SB@oEIS>_*Ztgylr@XGjt&R0kA6}AE$@(N4vyy&T7YyszTpN$I-KDO4GWn|R6 ztVK9-UYTWn{z+Dr7}NgC7lof&&05`;O%YI9wzf`vbHD2JBcMS4>aUWZ{}A*C3X>c} zOkL%`j8Dzd4JaWL=ihvEljK4eo zgc&tapxAXA6uXwk(d20bAP%mQK@ApVpyp#RUx5tSzt5P~0y6HfJF7z;)3#x2Pi<>qt=-sEGx~k3liaqh zQOFO-9W=`ih?Fk<-9Lv(z>D5hgvTeu+o~m}cZy_ZXE{mt=+=mbD+;|Ed;9eBM{b=n zyS~8oQg4%WrpI*kg{sGuzfm>Q)dRFjdfcQOOQR1?7D&h|K=ukq7{}2E;cE_PKG?ER zA9f>pX&c1lejp@j!Oa6Va9RhV8vZp1_)q`dc$S%Z(3UhpE~Q9$qHD%Q$kw(gdZLxKE^aQe ziA)7w>^|Kxyb#s+@pjacy{gvyGmM+a;O*C>v*dQ1^Dryv5h1Vv%Rgc^?09an(){Ie zboYc?$};J5bG}OMXx^Sfc{A@HKUItW1uguKwg>%h`}?Z1VBS58!seAU9Oi)GOrEcQ z39f3ygoDCJ^xFN2gV<$3^v-o22vQ7H1APiB3hNR-Lm2<4MWYvE7P+ypon-M<>W8q2 zf6@pI2j@7R{=A4;e~?Dqj%lp=P={4qQoMbJw!Sk{|VCB+;6Oii{U zt-$7P_X9Fh;R&TTfc$kzEYA)=pqNSl>~Mr2NptT5xY{h}k^A`Ougl{v%jEALO$&ZN zBHmC@(a!z5(Nsj*G&K|XPmc=w(es0Lh z(tyZL0M7DNB`+EBnAwvjoMz+Lr>1y2~pR#r!74lP|F{5-aL7L5ppZf zqc7i_Wv=LD*l8g+smI!zL?Fo0}CE_OJdFl2|;EAu1e5s zpYyT|+c^hi&Ufh+=o5oZ^h5b4-JzpKKZPdy!HkTh+Ejw_ty^Q{({<8Y!?u1y2v}Mj zU;7-~3%&5*vqG%n^V!E+FC4A1fiaUHpS2-yPHHXp5Izsx?Ci?g`~fM}{&1u!o}y-+ z!LTA|>r^`bMI`epD0>C*z>1mzz1L`5d7ulUh+)X+Uzv@S`wlPQx}Vh~=@qZA%X|BB zRW*19z!aNFR@fx+(WlcH7cpcBXKI`TlqAxNC4KPS28n0XbI^XoXiAQqUYf|Aj}ty> z|DL^L=2eEUV`Q0*@C(gOX)W<=1T&brVPNWBdQPt^i>3Eq-T-7_;^69Z>=bw#j>lWg zv|ld`2|+J!7cau?2eo|uqA5$B6!9n@1X5& ze`E(x#*(BcfM+$TQlP33*%SPU;|o;hsk8S?<`T3c-OLpis?P2|^j6MD=i>c&5yu@v z0v(&|nW^4G)t_o>-ei|DED2xi|IRxm{Ow9&SML_vCoXu00hMQogdoh-VP4XO$(56M zH4){`roAq_$!x5794QZKhNtZ&6^YHKorDW*BEHt6zj2Z!4C;a95J0xAlW*R7ml|7R z*3kY!sPu5Rt6qAe@240;#{8$u{1C<^=iw64I|6zcLr7i1L0=|Oe5tD>eK`XomaW+E zlxUr~2M!GOP-cg4hP$6pK$V(=rIo_$SA~kBCs(-~8`tK`Ymz+;It#;(J&{))=8{U9 zvH9-N+?g)~jBhCSOkT@(68qlDPX|ihYPl#Uj0_1OI;V8uRqgNQxd9+6$Zd7=6@~&2-yRkcgBGDHd&c9&ViI<4Atj>5T^z-O z1O>QV0n6;5#y}4GRF`e%9rqw^Z|oUZ?R?#L zo&9U!pX3uR?!ksd3|mhfiLJ(j)8)zfsc@YPQ%~=$RzI&>(h+QtpSl7W{aSN)URFzR zLzp3q6b%BF8gfpH<^^Je`65sS`v5h(1>zoqI&#sNE<+|c-c(*AdEpL8;L`=xHYqog z!>y}_xOEIgo~R}L@zPn)2LmUngFL%2-VL{8e^f5b^HM|Nkk+tLkwqstKK9LA4`UI; zm4q$Sq8`*BH4-g1F?E)sk|!RA0f0!2 z4$6i#Q{Sh_><1*IP|r5DHCSJFvj`+jmI}5oE)PteYBNVMG-<%G@PaGYf{5j9f^{97 z-IY^_{7~RQwsjQ!PR5XQtnu10$DmJ#ujI*UTf8pXm44>BRTz=8aiYMZ0m`_9=0x0? zMsbYW?a)3I$DaCN)TwgB;-UII6-y2Qq0hNYPmVEuhYkvn)(UB#3r7IHG2G8Cj^hYo zNie~$6%YHTi|N$r()vCFbUOqpV)9vsO}wXETN9(XZO`mhS>X&Nj6#;<+< zBj@)4`d-Z+5Xop@Zzy{f(K}cAXr{(%@xU$t$My`WB;qq`(nmE6m4^X`@TdGZa|0K&9hN8ajRiUOPVgi`3nl|Y4)wt zQRw+b*4x$l-NP@`GyoC7Rb~K*7RBNxox&KvbYRVejh@_gAXbs=-Tdt43N9Mv2%YdSMgAj@mVxUEq|`v}B~ zC-UcBW*;VEgAm5a7JBO%&bXs-JN;Ap!)j0Yd~aN8X1jYn7;{tz6N0xJ|Qy zFc%~v_KkkX?(yCnyqM(jfctDQEwxug;c1q7bEuAbtH#NPYH_qAwLPACq(HJk4poV0 z`Cg$2Uy)jiGi)1zzqqse>jO2Ldv_HgDoSrg-{o8jq8#>|Fe6J*OvtQ8wvMJUZiBAb z7a5u<=V#E?r8k(_{oTcBA6aG?FF=PZQPS9gE$Ts)Y365iHMtBfmU*&lZ}1d#W}Cmyt)|5sV2B^eId>;Dy$xIzce1Ay2X84;0OZo)%PjG1;+0N1~(ptM}Yh~bf`hQ>@c zN6~2DQE*l~a^yY5eV6^%QK^@wxyNrMnll8QXl>PjDERu~U|eY7-Wmm3qHKmyYp4ELs<*Lq2PzN;7BHv(D#)jE}#i< zW21LMlJB)|%Ad%L-O)5TUaM&4CG~DFo)oC8s6gXgJ!_3MUkik)%ep#j)Qoid&RX(?35HZW1PsGnbI|iF%dM zGBbDdDNGqVnTaa2ZIXL|60DG%iU_b$>_sS~T6iK=TJGe}2j;c8hyN71?yg7xB#UIBti}fP(aW=6O@kbnr zOFZsDA6%*v?i;mn7^xl;ckyE&@+~_Pp`6NWx*Yui&h4FhErzv7qPM;CNWWyZKogQ3F(bRe6ACQLP{n?dOY3K9xT-fXyVy$yk zbYsrkS%+vd3twYihuPZzC)t2J0QQ5u=cAh<(hADqN&>QJ-7=r75|dw?FTCgdz(TaI zL4#sQA4lc?fP~)pMzzH`?>C(o_Kz&=Jm3|Zr_btIT|U~VJTEB8Kj*khYG)|U(+Ovv zBVm$!G3u*&I#9=+VW#qYZ>qMErG0RXIA97l8F&0&?7eqXlTo)m7z9K_h@f;KC?F~V z3J54AC`u6#8zMC*(nXpyfxHOPI|vF2kt#jXrAX*iy0p-nNRtFG1XBDR@11q$-tYTn z*1falk6CMe|G6SLIqx~|*?XU7Kl|DBf+Mp>RqnTobvt?Qz`p>fP_|Psz0Y6K8c(h)iO`P!210fsZ{a*>gX7PF(v2r3r@oD4`(&7-2~ zl!?l1S3<(dDXOO=b4BYDdbe^Y*K!u0C>|*|s;;E=;V`9{epm-QsXkGW{skQReU}Ps z7lwSQkDBC!05ds&q)A5mBh&xDIK4uy6OsaR$(b#0<5uvu6P%=mr@pm6b8bBR*3
LS{3Lk9nWV`^XQ)5!#({jq2%UJMqz_f4DFt(EK@kb zBPiUHew56Z?t6J~`GU?uk-lT^m9I%3GHmqQto<<-S}*r(=!bq&l)cIkUl3c6~NM45m?l$HnpceuQioV0owEppPpn{Dps z%-rm@X`EE`JKa8uV`)v5^{i0iEr5o?1Jusy9h;B(-5&MAM5iu-rfg(Z6DcV8EX}O@ zOtQ790H~-e>m^C@RI->18L2C7S4pR+&9QtbLe0$zy5=e2`P*aNI{=h5^ zLg?}4cUYFIz_-ZfpjLP=AlUV$&wahO4+;3*!i`AlWz&n29}kr`J3Z%o7s+Hx>&oap-9$!{9(N_rW4GZPB}{vkqDR`Lnr4AoggP_B z0}Bq=aRzEDx&uMDkBUUX>)f)u?k{-Y6eFm|^7^^_A>LbJItzOq%mo=}IA6NFI3nL|eLOxJf** zuN(%0pVvRF%%fVcf1MWho6>iT-u(x5_;=AYjZ5F@fKDO$ z3xI_@OsfTPw^anYOal%swXx~zgKc;oXm-|1p2F25(A#l%Gj8!AXP&ZVn+?-rlP!rR zNARVqw4Cz5g%}nG;S0m^VP<&c_kOo*Nv@?_d=2&Ph4+{(w0?c}ziNJ{)g424gkWE* zL2c+*&9nWE+nI8@TIO(;Uq4B$cdPyU%_-K0dt>gx781GG5t%VbQUe)5RG!@pp!1v9 zlhP2xm=O7H)pL%*OGzO0r=29DFyz7}+gauDU3^sR!Y_5Cj2aty5Lty?-zH8pBH7h0 zO**_aMuoZi2wgEja<%QEeGLs+*}fJnzE4eNT)O32`njnb)DNu2ac zyOAPuk#Ri^y;gj+nWM$^+|++)=lH&&Skg!90c!w_Xf0m7!;Wgfcg71Lbm5rmr$>v>T%pW0Qg$4__fxN!CR=?gs=#W(wK4w`)UkPQRZx44vRe1h9AsfW_ z_H27_y}(alMZ%=)xN*BUwfTOjku-Mk&ge1i>&Z_{W2+_XneRAf_#+v74Hi)3voh=H z?sizOH5Ab!?Ag}dU7bAh%A%aQR1fs;Uycz+Sz%l1N6 zO%BYsCXuASfKMipKfnJacpe3qYw^9lP5MVd&y7S zPt3dGIua#iDwAG(hByv08p{Mq=6u`JVa$)Z(zkxO!ak`NL?Rh`p6 zY)j`Oyy3+EOfksfsl0pRo1G&UbLd$i&Hl@qBRFnowxUKcSSwhKpB%IhrgF_mrs!@P zQ>oFRfhm2D>#=$Kl!9 zSbWR}YUJ4RL4SG38XHbR3Zj|FlJjO+EAsgI_Y8H1bU0^P>dhvhi&9&+iy18AFZhgp z8QlinfT@9&yMaFFwPr&5peEhBua;VjinHFmF7^^#BK$aozngO@jC9T>qvPX=gVuoh~l&A@(

dWCSM4eo$v3~%35$Ko zWI=6ap|kQ6iYW~(P!|A`a5_x``5s5ZLtb|V!8Z>dBF&;v>rgc%iRYj7HX+MD5DwKr6X z7Ci!J4^94~tdW`@Igs)Y2Amtj5j}aQ0?~?)>!)7qHMBcUM(C#8pH)-;9e3fC@wW|V=uNQg(d*C z{FW&(zWzwWE+@f$={HM+_r6WynFyaM;R$~E)h==F)`7aMI0 z=e*2#RSI;Z=dZMV3g31LK@yAr1j%Fkjg@H9XslM0S$3`qub$SmaU7F8+Lz)r`D(y9 zdF6{cb_hNmNN1fP$ju^x9C33J{p-Gt3;YWQDfhn@4gL^|ef4hRC%%gN81jZkC6WUY_1MnonEB-7&3J96^@Y@AgMZUYEY?r{N`Gs*a_jQr~Kv7 zQdBcCL{M%R{Ts)N+vjEd9DyC^+18OSPWddfPgS#$V-oNTYNodvG6rxXXKSfwEU*o z7`vxQODwc~>;z^UOG+o3QSOn!QxaBJ27OLHs$f_6dCvS%*K8u!xg=%;Q&#xR&n%ge z=fD{)-(7!2z>s1H2MaRnUvekD4XX=7=?>2aJ*lp&8}qI77G=l^tz?P=EC7E#N%*oM zoppkUG$mi6n3D~);~xg}wd~q7rzF-dRBCukKM;w2pIN=tfxHWpCx7dKo{)o7B-v>m zC#>;IMvO3>0Og%OGQsn(tjarp2R5tl&4z`41r?7hLsGe4qC)Yz5zw5cZH-Nkit=3Q zVL!_ak9)VaRpLx1CbDbVMHSy|B{!&N2{mxMj@$R4XhWT~)Vo0U!_WlOr1BS#2gqiG zA&~X=g))3E5iX_IjZ~}!RlT}=xO!G`%&iS05u%6R9|S*I{vHyn7A` z1Kmim__Udu#QJRcP3+{Pg8=QPg*Z=%(DtFNL-!U7@A@CkSz554#})j6G5Ye5?-C}O z?sy3{nsX2B^l%+&foybNILR|a4ao%zRKc_FeM^u6>t7EdweZLe9~~=BmIac&*)L5__OJW z8e*Yqv0YtP0o5Mmk0Lyj85e9oz<10<7yiJSg-*|0<=q71vKwu+)>~n?pN#;&`J9M&_?|^e2U%E@~d3m`#O89v-T%09WchuDqh+0%0&xPN=uwryL0Sb{%y`W$jK$PCJnOG6)RIRBRwlt<7NC0aJ zD6+-zQ7v<*vgE#W6S9fvh?TAn`?c1o^1WYAmGAM3zA2BDtK{a`<9_FVlb}EI(q=u3 za$!XcjyhmWz0i-)dPFTPdvrr(qfN1*C48v-1M#HmLfH%KQWdF>%ne^}rf99DF%en@ z+p{z+zVCPoT(geG&pO?ZX`DLpYJvSj>Z`EMkMQ-Eb#E6?ZJ@m=vTW0TQ|%P>_V+eS z_5|k%+f2XK@9V7EQVSh2qO-G4VGP#iK7I}%`4W3}TV`HCaJtB9q2L|j!JtpmW=CNM ze>^(+OKtQYYz z?lU3ohB`jM)xN*~N?I>`QkuN+G5St7XA~bRAN%^!E63UgKA!C|V;UrT^2*0ayZukE zpVg@rl$HcO94MMEtqs>0z;qetj1F5Jx%k0R#UJiWmIP4&22n3$hdD+UGE?o1$qP0s z{q$Dln5IYPk$}^P%(K432YF2Wxs`#(7E4BS?nitB9tSQT@u)H0!BvZ@T(r%qydmZ;C@3WR5|D;MAh6P5q?d(f zi6#v-ng!Wq=Q{S4^{reZFv$&RCa+^(b)cpKhn&|?pbDiF#GHR!mJQ)ja76kF&*-#x zJYR2KVGma);D(iZzZYuzImeEXzSO{&kaWJi8FHE#o0)stiVdhgO>7U@5mXgz7v?U( z+$*oI2($1B-FVP*sc!xPQ-=0%054N!>{Zxj5rh?$n>5BA-?l)(FJr&U7nEAM zKQ8sL`+k66suh3lK}Sa?)6p&?qeuI#kSs*dMnt^)6oj<(=?l7NdT~(2?Nje{rqm3I zzJ|*Q{}(KsMsM~PZGMH*-=BdMi_SYmWP=D~rWLIcJZ7#l_Z39S_a5?N`?%8p^@jMhW^@VJv>BWxMQ&c89h<|xDq{apfi;z?W9=~L zlM#E(SgF*{>#_bZg`ThWKX!GYEE(uFRJm{&MUQ%DkbagNakFaRw`9co0-d=E4_meg zwW*&clI}DkB)PQm_^_90#Ym@_AVg^=IqrBfe}7z`AA!>NH<{)x5eZ?omaFUvZN-fih%TM%SP-u0+ic*wqV91-xzqZ6DyMo_>ppjr10 z`xbbMrwV9GTZW;vdoA5#&oD$tT6)Z@BcT_mCc2~LwW@B{Ys3G*Zht=+J&&Jf;kqF& zoBK3Q$d%tnTO=^xoRpjC097s%^Bq|oZ08JF zw7vD~{Wc7viUwiy(HDng6_#90Dc$&69#_Ka;@bPHlFo+iFflZ6_kv*KshaGnIX4+K zhYEZt)vWGo=XPm2{lLJ@;+MQab~6NB_*iozis$3^dKF)zAv#5R?Y-OLH*saccnx+d(64GI+uE3uK1VsYnw zvC%piPyQ-rAV3>}z7MZWKOqUpf2YOYCy@|Q2VwP(Y&tjFW;d^p;HUOT|>I2bv?yAG10r!hbq zr?m)h!9Yi9Uq^~3*oA9#?vyjW4+rRiK*qi1c^Nl7ilacPbtmB<`=!>F1DCYJ{b7NZ z#g;vL$;!(0J%2g6y$2rr z9f(>o2&1$x5^~@9yCkWZ1WZAK8rcBI@&JP9j^amn(Hh~G4Efwliw@H60aCCp<4HmTW?i zC5w?K=AVBY5c_6XT3W>>zOmCKYZ)N>;KTtoIqn-w&mYHOys?Wm|Jy(PYyY%Ky-AJ% z`}!Jva70bii$r@d#irrk=OTCH!&Bz#ce|BK4u@a17U8I%{(u@q&{C^u$7$)CYTP=` z?b^g%%;lq89uXU=>@BVg{RnaE`)hHS8p(}5vJ^*l(FB#9pqXrcc*QX7q|}Rsxa21l zZ#y(r57`N_)CA)F0ptasGUiNTR!!>^uCedH3aREESLLq2g05;y1Z_7M|0rG-suA;r zympG68bB0)h~yD?qcLyzYDdpTuY(J+zSJ7jVZJV4Bz-q@_26*dt>}sk3_%l=%TbRF ztH9^Kn$Pz(?amwIWL*zl5{>`GF4Gm!>EJy6G%8z`UD9;EW>$EOZ7gh4=(~xPxwnYI5LG?;3}Y`^4n3@p#zc$DrsYw&vlL1k-9D{& zk{)_Kd#vn!`D57iCB==4d*c>a0h$brJ&-)EVrIi37^u30|>$&MEBRVyRA&zVUyRqoc9O(wKwKWcmuU(=gzG{U6b!ohG^ z}(#6uJb)HhpzE^3ve#9#z-;DI&rdUx9 zqeoJfH(X}nN4?6xyaStejfHd0Uz@nO)qGC=?3v5Xhb$fi$a*zmIY0pC?#n>tTyPp& zYfzIQVwz*v*Y;cIhJ7hh8d_yF)o;6pr8D)mx{oP4-Y_stI}TGifYYH0&B`$PDi6+R zkfFIL<>o6d;`vi1bjyRg4kr3De{()}_6dw>L5yKV9U*}pLsTg?JB^=i8qynf6esdV z{I(VLkvcs!qN4f9Hs!~C%(>GR*J2C5U2U4>LW=yxkk5~9@Vj}5_1B%9i(oUjy!9hs zYpJhHsU{SCQ*vpOeCA7?El~VCC(!TcN#EquBe||jC?5M2Te5uQBOwzpfL+H?M0_P^$yD~o89!g% zsMrmA8Z4LZAa}jgbjox?*t*@NMoGh_JIWchxD;^_Mhztc*TbAi#@OUHVYutqvg~V2 zWD8?5%Snc3s`oyyE`8BCbRvj0rmDzMK}jbVF4#2V@Qe)#C{8;6s>Yqc;?Ahy;LeRt zci0+TgmrZ8i;9XJ)i`TqWl8+BL7@nO>uUwUuw`0_Ko7LZ@>*!Blv{oHcBJGy+(jrq zIj8D_ChU!lz~^hTZ(I+F@UU!6&{-LYP7es5HsIcbeBIzHTG21|I{XvLQFcF{i^g*J z?@7vHOe1LnK+wYKZ>@^&T~M?>iDUZ%ds-{$r)U!32(|8iU{_6wd)CMr$(3Oe_Kx$& zjaRS@>n9w;B3x>t*oF3ajWtyH?nZ0w&oq(mVqsL&!pTgrZ=QlCr@!*V<{$h6OS|9? z`=yl!oT595e12vFp}MV`LDp{?@$e~)({u81Ijt&iqc#$ed!sm`o6dHZ=%H*obeHUt zuJ6p!OVoGgI<_7;2!KXE0op79-l!jhIN~enIE!NPGH%ub_eD-`$paVPa1_aXmXa)4 zO70Zf(t{KM*sAX@e1I%LtkN7&6S5=P;%y=eg@2i_z2KZ^bZ1I4jXEsN&82>4ospr+ zG5`jnouYv-aW>0bhL)=)3y5@uL`1-Px$V=TVkfTE-gzT_;mJ=NrAN3eTAm)g+HOp9 z#s-5rhD!8dqRjfhEId2~3X=B|ZAr;_FO|CSJNUh$jf?BE;-?iJadS5$zS%NXDM|HS zF`O*_A8JYb&w4xkR~?Ff|E^&>f^bKFPtGYEMPk>doe8gR$4Zlj2?bi@8A4SH>aaVd za~-f3I42^!KUGdFYo?Ff${}=rD878qANc{qzW-22gHuCVBghgq&B$?w`Rll2Dx&j_ zD8u@sCO?&CKN2L_ox0#UQxhiWd@<53S`QuA|F1;6{(i=??e_Py0JT)&EJWc6p(mLd zuJTg3mg%?NHeh~F7=pT+#2yFqF!Wim8H?|0yP_3IwVIbQ)T$X+KZrTuA*_`&5N2-H z^P_Fq!!(-XBI+u=55*)8A0L`ih#^EY^X^_rOU+d6Zg=r6>vMB=5pRCJHEb9h`|4Hy zVHoKjGgSX~#W3dqIN9EXMs`)L9q6O0-6zrwaQ{{chWIo1|M4mvK{_kAEJ?%x9%mD< z<5^pyzk`Tx=h6~D6^&tdJ+FfoPrdlia{08TZ=RXk@rIYJB8Dh;ZfY8^sz_*YON|F` zvh+Y$n`TUJ&SfM|(caaI16(*}!ytVvP5j|!frEL{G1zNR@c1NtT9V_3^ixJkN5wuc zBFr&lLdtH0uM~mpY7N)8?Oo}zygkQ6huSPj`w*c8|FV6~3p?23z|WTZasisA6Gc;^ zMNbwksYQ-(Bu(Zv6{kB?N>&K3tK{kY8ocBiLP7c}5oI>CDA&Do8(sp8@O8@6aE(3h zy^D7DZ2_HwXHm@Zf8 zgI!=o9|a>n{{tJQ^6!%){=i(mGyFEBaw*dFxZo6yRTSkm4zM3*%PyEoY{<>|gt1=e zoRhqvul|ruai(3RI_xCSS-}nJbQlXQ#9fB=$y^z%RXCZuz^is{GZ?Mt^>X|dsxd|? zEw?1HbZnaY;y0g-a4WpaP*3M97fh`LESSyo_%yv`hC{9GfH!Mi>#68L>1?+z7?0k~ zw)$V#A3k)}Y|0C=Aqj2r2NsCq75C9+buhFh_1$O4(o7eV|(J- z)>gFk5!^F?AS18#FA|xTTQTfCjsi{>@vC>tCgURK96#E;tNMHk1Oqlyo?`kS67XW! zciP+W#g`(g6Gpp(Cnf2n;-I7$ANDC_U+sH|$$WXukrv=q@pLD!=w6ayQt8 z_he-L7y%dp@=qO&&{`bT2S+~bw6Q=KZGzZ~=rF47 zhy~$$3R@RmE!*dGx6#I@xNKYT#QH~R64qx-gPxwe%B*eypFT`SLbDmjEpIS8^usowOl&#m*Auc+v61gJqVLa#y`y^XOpUHDi|D$!^H`33iVtnmoPB(C z8u@lcn7rJI;-Xp>03FD--M&1Bl#S*oGgBp4E$$=V;e43EoeTM}6F@M0-d6@F9`?q8 z9&8?fW+~-B{!YU>E?3g>>!r0kZvP-Y{JaqDq2nnkLBDbXvih5~jkD1P`E+H7##2EB z%h710#thgXaLCrX{u~}(P1tPV%Sg30piLSF)j6=YFhxf;@;t_T{aTXx2`0Sh2vQ6W zi0o5!h7bS1cnYV_CYtftaaj}`0VFAeYAY}z9Jh!_8g~RBJOEU_^U{vfx+GY1LGs=C znBW@TW_T1@B%+BfP1wkK_=Ivl@p0+*$055e+R~;$IswdF=d(Q(jC4BLcInj=1N1k# zV5twya{g2BsW3zIF~f=^O~m?*6Oo%c2J#GhK?D^2&>xr^VPPH{gg)t&Fn{Z1HYWIz zpxG^B6T2w3KB*4{^0rSMf)8cCd9JL}&dA?EyGzSLE>6+U0E1Uh1TNx7hG%EkK*i}y z*-RTYiU-F;7tqhM-`)K@*~61b(ihctbL3C#=TDXB9e%?4`fR(o!!!`v+f#(Xk)(5L z(7whc7^HwB+?3f8V_;Q>V!dzn`tcB^3` zW|Je4(nE288g=Tq$cVXV>?|t4TqLly{^Dqnb$Rsmt#`UMIbt1mCI#Pg>6{C=rNjU1 zLU$tUAhiQLmI=Dg7}tuy3*IKj_}I=6BB;u7?ySp?Unksw(V~y5PU?ic7vcu$aIOr1 zGfV8Ifcrq_PhVhxOVZ#p0SAfzb}sNH(J9oInRpN`;C1u&&W6qP?`orV&hMm7^mkU9 z0JQ@xk$^+90ZJd?ztDA_q)=S>U_Feg`yJcCLz)&C5lc`#T=XF;+V7=dD^vzbv)5*w zT4&gd$Ek)R&!`Lwl26$@fydOuICuM7S5_zN+826nEn2L)9waDYlAzgaMAb}l%rUBB zEt!R&`zWL(o*dXM(3WStRAf;Zek0bT`HY~I_f7xx*BLp6VkL(e_JDO@8matJL#sp! z6n(xNZKkOys&dM%>PA`g*a8tdfFw(O{n~7YJS6=FbL#T%7MBU1qBzumaUG6+XojG1 zf0%xX9I-I{=~-u%7kWhRT$3iBk<+ir@>V!>jv@FDthnH(!;U`vun$4f5QuNcn@xL} z4{u(YVVcURVB(Zsv8jp@mdyR`E_VHgDaWI><4->THMN;_A26-m?;!sgl7fwS(RX5k z{A}e)R*EIQ+hX_Dgh=pX>E9_A7`?MyV&+t~QASX6f{H$9#Q3BSoN_K`OV2kC46sTo z+rf<6w58O)A~Kok%tAbe(ES9Nlo3Ve)I3+w)sDN#R;=5x$NgKcVScXZ(()kdA{$*j z`(|*|+27|nZaMJ8akEfX#KJrL-U0S?G=i|$cMNFjJSqbw>pF&-fGUN`Pz^LB$%QO6 z*B6NQ$l7nR)xGS~DS9+{sX9$Jj8BuFB)xLTVA2`ZDRH{qlMIeKvn(xMji-%xbv}uh zxc|ZLee*!XB!!lqqWsKHT%uoq;@N~28>+LJGZSnRP;z-(JZ>^G5e75ddY)-?-xJ1U}{ z91+ZuHqxl5DEqLdd(=W`l#913AYBKV?xKTm{#n$qhXASdCTb!$jo-#mb^UVByB%Pv ztV(#Fi=34@5-|kC=Tr%Obk=5yIeqY@R8JvhfFEd%ayLcte{Dx=l+9Ru1SyjCqjtq@132)y-eS)2y^@PEJqY4m(+A(d& z{gsc9je={QRbP0D zP^7-$UM6|qqFrA+qmc52PNjxTNWU}&WG(z;8e2}p%_k85W{a2!S60drhVcrn+c*0+4 zbtjth5D2>$9RBKP-@xphpGE>{XeMaiPzYTBOeu1)lYSaB>R|^T-&UyDyANh(1TIrO zfD%A~X#s%(mwuMqzmclNmy6UB)lBb>ul@96tQtE+Z9pda>{2-^NxjfGgevoAP8)4C zOtTd-@k>p9h`hTMv+FPb&E_EvRDird*;D*zuvFT%F+se4c#yAcMZ6qvVl$$b?!NwV z0wV+CQpdJ|`(VgM!Y6cBJ@WewPOw#;&Ps&F7wY3r)QWb=f8@~hle3M8w$c+VOMEerXos~4_f=^@dhXag%0nmLzVjLnbHxodK?c`Rw@#0 z-8L*Wviw{wri}O4FF-r8-n6ItA!jq8%H9~t9j~`H38?18WEJ?FPEL|?*wx5Y!{-P5 zGP^{MM;&u*5j>(%Vo{BUsewo&;LO-$ClNmXJS+d!Q9F;LwQl~~x7P!Q;sntsV+tdk zjUSxUf-Gok7_fG;-X@MfjZ#RPBGl}s23Fs@^WB=IM3xr*h3{EGZR00DM=6YFVy#c6 z-Ghs0ANRk?-3b=l61h11B8DPRh}?cHeYQShbNsXZ=nUDU`S_iv(I*O10|MczLy(z&z&m|H;0SS|xO9aSaar6pUXx2qz56IL zDHz}7tb3e$r~0q$PS3!FYPISgQNRdn+VMUre`aCxeBkuP%=&_dR~x8;?WQF{v*|cN z$Ogr0L`Ke=rvprxsoA;m?LIoo++^x9ccu0S_T)C_{POPkn0rzCE3>WZnw?c z`}{`V!Bar*c*MX$?7@e^Ehk2aGZb5@76EF<;Xk#e$&z(!#CzWsnHn39znim4qT5M)gm&dhfC?m)TOm9E8Q59_MR=*yQkx6l6Y zS3MX`RUj_`8|6Z@Y1)heUCLZOk`J`s9aK4+KWP`Q>*9IN)b!Ga;Il?I^R#zmD<=yq zEH7gxWZ-K@y+W=Ixl;_za(r@RAC$C+EfaC(Q0ic*fH?pGat5jieYA3W0zHi46|I$U z^D21c(ylC48<+40CUgpSy9hTMo_4afDtvWje)xT>Y(XabsaxESW1)rRFW5t1>q>nO z57UL|{oB3<6%}rCGocr6T=`Z&`BK5=H6j?wD#Rafz8UG`W2t-_c@6g%MLsjr6m#77 zQhz<4uLF_EoR{bs;&`fz7yqGvJt^}DvNrsx>*BdvN6*ArNmiG3-PXPX|A3q8Op^d~ z+7cV^dtu1E(_fLZpo=Jdd9J+`EZQ}qM9aJ1y2vB;3N`P_D~AMl(@ZWuwC(R0J;JGb zX3`@e`k)+OtQCVtEJFsb17P71Id3jB!(it1@P<`f2!&HiRGG%D=QY~YM?RytzDq1v zxB>iLaKftbSK7Lw+>KmXLdVeLgr?PtgEl(b6^{ZQA9fi{fl-3PB?*e)h8r-j#)CL2 zUAP0t6g*XG$13Z*3{v(+_Dx>6X58`czPX<1(US$Q{Q|lK(YCNlf%LR8#Z$Si)-n`$%;sr}bKc=@iThr>Aif20v@vepZ zuKZrG-%t>!HwPlSpGfY6Z_uHNsdLSS!a`T=oZz8S(w4Xq?KkJte_XbB68Fl#^sMs* zMHo!jFu!WU4!m|J$VEK)HBW1nzMm6`Y~-vM*m?hCT=bjk!%Mx7et9MmU)A|b?%W)u zv+)vYTONA!5P4@8-|~K*O%NLXx@g}_&XjA4tpBpH`f{{{>_lgipeUKv7_F%tBML_y zWiZGL81#zu3HtI729@UcBS99@2L39AWqpa@*$k>PsmQZ6X6H`(6y)$Z6m-TUtF*ZJ z_ud}v#J@6>;K#aR&yqEWxH(jN%n_)`jF8!)uuuO`$b~vns^@f)pH)SgNBjK=|5e$` z{3nLt_+ty~F%5`7wXYF+3#E+bo*cZxbka_mYJiFMY}AAbou zgKc(-MiC4VJigK(d5R4Yfcu|!7XlSwMQzDqRlKg*t<6RqPZHnczlm{^bnL1;D3?Mj zCD2P)LSG0eqAKpiu6p!OovLJIlVyP|MEd*OIr#Pev6d6S)&J9X5wRG;T@+cO1t)m@ z4@^*v4d050cFd4?Fw|y9d2%L}$tz}xS3Cds0a&6l+rhiFKlH~y3EV5i<^n!CCmOU; zQ>{$-F+E{!J3asF`$@dT_ftRYn7l-^)0g-Tcg%Q0>GtF@QYr3=%+tW0uh68urNH`QbcZ^x7Twn=bbJ)un#m#73?1>YAF>a#?eAP=$1eBy4nG%6fokKcl2ra^Y6RZ$ zCrcqn{)i#>xMF^L;M{4xfs|{)Hviopdjl0zP_S!@2>j7)WOj|@-wt5Gfd3JY36#v? zAP{TPhPK2J|2S)!8FmUniO~B)l4(){s2&Nbf+v+5LHB>zN9O`=J?_lE9A%<+v5`fgKSl5Y?MfzNs! zIA0Z3B+nDF zn;+UBTw;Hq$)BQI^^i^I3+i2q$&;WdQDFrVjsrOxk1IE9p;@WuP&CLjG8~0n*bCmh z75UX1Zh}e)o%hr`T;%2+bQoA1q;uP{TDrXmfBW+Fx(%+Dtz+Bf zxyN#9C^y668LSgS{QZo*>;k2N1uIpaP@?`AlB8HdOF#=vwqsQ*KP_N6uXN|5)LFGN z?x++fnSH)>_d|(ezS&qp(?^8IzzrWQzJHbJ`#(No*jD^+)M#OcWG0m9ddl;oKqK!h zJZ^YvU zv}5!(hh4YFMWeG~RTRkTO~^m9lZ zF*b}w1J_|-LJ}v=iHchf9wH&}9?kosKZVc`_z!R;SMmD;GkXz3yNv(KoS<@Q(6#!) z8R_XYp7iJ>oNt{2u%FMr0!W@0wSTsN0NN6z|AC2aw!$d~!P4wsF{W)1vDC1dU7D8} z^fL#@>{ZcO+riBK_Ia+yLOTIJa6n?^D#$N=fVN)ZjzDXxyC9Vy?XXY&2%n!JeNFqZ z20F!m*)>%H0Dqtand{eeed>$DloDU?(lZAgK441zeCCAZqlz{p;Z!}CZa|XnMI70Y zVn%NA{&;bPe%`jC`z&0CYs2O8eo@!WFFUYZ?9W<~5-rPDoTBZ^+wXfd$DU_nUQex; z&Cf~SP}r|%(qXAg{^>8yt_O9F9p_w9yBc8VbHD{Mf?o{%1H)heq%}J~3eXA37+M<6 zLT2LNDCsppCbG_Ic6{f(kYo#wKz(}d)Ui(WkxaRu0fkb z3luWw)!?fV(}K4oXSEFh8LbYzKd_`g0Jhn%|8QiC_t^Q!A^A^TAPl#`lK+#UR6Op# z0`>m_r~e3F?Wz|9%adSgI)QGPIrg-IsXFksM$9jrJY(SG7qUht6KA0cnP!u|2q0>J zYe9rud5ZQ(FSO%5(5tfGw7?Jep~OsmUE>DR`g z=av;13bOaL&fB>Dzcuv=&LLszyB6wX3%{Q;lWI}F#})&m?^fPPYxc*yIfHR2uZIy zg*`6bcL^|*;NDjTt5`&POP5FYc|b>hLlJlxs%U#lQO*q;`|W1=;`8-`=9))qgZSSu zGc9hpL>}Ak%eChb(0hYV%5&pR%`SbLWS43gEiYu08VciBOlc;>MAZor8MXh~?S_<% zn9%aROLLTmsczhp!q2og(w^SxuGYT`(6}zJ2W?Pi{tAM0=@GOdz61~pDkqYD9R>0% zTtm2>TNUdF!lS;uOJ<_Ey5%2|jMm$8Oxs zh`nIal*B~ARGP=EpoUVRi!%fx_}&#iIK5RFL6iClN?2pYAk4VnoF?>>5gg5rqg&0C zTUYF%3QQ~a@L2QldbttNH@n(x>E{rXr5n)w8GzzaQxuzGC@?%Eit52okDJVW-E9WV z2HImyuUS?Qg*rwZPwXT~UH6W^u&@6kefPdPVl?HHX2c1LbGa~veun=01xwJ_CMlG# zyK$0$Y^KYU)(4xR2S+5$o)7SOSB?^;JJ}=*bZ+j&r3IPrcPNpdFdTQiu%QC}4L zw8IGgV4OXx?4+82CZn3^-N?F9;g0ZcK8ImD0(618^Yuz2YG>^vXR()jANv$G(%vuD zv|sq1^+i~-{Yg5iSF$`Frjmdf+g;xPzK)mlp1_3Tqzhm5amsFmTs|e@!cM;HbSh6e z93z77TJ7Gp`Ec~mDcl>GXf=Ltw5^@+eJu(PN%N987ILipOWOox^C=tNq}wim!J%!p z;U^*&@32gu2>#%Oeu7+HYsHb3DnJApo}Ej*2=?Wx{l4EwVxG=?ZG`ez8f%8*lTnBE zQ;F`#6`@070`x#ME7gvGXzvTDLAB_I>_;kAdJbsX1c|Xy@DQN@ty#O)|f+vp^j2d(FOZel&S_NP4(TME%mg180kD=cf5GrD4SoY z;f|}DKa_cHK^_SV7Q9Yxo?WZST#%@coWJ(+TFBRu^15K3_g0qW{25UZpHzGs+{{v8 z-1DG>FogOZ2cSJ}cO30x%GZp4*@)&}+MvRJ-E4;8Z*$F*`5zOc)8zN!x#HghTu(r* zdN+r`J1uk?m)tiVp-Ibf$01NA=x%JT*8G>9ar4=gs*CtO8fN*LSa-+I!`?aP{oOvC za6yfrHgpLi+hCsSn?#nm-eg2-u7kjhhO!u?8Sg{eMQ>HBZiULBx<}VJi8H#i4>-H1 zW36Z@r_!IsZ`^G0g~fb=4n7&UuOe=tIoji735#b(fIQo$e`%kNEo_c&(ht8U>Z+^p zkRx))F)dfFCQ2w&r4(g-P8RKLJNNv;&Bb|KF1v)`UYc^7{+Q&k+Zo_uf2@ ztfSft2Kp1NL}RZu=3QdH)~r+d{@$?kld|&4ds{tng)VJ@1#%@YhRFnVL;`|vb7mY` z&|2TMA;JyGUo(KWQSrTrfBMh^t0H%EzI#J_@iE(%yUG4{ZtF|%H6nSSM%$$tq_7H{ zEs*qr(En65qGGARS(U(hi3a!5YMW*!zsdqqW3zf5?JdSODFj->X&>~QygD-3D6<;}WvJ*n+U?yNJ0NOh;hn!o- zn%6F|n6u|Qdv`#6uK z|Hp)I7#*0YS>P(RJe;AiYOqN^C&Fn28Zdf`Lv${nc%B3O48krAk%nm*>p1YoF#?#D zD1^SFqE^76@(oon5W0vLm0i}c<`+>38n28#ezaPQ2l*ZKPbB-lT!BVwDFKHk!2r!~r5oTJDMwj9v7q;CnOVNGzh?>;wJf=VUFQB@?7eqbli#*29Hcivq)3ej z2uf3mh?IZ|h=>7{F2q8wDqSN%klq9Y1eA`5Qlxi6M?^%r)KH}c5=w}q{OAkCw|GmFOs z#fo%nVDk7f;2aeIjX$)CBo9)L`Bi_5I-Q!C&QaLw$lMhVIrg}!h%2lwQq|^S%O%LWb)JT2o zvXcg$$NZg_J>|}mA4i~2p4}>*f{LxaLgU{tl>=m+sfF#}GPgZg93g>-(V8xj*gId) z@{z@R`hr{7vpk}uaYj=z<&3oSd;62Y3QVgyC{+Z`A}cJ53CX{RqW8~et4T>Wk4EYX zZ>Bd_XW!nPkLWzvkRs7)?w}w?sZV7Te+4*Y^!~?tMEHowb6ByS7M2!6gDc~*L+fMn zm()EjaR!*(O18gvwzUY*pm35@RsaG?NX{2hf;~}tIj&nUqPWes64+)mw^hVFPtP(J zqIzXdG zg!pKG47P_2Kp@S3f{cSJwJZH5nk3}!b)~#cUyiK!tZ2ffo1wA;FDJX5hb)5_ii0yh#xT$=S!)DHP()by>O3>$*eXyKq81D+>lVMpq|oNEP)pR=@wM~v zoz0$Bxbf%e=7k$p=`j9PmbI8MK_7gBZP@h4%%Ck zhf1nT1Sl+btY$hZ+Sm1b?&|6p>7CqR0yLgSBoMdZN}ln7;-84O@LmQXKo?;Ip8CMg zrPFzQCv+gWM%OXeq33hK+dDXZix0IMHYlE1*^-4qlsFmxpL_4{sM+91SoPlI!FV2PX`!V*z6}+ z62rdCPV4xAo-!9Z+>p!Bb*dPM$$UHaaPUNL+hW3-C@N5n`-c-BaoS%yBY%1i+g3l* z+_*lHkGJW1y9uWoyio31y_j&lA!{%01sA(7`jh;oGU+B+nerYfiI-l0zCd(5VGQRz zw2qG4DtS|1SD8K`7JDjrCR!;^@&wD#n-4km?C&^)>HwFT<*OR|N5vCZDnqei&b)1e4&lYVey)){e$BJ>O;asLdItteI>I^ z>5|qEto|IJn@EyG>JUQ;$ro`zjn`w?Xmrcu+n1*q%sJI{b;&hXqc&B}Bt)>-new0H zVuw7#B0h6qWAn0}!)nkm%JPs6qv@HohC~10A*XYg`%RfTEu0NIjo4-Px|JZskYwn1 z^YDOhRhe6`e)5Ujq@b^iw3n-ztR#x_IET=96OTSeZ zXC$7<@KY<5O?a4p4u|m$3LNnVyIC1`eWTs%0LDp{EM1!wk2@zPySG}hRU-cK;SGhp zN35Y54_7a&2xjra5K*_7CF6Zdoem?Ml9%K^F;J# zBFo1%wOh)Ec7Xz@HUXq{0B`Ms1!+SC)q(V}4wI41Mfd6XytbdcN|*_ZH7+(K?|pJ)(_0hi*z3qex2IbUPg6`DyJX%{O?XVamUSeMk*G4S zl39Dp-?!~lU77-yK^p(NI`08BEAz+oD<{fabDN-x2Utm562S>KlNCvoafyGxP@q~{ z6~<({u&|(G^Ys{~x9M_Pgz-zoL>kCJl=KQ>VuSD=NMOL%(%w9b8ua$@KL@?Y4!MDBv+cWHkV%{A+4&Lrn2;KaMt;H6&5%ClEzG5+(IN^2K@qh2P1F-zhn41^D_u**g3QRx$oD{NG0t zC)a_y8x=T(;6~Zaz}u|!I^3nNwRm!AKh@}L$iMaV)@DCfZuh5tCjQyS)_!g@i1+*C zU#K=W^pXb=;9s_v%BZom*&Ji2A3ckOk!UB7#dlzM)$iFm7p@<^s(m@Y6ZN^~S9M(? z=jV#1xO!8%VC=Vm9-e*WKwpprN~4$hkfOhppK7V8hKStT|2*J8LuADRh8Y+ICdw1C z@Qm#x()u_O(N702)1V+;Q_HTNf}07TPd9$Z`1*_D%WPWm#RYWWN8&Oi8@=>P-3N$A z&a6=17@{8hpO5_KkN)#dQ`bKG=E}_eUenAAF$p6KC;BacxSkN&F`g*F-qVVX1^WHf zkML)FGCbMuG@M9$l zFYq4qAFO0!D+^L5xQ3?d65TvfOt507ymqiGdTMd7Ywxp{ye_J#u;u0BPt!r zJQwwsGr9xMSN~+!r7Fh>nu*bul-#ZWcv%frEPmd81(x&5SW8H+(=%L?l~_I3e{24r zQ&>*pf%cf#&X(-*=Wk5*_V%I)gF*H_qRBxgf1-~Co&w8^XB%psxiPQTc`a{PTq3u6 z%-y1o6ZlQa_HsSKd_fch62TNx1ezXHK(U(K-<2Dmc`k;>a7324&mc(hhN0M#sn8DP z4%JsVTkp$jNj|ISssS=r?G54@{t|}(@k+PvEc0OQ@MhKO-utQqC11RyWJ-&^K}4#v zk)}-^WBmZMw91HH_Cl}s%%$<0x^gw;;@a^h$1X2XO}miBMAJEF43)J7SWrvrg!!=^e!XZlU?q{%jOfH2WCZ3^$(B+_S5Z>WQ z;s@#4AmB-uwkU&xTOC&FdLV#l#hj22ck{5QC72blPIu9$FG#=gRJ^;&Gx+0ZscRu2{_G0_;#l#QE_$@vw7C21mek6x#|^V&H&eN}&ePJptU8+36Sf`sAx+A)l4 znMZI(Q+Z=^obXKUB{_^PWhRz!mTx0vwmK`%%XB6h`YIV~L6ftp9LZeKb3NU%zPsHp z4jSFddgDf)i%HB6O+LviNf%7jeVw`S`C{b{hVBa zQSiYq{5mz-DVw7c6h%0l0h%@QPZ+WVet$dS)MftSDj>+Y=!Rl76#KSW*fJX1%%nb! z6^YDq&J-RjR)^)b%6d~2fF-ok?L@IKI%a_*`WHiby3{=@i(0VF*v-cN2#xDEz*{{Zkx~^ zDOTVxHUQC666po5M%5qD)pE84uh-_uR~9PkIZ<#)2mA5Pl#Xvt;QXYTt3F)*kujjsuFLtY#?7r=m)LOB5^ zqVYCN^b_n#OrU_v5K?_i{%t|#te{WButajbObuzl$v~tLdUrDfy-oqVx3x0zG3$l$ z#vhnt-o~Iuqd{NYn?xnfp%(WK7&k$PqI*x2#XYdD#HYqrGY5*g5{@QLm3(D&FVt3e z6V98Hub_|_rf0wXN$A*Nnhu0#2Zc>0ov+0{0DOqBNB%GTU0iK$Vs6E)m9&f%f7g?- zwbm7nn17MK#ok66g0KMl=4c=&sLMOi!DdES1=4U;CtM>~uueT?U0H3gy7ubZ;eJL}|^x1I%MUfy!^?%l90 z01Lq`a1@QZ;TeXhLdBF(C7l9KHQ@ZBm9?Q$!uPEEq*J5L3p8q3N$Q>bz$%_`Q^BZ4 zpLiKcJXP39Kp&e%UKnK5D58UCY^~Z>m$!~+7PpV(Y$*0WG%`YY39)39%qrW%j)-qc9MePuT|lB;Qc6F{rq(xQoRDNOt1D4kryFGKS@n&G(H2ox5}7R zY(-Lq(_B^h&(rqbRCL7eg**^7paE_R251o~r!x$y$?2ap&s!aEI?HuI%_karUMgWe z@eG$!KGQY!nyV(}VkaMny(hm1k^VllJ@X>ba^VcvI}XDLozbqUlm@xvi${La*9kf_ zynWKyr6`~q=%$!LyF7p`fdpy?f(|I|I-Ue0I}TFi{Zo627R2Tk)g~sU)_(p_ue^#2 zPti@k$*C%88sLWfK?fb(<{{=?#lgdrJx>r*mfiN=a*er8)o0{Cw9ZM?C3B0YjZyxr z-L4}Q@xbH?+9n7O{R46Ysr;x6)vo^}&oXh=;(=2!w*0J4qz&_NgQ`S@BROXCpsBWs zD+^IKBso*Z1VXdIWYWLDp|0Z%KpES9c(YVaU?IS!;l9)qEi9ns{c=#*rkCL`R_X1f z@#~-9a+BZ0!z8GikKUU?gLrsjSPdy*rnw-5upZ68Hy;4%~DP)wGTkgMNIaw{uqcg0h`1oKQr zwgAl+n$g!u)8mGJYhC&8CFw*{2V0JgQ$>+Sh>>#$mR7myw@M zszy5&^7x7Q9tSx5$wSnB*e7$W%^ZBPtgS@}k9a=Wq4m9bw5g$4Wem>MCRpidlvG)x zdyYqc<)v!RUN!hnVC`d9aJ4;9ezbi&Kait+RETo*4>xw#GCn`TUeNtc*D?NxH&C~d;TKv-v_W3^d``^CI4u7q$Nn7^MPsn1W ztKeZ_S}uPBG_4Lv3)X_Mw>r{GGn{BLw}$*5(9L-!Dtt_uO0ov&@$NIyvA}jrHLQJL zGOx{64O~_*RPVbI^VU*h@4W6F_UhO+r*SM|i+Y0sNo^SCX<7N(^*J-&YroNF>BNWkC;E+%WgSZxR=OD0X- zP_K>JHA@*{6iEy?IF=)V?Rqvqq5+}%67@X!7_r$N-?2c=c~IDY&)rApl6_V8*79;= zWUfP|sfbCaxwu;Zt4Q58$z2B$P}m*MzCL@NsJ4h^ayrJmZ|J2xD&sEZaGOJ;zc@j+ z;B}~xWl-=fWT{h4W8*KGxe#aV5os#jmM4nllEt5JNqE=sam4Ltw- z%3JwcXPPhc1``fgG#x@e(;eH@#V9QCnv+~W3tPWB{)aqag{ZQ?FNwp1Dyw92UA2l2 zm#53sVcZteKJ_(w@#H1xr{>1<7^36~b^943T@w`$?R%r6`DMU5^ zVs;|X<>q8=NkZWGmRulob#nAg*-pkb>$+A!yXeKwwaF4wz3rcac86-V0>J`nGoi|L zQ6d*kARV7Q@apLJu)*%?qW7`K>v7~CkhrDseQi(;7=c0qc8?n_{X=?m+ zaDPpLHA7|5#;>mnq9S|`XGU{BQ2=DM-~7EJbK#6*;vEjcsf&AM>w!^_UxI|wlnfuw z3CB4kl--A7%kF5JdAMlYkTPNEK4cwwb!S12R^daprh}|AY%viR8d0JPXnI)@|d1S}| zZ=an1&OjJ(CGA0-;7#Kg!7+b3+R~X;5uT|MXQCfLn1V(*^?S7UEkumDd-pj&FvLm| zFynHi?Ri!Q1cZt>cKq;kp=`gV)d&0(M_71Yd zD?llU*^Y_%SmBo=*^(>_1{W+q>47TGBB!I;;UwOw0Sad|5%7ZOQJ^zi8A9#qhy4N3 zoi^VN{~OB2gTNmEIv9&4Ss=xeT5HXt3tX+d7fAXocC(*m&Q@^0;&|P4w%nZdrSB)Y z_l&>3kD%|tr?TcSQMR6JL<4i{zQ-oQ@QzyBy9vysUWumYvqdL`F6DWDiK5o70y9t4 z9EN;ckno1Mw#d|EPP&GfA-d{2-16}%vWccRtZ`C4ziJ9q{ESg#Z@vt>@&sV#@E#0v z;16DbvLJN^JaFSuH@6S4_xE8nk5#IZ%S(M4kdzi_F|vGpTl_9<7wY6s~6)uiaG@WTt$j?(0Jr1ry?XC6k}RFGZP_uY9|aZ-J+q%jL{({Q)Z(dDT7{$Wsl zjKwq#x8BfUHJPxEpPtS|E!O|jLwg0q-HiWnWkG(ku?!#=oK#7d8rcu74Nuna&SPx5 z5n>AYUw3bOi9$$0ZnM?(&OR~QCUg4{PUA6Hxbu8G4^jbLW$4vDXro0?DZOV<=fQGu zr+_Be&g}BJIcbLFR8QFZ+aRiZ%p(I0o8VleSSV6r-Wn#b=F3T4S9_*t60rGF1W(EI z3)LeT#FzN|c}%83tG7Wa1B=kS2$u|#Ew!<08dc8d0$$5KkA(DPDiogsj3x8@7RZ=L zI*^A@))s!^mARE5B}7;zZ6)s|kq}5Q({9RreaA%IMejsaN8hc^^j|2@3s305I^!ya zuMWy#_b|M~$MaizA2VLg-U^7Uadqa`w$l%~Y;i_3;U-i6v)>i5_!G~~N8par5e+`x zne>OXXNnEV$up+PObQo?Q^MTNe`N)*uC|9$zD}3`Y!u44yN}WEVn*FEVwgH)DaObVtE&Hqw-q|xATu2#;+>*F|$u05(>CMr6b3!U21$aEm zPjHgih%SNB#D$(-d{1n)uEp{l{lc}_@Temk(&C-W_QHCfUmS_e8kzi4aE}aZc56|0 zfe#sV?1_C@gm=advfARzspIS=q#P%?yS?{3eLwE>gzV8Q?gY*FmB#CoHD8BpDPCT2Y zVoQ1b{QRg-Sar47=wf|6DE@mMyY2(yoIw&3Qiqc2gGDVsJF#Y6)rNj>8%^0uZJCeg z9B!v&I;R;MEJIkHr}C=}T&ExaP|guWJ>G<0X~&!(3f@d}-y-Yexd?bGoEJ4QX!HxU zNJxapFn6Jpp+``2Z?dXO(|`xrf$bTbt5bt!c*%sV?K+q3q|zBr=Z6)Iddpu2#1u+7 z&n6`*K2L-dxk%Aw0c(mq1RW7!j!%tP;cYMrb=KIQE+n3;iRl%4I)59F_?%LHZvipY zNBGnN52c={z%38Nc#5apjW{t^Qxl&iw>9yYEmZecn%;nDdyxa=56EpqRrvF2L?j9V zG-+71r+qZMuApnGOi%LFIaz^)ROUAwTM6mY02vXA4y_JMV*hV$&&4r?fDLj_-Q zpZejNb85urDX~+qWHhA8?7Mx|%GsPu!#bN*QSoz-Jx`)I9IL%Jz~_1iv$?w%tLyI2 zXE>Z?Iwa>|=j>Q}%|43X-LG6CkFwt6N5=`7NLk~I*o4#%T(LH{>^td+t$ zW)`o0>-vU=Lx991);jG}qnxa!6dSx}lsAm_&y^8bYBr$%9ecXDF|9$5zJXu3 z8J9ihw`Rj0s0gkFY%C|{CNbQi4v{|l#vq0`7`m0;_tM<3I_coi3N__7*wupyPFut5hKF&(G z3ZvB&$cmy~EZ;#sT68*=qG}GJ;DdV$K_Opy&mXbWGu{z}tN_#X?N{42tHBmXHz z1q{qp%)LWbBf5Z^N4zeMmMqa!U7pdIw0>&cI@+$@y(Zej*hoJal4h-bytPee#zU-6is!3F`1 zua~fP=;1bK&93sAE<81>Xx&J9>Fa{m`LCpeKKZv_VBb8|(++$Y_%K2fiAaR_|{+7_9la%H}=r zzAN9UXFH1g;e?1JIIgrlf5PCI$cOOHwdk%D&wlTXM(MNso^Kd((e|IlR+>`m=kaT3h(md^H1?)qki?3o~H;4^)Tc-a!O5q zJI}bC&lM>edBXdOV2i3u;aPRYRuE=5ra0OJ$X@=ncWUtNuN3Y-gP9CtOL`&XIRjU2 zg}lX+To$yW@GGPNk|?zsbrfX}XPBCD9{axDqSzFHa&h%Mp{Os$R%NyvwpucRdwZAP}S0+%Y6ZH6foTW~aM zLGz)NwLS67K-rGD3KccWsaI1wa;4{y^BH#8f@w*&@2Wz=g~@L0pH0DN4dIY13eLaN z#L^uDj;I!fOkY=n0PkkqS*}3SMEkn1`PTh=LMQ)#G)V7VApnG+w+P8eNkJkOo*kK+ z+<20%mv3>s*myCW(o~ah;<3m@WG`o241jZ#0Gu=TF&)v4;c|hp2SV1yGR4QLCInb# zY;lcixEn7%cF`GEC~bxZlSXOTAd7`7GAQ81NR;x6;WB*M(E{uo+a)D01wMC_t@2+l z=*nB-Ap97UCm)X{AO=y+p0T^~aqfmIAx&a#^7|+JUhye>o{}w@NM+;sp;&W1IW|=c zl*?H8>%&SK7pC+E-9bL^Di_icr_%ig1VDORRAEHy6`j$S z73T%TqpqsiMcr17xgiZL1)+U_*D!Y$aIsm!Ib>Jv<+{&}Vlk>;gW2YxuA@1+3U21O3 z+Ubjz(dvnF&3VRYl>})43N%xP%D(l&0Hgn{orsJ6=}ySGq+DY57tV@Merl^gGN%VuqCr&6OUEi~Ew`7~wEWc|ToKc0(j z$Zu-L#)O8 z_I5P=Y%_Bdy-E1{UBpNdbnaAt@}!~!DnTPTiCKfFD~tGD8dl-s!3sN>$u&-?_g zj<=BXFg%#-Rbahgb-IW@YGG`dHZSCR3}x)rmrosMK()mXq{&VR2M19$m7nqv6Ru_q&eX(lh~;sSR7)Kl?qSlK@c=%QEQ#!1Z6PliUl+& z$=<~>lE^k}ZviOe{r9jfn;P|r!Z>qn{0V$mIG`YO9Qrm@DCHT|43&sBacTNpd@IJ~ zp{lA@;boimw`~UQzZyOMkN%y9zQ3dz+mw=;Adb6HV5`avcmp}FaN2vy8r(DslkuBV zBsEt)*?^B^SzHOWLnuvhP{!`@GXo{@amRUhSk_T>CJQ38Jsln%9iu|NHFx?firiMLvw!ZrFU0~8cDfF1>6p@$Oa3_X$;2AW2HNz}dZq?UvfUTW`^S$tQf9PhG{h>uiPd3Ln0z~x~d3`u=Fl%&LY1yXm|Nv*Udm%>0TDo9}wy5)HK(>bprkG*#>{rtou!F<^b(hXAYv|07z0M!+TPI z`Zn^}d)M^968bl0k|c$7rrbm+%NZ3J!tUFS0DhB;J;ECssPGns?=AfPd|JeS`R6Bx zkgE3dp=EEVcJHLUnF^+8Wwd%P(rQ4~Y-0b#6Zp%g@h`qMbN?Be@1oe@^WLJ(N4fqh zT;}>_xau#1BYK+2fRFO`_8ZSmVfVm~Jc27FTYhO=Q4KYCOvq)H10@pb9rW1XMz23=n=74{p^B@(@x4`d}>mO@mdjy8a&3tS98&)v87=N7}qxft|T~ZDptmG&=sy{r~U%-cRzq zMGiJ1ZHGWA5G;SMlfRmNRaRqWq;oS$dHp7hWF`cX=ufLW4`V?C-f`igXH;q%5Ve2g zUg8=rlvq$Uu~jmAHNxX@mQ&a{lAib(Nl0c85KFlImjThdA0_~E15)RNCwTh8&_Fq2 zvyz7G;e_X@8f&$_+6!A)fzN?`Y&qI?cU3rV9;JVR>3~OOG7#J5`e6%v9nVaa%Q)6E z9VfOD#A9Huu!6yfAFdVH0P=>&B_l?^-%j8Effs!SjQ9)Q^UI8K*YckQ(^nz6QBt&j zjQ;1UH5S-h4H%taBwhhCiu-8FkuNQ;z_EN4)teVj;#h|rvMKL^@hJ>d>kkMMYNG{| zUD=lALs__M@xPP+7@9%v01z^!)dH9_W8_Er*L@0{kVHi1u2ZJ;;5^aTm9U&JLi_037p zvP1nA^ozrAqc??rN1?Tk>%i@xz8+f181@3O9v@xYG*I|MzMSZ|--WCOu@w$t>(oLj zC8P>N5mpX-1JcMVfgI}y0hm3Ucl8o|edCz7F>j?k*BQS=176IjQ*j1O45nJDGFsbO z&@344s@DSoEQUt!&@nB?1Gd-4HwAvpBQsg;Xn*Nn!r_)?&Ho-Si2zw{go?F3?cRnp79%nf=k1qdTcQW5xT=PI+@l%;e+y zY3?{`-seKw`e$>11HofWW`Xij^K3O$Juml59&C3o?JA1+%Zkhke%`e%^{ndsjE=Vn zs|`u|@mp9O&?tX?41oZ@*)6m?oYu94IhEi^G%fBao<-d0INj{$upv=wWSylf%WHZu zK)@)5^q5<&-H(eGMif(NrI>v6ZzKedxu>&QuQG(^SC*(`fPlMac;p75IE(3^fzI%B);nS8BEFo~Pbb&pJbqqV1!C)zx+p=7ta<}@^S~qeVtFsG zQ(bI#E7e|p_;4u^4gu^5MX;OOpePr2bL;0#dL_gsv$H?%dX&cQckX;Rp862&NRQ!f zl~H)|QWZKZ+jMGnR@z76#q|%&>%K8wh)Z{<ia!AI1MOQ&TEN(!Pi zR(CO>arz}=*K+Uscg7Wpn-3|`kRMaOBX*FPV0y273lyI>Pov8}P*qV*^1n3U!l)ky z0U&l9NBkK5yT|9>J5vAu@BRH$w1#dx9YAh7d!Y0Qb}$`QY@-+)3RGJZ;Cg`MTBxyh}~| zImvRJS2ZY>{j(6M596sR>CcL5$9D^=t5|IH?e9iJHKjPXK^Pyq_Iq!~q3HHwuQ^S^ zJE0s17y4jUCuPw3o_!*pQjyZT*9Cd<_RnW)W?Nb6lqvk_*{x22(3UiNewxCDWYI|d zwbaMljvHD6ugqU|khIBkbqyCT048yhqU;ykeH(|~H>lRD^=0PO4b?5RV6w}uF4&$e zQMYaI)!x~TlOgL;N1jN59QbSr7Mq#jEKALMBwX@O7nzV7SCAF~;kadM?~Y%Y^V!N( ziiSmG3T2XC(lN zDiotn0Qche(ao$)ds;G*P_` z()S}A!hUks)h5_SnX<*bP^ie%rhBNppUv!)o15t`d+%v<8n09yecE)WDQ%HBjviv5 zkB^{I-z z`jL-{MJE#`gVffgC9jU}$sczf+z=52&&is(Ww|TAS6w!KtI7Tqm7z*b?qt>TEsuPQ zdl9^Tk9kb>O!Vhyw2m9wUXjEy;Zh0uM&^s}c9eOw=1lzWE zpLINI|9jT+SqGUEXk`%}c;q$fe9-C##z9XgE zZ>xTZr_k#Y=xuiN1bJx`0`GVQ!L3MuSq1bTy3wH3GfCTtsMf5;d-Pf2cKp3e@jl%x z#Rn>~ZK$doQ`W0U zVQld;Ku*r+s7Wh1i?M%safEv}X3j3Y2(Tf(04kiyCLI5OU^3R^T0%BN4|y;~lx$+L zxxzPCJf)T+X+-G>Oz$*COw_NW_m`#m5y2%=oT$WBifRmwk()B|b<<)@xZ>yxiy zmB*6(<0)z41BpYI@eGNWM@!jyH?m%xTtKUNpym<*2Zx*Q{-mtpwYvC=yGgfV^!7VK zQDk5AhwGpKkhV^%!|thl+Yy54oRVXhDIFQvOd>t#nGqEEoOmh%!XDP-zx z11DkN&p_wzbrTo=!h6;Gt)PCWJJ#KOMBMmlNT?A^0WQ9jsDBy|jM%Ubt__j3^JiDB zmh;UIee>8-4le9U`M(P@mBKe<@>}ZDiDZw1gbe=&gvzwBcmk>8S3>>PF!Odc^6}5B zL)Ff?_@fH)ry%Yl`VPnxN*(Cy+@eHL8U4!$K9sj)4cy1>akJDX-!f!3hnu6DQWml1 z3O7EKozm?Lz02`M^_zmKWj}to=f9iAY z6l;c`eECcO09%g(!Qe!jK%lgh)O0cl$3AAZf@tC33#!Td9aj!XouH*UKD49q+< zkDmhXJPUJ|HBEw#xbO8nb&BJhUjKrZ+GjoS@;NYC8mLB@fHAg()J<>>(7hd{9!Flo zZFixfsEResXx!+C-`J!_!tpBEN6a&V`aTz9qdwkE<^=LW{^nSBK!covcfp7f<5-$S z#N^XXC{NW}$BsebQ!6m={Y9x(Mf#C&)3|MbS%meuU2d*(P-j>tqu9aZKTVDPMhX7$ zSBnoZgk%-?4aU-R%V#btB2Z&^Pvdd#gMboAg@B04lL^d|FOXka+t1b8@Ym6=xv7IkU1#_T0w*$9}#91JRU;d2zzXVWI0|Z!2xld8J!Z=KinE)vnFqgSCdZhb8^wxO*81i#WX4ZLb;lrXA#8%3Y`!r-RWU>s*HcdK!=IThP0LJ zAoA;{WGj~p@Kw^=OZ!rIoQ_7v8M?ot zr_HkiqH=B4CdyqYWtVI`lz8oR-Wi1@g*V5jWn+z=;jn7QO+4PKa}dmBqT`B{DJ~ZI zY3}Y{Gw;QTrh2Av-#yy&o$&P>%Glxlh`G;jUyr(E3cYB@w!%R>-Dtm~{b)Na(KtpD`;_9Oc_>t}4- z!w<|#G=)0I5TKa6OAV-p!W>Se|nOSDN=P%(a`;0`KZ;# zbc({iIV__@LrVRt`@`4+rt~)?*T&x0;yS~l z%cJMvx`v_km+!zFMGEH{D=6ikruinr9if8iQ^%>A^#_revq#Eg-|3>GyuAYs2&y%-P zzZ?%j?~aOlRV8Y=$qU6j9dAI|QnFz#P@uDuiGesj9@VW1u59cpPw6WIMslmdNWY7ld-~484R3LrSnryQIgQ zzq8(umu(%rk#c7_UgG|Z1nvM)y^p*O5bE7P<-iW0)Prv2UVUaQATzP{>9YkWq&k1dvMcG4&pkgj z``ozcMz$;G5i;F3I~~jgbt#x($7rN{E)ml{i4H;PdB|0j_zpc4tc%CDJq%N2Tqq8} zB03zJvkh~IAB}NM{iGR9g6jow6t~HVUa@s4S}dTvBlyuS7@|~GXAKS=y0_6sQN7da zI8RZHawZr7hPjUzckJtj0s)@|l6+^`5n{+Z5NcZBTFX3DUiYc)&SS0xh0xT&RMlG}oJ>E1 zU|E1PJAlnwl;vAEokmh6>yA2%B9#{)-<^hLR1*y~@!VAp#mXf=zdrI@mGyLgqqZ9$ ztS6JT$$TSQNMZayYeQ#Hk7ne8hJr8cdso-bKjQmcNl1XNdrqworYb0}kfN?RL@OyD zXoQG(>|{Ih&DCP;__9h;_Hx*Eiujxw!wM5^ z*gY-&yAG|>=f14|5KMUWlKG?`f{%KJXgychf#5_MRz4^Tn^-wdN4r0 z{Ib}IL-4gDZ8}*5B+GK-tIeN?Ig4eXkH2>JSPmtb#VLL%>5A!P<=K-<6*_#uzbd^d zPn6~BRBINSj}L0$xBU7bzB4_!pYo;5Jl-&thX*|&|5#A?3oRgy0X*5sb24=ij=i_& z<+Tt!mHMf!erKYtKVPYWc{=ISBn39kiVv=U$Ig z1v-_xUmo=IT~zP1Yjs1>xc^%8@GmQb&BbNWR>kv?b@6)LsAHC0e$bHn!NWJW-rr3< z$Ve+RdZKQud;9os|K}w;lper#A39^I;(NAVV2(Dqlg<+d%f!F?xS9>G4DS0RNDcw_ zXNI6_>YpE)|BT)`Cq8$c-4+o1=m5bbX$Y4}30TJ*>c|E*0U2s2fk!P!LHo!D$)Fip zIN+T4(LGjW$}d)_p}Vgfl&{{sJ$)U0ZkFk)Xieg}-iA(pC$I0$%yeDciDPen?3o%T z!oQp2#qf+>lRZ7?IIEs$AGNo&naX1mWBL)SEH;J}JmN2pTn)YL)&3rs8)eO{Y_^eZ zQYRY-1q=P$h99L;-M7%CGuQqXdv6{NW&F1dkH{Wn-$#~|31vyvQL-gVO13l=5<--+ zHG@L-Eks2NQDL%Y9s7i`Gg-onHp?(0#xOHi&$r)m|L*sA?)$ml_r0Ixc-}wWKdR$! zplhz{`hJ%4bDrm??uW;~pix)m=>_35WL(`Us|76XTn9A1%{Ny*Kg1gOs9W zgVH3~@RF?at|kY2t^*!#p3^%~)0$wky(N?jNg~@Z4{(AT@VHq)DrdHTQE2#xfu%UP zj`3K2yC_(~>)VZ{f)%SZcLMV;Ccbb(+Xq9J=K2E@H-QfbuIvN1LV!Bhft6T<^P!LW zo$~`USr?C*)E_j{!#f5I(=rJNulzYB9>uFCH9kF_0%DI6DF{sL{MUAenu2IWK1=25 zY~7W~qb(dJ`W-u2WVQbUCQx)5FL@@avKOI%y$r)HCDG1MpRIMlCku&%Ng;at1VZDU z#2HKcEi1!)550o#xerzD3~|ku{4WNiFni}@O9~2jZ6Kv)vvT(+gk+V zO;$63%1)hwtmC_o3<+Rxe;Bw}*MAr|YqcS=w(XTE>K2>9@S!YgHY?^DVe%ZJY30s^-UaEV}#oooY? z&GJG6Rl@oSNct~};uXlJGUwU0)xe#%V$~Z4QGR#rLl1z-YOU36gPxkypBKl91FDR_Rl8+KAsp2OR@s`6n;&<-b6V!{6$jK53 zayp5Jeq8ym*F7B}Gyha31O+y=b1${Zu&NAg%27%&gf3dRKdUUY2w@>xbSGJ~ac`AL zXX-P=CIRe}WB4$|saqX_oJ_g#5bHqx(7}$Wdll)2HI$q$Z2K!XzsjF5-|y)oYHE0S zJ9;a!_+}S76;ETS4SAs)K9!nVUM{~vgS0_;{wJ3$pwj-xvR$86-U z>mz`DcT5mc#}#VO52NCZ;k{JhwnE`Z_&x8iH=(Hm>w^x*vheB)B@*aC#Rp2OhxBal zZ(pX4v9Vyx!}M$-CK)NPA(+t0|8(X$w7=H+F(1Faw<`66WM>aCqsLa#vKN~Mkh@ab zMTQWV)p>}1J&-OSpeaz|*BuIH?!)%nZ6vI0lLEPBEj{h_EDua<>rL)n+1LACp!2hf z^iogDGQ^tzuw$!*wVmZ6%;LaA6!O{NWESl$Rd=Q7HGOBRjS@grN!(yW@FDVc)f_vM znHv$8QYB}0Nzs9KRqsZ0ZFRFC;}|ps%Epl;jF6!U(cP(g`IdI3yKlYbOTN6{zsUtl zr+z<`lh}V%Una;2xWuhZf-Q%0X|Bl5C(DIZ*XyXQ#cvzyCT&uxD%|p^lFMG!@!0pFY(rQmws&qyk@kwd!0?Sc zYbW@{Dtzi#ad=&$c$~k)wrK=8{!@yjOGyBq<#xMDz!*$$DQkfcTPrBT6rjh?x2S}* z0#@YPFKv6hlIxFUnnww2Ut^bD-sWND8f&;fgYX)a2WW)f&c*zcl6dvk;uqe+p7ei+ zadYA2Z2PS!lxyF$tB*~w6voi716PhjPl)HsgqL^E#jON9W0&TsyiaSSpukA?<+8q9e8sGxYjTiS!-$4jbIDglE1rlup0Fb~;%&8( z=K-?=$Adl|d652-_>HRDffJhYqs5;8nEr8hcf*w}@90V;o0TP_D#Uo{KOv@Fz@9&{ zWP$k({T|?F3*V9O?{0sgc@efhg#RgQ`M;0-{70D3f8y(i-zpHV3M1GLUNw;WDpZBo z-7GGrOI5N9KG2xlzb7R#OXA73^M+V?g(JbQJjA%7Fvla6DTNSkCw1XeEj_`10lwGA z6^)genaZoB4R;M6pGnQhSwGNyIk+L^goI+U6b#A+i_?G{!jDK`ic}K`<) zhIgU6d;-j0sr6t5%5R)osd~JXljD*e)^y}%^Fl3p9yrl$;S1>p*4hH66iETaR1{vn z4pJ;2C6PI6$^>k$b`ZSmV##eVOn(f`06Wqt;v8wgNKMj}qbpjUsH ze$3)#@Mal8{kep!+0PZBWmZ9omhFLM)Lgyee_$sUKclZ=+Ex8uRk3R2s~={j`!qKD z+FewQ(pp1}m1ERV6l>JB5hxTcNe!-ptslq0RzU*9Yt68WbfXJ0>?4hhg$})xgP}ff5D^WRki!6kG>ta@CEj;y7HR z(@5Ptk*B{nGJC0`>Dsf3^Z0LFR*se#kF--m6|W5mF6t*Tt-y!2N00x3i5jbhCUs*t z!70qWr2NF@y;NOcSmY144-1K&^&jG_p5~^DgfF$r;=Y2D9Qz7w6Xe7Ak!s` zWOMFh0W`(;X3r-%MW8cLEsJy9bDOF@g1*CTaZQAcCGGShtqZt!qE;5D7Iv!$rf=w-Fq~77u%)?+dEL<|AB#Lg+UL`@gT305hQH4 zzq$thbx0y{%QtD-?~TT{#=6YOvtmD@vDcs~&sG2J|ucP{Q?p#x~eX@Jv5|`qxH~W zyQE9yPWQubAgPw;PZMj6FJe1LehAIRhiHj!s3l$hqv&QdizPo7t`%3x7 z^wn;$uybXZ2Au1!h-im_o4as7*5ZtX!F%9htQ(5fNW4&Rgv$9O@Xf)7+8Fn+8t)J0 zjB?qhc0%T5dhUx7h>!EYsj8S4u|3Lq2I`6zm>Q5%llC!1SQR-x{=jS)o)_-kl`5Tl z<8$Doi0w6Ymckr|f!K_Tap*Ti-nrp3!Ahl7UG2kds%_u)hVQ+1kZr?h{Rvp<#Onp7 zP{fqAgv~%1KfJzyt?4Jbo)fu2E$dA?m?uAWbY}?j=pTrTy z%GJQCv^=>;bHJb~pZbeA~mX zeDQFqg@LP!%qC3Z3`U%339cy@>JIODR>rg{Yg`)nE*9QXQ08*EVY=axX4sKFoTl){ z?exs^S#&_UfJWzPRaWX5*L?K_A2LJU`9eaYA*DK&H~c_Z{&!7t=Bejf_6wjAJy(j2Le4+Q{R5L|KF83X zW}4H7Np3)YYm8_qSi+MBB%i-e+H1}QgQ&ybHdN22VQ_zkKL`K)AKV_yd=ai@s~ZPu z#agb;WkBsLIXl8s*M73c;_T?kjH>(Yu>g*?cbCONU-9&^!-5ecjYLq#kr%0golb?d zEhP^(vAmJS_fQPu4q07$KkMUGYE?RQ=BOG4(e+uMefO=hRrGk-Sm(e7%hdmT{+fFY zIF;~POt)QPfdUoPUYI!bose*C^af{n$t+4QXZ1KKPi=L7rnmC9-Nh-nLCUtor+Z;s zCHX{N#=e=EtIyFQ1!f zn*XBz(2xiX)6oj=+uA+xs@v(n_^yH@nZOA;1iaZ;Z!h@zO;ZL6XH*tD_-=^{^%(S<&T~4N!c51NhG(9y@@Y-l8p}(d;O+C&WQ6*XgAKBdSuM zTG?HW8nI)gcck+&EWKwYowMYRUQi#cNvYqb3D3L> zEG7QH%4^0rX#vEGR!XO0xRq|Qv5;pkqB^l~x(BHw8f{|qt3R6^<)>_pJ+~?fL!JVB01ODeuNReC{)?=>%xRmh=-@9%Xr>CrGW;0%0_397x zrqiW^ejWdeF$C+~V*bDaK`v$@M>R0M)8!{IyuEKNWS=*U9}e`8ijKMZz`|cURk}}z z+2!AJLQhd1-i)Hy3`&Gn;|r^FV-0N<{IC5+jjsmOo>2SFT)#MDDYSF>MR9ty>?@cj z1;!qYy5qEtW9Wu*f%O*^OvRB}jmf^>=i=Lft!^LAnRXf_D+nDPQ0a0KF1o+jB zFcq;{IQfb=2N>O!^hKhq^+L+(JB{ee4e3is#?`N9x~?4gD1O_1#xU8iqggd;t{8@% z{udb*Fp(!KGTfPBtelO~0JO5NgYmn2!q#5JF8H69zN$VAa8y1kY#5l49n8&9fS?G{ zz#)!#g&syqco*~&Kdna|r+gCNw$U`#UDaC8TZ_7I@el0IeuG zCF&W=Uv!^@^Ihzhj}S^w>#kWc?7w#R!c^I>ln=Yixi5-+r1wL-x|CbQw04azcNRKO ze1>{HM6ymu%i+f9lC=X~>g=Bp*Q`+RZpEYIr}kV|z{!71&!Y;H(tsiIGF-^erj-72 zXS8b%ht`slgS(Xs$}_qSar)EA)vGs;_a4AGBB+B9cN5r?C=3cInwBn<;YL{T`d1n@ zS{Y4%;NZh$M4Gc+Hro(2q6qq{&nVF6!{~OS>@g{$I=KPy4+?9Mnti8!n3!+LQ(!RO zZN+Xti~`~JEo!&6G!AY@DioS^UZmD`PgYW8^6#5T?fSItCi&%qJCJZp=c@nH_5!5Gpoq?)asdv7eBomIwb7VJ+r9~%z8ac;JI@YTR0%)^q}C8 zCqgJ53r7>zx`teJW}m!0A=DA5a9{5BUGB#xRAXdaL>(U;k>AUQ?j)=)gIiNhv29ww zObcl|3|Gqnu4-cSW7vQ`Pt(1vac<7?gD0(WgRw!>TWUp z1G8`=Z0-S;HY;x!7IWzS0)vTGrC(DQ!|SSz6K<9GPzNmQQ-6@IOIROqDEs&@_0F5! zPuS&!I#)tQkn?3Y8AHI+kl6TY*L`-;iI4Uqv@Aq>IC*H{re6fNSG~8*hpAJZA9}uS zu(6I0qaGkBwi@6Ql5~^M`&|K6B&RXw(lBl~J`&u^h4E^?yJi_y5iHE`lU)S{@kZrPIMs&*K^hCdI#< zXobYJZI};klPm~DA?WY_9qpim9s!w11+pT*(R$7cBVb8fqkV+B zNM{Yb4^lurmIwISQ}DaXs2O;?a%ExX)WxZ*_y-?h;10F2@*p^DzV-f z%U^fe8+I(b;)QzkRg(^*iq}2FI}wUnr|u1RuR!_m6 znlzhnHOZ)_cz;GyM0rWB)m5Gbyxg_#hMO=J4Et$~jMjFG5G1hj8A59KL6L#R_CT_?x%i+c1LeY_1&Gq6_#Bf zWA=tL&Zc$>(=HAPqNZF!=N9Tp*b-;AJ%(z2c(rGEcztNPY5=Hkn`m)~)~{uNUq?YxouNGTlm*<$v<7i_;l;%^Ne$A*(C38)QKzYG|!GA-|2TgAZ zJ+)qg^1GYIySvlJ=_PXOlVJTOmblijvwJSd(7K53+Tr}XVIp9@D$(jonU!)^l2lEs z>E7pc&QX@KY>TL`PlvjLgxmFb6f;g&z5nQ?$gvM>$P+?IMDDI&a?pt+yIr>B{urXH zt6BZ6fnN(j%4MBKrvP`ryA)ubCOG2fxmsNo*I!&Mnt)^8w_xfu(SQ!}`PKs*MSlyJ z;P`DV(1Pf!`N1hu;-w5KyhHq~VeUQ!U$MltevfdGu=l51%qMys(Cb&?Ih>k?xPB{x zkxn)3mA7M7mz=Pf(k}GZ@S6rt@5SMsr%f&sts{YadLFE?6Pisi58U%bxtYM*bipM- z10iqtVD@vpA-N~4VxhYLNl}Sjhf!Xh{0w7j|^=;Qj$I3WSZ(1U&2rUVHYTfmLit94? z?jq@aL!16Zy5;0N|HBuy9|m;wr0r!Ye{plImosi*dcQKkjOsmka09!HpkY8H5~R#Q z-Q}QAvLs;_v`A}R&zu$nyVisw?I*~j>K3Zb2BGQ%XXJ8A9)yPS3 z#w?MY7@%juuoM%c3>mantVhO@=<@=jyAD^;85^9etGS@i1%)nae#M&VOJL?CD-L4YmjBbK!XDpn~Kho!>9p&2KTq&UN7SXd{#4_$Qc0MQiJm zLi(i}LO#y(VwHjnt-THVaG)M-wdwN8hV@PzrHM25rP?^+yfNZt!O{#PL%XB(DzATg z`~8Te5ivs7*{RhumfIs%W$U4&3KZk~K8P5jSx8?+O#TDkK8(ALNh%aHL{hanrsm>2 zMk1|zWXV+*XWfhXW$y3yJYOBcufJC!c}oWedUAid%e{H*R4g;}z5l3T#FfCiBCl4Z zpBx++AtAT29aI8$ehE7GZ8SkV77U9}H+&)c4K(+Xc;z&`sSOHOu72;LUbCp|0q zraWv&Xk#>;FKj-@{u>9$d}W-&3`KOH=&})D%eFSA^9jy3a7QrI`VWj9i`nMHz25mW zp;Ip1*?41T@Sz5IruSSWY&A2Dgyfn2-qd0FnW*gP5Qa+{H&Jl&1WOkKJ^5F z;E`36!9c~QxvCXqVPDEz(v~bz4Q~-O;#x(<41*S09Mq&wj$~X~S`9uGg!o`Kz@}7v z#2%)U340R>U$En5nhdEmJI>#`HhO7zjq^%VRh~*Lbu8edxy4CAd5Q^OCxu2@(%At? zr`K5FzB~0;##_2MY1XE$apIZQy{Gko>a@wace?Je+0=2rjX|3H-##w1?|1hUvcqob zD+gGjIqLeb4u0+lt_8UBX->Y2y(?ef#dG@GfjRr( zwfWEr@@j@>jI;BV2{X*23jH6rhiM5kW2q5iL};}Q{jOdEg_To_5zEl_Z*F;dSG{ha zj7RNpM|$urfMzyGAv8=QwgIMV<9KJbw%I&rROpd3p0$}j_K$k=|7KO*(0_gai_&r`cL#a4>e~ysbL74J;&QPObaD(ol z$7T&!@6e*ltw-pwB|cN=l2^Xu5-iQvT14}de4>5#ft(9_a^;Ed&5w()Z598Av}h+_ zH{P8)yNm9&0GIVi#|MQGKTF$>y-22GQzIeL2EAKfrap5}d;KLd?oV6M0<#)Yc2wHvCT%FiDmM7d%X8?>12 zh+n=C68P{Pz$Tg%RG@0-f5tzkwU)e5k&Z2px|}>wy^T>kE^ze`TO3EsD`hU) zZm{!99aWEK7Ucx)0J_Q`lr`nFDUIsSC4-D}NcjnbV`_ogkM@X-W&RgKaa#WlQaq@* zvu5F&L@?`8g2ZNUfK!Uw%f;*H6Og0R2ww5`DY4^r`TWAI~!qsOuD0h~yfkl0` zV2VXRwgw$=+9A*fFWw`=(9z&YoMN&O2V=nn*!dXCg*wcw?AXOC4Id^yS_pEk*k@fS z>ptKz-6Uk^3X(^RVJLfNzRJq-yGWCo`}%VUwPD1@XO&GKD;+JbqRbptXTPUC$CqH* zFCf2tinIV`7kdzYV5c)HL1CGRT)%z{Lz4z9d!^@spXcaGrF;yp&=x0f5!|%5N69qC zX($@fWu9oFpQT`WFv5rZg`kCw9mm;Mvdzh7mHn>gnS?_95Hju;$~BdouD_HK4>Z zqGUl2o(X~ ziYix6<)clsP-KE7#Z78QZYLdFzr)!aXHXS1Bo^^hcm`(Rw5f&aPh*PSZ4dtmKuEuB zw0uvBj2xnJv{u@Ry1qSeRQXjYa@KU$QQ7-gAhcUV61_W7e35eWi04dgir0s_5ksVJ z&QS860jJ#TkIPD_)(xwlZ0>H(60neCn#U5;#=Lj zSav3RZef>%PY!Dr^8d=m#A{2RuNu{U7h3LrIr)l04A}X0aKjPU2w%d@Ki}sI=fusw z$VKjZT^-~bcpJWNifw&+(O+iQ$&%TKFel@exRO1Bc)5L4`2BKY`CmINHIPh8joYs^ z=C~Mevte+W6~W5DeVZ`e`?nqk z4cnrOBl8z{MNi{=aeQDdDR%p-ZX0jCoH)hMNi3%^j$3#1qNe0``|y+ezLnHWwt!?9 zl!WsP+}25ZfTSJzh1;~E}2@@wgNR&;Tj zXIEMByZFSt#nx;wVORnixUxc4!5GX?oD{_ssEP+w^t<(+wB)K`V@^!_sb}Cpu};-v|sN!;4lCK*um++`0iO=y3hPQ zKl8CyLepPef92n%w!VrQtfSPJ7io|ix;V7$0oq?%e^Or z_*E^WV5QG*!(c%7X$Iny7a;Ojbk9xY+Kx2eyR2h_G#yD?xbASo_(G4Sb2TofGstHN9eA^rgLact7! zKp#2DtqH!`ZTwB{w^J^Fbc{v)P?XHj-T`2KOIXIx1yfc;IHy=eVuFc!lAEm_DM@w zef0F;g$GYB^H>?)LfQU(z0rHW($^O35+EabhU*fN*Mu@{r*XjM+_@R0^rK6?T#uz^ z9ktn5{B+ZfM&0OUl~+KS_MTN}J#>S-qUHguhz&nnfV;od^n3Z&UEwdfuzr{J1)R7f zdK2wDz1^QOXi5o5Z3#5a_Ah;s^d#@f&Cz~suVXJWqQA2jhO@3#SYM=YMH||L>cE9U zZ`q7jjB{M|YdY?ou8?_hHN&b+Y2I4~u-m(KOqY1MrLI$Un z+gp{X$6AQXfr2*A=kV9w_#1qxI-J3yE4#!kPenOkItu6@yPvd;2bVP+2`9-yD|7L9vN*@2hzpF#X-u8I!^F2#UQF<^FRG@4QjY(_Vd4&MHJU;=?K2$>W)qJWq2HBdbW6TA#!9>_;A zgP2}?s43KKfMIF0V26-Es}*IaN5MfnWR=cAUN=^u73EvL^0TU^0SM8KLw6M4HS`O=oOO|y|kt<&(t4g=YDy*Tu~Xf!PpnDQMVo# ztI#cMsDx-8%a9b|3khB^Brbs>xwl^!6(!$qANRU^0tN`4t>E`{M;Z=?tWEwjr^hSt z>ZI}c?d=p{ax&C*s%*qRXe!x|>t`kknL_7!oU$N%c!nR5^x1(+iUUMLAN4sB$#!P&vifdy-f zI>Uqly}5UzvxY{ivf2mGsW$9)KRY@uh`L7GreM3LlSD_6L`7MUWGoi^`L13Q94e-oXOnS#7LN>qWQ(#5`_C_eXTLwQe%o-Yit$6W!g z{lv7Duhi5n6299=*q$od;q!ZXv8VS+rnCC0`>Cuf!%Ak4{9?LQXMKg==1&NIf?$nXL1jiaxupQ0|4T+=qSw)6MMJOMAR#|?erXTIjmKaUykpn^{k5+s| zfP&o@aHQKbC=*#U#>&QcHJtTKBMRPsCbNrs==M6d5x21o@Op4Xb*J%!=F;du#}uhE z>OFkh$gL;;+6&R*j+dunNIw*V%PO@>XUY3JDkTEGB6gTq{`aiMpdu|l01?iO8jH|v z2WTVb^Lbtjt$5_oN9HD#XhqyLfynXyircPYB!s|Be zrqC^Nw)Fg|6Sa=#Z^GDN0x>vc+m*7;n7hVB^ly0SCTb_appPN6a*pDs3L|kmEI!L&-fPwwH=Y7jSJZPDz z;!`gy4tk~XH8n7+I@2pWc)zqy*>WFOq>Vy65tMhXbQi{fU!O^QcWPRw_sBi1SAya! z12PYm_sZ6{^9Qs2>NKRHK+5No&|r$<><`~W5|LEPpR?BU2ibQbMmHFH6gs9)kCeZv zuBuMiAH!{LA#&FI*h__jz%CsIJF**d6twxyf_y$ew& zbLRH~lzt+)tn4Z!G_PYgbo*peuPGDSj zrQafIsbg>8u2AZ-gZKgy7jwLQR2+`4KN#(e=i<~6d@2V+mKN^v(+o{&gXE|j&8;OR zuI{?%Yq5a7q0g)a(R2XQTSK>ldX`Zv-8rXaf#_G$p%EuXn~|PY^`mMpYLg3^_M0RX zM)ES>gYW+6|SG9Pn3}x*qRE2HBR$uJ3GLX zsnwSyi0udNGP!BZdL;PdrP1~ax*2tqL>u!RgMRsd&d&?)X z%s}0}8?6kU-sNV@yxqfDRf-X|vqf_WF6di76?|qZ>z!p?R`dQZ9Bqfim3Uc86}y&+ z79G>md4U>+vajrd3~GQ?OyP~y)t`qyb!%FwC>2;e7i?dn-wW&t+&K_#2XTQOvdf7K z7+x%@{@MbvJ&=oe4)@+hbD^tl->j9tbe_@QpkZo~{J&U-{%Nryd zc=q$4R$sra3qY7r%#$ImZ1DTUG2dcB=b)ZzU=oZ7XC-6tNV>urGu=)aw6dRojx-Qe z`3N-e=(Ets9K{i}3yk32ltv;be_;0m3_b3?(C>V6k=1bHN@65u=*v%9dA#g#Dwp|r zlYz=>r@<`rXPaFLB*1!UEC%{v(PqIP_>!gQ@%ayI-t`4yhYoA*R`PPbd18Mw|8bp_ z+idH1$GLMH=ivD~}K>^Oe1Ri+z@l z^J@;_j?8^p$Hwz}uYljq@N>a$c!(#PQrHd`$N0J%oThF@jcc<6?Ha}xYO^>c1N;k= zAD$_a{q@?WTae#mPj+A7vNnv93!s0$K?aKQg4aH4Q`y}N+SAp@zwK#U3l@-WhOvfb zB=?hh5Z0p$J{18KMb4Mwbe0BIPnOCR4RNg#8IC>^DBxWCngBK!j;>HmNhw^eY_@ZA z?tK4fPqiADemk$R-!-QlKd|b+oAPP`xRZUZ0j|u@{u;0YL}a+eD_Ihiygwr1-WOyK zF-)a!Y2ZJwm-#0P@qgXF|2r4fegpGD-r~RJaiqDO-y@ifL{%sOfFGb%1*!rZP0a_l zv)^y~Z;$f^1E%HmQ1eD1OCb^W67vNQ*&vA;tR&Y!=%FiY=fB#v{a=g{!5@A!phSFB zd>u!Vq@=Bb0ZtAs4?ArQIb;Kr=!Z{`l~mz?#+K}s`G<825+71LdEMBLe@$M3pxz<(jy(jd@#}Q= z(X&I6dyld&=EFu`;`VEU{-AcVo_q@%$wQ^3711Nw(eSa&WyCXIs~^8##aqVxIF>TB&ga=UupK>f+*^V%n^qRZx&lhl-0?ZCUy@VzJTU zc)Nk^c^H~O5TsNp@!E5UZXe+@OVQ=o)}juamXb?m zcR^G)9~7mRbb+zo{!Z+&c>dFyzi4GiAwf!gWdTP{$9vr0z)qq5pUOU?L;tb&|W0)+XM3{#t zYb3i)meg>h#oI57pN7mLJhZLDZl>q$8q}VgZaUsJa5Nvr+QQ=Prhd}+SS7}K%sT{Q zCFU{u{gPk$oUiuepYRSU^%Yw;pP&tQ?>{=-Mok$gNB36l`Mul@CM$kh#vqHF z#a+8k{fE$>N<=<@)TxfMZ;DOTm|3>1-kL;RhAw-?_$kp$ag+q2w}) zt1yg%`ngbQKETFd2eE+OGrdL|pn9)F`^_h%@r8!>Uouv`XXYiIdAh*qOKgLCfs5qV zpE5s(oVwvMAX;N*)kh2+)w3w#9Xpq>uYC4(Xlxpp1q3MOU*lC;-`)KFL4xN2os7Kt z0uxwr6#DltDzQ}qe8eW792|S3GD%~1=vBV8gjS`n7Y!qxnO16trDp9kKKnoM%=T82 z@YroP%RgyXIE1_cK!vr37$1#?cTwD}h+kq-Dh~^$+@A2I9Jdw`eiCpknpj}v?#YwO zp~r#P#l|iVFF*fJ>nkU%1r5ni6mczfQ$vbQaEP}U+IVJ87o;wI}tXz=yz7%@8OdQRZV7q7jhJ~H zHHBf+V`LQJ%~WY8F}i=Jc~}<15jJ6lJ?%_jt_E`{?%} zK6WgaNR(2>AVErMVQJ)Pf>)#NF}ITZo(}HU*NHO^`wwS+5_xa3TzeA_y!8v`2~5#7 z+i|p5=x7&GvKi^)L&6GJurJo-yY-6bH_aS9Ayn3LE%w!ADRcFOex=wx@@2tkR|G{7 zFik{34|JfMdd`fp)q~_()c1}JnSQ*VVUsx1e#=|5e|IWzD$LXBm4oTAu`?B?zeNeI zwZKHT2_R@3r*G@FBPXi>t7ix+HQH5Rkjqf$eRZ`8AJ7@{t?vYff6`VMm+HtH?C@#G z3mG6N;)kl!B@nN2^;(gtTlkp?0OYHapyEcL$GR z&`Mt$Ar>0P!PSu03ZsEgp*zffp|z!Q{qp;o>_oNCU%R3ePg)#@RoCfFl_$b>G(TV- zqJ)@il)}zi^d^!y&YK7j>$nfikIW@2(;wo(EsQeQJibWLpU`+&ShNa6I5vwQG&>S) zkexf?@w2m2JY=Q3DblL_z#^l=Trv4j0O-0HgjDnll46(ku&`DIj}-_V?37cEx27yC zc1)l1TU0JwaWG-(6u&?2p?Rb)&TJ+&uc}jCPK(+P@oD&%_#r2e)q}D7$8VI+B2KW`XUK4WkACWwH~H-^bOjM>sYN_&6M7q;Xmef zv6nYns5vF`El)pK%}Ekxif91(z8T{nb3Z*oJnB_L%fzOQ`I3?8`Q}G8g#Gdtcoi?2 zNg;&JtNvts!soL9s1O61z}_4HceVoRqI!N5^3-4X^}vMAJzbL#jau?GqQ5rl7*9aJ zfm^_|;Cyo`e)znQ-*yWtdlQ&O;p#BttuU(4Z>O>HNJKHpiX>U?u;ffk9O#`e(jR;K z{-iaxBcA&9W6%W76f<82m&FjBpn*9`#m18~gd06g%NbT8(0E(=5*1&4?YQM?m2R;H zQwTHf#8d?X(P>Cbt~~I&A7%bb)6e!FibS@wmcFN`se2;KY%K6NiNv_&}g z_17gBWqol-b^t58+1V5SdePzb+08Fni>Q~V_ZaeWIhvr4e`t7!WXC=IODZjXWue*c ziFHYi?N`J1qJ%%1btHL@4Y#FzNQ%EoB9m__hq^O(ppRxdKgk{%`lc@ z>J2T#21mZR(mLklxOM$ny{y3si0qQXsOUmo+~Wruj+R>PxdL(?KNM-P^KvEvV)RS4eh(m&{6i!i)CJOwDw(FXT&}*VjL?Bx$J- zrCp3sRmqb4!h;`j`j)%m4sL@mJ(_WWiD{vSy`j6Ep{&JU8Lp`12F?{EiVgpeLfo@F zMXzZ^Pww+Sxs2X@2TnzxGWRe>{DKrFY7nUSaJ{;!#)dlcuvP0vspclmF`PH`+SsRX z+DNa!DeEp&)nHcxq#WvPUPn;>Ia)IMxn)$}TqsO2csq?tz6VDB48vR(ar*rR5GP*J zI{|TG!R!wVM?fv08h}kJT44z;ZpX&1o)Q(}L^TvEHykU=$w`gdp^VZ#3 z=BUf0KEA{?`vSMs72Xe!j*EakVdKBh_U7?WhyCB^2q}`X?^7tUwpa?8RJJ5i*_q02 zLM2<65!ts8O4-VmZL&_5OqPg3_N-$l`!FNMmsvVj_x(Hf@Acg0oag+0&+B>qX&uA& zn(O*ppXI$2Av3_}0nBxf^PGhtc^#RF|8Ja4Z2y$8`QWCf z=8ENTg=2MPWz0f$pq0!6J>GPGKW+JvFe7c4+#Zqubccdxa>4gz&7K1UcWvmR#N+Ax z+WEt3KJuLpKasu(-hZCzh~d(X?bPn5o!jN13mVK3qPE)Wpe*wGn>~}5E_V!-L)w2NA(Cz%qn&i}gvg#f{LcsTEQBz4Vs{QSK=7fuLlG(`9jq?LoYu!wVU;H)1N?pcFAW%6! zRDh}d0tL7=rjjRS59Z`9ipHzEvuAbW729@+*-jYnKkf8p?asAC%@$ewyGl(LO&HRoY%u3Yw7i9 z0(>LI8ovU3@({bG?*GK+AXD+Ropb?(77S~Xo)3ABc>E<#0{zDAb?(iLD_uoay;1H@ zUvw<}vS8DEE1x%0f4duouqwtbTth$#c#;t@?yK#3G~z&w)#j@=qN;+Ki8(SLs$5;j z41C52uG_U-javN(VA!V^rNLr|m|%99y3EKIj!8ELl|zLD&Aa#8C2w?zkvvmQwB7!x zuqT&wshb`Pffg#eAoPU1PQ|}xylhe++MiiH3_K3A{EMfJR0mBC7S;_I-c3}Gx$A7* z{m${o7vMyF0zHNxn|nvYt1UaZ)+2O8$SzrB)??P=b|Hn!?(K=&C*}`FlVKt-->ts0 z@F+Yl-VM-+gRd~aE+Q8Aa!Zc)S&F7-6f?q(`*_d0yR*5ydbQBD!|IQ|CdW#<{05(8 z3WW%Dz;|UuRT#_$Uda$XfM8W~DJ9BugwC01|Cxbpo3DP}Xsa4?ZycNXP?__#*P+#o@ISCYlblXu zA-t}WBs7~dhM8G~^EMsJ)1Bq2SF=TNgw1@BHY`fCIL#+?BvOx6+h-HobpjNM)p+5z zS10Le{b@XKZQKR8mkA6F#^fzZ-e^Sv^Q&Mr-6CkrfLidSUy@#*Rg)~PW4+h(b;t4F zPn`ftj|F|9c2@%_%j|&HDAxn#z~MTmXjVynLcb|{ckTPccy*Jm=MUIes;sQ`=m=;q zASIY1__~}no-x@=wcdON%D7oiYf%$~eyy{Sv!0BIOY)OLZ67?RZ@qZ^RDXN|bF>x= zWK2ma#UDE=iI^xRJp3{a^SZ|y zOL&Um+w|19Kt@LRDxo_}ZpmaC7ug@_eLst67`R4}f6AJEn>~1GjsODu=PXmZkEt`G zZ6tLbp0SkR9(!ePWt$@bDc4b|huc124%!`j)dy@RBIU5%$RDLlPRBy#fTU^?(V*Ra zFZ=*hu_KdenmM2!q|kSatI5{+xZy8Ok>}2But0N|_i)L-T7XOh#tlC++u7 zJ)O&j_64?i0(9Tts|-*MxoHs+nI~}75Ng(_XEfT|LD1wl>20!1qo08_TM*~TBT*b) z=X%d!S1taD>0qAQB#bpupPDA7*I~(n?Xg|6Y%Y%ZQ-OEbzaRUS?a=dL2e&qXdp(!Q z>;Rl|9bpEDX?L*)nIlY|+92cNO{Cc3ep#wR?()@ZNndU4J=xmqk0GWz*pn(0l2Yb0+2@9BIdDxC1}7FgZ3Z_;Gx=>*KIZQ^T|n~_a#B-9I7)s#T6BTkm zXsYvGt)7kX<>F@jtiwGdef&6nAbn=yYKaeyq#lu%#$#Xb;&JS1C&?BB?>&^Om@x|n zWs39Qfx-y|SEH&RudqWqbRXpCEq)gIivSMlp})vmH#}cUDb#s+_|XrqEWO_9*?Q;L zoAIyHH`a_AGQtcwpYjdG&*RI!41P^;WXsAukXgjJ-*QeVC+LrwUPK+abe4C1=Ja>?xEH6`Sf@ykv(M@Kf z2U-OXerz9f9{oJ<^k(~QvOR|y!?7ROLJ5)FX+i5r+*eFpaiu|^fy|8v5ITQ5~X6?0Bpf#WMsh6wrtccc4`LGKDB;XR!gRfOt z?V3p%e@lGMgi%mpVjtinO_u^*j?9k5101lq;CnjO(q9gI+;_VS|Bdij<%c)5j*%5? z%qa3CmK$G>x|Z5oJF2aIydmLY_AwqWwvnHhLA{GwyeCb!fP)I==m@5^h_vOn2YSdO z67VkTf?3L^-*z*PyJSpG>HMlTiJQTY)@kM*_l+tR(Mpul)h=3DfeW~*q{>rW!Tqhd z2fO-myRa+0v9O&CswQ*_%&&h_ACNJv-h%eJ{$*}me%q$^zI~5TQJ!y*i*GU7cWnIH zUPGDts9yZcTZh9G(?pCTKtTAkWa^DHmR=oqN*=eqxGlu1s2S0e!XJCmy6#Q-Sq>QA zcryX4^=mLCA8jGTIUHo<*MdwL-}1OOBEKlgTd8LxuV~Wd(t^>0d*&y9OTBw25N&4k zNmh6-{;drl4!;JuY53zl5(`Z;V2~&q<#nfKSnZ3_`0&E9yJyBGKR=3I%}uj(yC~Sw z;S(Nj`I}3&l`s)by*gUqJWzuX2++Jc;nXnjbi-=WG1tA^c%u8%mjl<%vtU<`gO>V* zt@Q)~4%=xW>b-Y*x%nhTIp^#~QT6-k*ZVW_jM4`LPP0xSk8BHU^Q?ld0oy0&>9odo zrXuq@^+cXqgLWmsW-;Y`&_rW&bO3rFE-mudZIR>{zm5()woGQ^;=c&z{}U2W|9_7J zq(Ba*egJ#B#slCTEZ&lTQ{8aY*-EDkaP<`K@sK>{w6k}d_aEhyelXwl5t;Q4caXsS z1Jh!N_m)t4Lvdb+bN)Ce(MbT8t7!=Nz@1DuF!4$4B&J zVS7<>}L^PrhOs zBkUTVsE2j{D~mwPyg>*tRf8WT5j8p*X$mWzkGp4 z^FjOB1%%Jyn`RS69mY+pZ>*I1coZ$|7Rd*CTU^}7l!byl10O$P9_k#y>6j_r&IzxefZoquzYBVuu6BT@(^73|d?AUB`_9H94N4K4{jm`nq+#}0z zOzkKs32Y%Fa$57-*?q69DasXanu})iAX3J$XJdGrUs-al$WC;hoR&r()S$i4)C$WD%Bwo`COfGL}gC zj8t(j?0#88^1hOE?ZZZOcqM5Tmuxi?+AGdFYjA}!MYWfz%sFkbhhizLnDengJ9hIl(^509)Iy%$5b)gM*c4_A; znCP%FIVI-UQXRt8A*x&! zksLiHV}5i(#yszrOu`cjc=Rzt8P)+e>`TPGq}Xglpfjo#FfogHk}bS7#mnXB@w?+# zf=$qe+b(j399&1GwOvKN%;M!Su5d_UZ*?JXDPNC4xY53-kz7q)nI-|p`W$bGg5i}( zrIy#HkjZ!AzQ)%?pzVLKjHS7;Zg<2ot?7>793mLCXqjc4e>MzEN;K~wG{#gDlojyu zCj(CR_z1MW?6hF#r<$FuXq)k;3rx%{JPp?MdfEF0;I5D92zDyiu8mrpOREjvDqmFuuhJZ-cJV@nNX0d7Z&pgn+?!_x(R z&*Ea}mk?2SR|zQ|o+ZgUk<+^ylMc)N27Uqqf>Q@{8}-dCmVO^ho3$w-wSlKpgn}!f zxQ@q>l|@S%0wLqr$nx@XC-eI-m#QRKwvN7JM=0XmxWb0Pe>->(%7;MR+J}z^tstZ% zU7F^Gq@NkyDpzhJQd8$tR)Y#Md({rRKbVdSbPnvA7P{qNtV!-LH)cK#9_gK9+#ec%kt^Wxo_`g8~|M;B+TB1F`v>?!DgF~Qk z9o1j}+s`O8lFUK5y|=fs8@DT+SpRCEc*?M8ZSEMlb|ZihhM6hkyEv|jKjdn=|8!aT z?5jZ*j_~IqGLDQ)W+G^30S@9AsIH8P=yH_8R}_P}biDU$g16yIud>Yveji7P0f{cv z!K;Es-5TFYf8`!vITj^AI|{UvA$Q6;b3cLRNH>6b=2RpDq-QNM3Kuo01?Q*IYQ{TC z*`Bp2IA4DoIXq{sdB-YtXT=OeM_u&juBZ^dGw%q!MiSXGg#3#)E64#Q)OYMy`opRi0w8zS$Q-5f zs!-pMl^c(NxjIH{N#p$qDY54b4Fg!e@Q$BWQ#TpMy-@GTvUJ{3>f6yKpEm*6Ie5E- z#+L!FnTE+x|IFI4jeKj)C-VB?ev_^}09DHe3PolR{coPy$*A|02r?g11;grw%YHb^ zGse7i^<@f*Uca6T*q&wqFbzY=TE;#=wCn*U??>>c4_g?>P@2*ik#Y01Nb`uA(p9^_ zgf7gPRWY38!Z~a{!W9F__K}jw)pOqA%p=gmti{WBi<%M}eL<+b)g?VL-#wk3tmbPC zCyvY=_;eWg0Te*e6xK^abki9GZvaXUc!piF81z?d!?ca#LKX+1{+u+!H7aQDkC1|KK^d(i)t-8hb~%vsd~s0Mau%ySMrbTeXbYn{iy z(ce?4prZ7hz2W-lB*h&|^?v<}?>UZDX+Fth1pOy~@NbI=a~H$S9M$2kN}t|(gb;;7 zoJ3u6XKJ{`p9&DH48yntq8WQ5M@(d_iZ76(KT#^Hns1u zOX9JFBens`>Utvj6C&DPGS$2$=;mN9vU)lB>kR%0T6|@o<-xlE$IFA86EBrsW^-f? zOiB4AWL=LHyirs2uG37@vIHy@4|5Fuo)C&aCCK+OHz>gAUP4km_NztgDLFSIC2G)% zs%9tK80WUV7maR&brVuWz3F^#>N<3%*o32XU3~1vgq9HBlIE|qtfslJMd|p+BP@iK zMAWVUh(KA3h?y5TbpThaun3>+`z&U3Z!TG)d7{iiGyl^&4h6B!_sNMHoXlu9@Z#9@ zv78y%cI3FitSKF2np|oMCJGK!)vwGGgSzJH%<5KSFB-8uJejJjPUf(CkL_Q=&%8k3 zRN6Jd4WU<*oW6xM|K!S}Oo-oTO_nJ++q8Z?S{XqWh zu;aKd(j)j{O&HWky~Kz?i!!@3m4-6K`>+t!BEb2%m{LN@9j z(fcUE5%D9AS^{xVswO%CPB|D;v@$K3*s(TlYiw_6-jF=)ENQ(_;rS*$;`TvfCtp^z z-5ZowGYe02&IfA^>xcyFRcU1E7r%Y3bv(@JTw(x{!zntDgH7_*6LZ}yc@V_EQV?|B zOVl(da5iI@$qp@dtPPzyWXC9(GaS0UpW~pE<+ZcFoPWlXBou&%3)u)jCuS|lez!hb`muyYg z#>oD4m75A_Hx4}1GMK;Z>o)1nc{Z0P2R~D+uESQxsMIzEGXTZez_s$#{NcHH?qrX0 z$+7DIAUZWs z)YY9M51wjoeGYNeg9V3xepg@iDaOlY)`{Sglwnc?vs5rI&~L!K%J^9G*GThR)&7e= zL(lENHhY3o|JSZ9);aG94yp=-q1gqv3{2S6dvbjiJ^7$;ncQ*AZRDz8q+1tKT~J!f z|AfUaE9Y=DVhq!A662K3D+C!Kgw;Fi9?Uph`GyAen)w9%7D@>Nt)BKk}{1o%MLYX*W%N)C;eN9L|e6imkE zT_%5tIhts`SK`X5&u?ej2i_Ulpz37HV-%r}qHLVt@L+%Tj40K%8hL_g$yC0z*xR~9 zy+iH72fS1^$bRalko}+w3}wvzWkJVodXI;<{DJZ5@Jud>BHGrukOAnQ)^?Lq+vY1mNfL?X4)VSo5!!7`iy|FC`T9BI4~$>u(8|dG)Arr!m)O;{ zIhR4Kve^1H(Ib6qiGisen)N$%k&3o+o;;v|4^GJuas-wt^ppuAq|;J=M1o@_MQy9L zx#jg;)tjyHkH$6Q4}M@Kfg{*~8G|$T)4;?=5n>S66Op2He@D=fxqEDb@lr)ajq9b( zC`#$WUfbxoTP@E{wcMK5Q6BvU=&SgV_Z`bYuB8r(sT7!9cU3ZSL`~f zB*VEOC!gvz&g+>2)oUkLU3a% z%9=%>>5hT!yGF0Bj$llc0CyZDF)(4TlNKZ4q@)7(VK%s z5^i%Oz*k%`g<|QzOCB!P-Xq}dal3bM|PZlbC#9Xhh z+y9*u-gP@*^@8Nqt`SWP)1s{dM}HNH>J)9x1J(@Qi9ciB*lx#l;i?jKV|YiTtRnAh z)Rg%P5HIe%O?dOjjK#s75)L54I%k75M$tk6^OJq~sQ1FJ3)$X(+2>Xm{p>=DEa#%3 zwDdE5Jzz-BLZ5@8nENGYCcy}b>Nvi|RKgu+vHY!WTfyHae_2YpS6n|ayhzLCT*rM) zo&W~;v2P>B7g`AL;G>kFInzYNT2Dlq2JbbpaS6dg$UN|wk>DX?!IrNZ#);=q+k5^w z2K>uNpaW=lSOmHY!waC0`=LvhAt4#Tn)#!L-gc^92|bDnduVm|%aH^A z*ltjwg{h&3Do!#%CzL0Mbomc#O$T2n3bsHt5|Xwg8HVql#c~u=n}-aTb1PdbR2C3R zk1)Hzg*a8FOT6Q6{y#l)}}wumnr3F!mFO-O=f z3o=nf9c56`EzH7WF#CK>@WIICM|F-K;o2)YfZu?|q%Dzl*>Q z4boWAlj9j3-r~?Y(Lat@-A^|zUlvU(^UEYny-sfNy}!{>b^Ob)l>+QyI&4$M$H60q zY@9RUKdU!%pKeAOj;@-NAY30_SCbWqoydVHGp`tklK+$*7uIx6)ellXdy)J zdd^;+b~1Ta(DBM=zl3_%J>1b3n4q7#oZUIh{oyp9VBG*!WK0h4YK5ws6{d5ox_DW> z3a zN0%~4z&+!576k=_1C0S#trqP9wg?~MrzKPgym~SXm~r*FJd+Lo5=#GPg`sm6`bcAE z_8=s*{X;0Sv!+pNzT81(hK`wT>ua7ve?o~bS^iIKd{mXksC+NL|#8Lx@CqqhnT6+WZ%Md64(RYT$bv)P9Ct) z@61c@-Iz6k?JBjReQ9wtxnSMz&9Xp;{~+Bu*X~%mxm%sZU^KK*K{{%sd{??M@uu^( zuymLl>u4}?CTTDILVp2yJ+VdserU-jWCcYFSi37b>JIjRyN4F ziDwMgJl=jX`^Jo67Ns%I> z+k?;Ui$ZRsf5ihb2!WYck6k_u>N;@AHUfbUa4T`Y)MzJ!PP1gswWSi49#@&T9{bpI zYPu+WoBfiJh`IA6Y4MPG8BtIayb0Czrh;i~YA}=oPE0d6Hu+}&t%82|2J=crJBG$; z14N4S(6i`%%!YRk*kr4gBlyio4?1Z7g~?;O%%LQ3WuTA@ux}TEvA{ofGoBAKQ^Vw? zTq`2eh<)*@KMG!5{Eo%W45^=RinSdIUmY+sn1VMXvuHbq0x*2ttz;~Oxkzz{3ncdO zEsgBfr4{Snt*>c_aS3yqC~5NId{31MMF?SLvJp7MYRgPcc&1PbUid2y$Se-IzZwZD zjjkK>FmH+{xS{gd6eA3|L4O{ma5xm~VM>gwMwG9f-C{jmH)>u9hyp$G@ zZ~pb!{Yxii@rpWt^V$N}VTXEc6K)W%)rQO{EE%7ylcpJ%9tixDXkq<~Z|M~5kppO_ zGmi}*+_BK{qK*k;h4Y@Cu35YrXIvGG3q7a~cg(9V5`9t%tgSEQ{SpqYxPYjzQAi*ux~ENl};}5{M8c&%Sdk01e`Wnd1?2DsU)nE-88dxG!96Dm6LH zAy!AQFBSZ7g!1Bz{kzc&rIuT2J@mr~s^IV)&*Kg~)G@6{F_eGH$~#UF6yBB@9Y&D# z5Ie^S;5k;6oWWisAr=3&9iF!nz|3)M7RiwL2xbg-V->n|ROtSY0h#X-jw1A#z-Jrq zuzTYYzoc7=wX3hl9sZN0-85aX*gUS}*G^^}<^2vf$Vqcitw~9elBu5&`?ZZcXU}Wy z*M66Ih|+c7#TV;4Y35d4;t7kV&xr^u53xXCaoBSqeCfnw0DQ(F>;88uyHC5++*m`t zoKxi_fy!aC{BJkOw(iSsnm>Yde8~KQW`%Ugs5T^jZI(R2jIt27nm67uGsK>{A04Vpt&4ve94rUOuG_BiD#k1k6 zp4NTdWZ~P>(C`}@x68f|3!rint-B9}8b(x2uJj5>T+I+1(9aDq=7a&F&D}q+$PMNM zp-%nnEG9nRgKCIFOOM>S+nu51WSCcHCth~f$WiP}(h1H350FDYZ6xCkCN@h(nc|YJ z7@~XY;&{0p?44@1ispW$PQeLx3S;MknEQ6-vSeF+FB@JlP~5U&6^& z>*7n2(u~|DwV8zD$QpadR{vHLS6{}1kP|QOB1nM_wwsG{WQG`U2s?$D!9vFh`oe2( zo+7w82$Mf1v}V6Sq2l(v#t^Q!vHrwD(#TJqT;`_y%>Kti52ldr878?)hHb~kO^=^j zD-@YIW1#xr?ZJyX;cqQl343%{+;SukUbOXy@m#AWEz~Tx!!q^g#!k9TNPCK~kc9SB zsYr)d; z`E+2VMYV78i_I3m#aIX&F3H!(xTt293*#4uX&z+97}fDMQPl?xA8zQ!o7S6|V9p}Q zHYz(R&HKUoJ0mvh=J9XK6_~nym@R-M06Xm|dKe>0!npQ@qLrcCwKp`=8n;J3@4?TQ z)iZ{xNQi*_!e@Ba6eNdtSU>^q3!U(pg$n}Br&NljTFZMvfqS)ay1RJlOUNpG zHBU?2U-{-4)2C>GiIR{~qiT!hzXXdx>kizwxo?)h>y?Q1w(QeG-W!dB|tbmAg zE1gY(6bT&|l8Qip){J_F&Z26-E8C&uYr6II+}tH6SNq##yz}2Q@iF(eP!!AQ4{KtcP28*P-#OO(S9QTN^TWYH@~}T7@+e;*f|c82E?jT5J;E>o54i=-&j-4fM5~^NUmKPkUP-oL=hN= zYPW>wym;o->Q?yHb}44*(Gbh7w4T651_?_6&hPlK&d+G=n%9@gO?jwZ$-TnMLZSIr zn+pY|PD!-8gdz^$-A!!G|5CkksR%A@jr$uA#-!PlXQE4_yVLo0&+&ps_|}K5E*8vV zRvnKmHwWJ?iF!TBA9J%&YZ!Omy?1!Rwl#b||H)#*euFo~FiToJRKmw0+{*p- zIMvHu95m`y!n6r>fQ7H#D9UQWA1VI~M7d$OR>DkSwBd@*kFYbQ(E^$Ec zWz?)7J`Mk4g($EEW-sVvYG9SqV~r-lZ&H<$MpoibU%#UxDpp}q)a#L(1p%T zBJJX$(6j=?PElyxy(^-khT%pDK9k>acdbrWWnFH!{7nRhAP7Y90847ph_-CG-LbM} z<$mY7N|nx6{+_Bn(N9)wj-^GtGt*4I03V2opr0V-ur2y!i;yGJJl`y-%Snfg3>=FT z9@dB5yubl%mz7Hsfw&f8HsMmoI8T%+LjyVd=Fl|K*4BXg^S3*=Cuef^Ue!2vFXu4{ zq-0_EnIhzdBc2zt#tjtVgEZ-&CJM7ef01N`hTnMr$hpq3PRYsw=-QUz>Sm14qcaYH zD2=R#JUrqaU+Z)(sr%DQYw;HU{w_O7%zgF1w+3Jrsi!fd*ZeG09I1;;Xk}_MQkc?9 z4IMcLN^{-7WGhB4cf!v7zFNEI;SRIe^HE->gin4M&V$QZ4m28h=H+%#`es$tdROo;dxf=H7=iC7>1m@ZIl-!*RY z<`={n$~-lesl2+OrQh9CqtBm$SJybia~}NI?*f3LnFCb+22>b1`Pi;i%&%3dhGW;ktdg`p3=!VM+V(6@Snyc{%7I9BDM-i=wxYR-Eg?nu7C zK}4n?$k&lSa%MDEtH~>EqJWfvV(8WOpl+#Sy^9?_pF-({83gjG#e(UjKG(y&Gdwbu z%V3FDQDdF&_xs_!mi#bRRv-FAvlP9pIM&!CHp4ox=I1 z;&7XYox($c$r)M-OxZk>6BE zCrUk#I7>ReWGB%za!nG+vxMs+(gLN=S*@0d8a7a?}*HvfpcvV7s>oF8AGj&h0-75N9X2(wp_zjGq!QyGGUpJ*fQd%9AXx%bwl0vwAb4CecUrIY8+#n=vWotPP2p8AK#5h@rF zC z`pB;ZDe3IDAvoz)9sZS~;o|!}7*b%%^qzZ(PKEG06> zv`Ox=iN>TwN8Bgbp>lj~e z>lACBYf z+g+J9_D5F0Wl93&^NB$6IuK6n95|oEU8QW6@&o4R-xy~qFug)R_$dF z8;SkNS+=>_kSOr+7y!NFq7I(jxjf9GW$o__QV4iZi&SQZDF>)uk7r$gehIW>VOob{ zcR^Z{p)xVYG&j~@U?5kpvLpqdy8HiP0uDUDS?BvESZ8|+Kz8myS#R$--2S*Q(~iwu$1Gar5(BU;rqFSA{3@j|81NE4ua9$m)>O}Ww}^2y5#;t-7T%t+ zJJU28D|_3Hhc>V?yhPET-+Q#&2vJ z7Lv_bjU#JN0Yc+xn?96;T@kgw=Z0hk*@h_3kH9s1J%N~mY+cr?ug~P}=Cgd%1)~kd zG!#X+2q{66lvC5QdZzPo~pfGd%4o?1((Vo-q7lmhLUNfI#+FoK@RCYy! z?*JZdCI)Cht^m#exMP)@S%MEiuX2NLk?ZiYs2%5Vaob^qn3U@lXAB@;R{QQ z@Pl4JqTMw{e(fWH`|N}roT?T8_N39~GBdAq$A^KfkOB$t%)6@P$H^N?xfJ-*HHnE( zDPvFV>JS*mUn}*~f16nN6F@-_vElL9m60F_-!<_^ma6TTfWr_2dSy2T5vy)M&tm}9 z00Vf3l$;IMT?_-D7#ZBC&0hQ&#J~SjDB`)J_dE17l5E!YHsH5Dy)3O^TZ z3{!LuIE8csNJ-!S152+!if1wlf{%e9$`!!V<|oNR_R8>nyV&4#Q7p*VX+OW)TVa^5 z>^oVY9BU*qx-m=>Sh2vfV`lOmyClu-SbUZm@lE2H)W)~?X!fBvQyzPL`0;WZhz68q z!k8$`OgW+2I~>gqEwmv7nplcj@~xmD`%A^v6S5hcgb4v3&ElP#y(z&h7sQ^`oo*i` z`LAB5h~0oHX$rw-DIK+E>^y`ty~n&^v{ot^S1A1(m^9GY#3VCS4VO; zi?p2#x#iR}yb$jjJ6ST(+VclyFKoy`i=r?NgO>#c*aF%9Rd;fy(XitwI}^tTnA%95 zjN++2|HCa?i9l7DPJ)t%;yIEa=s28#3^V48k%yt}_CsBdECXZZ*1eq5(t_&RJ#(LN zIm#T!WEMB`28%!s$cRrP7#!gC(7J5RG>tx}Wi_dH)-Y0R*W3AG*XQ zO9yz3tIo+~O~lhC0kVP7hf{j9A}+(eY8FSD1f9*t)mcka%hq(6a?h#dDv%6vwTGwx zkK&;jLK&t}W|V`q{^y&MWV-OH>gi?Qjb&^VDiViOX^Z1xaY4}|RxU9eA`;>P&eCD~TChJ^ zsox-LZ`v93FjJbm5b6@drKGtwVc9=+TD0FwK>6-vS=nt~-e@CP&ixB&TUfg0AoVAZ zm&9HHYcae495u^qlOP#WQede=T$ZI3d3B)sruOe;%hM-W<5N6eMzgMT0y;n}8on|D z7ivBTdAIMDSD84^+3)S$2oMfV5Pa)VrS0_i@KH9)4T0H^GwnH5LZlnMuI^3CaBlkL zR9itUlg}TU-dJ&AsvoeJ8~6rWZc)fSpHk?`knv1kZb~1A10R)*_*~QtMQbnvGmNdj&i=#-GBA%lR(Gc7gsSKWw>jCE?t0s$3zC} z53mkc^@)2mE5Qo2wJCUSs$4Tk*drI?t(o4uZ zN;0N|l_-43 zK$OSX42C8CZfzE!2qmCp-6gpPlzB%TMr)%LmFCm+W6!QDSFjoONQHfQqtEu9?FkV5 z0KQYxss#gdnB%ivXg%sooz!G{Q2{QvkaK(h}|zM`_DjpYGVp~g*+E4W~%O~F`k z?sx(D64jc5iP_`|N0l$TOD5luuQW(RQ8&gf-}w?i{4H})^K>j-3_Rg=OxLdf46~)7 zh?%N}euHUo?)k!ap{*+Q2X-^q-g!PmrzIq*4N)P-x)ILY|Cy$;h_AtQ>|}JR7yfRU zJ`AAJ@mk$nFP%KoM^?W^a;}O@2zPgUO-@D*Q!@(OGbLYnzFn+)_QT3r|9y+Mw$~!rqK3NaO zt54q#z2k7x=6lKJ*Qt4l?D2wGo-p77=8HL%sj}arvJdqk^_T9uj&F|F$AW)2VM=SktI5`V@tTQAL>2bn z!vkIit_MU~*V>!hidJENd9yAdbU8sm>lr5Y*!j|@V8=-_-qHZGWFR<6_Tsdb_f!yW zbIJj%I(s(Fl&0H92mq*oFO{nS9@rdP*Phq%S!+#SZVY` z8aRCcIQE`|0iUfZT=6q z$rk-5ko%Fspn7aJ?Uoxlqg>L>^A>W<>ytypol@_8y8w64wA{4*uiQ`osxSSm-Ft{2*R06M>0x~D$% zrjgB;4;-t0-*kT@Z~8en{a@_8cUV(xx-X1U1r+Jh3{8DNk8}3yZ{~ex&z#w3X3pOG_y<>B^Il2T zde&O^bC+L%CwV|>(|EA)So-<-^wq( zPqgbPExBgsvAk-ZC49>9%!bP6tMU&=(eVOSHwGI-h;~lAeeL>kglnLI;18Zu0{Fn^l6iI1#9@`gJ#;QGeQ~Vs_rH%FL z!KY0=`5&l07R?9pTp@w!fc9KG9}s|ogxznjm=m})W;GytO_BSIyHp};pce`KC@oj$ zz!R*dnyG6J7Byd+xLDj5IcXNANR;Jr;#vW6G+~n}8wH{1H%pRE(QbXrOHT3%dUgQT z*%yHjpiH343nI{Uyy`Yh5?i#qaXHFa`O`-c+MrkDcG53mh3ETaawItjI+w>i3sKXi zZ$ib4;_-;n+2W9^!=>RVba{8IH`!YT&oBh zxXGQ$%DTk-y1FpV8XR-LswM!&ei` z8@ZJA@_o{@Q_6On_c*E_Ug@sAl+U#7t8nT7ek)HhaLNm$mLUyiL1^bChbz6msE>6E zfAmrDTiQtn%>B5U+?%J{Pr#(@Vg&*rrzcL*jke3dMw9@YbixTz4K$3+7Omf4$3jW6 zC0`1?&Q$N;3ONxjaQ6M1i%Y9z%ZV&6+K^h=^dVL?ShH|U!YuS4+w8q01_JJN(1SaMY%)gQMMXkc;WqZT-FdoLXvDJfsrBz!8a-F)f=YV@-vo2g zF4OYa6xpTSEjMQ3+)KVnE`rV#0P*WQ7_Fiq%Qx60osjMRV?TcETC;lnL+PQ{monWf zqH^QkHz@bOh5(3}6h{KPRxq40ki#g5Est;EMaL>-A$qN*4Ll9btr~|IKJ7AbS$Y%1 zua=LnS7T1%e!w@i--c}f$P#D0+BX;ZD=anRN=}=kD$%fxhgekulfc+H*`OR=40P@_ z_brWj0&;;t?evVws4QLS$u!Rl-`XUrFul;u813b95ogz?k4;NvJ03sn8N(2Rjbenf zxxS!m8631}TEp6^-7=t3ufVd!X{=ITD4jES>bbPgxcMA2E@Sr`*el-R?0*ilF>{F*+&|6Ph0B@T;gmfJ2I-GUc3sKSnI>@ke@y(wYo(x!)CVj zTYoeC>hi#qB#V6TN@dm$L&qAD{hjOtroZXXawI5iryvVC(Qu=D%Fr#A_t=eedmH9a zcIz)@yqA1G)mw8eo0#ogy}YHP@SzuJ@cNG;CY4}4LkOGreuDo(AH6fW67ve>pO>H2 zhcEH-dYX}^V`tN_WU@;!DYu9%-~?Ogurq0z~FeM4BW~sHd~IMzmTqWb#UU-EeP{$+Yus%R`~8+HWk(~-<8HqEE4mxVXohRbB(k| z!R1GiuVn8}s=h+f&$I{ArD%obbo1$aUapiIQz9QU0=Ay&6hU$+IHaOfOMJflE5ILK zt`1&tn16%~Sc)1bPI#;m&&<%yFb9CQ7r@$Gl!6NoAAkuwe792|ABK^pTQReU# z<&{~Chk`p$mPnjldwg4H=%1oii_>vv+5>OblDI{N%xh zt_iOwSfVJ5hq*)NJ4c?cLjXCZ< zv3KwM!Lyn~K1Y?_Bj?P98&6@~qBo#(84n0-hmY(Vvc-q<21E{yPMS7yI~Hig(oZz+ zH9EbKxb8Z4{#Z}IE_mQCfQv7T-~raaj@aD=T2!kW<60wUHt|NazfX-7&$?|2+d-a0 zdo8Kw&)Db`+Tat|syTGKG?c=K^2Y&W*oTbob)k?}iqIS0hIiJ3jw?K+WuxM>Lps9a z%TFX-TiB@9B=--4yOeYS+-hj}Ap&|ahuueZ!7zBoYLk_KygIZzv>{X;x?x-OMu7)D z7Ipd)o1LBY+)?J+ay&OF81P(#=U^{Ef?(VT$P9ptv&4Bi&mR8b*HcrPQu>}G3+nd% zkG(@u##BUMn%C}BCqCYsuONm4771<>Q$RfVWwxfExeZ(K&OoyDom8oJF6?7|Zqz;N zO6^my%+7R8mbw(7n{-n(XgZR>Jn*|2TR#gR;;<07YT5aMn{O3#ooyeL^3I3JN$fdG zIjmFdg>{}jQ!5umDFg_VmF{a~Q2)*qp?NVKVGXkLfNZ2+QByFu!y~2gwFlD-5mWb; ziU>F&xi5-UNNiA3^$E|EC#c`l&?;eP(C+RD41l#5Yv6?!gf z_83s2GTmKFTW_-SF8u0U7k-^9<2uLiPUa|5F1EqpVkb{RYJ6w+E3cI1FtySG%ow=Y z9Xd;uWzP5jR*;Rm+{1Er!=|I{GY=&QFNgOQAjbgaE^&lKe3+P0+ zexJUJmt+y{YNvnuHnV$JI`0m@5uKM1=hHwIsth8~fca_67<>gV9adZ7C&pU+#9E<; z*KTnS+v7~8TfHXppN(E`IBat_TDaq!2!~Y6i@+uc9rwd<4RR=QVq~!#YvXqMs2Q{O5nWC)&44DP4^)brb#r5FKd2%h zd~l&+;O%~fvG{Iz89NVTWab!x@OJpyl>RtGNZ%6LX>TpjTyWom!6W0U{lsyV@L4aRyC7^3QT z-YmIhBy3SPe86F?N2AyUNI8KDqf3_1;rfII7t%3-m6%!hPIm~ex5!9|2NHV&5`61W6~PoHf4WCG~Y(b^JF#c*>1Q2U?AZQ?`4hflIfH|T00s*2Xl?{-|UiA)e*w|fA9 zPS!#RI_-iySg$Y@8hj_!9D;L?8aRwKokNKE7~%`k@W}+sf;FV|I{6jRF;SClIRL#K0*c6YovjT4I=1B5Nu9!7N7IQ`Ke=bN!rKQZ{}n#+(!;s zq|Z`lZ`J)wN49f`caTkr6lnrvL4C7rb0WCc#Z0^Y-ML_M$1UG;*~#u!zQl83rb(ws zt#>u4C zuIZ_beSwhJw=KxEYW9nL+=NAZZiq$IfSV`5X2|9HF?PdHF?QQMQ$d}NUJq_|B%P~J z+AjqJN)xbdtk|3=_(P%qToa29-tq78w`kxs3hrt?BvWR$Rim#5>y8raoiehBJMe*K zhjSZ@^mXSuT4lp#>C|jqk+iYx1@q3`=%YL@LQJYM+AV~+5@f#X4IC>w&llK!p68>| ze!ce3rleS&Q==d`3nBjH9Otviu>3+FvzxUwwRJkFj;k5%ws9&0=kIyn<-BoFPmq!H zbGCXOE=ni`iic=+8H5Ny!4jKihR?WbRa;tcb38I#^o@*&LVIRcutJ^6M_?fF7LX~I zK-$cNSI5m_=${k37i60=4KXlQALFx_4bNpeJ=c|OV^s5~%7eM~VM`ktK^c%?vUs^)LDN&i8> zaDfX{6HR_~Z4vq5?aF@E)fttB2d6IA-4FT1!YCo-l3m0BI{#yZNjx<7?;gmZcd!XG zyq|D{ejdav;Fq1e&{&GIS?mC9u6yw`u8kTH2d!Eh|K5IYamAfzfkSa8H47?In!du` z0XQ!ES12`tg;HMZsj78CP8PdMgKnPK0e^D@FiH;(VzUlh$V+H^C0bk{G*P>C!B_9oD=H0-g*kK=OU)nJS9lW~Xd z^=ZE!nvXZA8@_Fz!ST!>dD%ROPiUgai9oeTu0CVAmdrZP3oLJNo8BRP(>Lpy~# z^=BsxyIeQQo(2YPSLEOLNbe}YK*A zqGyWliY1mAE3lPl^Z81LPI|-Hn*$@OX4v`El<7yrDOyP@JOP?4Y$s0B2Y-)vG73NSF2?e7?YY`4kGo=W zN~=#rwigYE$}*U@?K*x@q53J02p zE-siA+R6H>i|t1q!bZryr$tfu-AC2|(S6d_#TJoy%(pcl>YqEW+E=^5Z{N+dv$ezl7b?HpcS+`xXMck3*I4USC;4;uBk=)7z7*Pl_7g|tp_(KY;YGF+gOFj zGkbjsJO@{tVhg?DXh89#L!Lb*e z6zd3%TrWKJVCM`EJKaLe(IL$9FKvGmy}t=_r8MVo0$o~U6pZ81dtH2TKdKr^8_TOx z8MUfwAR~)msXkw2pU(SPrwLz5iT~p;?Y$ z?Cm%Ms}}Dhn1mQ3PrsI};KR2qazD4`Z}#h~IC^|0ArVV#_1nd$zM66Ls~9=>wc^&- z5dAy0w=ZsKFSmcnzPGNhL|o+DeZ+A93&E`7VE9~u$#a6vHr@t1JsYv{ohkG6chTy> zlOq|Y21HJ$UNVWfo%A{Th#V{y*wYJwTT2%RU(vK+!795oqmK6Fo%iS5FGW4xEM3~3 z*VR^itQ&Lbv)OmCpS(T@H3GEDn)IOdIS1N+gg6>};9~B@he}hhF>W8joz0*|6B889w3=66Cb2n#a4E;`MrIY*^Jb>rurnU0O0b89bEr7(sEERuCU@RCuX zv+XmY4c3+}GHdE;Q&)Gx#6!DvgvABz#;3}s!VY~zed&z?neiubA%!09gaaN!r47E% z3Dm8;Ibl{XY{}w{n!%0Limg&i370)l>tVIOjqQU~FOI_A)6V+}|76bYf7A`Gvj0H^ z5eGAMiP;h+C}GdAW6zZQ2b2x+$I#yaZmFX%vSYii6N-tVKAY$JUpU7a8U_oP&L~=c zS~X0uPrPwNUr}OSb18{lT@oX4;Q$S5f&=xQICz5GDMP%F^$FY}CR-^BLlR%8hppG| zg^N3_X#2=y`K18yz78RQrw4UdzN;6J3<+*82-gUkX1J?qj`Mx8J-jh#3DG(i%Ys2a1{ll}F3UenkUijQ-x1XFy{O1B>b2?I!49x03Jik!fS8-paf)WxO-8ClAipy)SA{KE_&SPe}i` zH^p~>{BuUUO-@4qQvNLCcfiXh={5{))JWT#yIhbf&=(y5VpCCq0(o&F4VCPH4DDxo zHK_=z6ed+H(s+aq;3j%V#f+#~gido`xD00^vu_#ojs@Z~hL{XZEuklQ$hb z6fR}ls~xKYaQ#mhAS^Zf*Dgp1Ve_7ZNik{ zn&b-TJy;lTTS0gO499dO+@v8(dUSMTa^E&_{M5Gbh@BjBcBRYl?m5zJ3BDo7c&yYIgI)OKN18b~w@bDwSR1P(g@@#1V{?hV8}a zZ|hw;CUz1ng4mykSL87y71|NP3TFVG*|N-EUh2dz$c9f{qCGNuaz2l-j%F2lq9Kj( z4bSH_AF2#86}b15;d}rfn!L~viBMd7;989hcv?|;k3XQ^h(=ZXd)&0OIdaIzkWdUx z&Yv**5XTOCPk)~VX_V~el-uFI6)X$+Ws!n25`lnyjA)LE8k>MP>( zw&Htl{lnzU63f@hTvJ#Jo~tzF6;zdS$BVk$9S#D*X$#RDE=?|IV7DnHTsH}pJ=#G7 zo6Jyc>@HSK3j9cO-&@V9s?wyZeC;Bg(T)as0d~a4&>-0YceU6t*IavdLl&T}Irkev zZy-*hGr&SO2|}G%4zIb+Fb(e*vRO*9GY?p+KOxWu<30r$#lQSG=Qry5Gl6_UE{7ZV z^7%vsaO+R+zG@tvanGfU>&l7sd+q}BAR3Y^`LzZ$$q|RBn1h98%hcjdqF!jqxTcPt zjS&`JP#@_1DD;F*ke#p2$TFuooRo=fgAh3%p~*rSjYc4`xvdYG;QB#jjzg3#gyF;@ zA9X8LCU=Ic<5RJRxJ+*__io8~!k%H~Z0!ArHVbu+H{k);`gRT4p?h&No2`ClUc73N zn%ElD@AeMm!3TQ831Q~8rM090K_j@vVc$a*6 zDSfX?)Ob@gRk~42n?KEmxhT-xJZPp-2n@J^nJzzg{9uy@I~HNxvLYjE>ljKdYqDioB@;YMc%S>UB5Z9DymEbMbDHr}X@wVyt=kJ+u4U zQ`@n!^=aFhC?=1U{Fhw?EFza#b6hWkj$d8408$v5djv?4MLaj6-?FFbymJ6m|4!%qmg>euZU7fZk^!q$bWvCj9XHfyjBy%_X#Imua9Q&V>>QJd`urzWXWEg2w*GpGpL z6h=LuiD8ISrn~{W$o|6`)T%1}6uHO^YP%Vo+kPFqIr)wbML(|O?@8TvreqD&H3>8o zm0^q>&M}1|LTUS8uo;|$>`W#Z09+a`lJd;O8S6|rgd@uNFyRYv+^sAJ2s3)?`85MJ z?}j!pnY*>#7nV8n%CnNhjZG5Yg*2JAP_cY%nMZd(ALnq9#JFP{4lEQOHq-NIO*+?G zgeTdSw%)(k{4Lv5GtX=r1CnnOa;cg)4%Ox-)+`&A5w(_m9P2rB^VZCVd5r6K9uA$C zT*epk-?sY@@K7tH+N<6n!=Sh%TzAmc*Y544$8w*0S2Qm_yjlIzjk$BjHR%CP z2z$x!v1NP^)V}BX0#_Ba)n@|n8v9hS%&0Td2|3MGHPV*ir}t4QcbZTj7Y^c`6511_|qlb7rR*%SG_hY5qxw{EhkeLoUsXIvWjIrU25k`$rBvf>>~YK zG>Cq2{q#FbIBI+=IURA#nJfD^4%sR#FJQXmSqET|&R>&sZ|C;tn>=Zi_v@_o9~-P8 z&;n{J!^A>2^yt?{LBiOgKA*oT&%&DksJ5Pr=rf(BhT1n-cg(kA*eW_P-(cwK10;7! zKWq!0eGX(g8{0pquAW3!6p;=Q3cwY9M}Ds6Of>WfS*T4eA^1UAoNt{-v(QOhS#}kv z%lOtOF~D^1_}yR~YK#~ma0x-YMyq~-GNxbtc6c+VtF}6FB?XsN$eU^t^o17QiIv6o zle3Tx5Am?@8HrG(2W?l=Uf=B{5%c6BGcg`dql5bAa4>^4F0Oa^p}pyT*>>+g8!{IU zxnIgRM+lB>m*U(g3?n!zy%ASe3bRkaRUBPhucc&wL3Y=^lGtOZLQ#1a0hp)nw{p+t zEHgPV=T@7isplKt`{J?}+9C8cC55kLa;ux9wDsiHU2VOn8KamKZl4n4B&8u*N6jYF zfaGU0nBb82h=!n9F3>JLf127NJfud=Wr0Fj04ZhJjX`dsd-H5<1F#LcWsq#`e_yI zF$VcO>Yams6a)G7`a6lAf7aTtq@(X|?kR3Y!|>8hu>BLo+sc0+%?hL2;`d2|&>ia@ zL^@((cFS>=3%zbRjNZ{VTX7??Dp0hM(U9+ZdB`vIz*@QcPoOA2VJXym0QmSfOwB1? z(0?7)h4DAKO#iL^y%*9B0~)szIO>HW(tVs;NZW2K*Fx_%%mQVfzvp&Ee*M$CZ!YO+ zN76Cg#_Uz~fXMcLg!;KFaX_e#!oyxVjnw;12yw?y*%sVW|2+bs`hwR(PuT zA5@nYQC~zlC{$Qvn=Jhr;s6exk6Op!uM9_VYUKDhx?!W3owHJnM?Bj z>Sy3RM0;ds0UXTFDx3kgX+Rp5j>c;B?Qv41kYg)}0C~6Jywm-^qZijtzhMpL-#=&I zfBb_SB{_gQ4o>MsLo|feAnc7olWW(%`6Zp_FLm?l*W#Kv5qa<>3L+7+7r$30}QSeAw3;SWi?75(y?pK_#PrUA004!{2@{k2w=m9=G8a+BIsc@%$QQd!AaT0J^+ ziY!4Qjg*}hjr`UJ%KpJq#rtC98069r1guQ-#9{)$KckHn!r#@K&mJOU(O3S&NSb)$RAWTkUan( zc#OtNJEHf6oPYY!{EeECYX9DEW8Gh1IiUYS67(+<6#kEflm9Qi|JMexW4|KIuL$!G z%XlIXioo&%X%CCfIr^O?a`q_Zk@)xbdV+DLb?+U7ncUb~gN)4LQ*?aKo<)_YQP0Iv z&!d7pWy2|)vGW5YReRdlmmgPjkA4W^_Q{#;|MVe$!?i$tBrkk|ic)FBme()?k zf7E*Qdo%qp#cu&NS`FdX${Ws$Dsyc~m3PGsB=)D+sYj@wmH`^;Z)HRd)L%1xbM1ch zcYZTz_-FNM{xjeESNc1Dr_=LquKFKy^k1*P?|A-KU6Wt+)PHSxfd7v5*k7xs{torF zU(w~ybP)clMv%XCT>s1n6VeF4FHPqfsSy3MY_b$_pRE8VX?vq6hI}rwMC~I}KBJ<| zYBJ|1bD_$X`FwmvJ?W$V|}Pvozc3{`U#mAM3DRufMNN|Ius0 z1+*{z*MRDKko~`->i^KCXZd@u^uI#Q|A0_~N?5fh9TI zc{^A-mwjsGv81nix~q`Hr@TsLfhMc$!&DA`3o?|92Naj!LP{@^6G2Z{ov#a5bYs6* ztLp5_JrafDJPF13na62spV_OZOX5TTK_qza z>%Pv5M|o>G^s>@!Qu#h&VFq_N7gNtjeEBeG%X#~}Kr9u!>9?U3)&XnZoJ<;8*u_}c z5cQho#|G!B-Vbd2psKR`a%Eky;;7^*!!V0N*WCJ^$1LZ5=npEEntte)q?EdKG&1zG*Nc>m`Y?;pB`dmZ=+ z!r=nSAmpH$KDPal_OPok(KJN?D>z)*CE7MyMVcFX8ov=ma?7m{tRKj^3R$`qMvROB$d~{ z0tQF-q88*>gSzuF(D^#PCv%1+>F0uA9}e~1yrR$z%^Ww|S%jTIjLsgA0yNh^iYUQe z;`#7$G{)~rU(nK;>4)mW$-5VywXPE5hJlZ`*(kKaaD5kw5hH36kRQ@cSAF4fA?KH> zd}Jz^l25x57j{pQF}rQMpLfsMXb4pud*Pejh@ih!xA?6?^9h_j%dt`KPOAl%Fo=wz zUjr{PDK?(_V|CzQ~*-!Kb&*?LXiDK1LZ%va9M`iFQRBk=lb(; z(D<4u$dRu{%gySCWkhNps|F0u3SG0P*m}K`O{Ik8#?%4c67V!xAGzZ_hdii`j-Z_Q zSWjE#J^3{=#az$tM&W0Z%7ntteibI|o1O7=lpb_#9f?EIs*;d`Q!vXIYjNK=Gg*cr z7Msr}#4cW~h>$Ug@su2Y3jzxg~@N@GYlimQOt=<0w$Rz>&9uKlVvNu#eB zNGS&o4Dc+UvjlY032G zM>dT7-H#xEjR_B>3%aA%0O-}h<48gVbUp^yvO@MnX8@bF={}TX0Qq(Tx_pP6C9}GM z{)e5uBC_Pk52}=Kyk~t*1~~fPoUHC|f5_~sE=ewD9Y}O(Wwsy*(&3;I%cUIa!-Lg+ z2@K6hTrEGSS_deV*D0ouUu*hnP5(iU>970r-=6)2I*d99U5W$`;uSbAaI*#4u4U_X z@3&Sf-k*Eso~b&1V%N4q_x8n|SUZ+9j8G&lc-68QuOgTJED|J4Y;-HjW==a5sO4sMZvHqX)E zkF9SVa6T7vP5V?OPN4cUrZ)EO6%ogce`~>SgUHJ{HNV9D;KE530oCoxiXF{KdW3LL9J9Sk}LKLzRHt2_6B??4==)o)7W)LAA#l|C`@I z4gQ6F_4k_(*|vaG0DTfz-P%Sw@fA=Hk%YR{G{oQ{49awag zQ+m@pwqd_H+1J1O4Km0uew$SMwe?)?TeNR?3x#o`9q9=Jkl+nZ;DNcDIyTuJRp-#- zA#v0d{o_xkG-$8Fh15YusmU6a*Xl0Xnt{8y3l7mA$glRqmgIPZ4R3`r6l#h%r3ypSVCWs&i= zCfJ-DkeA6qzYp*5b(TdKw@E;kxQ#NU0O5Z@0AMOJ%%K*c7MIZaL9V}X0{2NgU~YVqor zbly!8ez4v6?CJMj4espCA}jB(d&`V*JyXM7uNd zV+SovWHj0{b`qlf>kk<g@28#g=$3s{Xt9zu4+!Kt(0j# zrzyZ)fKw;&_>0$!aZqc<+ZiQ82I!8dyVF5et@nfEobC{i(f}`BmW58urRCE zPd#rp`S{bQ83mD?P6MRsY$ck+!GuQ>Mu2#V*ayqHNNM{4C9)y6pPyrDB=1B!N^vbo z>cRt4QI`^1vB0ao&sn}~{f6uF=NvnVBXlkoQnQPpeu)@9E=us8bK`MpWb22YO7-do z+O6^y>Dg8e8=@Je5yfZkB{Lg*A7af9hmYpbAI8wtBt_HzLUL1a8mBxDBNmeAzF;DD(upVRjvFspuLnn$g zf)B1n0F5nLI>N5MKyQg#O=g=vM%TE}`^>w5rwPo$u~SC+kHa`Vte<}I6!C-rr7(P3 zWT6IH?6BxkgvhwlzE^C~1k8!G(?h7crEhlQ53{9gGoN$!T$@F#&#tV2BK3}SG$`hDIcD*XGQY~ven4mC{#dVd&S>Vx4-}S3qHY@QIZkk|D7P2q&f0? zpr?R5LK(cp-hdkmzCS-iIr;VUX7Hl}bcGz3p#!d$L*C+m<0E(A38IKAYs-Ny%{tM zfkTPfB(?ONKEmYg!#`5~30zLAM@>hy(dVEW< zNAAAy%Lbse-#Wz-GkXXwhSN8Qy&c{9&XYTq?cGPAl(F3kSL5??A9+|F=rGU=`h^DE zS^h_($o{8(-(N+?{S{&(1&W?~PEkZgz-pnb{@wQ!bPLuF5% zvGe}MXpOTpwJv(>k=PbSas0&FbaXxcDeJzu1E|Fiyx*W3;v8kHkvZDL@EnYtP$Yd} z4}t&EIOryW-r_|o9w2*@M6frJM>IHnROd-f96lbpb5j8_k!l@cT;nOpwQ!T^SDv1wEz%dZul>%$zk|v`&%FZ1Vi8b#w_vV)@1T`4*{5)= zTVF@(oG!o5s(!ff_DxLuo)fjO&|G1_+_EM#4pzRq&QgpRKl%;E+TgMv8Oz;V%N^^q z-TKo18*wn$;zD)aV+K(j$75#}#;LN}G@3WP zp5d(uO^*ljgV+0Sc2U*qZY4FUr<4TFEU4D&=ULpz;AYbmb(JrP$qO?+OT*6!3(Mg| z&PDt23?5&dON*CDz8+!c0@qCJWbPQka8=}Lf8TUur@o|8bS}s)1zhH@?%xM!XlIE(dGUQ|D6!9Du3AEy=|{^)Q3d!mkkW7wZr6 z8JUn4CC~et!KjmA~04xZY?yZlsaLmB55`C$BfycyqX~y?Z9c=2*KG z+sQ0Oa6Mss3~jzBi0W-h24c7ql9WRz91A{c5CFv5T>OxSePHJH*)#Vbjw4F)=3!5L z3s~DbMD>MD<&TkULmDjBn^f%YP!6N!6FSpV{2sn0%6 z-}KWgYJ+;`U3_W!TUXR_Qtb2)56)GJFD7Y1k#MVp*~32UEq>uKYBq%z^BmsY&~YxV z51ZgHij(hH)1-3OqjGodL2w}kW~nJ>w2S+I!YP;Ejvr%Q+KM`koF)3%WVYur9}GY+rW|!>AayAK|MIWZ;(XumP_Md>1jo-K|x$j@4sz>6jOXJFojZPJJYx8RF_E z$3M2Y3&e*e;7SDVd1SbsXP7gL+0o0-)}6KbW9@?yp^vMnQ^^|+)U_|8wr8Ue3i0!O z&FEu36dgvjvw5&JYW2xc`V`%_Cp4+wK4-}iBM^y4;1>ul9Oor5&dn4dTtk|Eft4@* z;pg5lA-t&E=LV^~&Al7+OW3nY_}d3GO^yM02~q_3g>KS8C1g zb?Ulj8NGYa!x?mZtoNcu-fXp3F^*^urutr!khI#$<@kU}OH5h%;eBhLE}f|(pJGC% zKA_%e96&VXK+rDTQ}J==V>eRky3DCAnM6jkpQc)u{JuzGO>Ve~W)?@AMWXP|rn#A(j`M(Hsp%cjhzCMw(}A+3BV~u`My$+B(gj5Css;xsab`4JXpBS0bQa^4 zs!I*-_SN$l#h1x#!a{PW(ExZqDMn!w!6{tF!6HZ(74cr~!fWp+d6wpwmgUr$N!DtG zprrDSila6UHO-*;w|?rxO2HM7Og-G82*EX+Pwd^3;;6fINuA5of&J}~!o|nsMen}t z_F@Rr5PI!xq@l37`1OUgE10S1KPr9N}k4=SMyY)EJo_!+j@mkgnnC zKDbTRH+xyCPw8@%mRk8B&1!X~5BJoJbWMF^n3Ic*Pv===&aD7Pa9h5cgH>%?<qBi!KqfDuKtA_MZqrN7EIRak}xQOEhxFXn;1fH-#~sXh{+w6k|PFU`HrN zeVT__4SY+OdbBL61QI4MEGQ*Qs5qWrrZ4h0t0n!sWVf6VEaV)DB#9pfjgx*p+$d`8 zcwR}8&q78dxbM;%ZaMlev&U&E6D_adrzXA6$ibp=YBtxGZHQ7N0JRCd?zoUc(6@^= ztZjJnmdHI0FLY%}WJz1?d#3Z6SjW84J|nLQ1uEE2W_ghI$e>x42Dei9Ra{xl{4A?a z$c?aRmyPttue!RZ2HrI1q~yIxc(m5A!%3{cZZ5b5BBXs>)L_`Do3*$jFlHM$L1hSNP_5z%{Js?3OgbFHR&3qDYNa|qsBZbWQE4ilCEd)rH)Me zmpVJfXY04#v>}q7W4TG}On9}VnQumJY}VsF(24X#qJq=AHr%~fnmbEd{St>~RXO9% zoV_;}7!ZQfUo>pa3HDR;`$5&_#$iry>b={{{^+D=R)XE*(`8>z2p+#6$qJKqgkX*P z#tSS)xb^A?@%(I;n%MNSRIk+qCV%dhu6)U2ysV8>Z9If^!*GJMj*0N~^t)l((MQoi zt1u_-`=;Icm9ufIK5s$VCrSD%1A{_YG7HI#pn{DaK<-Qkf=tL@_tmh>G^vW z8?tAVr#)O;E3a_i?><$Jg@fQjdy-s>g4!E0S;6H9&fZI;3pmB&-jg@zD4)uuuJuwM zWUj2N)H>}o|72bstsoQe(wA+A~&{_(>8YEoL@Y zgE=#0(Z6|n*pt}GcK)G@a1ZnAX&%vkqgGH;K)1b#`;mca%NTE3GX#RX?=<@Lts>cY z#3gkuD5=ncuUto+L(ShEVQyh9HLYsnJ!UeiV$K_ozS5+M&;svN)(pPrjV#` zkmni4F%w|8vkp25G^se{HVD%sT$Avv?55A<4%0{(X~k|u-Qio}I?GAkPdEb01s|W< z4B5Uf!f{}KVh;5)X?V2Qqa!V%ONe)L_EwD;P~!71Ro9pMK*kIkwRHmHi^jgVODnPW zLPK%`ySm&N)Pfn-4kP7q>g-AEX5uXKI2Q2A->+SflmJN zA`w()m~oUY4VyguBowRD7o#DKa|>*6#OAb`x%n6P$m{d$)Fx~=2%)!I6X?V=EE~=z zcu7r{Q_*9j|3vrle`*ilA8}sCj!TZB=lQUW6${dt;PzVIkf~ifyCq`ZF0b&+Fa9-Z zRe{2Qn;$3X6SaKM9p^s9dk5q>BvtB(#@zf2yQy>B6x!a#*(7Bs{fs>rifB~Vmx54h z2=`G}yX(&PSf@Nm=xXjYW)Mj@|HT={O<~CA&}~C=+Mi;Mw8@vKrJF02ZW28HMwFRM zpYQv&p)@QDU3&GI@Ov$!=CF}A!q0zR`!5*G|5ttwmI=X{Y#y@k3CBYL&ue}b8v0%O z%sw}te3)}+)%{f3a_x2o<0B6YsY3P*VO+>2E%eeS4Kd_c7K)NOHFoQuDT=N>S7HsD z_F@qj`sT1(JI_|iJ9@MGRuDX3!}o=5vM%SAD2MufOM827F+OulX+IPe2gPdl?Fmv; zfNm_nQhpV9kLWP_D%SgtxI_M5_>RBYP5Y1Kdo*;(4Qim~W&~QzT7;akyzHBG=k&i; zBp_V&b4wGZHfUOjHtNOL0?HxIIV3^v2bJ@I1q+)`xBfr&-aD$P=vx;J3W6XaAVn!b zsZs=_O9`Sh5fKpSM0yht=`BH!B2`30QHoNfg^tofuS)MVBq&Icgc7!-c(=bh#(VFS zd+zVt_ujbgjdA{lBx|p|)-2!r=KNU4d{7zv7(?Hh0o}=hU%FKa$JL+Da z%9?ec!aY&>Fx9ULdNgYaX98n@dOm*X_*{1Rw@W%@0fn>QybH*^46bReg0u2zu6VFi zg-DQiPe3NNs9>Z)9YA?P1Ub|t@#DfkK#<>+PTlj4k`embkO5K12|ZBZYXfvw&SYOo zJz=*qhc?O(54hfBZ(9Flv&r79+(&tmAPCHCv5?t~+Cf5YG_{vXXX&{2tA46!stCu^ zHmCZ=hyt+A?E4U4-OHksDzrzosX2a|&7dS)bB1l^PAt5YqxRauyyTny6Ji`{oyy#f zbbafFqn<75~7 zngm-{)YoPjs-ngzu>`?=S8d+LSEC;u(p=K_PVn4|CW?TL&YUD7H4}YkC={I8-jqGi zoHb^1Gsx@lX34&F{|(bG#z8u`Gn!qO7L5+m;Mp(`@+PyxG4Q^Hh@0JZ7ix`80`rf@ zuYP#=&dXb5i<;^2S!dC&>DHXcU92^a9{o5H9LK$L6YolVGYYo?EGrVr63rg8OjOdR zBVC)Hu50OIa!!758^Fj4%+vs7-Jw3wEz;$|&6Y@MqtWeO(v{Yvss)|#ek7eKyw7!e z42$9+GgC^*f|Td})5qDV@m>dE8<;0!iygw_3pVY(ksCPWk%)2?Nb06EajB)bnvzD9 zG<1qt^E$D2nG2P9?e`OCo{kWRRqm-{Vev1?I>478f+{xDp!DjOGNhYF+D*|+p%()( zA@tABLEhCVj^F-oUzJ`(p zb52&DHt>0d;8-jcXiIe$VIiND1BC`x`p^sc#8;I1invZFBk*X>E%aG+?Z!MWyPfSa z_oA8u)`lxUmnQ1t<+T&-7{^0Z>gf+8R-l;ZUp3Wsg>3d*O3e{#ZB`rAaly%x>BN>q z`S2IGqWLY!Qa#N`r|O635`KPsaSU0|#ebL4jTkERL1phz1+F1gux)lq_owv%4ZsTC zsY*f{MRzr|D_E#6or7BO`0dt@y2sYCNDl|BmC=Pl0k6n%D1TiOHh^E zb}J)xn2qy?zbNqimAvI<84u*~nt6LJ-V6p(;XCa~4#9DEQ;e>$FwXuwzT?E3a+!2L z64@-(75$4DsSmH!jl==YBn`3}Uc6Hv^Y-Yr$*N}Gv1xaWjiS1hOQ6P&NcGOYm1Q&x zi7EaoXZB2*s7!b!tN(owNU@d@Vb5s`-xA6vM5)jro|>=DkU496K@C_uvdbuzpr5uQC{%#y$}UP?noyqAdJeei%A7^!QV@^?%D5a zKyr9CUK7OaT3hzu3#h&EI$EwirjL?| z=m&LMptJcHW;Cd?dlQ84mdk~x9f@Bj16)!s#U$q~4x|nKt~BB6%2-M3M{T>_ohX-2 z)|k;BufWyS)I1l6;(jIMt9>yB6knqIs~2+u&4|P#*quzWBHsaWeHpH)&TbHEa2bsJ z*zY%vzS5@J!&~mtkV(i6PqIBnUjl*)I3>dG6_b}li6wskPqH3`;& zGg13O`3tYTLb7jKr4&cc_`D-(!x9#v)Zgx`%+hI~xKYj763&rL)SqpH@a!W(4xql|~~xkrd^A{s?)V4p~oS+H=p zAc-#+X?mr`hXcNOy*wIyjB|TNactC5Plg~;%=bLO%Wxe)M-U8%l?48jOc7gXJ4xO^ ztmC(d9>lXo*YL;pZ2e8M^ZZfh@=~fy<-=+Md?!(=G3f);VOlMCprlW%f3H&E&fQ8D zl4ScR{RY?e3iy@k;6YaoKabz-Ol2WUx3uIMJZs$&VxMF2GytLHc0MgjQ?9(tdKIlJUD>778WJb0dKax{j!p;1w!s?wnz`?B8QQ zzm)v$zaM+q|Kr&E%;sWfp>>%%EUPPVStZDA?(lEA=5BjD+lrBLBDxYkzUT#=HAm=P zMpwUMVv@SryK-mZp@Fr5@;JBsb1hw7-^h}L{K!%W1niDE!3z(wIa-ZGxcS^i-W zZ@O9d{BjN{0l{6}ukD!euN$!x-9*E)y+4k!OBPlN=<1r{yW< z&G+lU6Oj(ohoQnB;zv5Rz=#KHxoWEnU(_kCpyu`MrjP{m29HCMx8UQuE@XRLsREHQ^N!3jv0az@Oykse-O|VL5v_?!aXw3XxcX#M{@IfpYbzj2 z2l@f=6;2m`gu?Y|Je3%yLlr&<2K0Uq&y|iQvtkA=Q8&|$5~66x!_+0JEHV+<08jl@ zr$ch6Eapsf`_%7Jm7*$n>DNVz+33;r6p7|GCdVF3FlKKjsr;TQ|RbJ$b?E5O+m-Lg#nQKTmkmbyH;tXF_$--oG+1y*@X0 zCh&wz((I;zk{^5~wF^xX?6Vs5vBl^Q3=Ck>JPPs}D4d8V-yP zFGs?%kk1fm`1Kf#Yi>|Bgvd|7;KsWX0W3Qb3v%MmrCqd~ZwU7DUaMQM(ro`_+kS|e zmx5E7-17^Yndw*M_lBRGU)(x<@#O4_*Of*Sf?IZ=hoVgbVEA z@#tW^Hu_$p!LuX-p-xxr$C@zlGo+bcIqyiKh@s;>);9s*C8CMn6MQZJ4Q}26vL}5K=2ZjieLPTP7xiDmT~WhY-|x#sOyzH6 zDaDnW8jMOx9W02ot#OVC$zF|Mg&6;Skp2G~d7S^J3PP>_kP8^g zRQTZv`!(?!;kMZUD$YVjInEoybNTWA3|q{+57`j3l-f=OU>XLycj`@Fw zd}rPUa(4PY3t#pLE*l?w>{0K0;ZeP-qBu(EYNJLU09In@UZnPDz(!kSaj9`HHkve0 zA#@-NU(H&XO!&hNwm(kzCCdm zPY+XQ$UpIo{|U{RXKxk*1MC+RD31_5P;QVq7()HV&q%1Bq$0|g^Cs#q--Yiqz`mrd zEZ-}W9_tBOw~V;%n|xbB$3D9Iwqb8ru9=zj)4-U4q1OB2|qY6#bOU7Uvy^MvB9nKk(C{*aQ_cA9x~Nbp{c9-P{XgfKjF4XU6`t!D;--u{y@I&xlLA> z{F1~&X^|bSZS0$kzSaNu5Q#!_zGPJx8qv2qpRG&#^3+!vRW1ON2heM{N z1H=y8a(->ynp8AYweDrQJzd-T=}Vf2H3kfciElx=n+q~IR5zY~&wf?v zf!mJ4g3S8h>*4YzRIuX; zQ@OGinD__cK+XOG`7mPVZ5SJ4wOG$Fm6GJF%WWsR3p$2c!gr)QJStSQXJy-Gn|{h} zQ?z!UIxZMyxy<&!HtiR4?c>2DS6-axh6fp}_(oYG2QmR&Dq6vZay1Kmb1U_Np;kGL zFWqI*X_4Jt`@Feqo_PY}Je3x3O8qjbKnODrzd%J=3~f>Y^<9@=Y45%HT(FBYUE*nlv4L+ zp_^Ev*kkRz6G}`5Ly20t)h}!wQctyE0gwYg`-bw0ELg0|m9!H8<@Mk;6`IL>Ij`Lk zu!pU2yZs5)xeIdl-DaG@UlShLcEw7FHdNzdM&i~VYkrwHR2`9hay{nD%itPyoW@~U z_xG)(HRR0jT9}#+x$hF*l*(93QX(6-MQah_=G*u;GwICE7B?823dFfJCqC;7e0v#= zm^yYpGrHKt*VB?HX;R`8a47?1xYItq!N-hLg4ZdL+2pX9krhP*uJ#=xD*Mtkwc4Ni zm#sb0#Hj1vzS}$um^U8LPA(&^5H;{4NoqVKS+WWqo$6IoGvmJ`BIYgi>#WPO6U#Q< zuxABf=013wj|cXv3=qI!@~rVE#ltJ^lX2t4_~Y9NVkm*Fe~duT(xgp~yyCfUPG#)z z^YbAIczF6qbc;+K%&sx^1bqlpwdT{&RMv=U>@p^12r~WB*5B*tr-&rD71`pO`dhCR zupZyfAY(z0irc%=9G99R`P!UwFWB#^TNhu_&k)E1iP0AqBGolTr_uSPGtg&54nEbz z1db5gw}&8&GwJ_P8m9zy1Q5$4zm4nOJ^mZtjxU6g?zTyShyOWp;7vHlPeZA~DN>D< z@1cYbn`pV~E3~aFuV9$O+`SuQUr=J=3iuh-P)Z7_4+>mfC%-`QB4-DY2Pw;F$FhUk zAO8RX{zIBM2o(I+-}C+hshI!qXk#@w;wwPPk)#!VjsWj8n2RaT`d&qn>N*oIEfA2k zd~?MugDaRfW0Bs9s{a87PW*A$O*UTQ_HKdVU}yU~!n>K7yQTIT9kYqDD{*;w^8PxewnV4B!AdEh(AjyeHvNNM!Kyq$KPs9d|@xmt1J^c^|9 zV(}5~YX*-okvE>0=?#|796VmBlHT?|fxJ6CYB_zj`NRbyK}kL4Q-5H%vR6OS-FsYz(=4@tnUUz`cO?Hn2Y zZ=AUUU2V#2`oEamdl7#-%0Llzr%imbO=J{AQMzpKW@RfN+%$QYQ zHqGuSU_60)>1(?K<|*CbU|bwkO&x`u9*3VLn@>z&rQWkCf7>qVGmUxLar1HY=ZD2= z`s~VT-VlhoD;6Bm;L}6BjIa0+gD-CP1>pBv;(HZThyFksTH6jUWpQ(IXMVN$&bRc6 zza-Rr$EVw9E}w`5szc|CyN%+G6&p)n%gtHi3QdpBKqm4m_4uAXGUr)E&gK&D;seN` zIdS;LTU__D`;Qd=KpxGuuU$(_7og>Tb_Sed1h|7Hdx4VNCJ=52G=B&WCJ;0I>@g$E zi$!HVzQIYUr7JoMJLFUu7rpU&LND#^@64YT+My;RM1ji_Sl2EjNBH%&%>G7#PG(q< zTAsITV!s_9CP|p*N1L2tL0{*hX{0@b zBlV&^)q?QNtEe6(v4fR(D#tk4$csiqXtI2@i8Xz)??>5rjjd?72D0lUq7V7Va~CiR zHG0!0o9JuThd2akR zr_9qQw$B71oQn|DMqA5ndoBZ&gDf4B2l%csi*`u}%&*_AiJf|nY#1x8MYcaj-O6LZ z+1;Uz!yDfIfn>h(fd((|=UFbT;Hba#Sk@#+Vn5qaocNLLRT2!4>rM;q>V%(FQ_tUe zET?AvI?K6Eu6vllk>}%yXHhpKQcm+RhZ+7OHR2$*AUo{-f-#)i<|W>xF+ z7bcc4D!D>vMjaxRrDuyfpm-F_85%>q;70z0toGVG_C3{IGaG>5fYQ^1NorkOFY_RWR-$>Hx2&k z=sOdVf)-$BgM-DxSRwBFDe^RCnivR#qd-$2>KZcy$#e0d5;&^MZN4RP5sZ3!+x#Q< z=(3lN-jI<20-~um;B(r+=oqvsG?Jfzz>AQ^2X*DLY&0#>Wl0RFUz@*xy~mrr))% ze$N}SvV8=mF~$URI~Y)!cQUlFIHQL0gsLqz*_QPo76oaAW?6K}EuAs_bWV3lAW3Vv zKYe;M*zk=h{;IiWf=Be~X5WrSNxjp*9&qb&#)Ib$^7++zPobh(e zT5Q6;be`YIn%+DAIm+xHc#5S}28a}2UI)@x zrS2)^J;Y63qy$YN?V)ogEnB!|avAF^)_Ae=BK4_MN_&4UuoDV>igZEF?XPA}hQ>YB z;M=fLKM=hV!0}Avr`|z!MgcVX9-Yx#P&bUd#TvY>qCKz+Tt111VbJ>J)JtCR?0UOr zH|~q+?A-~=JV~ztnZX5t1DL?%&y5iDkIF=9mBsSrga9mT=Sji2^aGOGo8v5MwC7-W z1YQDz?lHW*U$Wx`dDuyzj0mSSugAiG2(w-F9kx z!9sHQWmKi`n+fy`Zg?1Rqz}yjY`PtFtyVC!$3dUq?q#3g1;GZfLTGYWE}2soHxu`( z4t@qPk^`L-Y?}PoN}Zh+jOmJaqs^}Cb*5Rr3zoI_NLfH!mfKlj8!Q9p8pU$iaRBsK zmgg6row^Y2Q;J9ZEFl zH^DBO4L>IIU$AgG*}tU;{TA0g0!Wy5=RSj-K0wD>twfiT&6VPIOor}G3bllp8w8s_ zx}xUE{ye;nhUP(1#z~_`*YB$#O@b z-!H#iopf3Js_YJrp+8ofK-;6{*bOF!QC|3bt&kB_mj==;*b&x*fW*}w=;UKY7(A9a zGuw}go;wGu&gF5A6bRt*YPx_mkxpieKua#2L$_ksN+q2Nv^5>{2Zf| zd{AiMk3Bui4WQeFTz2gGIf|!5sQ&W}A=4|mrehhg3@~FG`mVpGl#zN~JA|c6n&GD% zr>*9PFVt_f36sN)!y_`irEqUtqe}1H>sbd@5UQ-kbutf-P7(+Y%)Rw$advUzderj9 z^{S+gOCX`m+VhP~a{18SE+jjJF(>2r%11CC@z4;S5B6r_^IIK$Te9W*v23|7Osa)V zhWn~lOQS$e!D-C{i1{u$xs4xS!9I8)&k~Q|n;;t$#j#1X6?$?k8VGQoEfcSL0C_Ld z!C$}sy>VNVBrv}zdOvaXZo&i`k7wuj&9py|JGM!|#DxS1`2iqDNGCQ?T9EF$C*hms z<`1an@Rjw>rFIKH-Gz(N9DQ7`4R`9C2_GmpT?12C8t}rowLE2&_5j7~Z^w0d`zA5ww0+x3rX6Z zt|zQJxM52vGNmvYYk3;76PW`TBE%7|0296yv+fneTUn3Oji&07?lZO0C4M^r9W90%TT@{bmCi4mL7J zL2#DE{emYeb2rt-K5f5j%Dh3{Vk8(CfsKJ`)n7<9Fvf$}Ckxf$L*lNK0lrNB*}i%R z!kG--)u>d-jq-;OXQH?9qAI{e1e6=e17iN|9r>()v1Ty^-7l)~5UXD4K|YJ`xo zCtqr!Rv2+)9{f=|{OrMgVerYWP@mZCg$r?pb+O}$f*&LpOGFp+}5jD%1hLoa-CD_5Q*cF-u2!(zqgPL_cax6$5=*kD5;;=Hrjz z>WQ8Usob7E$g-hfE9RY`@ZZ~aJb)ts^PM;{Cl?M%zMOkX9vVIWh~yLQ6Slroq6RW< zfA%RW(6TeiS=DTP`Z<)!IP>8te14WshdsLnpjLqy&h4!RCVB_9pm>?knuRY z`G{M8Cae`L{dM1$pJH~l?*p>KiOQ@SgaKU*`O(-;R9l>!TTl-dcm3y6)+WAVf@x01 zyJ8$aR`5EhNys^>2qCjQ`)>HnGOecN_eqcGdfH~aGa{_?z8W6H&uowE2;*~BaH;L6 zi{Vlk9K|#8KOc-X-fB%`xB4>ToP93$(afGSNu7Le5wDq@D3;PE^7SLh=u_?@ocSS4vF zGYBm@kAcGyYs9Gw5=k?Z3%UKK0W80qYy($ZAtVGGu(i=R-eKsR| z`1JNlL*{lit&2HOy*kcC$|R_eU%f<%AE#U{ymFhjbp37SfY7gzq5_L$MN3Vw8)tYv z@a^YJk;Q{E4(8N!O9%4B4Am>w6$h^~+=&}HS&YY`!;xMvKwLUf6t988qlr&i-dRos zGzZmxo=FpGXsk_uzc%(3GJC22_S%PbvpaDQ9AsdUNC(*5kQJpsLv;fIHPA&eyG`_z zcxDRwoqzDSVfV^&Tto-_3ccvdS@DYGCsu4-6WLZx(tDy86ijZPo1}hjVd49#!H6d- zeIaSN6B9*3RJ(8Uz><;jNRUMFTU8sR>>)uAX>=X6$%)QH0TPYmY|zupqKlCmelzc0 zsA8qphTkLcBQrjLFo;7TpCPyQAAp$B&$0szv>FWa8ouXD1;ZuOH|swTgCf-E@qR4} zZe%K(8yThX)S^vj=3tjGIOsk>r&=__K7W2Bt4zG^5jQeE#eZqPp^H{a2nD zuNdn4O`^b`uXW)I_I} z=}`-*Q7h~Re;~7BX=jg{_cS=&T+ZdI+XGKANVQ}dX}*$XF?FSI8;fLkTp z{aE$W;gXVDZ9CG-2xMvNQ_{lei?%BA715PIY=~Fg!cEciv-bDK4dmYlUG|1&==>0Z zXb!Qoqq)GC;uctPhbLX^nhOrDpk%c~Y=Qd_T}HoAz3lnlgq z#N-1z{wko557)KY{OPJ!Pj=tj(CR}p2|%@*fmy51kdyWr2@XWCfY^jAk> zH7-`;zekBZu-4ORX%3Yie?K6BtQVAnT5Wea${c(u>&im7n7K{9Z<7%GZ7_*+LoST0 zb`Mkl>An2QV^jU&^R>$iJVAGaXJvVbzdd(HW>=_;A8-{nd*_Y1jOKMbBaDouT@0)v zLX}PC!`#2CI+9Foaf&{F6LYmBDK{kX4DKiwj;F?8D=zMKwTVpZfI0>Dl6rhS1K7UN zjy0P3KQ@c2<{;Z6CSc5x8fU|igq1E^UNkWnc*-xt=VsIWtnHT{DW z+1u~)()Uy(bo{-9C30uudUpJ}?YIF$9Gop!OHi@3U?VGIIhWf=zIBmvT>r$gj-|I8 zI*VY#?wU0gwUbQJCwt-xa!vvHIF*1_HvRnUik$J`bI#9RCO0t%B2NEo=C7xCk(mj6 z>q#1n;V^=C-Vf^vpRRecgW=G+OvSXpzFd>uHgMu=R4tg3or#I)Blr5RP?*cU4$86? zo6ilNZaCWZ$Nv1H`&Jb?EDF{dQ_vi3CpM39`2hyvmMmv>%`h6uw@WC|MQPZ}y=GzGKodNqCtNgX%^v zNKhGzMW3o^myo3??>{t5D)1@HFO%S3;MbS0jAjJyT!Kj!GIV6@z3snmAB$=L;mZ%O zivdvZF>BVJ*YBJPte-xd;D2s^O|dV*6Vs{B8h2@&F5^YYO|ZLn|0n3uNR)T}=y`M8 zPGubSGkKR02%I~#eIWHU7OOnxn6P;5h3;F4%I$N3^d0o4TF7N|MlUTA76kJ-tZW9~ zD>)I7{AkQa7?(h9kKF|Vead08{F8ATx5swEA2~J|s*)YJnUD52V zs)YsX-s+oY^khon^TbPdA*Uqv!Nx!%l47s{_NbkOm8_M}$)IMBvA&{U;H4?RuJ7tn zWc|*aFU0Mu^&HLc3?%8q+(v%Z*e8X%{x1{dayWf$2CZ^6se@oa5KOQ=&~XMh_-P3X z55>C;$CYm-PG$A3RbrGNO5HdS6$nkFK#a39NZH1eLN6d-;pgz^$QEOKSa*7GkbYZB zYt7^`gMDCFY>J8$O^D-@Q{A~Sy}rYbWqTJ;V1B+8Xk;uOIzO9t-+v?aYlPvY zEcMWDsyJqtM^|3&Q|l5BpiDUpb(lSgEykLYIoOFkKt0|S3$_b#hw~65fKdCQw!%*X zwD$&tVzH)tEzX6ySE_F9#PkM5ff=q5nQexM0ul+k1_V^J##PUX%B?2a*E0=4Y<=gS zv}U)vt=;^7`4p>O!jl`Ymfpt@XcD|3D7hY*0*Lhk*3!3+G>X09 zArikqXe-jUkBw5lTR5_%h`xZte1bL5_duigh44OI@aUY&J}e$ef$1Kh@2h&wysVQJ zP4|c#Os(=xahUCZNh@!W6ySY*JKqV)WNS*fS_I14V14%I(aIcWunJt%@WjHE%^JN_ zfj4TPxab3IXWl8dzh&^P7EJ7^Y3+TcdSQGksZ3At?zD+wdOo-%&<)`;Y zag)2=q$x?i=|1t~N%?j2ugC^hGKWM@F0+Qf)*lFc8-rWJm>qx!s%f1L;E-eWgR)80 ze-_Ul^2rR3i9YxEO&4?$I_J7-MdqO7kWb_1uzTJI71u;sZ5%1r*Oj>7zc1?cHAoE2 z5a}pye<5T&b9q{BuJ#hnHdihw>@RGZMC2RAV(;3HFSzL}&N&G0Lqx^tx#JyVsLOtz zcq*SWcNSkZ4$U38iI{{o9`$??o;)z(3`U#kpBCD<_l?$|v69OunL~3op&}2l2-X7{ zJ0ol#?Y0D!%M-UR8mNcL23rKoV+j}Uv6R;2YDpY_udS_}sBoyBz@*I2)1Bru7Q3Zw zccQcsa2PmZwMT13 zzMmx=#U$HUf7ciK1F7ugkf}|0ViKf?wnr{F8c-_2uOOW(EVVxZxURAblTw!? zz1Cyza{gEekvvx=-fwVTdFb4r(O@qA{z?j%m^QYjasYz&088vAGMHa`4`M~Fg9V<< z$J8|!NDHMkL&o&^d-|ag=dRDJr;^#qx`VPrcQRI6ugzG&BT{C$2L8q%DyoNX}D6VG!zX<8q{H`G>}nzJI#}`0lQ$Z{GkKgY=1_ox`t;+ z>Ia7!$IUFV6D11li(r{Q!ujl|ucGLKqx-n7kHihy+HT^Fyga{0q;OlmFA(p)Q>0*0 z5dKxJS36Xc%;|?cdKZH6c^c~f2O`NNf-VtI^NyIFeu(=3xvQuC)-VW-*Fi<+&S{(m z!&a%g%#9Z*og2qtG98?+-@II%JhBvVHr-_o9L;C6xMKF+^vS{=Xu=#-2F+fXjzJsl z8*7KpZN&V~ddR{p!Q;jD2a+xWfRqZmK=iS-58QpG2jn$M|CR$azz^3w|3C^G4kx0i z^6KV4T&*#gANJzNtbSBIkYc>;3_I5KfmcrfIMB4){N*pv)s1(FkX#GkrD(N~jv5moMpaeh~jpf%^RMcBY3MH%-ynqcyMR7@2Q`v3PrK1svQ*nB z+0eIa{&Z!)m7VhP`70=Ir>oyDpjh9U1@;z{zAU*$g92mPxmwK5(GCw`y%S_Ie*coC zd`M~tBNcQR@Ri@5SRB02!9%Y1Dtt=U->=d^0o`kyESVN0n9X#r94%#n`(ZwZ%enYo zFs^(#JC#4K?p3xPAC#;CBZ4Hy56B)gaMJM)WMB$lA?X5LtLxp+6n+`-w}z~Tq?v() z--iqW=mcfg6zdm4pH0&A#p(9vi1uy2l=&o%%&EM6cy?+WoE^Cm2nS^`E+Q7;U<>+b z#5Wj&0PqRFZZj3|c_)Cut6uDoMW9^q=+bMIS6%0WyBE%_t1L_KHnpAQkkW5%W$M;)d9!H~Ug|n3d(Lacaz?7oPsoGalifaQ};s zc72ms9y&KZw{?{L+3Nk|1S}rP5bW{?(%U9E7S21HRdobzjo=n{r-sGRT<~c8Ex*o$LWz8W;B{7r`=F*dR#cl+*RB{ z{Y$iI{OXiQu!1CK%kP zjvw(;imN|;IVm7SAg0KSe=YCia$8bK@!wKW!{-~4CZBY5E&PU&Ee81>!s>gDyldU4moQ`$O>T6bZ}`Xjdt9YA{0M>W@r( zdhdKv;L16&?4yQ~bPb;SHI15rpW_=>GVVDz4?Ieh%Rh%U&Amr_ksR!SzB$xB^7`)k z)X!A8a5}(%bR#%)rgMd>j&9~)f#+!etxL#GmP*vC#Tsk<^U>nntj+YFG3MXk_-*8D z9QFAC2rBhffVV2+sE}j-KEdo^#cBCgqucjCF3rPIau+gJGov)lA|{vr(wNroQU~zA zQv7#o=6_Gvgdh;PUTV25*=uRFLP;xfysjr9H1P5DZH_+>kqCS(wL|a^L}vg#LQg(F zL^TS+8qI(vaKbPfc@xBb&B<@Ui3TLvR0@x91gDP({?)rZa;hpr#RGk$RZc4D1_Go+ zF(X}2GzPfc=Ss=v&nz1j7BKQ}5^?VK=Na^9F;2DTN>v<`QJtyJSMV0ODG0%qFl0;) z?>Je|{v~TAN4-SXEZffaPPrMMSC5hLN9!;QiYh;KI5O{e7a!AIL3y`Y!8U8%HQXVE zQ>)cepAGRa`bab12BLXUCe&f%8UNjh=e)OIo)gZd7``9(KIkThg3&EBW3wQ~QlR z^?mrF6cP$;Tt*do<~Fc&FX?KxBpgrGGvu?iWA%o*yw015ISV=SSsHzyH4ijSj3ZO~02K!BzQkXVBQ5-@TW#}Os=A9&OjYR;2tn7+zI zd45b!eTPB4gkj1{MnE>EWd0?EWSLz1*0_CzeE@z`PnDiL5C=1(V`z3RUPt=3v>jN4 zt#(HrG|Zz5E>a)CFv(m*JatS%YGUnS%~G&k(4F_LgROP_{Kd?A54)(1A`c zbTyxlNoCRwyB-b&kj0hZZx4Su`xuT{HC0C7cM`}}l$;i0k|AJjGVKl0px+#>w`Pf@ z8(-&3%B;M+*n3GV-GIdWG4JR2vsUPmNlE{{yidt!rgBwq6)oGPwJtrZIuR`0dk|!IPZfUS=1B(iVh}_x(DUzh1Mp zxjb~f)Oaiw98b+4a7Y{Q$*qzXp<(g-ih?K4Xx^tXL7)Wqj!`$ouUG5 zOQG5ppTbE#>j((;S&DqQ@O&=D8A&T{do7CGVz{DVS}7e2**6~u?%T~L#&q@WE1 z9EYAR`AEk9fdne07W=|0;dt%cShNE^sGB7*(>MIM;(J@N$J)dA?TL|GpOU~VnTUzm znRsM}GZh5W9m7rVu03VS4INmo>xS3Azw#w!s~kzl9tMN%V2t!&w0DJ1JVMH6hTQLu zd|ZGS4qm|hO3SAX&Zq8NC~B&x1)Mw|c<2d?_<8fs3;uHPznMev{2fYp-o|Z6s3n%- zrDG3iJ)3V$o+>M;C3jS8%LNF$$QiF;7&!E`!(ol)kt74^>FQPVQ>5o`O`CA;-JEMH zsy`L2185y!O(Hqx;coq?3N$7WY&L9M0!TRLZM9of8=Tiz$%YM^yZjg?L{8C{PsYcU z{N+uJ&c6jMN9HG^U}2v7M#L6yV_$`Y`jflYcuyX)|vTFPg_#oz)M0uf$AdDINw zbNrg4sWfzHb9n7#*i0&7@nTyBSgJyvFPcJKt~JPJ{53Bq_l(WxIyW}?iH_}TWT}d1 zp})!3jivC42!~6&T3@!QL}s`jz?dM6+g#h)28(oT3R?; z>UGfaGh9Z$1bJX0FmldOS85R$`xm_%q}Gcorvh6OhmJ#3`b{Kw#Ok4)*66t-Vk{x9 ztN9*r`dBB=b;5}@mUJG-8Ovy{>D@fdcfrUPKCQbwM0moI0;f^qBHYre@GJXCpfq|z z3^wGL$8lBcg1CiKXb~8u7IsQW8#9ucWyAZyi{8|kFNKt-qN zL{@KtG!;+4-Zx@xON8TH*HH6Oj!Q*D??&HGBJ$;9bpt5MTjX8Os=YGVz-a6b~B|M36LE@x=EctNE1?0o2XKb_ep18KHt9}<<(zb$Drp?qJMB@u;O9?~Y z*(@Cerz7*>Yx}dhjOQk*FNxpyBaIsu5SN{uG`A<#b z{@)1j{ExLhCn%efZJQB>PSXvAN2Z&eB9V*|{Zw`GjVTRwGA9Am-O9Gi(+rl!+|8|? z$t<3d=_e908A*%{6G^=1Jn`mKs5SvdeTHO4nCFtyG@;`P9Apsf?b>KlLyo4dq6R_a z_N5q@Opb*IgLxvf3!VY??hDZ-Iuu;jBS z4r|Z27~daq4SF^?p)-?p5Mw)C!Y=mgCwwlZF&QDe@fyFh0yy4on!FT?k&V@DO!{m- zYu51oAto9gg~lICr$P?|0na_q*sg)?&S@p6AM5{ev7jJfBCe0ZK)pyt!G42Xt_2*if@Sdv{|LCxGS#z$jd34mH1-8^2MnRdOl_Z4f0=Y%gJM%kAH`A zM{xC}9eccOO_{`Y# z)#ag{+Fl5`Z0j~e45bJR;S9j*y27C5M_|7lB~iA*o~uLX-mON>zU@>qUeO!zHLyh6zXqdP+~Q!P-4 ztx%k}J?YxkTo?SPWkl4gIkH@>*M&BEL^OA>tq$BXEJ8T=<5mZ#EoO!@;5NaoYmTG9 za5-I-Z|7l%nKienz74Nm0yPXQeI3C0VH>*mneQQB5_F!1B4`Z%Hu5jm3QB$bUw03J z)SEQ#gI3M#T*9W#XJYDB*vPhpb3c^`9*tJWbjKed!U8Fx4=7uz-WvAw?|tEpqcqyS zFt!%s08DC}hB%=x>58vkp1b+{Gvk5m6k?THX+;uWLFHMM9;7iG7-JD}dW0ya>+ulDkVE_)f`FuM^d6Fsbqs@{Nn{E~Zd%iN9!@7;=( zIIsIM4F0(hI>=MAU=Q9AAMMaOUqybigjF#Ygqw zO#6TUw*J#v_*=stA_X#p{G!gPCQyU^*I!*Xx(dFdid~sUub!$Vu=iS-rKE)wdp2G) z(YF8b+wi<%Lv5UfXS27I>d9dldOpvcQixdjHxHt%k`8+EA>+8!!jO3EfJuK$tZ#Hu zO32@_Xa9FBlrZTeV#@9srJTwOB=+XWk3W(R%Z8d!M^e<)ZnM6)!Q1@qTaaoEfIE4j zZ3jHtU#C&d6aJnQ9Y}?6MN3V|qYTM-3s-LC{`D-XAMAhiJa@vYly=N;(qN)665ryE zGZg94{W5k4-v)3K-5)N{vJQP|nel6uPLYw3_%#m^`?p5rAJ<~v?_b|vP=D{=m~TAS zHXX?(c!=15_ep5Ei8H*|rSoM}dbK_oEYT=A7F7ETowgmuM4XkKZ=-;ZEb;FgxPO>; zq!R33U6+4%185NK@cOb-~XhO%b|9LNj08eWN4Ee~2 zhdN`Wl&k=~xRDi@EE?-A`SF=MHE@per?AV)kLLH$+`SB2@Q;5LIglz@;3yw!T+X}l zm7k-*f?dgc72VZW?1L>zRgB-?J@r@x8wtz5{_pL~zi&dxyI@Lypw8wfQ7Y?vE_!Gv zjLGj@G&-|rsm(A!-l>rqzx@sUElA~*Y!d4<`j!}|4nz$k+k=2{Jg~ls;@m>;Mt9`! zW~qxG{}{7i;vP6D5()cw`#-S|(050LQRg+(C@A!*1_*^N+???D0YGX~ zP1^|Ny$EG}fjWc!x?g~7CI&1d1*nX09D|ZQ;K-0h919?++XrI~ZnVa)@t?u3jr}yA zQB2rwe470*Bma!%=U%-FprioXKWD>#tdrSSh+~BHod^)mI3kP8^S{eSc8XFmh{)|# zrCp5`Vk^}(TadC+Te;}?X*d`)e*N#s&jD40L3|ROyvzV3V^MUofKpc@=lrR%h~gfh zsNJx_@?ExChsR3iz9{3s)iC^%s{vc?j)==ZG|AReLw=&g^MiY+JmNxQ&1?4J=SO-o zM&cmJMp2jhglrPcG}^G_?+Xf}3WJ?bRHa}+tWrV?mm_B7?4q^X#R_8X`Ik(szh2k2 z-2V2weNk%-mo!R$a7p{0yf1IT@f9lzVOW-(fO2309KIVdSkgbC zy7T_(kNb30kdYgjP;{O7KW8m|`;j2jrQCB!PjG&BZC8#0o|>88mp9uHbS4X#b75Zp z&ZA1nxd;ldf6{b{A%kXndz(*>6k=gQv4Ilb@X z+sKk5^F-p%C6ZAL)d5faZ|uEyP}6PmHyVmG3(}=VDWW2x6zN1ox=2xaiGnl{kPZ?O zK&2M}0YNE>2uO+aPUsy%ldeGMJ)uTYe81f9IcMJU-2UdL&pq#)XU@ETWX3^;xw5<0 z?q0i}{VW1&2#!prCrjc-XFr9_kSI5so4E=`(oc+1F8A`Ab?8d0CmXr8-375y5WfDd z>Aao>;>Zq;d%py@8e+%rL(SEOF;1B)&>sn^Ex6XQ+HoGI=A}rUaFWSiwiCY( zaAXAK5+C8kaNTW)FoH3dMtmVYbF-qzVa z4*b<1q82HSEVc$dMYNgi6;Ll8Diw(`5cuZ z6eMLLW1ewM&}O)TZHvhoGdH&Q=DQEEXQ8cN=z{o(0uW8~+a`xlIgW}qKr~`|LnOSXjjJT0GbESd@ za)RqfK>tBU;YK(?@jwv)5KH`A)>6|n1Kv^PtH<(Xrz?Yw1MW-CmA6cElEiaC(Mo#l zOEddX(&P?Hk(z@8($N1lapUp)ukQ{VXnPK4*B zD+3EbGH6MP!=Iqv^+CZv@;6On0|U{z9TAgu8n1-`GuWHLQ!yf8A5#4EJeT-eT?CtL zezmncE|0Unn)LLjeZF`IUl>g!-oT&3dSmLo7W@RYppLEZ30D^@v$8y9*E84R zd9-<z(VeoL_A0 zqE>dK6CJubSb+!pCpk|v4|k;RGpIPaznE&G_3XCC`G>*D;WNmsS@qIIJc zN9yi|FGRjGwI9gKlfc8Uc3}V-`W~h*9+PLEGGvLhEZ|w>kk>@pNTXQ@%voo=sl&-= zms+(?`1V=e_J~p=afidj;DeDKAJLP&MTz3@&rOxnr^(&vB_R<~-6$3xpxYhdDQZYo zO~EYsi+@{4Gm^E74Tr6_$MwePnC^FL%j*p7;yvCTH!jF``e4jo5yr+JEohO)^&#N% z=S+$l4Ln8#$&0!zZe`q(ZnIxDQ@^4yhJ>mpR`eB}FPsM5T<}5S8S3TKoot#X>=4e}MP@D6ET z2P)&f!n#J=d%!LB0y?{;Py)y97U|S8@_WZlq90aZ2H7gA%4>~*1eQXXSJ`o)nN_Hw zV2o!db0c+hRym~xFg~3oi&PeEyTs-@Q5AeX;+?PFwi=PSn|ue=1ljwMhgk9WdI&b= z}lTP)L*Gu2YmFdwILzGCeyi_ygW*Q16G zcNL1%f!&A=C38PPlZ^WiEOf(R#@-`U-(?-avi$u~%H7YQJWZQQ_O_Nt>K7-w=*|Xo z`J6)~O-H7eWVgqRKW`aOnb{ zvGK=-abu6KGVe%dKwUm{8XoM$-sj;y;2Jq~jw zeXRBLbk7`f+I+M6& z){&QD8Vp;X+REk?zP|q?wjO-EW6Q4uJ49v}C0xRnw0fu5ZE(+saF!Vitq*CBY=~w$ zoDV;fIv z@NO(>Pg2b|>qmav1__0c%S9HET<~^C@luP(WRy-T^u(@N#AJoIw(H3+r71?%acH5U zsN}F!4Z#t-`2<5!5t2JouF|L%O=}B34Fg~RL7xEP7#_)ZEMc}h0vvR90b@^c$jwSz@ZNL^IHLu^9wvo7pYR@P4R#FwX1Ppx^+sj9M+Va{O=AI+ zmq?8l#zBlip!kRxZH|_d)LJXnD%6)?%tPk5ZoUKkRtl?I@c|lh@fNJ^)%VjyFL}ja z>=an%kry97gm*)?pQO{F)^++JyVJ+q0MNQoW1ZR@dVL&t6CN_tj$GNutQs1ACH-w& zGl{8sFjU}>Ix{(Alg^#?($#+dL6!!#S>N(8Q)%W0P4rMw&(I z%he|*17y~}5^`|@`)+t99DIEh%3MqT(eYqCNWjU5c!y2lxheSnE zJj!@gFc4AC=fGu|`@~z>d*1ipYDK z$GCB!FgWR0|63It+Z&Hyi>PXL=Iq0_2@Rs0=MsYN7jIaT!baeEA6HB_)0JWifL%q# z->!5PYzmlI#rpH|usvK?@vZW*xh((8LMcR5;KXM!i65m$Y(U3?@Pt`Wu9M*QXQvY8 zRLgZEe1(&3ywCD3*jL{ElxRW9QMwKTm|&xn zF8Vw-9VMP4g-P0K#dT(V`rus9qeZRG{!NG}%uPV|){9tgW)gV|}53AC{ zH6;U_t6?NkRo9{Q!7Ii+&4V-?KD8W&)-q>6V%{psRbxX6%Pga&K&!9 zMm^1pVUxg5rY6^(&cME#-)?qAAKYfHNk5>?Kn}3pj$)S?zLWz3T?O%i*ev(Ey6+WN z4wZ@cY;Ii1wEq-*|7bhr^L-9$PG{BLjeoDAixpI{yYqu^48Zpp}jp(`D&r z_z}|%WkCV;4g7`dD5VBb(>2ZhL9O@JRxva&SuLTh*{NeFbm>(_0f~x>XO?Ubw+uzKm7@se*H=fDBXvmNmTFO8$`eS6;-ZUvU-f#K4*}nMNP7WcnlP8f zNJ>+pA}Zn-@Ffk?jHSF(rZ;BAE|;$P2uG?jRI1%RMs@M*%eI>WS$@1vZQm?}=47)u zU3Llnu+r9pg-nFZQiFNPls@QLKmM}s1y&nYW>hwNRV=3EevGoL(geZiJ)-%P8QM`H zu|lu(-mO-^li1kEoPFML7OR4ASCYX6M_>;ctCymQYGScjcz73vyg&#om=nLQXdD=fYgM%vY0S8yIMqOz+;6p*mkz$dfC?nT^ei zxE5YrzO>5=1hOzZfGnhgG@Mk%1ZUFps$q_;_`Hdf-uDl*f5@{ft!eAxdCC7IyvRsk z27GM!C+HN6F$18r=v-K-=PfG#QgNp7+N7$0{uuduoAH5Q%39viHP3IR#ko_v4$6s_ z&izHu`QPCSjQ&2)vY+~^(H9FD$ei+5xUFYB{WI_dL?Z_PkjKxF+wK7%dapeKFSG-- zo=1Se)JX9Pym@$u#x%Y`&j<@E;wrO74n48;RZFZB^wNFqrvcj%DdaK_vvE&Ru4cV= zmpVONSo1l~Da+Bw^xYNrSwv|mJsJ8C4m2Wn|7t{DfSny61B2n3MPIi(dA+7JeUQZI zi&iNkt8Q~$9!`xJy0UHbK;6T??0288|Jp4^eSpvcFs7s?Q{m91u!r#mMdda2!*Mx7 zEyZlqI{{{t0djH|kiZ5J-;8s&^042K+@tNO)}Q@; z-IMH$_*{aeZ}7|>HWPI zLVlsdh5xYDc62vH=Cqdezb`=t^F8UUW8|4OGc-($WaV!@Ik6KC+Q|7(uSP0I*o(2k zdr(x)N*D2JIwfDlHnuiIVG*vZx2%W-7 z9E(Aah}ksjvZ-yJg6`&aX5!(9>^Bxy(K3?`^ElVxe%g-%DzF&B6LP=h1yVAcW(sx> z8=Y?V89F&VVfurkNts?NsH^?pZseH(~Z7WSQZo zeYi2_^Qa9g>M!<}_8R)U|F)nex|i=>eI8@>xa3up;9PD7qsE8uACCK-_%#e<95usN zhI4ExXHQAX%$hQ}{mL@z#N`TU`r~%pkDdgK^Xz3X=Gy;OrT-VrVWTah2AxnjAY=u7 zXTT>FOg1|pF#eZDbyK*XHl6v7xw>%A*LDI}N2(2aw!muC4K3Gchcc0Se}X`J$Ouce zFQvnKyjL(?f&_^umXFXHsFkZ(HckiFkn9Mkv1Y#-KZJy%AtmStrK@CS8^Ix!9t{`_@f^;v<+|Y^JQE}0o0W3hf~+ZN#C+?z z%jL0i6!U4?Aiq6UqX6=7I`I2}U=R_Cb8H?lJPgj9o%FE@K3+i9Dy?8@@?O6*M$tJF ztpfb|KT=}{DUp1|5yDHRz$;@$L!T7vlGIuZceEtgYlyGy3k6?1`EK&%7FDN03g}?< z0`fHJW4*8=ghuHYz8jMiQc$qv2|hXYw(?>1sfV!%!)*SMQ9<;}&FNhMiuM1tv?jeIe@`9}73wa|Ae!~;}jhpOQsEf5E> zunBZyOdwnwpEbMY==V*n+3Wn~8RzG39@%&vgIWtb2zqvPX*+|_l4n|M^*5OlIeNjahL2ei!^Hqw<1b69l?D}fKu#-@NGy8 z;xdJ(T@kzqKoPkNM&6&0ric_*thH&XZz?FAqow8o?REW=7)en6UFc#z z?QrSuLldUp;7=V9);C$U0e@D^ye#=b<*C>|}d`o0`W% zl49i__=tV2-v$Too7TCuO$bb-RV3s<$?})x;~FJPH4`|z0;+2`nPQh zc&V@z%S|x)nn6J*Iz%*HV&$i}Gp1TEv5w9s&6Qc}p7u!FCFTxxP zEPPxVs}Dl+_4t;wzEoF-J)(Z^!*8eCa9T4?7C^+df;@)*{m8Rd@@MeHqgTUk!52X* zzlRn6RcfXAHZsQUYtUp?=Ol-8hjy3kJzo&AtAb%E}vN;)Xw_zue zqTLikcpNSwVOp1@J%HRhLs^fy37c`)j>j( z_;J}$l5bD)EvbD)l+4BGFu!jz!;ky-Y(x24ju=hZ3p0agT364M#6PM8nbL z@@H-#Eq->+wo~G=ivg0qhwJ#2NLJD7CkX}sp0ETkPcbf^A&oBsn;!l~1SOeW+y&K} z)NY$DQd67VbCD;2tt;lIJ%WuZKHvF2%} zTHXR5#@6x;?@Y)2xN*zdg#!}Ja<8BA(%Hx;oOXvEM>OXltfmiHkr1pC08MUp+`S9X zdIF@dA%^5u)b2$~#LUD2P!kyd9w-H*2*k2JfIM$31Au+J$N{+vR6XR=#B*5T1{9?+ z@jBkg>Ja`syLM3dM7+k+#zH{{^Q462Xp9DC)U zg0i)Hwxw#}K*^*v2q|D>KfY0j zvA5A(Rlazkg_2Gn2l*T|`xRB>LSisV$6v4e37RWA6jlMjz5eyQ_J7mr=yED6#XLY% z1u%&z;i+am;{C8)eP$<5$%i@XbK1qtCTe_vF1;#w5c`hVbuxSpu;LRs%y`5doJ)ul zlwr+&aAl(R+-d#Oo=QtuUbwS}5D1-B|#@3!$EJl1* zSu&Y!7OKTw2DS{YkE2ENA#7Tg0+0-ri@^~ z(78pI@`+r5vqAD)M8dCaOFE>);1Wg*3yt37o{;`H^58CT0`6;=w%&5`4i zCi#U)FloAh>iNjLNT%414#m8kpCj5FU9yALmYTfWiF~F zeHsl(RD%1+{;msDJ0*V;yV~D;2kQ2624gy$5@5KYMcBTzu?>8WP0S?I8Y%&+=Tzk=H$6Q{0gOvA7ywB|}btR{8 z89Z3;#?hGhzj%v(^%H-|2u8rN>_5QE6C@|ru0!cct4b?94}!GHQdS)cHk^4>ZzjJf zq$+nEsSo-P4iW)eo+;o*tl;f(TsuD|$v}r<1g#_DIF@rntvR(~4zyT;xH!fr_ z_M!jPFM|K|L`VKh$rFE!AOd42C8H`3v$_r}4p3~If6_+1=hT6v-57CNn9sd@$`}34 zT6QS|`61`Xz8P&04Ri~3Oc(`(f+FE)EevRp-bT0OPC-V^Mz_@b~$qtSruXZRB( zq{1oSUDL-v+({QES^C5C)#R1%A4rV1nc~M`;vYsY7X1 z*=~@0dCIn5!J4yq8z_0~%JCz+0ABYXk(sSCh{o%XM=`wk3NsukOhL@sH4h(rxTIGb z>nY#yb<=slA?rcJ1%qQ_uRy>OkAo;yia&4%Jx~gu3wPuUZA)_3rs;P5qONQiSC~0w ziq0Qg!ewq*p7&~`t!%gSGa4!d?g)$*7D7#r_EQT)RUpnv;i3ZQ6pR zr2kq=-`LrMGi&I_hh9g%;$^Kn&}Nz?#ghem+D&mw5ilul@BFm`x9{IIs}rU)ckZ@M zz0jb{>71bmCw%&&%yj`72ra5;0II?*-sDSotq)TU&!V&KpJe;GIA1Y%FMj#Wq{J6m zw^M3Td!nqm6wu>7OJw?Hf-q4P7hN`oX2(C?+%g&6T&Sx}@D!;`SWJzmqKiAG7vDg| zcA))73hIVZqO4s45G9DvEusN7Nu_ddkN0l>_}%UAQ|5WM9+_M#w|j7Eo+sLI)%57* zoWn-}LfIrG0306EM);69u@mM~YtPoF?Q0ShHMfO)HD6w45@M)ozX951+u!@6vveV- zAXez{oqac)({vP>W!am{7U^$&KJ{|kw7Ge1d7|+rn{kQaAWK$RDh2B*WFC;$GvGro z(nOY;{rmX5Ie#by99etK-MwI~#Q(#l@t#OW!onriFSlP`TH*y-{6>?*e{h*E5>JpK zAa>~S?$!#pG+yWZltW70USx_#v6jE9+ouT=tK_6deO>fEy7MP+(Tnx@NB0Sn9tLE4 zIx*uebBxh@E@4XY*l)dybp_QLo|4a^rY>#pI5NKqJ8SSm*Mn`p?2p9LiJ(SViH(o$ z`{E+g6!2yl<_;4*<#8sQHuY7N(DR0BuEi#tZkl2;z5Wg=tRSOS2n&F|PX`xIw}E+A zr%}6 zy#FWrz2iA-WHhB&d+1#3eJh#ar?PE2f}`WRf1szcFmBRIgdJl*n)GuFxS5w>Nqb}_ z*vvCgi}3d4wYxPInwsmixIXb~BlV~w70oe5fWL68x8h1LGHug?Kan2iPG+ z@z&}wL`g#;4kI&fa3)%c=ag%Fr_{dxAL*$BOaqj5pySOm!cjB$5N!Lcsv*zHbBW(< z;>e4$ckUIA>c`cHDY!>QdLofWX%~JDK$CM2B#9olZwD>uVM^etVX2Lq=b{}lQB@WC z<+yxxN)`T`rkssl|Cm2`T;bY*J@aDw4tS2a8gLloWG%!!du`&GHjjh`!u{!cX94?n ztcj}k609e~34BL-idGVXHzG=O+I4uRVH)`OSwgC^b;-_EW@kleI<3exP6n+0DpL(VCw&l_~ma)RtoQhN)3q@6Y} z{ZG&XvGItR^p=w%81H8Esi`ra=c+s8Udfb~!>j4`fgAHZZt7j`Jdv_Ib^@Z`(E}b#(eJi* z+=zn|cU1zH`owu5zFP&`RjWrHEaU%UMEX%U`rrJ40MCb+eDZZ1{3Suw)JM4Kndi4b zpLYG|?_@upG?nndVgHOwajMd8{x%x;c3!mO&Lo*$nIMOcf#LzaB@P9n_uovG(~g%U zYH1Wc@WH&*tEM^g^>_fdJM5!-g}m8AnGPw^g#pVfp5EqD%c}Bwvf06lIiCQwRknpx z028B2@!x%*?1;wOsQDfxVZ>-ElAJg>I^l`41Lm#BcbYNYB;N^uch9NLV+L3uz-aIz zc?2)C3^znHO8%9Fl!i2=v-;#=M#7Y`b5>FYiUToqmF352$KS_07+c(wfA=mng&bZW z`k=Thxa+HzvU3F26^*8h22O={6yH&Nh+k|L9Ynunz{Nx(KuTxe1NF?MShdzDISU>2 zqWT!UaG64(@`vuM`b`D(?1pCr`>x)VML)De|H0+`RW6L|KgptA(l6tGv|5d1n!X{(~DP49LTz#ezwfihmuhmtw6tp z7nYnnD|X7kl5K$L!%(TC`sISyH#L{94}{JgixGUO7w0Qgp#ow9(DdB!V=!sb`&wRb z0QsV^R?hN(Mf)@Ua9`2MzA%f^TVV-bs46&H{f_;SOZi3Zq#lnQ4cSH0`?zaj3qzyW zQ!`C(+B}JD9e-FJsdnbFui&M~_|AfAz~zeIJF(E&rFJy6Hg*T&m3EjIrqDknsfQM= zp?~1i(TK5emYtK4U9rslrzTVj1J7D;G^8;P0Q2~jrqk-!y{Ph3J8pUPPA3QEX67U- zlTZ~9DBLv&4T^yl8Ni4-&GRme3FeHzV=?M6aU8t^T2aA z!ujy-GaDQYaOMg}ZSEVT;az>_y%OTiu<}!GYF%rXk55_sk3G~Hro9PujQ9kP_)NTp z53xTWgGXR7rOiA@D#-YfRwz!;#@I@I80*`{NIm-D_X`4lFUC7=Oou=iYbCIGja+KY zXqp@Q6X#ztj&JbCsV2moZ4F9tGbu{@7{BUR4n(vaWCWOj$bl=FCFfz=F}#`6c!bHe z($ERF+7rM?PwEwcme_=cVFLFWm(D1#SVsI)%ddd*5P@aeO-O17Frxw|)ueq2E5xoe zT!YI{{W&{>MW=1svpAjH!U-Ui55lJdQ+d!cF#0?gFd0+w-Ck}&&|9}%q^Yl{qd4c( z3vptH9M_ipZ`ZW`UXw4|uV`irPGiO^&S(qIRs@Qsp>GZ_&6NdfSlX%p@(T18db{X8 zJn9GdtVWm)-eFcOQi=L&J-5&1_?9HE6SI7db;7Kj@w~}>+FP9PN4zJ!OaI_;^Y>yP z!E839S%)6RhdmEu(hZ4dyNu;f+(fe=Qi8uzK(nDHu6IXv)e+c9$}k5%=R@1{6U17} zmJbXQ6y#YhKijA=vuG+-xQwe%Pyo2y&Yr$W5-I*?K7D+e9;k7P&7?PzL}p`}yVbs6 z$x%zB6iy-EaiszIDUD>o%kARo?eT3-Whm>|0lh`xU(SG!6ZNr%Mc9M3@&dp2YvmhG z-V7bslC~)7yWkcGJ~?}xB96T2LCt?w&RttAr0x2M0#uN+Ct4V zm9bfFmWH;nwu*S<9l*AhU=M)+)edJKAu?gqP3P2cC!_jOeYt8>(N5kh%9ld)IW<%P z>*7@b0@QCe-+od2KHQpVZ`28y2Eka<8R48J-4EZlyNY%xU*0ws@4SATxXu2ASt97J zysKpqa0UDD%|LXDCJGhc1zKK}wZ&q%xl`q~rM#ljCN|Fp8=U$m9v2C00hS8~qSNnI zx_{vn_NE(Sg3=l5LHLVGd_?h*#AfAajM?j8lle-UxF;Mx<}Z&4+EKsr!qiy-_Ri8$ z4<1r5o9#7fs-BRn_9}5uOz09}wGCdB;0d@o&z%2MjlX>PADt(?Q7jO85^%`rv>G#z zm*vbW6Ot8fmT$7sw1RiC?yJc!*giQO(dKH|2uLXm17%!E6U8p(&008dS;(7|rgbf_ zg-a;Ab4K4d<3?{NBM@um@z2zTo=N&Eqbxx`|A+-QP11X8aG6z!-O&eH&c1`61yZ+5 zuG6Xf&y14c{pS@gx$jB7A68?1N4&9}E((6(Tj2&5)~eJWCI|w^3TvZ(CLX&6bO87S z#7>Of0xvMDlzJukBNVEU)6G-CJXKVcc;UV6w1fmmpY;qak6jhg4lwZlz#}2O9gl6~ zj~HpybHA|v=B8@UM%OX_i0><4V!z0>|0~$UuaY`_7y~Jl%u4Ph^PsTECJS*3vAe^Y zz3VHYJ)@V0&WtE*CcgrUcm z(-irLH;Yw?OCCkJHyVJc@UEvfWcHEIJ_K9_I?MkP%d$p^CM(^;kquCPEs6mD{Q5Uk z%m41D{r~y<|5K}fDhGv_{eYwWFgO8nYk~Dokop3$Wg5>PLyQ6g#O!Nmjh~=_Bq@T; z@2sxakw`yqAfhBaAN&M`#w;_0UqGT`e1Pe0fW6~?`5-&RfTcPzlB9@ zxMH*s%_+1mT@)ba108rLJKYuBFGmQb8S9=t!8Dq(nU`qv!hDHa@ZpI&g6qi#39NeN zG_(ItrH2g|X?G{U@U;6{xGOJbPukt8#+@(7H|>0eozUhvKLH|}-yt-jQ@YQBJjUFI z4NL9seyloM*zs=IVBUX4#hs5HcWgRBf%iTB6R^G+XfcgkcG?mwdKaAXH9P9j)efVe zmDGZ0O!c$gJb88i!}9UJEi(OeG`O1u&`(!|aY}C}ph|>a5Wxt{Nj1VlN!wx3O@3o` zgNEw(hur06Oy|kIOhvqTyUyhWA*u52dFG+_^~V5(wtN8qY)2rrUwnuiq>reXPw?ZU zx8y6U({y_=)T>;*Bk{cXQJ%+o^x811)bBurAEVx5;R*HNlXArip9(v2^{*Ml9=fQ& zulu-=k8@*pTGIFjiSmri1^S#)S~;SIs+G_8MorO06xFi4lOz!6zN zg2nLlOvkHdoy3D>*G2kJj}Q|Tw}72rocZ|foBhr($f>9t|G*Db3FqxxE((2T0D+q4 z_=XetoKJl)eRAr<;=-!`Llss-q5rcs>c5*P{15s6|C-%+iO2y#d19B|DoAT}tPRs9u9t_Txcd{e7-Tl(Wz)3`cU zq2XBh6T2du_l9|_70@psGsWN%c#$7(dRQ$417`dfLNl8Yv`T&8a>+%S{39xFX?h$& zrWc)!VfO*LEg=Nu$Il|AQ|6hzP1;xcWmSyNymr98rtN^8lCz@eDXHk|C{GsRmp>gbWdIDEtp%&G(?KES3{L@RNw zC6dn$TyGBf94Y-~s2cKumWAjDROjogJg=2A;L=SR>Y+1(#; zE|b-cs7+i(vR=o1E)C;mHUza_x@yLow{b*8_P>Oo|Ki`d2!F><##4`t2I&e41bl7W z2lTI+gdI|(kR4HWVv~9MRrs$2V;_m8f;khKK+H-16NmQ2C8rDDMBAo-Zp*ic4!l;{ znA>tjOA$N?j=)kLwx#tj~pXh{FUv?(ytV7MX>Se)_RkQQ|4mYZay zUHDgl(ok(z$sIc@)%=dCrV`#B5NOBJhHw=Q=qYwda6!ITC|p5j?v{rH7M6 zwsG8{Q1H`{?b0ip2B|(CGM8HXMt1s<%{4lFSRADu3R#}KZ>ZtXxYUvoA zFckCo7_e1o(clA^|5j5~sf?-W%IBR?{knW}DgEq(a- zpoC?YO3Jz3f>c)P0=#&309J$d7@PR6Bmz68OSq4rHwV+luh`r}caXu@0v+$(UnLd7 zrQjm~5p15%$juC&=TK#(l*{=oBA*13KLs$I!bN!4FxL1GCQEt|S_#BjMB}+yCg945 zZ5RoMEyP^&QM+ANYa|dT)u|-~){j?*2aN79{(UnZ8?o{zu|hdO!-wD_N|&+dAfi+L z@*y}_sXKde()ck4`zyUnc7P6irao$O#tQ-PReKbZp$xsB7Fp9n6? zUOx1%+w1L47EW6g@zD5~Fe#Ke#ct&*2#kEz{W|gbRWkPf%b!to0Ly3?f1CxTi6QHz zBaq!_Q=&EyXD<8%bqwI3+Wk9Di1a~QG zp?ah&h@Cbcu5`l;lm7BaVQhKnJx8x=9Ur|e4N)?VpiV(%a)4$axFv=Q1_NT+Lu`H4 zm4w+1p(jq8PIJi_F}iibnc<$&m+4NjI$nPKd0f}~TBm?Zv5zB}uHZewstE?gU7ugw z4CuP-vCEFDTK#PEswQyAl}^VZGt2L4ckZosc9vd?<3jGS7{U2Dy6^4l(=XuyK#{s% zxRLL|An_KPH%qo5EkllfT8<(~F94Z#$$E1Yjd&hRMv^9mHwcd%|v9%J7;`IE97b%R?RH?;_Q6~nbThkmIh^O~VvvuA*@cC0lby89oqjRRH)mE)&O1ZWuuw>RFPRosH#2{iC^ZFZCCZ zn2e-9M#DUAq*{{p)xO>6P`y8+6DK6Ml3>VI8H=I_V%9Ig^-dmixn)W@rq%Jyq&sU%aet?gk zqiurHI)3qiwtl}pAgO3Oe=)p^pkH2I1&}|9uojEF+izH`fSJr8Xnc-qlE35nP!DIn zNk7#odn~PIdb2X<){l7cLUroEcQ|O*Rtsue2cxpIjuP7_!O6EUqme!(2I2GLI(#eV zi|f7a*Th*&i>NP{N**u0eShgy-UJ+tpi`1SG^&&-N;F$u#VJ%9Jtwm+>pHx$D7E!e zI~&S>|ML6Ac;`oMZv0XAcS@ArcCO^?5VYB2bUGG|tDs3qMnxnAAIDZp4qRG1d)*Al z3T-iTUQo^Rp)2q3DK*{V+dbKQZ54Sx#*UIjpCRY~S<+{1R;9HWVKZ&Nl~YO`7vcNR z{RG8pk7IFOCvN-*Dugd1m(u_W7nU&tk1h94FD-p`*fuve@k=MRRH(*j@VvZz zo72|H2SgF)_#+Z;=io_z0}kM}FwQoM#TTAo_tbMOoo-LSm4E`W|yFO0|@9y8(ZCBI4^rX z$?ntN9ZWj3&jnz&+<%Ubozsa)$Mz_33}+42Dt;`8s_U(Fmt+FsIXM)HDwz_5mvPAdm0xE(q6_l8`AL17UISHr4KXch--} zK~7=2`K;CL!8{QES+w`XZ+gFW#Riz5 zV7V%wUV?u=>#&s^6v|>&t-cs#6ZSkapsUM`P9cbH^(34HA48@q zvf+5~$c3J$l{nXeyKTb0-Dp*mrYm#HI(9xxW6pbvZmo0|DGbQN3qAy4sb_%s=!`34 zHogs~2z{HHkg7}V_6^be`oS$H_F6Zcjpw!3_e$JF3TZIk+`4o7nA7;Y%U9d9n1lpB ziX-PLHfKON~ClpQJ5#TJ{6LQ^IBJ#&jo$d|*XX$V;#PL0B4 zh-}#U3V=Td9af8&B?%j!{4#E_TK>vBc=wtHf4zT^Wvq?AO|Gd5BHJ8b^LqMzE>Rd@ zTwFGI{pu#bS8xcF*cv%&y~Ua%qFnCdNX7Vt42PjR(E}e#B&?qXZk-5keS>|(^nkBN zHh&r~sM9WXW*NaQ1sz|qtg1}E_4Uc-mHZ7`FaEZ}-U>|tRYK5xvBe9kUD=$Sa>LyY za&D%DVwKbRn3gqukc_njE^ao3X_as@6)<&S<*lksjexK|!u*fF(pi3ugY2>@+sJXW^XVQu1z*J>A5!LzJQV_6()zp_CN!nj*!xije7w_0ukH0>*`~HD`Gr?D>T&vR0 z<-408yuv66kDT*vL{O~KYT(*qN*NiUCv2znzKS{tajtA@@mD}Ji2!gjD2+V+T?o(d z(E&jRXML=E7v~*1=w0KsbTx?sEm^2z)# zJ6sexq)d$Iw%CI&6%{N~s!0rj8dnyQL$=K1Q?6ElTL{G*rkpUvlsrrG+>LMX3d)P~ zK{XJ6;aSS4FEl5`5|!+iDZla7iypT@&Z8nF&p*viZ3lDNC;J_WKcX;xpPK>ag#pQujK3TbOmatY3I!#qo_iRYvFfmsXdyZx$hDVo=96iQ02e4)~zu z1;Z*iXOfssig}5KzZZ2yytBfVdh$I*;^L;rAvJKOB=~V4R{sQ1DhOb!g^tb?aXw?^ zuQNGy+W}|#oW6OCH*b2mr^s@m^i%oD@|kDmuhbiGjNwGFS#GfnFxwjYGtq1vxqXbh zJszNuSJgWlO&Nm^LQBeXz4uQ_V3J-IZX%Xm%YBQC`3ZvMw~Q|6w4w0l!L4Y3u_FSP z-4er$A8c>_e&(x-));fiW9cAJIOw$Pg*o%*flIEWX-l0p1Xd;2NkPoreMT%yO?PxA zDn-O^L(yqtlgC3x>bzHkVwe%{6)Y!Pin=!y)~m(Bit*Qd}={ zG02$X*8S6T!fD5Rdl0444V<2Vv&#TWfz6((%VpCmC6DaH-Z?S-sHw1vw3Z@%CQ_9F zBpFKhXOsKtcokQEANY=Ly2-HK|6uRUqoEArzu^%@w#iOnDk^0wOG+4$Bxyo+8rhj_ z5hG)!?E8dJlu44^WY3bZQ%LsR7(`iTEMqcD&)xH!_kGWKe(&%6-uIv9pXd3b(;v<0 zT=#un*Z2A^pGE3j-J$#8q8TiU@7@dBFW)=l%WOz3PiL|*x3XYcb_Cd=v^Q7&fl{?Vskf!pzFD_3p1bfe@Ccll%mGTcB2vsN@CsWltScrnr>b+I%Qqh_WpT0rq!FUoQRp} z{0sWLx)g2As@e;I;=V281;5~`4L2_rE#P@QvLFoEsj&+8hk5HZI@A9CCoHE=xZ3px z9j#8*`_A`RT97tQ_U)cZ^O!qKS&mpx)YCglygRDsv&{DN?TeoN=frrHw+=UhoB0ts zpS$DH-f{f*APa&N>>9XP*YsAZbYtxM+!a)#@x9&^`v$p??8k|?*CQdG_kl(jZUWj( ztOz^~?t~phR+Cf{$;mMr|ZWMnu5 zQs6hONaaO9b!0XCgzxS)OF5ykBU9DrLhg^zZ!u0SqI9nni7r3YU-AR3*VBTFbnLwI z``5184q9p3QLiw=b$C(yw6EZfP)LF({MeIOP05t}$*Hm?X+xZ(foyrj%#2#;X~3Vj zSjC8A5mKJc01}SY3uWj|y4%#G50M(CYKaZH^fvy8|MV67>h*?ztbioMUHk7{$gAi0 zM6eN<`H#eH7l&M`t%v6550TU2)bAAS@dX{RmF8`ZIJ733m z&DnvY16Awqx$lIx*vWkZ=6fB@-#BtFl(QgJTgb9G&1zIY>Rs)WnfRT$?eYMQ>*^O? zT@CtoB4;y6%yNEHpWbXt>P5VHMrBZQ%$`4FgO7Z~!4dgXISwrmW}4kA8evnZn)&^5 zEMs=Ms_Rk~6{HW+>(O5O(@dKM-eV#K+YXM*%Itu0Bd4GuURj6p=7_%uj+YxrQNexQ z`Km@uUGH9$#@q8>>^Oe_XC0LU{EjobH6PTI*#Y0wtn}{aGMVN<*;iXBfqVYEV?PJZ zJPeNQIw~tKB7Xngm9?KE%(Rm0sINZWyf^CW-O2)}<-myc#M-}^@l^!&1nt7Gy|j1( zwxfwV5V{;31n&>V&yzCajd~Lu~15nqv!&g zgoM=Egboj;RTHg+9uKNQJ)!L{8Zop`w+S9K8QVviM|@@cU;Vr!aoYOiN!IUxx9_|S zu798tCWRNdMvKh8eqcQ!9n8FW<1ATqAWp_~D1#XKRcWSV&bYtBe4 zmj?Gz9{&~&4jRA5E>({Ic#G~5jWi0YcX0`Hx_yy9W>Xt;PvaO;70}+iI0%$o;AJfqRUP=&okvF@X1pnT`e@Ms~p}Ta|MCN!swM*53x?k|pZr zPrh|}p~2Ys`kfzfP*vFHr_*M1E^u^M9&Gp4etB<80)QCfdC_v?3Ti>0d7Z>EP3>ME zTJ$%SQSwiD6WIUA^B@^lVxwQ=X?5wrl)W7CW7OEKCG#I8MJKU-fFm)Gt30Fi+5qv? zyOm66?Wa}`mV0ZRD>w-~)#&N}xR3LWeb29c=0vNu`~jR6JRc@T!aZYXllR+;s!Yf~ zqrOC*aICcJ5(;ppWlO#Sv_X+g-1&C}eQgjA&B_MOrVdI01M&y{KmIj$MgAkVA*|p( zav<)4X+QShuiyHHKZyATAsY<*Imx;L)HE-F!z%R!-EFmqWe5bYZb6fw>#ooPLtl8s z=z+}+Ff{$I85jTOH}?)_|EKaaoKm^ixuKaNd zjYJ+K&YP%ST1m4Xk8eH=Jfi^+J(A$CCJKPVX|l*I>&q?!+@+Q6EQU9wuDTpC{9NaZ zZF;xatrJanPdI`yV5aJ@(RfVA&}e|=3I}^=D##0)Vh}d+S50@WvB+wv^^$Kt*-WH{ z;Clvun{uO*3}4h}2MnDFT$=-NE+)4n>HVfo$ckJ-1+B;Wz=>1f8o zaTXW4_kjW>GgAG?5JO+p*4lIbXcDFOiC_GB_H(uj$ff7q9PV@f6u!eRF)mP`F(~jN zA%3dAYU(#yA?w?K$y`2acbKuG)|*q*>=n23$525!sJD}`@`TV~iah3?<8l|&4p~*005hsRFv9bGgakbpNcDTdI z`N@-0q~zcm6&>P79E}~7BwN*qfVg8FHsKvSK`iGyrDv%8jE-fl%RV*BI>@(PY%<)A zA32pbEwVu%n?NTvd#MSus3(iW*vn8)GB{!hc3JE%$g0qbgEJYJfj?CJP?>-=k1<1MAR_95IEOldP23E+7o~6jMz0i-_XL|;d^}Dn?&JbK&3{GNQMh|4=?{|dxgkcmXsB7`#U?t~w{{TH;$J#q@p;ED&3WbX^v_dgO|W2YObE3`R`CtQdIC2=P0 zNwK%1MbZObM~+)AirxKr#HMMRl9+n=UCYw=R>6imCAEDX+_EKxviKtBHds2n z?oTkne>^R3O&N(!&kWL3f_brA0BR%d$P?u$2(@HTX>SyBd zMmnpv>bC4Tth_l6V&$Yzl(g7n?@6uj}oy}k93CxCV82$VUvL25GD zD{&v+?>imL;(p>xHheIG7GMZh)s1U8xbRv{y!ZmIqk^0x<7CrAMel)aSz*xm9NZC> zBnnQOhQ>8(AZ)`5q8PGqg|H(9Pk7~v9(-HriDFRUDq1C9mF=Ur+QGU~hA~1c?il)Q z&+hIA;-gybz{PEYT!}E#)PC6_)F%+<{SZjVFBM5FR5q#8Jn7V;D)Qbm86*%+nku`i{bzl@`1#QIoE0KGwV z$1`=A5jvu@wE3;|ym{DRWZRMIu?(Js>Fi+12S*6?89$w#tV#(QSaIeZlK+EaHvXFr z^RNRFw7BvQIWCq5)me{RPL%g6iuQO@b?ze9-T)Kg;$|gG>ur`6ZJ=FRfTm5hv-lEE z9ltZYzGvb!r+Cm@Q5<{EUh?s~YX8@dkG+p`=~~eBu9?BK>M%^{F81j0r(%&hXVxBE zbdXZ?-FlJ@K4y#>%=Y&_-6>;$M4S0YE0%(;Zr(INM`Bv9LY?^_^WgRbNSw6B&|tGH zGK)NSe$`Axl&6{4#Hj7qUky$8UY z^Kb!$FwHuL(xN>%@!CPmsD9+bJtVR4`)P@N9?z6t;4kPj;QqMC07@n<_`3i6pL}d@ zJ>^7QLv_0p>d({_>>`JM7U%%GhywyC8+riFudW3c{} z~h{|{yS+7@8cfl zr8;k?7@Bsi{siWykZSFfF4&aJJ@Vbxk5}5E{5cL6=1z9IWcEyad4o5ZbKHK;T6auz z8DEF5+mRrXB~&w-YJrWH^i^_)w9?qgP@8zK(eD>7%^$$EKN`60N6jpo(|k zF2ZpDV#pmv);G*tFicd3pYWXW{tWgHdQ$JZ7zd-+%Lc1*+}Tqpyyu_uo?t+je?uhS zBOFJ0Q35fCnlEcvO);oL#vi-}Z=6nDpO!IF(~x_me=^Rvq`2^u_(cUhoiB9ze>`3{ zBH+SCv5G)REXeyxAu}C@%Xim8y)QC94jx}Uo6w*06Z6>FWb#5{-$V;Yuzfp#b<~tx z(!sjSEZ+4!@tgWx4a%yC zjg6;{6R#Qqjro0dYy7fdh6m>3Ay6>yRW~a=juL( zZ*pyxx!B~s*3Zl3EiF}%xHTVsmBajfwA?X+Lkb?MQTIR+SGB-TL5u@t6T!#f8ubpD zh08@cjS+1r)aE3`{QP!}6i=_C=1=?z^;I$@WpsO+qOU!>4qm8>{;+Bcoa9?==}m|s=gA#H;=7l7ss3pmFBzQhd@rz1@!CU0pOse0{yvTZM*C7=rsg%U0n z+m4@KeoZxE-xrMLBzUp%SFfIm_ipx*Uw7>N%pNVpHQ>Kyc8_!WF9=vC8o*G=;%XG@ zq8_GQq#5g1)dUXkXb)>oLyD5EW9H?li>#ycc??Y#JbSyq)t{!y5j8h+il-Ifm<)pRu< z>3m1>(Qd*m1(MVyktQcKNNPN2`h7fwFeTFsA(u6?Gju6aMn6s7|9TqL!3mUkx2(l= zRaaduK!I!gR#QNLKivR5HdRsi0w6j7$bm%Zxe2_iepuK~UAA58NnNT4^R4Z)-K3p? zJ3>63OTalv>{($R2<#~T2gr@XJ!vv5AhVa>cqX z!YI~Vl10?im-`DMoYkk@L(9n}Ic}A|Z75#qI=Duv#dI zJQqU^yh6`B9{KCo3ah?dj)4HPc*N%M>&jE+1{9RQMnuN}U*k3BE&It{S>-8eTHg(bCkYl~q*Op+s{Hb3K3<)G ztLayJF53XwuYbY!VNu|MJBRwyV1_UcDI@&0XMoN;;x54%}GJ z-S(y$U6Zx8Wh|r~BYxq5LE(DI@>hSlDQ#@vXJWrI>GRTqvc6!eJRO{x01mE^EIi%~ z@D3~nPGH&`=#FcecOHklputRrcR!q@q)9aSX}8aO(ph*0wZqJ(JAnDr4QBLDLiB8MN$l<@B zB`dFkLjVEzFDM=^)FesvZP6U)z(L?Vd_p%O`&G#f12^K;duC-5ub*DYIBE6HYUf|i z31AW}7!9-pY=-xve-El+!O8{_G0S>>!(ir<@nJ z64Kgm?1#4^szl>8FnuZ-PwDb73HBrhyES@Fv zd+hSsN`HWVNTI#naqz-t%MgM4!8`Za;J__GzJr^Dw*LijqWL|cqD=+`ozP^I_oK|V zg&Rlgq%=wTcGDf!t~?)QGsR^;nZF1pzX`pJwSm8fgV9{5Gc;HU;$Wp6!#zO@ z+V2#SJxI*(|Kk*l4I*Ys(;2A7*N`q>9N68RY(J}muZJ&N4Y`ZP z(%>v>Mk7w3H?-u=rSXBcd9kdEh7$NbC`}QZ1f)PZsz}Ke0i$Lp_*dnFPn=QNW^YQ^ zw<;&WKjK0364p@zir6Bg(>IcJiIUmrD-1_wof$Lh0_?B)kxdDKsov!`7s^)7alGJu z6O13#qyc#Bf_W_MI@B3+sI=lwunCqn)HnS1U;$7#`wmXfz)C* zcwFiCk>hP}UQ|f2M;8C{5b4*Rt`C)8hT9=iuWlc6oh;WH_>wmGlnp+Fk1TtV4dMPZ zrXy3Y(NOaxy(u{D1zQG5##H{rXNYPzaxq69*uyj)=O=Vs^wa|poN3~>IeCiTDE`>C ztxVwfIDpxkR!1Y~C*OgAO*TEw;&xwv#z8~bbNpTliO8jQQ=J1K} zHe$kG5Fc6{`2Z}=xJWr%PWX7I*x2r~%Jn|gp92CNDYvfW75aLC7yzIm9K{+W*79|4 zocE<`GY}1<>Wa{Ht4y)6gS{%g>n(Z$9?Lr)EZ&rSt%S~rnG@v010LXj^L-ou&HH)4 zMR(syQiFyWrecwgc0D%FHTwrcD&{Y_BD36VP!VtL+I(`0hO=lPOH*vC9J=JWCCn1Dm zI`T-W-L%IR1GWejcwppbQ2p3`Zg%!tm!Zq8=RuDj6Xh1`ZZi*81Fa&4NXF)>q_sC% zMj=h}{cANu;SbR(l5aOgg`Z}eWczxhm_Rndu>*(`8@j{qsil;ygf>mf+@e&&Z_+nJ zjcCg&GQV?1nWjHDl^=#_L^H&^i;$}_Y_L zbxb9&xO*4>f<)J>bPh9LJ=7F^S@lZD78!XEMV0ip{G*|=1#dMUyn$6AS8@wkU}>Tn5D1hV=vipGXPDZ`7B5kU#Cr6>a8F(%>(3D9H4 z!OAIx{r=z=B0gU|X1c0Q@VdC4Bpd!JShu0e(9Ee;w1@5m%v4FNM0ra4WWEftY5kR>@nCMhlCNSx@kRPAV;rw-ANZ=x?vL4G45Q zFO*!(cqr%}s{|xE^5s{|9^7Xa7hfO*suQQPsSn7w4s8U3l+f0a?;KlZmhz$$W6S@VuBj+SJ=_fXsb&_Td|FNRKGTEzjJm%HszaX52;5CTu zG2HEaGOeMQJKf8E@OQzI-$=gLIl0??JGe<17B__4NX;7=Z&jTzCP5^{=k5=e%L=sz zrYQa9t7*AE_f4fQF@9Q4{__!;-Q$GRfyp|PK`o$(eVBvXL1bH3@@`TTi|=P9-W6{; zuH957|L3)W1?rh$pHVBfkq=?)?c-(IEwjS<%U;xV&&c8xu|5&T7bJ{jHUMS5lrsDa zGBklV?8EDn*Hc^r)ZdPGN}WDGAC!DUMaN=fK4P1Cnvg@_W5CFV3mC$wz6lzdKbz3U ze2>Gu*v(~`xb;+HdD;4|pci^4g3D)eA{UAuD3jJ*6W-V*;mi-(052$V3=lk2X!{+t z(qLdR>L7oA?1_<9iJkQa#~q{apz@#Wvh2@up7JB67_N)TJb+?MKTt?Dc@`Ob@W`?~ zs^qgGYbdD7aX6M^yN`460dL`VrT%Mgi;Y%ax1tB(+r9)L!n)NMVK?5Ep$lAvikPpa z|CCJ~5pbp)esCZeQd_rPw4fZ`3?;MTD9T1nBTt~<)!N!0GW8+uSwlCH#D1>!>5BY0 z55$8)+90`Vp3tFuVihOMF!m%hniv|_Mb8=6Ua0J;+Pv_Y^TkzsDCc#=QA;JIgTO1r z-*v{6R(2QR{V@ztch+6iHYoK1fGGSO_7lCwxX8=}6!ATpnunW3k!|fAnYNES75gm9 zjk_gNi#slIawNJ0UKucjhvUdLxIb40fRWHd5s-N2@24jla-O(tW*Ow_Y#X?V9m3Hr zoJq>aqzkUux@8}-v$b{jMQ#`N5|K&17CUNj-|x^fkW`d25CLUM70NI!)eW`JWwLf0 zMjp6Zuzhe9c%Px&V*v`~24eDjF=pEh4HTbvru<*f?NlJeo=+uidjw&q$43aevPCc^ z05VV5m1IGC7$o3*ngD>-B^rU%$poIuctifc6u;caI;!y(bS@3(0MNzue3{DC_!-O; zVbOuGPABtp5`|Em4%fepw0_KU{F4Y-^NZ2T~YjDc$~%k&WZ$K2rSO$chxPx0EC+KnWTctq18#3Z5{(7 zEs$~OW!SZJ?z5W#%U4$A_gAaFUy%EzCR1&-pe1W}H*Yoy4J0wGK!XkU;1X?R!JpDN z-x|Nu;Wlh8+Wox5QfTFU`FP({le65EI|&nk@$sF; zQjP0t$Qqq|IxF`+Rdx7J(2BpizPj=Ja4J@wnJm!ABWjhRxX{e|fYDwd(a$q*4@#fEjW1T_c# zf==L50&yJZaR^|^i-7V0Dz2GrZ~;%-w<~egN!K@TsqtN(`YzASy<-@37LG0j=p3VDxT z^LcVQJ@h}ot|?Y5E<9i<2VQVzhL>V?L&uQkSlxC@7QTzRtf;jmcr@nI*7_D1yAZ=r zf^c}$U2Z+bS zG*IicZ89@au!0G_l{K`uY5DI731`Llir2#YMyWI3;;&V}Z!`9Q=%R{po76}GhJ|UA zlMbOKmfBstp&b%?(#D6Slfz8VyOkwHhHUB40PdX+a}FXf+yVV0w(+%Sbxx?JzdR;H zefc$yUR&r@Vx^AtuXY2Xm`xTvX!3)w^=Sa$xujSSj)HSsGAx{0 zHK8Kh-zZ7jc}~3QyW8?Yq8)!z>gaCqNb~WRizY^AeD!k#m`iEt*sqW&SU0h5WdlZf zE8j*CM02lFsae{jFVA!ALO@H19ffDmy7ikus|kY zs}URQ=EFWu)I^^qHD%Nt70yikmjC{>Ma#9X_Q{4a@w*Vgf0IIJl;Yf)Ijt=BZmfzy zRL=;UYz~#KiBy4$)vX6nxw{(J9LackR8A7}~=+eVLS1zXJC9 z1;QKU33yx9_(mw*9|4s{d9!7->o%r!1YaPkc|P7WH>u?uI?a9-6U}Qiiy>QKlX2uo zl=u*f&tqRw9VR^!lKBwUm*tu!|M|*NNL7f}HI>qcu`f8*(R8vhOPILcpO4VYC#2z# zd(kyP)(^+#EDn8_As#wm6fyYWq3y%JApfZJ2bF_QpPVfqSQx$^Ve-F^UuZsKvvwQ{ z7^!)(q})s_S8g}Q52js$u@+unZB5HN^K5&D0;k@unEe zJ9`sE6{v@G-!tQnw&Ymzi~+{wpq1T^tIQN_w3uGjUgeCl( zzP}n-kIu`YNsK_?B)??!5xJVQ)d!*(2EL0MVL!4Rpf}Uqlipxo_6IiR#<6v6+E50M zHx~%RBuNzCFWd>K>MJnqzj`|eDuj6$`WGayN+6p;c~)~S)n0zeT*l)~3U!??zQW5^ ze)0U#6=G5;DjDi5LI;k+;mdzPX(wsGbkGmOyf!&b!mmRXN(Q8W(XiIJMemz(8=DOM z;vRplpzsb}z-D%Q(~2QH&AJn@0AscS7=bN!V-@(uOUwqb?;^1k zH?XZ^3p|YSgmpnHUV1go_xPL%{)6&G(`7YN+m4>7hIGrIlYxihq)gB~4*I?U-iluq z6kgm;tdxIdkrFL_QOhy8h6a2Rj(otK@(4o~aP=Z^piC%HxacR|hBkEX2Dn)C`IB@t z)6Jc4e@J#TzSmZ$ly}vq zV)k6#$#xamXR@DEGVxm$*Q~i@W|}aXeXmS>$jW^g!Vp9+8^fkWc|s4_&H;92rvuiG zajn7_M@5?fUQ+lpreFLos2=Dm`HzAb0>ktCb>4+YEH!?7<2VtPGg|E}-t(ER7hS?shO z1&r)fTBv861%XG(K+iTGqP3Ike4j%PD^J@DEj7fiS&a-`HV$FnvLrn;o_*(d73}@a z_5S&X4NZMI{G}DaKc52Nkho#9Y74~!>3!f^*)`Tk$ zVOH&mA@6P}lVsa#r+8dnEj>eDPXtSq92_6UcoQcztVX;8-(FilW7TKZi#X0NeVH~Fi-zbbQL zAeycbHIC02r&A|?JP^@T&1}oQ=Bic)WU>H|hXwP)j7L{6N)Dp% zOZ%*&8x&{@ga=5aPA&Sz9{<@KlN*M;kKG97h^@N=4N_r)YIw0ySW>JJc-2-XUI5F* zxI!7r#v>GkzSq`nL)7!Ik`qVRuLY!XURimkzUjW}wz?y`;o|S;Qm+`$2K}Eg)c|3c z@X!f&q$#xcOcNsHa`TI(R>N0=1_+_kqN^4*6VHE$%05xwQ~saM|381I+wdvayl)#| z1}IN9>>!HU(A+IYp5SVy^QknaRB)An^p+MrmH(#<;))Ng^RBdD#v!i@to=Xy9{{4? zI+{LX*Bb1rST=%CP?eX-<1LZrJ*KzHwFd76@J-1!KzN)!drkhVGRM^25}uTvOG@LM zI@u|R-5n|c*uyUXS7nWMK14f#Q_IwMfgp*vJTzs~oOOdbcGI+?-1QB5OYXy~QR7t7 z<3mg1eMGV$?3w0l8Gxq)X6I$-!LoHFMZ24Wi3!+hpLCbTx2oSqF3EcRJGzXsB}Z@H z|5W2@YL|WELZx|$h;+=Bfv^<`%MjLQakEkC=2yCcY1hbZR0x0Pd)sM~(5KWFvoL?{ z87IehC9_*&YDt;zeH0rN6S=qjkXOfXvi!w0_eCb@Zw=6)09YF1g%<}tANO7YA@)TZ z%7}y*sm@uQgI>7y`6Cu(_Nx0^rC)0s3CY3s#_E@edu;B70Kbf1#Q|paJuH9&_$XUm z8^+>J3NG-vcxE(zj6jn67;OPQk@6+uO=)sLv?WJ4n8Rw1zql~>J_x{=y%S;7u%@#% zGfBYw=wsP}w~uet@2Q(LBt-A)LsjeHbKS7in^W&9+KR4#(k9#pAy(91%ojv`>5~wV zKzL>P?5DoA6;2#&Pkv=(x_6)^)aI?kw{+?I#0G+_Kk4Jkg5VKGFYrYsrzfzq`(nCs zO}-l=vf$V6;h$cBQAf@}%(vhlai3~t`?uC($i;}JEeBEYE=;|U$~l(idjcB)0Z+=> z-vFxO+sM#1DCh2U_S*~7$1P(xzE&F9S`h<6u94ARH>DIL0+~%g;F%3*p#RWzz|7LJA<4^Qsu8x2;8Rog*p;c% z$LvpIYShp!GRy;(bs!;mPH6}YLJ+D(8wK92WzBx9k>NZUT^E;!tlgED;X09X(Mc+x z+fp#KlSC40f|Ho&n-=ct#TvvN=ym9P8irfBSq?p@xze>I6x|fl`su6x$~P6)(VFYO zN&{L?L$40_O@s3>x1W$>7(y}gb&T`)NklsW!+IMR5wpfXKW2KUD7jBZB+CRIx|p0+)jQKP9?FEL{S|N|_#C zfAZhE17gsn2-+g6%lt3sL(m>w3Z9R<{C^39{GY!K{%?_#|F?HxQ}q{weaXP2`;HyP zF;E4Ij1u(!5P$sp<3C4s%Wo@F93|$&IZk%8iv2f-iR_5bM?WmdY`30Hcx>t=r z9`tz~?Bu~di@wSLtbytJNbY^oUrbE8KPZ2#~pVz|qHLZ3<=%zpoWWnM`s!&O!B@wX5{UZMQS^h8q5`Cr1h$Iu}J(KxLS>=({5BzH?&*gQM$e%W1Sl= zY`qY#CVv0MJrN7t7LX%1%MCOC>EB>8GJ^VQsOc0(_B(QUl(*zZ^hWkWdo$}Fxy5R;*`_~g?=#P0y!2ufAV4x3-|J?;5JVBJz(X6hOAgD>qIv2D#a3Q`Gw z7FdII-E4Gg*jRMt9rkj(+Za=PeXtwI?(kJ>8U{m;s`;e5uMeB|Ru8|6pAuoM`xV}R zJUdif$o>;Hjcvn`v(P<%K_Y?oa-0p`+rx|Z&QuR6TS@P zgq-utES*cXD8oTTL2uvolEP^PAwd}-d)t1`*GKqCl07HzlC_I6S3!`E1hUn@lnEg9 z;jKyyB!8J>sTebQ#Hq&0fE?Mn%3#W6eYgyu|K{V>xk z=$6r|hf!F1ULQMi5w61OC6e#J1<*r8&Rs&nC*(E}NTN&kO$`xebM}=)$J`>DDO%1M z`d!fD2LLbxJ`ZdvF@`~1om&ljL+Zk^qt1<#rlO4>IIBaCp|k2Gz#gw-R_O>Jp(K42 z7p-W42gdDn+~j9}S9U<*H^uc$#q#X_K-I5+H`W>D_R3A(%S+M1Z2bR_g|~;D-xw|U zCYa6WcR5!LW{B=HmoguN8IPN(G)~~(x0qQN_YKSGjss~dG`7jmO~17WVOG}n=?Y8E z=|(cwgtP^qK~`l|4U`KtR_g<#gv-ri&F5)u;-kUdCbnaq)|e_`Gc{l&!e(wC+zOdC zoQG`)P&ln=!Q^by#?j4PI~k1Pw5^e^2SuUis6h3!i-N>>siQ#8IbpV4Oguy1l?35g zlU5i>R#daQmN1#@PjB>?vRe7|k$@#mLRwPMKj1Y3;kyt4aCLVn0$jXmBVprI0}k^m z%NdIOhH3eNIQWOoiUI`ajww%UE!@pNk$rBYRLm&R{V<{Wr?CwPV3e3$)oB@DtYZk^ zfhEGL#o`!%a`Zg;dn6^#d2@!?7aOBPF}%p|U_Y>aA72&{;$1K~fC)VrKR0zb!_X%_ zR^yUR3-1rkZ9SkraFX&S2gVGit&YLb~bVyziyn5f6fLr$8f{$RHS4#rT zclK&!ei2i#aE7+8&s+>$XVfB2W+Yd3e+~Y%yJhVfZiZD^wd-Q5rHtG6ag?p1X%oabdfKU*Og<1slz5nR96_ue?@oe{*1Sqw zi)lmD1tWZZ;x~bBMgeMx&tKMYcS}a0E9@|>f=@m^dVq4Miwkoelp0v_6(z{)a3Och znXjRqV18O}$7Mk#VDHf0UStc-a4dW38qy>D{MY5Y++z>d9TUg{mtX%AM9Ubm0q|iF9edQ2L-ab#6)qe zq#ax%7qGaobQP2V#j=D1J?5o?Jc}@{e^}W#db=!XSMH~!sbBpqW46zw)4CiFCsrW0 zk&VdaukeApE8h0F&j1wr!F``R}w`BWGf;2z}35BLYHMtLqsvI5J_7a z#=4IgNtZwGa#U0AJ+u!mSB-|RJsn%-nfAad+8goys+8eR zELGt;h-ayyFqmTWIJCwM9|9OU8HI-8VzYL5cpTnU8mdOwoSAMpeQEhl!1EnJKUMh1 z_=Xf+mu5)SpAfv03+s*oHg(I0|rs zM_u*yT!>D)Ns)e8s{r#(6K@hOKWIMs z9eTL*rh(_#ERVX5(&y+KvxE@yXKapa|C-0je?i^@l8i?UBWO;PePft2d`JOkd*2=X z(ET<5A@t#~zMrn-&%}nx9<;mtRXi%)MK3oET{m+*XyWs1JCqw*c z8=V+{bU?m|k2+W`qhLEBqD#-yZjf0o54`$riW;v?%J{{HzKp-D#A)*NjgJJ=7zkCb zXh5jKO%S_S_j4S^2vn1^(*BJbR!3LBU58VjL33ae`mH;t+sq2Ir04##nGnE^ylH)A zg|045%lHcldC#8nVet#bNrZs|{IJmS3{lz{%CH434p5{x|IXIVqiSkG)y{qx2+!CUVNe27|#S~2{D;~Bjc_a(D83|D*_bcUb5|5pdVpct(yD+B1GmorsNmp z>(Bm$Sr}|+oO8LY#}^{qsTix%Ew%Ow9tEw%uJ=+>0=ls5pw zyr$pFuIS`tjp6i~WUjntV&QW)pchj<`)CBjGo}8MCj=-jo?8CQY;txB1T2$=SZnAw zh$z&0wL78J1o0lfjn11Qz;t+7KM0%{4-*ZuQ5F~(r=^ehaQlUW=Jbr+s}Cu`a`FMf zcOJ8~g0N2+z?~A_MO&nYQn5dpB>p9D%~4!W24?HOWEkOgV)b<)-oP7{&;m14$QoTb z+F9CZNUXhRq5uB;@H>YBog9~KY@vD|@Eb3b2$dL3kKrK?+gfK2)xSJVSGcVt zW-$iI;3(F=gdDi=5Qg4f?shn#*&1q*zqGBk#_eZ?52XX5;2%9>4Ecf^ancfJERqt1~W*jwhrhngfwc51`BVS-cg*Nl-s z#@d!E5C&sU4LO$vuuLDwrU0BR$g~pmiuC{(%kXfFjd)`_2M_Vz`Sl`Y;9Wn)22dtR zhLY@1M`_O&tJA(^-}te|6U*<!oCLYD_{uHTOs7vtO=ID=M1RIbh{ti zYnV51+tK5_&P0xNKL}$J8z-pXUwA_o1absvg3gZsPQ)0X*c18KKpUnzB2y)QCuqbo z+|{!_vBV3S=~}v>vZ4QA`fsc#{*(cuaWoftROe!yom*`)nGo-ztT5&(6X-uHnP7CO zbz0W-g!F354^Aq^6XER)Fd^R<^L=Sh@b8M?j*Z}c7X;$vu7Hc6fbm3lH~`8!h7xgK zXe2;9bB;G;h=i7D-2ZH62k_Q+x-0L5WW#P^{T}x0;?oHpzBKvZcF5tL97!e)Xcp3} zHJ4I35cQUJVVAYuJiKC4@EFN>0_q$qps5M{Mar zCNS-AE*X=<3eziVzv0SbLvJwz8MGeN@z4%o}*0U~S=lYrCt|1uI+|9Ko zaT33k_ZZ1scptI_5c4 z)i8aD={1UUMw!(~=IgdrWF%H7!ozdUkux{s>0s3TC|_xyExiKi$f~T zDFGrKhDpC#p6@&8Ef7lJ{H!r()w%e@jV|4fH z?l&Am24f(_*=L`9)?RDwx#pA?OZqB3a7ODibtqX_b;hUqOBalLZH2=76SUvNp}P|y zyQ7Kj{g+L423&X;0_V&VN z%`A`n+hXIpAG|bIKQ!8lAlf|0Ft|-SaJ5)Ba}|}OeNy1bRffJ=i`#)lFa&LX_FP~J zoV!V)Pc&fhwsN{}r-|IH+FF6FStg3i)_oiYW-bL@>AM7;e&43=h?e+5pMVRRcVuo< zz9cWgyw=b$^XSW9@g(uXdyK`$uH1cBBF^Bn(TSJpz=k748r8h!SHcA6{T}L9G^VuJ zM9!!2@*gkMe8HV_`<-m`IoRcg&4Bz~1tPhjmZk4}$>fR7nSiESf|}!tBR?n9351(d z**|48;dfC45pKZTm=83$SU#kHK4v{$HKf>0iaY#Su_FIw9ohV0<#VUlQJ`pbiDR!F z&;#ir_4K-bnn3Ns?1$ZK!x_q^CUqseH}>31Mi-*Cu$$J@1~eVzDs&aUN#clI$Fcbp zcYkDYGc*}?UnqY}Fgv8@cX27ic`ELQX*FHzjbI)+(n=_9F4~U1qBh<{B*18>%K1!B zXP(u$yfV??FG)Y)wpBY$ME=bykPunb%FvDYy0vWFZu*d6hOUnq{}wa*owX+YYjaCR z1&JATU&{jA$S5Gy$gwoDhJ> z5oXmVy}Si#f_7oE<9xX1vyfy0z+s}`Rj(2XT@|;h?U*WRN3ZI4SN8LS%x1PbKDz~9 z4n%F>Xw0Mq45W*3kR*OEzlr2W`KVqDTD?&->(}{Rbbs@fSQD7o5NSx<5euxR&y&7= zOldW!3And9Vz9g~aH|Ew45Q9u{i!9zKcx!tU#&OjyJ;sU`W_JV=6RC~SJD<*>nok> z=w&yPf|UFOq~4-I9BSrSeqkaIaH-s}ZD7nL>Db(AS&zDX=5u~z-%sQx@98)E)fHE5 zQMaq+z6vCMF;)=TaLxH=7#Fy#@=9OGD%%vrp9*yaQB5R-R-twt@b*3_#i_qN-$ zpbNVBp+P?1(soWp%f#mz7_Avhr|TY-5np|50oK$h+J~K{0{_?7{2sUW_dHO3T%St_ z(s4Oh#!~<8`5wP6si_eRMdS76ja}GFYzG_?%G-slHsP$l7Z0b+BQl;+EwJ`$Hh4V> z*We}^IzFtJTyN9hS0cZZIsN(cX)akGvpTy6CqWYXV1d5{$4+sF zTuMNn@U1P236sbhR`L?%_u}!qx31E~QiEvRrh25hw+8G$rJL*S;WHO1MPEWjXX~D3J!8Xo7f^fEUsZGK`gNjA4ck-okND{8~X$FdwO!=C>Pl;$dq@8Y_6e9AOL-uc9zMy#Y!_fx^GJ8*=+ zE3~nva4pj;OIus{TtCh0y*x2@UVKAc7@MerJ&7}8f)V;u*1dVF0$QqcdNgb~nGeL& zpFzr^Kh2hvyz`j2t>a4q@&+5P{n|`_Oax#ZarzzlXUSJ3%pQj&3(Ff%-5MQQw>)*S z{NdM!70OR8SvW1+!V-1B+t%UZ+~_~QH$t4*{8OpjU6%bpQhAyfcE26NO@Hv;9+dsm z=M?|E0Au3Emqo5Lv4IiqnpD%e&=#z7*j#`PgChOY>4*atRk?ums-3gGB|R(Wop?0uUuJ@A)+>mN$hd+*hsasrqqJ()g_LPT~64vI0j=sTuJY% z!D`#^9j$R!tM=;9?#rsmw!ZwOm(lU!T+W+5U>=8aN`TQmVA&tz^IEGLuqNcoqvcb` z#=EvATF~Ac=js`N;gjM4^#dkByfxYP3ejC${E4dU6tEm3iCJFSp?+BtUZv1PuiA8KrW?_@awk zQMuYE-}2bbaqW$rA^=t|iZT*2W9Ht{3Cbz7ZmLcMW;O6T)Ko^@j6ET06>64rA4H~P>3=sk z|LI;xuU2&Ha!iuMty5_Zyi~0-41A?}C^x}&)?=KUKug{%2qp|;gjsUq6T)z;jog?c zujl&qf8W`=RQA*^P`hPj#3Cy4X4t&W&76D*Cjr=I@p5&iJ+GZr`&AvQXdZv}nI*7W z&8Z>OwKc)s1HdpRkGRZZO{Ct+w1kIMy+$*r>VX-B@+lK>KL4DWG&Q=h=UBN%+(~C{ z8i8{WX53s7uEH`%C0}KQcghv5kv9G?w>ldztd>PsTKC8p^bs4wIL_ucA@bKPT|d0e zUp?Azuu)6l0i50M(k2X&nd_U7Ko9KjWf$qpOExyVHH4q+zgIi6DsbqYzWMMi&O&`3 z>C_NL3D3*FXW)>#n=Vr8nhyF+E+{NjEMNd;a*tH#7h@^tSyg>Phw<5_o9@K?nXebS z1QUgC>wXpJI62rl?{IABi`mlXwCCklPb9J$u#uQj%OwF~&t@6qFpuDedhAA&1NHQV zo0<=lKENE#B5U3KGGJvJqTj^d=&=%QsS4w8sidOO!^A%bl4LWwFlTOF?+a<`BF zlsI_Lr~mxYi6P}Mle7Cj`Xc6@!C`1QS|5fv;0nGZW`|>QUv2>kiK>YqSd7}t{l?3i zM#&axJBTwp?7V2XXyo%%BLj(&9>g|$wvTAlOV-dc4^Pc?NfS*+Wjj|t8nd$MD4m>q z7sF$A{-JA@SWsc%J{UdB5^qW2o1{5+Qa>Qc@g*}CC;%1=$)SBf3gMiGAje(UzQ&VU zrvpxUCkEhdS5_(pRxF`GO?@Hl(7SDgjGP7G4c@*dmt#E@pG>FV9xJ!E*Sm?gXz#-` zA4M}$tRcBMkEr_*FLj0_ zFpdxcEOQrq?T(BtJvH!nP}H4zWai9!zn5`hVOFA7qWR6~EEve4p1vZ_SUmNmtB}RIpOXr`9==LK`4;M$364 zxMmC=c=6^=C)vCye_k4Qt30vg+Y9;5nZ|`pbt33*iqM5dUHr)xO)yfyw055gmJB_^ z`UJvWy~pH+tC`o9m-jKEWj03Ya=wLU6!apLos;t4e%Zn%VToT$#v^Fqn1h%(cd(&# z?+ky!%{@X^SVnBTMc9>-6k;+LjB2C5sw4rOMZaq&!}q-7ViKNv7!LxLj@oZoTg0%- z=J9|__(?cFWN%5#%pZ`n&^&+ky;xmb*4@w$dN=!!GXhJf)gGGgFd3v;pZXR! zC~SjZ8j#4Mdlo#3-Y&M6l4CNYd*<~%=lwB7eA~KtAFM+!3KunvCSgM{Bg)sz3lS_P zW*#`inAcUNOy#x^ZdwTGBM;r%CjDRw+|og5bvHhaeYMmTFUmA69s@-X*P5}s6rq9u z1QeG0ssc~7wYPa~Akcq{Q@=c~S4bwLIQre|J^OjLE9OfeabW9EG~Mg}!ZlNj`27*3 zdUNZMiF@X|Yt0gQq$i_4hIx}&ZLO^@J=QUP;y@B#{fVEYaOr{0JI5mSvU!cF1Oa8% zgEp>eik;3^{e`ltqorsiicU+GJgQ+ZUDg4T`|a!0dY~n> zfB;6r4Rcg;1F?!xZx2>0V`B1E3z;JA7Aa{frEum>h5`YQ4Nygpz}D&=o&VcLr+F_F zb_4D3=&@)zttWwUw=s1yff|c(Q4m4T;)o3Zg*}|_C%1uRw+pOAjlQ>_o;Z3;cmcO!~t-kC+%@M+cr*2GfR4V%lvj=cHnl!8Een$yCprP#F{) zaVC7@^6y_6mwgkN*E8F7gYZ$N?Q60@vG402A19@YIKRWW(UN|ec#dFiOk~q3oRQ}F z{u?KZ!~?&c;!_`eZ6JOiKRe|ntmF&FrYoe5L18D}D)(yY2|9(XR2gP?T&{^YA|xVh z?1;KEecG+ZLtx|jeR`xJlGX-#DS+zQm9jFZ-``s_<2E@d5MvYmb!IA4AiKIc#fL3^ zUNJLtlu)viN|uB;HjRnGnZm@Wh|8niXOn(RROWNp)R`VAEM!{6CrI@qNC`+JwWV#{ zFwbOvUMJP7;WI95tn^ya`&L5X&1h*c{X=JjJwb?vT`@flqYr`=NM|+OS^t;r-ljuf zQXbj0-yrh_T+F=QZavd-xJF=FHQP;aqZ3xzR~3juKE@KQIHFYT4pK9eaS>0aF$=a9 zhqCXpRZsXxC2u~jxOtA5@`A1*MObF@%cr{~3=P@B=Zlz5DA4vdJIG=xI%BK2EPJr+ zC(dVQOlFl;+GmcnJrv#a-o zj~;XNzT^8D_VuD8Ex&*J`2VzU{a_TstC+tyZ#e3t9m}z26y1!D=?bAF;PXb^p z2Vf<=r|fC_^GKpXuaF!R!vPPunmbz-mnOAm%_9d{$?g=?&LLox%<`MiWHX<#=Bcwn zD=`>O$)O^%V3eHbCmVkHvbv1VheSj72Y2c+CX#uHC3tu%HUxd38o1}Nv9q!0Rc|-e zo>7nug*l|@_VkEfcbH0@<1pNY5l-3LVEe~c1F$|^9dTuk;!%Ig+uietgS$Vy-p zzm^AfWQHryn=MTRn%MW!$z?Lh=GuF5ppR-Z)@?Q}u$QcWX_nU(ME7NC4A7*Yh_+F* z66r{EujEtJMF)G<54iz-63QQ!gEB&Ug3xYt^zi&4Q#xcU$QnSFJ3u)JExZV@C8@Pl zk$6t-D@?1c5;P03Nsqj>maTBO?$Hqmx~E~c7w84vQ=k4{M`DWRZ^Q)#4-Y}g1rmSk zJ&!2TqP64O0$XJ6>&1O8a!EfdQoGsZA8Geap1X0E@eH!|i7DeFa4IDQpnw&8cpS0j zU1@UZz@XB{IsZ{#g%35{oWq~p19@&(GQZ$J0w2eO*ZL#* zFAM}EZAFaDtupR(iHTl``1F~JV?Hk)GZ$@%aIdX}Tu3U~9ZMHgC#r(iI3F<9hFsLx zI#4oz3jjXc-%`(lup$l79)yY>fzn@DHB)pywxIGT3`wUE)>Kn!66U5yIHp`BrARHz z!$YOl*H%CK?U0Ah(N(;}n>+0X_bAKy9xzl??>PX2JD8n@OQFXx6`=AZ*bw76!c|43 zM0uUPH3M~)1&5|{dKm8JCB2u346;5=F27^S>Xq1zZiAP3mn`|e@XP#&Yw@be2V?^Y=hUt@< z?ItQknahk}j!bpF2YcLEYMlTCYx?{r0c+jb)a8!lJz<}pFE21|WCEYWHPmJam>ZXXqtsk2JwzKD|K-$XQH4f& zg0BTpuD57G8m6_`zM$<06B^Lzvtacv>3fZX#7f%Fzf~Ng==M8S5F}D+6uWj|=njAm zC5*0L(Se~41)KnXR1QL19Fp7Mh=CuF_n!0{zq)j<;moasnxrC6iN_ii-+i)FPafAw zm^`K3(sQA-dSHFbVq)N^%!o&N2+nQ zHr#w`vKd9qM8g4hl3fx)k$BztdI(JZZk{fO;^#+}CGQzz%L*{Dh!?QG$x&QT7oT

N$X;8ZR(6lUN=89-&%i6wo%dox|#glkn3a5KZpVdQCsFg%d z)-wrvcq%->^@dB(w|zexB`;_0w<_1uz0`{)n4K1uYV`<5GeGC&$Z)yi%D&@4` z$7W#qQ=PKQOIN4IRzEITZK>cf)e1{>Ze*JP*$N1Sh>{>ySp9h9nrJIo+GtK}SJo8e zme73i=7XPS2;H~bKqPop%%DZ)(Jt&qCFV;V0Qip~@b57j)`-=qUD!%8dIPL>FjeJ@ zKuBGmnxcKQi)2pjG?^#AUvjLd403sBqAxg??{66RYOZdKIXJ9i-q^1LM*s;t1EHE) z+;sRmFr6Ij9Pl$>C~PJx zcD0oItA_kttM!Att7?R!U?k;3IA_dn$`Y-Jwl4#2jprmQRI*)k=MC@G)WlDT>B~Pl zJ}G+USnbFC>RnV!R*+(V#)~mOo7M?rxN`2eLymQ`)1J(Jn-_76@TL4W9+5N5gG~|? z1WBQ_*Y<;j-H}1}_3@0;j^`V~UOJijO}#8X)$Vi8lyQLr7>P+RM$iN)ru|xh3o9a0 zF_qK%zPK+8@*9$mT{GhEWqLO86`6Q#pY!GcXu_C@aq~WSC!4`ZKlUL%vQny5B_OrX(sggsTbfj= z!{io*i?X?MN;?d!mffB`y1?%_(fxfP$SR)&>EC}E{_!(7!qY)Sq4KvaX1OY(WD(z9 zk55U=ZhZ&&)%lWYfV6Nxl9tU0A?U+{6wd`)^M%eCv4JlJ1av?1#3Ip1U@D2l!9`%& zCRs_p=ebBw5Nbm#8n)0R=4Y|c3HEFg0K}cCd`3B!JG0n7bIiZ!_SPLOnd3%1wH-Eh zY+Kbk^sFgeAYRWsWg@EvIFv%oMG!&DNHt;akWWgP%c~(K_bg}DBJpd6TlT(mXIG7V zJs@^ar3FJK_6N6 z!5q{a5`L)g&{05@EDj<{aZ?@-j!Rq8Mkg;PsEhsatyLr0z?NQ3v5wB6&O@T%P4A&$ zu+lz4feY{uZBa;y_~44k9xLYw>}KxJnsvt6zzYjqe&8(k+GgbD(4t zrbDXIhT-M2!5G(-2$wmJgC_Fn-u8%zO2UQlE3YcCE|*qoID{TXiNBu?I>TDnx|k+S zzm5MbVn$*o>`b9&xfrK!RNpbDwd$R1o6T>NA1J6zo6T#~i~votJVm?=vc!|Oz3q9{ zY^P@p4@MQc=ZQbqcC``9-Dtmiy&4%)_nBTLpM_)Onv%(iM1{GCU;qGz*E_Y$ zMwDHww|IW*QP16Z!+Zf_xAQu zc9N%8#%bLWY2NzptZLq$wwl-Z^3gN%MDT{npL$LIng8@Z)z2)~q5wjs2VI)S1Y;_F zBM`18bcS-3XtB(h1p+LEuYTkyx3k9g^0vtCyn?HYXQFBGKi|_d0(glg1bX72C4^j< z#Hg7J4Jv+!4u4=6)|cu@uYSF}!-P>d)?&BCIOgu15$ZFzt#`0)MNgu^< zb^5!XsQEBpNV7Pcr{lM5Stp_Hq)ck;qi^f

)hLN?a)HzWg201zY0|-KnVIqY*<(c9qd4`sEh%XzGNpIO?Np5hv_fZ z&dzGNpW5I2BPSj;=cQGCS<;)Bxhcf;s%mPZUOKBWJ0IZR|1N*@|Nh_0cTFo!eYrR) z*i_}uj=kX=Zcr>QVf8YK|Fvcv^9x^z`5>wK`l`~Zw4I$>HPyfd^y;nak&zF9J1tC_ zULq499^_46wG)Y(dpTQe8`0Vqo`h+O?r>3#Q~KWF6fAf6QF@$CET?~n!2UHJ4fVZe z9J)HoY16YrGns@q(^>RKY(;xjdq+g!HOb`V*ZUpohPxg~SCvQYBQeCo*9>5^L8SYWmrPOJ% zRmJy~LtH4ze9OLUM*wfawuojUHYMQM*tCi?&sEfvR$n|u2pLg{Rt#m%X3h>XJp~iC zpz>JuXWsb}bNGL%m-9dA{^%V0Xxf)Zv@19(J`8CUo3L86^Or@xJMeEp3cr~n{lmT} zuc>bl9wm`rgKzWTfD~G^g$7k#yV)BEh9=D_*NFzbi?9?-}Q07I$7v@W7SmiH+Pzd~MK0cs|rD>Y$_oO9L0 zkB@p^xO`66ylYSuBe9L5^|}L=9ormshkqTM0Wd^>N)i+%6*M@oV4;O7aA0PAF%+K! zC{UpTw{xHo5bgq}cVVOnS}33q?jxE|SwP#)o^zm~uOE=6)j}}ekpR9Ra=~dw0DZgf z51&Ke*Kq(=`F@tTMco2OS|@6U8+3jNH6zv)7Qx=i1olpDJ<6dOCcwGCm;jc8J_bsI z(H{KagCPHp7@z=Z&`Xxq*{$i>U6@G8cN5wH4+e1KIKb4HlR!|6;KYYObSI3809`qt zYM6JX-v)Gp-+wUsclV2XiGa>Df`Of-ff^+U6h0(n%&%$sHBG-((;wcQUoYLS*z_xe z|Jvz(B?Q0nreAr}uk`X)7XGVP`Bl^XDt&(;1iye3pI-^VuY}+qoe+E#Ux=XaOZ<-twHj`azdrWRS^McOiDef*$qy@G*=wg@0j1AV8HQt1S!WOe6qybSrl{~N0`I`XFZ#C9v>0Zx`8s4p5% zxC6env$b9v=jk@Gka2?}Gr#O7_s|gCc?Om)^+VSc`crU38@9c37H=T~FP=`#lv558 zW_<_kokK~q_p~aq!W)V>WHzs!1U~>NoF5iX(6snzT>Z>aU5akukQ4o?X!2KnWZCFa zp17XUIG&gDGMaw2$iJeCIN*DS^6}}yG5NeN0O!?iXaSPE7Zeag zH#p#Oo9)6liitQXS4iSFFmu%$v?B>iT578_S?z{Pb=wKQAK4J5^=G33 zQ0mTF1KfUqIj^dqpJQ4N(z?J683X{(J7f$2rTxiO{xVXlK%YFXH8>4!i^uFp@?#-Y zaD~MDKa89T^f`Wiv&w&RnNs3x4+I+EjK6(F{HM*TGUf&zmrA;^F_F>t0Rsj4hJiVM zVuzWVK+tpn2KzT-f4#myI|v+xz%(1;ODKGR7V;Yu|A&W1Yi-3S%(wom(!@Rm0R7Gi zpfvPLHv%$PC595G_xr(HE_PBB!2vRu>C{#vB=-;;3}pZDLez+G8nQiN)YTWE2o3~( z|G2@q!QTwNWH14;hmRv@Q3~N;(KG%9>;J=L$Q*1GTntC?&@$Q{(2jopyy3qeJTmVO zOXv?**%TGp#_+*^trxsyE+~HxlAj``Co-gi9c>Rze3RezsdjCY?Y)0f&;M!zXDL@xvUA3))H38r}HAQ zvA!f+EKqf3Z~Sm}J>SgTr$LiZYO477yQrOgf3{=)+DLzGq`wlrUkTr@!sI`r-22ys zNyjcs04NEf#eeW|HP0zT2--#5`+Pgy^liHNWusb;Bz1z)_!k3p5#}oYy(KLxkTeF! z^%smAEtSI_J9`3c?VNWC6q)kVR;myw^fJl{XyGeh>zhJ)5?A)@V&+6+5U zH2B5Tq*HfFt6^1@-|AhTO0xn1Ez-DG?XAEto*lxAn#=SD!!Z_nL@4NOMEXwh0SyD+gP zuwv|d01_dGx?dXb`=9*d=zsr6s^R~FYasx@1RYDIWTwVoe)buFM<)GxM+)@wd>*86 z0pHH5R{#tNEBR&*tlEJ!X72p#&e{NGJ^C0e3dpa)w?V&jC~i~E1-En9nI5zZ{4J3a z@vLMLII=#@0)NS=1<^f#du2^?#JM51FBr#wUN7u^pr3Ss_RRUO3Rb_q|Ko(!_VoVM zuA)@-ubsf_zfqd$c87iinSU4``FF3(KjU=~N*R=QgcGSlwco*uR zIIF6w!xnU^f)B$_JWraud*8eBZQxHL7Eg$10lk&{kVEdYVIT@0cXHAs-ajNt(#EgF z<9g$sv5$<#$={Vt>2!Gh=8JJnh3o=!O3d#e$*hpxwzcJY5Awq(A#WFU)Sw@;bOI0m z;({EM`@4=Vzp|1)&r1HI^YVAHn&Dpo=b!P#|8Kh|nQhR45K@5YTJ)=-HLhc+V$rxP z%vdMQ2!U6i##npMBCTONj?vP8k-PY-(h0{`)aKwW>`Bgd+@=6A0T@Itrr`c0h5297 z#Pz?W+3epp&I+f0(I|Ptf`GP7I=3yTe~IIm-H~767UhChjy?6@!;M#uMHnl+#%$n z^RledvnRLS82Iw&eB5`ZPW@|B763TfNbslt%{eO9T3eIs5TVjd+{8p_etGp)$o@;} zQ>*%C^Se5wN_a_cM=3myH>E0uYz$N9Z?P$rnfEX5#Fl;*_EfS_zV#ry^DQi}Q^zxN z50J?;iPjd0XveWv{X}p&uO+?qa!~3$=uLhRgP#J9L-8OP*a1Q z$Hf523%2x9>;1(JA65%Dobjgz%Hu=B4vC%|4O&DJ&1T0+uBPeBX&;&B==WCRv)t_V z?Cc)2$*P$%f(16{1YmP$;CQjzqM>m7dzxNbuhI{)X`1E(ztoS@66K}m&pajlCbgUA z{np8l_%#kQFXE2By-tvyv3dP$R`X^EgMxUq(w#ykWx6#dLJZlUoh%c;+Wd%t{qy?Mk@T{suNC`p0EP4G36QjI1KAR4wS~MEuxt~~^)u<$ zy$xN~zdl}Cv+0z*(;c5wQC?q}e>viCu$KI6dKolH)(2;yz@gDuA>w{St3ni+V<1R7WZxW<4&*M@Uq;3+4d*K zN$>PGKTn!O+>4pUAR8l$2bITe)z#P4dPg5T6lT~Z5#M$!D_=579d>JQMa4+dWZ>J# zin}=ri?j9o)#;$P!#Xn`ZC;pWOYB&FQy?5ByP>-?<*AvpBYu{x7;yJg8!O^SiIa;5 zJiQ4OMUaSBA5{zn&#dbON3k|HdH})DbkcQaIf|Ite%vqVTPunlDdhKxQ&-+Fvb#qD zCH!o4^67Zc%8+I4=-L?|o%RA+Ax6xhYe+}F&38r-0#x`)JaTihudTH8vP=o=S+XF% z9M#w;83!kv9(`lqXwjL;fPIdGreT4>I+m67HBD9FoBeI2*TlMn;$!2Lasto1>Enb_ zTbnrg6|@ZJdyOY`2b9;>MfdyKthGKDPK{rz&=oP^KuM=vW+pvAmdXxrAP`bvs_n!Wofj@F#|b?shf`l#>IrS+~Q9=Fbc1~;L!gcyqW!3 z-A@1S0D5UYh`B=K>U}%8U0BH}sa=?UR>^nlCScG%Hh~NQe_8sY$2+I2C)gVkU9O{mRfG2gX{4j+}%5j$Cvw?LDR{GmL!A@0<>E`QN1B09sW4s2O&%_Un93|9mls~Np%>GNU|L>TpXQ3#|gBZ^c4S~b@ z3<Q{HWP@pm(eVgD-EP`5cWbXQT{RBO|HtI#ABK3#<8gR;G6N%sShp?juEa* znVe?xV+3Y(nmr>`0gwIn0ncVf2-?zpb~*G5-9vWNaqWK?il#>|-`df-vcl4=WRvH0B7R z$sBl{wb<}I0u;==43`B#)+t^{#)Ym`N3x&G@d`~cUXA(go91BNwY-Ojxhgc{P*tRy zmOt?$`RriMof2>Rf+Ja^5YO7S&CPMx-8*eNd;DH-Om@peLB1sTyIH;fN&AJ828H?_?G=+wMItYA}yYLN^6bB$9~@Q8*4 zS*OkC2fZ3So3zxa;1?W@S-6vpphsk{3?woS4;I9BCI~ir;x%PNtOG@7jr_TmX|#D3 zKY5PvY@?UuQm~Z6mI6MeXG)R)F(hQ%?=mWm0m1BHqsMx7O0`IED!GqgGUjg3LjGF9 zND$&~ehCnH#5tRUgCUi)Lg>R3l?MMJtyT|jx0Bnxs=mhxds(}Z)L`#Ia+8C*%Zibk znbg82VRW}P_aMcR#6D^I*2oTDGxk|&#Cz&2-~?CO*uLY*8YU7 zrGqje)R*6)Zr(7%MeegWwXNa_{Vt5YBnRO%3mxlxw-P&Ztel95u59SrgA#nxKRK>4 z6y@!pJdjZ!P`t!9%wbcg?BILue7prVWQu=jE$dM+Grq>yvMd=Vk7^ za*F=Q_iW_&QsK42M|Iav3`GxJK5-LZ}VO3`B9BylBVyt32EDwn_1KmYgq5Rh?;j*N}<%S3tN8ViuQp%-r(!3Wj|fl_AUoh zI2M{zlQv3*u)uSo5JHemA(xHW@U&-Sx2%Guf#slR+WQ(4rQ`b2Cew*5hZh?T1<|bs z{*&wV|6MKq{~^M8|IC#dA`Jt{u27ywgkqL1ft5Qzo|vVk<8AZDx@d#qsxNvv(OMIAo?M1!$7e+E6Q08~J7GS5))EI9MMe!Rb!K$^9Py(% z9`eBJ-!P3#Gm0+Ee+N4q1Yk&$8pI}^yD1i(?-p{InT3qMg6c|zT6{{Lf zCS-PQJI2{}*WT$`T{h2?y(_bGi24LA={gHqJe?FGfaRL^H!fG;gT~pAc;CQ_>G%hT z@b*)gNJaDtS{wu#Bi-gE#M0R8+_6c<{|5nG288`AF;}nOr&z@9iTvkx=sp!XVkkn)VUHx^Yx5 z^v%YJ+%cPQ8I;6GL(_PH@#~&Y7V*OxZThM~AI7PygSfc_c!jd|0VDoP!zz-F`5c>Yh!20tOD=9(m1W(5+O*)qCPiFh%9UOyQ%GvW>|WdAEB~+ zV0p~=uCKj%$q>g<0wjl{tk(mLLM$tWbdPQ|A;h~R5|EFL5+)UB2dI}WrI1@m(>Cq- zISyIX!^$yb<$i$At-Y+nYbFTsYz+m1Z)|%RSb@K4Acht-46(1cQNvM{(vzF-%vF_ngo_N8vpS%m(1iv0) zP2nQWHk)t;oQ961rinJ-g_t&^LLL;z7p=Gv4)mNXP4&uYvMxItdeq}dF}vkz_NE@S zz}sYOWr6+Wysi8Uf(JrV;l@LUqGH8?%9-YX@uRYEWVqe2d7 z%Lg1CZsH9%NG#5Mbqy+>t|b4Q)^8EjLTv ztE#zaC(I`Lt%KJMuP>_OTIu-{M^&rYg;2u6!h)1?aMPx=9@+^=VGi835fpdhNaAZ~ zcBy~D>RLztwMnZ90ru@HrSAtDpN*Y9Y-T_ngBK0aK{X^N8j}K9#ZL&2jBP|^|Fn|^ zZ(8e)e0ILgo6+hxZX*{riTA>CX-TL^hjw5uXcwv#KvuDWN^FT$Un$ zm+Z(k2|;TQM1gw2u>^RriRDp}6~KDi+*btx#BaoAnKdkpIgaGifndTpq}K)TYNc3a z9vvdA8x+5MpTuGl>6CKwjrO8WCZw7!1qhiefJ z$y251gWkOpotbLlK3d1SGnrm+H1|PLHA{>{%grYc3PUGrCiWBUF%NZ zQ{BSuEm^bAaz_kKH|*Y8nJjf7r4_P1A(a95 zA*cEM6iKq4v*Emrrh!&^m-Yu`g6ph^*FnyfrR_4^n%SIdFfpf37 zC2UUVw%BT0#)du8QPw@;AaR_n^7Adu%nqCY4K#Z$rak8ULcR3K;f>~L_iK?>mN-TWl&;1 zFw#T|hO`*k=Nd6c#tj<7KdjAR5Bb|4oSfAl>;Pgiy9+fH^ZgbHLu0hUtnLly1!%(s zfE~olk5cb{pWRXVfqQWQ_A+;o=pyLwD*5)+m*wH=2kQ1lcf33!0Xq@gw+ENTG0`_a z+J>3T+pMmlKBo!%Fi&8*`oqbvw1(AU#GuGGu);jUGIc+n?pd$MM{ab_DyYg+{xj#X zPMztMOVfis>V4HHsD=9MHh_>`W8-}K(H|u{+pOjr72!&~l4A#AuxXS?-`i3enq|*T z8CUjYfHC?}pS>i8IM-(u6i=fvO}ShPyoB{WPWDLRQu+(sKa0B`x^r!#qzBIM6A5_x zbLsGEB<1kVt30`_h=ux^7&HAI9k)Uke)}z7ZL^zMR>?8N2IFE%?h`f$OUx}yv)eB0 zTka^00RnyEF(v8RGPHJpft18+OCtpXE)xUNHY-y|6D+AimFgysIURK-_kKV%`+O7l zR&oJG%SAz{kl{Q>OucWsw+T}KPs*Z}&O)suaobQ--m#{xHrg^;?Vw`#@!~Cp8)~=0 zBt|!1;>Swnh_q+>3KbuSypcg@;_e?{{LGC_*ZMrV#sTj4WxN`-;!4K3gXhoWn1}J9Tjh_$^2=ez5v-@pEwUGHM4~!uxpB z6XH-y&}%>1$dqF+-+!+r`!edX8q)O|Z@Rz0%zg$nQ{DTY7_0u1B$fYBGShV1Ze$>A z(5zSqpRifrDCd{OXhK=%4@*$d|tb5thjd z-PpV4>Ior@YX(OavpJP}+=J<#ur?deC)SSU^#8$a3;rjJT+9h%HI|Yqr2~R+UnnLy z7jv=lzv{;6C?GyGI|n$unWi`qOteS#MNaCXZ!x*+kjoW%}8g3-ee_oh|v2SR?xmmcvYY)^q@}X=xH7 zswR8ku`G)-Jb^a{MpjoxjVr>tvS(QB>b+E<(|u+9OkM>BM93zp)o5E^;)nM z9G!iv(9gMRi&<8v0&0QF-sjH*eRA!UQjg!AJdhICfB)zdjG2dHQFCrI?lY81OlU@O z9vM4Al8*s6?;CsO@@bo#a%tfOl;S}`G{qLEnusB&e4u6sUD<^Npf)|`u&wq)U%XUk z6JLh@PsWy=dwlTQivFUQqz2#Z2cO3?d)}4}D$`NI(cOrO>JqYPfa3s--=(JDm5qLa zf4*%s%Nct*q)PU=to!Iq=<@15T=3;H?P3n?Y1#} zUw{3S_I01i6Lzmtll8v^+|iSf%7#6#oX0hLY#WBZ1l>Vf(U^6I4Rj)=*}f8$p|=UV z=npcD=lW%JyXd(kSx>hxZL$7f9QwrAHA}qUF^Q;R;$NI8pp?XQi%E3uEU#n7g=Fes>KlxMLJ(Z2i5oSNQg0lSzkn9Qs2*`!x-XcFmG8O5Ja%GuEfDSaYS8?=(OpQHn?B_e_g#?wyU7a zs2tusamL1wtuY*NPU3FyE(|Fb$c{0>%;jQNZ(+C*KU1FV!tx9+tis3XX-pukEzfJO zhH}tiKnUJg$hfwYd~g5_(0MqUkcU!WaR6a_%g5{a=bLXI(3r1+Bvg-df>!5(-MLr! zf}_P`jAc{4f%=+q)vExiUbaC*Wb!^UB1Rik*k0?V;{(RAUib5rx?;m%98W`Vjc^fA z%Jhw|*-|qbP3ABx0onui8XDM+{jfbU-_fn|Hhgvev$-256HcD}_(I+3$Z7rCUz<*Y z*d?k@}RiFxBaVm%qP86Sk8N6aN?i$Dc)36aPH${c)tzE=IpwuXk)b^CU@AE12d ztFbo;E@qbg2FRehr?sD>n*(lxtcQ#CX>$S`6!spjYJhW0y`6rGn~)4qO&+|lrj??5 zBLP31a4lYD3Pnt(F~1}`Q4EOiI5~_Hc!hS_Xd+fiS&bteOH=Ls;#143gzV%y{Vx*O zKZKs(qd#<%m2M{&{%&R52EUnE{{Rwd5tOVrbkQVltnHQ^R#QLydFGcWskfL@pg_C~ ze~8(qeK5d`I2(m#644$sA=&1(rTUz_Rra>(?ev>ymQLYYZ)C*Yd zn^6)+xN@C``5j4vw67me9KSQpDqQyd)S0i18~_A;j&RCg*>s2UioRo68s+kSoWz7} zq{pDr1Gzc`UZlxr*lCC-9%hY?rL!>Kf9QahT{~GE)Ac6c@Gh*(1ni~*>V+N?ZG6;J zZH2u82x8>Vw}_t|t}x1Z@SqVCCCH5=Wd~t7+K^0(+DGGCCJj&y!?)#DLXYUxvDNqgBB^%6%j%z>IWrs+8+g=A-Vn-EUG4 zVc(Tfe(vml!EVwaDlvc-f%t7mf$KLs`+eI%FmL(&g%9d)VHK?8jxcL#RoO zbZ+E(w9%cdIGV<_oO)A!!Ohq77jD`l%t)w?=#wAHqU!V*wJ$rIVR#5ymI;d4*Pw_^ zFDU!vc#^zAqr#h3QO$<&Zk|A>i0%@kQRh9cB#RbCVnMvwP z-@D(fvSBo_duPq43Anjz3p+aENYQ2-oW^yq@sx5{dCf_SA_)|KdOV9*7f)zBLsaHN z-ibh)-oZ$nfeIfgq+}R^Fhl&&3FX@)w-qs_6;myYotML zMDNLw$*c3{A`;{ErJg$-EXle@W-&U}GHE!taA0D*?NM7$5+5)jD>gQP(e=Wvf#X&B z?XwUbkBh>T@)Q0Kd+#09WSgxI2SJctq)7`>Rhl%BA_0{qDvChpK@p`0sC0=5f`Al3 zKtxapf=DOy4xtxOklsru(jlQ4Na6Rq^R2VKGrsScHD}GtnK^U#Ll~mJBjZOmKP6gT zF6|4s0zzp6cScb<>tqSRSairFQ^ml}H@z0V`20jyB{N!n-}&nJJG!sOYp$~?GR5nj zU$fmJ-X*|VC`tg_iu>BvKkV?xn_4<9cD5-_dO6+F@dk^(Z?@FBcylKOb*gHzQrtWrKT;O;R9j`d2Q14IB6tZj6s^M2#3) z_mh|($%K5&vl(5I^P!TGDXs0XS4?BMQS~wM?40|TSHr^8IQQN2zH8R3B#yYLI>aN0R<-0050zmdPfX)0be$xg{V0~t6ev&R z%qpjTzi=c#O>Sgsx0^r(bgGw4zzx~l&THVmCJ~QhFRe9y9bjV;8+)p~i_?kcnt zZbC@Jx(A_HcTi!;%CY7p*J#C)mQo@+g>}6mU9|%d_qa%(NfNy!?)1n8Z4LR4@FN3a z14`Yr_(Ol_k&e6UCKI5(eEJC5tk7-_onC=>PRBz}VN)u-L8gjEZ2T)sd0OM9+!#@{Ob<<{({qeoPL=09O@zjSB5^pM&oyO)Tn zcl_?$jqIrS)O(rN&Yu5S9wrb|r}dwf!i!+UhM4-N~G? zWk1u0EAb zCSOQ~&zdKXwI^?1zoFwU0ROTWY#?Mu=fRe(DziWD_Z#g)ewlw?p((}LEc`mWqSP=j zZR}^{+Wt^A983lX+I!$wIUea= zy@mVPJjDochz>>2;a|(Sy`^YyyQ=x|_w3OsqQ`Eon((;btu8WO=&TH`1 zabEjw5-Zm>y47fScGs2gGfU8C#y!y0eJAi8Gr10c+AEBmhqJg*#(3%@^MpQyO4DpW%Cb3HLrJIARkDLwNx^W4p^&qDYg zg!A6@=wekSWx^lgrkXK;Z_$r@!N;8TG}z1VrIk*SmQE?u2Gi^2G9>kcY1O))F;M| zqn#ZefG^xjd#I+y)>N3n8UQ~E;EW?VPUBkYn5{47M!$w&W{F>N?{e$Rnz8nPv6a$m zwF8h>c$R2()=bq)Itl}lC`+iG;R&hZ_f?pM4k?2 z^;N-?ceYd;39ON9a-_TLTxDqE&q1e??csuE8=bb=dp_-JYn?)@y|r@x9q@IeULB=a z1B7YZ)TUo3rGXEQesil@W+1cgMPOBBZ5p~|PmDa((U!bK}8 zV&&hnT%7Y33DErbOLoy8r8E8O{SFfkBb?EDp}YbflWXxVvyA^%bNYU|tNstqo9|AA z)zeXn{lI*L4NqF!C&z1Y8mX7W8eqSvCccgR+R7ys>nE1{IY2Z1mpA{X=T$)xQ3NSe zuqz2nyuJunA=^f57xzC`XIOUaKGH{w+*W?Zt|LX&`01lbt4C}*$?nKKTseu;iozi1 zlwx6nVvc4XHRP*-{uB~?AMv7n&-wy7j{k@n7q2oFT-vgV5CBewVBZ7_LWhHFPO1eV zxp95B|7Gifj&5+T7?TOxV1V!m>N1yo30(PFEm3%7RDdre2Ct`8SjwK?F1v2rXx`6q zyuD&`-0o2T<_d`P6!(+FEw>whYc1u9ZZQhoSDvVOpt0yWTiqvjPN+iB@L|gSJq_=l z=<$sJqyUMXs6&$PrJN$r8ZZY_7Uu(Rm-$=0#fb;rP*6E3`byvK(h+SgLOHMnFO&0; z_aPBL(y1pV1j#JxN`lQuxn5NNJYe^H?;Km|S>M?TFCqJDmD=W=5>(PYN4a+IlQ^K* zg)j|fqSS|5%{RU|YgpxuFAqNa0=R;yN@uOwgm1NTytQ~n5kI3x!$Gy_PU2kH<;PR1 zXFGsE1|Uq#XR<%KEZ^)^%_t`4$J|myV_0!VyXx{?Qx2M=@d=1y_oU`vjF9O9Fh4?Q z@s%%hCgXV?+{x!NWp1KFeJP@VMEH8$4!1rRzvI$ zdk}_p=mEVHQZ0$c3`UTOO5tTgVm0vw3*T#j?zBvZ9@tSO*eL(>P#A(^8!Cs+0bEt+aMYNKIZ)wfXb@z=+kO}PI94SJZgV_*Jf&u z1B1+Wbw%6xTeTbe-sQa;b4iNzA}ehr(VfOu;mb|s2F47vZ!5VpQ z3fzX*WgX>jQnTJih3p7w9#dA$OLJll{)So~SQz_IXdqNy$r9B7; zqBqQkkJ}>qrXe$pyMZg z3jta)xr{bk_fx?0F3f9L8us`KS)_h0p0Sudhx&p1jrYP)qW? z`|My{;BU(1)4-15#W_l%a6vSGrh^!JOvq6Kx;{ss9Z6g>3a8H+4Y(J_SCB{Q#Ld-o4FX-l+_v9s z8~fVqcBsXwe`sg5W{KDRNuf_8KJ}%@r;#ob(w%(L&(VY-(at_grPp;&I$BuKy`l$O zQo@0Yc40>7DD*wJzFq5qzP6;0bjb*k+eyc?x}=jwOW(#^>DV==dVJz_yp!Na_}nS2 zudIvde=d>qt7Ovu*3WdCfSG^P7)avp#k-UJmLU5&Tu6Y_E{rB6Asb;t?vg1oTPbN3 z*#;?8Uhsb*#0(X?vE^tuUS_t#NxM!q=et z&E|-{);9C5DOnpmeC8DORvH!pbUEKOBG_cLE%BrDejghZ}vr8gg|Ux3^TIe#1Z z>BTJm2S!IE{FI3PZEb-^0omDSv(o}Vf}o7w$MBE-n`h+yHShNqvvv<9t^Q}>`M*Rym$j#2g(27qV%s1hOv%1ryYaD3^dHEv`VqL61lU z;5+pqHw8h6r&n8 zrfA;6Q%o`D-2ait^CxB0LpjcW6Tzr|6*oz04=92OMEM?o+L9#K!e&0m>Eb2QZ{KH5 zPMB|S_fxtlv2s4KEcN`&H)8Ku3?wiqa>JYJ%Rr@;1p)f>sp7cxxUY{9P&IyML$v0M zMPih}o$Ce~aav&g9v#mAywa&=C<;K*>Jj**p#?lNiXyaVD?I3C%5BxTrpXvKVSnQV zpPq5^nE*NsDr*c$eqlA^PuY-wTXwn(=-4T>#BhrG2k^LXkNji~!I6dF%l60{!V!3hO%nGNK_4 zfNz8VO4u5%0Z~47pnBl&Q4dG;aIGG0tLVl~Q~6<1W%8fR+9Q z0r^tCa^ye!!#@=OgAWb`)c>h7^JmEn|0=HC-|!s&*e(tKZlm>Ay$@*$z?XbvN0M&@ zrBMw^d7X!N^=}75hqCI2F!VRT&aWE@0)(%fQ3MG(l2Ui;2iOd7XiH-Vxk@ z`lZ_Ke`^Wg-}KxtAXN%y+P$Y}#Eu-+1Js>+!C-H36?yUO22`kr`V z-s~~!llRWh3oy6V0twl_s&D*X{4BMFq%c$hw6xQV9P!u^Y~Q$aU;7Vir4$yI-_zHn zdtQLv4bb8(PX7Q@83g3Le?N)txBRCL>|c^l`Pa=zvL=5%0J&ktLU+9hV>8HL%Y+xX zcZ050$lX?7GQ%u!ABXSuF5IJ+e+3qxW2(*Ba+#f4faslmLSX5FLXM*yS*%mCC;qk(|K&<6}9!g3Nl&(Qsw`u3e+iw1kw8Nmy8 zfHt#Qp4E3QrqnOEr=S-_cTeH5Do6JeAdOpzG|TdP<91RPol zqa}p%ymV9Mx9V^^*)OabE9vWoy@ozv7ClFUZBzGvMWaf-D+0~CF*CdgjkOPoF9o4AOZW+F{5*+CXW?4#R z#!Y0GP7I=)`~;g5eCW7wx?8qaf`WZK3Z_p9aMOSgMgPPmHve@%@?Rr|3nGM>&YvpI z0QB7%Jpl!CO~KNsJYSxld?5`92?if1_%_Mat#i|AG_krDr1lEX>jxm4@7t*3j!B^* zJ1Zu&eacpTuCghw9K-`XPm7%0b`ayE$YPu@&-Tk#*YM@d2Ox%0nN97_);t9t+DP!> zYg=Q6$yGzf2?yAa(JfinLJow^Z9i<%~ z-k4E*{sI+xHFj`t^vkG}`uR7EzU=l0S9WNo5BUIM-eRQ zgiAMT4DkG&HT+ z!)D3`KELRsjd#xT%DhscZWJSQ)p?Gs=!&s|Hh&Q_!qIn&!U)AO@(+~)y~_u;pk@34 zRReOp&2ySmY?ruNP2=7tat1yMih}D+LxC;)XCBLZ?u+nqKPKAtK?iQL|SU$^qWmXzw|6|hct725R z)(K${eSWsD!3En;CHze*aNLsw5;tmAto-Ueq=|fFba;VYqx@FI+^j5`O~dYKPxl4f zDP+@Pod)uIG#343>i`rh^%Hd+2Yy!K?@-hWSI@Ap%9j`5e$^TTq6#*pPN7~r^OGb( zIRT^;>7XdoZ4@qaKm04DdJb{)m+PDYB$0aHKwb4ma1$(k;Q%BC-9Z1@pK>A_<*=xI z8h}}z)<9y7mNjqhOo`&8C}17@Eaf?p839F+V)RIw5wmUNV-!9T8nP#Xd5XmH;JV32 zqydUu2!czaup^lOUr?m`07L~SIWcIa{Q%o+LXKdt+b|)>q8<)Ndj%R#0OilWyynoa ze+l{X3m-ntpN;F`==`TGa=3O5ch({99HMgCA0HAhK1v^?jHQ@(i;&Ssk;VTEQu3GD zU=CvBKmHKqTB1O&*{$j)SSIB*dLv87eyhE02hf{62FTxKDY; zjU=#w2{(7ZXZJT^2y`xhLPsKD%E6WE11g|K{%Fmy!ZtqfnN*R;GudG{5H*M;9&&hI z{>d)*2P!ojhjQm_|R=QbgKTq<+ND`+SVK`#$VSuMuU@ z;`wU!>T4O@$m?l+sIh2*4oMLxw~2s|=%Ptd-9QgI2%G`$T0H8TfL#dP;q*M6SkigV zi-vs@l2CbU{NWdEnmINn4aRjw-fFNMN&L5RXhbKB9bPTRHEHY1coV5|I{Q-H@E$yW z>>W~GcYeS$C zMjnBCWlY$TB;L4#R`P$CFl^c`tzS3L4TMhd+DGz^)2u$f?Xrc`!Y{0a0+G~qLa+;V zgH3cY=aKrsvD1G4V`|Ou zT@P}arXZyc#8$}q z9Zl;H#>qX3ue)VT4m{?_w)|?Ou`JeU;~~&gfrH~}peNlU>sfcMeIuL^b{unz!tM*f zKL6R7)q#B~J7naN9@$*1TyvZ8xpa%R=(CEU%$t7_zW8gD2gb?u$wE`ia(?mnyAI~{YM**)-^ZP-Uyej8M+k%b%#Wm|>$lim zO}r-4U8i9M?E4qww@Ok!3UTZ4GjbfMYY?aMl90)XAf{Isr)1Ug)6+q0f)DjqW_@5d zD=_V+)iR(_;{0=a7lUjaej(K_F9cYSqmbUZc$^REICxhJmmX_nOR!vMPGES)w_<{+ za018raF#osq)YkIdS1Xwb=SpxxO?|j$urj(f+=>_q>Jf|eEazO%`Qf8GZ8A<)|4vm z`y7D)!Z549DfeAY21q(uz(d$n2IGjoDfIP70=no8HAvD+*hd(y4OxUCbD&s|(^X)K zL^Q!3GXkT88HGY{HmnDrQn3S1R{t3@Os34)CR8pI>_#WjIWWDTAW(lziX`zqMNCb}C&c!~ma2^Zrgk<*h9 ziY_3Xejkh67yF4Ks6-!tVsf^nD7+iHP(YOM7Pgzja|w_y>;V#Ie27xOTb#x%P#6KF z^%+OX_h`HQFRO?rf2ViW+kNg&Hwd-g8v5md0GXT65dttg7ZxbYz*?MhCIk5kA?jqH zu5$4;!2?(ffM7gc=?_MsM08lQs2ZG%`E?Ee2csJhLfbajfZ*K02Ov@CB9tUQwTcF& zE~5!WkOiK>jGyuoFK_+WFlx0c!TY=`E%j0W@Y1z^Cr2RKMTLk{MxZy z*4+HI1@x~Ebo1AlAK2&mgIV~)fpF9-cVB(@91CG9-tNZ>o^>) z#{YkN9InPc;n3k~{I|tM*abvC1a}J@3MrXtsI|wMmE-Ex8(oS8TY~ZZv#&=c>pcWM zYIarfN=GTs>)9QXR3-ul`n&VtFCh~Tgh7Z|5KD)u)l;-?d)7cXz80|_ap*0-__p^hP^Qz1p6 zt*SDsN*G?rP%o>5D5b(76Q|9D7?m@*k(LwhRIiHV`UKGWoP6-jW0!^;U2`!P(1m9z zAp~)>t;UXz2*k3|jykrV5TL3TV4>&2>$PkUL>HRYZW&c$2;wsl-;SFOGjUs1N4(>H z6ri1Sz8N2KLM-MqT}mscVm9R`U-M;heMxmGrZi-~^=?I3g-+~gd%Go(^IwVz+RtdW ziw2%)LCR2=$tf6DFhSBN(sPOmZdg{?Un8M#r>B&@r6u@V?tLdU*X6Klb>BV86iXSY zrN!Puw-t#RlpZ8A#wi-44Y+=xJdya2O|*2zXt}ovZ%4SNv6k55TzWHsERESbrGcIz zp9_=Wr#_$krQ7&_?x}v{8;S(am?h;P3V_^{*?9t`Nz%i|nLvs`+C;KXNTsmnn&lTRm7(9* zv9rboYP4IPAGr?oh+gup#(BDL6i4uwO)dk8_qE3Z{$1->q`K=)kz{astuPvA7%SqW zQ&!gEXp*a^n~)0lu{kPRKQ#V!yJmCHqLQ)m>{W_=jd~X8I>3?KMhxa;I3G96^fe}@ z@@Q~{n)Qgk%6xx0>f-pN&|%)#*dwYhyEc{$FAtWWI2;FsM83<;^ecTco|MY5dTXw6 zt3iz}>hkR-sVt^XUbGk)Ff|m2l*)5`AKN#_FleQ ze!Aa6GBnswBUax~U4HJ3SQ2QTFZ@)>k$?4nnB$n~%&9Wi3k@lN0%I!0g-iqWLN4c) zlSsSE-#j=~!ZqIUYMtP)*2TV$ENeBjwVnl7s~O3cp4}l7Dm=JZ@NQ-yZt{ay=GPP9 zA%^Bj#+3|hGUe0^ZIS^-T%<8%gC<3Af--01V6#4!s&bl_rJYuXnYpT6* zP$8Eg_tA`j=(TY_{f}2@n@y4;trHdE|Q+1MZ1WA#v}EjkT1#|(n|vG zh+mVK7+^Sc@mxerh@7xkifcrmK>2b!Cp5@7Ev{N)&!F6!^QMmW$^V663Azt(Q^L(@ z$V*LzIsy{Ues{C^(5{MIbA#bSNfPl_rQZe+9*jnNEO}D*1T7JeP;{ zC(Y(Qba|qFUP9vD#V`-n&WcP4)w81-imT;2%o>u3})51g_D9NrpGnMTMDqAL-*PI(3vhXD8i|7QldLh39-Kg9G<;nPe3G~iXu>v z;BREaM7oN%2;846-5T=SvQ>|}X`+&HFYyc?mxex+SE1`G* z`t%UG^3DIe!@6ikGvsM7=S{1(z<>XwD2=Jh*w}@0T~GCHCaYT+nvYt1jt|rma8yyO zK6fNLz(8!8H$wWb&_&IKq8zOxoaEWUDW6!6fF6E#;!!GNo5KCke2%bjrDJDf)h zsGkkiUXS$|c0I~9Uw4Kui-XozHTn9tPC{^i<+NkM@XaaH`Au0lg8;3u{Tm%SUN&vf z7~2^8rw&;oR?C*I%|6}6|kQn=5hSpQ}Ys}*kOxyPc4B1P7^Jq6OJvotC<+tiB^hj z^ZQcHkiNSUq<*eJeZkOP3Yg%z#4b?%G~(v#Gk`*|!bCP}{wRp@>J+*iIif;g$it#v zB9!_Nyl^Ovgy0zRN`yx+t~f;|!MDoCgPSXSZMwgp6hrRNn#7=n!a=07gekzJ#gg+V zB5*rADq2GluXwf3(-mn}U0Yn1aI1gD*Dl%2Q&&H4gfml^?bEa2p+-!xHsK?%D0c}s zR3nndH+#bb)kKkuyIM2i|41gc`@!9pU&6fKT!e}~4q85ngesFNeGMtbBM|ayLBj)( z-Zd?7zbmk7!QJ;VfSZ?-OVG+v)z!%GePbPsUbWK$rFIvKIcSgOt3iPOX2uuU?gs6 z%YO8WxgH9Lq*<2yRaIYdux2G9;uYkD<){V%*7waL>be?>fBh8B0u!!wz2*&!mm;*3 za84g9OB?GZ?S>U>k6Jbi_6ARgE0VE;0g#W`Qr|S$;nq0GHaXA|ila`znfhjrmyWvm z%h(nX0RyIXKLhp(2gr>puZ#?5De`vN#%PFbkNiGG7H0TbzfUz`tgEG)r99+Fw6Uvn=;OQt%c~vIzmg-!tJ84tOSEn7`xRq56;*L@|(${ zVU6$x`)SiDMSCo{Mf2x&@DYr`|&& z;39VtmsJytkL2_jSdC~bfh3;4qOix!GuU@RX>Y;3k}>Qdt{N4ud7r77DN9rsjOM~8 ztaT8Lmk&Ti&_)~e8QS2Kh8e~Qs9D67D5=CG-c*ILZb;G?XYp*uSP2(#WTKU2YAua; zc?DGjEGGkmB*8~F$hwX%I4^c=y!w-tQAP0wlzhE4Rm{+Z0%S5|6sV@Ao5hSaVJV3? zVv8nc-!{Liib=GIL7rIRoS#Ub;}Q0gqE5$;ue>@%y)QwI)I3kf*o`D7Z-XN=6-$Z> z2TCnAX5UEB#K;V|=6?!4mx~r9x18t{c%Q5W9pECNDc`1W#v3oDibESONMR*IYfgN2 z;Z`$AFc$yzwKzB5?VjITwovz@xC=S!sF5@ZLp)w_HlfYv80pkt4Qsm78%>eQSb8_R zH`w$@F$IHo7Vm{qbV^i2cO9-hb)q%0!MKJ8r``;OuxN5Py&_DtoMXXF8Hwd4c||UI zzcq+-OE$H;l&z30#Q26Og?cAEoZ<;M=YiFf{$$>o(mFyAu2U!4pz36rwo~TP<`vX- zmtRIA>rkhAI-(uXIaTV@1RgDKC?+J-8yh-hI)$9yxuCE}^~gawCB6eJ9aA?rBJ%zm z%f*5-AkFu`sTl1+fU9RAJC=OQDK*VoIgoS3GQu`{M=*df-?Ol2sK269Mwmby%^aa)#NZ|Ul!H5}t^Yyh4Awvwaue~}( z7e}DhxcaDmsM2nh}zljdFBaQGG2n(A7KV=CzEKpF>f$eK$P%IbO&ri zl)~@<@FJpwBnk;GczeC*2Fj@c2g9eDGZUjWYMXv%x#ds`fqM4OnQYAQHS!Ed%S=!z zMj8142}EWdGFLXyLP zhjJhn$zdrYy%fGhW2b9h+N*4{&bVqsPst45YJ=O420+p*rMBF6smNs{2cpfjSwWRn z1b^Z8^_tUy5n$+JVF7@Zv%L!+LOl{}bPWmH#dt7Nj@yj@HS z=M{^IVO(}LJ&@0m!U*)C4+Ufl2-0vqpBD?bsnsp)F|QS0vCTM>fv-7&oz&%LEgFrl zy(CF*N(pT74Mi_Pa2DWb1bB#JY{sXlmSbi_Utw%i=Eplv&g75z;+2AG4yq}vi*?~R zxsmSO7=kO&$d^jPANON^x0#}|^Rk}a%i&SLq;)pEKv2AwxVfh)6J0!F0tRpeFEDqf zo+s%w!SAQ13diA&#*y$$hETRn~J$Z)E^3mzL^Ux%i$eQ5# z_-moTZuPK?)gz;~t`>$&K1TvHBU9`6$j>3pQyi4RDOQb3vykJ9-btMM=d#GjF%~sZ zQOTDduiKxLRDFDYJ0H4BBo~uRiNcn?BJPX??@kz!OEa~ITx1~1&Un%d>Yfm}z7^%s z$4Rvh)Y))cQs)jw9?RJj^C z2SQ$c4Ly#Vn&AniND){s5u&H7H+L>XS}W=}*t?|~b}qfX`-wd^WsQdW-kI=Yokz5Ug@`&x^<)4;0=r1I z13PcZ3HNcc`lY4!L{62`%a$^RQda`B9Y}uxB=97;bPZC>L*lyMHpN|cmf((+j3yn; zu)tqr;E-sMt&_4Ulcb0eZ?aqZ$)Vs^!QdZJ=6+S=C!9w$)<}VY)Llg<2*Bbc+D$&zF<9`gRNZ?gTYI8ESH6fUsJh z9XVat|Ivcy0>}KirNZ?mtB@;Xb25;{;|2@Cl;*$Fe3w4ffjt17aC%6;QQ|lDwb?50 zMBWdo%Z0RdEElU{sbv|8K~F3Hhn#J?1r&)(vN^$4h#XmC<9=_0Gijjf-5py6ljr^w z^AGh!=RG6SShSh6c~yl@0Crs@F8xh3QQ6s6{H2HA472yrr>D)7^}+M0FVEpaNeY}+4A^)mooIv zR(y5VqHaWFZvQ<I}ux`(3N@BPU4cK)LjrpPB3Tx z0s4m#)}56814-oH=_a##!TKDYatiidPzHEMu1o)w_xBgtef@zRDj|cy036X0R(J@d zW(~PrHd!}_4hI4lQ=1MLU~{f?4IO|CT^Ffmq6wlX(yJ-H1JH0QayyEF?1yf5|NZY= zSaG5qXnX-MfA(yEvGAX{{{QyRDX(aaKsRA8F*sA!(Iyj|Y@91m!OE`h8!dFhuVe9>LZ{uG7=qS^8ghrwrqRL8<%jx5)Vy?1)I z--U@wuGnf5Pf*%~B*{57HjiIE-j@q1Q9zA8iOsw}PD-z>Drc5@7JJ=HdG9TUDQuqy z2VNB?o`OUAMEV|R3OXfKr|_>UzX-`t%8TT-_o&s@e34xjE)}jh__@4DZGIJ-p5F~X z5G}I72IKgFV-12m+f!o1G4iPPGKa*^LJBm{CdoLgXWiSCvCiukx ztBW{r)V3VE^Oct;OZ#@DT(WlMCT|NED{={Tot5f$*}DVawjEHZJO_BBwaPH^$s|nH zXjibU?|5&iCe-eC%McAB=V0cB5kRnMI4Ac2v?Nfvu`>-W^&!1uZ9x&ayijD(H=q3# zK2|~Au@WRhNy*SA*#2HEKwU6~Q;Ku;024OQ7uhinR|YKGcT;5H3iOIv z2PCeWaB6{+9NHYczw#NleAyr-4K;F{a?Jy)M~+Z~QR2jr=cjNtyZ0`zhJkm6t{s5- zT=S56kRnM^(n4c2k=qkPmbmgBf)_IroetYJ<-BRr#`cd0G(fii6PzX;u*e7TJmhDk z(PXJ|^x_xH`zeCB94Wc{1!k2w7rA6p`_R5ha9B2D`I zwS!)3mP0c<&F-vAJU{D%o;CA@WYH)@oHCePMW2@fi;7o>4%Rf8k^wLCZY^`mhlLg- za~bVK+5U5tGoZD%jL){w4O3%VGYidAqlUZH$dMtf{=4PhJtyuBHC5e9zAHawka-o~ zB;HbQy{_rcma9F&%daI~yiX6<^aN4Z>dt4!T|A+$xlVXU*)_mOre<*0tcCdYq6AGyfBOPEa-fYQx30AvcnLDjI%gy)!fnYaVch;~0_+jD@dJG42EmD@AC z3s6NjyyVD&${^&;lAAgpu0JPhFqxwiYs~Z;%%*=6rA8Sw{~JGq-~@o?e%)CYOYaZU z(a-ix8-k1m-nibsWjg)!!nCF2+k74IypwNAo$EAT$E8} z=9u|%ZuM?)rIWx@tqP;A0LT@{^apUUQ4ocmM1|{))cwGetbi{=(Pm^WAN9FowIG*PH_#YpR5Xu`zy;{>gEuVz+in{11*4E*- zco$4gnapdStRGJq%B8eVs`YA$BEC*BYZ#@Ci#MJNws+C&ikSe)5Pr(XjNR?2BGW!$ zw}O>mqPE>bFvUP}HY=Y?@iEt2C6^X!0L8XiZwJcv{fLEL76PQ+c#zW(VD{4U8m@S1 ztU$5i(omJB<(z!nW}9+J&)AhO7w%fjGOrXql>&IQ!0&L_z}mV7D^Biug`>2r-BbS? zI%4$QZwGh7hnF*r@160LDcQMcYXR(HYg}2H55BrhQ%S$0pqHc}Ee3xmQCA&e-ul#g z?1IT}7hB{RoC3qSX2RGaF6cEGIPnXGSgCi0iBT_>)9-z!Tbv>tPuRVL12?h;+42$6 zbC=BaL!&id4lEhsq>eg6b*p9zyRsnUer;jA0vAVV& zJcwbd6ZJ*vV`_2REW-WD`X^soT)h6%!LPx5?}SW)Q0dYDsU9(f;?b0#^ukKVC|y;w zY2tN3pI6S+3HB*%os1g2cJY4H30c`A3y-#jgYU4k*N;-kykeb{f$nyaW4BefeNbGa zbHn`JW6Nygnbc)=vUI%|px5hIF_fSTc$J;A(IZX91(iK$yQ2QirT3OiSyBbBMFNh* z+FS5~Xw8#%_UHeqT@IaHSi|GMSk&q~egwe}m#(d->ATaL=a#QC@zqE1l8<6%)j9c8 zSMq3UgZX{tOcW)mRTRz;yr+PnLkotkAbavMlR3o0Avql(ssj6emMY{hTnh$e;bblA*W?C@aUdw&|dLwJ)t-Y&PqQ0rnehK2BrnRv&mApTNL_d?nDhI6dT+C@4p*}zy31A z`3ZQWPbbK#D&)dXDAR`WOxQ4YtV}q2Wy9m~v&Ild$aGqrP(m}N(5E@)Je7jwn5Atb z(z|PyehN4IlC%PJ>!V*FijbJez$p$`OLd|v`>pZlMex1k!70Pa($KErcaJ+x8mwj9 z+ni(I%>udK&=U!O_|%=Ge1{bBw7}?`5!CpN=ICR~`?7h*b(D@fdq>jhu{^IF69Fd* zJkF(}VTT37aMz|dAx&~)`9t-S;6cr)6qi`%ed)NyhL5#@lcztIy>`k zc}Yk*821A<5F;hIZ%Gbuczy z(4W-1SbJJ7zdUIWO{?_HH6vb=i4?SNa(F$raLS8 zAtoGSOK+NA#nRjksf4>tMNdT1G>jX403OZ_IS0o1P^wm@_L*NI-Xfa7n~q2Zlmy^oJ;@k135$eiMbh z5;ruH&}cN0Jynn4E^#UmG;1@f^Y?d}i_+yT=8Q4-bHi%Ke3}(rkQA6B<8?sD)5y|= zs5PWx_t?xvW1Z$u+V`51sV;>CyNPQeEzBV(hlh7+-g$iZm`EB?QK5+!1fi$8X%W5P zLZhZ`CMOCL&Ip)&$5GjMHoy@ZyH%>+qgQ}1Pqv6MXX?|_VLCkFk_A92Chs>;b_5f7> z4IoP6x2g8x0WU;4bovybFBN`;`~j}_X$s6{RkNSu2$k3H-hWvV5D`7DvOeixXLPkl zakDvz5?crI?cJDBsqYS@X!JWM+OF)gyz_fJ2eO=Tx$6`~OSj)RaUR`;CV0rLwj6*i z8AU>Hibe;Z`KO2^xD3H76)sBf!fu4v@+ZyA8sY}to0)CeC}?a5T%!7P*TlH3j!Ul~ zg>^n{Hz3LV847m;#qNul847*ZY-xiIpBrM1Zv-V&xigrB%KSv6Uf{3>b05X&=dyq}`b$8RNcSo9T4Bu~1w^PVg+5no z`{be@(>3i;rrsXd+V$j=Z;Z!43kb2Voxb#@ym;Ac@KuYCC+9T<-5jxJiY4k)Z(6S_ zTvu?}1epF6e2^vKDe;0+9Sx4$P>O2Xe^y-Wg^fbFg5PP_Md`i$A?|J>oe>24trSZN z=?n=k!|>iAC&4|kte5v$KDv5K->&hFbv?J-dM+_m zhoFpVPF;qwVVD@o7*Cz|`ckId0tXl*ntJ?T%&gq-N+aLXmyHHbv0-wa)r$$a#_3<< zE*}H>pVHeuASO=_O-zamZAUXW@}a_&iSfmKO8!o0*$iYgC->srnC_zNI4v-czQYmG zI=a!+J-QAHQQ=UqBIE;jZ&V!sj$2c6zR>^JK01*`AyYGIvUDFfYmNfPU>po6f{Qu_ z+jr}i+JaH&3muSno?SvQe&9Ki%mZY(S59Q~&Lf)!<*Id2$Y$>noh2D?xB@#bNn?r@ zLWPv23kY>BF4OWGwyy>)IC2_7$uKLUvksC1E z8~3dRbx0!zJD`n z$^!4X|FkaA`MN`eiy_e^tNmuX{!HW>`^`X8k2g28G>j<6Dglu#sW!;20&?v=*AEEJ z3bjW^0(gV`s-Kh~d)wcfB*2i1<(fqiPe69N7`EgHGTo#g3JajuYvX?a(k@J4y$sy? zE}~iJ=ywh3R74Mk&DE8pJ!8byDqHfxL0hIS@qq!our9AlLhBlVJY0WOu$h=Z;+)-e zAEIc&d3!SmKG-z0@0j+$Nq>9R*9l!MQDBW^55K2y9=#Mo*TA_31}qr0qkw5FPWrSG9b+pRMC@<@**EpYEbJ#u6Ni(Flq zeg`>9Qt3Te%&r@_yq%)r(|45WN5$*;#J7=aT?54IBLPxXLz)7<)Xk%m_!$hFuZK~; zaxIH#QX|F1adLT3r;F(pd#&0w9bH9!9X+-(ME#u;w|V-F#l=ffQcQuzrUO-JOiHMl zNZ0W1AuI@f0(yqI`Hp#w{HH1B2cc;Z=Y{UncyxV*Zq5>qTf-#@SwLVB#f5a)q***RGs36Eb#lKr-?2qoS`DizI#~*tPF*>5s+0`gqokW0&AoIO-Xr5Mi2c*}m@3 zvPe0Yf}sHy;P)R94X4;Z?4n0zv2<&yc-Sq%eLU2%zr@Mvnt!b#@tnV}SVb}&?3~>8 z3rVKSSFMkNu)Ld8DXdG97UV39eKfn{kgecQodn_1&0ch>qhx7C|AYBJ^S5?stzS)F zN1fG`+8ZHw?JczL-@Rk+Grm78ELdT!x6F6WXFl_pzT!hwcQ{o}u;nIc#i&F$CVafm#s&i_ zw|_iyb})D&AWyqCg=gn_K$9A7(4Xrrt+ecYI)2Ngp6-~Qt7uOl{-H@k{M+N_m6vra zAXMW&i`D&a-cPqxPh+MBs86ON@Gj2*7b)wUi#zQ|0J!uBZ?s1l0U)FWpce(Upt|!X z07}yfVxi^8RIuy=;i&F3Ut<~u;5^bvwPn8`44>LK2$^rc+|=@8__H9%fnCf#$dj~O zl}An3VMk$X4=MaI5j%Qo*-f=int0B)9q(TWV~>7pdXK!a4T+>}yh=_1yABN3VTG%Hurea&~l+22|`6}e5G;dtiNV}Wq z+O`TuA^~hx72xbgTFSMnm4ij7@o!_1AM!$9f^F8MRYkyO(DAb?ANFF4_b^`6(jsPS4Sop%0 zcl6;03n42LDYwkWkBHO;lL13X$NTPW{HsBM+l5Z7e5Ws4LUG*OTM}zZM63z*El|E> z_Z@C`MAq96Ir&FD`_^Au(YlKr%#F(au*@H$+!5eogUA}LP)V)$jbMxZ5y3wC8|^g~ zOFEN`I9J*zm&37V_DzDqeQRlMhNSalblNP+pvY;ki#u#Oczpe#H$P++{J;Q(qjhN! zspyOAb9m$qQtzEnvg6k0W|=ztIq8nF-!&@n(qZ>^^HI3HDQvfQ65xSpUH>;IM>G!_ z4{-Nwz^X38fb(LI*MzEQ_CtbDL%a0@MvdP4MhmM$e=l!}fHG+)uK`l!jn;pMyZ0aP z_Wq6bLI2nYK6)NTN+d@=B0A2`#86PuEgwT~kCY;N+Q0F5e2f^;DQ^ygG0{3GT2D`< z;HgHp!Z=Au71!Q+e|lh!I!hBNzH3=D`P9)hQaeV54jZd~oB1VL)h`prjh|{y-CxS2Q@BtYG2;DP= zp`6m?&K~UX^eHd_d1BCZO_4!_#M>2N38K(~KQb}*(#esL_WXyBt}rG0*eyd&Vba)f zfOp_SbeX$fk?kulRFZrvw4)`=N4b+O~TnjBCdz9C_hG?2XR| zmN-6<^eZ~&@>Nc8_V_vkbEE~zHgvi~H0r7BE2qD@`^s+t(VdO#$5g{R`ZUz7o$&Bu zt4THRrkIVLMdS1Cuk{42RZ|Z1UpaSa%|&2xPHEk4U&c3A{(Ds>r>~fCSU9r7e>msZ z*|fuoKQ=<_=OKv>8quh`RX^bCwgkG1)T|~JmuY59Sww)FpkJxHWhg|?^}Y6sc9Xrr zu4eI|cegx0+v+no_%`YsH|JjplFY1G9&I2GTZe{U7RRt1y{sZE*)yA@BJ7a3ePy@ zC02R_y?#VUTq|CY1w`SG88sM7JgTgc8d-?)uWUkpfYXEiFd0L%yF^7(yt9{W7Z~>JswBzau7bjlNK5kFwF8x6Y1gA$T;wCXKAs3-S7JBNLb*IhI z#r&EFKz2VBN)J>))J5BG$!bA_Ud3wVE}b{nNf?Bx|y}Yi zMPMx7Q`0Kl84wasp(?7T3POMG+bi?yD+2n~a;LVMuTwiywVvElu^-oPc06-CQ`DcA z@%@$b4dhkKTEf0_w-X?mT+KL0loYD}`EqHKZ(uK-h773wrfw&XVTL`7#YK{QiF_Xb zmm|7e)hk3Yo!#bw)ns)3QdpbH4-u8s#aFg7wXjht@(OSf%~6hxyzLm~6XczDPQ;Em zD6`Qa)mOyQvD#rb!5;VpXu!LaY@E>v{@rFilk@$OsZuAxmJsDSQ@V;#J8|CJRfI;uNM~1J zdpgoyw+aTBD+FHcI@;}i0H*L?B``4wpbqd~B|Fu5o2mMp2wj>H0An+^{Gpt%)ly)d z@+K{4F(`YZU4?;QC`sx&YVUd?WggX{16$bE6i1C&D*+I?x{7+7)|I*ClF0;HyE6o~ zL&{kXkRORNj}4T_q1+||!fB8VWE3e*UfEnr)eJw9bn7j@_`N4su4}qe;xU&+y1K>0 zS>h-|2yZF|ED+EsgSUhAEm`75BcU|ZPbtnedpTCr+ECo}eT4zrsSKT2u3JYl4*I~X zQ7v|wk~U3cv$26m#_JUk3}fzg44d6zja8+aKM!7iL>t#k1o1?RnC1arB$UwwRw-QX zA~ap*=W{A0S3ZmnXW5)RkR$^?4q+#;7kp}y3D?!Z}9`%bOEa5yT8}87VSA&y_~Pz zH8e)?jU2A4;d#v>!={)QdSwH{0h|4RVNi!bLmN&K#|&#M1MZ+hLXm@S4=<_MCO!3e z8B@X=zj9SAR6!5!* zUQar5QT&LQhsg(B<*t*u65rg(r$fUVbnws#cC5g+UkzDUn| zlxtsM?dq^(c&V#?49*0`M}QI#pqWnO#YcZB9!-kB<2+h0A$*r$l}SDt1MM0E(HX&5 zW>@YP1i&R@))K!UhNdH*3q5Z=-jZEdEU+Vbk}Rop4K4&;ed0#JoPpylqFX_Mc?(;l z?fa>(R=C{FR3D>LKhF=8M3q@ zs3rcvB!XVHIViob@a>b$o3u|ryWD#dcV&(iOTb=DSo{1n;n90*4`i?H5n-=d4a=AB z)#^_x^Na0$BRdd!Ti^^7?mP;NjLO62F5|3h#iAKLt;eR`u`KHPmh9QBfYnYblvH{* zVw!Vz+afa=O3;nvAn%(HQ0=blovI=4d|b0;%(YzTfAq|aOsh03&vV8bZ@jaI*abzU zQeWgiSYE2`CT@YRd-U9rFRo_TjGY(5joE+PBfcLvo zIFo5cmhEuT;ZfLj>2$5^6x$lF@!ow9;Pn58RY3>;ov7mh+J3b7gBVeKXe038)4Ci>BM~$=^(3fS=!)$`kHbhs1h#kCHZC^2 zqX^eh-}sRoA+7C5$wn&+E4>Q^5lb6farWuYrWZIh-T0e`wA$?*`w!JR^mp!Eyfhog zWl{%7(VIkub$8&0+%6xhlGISbXP~8XcrWNMqk}fZO{1+|oM`vGt9@RFp#-5~H@i6* zWJF$=snn=xg>%L7X%?LOV6VxK0c0GPl$5kx8$-p#7+wXc-{3`PC^$4Q>mZXr4<$Nw z&M=VO=P+%3Mn;5~Y{Z8Zvtwk7tsdpO4iD?CVt$=4VM?$ASZzY(m5c~!K8`>aQ zgtDK~uhTajUKrW-TjUddD0k^2_k;%@R#cXcO%5U`te#9`lGsN&*SQBbT*9mEvoej| zU1b<|7~FnfFLu}|w|2?&X4=6mxxmZk%!8;`z)Cnr>q1p12JcHEgv-f(wyMsmRqfG! zMexFh`z8y|=qiP;K6-CH&+y^v#rw{{ZFPlBC}~qmGmfR zt;e6aOqssk0|{s-V478&Dj{(L?q4xktu2#q6Fu%}`9&UcnCxQ}Wccy%{g~0NRSShS zmU|{!qvnI-2Y#@|-*tUx$Gxf=x(?1!dK2=Po4NuX#k{I|);hXGGx=?|E!NQ8?dYz` z>PP!4%a7ngu3QIteT7-w##(Hk)kIm(Vy%4K$?tLPF>a>ZoEsjxb{G|rvN&Jv7;|VRq%sw1B5QiLwA5@qLCR&vw6-Xre~h5Z zqiQX2VpkXXE7NH@XuIm+xVc8UTLes)bkYy~QR%#j`scK@4^}5)t}3tfvFdUJE&Dem z17P*TQ7zi{#L?*zAyqOk4?39CtsK7vPDLMd4a(Li0sw)q4w(qm>Fj;I zWiuQ!urpfhj+SS3UNSE!6eluK@hRF3D$9@jAvfz-D!F3{dTOHk2RKnJH!=1DOumsO zgzBirS>d(bO{6g)a%qV z*lZrEVjbNE3vD_;{1)b&ex)<8r_BgcTU(W}n2WhvR^RQ>k$U}O_hUVc2XvrNEU=j( zNlqs!w&8D4ln5bZa~1h|C4%pA#;xFdhk6|scLNUvydf!0jrX&u3Q(D;(G*xI*^FdK zcEryd`#vUMSY(@RiGAecbFAeNOOSX@TrEqKS_mX&XScbWSEGVsUgK^8C&LC&5J zY0^|i91D>|bM11p6n=MGWri0sSD%@U>oQU~ddU7BU18}EpDpbqNG$?(bBi9vkt)Xy zS;=4@@$L;c@8_X4$I3)nGN04J^UTSd)#JF>lOT52OYI`vo=es9ZkW9ni2~_BEeH}M*;jg`m;Y)c= z_f1mgE_f;SdOlvhV-mqx_&gHv3GM_j`;J}bC&;wHDt%goeDFHqUnjK+vKp&~&V8$F zc(EDi&Cic(WBDlfvV6g5+tQik^$MzUtLRGAU2v}NbD{6dhtjE;~Yaz zW$^gHp5T;}4@wujT1)&h*JB9>jc{hO>|scL^Xo~t_6+NdWT_X$E&M@bpI+5u1nLF~x>7rW@k0|f%Rgq!yS)mOk78-Fu?WTEV^x?TfGw(Pte>>>M`X#W{qmOX?>9Z?4iE?*F2?VmSN8=Zl4( z7S>p>FH7&FquzsQ-wLH2IYIa~$J^!}BrG=!WEAXf6RH+RG2gBnE^^R_D%T?En)!<_ zNA=cn)Uw!fqy^c4%}M{9Y(`X@a}90H1@#WBb{&p}2^LCM^gh%!oj;N^(EH;ML{Y6t^uO%lVU^692++BGqALmLu-bNq+(^u#>)`FvOo z2(5ni2hs}|F+d1M5scDZNI_q+$XJ3W05@KYPESd1Zttes8W^6|7WG|x%pnntG)fEh zVp2MDseY#ioZ2=>VT32xU&+W%sa7y{TS6zsJLmgMeRb7HrCRjm(+L|d0`bOvQFcrP zXD$t1M8AhQ4n)8Sw_>9)Py|N-kr zzCip{SK+0}tvcdIOpXQEY|Vt<$D$yO35K6MIp}Q^inXi{HWgERhcDXsD0Nt_b>gi7 zmVvC{i!Q*}#{$DdxG@u%38kpc@TtoN0NWk1C=>G*dYRT=EpE}{+Lg4Z{$ro;>|sL2 zE>;L$^1H0B>H2|bD!3gjW%aQ>dWRO>(1|TO*;F>ZapNe$G>{&|R zL$%z+EDW#xf~+|VgRoqy&lOk$8O%bz`WfI2r2fvmTLBvvv}7AbHv0U#Ogkv-&qgvd zd(3PJbj!O4AbqUBnZ1&Vv4G7c14Z8Zv}1rt-Dn2t3>?tiD6*suCEXdIige)lKQ9%- zCgy2OTEt@{Z?ah);tb*Ei|rCq?DeFj+qHFmqozt1&Z3g z7ID-~1xg2aD>I7aTi;Al0guIT;($b`mzuQVPWFjsb$3e7@#`ITyPd)vdhfj7A(PlJ z6v31o=icdWFdB^~d!ZPxk8?GL^DTRRzRxe6a66gE71y~Kb$*3WSz!qfeAcvxZ%F7- zJh8NJ*a^vosY|llJUR_ak?sv=PhXI%Nl`D}f9|<;xPR%ZV#>QK6HR_)#`(R)v12l1 zab!?H4z1UxE^(U3Q!^*I`kv0C$>NIp!)t&sg!eFdPeKnFar+jvH8BvTbLW0RcxF0s zm-nu+dwP4ywrX+NiD%^OK@Nz|Li7&4_oZuY5+pm!mhggg_(Hm=JA0X@3}>k`Qmrlf zv5U^LtXIwZzIcWKQW@1^ix2bmC&*j9fQDI)g$*DFH(*XB(#!V|TF1t$}z=3tGgz2xT!{+e^nEJu56c z&&39Tcpa=OG!0hjQQeAM-0_ z)tWr(SHgw<&}C!NJ!-x>{r*id#J9I)vUsyN#rDf~_iK5Q63a&>U5L7SpxsLdAKlAh zezW-*@|oDRY&=w$B0h>#BwOmn40mQ6i?Xpcc=%jkuZ5BKpvPPH2gY(mnXk`s_cLM_ zfC)JkG`IAQP(#Wk^k+y&=K2l-&6Ul2QkUzkq1*Sd2E87~7)qHB{EX&&arR2;*-yuB zXM3THHANdU4G6US_qdm*s;W|Ni`%MU@- zaZdVN=N3-iN!nRJYX70=bvzwKQiDd_5L_=e| z5;eMxotE5oGbr#;;-EaI(^uN3_gN9MDg%oZx2a7S7Z+5N*^@zE+9LE=5DJ8%PNW#&)qPjbYlGf`^@oluCD#Yy^iJG(tyUrW zelo`2j5tyP01F2I*?pj3_HMiEo1(7>atm9EWz}8767irXHinwrbb)MPbO>Qcd{s9Z zDL&XgI^g8U_~V{%>iz?~K{vik$9w#N{PH!%;jZ0SywswoXKHGGpS z(=}o6cp4jzI6=h#d2~($z;{Bw5gTyrs!3=&cj;tOKsYalzN%y=qTbtsU++-CA<&B; zm6o}&vHno{ep6G5^m@r)PSPDdQBjfJ3$nA2!+PomjA#AL7H25jKJ(|^5jJPJlb?C% z;imWJSSKy6FHc(TYmS)eCm!*A)k-eDKs>A1Q>lMQclQbjWDEj7_-4&p zH4sAAKEM3FXPy1JALGr`r_pW0YC#C&i7p;PwLgY%pD0SjugVp;#;lH9*Ms+{4?WT?1tI4H9=?I=s68W zQ5{B}Bp+PN8+LCK>kwhqsA~7+yd)R+r0WGq{OFZ4XPYzojL2tyt}Ws<;CMUa=Tz<& zJi?-c^}b4rG~!$Bri!{a*Mz>wpE(hxu`a?-cy8%3G4#O*I+@`$duAO*Jd{(luYW=A zukJaLUdhJmTK4jDunmqk+^U|R>4jf1zQvKQ>02agc=qO!&h|+ku`4d}-9O{_Ljo@L zp#W-G@r}YINqX)cBP>uyt|tm>6TE63;>xWoC#4RK*;U}}UdY9DHov~-ao976Dz^e9 z;=!)6$^`L{0!0yr`#Sx#!@=>`z$1^<o4eYUV>b;9S<02J;bl|(;(-R`3gT6|Cy!GRJ~i!$IO z;^;czl_8OY`OXZbF9;nx)nb&IA9U;0^m$+Dj0Y1ZU&%*Y5m|0Nsw;N_LFGaFzNB?KK?5ZP(5Cd8&82Om94ritJUqs0KlQETIV@G%Ja^#13?b zR~JHC>;bBBsE508Yi3g-B((NCSS^Y|bwTox3Ina!3^$RwA9Q4x1kh zxIbit$aG4qc*?W!Cg~nrDE?~caWAjyYc0K|vELK$nNcO0Cn%}}Y^;>E4fH5Da#wCF zuvcC!=h!*)Qsmh^p-|3dfKjH<^82GHhVaj+{7j=@;aBeE&Fh zuVU;sJ0PAM;OB?Ogkrd)@b_zmHqLDq)f^Arx5ydY-R2LunUNym-QoL_!YMZYBn6KW z@=cyC#dr%4lj_20EnZNOXZg)NJZoxMetvtbPd%@nFJ&k6iX44dw zGb_Mw4RBDdk1U0|Nl8!1lg009j-W*2+?k>lYhcn*FQ323O5JqpS)04I(M7w0Jd>M) zI@SOe&J1#{>wGJUHIlN@{EFm5uQRvMP!v%M37qG*fRIU~|Hf7_tORvDldefXK?G}N4GiFY1c3LLh&bkl(*4q>l}7B!hkdt<3sI^tKS>$i~IhcTVlJ$79=g_@__`H*hY%X|zV4 zk6OMp`g-75ltd@88(1*RLNDz&YD_~Pq=bA-MrmJxpAX;wF4!6;5Dt@-1W;1oBUE=X zMH%pH{gY{F8%5>RTHAQkgydX=ww!jXB#p5LyUm?NgLZ+K`PdTjFc|LhsD&-{lfNJ~ zAVhiD2mi8;Is-@<(ar-})N%yl*pSrC>1gedJ24C?3Q=>iJC3;QuMxBom*c$6PLbq@ z)KH2qAZCq$G}UJV6hE|Llah=H!H_OInAx-BM%~~055I4C!8bV=r$Y(`MUao$Q72$E zhsKW4MloDA3$~pVXJdbIm>7dR*g;GldV)z%5H;bBzvlE!7Ru@rGqW?YK9~#YErN@7 zx4?_1Q8XI}puNqUkTw3nn!2^SQz5SA#zgqtH<@r%32|>oOuN}Cio&@GRwq%6Nc43n-wRQ+Np7xm$ zl22o$9&B-B?k)>mN0DigD?JntdfkA3P~FQ2-QVPGciJ0Qmpv6~9Bg4slM6Lo0cPO4oY{|Pu#^Gj zm++YkNF&x>GgL*~*tX}sD5|>@aTo;6;eEgJM)wB$YlT|VycD(_DV&1y zJVAws^JB;((^fea8=vX@MkOO4l|!zg*0o`pyiz|jV-{|pWpjhFSf-@JCeRHj<^&$;vY_RcN6N`;I_y(_D%+`rB%*K@VW zuB&rekHh52vjZw>u@E*SK%oOuz;-5Y((1m$_8wQG8&+pQ9xj=Zf&zHSYH7kRNWP@= z(Csfym0?j|3r`Jn$CAYzDe1!5Kne(KaM~*{303eu84BkGnqllsFc0^CL4HB5fhn|j z-$J3k*K{6aHs3G(ku&;V`kLm6ntg@Y@}CCDj}MAvpz7_(4we7ks)sIR@wrk@|Am$U zoS+{uvsr&q&)}c@e!4mKqrcr#I~gt)Tyl8TKxpQJFI6rnr5g?c)kS>qeqX!A9_m+_ z^vWvVfUH4^W64h>)&Pusb>Z+ZnkWkB7?P7hW#D&M=>U+lGFnP(ErWp?HFVf*}EzaUf&PfJj8xVd{FmI*bs1dM)e z`4|sucK7u?&12g@OcyOO_g~sKr?Z~@kNaRLGJgQ-KsxHK(S!ualU%hgO@7)5fKk|O3UT&S+(SVYV zbrmlj3cvYyl0QwE&q|RF!M@K(8?hKzn<2Wj4wy8d$d}ah)SuuwDwH;|ez3JS-taYh z@zN@`QFu{BO_zr5I&^o76(tI-{@Ef0vhmoWjctYB5^MAb zg2{B`{-p=P@*Fke4SMg|BTqoj)RrY(O$7e#eWe$fKbsPhIMu7H?#P?u-$!QrcHk>l zEoH`MT74APSW<(hi`1K+csC{;Wv3ieP}pOJ$7K?9QISAw3(2yYc|^k7z_?Xu(?`HD zMXHMZ^?8Pba)+0S$_EnEGf-BmnMX?$9Za5n!fT$Mm~@7*G+5_PAGe%x;w9=D8N|A+ zOa(-vgkW^1QfKBJ+g2mpcLse!_3VE^{M_cmcF-#*(log~4doP$2k}mfz~WFX#oO%7kFb*4?_R zGyogl(5TVdUFu5BxnNWYif85sMTY?#>yb^Y#3#i9rx8k}PGiGSLOs+ywV#TzIH*o>ib0nGsJb zm{-k&+gUyrP~KsMuQQcI_mqEihs;Mk^FyzfHnOy>r7OpTE&&_nLNhqEPiy-ZkQS&! zTb(!B=K=IJed*P0pb+-~kSEJE-}cBIGaJ?;367&Kz|-Lbou~W0s0T0}r>*mM+z=No z{PS{S%D;e;B@YytE~FLs73S_{U< zVy}qCI7t-KtwBL45{B(3x_9vd|Cdo#ID>anhhAxk_M}WcWM_+*dTRE0hHyQ0 z;^(|iFgP+!Bi!d^4m$&Kt$d^0&Z*iFsr>Rg!rmM?H+Q>&#}jIwr_qaNq|m~biya~x ztZtRDRVS4h-vA=Y%$a)&z*-$a&-0QHU@m?FPqfoj5KP8B^xEow@)IQylh?C% z8gY7i{&(5Ue?>TI?4Jx*fuI?vS-&8TnFoai-488=YzqR5bHvl z!&sA7GAcN8mNB*2%t;AS7TGTko9$~hr(MDtB_ieVRkx-<;Q6z%$lT<6F+H_(LzoZ# z^WLyf7`t}?ZKRlNr;mB_Wc?@4jcb#QkCzPtR-{xw zjf2&=y-Ac`1;l(cs_{3j5f&sUxhTeD6zh z+)u*l-DiKQp3q7NNjuYiy6A*!PO`XdqPFLLc;51!b~O7$TiOCgu|Br^nWT1M z2DgNtT7tU1bGP{qcq9lL8qN?a@SPtC*v^;ym5pw6$K>Weg=nc|rONrM8`7a4MjgE* z@(UsbtAqkd%K*uiC{?3co$mScokic0IXTowNAc6qjp&I4Y1h-(smF{W>r!uJX?159 z4;|IMR3dr9_(JZTX4>uFCBF2MR5U^|8=HlWoFB;!exh?O+kw8L_4)7xZnkgJm$6^Q z;(TK}QI+4;6Xw+{t#7$nVsUjs)uigrKqzYR2>VIfU{gjQY;x>n153qSvz_p#gs1pZ zxsPSMp@$y$m_asvoE&yd-+H?7pu6vhzhPwdvSMJ{m9ikiDh5%>2l0F@8l<-e%l3*h z;*&yV?tn@p;~$wMdMYpu_&4&qv=a!e^V5inqas^~+OBw^a}zNZd<)0b(a)D^XYKBB z)~A5jWI3x2PtR@txZllijRumHv)M#_-t|l(S6A?%*u3%ujzn5t6~AzH1T6+*|2j8_ z1ScDFbq&^$9k2C#5Q&;RvFtK^uCh;&bTxHr=*&XwMrB-4;vOg4*&PSNSgAAs)L#2K zcx{p%0Hp*|^W0ccF{i3rPAXf*jh7ei3f$Gz*aZon@`9=FIOMyEbyAtt+9IOe3_C0` zS6Fqn`3{RoYVT7|*>2F;KOM6ueE;q!y$K)01Hx7HC^|9hRp|yw0L6o3 zL%^xYO=5YmbCdcd%%;PonuB>OH+XbQ53#@AaFwvB6;V1QC(I|wVphEZBixXgywW*p zisTH!n%#Fw7c*L$lyrGIu^_>irT@V6Ry*-U=f*C21$%Q?e#&NK&D%v6?V7VcXe7`T zx>C%jFt7|`2gtc)kT*V-^?RNA`b+zYijb*(|Ao#7mxPsQ*b`G7v(W@{mc@{Ek;DtB z&hjH)QafRl2M=$mw<{5p``5P7^O>Zl)wS+8W_(p)`;zTkz;P}nAA6gQxR?eX^xD?@ zyp%kw*VrKLaR`A3{C`NSTHagCi2yGAXf3ANeU zsarTk$sdk)6(!w3lv}aO;qHADJ@W+p>A>k8zJp4VC`Eyq5ZD87!yJp**k~R4S%coa zPameRuVPFzu6mwYb__4;V(EGmsEl3$vwq`;MXu{fKZtE*hQ?Q_vV_Iaz3 z4?Tvf+FrNXm5VfPQfhj^2GXRKog6X*3-O3a)-^MydTY7QM#KESAZCj}+t;?Bp)-dt zPVmWN*juZr0U7V+)cUkddyk#& z!OgE3<)takP}&~Hw;lA=5I)yA{ij~$SyA-2Z-D#;1fmQvMVYwICH85SC$}B@2A}XD zxe+qgS_n;(&B8(n>tn+zAHVGIT#UD|{s5^~nG}HV$amwi+3x2=&?3cQPq zkj`KAr0@EA{!{5k!MN84*%)bXngoKLnhmozI<8f?GOD!4-I=1|!iu`?q}h8)nVt2E zFYb=f>3ui@OSUq4buUHyQJ^|RmgqV!ufLa#PnqVW@FPDZ2M}Y-bFrW=(P#2c7)3Nm^VG;W%~3^GSX(v5 zG5(^jBrPP+hv6N4n1(EnJ;%17U-0^fZml-sxWor!@1WahN?6itv-I4 zt*i?e#=0vsHr(y{cuLVHdOX`U|s}B}#{O)ehC9-qKOsC?f-*t`r#!n~(6hZfWE(#ZPJCP$rjL=6~g1r3rv5HQj z+GWqQ@JVVwNCy8y>8xt@UdA|MiJ1r7j}rx~;y$c=S@HpaYL(poh*tm9zyI85(MPxt zIZuYpSFBxAA!Dj^ozN#7Lc| z>3$xLplE^u_i?ar!rk5hI*>Ao+yT00v(uvnr9nqhNA_P3zPIdO1tbakG^p(?dhcXi zD2)Z+v-4b_E4Dgd@?EU~9&t+=jB@W8%;N#NZIc`j8i-j=T7i-;g#Lm=0i2Kh1Hp{S zIRzH?VGqzXIs!s%$-=N>@FZa-z+kX^kDBd=(q#X7yuU{8ueJBr*7!4q1@IkRX2_@9 zV_{B4F?%x|jl7-yZqbefZH_EY#*P|@7m-}Nf+M+Fw|aExswKBqXWiR+(JwFz2!2A( z9#Mfglf}t26;Z=ca5Zs#p7B$m-U+?qj%j8K$$vDR|H^1Wkh6pE(3wA&&g?%L%>(;E zT1e=>GM%7n?B5y98w?w)+~k0NZ8~9pFq#*kwen{8pMO2xzdUmO8ol4g_Frr7udQ+K zFT?WR!Ypq<|I_5(;^ulb2#SvrzO9=O0zumuvp_crOx_~5`W-0+EtY<*<@kH!d!3;Y zpZYyZxK;>?z#Fc54;_x+8QUn+%a`EkA-A+fB$b<^fj`=3piqU7KN)7V|r5s-gB zocRm#t`A-UCFuWx>|Q_}0Ti9-qQB)VM}^hM`~=52WHuX`c&tT0DQt6noTVLFxVQ8NPF<^cabkDrOq(VTVIXi@&7Fk|)2sZv9Vv2^=gEzejSZJxS3Hb4Untj} z@Vpx^;k|E{rYo>@4i)&me>1Xs01S&SSq6Y8O09hi^M;9sS7#Wks4=^*9((OCF-2jA z)Sf-pp(@zH(L2c{4^oxF<=-?iv@0HUPIaKTa(9$`(U(7_J#|a>E4PD2%OO+w!pGgZ z{hSpaDInw1ate9g+E<43td4B`c+G17I?)x8p0sbIQyWfw9(FzSOZlGJ8fHCzUuJ^# z1;dz2Xv`^_AZO~loL(Ng6)$EPU2ns$dnhaqo*2g9LXQxt)kNdjCx&Nbo+*qYjAqfH zbv)rklN(!TX)m&9hV+U_!$)qPQ@0bOy5<-0Btx~7 z6#@LM53n`V$tWZX=HAJ~oXWt-%<24aB-+i#uG8(?kv9!% zh=NwWp*N)lol+H(-Dp?oiM5y9-n>qTswlfJ@_3vM+6W^UxsTV)lbi{S-=Z6kaj;m5 zJ`+~%1Y4bV(v`>?^C59*hf_k#&KBkbf1Pn9)8W}$2ZEoJI1y%A{T)LFJI7oE&GGS< z#(u`14MmYT6qZL4ADYQ6MwE+syA=mw5)tkgwl9E zM9QOzdUzVy3M)TJdPmJyYGakY|JCxLjn_?(ksan+Fek3paBmw0sngG9hFZw^K5e#O zjSa2r+T|hf5GOm0euhP{etKHgtfaRBc49;^8ev7osn}05)zB8I&OCZ;aUK?GA<8g%ZasdfMUO6E zTm&+q(|a|>c;qqoDdhwWj>EfdL zPlWcg6(-(gqzy`THi;nzpma#-sdSw=o#&P5{*<>-Q(rCeaU>bg?&K6fP%mF+ z5v04zrlx?Lp?!uQqNwa&Mw}W$a+4E3aX80?)O@`8aoufBZ8k+Gp!6_4?xX&>iwdy> zkc%^+rfc%7l(|eFA_wGrPfh?v8?TJO*beJUH@CMls=3+ zkmGdIoIKF72Mcq{x`A;HUn=uEuelx8bk9v9q3mV=m)SP|9E_Rl*eP&36&hI?so`$$ zhJM}sZOqbPvApF)Q)6<(Zo(~U5XN5Gbau)baeip9*RB1qi`T&Z%dW`ShxclH-|Iak z%993BoG<}(Kk!?Mh^?dO-`@pxv|#fXh3+!=z{A z$Xv=*VrHj-<(<*W^vl-r-<1Tidp^rYoI{R~&i{glzCA46dj6R5X6k-yE4`I^Z~IUu5F`1!VsoZ-b5J7Om^bxarJW`nwxl7#C5op!iY(`qzYBTknZi~RFsZ9o6BWo`d|7+T2xtvOPh;shLgqfTQY;;dn`nl!Mn` z_;8ec=AJlB7?d=Mqu(#TWl#S5YuSH)!(L1TWY_cWul@ZEe|^Yb1AFk=U+Veg;^Vn(>H$4)yU+_HZyZ%QBkOzf&9=_{;8>Qea^>vZ`q#yWnccKk^XBh{kPvs ze@*dUQ~ZzSezn8MXL;A~1TnnP+Jws-DuhNq)SyzNiE(gqD=tYob6xI=#~meh{K-pV zyr(K_K&D_~71eG2St2$!In)iSAkUb14 zhPwWFd&q){>;E@Z(}VvoaUwziA9yqv}>@pG;tFWGsC2-tfk$jU6NDo93POf zWJvCmJ41ZyrQt7efyi5yRF7;^@_|has z$cUWdpEq|Hkt!)o;fgODZZEyvff#|YRty{YRNI}h zp}C5A?SN=**2rRVH`#DUtlivU9MAWa7y$II9y< z>*>{zk=^4uhwNiKte+zuAC+C#tCuXx^|61N%T1_RQ`*0Q(54n5Wao_dee2tJY@kE( z_3w*|b1LJ_l#acSvpOigE>LMMR&YFF{hfVyzX2_D? z5!_p6IMn@eF1>T6iB|FE^-rbG#~gWG^|6;S;d@Pm;hpk(lVize+*r@qO#sGw`N4lv zLx5n!Px}Ic(4gccEIv7+!NJjWuH^Cxu17;r_GCxvfbWfq<;9FNL+Z+!03&i)I_v}Mf4d>s~ zvu5&m^u!iOAiVsqrdhZtKuo9Q3~FJgK?}$&xq_Jg+WP9A+`oZgSn+LyK4C7PUI3K= z--KHJZan|EO8(z`%@9ZX4BfiaB#s)d0_|tHs>ooN4_*HSiOZhDQvJR|_vDr^E~p3W zyCO53ur-VSkG=N}YWnTogi%3IK?I~o3sRM;NK=r2NEZ?@LzfoOw}xvCeam#R-44E!4x@;|zGP|Cu8uMPRXI(AE?5{9Cm z;lUw6n#(K&skxL*IR< z!8NzplUj^$rGkhyBoD@pIG7H~rVjNe)R>F7FZz(zb>)NlI{h>M=Z^E0vDUu##on+T z#Qn>EP6ejoFs>{T#59sEVBN@o6leQ*DBuW&MqkC(+YrTJBfHC-xpNz`GA&MS6Sp$p8Q%Z^^9$Sfny!q?_E z_gbwE!!Zo8Ygn9-`leKVw9lh13D@+H@8$HbFVMLWZODhJz?pagjHCa{>8;ZPC`wS_GNmN= zn>4_LT?KIJae0UxgWAFOS(6)IEgj|@xI?RG!k z?z+fCS){%L+p~rus$JSM_o6^-KIHz!n7|F`u9QM!evk{>*KdL0*Y-KY^)-~@npTl> z>&50avk6w2qxtpz`N5^X7x0gUrWS0oJhq#~tU7l7(t*v>CZg5RuVB2$!RDXwdTVjw zQK5Nn`*iQI3Pn>Y3Ca|9DI#?IGZ>HDoEQ344t`%Srp$(DNqlMuYV8cpo1T%$%IAvq zV`6*6F&4%%V5CKc{zzlPf1to#c|4N(ZX0}%CDm9SRxx;V zp5}z`#2o9DVh*WG7^*}KdgCi59WsNanM%n~5pWpr<{fC}6+HTJ;ROO%>%<+cPD&wI zFRi!koR+&xc`zviK(D)PR$`r9J8^2!gGEZ=w8`(EUSMW~dOG^18Jj+qP-a01ONXN)pYQz?K*S{=$IrN82 z77y+TK<*d;4b093&SpvXy52mvwZR(^4L13lz)UHx;dk|VXf)1kUa_rXbw};f;rv){1#Lq zh1q))Ti?_#+er;Pc6c@Z+*)PrT6;q+Q@NH7u$$q*T_@XHFeifKgaqvPq`JA< zJ{IhAY(zdC+y(-~cwC1flo#05g}08<{J4%rEaRjeW~-uHqv{9IpJ*BD~gzG&i5D^ePY{F+C`~sMai1i2~9ahs!Bs+Q!DYV zBd#Css4(Zh7TRYjg2}x&*t&hlau2@a;gL{~YWY<3RadC=;K19jbiER9uT|ArtLn*I z-n}IJS)%y-%?ug>n8PaoRfFTzC4-!+smaY;b2ds@(7QEphh>c~Xrtr1b3xzv2@NWK z!eJ7yk59j;K8f2LGqJc?V4OZhRhtAa=0GaCBMy~EU^Fo+Lp6`;nu3Cz?c0YO)|#RZ z?zXe-K{P4yq)vR}vMf@(5#QKRYbR3mE~L-nd4Jnad9J6K>^gcYjE{_hy(s^ne%&CZ zQ8hkbFGU`YD`MDRv8Y^0}#x+EiqEEmW#Tt0r=$27g1-^73^d*^AZ7rK#b4$zu6-g@-bBBIUFZ z(3zlH1YXwn0Y|aYr4)PbS5T;6#wvxFedIDd8YY#l);W_jYf%7K?&L+pQLg5YM)jGc zeaL(s_vof(g&U%r9xRKfK6T-w^aIC2v&p!GBtbkOaK}>aO16J><>oz`<0f*=$1uj4 zPv60ztetN29Al`JMM+P2?C+5^UzdYh1So)L*zodtWi&~6U%yskx>iB4+$-Nl>#Rhm zPohU5{n_gw@Bwp@5!oc@6lpa8>(aKsYq@0=qT{UeF%`Sj5AuJ{eUAUVtpC-As*@|Q z?P&n}PfpTqKLvMTu!XkcLJfqQ65RTHIrZ0i^Cf5M-!Xsdi92`e6!)rZ8dDKM;@s?+o!nu9livG?ckK8juRx6f% ztx*(=9WZ@((bj}|+G6O=(T+X&4nW{Y3c53?=4THD=JS%P0y)+cN?u((<#7BcuHzfe zkR7Yy#sUYBod?O00&(ETjEzoYgtV+&!Ijomr@7eB-U-Rtl|gi@ zy1$-&)nmHtn7IG8TrF4A$79;&n|&P%v5>;SN{l41b`6E{MuY{q`N-y>Nf+T|c0@mU zLvNSY0y`Nx4o`csZ4wd#z7~sCh^O4CTwBc;lhF72qm3#^Hi29To?igO0+w`w2eL&b z6v#*sTf%7oVY)r%zcU0c6*SvreiS9jNN&{)z?xPz%Ex+c2P?w&amz#^aF>K?EzO+c zU2jXB%xzQF+82*1;0lZ~i!iQc6S+z|_$qZ`Q(IS8RTn)nq8QG^X{w;XX>!@#OkXtE;$#ssuF7`bKdU z?_MuNK?D>tcZ6qb!c|LHq>QFHd+L(b^ktngZl6Am31|EI{5t)22Q&SNpxJMl=MB>` zUQnOmAv+ahN%&tn(@Ewzt0O09k zN!IqI8|oq?$7KNvgT_%gp$1nU#qg7J=2tk0*P~?S&nPRn5 z5HTQWVBn#~dhErcBswA=yiKTAplaiKmZ|PDm%E#{EpQQ?2wsXV@R7#Q#(%*r5g1+210bwCzAq?D^2YIj*fyrI zqm~b==mC?~^L`?T$`+9OhT@L59=Qh?*Ot1AlCF3)NU(UY!%Dt;#p<{rTcmqVlOv$KKalRlN{-##p&06_a2m za1?eT{aVJ*BfNRdEBes9PT9;`d8|c3@DMp%?uOv?P+<*zZEv(GAe@oia@Wb5PgU)&UjCxSZ>}lGtSUBi@hW_X`+EQV z7cawQ#%q(sV(>hDllQinV7nk09EJtHpixCI4m~t{I>9Mid!zljh!9@) zktQR(MM97kwHWNO@SY}$U<$fV=nRi2?Ph;Ktm2lJ_KMB9%K5fu<;>vi-`c^qfw(I` z6Nj3k*eLe+=)gp*Qo$Dihigw)#O6wWwRGNPP8j%eatz&oYO|Klv_6ZfRi$1z0@noTJ`{RFAAFsZUOq!Y7-THTnBrDyyRx-ip73b`*;2sk zvrXMZC=dcbw0^rQ`CaU3{qB?FMZJnW3@1sEEKj*W zS|Yo&f2PRNrqdpf-0%kmf~#YhQ1hm2!*qI+)49-MUY!+G%FXX#SiUXf3?Rf;fS+6( zY5_>B$hI9vGt?t|OSs{0pDXt1vSlj?4t~b6*P80?EuDOL!WO$YAvo{ht?lZu{R}1L zvKPeB>O=2mUMc!;cBQ=hv4bS-ZkvKQ!F0ngG-q_-A@0QYG^nnUupwLh3Hjs9#Hruo=AKh{k%719d8GkSLRxHeY zh!)0K=AS8m;g%$sdbz1MpbaU2`w8Hk$Hl>mJ&+6bkN6gxRf9cvm zaSP{yZ%yeJQDh0W5s}Mp&q!JusQuP@E#EfdguGiSL=pS{;{cZ=mS!!(aFZcmaJEP#GQt41NS4#})_Uke_G@2OrJY zm^SN!SOwnVwMaWt!c7PZq7tl$MbvB>(?XmG&M$8J^&4GRN9SgzajX<`i5ge0bPtp&^|B>f>qxlz9ez_m%_ae5}nz?Nn~X`kDR7-TSG(daQfi28wM+EO`nBAp!=gl zacYPMpq4au@z3&P_kg1*>cRMKAy!NyX<0(@f;$8ef8?&hYSdy zms>kT;efV*nbi61C=R5nZ-Qj1Pba!tIn9Q6)ow2Zk^MC+1Wkk*YPZXu-k1p|Kc=0F zAm4{aEW5PEX|**gG^CkKQW(|D(SfSzV)a!G7l{KRH>IB&%j)&sHG7iyG|3>#(%Wmm zodc*jm}k6fslMvR_hg+k6JwrKk@Ki*o!3`GzNU)Q1Ousat1Du;eF;SM0m_Jc zyvKe-Cu(Z*jo>+s4M8zd7JAMNaj}Wd37TtZ!@xJs$CD^l`z;FN``zrUWu%Dzit2Oe z!KUO{c3B0HzWiyj(;{Z3glI&d)w70EZV|Y84=<#fGvzgeuXPxT@Jr^+X|vySY-#s` za~>8TR4{cz+l-5l>Gl?0{VGXG{uL>2n1Kv=}^F+Pnt9y1X6B=~6&ORzBW=y4j zc3SEXOgq<2P_-fDktIo9e>%J~e`slBEbI8E$EYP>*;djd65F`7C7R{^6`ySOXQmpO zx|<^96fBQyFPqphs{CW1gafgF-Q?b(cxs?OSOJac7d2!upSPcy`D(lF>B^iBduBY$ zePG^wz}APh0IK8;IrLY!3&j~Fr@d0@CST^ZdT%htB#+gS4)Qzxj$U0@T#e|2age@1 z!ck0Ct2HnIO=^M~*TA<~tLlm&VLf1fFWr>to2C=a>b8G|@CXtC4v8P>c{aT@L;&9X zB(w96cKz;apt>h5^brt{>*vsyyuMiRTK4v-I~JFv2BCAh&wt;On|Iknx1*v#tiiJI zS8CSyNxK@t#l&sLTiE8EM7neOmzS1bGKtxor3;OBM|SMRLYSMGH_S5@I$1BxzcWK(7X`O7r02vM0IM71IZXCRYztama8e3v~t|2`~GL4ue#y< z)ROJU69;9c=?K2K;5FLJ0t03#fHp8MiO)(F46Z8Frj``EmH$ikqLQIaf^6E|%toU^ zA66w>8$NNmV<4};9f)a10*_3SCBaEmOXc-29LrVbK<`&C^feWpacO-&&BT0>>9^*d z?G8d6P|aYC#Y_c*3Cb;0(>JxvVs*69(Q)Ky;!lU?Ce#ffRUoY-*8zzP*0>#ZiWGr6 z+cX1g+eN@x>*uYIe%O^aCA3jT_xP1}76xbq|ELn0*0x&z=WQTr&R_7M+do^DSierbQ5oTf;&CTk#i&;FxF>@Wdz1oKTNacLB`TQnVH3<%IKMf~p1preHVEp)nT z|E3>`9kmj%m;vELxUnKLCOgr9uDDpJ>R@j<6FHn4Pa$?br&j5XnwCiNSL$ z5sUGt#k!DYUZ~%txdoD=LCxq|#%x8nZe8rv=kuJkpPoNIV^{ybxA^M+*MR>|7Gaf~ zU$AtmOTP#h888-BnVHR0MMh^|j(_>m(Zj3bhDgQP z7i$=xk^luqVJ-vhaqP)55k8`rRPdY2Y6~9F)~BDXdi8E;+2uMvCh&xwtxYjj&$g&( zf58%{u(e)M6K-%9&mr77-Xq41Xcyl9w%e@|_rALRyW8g;ygahnAxxEZx zB6Urp)kMmlZl!L-_BwiV_OZ;#58t}@s`JId)2Yo=WnSk(n7~}tER6Zr&k((WXbrRB z;djiX=jho&R21>X+h$~rO;DwH-Lhdi#gaQ(nqnjneXrkjB2k;D^Rf0&zVBktaICT; zkDk) zZB{7I2;v;quQRYv3_ZF+Jv*t4L!X6%yRF=RH!J-rRnsagjk!@f=Hbxz-r#fCEB?Oz z?`MVhpPzmM&CmTF%i0Za+FaT|@8=n)nblO6R>AYbYIlpkk)=7%ELEf0>W>{0M`9m( zncZjfAL$LAJ2Ublk9N)o&_hnJ|4U~dX9(C~S*-#2TsdYRngOH6PJm8~{A?vC?3pwp z;dVg(GmRErgI(BFcitnpY>0W++TFmX7L*JvQB|!g8pdT}qCAA_qjp7ZW}zFz9JZ?Q zUMhE?x#*QV++Iwu5XptuOzJG4$R|EM9O8za%)dpsFz#H;2s<{9W@l>ee<%2cXPJ@S z@m|E;L*XoS$CKpYU|GsFf<)vhV2;z|mb;m8!0tOf%|xiUURUvy*KD2ug&KvwoG5dtRXY_! zvuRORF^jcSyPw(U(qL#Q%4~gPq62xsbU7}8X!@l=y;uOG6gxUqwwFUS&{R{t(e3Ra z+<*D2fB=(|ll=!x{!6+-V>QP>{e(V;Fj2M4I{jkf&OpBn>O9mUz_!B6GIg>qWKE%W zyG&IwzVCEA9eR{^x%i@`%Evw>Uo~!G7O5AC=U8-!QI|02Ck`kL=Y7*z(MP-tDsk$5 zwRXc9G|L=lv7$?1ms^~hj8b#K4Pli#HYX(>E_`wOW0>kDSN=A2-=iC7CP}(rKFtAI zHWuL6G&?au;d?-*QjYnSO_s`+!Xhm$%lziXvr;O)@qYOa2I6U6N1P{nC?P3!Ip}$O!~}+S70C5&l5R{LzYH=SWB&u% z;xmfM9YUvyKSlz1M%Bc@ z$7b`yyB42!3oI4mnbCO@XLA%4WV>X1)~(xu5MJYy^Yl#hEM&GDdePWpzp@;`yF|N9 zvH7LW5Oj?I>IAcWn7|5D>GR*lPI6!L)jW-|6m_y84jR)<{^`cYEU|VY0p0pe0mp6x zThN2oR8}1+fzG9<>f_%*qd{`B!KsBA%e2lywtpgkRaR-wvhXoQ;`!b3kUf`$`^xjVPJK+?5)|t3F zh&#oAZKa$4Gt+?X@F>8hGKn{& z3n2rahs|9zNeX?JJ+{T-cYj==VDk0Az4<>zPQKia`VuwF<+T!o6Th1>NvK`&9>LrI z>LVDSJ_7oG>m!gP5W_OH00=Zd9IzlhB)z&_fp-aG$3fSb@zd{o{1u0@Y1+L>EaFoR zbSvfe*1Z{xSq225@e1W=?-Qqy<~u>`lRn;`T~U{U?iRV*hfq@&%&Sx1bS$#Uh{=2+ zb_Nt66j3!G3Wt;xHM{xJ5W%sXCNFpmspE>Mk-_$F$MJjL=@5S(G@-w8%}7}2v51w z(0^nDcQWPTg9K5}Lrs3v5$qCM?75sXe`ctww9V#G@^a;4pG_Wg;>leN;11+z5~7<1 zdUN6zS?aO3xGrXjyRl?VEf|~-h!oB(6MT|i>+nfBNoN;b=6b>qvzc*7;r00R{A~8x zlW;NVm#6%$>KLENuCcgBFb)qgxm*Qzv8WnfejAohx-0ViiDM75qca^UfMN?Ast$?+ zSt)IC@7U?O?6cn4TkM;iQc~T1{ntXE<39!hpB~boV2W00^_Bdytf@*iFy|1nA?Qh?X*I# zIRY+`-2^}4MQQ|n^! zJgueXb5I`@m#cZ>W??h37v`*;_6 z=!r?kL~&by>k28Cd08*GRn~NedB7};qVG$%yEd4(G^9U${ii2oS-nzdE4oQqPS&MT zGS;W@ckow4t2~Vn_!#m5sPLDLZ8Mc--nhJO>#+E(y{trb<{B;AVox_GB`i41#>RSj zrr*y`vX%b)kZ63X37d{(I+E^GuS9`ZSy@e7sgn6CX)faLif&%IuaTkWzXGmpHyGf1 zJ7NH`*diDMt}1{ew4QTmfvlVD;nim60G&|W!g+Wh(4KhjXjM5*8>kx~3;gsGw4>}S ztX6r;XQeBC11>aQ%>;w?Y0zbQ1efK~)Hjc|Yt7q9*)fWmPJ7ALb-hw%4 zDsV?*0(UFs9mv%PiVHe?2ig zxIR$>7POX&!=BAjnA)*2yrrbfB)HvER*yWZ$#rVGJ!3PK>t^slT-N36QYxwPN7Y!F zFlMw|q@gxTt6Tbkpz`BiCD(;QHzmgrcQJTpna7UVE+(z5f;H4^34rZ!JNcd4GKSZ+nLjIhNwA=3#tPs$ zUr>lPawQq!l-n0Touc#f1f4XT9&UBU=tl^_V$GY(-6#vF*f}t?ys>CN^CXwV6Z*R~fx;sK(FVT3M*B+x8|z5P8R|VbOvtgeMvC zfT25|hkL7C*XGD}xKFfeX!EblLS})KZ(0mJjAr4XL0_#>w)1KZ!NroRazXx!9?Ad` zevdFAaAiTidfq3C*1as~I;OkUY^@UX?b#E@Pq9Aebg(@JYp_mCCkeRW%HYCqlulOl zfQ`=S(lj>7%0a+((}+*%(%Cb+CN1dBzjWA1nrSQ`XK)h^lrHrZHv6&#_g}p^7pGdA zPQ7IzQx0EmRlm|`$jS~6H6HPNt|{5+=f}*h@H~Z?OULv{iik>==0W)vOeTsXtxWmU z9gf(31l+2lVN|2@Hv6lbD&DG~;eq*r!lzI5zb?#adpMoaLB{iO<1{A+ z-%o^Y>*|r^GKnQcWta(SrEO!-+``Lsp5@!T_IZNOXC_un4Nj^y(Iip7I12X?@*PdC ziXe+A+_=?`lSmM0Y=~xjP8Rq+3#?s7^NL`~Njr>Syc9M|z+y=l-3+&n!ou!c+k-z} za%v=rCbgW#WP+v^h-ZwkLoHU5ahct^Z41-9nQrqMqv|tj4m@jrl&N1>Fk3h4+%`V_ zd3Picf>=aWz?HiK7-PCS!y9SsV=}NN)b>?SCeh8@Hj_3xF zrZ*cK!EPmTmXivQi*BP(!K-632aOkArF#Mp@v7$L;L0_MktqQd{Th6R1TiP1MU|Tm z=?}{|H#MX;h~BvBr?UG}@Y-#RL zxB4L7@ZplYo*NTbUgx`AfP#PdOr_4FutRXp0Qd4y3yR&{Fb@t;6T%M-k33>v(30ta zTgspBCs%+q?dl+*AWmRu%2skAyf@%4vkrv}6}F(b zgNMOvYCM=qP%EpFDulzmj`z!FkB@Ep-N4PgD_aQK+;M!W`SNB{?dbO%Q`#?S%;+sOW=OMwnQOa#QV6O}H;pQ7gvVZFzK zP{jbW#>GUM1j!rkVonPE0>{aCcL;(i6KQ)74Y{Jv3BO}blIFN_Wjf)MRKv}tSbKf+ zXT)LxNFeAju8gA-%n)P}sFVj=`u-U+lAoa^qUmvU->J@YHgY&b!Cl4nrwY$yV^%>s zSJf#oBdZNmwNDGF5m(ptmyXWh8+;GQ{=!#Y)mxa3$!t#{ABp>jTJ)pvkB~?^F)9k- z0v%$5%NkcfvDEE5GFiXK6J@XXE1UXh*zODOCGsxKE;H_P5Fb$A9u8rT+K&Fx@v0$~ zr%Pqfa$o9tViz{KA8XhBOm%bm@M87btsj}iEnQ}k=en~W_LzJr^BwwqMw}r{WE_ty83&1mJOx@3ZT~XsB+yfV>4#k5GVG1D+1; z7$r3>md(xAd7KiytJUsZZGpV##RZjVGan-8T$+pr%wCo#_a^J+gPG zD&Tv#-A(lB*zYjCC624?<*|Pk>&c1Zg-|&8hR*c{h*Mvh9)^zSm>iwZp{TOD_3!6hsjkc(Z zk{ro5DC&5Nm?fx(Lsx75_i$s(1zRJrmZ%@RiXW~DM0V;3!qU5rw9pKF1<+d?4Yb$b z#R|wiL`?uF3I9Z#So=Uq!B;Ra@bu9l80kslqi8gZU7aY+4Y%Z)@BM;&@mutPiV!F{ zc5(^w&m%?xtv5Y@Q+5>7%roSzj{5Su*zsn=+nMj_o-WC6^FPH^$|*Q(>ZX(+Sr`Wb zL8D;6FGSpq?Vnm%1TCq+&*vDrh#*NaZWn(hNwuE{<`lX2`xLqnQ%Ax^vy%0h4dOx@ z6F&H(N3%rCDkfiN%D^5Vl!hLKs7Bg^6y&CB<+Qe5p?~RL{?X`e`jCoZg97w8g$meP ztO^66e)1?BFrCkyz}Tq^AzF1Y&am)o#fhd!E#rOk=bl5RNAe?4OrwMv&x~MAe{?ZdDe7?{i_w=E zTh=XEj5K%=4FPgjIcl5|_(b2|E;JX>`UvbK5NP@B*LIDJnWrLOWLchEq2496K{mrn z`e!7vS^SSEoLe-b2yI{t=Sw$$aO9+{svcha*_X_l(V)68C1!?LL<#aq(#bgD*k8>8 z^b5Oq#3=|JqLt6gxYIcDqQ5EImW}oF`|<42ZtFlv{vjrQp?nP|jh{DF6n) z0GQ?l1V&oR1mGoODg~H81Uy*9Kv|CsU=fII@FL*hRgDJRc|IYq?KIQOr3Er83Fwe| zNS!E)o=R%r`~vb1NPxJWfD$oyb4(m?_k~lgjx@7uaPujG`Hk1@7{KxywGYZQyF~^v zp9y}Amzu#WW&-rDrH8bEfQN;}Gsk!K;+ZDU%FK7#<=?rn?S+Lx7Z3biL6X!(QeiV& zwDW9&X`VYiOFVMgmGX%uuLVR?Q^t@DvU z9zuXY((YiErfD%3@=na3u^SfBe2Mxw_=@{qx(gK7@>;9J5?wVLLyuQi<}MS~<9gg)77?w;AyHqx4mekH zS}Yf~zX=AP5B`PaCB+Yp7)ugpKNWVI7bdTrzPFv16~}wa@6`lGyBa_=%G-fO)=|3@ zeZ-gBHpdpcwxcTQ?^_bf5sOcc(7kBVHN=h<9zpy>kPGu@W^)}K^2s}gLz!pH^km>4 zKGLRl`xzVgBw>xt@8AnV%r z-3g~fHPiB?5B|(|#A6h$&-jXTsT2>K;=^5{oO4tDbX zJ(aFG%4;HegO#X&XN^+lq5TB2HgV!eRx?j4zPZU>P1Q=p0W+vchC-Sj*~C;+&mPYye{{ z+bF6j0CNd|_h#VdKLipK0;!OWhufDg$lPAue3j@qfH{LfxIa|DPQdo0GTbQOcZX@) zz@2xQ#J9)_3}>8$V`sLl)*^DJr)^u;M4O*{(BW_m%ri2YStd2%N~|Bp^YyhXJ*c4aF3@>sHtO6TTyBWrmQQ+KTs-cpv4*h<+9J0hqj_E4cdFovTSIW% z7p&`vQMIqH(oJ24CbnyOxM;ESkI$8v>_GQDciE(N2^OukicTgDZZoI!Sry)rS-7AR0QeiNO$nwm7XMn>T~j_ zM`GzX$-wvac0Yi7sp%gj%=6tuSS=yAfH9>sNHddcdQXSn^4iVm!iMBIpg}!pMd8Qu ztE*B=o27%KNctr<3T<83q4wI{^q;(DnY{|g(1edUF6v7f=&e!xk!tD%gQ{VLk6aVo z#^I`g@JIHJ(PB)IdBacWB(JIa*QZ%}X=_mK0Z;i0sNKme@i9{)1-w<%{0q0A_WY&u zQ=vfHX!IKh{F6L>n6S%(6WhQ@OicR*Ye z;7Sg`kha?IphANzJzf>LVh5U1>wJN0vxB|;8g|oC)clG-E90-p5fuIbY8tgXw0(qz zpTJ_8`P4y`lOENFwSaGRb;BR0TK_2Agq!b<<(+Q=@IAX_fbzrurpC*>2pbcWZfr`9 zJ!W&W$kljrOH?l%;AAb&H%C#kFs|q`!J~HPeh`k@x1d|L^4%tx5A2Jy`Aw_8bzd$> zaZJ?wR$3DKAzHO}&`igJ#lLkcNhvib=C+u@3&0~CO*-tt+zZN-7)=gY~Ws zl~z^?9l2A~fX%QBk{xfBroagnJD_FT$wCdceEk*B)?wVE`b6Vz1l9a^1t{C2pPN+cRbWIY^45A)blm8vxKLi}&Y1KxhI6-$%nd#Zhk+F&Qp^Ac7ISl?z`K-JulNu-zTBT z!ppy?^=MhrlHweu6$To5rdN+_KPkDd+4_eeKkOB0vbAB4!Wp>8NNi36(n&futGXz( zk719DR<)s{2k(Gzj<3I=p5EMtT-jG4+QFY7Q`k*kWnK@80~Gpw{)$P1yx#drl*2`- zG9!bHTj{M`19`^)k1|B{%clhp#b)%`f?T-MK2Y#e8(2ku)LpK`2&?e@h6V`GFL_;zpNbR{zJcENQmzUvcX@jSl)@t>8lJl zzPIrcK_UcDl^eOw(9YGVG!A8}bEs1e=cpmxD1;S7zt$KCM5ZY0n#?_1o2{}=R*oS` zw7SBLSFBj#?7f?7>eg;Tj2T*Qx!+OG(}uA=sYtR^(4&#pQ}4M_?Ji6#hAaL~=q`Lv zls84kaJj}SV@lFBPq1($g2INR>7b$^hpPnuVIrD}7h((TQ6vGVi{23!9xueDQT^Q@ zC-OK<;FgU9emGlV+2s#FxTQ}5SawDA0NnHa$8lKKdh(zf@^hWSZcKZayH4wz0l=65 z3^FS4kabZ|Y8jk9gpHw@CWE(K@F-f+#v%3Q&h6VNDi=?O!)| zlY`9$%GwyCpGc_M8q+_wXhGl&00CzOBM_}E14WBR4`+M@pB6`V4XKd)@S#hHHp9Rf zNO&;!C`FMgzvoD}iy>mrwUr41lW=v6J?QOz3>gI4KC4TO)Mf?$!-b6F^~o${@605q zm-X$vI{%Z&Lqjwi5!7fUOuKjDC!xAis8fQB{3ade6UCIowdcw|C)- zA5Xfm4rjQSb*e2}t-wOMkINw&BnE}IjNCSUr_O6Au0GX}a?-uE%Ht@HSZr;_$cv84ugRAktL-mKF65zSeI~wI|8V~xu|N3 zh$bogkxs^pVV!upUQJM=CQS5Qx!i7_=aarLH>Fh*wkKR7-aOI6FDnDX&YPM7Er4mj zLz$t48q>^AEmW;_hY#7JuzuDE!mJ~vpacJY1`KG~5g9n|R zy|oF)7E6$0gP%af7VHi_x#LdDC^=U6)qER%!I;|U1k_Dl$+X~;;9vJF*qQWE+g17^ z*Y~TkrtA|ks7oZEE6c!1%>X#!TRJ2^V2;!DPIIG5T@A;SKEJc+xl<^KD_yr@UCJ31 zhr)|F1DgwVgjr@DM$A1iSB|Wi1GmkC#wbQ5T-E}@6VTp1*)=xnoP-{`b@xvf50CeN zflYI2BKWsR2@r^DfYSWe%@n<|=>Z<)O0W!O@#DgN0D`y-{8I8io|zi04m|Xt%MNhu zTu|*Enbpdnrag-BX%cr+wm~MX(1Xwg2n`JVUph|=Kx$bA%;`l){&?aE&Bz(*?`b0Y zBKz|5x2Ko=MbCt0zZ#v4UTrhFhFyOs$UQx1N0d5e7%7`nn@FcZZ(R{QXMb#&_veCqWn$mc@{#XSod1D8QvOfJAD~nW-U>v* zlYj<-tZ zZzaVOFqs|E`{kec{BNS5iBI4dArwA05FHQrd`jS)L*}_j?{clSP7HezGp&0%Dz1pE zTD$GuYAvEL;@4YH7Y=SMp(6rVP!X^5qy{}obDuiOe?RppY_sDUefCSb9oquVQK$L= zKfo*%Ar8#Ec(P(cJ3w5DC=N^bo&|ozx9*QjdAf@ik(fHHef23W&_~@SOyktg=+1aQ z=gKlmEpLM-HbijgSE+VjN*5EEvDb-yJI_dp!@;>&tZhfHX8#u6)=75a)rKrtp5HT> zx`BRK_PC)w)7%%FjvY5%IOLSvAt`M{Gy1dw+ne4flIOjlp<6#-W*8>_^KKRn&C9=%9pq?R{6j)I#nv z4g%fA*A^SP6i&J2`7{r*A_>~o%+bst*Lhv2Q6ESNOGiA$Wn*H!&h+3OVe0QvGo1eBGXWY~hZ z~aCbjcDbN=^TbQsLLl0EV#6 z@$vR_@eDU%=H1#rcB!Q58zQiGa1iahHrX!d%-B`DUzd>(DNOoXqBWFQ zIkg!b)5Xy8!~rprdRzZcku35hc>XV4rEgB@rl3G0VW&2s*v*f_YF4YL{qAQ=A#Xkh zOA)pkJu29>dQ99xHELS|hooD08e~F%MW{jYd9uQi*>#I;Ql+{-eDF-XZLIzBQE{vE z4`{QZlhc*1^?ONJy$y^LY({sb*8{WXe}(Wza~RG`f|$Ku4Sq2L!pEg zMXDscy-Sb><YfWWOw?+L+0{9QH4`6ml2C`;QhzV!iXusNkI5Z>OgndWhaX)Lke9SLcSK@#sNIPB6q8^ z#U37~^;TCip!)0zkff5EfN?B0g?(~a0!Yb2f!TrPLV{L@Z!>?**z10{$4Y}kiD-;E zuH>!%nT+{lpsiT(GG@i)ph_DKjAwy?b8|LW-tHfo(FKaFBTh9-Ng)*{Wg)g4*K6j$ zb0$Pb{*K?Klok%wg$_fUEi08%zeY+OZGX8LPnfwo%E?}>!F}Ovz}YJ&liX52O6^@L z@L&q(B+ba%2*}JbfJmxezLgI^fyap6{HKU1N7KJ_zb2Z2%5um@Kr8sPx@_=}xga;m zW7&}Pl6%D#(N6~UVtepv{Dl;kR+ARlJVMz5NkVx?70jJbEDDaQ7k2 zxwhWdlHN-``2~X-|0~-j

(!=ooU9d>b+_*{aHSSBrLjsi^hMc^jQv%Wv?_hg7}w4l+Y!|E@#)DNQ<7iXd5?2((` z4dnqK#h(5LlRF8oD2&;ITTqhZ3^^Kh1iI1$-dNwKkx59ILR31a_0W$FZc$X|%gZb9 zU!TXe@i2YJlX?qk8|Gk3@RpcefjS=KNJuu|VZVc}#<;?EbxxOnrqOgLc*IS@sKjWn zE>frnzEilGAP39HzZlgx^?&V%?mG<&^TWnCNu*r(Je$r}S|A3Gfv8DsPD# zYr603wDHiULlS#>=pGE|bOqpYA%SfwaZJj;_xKk+>OEg~-vKA{(_iLb#~@bmX2K?y3GxW(1Mq?EdsBkr(q=>&<>=@hel9cLjh0rf;jO)^;nQq9{af;e`G3FnvV^k7qCul0K12c}cc=aJq;T zW0!;B&m4?%Ww_yY{Nan7<$Rr54zUYUEw@bOhd+>`NM0aGGNEJvaSsV>OjNpHP>Y1) zCBusAt7qP9<2`AHiiLF z=HjF^mVHOE2E|f(BHOES<$Z{i9YPLy@GFNc)lI^D)wpxxpYh68MsH)Bpsk_-?k>~_mR|751Nso z@~Pbih{O76`q!#Uo))D{Uonz%9@0M!p;MmSA6bQx6&Y4bh_t!L#u5C?D{W96a%lh{ z{h5MkC#tFqw9yF6t#7osY*%U=_lbtGLs&~0{d=3#TzIQk?>2SuNre2EcqMsASs^ul z(CT^->k|b#tPx3KgPh6=?xvk-3^jIo1Q<8^%)YHW$e8wsNl9rqf47kt#x*yACeH5o zivd3`w~yzlmQ=hHK>FSQL(Y$SLihRdkz3Kk&oLl6C8r1hyL-pL2$ZdEAnSL7sJuHe z&9G1^4=Hyx4Tjx_TpM4}8aeqxIzx}|wEZN1=nY=Oi}U8G{tT34Fk#kR{-h?-NrL+o?ib``V}@6V?{IpVj?+4W`3j{ma-8CaFTPyXBhPPRWQif-@q3LV7LgnmD8y)<|&H&&8KD-*76y z<~WFpEb9sNvVlFAH5}~qd>5!mrIVDkM-J$z#`kO=ZI_b#^7wk>Wg+3Hi>A9eoo_wq zKA~HnB;k<;}dLpY-c5%KK`f4%J@U=J8z@1MKd=%FEKF5j$tcj$5uc z^iq|PPDU>vJY-Hn@d%Es5z2~*Aj2P2#AR2EK2YF3jZ=*Fy~fpI-)?^Y<-_yc2wAb(?XsT5wz(Z}?CxX6p>16RNE?cwM$}Ud zZO$#o|1#z9CD&HE*xX%_VFg8_^CFL4 z^fo_7RbENo-XFu~VW%VTNmxt>m5=26=nl4v=YC&NX?q{KM}lobcRvj?Zf7pz9%o}| zG!^_g{h6)Qz8>y&Y zZOAtX>m^<;93$h1`1|DpDu?3O)tdE+VkBzB83c6%CH6Sci<{KL;KLVXz!^~jSCLzO zBU=nMJUzJcpn%H$1KtE5O(pu13jw806$RdF%blpRs7tvIvUA&V;KSE>) zBH+327_T*wKQ|yFYT6z`9juD+UHjH}(P(deddTN$)ZotRrOqFN)WFsJ0{Mvx^81I) zriX_W!o^=6yb^V2$dv9W4Gk?!7%`J#i^@Z^LypZ3CS29bX?qy_RMjC6cScxPopph3 zB!vJU^Pn=F$Lr(7nhH*};VQzVYR=3Vs7y-)T)cN*YPLF2f$71W*VK*suP03s9PVl# z9&ekUA&Kv-jo~-jY-v(wp$$eLeERLPfT?iNgnJ% zzB3gm)Q6aRY~u_q$kLt`eN4E9NEsJb4^Q!cl!=2|{_V#;*v)flZ7jm76^}iha^HK= z&>xpDe)_rKIue%70eT%U9iZH(illIr5xmJ9P1I{8z$9+~=3LJ*bg91>5ZWq_0*Dkd z5Yb7weuGSa))XoRY7c+0cPNHFNh!>MWm)H_@ae$IAVlv=qjSRCg-6o?Q?JeuOZ_=MX`COO>~#9Alo1|^|(kQeUXTN37N6nS}{yvQDOi!*9?m7vjz zVTRgaqL5`u4O0@$ZA4EJf+}4x^sSuQS82evfAdHB6s$9{HdEYC#ICGL8B8Cu5nq#> z{0I@VkZ1(Ii=W}U0+)EvxAzaaekhV;(yOQG3};+>GqSm`Pm37ZL#`$e*qYN>Nd+z* zF4*pXxxn2-F4rg(YR42^4b1;7>-V!yZyn8|D-9~-ole!eRSjd-=?Br(1O$IGX77{- zpzjgQM-s;IsL>THa*gxO{yh?41B#&X`vhIAzziwy=dFa5x=!eeAEeaQzvNC)|BxKd z#9MpF16DN*Er+b4KUg4LGzr#CVO;0S-L!eY*}~kA>j1Ux;R*m?4w{9wLb<0&+}O~F z0A_u;4jwa0ze?5w?FPf4G4ZZ-&w)#mJ2ywIXk?jry0jz?))hR@<3fvZBu2ENjO zGYAOz(nw1dY~1LhwN+|bQ1=fm7M%Lj8H{At!q`$LuY>2Uv-(!*zz> zge&}{=@2J@i0e)zbSv386c0h~GC`Z1R=$;GS&)LXF}+?_Ht&~7_`2m>1k8Qy#;rQS zXN?p#lj<>}JG17ii#V3c%^-`EPfcafxmmU^&~M5jmbjMD!zFkU`bxCKm10?;~>6HlsFk4=ZYeG;S9Eq&arD7kSIUc7kR@yC(IY1aF+KP(_cM`*vN$=D+wu_{Zy(CS`osX^96t~# z*v|RRhiQp2GZ1RBs&ds8vvw&ox%%POh6VfN5!TNJ?kcdg)crFnT#d^ExSY^AZJW`` z+UPODdi<-~0YxcGnKz8h%KGv}`X?@LI?Z~Mxek4$?hRZ9jTfxX*670Rn0)7NI^k-B zYHMZYj#4i>fye;iHCWl6cENksJ=65h8B;obIm_qT9=WMq6H>mDa5*!R70kJ6ZlS*c z#Dn=9YRs-p=v=Q%9c_dJ<|umHunL*ovS9g@-zkna@T0-GlO3_NyShidJme-W5_x)S zE@OMfWPo-g?sZnsbsL3j*-obF%W6Li4!rc`2_6V)|8DvsTgX(t01=eOY2UXU#bJEQ z@qbbe|1}3V!)7SHf_h^UN{QNAq`s&|e=o))|1Fp9)^(Ec_qN*^;b%ksJW>6}ua+RZ zjCn;yCcuXe{+U4c=`Su{=+D8w1AU#NGBJX-7pAD9MZ#KP>Xb{aGLP7NMP;~?8eQK} zl+i6#*VQMR=m;un;?q6pZCesKSKjJgrxyDyLD%-JQWm=ab7vqn6@oe>6poF3qC#a0VbDw+Y$PR>&`i)~3 ziRLNYm^UYr?#i22UyF{v)H&+DFJkx9P_4XkTX>HVZO1IpAY>+Lbsr4wFP-}%H?dkK zZl-=C7$#V%4`(G?;K{ZpK9#)cKA#BRG`af5cByhOZVV+w7NJCdrUN?A>W#|IQ!=NUP!a8vAZ4yA zz=NL+7gosIY%n1kd;y&+p7Bvu|B8ORANZXcpfK+k6QyyklCaU-b12HrwmMooyNcS2 zDW7~<*vv1rE*ulg^K~+Pdl89WgOBD=!+NNu+i>bNbhUV{XU2}!*|>Fo8BjSLri3Gx z-T<5@4EUD$&V4(*{#8$P=^m|q+z-i8l3hih`j?4QVV6#=-?hMA$ zK6AJuBy=!o`uzWQS%@b!KF`uP#seLu48pvF-| zH$u1;zt_396GqbqC_O|i(?n{_j&&*qns+_3cX;rX!y8@VoQ2KQ*UVimM5rPggzM;U z`P{6pJ4u?t@hesg`Wu}Y@Fbk&^!!wM|I6G70sRZ(Iuu!kT10c77RUDwt?g%xk|!lP zHKfR_BvZn~m2&(>OAK2Jj+t5cTCYf)KC{-z8`-f~pGg6MheOL-rV0Tah7*vqBru_2 zG%`r35ZmjxA!{KwYNl2-8z2^L! z;MozYez^Jl;fj}8_;%F?KuJSLbD2#zWl6l?um;WWuWoYDw<7X4MJf zEpaNrz7V+D)5Aiexbj~hU3x4fMordBaLe`}UsUrIPS=%{uHg2?*C{Yb>RH$Is}fK< zq1NHZg>U9&Plz3z;N;RCkkP$bw}`R%|?vNbqs{Gz~v`GWpooZ6RL8Irx2O$oL=fp z5{GUE9zMah3{fi9huVj%IsU+q zR_%wnP(x!a@fN9&`DrXn#Qz2*1nSTeu~$kxNpK205o%s__s7)tA6<7u3ZIllJowIE zwEi_XrXT>Wbw*3QL9ZaD#}7gh-B|T1ifZHiaMfk z++T$xi_M$`^Duk@LXdtw$13L&(hc9dOk8-g93Ag|cpIlz&$;yKM%0CZmkY}3W28(F zw)v3q^1HH0=Cev6Z!6!}qSgwoH}QXxZMBln4ZE({6(;y<>uhL0MiX-vTwmc??$r$} zl76aTenrU`>2hz32VOBv^F!FL`SZ!1th;p|GO};%yh%39sm=htb!i!J6bpE`qEOmu$>d>T?1An7;CWbfIKMhcfPP z)=_ldb@PcqlTOC<@W_-g6fX%7@$Le-Y>gqQ?QZ`1hf~X3g~eLZ?>s!7aP}@(XsJbU zY4S2Sx~_JLXUOW?AB*=(cOdA@jx^3hS)C$z<4_?5YFZBLQb#KlV!Svoil)XUS@--Nv8xdM*-I4Oo-lT7;yKGB^V%aRTs= zR=KDL&+|`16~~tq!%b#*&28G79dw12>4jX~!}B~(Q;g_Iviq|BER^(hFKf(mAwE9( z@$pMZQN*s#C1>j`TA}^#lO8ZvOtpG^eJH!(X?#h~`C0k4Q#XVWV>dI_GYgM^v_Y8F zgejo~9dOY+Lz#_2hIk1Hm0j=S9XuUc^U~TE6t-$PjCry@DNZl45g4%Orw9ojcQ~WJ zcCVY7X4V(?+tra5%mfAbL!#Q8F7Z58AY_k_k24UJt7=^<$zt9QB0c7HKHBcueXlk{ zlAmBMF6Aa%sO_ComP(#SG9c*5XGsU&-Xhsy6+^0pP<~3|Vw!3@ERqwK;7;j!{Hhmu z7=(tLa61h~Auu6-8MYt|iKUr|YW3QF+ct)AX{qu_?HIngeV0=RE^VHvXkP)QZI!cC zruouNe(7HL5`e$~=dg|~s2+Bt^j)U2S--ygW2)x}Pn_fA;+INa5oL{nHqB?Y5n3Fg zZqGgys$#37ebU=6O)-ea@0@AVM!`wyfi9vVGhcLTx)o40u1FAT*3CZ;x zp@N4!!<3YDbKQC5@`#d?Yp`&&ind(eb7|^{Tn zmX&CLqGG5kq6NBTi2Q-hL;i4h0&PT(0vbn>C~m378{gId(&+J3S^WdI0D1i+PB~$iar3BoD?)|x6zKqeQKwo(ion4cHiqEe_6^1xydS~g9i!+Ko#eu(O^I=ql(F zl;?#cb|9C)8@@+vQ{mjZN7o>OAe1lYcVGJ9{A?%k3ukD_0f|MKQ6!b|Ck+^Bb|g(e zn_>JbDqQcfHIlsU=H?iAi8jQ!oU*?gZ`J(lVJKAj#2oJm44u#sn(-=NA$Q2O{}A@6236j6>RX4@56hBN%rZtxXNQij$T1c>GmEp-r_`SA&|fNza>tsM&nAC@d2TY zEcXU5S5v)+{;% zdT4v*ITyFtI4ZKn=^pV=JLju0%dfHu%`2#>xaTiCLZmMjUOEmt3&JOilXaDXpgA#) zAeF1{Y?pMc*E?oA4%+4Ip1gQCv%^f_Sbuch4Kf654s->De|b5dj35LQbU(krDEg_- z%0;AlQPsXW?UZZ~+1k!gIP=Um44kZt?PhM|V?|++M=V<2yQthc19x>h06wHl9@Fcp zw7c7CBl2fDZ!X5Eh+Sw^D{>qHlzdL&fRgW*(#T)_qZKG_p*K=n7mhw>nHLmsEmw9Ko4Zi4Tn5R?`#**^dze52>11Y>2dK(lQa*TgQ6d&t3#ckuJG{0nL`*S zn1Ij1e3Ue9V7{!_QZOlCVR8KgozvH5)zFgK_A9nv4Hgk)eOe^Zb+c zZzBe*FsnIuY7_2?5EGKeMQ&Ou?Rz-MvMf2l<4Dx&)05Hl@1WAdXO*Ygh7%SsoS=H_ zJ;&ArC}Ly@w-Am=I8|jg(Gv&y5_zLddiZedcU z1b);dsruoY75x)0rW)}ZV?>3iipP&)-`Jh1J4p$}++Tr>ZkiGvWP4$i2-gW}iVuVJ z`yA#e3EB7K?xa56I6uL&k+Lg;b84Dl_XlMb99sxgGPGl;M%7p9&8(9v&%}W%Jtnaa zm;7=WY99{LQpCw@UEyb6(KJMr!uDt?!i9>&_OwlGxZc zx81c64I?-sGW!bAlUk2YECRziaU*UUFDkyLNE13O8bO)oyfkvLv{RVj1G|zVdg9){ zjFOIO^lQQs_Tz~yzyYGwK~+;X1HFVIg4{6Ph@}6EOD`43_Hbd+Vn}C`$mvND$dw*I z@zF1yw-vD+85Q4l&F%b(aO;~ z+0Jj$rs9;2IZxY$&IUb-z+1N(psT*v$_%$|w}6j2CmML{JU61Bkn`Du%GPE8g*NRp z`3fZlA-q(57hY3b5@GVf?XieU1^ZOzf%kfj;Y!A_Pj$t3+5v6t;SB<7mkG&u4iduh zW5!t}V_Ep{MOQyk0{5`_j|1wye zf&T#l=7oaH@ll^pSRdNUI=S%um6T~8wT{WpoaRA3{9$vxg%Ud8nachgwF}BV(F#HCxu^tHNJf0g=>Oe`Y9AD8`a7apM*pcm# zw3T&gGRJMT0bTtn-V5|=w_d(wm9WF@G;Xl@-y^{b0hO@Hj^en{i<1^&aozo@!KPj> zdB(5AYEEW;WM8w5)pGc<;V!-5@gssNu(=P?!`^NjP<3M&05Er$4q17T==783U1|$x zy7T7%M(a9^xpM)c!;<|F3?pJ8|#!NhVL_+*LX}xg*qZ>sa+Z@gZ}JzDv$#hlvGgN8FUD^Vd0SA z;FI}0_}t|K&nJ$(;S^I|Bm>ZN2dw%XdwRIdGaO9;f$Lwmt)p9nwAlNJ06W{`$%^tWo#$C66A^R}J_s@>q1<<5|*U#|yk_ zOdHM_UfD8X&)1+R_QRdZHEwz029?_ay5x=mG zyU&<~EaJNZC|cqMEmN{*6pBc@ZlI>}fOIa7&UX%dR3Gw)Z~Wx4-)mI4s^30aHPo?Z zObP3>iq2UvgR;P`S0az{JJz6#D=o8Lj)&1(uxB|}Zo*VeoYb~Bx28C6qLn2SZ{~`9 zR%0N>P~OzA?HiF;N3e@A8(#b@Dg)OejP>L@?t~*%coxDmUEU=>=1eG7T)eP2Vm=FI z{0<|&B3Y#n+$5ppy&e71bid%F>v75tc-J9*51cc@&au%QzOWMC?PtI#us&JK`0X)( ze{-HL8yaU6)8Kk`i3$m756*FL$&zfDk2BNKk`XRZ zJ^E43kVe2fqfhJfM&5C!=VVVxDuNBsmm;Df)1uA-pC0fYlR0I_vXG0YGwEn&pn2ui zu1lX=kM42ZAPI*yC_k8wHv~piYHgHU)Gj6Ju=wr~6J4v$lu%vUHZ{DTGl$c@D@wcE z>04VPj3n9y3?)9Z)k-ENW2kJ+)f`Wm=OzX&f1|IkTzjL(&k;iJ*d#8(ePXL6pooxz zL&V|%awS|te8tBV&N|xVUKAgra^EfRXn;dP0>fwXoMA-_wuj9Jt)FxSFdw<*y9{v3 zS=(MrI;wn$S6}CZ!-W&j8(}CVx4*tD}dZE3&=$vC}1qJ%K{+CXJ(bRN$(8KUpxtV#&xC6;-}{=hjH1njjYbLWm!OM@D&8Dx`7WjBI)2>i%pl z_DM9`C03?S4L4}%kFt1{n!F&V5uC`!n2G+wUY0WC^Eejors4h~c(LTCDJ`KVl5UcY zx7dhNJ+)6l8<3>aI;#`-h+E|ZEi!kV{LuYLJ=$R*rSfnsWpiuiIQhG>ZOPwgd}##i zwyuVc;Z6?~Ixlxsn)kp;l~ytMB;p(VT6qvbuJNWux=nr=v(nM&ab8(WXKcb?-Wq>w z->X@{Dw>#g&iR?A)A|@E?0)F{^3Cf02M4xG>xTVJ(aY7I@Jh?1iclX&lSnQXjxFFB z+dIw;BoB1<%}hyK>tQw7I~NAYXL5Y5cC1Re$)9m6!2U?TEFmB0=Q1`gttV|Q`77;2 z*DMv-o^qRB@YC}?YhkJNe$?7!c>Z;Po$kvDv3ugiD1WBXizfo*Sfn_^7`|1s7?DJg zt9=B1>uLg57$tl5^XGDD{P!Epk`?iZci{3j?)U82*&B~(dBE5(v+>XaHEg&vv6c}b zaRO_ucczV|FTJC+#T~hcb`b-tTNh_%C5cbw#UhRVM;Ez*noT#Jn{q089M5SEeKR1@JgDa+dU3vS#I1)J6vVWB00C#z z%%SG0q_!vfI`KcAm$5{jQ}VsyguXylN7PVKFn2IP$l_^?9}Yu%Yq>h4geRE?hlW0lu+n4b1Fvs^aO;C)k0}bloA5KH3 zLtNvX~gJ(Yrm&B9Ds|q0<(~G z$YvxCbETe!<`7MG#(OVODf^Z)N|nIQ(*OM=(2P4=P3yf6v`GaM;g$2FbnVzz+}^^E zymEf$aZA=)A0yAETRdC7`0Xh)9TIqX-9Sv z_#?>Pglc8Oj|X?>{rlp3@ts%8O<$lFnH$q3NIPItYDqgDSSXjZMh@1^plQGThqe6HHRcJiN+!vCvF2%I`Mhvd7D8&wXK zrB>dTbUWIi(9#^iVSH-a$@`=U>--yY9BK_@qX!kEA!YvJl%(~3>hjtVZiH~Chp*$c z+z3ND{;VZ6>cyV*2Df5qud^TWO0IfNrp3;KnJo0U;^tgTb2m5fE=g0ul`AD+%WUM* z(EOqOTZuOhSRI@cj=d{-Q3NtwLZdy2nt+c<%&MbTXYl+@NalX0>bi2B>cP|TG_`93 zybiRcQwQ2&`PS|pzUZzeLiI#8oJZa+Fv2!LVvvIJiX{a3ciKVO)7tda{`ci}JX*)j zJltjGJ7*qtnTvlCP%7PXZOt|Am`cw-k&zFq$p^{5pSgaxmr|JY?)wN|YlSZ>>W*WG zUZJ#z#k(->Jk=_ukE(HxE^;rSBh`L^c^E+=DmY!2T;Q)$Qd?s%7NH+LcY`Kx^|nK4 zv~I#PdhDBH$~5y%O$st3iHg-IJI`Sv8oewViF1};Fj0%GPqCPJU&W5Rd#}K!fJ2u~6)l{CV$Il~@=+esThPkOL`#w?aawr$~0V zT4-~z3qrUgvHynr60^32qw-Cq3p2-qW7!<9yKc5o8G#fV;wz+hx)z5LBpVr+-yn$Y zu|N%6`9%^hNV*HTFvi)R{B}Et#{c8%o-Y?^sOe;0EDIfIj6C;*(~+!3Ex+@zWGR}( zvSCB$4_B#wJ*2m6s5d`i@Y|aG_7A@u+3(QczaWNj;3fmJMl^^siCQD;94n!*DJ7ME z5X+r-XvpAyAmHE=qfq4R2V~KMI>KdW)cd|~$-@fzYjWF%Y{CQkb&kYlL^C=*q)`?N zddk*&RU!;8(~JrQM7yOv+aP2^2!A37p-zdUdj&Up1hc)QdoGgcV8MC&@Y(vOnsnuV z%CUasS%1p4S~e!cfL0>GocNNoTi|bnM~8dboHrbjTFuavLG+(CE3eSC*0^O@DeA8L z9rgi3s{y%(Vx%(rNMPSrJYoU($`JWH8x5C&E*^V7pGGbNthGz4_C8}&oK8x7 zhu$_|QA~{96(=pr1NEDiR7SRyU0+4Dvo>*KN z?*c!wEBgkg%(_v1OTP0=o~(kG-HMyc&4KM&xdF?5>0|4yRGxLIZ;|VIcL7j2cb!-F z#GdIM^)cwiZA`#hU?pr}iiOj?MuJ@rGVAx^X&xRi>zDl0&F^XNCBjbeL9>=|GdTKgzQ=W^h-Va? z`1_g2zfLmiKeHZ*ALpq|dHdH!eIVF=e>(h7zX6Vo`<F(q}mc>P&Pss!N*!myUW>g>fG{La~-qBvZ={8OjMm3V}$9;^FX zUBw+oid;tcwjn5tiqrgqe+K}2u7A!PIS=tk^3O$+tzS?D+MmOJw@||L0}}~5sKMv| z1nGD_pgsWAp3&JN7?&msahYH?7S7Jn>t9Ullgxs5$BQbgHV;xtp|cs7lCHW4f~s!y zXKUm%8%a;zMfOvPtb_-{%l?z&P2R8TX)eW9#C%^5uN-_d7B4PV4NWlbJ(1Xm z^YZM8j$$Hl+InKS?~#pXu*f~SF%TZAA+c5gjsfk&qpQdZFg&Rz8nz|seOa(72RnLM1GMeAIl)4^)?OfT@(J!W>18h4pRx^&aJH2L-j?M!T;!&e|x>(k-_ii>34+rI|~0FNzU&~<##ss z7pdky%I4Z?L4T-#I*gEUxnIMNtv%NF+V|f5(v`fbz6Jj4)E~Y_Ki$4cC&YG%50ece zX{pKlq`Bw^B{Rg3C9H<~hg%Pp6$eXUudV40o{D_)hPJ*#IeR} zbfx;%iIx{QyfuKn9`K0U8#5bBaOFbtvpj?VkaCUd1{#M0a&s zQnZ(Kn7`AUpXO`y`b#ZW7vUpZW#tD0KM61jriGeLyfI&@<&1Y*?mnguX5P;n`TLci zIwndj=6(ch>@s$$1|g^mCwt-Ga#GUMH<+wXu}#}vOS2Rfp|_>0YJFJn^oY@f4wZ>{ z7CPqsg=F2N2gjjbm@_fCG+v&!JlVbp7nIX%-@QYxJ7w5%GG^|UEd!+rIh$E`s)C>t zW^0dchNt>PbPw~fWXuP;-KI%K(dT+vil{L{XzYfNw|hqK!eh*Lprs6JjBudMIyn{a zv2}PhfjW_*9h*~Gc|S}o_T&xO80852ReI>w8CO>~J2#euS7+ex2N42~THmp=AL2CC z0pgQja%k;c@Hg|=4(sD?rw~vQ8z7#;r(P?Mq6(8H%tz3Na9ue%tZDFe9)5f4BvnIS z*3Xr*w}aMGyvfG~h!=~?Eu=lAbgn;&?9#}2Sm;9+%dA~n(zvbhnr_Q5e9gi~I+P!+ zG)Ue9MGP3V4Z3yK7CAc%AS}^+U?LntiAFA&fNDuY!NyM-L3FRx+1f}|=JBqoT~JW| z7OBDdJ!C#GPDB`oVn+bs zNe_i72}M!>M{}-hk6BBoRWRuH-~YWozt7L_`}NyC{I;Ke;eLMmm*4*Jcl_{Q6kn~$ zkdJK=RpZ2>)MWjRpF5$loRs=1ea`c_y}nhPX%AN z&#{`T##wl$)3%D-I-Y)!8TPUChUdxAd!_rR?v3Ucl9$#2u|}e?GPw?RaB3rzPiV zu>APbU_la7vhpEa<4XdEUa<7btf?bB5fjKy@aItHs6#(#TB-C!K{}))SKc_~IcAP0 z=)@XLuN{;2`h$8C-)@~P5~s1X8da!aO|dA9gI-^gUW2dQsVhpBmMUbo54RXq(T$b^ zT6Ih>-4D-(7r}Ze$j6z9^#ry+e|uChw3XM<+PBc5w0FL$CpBkATQ@-C##*ys=as9p z5@*JCZr!H_x_(s+{2yqE1L4$1pznz)3ti*IR}gavkia@2(x!25sj7s5^1IS7QoYNdp93uS{ z?Z)8$2e|G53Z2IP=DsDOapo7Ic}jI{uNv8?Jg4u;=!zb{BIFkIOz?|p?1Q_4L2}i0 z^Iivo5aRbxG*I}==<#Ov6%>o@4p0FphQ}>l))_4AN}wxP3p(li`ZPy7fh8-Jqj?iH zD8-RtU>TN&`U(jGonjP+yuSSaRoGu`pscG4KGh+bJveS%bkQV9CwhsYN9t*&GOZ5J zHj?DO6M|eym`2WyL#f*6aW+megrq;$F<(vS3G{@r8%QhFWdd!}5;vwp*ZPVsFue_6 zc#8(L>JZsqi07p^k}E(henJuyzT#iaTn1c4Z3`%}hF=qO>*@v+?*=FcgpEN9Hyz(Y zIrh1S%nuUa_MyFGFmz(~3!>a7iXWje-v(Mw05bi@zbPMJh`LRbT}4=e+W2D4dBEjS z2>Qu~K;rd70fOJ%00W4962FqKQY1MFmW#r-LW_}c1Y>c+D0V{=0C!Gx;s zTjsF01GD-*^Qmhd?};WfT;p$@dX2YL0)j@{inba4WAEsI#f;7oO{(zgNsk`kGn?G? zrSe%<$2~<#M z?)6PE!>zj6kC@8Q42gTK$=@4Ni(Tg%@! z<^TFk5iN@$Nij?rv602LBzLUZMoyfv3Sjkq66uXj^OBihCQ>Mcj-T;4jcJPO!;RR? z5FdXDJ4yY+cQ0;kOl8H<%#yzhXom`hXi}e-!p7`~&UoTnCiyJB_H!M;AdeEG=LPKH z&RuS^0#3Y(ylD8RfmQju3#Dt);}WX6-1i?gMhH09g@2@>8)f={eOrFnB%>McSliD92`M-rU2p?+pri!>hc zj)h|TU&PhR^^JtDb5Yg3q4II(3p6as z5%b@lI3z~Aw{qUIM;N3%mu+COFK@?Pe^GT8s6^Pu1>D=_FfaGPYW+1u{(q-2q5q1t zFwBaPIlX7KHUiar-vP}XM(<%V&6iYdJd6|E0qVm_!UBpn}4axIa|da?9*Ce&(^l5yKsX6km*pTZ4Va{W>%94 zT&?Ts8`&;Bc^4b>U&R}qT0C*)mV@!D^ry#kPu#832C=UMsc!Q+$(nGyzC;%d&$vgd zAV{xPr)eLG3Q-9@J;*+qHnnMMD9x3&pPtU;9ThVU=7g#YUxIs1w+jWopNs7H?o&an z*#f$W;g}5MXdBf4ij|>6Siz|;tf-Hn{~3D0ry9xsf#LYG0r~&+SM;|Qh3*dzEYazdBEh0Y!L ziS3v#GK$cdFt#%HIzjNP4zk?m&$?uD{Eqp6)F?Kqq&jdrX~sTqM&l=q(xOFxqhNRK z^Lta%44wEH;?{-zxXe?jQ{rk#@+IY_}Z4HeB&$G zX`{iWra)4pp2kaI7ehc&nPT@9{m%~;%0pQ7{N@U@$C3q0vo!4sa}F8|=6{^)%dq60 ze(zyCmB6EX9}#B^3n!xRmZ*cZ(_I@OR?ij3AZkw{Z|DI^u9LwGRCSmunUPY5ae~B* zr&WZIRr9;wk;2ykFTZzXXLkAK(RbI&DMVX6)?OO<*_aRiqkoioA*+y4#! zhdB@Y36z~2fFGHKgl@}()}6%Qht_`5yjWX%UpY`HQkM2sG3f>mc{IH8Mtjy%?T6=$ zm4CeNeD0eTGoT_t@SrlDA$Z`Dn*BDytl-TuT+4N06$5ws=gaxB=SK?Yu8y1}mnWya zI%nF>Aiyd?j1Kqs7ISX-a>6Kh{o(`vZ}0ElCZ-RBOYDNcFffkV3!rjpjQa*KAN>X) zwP7{&%rTc?HqJtnuT<8Zg&4n*!{O^9=>;gmgaoUPOso9~N@DiNE1u?Eup*<#8e<^O zcni-EL3aAkmFKEN^a#jUc0W@5y3ip^KX$16Eq%Jt&G>lOjp0~t^HW#9HvG?z7%2uT zWm{9;*ZK}E6>C;?6T`t@th#w(j@>IKmJjb044U;e!F^BZ@Lh~M+<5i_|Kr){s(e?o z>*kK7xyq|Zi&C@4v1%161_@u*s`YM1jc#?x1sVx$XIk_ABZ?^@J;I)N4(T{Sh_P2s zAf11hGa0YkWM*~qaa++l^$Kt{z_6;F>Svy$1B(Krl%nl8w#avUb>-rq@zXpmQ^e=U=Tu@L&h0~aA*M%HqE(wx!jL$1nV zAq%ds0V(8pSUHNEEe7J8Pi@bU2?fY&rGIOb{+fXOpY?NE$3KT27FvNU47>OOE$i#s(W`fE%SSfAhJP-%CwwvzYV() zp-{kZvu(Zmdmwd080cv?h-uWpg+j9fT=&`hz41D&Jx>ulF-_jG?+dVQDqUBH?#ppm zTduvc2)h51CjG|qDSp<&or~_DAa{lani^W1udHIPIMsU6gJlV;@`l3Nh5gbK#-gLi-^RZ31Cz}H~#h;+(i%LV`Z$hIXyfuRRhPOyg z4OEp8d6v@y`k#E(JlC{wUyuHfIA5h}Lwom0QODXFTG%J(r=4)J{#?x1P3%s%+MV1< zSH9YXENZ~iV2I^{tc?L*vS9I-295*GagXBkzG0G}F)%?jhkY&oOQ|?m^lV85;ExR% zi)&O0XL-qz7aXU@e?g5rv^CSnMmi(bHWP?sl{X5WW*_im+=@D+EL`FDSwBonLIizg zy2Cx(aPdN8wCpVt0;56smg?E-4;ZC-mY;-^>%b}WM~s8$^`4Dis|t5>fRcVWA7@#1 zcWL$g^OvbrQ-UJLy2X|2C88=DzPiiqEVjVHsq`eNS-?T~0>WN)rGLwhwo6G)|K!*9 zJDOkOG&D^AANJlms;M@56Gagb5JN9gqJq*vkR~l60sq@sL1DtyIN4+rX1%y2s{~;j+7=>$(5G1bV#0I5K$8TF1JVS12DH{fy zdiJ|91H6FAdjwn$8acx~FA_`g`&@-Sa>H3?w^PdX0p0vo`|^dPYyr;$Z9}9Wf*E*c z%lte{pqX_Sv_yqP$h`srXT5508Y1yMJnt9o=8yT@E2o%3dgkTGfUEVSDw=CkJ)9i# zOyJX(Ev~}ux~_AQ@m`=2NChY5Om65!b#lHp-(SeoF)G6A_DRB<+ zmKMcfFvAHok+Ai%kGw1V79Q}h$ab4a&oQ4gzNs~}e7FO^VJxbYv}N>bjpoqah$LQf zVoY*YM6uI+yPqV_4Zlnk7CqRW;@!4)X4kj`-=Dl&nqcx$=K7UUD%udG2|52S>4+9- zF(bf=TRAQ_MANP_SI_E@tDNz}(a-+~zf8NR*>}q#M^ljw+ksQ01b5LSG&zpc5JzJs zIlvT5RKF`xZ*uhcrQ?>vM?^1+J)RYj;qkn9;#BZjO|q<_Q*qOym8_X#k|EN8@e5eG zC{_eJ$)<=nvc!m5kR#b-E|{;3_dOinz0!6?<$>^(;9)V_$I(5sDAqNlIN;(+A$7wI zfs)5A6@?U}#&x^$+G)23;?L*lpHc|syxlhy+s~@zHqmcdLI=^&ki~LvokpzxV>nN1 z8lmiA=b+g){)V&+otOxNGxw8U7Mz$nPw%E@{=)cto}VCnei^8yM5Nurdl;y;nJAFJ=`A#yZ$12X3x5n61=FZ zi?Cl#u;$PVoh`Dv-FeY7NP8vqEH95=&y(SDWrw>yvOB|EPeY71llWnQCTF=k46vY<>4 zfWG8hx&Fn!+5q7jC?No_@MBwsyuPU~w)XDvrYoAz+H^_eQSzecmK`dH7uqL~v;^l3 ztH(S4s!cF~FaMMuE-dcTbLFqflRjIKXR&wXM#R3!A}_QaO0+{KFq|8r^;kA*XyXD? z!F>0Jf6c?aio{<3c@w=+G**vY%z@TarV+q1>jZGT4%Dw1Pk4yFnV6Q%7>?42w@u7@ z_a&{DIx4g466wAx`?NAPSg`+`2cj3q%X27LUv?)*T+{J3nZvT>cu3(2%GqYacNd{F&&awx;DH_kvPZNy+H|1ab&R z0{pZ?cO=GJ%lu$Irlmdiy8p))E3btglyMDz@t(ZzHd7-6Ro~_{hqNC_o!9v<1vq`pI6=){}ndmCqQar zyRj5YD09mrl8q)Icl&0w0!;L1AF$cV7IA-4XjhUo{^S(TwJ5F0q#36nxo_h0hA05b ztm&okODw|^7-|$VV8AJ_-{1R7BV1ctn};AcOp>R=|J^{mVd`KTOIl|AqS4%6os^A} z`5&y+f}Bn7Dh^6xu2A+!dicfOcDx|X@&k_z@%IO{LFL=GP5c9@7p`20etpI5e)2N{ z7W@yB+XzKEc2|xxLXII~I(0*O4d30KbVu(##tqwjj$aUxd^;~XJS|s~G&6F?E&hIa z{si=1%$0F3`b>Un0R0QZdoLDUjgR_Bf+xQ`4BS$wYehfu`ZyA-Qn|)d#U59{GM^$W z#1h9!x<&xTi_I<{#wo5^#2zcAEy;0q^|q={D0YxR@`aBfFE3@?x#e0Q`+?2u0qVA@ z?fwX0<+2{o8X8PUP%x5T??ao_*fHL|(!>M9nK7e#GhhaLj5{f?yBXC9P6{{2 z#MTWt7)EtkRe3s!B*bdoc8|9SjhS1rjIOQ`eWW>PAjqc8ucMmYbbMgQPsGyrn8_)m zy`6qyv@t2Cvsk`x;=tTT?0W98RIX~w?(Zue*2WfSW$Av&hk4hcG~TD%dMGFO_fhlX zX`U3|-m&O5L0{;}Q_@IlB63OaI}@%|qvfiNxCK8WlZ$`YzlNsD8a+$DceV5eZrIv! z$pV0<9zbBuaK{|0p9hiJo%QlZW^&G23tqppWztvO(^5+2RKl4wh0Fv`Rr-D%^Y1-i zHAFzEtjM3@YV^-~EFduoL(c9X!Tj#}-L##b-J(BE-rBx+bEqyZ5>iAhxYAVn+_`&wDpk^5%w8$KVwHVi_H~{8vl?vI^~cc9A2Y4~ z_xIT4j$V*#Y5cb2+9`~Cjb00 zU5wLNyYLPEH+BW(j5KpKu(J_)D2aHlYvOLlya}1Ac>vc9Fc6_5b=eD{&1Z zkwyMt;xzQ*MSokvEjZN{L*{ueLiTJ&!Nl7m$&528?coh=oK|bvAYPQ$Na=JzYW^|X z<0Ln`5t12qT>5uYt{WE}#bKt_6%s$qd$I`Oc|cBbDw_UIQMDcRWqaXrO^e}0|MOdu z&O_7v!gcqItFw-$y0waEJk;gA4s@a(*Do5UE;g}68(uy=I7QU5cXBZ1@6a~UZNaqN zV;i)Py8C?5_OG*Huo(yI&$Z-BuwqL?#1hq%0mKi8`yQ**Yeca29275Tu5H%P-uyjH z`J0!HymzXL(b7{^dF#9T>83l~SLW0HM)K1p!v0}mu>Yc(gk@M}wQzfXrWjbvEj$RA zrPnXYY_6FFWO|5~@qm0fh$%FFIJtsI{~Jh&+BPBSeue00WV4-kgoojTZo_Zti+`Nb zn7R-YY32EM6Pf|sQq++KiVYxye*vt(XN{}_shtF>D@B4_MLeM43=^9L=*QJR3-Lz5+UAe+B^JRFwjI{We^-%tXsC-`lYC^|dz0 zVj^T;jDi7RUqD$M8wzdtMH@x6YXSrm_7%FuC5hzOgW`tUBQ{jycFG^JALfk9IrF4` zl07#U^}9Ki&S zIE-my?f4@<=5CzZW5;>%XQz@@SD1BMo-4gON8tNVI&k~!M}7seUr>)pSpl12kq4jc zAh=F&*O9nQwj&|{axkG`ORF{CUUmM;e3rlBJnLXr{jGp2Mn`8f`SkL?-ZXN;h0 z$W0`T_NxwaFoF9s?PtClr}IFt~3X+VG0;^w(da9}WBh&$q_Nuj3 zyy=GZ1;S28JQ0s`BzQCt0~d`G8CNJiXB5@UPj-#?=9mt#r8a+DDDLaxoN0T6cA&M= zU!xX30+_L$4h=chDu}pIKZ-Z`<%e-o@`g$B8j*jh4p=9ae->-JP_jrgyi;0uS#ToY zGw!MJ?gx}GxHg6M-nd(ddcF=zSIouMgfmni-ryt6lz1pv4Td^)Rtt2kH@*uBLAhyx zXwPf+j>)k=Uq63^{eSh+xJUddvG=*owPMPTp72a9qlC|09?i`k>U+z!X1Pg#uxK{c9g{@0IroC*b+PA{wUS>LiC)? z-z^!r0^#w15Z7W%3~+pX1lOWcP#zX9&qESh#q`}3i%MblHV3Chbw)oc!2_`FGx^6y#RT-mI=bbB)wRL& z7co|+C!dy%%Z^&Dx*H|t0!0Dp(w~@`?t)QB{Gq02p>1w$H&h18hAB zKVy);?nB5{+Oz)`*gBIXbXbbUcc1)~UZ5wy_@yU7wC%);`)CQox_cL?s%H--oL8N! z>RZp0%=VB>N14*U)3aJkDk+_0IK_{E;l-Pk_#C&!xCVy?Uh_})E{wbO4QypGKK5Mq z_&@L^|2J>)|D&(icW8=&AT0-d3N>8|@TCFJF}42)vOkC9qu5b>7(mcG^#RLBaKM*? z{_EEtLH`~49{UzEYr(L}$OodnYX@Xt68pvBe_|%tdYN90@6jH$ zKD&r$R;(p2@KXgd)}D>ElAVrzH2A`Qu8X=c@0Q99AvtLVz(mVBBDw?2+uBLbM%*vN z`COSA{L>O0$kXTgNBs-Esb{x9_lcHm;eTh^FF$P;)ozaU!Qc#*4tFm~b?&i*6<88c zu|Xg7h6zJKN1P3_<{j|tXJSvrPF&fDO27BalR4n=4M@I&+$w&$fdEO-Q(z40F;k*R z3Kld;hllQRl5lqH2Ya;Q%xA^(0+P?{di4D7LJU;5+l#%)Q(NCy22G@` z0+Y5xgvmopPXCKimH&a(ZS4QB3;%nv3$zj-xqQXw$j#}k66_v%`LpvMCbs$y@Rfxb zWgr9cneBlDR}J$y8L5$+$Gn1d2RV|H4+7dao}okoLM<~fII{O>21wk@Si5c}Fx^3I&j=z)TC zPLKo!I5hx6-JlU(oJ0Rw_qh^J&YgfhBaQswWd5%KX~S|yw)A+Ek9h>ylT!C6Qg@;{ zOv52dp{`6}ec)=}&4j|6A+H}&+mM*IoUc<{20u?NMjP`-%mCnZi=ln!0gA|n zA2a}asa$#u@YutFiNWt^K)(pa3`n~gD}7`l?8W%skpuLyh|o@@S3n87+?=qq9;1rp zC?wr~((IflaP#q7oEz6A|JjVhbzx1+x*&r+nzUy{`9LD?E!D-0qdL@xG$W5VQlM=kiM1Pk9yWE??VaUhok)(ymILgqXvSWKZBkZ# zx)hs8e?4*r)vkql1c}W7CiDd1lkvi;w_Ef}VAL;Twc8tA+1Zmm-BzA4)#)wM3*XwU zZ+_E z&A6a<9FDixl0H3r?JCqO)IoAq2pa#KUmiGIkkLeIN3|P4+;o}A{v-gLM8^i0fT9u3 z>t`xHJjZ+F#Ty=5*@{a650({3mFJivZ4sI5*|*vPgOOrJ!)n zH?yYcaZN|-YtiX|J-HAj+Xi6W+6G1VnUU`{wZ47OUkGyu?z)wjI_$z6J-eDYwPsA? zF+Gle;&Oj4T)OEJ7Q&EW(&4wSSP`b(v*mA+lMB|`8!?%q6X<2wm1!i<-ZNcR4#;{% z>uAB7x&EKZx73^UGT@h25B`>%;<{D1l5KA%dr5kwMw#iv#1vVEYK!XsN&_mLDqG+m zAn`gX`*$t0bN2405hu0dCancS{h68CRP3Ep-ivRwaYb-(>NvqQKRt5JpP@piGN^V9 z1`kbG~LqedkGOm_33bhd>c^JMNh8+mgiDGtcOp-=DjMX$Kq#1(*Z|Mh}r?1 zas|?k5kfpAY4kwi!t2Q2Jqa8~YA5nB$MS6Qy+H}`qYdva2}l;-=VoTg?uGbM%oayF zEKY2aHj$h}|FnYHTi;I3+TVPcOnsxcCIyIcf18Ivb`_{_1Rwp)XLFJ6&}-XzS3aCd z+dS`OqR1_Tz-VjB-b|Vem@}45yavr~l>=^0KfOhz&rg(^4imAN#_E`dROjL+HHIp^ zF^~Bh%Ch9yS^BJCf9^BbY?nEJRnC}n@QmGEmGdKf(70Fq;o5#f8e5A&^2?Iw=!uh& z<{E%W6+ejlf>N}o#D&lzor?ty$7@|7fp&Ac6@`Ssv^(GIdPc&wgqYi9jq3s+M01NH zU1%)I9QqHFxkhlmY+CRoLa-6f16&#%LNg~hhJlu_@wBIL)f%xu?{;s=MNX=x>P+kP z!qsT;2o_2tifW7;6+ch3h=Z@D!v(ie)C)rHZstMq)_&gse5;HMpRzF|GN4l<$%t#9 zBm^%3bb2oJ(o`+=8>_-kg$V`jk^1x4R8%bB!Dzcv0_b`2E=>Mirq?WrIWM)=C`1ud zemeD3Y91{sayN-a_ia~R3&Xq0D~{E#AM`JxV({k}B4HjN)-aLINe8_YI9HrwJNxr3 z$a;ZjZK8$zu$gkdWJWGc6?i%rin%_0=``Q9K9apjyfOa59YO}nT*!DbOFrocP?mPvVyZH5v<&{Oz7cEu2 z1I+4g-WsGP>bMU_0(!qwnd7t*%RqOZi}aX|^^&gOgGn8cQpY)a{G9jX*n%Li_tI7ajfee zx8u!jqe9dd$5!p)CX=s`H9|$^jbn|aauZcFGEI#b3TWD37C1o*;x3&!zrCP7krzST zysq3mICX9LMI6CKHk$c)w5aU?oajnMQY?s|j!6bT#qX28tLSY3Sc73Y8IY~To4qCq z&!qVChs%~eXWcg=8Z5(;u%3Hj-6TQ4g=og8inC?1&wuI9GMna!J|~Q(&~PMdXO9wo zxaW_)A#wZ(Ux?l#uC_ zD0l7CNTw`$Q_ z7)rp*-?#KP2duvhZ5$-sw)5sLy1e`767J`P9XD$m3F=@Z?6{sHMV#ziJnXPwL#T|CGXYM9 zr98QX&6DHpDscJf*@3@dNB8MTYM2;tetN!++_FXD@qkyW2yqTmA}r4KTj$5O;Gxn} z4aqirZ_3}wC0-N;Yy-{#x1kU67=J9i3GArv_kp%lxmdQ#<)06lfB0QNtx1=XF|5B)oZlJ*{GwRo7`i%imzSuntI?LHkzz#(jjcNa52B!I z_LjWUE#~HKN#@RQ>l^<$w)5+8T zrw(cHuucqTJpAYMu$2)%ln`e@^c z)d*2{)0vTkgqxt^nDMj)Y_$&qfnEHH=fGA27VX-E-9*jkE_D^}9N&VJ+G%ylOv+)N zOh}4XnXj9Y2wAz~?pPJoma0cHNdYdbU5N!@Vhd9LRyaEp*pNS8dK4-PnSbkyVy6L* zC#s!h%;=;*mLRV}s&~-cS_Sii9}nur?`KK;{GsZrJHBm;T}(yuqLw6pt*!LR_UT>| zF{Ehy=4bk>?rmYd6T3QrybK}@r3a`+u|R&lq)IQY)KT(Nq*}0e*Ec_5T1Adt)wqB4 zkiK7lYD)g4=ChDRP0rG`ZgBk*&IVUK+THu8bgKB)*FKfceEz}~HAGFn`RQy3?t-65uo2$Vl&riQ_H*sk;(DbY~3FO^`x=>7Gz zaTc+%rKwj~n788g=Os9H15V?C5Ikv@p*6qDi2Ga4hc0J+iMifc_sc7I7l*z6@*k!w zBLU*O1l2CwJu4%CD%u9#ErDXD=@Q4roOAS4CTKI6;P0MaiqqP`2lI;(^l>OKl~YVl zfR626(4h22o_jpz_jq*Y?JND<&6iUwk-|Khy<-M0%)n81p8_CAY`wdXfF(!!(3vm^ zi~8~Btg`+dV4n}M*gYHd!(^-{b}D;JQlmk~74K#5oc>)u|C^(Y(O-_DlS#wObfNw;iZNA?F@!y>N~vg3So|h8yK)a~`Afo)I&)@g!L9A(NB|E2ZPd7oljI1Y zFOXbeHxGMJ+;w3=&H`%V)?D>|5nfMqYpN3hc(|NVGS86Ewi!w?N zt!}hTR_c71UcQ9GKWpD&dm|dmG|1mqkf3mHs%NGT+MlTbWrBk_82QIoSa zQ>!Na64l1Z^Y#*Uue#G#9$tO^zG_{q`*j)HpZnBzN8WHm?NJDjT_HmGl&moHO0i9mwX4i-ZG#PZgnUx}Z+(clm*n72CdrhM16 zJ)7W!VrOn!4&=A|!OnP(1T)&u)x9qe{GgYL2#!Yt8N}BHt>hB+IhTO ze3=_`(8C~#1RqyJ97EQr*2g1x+{Ezd=~dhGm9MPDr%Kbc7sJ`<+vQ&~bCj;Bbz37Q zjR$ebX~Z(JA|2ggTaJMIoHF@|(1wSWCMc_pKbuOIKJ&$79)Fn3qnzC))O!+}gMQU| zj)dR!rrz9Sh+(l2-y?c(86&7jsVkaIxoe0g%A%&-_Z~jsa*b!a#4Z-&%8x^LA_;O{ zcEuBzzdu5Ig9T;OLG`Zuv{eKbWp)`pL+uSf7*bGV%W?y_TD3?cg3@u9>8YUH@ab!4 zhY`Lhm4xXQ6-1?3;4zM(OoagR5m=XCz#*mn^J7)AB!}8;et!he1K54Ji*k0Sw}JgT zzx55~b;#^BvLYprG`mz;Q%Z@@uNy~16gvC}_~L@=sox8bcSX(oR%enldGbK8-$?rf z^Ak9r)A(; zgY`gHplGZ8zzFO~$G-OKE&e(335IF4xlCVR(G@{jZ;G>O4N z8tGDcf#UW9Qq+WmB<8MGv1ZwgB|>l*nrC*-C?q{m-$cT{;6nVmwWm2QLZta#F-B}; z_c1mVGAptiQbGc}-l9m51eefvrnOCx+P7mvR+D>vB?jz>B^IfC1$V92%N@grp}m~i zgsGhtyeL91$)ovIbVS%=&Zdgr6_3+A60dHr4v9$X@Gxl#ccWw>HNz<|0yqWBsVcGx z@++piGpf%Ne{~)H*a#eVrA%0^xNzdVyzguzXrq^`OOFQVCIJfS^R}KYaTgt@gDP$p z>ptlD#O_p)nXb53<0$ze9U?7OzNMk-x$u&f00Ya%wJ?k{N$|H-6^+WlCiA8C^#nG43fM1}X>a#c3`vm$qCJ46^?##SFnY>R^ouQ+$#B}6|M1=N z(sm<2DwFxX^vXy#d}~N22>-D z{$Wbp>qZ@uM}bpSyP3XLPRuO$G3X*&uvSGo02a(Wl$#PWLaJ`GRgESy_W0-D?>2i> z$b+x-mSUf6LBbKwKEA%eEf+WMY|EDVnaOS)$ep9qC}g@CIu6CLp7}kqo{a0_&P)3t zLeC2k|1Ew2HOEf|%2qwT9J0ZrbI%=zyf;5~?#!anfL0vffpsz*z^fR+;a%WdB`=*KgE&s5-N?tKb{x9h9Xo*|4#MJXtl z5{`Y{0e2X_o)mn0=kKg7Jp0UAs-d@UQT}J22fPQa{a3KXs96nbG@uFAlUbOpGWI*Y ze-`89B$bXY$YtEoJ5SRmv38)vHn7|X*^64O(V9*5)LTg3n>Ws|WJqWZ8|ywR5K(ww zz$PXFDNmWHA>W}`Qq{ulj++u&b2!&pM@z7i{t~t=P4AeIQxeME=%(|FC#C{_gPk(BublEEqW#DP;S|WT+XxI!M+4L59^@d>u1YV&gi|g1@aFJ zcUS@em74x?TqZf`9JQk1@!lo>so z_?rUi@HB|(*Zux+0c4pvV0f49cQZ(!-gCc!3PX5K=xH)WTNOyE4V>y(U*=5;y>DCe zizQ{$dOZmF;}}#lKZL|HIna9Q8+8f;g}SPlbQi>1pYH=sI>gfIle$RLCw zu}6D90tk0^tiA&uKxJp7Z67rPKLPXu_77507~OJsy3$w7rg#x6kw2a?k`94`j#MG9 z@#M4MV=XNjphb!TV4(hG%6-OnH7Na3Hul;7^er`AD1j@Ps91^PcbH`favC5?h@%t& zN1zP=U>1(slHt%E<6Vh=n54K#W{jQ+IPiyjDG;kZE55_%3j!aV@WvnPf*8-`h;Rlw ziG;t8C56OL^)?!m1l|_T_LgoH$DWKR*;iObt{4g}u-=ryXY-zmL$TCFe>lO*nE{Fs(NwJ50 zd(Er=wb}A=X*aXb!f(4b+!AjMH~=qCfA>~`$xdgL-y-bW5B@qN&<1aL&ckWkpB~C$m zK%)ZD*j&V=iekB3VZ#`+Qyns}X%I+n&a%&wR#v`4U;LKJqd6knry0-V@@s#`+6zEx z{DUC>L3l;EPZV5CNrZSoU*mv-=kx`~3jKtUr(1VyLaG*j1SmpcPAmpA#TT!}Ah%KN zK%iNfr%3^8#Tv^dj>Tfc#lS^J5VzTCOw&a0Z5smlnerda%s&Dah6xYFnpWt{ z#Dc}cPV@@~zaAUKxu7yO|J`f`|dF*JZEB#|JyA0U0)%sV{Ksv zXnV}R3DEc;X$r76B{c|A^n_e2Bkcz?6-vA{a&%r#9yOH*EcXIM*umlQ2rU&KhbAlf z09`xA3P^oaJ1=C#ivol`mvCc7ViQJNtXcQ0_#h(+_~1qDlmC7)Kn5__fvqA{NWcS9 z2GrkpS;lMNZh(&fxbh{Itl*73z6d*-2Dat@c-R2bvB&=r9DF?a|FPfzh4o5_ucC2L zE-qWd7Yf+7Xcw93wmgmOSA54kE8$9U@HEuxd9DK`zoCC)Fe85)GV7CqcaEpx#RLpT z|JK=8T8g?mgoNB)y5D|c_8F^eqTHXqKm_+gK*$}@OP5FMcBRMz&(MdxGs=K?XsQ$Z zb!2BWg6fY5Ac5jr<+lWFkI$ucT1{1+`sNR>+;bkh`s~94Q!As8duMLR7MjU`M<>x# zS>zzjBfeFQDIE!Xh#;Iz=(o}}*%e)pQd;m32vT)uXh2Q7x+Wr1SE42vHX$v5~N;vo}fKWUSAmUTCW=Y{3Lw7lq{dNm) zztyrt1W(z&abMW zTA5M9zhOp!1D9?&@F03+wK)gXr~0*wX#%|+_hI5j--xB;5z{$VG`zGoAOI-JFYYcm zEjPTQObw!lcTv+Sz2q2cN;m0c3xj#=N`xb)n!7A6k)-T>D(3FS?y|>qcKx*e6{cCN zDGCk+Hs6wX6IGcKb+|OrNr&7aL1G@i+BWqQyqheN%_b}V)vw;r+nS)T|6$tqDuBEl zPIchp_0CX+7M+y{#+}~{gUvbYZW0Ih3QikIZ)~)wXlcq07@rD%IGK{76S;_grN@UQ zVN(twB0&b@yn~I+O@74%)i3%zT|4rl2A}Zp+`tTADH3ZrB#}<=*_MbUB~h>DyaaDp z>8!K8aWQVlx3Kb&oJQ7K>AJX;07si7Z~yu-kW9#7dXfTrAtJT#nRVl*sv~T@aGjs8 zdeNmm%4MIB_-`+MN)^3f)Smcjkpx++L$Ztqzpl_>CXP{E#tR;o1xFV57U?_}_2-rp zv|}y)!JPb2Ty6t2)5~CgM}z?VQGPT*!Vj5N@$IR>Djdh=ScJ%HyQRmDg?8k=2sUnJ zasC7@P(5<^AExTq9THJ+Y52pEW^Dzp{bcSuq%PR3aj`LPe>Icsws*9O!MBT-gsfdY zRy{^t0uZS(XpKb&=9LEWJf)MEJ~?8T&?RU!y%i$BVm0Sf`mD-=?{-LclXYhd`{$U4 z8Um8c$2Tz}SX>T+U5=PTb|OU}v?puLZJ{LDS;L@5wRZXSx7Yg3|MV@cEa&$uP%zf? zSftE0R2brpVhY>qYJm7oO4VkM?YkbX`knD$}DEFch^=D2aa)AzeTeCe1+h5iT=R!u@(R4s0WuX8%lbf(i}ED zF%-(UNHL&Zy7E@zCBkq?iDd?7nwaE64v(z5XT)}oUsx!_y`42xAG3a~6DN>B)kU?N z`~{swsJ2pVV!u#++^wxim+1o1l@uOT7oQBQuf}N=lk2^@8_dTnbPP})fX^ZOkYM8P zCJZHfuM0vvk^;KnyHqb?r zyLHo|&O&q{bT+Ae{u@&d{=&NMQ@P_zQc))~7Q&;j>xaA)W@}2iBXDQrRCq zQ{(`iXo)|=n85Q{baL{x=ivDJzBXd1hTVf!U#5lmDktte4Lu-NmXR$0CvndaF2*39 z;{eZvP$sq(l|U(>=DBNI+lE!S&kDo%YWgKQ>}OIgzn09aJAl4KvLS?srz_~+7a=FS z#6>0s{Xn?ddD*dHlmgLSr_a?0_eAAd^otwfAE0mXwHSbhT|~D*c$@%kGW!}(e|6bN zR^aSLMAdD^m|w-4wnOSD>Ic!A< z*GsmdoFIK$QvdD^`@GR?9PcY%)Hqfrr@7RSC-=rx;r#8NyDB$VPPzHDF=w5KN;@h6 zit~q*k_sG9PZzaEyvxU_fBN#_>4Lzf*lO+9**@35D#o&V2m4b$SD25*^Z$z@IP)@S z7DOH-9`3wwU4reRIzwG9iA$&d*6gm`WQ)Ve-^yM%7y7I~=r3ky1b_nCZ6F@l*C0=+ zE{o?0gjeJJ>b(yH1i$b+vB>s_A+IxQ_P`FAdm!gp!H8Q?xG4hbD^)D7fyW^6N|8Iu zR@dOw!Kk1opI<~7U4y?b@Tf#v_x+Xak`1$9QUcJXeaIa^Ld5QfxQWysXB)v?KYMIwZRzQ)L+ z(!J@0QZ3sRd>1?>?*e6(8WwiAWE=B2Ud*BksXev3oEo`qhmS4W3hOm`f##U9KKke6P|KhS?Vis(wmhP}^aR17}}n0yY= z!+PT>0PfL-pQ&+fBDlPClr6!?jlBveO=4O$D(dyBWN=%@jEqc092ZK zX2X!_DWn>*d;cSHa)D{0CG?}0tqa&$?w+5Pm!g}AN!p`izrM}HN=fF_bNYmqUI1zS z-XcSl2rJMhR(@M@#BYuul&06ruoR@rcwJ1z7U0;`pSuC)33JPlFM`%(k9z}en zsS;OHUik)#WQ6K|e<^oL>AK-fhQlL$T)ZYzfMwXo5~u?ncbI(~+XZ3q%9C!cP3%64 z`|{2&Lees$F<+I`WZge}qURY^3C&cK~xa4M&GO!bMZ%+unJRe)vgFcW4&34lLqSa-(N zqrVJkbU@Fvr1)`MQ;#l6H@RUV+1ampVg+1vxI4Op!5!L?6w^M2IqY>-EHx?=rB(V% zyfIZ2o?tmsAT$H$12&*3Xt5S<0PECjp?o5p@Lw78U5y7R4qVQCcKQ9Tp|ywM%Ap5S z_>{#W79bco^hAb&1BrX>%^ER46Sy)E7n94Yd#3D-%L=PA22)(x3i(zeX(85k_p@E55z@?t)giwaZxn7oEF z%oWbm(&8Ez=)4f6c_A5?Vzc*e<|qx1LW(nfaU*{;V_qrZNC0ufrsf*R7gF`%uFw^G zVIlunq4%fz#Xvp)D7Et?F!7m9pK!2%M{bM?_!LU72-=o<)V?p;t&?7? z)aH4%+r=e**%?2~;jNf2oalu#+5eJ|yV%<&u68zzvoQt`-0T1=?$i+lOa!-0lEtNo zjCacxf-bkt6_xm?SIrl_Y4eYty#DLulaj@UtjNl6S%x^O-H^dY2_^f|%NNm0=G7Yl zp=29ziRy-W`dmn;9-^utm30oPKG#=zm9L(Ug`J7@Ak-z4WJc)i#78ZFzLD0u=KVQ2 z3~M@S$K7haMNSiv^q)!kie8d&jS6^f9)fe<_X+p=Qpl5K)>!aXf9q7d5cAR0{y$7W z?!!;{v}}Qckg?Dx7s0ejd7bOU`b$HX`t+t(CVq=aG-lPbg?wnK=zX4sx$DKeyC(#! z3Lm7%CN8snfrS!KvYqYKC4V?I>fKEYXf#Tj=K@)#gNpgLfL({D@xzvY0xJ$D)j>CI z*D8t)hI2b9RJ?z!qfx&AJ87KT+ZXJjRjTpRwgm~uaxDO5&eUS;OZlK7gO1$L1e)P$ z8Puowd%0~jz~#aB1>D`E)J_tNBla@zRg1=GvyQ ze8!0Q<8`{5&FrO|>+9jX8(z$t4iqUe&^r_L3c*i*qXwef`aKC3pkV#i$NsJ-a@;er z-3_dgV|&zhuaeR(%@>7?qJPm-1it{EXz?aJmL7wBIN6@}OOl!ts$DM74qWH8+i%6X zktcwgp^Eavvm!@Pd^AT=#Pa9V?Rq`&Y?+}7YE<*966Bst_LJK@l8=Nxh^&SL4?p0) z0KVsiCOTT2vncuOB0(_^buG$1`cgY7(fmfKINr>T4-LN>2|M_)i0OsL05lso`Z1}u zW5`3-rajJNnVKU|<9bCTE@en01u68jFf-c4j|3xo)88VmQZDVa>s=y}W4+QlTq4XN~q2Yp1r3L*pE+M)yWduKoxt zlpNPr0e^O&|D(JA z-&1#=eEsp;Q>l$<=bk)R320x5n6!} zz(`bb8a)l+2<5aarrJmF4SR2b{c?iTyrfGV6o&IWa)KrOONB9{u{PqYi22EMiqK z5&@o~TTRSbm}_kw1PWEzy`K}VT0Il>fqEFw;2)T$Jc(s(0rcN2xg_1XeB)(M3^_ce z&mz}M?5>%rQgZ(Fhm99_XP@1^)%A`Zd_0{5G{uW zoR4Z`^h=y?%;ra(P03SB(|;TL{ct<+-s6+?A3^Es<2H~YS;keY7o5X6OlrBeONo8H za%#M8*GO$yq=0Hr>(5$n(MG%nn-87NAmd4(UGHVkd2cOr%q~K^XhWUcAP^WLy0Ds=VzT)Ad-@+nuc@`+amD`iE8tZ?r%wYnT+_Tqbq-SJ00@>0wi+j#ld~ zw?i2ftqeT>&H)Y0=*KodyYMrQ{B_)N|$G=|$_* zgV}Gn^ixx)#TqT?F))K0{Yr!NfqMrXW2x_-w1sFi(-cQ5MjBe{I4P7}3iE~m!TOFKdDd4xZX-yAofv+H?CcD$CcZJ1Mw9@^r|51EDjcV6{tn9Y}b?Vg69wXJs_AmNBYVCoB^r$dY z|LVUs9hi4``h~{QE)>tDPCzwRzST{-QYQ#Zku0Ue2jc~DV7lX#0a;NhE1ny2J~efb zisO!B@E}K`1CGI_u*w|enq{gEVRr82rn%}XB|y9&Nj3=;__r+vBxa|m1+%v*?Vc0< z0+%(VeqVgT|CH$-QyV|sf_8zP0P$3cMuO|cf}p3pk1J>a`6DGhA*6)`r`rWad?9pE_tIGszr$rpN2GkRQVS}-h2jkDW7zVqBMX$V-2)JA^Cz;6a_bImEWVwb6 zGg+byOSIcNjp|VHNAu`#6l3BZC(2h8_MgqpxUH$Evz|oYobm^YslWz1O_ky3z|k%v zb4BwMKy(ZHPwc&SRFiMFCL9Drnn)F;M5Rkpy0m~&MMPA3iHb-Q5D;mBAiX0XAfO;! zX`y!sy@-JHUII#!lAwe@Li}!j=Y7x2yl2+DXTEjLI%{UlAFNnH@;uMI?|tum?Q36q z=p;e%)^Q41*m8Q^*FW!-cL1RqH`B$%=c6Gp!uDXTKorYLrUej#P%(CQqZly03U(Ud zGotuT!V1yF2@sVSo4IoI3%s8-q>G#dC_u`#Cnfx zV1ij31+HLJf1dra$o<$Lwz&s8NS&-|bmx!VU^oTB6(@Pq$oYoGXr7<`k`(<%ov@P+ ze2aQFb#_jQ9;O^8l25?4V{uKUSab}+P%h0wHOs$bZt;rQj*APT^LAW^-#Njb(6`CP z=csm|W3JuEa9^6PtWZ@Eg2!@nR)s_QcF0#fk5(d#D-rqTC9&`h>DB24Z`4XA-s&DE zzLTp4D<4T7_Ibac$DUc0t1lxe5*tNZn&0V8?e-P-%Dea5M)Zj8r-=3+94Tv?f9Ty* zu7nQi)gdPDUG+~jeaGL&yo@WIw_fmj#1LIcPV25Ov#>hxCkZyj(bj~uWf(z^O5yRy z7W1|u+(QKOLbnHe@=A?3`jkQddP0MX-khe>hJ1dM6od6kxW| zExwt zf=Lv)3owZ9s=!tjBeq*O5XPg<%}UF&d0nydRppgqwuVV(;%-$-Gk^a0!lVsS>}-6j zj5{5iM<`SuYrcxIC|$@Xp4E5or1zh`@Q%U#BHs3q=qFi)CT@KNT}!eRaw#oSa)cy8 zwD5MHHBGn#*u8a)=GAXzo}|O1*styEX?#l0Gt=J~0e($vOiF{=ghS^KDIikiok?ARx8R^w)zP8AE zYY@VA#!ny}H>ygTN2wu{vQ4NI%l#+XnkuhMczG*BSEP$R2`Swa+Vz@xie6iQ5kUup zE>BIfexq;#SAmflEI&ZZJA+Iwi4k_@=Vc@~`+K=-ompJebmdenxuhG}^PW#Nry+h? z2~RxEh1nx#dfLgSCuTnPv@1qAp4`1vUIiED3mbH>NhlNeDMW31pDL2w^sVzZx{aeR z5{cKyC{e4d#@B|L&pD})Do8BYAJKq;f@T5eDO^9x6BW9BI~P&pEnnB_bF*VYf$a+Z z&EzlIV#k#8yvaVLn^p9F;;QE)gpwQi4Mn_cw%AzV-L74d=Lx|p2i*gH-A)Win*mbe zX{F9b^{l;owSma`3_hs3rFY+q@~6QPeo0Zh>d4e6gsEa37B^{ zs9L9!;&A9tgaP*6asdh>`Z0ac66^AjUsU-4YPaP3@!arQm9xo>b#)ZrfxHE6{_*XS z1P!vB{UUocLC%!0+^PMn)eV2FAa?7vqRY$do{z?|aY9U--8i|9N%!QufS-V!nf4Hu zgn@>%2yGCrdxsl@t!h|nm~hU5dg7qbbCT#Pj3C0)zDqDeSEfdOuMHmti+4A8C{L#j|mBfHMfEt`VuT^mg3v6lJ#=nwAVOOVG~qkXYFj4`|yw zG74+Tw_Z;#xwPDWCrHm{#U-At$Z(9v&Tn!bs;qL`K|(j{3yj1{v;4iV13IHGGvK&x zzD^b$mDnouQi$cRGpOm}^CN$Mg+yDcV_Uj+@dd}#&p&z!$Mmhh+4??Ob2MOWDIzNY`dV! zjdUeB;Iuo7Kh(_<3~q8@E1)lS@A?<1@gF=&(fx9K_s;?$q(R5_ zJE9Qb^UQ*z9Ozg`C}?o%zFC{;^+j!8uGJ|#phON;m2OJXodJ!v-Or^)$CKIR&{QdN>5GU4tYJC<0k4aZNbYJsx}}-RP}nSD`Ns?#{EE@qe!i@?Y-&*zkb$ zY1JP|n_3d)dwAGe6hXAEbHLS-u$V)VJj>816!yH=r8%(2XT^f-r3+CFgQ`!V zZ=w#e2!fMahS+%EUFk|%lo9uaF*tpEjmI;YS*5N;J7?;*LoQ#wu00;&kC^^RaVPs( zL!UAeiG6Yj7O_pT%_V>J)o-Z(iW0vtQX{CIgPt=VzXy`S`z1c~;Qu&ZSHba8K_HtLlg}|$gMiyx`8F>v% z>nH<)6?RBBeCx<0q&iv{-M|>y>~wgU0{$7jz3cGMhG<37sUE!;w=g3*>uHKH(t!Wc zaX(Q8S-W*=r0wkX#$)sA@*&fYg^na4**xTHnRsqR@G=5a90l`Az+u~Zo43fPC8 zf1T7EzeS0E2sluV1aK5SiVFsML}w=3;QxjxbAb8-LJ5vzGss;$G(d9bA}Rcpdvt*E@$lZaM`)Svy?|zB4a9v*z+5LV8Z79cc&;- z03)*PfwFqGyZki8_9Q=Htv~V z;9KvA{^a4TYS^|721(=OY-@wz(Uhh1Dlj!er6hFN$yD@CvK%G_RTiDlh$^`)w?`eY zY5aQgV{y*qdv1R;=Z(W2JBjJ@X_V0y$O|jS{Oa9KPei{#&bnF?FjyM=IL@^b&bVow z8dfHo=Dbrqf1RbD@q5v1XU4TJ9{f+6c;y)0$FO&cPLRR+wLK(@+4~~o;LOTr3kU`F z_40C~EooxGE<5spuU5O%RN~5lj92Ir^?C^Eq6@? zR&vH zOFOum_-~%|%aq!2|Ke96h<>|B5HZ;*L?HwTr5{NTu=CLaOIhdUYQ~bZ8uWN>x|@63 z_RO2XrL=BS%-wNso)AnjjJBc<|L`__2YIvcc5$Ioqftsj?wr7UST2JX$4@Qy#15%& z?R#@lue59IO@5vwih;GbN#+X}%4Dx4crC}Chn*)p>JWV#|IFD{Y(@D{SFX=!nPw+f z(B%Dtddlg5%Ye+LdeJ*ryM82ql^{3U?j_Bbd#Aa9Je+<78Kr>ukYn;oa#fP3nqFcl z{^BvV@>9Ywb!3i%Ikl(M1?tz#^(O~udDIjXj!eF-{bR?9cRY#3dT|*U-6Dw4CbX^4 zO74sDn15DssL|{3I_tIIon-Iz8)7>A{#x51B}F&JdL95ZAV^8_!e$-E8UsGs4Ihn7 zkGoGVo;HucsjhWZ_CZV?>s8)A*Y&|Y{-+?CCU1ffRJ1s2Rf1R>ERiGQy71! zfC2&7RIwZQrwOB2_zEA0yX zkqZMlY=1*kalavplqBK*&LN@J?C_qzs>{6BFj-+@2xgp9$69xa;!`K;+FZt->3you zlk86x%94^fDI&F6`=xoEHh5gg^x{}Dm$B<gkzIDL>08U%wuROja*4)h^mdO}Fe}Ubw+8=1&!M|2IUD9PmdHlv?6A zk1R$0y2#WllB@m@97;@1=kf3CJPXatOTQ$|7(9zqNb%{Yza-UzxUTZvt^&1wyX>8j zO2kL~9uGpo$d2b9iH0-Ik`hZWS8VM^?nI5-qid#v^b&rEzPRM$B7z5eRM`ZxE!lOR zza`*ZiFuok^98bk%Nbp+fXl6uKf&XnmI9dkP$-;J78*Unp47jz%RMJMdOKLu;bZ?# z%NrM=UIU1JFi^!q_&X!CGM>cN)Qzs%4K5|0C-h(EmBKD$C67*79;fdO%3a$Fex2|* zg5`xM#6*Fy`f}W5>HFVS_$sSa^6uv#Z;g}kfO%;nd@!&GSdD9>C;a3l^Ja?N6?0Q% z?7Lyvu9Am>_g!Mx_nN|~f`hbWw-&2ifqLn3e7F8dU`pFG()8D;c4V{B@ zZ`p{QA+<8sQ@&!*_XH<9Z*+8X{3g>slD0vWf2r_=`+Pw6!j+UOI-szT|MUgC?s^(5 znr{2wvbUcTHn8oJE3mfT5Dt<=Qv%qBA<+iuGa?oOkLtS#{1@D>-~7<&b)t#Q_4b0c z=!=g?>BAjhfO>?m4vpiY{85yE>G#QI7}C~-w)@c7R3a+=UL_4I6sgZnGNHgp;=KuF zC4I0klEYFzwpB3}J9pjvG$;FWx8BXT@Wwh=X(OD(VP_WI-o9u`uwfjE7`c#TAAZli zLl`S%W7!U(;$rWL_YccAj<~4r38N7?-*#Dl(Ew`IN<19_5Cw6WY0ErXN_s=g zttsc9Gk6FLbli+HVspQqlVbCgqVJm>4oap)0{kT&V{r6q98g-#f4Xw~KvsKgcP$UG zkTfTfYq(r#9lX+$`!Co(|0LKw!tpLAf~U<~?Tu!?E}wg6;Fp#p;G@vMf%Ra4;+-S< zNK;&+$YU&e{l3HAs6Dyh2ch>k5BY6bRRlRTUJ5Xt=i|p2leh$;4&bhLB0vgIQEUMS z@EgTXU-S;qG{Gu)Xvk{jUdMhnenZ~Vk%3EG%H!o|#G z7eT`VwtQObpT78UBP&}cr_m29e?zjo0W$%xlu7aA{;ZmVF6gv;r+i^Yg7(LC-)Iy* zF4o)ZQlbtSE+q$*k*3(&fdnadK9ztOiNlsEvlyWUW|Cx{P3+tzhr|iDvSO->z>oXSgO8 z16KXtu)+h8ZJfw&N;o+AQ#JDV^iIQf((~uq1hL~)phsQ5{P(hsa_&FpU{5Z_!}e|j zTtZGY{J{pfYYu^Xr2>TdZ30oy0?gee9gluh{A zZax%*&KaUu32Vwt8a=Pyg(-nMP!|TIRZ8R)NT&k!OMy5>ZY>^PnFdjT=CId8P}MO zGP*kWpMHiUid_B4IGhyfdvtq}OmB#DkV#-%>lk2h)?wP;aP#0k*8}HIaY6qAY^Yp1 z(p#{1LA|N3WF3x|GXxrM?Y7e-IE9~xP+9Gt3==1oEnQWc$FCtRU z$fWt)my`OkqpmRIxR*r`3lzeee#Omp0TQ;hpBm33iN%9_YfTG;bY%ci&n^B{fR+Wm zGpVQpuP{tYb#h$xx=K%`X29z^6!1PEOjXrU>`L_XZWK3PpD}Z?)6UptXd->!?Or(R z-(b~7CwEdyty|liT>b+Gbo^fuSqXJ3A?9}7sE`*l_i$R_PIz%`{b*j#?L=u^wpUCm z>6f*;Tr6bKxwsNLh9|Y(u)z!ro8&G4R;`C5f)<%9DEQz zEr5_yXA{y&nIA4Og_`@9k`~4EJpJ50d~bTB@Tm655v3Zm99fyVMMge>1)sNT7n~f5 zL{^natPx$OTY9;+rK+1WRG-eiSc4+gP&}eod3@M$b^we#yI5V*vvrKEGtDr-ep)S5 zO)hXKAH>(zotZf+WesOL%%kRWNYi-`0l6$<^;F^Sk8;v`98kY(gt~`^OX2{hF0JROEfXgett+>k4m}A?OXwH?frFh&Cr=lyTFX^Hh#4B-Sqe-a2MOYYx*}C)J{M?IkI=l1jWe>= zD;=a*?=peSvmY)3=;y`k5)BY7Z%3XI+t;4R#_q--uAQH6zJBtxzDnNV)v#yvKjn^B z-rCKywBhVX>{<9|0@{HoFo2o_i@t&5_@JC1o1JRfA~yGA0xH7HH9unM$IXn>4kPm* zZWA679T9TagKnv{u1RYl>_V>pnx%h{|H0(5+sYg6v-ur}-wQ>cB35&~ux3C}PgEdn=PE&>xuame(YLMYCNX4&*_^at6;4BB$f}*D}#FWbFLKk${O#`UTIBlep%|Hqv`G;EA zjh@zPkH&g*0VaFrdFyEYXlJJn)f4h~i}^H+gi(vyw^t}$6Mo7%NI=qGMF>M^B(%n) zM>hbvY0WfR4Q0~IpIeYAmpM2~FJr)|DSg$n{nbEEYEm~7&4sh*rHUEZ!Ca!mdSeXL z)=0CVtxRrhpSTN#iWufex#{#%5)Yd8g50MACXjS%gaikiIO3X0L9XgMm2kYlthrny zUxH~LzSrCH)fu_dq;xXCh3rv5>5|)wSf@@jt!G2P=k)n{qRQZW_sk9l%j_4LyBwNU zt!K=nLMM_W-{MLW(K)J%qG5Bo~zSSs{DMf|MndTdG~8<6i3j%kI99HBC!^( zhZG1t0D-*&@Vr_TD(^SMWpQ?;8(ImAS60GEo+jMwu@1HvH9st9N;gg8dE#9w93OP$ z{n1Z&WL7QBHhLK~L+)?KTk~VbQ^P0Q_pJKPRj2FTD%jHClusLVeSJ0F972u*ZJa}g z(u<);JdMFI=l=cx@(Qp&80c3x6F>)MQct#jl5B0X&UeBT8#?iHPDn# zD-4+BY zCF6pOj5`VA2@pfJ!O%{~>2ng~%Ov?p`2CSz&m9WJm6beY^Y?3-kc^7?cT=TtyGrH)F(>GR~u)$E3Q+;90R>7P^|A%emu5>dOKILw!;S+q2B@wZcngM-ZX?_AHLY+(% zFc!eW{{VVwYGv_Qk&Mn;q#I!G3H{|4!Kv&%JzH7+jop4MNHqt20Z64UR-)nqM9m1U zE7~1aQvSXN9WO>4j*>%5o>*j6q&nng%D~e)T?TpXb997JQbZ8?m$FFgNh{E{Axeiu zMv@&y3C6+1)SmKUQhG={dAWlwBvwf2F$)_+V!No5qDe?h4OUP@0?AWQ9(l6m8iDq` zw;v|8y=iqs`NneZYGdP=4HR8n85(rC)qtLVsNQumD%|BDe2%vqE~{|;}k97DY`srO}@8le7qoLruI6{K=|QUI@;0aNR;^l zrSXijLl28)&AUhDG#v-lG@miMo6ERf(S4abS9;*Z4mk{7I!j`iT{hX~TKc54V$y|< zFv!kg?@Yz_2{dgsh7L5ZJom8F7sF9WN$~i*N`7GB(8~)ax`KQ_6?8ChVHUzy-br_- z@(TFFjjUwfr}v2moeVOo3p0D%cf4>l?r?~GmUI@}dM!zpppQ+`COrJ;E!fd%V$EF@ zZ%{tQ-}yW+qA3DAtes+y`U{EHp+uSGA#hy1a+4rkAD0~BL-K|ynvgqdw8=t z3oqpj`wh{R**p#b7X#3+zC1k31SsJ&QB@Jm{rjhN8R_&}oN-{2)gbo))G& z3PG&`;0Od)Lh2YKk+lTBL|u@1o|Dv)y< z@bR-D$Zz+Dkv~4q0)@}g03q;3?Cf5MQ}Mc4Yc*-WPsbOx zxp4JML#z?M=HXuUYq`}K3SzD%@+uP0nTr4w(XP#zjwyVRS%x0Y0Z30TPpB3MR*kL1 zLX4u!*dF3vb}0J|;iOGQ&=jzxTx9joHXl*lTd3^_8d@sjdP@JpB}YKloba%&uf06m zOiYs((@{`Lz7w|{Crr8PN)R!Q^(ZBG{pl^DWpd@ndakyUG85X2%6d>_FlMq;xMe^* zZ5A-qh>R*UfTBWn5t8CXH5H=)bGA_%k3}!Q90NZva*1%NG;G7iVets|Y=jQ>cGD6Q zYv+>@gr=?AL-$;Y=Hd|HE?pW1iqDyylr!iQf3H?(jU9>AWJR_ox>?CtWc1aiX2tSa zr&zxG6)zYr)%Tq0aZHJ+?2VC%jkyLP+Wn8`qup^PZ0WTmmTLtT+5$-0?IUFHtV3Kd zYs53d0iT~NvUb%C5}!5&kPUi0VgPh@2%=Z&Dx8KdGW8=#sH(oD=V;2)=VCN$zppgU zl@tlL2mqZubp~CFfTUm6^q!E_Hlaup^6Qw_V%9IibjNC7#5GZ%7(Q}QmW-iCkM&8tx!8tcX8W{3)+CEY9XYca;&X#WAR_Gi*5NkoE z)g=mSN}qeWE&EPf&#u3A%qBjkhwvEU~pgR&bROa<0)^kd!R(Obi zv*E4%R&pA)7+buPewm$9BDAq`$GEDhYP9rX`RG#I#Kbg*LQdp$?eoIzMMX;x8VJQp zWBZ(HX>iQ5dmD79DqxRyLlF=2XMZTF=7cFlTYQ)>&AYc*a;jH3c#QjuI%Kl75u}=E zyym#1=6p&*kpuIZAidR1;~3(Tl|f`*@h``y$m^2N??0LNfqxnjXFNX*7U! zo$sb%cFcmMu2|~XvnR!8<@-dhw(mT>jM37iUeorLqp7T&$Qb#)1wc?`zLO?6VNx|rRv|QIKOA7 zdVeO4l{YO)VHS!NBTjDEvY(EzF6Aid^Hfg47_=e*T1ffp@cCk>HG3s??=~de^!}&L zHeXs7eo2|Y7YyI%_8WzZb;To`KYf9*5}Y(}sbTvDrwHj|aEJ5bB@-qoTV@)y2d8Wj z=r1zJi!vu)hh0WHEeW z`?A~pS{u}QShr37MOfZQC8$aovG~Y$fyQdu07d)g_Xs2Gcp2K6m$gO{UZZSjgMVB(XqPXY0F4D zkQ>2*vZ$YnqL~n~*mng9&L6ZMHoZETvikj0n^~EFxF`z#x^_4z5Xk1UlRL7iwAOKjDzIP4hMy@Gg}6WnVC=Qw0r9-+8*V}iLra%;vagntgTLx*tM5c zo0cS}U+7D!z1z;ig%vyJ&gq`J+&;XVzHG#xNUNN{#k8#T@M}5=6uN?LBcNFMPJ zwrU~-qwkEYWvJe@o((f%dBDP=;T7|W)@rugEtvG#ASYl1pvkCCo&Cb9ab=oidZ}S; zukT^C^;*Qwm1pn=SLLKk)+}EpB=m4x+RRBZ=Xos~9Oat@e79Y<0R=*W5R4_7ji^dG z;Jq@r<0gDu1e%PXwy|eYGp|{^v6iI{iBh+;lO-M7gB0GxU?y6>O3!ItzC*Dj;{Ca@ zr!K}?e1wRgP5wUo9nlU|aiDfxBfovScuDj}AOGn7iL*qe4m|3-<*T-!#*2wQVQLr8 zO}m4ZuHqCaj!Oz=mWL}#72~Wc@-Gd-`(rhnj_jsy+9BWJKaiSj-tP2(8BWDmphNQ$ zgv|t8c!)B*kmO1D@$fjwEkA&$HJsm8&svFbae2+cx7YT?Eh`K8rA;nyvHm&s^_MugBZk|2QIieBbw zkl3o$zo91Oe$QY`V6ScG`kc?y(P^58@EjSFKXw-9Jy4o&6ZWH zuQQw0TjO4LpbZT?dP%UT_19l0R(s$0u>Dy#uY%2qQFE*7oiD{$v*R=bbS_9$aG&vK zM1UI#jbRpca3Ylx`fwKf~K#;O6iN=y@15eHAsB5@W*Ec z#!+{jG}@zti}*!*Tci=R1Pd_k#5-kfl&sIP%Pbhz6nf=@xE zt+l6YSU2yN&Fz`o)vO>`rBJKE^r8hCC)AE&>ML+ePp+F5%(UpwNV#&>jE+Jk<~@fd z|I17o*g5G4~l0Nd+J@3!RSoh(Ja!J`(-(OW&ZtnRY`s<_3F8GpY!wD^n+zu96}h3=PZjhdHx z>My^nm$-dRu%$64Qd5O9SFl#u3w#|c6k4?#Ue+v)&AMU5@%ac@J@>?+Od#DV`-XB- zQ$u?UHI?uhgvDd)zM(#Uwc7lFh@<(FcO_Gn4(6brXu`yPcz|jhDA`1Sgov+F%#n;O4|BOny-|`RLB+Ou)PDy-b;lI;f*(+?(aN<#&9$Zy)w%8flX_jF2FoA8UVvVb!`x&*ro~EQ7mw5+1@zaitw@1f} zd`PoOKH*+RZF~RCVdn>xRWJ3fL@i8Hxm^&`JM-cF<3#UolbNI^gmc&)d?2<&m4Q&2 z$77>c+o0ELXqP^}Qm^4XK8|_r+PHN^mx@>WmhU{fzF^5smjh**CD*MEtOed(-xMM6 zHA6Saa!>PHrImsEUbO#$>6abM^<5V>hPAg#Hj5u}LK2PDW_`=coVpemv03reqVWvg zv)a{@&oe3_on0U5F1y~SX`={#bPb3Il%+&Hf+;lv_>ig&bdB8b5|~ek{9u3b_DzSQ zkQP&wUW<4osCw(xjVU{$9S1Y? zdVN-~J85@V=kIz*p}sNzWlg%AocqfMnp)0JhX%6%fk+JCd{!qmBv8Nn_29I<0KqYQ zeNi>f!spx(YrG-c(_6ANlb+y_t%=E^uzwK%9m)RgT=GDNZ%&OmLQVc^kC?lGyHiO{ z#AwtsRl&lRD9mW&`6n;^hT;7t1y6eV&Z`ElZs+?MD(a}MxY=!0+Bi$;F89Gyn?Zz4 z)p?vif+GcUoiRU#PWQ{{m8F8dTNjlH5yY55jxgLYs||*|g`VbWtE5j;}qtUM$t`-%R*;XB(dS)@JRo=mJ zIx68k-Fsh(sGkNgi@>r&+JtSVDoavp&AW?= z-0!a4wY{stG(Ex>pM4UoYhUsyM(MntgO@TKIO}0e_8i@(H@xP0C#xBmx)f#C!V!9fZABZtAx}jAM7Q=&VjGKdgGy9$ zS}4JcOO{2v4o)IhBHJ!^Q;{OAjB$)|aKOcx@$Mx$qI=Ks4wK!WjE= z(>EoJX8J*@~6Br^&l*4!cTbcb=b`-GdUgDUKnMmH*Wl-9 zh&M;8Lpnz+bJ)b3Qhx>g*=s)M-bFs)PkE#(J2k9nt|5mw#G!!H1Upf^hl^y0ZB~pu zZuEJ!*goX!cOGx3EMWGU_qytL8knT)9zGcue&KOq^|r3-PDxGd?K5pH18yJ6Ltak3 zxqI!3AL$S^a#K|Prucl$xUM*>@}d?&9oyf5W-0@{waAVazIGwI+lAHjquclTqD)<0 z^;~fex$407YS6;x$J@zh65lZZp`Yx&T#$}mrs>FH(6uR>?Gd{(r|0kG_MN}KqCKy& z^6^JLe%7F8PCw`_H=G3_B?it$C??ac5e2=6y3JGLnr|#kX5E{R_}Jj;vCLG zN3lEA***1D&X8#lE1*H(RTdf;q6wm)oHRr{MLE` zV+WGLb@Sh226xyb@EEm0pTU!0j@dQ#UFREVGm{{W`Tzz%|5c`@{HzKzPWu=Mk%0fT ziUJf@_sMT(NzBq@t@vo@{#qV#y+8ff|DWro4feRi-=L|2y^j*ksXyKN*T|C`_UpITx+vPJz* zX0-*LZa&{0-cCMO*C_whfx~Ss>(H?l2MoU@XtmD%FBIy;-}LJk{O@(NKqnTi$(Bk@ z9A|fTxY6A-q2Z%$>ruwt9+d$d^j3{>8O{$*b&F$k!c zvPqTyx`1``6{dVsi`5Pm%V#xPKaXIM)QX!Bc-W_WCbvPbksd_Kq7E*A{!DdhaLf0y zaG%f=UFJte<1>!wo)c;AI$?W4q4>9Q(`+Bx_S@bwrJyk&27L@Yx;!IvOm-y;#uHr7 z(=_C$TCmlS8NVTss8>kL7jzZPF(WT1Kef&Sv^n_~vLg-ogz4zKvdwSE%SPmHi0C@y zkKKR#)w1w*cnzT6^sS(nr@U{pLz%1J-7_2KKQlAaaaBtHB30-ewLS$PUjxOi!l#4D zVey=x+V7I}8}j++7c68EtH(5bu(Z~RWCF_7LlFo=&mw}$hRgPHb7Q5SR{{k@r(#;` zyU*4V@hi=S^WTt1>c72m&eVk~tDvZ@JoIYDuE$V#oX~%{-F!Y=8(SDkQvPyuGTyF0 zI_7FkT^x&c_Eb*Y`oEY(g(nju!OOVb;*-hE>gIPRIdtF0X;XfcKB4JssK%^L#Zg}R zsoIH6=gNn`%P+TRPUPoALDrsN!$Wptua+9*OzVCKVwy3Z;gi$mI|%g(s2ToSt32D^ zULS8No(wIKYC#pu!lnF2l|@82*J4|jQL{6%W}UV81b${o4Nbb-bsBaRHpo5xSOKjl zqtkJxZ22w(k1=l;z9CFKV|u!dnbc5cBu%y=W7k> z=O`5+&{dOzTF=5?1zb`Cf*uG~CV≫rJ6`TuvorrbZ)w4Cw+cqHyt%&~Xg%+bEd@ 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 z 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


fFBno!$9geI~nutKUkt{!R1I4#OPW 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

Zlvz8=!9Jqo(}5a0-UFF$h`VNBfsPo<3A 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%0Ao|$xc-hz<*|T&s2Jk? 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 CK9Vf} literal 0 HcmV?d00001 diff --git a/blogs/serverless-llm-architecture/images/arch_step1.jpg b/blogs/serverless-llm-architecture/images/arch_step1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8c9fbfb7851d2873c6d2ba4e94813fed069fb755 GIT binary patch literal 432684 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

PTGxd76QK;> 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

>#=W|YR9j_Xrl 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ξ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

nceGd@jRndE|u&feeDCu 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%0D}7{acl6z|2~CsS>qb{cho^r>l)qbHMd_PCPv{ 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 literal 0 HcmV?d00001 diff --git a/blogs/serverless-llm-architecture/images/arch_step3.jpg b/blogs/serverless-llm-architecture/images/arch_step3.jpg new file mode 100644 index 0000000000000000000000000000000000000000..086a1b23ca253d7cb8d61a3400d42767df9ce9a5 GIT binary patch literal 541439 zcmeEv2V4_d+V_MYK}8}W0xATh3L=6Osi8=divg96pdcV1ARxU2L_m5`R6qzt1Zh!v zk4gvW2-16(5^4w`eB<4{yLa#2dw1`?`+o2HearkDGBcTpbIzQ3p8xZI%Gvw6HwqlR zs-&s}Kp+6*Dv?2Q4TimsOC0HCf8@B#op4IF?R1EAm*cnbLEByixzZ2-6mIrW$A z>kytlpF;rvftCQ}pU=?;KfiB+zx?CXfBJ+bLH_!SNfbYwO?xg0`qTD7s_)nBEdrM{ z?%6%GbG&EwfbG(Si@;@hRdvemzYZ=xZgc*)d9<4)v@Zh4qnz_O`0^V;-h1x@Ku3L$ ziuN27au%SVgFxvZdo=(8yo&>nAD1651OGrMpp*xwVAKZ>9R^P*JPJ@ipil}*=z#;@ z{~L%G_&q>Lci`9=K{+aV%{#EO_Q!>MqmrrF<==l~xZbhCammEt(ZNF}7@3$)a&mF= zoZ}T15f!^EE}?KmQAt@v_3DkATG~3gdith!&CD(CSz0+hbaHlab#wQ7>>m*LBq%ug z>9d&UFJ8vRrKG-2dy}5=HZw23ps=X8q_pf)bxmzueM4hYXIJ-^p5Cv0{bS=3lT*_( zvvc$K)wT7F%`L(<@q4?#{`^z3z`uWL*)Q5f2eylXk`hV@``#`Hh0FJb(@`EcBS>{j zP7`*=p8l+mFZFTxsO0w_53*mnzQSPQ&~fMlhwvCD{(IAYY}r58ut)z=%l^`^zqV@t zPyi@?T%Z&b&;w8?^Z?ZXaG|26`o2&fqW*C?^yh`<$A$L$0{_dh2mS~I{0&M z=;4EhkN)9hZwMTg6MOvt4HN}UtyecOt}zK_Yj;Cw zdPBIM2Qm=f-BDVpE*cCtg9pIl>M1@f;DJ-|-Cg(gPu%aG{Xwz+D*S&ZDWEgxCpx|F z2ydp<haRAP!B!OQiV*qy*0Axw@#kvBZYbO-8Fq={zPW?Ez7FGrJAAb%@c_7;5`O zK^t)^Vp{{IxGyC4b;!Qv{Exs36kk&5AH>Swnu@b1+Q>3D@MJBV?1AH&vWUHQ5MWi! zd#T^;DN5VAF>lS~bBHHpfBg^Z0~s4a*dD-c*0vLco~5X4{)AcOx5R8LBUW>jYjE&4 zy&G;$!j-yLe3d%=-xta*MBQ47GI`h{)Qb|BKIQsF%#^ub@RbHt7&xT953Bw4f3^=! z+}{HxrjUp!gAHGcJpgfzum|vtBvAzOB*FJO_TTvbu(x|(qW|yKXy^O(fchqHWK;3N zFV%DBzxQRW>8VhBJxg~`8kKLK%gh5@1_heBR7+~_|l7)FvG0KPZ5jAW0pGxi#pm9NzG+`BP`YnhvcCY)D6-Z(CJ;| zxIj>L?3FJ5!P~2O8Lg6}X20#HyL=tO=pdrvm~Np;f0Kf5`EorbgBkIJWap zEQ4#hkzo(OF|7`)8Cu|5+|0{YK9So+>O#2tCr)qM_(#IA5S+rIEb9!-%3w|YKto>L z1aE`FIo6s7R{GnH3V5aBF%Q4vS6+TRvp6+Wz)D~~WiYbV;zgIVKtw;e?>`jcaFIh{ zE2B=}Mw#bP|glW)0Z>4;9tCrzuSv2#$kkyPj6fbJC+ zKW_YKoMkE3De6|{z+uPTFN+(}S+ntcr_?3-&VMt}y%Ujwy=J*t)U&CL@7GTXXL`n) zF$=t%1yX`}ep;cycniPtB$Y(Z`~1rqckb5HNb*IX6uLduvD8H+Up&v`K8H4!6`JIx zFXbiHf6;Y7Qt-_;fiD3I;X1!zqh$`wV-RLy0F5^-{%9T5)bq$XiR)JDE8O?**-Wd zipH;EB35&VAM!zE_Kbv%v1^AY9@l{Fb^qH0os2gjAzNfRuk5ZZji_1!jI593M#}jv zwslt0j}3>$nftPI!AC~MwJ+B*H;h`LL!ZX-Tb_<=-P#QZrSjEMGXRiYlC$z#g*NxY>P1>;$9e=-uX1 zxya$`k{Ynj%@!GF)+Eq~FnJT-AUdqN7TzR!ZY9$)s8>d-Nb2oo0TW^abZ;+h+0T3P$*$61cJqa&tOJh{Efv%YCat2&Wi^~QSgKB>al zUl`1GZfQ%tP_lbTmK794$2Go-(*5=4eZX+MtJ;PhWq-EzBu&2fp(Kx|ACeBamh-X4IFM3c~aKyWJgL=~vvWSsW^kj~r# z7-U)36kWwg{9YDh&&53eG{DHb5d?i=8)dHHzCWy`?vF-**ljB*zCLJtrW;nW0ICpF`a#@#_FZ;8|P+Ag$ zIH?x!&|;{uG(PGn{*$%wA$gnm_4%JZL9O;qMp7mVofr^rgp zn60yWK>GoY7yige{VwFfFmg(kWnYp0?@*+_t2lf9J&F??YBCzQV0CEC^=#AWyplm5 zd}LUumqe(}7tvn2TLZODkfGBJx#?eY?|R3KVU8C(FaC1o%Y^aJ5Sub`z2oxCd`W$K zujxvc!O4Kohm8hXn=q*K4>nDh>Zosm3$m zxs6QR!R(>|K;-~}B^ z;NGEEDC~L(7i1JN-C1mQ9HE?$dE_IOvCo_Rf;Y?@9+pe*SNC!lF!4S7eiJI?LDZm9 zenL{cGnOUj==LJ|hbI%p6_ZXx$l&JIWrlH&3QauK<_|IhckhozzpI1Gh0m-B52$$= zjI&m3F{Df68Y1POdF`> zrCzKuh#WVh_WtwEaj!q!9Iq8m$$LC(9*-pH z2DRq5XR6&3Mjm;pa>cwY8n8Td7dM0$j6^2}Mn%=Pf9byaopJpmtLMOP={Q4+ATnZj zf%v)qm5ydjG$lm$n70hFYoyS$x=GMZQD$HlELF5&Ms!1FXlApvnf8( z!NKFg*e5cly1!oOI;DEbC;v#&9`GSRXYFkHZ3Upo0j?l>_*WFl-*&lCN>m`@CiA2P55P>J6o1Xz9Y? zIT`kj!rIn&hrG+oJl;Bp6?#9ydeV`ye*%&Hj^nlW-=?btE96o>V&`sH<|m}pX_hV8 zZ=nb~=2g~Rb{mL8*4_`)^9KY~*`=tALem$%?jG?nFtVQ*ffbcfcNa|U0qVXFbja>( zi{zEXZFdcrO`6s7xZ211{!f>}H3@H*(g(G}JWI#0^u`3EjaZ1Q?zpZ&=mahwz6ad$ zVoq6zbHGG- zo>|tGx-$Vv{eI{0W|0{s@3)NW{EO`_>sa0uvhQ2h;+rO)YsKsmooAS(R^8u!L#6=_ z5wud0T*;Xi-rFOH{IN|>JJJvj(I4D*?TzKMSR}6%bY`c#dyl%n6aXxFsY*94>ty`o zxY+;vvl9o)O?aDGaNbBKwXbnCRpHAo^co_3!un^)9Qr1s&>_yF|*(sB<SH4C2!6Ru|1*K7R1rt5-&_c?(P+a#W7`9T#w(m^+ z?{ub?jxbo8%66FJn1nFVY#!wgNu@}Cz+qSv-_Q|a>8=TPS8m>aH)SOEX10Gh z7|XKwCEdZ1qm#Y>vH5ZjIMY_BI@WS*p;o^wa%n&}miyVN{LIr0?ldovJ9jMK=qsC< zG6gf$0f^7Ur-SXV=U++O1vgVL8r(2^*z91EjMsH@CnNs6x=|R4v6-2;f}enewu9bY&p>TXz*R*qgIv` z7P~A=_VxIvjk#^2223Q0B-K;+*dYFu?m#hH!$AjWd2|rNh}=q+g5n;aQd$yKc{4Mj z*^=xu4|;c^he_P;?s8wNj28XI38|k>w*FigLA#L1SfXlsvkvOLB97!S&3QqE}bl^=_rPkMYT(%=jGw2HP_dVq4P!--9gIJs4B}*t1WHk`C7@(Q}ytgUCSyT)ghP{938c&qo7afJ3mv)@j zz_h_;C3U>aCX8u}c?3u5>7>(S^blJ;um!`Std)GVlI``k!!4!T23t?OfJPdbQsmX~ z3uI;P(OdTF`Uv$OK!`&e)fo) zHx3Wg>q)h~XK!}Duc_|ZG%R0?nKcPGV)NDWT=!J9m6-iN#1$%~UFV4I-jvxYs&-** zdS$xOR}LKUG|KI_A=?(iK2jmoGLY_#ycc3g{d%k}h^mR*802UCT-?^~r62M-&v({+ z5o%2=)>&rz^Q^AeKjD%PN*KV`6QcCYDCWSYdPtOt^f>(0*#?7s1F)5)VPmM%Q~&PA zi+>JHf3bbZ39}6yLH8a+uhScut~@2nI0CEFM!fS!W})*W(*+8&S;w}yC(!LPkV zmolzd%_YB2P#6Fq#Ng*Yf+JQ?tk%RYfkC$X*;umxPThu^4nWf*SB7t_rxL9bps11( zM~-Ou(9iW8(c&Dvk3D}g$4c&ZpYqRrD*M|IBTl^eM%b5tSMa7Mol*0;i-_l4+r34- zZ6gc}flqFmwhwS2my45VC&mKeo|i$5qjs7b54P=4JNs@=S8|oYA!WG7>#GSdABlnY zdyW5O|B7^QD22;1>mHSxm771;tpRJ?>QEiq1CBPIhE2aO;e_Xj>Z~zgvrMAQ!Z@#K zeYmqO)%%%M%n8k4#VKJ2#UFy~TFj^hsL05pJS~pM9VQ`fH3ZkmEFoIQS9r-{sThcQUFi<_x5^z^2r z4>s#BmJrmB5cVc*E8q==IlAS!mP}tYykTY~7dED~pqOp=m44Mwu^h3eq=b~W?vXN_ zPh{>6SzkTv&2ihia2$O^E525cuEQh}^F~k>q5Kb`Pa)<%B?IZ6_$i3wM;7wmog;8A zyUEWnGRZ|s`$$_bN!+4_7%I*ZQ=RDbg3CwZ5T7q*T*p6U570UP)G;Dj2#JWdF;m4G zD>1KTFP-Xgt|k9)586G8J!==D?L&%lj9O+xw0FH2ZwW%kVAy0@;RFp>PKS{xy!O_C z4{JF~>@rQ+Na+vcnD;h#_@@^z%kqoS52R}D5Pf7x_n<{7`S&*xxHW)2BSq0AK!FxRbzY)$Sne6XuKfCNJ26B>S^PR9*~4JOAce5Q#`JdX#0D1 zqQ!jKV+rj9`;4|GS^xK4-0w&zhBbySE#%5f;ZAdd_+kJue~lvIPP-1)Q?pXg(z%G& zelti7Vb3(T{Vw;$*qg*+{lOQ}G$AUDh-F+8@`qkUY4*<+{I?<$R+b+LSF%z@FNu^@ zu$^!@6@yBF&MowA>zHh=s3hK~%f<|`(QV)C)}~co(pSb@r5OcI;OP0Ly@6XubOlPOusckZ-LI}c7M0tYUDN(hFpSN(_c4! zf?4HjBa_g?qgV+77_G_pLCZFRSZ zPbk86H*PRwyU^V^AM~?(EEC5B$d9Z)dmlsBx2BONja#zb1k^df@23RwIbQr((C9xx zaM0t4(~8^&=HV(bj^vhPG@14Y@b@DfBu*_EF!Oy%qv)T z4|;7sV(_1jn5^&{uZnB4v&dp=c=8f6JBXc!&luruil|GBXm`zY^~QkGs4DI{Z-Fb5H1SnKRKMHe_PsthWYG6v zOU&WCAY1dL(-31B*O594<49dyv-@Yo8%LX}OIdurA?arU@p5WzJol5-usS26LtFUA z@EN2}i+H_5Un^Gj)hz;V&Si-Q2qD zEMF(M+i73#90JM}-Hej)I%>YbmOXj5ObIWabni-FJ|Fr729D&T%fn=(tKtWci9FE3 zdsyywgq-xIk0PhU`PWD)pX3M;&-MU`^)NB*u0mItt~Z0{=SD0iJ&w8|!hm~!){u}@ zTu`=Ihm@+*G0%9;H525w_k$(Gha|o^^;0(k^}6^sc;NIr9B8MqizGNht>=}M>iJEz zOg*lJELjDfdHe>O2Ue4?qZ3ECRJ-bGJC?KL$Qe3wAvIG>y?IyJ9Uxu{&NB0|%os=; z3e6H0=y*1X-iRpF2ZsV*Jf1OFxQ*6;`NAuyZ!#)3N#D>(TgbQLKH|vWlb`hG1n20A zm+hD?!ByI4Htw6wTGNjy#npKX-KuZOJfkqLN;C2tHe=)=Tvi-X*z$GFHaGqdY)ET; zQwuR+tTyX@j0K$1USLT+_0^5@0fg}YW0B9^*VT0wh^g<+<5 z51^|+d6b&O^3w$f9`ivjziEWcTEFci9~aeDH(7y1J$vlLG-+#xwp!;G`#5~M^V9YT zm8I0>CaF3iX%MTz;C3^D$;sW#WZ{=?cCvY9IJp-hEy65Jvs!?OPkCd(isLBc8V(h!P$9?p(u@ZJY) zKbgq?4xr}RR;w-J{i^a&6I!UybWG)x$fc2sd%(91?pgzLYcH8^Ufq`LNF5+zm$C=- zY2i!Ajq>-V5d}(29xvNajbRVH{E!76{>L>9r+q;Q18ds@j^QTn?g2&TNGS6oW z*5t)!nu@mOzXy2tzxy@&_>UcPOk`ha#f+;NbIsn5y)@O7I(=hTIRgvyc%H+$I@pQo zeys`QlhWh+<{*A!1Dlbt@G%Jl~675-I%&3tb2XUACTLCzj#@pUAoxX#)-*FI(h}NSavatkmvl?QBBwwo>{c z%TM|vBC~}5ocSoEdW>mU&%lc9e9b!Gpbj{CpTkRI1F}8mV6pZWu4v9I(+v_K!&Po^ zUM{u$Nkdgj)2Oo4rOX}L;8f5ixNhy9FcVxj9Vc?3t0bIym+`XZE~?V&;8?_wepfq` zf$InBK%j-&*-q}8Bz!^kG*!$>n&|nsFMWgV^|Y6X`A|$VJ~y7sfb}n0Tup1kzH}rb z(p*3;Bw`+O$fob`?AHBo364R(J%B=kniS^tl&gG}?;j^b7={&CSS?`xZ|8W+I z<{AkPy&;;*jp09dHVmf@bh{+cj8GHuMrwK{slC<3VOXv9csd?e5^qk$M6Si~1F zH7>=D(UJ}#MHIT{9EYqvQXhvO9*WV9`(!&hNmc)TEO44H-ESNnlyWQ2jUJ&B3f_8n zUNDhryr+NZ(vfaeA;g#y4U*mPTh+mp?3U8?*^hg`-MolKl_WSrB_U)yq=qLyCoi$; zI)J_ujfCpC>jaAI0rZBcJ%9k_Sv5jb$Sk9NS^5v zq^v*bGUR_XH}Ufqr!YyyA~F4EpEzcqgqPt>5>E|XLOeaJlO^Xi4_y$Do!N=PY`*W_ z@iwoxrDKfueq&#?I<<`)QY2r+y_k_@u`S16x``X2ipH5d#+PTm_Hq{(YpZmOLp&~Q zqr1u(AQV~JjJhDd6Ezgkg%??nIZ1FzpYyPFvMDY`4zUZK*@P{7sgU?OfkR;FN#`Wm z!&e9{$#aV4rBp=wVYyZ4w*;hAuWM#T^3elYOuz%+`26pB5-8H9{GTV&Jt9&jP_xq} zmk}+}+-yr%%K8;83z&aEbt|6X^jJ9+EomxF?9J_vMVtc}3&kXL++RV%>d^J*geJh^MZ8xnCI1v;2)?gr02WkwsgB1}zh%|9H!H`?G7CVY^fL>}Y&zG2=1v zym733#rhJ?x4zIl+#e59=n<`!^a>uu=P9f{B{#2=R_;N||IVYr;`XojRAAEM35XrX zDKsO?bxl*@qkM4!G z3-G~6;;V-;yL*6s|Fh1HD9-M=hXThe%XZ5eE!p(muhpPh)8_^~f=93~Y)N9{EJCOe zy&uw0G(PW0%ns*D@tp0e=+0><0qr`Hb|aR9I$WC;-8XeUBl=``zh_~L>}+upbd<+fBx~Lg0$SBV zJTj8CCHobfZk4014{F=SJfFBBO+U^}3SI+?EFj2_`C6-(LC*}BQ@Q~P;JDs5gr%P8 zwQ9#|OL}##NlA?p_ozay= z&wme6nJ*w$VO1bQd2A1u<*KM3<0g5|8!su6`YR>%_JBy~t=$JN_5eANY2-oV#LV?Q zz(HX8OP7MFL|_riK4@mN#moI>fCQ9{gWWkRO8t54{(_DQYnK228p zD?x>^e=x1e;m;f!uFBz{ilzRoqDo1$kN)GO!9SZd%NK%&g%{XR7C@@LJiNS`ihQ^S z6b!-Uy)vK$+5D)QvJ+7;xQcKw#0T1$J)la5s{*cv?|mW?ZA$O;oNA&ukS}U!2(`MI zv5tijp6b*D-M<}#3pah|ZR|>>@R5dV5U^&<=ica5)bDg2^;>1;UeA?Z7`F>b=WY-* zpdFy+22BJ0Teb-+DJ>U?ITKCj@}tzqOVQ{vw-VAHc?y`rUZmGex;z!KAQKys;0K=8 z4f8&mDrAQ3B1OdbD4W2_(;tqtBo`PMxFTC=MfM zz}J)D2{~kT*IWv*!R!ytt{`7w2K1_#;msFSPKG^Fk$m|weRcqs;O^DtUm^Ywp77>l z+x3j2WNSae+O28??cgIDnxe1)Ydhn{JhVPgnod$&Y1urX8rRWg`2tENG9zLc`sM8H zoS5SJ6`zaFHhlCYDY`19uH@?#A6Va>DA#O943&~-mC4eEcUak0YI{(aI|Ad$?}-<| zG#IZthAt6yC!0U@h6WzFs2kYP00UW-7KKr1@12^HKjhDI>fbXHoKhOhZI@$z z%P#0i%b3fZ4$e?aIy+e2C4qFYt8>BFqm)YVmEw!t&28nmIO4Gig|YL&0wPQi!}lic ztY4QSn^ac)#i*A;jOQjsT0Jidrt!)Y%311|z%=+0bX->Y@wp_y)At>0Uc2IGnY_ac z+iFW0o4d}E&zjj)Pch`Iyk&lPI8gfJ)O*5N4cMD5j_Au8&3u%KlliA18(gJmX6s^B z){d}^l&q_r=dE#(Vib

sZVMfeM9jkEG~|-p)jM9u9a47P^`QckA|MbG1MY*8Ww5_s%uB@g`B>Eqsi~=*9YJYk?mKcXEgPJ!Zli;U+G)$qMhnVO>wb zm5p~)D~+y0TcWijicxX_WLgYyl%yjrXfW7h9nzH(Uf2$}94_XYVL#2vgzOT(?J zji77Cii;M>Uc4Q*B)rT>aJ+fO#x7Ev4BH*BXs4<}9~#G!kL#*F@3P}~yazbTp7u7i zMC3du!&J8&oBL4lAf%z*^&05i@O&jUc?9s{R`e`PbIq!eK|F1InE7|G@_!+{eT?KZj{3&JQ+t2M z?n0IBijszlr?=m5dGPkr`ndRcZ_YAG@>2IUwfKYun1&c(L0Xfgb2X?IOXR_wiH#nj zolBES^q_DDnY@MG&Xcw=>2oJObzSql6YBI~Dk6*Z^-f&tN>OMWYmnXD9nnTyv zA?4U9f{wy(G7`U*!Nuw|zD%LF5X8CRbJU7OmCWoqTb(2WD&yivSJN6s?-O5e9wo8{ zW;I6DkL-7+7Pnon8GIkBcxIceGpe)XSi8#)++|OHSxJ74<^_t~@F>kkORl#IeJ8^D zwDJZsF2k_)TDYw z*#h~zLjWF5FgRIE+LqfcCUk&Fnx@*|9q}MV!GI<(jpKbkx{VSP#L5KC{fqWHVt+*J zzZ&~8VqaM9YmI&Nxep2UvC%$A+(*m*|CkNiw5wCt3p3>p7}A{`V6wW?Sv`qG6boXb zG!T0M#LA^xwEm;&js^qgBECJZC+lCO1`Q}PcTBrS`vI@Rb?(!CMVGnOa_UKWFQyGW zT#P?V^k>gY#4oT46m;J$w$^^GhK?eJ+AyD{@$0rXYEE`NrO>|F#J;1|vx0De${e+~1BQwxRWc~5zL7Fvx2-#b4VZ<8xVliW ze$o|IkFoMMO+(wM5`Gb@!KyWmLCl||&A$+9XLCG=NuIgbVp_xF zl%1{l$6T8VukbFiEBEdy@{^C00{KK;4p=No!`p@|jQ;fX3vQ+f-h!*E#C>zdtbIf- zN0E>3pTFNf`{QB%ec6`}`|@yKU+nA0eLS#_2lny6J|6h*#seZtO%6%KZiHz8ShDUQ z=sS;C$vO_)xYa3a$#FZwCmIDny5pSOifb0N)mV;6G8tGK%k;4C1U18JM!k5TA$W@# z$x6A&cO8Zw?+MZP1wNfc`=gDGuhy>2_-@!8wJEu?X`rwN@EbZ*@5U@|jC%C6Rbyxj zthSEL$2~g8zo^T5W=j8B1<^;a-m|yL2LNawvZw0;M|a_Jhc?>}awArIP_b)^U%dgH zU&cn=WE3sxjV!DjR1>!OVn_vB5s^L)2}~uRQSFJ7bIGaUlUYoSO>dcZN@rdXI|)zK zC8`45(leTynfu5@QZv!l;GqVrdH6^VqdcCHkr8%R$o!mR9YZ-L8Nj4@$y2kRtwIxm z#w@z*4D|DV=)Wauj96_|=#^>d_Q22S4l#1gX`Xu1tXmlSHM zE30bW4fD&Qc|z<7^F?m{Okq{M5PzAER)1m;G(A@OJ(KSyGP7YpF-+ZApreX2X}4% zfcQIUpZM1a$EfSgnA%FERkuXk|GvabO^=jh>cabP-8NqaPOHf17^l*rX%oMUvvLx= zGG>#Pz8$P6Fj9qXJwf(EGqw;<7}m9pL)MD@r93=R^7O1YbML!5HrFBhr0a{Pf{C=l zaI4JN6sROUp#DNV0CtB1JTP;p_R;kKkjGD&*Dcue~($EKM6 z4>?iyKTfonc}{vkn89S}9xx5{7j-HBwEuhatNa)0gKx`!xt2VBPiqgDn#RlR0ltl3 z06aEpVM>~jtds>O?uP6EN{0Yq-X9I0s~8x6W;M(b)ONE(9?5XW=&6w-UV*Hbwg+Gz zgT%(^#i zh(Jrh`?e+t8uyK@+&5t9lfMhl{a3t(N zi1q&k=k(KK0@Fl-!HgpPZZNuM7&T=G15>LvyKy5S+afMxJ}{x%`UW^`+>kL35MV^< z02oo~Eil;)SpY*-f2AD33re0baY3wPIq-g%ko7 zd^HA(A139vOaJD>P?S14B)_>u%@HiC6%!x_dyhSe=dM;Ock#f&$z=M*$Cw245ce{? zcfn{*5%5g4%pwF<=e^{giEDYbc8Y?^tD|I>@1dtMUiTL6p1hZ5VcTl`obi>xzJ4R_ z7cLans=|{4C#~7ZbjC-X5ADXwbCd{Ot>d3Jff06GN)MemBjJ6i>h z3)1jnWqE6VyK)TdFdjixRKxsOeW3OM8iX2?d>&xM0A(;XyYhQ%^4Wy89Xxv0q(lG= z?ptN31f!_g!IZk=kfrY57|XvCj`v@vZoQ3C1YfJnYBJ7b59oMQm5qJ2ZoGXm8@aG4 zu*<{)op1Un(ea=CT*Cw-R`~^XJ-Jt{)~$ZN2TcF0Ai@A&4f(I-5e9xY73Ck5N%;Tb z`+rfI+m~U&Ns@1_-nNVzSDZg{$_IH}cGp@688po5T&?)PuRCR8-BG7u=Wr}*h@oA` z2Aob;*~$|M{h`(P^8oWxz?4P8B{#Ek{?vjlmcP{`R^cr>j7I2k7Q?wdKdG~8b>3oK zpW+Estq4ia2Im`VZ2eY~CXW0*JofTW-#l!@$-8po0uiY4Y`^3X# z;v_OQ$HMkzqd@|v+lwHP2i9#6cCzb_H0 zE%xz_!z?o^e>Rlv>(0q7{S`P9x?vqXQv9QoA?K#(>uMh24M@)zuoM-VXLLJS9X6nZ z;(*k5_evwfA5sf{E#z{!`|915!#mXlqpyxp$-K$eyq}fe&(J(qCD^_p$rrNztePc* zN{+3XN17HQ-X`bQlQCB%(=Ni-{VuebzQH+FC5ex|o#Noa0Nag8lQKywo|M-X(&J$k zJBO7Lw*_Y&L_voJ(x)0peB2+1Mfo{>D0HUK%jU;Vco%nYuH+=0|)E&@45e zyz51KMC?TIF$@0jU4dN?A;JNu9%md>dOU{v2p) z-^+}3!Ez9C$m!~PfV=TzVVY=sVbBZ5_6lhanbefN5yMEcSg0TrioDvFYxfDU3RZ5| zXh2`O#c9UhEN4U~P~&AUqU3aQN2o#hX@SMP%XLeo^$P=q?nYS?>hwyLUNY+qoS_uX zxyqk~#9JH$7m)A^A~&lHl*F!IW{a^YZ=BbWbi`P7(k%r&m9`4z$qxRx%k<~2&VOIM zu^E!i_ZcJ8!9t6xXx>p7Q2G?5kx9mlSvb5gDMTN$>(NNc^7)>T%-a6~l+Ij9aN}PT zYk_`}avE26xrRTz`CKed;m~~^15lK&E!|MOn@kKV?kLojGHA~<^UbP9A% zjki&A2kUoNb`*=&i}_hRyy_{ z+!wjedj|`lri>VKJ(YSkggSIF?_^y+oo-Mr-y{j@#u@v2Dq@QrkkosiI8`VA@GLq=;`6}~Q1`ZNgf_;d zpKH+~1&a|;xlpYYfgs_?yB_F*E4ccD!$^S&BrgC~Pu#{_!4Kn7V#3mPZXW&^ZgLHl z?}TXXuf$dl3w27#Q)=L%oWk!ouAx7mln~fLz^UL@fYXB!&`Ev+bdq}u?9%8QSiz9x zi*Xw@=vnznyBZ1J1>(&()2p|SF-ZChg{4aiN%I~4RCOq#n(>BVT3^XpB-bIEdhxa! zvMjZ~VX*w}q$B@@LgxFh>=%OfXK&{JU8wlSVVPlX=mlFFDG@K}WIi@oAqk()P((xA zoYlGH;Bm%B58d|N3$L=FuxTtBMVmXXHB~&D_lU;3sOFv$X%wwX;$dUp#D_N3-{>Q^NUKg^4FN# zE>FB`RoOUOiL6Jj@*3}gwopfiF6J<3H$m({yAlQ3m7H|WepH20Db1>hJGZ6{K8J2F z=^~e)zb)#I48K3ozQrKq66RXTJgF2MMvy7kbl65PI zd9-1pVL(+})%S*O%Td%D$HkYwBB?Zd;@xW5f!p5Y zt!VuYN%>iWyn`g@m}QD!PV$opNYuy!QX}G}NXMMJr@J(QHIYsovA=@) z+~_w3&%!-4R&sqaheW1!lb)LcCk7W@(a=I6M(4&^WZKm5kNR|#r{p6J9*(w;e7&kF zZ9UucH(0(PWvC%`86<5?bbm&3L*jq4n(X?b1zC1$WaE?ZE@kga5(k(VmY}xVfQ#2r zKN336+NXG2d-~3A5LqzfIBxqyA(FWDbXy1V*O01Pzs)rP?z_K`_XttaZ6r$A3PrHbCB83GZQlV*t>ADoPF!EDWS8wBX*n+gmO_2eZU_4hZkR@+-Zj2)by0g- z6Gsw#T6)&plFNHX`E&g|IIDt}qP3-ssqOQks3$3*ceIp%cK$VtO(~+D zZ5w3G%_QLUT;-X6pJ7dV!)V1e1e+y=cN2rX?pW#D1FZACkqNG-CsOCK2qt&V$GVDn zKCO?uG$0MKpONZb3YzLPVsujUNzr0VW_Kdxz9|B3h({G@{?8q=#EB)BPqpInC^NL< zSF(5EH<8t?(1*e+nNeJHKaZUfk5*Zk`4SmpN{Es@ z)%^#?((mw2?f?2rEq@1aawSGSB%Um)2q*G6(<`z?paZ(3KDfCy`mtFye;$re1_I-A~IcO0`ztpV$ixRzy>qx&ZLc5RAhxDqw{BkCO9wUGeh z)$?%TBKJC0{%_k>!CvbvjOU6U=PT#q!(E_emd8F1B*;yIS<*(!#sY*HvQnk;?gmK3 zobZu(6%LVvipUsCGsQd%Yey3@#ns9b38b}aj{|E{*};M_KloF zO})5DSO#d&7K{)fNpP+evEYr}8#Q!&R*dHNZk>+dO^p;12eVk`x2wmBNnsl3UUB65 zNutajw0v{XwKrO9##-b(T<%S(1Zm%R1b=@V(ynQAYNh!`x9vvrlMA_Namf698yE9a zen~LOjmh3p4XO*c9J#SwA@!?cG``dtSs%?!eJ&X;`&T&GjT`ix_ipOxR_EHx^Hf7)u`r+EHcQo#5nh8k;L*31tVk-l$y)_A39~rJI7)8JpQ#e zM^VHN?+fm#j}^-tjurv{3l=ZyUXB%PAg5&fwa4_czUUakypDnd@#3$2wIJ4W)1V>| zdxACfU#rIkj(Ty;D7RlfT-zty+L@P_RSrOxeOtt85(SG^hCXX|4OG>|(!lC>HZ|7hn{$`K$BH}S&FEuknQ~BtO^3-Pwi#z>nHXG( z=asz9f-D;uHC2v#^p>|jK#h|30O}>*JwUeEcxM$erc7clgY823(aTL}f6KO0`ZcS0 zbuk&rnR6>vg69+yTn0IpK??-c5C#jl76o38%K3g;CQ>ITQ z?A>Xtg9Xwj#tdmGl`eIYk9Xr86{tYzS04GD?h)tt5t}0O}{ts_nEKB9Zh13_*CE+GJ7>d$n)ng zJ7@(*mSse2tb^YqX=b_#f*%e?qwWN+7;xG#6TY@iIOSEX z!sTc@c|b3-JtoH;8+x~!Q9f=&&38I(g3d&QBeQr|%EO+}BUU{`;l+)LTOzVEv^1Mq z(+H(JoG7}6n!0+Dt8T+t`p|dcP#ncHD}bFla-d44hgLi>?K;P+Gaw?x^kHet_pt zD)5lvS=?+uu05FpA66W&WKxtkG%fUI<)&}A{cuHk9qajGJg@%iqrymw3)jYJT}->? zjMkjqSQdZ7dRa15^Zcpfm>G1)bVE?G?{nPN6!KFhy;@S-{ncIian9#4X$F?7`l{@* z@oH4S$&D~RjR>u-(QcFLArec6+=H=yJ4Ey!R3E8OJ5XVL{NBaPBwpWdFosK(--Kgl z`u~2&K3i~~)W<$S7MTX6s&^zje&j6+TgRqwwXYil>05r|pNwkNi{mio?vCa~5|kgp ziB$Sv3CL$)MS_x6zT^x1udX2I*SBZF5$~^7nI34Jn&4)b+lc(-7%f~77imueMGLRe zPjc>eDhP4c9CMR6k;=VgGgaSfS?f0PNu{)V8o6GpOqM~d=f<64?v_pr=E?c|={L{; zExH!H%5R05) zUyI-}AG}4Hc~n(`xAuv6P~41YwzrBD`z-c&$&;@WGiL&-O9(;ndeO*igO&+p&!X=F2j zW3=)$%O&BMQbThl;x(XZwGb z1^P)J{xhGs26ZE=yz|J7&mhfM7B^L413u*3RM3{LCqL$aHdHZ!!>?&%W9fU*)LEs5mK2ecVl zKo163HFnV`aOMB7_uf%W{rTEx5EMm&MwI=r0JI(& zuc9%C|E6}T251C*kplKI+jAgMVN8J!utMMc(9D1q>a{&DqYAK6%ZjUWJd*OG^5DQL z6-(mlp*!E2IFR3B*7Xgy`S}Lzd3&7D~gE<6--5kcJE@St6vcO0uii4JE_|GXf}Hu_q>xk<9SUC-WBh?0KpV6 z-dXM6HXhDXfvuXD&1!t}_9(uIW0OD!`HgbR_M}E^rb6co7+!aQhfMG7H*8W6$HJ4Y z-jS*|x;P%V#iiWHVD`&u&WD#)PVAcWVOhBaNU0$MUX)XaK0M3#Eu~4j%Bk6&Pcqce znpcS|7m`5O`USi+py1>RjdyPTi>BOjnVtJ&kJ#dYYX5l zJ}A;VmxF&ANyVJ(cZ!!%1?d?(cgx(bb1h9UtBI{%?^7f$V~NIjjPu&zyqBu=VI1{A zDlGz#WICCY1cQ@Q(1yXic>BCocMxYr-Qg|n_5EAJu+2`>=7teh2Js@hl0}a^%_6Ce z4euzgs0o5$55BIaNU`~`-AB43ksW+e0$-5a00qLZGQnm3^7yJ+Ddln z+!N_J?06IvWV8bb5kB$**eER0%J`;lK(t2&^5AQ?Kcffac1xU~8^TAvK1-+>yiz`7 zJ0%@U<_iWmdfMI%A1bSo_S70k1k8IpFm@q2av#prT0LN&B0aFj`&)K5u?&hM5E>2r07pTXj`U#d{uG zGfG9;w(k)jPQo?BB+h>6=Y)xoQAc;yaH0<3xSt%3YpRiHnYQuityYPT_OIyPfL#;M z`_ufgt6b>UqHRm8EA)&qY`5I_x1yutLq-sT&9n`PDrlb1d8=FxBfHPJ-AXU42)B~X z5RcGZ1(wCW**c90Hrj`x$_NhYY0&QB>*g?6tk4X_uBru@BsB3PRNk)3;o5c>XuAZb zyG(IwPRi?X0w*GdsZ?A8KOO~DmoDVoP7@g64VaysZD(0GU;X+RDpf|DrBM` z(ED(HBPHex=`Ysgj=Wd#-Izi3x@#q=+qcoLrcx9}mZgm6Kkf_dhu-KuskWIl zlX})!hTnJ%eKLzNv(J?~Nj1P)#k$%*;Ai7}z@NZ!Yk|db+XQ|A%Kc)p`0 zCJOL4rp4L(^r3b;ZN5Fe{%JLUiUVI)CWj>fEjF{;)OUR?G&I~ibu#Q4A!a2P==@@i z*M47!0rK)qm6hX_bta;eO84SDVpX0*wwPrM=dqt_r-v;ZFjfH!!B@XPnN=>oKx8;U zd)wDZ7kweMwZriX{m+)!W`BYBy8Ok#Bnz1D3mtAE(;sSV821#|&wJjqiUVhy#5T@( z+56%q%38wUL7%$hlXgdj3jgdpr1KF>>-$Y>uXl*T{6SlW*^KFOfq)kBFG2*1BnHhs)# zX_&sVFCf=p*>_Om0~g_sFl%ywUwdO_TOjw7Sp=*@3dwah;RnoysV1;v@A=C(jNY4E zYOoj~>RQYsTPd*k8I$5qLD%V}9JGh?QMSp!%TxXsg_b<^;KM%(crWr*d?b zbdBCcv%hs(I|}k-4S#E)VP?U)#Hmc6FL2yV0m=%5MO5$=qi}pP;MmK(1uY%zf1C~q z4n{rRbQH%-oE!7?7E$SVbAp48Pa{`$(8fC};cZ_sdeO=1VAT-HxNlg{rx7*D+b;in%56OB?0USVR=RJ(TfZLVqvf>yio4tXuI=#WFpAf5U<~>@9x?$?W;#xvJU6TA;FK1* z*vEM!o$US#g9-Ae8eE9>5$P9RIaMzZyP|w(#xWk-ZvtC{)A4;=_I_GLX(}&z1MZ4A zZ*l8(#49WKx@T;OIP1+Bx1gWr>UoBaoH8CW6|UQp%!;HU3vV%)dm`^B%a^!;+X24- zKtwYxHU0v1H46b0S(m%Qv(U%xz#7lA_;tsjfG;c~@dEuv>?uZ1_SqoIf&+QHfaA?Pb+7DL5m_9RTyqN{fV!P6DZv~U%Kz*Ees)UgAmeY5E8}bYIDED0BLyb8ut*q z;eOx(EmpTyHwDKRt0E=T&w6H-`or&w7Ooej^e^L%OMi$#{@b4$)sRi^qqe%WBW@T! zd#3z7wI6ffeR2YOSHySIs%(2&3hV8#Vi$pZ38T!XYU6uLTC6m?ER-4Bl=+O{FrJ?@6(@*Qa!6Gn^ zW#_LfFMT1aAG!frNdh5dShw!0z$;eyULzPOii=Ey>;aVE43bkm5@=7=Hz=YJ+6S}> z{8Pa8-%f(GqSbKWUO;5p|GPyfz{CoM9|&~?6d*Hel)}&ql4>`ZgLpD=gQroGj5Dcxw4}WOYt#{zUPe1YSH~pZ9xTLZ9s8q!)d` ziq)o-@`>(`d=4IG2K!PmgDz~MG0{u5GLyZ+#S+vt<_@vnLEjZz-jNHYNgv8G!}8vW zBo%))2#VVee)Y*4dqX*2ivG}^8iUNqAD_KrLZuQaSPWib<>en(lDS2d2Bpw-Ss@~QL)CwhvBw*)q zAeRGAHo41TVmu4qo=m@+d>rmD^OWnRGI7$O{pFcfSEM(CcmAYRYO<3UY2MZDPad!w z+aqJ8K$p7`YFrk<(E}L(&8uqWsNPab}6!a)m)FX={pWJWGj!G8*0IEul;2rCwL>{ zg9aCk*RG~La~b-<0nYVI55co1pOrwXmZGMwdpv9S6stn|{WfudWGzhokJu6{-ep&2 z{Y6u7+n{^DpemH9|qkJq3a@Ki91^s>xOKl}P4n zDI2PYft>rx54<9NFmbiagU12ITyMR-Rkrn5MWVO`y7TOD>hI`H{OwUY_KFXR_HUzE zWL0{%BT~{-LFSm`u6p}mfVDEkkX$ZsM=OH7Gy2`dHJD%`vZQes;NOi(UMlHEONJbj z*vOBUNEsuAqxR&xEUYa6gqZ_u5;)czS25-?bNx+4W%c7FjmS)8h^f||6=8oRG%TFE zpSdXj7XhG){iUA)XzOP#8=YsRZr1R@rph0ZGd7(1LH;62Z1|kBF4(1 zh8CF3C>m8Z3io`y)vp|PciLL7-kY4fnmtSqD2{vl2Cx0Y!xH((pm@T|uaIO$^*%|| zhaC%P0^*po*`!@IRCh>L)j9npinc6*is-_f*?B(&F*MIL+8t80S+v_rNml;IxkqQk zdB+I?RG=kQ2-}*pKPtD`l~;{{fm|)@`m*bUlI|{V(M!kgG&Z8LYtB2Bpa!V)Q2NG1 z?DyN0O*QmE6Yr3*GHZ8w z+VNO!icRD6z(#PMb-np*-Rf=Ooh_z_Fb0b~d4I2$uKP)dNhyX5n;YdSZ$CYq*89vx zxF1EaoCHFQxf)8p?UI)73|HjHZzXai@(K$yLR9WkO#8yreF)p`9PIg0L1VOW{29^Y z)@ILdd9Hhl+cx-}R;#@-Awym~S?*xImp~h89;H^%R<|5j!*;Pe2y#hGr#@ExbP+H_ zo4vbc=XOC7J(dnUvpVq1MZce!r>A{k4R~gg)TRCFo6X>g$C;rfi|^N-DCs9RU)zu- zK3*%AvRN{QXpPzNu?D?vtX8;FAK4Iapk0Pw`{qRt+Nw-7={78XdLg5Vt|4-H^J?PZ zj-s{h@WS2 zf_bHZ^S&bvDm;AB$Uh@ze=X7JrV4Ak{Ngc(JN589PUlD3QdGJPsY77PCqaJZm51QO zbrbtM>r;u`9T6IvX8mL>58L!RcX?YHY`s^g2Tt+U5%Bi*TkhAop7#@8^2GC2Qa?p>H-q<|{YF_;L2qa1f6$|GkO=rMqGGelorjC~7e;V`>=!!8CsOaAa&vc3msJ zd9S;l{VnChIVCO{pu23tZ)R5->bvMI*G0K-clMHgV6oI!$Ak z$SSR>j#5WoyDl#MGx#C@rt!DX{OaPI=`G#>ky_bKxt=SHT1Xf!0!XSIZ>3`y5XBy% zctu}Pd>zG_72!7+EBGc~6#OFoL=2Z+c}6$uZss?OwM4;8Uu9}ko$oKW#v7%Vd_~(&tf~09W^YLK zKJFKEZhv{ikQjK#pI?|F?9@WX_`x6z|Ea<2r(h>4e~6&=4xVc(l;zwvMWB13 ze>M`EKn+8cFQ~*0t!aKd-R6+==Pp|`v-2Wd7Xx5Dz)xw%%9PPXt5>NAj+TXhl^91Z zlj(NYyjhAvN?M24;hSTE|4lDxRgzRn@Nz3EZ8%~`}Y zhRgM~8d0L`TGaL;OoK;yKs&atGhCmcE~}3EX(GbSrYQT|dyxc`m+2$lI8vGKQd`Ux z&pH=u!IC;)2(%`(X`R2D+%c&&I}CcC8E4t2LiCdPIA+oKwsHfiD!%i_hg(nZ7RE>= zvrt;nSi!M|8AC|`(iTxywx<)Hq5nX4+|mhhHsM4Eg#>Gu#XLLJyrg+oZ23p@D-8YN zHNOYjMQ6d&bGJu;QuaOSVUKwgcJ!OGx}NDR$Reu}KgQYgk+n$uBQF=OTxIZ2eWkIC z8|@Qm>j|JMPuE(BW5y>C`8t;{rV7zo;kv;;Ue|?- z-9HF;-1Q{t+Iq45$lr=r=v4d}U&Ye^Mz%5SH{{0qbnc)ce~9J*zb zJF&k&YH>cctxR-!uB4KbMzH^6d78MQ;99XWM!rHddoapo(~}W9;)6kuFX3-&(kL+$ z_bSiBnnwJ6(w5?E3?HLc*$!7RERk=ZnHBBxX=sI^5XK4K`*x8HmXl=?f>T$m`E=U8 z3!kEPgM`jP;`P+R>A$G6mwl*lx=wIrjwsi+mat2ITkV#x$@qjnf-t>6T5S@DN@T*{ zF;L6U ze|z7SN~@Pn*(Fjt*^FA8#l6d>^xqri{wdb_r{Qs(Jp;6-@Hh1d$jW7sY}rWajKBVI zw0ZRNOV;xS6(e)!G(lNrYJjYv1e|U#cf5_Mf-dFKKA|<92`&*-)lpt2|HZeqmF0wR ztikK=;PRgvRHN*H%IO2T3g9Q87pa9KcqRa4%zbm52$by$KSiotp28$-aWxdIgl4Jw z-Z#q065neZP{Ki&+ORYCb9)m8EV!#K@@Cs|hrw=D%D@<%zI)jgo7}KW-$S5rax>Egfas=yqdafl zG6f4axuw@ac%k&G&AcvS@Lf259A@@NZ`4e#>IDe20fI4N>c*b{%@2Qp&Y$~BK>p6? zE4hx$e}%m6CQVkpj6e6<_oIXMltQ*E)5ps3_pJ`*^k%kD_sy)H^hWQADqz4s$2mTK zCUBb$gV;1X@fQ2r9h(*@g5~SBH)IkEVynlhkK^){*oY_*#7yrluY~{o?_Hge&l7vm)GtCvC+zQ3;r!QPQp$ZwrswzJ^gwK zCFOA|@PKXu#`*_N`kR2uxe(idESaZnr!nuN#;VC17UH*h%{KZ}z+X5H3ezcYZ(iBH ztmiG}ta%u>`gon>ManKm84)^df?y{e$hJp8S8OJr3#JzYHdDvHKp*LO6YbjC%$w_9 z9dKJZ5pE5Lb(f0cT@Qckt`23o^6buhz4tX-ka=Z<7?JRIByZLJRw3WVeMca)Mb8VkYO~l1Y0?j33bgZ?+w=$z4q- z2nb_6_u^2EQ*U(;;|rlQ^NMkAy8}9(%l1k+n?%E)Jro+i?ze^?5$e^uM^;K3>KL=B z2|U@O4Ha1;AB`1f!N*tq@msRY*Z%>@GZpg@`CSZ7fnDdo2bwC65a`X{A)N%?!baNu?Gw&|UhYvvBgQAqXQr$Mf0=`N zrTl;f%*-;}lLPA8EAHj%d=tlBf((5S5 zpV^fj_zrpaxD(`QiF;rejlITqfra3-y}rHAxfhhvn%m9#S)SY|!n};zV|TLjm=BDx zd`@&dy$XK%5{Q)0d$*5Es;7~X4OS&tL%lJ^&InQgPQo@k7qrI-fo}@I2mjbIxdto{ z-RA(ZWC^Gh2(QAa;Va@cfIAN$X9{nR`G^3cQmq1M|VDXLGq}9zF6OXoI?U-7meBH2-AAK%+F6|0!2^uR41Zz)c1Rna@%MWNgudx>N6H6oASbzLzsE zy_b63Ska9aDE-0H6`702K3qyOUFti!zP$(KGXTL+(R**6T_$hTpq&(ED{2!-b61ioKaO#oN58Kn#Z%d4SGfbBn}ajzx@T!D5jQyUJFXG zAF_O)gJ`Q!LLK#paXFpgw8aY-D1|&-jY0i(xw#egLIe{f58DscQLy_cNLV&%bth&n zz?Qc87~w=D-IZZ{u$OtIiUr^)2BtkwdHDmBgUiKOsk= zFjEx3^Ovx{a5Ml_l~_r*f8>$r&A%tR%H&}#0}vKsOt^}0f|Kt=Rlk)se{_C-&_jHl z7l>gz*Ug>vI9Dp4%p2WrZ(aG+Y|Zc~g|LS)3XcE20KhikvIh|W0Y~Hy>0xW6u&JTqIRiC^yG9O_kV+K9;lgl@fu~ZB~bAOsBU^*y`%X zsVbeyzb`tifa(Zmj{xy~teI-SQ(KA2X;V1W9IhnDZ;LSSg(` zA@hnGgO!T_rVP8*&)QLm+=$y321vGtMRpc*g@|09X&2XF3Qw(Pj#=OE}(1R&+T={$1%NG z%-7f!nv@4QQ!8}DAPR?vWWH2U<#+0jUS7r0pT(Ix-6iZioPWw}{xr^!dFh~*uSpGq zRlkyuy8H`7xuLWCEJ-M_hvCKZA|}vA9+89eSq>rlTYxPYoV z7y9Y*)Z4q$8kWovB@oj027t>%EkwimraFyv>ryE=j$&1osW~vaJ=0p^w z$+R`Sz4i#zEr4QIZ%5N*T>DpgUw?M=|Eudm3MLPht@A41yRwZM=N*91T?YBpUmz<# z_;4}`9z7UFCfFg_mpNVWvVvDqY|C-G_XOr#qGp1!2!-t>c{C=+0XjI@OVQ`;*?w#? zA71p`-xJ!gnKm&nZK)B_;zo-q$zR3#`hFkuFv1g}{en2AT|#|!Za5Quwv&FbEc1m9 z@3OEP9V!B0FPo(tU#lU9>}NF3R|RHZ>F=lQDtaj6?t*W?*CXH3)E= zX`rv;Jpf?If8in$jQZ>&54^3wFVLdsFOZpX*{h*w_pC;?f4mvk-r308I5ZF!5x~#s zrNhZxyql<({=?n>_>?<(&e?MtFkl@2;cmzhCno3@Nb1cmP>VgjEBbYND)at-@rvFw zj2ow3Ty1~8_aEPQs&rksVblaL0e>8xe|%%+&XE6quzoL(|KY)6g=4aY>X z-`O5tn{MTVGBt`B}X92f6ijx(vt!nmu9+~MCWC9H7k>d!W3nRB3hfZK}YfsgQLisea51XD@s!e zRqStOQ}=2DEe75LtR~GrWlH|rf+r7s0H^3*P~^Qs!k{aL6Th|Me%A$u;DiB_|BVlb zUI1orcHy5Qf&)Yl&@Z7Bh>+d`?1(J`q~9HAPp<&o9R6uJN0Jz#3#es`V zf}R6jRt8Y|Z~72(3$HW?xmX7{l=RJM85EzTp6fR%7bI+-d{thgeQ%sN<;QtqlYWkc zYU~W?FKjfgV?V8(o+0LI|J2)l7 zFr6G{kkp^z{Exxd-@0zH!i#V+_{!Trd|fZ_*oY>ZKX5|>aDNB}Wx>h_*5%1JsDupN zk{f~>0|0um8nzp1HVrU$%=K%fZtm>E@XaCd=f za)9kx&v77J@CP5Y=#MU{zqC`cFD4I295F(UcYXs9Bie`ioscuyC163B19Lp@FAZ&j z06IzV<4&7(wHvS1ZoQSUZV`0~+!2j2Rm1?2m#L!o+F}oms3PX}j??$SG;W8Vu^}q} z&;BRimZLzVBwQ(|>bfgUIdU#hq+6L5>Yloc%+eGZ2KB+YX1RvK^O*vzH&4wFQ{*}4 zB%mf!7Q>5jVF)8{XSq3gY}(_ z^I$ahMqzMO`arZa$=-a(K_|#{;WZ}rV*9VFP(W1@>61U&W2bL)LpiB25P>P2aY;4k zHz0 zq$f{CZInvZ>Zl%#X+C3EjqK$&e^_0U#ecjSA^wNOW~z)B0{?Mcjvf*8cpQKAxtmYD z{Q>+wMh+0=kfv!8-iC!d4UeJYSuNG7V3Ud!8{*nDrPLEC$ef>25;*9XAuc4>J-*cJ ziL$6*4nkhFv-8t4zjFT?p4twmJR_8uAQ-&}M<$+@K=-$PCu1~E6)=(c?I$)H>uKD9 zRXLgh5>RU2>wj94x$cigdf6^(uf#flPK5~8(#d_K3$3huc?)jGoJ4a!h`lB$YMydy z+bF%$X<<;AFdH^SSZscUj?@`O)f$UIFdrj8aUjTPYPY3BY}NAH)By~2Pr+jvd~ zEe5$kD72M7ynAwbsDeFIm4x~zqJJe%Sj7z>CCAQG$VeJkeX z`%2qs`vsXH7k(22i%=@a${SPcV)|g=&ws?)gb(52t`lhTin}=OgjMcE3@YEUENx=OC(Xovts%>*ewmCt=ecp*LSjBn2gq(5|pa?z$pR zk$3|lm@c=w<*hrI%2u$cl4Lts0Jmjb~7hpiBdC3VE2|X*_nSm6V~M z|Bd);kSyq?H=<;_o~H!l?OHBb-={$9bF<4^klA z@~k$=%d_^FgIcb$fP)Eej>j+`*fmUU-ey9gTO!T(ve_ZVzQQiqu1Oa6A(1$!Wx2pS1;hf+XS)B!VC4aW)>R+LaIH4Qj>=v-9~nB2ef@aS$h#b{w;28AdZ z_CBhK<0LJqpJ`E@&M@c`dCCckBc6I?)CdD>tvG`=RrH=02{K#=#zQpD5Mwl6)nD^f zd74uDo^q3F|458rt+QPwxpQaQv1rup%77aiB?f-nxvtigh-Pqaxsr z!+BDHn+Qm*m$6T(Gowh_9goUy3yivA9|BVVol#y2D9j7n@-J>#ND6B0y?dFWg#Hic)auTMUr; zvBC`R)WO|e`~|wPiD#{bH&;JYxN43mjSyPz1+0L7wagu`L!}G8ux@n5~rA)FCYqk)=8h|yENb&(-%#=^ni81XXN z;OGgOFWeM;2$b#AaU2?ej$kAmhn*0;WeGk>2b^EMNEWH$Y9Vnf?@3J5{%=)w6cILFf>|V{>%@KiQq zS9@5FiL~-FC?5R4(`=qou?%20W&rqjYo2{;jHqcj=|KM6Y7L)YCP1$lCt3V7ZWZsJUXL0Fyzg)3%MO%xvi_m)PRIN zx&g>VY>d&2+n;1^l$SgPJQ`BVgYOzX_uxF|7xF^jooxOKN0VhmkRvk#iudc%%zLkL z>CTbM3e}e)j@zQQR9$N(vrhVu1J$ik_RKq$46Sq*Z+}n`tToeO{N|Z|=xTW{$#lLU zVVg;9ryE)}i3c>Hf1k5M9)WFG-H*uYUO{iIw9U6Xs8+YKVY5**~ z!&LXB>bURE5IO=3bSbL=B^$lRGhGnE=(j6sZN5+4E+0wyx>Z9T09qJ?y+QyIL!(ja z`{a0?5W{91h-NPXUIMMiNXbq~RzM%5u>oqKzDq^W;?dAbhV-7Y*F+h9$v)`&JeQ{O z8_6jg6&l|0eK7OvP->x~WNxav^&a-D{vaC{nE&!L&Dp@7M-f$wWCR1I4 zg$P(-QzUX%7h^Kmzu)Y|JQ$9Cd(w%b7I7T9&qWX)_>0iMJ0Hf+R?(OTj~udCM@)|{nesrsR^Z{s=|66D1L2#*URVHCeW zZBM_ENvWMUm2w3^7?h+{U5_+mnZ1$2 zmuf;?Y4^uahMyypUVPj8kh0D;*}%l6Mz8bLHjnsFX6U`B8C|!JbJ!>lMxS@2Qxpkr z=S{Gt7TcM3Ek|y2kXka{@C!kei22-`5M6>Hul--oJDZ5@|T za5~Ia{&2XCW4ggR`J*k*YJIJ3jC}4C_A;HYw8Oki%_OWcXuQ(KEqRyXd@P6b&H*vI zE2Pg~N`88BxijsqOO0yqiDe9YO3Ah(J>$Y=3qbf4Bd<_{2sgMwP<%nrAw~4wotLod z`$v*gF6zo_jtiT{bAPGG*Z5~g!YYvSyf&J{^KD^QVf2kr46xg1hgVH{6+s>@rq^Ko ze!oEKk;Lbm15hJf*CqI+%`~Rk+l6ei#-JCHFFA*eIPp0Mdte_fkKs5~_zV;$L}n^z zW>#@6w|-}-qT8B+!$1+A1GtYKBMv~i12E~+C?7Q{EtQI0a&3Z5Ml%kOHvuLI>lknR zM69p0mAR|=p@W;0Tr;h2F7YS(Rl7Z(iPW zP!SMPzl1dH=x4OsblI_DqH~fvKl)0jE88aa7$@H*@=qmV) zM=mpZij7*hT(ESRw8{>mYLPo#t}Juv)=GqySHG^!Va4VQfX_TAEUPP!#Gl}Zx*c=7t-F1a zOd9##*ZCC76ehvRb||)gRI>MX!~8$##{5tIw)nqR+t~kCdd&HRh>d^I{N#_|$3Hf3 zI9_B1Bnx6gDK1!p7g+6G9H-s-$zp=89^D+@#x&=(_X@K<0?gz?diD<6*gb znQvbOQMSJB^JD|PylFG@yMF7sEXp#J8>eF9?rd33YcW6Ebak4-gxqGqD&tZel+GHF z1PkFUdUtCeO*KfD#nL7K;Iv$J1&-Tz9|_c6S=Ovc|98W)>kqO@^i|kzs?FVNl3${K z%pU1g{z)e1MWs4%AV#@$o^8BQ+1k_F>UHqV&M)GFN00 z7|0nT|EeG3{kq{cT7H{Z(MLeq0NAEhejk4z#|!-wK6bh$pssM9j%c>SOVF<>sp zGBDvSApSHi5r6q}EJ%Dq)k_$#7EwNOsOGvN8-5e(>MoBDBp(2OjI^7U-7D+_aN%yZ zSG&{DQ%9zb?Ih90>pPKO-HqwA@Th4^z~8IVXy~mEkumzxv;MuN>;m#+8!%Q$cTtuR zLIu4w)t_R<9)rcPF9Xls>#zXh?)o(zX6C}QQX40R6EHl2Wp8AVQjl5k1A>9765^zJ zj_$Ad6Qms^$+=gF$k+%{6rS(-k+G6KrZPYtom^T*SpvS3kY8^^NmO$!^&TzQWL zdyaX+i!q9|2Rft8cec!WQ;h3HHP{<;(WEW9qo37@lRa*?*32^{0ksZ~1fC@mSr1*2 z6PI%CwjXM`2grJSr!TrWXYHO)8qq5xa3|`kh2~{bz_LAUnWsV=!EPvf=Nr(zdgP#2 zp7yw95m?(+z)T)MX?!FkA_tPvKK3(~-yC~1%O&cRS0>$xY`J;&mj3n12;IGaDOx(LP8uxNz{bF*-gR-nDJuJW%xFlha30XkVtQL{NMsA6tnQ?Yf|5R^)%6$-cum6;SzWj7GG)q zvHr_}{|PV?@s!7BspqaSc-z zHw~q2-K!=g5pQ`pCB@twb-dvMoC5sTU`nCZ6Pq^;k;DXMpFV?CbKdK`^8(&cy zt;`fMR>s1=viXA8*S8dXuPcHy$1Bf`dHa}T21OLEwngDr&f|JZ+`CNZfaoIexnAa* zsI@CR45H7KNYZ6JaD}iee;Lc@wq}v>yKkzh(`fvz1!34`Gx4t5&7jdLRj_KUvA&zC zBQGkqhVdn7>@_;!xlw>-Rss}qicEi=4vslL@}yVfJZD$!7F%bMj(0>dbYP_xlu%EIgc?^(<-Y~kD z)c%r7h33mdapPgw2VtOqH6+(lPrE$ZvbMjvnum-9j>~*EYsZVnuGBlZMP16@8u0Z_ z*D_Vwo^*Ok&vX14vVAY;hwoGrG16w8;`(;_SmMsq;q6Pci zRE!c9A;#AR0y=NHf=Ip)cPvxf*27tzS$?Nqp!-T7bc%U^v?uIYI8r&tTy|J0<`#~J z!SWY~sprBb3?0(JrK;Jc%JDcdOx6FOw!0reB5}9{eE{&Sx;sP@H3u{2#pBr`dT;Uf zs$aeAyg8(tYl~Av;qyuiel~vvr<@F&$FVSqF-9yhzAp8n*>LBV!tS(}`HSYX)u-A|4pD`Oz|n?tMCO9^iC5(3gxiiG0gBVQOww16 z*s6Szr6XeAYFcNkJ^I|9=KpENig4_BIJ7=~u(bw-^`s>9-^pCDcOaK#p1N1Yjc4=7 z8gsC-F#Jrsrb4N^-RCd&3nT`!Ky?SblM;PfNFQo9<#+H}oMY7Y_RL|4E;2aAmiKc~ z8;jvbChafe`V0}^%-_-x`$9YxGbZD&CyM2?<5)i*>o5VoBh6*f=)AmQLJs;M zK&_(NoyKLPZt(7#@fnk#%$IJQ&x8sCS$IZF!A_d;yuhf|u^y&5HQY+Y9pqNQu2>>@DY?&<5 zpu!BP<&QEA(du~z!W0owYQ&+-rKxNW2TAICQf1jAZg>NX<=N>O6WK|GBloCSs}9|j zW_vU|_%&)RE8s_kt4UNXD zJu7TZ-=)iXPjOr|4HZ@J8tqv z?NyyaDSo8Wo!5S?j{e@|1^dS)RREjNrwY)J>sj&yfbB?tI0|r}4<>5>z&dFC!cP<* zVygM~>Z89^A^lta>W^B}KNGz8&cMl*EIwbB|1Rx}P&oUKvfTgX&k^6ZwEbC7a+^;T zLFT;~8=BQ;F58y&S|qn{-{-2+UjY`0*=1t zK%^N2DG>pYE|n6H?i>&ak&qS;1~CYM5u{V;ZWyFHC59Y^VLZ34wVrpawb!#hd%t_{ zbI$uY=PzPl;urUQUEk{)A&)#=ju(??tQ=A}UA$0d{tpZ>5^?shEx)P8qSF5+c;d(zn4ROw#R{mV*O} z4?~*QPe`4Y*+BIj9wJ)#z`W~F2*pqd@WN5TC|)LCp-0IpIp6<_HO}8Ga{h1mN^82d zHq|kuR-H}Nc%f5h<+S-~9dDngFS6L?@TEW#HJu$Vn|sTQh#bp5ydB!0PhRij`<9LD z@2x2C7tT~0L=QM46JU1+KMx7)tKF{q{7Q`^W$Y`}8)jAtN<&EH|FSvN{LidNr_{ug3!!DvU?b8Z?}aP4HZK28^$C)m*?#0C&ieU=sc3CSDy z37JYe;&Q|bf!)EHFs^#SL)^E%n66Av=11WGCF_LIZq4?{P76HTu}-K5baEwN3zSrW z2nW7cCO;vybcE2-2|X$d9kA%EKgx_ppYwuPptE?r>?mZ-_yLK19;+vXBT{?-jnA6MHGJR3b@{#*>&Hl#;M0kGkwSvCPnV_i_BJ zZY;b1C!<8CLh0AL6V?KV>(FI6YP`|;1N$2>RjkG*P8EdG58Iy{@f?Tr$I~`XfobsB zh$4)bM%-3o!_wt=8y=6J5T|F^`|Q9>jKEPg;CN*awXic=J*G1{tAm!&uy3sYoJpC< z-&7}vXzfWOEFin>(2k`hQtD-5p5y(@i$*Ki+${v&-0a{IXgL_-yby1}=C zvyKEVW`*UmhY>#tZ;ZMbeZQ@zd-UKuaNoG@W8v0X=5IIHPIgY{D~l@7HVn=p!WUjM zECuPrbd7(HmO@syqcUmiHQ$xfKA+<5yMz7MdJtIlv=ZFw*G?dMm0sH52}KCC^8}q`!c~Ai7218Vy{UfT#V};536>}) z4Y3>8lj1GeVC`v`3Ff3?zd5BOw@gFy>7SoB(CZ7~4kvtnWE_N){0?dQhrq!<%-8;5 zDgUb>+yAG2M@yA)fuI%Z`4i&F0Z&xv%K7j*5XzbHEbvl9kGi>PEIw!Jp*3M8Ru%un z@CHOn-TJ}(P5HbX)fu7(93wYgSnOog22FqL=Zi;vd_t`BoA%5nVHH6ld~cnR;)fh8 zCG#v#eo?_n{`e)rM0s{<3c>wje&O3!q0qO?!E)z*pEuD-j{BS6bi6s=5E-oJulyj~ zpO!N_&eG{!Oog;#Q22j+zE8_u@5!C;`h34=z{^s8VkMH(` zh5BE48}D;|4OH?D={(9J7}qSGvxbcFoY<0znp|CM@<6}pXbq%RG{-SQeqE2y-g+94 zyJa3msEr3i51&0$m>F0l5x*D7?tf5bt(sAQc)gOpv{8Lf=il%C_YpLRRlr$T@BCHP zl9TF1RVE!#u%dG215m{9CANIXHYn??&dGFCcGt$m%F#W^D?1#~OSzd$)f-*SEVlFM z0l3SARn0@l<0@{ms4;`tBE+BewP-Cv+T-c*q&@17h;*A%^k=kR`B42jYR^MXgV>b! zeW&`hS_SSud+aphbHTQ>2fWO6wa%PO^FEce_XG>g(_?%*R-to30@MQGKEkhV;T2W7 zXfBxtO2&gHv0`ylI{$fkJalhY8{Si*HK0hz1l8^fe)WXtZ;JSTNA3P!2w?_Ahd7J{ zYo>`2&^6ca8ZPKeqNWyRV!2NF!PZMkp?aGTDR9kz(M;&g56;M&QmK@vRT@ znILc^YpXuIpz1QX(_O*qKiV=?ALaWizFT6hmVMc{ukgmWl1`HRb2`pz9bb3kWE1-V zAnQ6~cGlLEDQVLLxFgGGJy23TejooPXx%gl5IhzGIIuQn-bqcZ3>1_UGnYK2Oj2FD z#lXM!4R&WXZ8kfC*q*AXaY#i7w`-;Zo{aY$p8s`6@p>{D2lMOMcJ9$4VpyQ)kFt?I zgRep(Gjw)G`vgJesdq(d^tUbjCj$X*f)B`|h= zH2aoot7p6A@NGmqsAYCg!1?HLtreKqHSfd1QYWXwt%tIbh)BxMXeHTyQ?sTYM`KV= z{sXhjzn^RV{yv|7`r;Ew`%XhM)Au4*&g%9kDJie&47SKJ#EyvXlXgl#D7?9|Z6T|_ zpS{om+uN{qCtc~fG7CVc3r4--6^1rX7lh2I^O9^BFB2C)?EC-1-}x7tmuoqz!1m(% z9V272mbj*7gL^KdYm%B!MMc+xI==1wjRwQ9X=To0X1>S;WJeVlKo3&{iW-^JMM!R+ zPI)~8k&Jsnw5NMDZBFo_USj58;egEri<~y`eMnI3UP0bJI#%Qts2L5E1T(Jb@jFAz6J{ntJs&A<5A|MWZkV(iP?p}@U zt0Tjp$MfcOIP=KxUsDjYIt83=?{c?>yZL={r;UU)@1zUp@jy^#St7nE#jt&*`#4*Px+4-qC+Eu<|FSAFc#` z(976q1D%66Jkbeu7Ct|I|5u>u!tnH;)H|9`)Sq8%e;jtAf1cQ{f0YKE92YeVw{8!N zH_-L}GlBM~dJv>BAZ_y_zD-FW6|72zCYOuH?!?rzeRZOfiMi_r;+s~O z(!2^c7E9ATm4y=?tDV} ztYs4Bg?b{R_8tK$p+;B$e^mrdhK!)VRfE5+zwj#}Nf!qIo@V_6ln*@BY$Nhs@=~=fRoz zVmdxzLNjs6;al0}iK^tPt7Y&6^YuuA=vEy?|GR!SrYG_-l9tpRzDWVjSPCBE7E7%C z-0Li10iiazp5a#xCr)s~hC%lN*G9Sz4?TnCpQ@f)wmGnb_oCjSKJm8__*SXXeC=(y zh=yx&N!Pwc=ECn%Vf&z2SYP8Z3`Gj-JBOR`J5|JYxtC;=WX3gm;r?sOqJ^hK%UM8g= zT3YdwSJJL~W0BHR=MK4~eC z484>o;Jr*S*;+xokMhW*Owu+TDH&&~r<_c>-ce0{f8mC;#F1+o&aFTLG|e}S5S7;m zfp&v+>`yL&z)+DEBbk$reQLlkeuX=b8UU`IXCHZ3zz+5UrmCIF&&rYv!G>jJjS=IZ0F zcW~)lp>gEhH*o=h!;{*xhv9oUjH~a|!sizw1@wc~pApTkn*NqTSge+5jvDqdHlGSH zOZWAZ-j`7~K6a16PynumhsA7-HIf@_LA44OgjVkHuk@Zbsoe_OJ5Hf6nN@Ec3VMd123NzMm&Cxq z53HN9(LiqZOHVUU$AW0fw)suE&ZGcDpUhKrN+bF|Ay21odLQ2gemP&e{awx2*Wo+# zb-?Xl2YBQu1j@MOAy!Mi>th`R}wgjoKfHvr@}%0=994_^Y05ZYahNce*FQ2qL^ z2d?3R^5N@KpncSYruyB+xGzS|D-0}Luj?CB$tD+b)AV(2himxE?3t0+5!iw^`kqHH zoNerCa$JtPes+DD)_P7R|CLwXoF3G^L1|6HiH7$?w^r&KtH6MxTeZnm)k{;Gla~Y| zo$H@`DN$V9ydERE)<{@W>b{S9marXrB(e%!i8Js~{d0z0ga^>cd^t||OSiADk zx)GAP6k3hp7+V(lo|VZ`+~^8J!$N#C8jt;@?r!f1r@S-R+~s`!8Cpo={sVp=2u!T7 z=5tT7b}zOi%u7-AY-M+429&;d=k?NP`@?ED9ck1H`-L{>(8H6#O?WcxUhjB5VtEdJ z`~wl?71PY`%i(XGV^~!Z|Bf?F1-^zUdE?6*Ktr_Q<90A`J`l^O#y7X*ER~?S52te&<9lsmm%a4;>*XE4#(46`1!f5CTxHN83w1$BMY1T8A9!wVzbpm9Rp? zHEku6hvt>Ovq9RChYW3*6uGi=*u+_C5uFYq#RzG@P4N%U5a znJH7R7&E_#M8RI8><2~t#qZOYFHA42e*KN@rJc6a_@GyXfmiT^@qI%uQ*$Eb|_ zy?EETBR?r--6XOCPp5O1q4L~!=PS9h2P&lO#pZOskWC8?Vcx%US#soO+q?WA5(Ii~ zCFsR^d9=2UFfQiV4yX&p3NBqrxKlCaoT17*SL+cdo^Jis@MdL>YOblOWG9=Zyl}{o z5>!VvqjX+!D%Sojw)DpMO{)mr%WRdW>+Ij}5u*p{-k{R)V35wS3Mw#wE#ESP;Ml=B zLMes_nPTy{YE{`u9q=n4Do`&2FRqy(Kqg7LNV})wx3#@aP};(hlo0JH(&)YNI&6~6 zh?--fDXWN+Lh!QQR%rCwKz5P;s@%*ZY$cZ?w+g14I;G1-u9$>#xa7#3=|2oyQDw2a zqj3@YsTpZKctaS|P9v55q&LZ=Rl7QpQceo_0pdGJyMR1jqnfiOGO=oy(CuWdA-5s8S?yg8<=h=;n9YQ{u3Y3iCUrzJan}bFydf!;( zqRRcY6CNshFd2*NO6_|g%k>1US=(u>dQLJ_>iK#}hU;NC4kO39VSF0k^ifc)+6;oX z14%MP&o>jfPUbh3>YjUmd6g>j#?Uin?sH%~OYJy&(!#7Nu?+vJ)PSn_4QRt`43%DU?+4xs++#3!q|x{mZW>TRl#6jZ z2}mLQsPDEL#DfxteJL4uF7<)!;Z&UmMu3&OERNJqWk3WnrR7Q4%J7ZkSg&7}0qi`k zYTyGtLF@r(R)QYUycq)}1^ah{oVWwaiL=K=DD@^!?$7uWtdu{vgi(+o-8HWfjg(ty z9RieD&mefYOiJIZnrjM}mh!AM1yzjfa*UIbjd&a&+FnAu@I9P=4QeW4+R<5?FI?JI{l=R&0il7i z;aQcab6(Mu)T{M&Iy*~|8;Oz|j#@u_157@3h}K`gzHF@Hk7L;4N*a;49dvd!%lu7% zvA-h3caf&;z3MyFEUDP9mK+t*!KS_#rY1Vcn@C5;N4%j+i@TLR&+h>i-hL*fVpau; zsP2>VTR}pB({8)VV!ZcCa1coB_=~9V-*&C0x8|oWtoewAKfOOTr?P>6?@dK{ezy#9 zUC224U7=SGZW4d@OQ-!~%h6|Ie8GM8FfWSdu_M4zJ*$TL-@A3)V1Itw2Ff@@%=+2Q zVP|kZ`?IV% zpE8W+OTTM5=hPkjIw~faTRCHN0ua)%ru)FvKj(X+|C8~obOqi6*}C~!h*4GzswF@s zO|8Tqi6}e0@$z^;3 zXm(K5jwf+-VW?!m(D%}2R#h!qW#@88(vF^n8e6lDqH@4+u*S1FLvjeFX%B6Dc$7yl zQhDbpvd0&k5%$anXP(=dtb|RmJ6k6vM)AOb=S%XVm;=|~J%&t5pPZ`&^VOxP1IEu& z7?@a`8lkjH0Z>eH3(Dz+zZuMC?5>O3ba`Ivpa%fm?gdJ})5h9l8myxAoYkF7Nz;eu zj4dC;BI7<2E+X2LenJSKbPh4CEd+4wMa^GrHDZt0RAD=fATI{&joT4>d=Q{M``cz# zNY_$#jg|44xS)wUe(QYbVH{`dodr-aYZ&6u#(G4ZNu=L$tg&3a`>L(jrIa7Cs+9A%0)u zZXdMRi(+l*u<<6E&ZT7Fi)xaKK{WIJm1@SL-dn|(y)g@yCmL*DxXSDkX{@=WMTkeL zVU(lz+b{LY;`O}Gzcyd8(jPU4etzr&f+GHkO%V0kO>qzSNzvOKQNEt%WhAdg$jP+R z&Q&cpsk=T9NFo_E3LX&IMc%E)KCVq}GNm2F-?5Kc7xqti(edz-?pmenj2`cNEx*Qq zG}}m(+c}cQPj*XOe0DVMgO6@E`|+)R&Z^k`=?PV*b=f|P$4%!m=TrB5cBVsMJ7<7+ z4;6C~Yd4hhH;M;wyR;TG#&LiAr9H#P==M`jc{-_gf<3!mX>?~SRi+id=5EHHGfjIL zcAF{9VsRVlQn|b%x_4e{$emx1uYc>>BGv7{3=NQVuy8;_w46bLDHti0vN0@VoVmKP zK+F`lMo%F!9RnbN9CR;?!v0D%My2k>&Bmw2Qs$XcWFaSrJ2=)rS#PWvC@%OBXy|Vn z+Kvn+G_tWgZn~L1N&B2q;7MPXGWRINE_bJn%l2SdCt59*$*+U@)+J>SF{`pSkMx1y z$RaSkr@TgROGj=pmR$u`Zr>N1B0u9%Ug-R7JwsyShugnh)czEi`~xfc-}#^aj&WS5 z*L1TaA$gAX$B%1_^g8C3<+LMnxN}6;O<5~5cI7`;SNiXCl8K1jjgyep3-$vycWm+U zNn8CMk?G>B#?hscUff~KktX!kKY>or|9>9$A7iw@xV(Z13S-G9e%*l7mWpej+^6~p zse&i^A?GNMC~eL5cg4W$ew`FPq)b>LJRlPEdzp)9d%RAlt|vUVThBY917PK=X7q_C z;)E2Kxjq0er{4=0J|vk?9dklfSB;A00Dn*n3>2KfE9jx!h%kh=)f*MwEAn2+M9WV~gzY|5P4sQx1hS3V!w_@(*P!EKb&_SJfdqO4ozRL)Q4g)e9y zey-v7eJ0ck{5(p(`l(s6(!CPX7I^6Iid-}~@$ziix}e}GAj$P6XynW_A?B!)Q_G_l zk*HFL1^yZdHZgpK%>^M^fP86iY?{7Wtg*y5-4G=>>?r!;3@wJ-8VwT(VBy_=Lk?DiY$)e>_YIu9M_Cp_}@^U%^@p)sdt=2PzM z*B~A6EZ&KKdWAUo&t{3huoPQ0Af@UDe|&pTZKta-mL4kp6XHcc8vaE&{>NbP?baa^ zQy|i})6d_@Zb8k95fIcZ*ly(KoLxD`>}vM-6)9U}uo>rClJ=9T=H@g%ls)g5e^3Xq z>0uuffV^a=CbQkKal$czz#fCu319~XZX?r&U`UOj-C(3BwL#hRn~iY2V)TkEknX^=nJ?7kC|-_QemnjVo)v6qBLjTOsCw z77r_BgE@6lAxDRENPMIdIMv076-U!V&=V<2Y5bKMg8BzHpIZJ|G(N%uxdjU7x2X^y z`33@y1ruw60^RgJu$v-9qjh!=FYL$AO_GsUuixIG+Oy*PRWzblP76N5y6OfS_HUpb zKh)2phIs1{FF`RUykncS+1P+~)HP&=2itMaR3JhGfUwShLlTKgKJl={=_!IMQ8ett zw;2p{$&R$O>*F5`T@__W;Fyqbf!@j(-Zy;-qB-p-afjfm91W3jlPS|6UiFFK7Lfr* zd$i(lo5n7*0!1+rz={pNGs#JHQg(XT&A3cv5Ve?!J2R~}cy;qbQF*0uMPQ=Wx1%5y zuY&?c$We>}rm*_0O3@4T=BhXJmYk73r@YM?V{CC8O2Y;2wUUBLefT(vTWk4}xrem# z2wK7X%R>cM%E`(_I2Z!gsf$-z$uUJY7r-D~s}={&$Gb~`(v7p8_{cZ}8oa#~H8Xj= zUc|Zj1&eq>Ew~Kj4RO?gWV_dB{3OeVKl&@&d1YkWrY0$dD>t8xevomZTwQ^6L;}tZ}=oGMC#Iqoh z4fiNX@wcmdb4t3spTFQGi{InZkQmx{&lu~IchAE#IhS*&6yoJi+{*IkH3s zuWTgTC*>2FjPhChFQ=6Q9%j=P<v^Wr*Dg@=;LM0LG zQlP*S0!M%8Ft>UIwPa*5EU^_&vWt!8cd0WQvZoBGc_6q~9n5c}5<>64>Eux+-YX7Y z&>I3X{2l_ZABf!pu11bvMJVv6GLym%5|jrCC-sD9zo8tki~fP_ljpxP|2@{j$IL#Savu|PC6Nfo0g ztcTh9Mm8STR}Ws6@zC%b?sHFMsGH>5pEE8-=X2DSIOzv1U2$of{6@$q&AqX0l;iv2 z5*H^#KZHRBdV@$1%yMB;%DiSCR1P>w?6yWJ zteT43?SwgCt<9V=t@pLfZYg-%$>dEd^1Wv94D0PIFLae-mHKmJsODPh6lXblUwpp! zsNhElUvzrCBMpvFOUNl{(tmpsNKpjwK$yvNU)U z8I03}KF6Y)3>{xw6WkJb=w*6?XYuRlP?y@XtKGg^p&!LqSqH5g3LIGj-pbvm-;Tn1 z5`sMH4;SGLrEf#|y^=_&%z+)k14t&tSBeCpUC+jon}gaI8t19(*RS5)q1h97Z_ZJ% zEROnMw;U4!E>Pj}6DPz{=^o8)qy4!FW64%#bAc{k(RL+J))T{cB@J^rgEB#|Nf@&> zt`EEp`b&3RDlyhEmwer?NLT}+Z<&^P{A!|EPhBjS%6MXdR)xb8f65TY{&znBu(bw0 z*F6z>(9jBJR~j%MDr#MgI3&Ypyu5k;><`fk!Xbw2{-jc2%kiM-|A5tP5EN@1xrrgS z;_^83WO_}o-pQ>|G^cp?c53XdFyj@D?+KO~GjjPTl6Bp&vS8cr`QB2HVkNSBDi|`~ zAK0xn&*Cty)PI#x`ILA6yB8vzBIMSr!4klA4o1f9K5|X)))8m0H|xq*$`jHN;CrUd z(enkkx|pRBFRBve{RgqEaK;|2*2m7}Dci1!NVX7-TuzYyeOS8BQtqQmx!J}xgZ|^s z`H}KIu&=vv%wdh`M#svH?e-j2Mi&=hCh3|4;{X74T+J|}#`YddjxKN%6#JZ_>_VK< znBhwf6>YEK$~9ATA-y8O!9V2Pzifp7FSsI0w;JXB$=FUC-!OXN{bAg_>}>|1>zWX> z&-zjpF+fx%uBD}197&b|6wJRw5GYZMV{~DSMBY{8`MkRyMg6;)SXJr4FfUQ(WAT>? zgzy~c;!|^hx6!g61EtLfmp~_QLOc(uzh2;Dg_UaB^~xBTn|pGJ_*@8)szh6_&q{sq zUhmOf7~uqk)d{yR*a$N6N@DZAOmh|J5mRfdz{MQ3k-p!ZHQLf}mWAl5_gItl2Vc?q z_G0%ut{xPL2(@$3#AyIkB*0_NfxjjMVE}a*7-pf})NhsAUqNfRQI$5F0Z~`o>LhZ~57g7-Gmq;r}PHIOq9kYw?#4mjs~0Ox#w)hhUG__r*q@Ckc; z;W%Tz*$-TJuQpI8zJP$dzXAiT&B6oZ2^J(TUzP)R>AC#OF!`i?y+bthtJd$5ltXBi z?OuY?ClqcL7^9a?`2j3A)&%h@mV_e3+vH!SZ}Vu&`bo)xMckW=zu zzwn;&E3Bn1Qs;qY_$d&kE)F3(YHgZw2%1l>v*Z+5b*U}qy&SV13!+L*$JTBZO&PQS zW23}}t^}1$9^zhEUj4?KVYC=nZCL^Y@jZYP|20>Z(L}_{P#yo$=Dns&Ss1}$#H^Xc zVbq}cZNu!6HMI)Sam2eo|8@yH;GE&%0}DmlRa_k#b}cq4G9DF>09!yyyt++8tcP)` zu3>=L1L-r>H>#Kr3Bf#w@?dI zO~DxMK8gjf%ml9^ckU+>>Ne^R?i{MyuKpPkPwofz6 zke+AHtq}9TqM@RD(b-QO-Nvi03tPV!B;f7?@6s*kdTKy$UfqYBhTYHdxt~ud2rcX= zKaFXrl_Fd!3;PL?Er-P+FgnWtXOJpoBV&W6&$uHjdC1%HbJ?V=J@4-DPql_gODZX) z*aGd}M_vLjKp65#ENzXtJS@N=q#!uqK>L|=qS5ni^gX*(T&o7<3YBC#YueN3_q6OZ zBvgID5u=&p1)c=CRL}%;f{l@J2ljk=hYIYGg})jRJ(OMj4#^N0@0y)J(68`Uz||84 z?gkgL6S6>=KWeEu=aC2N$P26kGx1E5oFvv+m&xStM0mTEwWIofan6CcD_ z%(he)AP{;8MIagI<3dWDyrQl|KFSVash>KX41Yzt$0VGU^cWDcG6MB_Sg+Nx@?s3X zeI)EFb$X4uFvZ93wM*k%iC?6;WjQ0WCizQRHvvNgwZ*7%4G z5M}g^P`VuE4p$>kah`JA|fBx=$&^#abT+PBg zy;R`V_eN#>05bV?W|;-tQt!1446mZ>3T^srb-mAC@p8yhCSe@Tq_AuDk=d+#pT;8l zh@^VBT!`(VH3#2W6mZD4n|rQsJ&wPHB}oCaM=(f0=^l%+K+!EGHIeXsB{iY1#1p9y z4CN_o{;H?yY`4<)hX$~RPSwULUQNMu8VqZ)=`uZaHbWm{nph=-Z4_L3o$2MJen2ka zoHPdNl7KHq9c;BM6&e06dSALJgi$m5ttAHoORGe)Kfjr@-!-rfCf2Wm22m81`7xF0 zNvdy{{`{>ZD{+W#JSf|+(KiMI*lxUv$~0EEHutvzz^7wM5Hr{7klm5w?)d&M`+paD z;E!7Ee+PB^&-~AS2SWM(3cW0b#;2fypmfN#^T z9`!-LXqht5HJh07LTW$1NUpfwhPXexku-QN?MWeId?~9;MvT0VWKS=}mLOR>SfhOs z#8To2OCfXQ+-wR`J(zd*v4_y;rFpf2$VkSaxuWv2Xv;X-cmWj&fktM3{{Ba`_>Of~j{fD6g3aCkI7-F6%&FtZ<(V0gVUb; zC`ZGhzNd_YlW;jX9aDqXdw>K5@(Bk0v_>{9EeH0n2NXfUZKH={y7@Ns)b5q;OmhrugYhv+qbE=%HDbH1j&BX4a(d(W z-P(pE1zZy9Y1wPzaYd&y)1tIRs})v(+*uV!8n3Cw#;5}w1y?U6zt2uItRXSty^mr# zYA|&?*sv3q?{b%WgmroeGSy&uc0(@%Yc_W}saA5-r1?NC`#4xaSvK%Mwsp4<+2oU- zdgY~Sp8PZAKwh#*iluWPe~-ycFIod5kN7d}QCg}zbVaaIf+vCkN*t&0(Y7TKBP(%Z zy>efl*5M(fr6`W%L&et~=V*Ke5Anzf>e2v#$4o7!`OGIf8jr#2Oz}>Z=li2oNdj~> zZb0-=4KwfRZ4 zM%+-UtAWyX;fSt)OIssqITjcf=k{yey5V_U+4<}wa~_LE&ZAd$u%^_36-H@Xtmfux z((I_NRtUlnGMVQ&7Lt@kR8^ny@CD*UG@NM7Kg7k993%T~&b=~q={sBKsXVecPoafq zf9P(0Jsp<)xXG}K&g1ZuIJvLIl1+eErKBUzOt1cO%lC>v^- zfW#)kqyBF&@GrJ~w1Igjcd9N~?6WQnIVdMO80+G@MT_m^Br5)(QGKkx`USk=2|mQEn(&qC+h@lS~Rd9o^| zFM6TXx4$1t@m5xIuycujl{v@y9j^}Yc%b)OtXbW8wB)9yw|SvL5%C%+L1zLh*5ZQA zFxbd0)wc*zaM0yse&faw(-U~j3#ZDyoxT?oKS@KqX7` zSYtcJZ~_bVOLovZp8$NQKiAZJ_8Of5)?B_)PeEpAFfKMY`V>mQmvUJSCf9FzL6*-h ze0HfgxWhrNF_+_Ht_ft2XTZ<}(u&yyCz-tMdP)Evjsf}FRs83geCE7-)%;cGL^don zGdJ2D1MJ$T=aOorV$C0svObp%+dYj)g!mTF&fy%J4W7@*Sas`)e0$;ojGMmdzahB) zc-2kY#4Am~Dgm*4)W)_$nhA{$)Bqvy&+)FlbL#d#EXtxuN$$>*d|9|4Ax%L@>^1Sz z9?Htl*KHBZ>B>xcI>W3-G~4Zipsf0N<;+;A)pt>j(Ve-tm0aUSJ}t-T*BOBns=53<1kQEX_c6NB$4}J* zJbaJLli@L7$Dn{U#!q{pT4MYL+RFMX-{d@oJP=oG)wqk>1z4Ns_P8>kr;jknH)pq7 zKi$d9h6jv5A1<&6GW{i;8g6YVCT3xAJDVQ*)_ffP0ww7fkvd=WPK8Yd;}0 zBNAPVEIBE+zQ!5P)?E_G}piZn2jDCcK%Tdo={5?-kl+ zIw~|X+h1YfsBm)L#V|X1Toog=g4SXmQzEi)@r0O9e_egE%|qP3f}%h~RK2RE7L0t{ zRSwyll3U-kX2A1nn_*ucpv|oN9;)`!h_tgkmRN@HvPfRcsLz2G_8TLgOW&)zGC1WK zsVIHEOcBbFaf`JTr+enpe0xbfO*)0XxshcYmyP}_9g_!fzRszTy(<0|QH_Xr|F>Cv z8?^JLF;`U`o${1GptX);WBtW|ajztw30`Qbe16dak9ps9&Ka2TPe>HRXVKg71)gD! z#oQp3(6E2`nOq>h%9_$JWIIpUaGwt}dFMX)8!2GO4NWG;RXJT0D_9%k330 zIlNVZeXicdWOA0ZDGq*TUxNZ0uYuvpttjR)l|IYiSo8cRO zyBzTkdnQ^S#OU-AqJ4MTS>$%C0AiWvDJbPEn*>`Xc#8jCM&N+^hiN8$!E8xQM~~?2isQzP)sK z^{jk050(L3b@=sxzkp5vcp_dr@suBVk4ANQT&#$jyZ`=n({*dk3vvsLI2SfuPVH}G z(A8hY3x4G}PbA0J#rRVFHmW??!qZ4DiA%HyZJGVml>sKGoVgyXuOsP)zXxATGiRz= zrf;qFR|8tQR%~^HlUM5SozJ107yQa)NZ}1r)17;$vsK%NFZP&_*T=grzMa!|QJ(2E z(+2pmVBMGbb3->vaipGFDZi%j;Dp>ha6n&|x ztVdV>n*)4|_!UCKC!6)%+;KSJ8_i+dwaL*B?XB5`GN0CLd5FL6A;Rc(42;dzR!AC&UVo&;$#=T`TGAf~;*Duwe<)CvJXcR)Os8_y-q^WLW?Tb*){DIWXx3Ec?P3={ zba#3j(F7mmbo+~e%5vCpX8Mv{`6;6ui%6lP50#u3WTSRr9d!xB#55(E&``g-1N;27 z9t<1yT&eIcd7HPb7|6dfKz6%*=mIw!p5leFMr-uxB)q7h|+q?0nU?vtQt~ zJh*FjwJ4`D<~?tn^i3e2I&bo?-T{k>BQ^H^;k^;gFM|Thso!;FqN$M1qhicKF}0~U zZq=ySf&96|J5>sdpJi^55z)Q{uW>ksf?}Vc4XTC(9(m7Z=q8#nC*NQ8Acb9TEilgx z$J>z}U$3g{y(=6yox*_11{B{EptB{#zH1UwvYCq&dsBm!0x*R9Vm%p-^7epWiQr9^ zo9M(ym)1{03-S8};1oieOkpJ$){Lix0ZLFe7oxbR^-UQdfhep)4EbH2vnQMHGV*3t za`|Gk7>4HWAh78T4rxNWROieX*>*0iEg2)!leQ0{u@jt!i&Lb7alizGgt`*?R9HmCJVZkL$=sTUVKbAvfw+_<+OGWvi!jv zJoR(D=)k^|iI3XLPpXf?<<=|v6D*2nETT&{hqUDAWw{4FjO_8(3ZFU0*-@?L*75lv zC7K?U(UU&+6LS7;i+G{EhDQt+6UI0fmGi5MxiXBm&cAJMs`lx*H0^EaW0p)1cUa#5 zr*y1CQ)Cyih4O^EKi~P$7+c}NI_dkkwgE_>|Jo6Ju?83gFTh#(rt{DJ%}3<-01@%C z|35eRNW3K97HEor9z%Hzl{ivGzBxsO$XjwLW{gno*SBJE5X}ecDfhYdaL7NuP zSnp9rfN=#B3|v7^czpQ-R_oVHza9tP&G$iqJenuri_i)LMKuz@y{32Z^$niqLe^wI zsuvvPp|_BC86k&;{L8A+X7lUJ8Xh}YtO#$1yle~){LU7h19Mt57p*?bp??**DSXl@ z`&x!_z83_ZrYJu0O5G$h%GcBm3LS)B^qLU9PCDWIqY@>(tr6|6Zlup>mA|qsES4l6 zavA-`c@3nPe^aFG_9{2BCss%$FncfLDKW)X#_Tb`Lm+M?dP%>`KM%vNZE9;-#!bXO}-#582vt@5zxVX_?N>l%Tb~>DQ#~5iWPG{IsAv> z;zyl?jX06R*jky^w_8WU>AnOxpO_P0^Vt^*q5Jc#W&oaz#78>Q}?4FXD-a(AN@Ky`E z0nY_udma>IfWW=(Q5-T%b&Z`M0Ew1;{xBeMlhG>M`qOvi9Q``%2WAhp=*;LQ&C@u3 zB<9`+*Y{88e4U^Up;Q~94uFLqBji8`j$AAQ) zAA5Q|P4ldN}-BZ5ny3uMcm0=a~x$QQW8rls>_m&pwp zs;?d~^#%1=51uKuz#wAson^*5!o5!xtMZUdnZWvHr3$ote{u<#rpTS9o%1x69CXbLHhuUN#-D8XF4o{ zdqlLoaHCZ9b^{IA=4dO$TRR}{02SlHy;v8VY1~V}CO_$@j<ma5l7Pm z>fUf|wwmzng?;j}HEozl;y9M6r7E=A2WR?$kxsueKm2BVN#HFOseO7-e&qa#PL*h} z?%MV}RDmssfgQ7Ka()$2VP*Lg^%jB_1&gqCOxsQrW)!iyctFtE+|z_6dD+cY*_1o4 zNj7yl-%xf@3j9G1%$&Jlw@kA^6|lhA8-&+Jd0Kzf5^($O+z$Wzm1Z%1X2*5`mMcsyrOQ*Y}kuggfLU58$u^e4sreWGrsoHYmfyT z1ozq@)cq%?gcA)oAFHl5^3c@X+&0afQ@_L1$?)iQG!+B22=S{fuZD7FbT;r~M!$5k zEAYJ?ul~hC)#O$1<;wxu@qHI@+R~S^OuP_ECbF3R1&Z$1?fjvuL&P{ez^(I+c`i+t z=Y=p#)2d0Li%^+_M7=IE2x56aF;%(>migaiB9H6{u+JFU%R!HZKf%LT*;9A;({*t&Mb{l`cFLhLUttBl?tmf@ z-n;!1(n77y@$th2-N(vXADAx^7QrJ#Gr{0EG}U?4l<$h9Pg$gWSx-+X*r5C-%Qsl+ zYcyVsT?nP?%t?}0+54t>-e-e`$nb#Ss=#vji?W)c;@s6|jS!5fARr}x*wH=emxP}X zFo0>&s|0plXJL($7aIr`Vo586Pn>~-NBsHQsONsl?`+q7b4}m(ky!E-t2D(AhHCN; zuKecN{9?6Gz?-M2%Q2$Gw1_L45Ks$V_xVJrv53=4QQV$y4hd*F6l#5XPi0p>8|?u9 z;0xZ+{1~$F456pAbigvQC$js-7wQi?XCPz+fkFed3d&!SH3pvku)6%dJcQ$M%`+W2 z@g8wJzfuHb0i-#fyLM42dSk)l_Vu`+40u&z1wm)22rr9Cdb41Ij)?H?(w6qdMUow+ zf~<+K#w|KC$#e~^`+>o`ot$Ai9N^GK(P%>3r(pe#rGSf9v^pT*%FaM!#eeAB7wElI z-MD?&Lf532WA^Sgyq>>3CbQYv?>dQBO3+L==P%;0CX{zJ=B&P#)s^eO7xODfzqG9Q!DsK?*bdlBo`7Vp3amA1bRxygx5@Iycq%XC z@GHlDu3#ObUHKuqy~mOK;pJ2V(!J9aFy!p7pcJh^w{`U^9fGpWHx(`bucltk_%#i~ zT179x!=`Q@SFZE~D*45TP)!5e0m(er(;nj$)I>4rt)o3lmI^#9B(E1J8%d6rYQKCN z6YASL=W9UsbRgis>~Ok#<~p2gH|8{!{b24$wASb5ZKbK$_QQpM>esB!8Qu#>hq~!M zb>Lw&pLaaHmccpnwx%eFMrD>NmgBkvd21xUbGN&!V1Hrh2DSRl?pQ7ldGhBWNB1=3 zG*(RnX^1+p3b(6(aY&W_{JS=mG@&@X^Mg6iy+Z2-)^o$s@B;OmDYbLWoDP9XT}A?5 zqw}DShI?x~#EBT?5P=$XhfnS61hp94qS8E!w!V9!blMk0 z#mtX!H$sgPt1;y3*P)(?4BXB?AvV#JLzF$Wfe;AfA(OOr)Pb>$FyZBiE}2P9-|CNRst2kJ2+mpG-NYRGdphs#!YpJ`t^NnQYdZyXQVR zym|9JX?BX75@!ySZJ$B32)Kb8`AK4eb9ILvu|;06N+v-}(~`r!A+txEmW8sKBGM>Mz0hMMnUiUkjM%IdpLgxgI zT!P+M=WtXM<^da$2mj{qK3zeQvpDE(HHqYZWtn!bmpowPAp*zt3N~1afe`LQTfKDn2e4wJ6S{ldd5E>i zH@K~UjEA_v8m!Id_=B&;do%GI7gT2X`OZ+`MtZ~Wv~zYQw&(}LDC!60k5z=FirP3L zBR%&~CVvyL0D~I@6BbY@n#x8#kE$};6MunS|4c#^eKXh;Tr|IFz`J%po!$Oxk*x>k zis;|`HXF;|csRv8$W>e)C&98LOw7Ou(NV?__0o=lZN;ngMIG~+C$0$>n#^fW+evqM zG*?%~mpO9Rv==lhQ*?b`(#qODH<;2CcgkecO<>abhoqhY*q!Ib%AesMUHRngoo#YD zV$M2NzN<~niu2TUiG0lVRx|p?nRi}kQYl>Clrz^6{}+2-9Tw%f_B%KN(n|Lrt%QQ4 z#DGDF3aEfI3W9)i=Md5*AfQM}=ZK_qr*t<%NW%;{z%ZQGwa@xK*E-)`*V<>twf8yx zF&E6m#LM$O&;302eg7iS4cKzqoJ|^BP5e751D>XI6BektgMYSK|kSF?&D^z;Dq%qO|~whKHeh zqHyO@04w{lZc2YiUmA12rmPx8Ur^$sT-;bBeG{L!Iid*ws(Ro8vzfUcR#69d0~-(7 zuR2)K>zRJ~BwtY-bDP?nDQ-0g~CyQP?6uHf*#SkokgNMguv` zWrj1*F`)WI<$3@#;#nTt#?~wWnGJ~xS)i~+5)Ea$GZ6b6Z0siVl$smtht~br|K-c;R=_ZB#ly<=X{9TS^TGILoOU=j5-( z^YTb%S$|?<o?R=DK>^dH2uS zevl`QT;I)E*JtQ!0#y25Sw1tUZw?;Y=)B&9Wc3o}&)>9qeqHZYbgOG#_Ol~;#q{9T z?j@qY%>^#-=akhW!r~_m3VO@;tI8u{W9cq>Xet0Wrb9novXJV>9IbgLLkwAO9W7;u z_Bt3{i8cD4)4tY|xqHdG+!Alf)i9H%UYcg+uGKsN-;zP*H)^$B$43m1H^O^Nfd9ur z0V|Xg?aes|vtw*94!y=e%PfPDlOL&h+)}P@iKHB@Xq&j~qkOXY<_x5@yB+Klsa!BQ zamPux~PludT$Mzx7C2ziIQ}6T^HgzU{gAy(R z-R#;I-GyNcHWzo(A)BIvP@LqRB6obxWBj1SLAY}4=WYM{dm8uOz^=BgA*+YX-qPCj`u%)JOEwi6ne(h{2>P4^Bdr#f~>78qF=8w?oac>-+kHveQ` z^6P(}`~g2UOqXl_;E$lKmmj~>QLjVBTuHju67I>z(VT48V=4jE+`=*DGXV2g&C)Kq zE;oZ9vaGAp1tLZA}n=L+qzEBq>MHPw>b-Ma%xbmIW2 z*L>0D5#NTy_=vnYr8KU!MV7q-823CKIRf@aSs${e1f^A1qvR0-wLYUPZi&>`8G+c? z88wLdEnMe_#`Q6a(p8HLgUmJ7oTQC(Mo%CLxs{idm-tz18b19f3n(-LEXQyjB5r=> zEn0H%bXq4hoOce3;iZkTn4=#;X z!!q8Pjrhtl_+8S5^&khBmOwpm1+N;8xQ20G)8CTEOn6C!?{p4eA;mL|#Vv0p zb&QPc=SGa;w*vr!7~`5U->!u&4Hb>am#aEt&8LoAJrW+Q1Gg_$Jlcs7(JHnFk$D7FoFU2&JIK^|n0ly1G3e5{)nW1D#IQmcox zJVa|x8FX(4eXqWb<4y>g=MyBuB`&<0BhA^db;cY&x+nHQhHk@=W0V3dej(3*Co`-) z?ZrM&%9axbIffkqXfHQ3pp(qT2CPtE1N%<25xsiXeHYo_bh~5`qvn)SAg_e}< zWFLRN2uKso5}AepRcZ3-_-GpCc$dnsCblK!_w1fbJS!(|=57k=Gb6&m?6ibwAhHzr zd9lbW z90W>Lznbk3ipZ==aLE3-uy;qlrqNiIZ;1#Zcn!;OX zjQ6>wrUpAfG(q|_-k>2(^w1#BVJgf(n-GJhx`=9wct_Kf6<8w3jp?8i!E|p#iD&Xe z^Z8o?UskMP(uEE4wrYG^`!f)2K?3=};DaCzHcE6wW~9AM{Ugc~;DhW?P6^(ZNR1 zeiV}e(hZNkD`|X(`HP}6fM7KR+eaoJ6KSLa!4aV5Mp{CT(aNW|+2`5-G7;4vwz31W z-UqBy0RG-yn7lutysYO9*rr)Tx9W-Q6w)3&>TDXk*b?o%q5ydhD05nvTbWn_GNbvb za@TXy095;EqaAhNPyDktE;0*&DXCSC7?Cb`#?Zox^_)lhv0qjaT!JG%gdlbYWh# zHxHsN)d43QfGuX$oqA54fkfe{+2CcSdoz4&^Qf zb|@JE&t;$a><3BN1+hue#Ot_kCIEsX)P0;GGf#ot;MK)Nd z+A?oGuXaN)Pp$c)>+Fu)_cw-ccDI`$1QRQ^Z8@f6N^Y@NpJNvmpx27_HuqM?+_}Fq zYG+T~VH+WeD1EHV0c;;gfsBOe2%(E4PC%LkIbrR?RSup=YcV%XzcWS=&7OpCR^96X z2rkP0dXO?DFkFYlWy$zy5Zzc_1KU)>?uvA2kGuNxX_fiuY%#xd)vR#LNA!(m*Rl^( z*yNk+@dq=Ai|#7wQH)H4?I3SF)-AmeJQ z`NEjRS#2{Eyvw>)JNaNR6{-pVj3zCXgV!!>J(Ea_xt+65EXdO$&107IVkt9{?&#TL zo-~eh=yK=;PO*w0_)K(G~fUg6mh4p@g9Uh&5(DApC%Pkv( zrC;wbr*&IlIlZpB->8e4Z1(AcMD2(^lIpXb&Ar-iqVaMqyvo1%ca;n!-eITC$^ zQI?_Y#Xxzyh1bu&DqYc+UDx{nhqaTb0<;0sx;-%9Z-<=3%4I{>6OxZf+_?T{Zzt#3 zCaWX*6rj#v3tJIhfl)cZ8l|kllg;h})FLt&W{WvxvfJ>r<;{@FkzuFy8)41JJoG+> zXO(*)oOXo!Eh|gC8bE%i2b6W##*3d|vCn!3m*GY!WLE%Pwkl2ggV6#*0viH-Avi-H zDoRSWO*+}{x%-u&#A}v&u~yTaNoEmpk8s+CfM|E4l>^^zpYK#M?dagtyw#J=$6Y1e z{$fY+fR~hA8(>pm2HDEOhH4?V@tv)mqt#A?;GZvOxW7ATu?r=$Tc4>dp?fuZ0urrBC-b z;t@{oKuv4)^1QbyBAsMtic`A6YE_1^mP%hyI@;m+GV6ql#<&p^^t$qbnkSE01XV$1 zB!$7l`%!Lw2>C&As8=qGK-2~Bys#nltdlbS&6*U#>Bk5nPd`6paz%i9c?6pkdRp`d zm=~9m0m(`A-!ICZo7a3L?-=HTLfNcH% zWCyg5{-@=;YH@RYbHbxw3uu)`0ST-uwiNLIaK78AUFGnK9(qrE2HGgya@Bo5Skk3* zZnC>tk*&RXdB7WCA)-zhhXleJNvsaNpE+0Q(e&KV*u=;c+-JpgghNOoL~xD8nlXkshao+ zPmwW!m=LKSIJ+YPoP)p6V7+*zs;>ZNzLEDpf(j(-S3xVkB5;2F`Db06zyI@qV2O$U zM-+eJfkmT4VE9VH9)5*%Tiu*_Yk>i3_BE&TrolV8wl_K7nrATQa4=yW3_$Ic2kkpA zonL2CULMObWh{0Nwy-(43%4z%;7cd6Nfu%a=;)XZcR3ygKE4ghihhVaUKK9j=SS$NCCA0RPg}ZlK?aFGH8d zZfU-)PP!-LP3pP&0-tLX6My_@imE*5sezx0JOV)YF<*L-w$_CrfopZzSRHiecME)a zkX}Z*VTe~V1DuibJv(T^8etsLYhX;oR&uAq|vEiey{ zYoR~P^Gr2Ho9uwvnBw3T?Ip<|DIV!%Xn?VV% zu8HkWPNiG-tv1ukuCd0DU%n;7cq|BC&dq;e3O7!*r;@Xjwnd zm|AWjVR%wqQBqeDwCp3q-GKAFAYswFhYVio#soAvp+tKg4?DK6S+P1_j!~o1q2iV8 zv39B7KZNT6_5CG`CL+69Da+%7b@)76C6^S=7Fp3YnjV$+RMH7SkRW;0GVUlO*bD;Cs zONC}o`#hBV6uBc5S#|Wma9$x<{77aobgzwVKeuZE0y%=dpe{6O1uUsdtZqPKZ=f}5 zfoXgNaSgoYL?30I#QG?e;VZ%AuTfAH?LKg?Wb%E0lsz#qzukB^a!@2RQ1Kw!tC;a- zw3qm*t{NasmQ2D6e-%;oDg&;MMrJy~}@NYJHvTaYUn+WOPGpv2$|EuDOQq6)@dop8&K< zzX<@1Io5g=K5oD=NYf9}PpE71bJ*?(E;9$?SzF_;J#eu9o>bu=AQ#;QvYG5oZY!0< zBKY6la8c+j9raC2SzrUG!|T%YD>U@Fel7cZd?YPh7KCeRK3qkMM$0=?tM)25dR7Y_ z@+~78j$Mf6n2$yrn2Pghj&6ws;XDIC+c4h2ZlT6eY<`$`EAwg4Rq3x9=K-B7pZwMG zN5&hVX%P@vPXE4&pTwou^WA2g?XYqHrye+1CtDVOx(+};oC z+rbA*0&;&dD-*A@q~k0yTL#X9lGWGRP~w1lHvqNqL#Nf>OiVmkOJaV^et)v@a&x4p ze%z2rrZ@l?0hY&{3c7fn>NAl^S(F?YR8vK>u!0Ap->jy%7Gk+=375R{IsKuR+-H!N zh#ME}LM=}};2^Ht1}OR^QP-3MaM2h{HR}~)u}H;w#=ZP&{*E*w^bdxdMs~DsD8FI9 z^*Ssq;i4E^@uQcZ13EqV*3dIQr4Ejg&fGNisMjF;9JmPjS*DqmM{COHLDVGv)5iCz z(PDfFmSEv^0HGC+xs9y(R!&SaVRjTfiKiZsY9xu;BC|XyWKc$lhL_~s8F*goxZ^*x z%VNhGUT@zcVMKpS3PhKt$H=yj?M-c+VYXP8=@@msjHL;?p5c>RDFL*`Cuj1BZ@rBN zv4=L28!o)cwavg@v5bcKRLsVGlXNW@$R; z`=9RS;RH9hNAj=T(NClHZXRw*A0AXl-0{8Il>2EBvO7__l0ud+KZr4(%j=-;p`&B) z>CcJcVhRFhm06p$U^5nasZs{x2kry~PUSGj1)P4foEdNNAh-*%Ng_sOBZotdHrT5w zSlXLXz#n~ApjrrrX)d)7^X#JinqLnZ=Z8b{7$|WZjkdsyhVci$<#l^K#zu}! zcGz|au*>3nk%T!uIE<)CmN7_&p^PPR7`PZcsjg)IS-v?+p6ux8z6X3UPc}X-ASk*8Q7b?soXDW== zV^HSaAh{T7H6;)l))qRN2JC1qkY)(J{+fnT{;J}#bl>Mz>BFx6w@wQ_JflD$J6DR* zkJw<<7A=W-f5-%L~*7&TvsLbz7)$?b9@)f3T zz@0;$(8GhkZ3G6r-;g_o=v(`$lV$k#4rA2RfFi#&XayI*Tp_fKBl5VKMQhxyj7&{W ziN+fmd{A^}8fzspJJbS(h7iRZk*B<{UDotMG8XGlv`Z~=#qY^^VCEWps~P#{V?F+- z1mawGGR8e?0h8zX3Fy@=EI}bl+Izojc4vcszRI_VvC8VmaW>wem0P_?KuLN+x^Qe< z*$EttBhESdFyU)XJGNL9YINC+KeWyFOgs(qpy5n?Mp8b>Q4wa)>fX3u3D}NwV&swS zQ&Upkd|B^)BiEuq$U>)C7|9F=N4~t2rgM%}Ja_N1pIsMCFGPkQ1)3bkBE$YZ<#X#M&EQ0UY0Uq>VeynJA4u*#pZkq?L&hLYx1;J?Ir zoK`A>(T;~r@vlb8H^SIIZ!>GM}0gRe9bPQEB}|B)NslJcN9Brq37 zf>ARue`U`nr%EuRMQusBwU&M$zGzZtK2~UvQe7T3vU)!99^vPt*Yv0YLxgU9Oh!Nd zlUA2Y-EZVS8IZyNf0R<63sa=B+fPMnuOP9>R~sBWXd~NIa-H5NXX`AW;1m#2$)_-T z_3KGHp`QAuW-Im)eoj{;?bb$L=Drqb_kM0OX#<8trjVHxYP42r9MlEyr>MSv&io3t z%_Zp}C%^Fhh_w?N0#{DcHWNXa(Db?JIKDdFZcy^%tg`Zp*GSIMF&iL@9Twp_*&d4c zxV)S82(6n}y4Rbfgg>6xA@j8%MzQ_8h15-r9A{-&X{P?PPmwX-czfBd-RfRVUpVh;C|T4<sp<_4fp&|61Rw`k^z{n7#Si$;r_7nGvak<(wV7p^{U&cmL(*|?<4+G^yLeNq*(9UCx zO~tMO8i;U0WL)56lUDLXu*;i!BKOj^EqZKg7xquhr`>;i89h=yAir8(YBLeRtrhuwHwM&qb)h26;Ljhx2moD2TC9v7exUN%ws^`>zW)`&X2xI$dr zu8lcW&gD>8Zyga4hKotpKbi#;9iv_=;MS-w$9P7E~(PN@lJ>R!u?z#@yv=N&V z-@9}XR}BopsRuoA66w>^?l8CaQOLm6RK7(5a^7x&QE5(0G7+i1z2y|^_rXu1GDj-h zg>F6mz)P0FyIpF%MHpCr=hWlwe0fZ_C@&(*+~6gSv3Uvx{Nc#9f?FwOR3p01Km{_) z<8JfGWUD**G#dRujDCb!F6WQ^dZ6^PaH;`ms;P8TZ=UYQ+>4W}xIt|e&BUH^HMw5W zT7YENqIES;Mg~-1`qtO9P#*G#Z{<$&bo<;HUb1`*Z(n?{el*@HvX3#J;KnIjrxyyh z&L!X)(~wF-!*7jBYxBGTuv|%2JJ2~Y{U+hQO5VW!iq20grzFnCSxES!U^$Dc-^Ay8 zi8xj3_vS8oRs+gB;|_`?E4-W@ns2l=FCXr)4Knqntm_M*6`7T(Oy|cS`*RVxzR}5O zQgctJf9=%-zjrOPjOTX9p)%$})mP@Kpd^+RrqY8>EE77RxJ-=^p38NmAjgvbT~MI> z`Sb6Vq5QLB_zy8=!`ZcJwmM?qhfRe5in3H&dXzv*)*R?bzyW|$jLT@KBt_x6*50vS z@MXVY5bxY~&smME6?Hq)W8s*vR>?8eJFgf+y?cdl3Vv7U{r^Ye+HO>j3TWIzHqAfi z9=gSpZ`*VlT&Xt@tKZZm`Il)4eLu4OJ&(WM>>c{^$H4zGEdbKrKl!^j88gu6&&Y;V zCLar!_efI!&(sgG6%nTwG|KeGwbn#FYwEQET692TBFSztzGuK){Nsuhd%W%^?{r$j zFYn$+xHtFVO@9Xi{e1k}i~-{r2w=G`Y7GJB@EPSL9sEXR^ubWwY{-$Y(_b}|9Ku=O z`x6_8Gkyqk@#Ad(acEI@pmlis+ZMtv$;;of5`Mn-Z;vE@J$elPQ=`Y9jWR!9_va(> z-#b=7RhkM2;-vs6b+kIUvx4k(GHNpiR!6gAwvEyF-VMwGDx*8Ft8>!iu(q-cEJnX0 z8$9|e9pTr;APPc{u4~qk4>Tzn+`?pEQt{jAFN!(8)2XbrZ$&n(?2$S)qbqWh=|?vS zGK%b|uZQEJ0p0}Li{6t+*vh$@uEyjYKGWp=ZOBdvsn72iDt{9@`g!vUHC}yc z4r~%{0OLo>(Eq+F`ZId`2Sty+fh_kka{R|fj(=eE_%Y}B_4l8-$G;|@_*?RnKgd1) z1_<5Hwg3OX+Ap+gmgf459JtMaxpDKM0ttN%D7=mL<^h0zgJbU&C}V3Dv1;}1?0|rj zh0-ayE?Tt!BiC2T$GX#aq40d%CBZ93DuPXnh%j3$F3R!)A{)+Dr>N7@uF<99xgy^4 z6i}V-+tVP*aF^}h4?)|nbMxOXW+eXT1)^iew0ZGV{-*9oMvY1i-9LrsCp9)YD5$D< zscLU?b4BqCl@NW|-UE~XVyAig*@{{P6*}fLeEzI?x!|pJh7zTkdX6UvMhA48@jHsr zJZ%&uwx*VauYHKqSi;k``tYUZdylvQ5uZ_QtJByTY_0Y%;9i>*M4@+)wo&rI(pJam zjKrKnTZStH!&d=Yp`AV4gQ0|QHiXoTBVhbFnGM-WIAu2qk$&YDvr>ETRl7|AC3s4e zpO1gt7~p>RRTtYp6Hxf+^n`Yn|5DllpZ#+YA^(mQh5xUwsR6|w8h;RGlT{|!%8Z90lh5E?NOPzs)w-JA$OHq= z%L2YpBbDsC%-(XiPk$TPK6tXh+Q;p%i~7ePxGgdZ6QX5u>ehzI>#jDL>xMlYU9S7& ztw-|&6sLBQi!&F$&v$OXjfA|jbIGxbSRwRA!o}+@lsNDoLkghfr_@(hy#HdDMMu^n zYHWoA;l$o>tv0i_n&~C)_uzre(yC-$Yw>Msbm#(h5b9`iiY5R2hKhvMN z2OHB%L#?7mC0HdN_A6xQ5}apF3IA9dfVNA8y;zyGd~ag|3s}w$^=JTy{V&0NYPSF> zDSQy=P{~j1(!UzJMg8hmvctZ&$$xnP{4&YN&VFK6{-feufs>1=AwfmWdzL_J%`xuY z%m+4}{HT^puP_s1bq^U-d2ZVl0I>FS_@+Jq3C36m>aUT*)@!3KcI{PPG)-|++u3|}7X7_aX16oPpG`OQ@b19C(^d=&&4 z^4+!j6Ku9fzFc;rhX+eNTz3lA$6_O}oDsjdgiY9wUxU7jkpSSvW6*tdl~KhY@Xz* zu84*Bn_5EXJJL2LQV}fv#FyC%=&0T%QHtsAm!mfnQYrn3N?nuM;8a`sKj+#H3;bs+ z`R{o4$FXD=3(sAx%&c~J_Oic$ho_4g5zDr1un;!;@C#f~KSU(=T;aQVQV=;Q6g9C4 zD3SjVbAJp`KZD`V&F;VV)SsK(ze@m$@#NEr-d*j%FYy9oS9P;~xHFGL{oKWxOa~1b z_GF-{znp^{XXi7$FB3`9T#O#tR99^)HrXqjeK=a;p=0u}D%|k2&wBdC;X^WIv!y}| z4k9GuvPCE{ELhY)e$KWo!@3gQRHJb}(#l;*;=bV`Xp-~sTDk$`D@0a}J|}9f*X3ii zMicZ>p}{-TTFwrfvY^0;c6r)2hWl$0%jG3JJlXb_0kw8UACi{}Yd>qsf4Zjpe+fQ@ zv!l*HA^R3Ij{}qkj4zRKOC;vD@hX77;eR@P2{VZ_$#-YfR3`+5yd?)FMugv~Rzny4Bhuc+a1G0j}R!*TPykfiG}BG;7TtNtKe(=SR?u6cdF<@ zv!a#C2R&IV(~JDK_NJN<^79Wsn$<)0r{cF~r`jwTvfd%=_IkBaP3Lvb9joFNV6L$- z;?Cf3^?^rfoj(O0Nh48u5$A03M zT>!G}cLVT$UDfmd$qKVhL}>LrNzqJ~$Y+Ji9M2vPhUa_4L6dk2;Ysdyd24x56@yeL zVq1?y$6desaaQohM|R;a&u#lwUlA#{JwB+;RM3f2S$?mRu*Fshh?8cxJjg+BP`jW41nR(S+ z0vK((lw>{BujZ5tG4N$OfSDsnyw_it(MQxpqT;H?ww&zpQ0U(3s$Quc9SUE`gH6*{ zr-&0;B7%uP#9X(Pt^o?3!8cY+#P+4I!94>G=ZEdPEaU{dt-Xs9=91EolImghbbdeC zihqi&_=lCcKfrY#!CDWEPg*oKs$bh&gzSICg=P!yEq+cHkQ`v-HG7(DAZWgnNXj)L zscObfCrWd9cD2gR^L+|gmQa`Mv&@NcvZH6@T&FuJYHNUZn?~zs@^fTuDvQ`PNGx^mG;^O46t>NmF2|&6je~t9CnG9b#ZRBA!CsHJ@mg)S zpMkVlTggs*xqu2$3Ym63lXCMhX#`hvwjR5!lWg3xeL@0A*fW53-Au8fbt~ijq>b}^ zv*}@(qjzq5;Pv>O*$dA6%9I4~t>u>mkq1%YPVPqgtD&LM@u2+^D<<@#)n-%A?6#A& zcBlx*vvhm*yM^)lDe2!*=?Z2LfANXvP3gL3)rOu9OMt zU|FY6@`9CkxRKelF(8sbv(Ekkxn_@rYpTDzfVwJ59j!?9>Ob7WS^MOC*l1VVQb!1z zlvh293|=>k5|4ZlNY|Odk<(yZQ6a3l+B23LPuawK@xalx(|1zjn zP{cQZ;*Atf3_8x`z=~LsW!K@VJQ@s$EvyJ5=-rRsMoNce;c*@f31-cBe3{4^Gm1Xm zOCkGcf|~W?`?kY;ss#2?(;dYgtH>|u-lw>0N9=U*y7Q7sXH)7UK@w+IckZEyVI#M( zsJZ!Pt zC~&@YqN;5YJLC3wlExO#V!Rc639ukjbMKgwxa~HdCp8rqa&H!SQ2}VX73n{S0(Hz0 zf|}x*D=9?*i`b|c)@e(E;)E?JJe$zr0{N!{d#}mOG_F`Oq!@M_<8;8|jEB>)GtpY1 zcrd9fmFXK*w##FTHoE>HbKT}GJrk{Y*3W_sBiX`w&OlpmTK$JJK3-DKN86aGtKP~| z9s6^ET|a}-pUzcw9>uj_$zepjc;nS*ez3)JkvAH2=k3;bMzM^u-5!W{&6^dI3VlAV zn<^JD-Yp<|(HYjhy$);_%#Bgdi$Gn{%T=SB#||%bUe?7K!BSB0)t*m$OdQ#mrb;BK+h>W@HVC%zFRhFyfm5QziEI`aMF^}QFohsrUAMamb#N$a_{#xq(EmN`mI7w3c*PVlWeO5((n&z z5t*{=o+UVI<*q$3&tArjI;plSGIucM2G7DQb(!C*N)O-X$8#o5nB9l(kCS|N_u$u&v%aOuR8_N6_n(&= zOJu?l6RYMZdcSb(rjQx=wk1(i*wE|eMxXB4Lq2d*jojt6ll$C==x@D!rJZdo7!@Xu zxD#1FVCq!+DpyRA#&SCi+%^xTU-e`(buEj_(!HD0iu8{=w5fYV_Rf1nc{v!gr?u<= zp+-9?y=`!F4`D^B*=~@f5|TpccVQ6c5gY4c=7=kSckcDFCXi3}G1ogCF03mx&64m7 zGdR?Y7@Hft#e3QZzKmZ*QGaX;*blEdCW#?S7k#+l!-FEPgWn>W@7FIG)G6S;Xf^*(z({G{UW(Z@T=T|>c|R7o7hRf+eO1c z2Od_ps9tvla)9j#sFCy~wOsQTB@y+%^U9Vb{tk0J0(DgC%H(45-B?KvHrj@5FI{t( zGWb0g}v9*S6{@F8x6H#9mvu6U}^|nw;p?I-&h|Tb%HH;9@ zy(Q?~rNr41QdQB_m3?8wF+CVKAEb1H*^3Z_tP3trvMjbRCcRrNF8y_JdGA~eSG@?# z5Lxh!jYMQs8AA{bMNMh=nu*ddbE6oe>eFjB8VvD2pAPr-84B++Wt2ENeww)3C=(pA zr|K=k?1B=Ns~Re4zh*(%{_1^5_Ii<52jo8Ct`&jv$a0f*fl%f}2 zh?wM?@n%(mOhRvMP_@b$$XjKaPe(T~Gv1CF*CnYuCx+N z>3J(Ng^U_q>hfOb1mubz6EI3x*FN0qH$iD?!C80nnORUh@>S49OgUsY%x%QmSm>0z^(#rHn2P90^NTv2KD=MH0UPK=xO4|XJB5_qHj=F6 zGfc+34Dhuqb}1WG{)E3>)hU1C3v^oh!ay(Fxr%4A_4O}db2&mii~z>QxcP{rqRRov zIqV7}rC($6!MkU$$2tLx>&k3RJGz&;zkZbk{%IN2<8PVhM3(~?$!P+!WyYPh&r4^Z zcYr)-5_!Ld-Y82^oU}q$SH#veRdfPbYi)YCP!Kiu&{dZ2B69ZU0QVW;cazy>#Nr&R zkB^FB_YUrXP|y$!*+TpE%fpuzp-5KX^wIag5kj*0pw2J#4bqZ5N_o@@+oh+BBH!KA zyHcTITecQSR&Rt&AFW$)gcwj8%!~wlu3=>fE~+KItyROZHZhuIhl@2`C^} zJw4j3f6+mH$X!uVwwNmEvh0fd493Z12cBWR#7ST`A60&PG4_y@EKRZJCAh55^RnqN zX*Avkyo3!yI>#BjWy$El(Y@?_XwY#D#=;^~n=dtbX^J4~A*|9G1od-WL6-XuEtZichN-scghw34WugWD)b6hSA~(3jon$WY)`MG2CTf8V=ZTpvwK7fFX5qiVSx%}e za2*YTOE(}+Z>=y={c^7?AUOq{yYQgVWE14b%`(E>Ns8L~DERPS$Fy)v8_x;0{+cpOdVH zda)h1OOxE8kH)(QyLxQ7W?xzszouM8cq92^X#7!JBlUI;`g7aYqoB86+fKjM0ikDa zy84QR6;(CNk>d&EE-e+Jj!Ibc!;|uXA?((K)CP1Crk?_aXdMP0`L;bAa4uHi8-MGG zLrDlaP!4dtXIje~yjaLtbGpua0`u|^=$$vO%B6qA?)oCZ=5*Nqy0o_(k7)Dpo;35o ziyFK4+KWN3>gBAtoADqd8J#YZa*IX*+1K+v9Bn5cF32OERX2$j#l=4T(i@j@$v%c^ zd}XFAwUBR~a97@?xE@(N#noeXq%k)&wZzKnX9z`pv;1O-~yhvxt$1Ys~$Y)3y_ z7-Zeo+G2OQ+lWn9ud#-a>&7(}`!Nbd`tD69f8z$%mvoKsl|H?;f1&%UP2IcoB%N?M z#a_?SwH=Ih;FTTw5w6o58OX=@7PLvmYJ6h%@tVl0%~JXcaJGTqLxo<1UK7N>TIv#U z{EJU)b#JqdRq%b*Dh~rOR)U%>I4}D@e`-wkajKV-^gCpJ z`Y2TP8K?@fYX&HOV!tD5_P4JAHc0K#RIs+zH0;LrQzV8r+tN+=PoE-n+JfDcX#DdR zDqdC}8Czt3DBGiBPhiI1FHEZSK!@adROyKX+A&4FKA3Sa!~`I;9*2z!I?AhNVU%fT z-b_x9U-%f~6Gv`h`A|@n3Ey=;_ekUn^zh5zi*SaFi2=E&h(jGCPhGMakIRS$k5BYv zOREgupWBEYb+xwJUq=tC`DmryJ-m6<{PV{fHUG`&aUxq9!GUyav+<7+WZ$RQUj&?%W zUT3j616j~lzM$pnkGFU?l1y1LPRqBH@CH0hD+W0xapg?T9yg2aa(c!c&$%T5xkbiu zLcgPY2_vo~p=h;dswaDqw_loI;^rm`Y0_&?;a2oxy*Sz7=kLCp2)*X*N+L``@9TYx zD}JEI_RZXGHFtNG(s`*`DmzSCLO^_svB;ywuJyVHPhZ|LfO*p25rj=rVvUP4C}+~5 z`wpzg%psGNPi`j1EWRf?_hs5AJ-mWBrc_6xY4(V!pl&7_aIh7g80ydr17Mert`|Pm zM#ToD7Wumn4~7@r^?!y%wS!UO2Zc^;N&M0GA>;Iho0T^286CouWuOz%H36d${C$$5 z+32XHsL7=;mnij~;oe=YfigcS{&w4y@R^1Aj1I#CrSoc=HC>QFDn@;(YYogEp_b5b zWBuj$^;e#Z&W_`tN{uSdrLpYZPxn33hw~x=ur!H;8O67hQS4#K80X02$KL`BN`fmj znja9U*pQ5@Utx%tv3-9Aa<<3F6z*ND7fkT&8}&DbkvI?u-&iI0_$)Adfr#bU(W>u6 zBM)sn^KDe7sJ!}7v^*_w!H_F>kBTDH!d__hv12fIe&=5rUxgI&Hw4kf57I+BXr&i~ z<_kB7x4iM+*eU5TAxl4;Xl)8QzPk}VPRui9+9Tpf?gYFm{n2LX zuZ=^o$$z1I^ND_CHvE$Iz|Q_UzguAcltZ|Nb@{$s$=5m_*X!bskHS6jzS*3XBBY** z(2s1La}B43aX!|6s-{#$#Dm7AhKE&pJP1_O2I&_*d zbD{8qziHo&3YD95mTiz;h-zEc0{}r6^!>^$u{|Nsa47G{aP0dm)6PeY6B5?08!BIp z7Yabu(zr;am8=tuC*aM{>p`Pk_=U=c5#_SF*bI*5n+`)G!Fu*V6T)Ejibqcj*EL?I zkR=O61ZmBDcqhzG(@Ai$Y~*!p*>Ec7v99z8o#!A`d^>YI#D&rDtJ92zv=>fqDi;#2 zRof@@KoQfm&Yfw8xhuDQvSO#khv7ivX^`K}x?N${d1-c1-a0KM^0wh>QcTcaM#l;m z9j^6=F0m9cK>%tQG0&uRz`%EPMvS;H7lbFbc$_4#-r|;_T0AJUDQ5AhGpW5vF4<7h;N)mLn#$+j*-mKI6+*pyBFU|gCtA-~@ z184BGW}hi$zGrvas$SGZQte5-&{@&q+xWJ&)k>Es)>UoRyx<)rFNCAi=m>j;oJq6_ zgnwn9bi zH(!L`TQ0)i`&Ro_O-<#0vG>+tRd3tB@InNX5K%#TAt6YobW4jgi$(zjT+*EjK|s0$ zq`PBDcSv`Kba!_z@0b0%_nx!e`<%nw&wI{u-}n9f;luNY&hMOKj5+4W&-ks;!A;pp z7^}+!s|iYPGOUJ*whmx$$H(lcE@K#YD-=F{K-T&d{;iZ>7%f35p&`a;PgfyadhJ-D zUT%+<0DBg-|8iq6b=S^w$z&_N3HyS==+X;CrwEW)evh#qjSmC;@0(us3g&^>8jIE+ z^Dv~f;=+{Vm$ zL!qX7+<&*M3L~NwgFK*I zP#y^!;DW3mXNEE)i_!(9musYR>u^o%Lvsg?@?ht%<~hHBrb-1f%?rzBNrgTfkJx*> zsvL8BXnxH-Wv;g4V=diPDEeB~FG$+?NNZQpoN`^UcbhC7a?%?#r|huX7F8F<$2(0w zEP4{&dj7S;z5KBCr97I4GegnA(V6Mz`Efjos}(ZrL5@RYnzyu#WV`RfBO)`5le`k3 zB(;~O`+bZSgIpVsOynhged)U0+QK)yAxSQ~o&KnxB{lHMDzw6HzWIFOQ*;C8*Lzyr z@~~Mh!JeA*?Uo({6Z!e=@*wUBaxa3T<$}lGryr~HeNS&pun0LL1!l|_=Rukftb157 zZC$0M1F3-p?givoQ@vSS_3ckgwQ7B<26n&$B3 zSk1ik@f1D6O+b0TMq8;tqv&PGW;9=Fh~%BycDG#UxUKNzr#cT`tugoB4 zEDY2d_vcaVp?xNEH;cL{pvY#ftb zH9TqVCgMH0KNH-#qS+`}`l7^^(OG_=QDgjl0TXiq)!x;}5)5Q@HVpP0Pw({0BNuJ* z=oUr{?9O~`UD8R(Uu#qyU@YF}j=H0DY|)X>g??5fHUt(QVSoopgpf`1Zt*c+7QG^D zX^0418Rqz#+ww9uKdEm?%>ZYT(CdHuGOq)$BZ_s;Fx7ybTl>007G2fR_VbrMcv*(@ zxwsFE#(Y*muchFra=y-7Db$J{hzr!R+;}f@&K{Ot>9Yq`1o5Je@0M?!8~Pp#;yMcz zJ`Y_xCn7KimoBcyRYuF7+<(P;d<5s;jrV4($`!q%`1-SVR22$IZC;;JYHrLMY8UL( zJY))~`9000n4JCq;u`Zi&jfLp za88gvQV#d7+o#in)leh6pe32{o6y&p8Bq+gq4P?gd}LUT6~Yup`RCg)b%=)4>^vh8 z=L_dUscg#^Ieu}v3Ze6I@lIK6LAHEIz+1?fw8m@{Z9wP@a`s@9*yFxv1rnUjJ9AtS zW)Fm`F`!Z{lC)g@4u08e{=H+ya5-2c6Tq0odJ*AYRoJk(qk zf0}lW-IcH?(2TAp+ESIH2aQBZz`fdXr3FDdwDj!uGMOVKM$l-)6?EdL_ukqxnc72n z%omvIwxyFRnF1~FAI7DG2IN=*w?7Jw5hrA=!w56GslG)U_VnhRHZ=JdR#y259t_$F zKAo>(!nhQzaw^~C7$~GnrR@SKrXEhB-FBMQt8q7aQ|^-(hbKAt1}Fw4odrV9NAAXs z-AkX;$1p!JI&Sd=4HWw+4m4GztaZOq-#VPA*z$T8_>2IREdpI~VMCW=U4VMjM$^hT zQ=34K@1mLi|1r%p4tfwf0j#n*`A7Jc;3+k?U)yYO$^E?r`VvB-vZHN7xLX4yw3NH=aBcvF&_L zF2Y4tr^sL5jysRQ=t~*33HMrjH;uw7$zzJ_R_7xa@%~w}#-^pq{iP8;lPqKlGmgb< zY=%3pQxK>4Ss#Fj*e;ANWe?fE%XJekP#?^Bujsx2ygTu44gdRz$8A2{5h)!yG~N+G zvN7@!bGB4*cuPG<&|1Tx!1?ZD^U3pS{&@^R9JQbT&zivN`vk6LNv0}!v=ZF4lypq?7WT9aLYq^pE^ z8CCsHFIX^i}UVad0Fm3{3m?N2}t-OW>iU9cPj zoI4jVeuB1`aHd~o&;%_p4G2aCW!*+_gwsq#awcsGAPsSt$Vo-)D1Ysal5UX%%_7CS z+2vwCx)iSXRul7bKu>-*G>Got;9eDEVhEu!bL#X8(b4~5^G>4#{uJWEx%)g!{U>PG zYn36ZJ4X&JfxWvr*V_`6Us4z5+!t#)fx$~k_Y-s%&Hsqpz;}6B2)6Q>47T8g{y~6o zPbZFXv^tV*_$g5xeI5}-hZ`PP#hLY6=&m+=i@{Df zK`rG8-d4prH0~T+4=F#pew2Z6z%}+-BCoRMHrzZ|CtS}2XGtXHD^dsiKk}w9)ss?G zjpUg!91%EA_}SiO0X+y9Oy{`|W6|-{eSQj7LUirnRhNFJC93=d2LNy_Yr7m1TmW=dj9i|n_MfncJmP# z5yb=d54(B<_l6NAR&%bAOXFJW``FR%_QS4*mxAVD;TlpRo3iVUC65%;@cvb@6u0Aa z0wD$kx)vcolnHkjD1tCM!v%UCr*y9{RYa{Z8%`B~2~E)6^HU&WgIDvay6Add7hLea z#&sR>Y;*s=sciK3RoMU8vekcrcl&R~oZ1f}0p@v~mu6x01gFhPy1y~FBWe)V2n;Gd za->22ZXM)BSkhhZ@^)k#rxWG%KIgYq+gl_zG^l z>-@I<$g(y5^a?ssHwQ7AIXJR7%eZcgW?Pc(YS*=v1Jc}rjXyyLEh~sqIRs<1nO0?C z&2T=P{m8)GjuF}I4nwE;T@tH6=qT*(|G!q9pEH(8;+ls-L4=e@xjOQKr>VCa@2o3( z;(WYEsA1CSLuJ4W-$d#$D7or{)w}K>czxIN0YHEevlF5-$Y*D^VS&z^&h&}~9qLZR zxuxJsMEDl)+--1P1YG9Oh7|ky^_}sIPi=4OmH4|I@Fe!WEU52x1f9Nthjkq{B2a&V zF2yVynJ&HPVH?%D=lJj(==&n59tBZ6ul{bqiPzAMc>l1T4p6I5>8i5MqZ9TfMZ-^4 z;K_q~a+a;bL5fgu-v%W!s~5qLUcj@jTQv9yDt&g@?SiB$cqt7STw#bG83!EJc8`wv zndWvbeMe??q<(^uqPL*Fr%u3xg_5$10odxhDh;3QmQwV_J$fuFAk+GYKp#1nUy=Y3 zULh&;TE$Cv*7r+`GdyuB&#Oe=_L9=-iP?#j$2nw}V}Iszu>(85juR@HUR;0JrKIZ` z!g~@@XiwD4ygs6^R`v?-c*@odwv3l6}3xeV-e_osgR$cVhH`8;2$ML}vY z)G_)5h6ZaZ0z_d{a2?vr2b_rF?a5W)Pf$NpXLNSw49^;n=anm2Go`r~61F-cB~@7H zUDLX?XkrSTypBjZVz514NL<@sV&E9B>D7X(Gxk8@X_O6p<-R7%)g%sM|MnOqg3ndu zhci##=0nLKi2aC6)Y!K!BpO^_x7s*1DKVO@^@M9iHo?wG%6KkH(!Pvg1ze& zkLWt1p$_bcclZd`tOW}X|_9`vtY=q@BfVB1D zZW%)KG3*GCe?yHE+FiJ34{DjEcaCPLAezRBhE44gQT@)^XBC8RLv7g}o;?F99`|eT z7Ie!TG=(2NCPUkouW0=+OLz?Si3kvIi@d{jY#bhQHG%?*!fkeDtMi@Eh!{|vIL_Ry z-OM0!RnH^4YA`6Fg&AMII0Pmr)-eEO=tEYz_K5k%?grKNi;B6J3~dy*UB=JJeS@Hj z0=jG~L3fP^2Tt8PjOo+8xOAQPKDQ+ztqX1Fir&Y^eG_a?9^vcLvqYu8WTMj}OQcaz zETTLiZA*HJMhl}SJg3!u&oWm!ssti}v11?m?g|RfbqY|gO^aulWhS1PhCyL9;GZD1 zppL@8x`bO;V7nc$mM+*J(-DvWsx8k;tq3)se%E%1tY>y9iy3sl@Xa_zAmt-auY{w{ zvz4+M|D?hT96ZroEBN}=;?*6v)T#QL!jTijH;94=DuE7G7$2~*E6o~0H3^zUGjB~Z zv-1Rzi1;#8bAdiinr4^V{Mb7|%l|TcrduwDQQ6htdYW@Xw8OBom@)EY2e``_C^{3+ zPsnFE9VtHl35uGPWDl6BIq1NdY)Rm{k_3BNCt$E|mMrHkq(1@p8^np|lwwpX*zVs{ zX|RuMwdHx#(lISqqRlidZ=Q9;cd#iay~UWutSQ4qz>>nb$firDA%32og~?ViWyhMs zy%9xp8&MKRL!CqWs#TY%i3wM`O)Q5}eYK#42xupmQekoyThNT*POLGOt@agNMo}m} zS|n?BI!;JeTT|VDzCmyB1Df5h@Nkk4{t2eZdHs z++zZYSK7w(f!rqSP!rPMbn6ZU*=Uad5}K|^BBbu5S0W)ddyQFVXotFDBcX9!rD)ilW- z=dq!ejW&P6g9T>CWx0?7#13k{O!PA!qaLRw$WGqI38#Ydy!vx-G#lM;i=$h$f&Imc z1J*g(+=5H)Ad9KWg3DL3_JVHKbz9*3jTHXPMtsZX@F~Fi`36HjXG|{|yN8jfAcp(# zU#9E+I|cWjia-9d6x^QxCDO5J)P~6pm>%6xW}9f~LAIt6cWAcny<~7PL^uN}vpvAz zp>^Y5_T4o*)j03HJevSsaNy-t0q>R^C7d0U0mASTbeau1iKdI&%`XtBNp8-XOm5j{ zbI*!(&Xur)CIbzXT_f<+LFn+Yn5LGa0=Kq?Iz?mzlju zo7NRa=C5XzL|T=8Mh5PvhWxsw5b1%KJ?HNi4*LD^Ku+DbU8gdd2~C7N>zpjPrrKXV z^#~~KM6dnlK9j9G$&u#SJr3%|G@T{=lpUr+@mEQa-WtDc{2jwZX_7pnkymhRq*@ZRrBd z0t5hVN2fV1%LCG2e@Czu%%%f$iu^U+FIE%G6D2$_ww%!x58<<7fBn?LE!(PHpkxF% z3ZyDLZ|i9sh=Gs|^RSHo4gk@3!gGIudgJO4f`CaRk5=8UgZ0a&0W6!}OWd_|Sn6Qz zVfFg3SD59eNXBzVGe6|2SK(ev(AY2nC8tDnS@3yeX9)(wfil{^_yvn;j6IT3pAUvr zRX*fKsXuNR;*Vcbs{o)@pdm}s{=Mu}gh(}j_VdTx-9UC*?U|bFbf^mAx3?*MlEYr# zjny~eZ$HX!0cwlkz@zb3cddiI$1&=YXKHx8Yhs$Q*!$v6VcK~>j{gsYz43jXug0B+ z!XIi(_S!vo(Z{7w#6{+R^0Z0=$mdkkn)yaISyt-}VAA1SY6o2mA#E2!JYWr@Be0d8 z86fotG|B<>RDU>*mY}<{lHI(0{$iCU`SVS;552q}H$q+L$^r7yHKdpnU;%*n5%HO}{7gptIO0MQ)C#cx% z^HiiDCl?pu2;>xwJ3I4xB`i1x-4HxjF#}8?Kyxc2?XW}8W`l62?Gv`@pk7?H-Ah|z z@pjuimU1W1>T5zYnIWjxk0VE)`#_QDS$S^R8F=am0>qfQ2{Bft@9x>`_$*ZgZsX76 zt$zYY>~l@xKH!S@?g17PP|=!p)SawR--#LM7B}`pEoes`t?ZA2@~1b@;l$lp+iBjx zbfLi)`nr) zj&9KdOk3x;$;M+&nOY(dRCVzKz{b^5rqNA%?2slCG!B0gK|_txFaRN^WI6#imp)>j z_0~k8NUW8I5NY>K7`lwW*h>T0X0}pX<<1pBbK)LT6jyIYJyJt{ErrCRt`zH)ss(l# zVkQ`ARpBUQ20_joASaTW>^tg|t!3QXhePUvX`(M>AYSmJsaP+CK&d16%WFYw<(T<= zo*$m8z1FWOvSzv@Y%)eMgC#`TdZT^2V(yhD&C4ok5@nM6PjLD%feAKdk0dD!J4}0o zk%8B9{W`AZfcCkT{C)KE5}R~k6O2?$(7UOyaI{#kBk1Uy?t9(uZ{#m}3whcI&a~?t zXamN1-zryG=1YlFw8Uvh_7Py{5&E^9hc*2K-M8V#)~XoT+DZ!Ldj2NH_SK^5%54Cn zIPZpUnSfI`^=X>^keFvx+`3sD>(A^fKASA-PN;pV zjkv#buQxU9D z-%I*l2Rs6PRa)lzLRl5%#BiCkNggfxrmB(JO8{Wna)n9Sq^2mb)lMhlWCKm1zf@!ZOWo}B%__%aW+Ka=vc5^Y57iUd~H0dUHb&-_h)F&ItGn^mA zUrZBLfD&md{wSW+C1-T?KTs^KBef@^M2DLm?7b7lc7@hamk*;os_d;9uKGMW|I)dIFW}k=?comi;?}Dv=N=(?7oNCx!S~O{_;ctijyc3%;!PyE2=JC6}wbnD}7enNe7U$sOt>O-GR;)^G`^9FKpz@<~q+*yDM4csW< z--R*{Q4DpA&Q%lVH8&(PZ16Ex@fQZEOSHMwClw*wb-ybQFxlGLdZOv1Hi93PoQR&X ziXy8-ZD%el_DGSS>olhEc`aozPMdSi=R*Bp%-Q(XA;MiOCD9Q+L35NvSsb**5Z5(| z%5Okv`{+>d=!+0(F3gNf3bK*l%zj2r0lR`zk9kc>oZ?Q)l#k2#a?8we^Y5YX&j`wL zk&t55vmHXKQ&R?=c0o^PZu92U!KC($62Ki?c#=P$rS_tymCAjK@*@0uc7Pa^g=@pw0X1(ALwz{q z0{4?hpUi#&eMCsn4^ozdHwljOB_yl|(&1#aa*Pn+r-MVNYYC!Ty0SlvGz7j*Y|<|P zaop<1%Ru}sNH9;zA!SYDlRI>SDa)f&@cEo?kGJED!)RBUeN3}jq)w1tguqpkC0 zFB@T}tHKw5`xY~P^Aj^TkVW&q8h4cCL7>+l9?-MlfTIe-4%^4$ULUgA->m#bJM0hWp{rmgAQb$McM z=ejXo1{XQVUsJyS#WttF=z&zCowF8mwIQ+AEx8D3^E zd!kOPuNhiy7K0)E-ax=Pzcw~qirDH&pvt{~@2Uhqh2jfZHOqir^lzszxf3tQtG#%W z>zXY6UCS2^Gp3y7M&2rxmhRTeSw&K;g`%zLq;P)X!w>3I?*CYUzQ0Vx93NaikRc%d#niqep&3h@$i{cOpOI1_ zV9wWY(x24zYc2*rJDk($jdxT1O&A}9UMRTng!Kxn#5WGqWL1;QMZlQX_EsjyT!j`6 z^Cp~RG$mboq3EKIPZUIg+Ekn*^MWgMl~#g&AKW~Of+nvXE4ic(bl|^T!Tg-)fAk&M zcQ7-Hw#!Ag?a@FB9JtxW=RMn^5kNI@!`vXcNi_H_>Nu0$Hh=0;BKA6#s>Wy#k`jYe*KR`ODQ zRyLuB{Xpb`4TxNL9hSrM^rdv9B3Qv(-&MJ1gQP(lMt^YpffVHp!Z12ZP?qu%FH2?v zu@8<0@7$=9eV3|rfq0Ug6rpFXFH^X)NJBTYNq>!C)KoUi_NPofy7 zNRU~hd?5stiQ#tI*Xfk+ZijMUs0~0^Y2O_9-|)Zib2DUWa>*7wP#vpF?U5$LZmE3%##o1YIM1icrW@UmeMcgy~>t`%EZi?t=#|! zZh>iepXb*4UF3sAj6(&jUO$_vAnetx%<*K&xnc9O7NS)#koC}w+>c)aR`B-&`O`l^ zGDWq)C{CaCgFp5?mX`#_fpn97SDaOH{rhxR5e&#&Pp zNRd(5z3; zsMZdb10fQQM=DsVTbt}vovZbRWnNMs{<~t7$Y=5>H;R4yK@nvAS;hslmYMvAR0x3j z^;dOT(j1oKLX(En5MzpDtYrJA9%c{_8Be^I?n|3?)u^GSHI<0j*Rl;{kFu^Gh+kik zKS_N3`VOp<-XG296HAQ~S!efY^8fmB0fY>MbU^Dy$vIOUBgbK{-0%Vjyc`WM`%rxU z(%nzDXKUgVpd47LtqdTyUpA_Lxqzg+66#`voR|D-vPB5*j}iYHKKxO$z4s?i!(<}P zfrBhWr695SqbS8o0mLfxrR9!oeb~m69d?Ee3jHfoS|k0_42ThOLGs^aK-?&A_SpZk znCo>EkmjEZko)7PB|04qVHlJlykpztl}r_rl-H3N+Sgdov~lshl&7O zDOpN=d|WuDmA{&<=+EZw@qG~jBr?!f8ej*TKvC!3Pf$x$G!3#Bkl3)A6FfVHT>#0@ z1&K?#gu6gC3&@Yo07+NEZKFiYD<+wu{>_1g@8}|*g6}e%1j;=v1^|i4DocI$$DuMG zE1&hJSj4_ndwp=2&xye8y{-@%14dK;Iotp{c6l_wxcJ>?gMN1)j>&!@g34E6Z|@jj;5@!IpFWHo3i=mV3N9qw*d7Uzo)=l-JBLsR_2m` zKnR}p|MIcxGjd7|d??lw*3U?i6vYFDPR3V94x^27fy`%q#|@x4>+eaW-TeqDGS%pqkR+>cFt`;*@04CM%*{bidg$N0wn0H^f3+fJ zihHV~$M<~dzeaH$0l$n@)o$bT7JZ+|HetOP7N8EMUbW^{q!cRqoQ?R^vIqv=*=OXe<69+}$!>%lB+{Huys#Iv{zTC35&d!$ z@E<3IUx8zsB(OVryjY^cD)G&C*@x|-4S{X&) zQHj_i5aidZaKjs@O(ZnPerM6|rGHCda2E#NqQ!J6Kuz?yiMbh1ZNHMD&{pb`pqah= zd0)`KybTY9f+s^&j5Xq}SxN3arzZ0A!ZV+sxY)*OqalM}|0IS`gM!<$ELj zAp5v+T*s|2J&M5prSOM>4_iGvS5Q*`y(9mru6He7G$d*(#@b&Ev3DMpps|&icmqB& z7wg_L762dA70$DqUDz%88Jb!QT|`e^@6sm{02)jWUv_#oMS&++?V7qWQuY2u8)bOh z7%k_0xwBdB@9H{rrZ+YbYa_5+W&}`jep>*1sNKTvHE2)x~ZoM>XZ zBO!_G@bnk@Y#<`~?zoCpr5(*7U=o;x9T@wP$%-$Mb%Mn~tqRQ2N^j{jYJ3yD;*op` zmFy#g43e`%xnV`T>zQ20I>`e7Y;ToMz>)0V?Jq;C{A`U4Z9{s$Hqy6J`=5`#y~(=0 zM$?b`5APbpy!1&ihCtu?86d|W_4SK^a9gJAF&a4|*|aA$i)46<1D#t4-f{C8j#Sa! zgtYgZ#CL0h5@jgI4P=R=s{pAYBR3z+O99!db-mgCR23JV= zl{XNvnEp%ZWFrWJU3x=*$ErSM6=#Pe|J|comC}GfR4_<31d984(oPLP@~`Pz^1 z4i@F!Z{iYZW{ItFhi{--Ezcny#UyyUy2iW3Ry1^>o0Fu~54EqMJhal&X5rZHPYT~Z z?qlm^xeAL}`WZbE@^T@Q9F(mke4GJ_~2P~^LdMl^S5*7Zie4p)N{ zHz4mW9DF6}T zbO9-;ux7Hs2U?Rpwb|;RO3s2E*KYJia5L}%f;x&2a;sQDxWza<9DzIkw#_5|L8W4rFENOK{u(o(VP% z_!+V;Py=3Fca8)nJ5>RSg9w8z3Vwo~!*%~*!*epcp~GvX2uPMSefU>hSO1CMJDfB* zReiPQC@vL$V?zd^z1sli;yU8Gg8BgiE_|0rI5if&W?Caou|bwW23awI7{5XhgcG%SI2zYhO}v<>6_E4x5q51s?NUuyX*Np9c_C!nGdGIN-Ac2f`0T!BYVu zL5cXdRF6QaI`EVq(1_$t1yM?2k69KSaiK*QsNxOu|1Un8c3d^igfL05=-mgO6h=Mq zubZ#_y^EXXr2g1Yeb*{4N=fNePvtxmlxWrJ4@(8|o$7n!Wa5eS^FfPxp$Q+pyQABsd( zyVt%r;`s=q{AYn6{=c$!7iy`(eiM|yc+V%8YPV!89rvNqz93qR93wbGdT}{XavUKi zL5qqPwxD$UU(n0~VX0$ArS7eABEeqtNK_U44jh1@#KmgDnfy*wobrtJ3jjTc&v6qo z&4~w_`BX@EOPs~Y8pTs&ifKpw<8ApQ?nJkU*W$V`fE3L%{qXz zQMBZ_h9&+yy)KHMr8zeBn#LD-q?Zxw(VV`*U(A(*%%&N95NPDlnO0gf@RgSQv;z2d(i* zCxEa^=<{O~KP!K`bJdzhASHFtEb&F=@0Z3mBlU5>oC{beLaMke`gyo*samNJ_l`E! zBYC9%i9m=F^S^NHUIV==E@&w`OjX_Hj~|$EkLA^SR)R0acg{R8OAPF&D;X}ywLB^3v@Y{aFlBSeQZMi z*vHViSG6#qjiDGO8_~aH)DZXG4b2?wd{Dvc&2zgUNaXiDffk1aH?=lQ|Hr)E1YB_W z44RVir;ii>Bjmz`vBgAWHRKUS`9i1*=!DugB+@7!yK$PYaMT7VgUGfl?XS8823_a-yBsI5>CB@&IUEWXBbr9K(uHi7H}@ATc! zDmWONPxgqK*wzVi*6vr}l^Wi@7eH<48i%$ZL~?b~G;?pfO~35H6wak&BGYmccpzuO zS*h=>dE|XLkYIC(8g~9Ym~_+bXrqi%49!kSJ2789YttvjK1Wl^hoQWfdL<=Hp3yJ+ zAEwJuRi`9c)nJdh!H5x$kXB0x10u3Mltnvt@-g&Bj`js6UJzDk1-V}eTFrG+ZRStu zs8bo=YmoMLOUWehv>Cb)LdB>}0HFkz%I&aCy6@~v_@^gjVzll9bPX6 zMqQ-jTj`X|clLfeHB%_>!T!>QU7bL7C2K$0h#^>P?>~vtoXa?N@_}jpshfcJ-}J`+ z(jUM5M5fjl`A|%RH^kKG@Y)keTrI2*soC(Yg!V` zF*T*OctB-eZb&M{)pwu=Jc+PuH@&x`e;Y3OJ>Dc`N}t#@*9dv&IwrStDLlVL-DoL> zbsDnx1rLMJ-TWS_rBI$WShZy2@brj|x#5{5$iibkmUN~32!87{#O@gWNEV+PuRm3P ze-fq&x7aO7_~Fc(F`<83Bv;}>?f^X0hk6BE7vlJ`1^$OZm3VgfTP#SvEmfr+gWP0R zibk%?{m#O?nrc<_9h@IRY(vo$d4fi&v6~JA^5&~%n3j#H_akSF?+AuV&E1`m*)s_a zTOwD&z_#mvu?d0YuhHxvRJo@ULVeq^aYMNW@M+0W3$62bw7J;f-bc`Wdnc)gvu|$& zDWzdPy>j(70>cNlee7(*)~z1Qwjo#97=}?F%tnLG^@aCbgXZac7(QV5=xZ9Wi2ivta|yg} zRfbdF>e`~ufk7U>KE-q^Fp`b)kUfU(nzYFRQL_?Ug)wmv_g2tRJI9WrwUubbc%x?Xp5euIuifSB(G6Qh3ZpS*C1V1zbD&)g-G{2rs5?x&e>o&A zx&_US`<+p6sGOxF{9a)omn-?5B>B&gfxwhe(A`-iUExtTO<236;1Phf&^7WUez7xY z=MX61C**#_`i;z;^$x%AqjkCmJ^E_>>_&%vYZTwgRMn`+J_p|yiM?;3W3vlKh&-M- zYKI-t9>tmc9lCvcEiM3gAaa4IU_y9mie2P-S8Rpfj#TZdY^Ki)oWlKj%W4%%P6xb4 zYgoER65eD#^@ygCpS6$$_kO^XuW4(6T-I7?5r$Jtc~W>KMO$|3E;R>7_f%f2tIcHl zZ5K{n6mS$g9)8K|JPj708+!T_8io9UA~eum&!ty*O|@8?O?j_64e{bTs$^}(T`!fGAhM!Yr)5t(>f4sjxKDbGFcwQG{JKayEdeF~xYn~}^BE)TB zmt(6WcEM0DtlYoDSGxyST#DZfe(Rg+USvQ(mxoPZ-B;mN@*q#Nje0>Poq&Za-3vBh zdx{UTj?QUE6PJej3wzmMtm2@8HKr`-^3bDNU8BK|XR!$#`GjHx{Mtbhsgy`z^^Z#C z!T&%Y6z)v@F!^zmF={OtV-W3G$-Mbi2o|ULt1RefqcxN}CmqKeAF%W^5eZ+ul3UYs zCEOLYw^D%~RXxTj{_yo#v460OT$+-Pa@f+qftx z@3mB1g=7dYAd`3`Z|M{Y9$tF0ClLiyk@i$Bf9_q%Pcqf*la9J9(s=F8%8gp>3-dH$ z2pWTTY9X~OHauMWPU%__Hyhyi6C^!?=FRb3{~?QyO2z&nnj62*0txT1<=weaUa_GPC+h_1{<6C^ zw|u2tE*ZCxwqo~PvP9zgxYf?ZO*Ey;BHQAR@t4*LQsrktxO3Xp$i2le^V-N33HNMH zwe3G>s53#f?A!bqAp)L7=krm!qmW8Jg)p(GuZ`qIv|%SCjDd(_Goq`swhET}eK z{{)rCmTi1gxMUxwZBK2_k}MD1tJOVUj>Ya;IZO$gD%aH{4N*VgDUE!G(4Jak7EEc& zhLJpm&2X&eYW(jp#p zUD<}Lu*N22(}}8PxMbWRqA<1nYVmdB0WQDuUe?-puUm;^MsfKRadpZ^w^SSTdTUjPQ&~NrpvOSWYR+T0J;UwenO|bt)Q|!0B9Xp8wl$LawX#U-Ty- zhTm@8xlQaL8>%)ZO4);hrq~K{eOfIuH(lfe&51)@^6{1bt`KO;bL$m9D^eR=Xb(Vt zvYR>X{0S1zlktrEC?gZ6rSzSZ;7N#q@RTG)kcF~%Sqg!32+Y)==lNMy>=m0XpHXN2 z1~Ze_;ed056`h-TwHxcoMG7&tu9ELMhnZKIhHDJfR>_a@P+Z2n&52-c-dA#RqlY=x zp|&5ix=v`_p)t@8F3HM%cCuZMxemJ>A{$Lyo!XZB^A}k;D!o6)SFyQQ98>CVY$+q? z0A0<5m;eT8gbVaeFM*#&^1qkyvroQwQJ5{}zw-{s+@%*+V?t$MhjKr6=Sdvk$b`~? z+aBsXPBSJv3Gmmko>mEurWgLq3wi(1Q)g3x`X^}USv=LQ%ZldQou8vSgNOd~VONrgE^;STZ&r{;Enp*j42a zmnUmRK|(+1@45ThnUT!s~) z&Q(wT5l+9OB-rUdEg|e zmjp&am+vkU{#2*_f}h_HmSv$`o|TaBfIHpBYdUvE_@px+Bc{>Vg3F4HPT%4;=FcBF?m5C3>m^?2`TB$T>TcH500$EViV84421K_)S7oAE@3@YiHfc_v zW?tALM;6o=GLg9no%x}$p`nA_ZRYfNp;QdvJk*0n`1Z4Dp6Ok@1IkpJYXzs`dp6N< z!g>mAP99j@LKz>|ef0|I+z@R|_r*XgJ^QvW$8br-t$BmrL|iaVIxv(h^!abf8r)I~ z+lw2jJn<7O+H!sKkfHG2M9~5GVm0IxQmw8b_QnwF3o=fy&;C6q@EGUFG#qKtYNn;WoHfA$}zRq_R!TD^a2zwEDy|!Gj_J$k}uz2Ma zaE}EP>uiP4xDEwoBGW*Q43;{ydnO59ujM;erlbWVKemFW^?$$wdnz?^zUJn=tB#%L z!ifti1csE^cXIk(N|Np?U{6pjeRZSow*~ZojRa{iQhDV}V6_r&oPbnm)S@K8(9clBl?ByFmJENrO$wk9o8d`w|Zxy7EIKQ>78<(|k zSSpz7t87gWF2m562JIF?%etMMV{-E(+xSV&J+G%YlWeSptBBokqs^=brokm*Q|{$w zz}Fn_`O(`k-QNCaioV+->+2w>H7dNj1F0T9lp;mEi#B>^FgY1lejCOnfBCBP;F4`c zAHlyYad}VaC+Je(jok0egO2)2-E#aRwLJ%|MB?H^j_zXc`ZW|K3 zy=YpPq1c5RjUFlYTl>XHoi`(TGh21B0kUd;IKg>I%Lb5lV_uHlSnl_VvNl}s! zn^uzrUtOi&*bh<|=q~)>u0Z&k?Dtz1IURmxACSL=xE&D3BlRi_C3Mz+)ZCm!M;9*M zR!1s|Pr4U6NVGE&OjtuGFd@*h_?(fc4^F%;jP=Dv^jP{RwC3?(Si?IvefN{d-L{dYEBkVso=stX2(Qbj?to$T~(J#2u%CWW2x45{>jz8zm)W<*a6Z{L5qp{f`jO|)q2$Y_VQ`b1Qg~fF=PE1e1ZxTohPApoEA9L$rpS> zyHb{Ya^42;y>QfN_jqtK9=C+@O$O7mOHJg%TW&o3`jEoDP0Asrm=DH%*wtN*v_VQb z1ex|T&7|bjK))yHl;(CT8Y|AaCVc6mO6`-4fb5MRVf?3pU;P>~o4J3|%%3#~ss9)J5~^dzVdA7TYwM62LK-{svQIL&B^ zOdgb+xm9W_hHAGk{MG7cm9Afa+M#aOAF;#he0s8QQO*w|hTPp9)EKa?>ddr3yWehk zUxLCsg`gvBg3rm~FcFK6zjAOB-4hsQcXaXa{+HJg_8*VL8JqvdaJy zb!xqQ1v#*S*b$PmVHG2vdR{i5-_8L0N zfxo6T=<=n;dXHulMf(!CBS^p_T*+6?ht%wnO6e?WqL4odvE4to*X_9DUQz?tO5(+Z zg*Jgu`*6~Sjki)l(ahzz!9nauOZTCqyt_x2_jUMIx^3jcmc^W7U$gWANQT)WNb79A z8lba{dC!%Ed8$%0KO+^%pCIGH) zfPaC+u4!PC`@*DO6<2qdR#kX&!p8W*5Wwmbjp1*fP zhdY>;Mubh(O?eXZ_KUx7wj|}Px&V8^zY?=&lapSwp&fRE?9Dv#CKUIyKZh*~m_`5B zc*~hbP3I6lvzN}Saw|-i*blH*v?Z=b)~NqBvW6sOEY{!EZAkD@9$%a*T_RVxrxjv9 z6no7Vbkg=z<}*ck(Dwge@4MrgY|}LZK|rb~y+s8C1q6{MEfi@Y(gdW7fHdj720@B+ zP*7<>Kxsk%>Ai!XfV9v{=slqZ2ytI$&+PG=IWv1^ch2sdneUJMemrPM-lyEp-LC8E zc_02gOi@Jzl<0iU6;D=w>J++vtolU-2LM2xeKA|)O~odlG&Uy*vL`BU3NWm26m$## z&=3=ucbU}U7|$wbDPFr8Qt1A6z5zOjuij4h?>O~jfLGCbSG803GTm5jdFVq zUnZ$=#N9$Kt9eImc{8aw!>++rq0CEoPSb$Gj*IP7isiP9KQ(3Zz(X=j250a#`MFrf z4_-KiMSxyh-Iwi&w`2b%Gi7M8pf>F^evhJRUEN^-=qzEAN8T$-#vdFikbVKOE$l0q zg%xwNv?3pChO@tCSu7cX`XrecEd$kX-$2@NkQV+;kK(LX!gOE?*kW+q;-G5-tCb2O^Gd3r>wQGBf*Q(#J zyeaM=N(#L+u~U%4PmNwdC1!^~IQ9~2;M?MsX$z%!; zX$PJcd8ysYvo>HczKxu8ZE@`B;!d5E4;7q@%My^CVC?V zrc-rf%EF}QArPVJXp$s&_oIjo8MJLBu4r+>_+HVZ7fnBO@7{h8z#AXgg_6d}ABxrU zOa(vXaoPOv92e?(xcA{>{Tqq2r;1^7!aYi=6UXKu$W{Aw6Um1qBSjsf=@R`++qnsw z%9;T&ARn<{ky%>NMqzb>oCML^5?`An99UU1e8gE-ifpjkryb~Z7sdBn&6STrZYwZ7 ze)K9Wo?4cKZheetIyS)mQacj<7>$4LPDR!_uW@=`G;Vl+q}QNf7@?Nu7nMI&)k7|M zYjKXs&7^h)r}mVL{*-g!?OW=v#n<7K&+tPi_qWkek7hL5V?qEv2t>9GVeOsZ@0Rt> z6gCvm4@khv(0dpS8vlC@HA$avQc`dC%I_(e0Q~tRnNaz_Bm_py*oJ?8AoB^c%d%SB zHaHaWk_b{oA>X#B+mZiWWsS>e_o=n?1IZB6&w1XxZHDg8c4w7&spleIGQu_9 zh~rcc8Bc#IYSV`G@go9m-DvO(lhzn;RR;wanVwq^ptHZ_os1f6J=mHHDgfnz#aUh+ ztcdK$^4So3YYm@}9kU-Ac$gUaptN^QzJAU0;F=7AN`SUSn%L}Xr)S5?Irs!aUeJJ7 zRAUzr9IL#UST`5cbr1V$k2{Xcq)(2MUAyd)Spts~g6shlSC~Wno!l%3N-rK_Tgg{v z1F%}?$-&6~YK-_b8u(}anfNKd{qUE_-8W8d=lSt2!n)5@@IfUetn^rr_-gzql<20ZN&HGNlJ%4yz9{ZpRAR$5vpRqWndB zZSy!J1PE@@uCRY=fxe^Lc;#K!c8DxnJJOeDniqe(-fVrgX>ssz#yhI@m64FC>7@F3 z*7sNTet-y=pdX&)Y(0&zF9qt~qC+@2?r|~}`}&I<7V*s<6Vv#&#e4W4-UPs6M&m{eBg4Tw*-THRN$fhm zmVE@6Vt<{*S%5lo@d}VyF$O5}<%<{eF#6%vgNQ4Ucu}7#2@eTfRkc9~F|1d?+Jx@b zR7&&)VZ9w~l`EwK?Xdy1+bnPE&uFRJbrRnIykEihkPT`$SfS@WRGjD;P1vGwnHjSa z3EgF_1VlZp0KWd2kBLX&{INSIGR{ESWPr?5F9M*&VSN11j52|t&HOdU(3`QsAF}uV`p?vcbKdy-A`Ij&%b#(iQv9TwVd62+)J05#i8XVPl}>oC&)B zQ)q;~p!Q~r8w{S#Koh6$$Z)W-_MqS>lrruL=HV_jy92W(TJ#oWPMFY5awnmQ3PxbM z;zXoZqU=Dp70X4MJ;2iph_G9H5dJ*1@i}_yY}oS1q8Hu^#)xdbE@%vib4L8--7~b2 zn%Xe~scd+oQCoYV|9l&X9vHe~0V%rA@?h10UD+NrOOJI(9@12DHzhQ_-Y1v&TvQ~K^bS2wI)rM89|P3aEvX}vFf7UpcJ>UFg5rpVq(m*dESY8$dYeXq4Bh=Dw2DCAhrB1Qldlm9|;2&oug4ihy-fYXO_X zwrL-1s*bMYnbc}Xdd;9Re4QiVRi8}7hQtvr=m2tZnEF%EVaW{Gt_wh75?_=3X%2JvC}OA_Y`u@W(Rw!-2dB z#`>*WI;lnM3dp1H_{g^7zzSfZlF+FwjW-k3td5^N!NhjnA!x=CbPem3A3WexQ+C~n z+UCMAM1`f=xpG)lYN(GN$IYqsmms{$D}mM*78PQSP&!&aVB;`g?LUev7rK0!@^78G zkaLvyAQ#Pq+nBnp8$iOo(wA|^$E@Q>!EyKF<-+KdMQvi~ZveeNIvEGlqBG@wfSPS# zoq7KEhH@)Lua3k+Zp=S)1gaae$)q^@y6;k6S?i+thvTDziy$`39`AGbX^GqZQBDPmhYMYLd6iCj zY3qlvlXFZW^D{J6Z`vFA-#n^gQhC%j-TVaR*%a>d!DIGf1+2{0Wz9vDv;K~g&Csjk zw7`nOIev~)0l8QMhD)Y_2Mx}FtGF7RI?bTirIE2Mo2-IaK7@sHybFiYybIEW1X5&a zud+RCBPVzCgSsM`WH#?#4q$D#O|By7KC9_}*2Zl^5a$YCGXQqb^+ zS4DQmwZ@!dRTfWN65zfEMP^;TRH+0u+(us_jWzd4@fGy7pi-s=FHR&fAtCmy)(l~OI- zY+gw}GwYO>9W`_e@0)RV zo-}fk!9B9#A-Nz7_YnKg8kf< zSlgNMLNP6f*!Pv;@PqD%hQ6>!%S6sw{WlEBwdRiS=P zEO4!HSmOu{k4}#JTMR>!;V5Xu%-52(O1YX^x50+Nu6E{|AE4u(oH$a9FI8xWv)LQ= zYF{ah`(+#a`TD;9wNT+=MpZG*p(!Gzffgr51x;Wxlw@?kE!kYZaIw8PRAK# zRW}iNM{cw;yBGPAz#Zq+c$yz8$#o%$dCPM~(!<^XUP>g5B{sNwPN;meIi&k?fs2`} zet!mEiX@Evi&Uh&Y{K?5BJ{ zuB8(%FiYLGSbWsV*FRq*US-BZ-Runb^i3D-K703@1W(?NNf9}lx*UBe!yqmbAKb8` z@mXD_bEfllQdNv5#3Y*uXOoej!qL#rjD7bZAXPhDFT&jMjeWwz-5qRnpzf-k3}>tc zX^gKtdB^z~Y9IZjF5LO1bVH2itFzL~smZI`NhI$e#rrGZbs;G8@w)VrWoc#y8rbl+ z8$CYw)fPw`3A!M1IU*x^ONQ09KhNIH4ha#gI9KNP<(l&D7hK_VVLVzi>Fmw?D!7=d z<_wsc=EhYV108Zym&@~^-g8CThqOQYEdRGyt>2}-etOn_kJn$3`WpDl-H5zjD`q2L zV;NUosrhN~mtRpROOsh9D3fFb4;>T-4|T~f)J3ZZBwtnLz09M$(zR#<2D)cHiS%-p zHAPF5NE%_|e}H^6EX??gq-sqOES=+tqvpX4Jz`G9yp#Tl7|6Yf3U7A=j0=$e~Bwd@Ce)0L%T97M)%qMRkjpC=#&XQb-{xH)Paveyd5u3w@ zL{J&D=$uBLGuY5CLO@&O-cLiSFvlKZe3wG z28jHz+z(8|+Vr#*sD*sK9lU}MJPxEA8FslF-yYv7SemCP9n=g+d8c6lswQx^^A(~| z^sv(-;FR41S|&n~?D`QoFEY5FccF5`c8MDfm+5M%lBe;T1>J$sx6F8KnbSL;7x3e5 zPz?A)609X_*PosL2J)qDKZ9+Fxvc7Kz1?c`ahZ`9hoCROZf}`1wN0NZ51=(RzBw5+ zr84vW7Lfe!UobTS;I$eklgG2OR$G}cp{GvAHj9e_jT+pO8)nJ_B+>qcH4YOVZ=p9i z6)cpIJt6wCbDM6Hc5B00Bltp@iK{X%=IR-*MAy=QhdP3fEB zS(z^Nu;b0iVDk38fpil-wbLErO!Vk@>37}Wec~YL!^rE!|JFoxNK3FM7I*X8P9#Ef z_bTtjxFcDhi-!GMz$I(4HA5*u&+_LF0qe-{15{)tVoN$P8^u4~893sxEOV;!T#2xccQAEn`!`_jh>rsO%0u>b5tP$Q2|=*$3uNO z6a2Wt4_0sHD%AFAbDCnA^dQDh8(&vo#KL#3Tx!dcE03Pf(KSENyByaUBwi>GYIqmW zQ(8Al^VHXXR72d>U`sUj)NVu`-LQ$J+7qPBD)_pzMz~g-W%20 zvR`Xd+$TDKhF@!pLRQq7k*}$G2?-Z`O1P2V!Wjp9tPWB@nUSsGuRYhBdz%|4$)(kO z$WeWWD{QHlJrA&`#T(xflV@4Vxav&(Z2tzVTV%)3DcWB$zqL%!kM+K9&Lr@{j>_Ze?7G z*DE9}^_c>ms15qj2Hb{Yv2()dJdW9WVkQg(?Dty&VKio1$Zr{-;qr8jM~SC;Y4U|M z4(bEDwlEK4HUT7RQaJ0m88$fJ@31h7l$hL%#NZ zRKL4F$$P;kMSEq9u?zprG~|PQifI*V;+osb(W_v#Pu1LKbG#ja*Jpet_C{q17znYioNx*~I4{6*-r^e0>#D41 z-Vq-aZ%|oP6Q=3q%eV1J%0?wNj%eQiV$e~C8@X`drRL(hu5?dL+l!qwhORY6qZz`X zCHwDPT&wHq31+2rVWF`6qZ3UMTL%Zq^m@FK7c^9{~#6A!OMg zs%D+SS0$LLupI~bC4@!Q6QS?jlLi_tAxLzwn=$rX?gR~S1l;j$n&X{ET|;${T=so} zwSztG|Hys`8gm9(!g;{llcSABgET)g@Smg43O2r)Z`Jt)0!5mS?!9v6xrXD^$L1Hg z&vrBQzv0Dd?E%rFS=tqgh}W=cLO4=n|G+=Hpw7@cW7{BXfo}3MwXurEhAc#D%rJ_V z#a?8M$QE+83o3T%k|I>TcnM2zr(kw>c=wdxrg)<+ADPnQd##Q`2e!?E}TCruHjv$ zzesM>dDXLc%9LX#xV8`{p@?kiiDB(HJF z$CY591hnXP!Tu5|U}YR9%HOiQZfWdy)9CoQavQ&dy#RGZdvE!4x1}bm8U(_NbFV#u z&`+qR7*bc?Z$DG|s!53B`rK;AuqpBSrN$87>{tC#WIXN;vRoaikUV<0E@_+m)Rpsb z4H1a6-}Eg)eMrOs`sjIa`S=SA?`u8+h+qpxytEB?#R+0u(I2_v#TpT*)Y$S6W{lLQ zZuNV~p&X$2u!Ja%C(XKQrdYr0Fvb>D*!nOu^;u+q0?!wK>iap}W+NLWHY$H@z~{(i zaw@B!J5f-fn&P6E#pMH3&>cUg7o#f8Gj) zP{k`mhV67TvXp8MtqZ1kD($iC-cPB@viCGR%QhWz+)e87U$E_N!PR7v)~kCRLa5gn zWamEJ1ngCLn+*UR(Qiw?}=v$PQ|6B@4t+*0{R~X zc}eE^KVH&oG9S*l7x?Ze{z;H@?BB`#{(HFa|F8ZA#g@6+8beS0E22!;?6rEYc^v|e zJOS4PcsCq_aQP$O8PJ+SwxWc2Heu2~>%z&@a@y^N1y>DbWgQu4O&$6ES{a~X(MJ=< z70#%^I6o^2ck!18*PL8{rCV~hPVUFqW9QXpV0bXv?_m zc>-S*Ur0vLKJ}& zoBr-knZ4@u66UzuE9KMT$;c8$4WjC-lem$tJY}4R@N!^V`ZVgAc+uTvEVkM_B+j=P za4uf#?@*};R|=_d+$V$!<~IXVPB-*j$E#!$NG4n+TLNlXq-%j3DZEk0uB4X3;TS6lJDQW{LMw`?Iu|skQ=if z*eXH+S?f`nh1F(N1o=Fax_2~ zR3JzKBFlHm9W%U>I6A>&9DOmOz-2A|#?qahx%i(cK5++&X69=}&PR5pqqgVyml7&o zuHTFIIeAjJHcPqBa{VrnSgou+)Ri#sG6B3D)j%BC=mkvQVo^QQ2g4266lWm7(=dFbR}(x z%>6{Q8l|OYF`2OQBGV%e98Yd3Nl?U!&&ND@DSs72_&f--dCrHS19l83LQKNW5*vc+ z7f@8s3+;oO*PMN3lvA6Qbvw7JPuqQ&AI{ca9P1jCVY4+%PO=R=y3NtgTnEx;;z;wa zK(4Wq47mH~EsIZ}ESF5RS!@qLAn5(kzUTJR$x&9eu60~tTzbYK!6Z_#yrwVJkIvE3 z>UkDdAwHViOi`)5Rh1M>FdchGNih*Mic?HiO(jI;%O0Gjs9!K)gq6n{g%m=89LC2aDP@na2{A7kqt@W{T%4N+xcV zOH*~pmYvc?a9*l;7i*9@ykC^U^S(sJ7vp~3W1*(Vl9O-H=sia<(*;(2H^5fZDNe&H zj2-rStoJ4jYF9!lCi|IS_C`id6++FEN15|<3eGB0j}H;1MIR)&p31)r&GvRu833Yc z>$aDS<~bHM-6w}96na~9aVVl;%kSH-RHttC#0l7vxh14siXDmF(e8b7bXaSZQ-zG> zh`f>r%RG`UTu~=c0}Rfa_CQ0$rOEmjzDNm9pS~%ePL@>#Zw-_fUA#MD^1{yh_B|&3 zsT;3wg(Enz`8p_-!Q0C+mV=MKTw&x>-UXKwz0xw2R+(Cr1%Ze`AF?8wOS1kA>0YeS z#doQ-YVqVUZd%bJX$5*oAaPb9wimm-$ksLeKoy6<`%cm4X_yDnzGr3|PLKHlNff{$ z^N^J2^>15J{Eq!C)z)v&+~9q>DWq-CPmt&Dum9~F5IpV2%jjV6x=oMhVVGTb+-}jy z9{`{~zW>D}sCYk(H$(+P@o`&z^yn_gQUlcmcFmw789;&sTJ6zeA(}DBk%ZTH1(9uG zO_I1r{@kIgGP(YiS|e9YYJPy8vjRD)1AejlrGpN7{TiX>Fa4-;PF@Ye-Sk&8iLCUs zW5K)>7kr4AchimLtzy1z$-HrQ0J9!Hs~ZlWk^}D{^s|Db_yaH5DV7{z&K;1oEIKnh5NNC^T+R)u0)X=BSi?_Z= z8^r0!ELQ+nTOOd3E2GGoD-`!c#d2NZg5L!{8dG&2^t-ChkLJPb0+N+l6J%DYLH^p{rM?dS>no7oqN9x@;6$ap{nRiod0tXymm zOH2#y)X`gfq+X5LQt1xYboq@dRM8)nmd55W_T$@@Nr`= zbu35pjr!3$r6rhaz1udW3qLwli~2=V1R`ILWOwBlS@T_%T`?EOQxP+AAUXO@nTx|D z=+u!DKA>Ne#c5O8DOvymv4PmG0~9QY>rG@^H?P^27iK?WTLH1<1>?&40 z(CpG|d*OQCR~Sd+5kL-_j6QlH97jbhG=9H|)BIzg5nD4G=p^u3xyLuE-gbK8R-EX! zmZaD7Nnx@aRc@n|Ktl~p4OZQq_3V|VlIi3?{@M9LU$52|stW6G8lO<*UtEBqIq-Cw z?waQ$DP{WAD%5yMUkK(ZLcab~=wObwSZp1>#H|R4rmF0Zv%Kj>-+!$1$t@)`E}qYLQBx=t#Svx4UFvEIWtNGMlAo_mk(^8-ruZv~@18AFR&Gfw@NRjBe6VUmJPTuqR(5og?B#c-46T4me9S7N39NIw_i=I zh||sd8^MK31~*zS9VLI0>08A_P?jze5!Kgv>pkK+2_A5p(Y)yUCUO{!hITad63`@5 zTqlQh$yvMoVQDJHPs);RN;E5BU~7eY9YzM+<%C5CpG^&n4SA21yr;nnl4^vv};N_56uF10L^!+Sh;@a zncY6H1Ho;E7rnjisf$?cMLhKksB<-%aOUD_zmB= zR|Aooz#gQ4y_kr2rVOMPwLeiW_3stODPqk(j;nBwJQe$Nhm^Q`Z|4j59(bZbJ`$w( z6F_lJD~JR{@Q9rQy#;^C7ue-~|5>=ZtAMW4I<%ERvu2 zaKa6T0b;OO2CTLQt+L%qk3(}u<9Hoshp{8ZPN-qiJd8Rwth|5o;7$Ki&jh&R)T`%1 z+$C%q+5ectKYzx6@TZIj|F>gwTtuxyXIya$idX321Klc^=OYZRnPd;)_34|1YWe8? zvHQkIkBT@4lip@;1}cchCZ(aV>SITq5j(5-o6};MT|8Zp8Pv#l!;D(wV`YsFSA95N z_VzvajF~+2q_d$(ZDjxK>6nS_-g%vBJeN$gM2NA+^|1+|nh%P!dRG5^C}eav6UDVY zBn4lMPX5W+A`Du#QoOl%Bkv1$5C{Pp-L}RwMQV38A0?U4gdJ*`Ho4f^dlF8|zakir2ignum*$1=tTQT z@zek~`QLv=DE;;Ue|_{rEhCyTUe@;JD5EHQ zo@B-(iz}LsDe|}@52-1!PO>!v!lzL&GEAI_v`?SPs&aZ<`-923{+qM@FL?6ZOu2?O z9sE7$V(QPc)g(?a4uh&4YJkKF;ull$yOI29F@HCbzh8a-O&l6656pw(fhbAFd5eL% zcY-n@4%XM+Ex?#n!ghQo(F*sZ@=Dif3F_7f5Z+aT?uAO!_Er>p4P;6M%0q>N_n?iU+ za#Q~yXodY4`aLfD7mM$t2xsy4fbI)KE?%htU;mrYpYeanIADQTfWxZ)Gy%3s*wEVw z-{rT3AM8MO5!{&maFJ=X_BRZAqT1@@e2;}<&y(FYZJ6)%DH3KOw|{-BmzL*KZr){g zK(6>t=2!~c0pHcS@&i;{IeW_QcjiqJ1zpTi_yIC;XgUNiF#po@p?~k=|DXMPf6Yw% zx!&pTX`6rU{Po{tCjO(%@cSA62c$v%YiE4qcURy~uBrcMTmLit?r%EdQgIy_(xbxs zjt-)OjO;ukq(Z#($FDDaZ$9H46jmGe;J@03cP`{=zqiS7Mb11!NMjE{@Ryv2Ose2N zX#u7NVXSelRbU%MRrp?j7u1vh)ql(r4-|oooX(OP@PFo+{4=e?KkBpajsH=t#)#&G}{4tZKfkXv&Ko zx@`{qE53wnQcvr_C^1~j8|XHGXUZfy5+H+hSA2va>tQ`X5`Steem4~V%?!m~Mg#om z(*Dbhc_CUD;+UMTC3a%AM6q?jm99!I88S&XKYUvAm3pH7VCgdDz^&uB@5v-X-ycfu>CLh8Q!dx37mV#aQTES2vyLw&~(0UQb$u0HleR|T=ra+%|V&3RPNHZ z+Yt-V^nd~&XfZM19Iq;~l9eX`tt00?$Sq}FWQW1qapUeVf6>l@k5yHYu9B<4>mUF+ zuJLhWLaCH*VC~J-`65h{jX2BaSe2HwiHeQpKo)z6rwJmbcKYOwT#s6}`^EV);D!fI zKS34%F9hQckQq9YDl5{itTtRHzU}fUv*pnR!&W4N5TDlN-rE-nfVNfwe!6b4IDgJW zA8SqHQ_dHG<}M~&Ne3C(pqkQm))AN*Dy5%fv5t|v5Dj3D6ikT}!#!X1L_R85xlBj^ zeMd`Bs^})xcnjSJzf)P;BzHCK!h1N$KoSuda_B%Es{3Nf7J1%gDk6P;=7!zJR}LGE%VjaDuF&6zZbW@u=0HR zBq#@tR|GkH|1HpqV2+*d2Pp9+^_d6I<~D9WyU{FV@B_qk5puEtbgY#jn+E>t_-n20 zQi{T2Y>*StSv;>7h7)~3Bs!*6E*QHJGx}P$?sx0EMB*psoK|Gn8x(yQu@zR&>onpa zM_pKbhxxdRZ76$#;`h%pFEq9?hGg8H2$Hbl71JI0By6PAFlr-r% zV;POp$Io43R-T(?T~4@Bupm4UFy59E#QU;umK6(gfuRukZ8sLuKvBhEU(q5<}~U zW@x#SRf%2%67hq4m*})R@%`GBYQ0Q)HfGrZyE5TpBPLF|ad!t-M!2GTO3w9!1bYdZ zZOAg0>yuk8Y_SJ0t3TZoDdQ}<*r{UesY|*09Dg)FQEXT|q^-Tc` z?;HDiN-vAX><{HnT3#A&S#eOrAc=IHE?{HZ+C0Cw`4^+~ZWJ;SB@+9^^MEt6>OD20 zT!`BxEQC(V-)k(=jvl_maHxzpYWFRReomIB6T8r@x++Ftfnm&~zFSa*bXhypXBZ6r z;>4oT;u{~r&9tL!+*dieJ5|l~M9GyzoAznFlP)&hD$n+f=Xr~(B40HapUefBsPt?2 zg0`jj7f9>1q^F!G8841qIhX3$RJ&es%9poITZdc0zAv9clfUCOz6%S`tOZ`Fx^27bzj3tS$R?9LH02`8GW<{8?f!cQ z`~ShkAVrR7yjeQOk5ym5^SlXu9ns~`)S{(1n8?ErD+ zCx8z-*p~1nY#pNly@c-5$U>ml+17aPC-(L+68eJuX^v1KiN^Y;ew`TVV|$DgZ=?8QfU7Km=-wZ@(S7v|gy z*YFO`0%bK&eoQ@{sKL*GRW)n6a?mAyh_kQK2%Uk@XICUF7y4PT3PR> z6$)3hJCa6}G)(2X?(3&wt=qM|jUM_%3>!Dkba(5jMkKH~4I2SYV)oe|aFUjUumR@x(GCV`S|$!4fmPO`Wh`y{<0OJ{YaY zQEcLpq^%TquMMmI19XK25M*0yI-&DDtOEd%>I(P<0M9o-=|kP>bW946!y>tWVIFvD zBNY2Gf7-T@)xzeUNPEU*h_89@@QNK-2CRLL< zR{t?y*I`k6jQawdCnzF-SdN>$UY~7VzZSg{^X9%l{9r|SdI-fFq@PItyGNosKjX{~ zkWH$1Oy3s%>GwLX;s6`4;h)qA|6kGd{AWIg8Uz4G5;I{N03ap-0Ym(D_@5#e{r^_> zl;S`&OcfOx8eH_Rp5Fs))reE1KB5$7-IF?RD;g);+X68jAl7K-zuBvT z0hvhC3#W*@&IH?)a0+vW$tk{;tf}s!{Og-} zN8F>RHyeZ|AM8oZe$G@M>vWlA634BAmjx(SwXxy4aSvkJ?c}_i?wVG!^?wLpAbC+Q zc`okIyY%G(2T@t@%2bu{X{snT$3v}T6B=>!EsRO3)M=(Rsaw7}YOT8}4#9HU!>%wCfj=AU06WiITjj8YL_^Zt~Fz63m(~aaQrXg3p z3d#{=1;=LYclba~aQVLOw=lS(0MRFy!7E0Bnb!ki!kr&D;qC*&(T|*UsxE& zFE~+Ub7bUZ)bANLwZe{x&0t6?;3}~nSp|3C8RYT}W@cL4h)Oy*?Peu}ikHN9W{Hq_ z>l5_viutbRw?9>3EGtH3b6TW5so3ZWj^Ne*> zbhT7S4YAw7C#MUm608zb*}@VYWh%+LWo4~F!58A?z`?vaZP4ADwy=XOYJAXje}F;d z>UKWRA@LcuN*p8=Hy;Q$hlyqh6lK+rmTv9Qm@)CES+eQ_5+kjW^T0JsYzUynUIQ1; zZqthw0omH7OIPs@roieI7hf&?oU+!*Q5BQ+ysIY!I@suo{+5XC>bPXGK|ui%9;BEP zyL*2V^EHl{PkuSp8bYo1BTjI5ps$D)eW2 z`z{ZU_u4x?;b0`ohR6%b9nsC#s=~;zTYN=}(+nAxxlg}$E8X7jhH9Do=0x4-fVY0O z^*V<<{J6t4f>~UUeBhG4Pq6VX9CiHOpZ%9|!M}+*5Uv2lR2+-b$uj(e^izXT>j{00 z#MFB7jC)=k!OTV|QJViJ5^Z}A8Vki3VmeunFM%wOmg500Pn*taqV=OFH+gq`V)*W! zA!BNb1H(!7_7PfT*f;Zq5lP!Qeg>pV223RZkshgurLJ{#5FhkHy`)Eglex{{*Q1MkcJk(O7SGe$Sp(@lqYC{Bo2X_d z#|ej|?t&x|rl|9}3zFH-qx(`Nj3*7^B!rj@(%%N(AtH1+(KUmtiy1nFEhm19l=@Uk z&!%gX&;AZ@jzO3vGVH4d0}Iua!{tj2k#qT+p_~r=jF06uwoEGEasEuUmlG*jCoA1* z#j}V4FGqer&$gZ1%y;nc$y2Jj&9O<-bVVPu-BlyrU*Ri^Cr9TbRK3gXjEcRN_!cKe zOCa+S)o`husLTA;-fPRw1^Wdg8}*#Mk=8K(e&KZw^0K>v(Ursx&Uf8AZn_`KYsO;K zmep+;dUM3$*@60)RBSfWN;M*9=MzAOrOJoU`5LShW}J|K%xlS{mK>3}>g~95zpf&5 zaqn8#UE}v)z8tc>9Rlxgb@ai~@I;iLfdyHezSrgD1~)w2(F^Dbz!G+~7hnqe4w$gh zR>&S;(-Huak6HyQC}8vwP)t_g53B`9DOz45NFt>aQAQe+3g`I^3M>_E8#@oGv4QwyPVC2s_+140SjVCt3}^d{K$|0qNxd5&=ki9GOau zeR%YVumgO6d5@aiJMJEauA^+t`LnQO$UXgYd(k{>&e9u0M)Osnj}{fK#>sKOj7R(4 z%tNSccF%8q8ot-S_QjKZuF?hjB#3QZk|jp6Em_n{_EX-w$G$P`mDEGxMd}ZRXKkxI z6^hz5fGqLz>vX=6pyR?;_R9cdS4}@%gfX=@-p4iXw7bW5VKNO_sD=?}#e7^$G|)KG zyA8+rfe(t#^jjyWD!9}040(H_owT)@F6LNczF8`wcUoOaENuE?zi}+=Uk#E}nNnr$ zZeS$@LxC{$58mPyDVWO7*X-^3SvFOJc82O7-wTEMMT~Tt29@+PAwd5P`Y2^!*wkm0 zjaMR1m|7BTMk2v`R{-&D_F07ol^A3!J+0H{<8>v4a>_kws5C}mfS2^*hEA?E{8s@Q?guHZG zGHuD)p!eN|vu9gA=$Z=|dE}w9&D$e$1q+uS;j!Jrc zQT=ThmUD;+D_c#-_8bp1mIs`I4VgO~M^H87bUvLSNsAC_dHq-roY!USHoNvN*I#pF z^NEqey%EO=88P}>HC;#59MDj|5e2S_`ds%?4!E8sEFI)s=dUy3nDeOo><;+Ws+tOn zYtnT3zDjn)6Jb*6u=^JC z|J4NFXxp_^b%LxADhw_LgNK=)JMdrFR?*S`s$Q(HV4PaMcY+gFW7Q*$h}<{jf_+=# ziy1D@2S0hA;uYBx)*$$3!=HpiJXj4NPt&{b1Ed}f(2fJ#ogn=%oce&1QkF=s_t$ud zbMbk7oezWp2p9pavm(yO!9Z^irZ*N9H z`JI;$_Ilpg+ic#{`(R_oOrxl%Om+E_N-->gr+-CffEW@6TQnX7=3xSI2GT1UsWq8Y zx96UI$3*=-j8a1pcQ;iG75F`~DH(UiBxf zCK3l~ih?a&L^J^LYltDOCP{cdy2-FStv7r2BZ+)RmJ7BRmVOIIu%PyR$;|G?_akcI zSSX)9z@o=07K$U!#d>P_?y?ltKfc5Gu-^oDlPa#T<{z*fwSA$B z(>bfGq=kqI@OG;dX@4V8N)qJ#8GnxxdN2ym$XNZ%>-`p*@P`ig{|Xu{MhRq?yF-BT zVKhsQR%pTlBzRpS&Z5HwfzDOne_dOxwR#T%U?JoqLG$jj;epIUIhUj~JQs4)6nq#FbRHPe>==6U|>O4Yxew}14{IhXoJ?DJ!wnBUbC2<@p_1^tWyfBb_$pLo0c zO%@!yl#ok9&!j#xznEYWV=W8W*mz`yhI=FN-U4S>VS=4~{UBItz=GNFT+`7U5EY&O zAMCw%Sd(kEHXfu&6G1vcR6tNf1VMU&g(e~b(o0aJOHo0JKq%6s3kV89K@cgScZl>R zy-6qZPC_$~!uRf(Z+^csd!IAc%=ykYdw(@2XV!b#@u^9>$!w#;p(<) z5Ls&*ov>9X+5y1q6hvR*5Y#)y8 z9Qfib9?B(!2s-yT<#|#?cpaw3+kR2~$TchZJUwmVde{L#M)|vo zmc<=QMA!~3UU*p0Z=8O4rr_^ z5v2YsTfd7!8xKC9VkBH30WAApWZ(~Bfb2UHoB`lL{vs$ZiqivH2L%8U?x-L@YyD5s z_=&&B(Z7Z@!v8FGuTEmERRWm<6hTom>d(6Jp8tb0vZb5zT5-U-0=NUI(LFG2)YdvsgHX= zqmj3f@;D2CCfh?Sk2|2AE=o{bLkq+7M8YIe|3gmCEol;*r}@1KZqzmVg8kDn7=f9W1s0Ju1F3sCTa z@$N6yo9u6N6#pxp?SDhX;vaec@$UZv@BaU5*xf&}LjGm0{VS7^zx^)}hWs&_(H~0-Tw#P{X1Z0!p--J zLkk1U?N&^Ia^dma3)GnmZdFRy!QD<%#jFHJKK=0zbI#q@VNfriReMa)60r@nOJ=r! z);wS<={fuvb?|`t=C7&~e@|5Icl&M=K$PQv6=-9c58xTgx>JAcO@MAyp!NI z>$2+-f*w8(;GJdL@bhND|JRB&|DFO+wx@qVFZTTY{~oM=5{6^^gVY=zn~*=S3HcjA zi2W>8Qnm^1)1tAxn&quRbPQ+kNjX2WK6J=@aO0SZ&UqDs)2xsDPss%+a{sH#60rOo zvJ0$#mG>}RaE3EO=XDXJDwQM9#|ISP|7bJJJpO|{arqw&gZ{yc6q(gu+O8R}!Li$j zsO`Kz_s0E$^j|x+9)Do#@oP8y-}UvsVEFL|XsdQ9R#_lo_NnhoKtMpxM;_rt9>=97 zqpR7^GP}M^#L+#{Og;jMr#{@<6e9oh*ZLVSo=!J6iP=@#R5d^9S7IVD193g9>1@Tb zGz+SaP?c`cfe$Wv0bND%K;G6$mdj=0D^;eoDNSASZ78{Fwku07AFS$p{(kAQ zUu4w&?SB3`pYpXlqDCtpXJx}*97H2xP2m`0Q1EP!nd6iS9~OCanBbAKHuh?zJo;OV zjP^ad`Z}GMp*Err`5@`961jC&y)`d#+&x?IkPabUh31_Lg-;RbWaIs{(0ViB5rT%t zwW^?#8|Eg(7b+fi{Ztfa+Y^ie`iaE?KFx>7W^Gy> z6B$m-?M!zNz0k%c@9I459QEZw-8;-?6mMYq_)5Ef+x7F{rj1T;Pgdz~y3+hR+nj&) zvy<&OH8~w{UxiPE163ESn`SHkK4X9H2!wP$0>!(JG%;M)uEZ*RFB^{S2()OtaQ)P2 zw-dGLjZE!~!6nO?w;~J9U2dc}>qg}(WpnHzg1%vIgeC7sJj?pv@!ByYwO@3Sa0s@5 zU2cmyQ=)xI|JF_FFMMB+MfOY6p`PsfKDkvHbRnWe#yk}1TRz@Cm1&GOK!vpF{1^~2 zyGGz+1o<8Rt{_49)Lr*Td9OypMm_mowF=8LM>ac!oNr66ild%zrhAI6~OVIwa zR(L?Spt3R7jPjAFg+|&oV(?UQya&ndH1T*y>67grYWtI{|Tr-J&XMU$*YG3UHbe?>QOnE zEpm}9*{S2Y|Mqil@e|mC3CV5qr6u_U6+pXweXu41!r3Ct9IFh z+dG4pgvg08`s?lc!O`%Bkzx2!H_*fb3=}?n0m_w-0Kupy1x11aD!uvz-l>cSi>T=I zbqu^mk`T!IUE$;05eQSdhd9^)`X#g;fpA};X!|wj&XNaK&W14tgoc_F+! zc&7_~UZt4P2H0l=5pQdf*9LIK5r}j-3TJfKLpT65*?^BD=)R&J1#EDt{Q)hchnlbh zYtve99ODIUfer?Me+W4^0S-J*I*F|gAUHu@0^fQBIs&np)$hAQmy$`hqKfN}K=LEo zEU&KZ2LpF;{8Yztb-V(P_thWDTJTIqY>G;Tn>yNaFf@OPht&q8zTP3oNayt&8^dE0 ze|&HqI~m8W(?7)_%vNdkw&1(r%ya}g0eHPRBcwk&o!Z>?&rgb7q9(@t;Q z(4|O7$-hnH0N=_w7_rVEC}K9hX!D7cCSh*e6>FFN_9$j#0xnzq?4wP&d3ZPnOo33^ zvq)thG7RB1xc`3FmLWF)$`{+_UEIltgxHo5zy$A1WRn{!W#X6P$n$rtg#7O%T+$N^(n6O~ zhNXdC+TRs*ABd|7`hr$%PTU2eps;B$iH^Wn7PK^rdgHRiP}&d_L>KB;l_d34l(on) zS&2Hx@)mm~>j5X;5?-&3OdE!xbxG|~YH;`NbCp;M=e&;gEAQw|z2~MfJavCS_&f!c zLtepa4--zJNx>@;JV)kn@pyIn5y;snUDwq4DOD%e@j4K9V}gOt0~U{5LlAk#H&)im z%9ppFbl5t2V`ryvS5(&PKf)xVf?beI?(yulc#YbO8~f`VPXh7xuw9j!6db;5{wgr; zsw0s951gc+Wf4vveua-(DA1Qtp8GxF32Q*iv4!jaO_OoFG!e8<5 z$B5BqVxuY{uHtj`&65gLdSc(^vU`e+eOll}DH(K5>fB*C#t zUI-6UcoW~wPZHP~4L{`niNHw#@m&lMsRobYV5CrmB@zP=LeAR}X^%iba>RImQt}q} z;s`|93xt{y@J1d|#}R1vu9pmO$IEbBGHi@#9c*YC)dRzMBLab|2D%*g9f9cG@WMx+zDt-T65U6@df1S9qs$LG)_pvWK#l7J z(Ie2E)SV*`6)?ful3)xT3Pj?4f;C5=`WiSP0`?JxX@wV|h|Gvn@R=$w>0%Vl0yPRe zh-NSpW6F30I-|1x`W5xCzQxYSuWsnS|IE-5z8{dHYH%v**Y~4Bfb=u~F z0H6M{K0$1H9SJ-}RwDv;HTVb=n*Q5yAb#Yn-;4i2*!#^qK+*d??7*05dK`fQfVlsF z3v~;Hjs(Ql;fDf{v%omGKnWV)Uys7Z$$iG${MIGpuWv}}2*g;70S4?<4}lxN8`_2r zS^tw+_)jO_My0^p@+DLO{+oM>`qktkdy&7Hhu@9^{+2?(nsDL4+OO|v5dNE~_X+&% z+JpXf9FAAxf7l(ztMSjK=y)~$Yud&}EIWbCq5*QQ|MP$qPRBj4pzR1W)|V0~d)E6s z2GW93`}-~BA~FayQ&h)EHadl{&VZ$LIL3 z{F&o({I7hA<8%BU@T8Bu%3piB$6n>{ALE>{fnkhb{v-71O;co8O8!Tfy z1T1Pm*DL9)>=6Zm>)x}hmMENMRue}8^hv^E+kCY9jR9rFwwY6)8D~{w7(^6a4~Bs4 zlD#K^Fh`Wd%qBVin|aaDgvpQMHz(-(S_I!*Yv&JDRiL^?*~&v*F?>OAlk)Rq9x+#H z__{!IX~UHmb#7`krWW1!pqtvKZk}b*6FzXlIBihkZGaDy^|Hvs(aoBcc7H~T#j!wE?GxcOCWvQVLVP7;rw~pGAE{j4thm;~en!+)prq3DPyzZ=~WqEFnYH zg%vILbUwwB@x`0pEm%-n;<3%lkBF<>+|^PN3uMvyFAFUGX7R&+Qh|*DbJ{1SUK}22 z95c3>l94aC?#J&tQwRwtUotD5-O$>FGn$#*85bBY5|<5rQNpy_4X54F3^LN*s2sM` zsfIj!vfHZ1x665mAGo`&@ne%9hsMJgf8;Xx4ipgA)1EIO=db&jQnKhR{%&O~{{(&& z6{P&r=vtYG^-G!6s7S49CZdYxwiCTwc`7}YZiOrEX<2+jd)#)u&w9XzQ=^a+PyLFK z1j5~ZW_8ulcdc6&E=c{n-AkfA7}RjR%J^}8Q2+dlsa7eBVO;I}qyTCYR@vdwQ)zO> z)cc9u-$T3qceuu*JcM)}-T=)}|4a<%*=|T7IZkYXc7MQA++=ls?x((Y__DrT*T+>i zu?bKjt;wPBUU)1wNx2j8^8z5{M)@i+5IS!(09~7cE-3Q+J#|ID`!zm-@OmxOQ`Bj9 zy(JQ-J({7OG%@TjBzdqgl)Nb9#Nu(|ny)y2MMR?vr^B1CHI=OZ{L!SzwSr(Ekk3Lx zWZShY(6zE_TJNs2(kB#3e16UvY3xYF8mS3N6+S2fU^j1qTs1KVYPZGg<$x>5&QV^;t#mrN?%h<2r!Z z`rrD0kci4Ci_5{Je}i**v3g?wjPXW1Z%zh`v1-O6x`T{PLUdS0N6;S0$N!v$`k*5o zA_A|!in6oW+~9IBZuoi7YA`dr`_lQ|z3+j{i{Qj(5AHoTe*-k|fbQxcToPE5>-n$KU+)J z>ciSEZ;K9(uj!W@S9Nl@Xck4k%yUZaEU(G~cga5e*>VCCa?Z3T1j6f{HKT{Tt}gg` zlPW87%k|(X@<-^$JLs}jXZqJO5d+&QAkyGSk=x%|`G51k`E9wre9mlBhArEJmmWXi z)0b8D@(`2_(e74F=g2)1Aq(%4mmnelTdC|liGXUiM`C&i;bU$@XUzru6M}`6N-TPr zzi(xxibU^t%Ycb$p>nNZ$OA~mkg=(zM&08CeJvC5H!<8frxn~U`ig2PS+(b`oc`{x zQ0FH=P06K8&zMQm1+x7I>yZ9#`lTLwXc{{&c<=(B+oq}S&zlu4KUu2{$65*gPVlwY zh(nr;mdG>cD+dAEWrCX}j@0;iKWG}#9C-$(2Jp#b6Y(+d8_1`*3=RJeZo&VYyH407 zR-l~DDZ{*Ah+vY!xHAWSUe=C&Me0Sx!T&(8J@~By47ZqUqP(DL$ zetX`cXaFg{AH&pH{-c!h780)`GM09@k;b@kB8(7BjDyd7o#Mic%xOrWgPY-ut!NQ9 z!^F0Ny0UleSv_*zZ6@l$ffI!69cim`mTH_t_cX>v#t49jcON`9JuBG4$cfu&fS-}* zl2RVov#%bPvvpOtFBn9#V14IF*ksIIe==HCo(L~tyaYH53?vzxqG$+$ShukJJv9P! z)cp2s+b06grGy}9`g<>6or$ke3nFnxpwXLys9l#qGNN)Hpxi~+ zw}WHU;p2CAw5zMjamdg7I$eC9QjGN|gvHL88_j)o-y$%NH~UDUhy{5r8gN+Mpn34U zA=dQNRl`rBTz)C}P0pTY^>^2RFCZ|FkTl)lBSFQ4FXV?2pTZWrp3T8&2{$kaIde$v zRk0OWws1NV(}~WM!j>8rP=Xcz<*)wVn}jH$g~-2tLXp)80LO%-7wiizQUg50*tll9 z-uTwv+rGP^qLLgJn3vwVK$IVmo}WuwssUuxDc|GLGuGNIu~F#Fq!&*jnP+S-&bDka zO@wS_ROmk<_Uk~Wcx=cIxjxklpxK*yPIx`XoJzt9qg&D>dDtK7l!lC6(LUc4{XO_? z40n*u9z{0AZk;$bF_6TIgK1-t5w1cm-i)fRdt6=R93q8A-lS&4s?w%0e^&&>Qi5Ct z^=FXHD4Ym=ul@CvY4RF6hG7I9tHy1U_(si0@v?-4yO&n!?y2$UYO*ekNfFqr=X@f* zG^IjtPM;>~8|C%#+_JuRc(U52&NJpWDuVk=S^dxo9`ZV92ks_pgTsh^QF#p$+k^!> zQ?8%7xixp;hZis^(gdtLni%a=!pLY#It@r-zt_dGmW+t0iA;|=%ouzS{LUuB(=M1c z-im!dy&SPvidMIs|z<$=zk^LNFLSaGsLER54<0#SMui5Kt^ z7^pjEV?@t;u6D@PrsT_PWzxqmK9QQ8gSry`^N2Xrfoy zq5gXCdM#exON^M~#SIPhqU0}24ti%1r898Vmz_oMI_j&A1Hwq`m=^|7Bd(#x8(sqv< zePJb8w~}g;Wbmy`(Oq@q`9Z8yM_OdAt}!-$i$uGD*TRL_*IIvr(z`tRXjCY=XtXLD zaH}qM;W@HY$0T_O5@Cl#qvb%^=UNRX{;WbWYwL0Z_or5}> z?n<4jh^BgR-b6Y=e=}M=Um31&hD6(me*$YH7Jnv4_Ga|IkB@Pw)qXhU0j@JH$cn_Z zmV)5QCHjlg>*RO`T<3n(`xaTJHv}n*kCX1&a_r0oHJ>j^IfxgCbr@t$3*%dnr9R=S zMhS>?+YzI>ycawv5pOi*cRK3%!i3%yR~MpnA2O@WkSVg;Apd+w8Q>(gn0nBt(WQpd zYr`0|g^SraNqTY#)Q;xGuQT3r;|%BZWELfn;9mGl5tNqz%@-(d+6wj*XfBGjEH5$c zy0Lso;kJqTb6J-TV7K&nv(CVZ5gUA%@%>cH3HP7quFj26LiifDFY{{099d1}LuMK3 z%d2+_mY;JlUM5zdY=NM`ryWHj5fxI$*_Y?qnWth>-k(g@8pCI>SXTL=LM+;i9K`$X zqA#TXQ=K_6%13?;R)Y8z0iGR3Wg4%rSH(Bai#XVIV};66W+~VYD(T|3jNqk+mOR+L z8xc{Xiw(aukT!&@f$oE^jx8iTj@xi6Fe;lxTpKG&;Mk-Dd2=dxN#alX4Alt`^Xhor zgIjzAdp9I5?KYa)MIlyh?F>{6x>`7R`k@DhgttdbqZ+Sdo{u8M;y1vm3TMs_viv~^BY`1a#)#&|KDAn6P&G_i-H!YZtzW%5p9;($=QDxbj3v6EN6>#{H< zQ1~h;?1z!u4E1lHOCWAA?(o z;x6|@)rojL!b~@4f^l^B%j25LL!Xp;dN=iQTbtis^nY{%+agvgw(9wSdSi%1e@S!$ zaFr<8ajtmLDX1R-YE^d)yG(0UpjMOfio%sX&-I$#`5&h{nIoD#9{XmSGxmKIKInA9 z31@9sWHwWW>>-23SbTUZ9u?_WWZx>f>M77UQS#)&-VdMn!$LfmG=XA(+ne6-mQpW| zYb1&H&zzaI*(py7DW|w@{QX4eWBPAr16}#4OjxZz_~-v5SD3K}io2{CdbLIY&*@$@ z)irfVGAHFmQ_Yj?lRuwz%tWhntZ*uy_2=-v_FVotiG~xcE&|@S8>~_1THI;k+89v9 zhY}}qpDA%U%+Q}+dJ|V2*L$jy1W;_Q6q4G@R=A6D>-YwSzVTDRE~5*)l@+D;K*IRwWkw$Y*~m^!r2qPvwf1 z=9zj~8op>&%SZ8+@~3ak_+P#&M1Ign^u6tM1#tLd?T$dFBt{uZbITzYd%12jUT=JC zneyP>w|hY)dTnGrW^($wqp0z)GX*h{t!XAm7FnRoW30MMkj?Z3x%3;QdEo_&>a1pgaW;4qK|om#Bv zF~G&yK3!zE04@O%)gou(@8M5n?dHNmeE4FG<31XR8GNdL7x44lHv6(1o+!-S0AciY zf8W_6W_Z3uW$L-C-!k~+0R-`espm#uQ4 zX$0RcQnMU`40cFo%0$qSO%BQs#xE9?YLeN=`k$eIStJ%K4PedQ9X<}fwy0bd2sAru zI$b;}W_X5s&WG~_p|v9Ka7UCHr=!~|Ssj|+P+Ix=Q&mADbB79#3VE%kgZ2e804>lt z{j0E>jG?)?HdpyowjRewjvS>HF4=!Tdtj@Rj{8eKtt(T-Q*UScI9wz%+~A@OJ7QSf=annQs8l+IQ&hei_KFvCZx z0rHx6bvMx64}v zcGVuW%{>TRn}reS`yO0EXf~3vp_AZ_j4wcx`Vg@hwV5}ce3G?>^pY*9a!jpe6=L?ucE>$-`X zi*9)-kcUVzXrHuXdk|MUYUZp5QC4?W$@2)x!CR8rJ-Nf>dcsKDPZ_Em_D(uJBpbiR zPQC&QK$R~w_k^NK5;uT~xZ-@jFYQigD^*>{U>87M!J;hgLDF21dbn@pgxCIggMgxI zH+UA^UZXA?q?2)&g7yeW1_Wa#dg=D=n#mfha(6~4pos`N}aUY_lw=NIIp9mxegQwjmsmg9;sTg_Kr8`*IQ zG{1HD(Qf^`U;5C`8Ic0=c?++Xg<2t~31@KRXaq-uET_EXoCAbGQ)`fR^WAOtPwpZy z@87D$x>pS0!!8+RMZAnI<&n=2| ze|eDI;eXq&@+Q)d7*pe#;iXJWs^fA;s8p!GcA#w;_D;o!YWBJOK%z}EV8=z^FtK6Kt5N2h@B0>XXorbK1r%DG`!vD3*Q`WlzCIZRN2`|e-is~HzIBoBh#pNfL$*;%KT>eVE3=JnR%}j@IN!0ORhXXBU zd9FIuI>4QHzTY`qk1;qQ$JDlAri2&ry4hPN=+g~8MKDY=5opr3DbpJW!ENVnoHw}o zn6EJMq2*5wK7Zk5BT!b>4?|l$wlTB!wBuujP0@|a^jDs>eAIpD2?DV$)!o23VS>$u z@_f#FDPu@6@K@;Nvp2ukMc)=GdY!V_vEyI3EpF_uU_X#^;7de7u6k(@Gf?*B#1t0> zWp!_AjbR5bxlG%|+dL)7uY1mlo0w2`&n*?wHu1#xm7Fj>2d*(fZY1IbmL0EbL4*g^ZiSO+jB8WF7SHVI=gr%~e(bh&`KSP^${IR9<^^n43s)rR{Z`Iij>Zuv z+7(HBu1TcOpYI{C*>OH0CV7cozVsx#c{ng+ogomzNw6Uwh0Y{Ew=I260k!yf#z!Fa zMP%Ag{bs5;2TOlQwqw2Fhqczmf$@^= zKWD8%W)*bQ3z-aMxNE9&Mz#An#ipOc=9pt!<@IN>2xm@A@4F8`&f(%_e{N9Drf}aM z+=UirhEtWh(!biw=bW-{K2spVZ_L8?!hfN{Jj16KUa#V%AQ}pPycMeFeBw!ISxGGi zX(MI*3<_PyeK3L^A)M*iSHf}Qf%@czN9kTFBYP3TuwF=)LS9|s3wy>C>l+KPx8la{ zcP+HBh-rhS(jt{WK3iV5iD~f1qG5HX1_{)2)1kafL%XI%7sG5W4sLMJNAl3TD7ym{ zmtHV9aqp^@)j)H-QHmq{L%W88fdRK)QP${aI9wZ#KcC^pY2ZTd z?0g@77mEIlDrP4#K&}Df)CFYD;`dfiz^<7|gn{Z#dTI1RF5`@0Sjoj4^l0)cccf!( z>SRhfz%6huG;Em%HNBBu0^bD@1wQ?`Qv^9Cm_+yD2y_l$a-;S}%z#7sseK=GCJ9_f z?dQS>T1J#OHE|omPrJu8iG}A~;C!I&lxfU-OO+{zYXMvB1ATez4D~aJ8(;t`f%O2d zpFUhe!k2GI9zMd;!`napVv`GaPSQ!qZ z@7hX_7ODfOl;hq6eE9Gp?q@RqT7M>uq{@{N)1gk`C|VreEb0~}C^Wwn9pEYv&T@mx zJH9?_+oAhqkoC@!i3#S1E+ftSJdt-u*<85*~{wC&V9 zqo<0A(NgEd>GC%CLKC9KPT1B_0ZBwJB>=4pH{*3;vVB=69A|Pv|Ktg?mGU!5X`?kP zt_E$o)Rzru%WqNdYGPpfL&PMAwDIT|j=Lp6uPUYCYku69f`U4|*2B^u?N7I$E8((- zTpJKs()Vdflns$rL~yn>`0?O;DTUEg%RTnt(fN>kzQ#bo*w=3bV>3}aby9%M;oLL5 z(XwNVBcI(LGCSSF8DpAsh(_OquZ>Ly;>6O zT)D9n-M#Bn#+=ga((TAj06#^xFxaDiuJ2{y&NTj{8is>csk%2tf@Hl*e4b+cWq2*# z#n(P4N@ef@_5wv7@eAql7~xU)zAd)<^NXBi*}&2tg+bUcwUY51jxj6M$)bjfcU;Bd zN)1j_`KW<(bxGB2ty3@kt4Z(b5GPy;#cKOGZH1x>jQEJwmV8R*lRwI=+C=29C+kGh- zfuBMAwf$S4%nI)&iff$aBYqKxDBgS(0CRH>hxN-}O0)A38rjtA0i49lnyM7i`UB&S zu_};`uNok@IN(6u73H=^F+%MteK;mm+nr{sg^7?&kdJ1`%9o#7?U9ftr#sRP#e!dI#vAiLnWi_P%>g#b1_+taFd`dVorX>vGU96HqOMlrlr@#YBB zsh+`OzgtYA6QM66b*7$mA1rE|#j`($25JNz&XcZC&nfce0CNHS#ED{%M4wgEp|OYy z6r+PY5StE#{se5^KyAu%1m><>=PTrofyUlj=+ptNp~r9Gu3ep~)Wq#oI9C*j7CF~L zgLB%yg%u6hOHr2dwr(C+**~<*mPtV8iEiX)omV-}7bb2P)j^}%ZFm!eh2kzO5u%X* z3E@XOAWG}357ao-JHqF|7&lVY+Vmkqgr^gM=>_+R4u*$9!nF0Kkd%0h&dICS0>ynEyq%a%HQUw>OUV(QFdrq$j|S`@hBh0T|W2I zg6x{xnN1i*Cu$T0!yRBO?jq3BL6Nm{4%80=H{L+BO}rx?x>iJa1*#<6Zxyco>Mu7^ z>(dC{wt>^a*QuR|_N%KP9GFB?2|&z=4Vt50r@x`tN^DDb^jh`mUcIuNk5pzWW{ENI za75pX$(TF0BzSh7B;YfiDujh?sNmfu2qFWHWsR1(d*w5d2Tp<(;j<2?i~4Y&v8ZK90Yg{*gX6 zSNtTO|H*kK?Otj|tW=9LK?dhEiwcoq3Vn=eiSy1b;*GpA;}M4KkrRV;My+c+!ysm} zHq^g*=@N5lG(L}yj*E1cpBv5!<91Mam}<$?(kVvU_I}DVfNx%x&ru0}57>dhpRrEg z7(*c(zGrS^qifB^uGMb6ZzRwPlo4Y;h zqZ>1^v+g`zKT!SWK8P`iIkS+zwrHdBg=VB!?`IMt<(1M+-QCP^@6ik@ck4paQitcX ziW6uaKk|>_7Sq#~uIE55S)+%G(VBiRjFu@oiKV5M_v6eK?(RmegJbTZ;Y{4!p(m>I zuVoVq*`yaQrQV<wwA; z#q;}$2ZAK9x)hNK@NDZ3jzA0EUcg%^0mmyY4~7TX0$|PAp*^W}DLf6S8+I0M%|kvb z)uh0-xnnYTRdg=d0GZ`STmOPz?R7-Mo6C_CBN^G+5t5hqa$+xEDuLbuoTon9Sd$C( zU>d7(-U2?Y^Cg~_8G+cia?spT&slgqKip~(em5CRHML4&8!SUybgf`72s#2~Mt_%*#a{{W zUc>OssWd>jeYz2>d(dDr!MOHe3C{Fb?i?#iH4Afo|5@FvBGaL z`=3+@m}nn6C32On$ern_>xI*jjq~_o1Xgm7EyaTE{UgfPia-g(UB1^1s#8*1N&tL~n? zfc!8w7^@4v0`87`c{{9HX41NqYdA+t-H@yQgmX4$BNJ)hl-i-WE+u9wEdPOtckD}^ zn@@uXp0ym986O(;+3?QCBo2t_HvR z+zt*aedQEbqd^^##~Buq|M6Rl+zW#GI$U#b2-_0QmYuHt{0l?ZrzEE8jk5)Z7SIR} z_5fF^0fLgvH?*~rKy4!iYQlBH!ZUq^_FzD3*i}eg?fK%iWu$P{jGX!9$~n%JNFZeN zs>}!Ae5VIM+#Cwuy?+03rmN>x#GZrI{Fp7}#*Cm{$j)N>9$%_A^_of7R0{Hk=os=` z#p|;^*Z{^%O}n39THNE2nQ2#}OvVx3!%vx&vx@>fXtZQ#^4`KnD7+JlaQbDj^ zba>o}zph(Vs1rl+=Ig5&Ug+IJYmJnA7rb%8d?&NaVNt++#FI=`#{p|?;)Rp9cs8Gn|U z0HdLZSX|RayFEib(d()dMJ*Y6dcQeLS--*7D1L8T*^^P*+jp@pq0hx$;Z*aLJoYRAW^3A* zKtCWn{+O@_*2`=6w)(>_R@2K>64Dlb1K%#cz>CrMh zWW8Q)UssB9-L@qcvZ2>rB$5vq?BKxtwNqn@+@0>5c^~ApzgRw+;KFQ$$X+pW%;H)2 zN)d!%R$S(X)$VrRB&_A(tiMPcTDGJvK`ov2N1wE}E;26NF)O1Hx$1!XNm8=!$%P+^ z*>^*@fK^&ANPLANy)IoQDFBmbw6g{#y)oK}3PNpP17c;fEkLtfgz;Ic#pK#TmmBG} zXE4!A9r#=FVPu`j2z*}Z3w)#rb;$WCE&KmVR1`~g*$vz(c(s=QZ2Qxx{MIz^$XLl= zau;UYSg_Ws6o;obiId4>QTrbp1-F}J+#NA2bV6^LeZoMhRDd|03j*%q{lzzFFLb;?_W3FxEt~FQujC*x(tyX zDoGlaTjAOqm$rP7s731Jb>EfumK~`zHo5KQ#4}V)9i~g4D;HoUf)!Q|8qfl8JZ_&K zc{OA$^R3VjzU};SbnV=PjnmU5sMXuAcwx}=_vB}uKlt&==8Pkyuk;(&!gC_XT?eDi z8=5|>>3HEKp>lSLLh)?bmA{RuS!p(6{+OQc{cT|Fr7iI05v@7n`KxHvg9
*3tM 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%0Dc&6{IxzcXV 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

x%(oAm(nG|PO+#bE6(hx5Z!>kxbX;1JQ1jW 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

c(20! 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ⅇ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 z

@Ud-_q(9={b<^}fo24(%{}NdbkC^5jYyg&>G5K} z@_sS}EY3M8KS8oTL5$D~u(k|{9sGcu1QhUs(_lYAd;nR+;73k_tl8syDMx{ngA{Ce z?`1%_)Aic#r6gIp&1AsoRafID2ni4a?GsKY@U#<(wF7cG?>U9XZ&h!iGLqjvWqjIj zm~C-+lKQASSQ=YOl3&CF7KE9Ij(Gxm-cQiZkpSrCucV9?M-V5<1!`0i(owN)?X1(e zl@0hFmh8ulqP4nV)9pnv@lC4Vb{8i{zep8lKYYY8gz&POG+Q^|wA7eZ%(p1e2_B`K zJXUl6cl4$QuIU9coXUpd!aY9n zS9_z+pH(&vW`^Dz^ipQ^8>-lF0!wZ`&0vc5QTCxq8_SA*_9qf8s<3>5MVkVkG=4O; z7p?g1W9;rsm#{Tkr@3~g+=21NDPi5=>?_}V+^0I96kRQ{hTBq?4&C~7WBjf%7yYHu zv*hd`QM16)gv;ppNY=+WvK*Gr=O36P%Jo+Fhq+|y%L-}7hsGAUAE%$3zGpleKMXmE zvwyTrsHA> zT~ts%Z-saW#8EuFibomy^vl!ihngSER)37MzEMkLz0)t57&|mU>q|2)y#EHb-8w%F z7-WaxQYnn{N2KbiL$+Xg1!+;J z0^OnpuH(3|Si$Iv^u@LX3b{qY8ClamLvsR~}Kp*EMo zq+OrvouR#0SLnx2?bp`p>UDfxz+dVoQL)cOtv*RwxpK2OC>GWNfuIlwY%j&F0~~dB z<`ML?x3JrJw)^BwjvHrp&kICE)Ods?s)H`gayfVR4y-?LFA-1EH0F>QLqLDkG|E>Z zh?0TqLlibgm75a@b{j_Z!Imt$2Fb>@h_jN_v+8Qy`$qT0)%J{;O#O#{E6(}XW9EQy zF#IJ6mh3iuzaNMmw6%RSCJ3|sg>_WgJ@ASPch0bs`pwu%Jg(pZ0h3lNw9ddYR80x~_b_mh5t!YlxY0Sb^A z6mj4emv~7@nj|5hW;HG0M#d>#%_;}9wj_lLtx z@jn+jB=eT*1H5+^*ZM(33+h3=ok`2F|9*oWu*{c;?6mpd(KM?d=g_<@z|MNwb>L>>xmmL4>pR(s&YocswB z#e6JVzL|?b&;0NAHxIAhe{C)QAJZHr$UjopR+{7OnZc9A$ohjcfY&i1GFShA-O)Te zaJU|ax5MGna0mv6Sa`TM9Bz$=k-=eLbQl*NhQ)_z!eN&5KRHP>)ivY4zgENlb?lGD JF!0Z*{{xhk$lL$` literal 0 HcmV?d00001 diff --git a/blogs/serverless-llm-architecture/images/load_model.jpg b/blogs/serverless-llm-architecture/images/load_model.jpg new file mode 100644 index 0000000000000000000000000000000000000000..e4c185912baa410c6d9db29ffccb87ed8732fe75 GIT binary patch literal 276084 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

l= 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≫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 qUNVl`aekVU;liv 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 W)`uSY)_9fy2s~Z=T-G@yGywqRJ*CwE literal 0 HcmV?d00001 diff --git a/blogs/serverless-llm-architecture/images/save_model.jpg b/blogs/serverless-llm-architecture/images/save_model.jpg new file mode 100644 index 0000000000000000000000000000000000000000..75411716d5a767721e15d11c42422b74c63a1b18 GIT binary patch literal 213737 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�HhG$_dRRUkXj(mXNlJ8H%<=rEC((w3uWFs%Kt-T4F|aKq@@;V7u7jhY ze+Ree?9cdlb2Mxwf9+@8TcUAxri|UgD~i&ID|0JG7VJ}2y;~YL>c_+BG?z34_788L zs%e)wKXfzs8#qPVBWZuo0C9)KZO-qxIb1lqg`dLX+E8>f$n)(9MXnd|8t+@e3 zRh7gF6QoX4p}=wePiMDNnfQE6c)nx|gz3@oUL~pe#sjku>W-Moe9hLDW>I0g#)b3& zcOxsRF}d5CPo(W#qPf>+g_xJxCJd;%ziG-iTWImnJs-SFNQwBCkH*@_wi*4srpW-( z!S}{%52vi4lb2w9s5M1Aipp=gu08|E36srB%jfR^;>2O3q}-nE5vj3xQd!Sp8)_P} zno@iA#*~4HQqUDJ=DEYcy@2^o)D09v|M6yf0b=Z|_N~uTDy4R&x+8DlLG|}tE=jo$ zd&DLWFF5huy|f^7&^ZfTQzt2d!K&i?Hq(eHz94Os>G9&q-fEnms9}~`)b#@SqO=E- zsnSL?8A3k`^}e_nza299c;m6l$nJqI$e}bT36+~M)DuHZXAx?p!3OO*yibcU@^9^i z>|N{AFFJ_W7>cBYa@g60^f25yY}9kV$#S)~gZr_c!4^B|EOi9U4HUni+;-DMgPviP zSi=v)-qC$6%)J3DGnhV}!bH0G962@?ie4&}Rect_mLvsXEdl1KdjxK`gacXvP|%_m zj_fD#9tsnJ_T(w)RQ2ipV&YPB)o+?{^%LD6tQt}*O{S+3vYoAMtDG#MFEN?#K&ER# z{lYaV9C6*(s-IlyuIJ0y?f|gCcuT1V-{TSjMNEn{;ZjI`1QHl~pQZkQ94k6Q)@8k8 zSmf><%x@AqbyDjmM9M6-U#jd_{lwxM8n%<>5G)jL>NzU24aWXF{fdYq(y$Z6`Y$O| z)w^?FrsQ9{>#~KmK6bsD!6&YN`6yH$0imQ)=@5)EsBr4Bia|`8R&`VGzIsvqCTE37 zzZmKegMQi|`yhAI#bu&ykmB*B<01Y}S}4P$K?V>Y-#n zq`1`)-m-?fp&I%2(Mi|6d09T5dLLX0rq7JNA{kN5<|t?FKnRcey24B}f5YJBY!u{} zlw57G%hM}nc4to<+|=hiG0*aa8486!klpBN;M6(l@zs+>`kDP{d~n-))Y|w98)k(? zRMW^%I7%LBp|5{4fY!(X^>NuD%0G+wo6(7oLOHg=Q!_wulncg=xB@=(BWgFAOZAjb zT7%3O!+NW-;h}cxXh%D!fAU>sEOgH|xA@|zpJVx&2m4mQ7fR-fP_%m>DR}Mot+Jr9g?9e%eUy3Iyd?d=Xk2u~K@F@&X z@K_&BqksA3Y)>sq8R1(2y$`+6)Yau2f%*&Ro@z4p1*)m;XVh-L1)$+N_o2)yw=7#= zKm354ndH2!XC#bMOHn$d(J3*nvF%TUx%&0Frdn=UnKKwv4817JyIbrWkvl7_Y_rRg z_s3Dx<1R`93QltSJRyJYH6b-h;pcWmqt3#zjh`m0%<8^a54E>M6h;(58A3{BTVTXn z&~o+AhEragNd;3j?6+>v-=ls;#RZQy==GJ&)O*DRe0E=lAtD zN;cTf4G)7nDBPEu^K9j$Lpb1_!ARg{Gn9Vr z{a{k~<(F1^h{H)bV$&b0t91V?juI1SKuytujp-q-&tizOsI~Z62;VYQ%Kwg$Fw@i%VK~j@D$BS_ynB6K_de9fdgXALU;mfcJz0%^BH8_uQ2$TQ z?hRAOf6;UQS3WRS0_6cCo??tcIZel^q1YOQqQD@ubog^xD0888OSrOq*d#-wt?+eVBZm_dXXMA6E zCSAw46w7L|JD2}b*5Lo-um2JC{C~IP!e6c{H4r<4ndaY6?SEk}L{xBCtI`py zpbplH(5I$O=re6DUd{%X)%zm3L*5d_HW)jwCvMu)Hg3=28>}qsdL?l^$dREpDtqB% zfLSC>QV0C>@I;Oi{HmK$JrtzzGx4CJiv#0KJY@Lr%(&N_ZSs)3;B(F&YhRZ$Irp71 ztI+=Ny_+9Ltwvp|60BTD2xDWP-%3VFF$Fq{wiE*oYsW_gv?H?>{ta-^dtQVK&<%=jcV_ zW1fB?I_1HrlezO<5hHqzci3VPW$L9W^zIiZh2E0TLkgt!Qn@LwsG6O4T(eEyMq!?v ztHoG`Cu%WmUb#o*zS4k{+vfml_R_!|%o_X}n1*uCr#u0>=n@a@BAOfZ01^s48Ul;5 z*BC^oUMShAuCI^vu!A8_{mxq9I@H-2qc+L5JQ=;F`UEo=y zxK^qYp@x1B7nP|TX5r#pOHJ7-Ytp$%2u|aAC7R73n|*I21bU4sg1AZaB6wYd@qp&7 zNc;=$stecll#AX%NQpFlK*)TphJD=%%S+WnND+netyZvn4Q8&hZ|qDgo{w%sBloV@ z_41r_c%&&SASn6{`x-kMwb_X+^&|5@Oo+xh1x2HcHQEZSVWQk|Tmt(kZ# zwJu9Zf9*HT6= zIoklGJ{61a&v0Of-f$o0P`E{9|FO!Xyn+KjTfkG6iKjX#jo1+HJ zuyW5Fdi2~^?W2=t{Twkzn_f}g z>F`YfHof#b=d;6La-d!3i#7YcGkLlam+hWTm>bFp{9?-H6eM_(c@+1~;?0Lf;ZRKNb%&h|Qs^ctfeUv1HF#o<@!O1{29?BoanEX)K7zx%fy0deIKcTfY z-dRxglPZ4yDRd@kn#MbbDZUNDze<%FHkgL%R}U52E_1~NFjAO$ zhXb)2A7P2D8E`LoTRB{$Dr=Pc>`r27AKO4K>I~&W*G$GI@%kH#I|F)153pKt$aBOb zkT$I4gA1D3eRbu0YS^xDENg#in*G$&$@|q)(``3TrD%61^0>%KQ4{_OCH2g!nRJtU znv$mAZQLJqd`b@zDLQunR%ZJq)aHkH@DJzC!}iYNQ%2Ihs(h0PJI=fZ7;unnDT%*n zmR4=RX9J&pK6yW))iV-gk;OB1{Bw%W(k%yee=+oxrfJo(IVEh%m~a?e8}7)p?=83m z_x1xmda?jUsnB7j_9114$kGHgIB}QVq!)HsL4j>~Ax%^~g{|hoOM>|+sgmv(+X0Bx z04yEU$Gg~3MJloqL*_$MHDT}S&J??1evJriWLb@^s1fe8S-E?japI^IiDT+2h?(1S zd?hp~=%^9D1{Z?ii_3#Q+cY(ZyJ< zAK6kHH%_pH;Up`AoSE}K9xcvcIi=1P-Y=UGe9ATQzbW2^`M=nE51=O7K5sM%3J8cu z2Px8}ibxYAmWL)HB1$MiL_nGlkq&_l2Ae*b7EWvd+?=k)_-!&@|@}K>T=1Bv6=dK5ES_i8q$P_k<4x=%@`f+TOykj7e zJQ;)TX0Bojy72h~<%yTyz{`bzoc(XsoJYY|w!gDwp*sKr6H$H)g)4~dmBEg24ASso zI&FVKjQsc&8}@A$wkUvRf^vhh_ze*+QyX$gZCO_O#I)qHO!>jZCwBz0wHmxPK0i@v zEfIG=Zm!$a%G!)Is{dX2zM-P!es{p!Ny0aV_l)`OH@&KedaL!SWRnl|YktY6J;JKq zD)lRm21GamjkkEpw&9%j%rlPJd5(K)aq+<$xROiG$c;)X3cjnQXa`(sxz7y=xpXcGcx9jNLSQucg9oJSx}s5jL} z(e^|hE~_rq$qqmQ!XBP>$ke`K8_oV&Z^O9F7%(5#J8*E8uS+cw!&)Ag8{yw7xXV_E zgwDwgj{6^9XVX%}U+gXvKqv-7yO?NxDKN5~n^s)-)otTPoNW&l;LpLxnU>dlsZin& zhl&ON%s2k9q(Y5_5z=wOuV|M@0NYDq0P%!b$q zlk^BJ8xsoIIQ8H*Hx%OWzR#FyWNXWpKP>MisGMaSzx#|==*Ba)*%JqG#42h&Qjsi0 zIa>>I5oWXDEy>i!UcHykh*{5c6)#7VG{x@e`XbLr&vAl5f~ehPPalg-)Dh7*2L?P>O>jr05v zus4cbEX9UFr}T4y#8h5mfcuk6@j%wY?>aFL6)8PFjaAxKYA>uE22VLFm z1%;~ba&-m|+um-_zn3tl+fpQn0%8~}8oKTd8n}bZGSp~H2lU@R_~Gjf^X30XOz*6JVOacAx97j% z`~LthxpDaKftAm+nZVl604M}j0)`q5LZtp2W-N^YaQFZIQR1gRAxE{|>9sdUN|!`m z`&R+{_l^0t|7AhN=>(0c0wgIGP$BegR8Q)KZ(MIX;+Ewakz+2R>)tg8=omj)UNg-n z`oQdNY<860Im&B)W^9KJzt$*RIZNU6Y`rvtEhM!n#N~X8@Q~PReeL{R>wVdEH%Is4 z+>q$R3XhOY^Jucf66Lfe@fCgoydz1tqxNETJf)EdA!pxDR)~jcr;4r0ralzki}t!C z$XIfw68fPQ5RBpF{Y|rR-<^GCd61VHM51(@Gka9pda+4EVW)+6{U1s_(INk6S1&0V!~6PjP(~AgcGgOO%0o?)nGy{ja7?Ew0OBM6V?rz%9);R!B|=gu+I_( zEzb2*=tHHooqifKSi2&|VZwWaV$ezBesjo2W&t-T=eKvxr)#L?j#5i!nKJ#Ag2}ve zZ44%prU+O%5SrFnRj>rCd->6+<3B_E*P>zHlVGL> zo1T)R9ot}3c1)fmh%cXmwt=CepCeBDW$npS)CY;5_~M;DAy02DhyD8oVr*|XADmKO zc{jG3im#>_q`W|_v)TSF0zXIL%`pdxnV`b@{0K^wuf@z7hhevG){B9mK_DAd>c+44 z35BwPDj7I|jA<@HIH-b5hA(2qx8@~3hxtlKFOyqCKBJY0uK{D zHcO17e!hrc3+@hPAI&ZQt_2m`%r3N^zJJp;vG47tgpDL+^*h~Xl#sJZk5&@W?qa$X ztk`eGU0AH4njU5RmMyl8`B{Y1+Yly@=TPAkSMp^)(Zh{B#naY0xt2K>>bh<>$HpEX_eiyY#|4#@FWb8q8-jVB~vwO|pKeJZMOKsi=`- zc#HB`?x26lck78R+-i_`@epH(9_i&AaqvDFF4H0s`-0!w=gjlJ<=TF;8w>=W{yAt9 znhR<16>tUd)B?Zv@)brN7o+GIdw*D3oKiaTJmH8IYzJ@z{woWA;ZC(|8SK&Uil=O~ zJ<7Q8B_G4ZO3Jnk&}76q#j#?DanC7%*@phYJ&@$>cF;E|TjAJQNzl&1J`HB{^K8>* zBWccIPWa7udd{6cYvle!!gJy~QDs?(+#%!S|Xt=)R}bKi_hU+3{=fJ2ikLiSwK ziE(HcN_`f8V~dl7ZbMg=<`?-D!Rkj5x%d$pIchROK?1QGW!n9%rvq(jlQQ2=lEiGJ z7Lh_N#^iy@lPL3KQB)FaRONP)xX%+_=4;BK{Zec2cfw_0)38Org=u2_bBM5jU)b=y zw-pB%%lXy$`B7zhWByBss#sX3LcV}Uhg9yr*3YfEA2^c9>t14GC5cvWI`lKQ{ z*p0H3LM~_Z^rRQhF8Fa#sz~L;cmlc+Jz3O&J!Q7IWmWxMOK0AEZpg7N$+Emhq2$5I z^jF&p{#;eh)bF2Tpbsz(hdvUXbR-hW6X(a`>UGoHV+!08Z}Io+G`Wci*AX?P*;}9B z&;Np>FU6{)}92{+1AuZkXTIqE2_HPI^ONXu+O9(qWLg1p67?L>$>bVM$Ejt;m7h z%{_ks#?ZP`nxjcY=Oll7oXxNM>^=(xnRP0u-hga{YP#7Vv3dy}Udgu3cEb6&rPaNf zWLB|TVcq`M+@4kTwx-`=(tUVUM348Z0|`TB3d{UkzZ3%X#6q z)Z7lOsFxPCn$*x0t6|i>jcc;F26?|B0>SAmzwx@}a$~vK!^6iG-Vd_S#QDV!3)n~- zPHH+uq87iLCtFnHSEKBb_KeBxIj?;3^LTcd6>K0~C8~$7g7B0&? z#MK=YEa-GE_v#-jDnDxy7UB1` zdRiUdH*VOpJh?I1)%E0B6&ubJHV2P_&ZPkZ9n3td z59As9*tF0kt{UpOU8R4B=1jVGq@kK*>rLlT+`*%@nI-cjHaiv#DJ?MarlPy}mp9l! zd1FN}WuYJ=l-?f2C%7AQ-?Sx=C{i5sc>~v4GEI2&;n3n&*QlbXDDxh6EvJ=+2@SY- z?K`)QGnsD=!C>oTBeen?lKJ4=C8>{K4^Gyc-xJTyarcJh^T=DrEvrUu$2|`Q_CPJ@ z&>1$oRMeK;aAgUzQOMxt;yLkTjYlz0`Ymz&`3; zt8-Hw-6AXH4sq@?UoSAOud`{!bo zgp7atD_#%GR*ZD7H_cLem4RHUNZww_XVKkw`SaR0`+h+mM-rj;A+2Y&$`SA@5c3oi z1J+5Pn~Y(-?vu>_CbQ^l+LFPA2lB0_>y-Uncr|YK3bY%Fbh26mIplB2@&{R~Y}TO% z-*85DtqL+a*uK^i359nfqM**gd=w^XZG9l&n7jL4T@YQXjYKS~YG92{kyi8SC}ibJ zoPt`sl@nc9^Xn(Nl`aLAi(Z8qHXVE7`gBsy4dK0*|I)7agqNe+F|p9kDI1z@c)NMC zd{4<&-m*c8=0o;xrzYimHUCiaY1=7h7QJ!8O#v;-GRM+TUO5Uj)A}AX?@%W11Ii)S z{QhcM(u$k2qd@P)vQvd;JPI9sq@HmeHQ2>0t}SeBV9D2lM^GGb&DbAePl? zzJ;^S`(YKXn~Q;|Nkv&)$5PegoX~5^AtNQ0ADK-rdA+NG=AMu}`2HE}4-?ubPx5u^ zIznu?W6?J{{|hcWB{Dx9*)IC5t2vT$!^!s!O~JaOkzC2T$aDDWXe|ja46vE%Mg$?K z3Hz4e#21p2U1w>1G`l3D@dL&?Z1;}maoJD5d#o`S3A8JZnm zq8Y()FltmSiWbRr5C+n$oIfFHfcxUfMq4QQiGJxwtf5wc^oGJk^7cDae2!$xvsl?- zznEO>;;;0P4`oE=?ZEO9cht z99l>b|0m?tI?|ZvR4J8UD6glVX;ztF?y-2)gZ|_DjAAAO_V{7^Endal=VWz?m2oVV zj&hb@entM#Sn>Y-Kd{~k?|nk%q~NcO1UC9LJu+Rh-nc&+GJC{z?rBlJSD*vXUU>UA zuHab_mc-}qE^HLm8Ttx)6y?Si5v(?#m_IyugCHDPQc_%6D&eZ*yjWWuktRPb%Y5m} zE#+!=n1)aZC_%?D#0e^<0!FGKFt?t2tfHgFeQsX1?$wMJD)px7_cqbVX4EsctI=H6 zIs8A(iLv>aYdkZY zG?QX{f9cx|WLc|ch|dKYA$Vk#wGs=o*7l?81#y9OQJ0?@DtqUDEyi%h_&PQFWlg;} zbHlV-V}UjEy;;SYr{v%WUtfx>!B@5{Y0OgfZ}-S6u2m>r73>S43nQC|_XM{OnH?LR zTE!_7evbA=KNotQeX|;FucR{FyHk)akZ6XM{RGZEy>_S&u-^Slty9qAm_wX`PdM`@ zmve_Z5)D&NtFOx$r(Ev(c%Giiz+E|dZftkb&hdDL10sJSEiEB z=KLJYg{2V%Z``kv{~LVqKfx>fZ{rfi{>|`_u8XEf;UHNN)|wG>aZ%dBp{Xk z2lX8w&&4macZ(xJbbmh37e5oCgG`_62S!xuwsXBcil=nu@<%0~@3(R12YUEE&aZml z$o}ne4oqm|kW~kQ>>#8Q)d2n8NgjT4Ok19$;a%6u|J~f8%x2a?PPMD8)mCmP>^xuW zg`C*b4zArElN_ZSrD##e`+y^j`2$ykRgh1qud$A(2~{TqO^&2Jdv|yv(H@5Hl+T#Y zcW~aAQH_U@%#6A&=<{LtNGPzazfog?h1SlmjW#gRChMyn5KykuMu8_jY4BD1Y{O~C zW8gvHbkm^4=#SroH$U#yf@Do@(D_c@^e2u%YNYc%&w`U zhfQU7kMs61dBdASl^NO#2BY#18$Q>^WMwi9I7FIH*~Sk%H@l-Q63tH%YlGtrvE%t| zm!ej~8)I^MWmCL|Fq<169(Jgoin!@?`KZkE75Mw4+YDWBI_yLE4-CZLznwem>3qe)jey z$g#l1Fft#lCzGG#P=XZsUeDm@fQw^qk9RTA5nuE4i@)?O#C1TV_Ce|UxEVsxI(@8}qM&7BcJY&@m zzQc?|aR!e8y)A^m>_l%)Lxx>}ev}96Pgd`2mup%Fh%?J~-J8^vz9m4OEPNbW0rVh} zEVj9ybIQu;PY5qk(|c~RF!lDVC3dp-h!*1YF@t%bCW#JDcmcPK63Lc8XW-e;62Zb{&8vAJ1>6Y!DuDp?$-H)WAC>+nb0_n)LIW< ztDs#DrmajQAE%A_t0flBi8ty76iOe4rFup`TW8{1P#I&IIrnZTCS7kqjlvyByMjIe zU0bjKqy~A}U1cKZHz(@6PS^+s^uBIx0VvzQuecIXKb_7nJ%z zXTHt2?we@OWEK6Gv2@}73^%`(qB>OI_bVbaJDcUD+5Hg4WgX9n{8%K{hZ)t362DO6 zq0QGvzfW1Wa6UW#O~U#)pP+ha9Z1H|Xn>QXr1UeO#><6i$5Vq!pY1mTeV)K-fv{7oFuF8N|akQly;i#pyy$US8XW;Zj<$;pdTR z_#6&WkwL8fZaSBP>oT1zvlsm-xJc;zB>0xN_dT1R##|uzi$Qh1Md|}0p`|bFU5V== zlq8lPUJ;0T9(;jt->j>)1msRLU0{kCv9TeykrSpJxqli>;tB$MxnsNzsPVda&2#j; zUW1Iwdc-#+NI*!T4*(y!3qg$xBc;!Cay~bY`6j%wwUE%fty~4^To9ixu<+}^g}1Uwd>E?yD%_gp zuxgtun;!U0;`(@)qnU7qtyw~1tYxug^uks4}Z$(W_H&?u|x?YLVzOd^(Sa<5Zq z>>BC$e7!m{35!3IbMNH~**KwdU~s~QA~}XqbO1ayXtppiIE_WqW?puid zgmU8py(M_J@VX$VKC$Jf4fpSqn|0QrP1(a*P=9Y|r(p5S!wqKxa>QaY*IRr|XCr;s zE1!3~%d+kIwEX2#1w@4K$&HH7rT6{vZ$#aa{c^u@m-z@Be!gKUSY=>^zddoDRbkBP zJL17`#oF?yYhb#wnUiEp`@MyDCbK&l^ru<9rxrg`T4-%PsjvJu2cL8+$sdMlu`A;lf`bCoimv00CZ@NNmH|Tp%ZHJ;V-qhkfP~i zlp%gN;Y#^L=^l0jVJ&*jT^HGUCGu5wOS$S)=_s@gUar?%2P7koP`L07d+``A&0|*O zd|g4M02Qm6xwiO?bh+c=imRE?iM*si#~rN0Tt6%28o0HotF)7ZptRLX+Sv=!7Vd8E zUMGtCDtCS+j2PVJ_2m;>JB)eB>-HgbW=17aI!RO%^6_If1fmW(8G=p4gwJljNym_d zE74RzPx#P1Eg8~Roru5yVF=O}ymkOZowQE~r}0RBowv5SF&z1$=;|X8cHz&@xSl7d zKG3Jr8hZ~f`RhDQsSW%~HA7w$1$oSfR>7vQxR39gxwCKl&lPeF?;ppEC0%*7; zrd9FBb?Zc(YBgUQp1R7>`bzqmm$P1;WzVVK9DJecg+)d5*|O}n+`81DLQs1wNt!OW z3w08KWXMBmhr-iu4@(S7H3VIm)c>^*t8y)C#`q0A5;<+4&ZluG+X}^-8v=pcWqx$H z3fqe+jO)jVUgrx{r9F8X-`g7tE1KvzIs#_EpJquL6+VgN!x>$lQ)?|To4xua@wV%< z=;j8c&Yw2;vCQgX%(m|8N{!liw)*Eg5P^L*+G#dc>N6MYgcg6lsX!(|J7` zCFHhIF`-&Id28h>H>3QLd7ezGlp7|5m~f~zPu`-lQ&(THcCFQo5s&7&d)ffpt(>%# zY~y6rntscC<*#wyfFLp&46#T$4ZKchdauBkYMRnp8~Dde*sby>Cg$Ept)Arw%}a9a z=2JMz=fWxH5I>5pyWN=W97Ed103g+qmVz1+qEoEDfC$r@%Yx|Pv7gdAC`3O=S~u7g z%XmF-)5MEa1WX#TmTAV9Q8)D?_~kqb?%jq!9zZS~u`t=sTiU)@wApsW`>OY!5Fv16 ze3|Xa&(r_suwt#JL>c;Jie0Fxt2EI3A@ENLmS2M?&B4Pqo;B7#~nAsmt7nqz)3 zAUu3aA^$+EGQG#TeVWo%60p-ed!pWPK1d_ddWByh+n@PlmSLc?_#G%07lndq5=Bbo ztYItMtLLq6sbns-)UvjYrZ?<*PW5uK%8*}W{sG+@+f^={B%$UVpDPx7t&zN0d0Hos z-z7$hqb^>UoNhHmK0Pbbb+3$3U4_yd{0++GK#hjFtkppyZ&!vzqaNcozxZfYmhs(t zvHDT%Lh<)(`=d7$9rm-V<- z=DdBN!4H$!;dO_bd(F?sVO#dX+`&B7e)gon*|v$BX(!qxTnRx8Ki)7-F&ki=7KX=m z+{jjxTQ$@gsH>oG^DLv7D^;EGqCDR;zY?@>(AZ}#rdw$7Q77cpYbD4})3(m1J)Y^F8~`_4}Vk} z8&?3FEv(WV#l<@Xd$u1Vz3<#TF4(RYKug!+!bL&p{nW1FAH6fQbmHc&MT+BZ`h1qV zfs){&OjCd!MN;uJYMlCeQn;3;#EdikvJ8#LK6LnB1f_;!B+xUa-y?YtwiehZ3Pypg zwN-BlxysE#daj5S6lV+WI^PO;ff`t z-pd)45n?od_{>#T=|kRMwxqEo6onnr7$DyZoR1@5uk}<59f*P#2CsKFaW)&cpV#yc zd&sx89sfOzYDz6`;9C{uML8-8QM3jYb}9u8Z#m103EJ0Ic-Mp|ZEpWj1PHTW6o(?_ z;m6h|2?B6Dx^?AbDh|UV&fe=os1p!aQ}y7`|H#ZZuD@~?IHl*{uJix;I9S9@yyPr9 zeWx2dm=;rhJw$oGWn*RQUV|Xgjsz!oRC?h1TYWOc zjZS!1)hBmGf66JXOOkv4_%-`9U-(z=9kJvd3P|}v22s6&e?n@)fqeDIA(YHYvTLF7 z0_3tl2ae2GtecxN37_U2J04h+#3olJRNNDo*my*j69QF-&Q+jy^iZ2%W;*2^oJs3| zZo2^D0(RXR%pi7ems+CQ;s>C(KY)rFGb@5QxKD_?)}iM!sceMnE7!VW6kBTnrDzO0 z_x3c%V?TGi7#WWjocZ{X&6fD%7Q?&&1|*Cj&8W@_KSx^onj%$gb_}E>O^T?Wef9Dn zp-juCB^zF&Dep2+Bvyk%0nqbY@bE1DE`}c|L+U6&DwFQvG8Bm2Ej-7&wzuwbbnQ&F zwRWGrDkrL<+vO0Ip!+A0>cYB7Klzs5%0Q@qodsf(McEWUSF_Cbiy>-QNs=jJ0 z*@4n@Y^2UD{vKZK9Iv-HUFA#v-XJEkG?(S%;`RPtTa68z_^lZ1T*0O4mlT*ScYf{^ ziQK9vU(w=qhgZRU@ygmjO29dpr@Snuu8Lv{u0VLt9D(;pwO~#yYyVE=vt15Bn!YFN zCU&!uFdKnfE2;r1$+If+=lsRb-sOI9-1yEhl-|UC8}wx+?{{&6@hh!+dFIaS?Stus z?(^o6(w#Ds4R*25pBmfV|6*lvn4zAu8Mg$a>-Mr&CQuuSSuWfj#h$B~d=+U+f;Re_ zr5|7jlss2(6#V;A%k+&P$3`K(kxdj3`A9Zx2-r;Kv>Tfm+mRydx9$H40W#C6&bbt| zmj+(l2W}Nc3Z??G3h2i@+tXb+4!3!dA2J>@g~T+D?Fr|t5YujDxaOKmrMNkqzJ7X1 z(=O&(0R@uHR-7~1WNoQr?0FDCEvc6%4*rI!8uA-!K7YU+S71fTH!#_5ALu>jKezBK z#35N8yVEaJNvf>{p?4-<4az@bS)~@20t4PC6<|R9Lj8ISCR@B;1kBJ+RD__`eS6x zsROhl{$*~EuXyy+^47Va2nLNFN!PF@-U(B|^GZq7cR6)w?b-u6MCeuMT-@w&ps+*% zGLf-q#R4U}(z@~a$}FM2Ui2v^^UL*4j%W|@1BCKhlwDk?-5h*<1&n6ttgrrbDS528 zcV1UuV+{NCjn!~l{3-2MvMZ}=A5NO*JRL<}Ob29*stf-aW8;6Hf${ea#s4*^4&BZe z?ZgpKjIl8Q{k>V*bHU(;V=F-U|L=t(mH~to_0!aF6nRag~23ztCq+|mLRhx%H_g94c#^ z*G*?PeaBgE%_asvNn>2Vl|b)?-zJqT{HRPS|mhYx;O8b>0|G;3UdgN^7o`Qm-oVE8ogttxfhj$sY{Vc2XiB%%C5^n|Y- z4n@&G(296yRHtkIHpOAY|e?sK9fWGZ!7+2hgGg0NRhn#7Im&N%~&cR>U@Q`5C zd}=w+M4NtJNp?&mqBL20>$+wo`@cpb5GBAj>JD&Rf)SHQO$8KlVRqy2lOGVSN6Km6 z$d88HPDS~q6Tf)Y@wN9|HVV!$vFu8+{PoDAV5k-fa8I~y)SfwZ8&nNjF~ay?*u!G@ z0Rpw(j`fl*ZYVPToImO~buhHR(0GjWnXEPw+#ge#A!ogE7!*f*UA0q{&UE%QG=4G9 z_dtDek;SpFLu+$rZy^f>ly*zKgx!6+QmVCLX~L(B#}(#Jcou(R;n#o6`#a(_pYr=%U) zh~$={4|F7E+Hd7f@c8T}DT)d@b{8RlY6evuBZjD(b`gj~0vQ8pT~F(v(ISF;R{%9? z=RP!~u|&6P7KyeKcshBN>}<0yQW?HJI$*Wrn-rP4l9A07df;k4fjl9{f^Tqm$n#JExldX&pFc$kz z8d>TkCT}Uql`F_j`tXl$7(1i{PLY+w(PHTv3IxO3a-C}bkVUwu=bQerV?@^><*1}?#|^DcfOdi9w13Mf`DU35SuzStbJ}m=eWO9MWJ{QcC)gJ zg{DF_z@uyC?wpG&g>m=#+j_Z>_30~>3FKN1nOa_hFXJa_Ab_~v(1$`&;RJpCP<3F_$f zbhhJC<$8k(!7X2P%=dON_h?)k_Sh%K){G~cn|k*q{GnN#CYIMu$b5@1>YPTWW`ZCW z;w2eMh8dD?p^dO<-v_mb@_m8=4un zF=wz#ID4C5a00!#=`F~0_W@hx26isGLCG0XPeR*r2K59yF4dFzoEm6{t*)W&WqtB< zQVSF){$tE^zJGjys5*$Xw^nPdBHBoyTla0GT~)s%7&=q{WCByjfk$`}WyaG{A%MlV z7)6r)TU~!=w%qJXnp;O=Dag9TlLc-G>U5zix|F{CfFRE=uV-d8tYLUaHDoQM0159^ zPH=7UAcd28`pCS=fv;Y`oqjAnxGw%6dAvqSDzfm}z^{lCz9|>u`YIa2R2v?hr|QGf@@A;`UAV*L7v-DuzU=1&UH6Eev}ADzHj-FNfFsa}c$nrMmp$3x z>g*=uqr-CDr9eEv?@WS$RDwZg$>GN*zap;{YCHc{=CNQ{?AW*pR^SlHk$lasYHeQf zc}f2qhQs9#mECx&lIh%`k71`T9-Egv+c?!N!rCcgo(vVV0QCSbMSuT@H(R7n{MAfL zc^Ly?1i9pCC^RORXku>2dVF)B!h_>RXC~qwTEHn-m$-2OoZ7}^q!!HELoKZS!RKPV zyX7(VJdDp|mz8-JBY%~)lv%ix8VjTnffDZ~uuDVBNbfc^WlPFmNGP`^QFA`xAQ z{$fv_fvGPmcdTS^<-E@*{o~PS6X3p_<~ryk8-PzpMVpm^BpjQKy{NfDVVe)S8l7VL zqcw5D`o>g6x#ef$8KqyT;zk`3p-S@bY_Ge0K(?l!w{2QDBp%hoTd(gPX-v2?AdhXR zy&3%{WWT9~4m55sL#Q8O#GCl7^>myOyk$c2E0_qy_{__u7jBB_-`3K<&6sV}rpwf~ zWVZ#kG_h!YA-WmwS#nNR6{$pa4sI(V!xck8IR6Cnd2f=8$=4ak(2e;yI2BFH6!}s9 z?N5lSW}O{6pT>r~41Y0uf^rVui|8xRQp&e74=QN;d9X;&XurL$-8zC5 z=(fR*_u1Y`yI+cv48(`4{c< zsQ>s>_FiA4l#zku^)NjiFTe2hExck2svO-MBZYH(=`P;zvawTc-xE@Hf2wCPC#gVO zS}N@Jtr3X*YXjn;^v4@r-;%eApoxf6NO7nj7J(K(O7dffX9+wpT6%1gT5%Nz+SVh( zHQUu4b(%{1?aF8ua#jnCv8^b5gg?K{oclX_;>p*&X9XKsy&&2L&>QnKE&zt;&IK65 zEu?p$ABS}neu&iHs^HDcc+rHNtYS#n1vLZ#>em2T^e?7~3d z*WW4}gJsobk$Odgtc>xaBl-$mnf2TrOeBSjj9wS>m%+5(yZYE8vo&&kP-);yZRcu0 z$_C#&kbq|;2`*SW&c~bK2L?AwHb2O5ZR)f>lBkaI6|&C_ks|*gG(s7mH3}ceBdw8j zmd(aSXMDqva%;sd#Vty2H{SBvUXII99g!W*+tyyeSb*Wh7D>8#qoibILa$Yx$2`=q z^7Td3L=|d0?cQgRP^FmcsNM%m0&m0<>7RFSkyFW1!QC?))MRY|#n4>~-R$DklhynU zIi_~jQ%9b0J~fkWlI6EwkcjK)F_y?M$aiBO^1dYxHw(HB6ox$7{}IJ8lmS^u@#?>DvMulnyFs6l1pNMUomYV*)%NJIRNMg06H zf^KSH?v$3}$xk!QcnwqPT&c&Fbr?`usYf*_QtlNY`KTYYtbutu!@8Q~FwD}St;YL= ziZwUvYyh$iwsGQ%n8vbS$1V)szfa+U&NbAKp}_;0z#&juAT)o{FKbn^J?-rFr0b}J zbp&1XebM4C(4ZGJ^Vo-2N5wcAD>X-(*Ln67MeO`(b#rfl>$I}21CyJd)V1a~lH8+n z*vIGwo9@>B(xO;j_K)-Z?a;FDpEV->$NhY+LB?;h1BYrc=A`HjKXXN~I;R9Yzt)5t zt&Yfec&ANwg_qtWK3U|Xk#8l*8I%!ssd+CeMp0$hmd=+SJUl%R9;E_$7rqUNB_i^9 zNA%?vAE!Q(2$i#g{5-RE_g75sx$9|W>R_BAmeTUoumh;IDMmMFxW;aS+DzGg)t-sJ zIPGQGCevl5SJ`jh#OSKAlts$|uY)}T1BGLa2<9m-U8wK8jOffO$szxMS%u&;mjmUf_^iNILT zOz6jLV({Jbs+qMfV~Sc$YMCA+GT7raSj(LHdtyREhfnE4yQh0G8(`{B|Cw|Ey6Zn$ z?%-!i+j$pL&#crgX2#X{+-bpzAZj{F_ zf|E^V{@4rs^@y5xi$9PUI~JPTzZLGPPReKO+ab7B@LCvHE|>P~lgS6lc?`{s_C`?ibxzpMCp}~C4ht>mhk5dk#s|hcc#B**>oWA5y@4J+#bz_Mpbe-&XesIia zWK&DgTUIdY=yL68>7ZhMM|SzfS3p=tYcTrEQNQA)=#a@f3ojC<$mPTlkQl!4^TZL+ zp7}KzzNx37AngosK{aVt8tfTCiCNV5 z>!o(XVl`G&I>Y*@@`}~wKZZ*~1rKI-uEm7t?^ucC1xHce0NFF_3EBylG(=pm+$<&z z3474&R5Brwrc*JFOXfM2Z?9F<8OFdO#&Sfs#CvI^cyY6D)hp@VZGE529QFsCklmm>i*7*0EQxOss-#5joYSfY!r(YyU?oBYO>S}&x z7}z!WCtHbs-9G}tR$L@u;vqGYCPMK<{aCnCH;lq5TCGtv?MH7WFD@8aSU!zVcg z&`CH)jR#n{*Ca5&_V$6Gwm=q5^@kqtZR3muss zKicG;i@Z30Aa?sW=M!0C2o~(!IrQwdDb@u|K9^Qai%EW_4X*UB-TqhP{42iybyk8C zeH(g`0wJ;Cn3KNZ(Jd%er)qZP3kD9^KPE4gm$skHiqMw`z7rUG30C?a=63&-@1g$u zj|BYx@mb;j*t}Xc0=OwJHKDodc?v07q_DggfM)2*vYx0&XqGVlX>k`37T+$&Nh!V* z0CNMpbA{k3>?hPZ8lOnKN7x5WLYYV7^a&?pj%80+%hNt6MdW@Bk;@4*~j_e9J zoEsIUurt#P5Up4;%MW0Qs)4BlAw3tpZ7+ex;E2hgpbUmpx`XtO_HrD4z^g+pN z1dzan1J~X*O;$F`5l8;V*oKz_r4C=es|4DM^=!W(Ziqc$xz=&Pp5s}|6NbG?9e=&X z*{B%-(jHiNaBhm^3FjHnN{(0WUiwMiu}fnR3mLdk{34c#?+k3In!;&_bKFQJpxQH8 zfgbf(P~i&gOmh3&+Ubc^yPFjpd{>Ms)Z>MW6SJgI)?b(D_D~|Hn11f&ViwV~Gu`A{ zvp}-Fgh1C)QcT@DzDT=|C7V`$dJxo{26S-X75N*=B&UV>$=96c_gKa2TbQzYCTZmmp z5PWG7!>&U-G$uB(?G(U?S|hIw9Iw}Vd)7_wwzKk>^A|F7wm%OBZHskXQY1+c!!dx> za6*1=i$@Pk@b4b&Up3=0=4$*8w-OOY!kk79KrtOv^ZFMQHnz8jbRl*&OiK`Ih_+fmON z6i5zpmn|=|!N)|xWOhg9D9}0b=Uunny;N^iUj9L$eGh9-6Db=jj?iG@swW_pgjB6UoD(= zd3wFrQbuLCU+K16=UKzV=ewAR0EjeZ5ldrcTfp-A850ZeF9MEN2HCptyjWLY;oiT{ zB49wxMkUKcAJ@Ol)c%Aa*W=Lf1=MYeB!hTW3Fp%;Xy7LWI%~GMaSiWSEq{NIAQB=S zpSJ42yCdNMtYxxYAZ#m?Q@VO0gJatqKpT1jLt}bFs52b0AG_%vtNHED;G#iAkY#IU zmHxyzF1>rwP1zQwaKq8r=+&2(9~nnO>3Ld(nBI*WETB$Cm8e>rX@79(O&;0DG0yXx zv66vof>L}MWC`kG4ZHgt`v?`qKN{h$iY_qsGquW`S)9?0bb1uqWo952&uH)c;KV19 zkPEVe4jN-di7Wqpbnpe2fM1lum|tyGk%LB_vb|zeM0$swmiqLxQWTxuu2O-Gl*?)Oh_9J)D_LbZG~A#7orVV71_( zYTCJSlHz>2B8wr8R3iS>wR^Ho>B3Y+*7>|az9=`PDqlOk1&xbGsBcW*z5A3)p~PiS zFMiHK&8?XOezy$mRYd`S+6v;ozO$U}ai*p^^44Ua+2bUY7Bzf3x|_t`d33&KJ-ivc zpcP58Y0w6?VinaJEre!x2)f*Rni>}-S(7k%t9(d2Q15GXL}cX#wfT)hM0lUcTivJ% zF2!Wm8BjBaT%nEHoE{Kv59TB2#+0~@#;4BowQsL7cf{-ZSoO*&Wj6#M{HQSylrbl4 zCl!ob2~@1MEXi(uI(+>H`41OZKo$DqbcRgd(p@=kK}A#6Umb226M_i~{tQWGH!Iv> z^wPHQfegq$^*ZjuTM@5>cuDu>jC|+SqBk2lviy7ot-1>#-Todd8#)V~HO*Ojj{sHx z;*$j1PFz4wgc7^KWriZn6LDM3Ji`}DxN#XJyGD|@61R=@mSf7RYWk)|ULi`FCNS}KlsGD9eAYJ(h z_JXEK5}sob;-O~!!lt*4UV5|YK8(=)pj3GbnNfYz;JRM)`avwi881u+AlAcTwQO<5 zpl@P;n|9g16{aO&s}VV~Xm00xJi7qdX7Wrt41&HQO?P-Vho1fQQ`rOm@S8es(T|TEg&3V__l5t$_yP-g_RpjQ8kvGlT1Uky5`GbbRVa@q-tKOvG=33{}z#n9aaH#jG%=@j;7GQ|+=)m}6$G3_v& zc0!rJfumKDd5|}UE}}S`Q^pb}&0pa{h)fPoRhS?8WYtJPI2u>r{9sY=)Z5{NStu7s zaSRbE-GVX(m4Ui3?wb#vXXw<>7sNjoyW9o|CX8*n5iT`PECT}I{A#~fk}UCSGIV7ucqQ9EysTgsZ*jG6kcr&<3|fT$ z8(lFGDB=R(p)>#3dWqwFV8QKGZNag}GZPP?euZ9T*X3MLwFhRl-;)>$xc2p$j3->@ zupQXr7Jl80+LC3d3J=*Xzbnu2O@0bti8p3GwffDkPxaG5(i@Snd7vCQL~Otd$9V;b z5q(K^MORCMLMSemeoYt2RdvcKm0fi`({-bcPE4!L?^;34^w+y|YjBd70w%C9xO1ZN z%}`3z4Z=NYJ!IE>VzlpRHjM!=+#8aqMOgRQ5TJ#5-{%k>HM3wvFrr8Xx(OJc7&`Eu zD7&?JtwrFx2uHHIrpYG{0PmrnBMFuuk5k{&YrZFC(E&C0mllZo)WrV z%-(ti#r)F;v$RFTpl^&p=dx$SLKhsmJ8KWh-$IpVJz=0Ay4aLvn8Kt zFVuhoVhnj@w3OFRZLa6II&Hfl_wvH?)thDmM-E`WIyO+`>!d_L%qkadMRSoJLYY>X z@+QYCi*c=A|N6H5)uRf z=>h^u3q^{wNLO0uhzKZEKnYzs2_*zl{Ejobd+omOT)VU1w==Ud-~8cqX+(3L^PF>^ z``q`hymoq%e)Qz+tpZz!&R6d=2(4gs-|mlL&w`vOK+2+`u{&4u;C1Mlf%TvGRAALE z-uE-B#AO!72ftvD{MM#FN!e(6E$dgW)1A8OJz^oGi8tp(_xHeq`1wa$5`guPXv>uB z*a9zKR!xz+Rh`I@<9%-; zlTc*KS;O6P4wA)m8M5z6V+P+KRyPZ$hCcxH`;4)5Dv}lT&j}XDg?m||_`OJvsqOZ( z{PGe8vxUZ#q_<0$;3p|DFIkz-?PaqqdeM$r{f0=I&UleIWl_NVU~DGYX&5+?==OWvyq&A95b;> zGqsxIrA8j?(O#OuW3l*)@%txf3aGIHu!r;HSBbsEIQ;HrG}aXxImI({qiGQ{6MJ`% z(fmVomG$Kp5WzcKIRZxO4}$jx;sG@S5rp5qDB~S4 zdz{bPF`QqlUVpnRd?VfFh93H28iW!Ez76WHZjgeCLZ6U~6dUnKH60R4BF)yN_ow-u z9#rvmrGBP8li9ZcKWIZ6*5L)F!1AP|794lEK`4mweBEANsy{zh%BAGp-eSJA4{eBj zKKM4Kon`XqiJTX-SCpHCh8eaHgrGNpzGF&paE+qv!GGCHXNEU_W5g|R;uDWn^~O?CfA z4`Hu#IlS@1;!ketEWF&gF#NY8Hbw;o+ zc|4h^>SRJZIRtwd_`I2u+{!81gQ|U;o%N=)%;T}xH$IFz92e5>T${|aE1t$b^4E69 zD}a2RZ0j#N2aHFs&)_V+QV6|5|3`$)U75-2i>(ql71`m;V(=6*xzna=>90~D0wpXE zDxj~17_KDYXkC1QZ*e}RBfhr&zac-}zH|e2(W|j}bgRO?2`vxg#!Q{410@>P9}8As zs12qCJ$|Q!#z^2gJZTpgpekq}@yWm3Yu-JSGxS@o;jPzC-(h|YTqiiBlXXz7H+Ipd z{J%{Mn7k+aq%Qm@FWgg0YpjH27+SpJ{)9Y#MoGC7g0j9zd5`>#-AVyru_Cn% zs_WETtY;AYoLbqP({I#YP;7IQY&uM2&)S-LcpTz^1w1zwdeU-iTnO?I0;~Er1JhFm zz|^BqJy)s4sI`LoxC1pC>RAlP2T789lvkS*g|yFi%Rn%7$z~h+Hyh-Csd~Zw;-U2a zo9l?o0(_E_=nS72n1PTi5Jm`DgFKI-qXR&IH{I8Fd?Da#&^pzR5EtHDoEr>-pk}&Y zySA_`AR4fl48_ku56aN{9)PX)8H*~)W{bc&v3(z)og8aFEs6g{k$~b;!5L;4a2%IT zMN`r9`--oL>ty||wO{8yb>}}FSQjNLP$a4E8hNrDYz-&);`X4rF8A z{f6Ad0v2f-G&D=Bl7Q{_dEe|sT7Sl>YE5-YuX}<1nT(P~#s#;i4DP8J%~x7?cAKLh zGTWg&Ctm_;giJF0v{3NRF zyc@o%bA8%YkfUYdM`Sf_-L~w)^ye-9cfZIt>-sM;PH^6Xct9S)?k;6B%jJ+&t1b6` zE{K#rb-mZ+zGXgCjkv0a2mj>`s z@#p4~#oebUN5LWXqZ+TU9)+v%jfnd?dECr=SoEvtAcHg?Zn6&&=BfV;Vz@ZZ4q=c# ztDJBU09rd%^M>n91fR70WbE+bWP2S@6)z09ROA|Ftw(3I zu%etb+YAV&;UGf_0d0zJQXtdAM*|VAxyN)=fp74Bb&8rFg&RYQG{Ask&i*&#H-tZr z#;-|Z83W*zJP<+K0F(PSB=#%Q8fra~tfa8+iVsFe>xk*_h?>_9GyeKc``K4tzqZx5 zq(h`Nkh(9zlTrV}f^`N^B`(mfz_e^K`IpR2rAx%m9XIH79$pu(36vH=`yAq%x}xO@ z5iA^Ss{HHPN5;`QpcQC}A|_nRY-WIT1vaAq1{$};k5wnb$grNRJBsU*#OT=ZexHQ+ z%jEDV2&I);gPl%qC$^IE^AX@G9~J@F9tlG#_f+D+i*=@AQAs}D-i!Na_qs0Rw>ra=pP8KC4iiv2EI}gAKwOL0R$oxnD!a&A-U?!+5njAHm(1e z)_@EmUHy)xU#+(3(^w#zJBM9o2TLJ{bcbNu#g`h_eA2(bi*D-vV6Ts_(`d*+Yq_}7 z+Sj5)-e=a4;(ET&w&HV`?|{a)zY35((-AhSKMIM!X}Cg_| zOYR4B-yV;As}4LaDDb)VtUlz?*;|*MJu-YSTMfWSy|{@g+7UN=C^3p4_p1YT^nN9Y zsk1)%l!AC&oozaQkC}wEN3?;ZB`jc2|Jb81r5$Ocq$^-0o%YY!oZ}nlj6PRdhgkQ@ zHx>i-^Jlhm=i{$;H=!<81Bqx@<=C1xK9G3jt2~gHh#0M$TGdD_Ug7Ipwrc!%^poz5 zGuZXTfsko<~PPahlF5V2R=U_0sn@0K-X z@a*&yxsd2M9_kmD#o@cP@o!RDA9hOhErLU-h@cbw(7x7=zQb^mZ##XvJs#4?#h z{Y!&gLiLsgAB0j$&Bp$5hh}V+Ufs)*Bf-nf@Qbwl3F|VETHC&}pME59HNd zM}t*oIJT>)DR_BkcA==YFo{Mj_m?&>sf zm=yo|<3y!Q2=9W+ZCDi@2b_W#=hftUZ3Y{<>q?iO|)>LAGxa`qrru8t= z#jdu~*@^cn56lJxX_6m01hrH~xeCtJVlSGiE))f-xv2KWKW<+7UbB8Q?&~N*F>GcE zc?7iR>Ij-ZfbSiaGy(|%e~+L8J~G>QGb%SW5=Xje`Ww;(`gRckBuQEnu49vO29#Ci zZqV&fx$#UC&4E_fjwMYJHFHxPln(M}g1@HG2Qny5EWS7$9O&1Wa648lQ2Zv00VD>t zq)c#X-M~@q$Nw|OI4}acjSf!}d_GZLM?lXSpj|xa5(DFTwakUYAl6f7^TeL@tlXpD z(TSqegAC**FjH8XZv@&5VQZ)vd!1)wHiR(YhSCpz_#C=J&PnQ|Y`p87=)Ixw^S@64{pNwpG}~W?ZTQz2$Y#TW!r9-a_U}^=tOMr08Du?wo!Y;> zCv4Dg&;5!9bU-u7H-K`)l@aXDgPQL^@9{6$-W+T? zvzd8_cG^D)7zC%J2L=?i=aV)9T|N#=koAAGojb9g^jTLylt=t^oS6#Ufy+O5w*K9u zi0)tMbEe<_!S!clJ~wNkdQOl)-N|jt zhZjcrpJ$0hF~_d75|h}Hyao2RqPrV(9B|Ew8N|-OARsW*OB;gYjVGbwbJJc?NF{xO zhG_srox3rlr`r30#P)_$U3Z%N{A9ec-;eWMnv2b#HX9<0>X9R*{)RZF!>E#~L@b4? zigqP*Hl7-I3$@%e(Jb}XpHcZ!PT?kat>=^P0gD)I{LQTVqH)2%P7OkWN~W~f*7Gb& zoRZsoJ6E`N3kO$~B1_(;QgBedK1%Tbz7DD^jF(9S?qAU~)@9zvoR)d$ngZ)Z-+QG^ zcZ@w}KKgn8ycE_H?p{IyUw8|J+fX{d z^Sq!<{Dz#u-i_xZ!DjYaGY@y)7}2tI)1vwIHSYQ384AT(FpE59jPpr3PFsf{O8^>D zkqS_dl{T+TXZh{vJ1j@dDKuSta&buWx8A$1j`0`FngXF~pcT#NMA)byC|n^Kldrms zCX{2I$cl~%g_SN=H#`{^@Ov^Rb*<;QY_9U@M=ild5GpY@it>P3gPJa`g)=nTqVP%6 z4#{q_W?XKbw}*ZC2R9vEAD(mfpN&i?Og_)*SKQU^DX_spN0x+t{pPH(!)iAHN*1tF2&Wm^EvrCTbm|cJZg%KbaZx; zgTgj6KceO3$e>U#dGUdlSVCWiiO?;G#03%ghjd!rK$KUSS_cZ1#Ym>F@|2r%u*0}} zHmbpvADWu*r71*w#O){tW6_(}tV3e5-m*YIar+1z-fYgR&5Vw;ca8Ke59jY?LOA|2 zdikkm9{=QzBXWZ-A3vyVK?srb9ody3GzahCx3o^HMMDaw3^A8fL%v4h?@HV2ENQT9 zXyP=ltF2Y5?RmiP=z@JH!-~%o)^rI1WNEO|dDuF$Zm;pAxxMg4M*QeO*O*@OS2uS~(Ml&y`KAz1aU zX3^K_A6gb~Urx5++AyaayM8gOL7-pPxhY=}pa2?D0BlAM>qzR&uuY&%J#5;JSO{Jn z-7__nxmg`|fi07-o$GSvjSZG>2_pDYk4~cWPm2@8f1r==!g)z-o|s1ySN100uL^wY zUrxU9Af9?eZxzc$3Gg9$KraM;o_Xk;cHv1UgKk2-vE6gM zmr9R}P6^Qu6=4>Evyhb6I+bkU-)r#=G|bUQC6ewupl5zinvG4FkT_>q-`ITJQ!vhZ z%YgM96T?`BKlvZ@+!>`vOeL7m=ChyD?v}1DcKK@a^d0-Q^OGxO>E)+vytQ&@>-lW9 z75OO2J+LB?v>|NmKsP$lG8KNZ+Ssr?=;CGIPcy=4pq7$kr!OMrC?68`Aaf3~9lCrA zjt6y@$-=pTwNAobdou&cHOR#)2k!rL==z7a*?!GPJ~yyk9tnPgbh89&3S{ljk=^uB zT5w+M^gDR9S(n0#R5%;T3483zD9_sL(GS(5!@IV_G1EVe`WePC8_mmfePNRQY^=Wx z1DE-d%lft+`O*97` zyPd2vWZFOR;h%!lztIr?%lESVM^~@>7tS8RG_w5@h{eA#&i>i7G}<+kdvxp_BEaT^ zB%0y7uQ#V?pCg60w>|m3-`wqb?A`Hp0}WKETfupngm%e6GiDw`j2xDrW`Hxj;Gi(B zhV<4}P^OE=K_scyuDVv;LO(zul{$OJ&us6RAYgM?B02HsaLSRHGWAv(+fdHnV|x+q zx|*6g-2{C;)Z{Q1}%hQi}FT^GKKdal9L&2MrkqC*EdoI6x5d5Ny@eWO*| z=k}DXeEqHM%$y%=P4FrkgR%nmgPU0&bL|a-3Rg~adwXfgo<8rGd{H!ym8J5f9;O>b zlHKeaV7rH6P=SV4{15|$=*Zo3m^8-Q4l?}Qk6e7`ivp~2y78aD zO8I@j#4PS<)=Enpvnpwm>`6-M1U=&c3fCd8=TFOvNBKOkFJvi_`C@OYd8Ado+4h{f zaD!8<)a6dAV~tOk9RxYJ0-BkYY~RsW(mz)dJT{6ncxwl}F2s`oCfsm~n{@X){eO)WMHV29aSscf^Db^2LYN71j-G|YVTi1yiQ7;Sv@)BUNUfG#hu~a5!W{le&*>iN%{mU;#5hXUCVHp zFq-@pag!8*KiG2Q{uQaxVA6Z@0iE!W_)DXbl~zwb2rTRtF`I3f2b(-F4yRcR=~M^#w!xVUc)t1?IEGGW_;Rt@C4$6@CAc?XV@93m8a8(47b+F zNBln`P#|BD#*f8wd>>bcRK=cHxo~Lm%Z07a2OjC~)je=A)2@Ob4-)8 zYU}Y74?w~xbpvXuMl6zm>_Ju4wd2OI(;KlfFnXI%?;x+^Q~5<2QXjGP3G^z7?`hmW zELHm1{ZF00L(&98C;>w#z}HbDQ(y<)!|n&RcoZedMw043iCW6fW@|Ac$t#5KG?;NA z#0Zbi7O!YzW>vVTWFrQS$D~wVc)Q0kro_JdVQkH6&8x_61zj1@#@}024=3qYzwX&( zw|RRTjgaa?UPk?&01W#OODjJPWACy>*YezR&O$M-7DZ`P@gI55^byk$PZD8!p;BV@ z0?kQL^wyBbdAFPv^o2cz?rq$lo25nGy9w7Ta|QS44^%K|AghE$^3}D$#v^78JB}Z^ zTRWoiQ^dI{la-G@Jy$L#88s0*e@weGNE$AI{F%i%tmQ`*M%=(}q_StNlKD(JV)gF& z++KciQ+K}N#7hY1g%Q$e%sqIs_GWcb!kj|Plyr^hg}K&*3ESmpjU(I&USHz&&e*=K z5YxOt+&(fL?0#UBB2_NpFR7n+o~uL#a`RQp3BBnMjVRh<)N~~1@9)U5bxpxYdL=(z zC{WB8v+@dLUh-JI-%eRn9k6D(90#Fs`AlH*I4*>IdB}8K7y1dk9yr4f8;25i8i3)5 z!Q<8AGB<`AjSDZH*c#-1o&V*fkOPB>R06kd%N2P=_}D$6m^eMmdJ7+YCdhw*|0Y54){n<* ziC2egFI&2+5VW6R&nVZjRsCd;TWa=>K{Z-ptyj0Afw>i-cy6Y94d;d5Hmi=B{WYsS zUXk!iPo&+=tv0}(-Z>zjl5g4l`G{jUi|%1FVBuzm7av>edv}kI>!m{E1K*N2zW(8i zt=q{ueKM>C%6#kBht9MYss6&@ZRJocCisY!X5PlcBU*P4#v7_)ZvW6PlxwW`skmaP z{;K7ychf8O%m^qeasY)l#Y|{+!;d0l2z%4;jxuGvW&&gN-~*G%$)o8m)@d+VyYX)M zMPWK$O|`nuJ~3m%P*!jf#$~|>W-)W1eqv0J^ZhXC{-d+N)F&X|vDHb#rlw2Ib`OnW zfIhE2uGuzqsxsPi@Nv5Tx`$kjeMLLN8FqHV+r<#f-`N0PnKm$MVPsW=CN&Lt zVp&H3Z(rP7v|@?3zh9s6g0YXE^4O>e7PBf8H__{~*PxJ2iht5>}bT_8XF5a_Kh&!|z4qs`(SB7~hj> zvM)|6Fd$CUeB@a5dx|FRelgNJJ29!JTJ3OqMQbcG>goQ2ASJrp0SZT9r+St+HCjuQ zac4j)O?))JF#M4*d-vllgOAz?VmD6*(@kInn~$JA!*`)%DIFQmtxnw~105BHMm%fb zw8Hm+);z1ovW>x;!e!6S){jgNyQPkSw<*e`KGB;4y zY^Y!<&IX2@hp-8_7$~onBw>igqVGz$*n$zOXDyk=srQ9WB+EPKm;9`8!W1;)I!)=E~qXoYu((V{{6#05Q6_H6z18hM7kaawu)7g ze+Fj8;;@AgleoW5cNs+PfBL`v&jC2l|LE%2|HAi%W?gFCWB7!L14&92>*D4qOn5)M zZkO&};%7&cvotEx#S@y^r~)VSrf^*eD*G5! z)Obim@J#Q8ZytG-Lpw`%YHLHpCk3vx<%nJ~ZvpPOg29+J;8?6q;dGs?>oAK}$3ao9 zFXl$%ck_--#J%#g7+lf(bVG8&ylOyoVIeu>bwy1hx#*3jM+3Du>SZ0x07+R4k9~}~e&ZUWiBy`*NulJ2J$xmsjn6`4 z_M52rK!yO^J|x?qF{XemVHh=cW6-%F=t9q9^6N5RxznyrU0lZq`w8;i{1R6O62@W& zs1jhM^m&Gn0jaB17wf*s>ED^cCCbi4~)}i6%#%Oh`DkChA{3FZ+Gc zp^&VFYK76%5u8+PHSUFmS*XLnj9OUneVo&<*l=lq_Z_+9FFaqq1!ez8{IbM)=aZxu zT?P__eO*TG{W>zJaJL#Gn8?x;bF;81Q9Lrg+`j2KU&Mr*M40IK!~Ps^;eLa5bQxj{ zkSZHU#vp^o+5LvJq0ZN1V;ge{Q&4A4LObs^&6vj7aB&nQ1KERpE1KSm> zv;WWDDpAen{)o3vzXxX1jWVd|c)`h)r=wxTXXHjQ4i;ZHy)sx82|u)UTJXm1ip&8I zNt9r9g*1cDYlrcuxJy^BDsb8yEn44TsjfKGdAZ`kjf{8mR`0$tZT-XpcQ%j%lq1;R zHxJS{mr|!rRSz#%m*1%#-O;yp)}JVyEFTc^h66DSAA}wVshrAqP>_hTVPiT{tE!VZa1F9P2WZ zZm;167J#grn!SEtpt3}7$qTy~iHjek9lSF_m^Kt59{d_=gcZ2$>B^4QzVDb82>$fU zOnaZZ0_f=Ip;|4mF4#D1buL8##;B#DbqR6K7h4x!J3jszIZjlNr0Fb1JlPbdZFt9d zC&07OmA^tLCiqq2W0KFb*(qzV`&a8(BV1eqy%r4>lC=~WALBT+JVG=|P6YDprAZyi z$}1edKM~ZQ{O&>>Pilph@})T$u}9KY7TU~We6;&Wa8GJgz~09^!*LZ5aBJ^;Br5VJ zf0+0bm^l_1Iu?Jw^u_yFGa?}%?8cfLzxr$Ck5-!Q2Tp+PkTx^}BgrYmuFrk_)j&8N z!?d6jO;x|*OaC$JyvQrsG2=bV(yxm(jb?0aL>t^@`RJ(BhF>Omo|)kdtTQPiYqv@t zg3>_Ouu(VyXR%>ALUxEN)PzObCN-0!K(Bo9iSPF{?8uERauNx7hLLQFXhmlSURHy- zUukv0VCht#I1t*B?XVLHFPy(^j%0t}{JBgFF-l+XO&??qK$xc+1I`IG-?+nv<75Z|>bF4l!8x#01JCRbFf7$qy)(NI`5J1EG6^{$`g( zPp01uvhh%|?YLOie`{vG`{jkIxhF~=?KoGm)TwCfbTRN^puhs>-f7v+YW|cliY%9( zA3~U@E=8Sez3W%&R##ti>Vd)cQL}$b>D{#Z{yaV_(<8q% zD6i*O$m~?VYPdw=(TM0f`}gVDMGrryY`>4b&9sS&c}rRn5J^{yTpJGK$tQ=mDeE508D-`y(JADw?Jq%&gB&0Cn{IHfDXa&t$ z#;b)=D+)pTV2PNTP;F(QC-zQdPmXgY&p=V6`@^9*Z;1RLP8#f)`+sF0PU6SHu+vrG zrm%|%uRev)lSr495(-e*DH&x~3Q6}YNHIRa*ah=f9E#dO1*7qo6=KlrND;OuRIO#z z3zrYJ4Sle6tk>|av>ua7-)H4+0mI-eSuJf^S9{h+jTXHqjr^XfA> z505*ya-zhK2zY0+6cq!^I|Kp}>?5e@95~(-2S~FtS$hP6n(2`{ya5i<`jl67>=X8e zfh=L&NsEV>OHrCwhXA13fN3VyUwPKL3Garj zZGt`KO_H90@spHib~_g!!o#?^Ow>LiY! zreEXg6k-vgK7_(98;W|C{8rlT^-e<$Bq>@J2gR-w&O`L*@N-88||qjraRYAwA}a3Xn!z8H9iiiN$t8{df=cO|xf zJ^ENXq7%nJ>KMq@f0)oybZ`6e`%W1FL&4pQ_B)2c)6T}HU@|8<^&qs8B}@#=(QBd{ zN30}CGsUP%O;-~f;uYVIuHR<7V-m)nm!|6UMKn$6q;rPaPS0f8mKRAne%)_2e%x!u zA-<5J;af|Hk1fnPD${-GrM2w@^Te!6Y`csx`TI9|Y4Z;i3%WwkxAS4A?gUG_@4NrW zZ5W6^8RG%^$OOWJuo*W~`<}qMzb-Mlv4O$Ji%uD)iCpUyaE^b;%OntXG$d#hXasX~ z6U#_)1l!hT1w1b9aRZgjWc2ZB*##My)!y@2gGXNlyz2PI{NrT%@q(*Qoq}OG#Uw)- zi~TGNpbv<$q|kDI`1Sg4yC<){iu7^Soa`@=FLW1(sx-J6{P?aVWb18ctLi4Uy0CrV z6y+9)cMci>WAioIfuC3%MY&ctq`7&_MSh98RsB-tQ+AQi`t^*tlYJ<4bT!Z*S_K0; zh4*qGn-#%nu1PMkafC$FD zDZklFN7`69@cWPk=Qi5dQhajPUB)i)s` z_H3Rc6k9vkwWW2Hu8Z+(zfBY=885DIv4A+yZRlpREnSGh`1!dzx~uN)^muuB#)?%M zwVJaZwtf>2fhZX-$?QKPk;%7_gSa}j?juMRWZ#${QHLvS(ZoYz;7Y>!Y2uW`nX$S( zmYXRO(DMe4eDYs!G+PJ5itPSqZ`sfsDWDI}@Qhm8D4q+8p(xMB^4pA+i7Gc`#x4x= z#*4(P)ur9KV~E(9B9QrZ;3UcT^?d@o9m=x?yE`x;YSA!KO|@KGw)E4;xl^?K^tG3~ zrrX=3y?FjlTDg@jd5=B_Uu1#MVwNym)O^p4QkW|&Ds@y@yQvQwrrINtq9#SCzjfti zayavC13iII_~-cl{V)N6Rm6Z0V*>B(0%c`}F6u{w`wTxiR!3=Urjg+HYOJIHe&0`> zZ)nEv!FFwOT?<)MgaZs+EeMMT}lUm1L zlPYDY&dxzgCo|JoVh%wd)cxFM6crqT_t@BwU$BfoNWzBV{^a1PteTn&r79puagu@V zy%EDgM)2j_s@rqiludtL(Ch_=2BQJNpk^+}y<^S(1 zQA-tj#_b;AyQd(uB02`=N5|z*XP~?&7xW}O?Z{Umlo!D{$Eov-yUkD{C$H~JJ6EZ< zfZwRk@mPU~X9;4?l+ugbOnae39%}KQ(yBtpOaFF@xT9v=OWXX%Jx3vyDj&@2&*xdn zww=!t4mWQ1x{~=Zo2_c;A4Jd_HGzM1z#J?ZdWdod|7&LB-RbCA!KVXj#8e+sxkm5v z2_`&=i~(HS41&cz8Fx-)vmF9aEY&~0<1`mFT1RL#i+6aVI>>-CU&L;_pSWGz`);CJ zq%M%Db zNpfu67Oy-#)kL^B3-1tAu*WaPjfSlBPu>_V7f)JOSG4V}m5IJJ=TT`?>UXwg1LK5n#^^tn-f06$9;&FA3junW2B@ZuDkiX zmamDt%`}i=^0IefykJb|Fv~Y^1UzGT{qz@weU6xo9}T7{;Rj-?%d9#rKe?(|4*i(y z-%=13YDlumI?DKVR$d;xc@ zR#HvfqT;8}?ee0*yLv)L5>GNxkAj!;W~II$l6-<q}sr)yj`e=q;qK~q|- zAhYNhqjOpzhL<7awj|MWoA6J(K$1y;SWnmset>dDKTA!EnJ9drYFjdyzUm&ynj@=h z$P!?%-0xAAyEQ)la5eM0EU$3GW*i)U6+Mwhbj2U2y!6zfQ*t|l^ZjhgQTbBQ0{vmk}#>ZYC+8kQFse4HS4Sgh%z zvB2dO=qu3ow}4!zrtN zW%gHQt@FBH*VaB1jypGW?i_o8|FwtStLosY0)pa1drLR@`V6{5@bv7gj&5CJ(~u`y zL7RvSx&)MWFIV4`QOdgK&6L1;Fahz&FBq zkRqgFIi)#kJ@0#2;th=-h9wOa#1fudb~0d+`LNlo3F$(NZUT^EEr!CWIhz?CQFgy7 zRt=83cyCN;YKgC@l6^7YGWkiuhr_~m-Y6Yuar{7kFp=AsH|^EAd7Sc;WHy6|MshN$ zY_i)#c3i!v#VM`WN1xDoFW>TlAwx`@%>EZ@JxzsFG6SP<0qmRkicMHo!i=d|J73ar zg@ZAdvc9{UtGAf&qiaVVwk#O+a_B9BW2G2`E~_nS9zur-dgIeYHf6sdal3+!2+e7+ zH*+;6AAi++%abzNDwE5#a*uF`SC;;DX7JFVc)l6}Z2de45k1tLQiNRjDu=1d1Gx=P zS&t2eAQ{WS{FmX1VmTKozAu%VpH{yfrwpEEF}HHZ-l@HVPcGtxO82&Gjf{VJ&LhQo z>6aQDnl46|h0WQBb#Ag5IM6Sm?%AS4QH(Y3cDz`Am_4lb%;f%7QNv@|65fDK6K*zL zQBT%vOF6=q)C)mb?4O#pMmhM(6;|tKCbHw{4rQ8&@}FTza0YCq`)S zV2nJPamcLf5enaft?Z_V}9c{Bjh&ZEED(r zCK;E78FV#J z7DzYi#E`jsH>v7y#6M{-w?!fel7c1D#|pDd;?$bh9S*4F}7{O_8s4Oas6fN z?Fs%OhPg7-l^V(dh-@cd^LdDCpk`|tL5qJ%iv?!P=xH+wr`Jq;3oH(cZ`M+u&2-wc z0JYRg^xEtgRomYB>ZkUX&-!t%A077j`VaW-E&^*FYZ5-XEkRi>Z2q8ct%RbWS~+3J zeo)*eN!^7v)sXr?2AfZEEg_{(M?6Q0E}goK(a@!@JrXB+PWtfcH#|9UmVvWwca+>Q#XY!Y z@b2BpsAY%w$=4CG-!M9YFBS=?kix9l{z1!Io%6hxqrDG(TDU2uW9J$6!otc;R4Bf= zQFso;;J;^vw!)uoDkMd9P59NM%$e2$ub`~6r3B@+FFC_XiErnfoqg=~Vra?~abVlD z47Aci=LBWiZBj7&y{@eJ0o*y6<{=d^Up|-W3EdVT1LYciygG3kNHaN!MNe?aYo1-CNm>SEQdvvWOc+pXTDw#ne)6=2K1r8D3DE2bf&{I(?zU)Q|}x-G`tV z?4x%(j-gBL`yfFI38QFHGm*TA08=RO{)q60A+aix*b5W=OH;PD;BTOc7j+h44`sNf zrmW9>A{Wz9pO5_-pm3|xuH2bbARnmHGRtIEaiLbHg&RnE)9x6aH>@Ak!V0waQ*|60 z+;4rE-0t60e&W;bzNkQwHjD5=n36dVX77iF8*7QRR&S*SHrBk#He6tO0uPMWW4YiD6Gwatz7rc8{+Cq6)@rq5%)A9^27bDRI zHkNi3^H1~A30nCcnMO`l=N=$e?xVSor|zZlq@;~SS4SV&T!`bpx1q2;8?f*yELPO& zp?$_nE_q`yI$fv+s#TYwkD5V!ADFEzEIc3Q_847}*o0`<&#QTfl$K$kw1Rp1UrO{* zUjSYCQw|hoYG$(#MP+adnOC;VD}DFvwCazGeRURrhm*NDzgumCT#BKFT7*y_t5WO< zlFyoD>|&YPX{vEkQ|=AP&bD#}t@9@$w_tw!NAitNg>%>P2wyxwN3|H+x&s#Qxj{K3 zAMK~j*b9VIw2SxSddpg^oNBq5*rPqP?H=gs4&S?y?^LNe{v~sMZBPc1#@sAZWaFLu zanjQXwO3O?<&v>&G3(KH6q5(^FCF{hf6a`W($psbPD4h31`7${2i>vpPid@W?=A{& z^SagGX({Y{#=2rMjmAS_0fP)o2>|%cyRPL!RzX;w>q3ZPd_mYkjF1GuV>#fNo+Hc% zRh?4`V>{nBYs^^OUK$q|OZ||`uTRKJyy1{eJf2e@d{tv?Gj$yX2vI`>cUq@l;BScO zw$;oYg`J*uS-q2u%JSFLR35D~U4!!@TT{ZqUB)U=hm#vNXPVULw zqiP8SkvWN1gcHv$szpCp6S~bTd5@_RCIAxcax1I=@&pMpBmWMcJKBZoAS&4e6_TwB zw*+SLUKx1YP>gMR&mST5NMo!FsK@vQz8$5>FP)c|a1Y}9HSVBZZ$|Nl&BfoR5}FC> zVUHWwi|;?JNzQ*`-xg39cP{E+(~0-=esS{&0yab|uyCM+#O5$W(ZA!NInnD~@KfK9 z#q6Y||C^b+*H%s$TRc)yI-kv2{$KIg18AVQPkG(l0pHv4qH5Y$_5E$9T7y@08KD_C z>-9ZpHYhwRf1$3XvPswg<##8@%SZZvdCtk~!CkB>b~+YYE!hrdy62!oQk^q>GZ*F>TlSw3VUB51^N+YbWm(krzg3jUP=mm-4+zkSI~^MF&p|^F7NsLOcq$J& zNKq*LFONlW$4ew=ZGFDbl~D3Q zzTb$2S1b`y0%fO2HEWRqX5;BU-h{KeS=D&K_7Eg)wqrKRzqp{+CLtd`V zVL=t7yH69S@fY|8@z05Ixba&3p zkHt}#=H$+3`?T4B!0NV@`>Bq{PtlCs;MDPtCu7)kq20tJLM3>_I(Rtp{BqhE|0f<^ zT{ddj4}?<(Zq1Xg95P>g5RXc0eba27*u4t>2DmIx+Li0GuGCi44#5R}+m>QZviF;f z_F|auuQNn~pT^wDM^|6w-*%Con$AZsklM}1thF6!oUMe@7F^G=7=1za_)poQ?7zG`)N zC8q0Kq5bD(wy_L)>e8BoFDw+|zMVv4P6g_>{M{&`(r?K6EA9h*GRV<;N-54D!BXyk z9e8F1!%m{6BP@)x%n6T9bck9ntyxvbh<|0m_W*%eSK=}?4THLm8vhNkAo=C|=ybW}r@$+&Z@z1poQO0ZhvZia7Nx0DgkPmO-5#{#S?2 z>BKREw1ve~{V}-(ZEL$O!zl=YU_?;2D0ScMo`zDmx2GjL$YdBR!fa>*DR6)6 zfhaGpQrT#7BVOHJ$}n28G2x7Y-zNO+URr#cSLDR8v?n>fx&Br9_4WhDFdis(k-2x4 z@-d1(qG+yvZsDLE4|DMfqp9FmX#-=HmT4RL#DdYCAf;(L8=L3j^F0;TVGSSUwX$`E z4l_61qCd!vx>Xn{`K%-16TOV|=gKTShKG9GluX3c_qC(}5F>9k;x}Vn*)Q+Wv}=as zol-Y?UGJzonKCB&=N#Egqy6bZqx~F2o2aom+;;x&<`YTF`Zx2%KGqm7*j}}jgu1e? z6T8k~THup&?KElXo8J(x)%d6h-}0q$U>w?cVDgDAS+i?d_EX1GyKa%n(9E}-dtnfi z)imTRXy8eJ|Gt98F{p|ew;AZzyOuMI&@3Nss_sA%ES8Pl8_pVFm+L~>o^^F-qmPRb{=v{B#TFQ zahEAn;7Oh>A^X!URn(MaEErN)tzfZ8OH}Ix6a#k!;;6+E$;C7j~%gm{Sgp2Ln%lsePPRR(V+ zXxqME34xyo&b3#$;C(p89|71qIlzrDN1nouKAXm|xlM85%bsgE#J_D7tjRBB;gE8C z;c@AjCIt3wu~~`=QitO(y6YwZ~K+d?v89>S>#i+LF#R~1*` z0pD~5#zM6e-KH@h=pL)cvMupA+%{$wW&KI1N3hg{C&Y48j5sC5JDiuJNIe7x9oH7 zd+zz}x%WHY{tJY-m}{*$M|s8=&r==-x`BD6o-_EY&fi6JV z6RCI^dY{3yTSXARFqhV%{J?7tDYRlSuOKTW&+ljbbUe|j6y*r%W1O#QL=&Zw(c|U4 z37K?L7kL0awR8W_e%z{3wZpum#c`xLu!24=RkDWv;(m(j&Bm`C0=fGo~EL-PWHq<2Js z18am;QAjAj&NS-CFWq9Q-=8NgI<9zd(xlb+!=|yWe=SrA#IUeMnz`-6L(nYICyeg4 zAk7jwe`h(HSBS#`bH8r%u+-ejs;-OgTP=70k>q-_PmH+;c6h(av4~H47xIpmJP9Ji znUimk(NPj@z8#$`>-zQVBt_CGWCz0lW_|7FFNn5$;2j`uSi0Q~4O3$zs^<{{T7%9; z7z{o5QsWagVBBb9-0AsITX?1+(s1JG+>Q8>_W5-mpVN@DZ;}kJF{Z&|p9ty4W~$XK zXz5?kvoV|PBasWB*OeYV@#5a7DQ>Up*ExFsq|e@bYQv5Fe`sK?u3({xoX8r9BuKB# z9_mW@7x|gBdmNmFvi*W=SOaQ>Bn!w6dh97xp9u@4#8ko#=>tvR64YkYjx+q|@1FsY zZ=d8^{$Hre{xh=ow}P?%ll~2OvBuE9i;`RcjUXJ`U{+)vjamQu9|CTy^>89;t^_X( zaAq~ZjNT3W{M)m?AU8>dX+I92?p3}jy)vF2;~4Mht~YkVMLu%38J86|U?hmlhRZyZ zYkj%hsf~GF&oaOWN^m0hKEJlHR7NO>BURa*w6bgPrJMqlD@iEur+t7%8BVlo8DU#X zH~7RfX>BoeI_cE=mu}CzRM^xTi=sh`+QR%SnO*y9%~siy0x~~-x;<=D%yU71$Sr7= z%ba?$m`5k)s4}BD|8S4rKam(J;~yoT9}bebH`&@|A$ZO_BTtF>$;r9hWz<7zr1Lx0 z6hQmQI_{xONo?S;BFpygt&+8>YTiubRNZN+T<%Ff`9LDEK!NM1`YBsaL-_?5Xn5LS zvLo5A*$9rZ#);tG?uT#YRYnHBuxUR3cDUog^7T%2D|^mebRTHRI`|G^93=jPVI?&B zs-*_1ZUV6eSU#TVXj4_;a3Fq+(@6*g)659n2Mfrk^o?1z3O9utnG@riBfYoc?;fON zGVj#2o^2Gve=4G}=Wxj}*q{oh~?{&KM#w z4ALJTJfP{#odc!yD*w^OZNXlwo^rT!x&tL|ay~M-v;A>t>)Cfywsm3ul0s-045!6x z*qEsdvXnT4Cf@Ya;5AIe5Pd~)()jBl2lMNvgcct$SDhN0y-AtRdVZW-Pbq-SrJ|0) zoY5RJ2n}3ify{G+<;Rkw9m@c(>XN!wI}WL1ViP#; zY2>?H&5?2Qa(x`4;~1`9(LaP!XJo)|sYwB!&xK$rURUJ9G-3p&d~F7Nq~)fyMmO=A zC~P#=KKfedXRpM1tI;i05KwNrfbx_EhNnX|&TM`-uFlHg{eZ*kny1f4+2dIa{0Qh# z)Hp4{vL9?vkFYe5&;a3<3Q{SkY##T zfQ%az02G=R32^3>|12vox)5f&J)uD$5mWGOgH4!nndct6tc*Q&J|by8YW%f>!sZLN zZK2L7CNy?m?~GPJf-tl9#vgi{@wsOov9_>o!|R{O7rG++lH10{QMt;#*sgwnPXsock5Vc0VY*-}!HQ)mRV?76w19>##vm^6{7=fm z7<{(@l7i=Lz2~HVggSbgXQW2Y(Xk@M;i!E;;%9{^C%Zt&{b*oIewGn{;SX^`oTPlL z_=NCGyF@2JUQj? zQ{^2g(La;!-nyo$G`-#nvUfnU!?>8XkqB^*&!86xNWlRyEbBY-0u92$a+)>w+|CT9 zexJ&yb&<*lDF1o+fxXCm8Kuq9t?h|~x%-q{HG1ESx%VT#3$6jsKVbv83a&wdCli#v z0qAe&;N{lz;wEX~RIgIwKF}6lU>!>%Xu!vozw&Jdw@3HJWLOS;&vI95CeWPRv3sGt zbg<9g@WaPl@JYOEP$IEt&Vl$ISK9_-7TR4cn4jjqJ;2us`_F2>+9TK9$I^~}r}Uc0zaP>vgUTfJhhFO;6y zVrvQD&{C%qXFZn~8yk1=RycIbp!2RwP0YF2%<&>#X@SOwUF%5xa|rEo$*)Kk=r|G! z+ti;c$N97}@j8|}rZ(TMcp$hLTMTgwzg~FpD`chf+t?|q{KQ>Na6Wg}!Q1W$^b&_* z`G_TMqQO@TD^?AX&+mFjdz-d@Yzw3hG$hG`JtrK*Mi#(}ro~auts5f%)8VptQBh8% zrM0a1-6iWe8Od9B!GzJVsrL)eqTSmx@RV6W*xc(Vd;uZHW5TFG_^p8Ik7Vy>?{fmP zsp?PEc^aP*zWsuX_+9Bu+1XkdTi(<9=V;^`o*@w$DJQ6>p02^=pHe>3y(WA2R@gDf z{;8fII^P89QJ?(WX4s3M3(Xf8v*0dL{OA(jVgbcbTZ-f%3pgT~+sDCjS-nz+gpvFR zldAYu9qDxM^li!59oin*d=BMT2!B3G%I}Slj_5FW8Dj_x%Rn^Gt7H2<@7mRs#xY~l z%|Ms@?MTQqtci({-$b^U+QDB}!jS(3QL!WZ8NM=7OXW3j4&h$*&mN>WJP0|esxH6> z7@x7Y5o8#Q!wY_#+oOcx=Y};Ve!%z^VqdcJ5_Kn?vWkwyxIx2ExZe;kLw=W++ruhS zHM$B3>3U+nAQr0RQo2x82-1RtVg1>gZ)YNo@%)f5noUu2>cOj7Z{o;!n_aI1FW6ZS z;8CMslE)7x393YMkZfRrGPBM@j={ud)U_89y+OCNc-M`@zx>) z(jl@7G223I?Bg2MxDb~HpYcaFt)*#f`Uh_lUSI2UqQ3qJ@;aJce`369uUcNnU=*gCdezZ~C{9 zFvQR7Z#k#XDaZ%C2XZnmK(q`(krnPelYdb~{OcF_&q|5^^L_^SZ#T?-K}3}aZ$P9G zy-lKc`@S*qz z#<{9?*6=d2I59b&c)K7lQW0glN%l@kvRkgUF-q8fHJW6$j@it{l~FlaBUTsOWCaiN z!m4!7_5aib;M}@4CiU7&r+2LD@I;*i;ld}Md^{l#`y_ve z4cgw|BVh7Yt3)*p%oL3@&JFfg*3yQChDPJjAa>%Q3RsbO@RW+G=-t90_LpU396U1@Io0#KLu|M55E(o3VruBZ+IF&MCP8I zddE`wf73hh52erlyIkWBC~N+I%VYCj<3a!T9pM1cl61++8B?B_>+xx_jOfu+oE}&3 zrStnak?{|P#<4|T4%@Uf;2)mdcaq<9FyBK6UL9Ihm5_wVz$~p1y)gdNLG*b8q{A$g zaS>Q}-@JGKsGSdz1EIqMjN>-ZFo@e_7Fwt1im}9r9jaxQc>Z+ZW!;az0&{#_Mbjse zbZO4)=Vkb;0_MGo(D}X!D6?#{Cf+t=~Fb3kSD>LHZdR$6!qJ#M}aAX_uhUg6_mg zT84~A8deHe*3R#jIH21#qkE$8L<~*`Jzh)YMm8!Z!~zBT9kK?V-#&G+O-S%8N6>c$ z|G@WUm)cKc8m&q0b^Z%W8$dk%Rhj+2@hj}#s8p*lJjC{MJx#gOgC<@B<(kicL5vNbMrC~fhQrdEeAAzJze+kt{iM5*uy!t*YK_6tf^{?l zL{*~=PE?Hm%&5*Fbz}wV?!O@Ftf!E31SnPa)8Qs`8SXDR)>{Vqm@awX{r4Zqrn14n zkU51;#Q~_njUf-tB^38lz4qS`E^qYyC;n9SdO7lK;EHN2>GEMz7ADQ(4{ihY2aEpa z6|&l?byKsP(Mywmznnj~kXo(w!RSorpSShr+xn~h{^utAD}(TVz}a%e=TVuMNs7p( z09=6qk%FzYKAa7P_3sJBq-E%QLDoI#Aj$Q7VF?yVOgPd2`hNe`L>6wsu^wdZF8BcY znUp7-XN}K0`$X!f!r;2;j)t7s6+U!xUCUNi6?*(aX{%HYVuqrP3gAdJ8b?C3+Sv&rk*>Kjhus3CoB zaxJon5qNN5^4~?oVsHV#;EMqG`Y4pl1Eq!tfhLc}4H!9DdlWc?tE9ewQv|0yPEDlr zEH3!>;1Zw_XBK40Lcn))$oZ^uxQV{$N3WaHT-+grDeo#uAhx z(n!v12PArbx1c|`(4Tkq=R5mzH~x9fez!&cZ&{FGZ(;?om+nOFqa$9;^96BNkC~iP zB(SaDW)p#4NIJP}Z)R71wI=E4@oDjPUfo)8bp5e`q!pyGoY~KxIAJQ&9dGHva>EJ9 z#uc~d3!bigEH|R(5`XA9TxPo)lH2VWl5w}pl0oXR!)S?6Edy7mJj86*j;x@!ZkvzdM#SqP{0ejXz=Zu8Ul^|M+}E*vha zsHM2@GPUG^@E5?3OqhtKx`04GWPvMu;`VW z{nP|K&E-VWFUWP7aHQlcRVSMYb;0jbU%*dL%`jxp(L4Yc+53^rn`&wxREfc&I`={9 zavsd`O&~yK^`5sGmIAsYL~b+g)@mZ<;5d?D0%rFt(P^h1Btp@DF73~!_UB&v`(tnj zLOXgDN(KfSNd4|Ju@&aJ40_vtK{5))+^jmJO3{aIU)BtWuXOSm%oj8TT@R`$FELKw zoKCGfwdS%1l%{NJBCeSHLCpmyh<+i zjt>%+N0E-88FI1>%2G%BE~A%k$}hGG>SA9~$uhvCXPxxvo(4?og3evKx9|EG3CBLH zj_|3ybyk2#L(NdIEGKp zS|OvtH%ey|7AUe}zKI3~LLTQ4c}ksI5X$AOf(h%1*@@=B2eMX^R#_cfC7+)q3OJbG zv*$j&$ll0p`-ccJ?02~Xv<#2{321~LX%KLQbJhhSQY}mqnAA=^4~Y7VsP$DR4Rp>* zoZs%4<50bhNt2m$ozII!x??8!bt$L@9_wL{;_i8&!t&0J;Mjt4wk>yms(J~!T+|d1eeccv0@{O+D~yRDl0#n|E6$greF?uH!l?~Bmu;LP zg4!^Z&=8m_IwH?{fcqJSYh_))ec2&SzNhSUr&JSIeZ7P2@Pw+MNyR>xoD(J-Nd-=CjHS{;u z$#v>+yAR}Jnd?}YuLUvI@OE5vj8WaQpPO>AEOzZvsq1gJmxND8(L8#$+e;KjZ-(Xv zbzt8Qe!1@BaT-C+7%(#dNi&9RfPI?+@mABe1ZN#29sO z7J8xWqnA2inn}Omj`*uipW@tSBBUki?(xRp6X#SmgwsyNh8=y{Jrc)z#asxAlc63P zCS9Wrr#BMYNjk3kGeU!2A1qO7L`t^#kg%tLU9?7wGk*WXyZiTZG>^(39^f$4W1A#V zvc!(N-0YD_*HPRuuf;O?)|=!il=S`k#>Yc)ZRrH&V$(^+(L{u)n?=F!xVLtN9@Ej? zE0(NBh+=wWF@}RGs(I!UUlrO7W`=r|4;A;D$T8Mx&{{FeADtR zz!xHCZ8L*^a=!X=@EEyPgF(F7TzlH#OxnlO(d2a^05|C3iR=pnmOX}8!KL2k@*RS? z@fUjnK3uvl8-9$xCr*#$geO)}K&zA6Y%e}~CS0~i(N{P7N`GvX_Rjv?cGPS|JDFp9 zKHB$A>&VW!8e2+~oBWnoAnWb;>w-&z%l1c(QLMD9fx%5>8Xf^6a+#~s*#XZ?tH%JG7V8A)SZp?lO&ystcIHB4vN*tH`W=39NK zt@z7irDn&}*8ot3oV`~cI+xZ=p*c=T`q?7$^mKdA4@--iiF1ULZ+DdOt8haQZeJzK zKfor8O=9aSBI(ha(lS3DM;Go)PwRWgxgd6U#_4t_`Q-$8$$jAVo#vI>CC8wkPYa>q2WUx+gxr z(*5wUPUBA~QCP9fh3tS+Y=IxGa81kH|7sD^C(^iZIy z&SyMB9P-^-$+5x;Nk6x|xD<06@t4`3OzCwbbQx@}oo> zqBs7WL{GV%laEKm^A#j`p{s|PT6RpjdexLGMw;Ba5pVvwy%7$h z4reOV5WN8HiatIwlWMY+fu*Pyp-@TlIu=Tn&kZ?bQEOM9vo13lyBSiC|4t&p6sUX$ z<3~Oxf9!o^dC3nbGniNtOXJiCe%-d2tGMY`#q*d6x^{eIWTa_?pZ}!s%)~U0QdZpc zvu968ibb|69v8R=QnF(6j;JkJ^a1>6W$@clnB5b(d#XW(GiT8DbX9B3h@d-WJhT%us+ zls=3;5^1~F?sm%c3&WMO_wK&TE{x1f+27Q@U}VVIc=bZ!w_NjkM+$T9hp^JI519^0 zUVVBe;ktzSP3a3{(2pG=OZKnFBb#M75JyM1O!X4z^aQt31%C>=?0^4pZ`eO2<-&4mhOm8Ym*+>D)5Dx7< zZukc+-JJfPZkE@wq9tDZ<*q{h8k_-t8jw+bD*)0F7_S5huPZzYS%M<}PU%46*`1|u zR2+bei@p`eA(;U=iJ*1pq4Wsm#xIB+>_8s+VwNDaia8W@T~E=6KD*tWuG9|CeW31n6*p>T$*lVCR_R~xd$fPNypawX`$Xro7Sk`i`tQa778-RTdm+SvU2?6-Or6%-rOS@5_i#tr?T&Nh!~%@_j=H1O2-xuU2V?wm;3MEzBiH5HXbYwIJT#6vnI(ec~@3nWvfJ! zPsY^8miyY4ZmVw&tU__4>xt~71|BGAO9D4${aFO1PTHz?k|+M?#bWAmozZPet4W*5 zRzD{RL%KCEl6n8zTJxEd2s-v}XY)S(v%j`Vh(#dh3?tJ0A5vjpHUV33%F@>G(~O1_ zr`qKT8%Gl{!Qh@JR9?!vAX?(Ac|>yqGcgX^<6~0Yo8n?uU|}_-TW-G*eZ_ndVm~J& zF?>b-Svjxl*xuUttapF>IR77#1j2jr$Q*W5L(s%bpdUf*7SCXEYN&3oxn$@LLP+Fy zbrb-Q!PHJkxP@`?6Z-F|r(ZwSMi_{w7HJ zck}}gd!(B|10V*(IG~P90MKV%s-7|(x3}y6jBWLEyWF-)V#oP;^Rw69+uG_rnLJgH zXJDKZYciHAk}|$4#l54wQB86}NKlGk*wYEv;rOCFD_>_z`5}u!ww6}+y03AkLR^Mo z+rBP_D9txi<(a;EFKu3MN$cUw6%Z(N|M8Sf!!623z?g#yLzdpP5rVN7R#E>9FtQ%`q`EW9CE(c=HkWBp$)-#|kiMMwa$mllAh*~M3bm%eX8 zxjwqHhby4o;e=7*uP#%Qr_J`5;CT-)5zrfmVZ$hJTb6A9cFw^}8uHiBf1}SqxRIQK z#)Nn&Nn{$HPjXBJzGYTF&-U*QOqxtXW>ppiyXbBdZy>sLOxpBh##OJ#lih;GVS->{ z+1X=)vsF!nmsKH-Yx6<&dyztauTSFaMr1XY>C3F!wPr=hbKL%!gs!J)yzr!}?%!S8 zVVr8Ppb-?ily;Pi7nIL8=Jv~WyS&NltD3ba>4}LmrScGm=#O*mo(B4X0a!RuBw^Ea zUP@L~}z?~g@7dX6nYtkLHooM)Qt&)V&J*9$oMVr87vMG|}U=+b|D+;iGt#-|aE zQa(~?Entxd4Xn@5Zj4p!n#Bc_TR7XBw3nwjZ)6wm$KCZGU4@Z3d>~Li%?MYwDlMPghrE9_6FG%(2aXtdXWeyz2NhCG@m(9UtCllb~mITzm~ z8;ACh@xTamBRjqTQHHiIB;|BHIuqc$QJ@J%h*$;qOD7bm5kBzi$VNxl;?(a$X?6}6 z>Pwr^ZYWM0#z72dTwZ`hkfyyv-JAA;wE7JU_ejuMfxuboUo}=93Byw}X59VB<>hHtyOKKS8)f zUVs(FH>+&-t)<>*d9A+3jarbH8e*cvs=feDD}Ao$Q-XrJCkl_A4h@mKUbpb>d@*!h ztOZR&K8LFqjSCWSO`U=EyImCe0d$kvMUA)|a=aTSBAFELyY6JP!*S-Q&>DsJqNwKx z&H`fU(NeYkr*an0JlXr+wd}a573L$yiwo6`7s0V@KTIUGV4N^}XTU54np_*5gLu{y z`z?tJSVGbJNf@(y%FxyDrhr#om7;-9l2@363drY)&A7=0(-U6mhf(&O(+CT!0F!jU1kf z`S5`hQ~QbT$!Rf&{oVzg)kw@UEnf(q;3h=8tr}-ljb5 z&fBr5Yp#9fTIWU=uTZND2-PH2cp}hgO*l}59tEPp;~v0b@m3s~;j$Nan+@ZIxMJEc zOkV4O0lJBmmz!>OoOpi3E?taC#DIp;^`p}1-P5B#^2j`PRQ>iQ7(u}jkXzAjs+3CE z-cKLFM)`c0PzwOtLJS1Y0rRtz0O#35!Ra8%=$sgt9Y)od{xlX&sBPJUAe}e7xW00;C7+gUqNL9Tevb9znh<;6Zjoi{rw=##x<1}x@+wQZ zq2zI9@s(UOD?cI3J>UFs`*v>#lvhqB9xzGDvBs$JmDUZG&$6|Oylf1L5o|h|>uc$m zeRZysBj?hI93f({#MssH`8=iZ%g&~;Z)-WIPk}D7am06&?qx$ou*W^4x}fkZg(Pw<3v;oYsqB zzRLZxfEs(xTFNfGQytp=K)ev6)}(4wVkTv~K-!#z2QnQbm; z*!G;jp3I3`i7S~T-kq-~NSQw)r_?+T#$)$t|RzO=xPm&8OBgPcJ z_NwMm@z=@>S-)*Bd?sDBvqT)~mHUjDEHb)m0GKoA3viEkFQhXzO_C-9$INPm<|{oL zaygEDRhvv0sdaW3UXym#);KkPhS#xoazb)P7&}Vlk(pDBl0RC$4JCS*;rzQBH3ts- z!wT>3xty>(2SJu_rc;b@5wQqKP-F4U)nZk^wX?S7VPs6bdJkKh~*~BX9u@usSN#eF~|1OFl&a@FN%JxwAqq$UFU)kF- zsH{VxC(F%JhV{m6ij~=tSqm#s5)NKV1crTYJEA5cOhw&$MqtSOSy#bF;~`-^7fB6C ztvIC%8Lu{{?k2_t_jxawtT%RzY5h3)Q9bwjMo^yI_O<2(5C_2a@EZ;~ zq^NBqnNQ|i=z6Insw-d?c-vx1)5nc_O6*d1^qL`5@Nh#^BeG8W67s{wio;p60YHj1zc4;ii_H@c5%xMMPB@+V2nHoNa za_&ufoba7!`iZ6Ntw&!AgW?NblasAXid-iXqN0efv zZW;`8$K;vHn#J&7GMQbe#}`P~Rxvzi#3j~ngxrMShZ51qsCTs_^(wtk-phdn9>3iU z+?H|o8;_UVRVIW2tB``=ro2@m>LJ>l$~JkDZK|a#iy?hpL9EM5 zY^hzT1HJUq0xz1Gi{~J<;@ZznOg}80mAEK$KW_qXWH+ ziHOKFc3qD%aVaexXP?G>4Od}*BM>}q_I3C}bsoQPDffFZ=dwv~mKNn<%9y!NRcYR+ z5>#~3h*PB1jLQ?<^2CPAKK$HDYsY949#Zevg}az)M=N-R`BXz*=HHXPN8tbMMCKyP z9_21L$tK9f9)vC+1Y`zXv^SG5Y?%8Vp#+Q&!VG^0Yv1`{`5sOvn;;gHIIE7#>v_0H zIAU)-Q;;~*&@Phy3G1L(id^(NId;WF*Bhn{f`E98&{jn+Gck=2glAqiR0xi<)HXj^ zVtM7Bw%2i|EKPB3h)+trBw-#CiyZfv|M8xrMD4fX#_!>hMwo>F=T&<7g`*xN-*53c zcT6Xq`i++SP&t~~J(tPE~~!grA5mst1TN9tbOzotBzpq2b) zNVxXuvMARi>@9k7VWAfX$X@OxLnz(@(U91{p@Y!!dsGys9@-hm6{N8tThKXEPInfZZ(~@yTSxxvb!%w?L&_O zSe3+iv?36rLSj*k9xRG6YT~}pgUvPfMNRe6l$Rb~EV7hrhASK9(F+otn#+4&g}E_mEs_M7@I$U}Lx;Z|oD&H_z4 zWxavdZlY)#R`kx64ZW{RhHmLHgVCGzb>O2#3wDCESa}UyQB`tg-(h8=o8~x6!kYoH zAvIoC2FpoN)4DG*S(=w12drVHIF3+M^w4Yq;hz|A=19}at_vj+si~T_2T@V{j~T9ryi_&bCbSR* zvk=E|fVq`sf!VrF^__3(kd?W`^hd>?FpU$BZ+y3Zti{rFm-Y2;GV)bJYddXLHL8(> zl3KH|!_;U1zw(lKP+xh{vm3F7;r^+4c?B=are~WSBxUyNa-!#0^Ij822Qg(RG8f=c zZJ%Yc@IALFUB^4`N?@O~eCVi9S(6gab6(m`SuZo#{$7_5@00nePbu@l|K!%9KTIdX zG@Y}uGJU1)C;j-L8GiC^ZSBka{A|(RG9k1{`hGta%guiLf&fU4C;{K7!qpHKwE8`^ z$X=hW-7H-xk(?-qZ(DPUSAcG6{y2VM;X#x_M(}KiVwzm5DtcuVO8CApmNJ<_i4=dX zox&T#LombcGcVr65&g<82_c6*5sbbF$yz z3x2E0{bqN%@{N(lS8>LARrkZ{Z(P465Z*W+ebR3TQ9j({CCu%2c{eDUd>#1bkP%-6 zy|3wMO_M~ar`<2tp6H!Z^_F9gC3%ot`xwbQt^~h!H5R-fiAOIzJ$UABehM~d|bz+rsinwiAAu5`ny)!W&PSdC>z36aV z8+l$gw6XEKnrSGN$r>A8C;k+dg_jD@Nw4z|qu|_LAs6;W4JBIipK3A4w%#%5L46rA zYn?4i+gvB9Q3t9zu(QV>-f_-6=Oy|q&YXkkb!A-leFvZDM-T({{pU}FaaH;{(wA3?Sta(ZclK|XXZY!!%b|E zui{3#6Ps;K_KumAb@`h4SG|kqqJ1wFHyjM!jx;4_4+@G0PSM#XRiU;25&RUXw^Ymig|zwK%wWf+3I&pHXp7le;BLsTJOl1>CDjYTv^M7!|=65Lw!Yz>(X?C8Hq87mNa z6g0*$;RWBDbg>p_q=n<#PuFx(2gCxpev4ca2_JTNrq=zAWa`&?MUPvQI}jtHB9N4m zp_Z7{@QmmJbVzzoC*_rPVG$^{XZ416ehcQ#_%>1{n>?Z9ZYnOK_WtfdeIT#Rt<_HH z0n@7sB75qZ+{~@5^|^IvKAwdaujei%j)8H34o9))kj3QNvJXKF!4otM7^a{h=-k1I z-e|r%Q`aBQf9v`P35Xkc(p@ds=BYfYKF2!APq_+ z_#^Ft11;a%N%_YJMKe74R#U|@F9Pn(jH;!AgMOqbT5=g039DG%=)sj4rD@~aTinjJ z-wuxMauom}#FwbF{0{EVDSf1i48>eaV$KE8#(Gaz)+Co;jMOQ3DLj5Vdk~?Dhv|@R zwI5B3KlJlfp}*t%GNk>pKxR`zzP2vAeOzevb9Khkp?#qSx#AkSlE-BY9fJS}(D(?r zi!(SRwc2&|kUK8Ghs>T#)d$3pNW$d~01uc}%)@Y&u!Exr;022<_NifZHsDdv*@GQ} z#G@#&JIGb;qCi2z1D^K7wO%#Yw#?y5P$MXK9n3=~nhDOh57kexXm*4FjuM~ebSBzY zWa!N7iRi~2=T5$GP+=Q8z1NDE67Pf`uU@GZt=<*n*3%yUJNmKjBCB^QHmaFpWq_yyU&vtu|+jufnuQn=4@>%Sz zcgnYG4U6*)dLV|Hdk1))iW5J+m0q6@M~O5>Z&ih_{Sb(UjcPEpCur0%R+wDnL^bkI z=*3&zdrLo}uMnSr2-2r@Q>r2%TupqCtmi7E((Ld!sqV%uM;i;VV?$6Kt@ZJhg}0pn ziJr?$bU_B{3&oBkdCfw7Lz!}xk-hf4Z=f_}=DDYf$Yd$MlcgrY%nuw= z4od6=Y0aEp5YEE!jyBth`q!}SFPq~?fzfh=JZKxCMLc+8PL{{dBp1(A>Xe5snQnu( zJf1VD0NF0%F2_}zMV~LPKWbvTdyCL{KI`)Zs!)S)<3b`{yXB&9t8{M+|J^UVt{0Kz z8EvnYLw}}94PtJY5&Up2D%#M-Ul3Zc*c;h!Yo=R#5t+Ifn;|1GShv_)s^jMPvi$PI z_U09mG!fZaMhs|yv8%{C%rhNJA8}r8s4{=|n%`AZIGI#wicN`>P-mnw>z8PJ?r??i zrM5revI?R=OT0O?{TyFNsJ9PK^iRXcUyxHlT;$UsoeT33F>V;FQA+{8MHa3wJl2aF}*J$9muBdlQ<9Y2NJqRpU#?6#Azt?PiMaJ&by)RO`=?uSKZd z+%>Y%STLMmoO5b^>sF_@upPavz4lTNtC{ z`I!=8`92iUw|JWC75854Ep%(@N#W&xE?oqv&0E(g_KEwH6Oc$6EOxC8pk~ z2)+{v8aG_C(8oTMJ2{)RAaS>UL82PuiFzanBB~X|T5(0r&AHdkRdA8+*n7R0SGp%2 zsZX@ZzK;;Ta#Bg2uoUF^_t|gFXLf@+&aK#jTJ^~iGTs-t(7PEhzjtoG=e4OVdPn!F)m#AL3F-k7(;wiNFJGk)#b? z+6LEEL!t;P`K{M7CB_1XZdIaJ*BUY|b!T7CJNx1F4=ir$$&VkfWK&rgX2wbZ zVQ})BUc1L@I;O%j3kXhum}ZD4cc=sviEISbLVGx54SsAJR7+%NR|toSQ3!bvnNO4? z`7n8=D@*rY=V~^+&hjzkuzRB4SoJ`G`UKf19dv$O4MHiDV`ZK+=*l5ZNXE$?3XqFU zc{8W+gPymdY1X)ZW62Sa#IDRg-l{)8o`p4jmVaJ%`to5(R`d=uau(Wfj4XT(7G7ki|_nhZ*GpHISFI^VE8 ze$p;KmnlK12V$}e>!rk}*2Ijwz#7J#MV?Pj0{E2HisTE8TaK;-xwA5+4=DL3A@Zd# z*RAGLCe>=QzHA>ssN;TDZeyM#He!>l>D(9JqZvNGbML<;I&}$Xs^_ zGBtHPz_FEaa4^^m94Y}I`9p#`Cw>}!2NMO(Up&~ zA2RDuyFjT08w^Gd*8_}cTyl9|USL}j({4ld`3o0bdn(5+`V@zLg;pwVG~!{#FETh{rzCKv1i7saQ>2=m;P+7)%d&?OvEfp-Gvzi zd~amoGkrSxvpZ|g;(2EjPsc@37A`KC$Xb4u&nrz$cQ=&X^5HW3*1$yp@7>;z&$Z9j z^%^lPui^dEv&|e<+D{#mbe4}7NOc>v>8hMi6w3|t(!6;&JXzoWg=1#-zh9J&J`c*h zfQ!7CXz~jp9)+T|3qA$p_ge*rVd$lGtQq;kIV4HItCu2HgI?po7&IeU)FKb^QJkP9 zpz`!zrdPj)|NDxtLh>X{-^}esBt%VwSZ0{qSvR0^rNC;kDhEHI(+?$WbCaJTcyX_U z)QHV zGrVB;{m%4TB@^QlWh|zbMT}K)4e^zI$mQSAJ%*FDgwr*YB!qg-TBhL8k5Luwd4(k9 zD_hqo`4jWprq0sGCE8kpr}^`X=T5rudm;<{$vq$)DR=Q61<}6X=F|$GzM{pT`&qI4 z+RIHkpyczd8IOj^^c38zySwykyg`_WUVr?NuMC;Jc|ogWUWVScb}qBpbCliJ96Kae zzkE*FwaqJ2boWMzM)10DfZ67qnj3K_NK#p42FT)JAL3Fs}>h@0z5@85<_?ChQdD z9_2M=E(vwwS;El?*V*!D{dpMs8har+cXF!7)yY=i$XTc0>{N3z;@H)9Fo_Tb0$GyC zyntav$Phc`K;}LpG3YS7+spj$_Ct<|rn|b5mX*Y&v;*JAd8nI|K7c&-lR;HFE1(!T zOY)#f)OWX~_%_LX?$R8aZ|-ES9`;X#0ThKOlGgP0PGfp_6-gxn%}Pvdx*`@~kU6hc zt2Z5O_>#|dpk0{#Mc_s?Hk@UNoI;5LG6ifw-M=70yMZ?YUQ5*}7FxA_SSKX$uxGeH zAEdne1?kdrRI`0!{~$U0BCHUOJA}PJ?izaal72zl07hswhi*mltOltOKP^B7S5iIl zR;j`xUd%UVCayCzb5A#SCzjaAzAtI#+F3JMI%eEb1by6cGyUP+eb^U&su^-F7gNDg zg0EU|&&B=JYVaUlM=(AWjVr%Y!ag;txnni0#K@u%9xwduXtk9GNUn4y7-QTw)o52| zu2w5=J-`iJO@4i)JI3*xazkDbQUHEjMJ4DQ!U^XSCLeJbjC7fyR|#e;ElbpC@5FDq z0*l)s=|4SBsQ4`#!|hkvhrErf4M(A4>(pcB?}1nYOB&vg5R7RkkFgGuE~oIdjxh3+ zGWU0RNlI4Q8=tbfmaE02psTsx8$FBDmI?JAiF=~h1Z7_f;u{&_JmLQ$Ch-0u>zA)* zZ@q@K3F1fXo}tGgv!ahC9c9xNc*t#{#eMe#1hNA8B-xw!fARL-QB5~p+bD|C5tUw} z6j7>3ud&e)M5PN+5orPf(jifl-a$Y>h)5F8=W zo^}2_|3OHG{AOm)?0sF=-rGIgbL~NO>YXo2dQJ+ZfBQ|HX(y*q)Zqh=i%lXEqzAu6 zhU5yjT_hJi=p|at4)A^NmSBqZ35l*2K3)H#SwZtP^gpTR-Ty{Ne`jSE8~-^1um~(& zvF`1t$p6ACJ0V*1p>BOlviE4pHv zPWwU@X+t#x6vySEkUMtHSMp;`omHJ}l|S61TC}*EeK)O#N-w6vA_z&L-z6&eGU8JS zqgNtuyq2+Z27{k@-mTx7kg9xwddKD}QzfS)dwvQZf8L`%>oAZ_$kMl{UfgO&>8VAH z*!}54$T%(j6bK(3Tny(H!#WuKUTW}~>wjEQj> zInOa&AkFd1pQ=*xb^HZk4m|c!?A2#6x4#HVody|zRM*d5`THIY@E(V%1ars#_dU^P z@7}%tw<12(6NW)lO4rhwP2kYf7j+djHueM(pu}7Bpv!nT&^=?U!OpsuQdvk;ru5G7 zq1|8tvxMq)%U^?kyzjB`q=rkI0oBas3zL)W476T1Yhv_r9itOIm;$Of_yeMQi=+=? z|2lh0hNSb!EplW&4ks{xg^uol>YGTC4V2(R9GEC02 zYdvg>7k6@mk0gJ34dL7z_M-?6Ss%n$?8%DEe12>&w|$SbOXwBN>ZMoWR`^kJ4kzB0 zz*6jsZ`YO%m$rUA!*lJr3FvOR zMbY+gz>T2+OD_nu+h)8QInd#`sc~f_l0{`hA6<4i(BoO?*;AbA)UpXPF}|s!3vSJI zFEtnmVYnOmPbNcVvuP6e){5@9U7Xg5`oo=nd$!(e2<;~Ra!K}UQQf1N#4STsW=;V| z@hXHew5pnPkuork3HD-%LQ@~AHa@)ld!(;$-DgF(wyJudPmNWuAdL^v8C{?3F_l3p zAP)|VKJr&D)H?|8>w(a^zJ0~u20xD!*;_(LG0gpp<*M3f0k-n($UDtfo2$H~pkISL zHHX!7zc>l-k8O|b8jiZGRMdu0w&MFkmCqAzBr+pdR1TAO-!%ArT_1Z;VFu?P$&XZq z#yqe1SX4d2-sf%S8y1kQ*C;pEmt1x&*-qtw57L`EGawfmwYkW*G z_|u7?MPCz^~TKLu~^eF^q1 zfiDwODRgsKj;_{1+a)Bcb6pc!kVR#$$6R6o5XAY{)nuQroHz_*HN56VV72(g@5Rj{ zW4$UWBfRKIckq5vr&;6|LWgK$Z;2k89J8|SBEPY`O!?((!vcKEf}!m^f-`o?@;S{S z#;l=QYv*Esmk;FjGgwb8f*|;EXVR!+^BG)cZE!ls+U*vYMa|dGis}ew9|WNGOWAU| zVaYFpvH|H#p|8gB;-d&@2pp`FCm)@+X_;$^n+B2>7ru+U4k>IN<&*s_4HYIzPc-hk ze@Y@%Z`$yd4#NfK2)F5lomH((t=PRU^*q!4bu*EQ_lL4lXMi_q#}FMp$ByWJH3r>! z1^}a>&Y}g<-Q_%P^^2w)8lOzkt&oF?B;{f}AV{)vIw1t!0wB$6Lf_UnO=7~DZLMR6 zjR+R=oOKy`!^`Q$@&{3pzsd|(W|p7p3@a<~8sDUHpKVNxJnkV(R&q+Ly!JnzLs#E% z76|0?3)ZAb>}C`L43IjXA3`4#itjB^=%)Um61}wuC9+AQ51Lxh#sHx#Lhrq35(d)e zP{2&(>B3SWSgpBZ6&B#Rk7oygm+SYf7>Vf9`G zjQ=x6QZM>ymbbWX+B#BA?&DUO`tK~#q`9qbLeA~Lrx~Jahj$b@ymKZHKG)P!WMQdu zSUr}QIcy2SAqRW(sAjLiExZcoAuh*W@L~)anv^+u*-ghkdCN>1|B0D0f-oYShSj57 zqbb?q$6#KA>jObp_kL~3CJpPOT{D;GOEc#+_;9bOz`s~Ht&6tjy;e?LxsJN?$wfjv zPE?bij_m?bKP%~`_IRM;Q~9MU-f7mHNAA}s2W9Mk>hy8Q&sB29uxCLuG~m1ip^LnN1}i0cG26BL@HEz>!O`rAa?q|Y53veZ=__x zQ*d1S5-u!kt0-$+b*?Ljs=UqiQ*zpI%qie~40Vs+l6xw0C-NO=5`R&4KEHB)MsI)q zed;V9PV<|QB zUabpLO}$&?T(bwQf7Pi3fo}cOZuI?t##$InB=dc<;ljO+R3*nYBUDcgpQ^PQWx@`K zv1UB<9)IAh6c7lok#1pG@o%xIG2d1ayDMh g!m^^Q|KehSuyYVLlJd~>UfYWycV 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 F{{m386qo=2 literal 0 HcmV?d00001 diff --git a/blogs/serverless-llm-architecture/images/outlines1.png b/blogs/serverless-llm-architecture/images/outlines1.png new file mode 100644 index 0000000000000000000000000000000000000000..661071d83d2d89b6ff827f3d29d83913593ecfd1 GIT binary patch literal 117407 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%0D#|lSnT9Fz&6!548yZ?!H~5TOWEJEcesodZ)Mc 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

bXlqoRQuf2J%INIdx~z8`IVt=0gum4 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

?vYR#|3b{> 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 literal 0 HcmV?d00001 diff --git a/configs/.linkcheck.json b/configs/.linkcheck.json new file mode 100644 index 0000000..7d2740c --- /dev/null +++ b/configs/.linkcheck.json @@ -0,0 +1,28 @@ +{ + "ignorePatterns": [ + { + "pattern": "^https://opensource.org*" + }, + { + "pattern": "^https://twitter.com*" + }, + { + "pattern": "^https://platform.openai.com*" + } + + ], + "replacementPatterns": [ + { + "pattern": "^/", + "replacement": "/github/workspace/" + } + ], + "httpHeaders": [ + { + "urls": ["https://docs.github.com/"], + "headers": { + "Accept-Encoding": "zstd, br, gzip, deflate" + } + } + ] +} \ No newline at end of file diff --git a/docs/.DS_Store b/docs/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..25135e78fda58412d6eed8d5a60df4d42ddeb6fc GIT binary patch literal 6148 zcmeHKT}s115S~p-spv!TLHZ=QLh%A=i6`g(LEuXkC@<`_DJ|&MW-6M~JDq2N(IA4Z5TK0AxPs@uJ_Z&{ zYwjgDCRNN7y&xbnKr7cXFAa&BlN+ z5Hrw|#}U_m^j(Mg|2W8=i~(cdUoqhN`8=QDm9(~YUXE*Rim||8VLvap3&A3kV)$|? c9%BT7KIH{4Q}lw+K` + Model name to deploy (must be a HuggingFace pretrained model name). +- `--config ` + Path to the JSON configuration file. +- `--backend ` + Overwrite the backend in the configuration. +- `--num-gpus ` + Number of GPUs to allocate. +- `--target ` + Target concurrency. +- `--min-instances ` + Minimum number of instances. +- `--max-instances ` + Maximum number of instances. + +**Examples:** +```bash +sllm deploy --model facebook/opt-1.3b +sllm deploy --config /path/to/config.json +sllm deploy --model facebook/opt-1.3b --backend transformers +sllm deploy --model facebook/opt-1.3b --num-gpus 2 --target 5 --min-instances 1 --max-instances 5 +``` + +#### Example Configuration File (`config.json`) + +```json +{ + "model": "facebook/opt-1.3b", + "backend": "transformers", + "num_gpus": 1, + "auto_scaling_config": { + "metric": "concurrency", + "target": 1, + "min_instances": 0, + "max_instances": 10, + "keep_alive": 0 + }, + "backend_config": { + "pretrained_model_name_or_path": "facebook/opt-1.3b", + "device_map": "auto", + "torch_dtype": "float16", + "hf_model_class": "AutoModelForCausalLM", + "enable_lora": true, + "lora_adapters": { + "demo_lora1": "crumb/FLAN-OPT-1.3b-LoRA", + "demo_lora2": "GrantC/alpaca-opt-1.3b-lora" + } + } +} +``` + +##### Example Quantization Configuration (`config.json`) +`quantization_config` can be obtained from any configuration used in `transformers` via the `.to_json_file(filename)` function: + +```python +quantization_config = BitsAndBytesConfig(load_in_8bit=True) +quantization_config.to_json_file("quantization_config.json") + +``` +Then copy it into `config.json`: + +```json +{ + "model": "", + "backend": "transformers", + "num_gpus": 1, + "auto_scaling_config": { + "metric": "concurrency", + "target": 1, + "min_instances": 0, + "max_instances": 10, + "keep_alive": 0 + }, + "backend_config": { + "pretrained_model_name_or_path": "", + "device_map": "auto", + "torch_dtype": "float16", + "hf_model_class": "AutoModelForCausalLM", + "quantization_config": { + "_load_in_4bit": false, + "_load_in_8bit": true, + "bnb_4bit_compute_dtype": "float32", + "bnb_4bit_quant_storage": "uint8", + "bnb_4bit_quant_type": "fp4", + "bnb_4bit_use_double_quant": false, + "llm_int8_enable_fp32_cpu_offload": false, + "llm_int8_has_fp16_weight": false, + "llm_int8_skip_modules": null, + "llm_int8_threshold": 6.0, + "load_in_4bit": false, + "load_in_8bit": true, + "quant_method": "bitsandbytes" + } + } +} +``` + +Below is a description of all the fields in config.json. + +| Field | Description | +| ----- | ----------- | +| model | HuggingFace model name, used to identify model instance. | +| backend | Inference engine, supports `transformers` and `vllm`. | +| num_gpus | Number of GPUs used to deploy a model instance. | +| auto_scaling_config | Config about auto scaling. | +| auto_scaling_config.metric | Metric used to decide whether to scale up or down. | +| auto_scaling_config.target | Target value of the metric. | +| auto_scaling_config.min_instances | Minimum number of model instances. | +| auto_scaling_config.max_instances | Maximum number of model instances. | +| auto_scaling_config.keep_alive | How long a model instance stays alive after inference ends. | +| backend_config | Config about inference backend. | +| backend_config.pretrained_model_name_or_path | HuggingFace model name or local path. | +| backend_config.device_map | Device map config used to load the model. | +| backend_config.torch_dtype | Torch dtype of the model. | +| backend_config.hf_model_class | HuggingFace model class. | +| backend_config.enable_lora | Set to true to enable loading LoRA adapters during inference. | +| backend_config.lora_adapters| A dictionary of LoRA adapters in the format `{name: path}`, where each path is a local or Hugging Face-hosted LoRA adapter directory. | +| backend_config.quantization_config| A dictionary specifying the desired `BitsAndBytesConfig`. Can be obtained by saving a `BitsAndBytesConfig` to JSON via `BitsAndBytesConfig.to_json_file(filename). Defaults to None.| + +--- + +### sllm delete + +Delete deployed models by name. + +**Usage:** +```bash +sllm delete [MODELS...] +``` +**Arguments:** +- `MODELS...` + One or more space-separated model names to delete. + +**Example:** +```bash +sllm delete facebook/opt-1.3b facebook/opt-2.7b meta/llama2 +``` +**Example output:** +```text +[✓] Deleted model: facebook/opt-1.3b +[✓] Deleted model: facebook/opt-2.7b +[✓] Deleted model: meta/llama2 +``` + +--- + +### sllm status + +Check the current status of all deployed models. This command displays the list of models currently running in the ServerlessLLM cluster, including their state, GPU usage, and endpoint. + +**Usage:** +```bash +sllm status +``` +**Example output:** +```text +[✓] Deployed Models: +- facebook/opt-1.3b Running +- meta/llama2 Running + +--- + +## Notes + +- All commands should be run as `sllm ...` after installation. +- For advanced configuration, refer to the [Example Configuration File](#example-configuration-file-configjson) section. +- For more details, see the official documentation and guides linked above. + + + +#### Example +```bash +sllm status +``` + +#### Example +```bash +sllm-cli status +``` diff --git a/docs/api/intro.md b/docs/api/intro.md new file mode 100644 index 0000000..f3a7d29 --- /dev/null +++ b/docs/api/intro.md @@ -0,0 +1,9 @@ +--- +sidebar_position: 1 +--- + +# API Introduction + +Welcome to the ServerlessLLM API documentation. This section contains detailed information about the various APIs provided by ServerlessLLM: + +- [CLI API](./cli.md) - Documentation for the `sllm` command-line interface diff --git a/docs/api/sllm-store-cli.md b/docs/api/sllm-store-cli.md new file mode 100644 index 0000000..5ab0900 --- /dev/null +++ b/docs/api/sllm-store-cli.md @@ -0,0 +1,242 @@ +--- +sidebar_position: 2 +--- + +# ServerlessLLM Store CLI + +ServerlessLLM Store's CLI allows the use `sllm-store`'s functionalities within a terminal window. It has the functions: +- `start`: Starts the gRPC server with the specified configuration. +- `save`: Convert a HuggingFace model into a loading-optimized format and save it to a local path. +- `load`: Load a model into given GPUs. + +## Requirements +- OS: Ubuntu 22.04 +- Python: 3.10 +- GPU: compute capability 7.0 or higher + +## Installations + +### Create a virtual environment +``` bash +conda create -n sllm-store python=3.10 -y +conda activate sllm-store +``` + +### Install C++ Runtime Library (required for compiling and running CUDA/C++ extensions) +``` bash +conda install -c conda-forge libstdcxx-ng=12 -y +``` + +### Install with pip +```bash +pip install serverless-llm-store +``` + +## Example Workflow +1. Firstly, start the ServerlessLLM Store server. By default, it uses ./models as the storage path. +Launch the checkpoint store server in a separate process: +``` bash +# 'mem_pool_size' is the maximum size of the memory pool in GB. It should be larger than the model size. +sllm-store start --storage-path $PWD/models --mem-pool-size 4GB +``` + +2. Convert a model to ServerlessLLM format and save it to a local path: +``` bash +sllm-store save --model facebook/opt-1.3b --backend vllm +``` + +3. Load a previously saved model into memory, ready for inference: +```bash +sllm-store load --model facebook/opt-1.3b --backend vllm +``` + +## sllm-store start + +Start a gRPC server to serve models stored using ServerlessLLM. This enables fast, low-latency access to models registered via sllm-store save, allowing external clients to load model weights, retrieve metadata, and perform inference-related operations efficiently. + +The server supports in-memory caching with customizable memory pooling and chunking, optimized for parallel read access and minimal I/O latency. + +#### Usage +```bash +sllm-store start [OPTIONS] +``` + +#### Options + +- `--host ` + - Host address to bind the gRPC server to. + +- `--port ` + - Port number on which the gRPC server will listen for incoming requests. + +- `--storage-path ` + - Path to the directory containing models previously saved with sllm-store save. + +- `--num-thread ` + - Number of threads to use for I/O operations and chunk handling. + +- `--chunk-size ` + - Size of individual memory chunks used for caching model data (e.g., 64MiB, 512KB). Must include unit suffix. + +- `--mem-pool-size ` + - Total memory pool size to allocate for the in-memory cache (e.g., 4GiB, 2GB). Must include unit suffix. + +- `--disk-size ` + - (Currently unused) Would set the maximum size sllm-store can occupy in disk cache. + +- `--registration-required` + - If specified, models must be registered with the server before loading. + +#### Examples + +Start the server using all default values: +``` bash +sllm-store start +``` + +Start the server with a custom storage path: +``` bash +sllm-store start --storage-path /your/folder +``` + +Specify a custom port and host: +``` bash +sllm-store start --host 127.0.0.1 --port 9090 +``` + +Use larger chunk size and memory pool for large models in a multi-threaded environment: +``` bash +sllm-store start --num-thread 16 --chunk-size 128MB --mem-pool-size 8GB +``` + +Run with access control enabled: +``` bash +sllm-store start --registration-required True +``` + +Full example for production-style setup: +``` bash +sllm-store start \ + --host 0.0.0.0 \ + --port 8000 \ + --storage-path /data/models \ + --num-thread 8 \ + --chunk-size 64MB \ + --mem-pool-size 16GB \ + --registration-required True +``` + +## sllm-store save + +Saves a model to a local directory through a backend of choice, making it available for future inference requests. Only model name and backend are required, with the rest having default values. + +It supports download of [PEFT LoRA (Low-Rank Adaptation)](https://huggingface.co/docs/peft/main/en/index) for transformer models, and varying tensor sizes for parallel download of vLLM models. + + +#### Usage +```bash +sllm-store save [OPTIONS] +``` + +#### Options + +- `--model ` + - Model name to deploy with default configuration. The model name must be a Hugging Face pretrained model name. You can find the list of available models [here](https://huggingface.co/models). + +- `--backend ` + - Select a backend for the model to be converted to `ServerlessLLM format` from. Supported backends are `vllm` and `transformers`. + +- `--adapter` + - Enable LoRA adapter support. Overwrite `adapter`, which is by default set to False. Only `transformers` backend is supported. + +- `--adapter-name ` + - Adapter name to save. Must be a Hugging Face pretrained LoRA adapter name. + +- `--tensor-parallel-size ` + - Number of GPUs you want to use. Only `vllm` backend is supported. + +- `--local-model-path ` + - Saves the model from a local path if it contains a Hugging Face snapshot of the model. + +- `--storage-path ` + - Location where the model will be saved. + +#### Examples +Save a vLLM model name with default configuration: +```bash +sllm-store save --model facebook/opt-1.3b --backend vllm +``` + +Save a transformers model to a set location: +```bash +sllm-store save --model facebook/opt-1.3b --backend vllm --storage-path ./your/folder +``` + +Save a vLLM model from a locally stored snapshot and overwrite the tensor parallel size: +```bash +sllm-store save --model facebook/opt-1.3b --backend vllm --tensor-parallel-size 4 --local-model-path ./path/to/snapshot +``` + +Save a transformers model with a LoRA adapter: +```bash +sllm-store save --model facebook/opt-1.3b --backend transformers --adapter --adapter-name crumb/FLAN-OPT-1.3b-LoRA +``` + +## sllm-store load + +Load a model from local storage and run example inference to verify deployment. This command supports both the transformers and vllm backends, with optional support for PEFT LoRA adapters and quantized precision formats including int8, fp4, and nf4 (LoRA and quantization supported on transformers backend only). + +When using the transformers backend, the function warms up GPU devices, loads the base model from disk, and optionally merges a LoRA adapter if specified. With vllm, it loads the model in the ServerlessLLM format. + +#### Usage +```bash +sllm-store load [OPTIONS] +``` + +#### Options + +- `--model ` + - Model name to deploy with default configuration. The model name must be a Hugging Face pretrained model name. You can find the list of available models [here](https://huggingface.co/models). + +- `--backend ` + - Select a backend for the model to be converted to `ServerlessLLM format` from. Supported backends are `vllm` and `transformers`. + +- `--adapter` + - Enable LoRA adapter support for the transformers backend. Overwrite `adapter` in the default configuration (`transformers` backend only). + +- `--adapter-name ` + - Adapter name to save. Must be a Hugging Face pretrained LoRA adapter name. + +- `--precision ` + - Precision to use when loading the model (`transformers` backend only). For more info on quantization in ServerlessLLM, visit [here](https://serverlessllm.github.io/docs/stable/store/quickstart#quantization). + +- `--storage-path ` + - Location where the model will be loaded from. + +#### Examples +Load a vllm model from storage: +``` bash +sllm-store load --model facebook/opt-1.3b --backend vllm +``` + +Load a transformers model from storage with int8 quantization: +``` bash +sllm-store load --model facebook/opt-1.3b --backend transformers --precision int8 --storage-path ./your/models +``` + +Load a transformers model with a LoRA adapter: +``` bash +sllm-store load --model facebook/opt-1.3b --backend transformers --adapter --adapter-name crumb/FLAN-OPT-1.3b-LoRA +``` + +#### Note: loading vLLM models + +To load models with vLLM, you need to apply a compatibility patch to your vLLM installation. This patch has been tested with vLLM version `0.9.0.1`. + +```bash + ./sllm_store/vllm_patch/patch.sh +``` + +:::note +The patch file is located at `sllm_store/vllm_patch/sllm_load.patch` in the ServerlessLLM repository. +::: \ No newline at end of file diff --git a/docs/images/favicon.ico b/docs/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..4ef51a7c4d8cb55f59100813fb8ffa9c88795d74 GIT binary patch literal 46169 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 literal 0 HcmV?d00001 diff --git a/docs/images/logo.svg b/docs/images/logo.svg new file mode 100644 index 0000000..0e459ae --- /dev/null +++ b/docs/images/logo.svg @@ -0,0 +1,302 @@ + + + +image/svg+xml diff --git a/docs/images/serverlessllm.jpg b/docs/images/serverlessllm.jpg new file mode 100644 index 0000000000000000000000000000000000000000..81d88516352589e7742c7a1bdce0639194d4b967 GIT binary patch literal 102673 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 AX8-^I literal 0 HcmV?d00001 diff --git a/docs/stable/.DS_Store b/docs/stable/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..83f3959b2cbb2657ffa4130873de180ba1c94291 GIT binary patch literal 6148 zcmeI0KTiTN7{=csk^>h;CvzV`zQIY*)d5`$F$#xha(Ea17#TFT8JYYNPA=|FPVRmp zpSNw!7VglA7}J-uPif!wemvx^6e1GMY1kmD6Oo6)TCSnW2_EON6eZoW4Ha^YDP7YQ zO=uPkma<)kbHF+9*Bsz`w@N*VX^59`|2Epac$g^M%5#3!FmAQFQQXC-_jYhUPj^1{ ziZa7rW+s>Bm3JASMj`bnp$L>SQ1T2hJ zbHH|BL%pr@{=Z**{m`P_g8T2rOyLAW0R(gs&K2iEGq7vojgX#fBK literal 0 HcmV?d00001 diff --git a/docs/stable/community/_category_.json b/docs/stable/community/_category_.json new file mode 100644 index 0000000..8a81fd9 --- /dev/null +++ b/docs/stable/community/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Community", + "position": 8 +} diff --git a/docs/stable/community/meetups.md b/docs/stable/community/meetups.md new file mode 100644 index 0000000..8e3811a --- /dev/null +++ b/docs/stable/community/meetups.md @@ -0,0 +1,11 @@ +# ServerlessLLM Meetups + +We host regular biweekly developer meetings online. We will share project updates from the ServerlessLLM developer team presented during these meetings. Please find the materials of our previous meetups below: + +Date |Topic |Slides +---------------|-------------|--------- +February 21st 2025 | Fine Tuning | [Slides](https://docs.google.com/presentation/d/1rnw3mieAAbMabDIoIGS-ciMGc3hJ7AICYSaNJp-Fk4s/edit?usp=sharing) +March 7th 2025 |Quantization |[Slides](https://docs.google.com/presentation/d/1uSbP-LzGbbvPsemIAE6jCFsggYm_ATxQguCHDmdwoXE/edit?usp=sharing) + +We are always looking for contributors to join us on the developer team. If you are interested in contributing, consult our [job board](https://github.com/orgs/ServerlessLLM/projects/2) and claim a feature. For any other questions, please contact us on [this email](mailto:Y.Fu@ed.ac.uk) or on [our Discord server](https://discord.gg/AEF8Gduvm8). + diff --git a/docs/stable/community/talks.md b/docs/stable/community/talks.md new file mode 100644 index 0000000..66a2531 --- /dev/null +++ b/docs/stable/community/talks.md @@ -0,0 +1,8 @@ +# ServerlessLLM Talks + +Materials for ServerlessLLM talks will be listed here. + +Topic |Location |Date |Links +-------------|----------------|---------------|------------------------------------ +Efficient Sharing of AI Infrastructures with Specialized Serverless Computing | University of Pennsylvania |January 29th 2025 |[Slides](https://drive.google.com/file/d/17GwXsqaDDS7Xw8nX_-RaKiwpaPQgu9WD/view) \| [Event](https://asset.seas.upenn.edu/event/yao-fu-university-of-edinburgh/) +ServerlessLLM Tutorial | SESAME'25 | March 31st 2025 |[Slides](https://docs.google.com/presentation/d/1ioGCVpsg0x3oCxX19EiE820aMiY22X5MG6jgImZ1W18/edit?usp=sharing) \| [Event](https://sesame25.github.io/) diff --git a/docs/stable/deployment/_category_.json b/docs/stable/deployment/_category_.json new file mode 100644 index 0000000..534be1d --- /dev/null +++ b/docs/stable/deployment/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Deployment", + "position": 3 +} diff --git a/docs/stable/deployment/multi_machine.md b/docs/stable/deployment/multi_machine.md new file mode 100644 index 0000000..21583c3 --- /dev/null +++ b/docs/stable/deployment/multi_machine.md @@ -0,0 +1,296 @@ +--- +sidebar_position: 2 +--- + +# Multi-machine + +This guide will help you get started with running ServerlessLLM on multiple machines using Docker containers. You'll learn how to set up a head node on one machine and connect worker nodes from different machines using Docker, ensuring proper network communication between the containers. You can extend this setup to use as many nodes as you need. + +## Prerequisites + +This guide requires **two machines**: +- One machine for the head node (no GPU required) +- One machine with an NVIDIA GPU to serve as the worker node + +You can add more worker machines with GPUs as needed to scale out your deployment. + +### For All Machines + +Ensure you have the following installed and configured on all machines (both head node and worker machines): + +1. **Docker**: Installed on your system. You can download it from [here](https://docs.docker.com/get-docker/). +2. **Network connectivity**: Ensure all machines can communicate with each other on the required ports (6379 for Ray, 8343 for ServerlessLLM API, and 8073 for storage service). + +:::tip +The **ServerlessLLM CLI** (`pip install serverless-llm`) can be installed on any machine that needs to manage model deployments. This could be your local computer or any machine within the cluster that can connect to the head node. +::: + +### For Worker Machines Only + +These requirements are only necessary for the worker machines that will run the models: + +1. **GPUs**: At least one NVIDIA GPU is required on each worker machine. If you have multiple GPUs, you can adjust the Docker configuration accordingly. +2. **NVIDIA Docker Toolkit**: This enables Docker to utilize NVIDIA GPUs. Follow the installation guide [here](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html). + +## Multi-Machine Setup + +We'll start a head node on one machine using Docker, then add a worker node from another machine using Docker containers with host networking. + +### Step 1: Start the Head Node + +1. **Start the head node using Docker:** + +```bash +# Get the machine's IP address that will be accessible to other machines +export HEAD_IP=$(hostname -I | awk '{print $1}') +echo "Head node IP address: $HEAD_IP" + +docker run -d \ + --name sllm_head \ + --network host \ + -e MODE=HEAD \ + -e RAY_NODE_IP=$HEAD_IP \ + serverlessllm/sllm:latest +``` + +:::important +For multi-machine setups, setting the `RAY_NODE_IP` is critical. It should be set to an IP address that is accessible from all worker machines. The command above attempts to automatically determine your machine's primary IP, but in complex network environments, you may need to specify it manually. + +If your machine has multiple network interfaces, ensure you use the IP that other machines in your network can access. +::: + +:::tip +If you don't have the ServerlessLLM Docker image locally, Docker will automatically pull it from the registry. You can also adjust the CPU and resource allocations by setting additional environment variables like `RAY_NUM_CPUS` and `RAY_RESOURCES`. +::: + +2. **Verify the head node is running and note the external IP:** + +```bash +docker logs sllm_head +``` + +Expected output should include: + +```bash +> docker logs sllm_head +... +2025-05-29 14:29:46,211 INFO scripts.py:744 -- Local node IP: 129.215.164.107 +... +(SllmController pid=380) INFO 05-29 14:29:53 controller.py:59] Starting store manager +(SllmController pid=380) INFO 05-29 14:29:56 controller.py:68] Starting scheduler +(StoreManager pid=417) INFO 05-29 14:29:56 store_manager.py:226] Initializing store manager +(StoreManager pid=417) INFO 05-29 14:29:56 store_manager.py:237] Initializing cluster and collecting hardware info +(StoreManager pid=417) ERROR 05-29 14:29:56 store_manager.py:242] No worker nodes found +INFO: Started server process [1] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Uvicorn running on http://0.0.0.0:8343 (Press CTRL+C to quit) +(FcfsScheduler pid=456) INFO 05-29 14:29:56 fcfs_scheduler.py:54] Starting FCFS scheduler +(FcfsScheduler pid=456) INFO 05-29 14:29:56 fcfs_scheduler.py:111] Starting control loop +``` + +Make note of the IP address shown in the logs. This is the address that worker nodes will use to connect to the head node. + +### Step 2: Start Worker Node on a Different Machine + +:::tip +You can adjust the memory pool size and other parameters based on the resources available on your worker machine. +::: + +1. **On the worker machine, create a directory for model storage:** + +```bash +mkdir -p /path/to/your/models +export MODEL_FOLDER=/path/to/your/models +``` + +Replace `/path/to/your/models` with the actual path where you want to store the models. + +2. **Start the worker node:** + +```bash +# Replace with the actual IP address of the head node from the previous step +# DO NOT copy-paste this line directly - update with your actual head node IP +export HEAD_IP= +``` + +```bash +# Get the worker machine's IP address that will be accessible to the head node +export WORKER_IP=$(hostname -I | awk '{print $1}') +echo "Worker node IP address: $WORKER_IP" + +docker run -d \ + --name sllm_worker_0 \ + --network host \ + --gpus '"device=0"' \ + -e WORKER_ID=0 \ + -e STORAGE_PATH=/models \ + -e MODE=WORKER \ + -e RAY_HEAD_ADDRESS=${HEAD_IP}:6379 \ + -e RAY_NODE_IP=$WORKER_IP \ + -v ${MODEL_FOLDER}:/models \ + serverlessllm/sllm:latest \ + --mem-pool-size 4GB --registration-required true +``` + +:::important +For multi-machine setups, setting the `RAY_NODE_IP` on worker nodes is just as critical as on the head node. It should be set to an IP address that is accessible from the head node. Without this, workers might report internal Docker IPs that aren't accessible across machines. + +Make sure to replace `192.168.1.100` with the actual IP address of your head node that you noted earlier. +::: + +3. **Verify worker node is connected:** + +On the worker machine, check if the worker has properly connected to the Ray cluster: + +```bash +docker exec -it sllm_worker_0 bash -c "source /opt/conda/etc/profile.d/conda.sh && conda activate worker && ray status" +``` + +Expected output should include both the head node and worker node resources: + +```bash +> docker exec -it sllm_worker_0 bash -c "source /opt/conda/etc/profile.d/conda.sh && conda activate worker && ray status" +======== Autoscaler status: 2025-05-29 14:42:30.434645 ======== +Node status +--------------------------------------------------------------- +Active: + 1 node_f0a8e97ca64c64cebd551f469a38d0d66ce304f7cc1cc9696fe33cf3 + 1 node_3b7db178afb8bdb16460d0cb6463dc7b9b3afbcc00753c3be110c9b3 +Pending: + (no pending nodes) +Recent failures: + (no failures) + +Resources +--------------------------------------------------------------- +Usage: + 3.0/52.0 CPU + 0.0/1.0 GPU + 0.30000000000000004/1.0 control_node + 0B/526.36GiB memory + 0B/18.63GiB object_store_memory + 0.0/1.0 worker_id_0 + 0.0/1.0 worker_node + +Demands: + (no resource demands) +``` + +This output confirms that both the head node and worker node are properly connected and their resources are recognized by the Ray cluster. + +:::tip +**Adding more worker nodes:** You can add more worker nodes by repeating Step 2 on additional machines with GPUs. Just make sure to: +1. Use a unique `WORKER_ID` for each worker (1, 2, 3, etc.) +2. Point each worker to the same head node IP address +3. Ensure each worker has its own `RAY_NODE_IP` set correctly +::: + +### Step 3: Use `sllm` to manage models + +#### Configure the Environment + +**On any machine with `sllm` installed, set the `LLM_SERVER_URL` environment variable:** + +> Replace `` with the actual IP address of the head node. + +```bash +export LLM_SERVER_URL=http://:8343 +``` + +#### Deploy a Model Using `sllm` + +```bash +sllm deploy --model facebook/opt-1.3b +``` + +> Note: This command will spend some time downloading the model from the Hugging Face Model Hub. You can use any model from the [Hugging Face Model Hub](https://huggingface.co/models) by specifying the model name in the `--model` argument. + +Expected output: + +```bash +INFO 07-24 06:51:32 deploy.py:83] Model registered successfully. +``` + +### Step 4: Query the Model Using OpenAI API Client + +**You can query the model using any OpenAI API client. For example, use the following command:** + +**Make sure the model is successfully deployed before querying.** + +> Replace `` with the actual IP address of the head node. + +```bash +curl $LLM_SERVER_URL/v1/chat/completions \ +-H "Content-Type: application/json" \ +-d '{ + "model": "facebook/opt-1.3b", + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "What is your name?"} + ] + }' +``` + +Expected output: + +```json +{"id":"chatcmpl-23d3c0e5-70a0-4771-acaf-bcb2851c6ea6","object":"chat.completion","created":1721706121,"model":"facebook/opt-1.3b","choices":[{"index":0,"message":{"role":"assistant","content":"system: You are a helpful assistant.\nuser: What is your name?\nsystem: I am a helpful assistant.\n"},"logprobs":null,"finish_reason":"stop"}],"usage":{"prompt_tokens":16,"completion_tokens":26,"total_tokens":42}} +``` + +#### Delete a Deployed Model Using `sllm` + +When you're done using a model, you can delete it: + +```bash +sllm delete facebook/opt-1.3b +``` + +This will remove the specified model from the ServerlessLLM server. + +## Clean Up + +To stop and remove all ServerlessLLM containers: + +1. **Stop all containers:** + +```bash +# On head node machine +docker stop sllm_head +docker rm sllm_head + +# On each worker machine +docker stop sllm_worker_0 # Use appropriate container name (sllm_worker_1, sllm_worker_2, etc.) +docker rm sllm_worker_0 +``` + +2. **Optional: Remove the Docker image:** + +```bash +docker rmi serverlessllm/sllm:latest +``` + +:::tip +If you don't have the ServerlessLLM Docker image locally, Docker will automatically pull it from the registry. You can also adjust the CPU and resource allocations by setting additional environment variables like `RAY_NUM_CPUS` and `RAY_RESOURCES`. +::: + +## Troubleshooting + +### Network Issues + +1. **Connection refused errors**: Ensure that firewalls on all machines allow traffic on ports 6379, 8343, and 8073. + +2. **Ray cluster connection issues**: + - Verify that the head node IP address is correct and that the Ray port (6379) is accessible from worker machines + - Ensure both head and worker nodes have their `RAY_NODE_IP` set to an IP address that is accessible from other machines + - Check that you're not using private Docker network IPs (typically 172.x.x.x) which aren't accessible across machines + +3. **Workers can't connect to head node**: + - Make sure the `RAY_HEAD_ADDRESS` points to the external IP of the head node, not localhost or an internal Docker IP + - Verify network connectivity with `ping` or `telnet` from worker machines to the head node IP on port 6379 + +4. **GPU access issues**: Make sure the NVIDIA Docker toolkit is properly installed and that the `--gpus` flag is used for worker containers. + +### Container Management + +- **View running containers**: `docker ps` \ No newline at end of file diff --git a/docs/stable/deployment/single_machine.md b/docs/stable/deployment/single_machine.md new file mode 100644 index 0000000..758980a --- /dev/null +++ b/docs/stable/deployment/single_machine.md @@ -0,0 +1,217 @@ +--- +sidebar_position: 1 +--- + +# Single machine (from scratch) + +This guide provides instructions for setting up ServerlessLLM from scratch on a single machine. This 'from scratch' approach means you will manually initialize and manage the Ray cluster components. It involves using multiple terminal sessions, each configured with a distinct Conda environment, to run the head and worker processes on the same physical machine, effectively simulating a multi-node deployment locally. + +:::note +We strongly recommend using Docker (Compose) as detailed in the [Docker Compose guide](../getting_started.md). Docker provides a smoother and generally easier setup process. Follow this guide only if Docker is not a suitable option for your environment. +::: + +## Installation + +### Requirements + +Ensure your system meets the following prerequisites: + +- **OS**: Ubuntu 20.04 +- **Python**: 3.10 +- **GPU**: NVIDIA GPU with compute capability 7.0 or higher + +### Installing with pip + +Follow these steps to install ServerlessLLM using pip: + +**Create the head environment:** + +```bash +# Create and activate a conda environment +conda create -n sllm python=3.10 -y +conda activate sllm + +# Install ServerlessLLM and its store component +pip install serverless-llm serverless-llm-store +``` + +**Create the worker environment:** + +```bash +# Create and activate a conda environment +conda create -n sllm-worker python=3.10 -y +conda activate sllm-worker + +# Install ServerlessLLM (worker version) and its store component +pip install "serverless-llm[worker]" serverless-llm-store +``` + +:::note +If you plan to integrate vLLM with ServerlessLLM, a patch needs to be applied to the vLLM repository. For detailed instructions, please refer to the [vLLM Patch](#vllm-patch) section. +::: + +### Installing from Source + +To install ServerlessLLM from source, follow these steps: + +1. Clone the repository: + ```bash + git clone https://github.com/ServerlessLLM/ServerlessLLM.git + cd ServerlessLLM + ``` + +2. Create the head environment: + ```bash + # Create and activate a conda environment + conda create -n sllm python=3.10 -y + conda activate sllm + + # Install sllm_store (pip install is recommended for speed) + cd sllm_store && rm -rf build + pip install . + cd .. + + # Install ServerlessLLM + pip install . + ``` + +3. Create the worker environment: + ```bash + # Create and activate a conda environment + conda create -n sllm-worker python=3.10 -y + conda activate sllm-worker + + # Install sllm_store (pip install is recommended for speed) + cd sllm_store && rm -rf build + pip install . + cd .. + + # Install ServerlessLLM (worker version) + pip install ".[worker]" + ``` + +### vLLM Patch + +To use vLLM with ServerlessLLM, you must apply a patch. The patch file is located at `sllm_store/vllm_patch/sllm_load.patch` within the ServerlessLLM repository. This patch has been tested with vLLM version `0.9.0.1`. + +Apply the patch using the following script: + +```bash +conda activate sllm-worker +./sllm_store/vllm_patch/patch.sh +``` + +## Running ServerlessLLM Locally + +These steps describe how to run ServerlessLLM on your local machine. + +### 1. Start a Local Ray Cluster + +First, initiate a local Ray cluster. This cluster will consist of one head node and one worker node (on the same machine). + +**Start the head node:** + +Open a new terminal and run: + +```bash +conda activate sllm +ray start --head --port=6379 --num-cpus=4 --num-gpus=0 \ + --resources='{"control_node": 1}' --block +``` + +**Start the worker node:** + +Open another new terminal and run: + +```bash +conda activate sllm-worker +export CUDA_VISIBLE_DEVICES=0 # Or your desired GPU ID +ray start --address=0.0.0.0:6379 --num-cpus=4 --num-gpus=1 \ + --resources='{"worker_node": 1, "worker_id_0": 1}' --block +``` + +### 2. Start the ServerlessLLM Store Server + +Next, start the ServerlessLLM Store server. By default, it uses `./models` as the storage path. + +Open a new terminal and run: + +```bash +conda activate sllm-worker +export CUDA_VISIBLE_DEVICES=0 # Or your desired GPU ID +sllm-store start +``` + +Expected output: + +```log +$ sllm-store start +INFO 12-31 17:13:23 cli.py:58] Starting gRPC server +INFO 12-31 17:13:23 server.py:34] StorageServicer: storage_path=./models, mem_pool_size=4294967296, num_thread=4, chunk_size=33554432, registration_required=False +WARNING: Logging before InitGoogleLogging() is written to STDERR +I20241231 17:13:23.947276 2165054 checkpoint_store.cpp:41] Number of GPUs: 1 +I20241231 17:13:23.947299 2165054 checkpoint_store.cpp:43] I/O threads: 4, chunk size: 32MB +I20241231 17:13:23.947309 2165054 checkpoint_store.cpp:45] Storage path: "./models" +I20241231 17:13:24.038651 2165054 checkpoint_store.cpp:71] GPU 0 UUID: c9938b31-33b0-e02f-24c5-88bd6fbe19ad +I20241231 17:13:24.038700 2165054 pinned_memory_pool.cpp:29] Creating PinnedMemoryPool with 128 buffers of 33554432 bytes +I20241231 17:13:25.557906 2165054 checkpoint_store.cpp:83] Memory pool created with 4GB +INFO 12-31 17:13:25 server.py:243] Starting gRPC server on 0.0.0.0:8073 +``` + +### 3. Start ServerlessLLM + +Now, start the ServerlessLLM service process using `sllm start`. + + +Open a new terminal and run: + +```bash +sllm start +``` + +At this point, you should have four terminals open: one for the Ray head node, one for the Ray worker node, one for the ServerlessLLM Store server, and one for the ServerlessLLM service (started via `sllm start`). + +### 4. Deploy a Model + +With all services running, you can deploy a model. + +Open a new terminal and run: + +```bash +conda activate sllm +sllm deploy --model facebook/opt-1.3b +``` + +This command downloads the specified model from Hugging Face Hub. To load a model from a local path, you can use a `config.json` file. Refer to the [CLI API documentation](../../api/cli.md#example-configuration-file-configjson) for details. + +### 5. Query the Model + +Once the model is deployed, you can query it using any OpenAI API-compatible client. For example, use the following `curl` command: + +```bash +curl http://127.0.0.1:8343/v1/chat/completions \ +-H "Content-Type: application/json" \ +-d '{ + "model": "facebook/opt-1.3b", + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "What is your name?"} + ] + }' +``` + +Expected output: + +```json +{"id":"chatcmpl-9f812a40-6b96-4ef9-8584-0b8149892cb9","object":"chat.completion","created":1720021153,"model":"facebook/opt-1.3b","choices":[{"index":0,"message":{"role":"assistant","content":"system: You are a helpful assistant.\nuser: What is your name?\nsystem: I am a helpful assistant.\n"},"logprobs":null,"finish_reason":"stop"}],"usage":{"prompt_tokens":16,"completion_tokens":26,"total_tokens":42}} +``` + +## Clean Up + +To delete a deployed model, use the following command: + +```bash +sllm delete facebook/opt-1.3b +``` + +This command removes the specified model from the ServerlessLLM server. \ No newline at end of file diff --git a/docs/stable/deployment/slurm_cluster.md b/docs/stable/deployment/slurm_cluster.md new file mode 100644 index 0000000..5d3a476 --- /dev/null +++ b/docs/stable/deployment/slurm_cluster.md @@ -0,0 +1,411 @@ +--- +sidebar_position: 3 +--- + +# SLURM cluster + +This guide will help you get started with running ServerlessLLM on SLURM cluster. It provides two deployment methods, based on `sbatch` and `srun`. If you are in development, we recommend using `srun`, as it is easier to debug than `sbatch`, and if you are in production mode, `sbatch` is recommended. Please make sure you have installed the ServerlessLLM following the [installation guide](./single_machine.md#installation) on all machines. + +## Pre-requisites +Before you begin, make sure you have checked the following: +### Some Tips about Installation +- If 'not enough disk space' is reported when `pip install` on the login node, you can submit it to a job node for execution + ```shell + #!/bin/bash + #SBATCH --partition=Teach-Standard + #SBATCH --job-name=ray-head + #SBATCH --output=sllm_pip.out + #SBATCH --error=sllm_pip.err + #SBATCH --nodes=1 + #SBATCH --ntasks=1 + #SBATCH --cpus-per-task=4 + #SBATCH --gpus-per-task=0 + + # Identify which conda you are using, here is an example that conda is in /opt/conda + source /opt/conda/bin/activate + + conda create -n sllm python=3.10 -y + conda activate sllm + pip install serverless-llm + pip install serverless-llm-store + + conda deactivate sllm + + conda create -n sllm-worker python=3.10 -y + conda activate sllm-worker + pip install serverless-llm[worker] + pip install serverless-llm-store + ``` + +### Command for Querying GPU Resource Information +Run the following commands in the cluster to check GPU resource information. +```shell +sinfo -O partition,nodelist,gres +``` +**Expected Output** +```shell +PARTITION NODELIST GRES +Partition1 JobNode[01,03] gpu:gtx_1060:8 +Partition2 JobNode[04-17] gpu:a6000:2,gpu:gtx_ +``` + +### Identify an idle node +Use `sinfo -p ` to identify some idle nodes + +**Expected Output** +```shell +$ sinfo -p compute +PARTITION AVAIL NODES STATE TIMELIMIT NODELIST +compute up 10 idle infinite JobNode[01-10] +compute up 5 alloc infinite JobNode[11-15] +compute up 2 down infinite JobNode[16-17] +``` + +### Job Nodes Setup +**`srun` Node Selection** + +Only one JobNode is enough. + +**`sbatch` Node Selection** +Let's start a head on the main job node (`JobNode01`) and add the worker on other job node (`JobNode02`). The head and the worker should be on different job nodes to avoid resource contention. The `sllm-store` should be started on the job node that runs worker (`JobNode02`), for passing the model weights, and the `sllm start` should be started on the main job node (`JobNode01`), finally you can use `sllm` to manage the models on the login node. + + +Note: `JobNode02` requires GPU, but `JobNode01` does not. +- **Head**: JobNode01 +- **Worker**: JobNode02 +- **sllm-store**: JobNode02 +- **sllm-serve**: JobNode01 +- **sllm**: Login Node + +--- +## SRUN +If you are in development, we recommend using `srun` to start ServerlessLLM, as it is easier to debug than `sbatch` +### Step 1: Use `srun` enter the JobNode +To start an interactive session on the specified compute node (JobNode), use: +``` +srun --partition --nodelist --gres :1 --pty bash +``` +This command requests a session on the specified node and provides an interactive shell. `--gres :1` specifies the GPU device you will use, for example: `--gres gpu:gtx_1060:1` + +### Step 2: Install ServerlessLLM +Firstly, please make sure CUDA driver available on the node. Here are some commands to check it. +```shell +nvidia-smi + +which nvcc +``` +If `nvidia-smi` has listed GPU information, but `which nvcc` has no output. Then use the following commands to load `nvcc`. Here is an example that cuda is located at `/opt/cuda-12.2.0` +```shell +export PATH=/opt/cuda-12.2.0/bin:$PATH +export LD_LIBRARY_PATH=/opt/cuda-12.2.0/lib64:$LD_LIBRARY_PATH +``` +Then, following the [installation guide](./single_machine.md#installation) to install ServerlessLLM. +### Step 3: Prepare multiple windows with `tmux` +Since srun provides a single interactive shell, you can use tmux to create multiple windows. Start a tmux session: +```shell +tmux +``` +This creates a new tmux session + +**Create multiple windows** +- Use `Ctrl+B` → `C` to start a new window +- Repeat the shortcut 4 more times to create a total of 5 windows. + +**What if `Ctrl+B` does not work?** + +If `Ctrl + B` is unresponsive, reset tmux key bindings: +```shell +tmux unbind C-b +tmux set-option -g prefix C-b +tmux bind C-b send-prefix +``` + +**Command to switch windows** + +Once multiple windows are created, you can switch between them using: + +`Ctrl + B` → `N` (Next window) +`Ctrl + B` → `P` (Previous window) +`Ctrl + B` → `W` (List all windows and select) +`Ctrl + B` → [Number] (Switch to a specific window, e.g., Ctrl + B → 1) + +### Step 4: Run ServerlessLLM on the JobNode +First find ports that are already occupied. Then pick your favourite number from the remaining ports to replace the following placeholder ``. For example: `6379` + +It should also be said that certain slurm system is a bit slow, **so please be patient and wait for the system to output**. + +In the first window, start a local ray cluster with 1 head node and 1 worker node: +```shell +source /opt/conda/bin/activate +conda activate sllm +ray start --head --port= --num-cpus=4 --num-gpus=0 --resources='{"control_node": 1}' --block +``` +In the second window, start the worker node: +```shell +source /opt/conda/bin/activate +conda activate sllm-worker +export CUDA_VISIBLE_DEVICES=0 +ray start --address=0.0.0.0: --num-cpus=4 --num-gpus=1 --resources='{"worker_node": 1, "worker_id_0": 1}' --block +``` +In the third window, start ServerlessLLM Store server: +```shell +source /opt/conda/bin/activate +conda activate sllm-worker +export CUDA_VISIBLE_DEVICES=0 +sllm-store start +``` +In the 4th window, start ServerlessLLM Serve: +```shell +source /opt/conda/bin/activate +conda activate sllm +sllm-serve start +``` +Everything is set! + + +In the 5th window, let's deploy a model to the ServerlessLLM server. You can deploy a model by running the following command: +```shell +source /opt/conda/bin/activate +conda activate sllm +sllm deploy --model facebook/opt-1.3b --backend transformers +``` +This will download the model from HuggingFace transformers. After deploying, you can query the model by any OpenAI API client. For example, you can use the following Python code to query the model: +```shell +curl http://127.0.0.1:8343/v1/chat/completions \ +-H "Content-Type: application/json" \ +-d '{ + "model": "facebook/opt-1.3b", + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "What is your name?"} + ] + }' +``` +Expected output: +```shell +{"id":"chatcmpl-9f812a40-6b96-4ef9-8584-0b8149892cb9","object":"chat.completion","created":1720021153,"model":"facebook/opt-1.3b","choices":[{"index":0,"message":{"role":"assistant","content":"system: You are a helpful assistant.\nuser: What is your name?\nsystem: I am a helpful assistant.\n"},"logprobs":null,"finish_reason":"stop"}],"usage":{"prompt_tokens":16,"completion_tokens":26,"total_tokens":42}} +``` + +### Step 5: Clean up +To delete a deployed model, use the following command: +```shell +sllm delete facebook/opt-1.3b +``` +This will remove the specified model from the ServerlessLLM server. + +In each window, use `Ctrl + c` to stop server and `exit` to exit current `tmux` session. + +--- +## SBATCH +### Step 1: Start the Head Node +Since the head node does not require a gpu, you can find a low-computing capacity node to deploy the head node. +1. **Activate the `sllm` environment and start the head node:** + + Here is the example script, named `start_head_node.sh`. + ```shell + #!/bin/bash + #SBATCH --partition=your-partition # Specify the partition + #SBATCH --nodelist=JobNode01 # Specify an idle node + #SBATCH --job-name=ray-head + #SBATCH --output=sllm_head.out + #SBATCH --error=sllm_head.err + #SBATCH --nodes=1 + #SBATCH --ntasks=1 + #SBATCH --cpus-per-task=12 + #SBATCH --gpus-per-task=0 + + cd /path/to/ServerlessLLM + + source /opt/conda/bin/activate # make sure conda will be loaded correctly + conda activate sllm + + ray start --head --port=6379 --num-cpus=12 --num-gpus=0 --resources='{"control_node": 1}' --block + ``` + - Replace `your-partition`, `JobNode01` and `/path/to/ServerlessLLM` + +2. **Submit the script** + + Use ```sbatch start_head_node.sh``` to submit the script to certain idle node. + +3. **Expected output** + + In `sllm_head.out`, you will see the following output: + + ```shell + Local node IP: + -------------------- + Ray runtime started. + -------------------- + ``` + **Remember the IP address**, denoted ``````, you will need it in following steps. + +4. **Find an available port for serve** + - Some HPCs have a firewall that blocks port 8343. You can use `nc -zv 8343` to check if the port is accessible. + - If it is not accessible, find an available port and replace `available_port` in the following script. + - Here is an example script, named `find_port.sh` + + ```shell + #!/bin/bash + #SBATCH --partition=your-partition + #SBATCH --nodelist=JobNode01 + #SBATCH --job-name=find_port + #SBATCH --output=find_port.log + #SBATCH --time=00:05:00 + #SBATCH --mem=1G + + echo "Finding available port on $(hostname)" + + python -c " + import socket + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind(('', 0)) + print(f'Available port: {s.getsockname()[1]}') + " + ``` + Use `sbatch find_port.sh` to submit the script to JobNode01, and in `find_port.log`, you will see the following output: + ``` + Finding available port on JobNode01 + Available port: + ``` + Remember this ``, you will use it in Step 4 + +### Step 2: Start the Worker Node & Store +We will start the worker node and store in the same script. Because the server loads the model weights onto the GPU and uses shared GPU memory to pass the pointer to the client. If you submit another script with ```#SBATCH --gpres=gpu:1```, it will be possibly set to use a different GPU, as specified by different ```CUDA_VISIBLE_DEVICES``` settings. Thus, they cannot pass the model weights. +1. **Activate the ```sllm-worker``` environment and start the worker node.** + + Here is the example script, named```start_worker_node.sh```. + ```shell + #!/bin/sh + #SBATCH --partition=your_partition + #SBATCH --nodelist=JobNode02 + #SBATCH --gres=gpu:a6000:1 # Specify device on JobNode02 + #SBATCH --job-name=sllm-worker-store + #SBATCH --output=sllm_worker.out + #SBATCH --error=sllm_worker.err + #SBATCH --gres=gpu:1 # Request 1 GPU + #SBATCH --cpus-per-task=4 # Request 4 CPU cores + #SBATCH --mem=16G # Request 16GB of RAM + + cd /path/to/ServerlessLLM + + conda activate sllm-worker + + HEAD_NODE_IP= + + export CUDA_HOME=/opt/cuda-12.5.0 # replace with your CUDA path + export PATH=$CUDA_HOME/bin:$PATH + export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH + + ray start --address=$HEAD_NODE_IP:6379 --num-cpus=4 --num-gpus=1 \ + --resources='{"worker_node": 1, "worker_id_0": 1}' --block & + + sllm-store start & + + wait + ``` + - Read the HPC's documentation to find out which partition you can use. Replace ```your_partition``` in the script with that partition name. + - Replace ```/path/to/ServerlessLLM``` with the path to the ServerlessLLM installation directory. + - Replace `````` with the IP address of the head node. + - Replace ```/opt/cuda-12.5.0``` with the path to your CUDA path. + +2. **Find the CUDA path** + - Some slurm-based HPCs have a module system, you can use ```module avail cuda``` to find the CUDA module. + - If it does not work, read the HPC's documentation carefully to find the CUDA path. For example, my doc said CUDA is in ```\opt```. Then you can use ```srun``` command to start an interactive session on the node, such as ```srun --pty -t 00:30:00 -p your_partition --gres=gpu:1 /bin/bash```. A pseudo-terminal will be started for you to find the path. + - Find it and replace ```/opt/cuda-12.5.0``` with the path to your CUDA path. +3. **Submit the script on the other node** + + Use ```sbatch start_worker_node.sh``` to submit the script to certain idle node (here we assume it is ```JobNode02```). In addition, We recommend that you place the head and worker on different nodes so that the Serve can start smoothly later, rather than queuing up for resource allocation. +4. **Expected output** + + In ```sllm_worker.out```, you will see the following output: + + - The worker node expected output: + ```shell + Local node IP: xxx.xxx.xx.xx + -------------------- + Ray runtime started. + -------------------- + ``` + - The store expected output: + ```shell + I20241030 11:52:54.719007 1321560 checkpoint_store.cpp:41] Number of GPUs: 1 + I20241030 11:52:54.773468 1321560 checkpoint_store.cpp:43] I/O threads: 4, chunk size: 32MB + I20241030 11:52:54.773548 1321560 checkpoint_store.cpp:45] Storage path: "./models/" + I20241030 11:52:55.060559 1321560 checkpoint_store.cpp:71] GPU 0 UUID: 52b01995-4fa9-c8c3-a2f2-a1fda7e46cb2 + I20241030 11:52:55.060798 1321560 pinned_memory_pool.cpp:29] Creating PinnedMemoryPool with 128 buffers of 33554432 bytes + I20241030 11:52:57.258795 1321560 checkpoint_store.cpp:83] Memory pool created with 4GB + I20241030 11:52:57.262835 1321560 server.cpp:306] Server listening on 0.0.0.0:8073 + ``` +### Step 3: Start the Serve on the Head Node +1. **Activate the ```sllm``` environment and start the serve.** + + Here is the example script, named```start_serve.sh```. + ```shell + #!/bin/sh + #SBATCH --partition=your_partition + #SBATCH --nodelist=JobNode01 # This node should be the same as head + #SBATCH --output=serve.log + + cd /path/to/ServerlessLLM + + conda activate sllm + + sllm start --host + # sllm start --host --port # if you have changed the port + ``` + - Replace `your_partition` in the script as before. + - Replace `/path/to/ServerlessLLM` as before. + - Replace `` you have found in Step 1 (if port 8343 is not available). +2. **Submit the script on the head node** + + Use ```sbatch start_serve.sh``` to submit the script to the head node (```JobNode01```). + +3. **Expected output** + ```shell + -- Connecting to existing Ray cluster at address: xxx.xxx.xx.xx:6379... + -- Connected to Ray cluster. + INFO: Started server process [1339357] + INFO: Waiting for application startup. + INFO: Application startup complete. + INFO: Uvicorn running on http://xxx.xxx.xx.xx:8343 (Press CTRL+C to quit) + ``` +### Step 4: Use sllm to manage models +1. **You can do this step on login node, and set the ```LLM_SERVER_URL``` environment variable:** + ```shell + $ conda activate sllm + (sllm)$ export LLM_SERVER_URL=http://:8343 + ``` + - Replace `` with the actual IP address of the head node. + - Replace ```8343``` with the actual port number (`` in Step1) if you have changed it. +2. **Deploy a Model Using ```sllm```** + ```shell + (sllm)$ sllm deploy --model facebook/opt-1.3b + ``` +### Step 5: Query the Model Using OpenAI API Client + **You can use the following command to query the model:** + ```shell + curl $LLM_SERVER_URL/v1/chat/completions \ + -H "Content-Type: application/json" \ + -d '{ + "model": "facebook/opt-1.3b", + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "What is your name?"} + ] + }' + ``` + - Replace `````` with the actual IP address of the head node. + - Replace ```8343``` with the actual port number (`` in Step 1) if you have changed it. +### Step 6: Stop Jobs +On the SLURM cluster, we usually use the ```scancel``` command to stop the job. Firstly, list all jobs you have submitted (replace ```your_username``` with your username): +```shell +$ squeue -u your_username +JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON) + 1234 compute sllm-head your_username R 0:01 1 JobNode01 + 1235 compute sllm-worker-store your_username R 0:01 1 JobNode02 + 1236 compute sllm-serve your_username R 0:01 1 JobNode01 +``` +Then, use ```scancel``` to stop the job (```1234```, ```1235``` and ```1236``` are JOBIDs): +```shell +$ scancel 1234 1235 1236 +``` diff --git a/docs/stable/developer/_category_.json b/docs/stable/developer/_category_.json new file mode 100644 index 0000000..89a7abc --- /dev/null +++ b/docs/stable/developer/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Developer Guide", + "position": 6 +} diff --git a/docs/stable/developer/supporting_a_new_hardware.md b/docs/stable/developer/supporting_a_new_hardware.md new file mode 100644 index 0000000..312cb6c --- /dev/null +++ b/docs/stable/developer/supporting_a_new_hardware.md @@ -0,0 +1,25 @@ +--- +sidebar_position: 0 +--- + +# Supporting a New Hardware + +ServerlessLLM actively expands support for new hardware configurations to meet diverse deployment needs. + +## Support Standards +Hardware is considered supported by ServerlessLLM if: +1. Any of the inference backends used (e.g., Transformers, vLLM) can run model inference on the hardware. +2. ServerlessLLM Store can successfully load model checkpoints on the hardware. + +## Steps to Support a New Hardware +1. **Check Inference Backend Compatibility**: Refer to the specific inference backend documentation (e.g., for vLLM, Transformers) for hardware support. +2. **ServerlessLLM Store Configuration**: + - If the hardware provides CUDA-compatible APIs (e.g., ROCm), adjust the build script (`CMakeLists.txt`) by adding necessary compiler flags. + - For non-CUDA-compatible APIs, implementing a custom checkpoint loading function might be required. + +## Verifying Hardware Support in ServerlessLLM Store +The hardware support is verified if it successfully completes the [Quick Start Guide](https://serverlessllm.github.io/docs/stable/getting_started/) examples, showcasing checkpoint loading and inference functionality without errors. + +If the hardware is not publicly available (i.e., can't be tested by the ServerlessLLM team), a screenshot or output log of the successful execution of the Quick Start Guide examples is required to verify hardware support. + +If you encounter any issues or have questions, please reach out to the ServerlessLLM team by raising an issue on the [GitHub repository](https://github.com/ServerlessLLM/ServerlessLLM/issues). \ No newline at end of file diff --git a/docs/stable/features/_category_.json b/docs/stable/features/_category_.json new file mode 100644 index 0000000..56e0bf0 --- /dev/null +++ b/docs/stable/features/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Features", + "position": 2 +} \ No newline at end of file diff --git a/docs/stable/features/live_migration.md b/docs/stable/features/live_migration.md new file mode 100644 index 0000000..2db4b1d --- /dev/null +++ b/docs/stable/features/live_migration.md @@ -0,0 +1,211 @@ +--- +sidebar_position: 1 +--- + +# Live Migration of Inference Instances + +This example illustrates the live migration of inference instances in a ServerlessLLM cluster by constructing a scenario where two models are deployed to the cluster. Model `Qwen2.5-3B` is stored on both nodes, while model `Qwen2.5-1.5B` is only stored on node 0 (e.g., due to being less popular). This example will show a locality-contention scenario where `Qwen2.5-3B` is being served on node 0 but `Qwen2.5-1.5B` is requested to be served on the same node for optimal locality. We will find that: + +- **Without migration**, `Qwen2.5-1.5B` would have to wait for the completion of the ongoing inference instance of `Qwen2.5-3B` on node 0. +- **With live migration**, the ongoing inference instance of `Qwen2.5-3B` is migrated to node 1, and `Qwen2.5-1.5B` is allocated to node 0, thus can be served immediately. + +## Prerequisites + +To run this example, we will use Docker Compose to set up a ServerlessLLM cluster. Before proceeding, please ensure you have read the [Quickstart Guide](../getting_started.md). + +**Requirements:** + +- **Two GPUs** are required to illustrate the live migration of inference instances. +- **At least 20 GB of host memory** (this can be adjusted by using smaller models). +- **ServerlessLLM version 0.6**: Ensure you have `sllm==0.6` and `sllm-store==0.6` installed. + +## Usage + +Start a local Docker-based ray cluster using Docker Compose. + +### Clone the ServerlessLLM Repository + +If you haven't already, clone the ServerlessLLM repository: + +```bash +git clone https://github.com/ServerlessLLM/ServerlessLLM.git +cd ServerlessLLM/examples/live_migration +``` + +### Configure the Model Directory + +Create a directory on your host machine where models will be stored, and set the MODEL_FOLDER environment variable to point to this directory: + +```bash +export MODEL_FOLDER=/path/to/your/models +``` + +Replace `/path/to/your/models` with the actual path where you want to store the models. + +The Docker Compose configuration is already located in the `examples/live_migration` directory. + +## Test ServerlessLLM Without Live Migration + +1. **Start the ServerlessLLM Services Using Docker Compose** + +```bash +docker compose up -d +``` + +This command will start the Ray head node and two worker nodes defined in the `docker-compose.yml` file. + +:::tip +Use the following command to monitor the logs of the head node: + +```bash +docker logs -f sllm_head +``` +::: + +2. **Deploy Models with the Placement Spec Files** + +Activate the ServerlessLLM environment and set the server URL: +```bash +conda activate sllm +export LLM_SERVER_URL=http://127.0.0.1:8343 +``` + +Deploy the models: +```bash +sllm deploy --config config-qwen-1.5b.json +sllm deploy --config config-qwen-3b.json +``` + +3. **Verify the Deployment** + +Start two inference requests in parallel. The first request is for `Qwen2.5-3B`, and the second request, sent shortly after, is for `Qwen2.5-1.5B`. The `sleep` command is used to introduce a short interval between the two requests: + +```bash +curl $LLM_SERVER_URL/v1/chat/completions \ +-H "Content-Type: application/json" \ +-d '{ + "model": "Qwen/Qwen2.5-3B-Instruct", + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Could you share a story of the history of Computer Science?"} + ], + "max_tokens": 1024 + }' & + +sleep 3 + +curl $LLM_SERVER_URL/v1/chat/completions \ +-H "Content-Type: application/json" \ +-d '{ + "model": "Qwen/Qwen2.5-1.5B-Instruct", + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "What is your name?"} + ], + "max_tokens": 64 + }' +``` + +Since `Qwen2.5-3B` is requested first, `Qwen2.5-1.5B` must wait for the ongoing inference instance of `Qwen2.5-3B` to complete on node 0 before it can start processing. + + +4. Clean up. + +```bash +docker compose down +``` + +## Test ServerlessLLM With Live Migration + +1. **Start the ServerlessLLM Services with Live Migration Enabled** + +Use the following command to start the ServerlessLLM services with live migration enabled. This configuration includes the `enable-migration.yml` file: + +```bash +docker compose -f docker-compose.yml -f enable-migration.yml up -d +``` + +This command will start the Ray head node and two worker nodes, enabling the live migration feature. + +2. **Deploy Models with the Placement Spec Files** + +Activate the ServerlessLLM environment and set the server URL: + +```bash +conda activate sllm +export LLM_SERVER_URL=http://127.0.0.1:8343 +``` + +Deploy the models: + +```bash +sllm deploy --config config-qwen-1.5b.json +sllm deploy --config config-qwen-3b.json +``` + +3. **Verify the Deployment** + +Start two inference requests in parallel. The first request is for `Qwen2.5-3B`, and the second request, sent shortly after, is for `Qwen2.5-1.5B`. The `sleep` command is used to introduce a short interval between the two requests: + +```bash +curl $LLM_SERVER_URL/v1/chat/completions \ +-H "Content-Type: application/json" \ +-d '{ + "model": "Qwen/Qwen2.5-3B-Instruct", + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "Could you share a story of the history of Computer Science?"} + ], + "max_tokens": 1024 + }' & + +sleep 3 + +curl $LLM_SERVER_URL/v1/chat/completions \ +-H "Content-Type: application/json" \ +-d '{ + "model": "Qwen/Qwen2.5-1.5B-Instruct", + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "What is your name?"} + ], + "max_tokens": 64 + }' +``` + +According to the response, you should observe that `Qwen2.5-1.5B` completes ahead of `Qwen2.5-3B`. This is because the ongoing inference instance of `Qwen2.5-3B` is live-migrated from node 0 to node 1, allowing `Qwen2.5-1.5B` to be served immediately on node 0. + +As shown in the log message, the ongoing inference instance of the model `Qwen/Qwen2.5-3B-Instruct` is live-migrated from node 0 to node 1. And model `Qwen/Qwen2.5-1.5B-Instruct` is allocated to node 0. + +```bash +(MigrationRouter pid=1724) INFO 12-10 22:05:02 migration_router.py:106] Executing migration plan: MigrationPlan(target_node_id='1', source_instance=InstanceStatus(instance_id='Qwen/Qwen2.5-3B-Instruct_dedb945f-74e5-403f-8677-35965453abab', node_id='0', num_gpu=1, concurrency=0, model_name='Qwen/Qwen2.5-3B-Instruct', num_current_tokens=0)) +(MigrationRouter pid=1724) INFO 12-10 22:05:13 migration_router.py:164] Initialized backend for instance Qwen/Qwen2.5-3B-Instruct_2c9ef57f-c432-45d6-a4a9-1bae9c792853 for model Qwen/Qwen2.5-3B-Instruct +# Start multi-round live migration +(MigrationRouter pid=1724) INFO 12-10 22:05:13 migration_router.py:178] Migration iteration 0 +(MigrationRouter pid=1724) INFO 12-10 22:05:13 migration_router.py:183] Number of tokens: 353, delta: 353 +(MigrationRouter pid=1724) INFO 12-10 22:05:13 migration_router.py:198] Migration iteration 0 completed +(MigrationRouter pid=1724) INFO 12-10 22:05:13 migration_router.py:178] Migration iteration 1 +(MigrationRouter pid=1724) INFO 12-10 22:05:13 migration_router.py:183] Number of tokens: 14, delta: 14 +(MigrationRouter pid=1724) INFO 12-10 22:05:13 migration_router.py:188] Migration completed: remained 14 tokens +(MigrationRouter pid=1724) INFO 12-10 22:05:13 migration_router.py:201] Migrated instance Qwen/Qwen2.5-3B-Instruct_dedb945f-74e5-403f-8677-35965453abab to Qwen/Qwen2.5-3B-Instruct_2c9ef57f-c432-45d6-a4a9-1bae9c792853 +# Finish multi-round live migration +(MigrationRouter pid=1724) INFO 12-10 22:05:13 migration_router.py:215] Instance Qwen/Qwen2.5-3B-Instruct_dedb945f-74e5-403f-8677-35965453abab removed +(MigrationRouter pid=1724) DEBUG 12-10 22:05:13 migration_router.py:77] Preempted request: ... +# Resume the instance on target node +(MigrationRouter pid=1724) INFO 12-10 22:05:13 migration_router.py:83] Resuming request on target instance: Qwen/Qwen2.5-3B-Instruct_2c9ef57f-c432-45d6-a4a9-1bae9c792853 +# Qwen/Qwen2.5-1.5B is allocated to node 0 +(StoreManager pid=1459) INFO 12-10 22:05:14 store_manager.py:344] Loading Qwen/Qwen2.5-1.5B-Instruct to node 0 +(StorageAwareScheduler pid=1574) INFO 12-10 22:05:14 fcfs_scheduler.py:92] Deallocating model Qwen/Qwen2.5-3B-Instruct instance Qwen/Qwen2.5-3B-Instruct_dedb945f-74e5-403f-8677-35965453abab +(StorageAwareScheduler pid=1574) INFO 12-10 22:05:14 fcfs_scheduler.py:103] Node 0 deallocated 1 GPUs +(StorageAwareScheduler pid=1574) INFO 12-10 22:05:14 fcfs_scheduler.py:108] Model Qwen/Qwen2.5-3B-Instruct instance Qwen/Qwen2.5-3B-Instruct_dedb945f-74e5-403f-8677-35965453abab deallocated +(StorageAwareScheduler pid=1574) INFO 12-10 22:05:14 storage_aware_scheduler.py:188] Migrated instance Qwen/Qwen2.5-3B-Instruct to node 1 instance Qwen/Qwen2.5-3B-Instruct_2c9ef57f-c432-45d6-a4a9-1bae9c792853 +(StorageAwareScheduler pid=1574) INFO 12-10 22:05:14 storage_aware_scheduler.py:195] Allocated node 0 for model Qwen/Qwen2.5-1.5B-Instruct +``` + +4. Clean up. + +```bash +docker compose down +``` + + diff --git a/docs/stable/features/peft_lora_serving.md b/docs/stable/features/peft_lora_serving.md new file mode 100644 index 0000000..4c7d3a6 --- /dev/null +++ b/docs/stable/features/peft_lora_serving.md @@ -0,0 +1,116 @@ +--- +sidebar_position: 2 +--- +# PEFT LoRA Serving + +This example illustrates the process of deploying and serving a base large language model enhanced with LoRA (Low-Rank Adaptation) adapters in a ServerlessLLM cluster. It demonstrates how to start the cluster, deploy a base model with multiple LoRA adapters, perform inference using different adapters, and update or remove the adapters dynamically. + +## Pre-requisites + +To run this example, we will use Docker Compose to set up a ServerlessLLM cluster. Before proceeding, please ensure you have read the [Quickstart Guide](../getting_started.md). + +We will use the following example base model & LoRA adapters +- Base model: `facebook/opt-125m` +- LoRA adapters: + - `peft-internal-testing/opt-125m-dummy-lora` + - `monsterapi/opt125M_alpaca` + - `edbeeching/opt-125m-lora` + - `Hagatiana/opt-125m-lora` + +## Usage + +Start a local Docker-based ray cluster using Docker Compose. + +### Step 1: Download the Docker Compose File + +Download the `docker-compose.yml` file from the ServerlessLLM repository: +```bash +# Create a directory for the ServerlessLLM Docker setup +mkdir serverless-llm-docker && cd serverless-llm-docker + +# Download the docker-compose.yml file +curl -O https://raw.githubusercontent.com/ServerlessLLM/ServerlessLLM/main/examples/docker/docker-compose.yml + +# Alternatively, you can use wget: +# wget https://raw.githubusercontent.com/ServerlessLLM/ServerlessLLM/main/examples/docker/docker-compose.yml +``` + +### Step 2: Configuration + +Set the Model Directory. Create a directory on your host machine where models will be stored and set the `MODEL_FOLDER` environment variable to point to this directory: + +```bash +export MODEL_FOLDER=/path/to/your/models +``` + +Replace `/path/to/your/models` with the actual path where you want to store the models. + +### Step 3: Start the Services + +Start the ServerlessLLM services using Docker Compose: + +```bash +docker compose up -d +``` + +This command will start the Ray head node and two worker nodes defined in the `docker-compose.yml` file. + +:::tip +Use the following command to monitor the logs of the head node: + +```bash +docker logs -f sllm_head +``` +::: + +### Step 4: Deploy Models with LoRA Adapters +1. Configuration +```bash +conda activate sllm +export LLM_SERVER_URL=http://127.0.0.1:8343 +``` +2. Deploy models with specified lora adapters. +```bash +sllm deploy --model facebook/opt-125m --backend transformers --enable-lora --lora-adapters "demo_lora1=peft-internal-testing/opt-125m-dummy-lora demo_lora2=monsterapi/opt125M_alpaca" +``` +3. Verify the deployment. +```bash +curl $LLM_SERVER_URL/v1/chat/completions \ +-H "Content-Type: application/json" \ +-d '{ + "model": "facebook/opt-125m", + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "What is your name?"} + ], + "lora_adapter_name": "demo_lora1" + }' +``` +If no lora adapters specified, the system will use the base model to do inference +```bash +curl $LLM_SERVER_URL/v1/chat/completions \ +-H "Content-Type: application/json" \ +-d '{ + "model": "facebook/opt-125m", + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "What is your name?"} + ] + }' +``` +### Step 5: Update LoRA Adapters +If you wish to switch to a different set of LoRA adapters, you can still use `sllm deploy` command with updated adapter configurations. ServerlessLLM will automatically reload the new adapters without restarting the backend. +```bash +sllm deploy --model facebook/opt-125m --backend transformers --enable-lora --lora-adapters "demo-lora1=edbeeching/opt-125m-lora demo-lora2=Hagatiana/opt-125m-lora" +``` + +### Step 6: Clean Up + +Delete the lora adapters by running the following command (this command will only delete lora adapters, the base model won't be deleted): +```bash +sllm delete facebook/opt-125m --lora-adapters "demo-lora1 demo-lora2" +``` +If you need to stop and remove the containers, you can use the following commands: +```bash +docker compose down +``` \ No newline at end of file diff --git a/docs/stable/features/quantized_models.md b/docs/stable/features/quantized_models.md new file mode 100644 index 0000000..df09751 --- /dev/null +++ b/docs/stable/features/quantized_models.md @@ -0,0 +1,175 @@ +--- +sidebar_position: 3 +--- + +# Quantization + +This example demonstrates the use of quantization within the ServerlessLLM framework to optimize model serving. Quantization is a technique used to reduce the memory footprint and computational requirements of a large language model by representing its weights with lower-precision data types, such as 8-bit integers (int8). This example will showcase how to deploy and serve a quantized model in a ServerlessLLM cluster. + +## Pre-requisites + +We will use Docker Compose to run a ServerlessLLM cluster in this example. Therefore, please make sure you have read the Quickstart Guide before proceeding. + +## Usage +Start a local Docker-based ray cluster using Docker Compose. + +## Step 1: Set up the Environment + +Create a directory for this example and download the `docker-compose.yml` file. + +```bash +mkdir sllm-quantization-example && cd sllm-quantization-example +curl -O https://raw.githubusercontent.com/ServerlessLLM/ServerlessLLM/main/examples/docker/docker-compose.yml + +## Step 2: Configuration + +Set the Model Directory. Create a directory on your host machine where models will be stored and set the `MODEL_FOLDER` environment variable to point to this directory: + +```bash +export MODEL_FOLDER=/path/to/your/models +``` + +Replace `/path/to/your/models` with the actual path where you want to store the models. + +## Step 3: Start the Services + +Start the ServerlessLLM services using Docker Compose: + +```bash +docker compose up -d +``` + +This command will start the Ray head node and two worker nodes defined in the `docker-compose.yml` file. + +:::tip +Use the following command to monitor the logs of the head node: + +```bash +docker logs -f sllm_head +``` +::: + +## Step 4: Create Quantization and Deployment Configurations + +First, we'll generate a standard Hugging Face BitsAndBytesConfig and save it to a JSON file. Then, we'll create a deployment configuration file with these quantization settings embedded in it. + +1. Generate the Quantization Config + +Create a Python script named `get_config.py` in the current directory with the following content: +```python +# get_config.py +from transformers import BitsAndBytesConfig + +quantization_config = BitsAndBytesConfig(load_in_4bit=True) +quantization_config.to_json_file("quantization_config.json") + +``` + +Run the script to generate `quantization_config.json`: +```bash +python get_config.py +``` + + +2. Create the Deployment Config + +Now, create a file named `quantized_deploy_config.json`. This file tells ServerlessLLM which model to deploy and instructs the backend to use the quantization settings. You should copy the contents of `quantization_config.json` into the `quantization_config` field below. A template can be found in `sllm/cli/default_config.json`. + +```json +{ + "model": "facebook/opt-1.3b", + "backend": "transformers", + "num_gpus": 1, + "auto_scaling_config": { + "metric": "concurrency", + "target": 1, + "min_instances": 0, + "max_instances": 10, + "keep_alive": 0 + }, + "backend_config": { + "pretrained_model_name_or_path": "", + "device_map": "auto", + "torch_dtype": "float16", + "hf_model_class": "AutoModelForCausalLM", + "quantization_config": { + "_load_in_4bit": true, + "_load_in_8bit": false, + "bnb_4bit_compute_dtype": "float32", + "bnb_4bit_quant_storage": "uint8", + "bnb_4bit_quant_type": "fp4", + "bnb_4bit_use_double_quant": false, + "llm_int8_enable_fp32_cpu_offload": false, + "llm_int8_has_fp16_weight": false, + "llm_int8_skip_modules": null, + "llm_int8_threshold": 6.0, + "load_in_4bit": true, + "load_in_8bit": false, + "quant_method": "bitsandbytes" + } + } +} + +``` + +> Note: Quantization currently only supports the "transformers" backend. Support for other backends will come soon. + +## Step 5: Deploy the Quantized Model +With the configuration files in place, deploy the model using the `sllm-cli`. + +```bash +conda activate sllm +export LLM_SERVER_URL=http://127.0.0.1:8343 + +sllm-cli deploy --config quantized_deploy_config.json +``` + +## Step 6: Verify the deployment. +Send an inference to the server to query the model: + +```bash +curl $LLM_SERVER_URL/v1/chat/completions \ +-H "Content-Type: application/json" \ +-d '{ + "model": "facebook/opt-1.3b", + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "What is your name?"} + ] + }' +``` + +To verify the model is being loaded in the desired precision, check the logs (`docker logs sllm_head`). You should see that the model is indeed being loaded in `fp4`. + + +```log +(TransformersBackend pid=352, ip=172.18.0.2) DEBUG 07-02 20:01:49 transformers.py:321] load config takes 0.0030286312103271484 seconds +(RoundRobinRouter pid=481) INFO 07-02 20:01:49 roundrobin_router.py:272] [] +(TransformersBackend pid=352, ip=172.18.0.2) DEBUG 07-02 20:01:49 transformers.py:331] load model takes 0.2806234359741211 seconds +(TransformersBackend pid=352, ip=172.18.0.2) DEBUG 07-02 20:01:49 transformers.py:338] device_map: OrderedDict([('', 0)]) +(TransformersBackend pid=352, ip=172.18.0.2) DEBUG 07-02 20:01:49 transformers.py:345] compute_device_placement takes 0.18753838539123535 seconds +(TransformersBackend pid=352, ip=172.18.0.2) DEBUG 07-02 20:01:49 transformers.py:376] allocate_cuda_memory takes 0.0020012855529785156 seconds +(TransformersBackend pid=352, ip=172.18.0.2) DEBUG 07-02 20:01:49 client.py:72] load_into_gpu: transformers/facebook/opt-1.3b, 70b42a05-4faa-4eaf-bb73-512c6453e7fa +(TransformersBackend pid=352, ip=172.18.0.2) INFO 07-02 20:01:49 client.py:113] Model loaded: transformers/facebook/opt-1.3b, 70b42a05-4faa-4eaf-bb73-512c6453e7fa +(TransformersBackend pid=352, ip=172.18.0.2) INFO 07-02 20:01:49 transformers.py:398] restore state_dict takes 0.0007319450378417969 seconds +(TransformersBackend pid=352, ip=172.18.0.2) DEBUG 07-02 20:01:49 transformers.py:411] using precision: fp4 +(TransformersBackend pid=352, ip=172.18.0.2) INFO 07-02 20:01:50 client.py:117] confirm_model_loaded: transformers/facebook/opt-1.3b, 70b42a05-4faa-4eaf-bb73-512c6453e7fa +``` + +You should receive a successful JSON response from the model. + +## Step 7: Clean Up + +Delete the model deployment by running the following command: + +```bash +sllm-cli delete facebook/opt-1.3b +``` + +If you need to stop and remove the containers, you can use the following commands: + +```bash +docker compose down +``` + + diff --git a/docs/stable/features/storage_aware_scheduling.md b/docs/stable/features/storage_aware_scheduling.md new file mode 100644 index 0000000..81723f9 --- /dev/null +++ b/docs/stable/features/storage_aware_scheduling.md @@ -0,0 +1,123 @@ +--- +sidebar_position: 0 +--- + +# Storage Aware Scheduling with Docker Compose + +## Pre-requisites + +We will use Docker Compose to run a ServerlessLLM cluster in this example. Therefore, please make sure you have read the [Quickstart Guide](../getting_started.md) before proceeding. + +## Usage + +Start a local Docker-based ray cluster using Docker Compose. + +### Step 1: Clone the ServerlessLLM Repository + +If you haven't already, clone the ServerlessLLM repository: + +```bash +git clone https://github.com/ServerlessLLM/ServerlessLLM.git +cd ServerlessLLM/examples/storage_aware_scheduling +``` + +### Step 2: Configuration + +Set the Model Directory. Create a directory on your host machine where models will be stored and set the `MODEL_FOLDER` environment variable to point to this directory: + +```bash +export MODEL_FOLDER=/path/to/your/models +``` + +Replace `/path/to/your/models` with the actual path where you want to store the models. + +### Step 3: Enable Storage Aware Scheduling in Docker Compose + +The Docker Compose configuration is already located in the `examples/storage_aware_scheduling` directory. To activate storage-aware scheduling, ensure the `docker-compose.yml` file includes the necessary configurations(`sllm_head` service should include the `--enable-storage-aware` command). + +:::tip +Recommend to adjust the number of GPUs and `mem_pool_size` based on the resources available on your machine. +::: + + +### Step 4: Start the Services + +Start the ServerlessLLM services using Docker Compose: + +```bash +docker compose up -d +``` + +This command will start the Ray head node and two worker nodes defined in the `docker-compose.yml` file. + +:::tip +Use the following command to monitor the logs of the head node: + +```bash +docker logs -f sllm_head +``` +::: + +### Step 5: Deploy Models with Placement Spec + +In the `examples/storage_aware_scheduling` directory, the example configuration files (`config-opt-2.7b.json` and `config-opt-1.3b.json`) are already given. + +> Note: Storage aware scheduling currently only supports the "transformers" backend. Support for other backends will come soon. + +2. Deploy models with the placement spec files. + +```bash +conda activate sllm +export LLM_SERVER_URL=http://127.0.0.1:8343 + +sllm deploy --config config-opt-2.7b.json +sllm deploy --config config-opt-1.3b.json +``` + +3. Verify the deployment. + +```bash +curl $LLM_SERVER_URL/v1/chat/completions \ +-H "Content-Type: application/json" \ +-d '{ + "model": "facebook/opt-2.7b", + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "What is your name?"} + ] + }' + +curl $LLM_SERVER_URL/v1/chat/completions \ +-H "Content-Type: application/json" \ +-d '{ + "model": "facebook/opt-1.3b", + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "What is your name?"} + ] + }' +``` + +As shown in the log message, the model "facebook/opt-2.7b" is scheduled on server 0, while the model "facebook/opt-1.3b" is scheduled on server 1. + +```log +(StorageAwareScheduler pid=1543) INFO 11-12 23:48:27 storage_aware_scheduler.py:137] Sorted scheduling options: [('0', 4.583079601378258)] +(StorageAwareScheduler pid=1543) INFO 11-12 23:48:27 storage_aware_scheduler.py:144] Allocated node 0 for model facebook/opt-2.7b +(StorageAwareScheduler pid=1543) INFO 11-12 23:48:38 storage_aware_scheduler.py:137] Sorted scheduling options: [('1', 2.266678696047572)] +(StorageAwareScheduler pid=1543) INFO 11-12 23:48:38 storage_aware_scheduler.py:144] Allocated node 1 for model facebook/opt-1.3b +``` + +### Step 6: Clean Up + +Delete the model deployment by running the following command: + +```bash +sllm delete facebook/opt-1.3b facebook/opt-2.7b +``` + +If you need to stop and remove the containers, you can use the following commands: + +```bash +docker compose down +``` + diff --git a/docs/stable/getting_started.md b/docs/stable/getting_started.md new file mode 100644 index 0000000..f98364d --- /dev/null +++ b/docs/stable/getting_started.md @@ -0,0 +1,136 @@ +--- +sidebar_position: 1 +--- + +# Getting Started + +This guide demonstrates how to quickly set up a local ServerlessLLM cluster using Docker Compose on a single machine. We will initialize a minimal cluster, consisting of a head node and a single worker node. Then, we'll deploy a model using the `sllm` and query the deployment through an OpenAI-compatible API. + +:::note +We strongly recommend using Docker (Compose) to manage your ServerlessLLM cluster, whether you are using ServerlessLLM for testing or development. However, if Docker is not a viable option for you, please refer to the [deploy from scratch guide](./deployment/single_machine.md). +::: + +## Prerequisites + +Before you begin, ensure you have the following installed and configured: + +1. **Docker**: Installed on your system. You can download it from [here](https://docs.docker.com/get-docker/). +2. **ServerlessLLM CLI**: Installed on your system. Install it using `pip install serverless-llm`. +3. **GPUs**: At least one NVIDIA GPU is required. If you have multiple GPUs, you can adjust the `docker-compose.yml` file accordingly. +4. **NVIDIA Docker Toolkit**: This enables Docker to utilize NVIDIA GPUs. Follow the installation guide [here](https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/install-guide.html). + +## Start the ServerlessLLM Cluster + +We will use Docker Compose to simplify the ServerlessLLM setup process. + +### Step 1: Download the Docker Compose File + +Download the `docker-compose.yml` file from the ServerlessLLM repository: + +```bash +# Create a directory for the ServerlessLLM Docker setup +mkdir serverless-llm-docker && cd serverless-llm-docker + +# Download the docker-compose.yml file +curl -O https://raw.githubusercontent.com/ServerlessLLM/ServerlessLLM/main/examples/docker/docker-compose.yml + +# Alternatively, you can use wget: +# wget https://raw.githubusercontent.com/ServerlessLLM/ServerlessLLM/main/examples/docker/docker-compose.yml +``` + +### Step 2: Configuration + +Create a directory on your host machine to store models. Then, set the `MODEL_FOLDER` environment variable to point to this directory: + +```bash +export MODEL_FOLDER=/path/to/your/models +``` + +Replace `/path/to/your/models` with the actual path where you intend to store the models. This directory will be mounted into the Docker containers. + +### Step 3: Start the Services + +Start the ServerlessLLM services using Docker Compose: + +```bash +docker compose up -d +``` + +This command will start the Ray head node and a worker node as defined in the `docker-compose.yml` file. + +Verify that the services are ready: + +```bash +docker logs sllm_head +``` + +Ensure the services are ready before proceeding. You should see output similar to the following: + +```bash +... +(SllmController pid=1435) INFO 05-26 15:40:49 controller.py:68] Starting scheduler +INFO: Started server process [1] +INFO: Waiting for application startup. +INFO: Application startup complete. +INFO: Uvicorn running on http://0.0.0.0:8343 (Press CTRL+C to quit) +(FcfsScheduler pid=1604) INFO 05-26 15:40:49 fcfs_scheduler.py:54] Starting FCFS scheduler +(FcfsScheduler pid=1604) INFO 05-26 15:40:49 fcfs_scheduler.py:111] Starting control loop +``` + +## Deploy a Model Using sllm + +Set the `LLM_SERVER_URL` environment variable: + +```bash +export LLM_SERVER_URL=http://127.0.0.1:8343 +``` + +Deploy a model to the ServerlessLLM cluster using the `sllm`: + +```bash +sllm deploy --model facebook/opt-1.3b +``` +> Note: This command will take some time to download the model from the Hugging Face Model Hub. +> You can use any model from the [Hugging Face Model Hub](https://huggingface.co/models) by specifying its name in the `--model` argument. + +Expected output: + +```plaintext +INFO 08-01 07:38:12 deploy.py:36] Deploying model facebook/opt-1.3b with default configuration. +INFO 08-01 07:39:00 deploy.py:49] Model registered successfully. +``` + +## Query the Model + +You can now query the model using any OpenAI API client. For example, use the following `curl` command: +```bash +curl $LLM_SERVER_URL/v1/chat/completions \ +-H "Content-Type: application/json" \ +-d '{ + "model": "facebook/opt-1.3b", + "messages": [ + {"role": "system", "content": "You are a helpful assistant."}, + {"role": "user", "content": "What is your name?"} + ] + }' +``` + +Expected output: + +```plaintext +{"id":"chatcmpl-8b4773e9-a98b-41db-8163-018ed3dc65e2","object":"chat.completion","created":1720183759,"model":"facebook/opt-1.3b","choices":[{"index":0,"message":{"role":"assistant","content":"system: You are a helpful assistant.\nuser: What is your name?\nsystem: I am a helpful assistant.\n"},"logprobs":null,"finish_reason":"stop"}],"usage":{"prompt_tokens":16,"completion_tokens":26,"total_tokens":42}}% +``` + +## Clean Up +To delete a deployed model, execute the following command: + +```bash +sllm delete facebook/opt-1.3b +``` + +This command removes the specified model from the ServerlessLLM server. + +To stop the ServerlessLLM services, use the following command: +```bash +docker compose down +``` \ No newline at end of file diff --git a/docs/stable/intro.md b/docs/stable/intro.md new file mode 100644 index 0000000..8786a40 --- /dev/null +++ b/docs/stable/intro.md @@ -0,0 +1,38 @@ +--- +sidebar_position: 0 +--- + +# Serverless LLM + + +ServerlessLLM + +ServerlessLLM is a **fast** and **easy-to-use** serving system designed for **affordable** multi-LLM serving, also known as LLM-as-a-Service. ServerlessLLM is ideal for environments with multiple LLMs that need to be served on limited GPU resources, as it enables efficient dynamic loading of LLMs onto GPUs. By elastically scaling model instances and multiplexing GPUs, ServerlessLLM can significantly reduce costs compared to traditional GPU-dedicated serving systems while still providing low-latency (Time-to-First-Token, TTFT) LLM completions. + +ServerlessLLM now supports NVIDIA and AMD GPUs, including following hardware: +* NVIDIA GPUs: Compute Capability 7.0+ (e.g, V100, A100, RTX A6000, GeForce RTX 3060) +* AMD GPUs: ROCm 6.2.0+ (tested on MI100s and MI200s) + +## Documentation + +### Getting Started + +- [Quickstart](./getting_started.md) +- [Single Machine Deployment (From Scratch)](./deployment/single_machine.md) +- [Multi-machine Deployment](./deployment/multi_machine.md) +- [SLURM Cluster Deployment](./deployment/slurm_cluster.md) + +### Advanced Features + +- [Storage-Aware Scheduler](./features/storage_aware_scheduling.md) +- [Live Migration](./features/live_migration.md) +- [PEFT LoRA Serving](./features/peft_lora_serving.md) + +### ServerlessLLM Store + +- [Quickstart](./store/quickstart.md) +- [ROCm Quickstart](./store/rocm_quickstart.md) + +### ServerlessLLM CLI + +- [ServerlessLLM CLI API](../api/cli.md) diff --git a/docs/stable/models/_category_.json b/docs/stable/models/_category_.json new file mode 100644 index 0000000..67c0cfe --- /dev/null +++ b/docs/stable/models/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "Models", + "position": 7 +} diff --git a/docs/stable/models/supported_models.md b/docs/stable/models/supported_models.md new file mode 100644 index 0000000..6077615 --- /dev/null +++ b/docs/stable/models/supported_models.md @@ -0,0 +1,13 @@ +# Supported Models + +ServerlessLLM supports a plethora of language models from [Huggingface (HF) Transformers](https://huggingface.co/models). This page lists the models and model architectures currently supported by ServerlessLLM. + +To test a model, simply add it to the `supported_models.json` inside `/ServerlessLLM/tests/inference_tests` and the Github Actions will automatically test whether not it is supported. + +## Text-only Language Models + +Architecture |Models |Example HF Models |vLLM |Transformers +------------------|--------------|--------------------|-----|------------- +`OPTForCausalLM` |OPT, OPT-IML |`facebook/opt-6.7b` |✅ |✅ + + diff --git a/docs/stable/store/_category_.json b/docs/stable/store/_category_.json new file mode 100644 index 0000000..78b547f --- /dev/null +++ b/docs/stable/store/_category_.json @@ -0,0 +1,4 @@ +{ + "label": "ServerlessLLM Store", + "position": 5 +} diff --git a/docs/stable/store/quantization.md b/docs/stable/store/quantization.md new file mode 100644 index 0000000..3450410 --- /dev/null +++ b/docs/stable/store/quantization.md @@ -0,0 +1,102 @@ +--- +sidebar_position: 2 +--- + +# Quantization + +> Note: Quantization is currently experimental, especially on multi-GPU machines. You may encounter issues when using this feature in multi-GPU environments. + +ServerlessLLM currently supports `bitsandbytes` quantization, which reduces model memory usage by converting weights to lower-precision data types. You can configure this by passing a `BitsAndBytesConfig` object when loading a model. + +Available precisions include: +- `int8` +- `fp4` +- `nf4` + +> Note: CPU offloading and dequantization is not currently supported. + +## 8-bit Quantization (`int8`) + +8-bit quantization halves the memory usage compared to 16-bit precision with minimal impact on model accuracy. It is a robust and recommended starting point for quantization. + +```python +from transformers import AutoModelForCausalLM, BitsAndBytesConfig + +# Configure 8-bit quantization +quantization_config = BitsAndBytesConfig( + load_in_8bit=True +) + +# Load the model with the config +model_8bit = AutoModelForCausalLM.from_pretrained( + "facebook/opt-1.3b", + quantization_config=quantization_config, + device_map="auto", +) +``` + +## 4-bit Quantization (`fp4`) +FP4 (4-bit Floating Point) quantization offers more aggressive memory savings than 8-bit. It is a good option for running very large models on consumer-grade hardware. + +```python +from transformers import AutoModelForCausalLM, BitsAndBytesConfig + +# Configure 4-bit FP4 quantization +quantization_config = BitsAndBytesConfig( + load_in_4bit=True, + bnb_4bit_quant_type="fp4" +) + +# Load the model with the config +model_fp4 = AutoModelForCausalLM.from_pretrained( + "facebook/opt-1.3b", + quantization_config=quantization_config, + device_map="auto", +) +``` + +## 4-bit Quantization (`nf4`) +NF4 (4-bit NormalFloat) is an advanced data type optimized for models whose weights follow a normal distribution. NF4 is generally the recommended 4-bit option as it often yields better model accuracy compared to FP4. + +```python +import torch +from transformers import AutoModelForCausalLM, BitsAndBytesConfig + +# Configure 4-bit NF4 quantization +quantization_config = BitsAndBytesConfig( + load_in_4bit=True, + bnb_4bit_quant_type="nf4" +) + +# Load the model with the config +model_nf4 = AutoModelForCausalLM.from_pretrained( + "facebook/opt-1.3b", + quantization_config=quantization_config, + device_map="auto", +) +``` + +## `torch_dtype` (Data Type for Unquantized Layers) +The `torch_dtype` parameter sets the data type for model layers that are not quantized (e.g. `LayerNorm`). Setting this to `torch.float16` or `torch.bfloat16` can further reduce memory usage. If unspecified, these layers default to `torch.float16`. + +```python +import torch +from transformers import AutoModelForCausalLM, BitsAndBytesConfig + +# Configure 4-bit NF4 quantization +quantization_config = BitsAndBytesConfig( + load_in_4bit=True, + bnb_4bit_quant_type="nf4" +) + +# Load model, casting non-quantized layers to float16 +model_mixed_precision = AutoModelForCausalLM.from_pretrained( + "facebook/opt-1.3b", + quantization_config=quantization_config, + torch_dtype=torch.float16, + device_map="auto", +) +``` + +For further information, consult the [HuggingFace Documentation for BitsAndBytes](https://huggingface.co/docs/transformers/main/en/quantization/bitsandbytes). + diff --git a/docs/stable/store/quickstart.md b/docs/stable/store/quickstart.md new file mode 100644 index 0000000..83492ea --- /dev/null +++ b/docs/stable/store/quickstart.md @@ -0,0 +1,245 @@ +--- +sidebar_position: 0 +--- + +# Quickstart Guide + +ServerlessLLM Store (`sllm-store`) is a Python library that supports fast model checkpoint loading from multi-tier storage (i.e., DRAM, SSD, HDD) into GPUs. + +ServerlessLLM Store provides a model manager and two key functions: +- `save_model`: Convert a HuggingFace model into a loading-optimized format and save it to a local path. +- `load_model`: Load a model into given GPUs. + + +## Requirements +- OS: Ubuntu 20.04 +- Python: 3.10 +- GPU: compute capability 7.0 or higher + +## Installations + +### Create a virtual environment +```bash +conda create -n sllm-store python=3.10 -y +conda activate sllm-store +``` + +### Install with pip +```bash +pip install serverless-llm-store +``` + +### Install from source +1. Clone the repository and enter the `store` directory + +``` bash +git clone https://github.com/ServerlessLLM/ServerlessLLM.git +cd ServerlessLLM/sllm_store +``` + +2. Install the package from source + +```bash +rm -rf build +pip install . +``` + +## Usage Examples +:::tip +We highly recommend using a fast storage device (e.g., NVMe SSD) to store the model files for the best experience. +For example, create a directory `models` on the NVMe SSD and link it to the local path. +```bash +mkdir -p /mnt/nvme/models # Replace '/mnt/nvme' with your NVMe SSD path. +ln -s /mnt/nvme/models ./models +``` +::: + +1. Convert a model to ServerlessLLM format and save it to a local path: +```python +from sllm_store.transformers import save_model + +# Load a model from HuggingFace model hub. +import torch +from transformers import AutoModelForCausalLM +model = AutoModelForCausalLM.from_pretrained('facebook/opt-1.3b', torch_dtype=torch.float16) + +# Replace './models' with your local path. +save_model(model, './models/facebook/opt-1.3b') +``` + +2. Launch the checkpoint store server in a separate process: +```bash +# 'mem_pool_size' is the maximum size of the memory pool in GB. It should be larger than the model size. +sllm-store start --storage-path $PWD/models --mem-pool-size 4GB +``` + + + +3. Load model in your project and make inference: +```python +import time +import torch +from sllm_store.transformers import load_model + +# warm up the GPU +num_gpus = torch.cuda.device_count() +for i in range(num_gpus): + torch.ones(1).to(f"cuda:{i}") + torch.cuda.synchronize() + +start = time.time() +model = load_model("facebook/opt-1.3b", device_map="auto", torch_dtype=torch.float16, storage_path="./models/", fully_parallel=True) +# Please note the loading time depends on the model size and the hardware bandwidth. +print(f"Model loading time: {time.time() - start:.2f}s") + +from transformers import AutoTokenizer + +tokenizer = AutoTokenizer.from_pretrained('facebook/opt-1.3b') +inputs = tokenizer('Hello, my dog is cute', return_tensors='pt').to("cuda") +outputs = model.generate(**inputs) +print(tokenizer.decode(outputs[0], skip_special_tokens=True)) +``` + +4. Clean up by "Ctrl+C" the server process. + +## Usage with vLLM + +ServerlessLLM integrates with vLLM to provide fast model loading capabilities. Follow these steps to set up and use ServerlessLLM with vLLM. + +### Prerequisites + +Before using ServerlessLLM with vLLM, you need to apply a compatibility patch to your vLLM installation. This patch has been tested with vLLM version `0.9.0.1`. + +### Apply the vLLM Patch + +1. **Check patch status** (optional): + ```bash + ./sllm_store/vllm_patch/check_patch.sh + ``` + +2. **Apply the patch**: + ```bash + ./sllm_store/vllm_patch/patch.sh + ``` + +3. **Remove the patch** (if needed): + ```bash + ./sllm_store/vllm_patch/remove_patch.sh + ``` + +:::note +The patch file is located at `sllm_store/vllm_patch/sllm_load.patch` in the ServerlessLLM repository. +::: + + +Our api aims to be compatible with the `sharded_state` load format in vLLM. Thus, due to the model modifications about the model architecture done by vLLM, the model format for vLLM is **not** the same as we used in transformers. Thus, the `ServerlessLLM format` mentioned in the subsequent sections means the format integrated with vLLM, which is different from the `ServerlessLLM format` used in the previous sections. + +Thus, for fist-time users, you have to load the model from other backends and then converted it to the ServerlessLLM format. + +1. Download the model from HuggingFace and save it in the ServerlessLLM format: +``` bash +python3 examples/sllm_store/save_vllm_model.py --model-name facebook/opt-1.3b --storage-path $PWD/models --tensor-parallel-size 1 + +``` + +You can also transfer the model from the local path compared to download it from network by passing the `--local-model-path` argument. + +After downloading the model, you can launch the checkpoint store server and load the model in vLLM through `sllm` load format. + +2. Launch the checkpoint store server in a separate process: +```bash +# 'mem_pool_size' is the maximum size of the memory pool in GB. It should be larger than the model size. +sllm-store start --storage-path $PWD/models --mem-pool-size 4GB +``` + +3. Load the model in vLLM: +```python +from vllm import LLM, SamplingParams + +import os + +storage_path = os.getenv("STORAGE_PATH", "./models") +model_name = "facebook/opt-1.3b" +model_path = os.path.join(storage_path, model_name) + +llm = LLM( + model=model_path, + load_format="serverless_llm", + dtype="float16" +) + +prompts = [ + "Hello, my name is", + "The president of the United States is", + "The capital of France is", + "The future of AI is", +] + +sampling_params = SamplingParams(temperature=0.8, top_p=0.95) +outputs = llm.generate(prompts, sampling_params) + +# Print the outputs. +for output in outputs: + prompt = output.prompt + generated_text = output.outputs[0].text + print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") +``` + +# Fine-tuning +ServerlessLLM currently supports LoRA fine-tuning using peft through the Hugging Face Transformers PEFT. + +ServerlessLLM Store provides a model manager and two key functions: +- save_lora: Convert an LoRA adapter into a loading-optimized format and save it to a local path. +- load_lora: Load an adapter into loaded model. + +> Note: Fine-tuning is currently experimental, especially on multi-GPU machines. You may encounter issues when using this feature in multi-GPU environments. + +## Usage Examples + +1. Convert an adapter to ServerlessLLM format and save it to a local path: +``` +from sllm_store.transformers import save_lora + +# TODO: Load an adapter from HuggingFace model hub. + + +# Replace './models' with your local path. +save_lora(adapter, './models/facebook/opt-1.3b') +``` + +2. Launch the checkpoint store server in a separate process: +``` +# 'mem_pool_size' is the maximum size of the memory pool in GB. It should be larger than the model size. +sllm-store start --storage-path $PWD/models --mem-pool-size 4GB +``` + +3. Load the adapter on your model and make inference: +``` +import time +import torch +from sllm_store.transformers import load_model, load_lora + +model = load_model("facebook/opt-1.3b", device_map="auto", torch_dtype=torch.float16, storage_path="./models/", fully_parallel=True) + +model = load_lora("facebook/opt-1.3b", adapter_name="demo_lora", adapter_path="ft_facebook/opt-1.3b_adapter1", device_map="auto", torch_dtype=torch.float16, storage_path="./models/") + +# Please note the loading time depends on the base model size and the hardware bandwidth. +print(f"Model loading time: {time.time() - start:.2f}s") + +from transformers import AutoTokenizer + +tokenizer = AutoTokenizer.from_pretrained('facebook/opt-1.3b') +inputs = tokenizer('Hello, my dog is cute', return_tensors='pt').to("cuda") +outputs = model.generate(**inputs) +print(tokenizer.decode(outputs[0], skip_special_tokens=True)) +``` + +4. Clean up by `Ctrl+C` the server process. diff --git a/docs/stable/store/rocm_quickstart.md b/docs/stable/store/rocm_quickstart.md new file mode 100644 index 0000000..7807301 --- /dev/null +++ b/docs/stable/store/rocm_quickstart.md @@ -0,0 +1,164 @@ +--- +sidebar_position: 1 +--- + +# ROCm Quick Start + +ServerlessLLM Store (`sllm-store`) currently supports ROCm platform. However, there are no pre-built wheels for ROCm. + +Due to an internal bug in ROCm, serverless-llm-store may face a GPU memory leak in ROCm before version 6.2.0, as noted in [issue](https://github.com/ROCm/HIP/issues/3580). + +1. Clone the repository and enter the `store` directory: + +```bash +git clone https://github.com/ServerlessLLM/ServerlessLLM.git +cd ServerlessLLM/sllm_store +``` +After that, you may either use the Docker image or build the `sllm-store` wheel from source and install it in your environment. + +## Use the Docker image + +We provide a Dockerfile with ROCm support. Currently, it's built on base image `rocm/vllm-dev:base_ROCm-6.3.1_20250528_tuned_20250530` + +2. Build the Docker image: + +``` bash +docker build -t sllm_store_rocm -f Dockerfile.rocm . +``` + +3. Start the Docker container: + +:::tip +If you want to run inference outside the Docker container, you need to pass the port to the host machine. For example, `-p 8073:8073`. You can also get the wheel from the Docker container after starting it via `docker cp sllm_store_server:/app/dist .`. +::: + +``` bash +docker run --name sllm_store_server --rm -it \ + --device /dev/kfd --device /dev/dri \ + --security-opt seccomp=unconfined \ + -v $(pwd)/models:/models \ + sllm_store_rocm +``` + +Expected output: + +``` bash +INFO 06-05 12:59:07 cli.py:76] Starting gRPC server +INFO 06-05 12:59:07 server.py:40] StorageServicer: storage_path=/models, mem_pool_size=4294967296, num_thread=4, chunk_size=33554432, registration_required=False +WARNING: Logging before InitGoogleLogging() is written to STDERR +I20250605 12:59:11.141070 1 checkpoint_store_hip.cpp:42] Number of GPUs: 1 +I20250605 12:59:11.141098 1 checkpoint_store_hip.cpp:44] I/O threads: 4, chunk size: 32MB +I20250605 12:59:11.141103 1 checkpoint_store_hip.cpp:46] Storage path: "/models" +I20250605 12:59:11.141119 1 checkpoint_store_hip.cpp:72] GPU 0 UUID: 61363865-3865-3038-3831-366132376261 +I20250605 12:59:11.519277 1 pinned_memory_pool_hip.cpp:30] Creating PinnedMemoryPool with 128 buffers of 33554432 bytes +I20250605 12:59:12.487957 1 checkpoint_store_hip.cpp:84] Memory pool created with 4GB +INFO 06-05 12:59:12 server.py:231] Starting gRPC server on 0.0.0.0:8073 + +``` + +After starting the Docker container, you can enter the container and run the following command to test the installation. + +``` bash +docker exec -it sllm_store_server /bin/bash +``` + +Try to save and load a transformer model: + +``` bash +python3 examples/save_transformers_model.py --model-name "facebook/opt-1.3b" --storage-path "/models" +python3 examples/load_transformers_model.py --model-name "facebook/opt-1.3b" --storage-path "/models" +``` +Expected output: + +``` bash +DEBUG 06-05 13:01:01 transformers.py:203] load_dict_non_blocking takes 0.0071375370025634766 seconds +DEBUG 06-05 13:01:01 transformers.py:213] load config takes 0.003943443298339844 seconds +DEBUG 06-05 13:01:01 torch.py:137] allocate_cuda_memory takes 0.0012660026550292969 seconds +DEBUG 06-05 13:01:01 client.py:72] load_into_gpu: facebook/opt-1.3b, 93b1932e-4b43-42cb-b82d-7228ef21810b +INFO 06-05 13:01:01 client.py:113] Model loaded: facebook/opt-1.3b, 93b1932e-4b43-42cb-b82d-7228ef21810b +INFO 06-05 13:01:01 torch.py:160] restore state_dict takes 0.0004298686981201172 seconds +DEBUG 06-05 13:01:02 transformers.py:224] load model takes 0.9706132411956787 seconds +INFO 06-05 13:01:02 client.py:117] confirm_model_loaded: facebook/opt-1.3b, 93b1932e-4b43-42cb-b82d-7228ef21810b +INFO 06-05 13:01:06 client.py:125] Model loaded +Model loading time: 5.28s +tokenizer_config.json: 100%|██████████████████████████████| 685/685 [00:00<00:00, 6.68MB/s] +vocab.json: 100%|███████████████████████████████████████| 899k/899k [00:00<00:00, 4.05MB/s] +merges.txt: 100%|███████████████████████████████████████| 456k/456k [00:00<00:00, 3.05MB/s] +special_tokens_map.json: 100%|████████████████████████████| 441/441 [00:00<00:00, 4.10MB/s] +/usr/local/lib/python3.12/dist-packages/torch/nn/modules/linear.py:125: UserWarning: Failed validator: GCN_ARCH_NAME (Triggered internally at /app/pytorch/aten/src/ATen/hip/tunable/Tunable.cpp:366.) + return F.linear(input, self.weight, self.bias) +Hello, my dog is cute and I want to give him a good home. I have a lot of experience with dogs and I +``` + +Try to save and load a model in vLLM: + +``` bash +python3 examples/save_vllm_model.py --model-name "facebook/opt-125m" --storage-path "/models" +python3 examples/load_vllm_model.py --model-name "facebook/opt-125m" --storage-path "/models" +``` +Expected output: + +``` bash +INFO 06-05 13:02:51 [__init__.py:243] Automatically detected platform rocm. +INFO 06-05 13:02:52 [__init__.py:31] Available plugins for group vllm.general_plugins: +INFO 06-05 13:02:52 [__init__.py:33] - lora_filesystem_resolver -> vllm.plugins.lora_resolvers.filesystem_resolver:register_filesystem_resolver +INFO 06-05 13:02:52 [__init__.py:36] All plugins in this group will be loaded. Set `VLLM_PLUGINS` to control which plugins to load. +INFO 06-05 13:03:00 [config.py:793] This model supports multiple tasks: {'reward', 'embed', 'generate', 'classify', 'score'}. Defaulting to 'generate'. +INFO 06-05 13:03:00 [arg_utils.py:1594] rocm is experimental on VLLM_USE_V1=1. Falling back to V0 Engine. +INFO 06-05 13:03:04 [config.py:1910] Disabled the custom all-reduce kernel because it is not supported on current platform. +INFO 06-05 13:03:04 [llm_engine.py:230] Initializing a V0 LLM engine (v0.9.0.1) with config: model='/models/facebook/opt-125m', speculative_config=None, tokenizer='/models/facebook/opt-125m', skip_tokenizer_init=False, tokenizer_mode=auto, revision=None, override_neuron_config={}, tokenizer_revision=None, trust_remote_code=False, dtype=torch.float16, max_seq_len=2048, download_dir=None, load_format=LoadFormat.SERVERLESS_LLM, tensor_parallel_size=1, pipeline_parallel_size=1, disable_custom_all_reduce=True, quantization=None, enforce_eager=False, kv_cache_dtype=auto, device_config=cuda, decoding_config=DecodingConfig(backend='auto', disable_fallback=False, disable_any_whitespace=False, disable_additional_properties=False, reasoning_backend=''), observability_config=ObservabilityConfig(show_hidden_metrics_for_version=None, otlp_traces_endpoint=None, collect_detailed_traces=None), seed=0, served_model_name=/models/facebook/opt-125m, num_scheduler_steps=1, multi_step_stream_outputs=True, enable_prefix_caching=None, chunked_prefill_enabled=False, use_async_output_proc=True, pooler_config=None, compilation_config={"compile_sizes": [], "inductor_compile_config": {"enable_auto_functionalized_v2": false}, "cudagraph_capture_sizes": [256, 248, 240, 232, 224, 216, 208, 200, 192, 184, 176, 168, 160, 152, 144, 136, 128, 120, 112, 104, 96, 88, 80, 72, 64, 56, 48, 40, 32, 24, 16, 8, 4, 2, 1], "max_capture_size": 256}, use_cached_outputs=False, +INFO 06-05 13:03:04 [rocm.py:208] None is not supported in AMD GPUs. +INFO 06-05 13:03:04 [rocm.py:209] Using ROCmFlashAttention backend. +INFO 06-05 13:03:05 [parallel_state.py:1064] rank 0 in world size 1 is assigned as DP rank 0, PP rank 0, TP rank 0, EP rank 0 +INFO 06-05 13:03:05 [model_runner.py:1170] Starting to load model /models/facebook/opt-125m... +DEBUG 06-05 13:03:05 torch.py:137] allocate_cuda_memory takes 0.0004763603210449219 seconds +DEBUG 06-05 13:03:05 client.py:72] load_into_gpu: facebook/opt-125m/rank_0, e8e7d900-652d-4822-8992-ad22f734b9c8 +INFO 06-05 13:03:05 client.py:113] Model loaded: facebook/opt-125m/rank_0, e8e7d900-652d-4822-8992-ad22f734b9c8 +INFO 06-05 13:03:05 torch.py:160] restore state_dict takes 0.00021338462829589844 seconds +INFO 06-05 13:03:05 client.py:117] confirm_model_loaded: facebook/opt-125m/rank_0, e8e7d900-652d-4822-8992-ad22f734b9c8 +INFO 06-05 13:03:05 client.py:125] Model loaded +INFO 06-05 13:03:05 [model_runner.py:1202] Model loading took 0.2363 GiB and 0.711783 seconds +/app/third_party/vllm/vllm/model_executor/layers/utils.py:80: UserWarning: Failed validator: GCN_ARCH_NAME (Triggered internally at /app/pytorch/aten/src/ATen/hip/tunable/Tunable.cpp:366.) + return torch.nn.functional.linear(x, weight, bias) +INFO 06-05 13:03:17 [worker.py:303] Memory profiling takes 11.68 seconds +INFO 06-05 13:03:17 [worker.py:303] the current vLLM instance can use total_gpu_memory (23.98GiB) x gpu_memory_utilization (0.90) = 21.59GiB +INFO 06-05 13:03:17 [worker.py:303] model weights take 0.24GiB; non_torch_memory takes 0.53GiB; PyTorch activation peak memory takes 0.49GiB; the rest of the memory reserved for KV Cache is 20.33GiB. +INFO 06-05 13:03:17 [executor_base.py:112] # rocm blocks: 37011, # CPU blocks: 7281 +INFO 06-05 13:03:17 [executor_base.py:117] Maximum concurrency for 2048 tokens per request: 289.15x +INFO 06-05 13:03:18 [model_runner.py:1526] Capturing cudagraphs for decoding. This may lead to unexpected consequences if the model is not static. To run the model in eager mode, set 'enforce_eager=True' or use '--enforce-eager' in the CLI. If out-of-memory error occurs during cudagraph capture, consider decreasing `gpu_memory_utilization` or switching to eager mode. You can also reduce the `max_num_seqs` as needed to decrease memory usage. +Capturing CUDA graph shapes: 100%|█████████████████████████| 35/35 [00:09<00:00, 3.55it/s] +INFO 06-05 13:03:28 [model_runner.py:1684] Graph capturing finished in 10 secs, took 0.13 GiB +INFO 06-05 13:03:28 [llm_engine.py:428] init engine (profile, create kv cache, warmup model) took 22.81 seconds +Adding requests: 100%|█████████████████████████████████████| 4/4 [00:00<00:00, 2079.22it/s] +Processed prompts: 100%|█| 4/4 [00:00<00:00, 6.71it/s, est. speed input: 43.59 toks/s, out +Prompt: 'Hello, my name is', Generated text: ' Joel, my dad is my friend and we are in a relationship. I am' +Prompt: 'The president of the United States is', Generated text: ' speaking out against the release of some State Department documents which show the Russians were involved' +Prompt: 'The capital of France is', Generated text: ' a worldwide knowledge center. What better place to learn about the history and culture of' +Prompt: 'The future of AI is', Generated text: " here: it's the future of everything\nIf you want to test your minds" +[rank0]:[W605 13:03:30.532018298 ProcessGroupNCCL.cpp:1476] Warning: WARNING: destroy_process_group() was not called before program exit, which can leak resources. For more info, please see https://pytorch.org/docs/stable/distributed.html#shutdown (function operator()) +``` + +## Build the wheel from source and install + +Currently, `pip install .` does not work with ROCm. We suggest you build `sllm-store` wheel and manually install it in your environment. + + + +If there's a customized PyTorch version installed, you may need to run the following command to modify the `torch` version in `requirements.txt`: + +```bash +python3 using_existing_torch.py +``` + +2. Build the wheel: + +```bash +python setup.py sdist bdist_wheel +``` + +## Known issues + +1. GPU memory leak in ROCm before version 6.2.0. + +This issue is due to an internal bug in ROCm. After the inference instance is completed, the GPU memory is still occupied and not released. For more information, please refer to [issue](https://github.com/ROCm/HIP/issues/3580). + diff --git a/entrypoint.sh b/entrypoint.sh new file mode 100755 index 0000000..dc4b798 --- /dev/null +++ b/entrypoint.sh @@ -0,0 +1,112 @@ +#!/bin/bash + +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # + +set -e + +# Default values +DEFAULT_RAY_PORT=6379 +DEFAULT_RAY_RESOURCES_HEAD='{"control_node": 1}' +DEFAULT_RAY_NUM_CPUS=20 +DEFAULT_RAY_HEAD_ADDRESS="sllm_head:6379" +DEFAULT_STORAGE_PATH="/models" + +# Source conda +source /opt/conda/etc/profile.d/conda.sh + +# Function to initialize the head node +initialize_head_node() { + echo "Initializing head node..." + + # Activate head environment + echo "Activating head conda environment..." + conda activate head + + RAY_PORT="${RAY_PORT:-$DEFAULT_RAY_PORT}" + RAY_RESOURCES="${RAY_RESOURCES:-$DEFAULT_RAY_RESOURCES_HEAD}" + RAY_NUM_CPUS="${RAY_NUM_CPUS:-$DEFAULT_RAY_NUM_CPUS}" + + # Construct the command + CMD="ray start --head --port=$RAY_PORT --resources='$RAY_RESOURCES' --num-cpus=$RAY_NUM_CPUS" + + # Add node IP if specified + if [ ! -z "$RAY_NODE_IP" ]; then + echo "Using specified node IP: $RAY_NODE_IP" + CMD="$CMD --node-ip-address=$RAY_NODE_IP" + else + echo "No node IP specified. Ray will attempt to determine the best IP automatically." + fi + + # Display and execute the command + echo "Executing: $CMD" + eval "$CMD" + + # Start sllm-serve with any additional arguments passed to the script + echo "Starting sllm-serve with arguments: $@" + exec sllm-serve start "$@" +} + +# Function to initialize the worker node +initialize_worker_node() { + echo "Initializing worker node..." + + # Activate worker environment + echo "Activating worker conda environment..." + conda activate worker + + # Start the worker + RAY_HEAD_ADDRESS="${RAY_HEAD_ADDRESS:-$DEFAULT_RAY_HEAD_ADDRESS}" + + if [ -z "$WORKER_ID" ]; then + echo "WORKER_ID must be set" + exit 1 + fi + + RAY_RESOURCES='{"worker_node": 1, "worker_id_'$WORKER_ID'": 1}' + + # Construct the command + CMD="ray start --address=$RAY_HEAD_ADDRESS --resources='$RAY_RESOURCES'" + + # Add node IP if specified + if [ ! -z "$RAY_NODE_IP" ]; then + echo "Using specified node IP: $RAY_NODE_IP" + CMD="$CMD --node-ip-address=$RAY_NODE_IP" + else + echo "No node IP specified. Ray will attempt to determine the best IP automatically." + fi + + # Display and execute the command + echo "Executing: $CMD" + eval "$CMD" + + # Start sllm-store with any additional arguments passed to the script + STORAGE_PATH="${STORAGE_PATH:-$DEFAULT_STORAGE_PATH}" + echo "Starting sllm-store with arguments: --storage-path=$STORAGE_PATH $@" + exec sllm-store start --storage-path=$STORAGE_PATH "$@" +} + +# Determine the node type and call the appropriate initialization function +if [ "$MODE" == "HEAD" ]; then + initialize_head_node "$@" +elif [ "$MODE" == "WORKER" ]; then + initialize_worker_node "$@" +else + echo "MODE must be set to either HEAD or WORKER" + exit 1 +fi diff --git a/examples/.DS_Store b/examples/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..a555fcac7c8db962ee1136c6357bddaf544f49d3 GIT binary patch literal 6148 zcmeHKOHRWu5FJB>`jMdGBXxzm-~jXnp$dDX9st?~r4?yYwUq84OT-qjX2AtmvtY{! zxDRh^D@{n+0+kR#p2~iXJ+|LGCw5IlqA~I6L{%axA~6=q$a0L^Ic03k)a(L<8snTs zfnRTS!u~MhZ7Zw-R)N2!0Drq12~&2;O1nSYY=&U4Ip;T%c!U+t3WcOz5sa-Bp+?hS1$nFO8pLFw&^IlQ5SLVP+QQh9cDL7+)%P5{^cj zTLr8FX$98xW0lYUzO~7>qQc24?>VC>d;K75G&JJ^= 8.3.2 +pytest-asyncio >= 0.23.8 diff --git a/requirements-worker.txt b/requirements-worker.txt new file mode 100644 index 0000000..7e3cbfc --- /dev/null +++ b/requirements-worker.txt @@ -0,0 +1,12 @@ +accelerate==1.7.0 +datasets==3.6.0 +GPUtil==1.4.0 +# ServerlessLLM does not directly depend on outlines. +# This is to fix issue: https://github.com/dottxt-ai/outlines/issues/1198 +outlines==0.1.11 +peft==0.15.2 +ray==2.46.0 +speedtest-cli==2.1.3 +torch==2.7.0 +transformers==4.52.4 +vllm==0.9.0.1 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..199356c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,11 @@ +fastapi==0.115.12 +GPUtil==1.4.0 +openai==1.52.0 +pydantic==2.11.5 +pydantic_core==2.33.2 +ray==2.46.0 +requests==2.32.2 +serverless-llm-store +speedtest-cli==2.1.3 +types-requests==2.31.0.20240125 +uvicorn[standard]==0.23.1 diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..d79e0dd --- /dev/null +++ b/setup.py @@ -0,0 +1,87 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import io +import os +import sys +from pathlib import Path + +from setuptools import setup + +ROOT_DIR = os.path.dirname(__file__) + + +def fetch_requirements(path): + with open(path, "r") as fd: + return [r.strip() for r in fd.readlines()] + + +def remove_prefix(text, prefix): + if text.startswith(prefix): + return text[len(prefix) :] + return text + + +def get_path(*filepath) -> str: + return os.path.join(ROOT_DIR, *filepath) + + +def read_readme() -> str: + """Read the README file if present.""" + p = get_path("README.md") + if os.path.isfile(p): + return io.open(get_path("README.md"), "r", encoding="utf-8").read() + else: + return "" + + +install_requires = fetch_requirements("requirements.txt") +install_requires_worker = fetch_requirements("requirements-worker.txt") + +extras = {} +extras["test"] = install_requires_worker + ["pytest", "pytest-asyncio"] +extras["worker"] = install_requires_worker + +sys.path.append(Path.cwd().as_posix()) + +setup( + name="serverless-llm", + version="0.7.0", + install_requires=install_requires, + long_description=read_readme(), + long_description_content_type="text/markdown", + extras_require=extras, + entry_points={ + "console_scripts": [ + "sllm = sllm.clic:cli", + "sllm-serve=sllm.serve.commands.serve.sllm_serve:main", + ], + }, + include_package_data=True, + package_data={ + "sllm.serve": ["py.typed", "sllm.sllm_serve"], + "sllm": ["default_config.json"], + }, + packages=[ + "sllm", + "sllm.serve", + "sllm.serve.commands.serve", + "sllm.serve.backends", + "sllm.serve.routers", + "sllm.serve.schedulers", + ], +) diff --git a/sllm/.DS_Store b/sllm/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..e1478dc5c7fa8a55e291cc01200ff8af0b617c63 GIT binary patch literal 6148 zcmeHKJ4ysW5Utu-VZmf0F_KO^z}{e7#uMxXWIw1d!z_x1(y@0iG7!9osYfvK44dhz zuF{>x!B9l2p!;>#cjm!#PZ1GMua*;{F%gY01X&h6BI;h#z?{X%l4CMkw9UFF#qU+g zvlq0Wn$GLf?(^T>Z!Jw*Rr9)?Lo<5Z+}y^4r=zZQ`Hgjb*3J5YFxsI@TG0hv(<-Yu z*u3V}Zr!)Ty$7q?iEr9%?S7A}e(@~zU7P`Dz!`7`{x<`-vqeU`iat97&VV!U$$*>> z0Yk7fjEd>#z?515;1KF0SW7Pi(_2jM% v7$+Da;umEB!8-d1z(&rI{bW>okTv{D!>A}(M4!Te{v(hG@yQwZ0S4XyPZ~!y literal 0 HcmV?d00001 diff --git a/sllm/_cli_utils.py b/sllm/_cli_utils.py new file mode 100644 index 0000000..056257c --- /dev/null +++ b/sllm/_cli_utils.py @@ -0,0 +1,308 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import json +import os +import subprocess +import sys + +import click +import requests + + +# ----------------------------- START COMMAND ----------------------------- # +def start_server(): + """Start the SLLM server using docker-compose.""" + compose_file = os.getenv( + "SLLM_COMPOSE_FILE", "examples/docker/docker-compose.yml" + ) + compose_file = os.path.abspath(compose_file) + + if not os.path.exists(compose_file): + click.echo(f"[❌] Cannot find docker-compose.yml at {compose_file}") + return + + try: + click.echo(f"[ℹ] Starting services using {compose_file}...") + subprocess.run( + ["docker", "compose", "-f", compose_file, "up", "-d"], check=True + ) + click.echo(f"[🚀] SLLM server started successfully.") + except Exception as e: + click.echo(f"[❌] Failed to start services: {e}") + + +# ----------------------------- DEPLOY COMMAND ----------------------------- # +def read_config(config_path: str) -> dict: + try: + with open(config_path, "r") as file: + return json.load(file) + except FileNotFoundError: + print(f"[ERROR] Config file {config_path} not found.") + sys.exit(1) + except json.JSONDecodeError: + print(f"[ERROR] JSON decode error in config file {config_path}.") + sys.exit(1) + + +def deep_update(original: dict, updates: dict) -> dict: + for key, value in updates.items(): + if isinstance(value, dict) and isinstance(original.get(key), dict): + original[key] = deep_update(original.get(key, {}), value) + else: + original[key] = value + return original + + +def deploy_model( + model, + config=None, + backend=None, + num_gpus=None, + target=None, + min_instances=None, + max_instances=None, + enable_lora=None, + lora_adapters=None, + precision=None, +): + default_config_path = os.path.abspath( + os.path.join(os.path.dirname(__file__), "default_config.json") + ) + + if not os.path.exists(default_config_path): + print(f"[ERROR] Default config not found at {default_config_path}") + return + + config_data = read_config(default_config_path) + + if config: + # Try to find the config file in multiple locations + config_path = None + search_paths = [ + os.path.abspath( + config + ), # Absolute or relative to current directory + os.path.join( + os.path.dirname(__file__), config + ), # Relative to sllm package + os.path.expanduser(f"~/.sllm/{config}"), # User config directory + os.path.join("/etc/sllm", config), # System config directory + ] + + for path in search_paths: + if os.path.exists(path): + config_path = path + break + + if not config_path: + print( + f"[ERROR] Config file '{config}' not found in any of these locations:" + ) + for path in search_paths: + print(f" - {path}") + print("") + print("Available config files:") + # Show available config files in current directory + current_dir_configs = [ + f for f in os.listdir(".") if f.endswith(".json") + ] + if current_dir_configs: + for cf in current_dir_configs: + print(f" - {cf}") + else: + print(" - No JSON config files found in current directory") + + # Show the default config location + default_config_rel = os.path.join( + os.path.dirname(__file__), "default_config.json" + ) + if os.path.exists(default_config_rel): + print(f" - {default_config_rel} (default config)") + sys.exit(1) # Exit with error code + + user_config = read_config(config_path) + config_data = deep_update(config_data, user_config) + + if model: + config_data["model"] = model + config_data.setdefault("backend_config", {})[ + "pretrained_model_name_or_path" + ] = model + + if not config_data.get("model"): + print("[❌ ERROR] Model name is required!") + print("Please specify the model in one of these ways:") + print(" 1. Command line: --model MODEL_NAME") + print(" 2. Config file: include 'model' field in your JSON config") + print(" 3. Both: --config CONFIG_FILE --model MODEL_NAME") + print("") + print("Examples:") + print(" sllm deploy --model microsoft/DialoGPT-small") + print(" sllm deploy --config my_config.json") + print(" sllm deploy --config my_config.json --model facebook/opt-1.3b") + sys.exit(1) + + if backend: + config_data["backend"] = backend + if num_gpus is not None: + config_data["num_gpus"] = num_gpus + if target is not None: + config_data.setdefault("auto_scaling_config", {})["target"] = target + if min_instances is not None: + config_data["auto_scaling_config"]["min_instances"] = min_instances + if max_instances is not None: + config_data["auto_scaling_config"]["max_instances"] = max_instances + if lora_adapters: + # Only parse if not already a dict + if isinstance(lora_adapters, dict): + adapters_dict = lora_adapters + else: + adapters_dict = {} + if isinstance(lora_adapters, str): + items = lora_adapters.replace(",", " ").split() + elif isinstance(lora_adapters, (list, tuple)): + items = [] + for item in lora_adapters: + items.extend(item.replace(",", " ").split()) + else: + items = [str(lora_adapters)] + for module in items: + module = module.strip() + if not module: + continue + if "=" not in module: + print( + f"[ERROR] Invalid LoRA module format: {module}. Expected =." + ) + sys.exit(1) + name, path = module.split("=", 1) + adapters_dict[name] = path + config_data.setdefault("backend_config", {})["lora_adapters"] = ( + adapters_dict + ) + if enable_lora is not None: + config_data.setdefault("backend_config", {})["enable_lora"] = ( + enable_lora + ) + if precision: + config_data.setdefault("backend_config", {})["precision"] = precision + + base_url = os.getenv("LLM_SERVER_URL", "http://127.0.0.1:8343") + url = f"{base_url.rstrip('/')}/register" + headers = {"Content-Type": "application/json"} + + try: + response = requests.post(url, headers=headers, json=config_data) + if response.status_code == 200: + print( + f"[✅ SUCCESS] Model '{config_data['model']}' deployed successfully." + ) + else: + print( + f"[❌ ERROR] Deploy failed with status {response.status_code}: {response.text}" + ) + sys.exit(1) # Exit with error code to indicate failure + except Exception as e: + print(f"[EXCEPTION] Failed to deploy: {str(e)}") + sys.exit(1) # Exit with error code to indicate failure + + +# ----------------------------- DELETE COMMAND ----------------------------- # +def delete_model(models, lora_adapters=None): + if not models: + print("[⚠️ WARNING] No model names provided for deletion.") + return + + base_url = os.getenv("LLM_SERVER_URL", "http://127.0.0.1:8343") + headers = {"Content-Type": "application/json"} + + if lora_adapters is not None and len(models) > 1: + print( + "[❌ ERROR] You can only delete one model when using --lora-adapters." + ) + return + + for model in models: + url = f"{base_url.rstrip('/')}/delete" + data = {"model": model} + # Robust lora_adapters parsing (same as deploy) + if lora_adapters is not None: + # Accept: demo-lora1 demo-lora2 OR demo-lora1=path ... + if isinstance(lora_adapters, dict): + adapters = lora_adapters + else: + # flatten and split + if isinstance(lora_adapters, str): + items = lora_adapters.replace(",", " ").split() + elif isinstance(lora_adapters, (list, tuple)): + items = [] + for item in lora_adapters: + items.extend(item.replace(",", " ").split()) + else: + items = [str(lora_adapters)] + # If all items have '=', parse as dict; else, treat as list + if all("=" in module for module in items if module.strip()): + adapters = {} + for module in items: + module = module.strip() + if not module: + continue + name, path = module.split("=", 1) + adapters[name] = path + else: + # Only adapter names + adapters = [ + module.strip() for module in items if module.strip() + ] + data["lora_adapters"] = adapters + try: + response = requests.post(url, headers=headers, json=data) + if response.status_code == 200: + print( + f"[✅ SUCCESS] Delete request for '{model}' sent successfully." + ) + else: + print( + f"[❌ ERROR] Failed to delete '{model}'. Status: {response.status_code}, Response: {response.text}" + ) + except Exception as e: + print(f"[EXCEPTION] Failed to delete '{model}': {str(e)}") + + +# ----------------------------- STATUS COMMAND ----------------------------- # +def show_status(): + """Query the information of registered models.""" + endpoint = "/v1/models" + base_url = os.getenv("LLM_SERVER_URL", "http://127.0.0.1:8343") + url = base_url.rstrip("/") + endpoint + headers = {"Content-Type": "application/json"} + + try: + response = requests.get(url, headers=headers) + if response.status_code == 200: + try: + data = response.json() + print(f"Model status: {data}") + except ValueError: + print("[❌ ERROR] Invalid JSON received from server.") + else: + print( + f"[❌ ERROR] Failed with status {response.status_code}: {response.text}" + ) + except requests.exceptions.RequestException as e: + print(f"[EXCEPTION] Failed to query status: {str(e)}") diff --git a/sllm/cli/default_ft_config.json b/sllm/cli/default_ft_config.json new file mode 100644 index 0000000..2ac2537 --- /dev/null +++ b/sllm/cli/default_ft_config.json @@ -0,0 +1,27 @@ +{ + "model": "", + "ft_backend": "peft", + "output_dir": "ft_facebook/opt-125m_adapter1", + "dataset_config": { + "dataset_source": "hf_hub", + "hf_dataset_name": "fka/awesome-chatgpt-prompts", + "tokenization_field": "prompt", + "split": "train", + "data_files": "", + "extension_type": "" + }, + "lora_config": { + "r": 4, + "lora_alpha": 32, + "lora_dropout": 0.05, + "bias": "none", + "task_type": "CAUSAL_LM" + }, + "training_config": { + "auto_find_batch_size": true, + "save_strategy": "no", + "num_train_epochs": 2, + "learning_rate": 0.0001, + "use_cpu": false + } +} \ No newline at end of file diff --git a/sllm/cli/delete.py b/sllm/cli/delete.py new file mode 100644 index 0000000..1aac320 --- /dev/null +++ b/sllm/cli/delete.py @@ -0,0 +1,73 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import os +from argparse import Namespace, _SubParsersAction + +import requests + +from sllm.serve.logger import init_logger + +logger = init_logger(__name__) + + +class DeleteCommand: + @staticmethod + def register_subcommand(parser: _SubParsersAction): + delete_parser = parser.add_parser( + "delete", help="Delete deployed models by name." + ) + delete_parser.add_argument( + "models", nargs="+", type=str, help="Model names to delete." + ) + delete_parser.add_argument( + "--lora-adapters", + nargs="+", + type=str, + help="LoRA adapters to delete.", + ) + delete_parser.set_defaults(func=DeleteCommand) + + def __init__(self, args: Namespace) -> None: + self.models = args.models + self.lora_adapters = getattr(args, "lora_adapters", None) + self.url = ( + os.getenv("LLM_SERVER_URL", "http://127.0.0.1:8343") + "/delete" + ) + + def run(self) -> None: + headers = {"Content-Type": "application/json"} + if self.lora_adapters is not None and len(self.models) > 1: + logger.error( + "You can only delete one model when using --lora-adapters." + ) + exit(1) + + for model in self.models: + data = {"model": model} + if self.lora_adapters is not None: + data["lora_adapters"] = self.lora_adapters + response = requests.post(self.url, headers=headers, json=data) + + if response.status_code == 200: + logger.info( + f"Successfully sent the request to delete model {model}" + ) + else: + logger.error( + f"Failed to delete model: {model}. Status code: {response.status_code}. Response: {response.text}" + ) diff --git a/sllm/cli/deploy.py b/sllm/cli/deploy.py new file mode 100644 index 0000000..7a5869e --- /dev/null +++ b/sllm/cli/deploy.py @@ -0,0 +1,212 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import os +from argparse import Namespace, _SubParsersAction + +import requests + +from sllm.cli._cli_utils import read_config +from sllm.serve.logger import init_logger + +logger = init_logger(__name__) + + +class DeployCommand: + @staticmethod + def register_subcommand(parser: _SubParsersAction): + deploy_parser = parser.add_parser( + "deploy", help="Deploy a model using a config file or model name." + ) + deploy_parser.add_argument( + "--model", + type=str, + help="Model name to deploy with default configuration.", + ) + deploy_parser.add_argument( + "--config", type=str, help="Path to the JSON config file." + ) + deploy_parser.add_argument( + "--backend", + type=str, + help="Overwrite the backend in the default configuration.", + ) + deploy_parser.add_argument( + "--num-gpus", + type=int, + help="Overwrite the number of GPUs in the default configuration.", + ) + deploy_parser.add_argument( + "--target", + type=int, + help="Overwrite the target concurrency in the default configuration.", + ) + deploy_parser.add_argument( + "--min-instances", + type=int, + help="Overwrite the minimum instances in the default configuration.", + ) + deploy_parser.add_argument( + "--max-instances", + type=int, + help="Overwrite the maximum instances in the default configuration.", + ) + deploy_parser.add_argument( + "--enable-lora", + action="store_true", + help="Enable LoRA adapter support.", + ) + deploy_parser.add_argument( + "--lora-adapters", + type=str, + nargs="+", + help="Specify LoRA adapters in the format =.", + ) + deploy_parser.set_defaults(func=DeployCommand) + + def __init__(self, args: Namespace) -> None: + self.model = args.model + self.config_path = args.config + self.backend = args.backend + self.num_gpus = args.num_gpus + self.target = args.target + self.min_instances = args.min_instances + self.max_instances = args.max_instances + self.enable_lora = args.enable_lora + self.lora_adapters = ( + self.parse_lora_adapters(args.lora_adapters) + if args.lora_adapters + else None + ) + self.url = ( + os.getenv("LLM_SERVER_URL", "http://127.0.0.1:8343") + "/register" + ) + self.default_config_path = os.path.join( + os.path.dirname(__file__), "default_config.json" + ) + + def parse_lora_adapters(self, lora_adapters): + parsed_modules = {} + if lora_adapters: + for module in lora_adapters: + if "=" not in module: + raise ValueError( + f"Invalid LoRA module format: {module}. Expected =." + ) + name, path = module.split("=", 1) + parsed_modules[name] = path + return parsed_modules + + def validate_config(self, config_data: dict) -> None: + """Validate the provided configuration data to ensure correctness.""" + try: + num_gpus = config_data["num_gpus"] + target = config_data["auto_scaling_config"]["target"] + min_instances = config_data["auto_scaling_config"]["min_instances"] + max_instances = config_data["auto_scaling_config"]["max_instances"] + except KeyError as e: + raise ValueError(f"Missing key in config_data: {e}") + + if num_gpus < 1: + raise ValueError("Number of GPUs cannot be less than 1.") + if target < 1: + raise ValueError("Target concurrency cannot be less than 1.") + if min_instances < 0: + raise ValueError("Minimum instances cannot be negative.") + if max_instances < 0: + raise ValueError("Maximum instances cannot be negative.") + if min_instances > max_instances: + raise ValueError( + "Minimum instances cannot be greater than maximum instances." + ) + + def update_config( + self, default_config: dict, provided_config: dict + ) -> dict: + """Update the default configuration with values from the provided configuration.""" + for key, value in provided_config.items(): + if isinstance(value, dict) and key in default_config: + default_config[key] = self.update_config( + default_config[key], value + ) + else: + default_config[key] = value + return default_config + + def run(self) -> None: + default_config = read_config(self.default_config_path) + + if self.config_path: + provided_config = read_config(self.config_path) + config_data = self.update_config(default_config, provided_config) + # If pretrained_model_name_or_path is not provided, use the model name + if ( + config_data["backend_config"]["pretrained_model_name_or_path"] + == "" + ): + config_data["backend_config"][ + "pretrained_model_name_or_path" + ] = config_data["model"] + elif self.model: + config_data = default_config + config_data["model"] = self.model + config_data["backend_config"]["pretrained_model_name_or_path"] = ( + self.model + ) + if self.backend: + config_data["backend"] = self.backend + if self.num_gpus is not None: + config_data["num_gpus"] = self.num_gpus + if self.target is not None: + config_data["auto_scaling_config"]["target"] = self.target + if self.min_instances is not None: + config_data["auto_scaling_config"]["min_instances"] = ( + self.min_instances + ) + if self.max_instances is not None: + config_data["auto_scaling_config"]["max_instances"] = ( + self.max_instances + ) + else: + logger.error("You must specify either --model or --config.") + exit(1) + + if self.enable_lora: + config_data["backend_config"]["enable_lora"] = True + config_data["backend_config"]["lora_adapters"] = self.lora_adapters + + self.validate_config(config_data) + logger.info(f"Deploying model {config_data['model']}.") + self.deploy_model(config_data) + + def deploy_model(self, config_data: dict) -> None: + headers = {"Content-Type": "application/json"} + + if "lora_adapters" in config_data["backend_config"]: + logger.info( + f"Using LoRA modules: {config_data['backend_config']['lora_adapters']}" + ) + + # Send POST request to the /register endpoint + response = requests.post(self.url, headers=headers, json=config_data) + + if response.status_code == 200: + logger.info("Model registered successfully.") + else: + logger.error( + f"Failed to register model. Status code: {response.status_code}. Response: {response.text}" + ) diff --git a/sllm/cli/encode.py b/sllm/cli/encode.py new file mode 100644 index 0000000..e05acf8 --- /dev/null +++ b/sllm/cli/encode.py @@ -0,0 +1,97 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import concurrent.futures +import json +import logging +import os +from argparse import Namespace, _SubParsersAction + +import requests + +from sllm.cli._cli_utils import read_config +from sllm.serve.logger import init_logger + +logger = init_logger(__name__) + + +class EncodeCommand: + @staticmethod + def register_subcommand(parser: _SubParsersAction): + encode_parser = parser.add_parser( + "encode", help="Encode using the deployed model." + ) + encode_parser.add_argument( + "input_path", type=str, help="Path to the JSON input file." + ) + encode_parser.add_argument( + "-t", + "--threads", + type=int, + default=1, + help="Number of parallel encoding processes.", + ) + encode_parser.set_defaults(func=EncodeCommand) + + def __init__(self, args: Namespace) -> None: + self.input_path = args.input_path + self.threads = args.threads + self.endpoint = "/v1/embeddings" # TODO: as a argument + self.url = ( + os.getenv("LLM_SERVER_URL", "http://127.0.0.1:8343") + self.endpoint + ) + + def run(self) -> None: + input_data = read_config(self.input_path) + if self.threads > 1: + with concurrent.futures.ThreadPoolExecutor( + max_workers=self.threads + ) as executor: + futures = [ + executor.submit(self.encode, input_data) + for _ in range(self.threads) + ] + results = [ + future.result() + for future in concurrent.futures.as_completed(futures) + ] + # Validate results + if not all(results): + logger.error("Some encoding processes failed.") + else: + logger.info( + f"All encoding processes done. Results: {results}" + ) + else: + result = self.encode(input_data) + logger.info(f"Embedding result: {result}") + + def encode(self, input_data: dict) -> dict: + headers = {"Content-Type": "application/json"} + + # Send POST request to the /v1/chat/completions endpoint + response = requests.post(self.url, headers=headers, json=input_data) + + if response.status_code == 200: + logger.info("Encoding successful.") + return response.json() + else: + logger.error( + f"Failed to encode. Status code: {response.status_code}" + ) + logger.error(f"Response: {response.text}") + return None diff --git a/sllm/cli/fine_tuning.py b/sllm/cli/fine_tuning.py new file mode 100644 index 0000000..8d4ea15 --- /dev/null +++ b/sllm/cli/fine_tuning.py @@ -0,0 +1,94 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import concurrent.futures +import os +from argparse import Namespace, _SubParsersAction + +import requests + +from sllm.cli._cli_utils import read_config +from sllm.serve.logger import init_logger + +logger = init_logger(__name__) + + +class FineTuningCommand: + @staticmethod + def register_subcommand(parser: _SubParsersAction): + fine_tuning_parser = parser.add_parser( + "fine-tuning", help="fine-tuning base model." + ) + fine_tuning_parser.add_argument( + "--base-model", type=str, help="base model name" + ) + fine_tuning_parser.add_argument( + "--config", + type=str, + help="path to fine-tuning configuration JSON file", + default=os.path.join( + os.path.dirname(__file__), "default_ft_config.json" + ), + ) + fine_tuning_parser.set_defaults(func=FineTuningCommand) + + def __init__(self, args: Namespace) -> None: + self.base_model = args.base_model + self.config_path = args.config + self.url = ( + os.getenv("LLM_SERVER_URL", "http://127.0.0.1:8343") + + "/fine-tuning" + ) + + def validate_config(self, config_data: dict) -> None: + """Validate the provided configuration data to ensure correctness.""" + try: + model = config_data["model"] + ft_backend = config_data["ft_backend"] + dataset_source = config_data["dataset_config"]["dataset_source"] + tokenization_field = config_data["dataset_config"][ + "tokenization_field" + ] + except KeyError as e: + raise ValueError(f"Missing key in ft_config_data: {e}") + + if dataset_source not in ["hf_hub", "local"]: + raise ValueError("dataset_source only supports hf_hub or local") + + def run(self) -> None: + config_data = read_config(self.config_path) + config_data["model"] = self.base_model + self.validate_config(config_data) + logger.info(f"Start fine-tuning base model {config_data['model']}") + result = self.fine_tuning(config_data) + logger.info(f"{result}") + + def fine_tuning(self, config: dict) -> dict: + headers = {"Content-Type": "application/json"} + + # Send POST request to the /fine-tuning endpoint + response = requests.post(self.url, headers=headers, json=config) + + if response.status_code == 200: + logger.info(f"{config['model']} fine-tuned successful.") + return response.json() + else: + logger.error( + f"Failed to do fine-tuning. Status code: {response.status_code}" + ) + logger.error(f"Response: {response.text}") + return None diff --git a/sllm/cli/generate.py b/sllm/cli/generate.py new file mode 100644 index 0000000..7fac1f8 --- /dev/null +++ b/sllm/cli/generate.py @@ -0,0 +1,93 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import concurrent.futures +import os +from argparse import Namespace, _SubParsersAction + +import requests + +from sllm.cli._cli_utils import read_config +from sllm.serve.logger import init_logger + +logger = init_logger(__name__) + + +class GenerateCommand: + @staticmethod + def register_subcommand(parser: _SubParsersAction): + generate_parser = parser.add_parser( + "generate", help="Generate using the deployed model." + ) + generate_parser.add_argument( + "input_path", type=str, help="Path to the JSON input file." + ) + generate_parser.add_argument( + "-t", + "--threads", + type=int, + default=1, + help="Number of parallel generation processes.", + ) + generate_parser.set_defaults(func=GenerateCommand) + + def __init__(self, args: Namespace) -> None: + self.input_path = args.input_path + self.threads = args.threads + self.endpoint = "/v1/chat/completions" # TODO: as a argument + self.url = ( + os.getenv("LLM_SERVER_URL", "http://127.0.0.1:8343") + self.endpoint + ) + + def run(self) -> None: + input_data = read_config(self.input_path) + if self.threads > 1: + with concurrent.futures.ThreadPoolExecutor( + max_workers=self.threads + ) as executor: + futures = [ + executor.submit(self.generate, input_data) + for _ in range(self.threads) + ] + results = [ + future.result() + for future in concurrent.futures.as_completed(futures) + ] + # Validate results + if not all(results): + logger.error("Some generations failed.") + else: + logger.info(f"All generations done. Results: {results}") + else: + result = self.generate(input_data) + logger.info(f"Generation result: {result}") + + def generate(self, input_data: dict) -> dict: + headers = {"Content-Type": "application/json"} + + # Send POST request to the /v1/chat/completions endpoint + response = requests.post(self.url, headers=headers, json=input_data) + + if response.status_code == 200: + logger.info("Generation successful.") + return response.json() + else: + logger.error( + f"Failed to generate. Status code: {response.status_code}" + ) + logger.error(f"Response: {response.text}") + return None diff --git a/sllm/cli/replay.py b/sllm/cli/replay.py new file mode 100644 index 0000000..25a0cdf --- /dev/null +++ b/sllm/cli/replay.py @@ -0,0 +1,149 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import asyncio +import json +import os +import time +from argparse import Namespace, _SubParsersAction + +from openai import AsyncOpenAI + +from sllm.cli._cli_utils import read_config +from sllm.serve.logger import init_logger + +logger = init_logger(__name__) + + +class ReplayCommand: + @staticmethod + def register_subcommand(parser: _SubParsersAction): + replay_parser = parser.add_parser( + "replay", help="Replay requests based on workload and dataset." + ) + replay_parser.add_argument( + "--workload", + type=str, + required=True, + help="Path to the JSON workload file.", + ) + replay_parser.add_argument( + "--dataset", + type=str, + required=True, + help="Path to the JSON dataset file.", + ) + replay_parser.add_argument( + "--output", + type=str, + default="latency_results.json", + help="Path to the output JSON file for latency results.", + ) + replay_parser.set_defaults(func=ReplayCommand) + + def __init__(self, args: Namespace) -> None: + self.workload_path = args.workload + self.dataset_path = args.dataset + self.output_path = args.output + self.url = os.getenv("LLM_SERVER_URL", "http://127.0.0.1:8343") + self.base_url = self.url + "/v1" + + self.client = AsyncOpenAI( + base_url=self.base_url, + api_key="API_KEY_PLACEHOLDER", # Placeholder for API key + ) + self.latency_results = [] + + async def run(self) -> None: + workload = read_config(self.workload_path) + dataset = read_config(self.dataset_path) + + input_texts = dataset.get("input_text", []) + output_lengths = dataset.get("output_length", []) + + if not input_texts or not output_lengths: + logger.error( + "Dataset is missing required fields: input_text and output_length" + ) + return + + tasks = [] + for model_name, times in workload.items(): + for i, time_offset in enumerate(times): + if i >= len(input_texts) or i >= len(output_lengths): + logger.error(f"Index {i} is out of bounds for the dataset") + break + input_text = input_texts[i] + output_length = output_lengths[i] + tasks.append( + self.schedule_request( + model_name, input_text, output_length, time_offset + ) + ) + + await asyncio.gather(*tasks) + self.write_latency_results() + + async def schedule_request( + self, + model_name: str, + input_text: str, + output_length: int, + time_offset: float, + ) -> None: + await asyncio.sleep(time_offset) + request_data = { + "model": model_name, + "messages": [{"role": "user", "content": input_text}], + "max_tokens": output_length, + } + await self.send_request(request_data) + + async def send_request(self, request_data: dict) -> None: + start_time = time.time() + try: + response = await self.client.chat.completions.create(**request_data) + end_time = time.time() + latency = end_time - start_time + logger.info( + f"Generation successful: {response.choices[0].message.content}" + ) + self.latency_results.append( + { + "model": request_data["model"], + "input_text": request_data["messages"][0]["content"], + "latency": latency, + } + ) + return response + except Exception as e: + end_time = time.time() + latency = end_time - start_time + logger.error(f"Failed to generate. Error: {str(e)}") + self.latency_results.append( + { + "model": request_data["model"], + "input_text": request_data["messages"][0]["content"], + "latency": latency, + "error": str(e), + } + ) + + def write_latency_results(self) -> None: + with open(self.output_path, "w") as f: + json.dump(self.latency_results, f, indent=4) + logger.info(f"Latency results written to {self.output_path}") diff --git a/sllm/cli/sllm_cli.py b/sllm/cli/sllm_cli.py new file mode 100644 index 0000000..d2f5800 --- /dev/null +++ b/sllm/cli/sllm_cli.py @@ -0,0 +1,66 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import argparse +import asyncio + +from sllm.cli.delete import DeleteCommand +from sllm.cli.deploy import DeployCommand +from sllm.cli.encode import EncodeCommand +from sllm.cli.fine_tuning import FineTuningCommand +from sllm.cli.generate import GenerateCommand +from sllm.cli.replay import ReplayCommand +from sllm.cli.status import StatusCommand +from sllm.cli.update import UpdateCommand +from sllm.serve.logger import init_logger + +logger = init_logger(__name__) + + +def main(): + parser = argparse.ArgumentParser( + "sllm-cli", usage="sllm-cli []" + ) + commands_parser = parser.add_subparsers(help="sllm-cli command helpers") + + # Register commands + DeployCommand.register_subcommand(commands_parser) + GenerateCommand.register_subcommand(commands_parser) + EncodeCommand.register_subcommand(commands_parser) + ReplayCommand.register_subcommand(commands_parser) + DeleteCommand.register_subcommand(commands_parser) + UpdateCommand.register_subcommand(commands_parser) + FineTuningCommand.register_subcommand(commands_parser) + StatusCommand.register_subcommand(commands_parser) + + # Let's go + args = parser.parse_args() + + if not hasattr(args, "func"): + parser.print_help() + exit(1) + + # Run + service = args.func(args) + if asyncio.iscoroutinefunction(service.run): + asyncio.run(service.run()) + else: + service.run() + + +if __name__ == "__main__": + main() diff --git a/sllm/cli/status.py b/sllm/cli/status.py new file mode 100644 index 0000000..3f3167f --- /dev/null +++ b/sllm/cli/status.py @@ -0,0 +1,72 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import os +from argparse import Namespace, _SubParsersAction + +import requests + +from sllm.cli._cli_utils import read_config +from sllm.serve.logger import init_logger + +logger = init_logger(__name__) + + +class StatusCommand: + @staticmethod + def register_subcommand(parser: _SubParsersAction): + status_parser = parser.add_parser( + "status", + help="Query the information of registered models.", + ) + status_parser.set_defaults(func=StatusCommand) + + def __init__(self, args: Namespace) -> None: + self.endpoint = "/v1/models" # TODO: as an argument + self.url = ( + os.getenv("LLM_SERVER_URL", "http://127.0.0.1:8343") + self.endpoint + ) + + def run(self) -> None: + status = self.query_status() + if status: + print(f"Model status: {status}") + else: + logger.error("Failed to fetch model status.") + + def query_status(self) -> dict: + headers = {"Content-Type": "application/json"} + try: + # Send GET request to the status endpoint + response = requests.get(self.url, headers=headers) + + if response.status_code == 200: + logger.info("Status query successful.") + try: + return response.json() + except ValueError: + logger.error("Invalid JSON response received.") + return None + else: + logger.error( + f"Failed to query status. Status code: {response.status_code}" + ) + logger.error(f"Response: {response.text}") + return None + except requests.exceptions.RequestException as e: + logger.error(f"Request failed:{str(e)}") + return None diff --git a/sllm/cli/update.py b/sllm/cli/update.py new file mode 100644 index 0000000..c6d64be --- /dev/null +++ b/sllm/cli/update.py @@ -0,0 +1,85 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import os +from argparse import Namespace, _SubParsersAction + +import requests + +from sllm.cli._cli_utils import read_config, validate_config +from sllm.serve.logger import init_logger + +logger = init_logger(__name__) + + +class UpdateCommand: + @staticmethod + def register_subcommand(parser: _SubParsersAction): + update_parser = parser.add_parser( + "update", help="Update a model using a config file or model name." + ) + update_parser.add_argument( + "--model", + type=str, + help="Model name to update with new configuration.", + ) + update_parser.add_argument( + "--config", type=str, help="Path to the JSON config file." + ) + update_parser.set_defaults(func=UpdateCommand) + + def __init__(self, args: Namespace) -> None: + self.model = args.model + self.config_path = args.config + self.url = ( + os.getenv("LLM_SERVER_URL", "http://127.0.0.1:8343") + "/update" + ) + self.default_config_path = os.path.join( + os.path.dirname(__file__), "default_config.json" + ) + + def run(self) -> None: + if self.config_path: + config_data = read_config(self.config_path) + validate_config(config_data) + self.update_model(config_data) + elif self.model: + config_data = read_config(self.default_config_path) + config_data["model"] = self.model + config_data["backend_config"]["pretrained_model_name_or_path"] = ( + self.model + ) + logger.info( + f"Updating model {self.model} with default configuration." + ) + self.update_model(config_data) + else: + logger.error("You must specify either --model or --config.") + exit(1) + + def update_model(self, config_data: dict) -> None: + headers = {"Content-Type": "application/json"} + + # Send POST request to the /update endpoint + response = requests.post(self.url, headers=headers, json=config_data) + + if response.status_code == 200: + logger.info("Model updated successfully.") + else: + logger.error( + f"Failed to update model. Status code: {response.status_code}. Response: {response.text}" + ) diff --git a/sllm/clic.py b/sllm/clic.py new file mode 100644 index 0000000..3ebe95a --- /dev/null +++ b/sllm/clic.py @@ -0,0 +1,142 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import click + +from sllm._cli_utils import ( + delete_model, + deploy_model, + show_status, + start_server, +) + + +@click.group() +def cli(): + """Unified CLI for ServerlessLLM.""" + pass + + +@cli.command() +@click.option( + "--model", + help="Model name from HuggingFace model hub (required if not specified in config file)", +) +@click.option("--config", help="Path to configuration file") +@click.option("--backend", help="Backend framework (e.g., vllm, transformers)") +@click.option( + "--num-gpus", type=int, help="Number of GPUs to use for the model" +) +@click.option("--target", type=int, help="Target number of requests per second") +@click.option( + "--min-instances", type=int, help="Minimum number of model instances" +) +@click.option( + "--max-instances", type=int, help="Maximum number of model instances" +) +@click.option( + "--lora-adapters", + help=( + 'List of LoRA adapters, e.g. "demo_lora1=... demo_lora2=..." or "demo_lora1=...,demo_lora2=...". ' + "Must be wrapped in quotes if using spaces or commas. Each adapter must be in = format." + ), +) +@click.option( + "--enable-lora", + is_flag=True, + default=False, + help="Enable LoRA support for the model", +) +@click.option( + "--precision", + help="Model precision for quantization (e.g., int8, fp4, nf4)", +) +def deploy( + model, + config, + backend, + num_gpus, + target, + min_instances, + max_instances, + lora_adapters, + enable_lora, + precision, +): + """Deploy a model using a config file or model name. + + Either --model or a config file with a model specified is required. + Command line options override values from the config file. + """ + # ...existing code... + adapters_dict = None + if lora_adapters: + adapters_dict = {} + # If it's a string, split by comma or space + if isinstance(lora_adapters, str): + items = lora_adapters.replace(",", " ").split() + elif isinstance(lora_adapters, (list, tuple)): + items = [] + for item in lora_adapters: + items.extend(item.replace(",", " ").split()) + else: + items = [str(lora_adapters)] + for module in items: + if "=" not in module: + click.echo( + f"[ERROR] Invalid LoRA module format: {module}. Expected =." + ) + continue + name, path = module.split("=", 1) + adapters_dict[name] = path + + deploy_model( + model=model, + config=config, + backend=backend, + num_gpus=num_gpus, + target=target, + min_instances=min_instances, + max_instances=max_instances, + lora_adapters=adapters_dict, + enable_lora=enable_lora, + precision=precision, + ) + + +@cli.command() +@click.argument("models", nargs=-1) +@click.option("--lora-adapters", help="LoRA adapters to delete.") +def delete(models, lora_adapters): + """Delete deployed models, or remove only the LoRA adapters.""" + delete_model(models, lora_adapters=lora_adapters if lora_adapters else None) + + +@cli.command() +def start(): + """Start the head node of the SLLM cluster.""" + start_server() + + +@cli.command() +def status(): + """Show all deployed models.""" + show_status() + + +if __name__ == "__main__": + cli() diff --git a/sllm/default_config.json b/sllm/default_config.json new file mode 100644 index 0000000..b2895aa --- /dev/null +++ b/sllm/default_config.json @@ -0,0 +1,18 @@ +{ + "model": "", + "backend": "vllm", + "num_gpus": 1, + "auto_scaling_config": { + "metric": "concurrency", + "target": 1, + "min_instances": 0, + "max_instances": 10, + "keep_alive": 0 + }, + "backend_config": { + "pretrained_model_name_or_path": "", + "device_map": "auto", + "torch_dtype": "float16", + "hf_model_class": "AutoModelForCausalLM" + } +} \ No newline at end of file diff --git a/sllm/serve/.DS_Store b/sllm/serve/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..1c1be8bc1f14b73205ffc6158783cbb3dad2a026 GIT binary patch literal 6148 zcmeHKF;2rU6#a%uRAuP~145D5SfC?YC_zZ9mbNUK@ z;+A#3vQCZlasX#GM{`?HYjr>!PzM$c@cs~>Foq6uLA!OJvR43L1Kl>z=1&UF2^@wF zb3u$CjHCi3)wnB$k#zJ2ju$%21tpz~yL=e8vT-*QV^_!gfu)lP1+`WO)Pb@CoATJ^ z^Z$JH{lA=~PwId=@UI*&ji?uO@k;J&t-KtcwE;>Wg@bvypiM#Lj$_;4qj(p^2F3zz W07HklAbJq`Az*FLN*(x92fhIOXO*!4 literal 0 HcmV?d00001 diff --git a/sllm/serve/__init__.py b/sllm/serve/__init__.py new file mode 100644 index 0000000..d925a19 --- /dev/null +++ b/sllm/serve/__init__.py @@ -0,0 +1,17 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # diff --git a/sllm/serve/app_lib.py b/sllm/serve/app_lib.py new file mode 100644 index 0000000..baaa4cb --- /dev/null +++ b/sllm/serve/app_lib.py @@ -0,0 +1,178 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +from contextlib import asynccontextmanager + +import ray +import ray.exceptions +from fastapi import FastAPI, HTTPException, Request + +from sllm.serve.logger import init_logger + +logger = init_logger(__name__) + + +def create_app() -> FastAPI: + @asynccontextmanager + async def lifespan(app: FastAPI): + # Connect to the Ray cluster + # ray.init() + yield + # Shutdown the Ray cluster + ray.shutdown() + + app = FastAPI(lifespan=lifespan) + + @app.get("/health") + async def health_check(): + return {"status": "ok"} + + @app.post("/register") + async def register_handler(request: Request): + body = await request.json() + + controller = ray.get_actor("controller") + if not controller: + raise HTTPException( + status_code=500, detail="Controller not initialized" + ) + try: + await controller.register.remote(body) + except Exception as e: + raise HTTPException( + status_code=500, + detail="Cannot register model, please contact the administrator", + ) + + return {"status": "ok"} + + @app.post("/update") + async def update_handler(request: Request): + body = await request.json() + model_name = body.get("model") + if not model_name: + raise HTTPException( + status_code=400, detail="Missing model_name in request body" + ) + + controller = ray.get_actor("controller") + if not controller: + raise HTTPException( + status_code=500, detail="Controller not initialized" + ) + + logger.info(f"Received request to update model {model_name}") + try: + await controller.update.remote(model_name, body) + except ray.exceptions.RayTaskError as e: + raise HTTPException(status_code=400, detail=str(e.cause)) + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) + + return {"status": f"updated model {model_name}"} + + @app.post("/delete") + async def delete_model(request: Request): + body = await request.json() + + model_name = body.get("model") + if not model_name: + raise HTTPException( + status_code=400, detail="Missing model_name in request body" + ) + lora_adapters = body.get("lora_adapters", None) + + controller = ray.get_actor("controller") + if not controller: + raise HTTPException( + status_code=500, detail="Controller not initialized" + ) + + if lora_adapters is not None: + logger.info( + f"Received request to delete LoRA adapters {lora_adapters} on model {model_name}" + ) + await controller.delete.remote(model_name, lora_adapters) + else: + logger.info(f"Received request to delete model {model_name}") + await controller.delete.remote(model_name) + + return {"status": f"deleted model {model_name}"} + + async def inference_handler(request: Request, action: str): + body = await request.json() + model_name = body.get("model") + logger.info(f"Received request for model {model_name}") + if not model_name: + raise HTTPException( + status_code=400, detail="Missing model_name in request body" + ) + + request_router = ray.get_actor(model_name, namespace="models") + logger.info(f"Got request router for {model_name}") + + result = request_router.inference.remote(body, action) + return await result + + async def fine_tuning_handler(request: Request): + body = await request.json() + model_name = body.get("model") + logger.info(f"Received request for model {model_name}") + if not model_name: + raise HTTPException( + status_code=400, detail="Missing model_name in request body" + ) + + request_router = ray.get_actor(model_name, namespace="models") + logger.info(f"Got request router for {model_name}") + + result = request_router.fine_tuning.remote(body) + return await result + + @app.post("/v1/chat/completions") + async def generate_handler(request: Request): + return await inference_handler(request, "generate") + + @app.post("/v1/embeddings") + async def embeddings_handler(request: Request): + return await inference_handler(request, "encode") + + @app.post("/fine-tuning") + async def fine_tuning(request: Request): + return await fine_tuning_handler(request) + + @app.get("/v1/models") + async def get_models(): + logger.info("Attempting to retrieve the controller actor") + try: + controller = ray.get_actor("controller") + if not controller: + logger.error("Controller not initialized") + raise HTTPException( + status_code=500, detail="Controller not initialized" + ) + logger.info("Controller actor found") + result = await controller.status.remote() + logger.info("Controller status retrieved successfully") + return result + except Exception as e: + logger.error(f"Error retrieving models: {str(e)}") + raise HTTPException( + status_code=500, detail="Failed to retrieve models" + ) + + return app diff --git a/sllm/serve/backends/__init__.py b/sllm/serve/backends/__init__.py new file mode 100644 index 0000000..91c243c --- /dev/null +++ b/sllm/serve/backends/__init__.py @@ -0,0 +1,22 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +from .dummy_backend import DummyBackend +from .transformers_backend import TransformersBackend +from .vllm_backend import VllmBackend + +__all__ = ["DummyBackend", "VllmBackend", "TransformersBackend"] diff --git a/sllm/serve/backends/backend_utils.py b/sllm/serve/backends/backend_utils.py new file mode 100644 index 0000000..1ce46c4 --- /dev/null +++ b/sllm/serve/backends/backend_utils.py @@ -0,0 +1,67 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +from abc import ABC, abstractmethod +from enum import Enum, auto +from typing import Any, Dict, List, Optional + + +class BackendStatus(Enum): + UNINITIALIZED = auto() + RUNNING = auto() + STOPPING = auto() + DELETING = auto() + + +class SllmBackend(ABC): + @abstractmethod + def __init__( + self, model_name: str, backend_config: Optional[Dict[str, Any]] = None + ) -> None: + pass + + @abstractmethod + async def init_backend(self) -> None: + pass + + @abstractmethod + async def encode(self, request_data: Dict[str, Any]): + pass + + @abstractmethod + async def generate(self, request_data: Dict[str, Any]): + pass + + @abstractmethod + async def shutdown(self): + pass + + @abstractmethod + async def stop(self): + pass + + @abstractmethod + async def get_current_tokens(self) -> List[List[int]]: + pass + + @abstractmethod + async def resume_kv_cache(self, request_datas: List[List[int]]) -> None: + pass + + @abstractmethod + async def fine_tuning(self, request_data: Dict[str, Any]): + pass diff --git a/sllm/serve/backends/dummy_backend.py b/sllm/serve/backends/dummy_backend.py new file mode 100644 index 0000000..4b9b3ff --- /dev/null +++ b/sllm/serve/backends/dummy_backend.py @@ -0,0 +1,116 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import asyncio +import time +import uuid +from typing import Any, Dict, Optional + +from sllm.serve.backends.backend_utils import SllmBackend +from sllm.serve.logger import init_logger + + +class DummyBackend(SllmBackend): + def __init__(self, backend_config: Optional[Dict[str, Any]] = None) -> None: + self.backend_config = backend_config + + def init_backend(self) -> None: + # sleep to simulate model latency + sleep_time = 5 + self.log( + f"Sleeping for {sleep_time} seconds to simulate model init time." + ) + time.sleep(sleep_time) + + def log(self, msg): + logger = init_logger(__name__) + logger.info(msg) + + async def generate(self, request_data): + model_name = request_data.get("model", "dummy-model") + messages = request_data.get("messages", []) + # temperature = request_data.get("temperature", 0.7) + max_tokens = request_data.get("max_tokens", 10) + token_latency = request_data.get("token_latency", 0.1) + + # Combine messages to form the prompt + prompt = "\n".join( + [ + f"{message['role']}: {message['content']}" + for message in messages + if "content" in message + ] + ) + + # Simulate model latency + self.log( + f"Sleeping for {max_tokens * token_latency} seconds to simulate model response time." + ) + for i in range(max_tokens): + await asyncio.sleep(token_latency) + + # Dummy response content + response_content = f"Debug model received prompt: {prompt}" + + # Simulate token counts for the response + prompt_tokens = len(prompt.split()) + completion_tokens = max_tokens + total_tokens = prompt_tokens + completion_tokens + + # Generate response compatible with OpenAI's API + response = { + "id": f"chatcmpl-{uuid.uuid4()}", + "object": "chat.completion", + "created": int(time.time()), + "model": model_name, + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": response_content, + }, + "logprobs": None, + "finish_reason": "stop", + } + ], + "usage": { + "prompt_tokens": prompt_tokens, + "completion_tokens": completion_tokens, + "total_tokens": total_tokens, + }, + } + + return response + + async def shutdown(self): + pass + + async def stop(self): + pass + + async def get_current_tokens(self): + self.log("Not implemented") + raise NotImplementedError + + async def resume_kv_cache(self, request_datas): + self.log("Not implemented") + raise NotImplementedError + + async def fine_tuning(self, request_data: Dict[str, Any]): + self.log("Not implemented") + raise NotImplementedError diff --git a/sllm/serve/backends/transformers_backend.py b/sllm/serve/backends/transformers_backend.py new file mode 100644 index 0000000..4e8d6c0 --- /dev/null +++ b/sllm/serve/backends/transformers_backend.py @@ -0,0 +1,633 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import json +import os +import threading +import time +import uuid +from copy import deepcopy +from typing import Any, Dict, List, Optional + +import peft +import torch +import torch.nn.functional as F +import transformers +from datasets import load_dataset +from peft import LoraConfig, PeftModel, get_peft_model +from transformers import ( + AutoModelForCausalLM, + AutoTokenizer, + PreTrainedTokenizerBase, + Trainer, + TrainingArguments, +) +from transformers.generation.streamers import BaseStreamer + +from sllm.serve.backends.backend_utils import BackendStatus, SllmBackend +from sllm.serve.logger import init_logger +from sllm_store.transformers import load_lora, load_model, save_lora + +logger = init_logger(__name__) + + +class DeletingException(Exception): + pass + + +class InferenceStatus(BaseStreamer): + def __init__(self, status: BackendStatus): + super().__init__() + self.status = status + self.intermediate = [] + + def put(self, value): + value = value.tolist() + if not self.intermediate: + self.intermediate = value + else: + # NOTE: This does not support in-flight batching + # or dynamic batch size + for i, v in enumerate(value): + self.intermediate[i].append(v) + logger.warning(f"Intermediate output: {self.intermediate}") + if self.status == BackendStatus.DELETING: + raise DeletingException("Backend is deleting") + + def end(self): + logger.error("Inference completed") + + def get(self): + return deepcopy(self.intermediate) + + def delete(self): + logger.info("Deleting intermediate output") + self.intermediate = [] + + +class TransformersBackend(SllmBackend): + def __init__( + self, model_name: str, backend_config: Optional[Dict[str, Any]] = None + ) -> None: + self.backend_config = backend_config + logger.info( + f"Initializing TransformersBackend for {model_name} with config: {backend_config}" + ) + self.model_name = model_name + self.pretrained_model_name_or_path = backend_config.get( + "pretrained_model_name_or_path" + ) + self.status: BackendStatus = BackendStatus.UNINITIALIZED + self.inf_status = InferenceStatus(self.status) + self.status_lock = threading.Lock() + self.model = None + self.tokenizer = None + self.past_key_values = None + + def convert_str_to_json(self, json_str): + try: + # Parse the JSON string and return the corresponding Python object + json_obj = json.loads(json_str) + return json_obj + except json.JSONDecodeError as e: + logger.error(f"Failed to decode JSON string: {e}") + return None + + def init_backend(self) -> None: + with self.status_lock: + if self.status != BackendStatus.UNINITIALIZED: + return + device_map = self.backend_config.get("device_map", "auto") + torch_dtype = self.backend_config.get("torch_dtype", torch.float16) + torch_dtype = getattr(torch, torch_dtype) + hf_model_class = self.backend_config.get("hf_model_class", None) + if torch_dtype is None: + logger.warning( + f"Invalid torch_dtype: {torch_dtype}. Using torch.float16" + ) + torch_dtype = torch.float16 + if hf_model_class is None: + logger.error( + f"hf_model_class cannot be None. Please provide a valid model class" + ) + raise ValueError( + "hf_model_class cannot be None. Please provide a valid model class" + ) + quantization_config = self.backend_config.get( + "quantization_config", None + ) + + storage_path = os.getenv("STORAGE_PATH", "./models") + model_path = os.path.join("transformers", self.model_name) + self.model = load_model( + model_path, + device_map=device_map, + torch_dtype=torch_dtype, + storage_path=storage_path, + hf_model_class=hf_model_class, + quantization_config=quantization_config, + ) + tokenizer_path = os.path.join( + storage_path, "transformers", self.model_name, "tokenizer" + ) + if os.path.exists(tokenizer_path): + self.tokenizer = AutoTokenizer.from_pretrained(tokenizer_path) + else: + # Fall back to load from system's cache + self.tokenizer = AutoTokenizer.from_pretrained( + self.pretrained_model_name_or_path + ) + self.status = BackendStatus.RUNNING + + def _tokenize(self, prompt: str): + return self.tokenizer(prompt, return_tensors="pt").to("cuda:0") + + def _encoder_tokenize(self, query: str, max_length: int): + return self.tokenizer( + query, + max_length=max_length, + padding=True, + truncation=True, + return_tensors="pt", + ).to("cuda:0") + + def encode(self, request_data: Optional[Dict[str, Any]]): + with self.status_lock: + if self.status != BackendStatus.RUNNING: + return {"error": "Model not initialized"} + + def last_token_pool( + last_hidden_states: torch.Tensor, attention_mask: torch.Tensor + ) -> torch.Tensor: + left_padding = ( + attention_mask[:, -1].sum() == attention_mask.shape[0] + ) + if left_padding: + return last_hidden_states[:, -1] + else: + sequence_lengths = attention_mask.sum(dim=1) - 1 + batch_size = last_hidden_states.shape[0] + return last_hidden_states[ + torch.arange(batch_size, device=last_hidden_states.device), + sequence_lengths, + ] + + def get_detailed_instruct(task_description: str, query: str) -> str: + return f"Instruct: {task_description}\nQuery: {query}" + + model_name = request_data.get("model", "dummy-model") + task_instruct = request_data.get("task_instruct", "") + max_length = request_data.get("max_length", 4096) + query = request_data.get("input", []) + + if not query: + return {"error": "Missing query in request data"} + + query = [get_detailed_instruct(task_instruct, q) for q in query] + + batch_dict = self._encoder_tokenize(query, max_length) + with torch.no_grad(): + output = self.model(**batch_dict, output_hidden_states=True) + embeddings = last_token_pool( + output.hidden_states[-1], batch_dict["attention_mask"] + ) + + embeddings = F.normalize(embeddings, p=2, dim=1) + + query_tokens = sum([len(self.tokenizer.tokenize(q)) for q in query]) + response = { + "object": "list", + "data": [ + { + "object": "embedding", + "index": i, + "embedding": embeddings[i].tolist(), + } + for i in range(len(embeddings)) + ], + "model": model_name, + "usage": { + "query_tokens": query_tokens, + "total_tokens": query_tokens, + }, + } + + return response + + def generate(self, request_data: Optional[Dict[str, Any]]): + with self.status_lock: + if self.status != BackendStatus.RUNNING: + return {"error": "Model not initialized"} + + assert self.model is not None + + model_name = request_data.get("model", "dummy-model") + messages = request_data.get("messages", []) + temperature = request_data.get("temperature", 0.7) + max_tokens = request_data.get("max_tokens", 10) + lora_adapter_name = request_data.get("lora_adapter_name", None) + + # Combine messages to form the prompt + try: + prompt = self.tokenizer.apply_chat_template( + messages, add_generation_prompt=True, tokenize=False + ) + except Exception as e: + prompt = "\n".join( + f"{message['role'].capitalize()}: {message['content']}" + for message in messages + ) + + if not prompt: + return {"error": "Missing prompt in request data"} + + generate_kwargs = { + "max_new_tokens": max_tokens, + "temperature": temperature, + "streamer": self.inf_status, + } + + if lora_adapter_name: + if ( + not hasattr(self.model, "peft_config") + or lora_adapter_name not in self.model.peft_config + ): + return {"error": f"LoRA adapter {lora_adapter_name} not found"} + generate_kwargs["adapter_names"] = [lora_adapter_name] + + inputs = self._tokenize(prompt) + prompt_tokens = inputs.input_ids.shape[1] + + # Generate response + try: + with torch.no_grad(): + outputs = self.model.generate( + **inputs, + **generate_kwargs, + ) + except DeletingException: + logger.info("Backend is shutting down. Aborting request") + output_tokens = self.inf_status.get() + self.inf_status.delete() + return { + "preempted": "True", + "current_output": output_tokens, + "completed_tokens": len(output_tokens[0]) - prompt_tokens, + } + except Exception as e: + logger.error(f"Failed to generate response: {e}") + raise e + else: + output_text = self.tokenizer.decode( + outputs[0][prompt_tokens:], skip_special_tokens=True + ) + total_tokens = len(outputs[0]) + completion_tokens = total_tokens - prompt_tokens + # FIXME: consider corner case when max_tokens is reached + finish_reason = ( + "stop" if completion_tokens < max_tokens else "length" + ) + + # Generate response compatible with OpenAI's API + response = { + "id": f"chatcmpl-{uuid.uuid4()}", + "object": "chat.completion", + "created": int(time.time()), + "model": model_name, + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": output_text, + }, + "logprobs": None, + "finish_reason": finish_reason, + } + ], + "usage": { + "prompt_tokens": prompt_tokens, + "completion_tokens": completion_tokens, + "total_tokens": total_tokens, + }, + } + + self.inf_status.delete() + + return response + + def _load_dataset( + self, + dataset_config: Optional[Dict[str, Any]], + tokenizer: PreTrainedTokenizerBase, + ): + dataset_source = dataset_config.get("dataset_source") + hf_dataset_name = dataset_config.get("hf_dataset_name") + tokenization_field = dataset_config.get("tokenization_field") + split = dataset_config.get("split", None) + data_files = dataset_config.get("data_files", None) + extension_type = dataset_config.get("extension_type") + + if dataset_source not in {"hf_hub", "local"}: + logger.error( + "Invalid 'dataset_source'. Must be 'hf_hub' or 'local'." + ) + raise ValueError( + "Invalid 'dataset_source'. Must be 'hf_hub' or 'local'." + ) + + if dataset_source == "hf_hub": + if not hf_dataset_name: + logger.error( + "hf_dataset_name must be provided in the dataset configuration." + ) + raise ValueError( + "hf_dataset_name must be provided in the dataset configuration." + ) + data = load_dataset(hf_dataset_name, split=split) + data = data.map( + lambda samples: tokenizer(samples[tokenization_field]), + batched=True, + ) + return data + elif dataset_source == "local": + if not extension_type: + logger.error( + "extension_type must be provided in the dataset configuration." + ) + raise ValueError( + "extension_type must be provided in the dataset configuration." + ) + if not data_files: + logger.error( + "data_files must be provided in the dataset configuration." + ) + raise ValueError( + "data_files must be provided in the dataset configuration." + ) + data = load_dataset( + extension_type, data_files=data_files, split=split + ) + data = data.map( + lambda samples: tokenizer(samples[tokenization_field]), + batched=True, + ) + return data + + def fine_tuning(self, request_data: Optional[Dict[str, Any]]): + with self.status_lock: + if self.status != BackendStatus.RUNNING: + return {"error": "Model not initialized"} + + tokenizer = AutoTokenizer.from_pretrained(self.model_name) + if tokenizer.pad_token is None: + if tokenizer.eos_token: + tokenizer.add_special_tokens({"pad_token": tokenizer.eos_token}) + else: + logger.warning( + "pad_token is not set and eos_token is not available; training may fail." + ) + dataset_config = request_data.get("dataset_config") + try: + dataset = self._load_dataset(dataset_config, tokenizer) + except ValueError as e: + logger.error(f"Failed to load dataset: {e}") + return {"error": str(e)} + + lora_config = request_data.get("lora_config") + try: + lora_config = LoraConfig(**lora_config) + except TypeError as e: + logger.error(f"Failed to load lora_config: {e}") + raise e + peft_model = get_peft_model(self.model, lora_config) + + training_config = request_data.get("training_config") + storage_path = os.getenv("STORAGE_PATH", "./models") + output_dir = request_data.get( + "output_dir", f"ft_{self.model_name}_adapter" + ) + lora_save_path = os.path.join( + storage_path, + "transformers", + output_dir, + ) + try: + training_args = TrainingArguments( + output_dir=lora_save_path, **training_config + ) + except TypeError as e: + logger.error(f"Failed to load training_config: {e}") + raise e + trainer = Trainer( + model=peft_model, + args=training_args, + train_dataset=dataset, + data_collator=transformers.DataCollatorForLanguageModeling( + tokenizer, mlm=False + ), + ) + trainer.train() + + save_lora(peft_model, lora_save_path) + logger.info( + f"Fine-tuning completed. LoRA adapter and config saved to {lora_save_path}" + ) + + response = { + "model": self.model_name, + "lora_save_path": lora_save_path, + } + + return response + + def load_lora_adapter(self, lora_name: str, lora_path: str): + with self.status_lock: + if self.status != BackendStatus.RUNNING: + return {"error": "Model not initialized"} + + if ( + hasattr(self.model, "peft_config") + and lora_name in self.model.peft_config + ): + logger.info(f"LoRA adapter {lora_name} already loaded") + return + + lora_path = os.path.join("transformers", lora_path) + storage_path = os.getenv("STORAGE_PATH", "./models") + device_map = self.backend_config.get("device_map", "auto") + torch_dtype = self.backend_config.get("torch_dtype", torch.float16) + torch_dtype = getattr(torch, torch_dtype) + if torch_dtype is None: + logger.warning( + f"Invalid torch_dtype: {torch_dtype}. Using torch.float16" + ) + torch_dtype = torch.float16 + self.model = load_lora( + self.model, + lora_name, + lora_path, + device_map=device_map, + storage_path=storage_path, + torch_dtype=torch_dtype, + ) + logger.info(f"Loaded LoRA adapter {lora_name} from {lora_path}") + + def shutdown(self): + """Abort all requests and shutdown the backend.""" + with self.status_lock: + if self.status == BackendStatus.DELETING: + return + self.status = BackendStatus.DELETING + if self.inf_status: + self.inf_status.status = BackendStatus.DELETING + + while self.inf_status and len(self.inf_status.get()) > 0: + logger.info("Waiting for all requests to finish") + time.sleep(1) + + if self.model is not None: + del self.model + + def stop(self) -> None: + """Wait for all requests to finish and shutdown the backend.""" + with self.status_lock: + if self.status.value >= BackendStatus.STOPPING.value: + return + self.status = BackendStatus.STOPPING + while self.inf_status and len(self.inf_status.get()) > 0: + logger.info("Waiting for all requests to finish") + time.sleep(1) + logger.info("All requests finished. Shutting down the backend.") + self.shutdown() + + def get_current_tokens(self) -> List[List[int]]: + """Return a list of all ongoing request tokens.""" + with self.status_lock: + if self.status != BackendStatus.RUNNING: + return [] + + status = self.inf_status.get() + logger.info(f"Current tokens: {status}") + return status + + def resume_kv_cache(self, request_datas): + logger.info(f"Resuming cache for {request_datas}") + with torch.no_grad(): + device = self.model.device + input_ids = torch.tensor(request_datas).to(device) + logger.info(input_ids) + output = self.model.generate( + input_ids, + past_key_values=self.past_key_values, + max_new_tokens=1, + return_dict_in_generate=True, + return_legacy_cache=True, + ) + self.past_key_values = output.past_key_values + self.current_tokens = output.sequences + logger.info(f"Resumed {len(self.past_key_values[0][0][0][0])} tokens") + + def resume_generate( + self, request_data: Optional[Dict[str, Any]], current_output + ): + with self.status_lock: + if self.status != BackendStatus.RUNNING: + return {"error": "Model not initialized"} + + assert self.model is not None + + model_name = request_data.get("model", "dummy-model") + messages = request_data.get("messages", []) + temperature = request_data.get("temperature", 0.7) + max_tokens = request_data.get("max_tokens", 10) + + # Combine messages to form the prompt + try: + prompt = self.tokenizer.apply_chat_template( + messages, add_generation_prompt=True, tokenize=False + ) + except Exception as e: + prompt = "\n".join( + f"{message['role'].capitalize()}: {message['content']}" + for message in messages + ) + + if not prompt: + return {"error": "Missing prompt in request data"} + + inputs = self._tokenize(prompt) + prompt_tokens = inputs.input_ids.shape[1] + + # Generate response + try: + with torch.no_grad(): + device = self.model.device + current_output = torch.tensor(current_output).to(device) + if len(current_output[0]) < len(self.current_tokens[0]): + current_output = self.current_tokens + outputs = self.model.generate( + current_output, + past_key_values=self.past_key_values, + max_new_tokens=max_tokens, + temperature=temperature, + streamer=self.inf_status, + ) + except DeletingException: + logger.error("Backend is shutting down. Aborting request") + raise DeletingException("Backend is shutting down") + except Exception as e: + logger.error(f"Failed to generate response: {e}") + raise e + else: + output_text = self.tokenizer.decode( + outputs[0][prompt_tokens:], skip_special_tokens=True + ) + total_tokens = len(outputs[0]) + completion_tokens = total_tokens - prompt_tokens + # FIXME: consider corner case when max_tokens is reached + finish_reason = ( + "stop" if completion_tokens < max_tokens else "length" + ) + + # Generate response compatible with OpenAI's API + response = { + "id": f"chatcmpl-{uuid.uuid4()}", + "object": "chat.completion", + "created": int(time.time()), + "model": model_name, + "choices": [ + { + "index": 0, + "message": { + "role": "assistant", + "content": output_text, + }, + "logprobs": None, + "finish_reason": finish_reason, + } + ], + "usage": { + "prompt_tokens": prompt_tokens, + "completion_tokens": completion_tokens, + "total_tokens": total_tokens, + }, + } + + self.inf_status.delete() + + return response diff --git a/sllm/serve/backends/vllm_backend.py b/sllm/serve/backends/vllm_backend.py new file mode 100644 index 0000000..df304d8 --- /dev/null +++ b/sllm/serve/backends/vllm_backend.py @@ -0,0 +1,367 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import asyncio +import gc +import inspect +import logging +import os +import time +import uuid +from dataclasses import fields +from typing import Any, Dict, List, Optional, Sequence, Union, cast + +import torch +from vllm import ( + AsyncEngineArgs, + AsyncLLMEngine, + EmbeddingRequestOutput, + PoolingParams, + PromptType, + RequestOutput, + SamplingParams, +) +from vllm.inputs import TokensPrompt +from vllm.utils import Counter + +from sllm.serve.backends.backend_utils import ( + BackendStatus, + SllmBackend, +) + +logger = logging.getLogger("ray") + + +def process_output(output: RequestOutput, model_name: str) -> Dict[str, Any]: + choices: List[Dict[str, Any]] = [ + { + "index": idx, + "message": { + "role": "assistant", + "content": result.text, + }, + "logprobs": result.logprobs, + "finish_reason": result.finish_reason, + } + for idx, result in enumerate(output.outputs) + ] + + api_response = { + "id": output.request_id, + "object": "chat.completion", + "created": ( + int(time.time()) + if output.metrics is None + else output.metrics.arrival_time + ), + "model": model_name, + "choices": choices, + "usage": { + "prompt_tokens": len(output.prompt_token_ids), + "completion_tokens": sum( + len(result.token_ids) for result in output.outputs + ), + "total_tokens": len(output.prompt_token_ids) + + sum(len(result.token_ids) for result in output.outputs), + }, + } + return api_response + + +def process_embedding_output( + outputs: List[EmbeddingRequestOutput], model_name: str +) -> Dict[str, Any]: + valid_outputs = [output for output in outputs if output is not None] + query_tokens = sum(len(output.prompt_token_ids) for output in valid_outputs) + api_response = { + "object": "list", + "data": [ + { + "object": "embedding", + "index": i, + "embedding": output.outputs.embedding, + } + for i, output in enumerate(outputs) + ], + "model": model_name, + "usage": { + "query_tokens": query_tokens, + "total_tokens": query_tokens, + }, + } + return api_response + + +class LLMEngineStatusDict: + def __init__(self): + self.status_dict: Dict[str, Union[RequestOutput, str]] = {} + self.lock = asyncio.Lock() + + async def update_status( + self, request_id: str, request_output: Union[RequestOutput, str] + ): + async with self.lock: + self.status_dict[request_id] = request_output + + async def delete_request(self, request_id: str): + async with self.lock: + del self.status_dict[request_id] + + async def return_all_results(self) -> List[Union[RequestOutput, str]]: + async with self.lock: + return list(self.status_dict.values()) + + async def return_all_request_ids(self) -> List[str]: + async with self.lock: + return list(self.status_dict.keys()) + + async def request_count(self) -> int: + async with self.lock: + return len(self.status_dict) + + +# Note the GPU resource will be decided when the backend is created +class VllmBackend(SllmBackend): + # This class implements every method in vllm.entrypoints.openai.api_server + # https://github.com/vllm-project/vllm/blob/main/vllm/entrypoints/openai/api_server.py + # except that we use ray.remote instead of @app and we also add a few new methods: + # - stop: stops every ongoing request and then stops the backend + # - get_current_tokens: returns a list of all ongoing request tokens + # - resume_kv_cache: resumes the key-value cache for the given requests + def __init__( + self, model: str, backend_config: Optional[Dict[str, Any]] = None + ) -> None: + if backend_config is None: + raise ValueError("Backend config is missing") + + self.status: BackendStatus = BackendStatus.UNINITIALIZED + self.status_lock = asyncio.Lock() + self.backend_config = backend_config + self.request_trace = LLMEngineStatusDict() + # if trace_debug is True, request trace will not be deleted after completion + self.trace_debug = backend_config.get("trace_debug", False) + self.enforce_eager = backend_config.get("enforce_eager", False) + self.enable_prefix_caching = backend_config.get( + "enable_prefix_caching", True + ) + self.task = backend_config.get("task", "auto") + + async_engine_fields = {f.name for f in fields(AsyncEngineArgs)} + filtered_engine_config = { + k: v for k, v in backend_config.items() if k in async_engine_fields + } + + load_format = backend_config.get("load_format") + torch_dtype = backend_config.get("torch_dtype") + if torch_dtype is not None: + filtered_engine_config["dtype"] = torch_dtype + + if load_format is not None: + filtered_engine_config["load_format"] = load_format + filtered_engine_config["model"] = backend_config.get( + "pretrained_model_name_or_path" + ) + else: + storage_path = os.getenv("STORAGE_PATH", "./models") + model_path = os.path.join(storage_path, "vllm", model) + filtered_engine_config["model"] = model_path + filtered_engine_config["load_format"] = "serverless_llm" + + # NOTE: Automatic enable prefix cachinging + filtered_engine_config["enforce_eager"] = self.enforce_eager + filtered_engine_config["enable_prefix_caching"] = ( + self.enable_prefix_caching + ) + filtered_engine_config["task"] = self.task + + logger.info( + f"Creating new VLLM engine with config: {filtered_engine_config}" + ) + + self.engine_args = AsyncEngineArgs(**filtered_engine_config) + + self.engine = None + + async def init_backend(self) -> None: + async with self.status_lock: + if self.status != BackendStatus.UNINITIALIZED: + return + self.engine = AsyncLLMEngine.from_engine_args(self.engine_args) + self.status = BackendStatus.RUNNING + + async def generate(self, request_data: Dict[str, Any]): + async with self.status_lock: + if self.status != BackendStatus.RUNNING: + return {"error": "Engine is not running"} + + assert self.engine is not None + + if request_data is None: + return {"error": "Request data is missing"} + + model_name: str = request_data.pop("model", "vllm-model") + messages: Dict[Dict[str, str], str] = request_data.pop("messages", []) + construct_prompt: str = "\n".join( + [ + f"{message['role']}: {message['content']}" + for message in messages + if "content" in message + ] + ) + + # If prompt is not provided, construct it from messages + inputs: Union[str, TokensPrompt] = request_data.pop( + "prompt", construct_prompt + ) + if request_data.get("input_tokens") is not None: + inputs = TokensPrompt( + prompt_token_ids=request_data.pop("input_tokens"), + ) + + request_id: str = request_data.pop( + "request_id", f"chatcmpl-{uuid.uuid4()}" + ) + + try: + sampling_params = SamplingParams(**request_data) + except Exception as e: + return {"error": f"Invalid sampling parameters: {e}"} + + results_generator = self.engine.generate( + inputs, sampling_params, request_id + ) + + # TODO stream results + + # Non-stream case + final_output = None + async for response_output in results_generator: + final_output = response_output + await self.request_trace.update_status(request_id, response_output) + + assert final_output is not None + + if not self.trace_debug: + await self.request_trace.delete_request(request_id) + + return process_output(final_output, model_name) + + async def shutdown(self): + """Abort all requests and shutdown the backend.""" + async with self.status_lock: + if self.status == BackendStatus.DELETING: + return + self.status = BackendStatus.DELETING + + # Abort all requests + requests = await self.request_trace.return_all_request_ids() + tasks = [self.engine.abort(request_id) for request_id in requests] + await asyncio.gather(*tasks) + if hasattr(self, "engine"): + del self.engine + gc.collect() + if torch.cuda.is_available(): + torch.cuda.empty_cache() + torch.cuda.synchronize() + + async def stop(self) -> None: + """Wait for all requests to finish and shutdown the backend.""" + async with self.status_lock: + if self.status.value >= BackendStatus.STOPPING.value: + return + self.status = BackendStatus.STOPPING + while await self.request_trace.request_count() > 0: + logger.info("Waiting for all requests to finish") + await asyncio.sleep(1) + logger.info("All requests finished. Shutting down the backend.") + await self.shutdown() + + async def get_current_tokens(self) -> List[List[int]]: + """Return a list of all ongoing request tokens.""" + async with self.status_lock: + if self.status != BackendStatus.RUNNING: + return [] + results = await self.request_trace.return_all_results() + ongoing_results: List[RequestOutput] = [ + result for result in results if isinstance(result, RequestOutput) + ] + tokens: List[List[int]] = [ + result.prompt_token_ids + result.outputs[0].token_ids + for result in ongoing_results + ] + return tokens + + async def resume_kv_cache(self, request_datas: List[List[int]]) -> None: + async with self.status_lock: + if self.status != BackendStatus.RUNNING: + return + constructed_inputs = [ + { + "input_tokens": request_data, + "max_tokens": 1, + } + for request_data in request_datas + ] + tasks = [self.generate(inputs) for inputs in constructed_inputs] + await asyncio.gather(*tasks) + + async def encode(self, request_data: Dict[str, Any]): + async with self.status_lock: + if self.status != BackendStatus.RUNNING: + return {"error": "Engine is not running"} + + assert self.engine is not None + + if not request_data: + return {"error": "Request data is missing"} + + request_counter: Counter = Counter() + pooling_params: PoolingParams = PoolingParams() + model_name = request_data.get("model", "vllm-model") + query = request_data.get("input", []) + + if not query: + return {"error": "No inputs provided"} + + inputs = cast(Union[PromptType, Sequence[PromptType]], query) + + async def process_input(input_data) -> List[EmbeddingRequestOutput]: + request_id = str(next(request_counter)) + res = self.engine.encode(input_data, pooling_params, request_id) + return [result async for result in res] + + raw_outputs = await asyncio.gather( + *[process_input(input_data) for input_data in inputs], + return_exceptions=True, + ) + + valid_outputs = [] + for output in raw_outputs: + if isinstance(output, Exception): + logger.error(f"Error encountered: {output}") + else: + valid_outputs.extend(output) + + if not valid_outputs: + return {"error": "All inputs failed"} + + return process_embedding_output(valid_outputs, model_name) + + async def fine_tuning(self, request_data: Dict[str, Any]): + raise NotImplementedError( + "Fine-tuning is not supported in this backend" + ) diff --git a/sllm/serve/commands/__init__.py b/sllm/serve/commands/__init__.py new file mode 100644 index 0000000..d925a19 --- /dev/null +++ b/sllm/serve/commands/__init__.py @@ -0,0 +1,17 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # diff --git a/sllm/serve/commands/serve/__init__.py b/sllm/serve/commands/serve/__init__.py new file mode 100644 index 0000000..d925a19 --- /dev/null +++ b/sllm/serve/commands/serve/__init__.py @@ -0,0 +1,17 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # diff --git a/sllm/serve/commands/serve/sllm_serve.py b/sllm/serve/commands/serve/sllm_serve.py new file mode 100644 index 0000000..306ea93 --- /dev/null +++ b/sllm/serve/commands/serve/sllm_serve.py @@ -0,0 +1,84 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import argparse +import json +import re +import sys + +import ray +import uvicorn + +from sllm.serve.app_lib import create_app +from sllm.serve.controller import SllmController +from sllm.serve.logger import init_logger + +logger = init_logger(__name__) + + +def main(): + parser = argparse.ArgumentParser( + description="ServerlessLLM CLI for model management." + ) + subparsers = parser.add_subparsers(dest="command") + + start_parser = subparsers.add_parser("start", help="Start the Sllm server.") + start_parser.add_argument( + "--host", + default="0.0.0.0", + type=str, + help="Host IP to run the server on.", + ) + start_parser.add_argument( + "--port", default=8343, type=int, help="Port to run the server on." + ) + start_parser.add_argument( + "--enable-storage-aware", + action="store_true", + help="Enable storage-aware scheduling.", + ) + start_parser.add_argument( + "--enable-migration", + action="store_true", + help="Enable live migration of model instances.", + ) + args = parser.parse_args() + + try: + if args.command == "start": + app = create_app() + controller_cls = ray.remote(SllmController) + controller = controller_cls.options( + name="controller", num_cpus=1, resources={"control_node": 0.1} + ).remote( + { + "enable_storage_aware": args.enable_storage_aware, + "enable_migration": args.enable_migration, + } + ) + ray.get(controller.start.remote()) + + uvicorn.run(app, host=args.host, port=args.port) + else: + parser.print_help() + sys.exit(1) + except KeyboardInterrupt: + ray.get(controller.shutdown.remote()) + + +if __name__ == "__main__": + main() diff --git a/sllm/serve/controller.py b/sllm/serve/controller.py new file mode 100644 index 0000000..b2fd3f0 --- /dev/null +++ b/sllm/serve/controller.py @@ -0,0 +1,326 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import asyncio +import datetime +import os +from typing import List, Mapping, Optional + +import ray + +from sllm.serve.logger import init_logger +from sllm.serve.routers import MigrationRouter, RoundRobinRouter +from sllm.serve.schedulers import FcfsScheduler, StorageAwareScheduler +from sllm.serve.store_manager import StoreManager + + +class SllmControllerException(Exception): + def __init__(self, message, method): + real_message = f"[{method}]: {message}" + super().__init__(real_message) + + +logger = init_logger(__name__) + + +class SllmController: + def __init__(self, config: Optional[Mapping] = None): + self.config = config + + self.running_lock = asyncio.Lock() + self.running = False + + self.metadata_lock = asyncio.Lock() + self.request_routers = {} + # Register model info + self.registered_models = {} + + async def start(self): + async with self.running_lock: + if self.running: + logger.error("Controller already started") + raise RuntimeError("Controller already started") + self.running = True + + logger.info("Starting store manager") + enable_storage_aware = self.config.get("enable_storage_aware", False) + ray_manager_cls = ray.remote(StoreManager) + self.store_manager = ray_manager_cls.options( + name="store_manager", + resources={"control_node": 0.1}, + ).remote() + await self.store_manager.initialize_cluster.remote() + + logger.info("Starting scheduler") + if enable_storage_aware: + ray_scheduler_cls = ray.remote(StorageAwareScheduler) + else: + ray_scheduler_cls = ray.remote(FcfsScheduler) + + enable_migration = self.config.get("enable_migration", False) + if enable_migration: + self.router_cls = ray.remote(MigrationRouter) + else: + self.router_cls = ray.remote(RoundRobinRouter) + + self.scheduler = ray_scheduler_cls.options( + name="model_loading_scheduler", resources={"control_node": 0.1} + ).remote( + scheduler_config={ + "enable_migration": enable_migration, + } + ) + self.scheduler.start.remote() + + async def register(self, model_config): + if not self.running: + logger.error("Controller not running") + return + model_name = model_config.get("model") + backend = model_config.get("backend", None) + if backend is None: + logger.error(f"Backend not specified for model {model_name}") + return + backend_config = model_config.get("backend_config", {}) + router_config = model_config.get("router_config", {}) + auto_scaling_config = model_config.get("auto_scaling_config", None) + enable_lora = backend_config.get("enable_lora", False) + lora_adapters = backend_config.get("lora_adapters", {}) + async with self.metadata_lock: + if model_name in self.registered_models: + logger.info(f"Model {model_name} already registered") + if lora_adapters is not None: + for ( + lora_adapter_name, + lora_adapter_path, + ) in lora_adapters.items(): + await self.store_manager.register_lora_adapter.remote( + model_name, + lora_adapter_name, + lora_adapter_path, + backend_config, + ) + request_router = self.request_routers[model_name] + await request_router.update.remote( + lora_adapters=lora_adapters + ) + return + + logger.info(f"Registering new model {model_name}") + try: + await self.store_manager.register.remote(model_config) + for lora_adapter_name, lora_adapter_path in lora_adapters.items(): + await self.store_manager.register_lora_adapter.remote( + model_name, + lora_adapter_name, + lora_adapter_path, + backend_config, + ) + except RuntimeError as e: + error_message = e.args[0] + raise RuntimeError(f"{error_message}") + # TODO: put resource requirements in model_config + resource_requirements = { + "num_cpus": 1, + "num_gpus": model_config.get("num_gpus", 0), + } + request_router = self.router_cls.options( + name=model_name, + namespace="models", + num_cpus=1, + resources={"control_node": 0.1}, + ).remote( + model_name, + resource_requirements, + backend, + backend_config, + router_config, + enable_lora, + lora_adapters, + ) + + async with self.metadata_lock: + if model_name in self.request_routers: + logger.error(f"Model {model_name} already registered") + return + + request_router.start.remote(auto_scaling_config) + + logger.info(f"Model {model_name} registered") + + # Mark model as registered only after model registered successfully + async with self.metadata_lock: + self.registered_models[model_name] = model_config + self.request_routers[model_name] = request_router + + async def update(self, model_name: str, model_config: Mapping): + async with self.metadata_lock: + if ( + model_name not in self.registered_models + or model_name not in self.request_routers + ): + logger.error(f"Model {model_name} not found") + raise ValueError( + f"Model {model_name} not found, please register first" + ) + + # update auto-scaling config + auto_scaling_config = model_config.get("auto_scaling_config", None) + logger.info(f"Try to update the model {model_name} config") + if auto_scaling_config is not None: + async with self.metadata_lock: + self.registered_models[model_name]["auto_scaling_config"] = ( + auto_scaling_config + ) + request_router = self.request_routers[model_name] + await request_router.update.remote(auto_scaling_config) + # TODO: update other config (if possible) + + async def exists(self, model_name: str): + async with self.metadata_lock: + return model_name in self.registered_models + + async def delete( + self, model_name: str, lora_adapters: Optional[List[str]] = None + ): + router = None + async with self.metadata_lock: + if model_name not in self.request_routers: + logger.error(f"Model {model_name} not found") + return + if lora_adapters is not None: + await self.request_routers[model_name].delete_adapters.remote( + lora_adapters + ) + return + router = self.request_routers.pop(model_name) + self.registered_models.pop(model_name) + + # if router is not None: + # deleted_instance_id = await router.shutdown.remote() + del router + + async def get_models(self): + async with self.metadata_lock: + return self.registered_models + + async def status(self): + """ + Returns the status of all registered models in OpenAI-compliant format. + """ + async with self.metadata_lock: + models = [] + model_folder = os.getenv("MODEL_FOLDER") + for model_name, config in self.registered_models.items(): + # Extract or calculate relevant fields + model_path = config.get("_name_or_path", None) + created_time = ( + next( + ( + int(os.path.getctime(os.path.abspath(dirpath))) + for dirpath, _, _ in os.walk(model_folder) + if dirpath.endswith(model_path) + ), + None, + ) + if model_path + else None + ) + + created_time = config.get("created", None) + allow_create_engine = config.get("allow_create_engine", None) + allow_sampling = config.get("allow_sampling", None) + allow_logprobs = config.get("allow_logprobs", None) + allow_search_indices = config.get("allow_search_indices", None) + allow_view = config.get("allow_view", None) + allow_fine_tuning = config.get("allow_fine_tuning", None) + organization = config.get("organization", "*") + group = config.get("group", None) + is_blocking = config.get("is_blocking", None) + + max_model_len = config.get("max_position_embeddings", None) + + model_permission_id = f"modelperm-{model_name}" + permission = [ + { + "id": model_permission_id, + "object": "model_permission", + "created": created_time + if created_time is not None + else None, + "allow_create_engine": allow_create_engine + if allow_create_engine is not None + else None, + "allow_sampling": allow_sampling + if allow_sampling is not None + else None, + "allow_logprobs": allow_logprobs + if allow_logprobs is not None + else None, + "allow_search_indices": allow_search_indices + if allow_search_indices is not None + else None, + "allow_view": allow_view + if allow_view is not None + else None, + "allow_fine_tuning": allow_fine_tuning + if allow_fine_tuning is not None + else None, + "organization": organization + if organization is not None + else None, + "group": group if group is not None else None, + "is_blocking": is_blocking + if is_blocking is not None + else None, + } + ] + + # Build the model metadata entry + model_metadata = { + "id": model_name, + "object": "model", + "created": created_time + if created_time is not None + else None, + "owned_by": "sllm", + "root": model_name, + "parent": None, + "max_model_len": max_model_len + if max_model_len is not None + else None, + "permission": permission, + } + models.append(model_metadata) + + return {"object": "list", "models": models} + + async def shutdown(self): + # stop the control loop + async with self.running_lock: + if not self.running: + logger.error("Controller not running") + raise RuntimeError("Controller not running") + self.running = False + + # delete all models + async with self.metadata_lock: + delete_tasks = [ + self._delete(model_name) + for model_name in self.request_routers.keys() + ] + await asyncio.gather(*delete_tasks) diff --git a/sllm/serve/hardware_info_collector.py b/sllm/serve/hardware_info_collector.py new file mode 100644 index 0000000..67e67d5 --- /dev/null +++ b/sllm/serve/hardware_info_collector.py @@ -0,0 +1,169 @@ +import json +import os +import tempfile +import time +from typing import Dict, Set + +import GPUtil +import psutil +import ray +import speedtest +from tqdm import tqdm + +from sllm.serve.logger import init_logger + +logger = init_logger(__name__) + + +@ray.remote +def collect_all_info(): + """ + Collect all hardware information and return as a dictionary. + """ + hardware_info = {} + # TODO: collect pcie_bandwidth + hardware_info["pcie_bandwidth"] = 25000000000 # 25 GB/s, PCIe 4.0 x16 + hardware_info["disk_size"] = get_disk_info() + write_bw, read_bw = benchmark_disk_bandwidth() + hardware_info["disk_bandwidth"] = ( + write_bw + read_bw + ) / 2 # Average of write and read bandwidth + hardware_info["disk_write_bandwidth"] = write_bw + hardware_info["disk_read_bandwidth"] = read_bw + # Temporarily disabled due to network issues + # upload_bw, download_bw = get_network_bandwidth() + # hardware_info["network_upload_bandwidth"] = upload_bw + # hardware_info["network_download_bandwidth"] = download_bw + hardware_info["GPUs_info"] = get_gpu_info() + print(hardware_info) + return hardware_info + + +def get_disk_info(): + """ + Retrieves total size of the primary disk partition. + Returns: + str: Disk size in B + """ + try: + partitions = psutil.disk_partitions() + # Assume primary partition is mounted at '/' + for partition in partitions: + if partition.mountpoint == "/": + usage = psutil.disk_usage(partition.mountpoint) + return usage.total + # If '/' not found, return the first partition's size + if partitions: + usage = psutil.disk_usage(partitions[0].mountpoint) + return usage.total + return "N/A" + except Exception as e: + logger.error(f"Failed to retrieve disk info: {e}") + return "N/A" + + +def benchmark_disk_bandwidth(num_iterations=5): + """ + Measures disk read and write bandwidth by writing and reading a temporary file multiple times. + Args: + num_iterations (int): Number of iterations to run. + Returns: + tuple: Average write bandwidth (str) and average read bandwidth (str) in B/s + """ + write_results = [] + read_results = [] + try: + temp_dir = tempfile.gettempdir() + temp_file = os.path.join(temp_dir, "disk_bandwidth_test.tmp") + size = 100 * 1024 * 1024 # 100 MB + + for _ in range(num_iterations): + # Write Test + start_time = time.time() + with open(temp_file, "wb") as f: + f.write(os.urandom(size)) + end_time = time.time() + write_time = end_time - start_time + write_bandwidth_b_s = size / write_time + write_results.append(write_bandwidth_b_s) + + # Read Test + start_time = time.time() + with open(temp_file, "rb") as f: + _ = f.read() + end_time = time.time() + read_time = end_time - start_time + read_bandwidth_b_s = size / read_time + read_results.append(read_bandwidth_b_s) + + # Clean up + os.remove(temp_file) + + # Calculate averages + average_write = sum(write_results) / len(write_results) + average_read = sum(read_results) / len(read_results) + return average_write, average_read + except Exception as e: + logger.error(f"Disk bandwidth benchmark failed: {e}") + return "N/A", "N/A" + + +def get_network_bandwidth(num_iterations=1): + """ + Measures network upload and download bandwidth by performing speed tests multiple times. + Args: + num_iterations (int): Number of iterations to run. + Returns: + tuple: Average upload bandwidth (str) and average download bandwidth (str) in bps + """ + upload_results = [] + download_results = [] + try: + for _ in tqdm(range(num_iterations), desc="Testing network bandwidth"): + st = speedtest.Speedtest() + st.get_best_server() + download_speed_mbps = st.download() + upload_speed_mbps = st.upload(pre_allocate=False) + + # Convert to bps + download_results.append(download_speed_mbps * (1024**2) / 8) + upload_results.append(upload_speed_mbps * (1024**2) / 8) + + # Wait to avoid server overload + time.sleep(5) + # Calculate averages + average_upload = sum(upload_results) / len(upload_results) + average_download = sum(download_results) / len(download_results) + return average_upload, average_download + + except Exception as e: + logger.error(f"Network bandwidth test failed: {e}") + return "N/A", "N/A" + + +def get_gpu_info(): + """ + Retrieves information about each NVIDIA GPU. + Returns: + dict: Dictionary containing GPU information. + """ + gpus_info = {} + try: + gpus = GPUtil.getGPUs() + if not gpus: + gpus_info = "No GPUs found." + else: + for gpu in gpus: + gpu_id = gpu.id + 1 # To start GPU numbering from 1 + gpus_info[gpu_id] = { + # "info": gpu.__dict__, + "Name": gpu.name, + "Load": f"{gpu.load * 100:.1f}%", + "Free_Memory": f"{gpu.memoryFree}MB", + "Used_Memory": f"{gpu.memoryUsed}MB", + "Total_Memory": f"{gpu.memoryTotal}MB", + } + except Exception as e: + logger.error(f"Failed to retrieve GPU information: {e}") + gpus_info = "N/A" + return gpus_info diff --git a/sllm/serve/inference_instance.py b/sllm/serve/inference_instance.py new file mode 100644 index 0000000..f32fdfa --- /dev/null +++ b/sllm/serve/inference_instance.py @@ -0,0 +1,54 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # + +import ray + +from sllm.serve.logger import init_logger + +logger = init_logger(__name__) + + +@ray.remote +def start_instance( + instance_id, backend, model_name, backend_config, startup_config +): + logger.info(f"Starting instance {instance_id} with backend {backend}") + if backend == "vllm": + from sllm.serve.backends import VllmBackend + + model_backend_cls = VllmBackend + elif backend == "dummy": + from sllm.serve.backends import DummyBackend + + model_backend_cls = DummyBackend + elif backend == "transformers": + from sllm.serve.backends import TransformersBackend + + model_backend_cls = TransformersBackend + else: + logger.error(f"Unknown backend: {backend}") + raise ValueError(f"Unknown backend: {backend}") + + model_actor_cls = ray.remote(model_backend_cls) + + return model_actor_cls.options( + name=instance_id, + **startup_config, + max_concurrency=10, + lifetime="detached", + ).remote(model_name, backend_config) diff --git a/sllm/serve/logger.py b/sllm/serve/logger.py new file mode 100644 index 0000000..61d31aa --- /dev/null +++ b/sllm/serve/logger.py @@ -0,0 +1,81 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # + +# Adapted from https://github.com/vllm-project/vllm/blob/0ce0539d4750f9ebcd9b19d7085ca3b934b9ec67/vllm/logger.py +"""Logging configuration for sllm.""" + +import logging +import os +import sys + +_FORMAT = "%(levelname)s %(asctime)s %(filename)s:%(lineno)d] %(message)s" +_DATE_FORMAT = "%m-%d %H:%M:%S" + + +class NewLineFormatter(logging.Formatter): + """Adds logging prefix to newlines to align multi-line messages.""" + + def __init__(self, fmt, datefmt=None): + logging.Formatter.__init__(self, fmt, datefmt) + + def format(self, record): + msg = logging.Formatter.format(self, record) + if record.message != "": + parts = msg.split(record.message) + msg = msg.replace("\n", "\r\n" + parts[0]) + return msg + + +_root_logger = logging.getLogger("sllm") +_default_handler = None + + +def _setup_logger(): + _root_logger.setLevel(logging.DEBUG) + global _default_handler + + _default_handler = logging.StreamHandler(sys.stdout) + _default_handler.flush = sys.stdout.flush # type: ignore + _default_handler.setLevel(logging.DEBUG) + _root_logger.addHandler(_default_handler) + + fmt = NewLineFormatter(_FORMAT, datefmt=_DATE_FORMAT) + _default_handler.setFormatter(fmt) + # Setting this will avoid the message + # being propagated to the parent logger. + _root_logger.propagate = False + + +_setup_logger() + + +def init_logger(name: str): + # Use the same settings as above for root logger + logger = logging.getLogger(name) + + log_level = os.getenv("LOG_LEVEL", "DEBUG").upper() + logger.setLevel(log_level) + + # Ensure the handler's level matches the logger's level + if _default_handler: + _default_handler.setLevel(log_level) + + logger.addHandler(_default_handler) + logger.propagate = False + + return logger diff --git a/sllm/serve/model_downloader.py b/sllm/serve/model_downloader.py new file mode 100644 index 0000000..c17c2d3 --- /dev/null +++ b/sllm/serve/model_downloader.py @@ -0,0 +1,246 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import importlib +import logging +import os +import shutil +from typing import Optional + +import ray +from torch import nn +from transformers import AutoTokenizer + +logger = logging.getLogger("ray") + + +# def get_directory_size(directory): +# total_size = 0 +# for dirpath, dirnames, filenames in os.walk(directory): +# for filename in filenames: +# file_path = os.path.join(dirpath, filename) +# if not os.path.islink(file_path): +# total_size += os.path.getsize(file_path) +# return total_size + + +@ray.remote(num_cpus=1) +def download_transformers_model( + model_name: str, + pretrained_model_name_or_path: str, + torch_dtype: str, + hf_model_class: str, +) -> bool: + storage_path = os.getenv("STORAGE_PATH", "./models") + model_path = os.path.join(storage_path, "transformers", model_name) + tokenizer_path = os.path.join( + storage_path, "transformers", model_name, "tokenizer" + ) + + if os.path.exists(model_path): + logger.info(f"{model_path} already exists") + return True + + import torch + + torch_dtype = getattr(torch, torch_dtype) + if torch_dtype is None: + raise ValueError(f"Invalid torch_dtype: {torch_dtype}") + + logger.info(f"Downloading {model_path}") + + module = importlib.import_module("transformers") + hf_model_cls = getattr(module, hf_model_class) + model = hf_model_cls.from_pretrained( + pretrained_model_name_or_path, + torch_dtype=torch_dtype, + trust_remote_code=True, + ) + + tokenizer = AutoTokenizer.from_pretrained(model_name) + + from sllm_store.transformers import save_model + + logger.info(f"Saving {model_path}") + try: + save_model(model, model_path) + tokenizer.save_pretrained(tokenizer_path) + except Exception as e: + logger.error(f"Failed to save {model_path}: {e}") + # shutil.rmtree(model_path) # TODO: deal with error in save_model + raise RuntimeError( + f"Failed to save {model_name} for transformer backend: {e}" + ) + + # model_size = get_directory_size(model_path) + # logger.info(f"{model_name} (size: {model_size}) downloaded") + + return True + + +@ray.remote(num_cpus=1) +def download_lora_adapter( + base_model_name: str, + adapter_name: str, + adapter_name_or_path: str, + hf_model_class: str, + torch_dtype: str, +) -> bool: + storage_path = os.getenv("STORAGE_PATH", "./models") + adapter_path = os.path.join( + storage_path, "transformers", adapter_name_or_path + ) + + if os.path.exists(adapter_path): + logger.info(f"{adapter_path} already exists") + return True + + import torch + + torch_dtype = getattr(torch, torch_dtype) + if torch_dtype is None: + raise ValueError(f"Invalid torch_dtype: {torch_dtype}") + + from transformers import AutoConfig + + config = AutoConfig.from_pretrained( + os.path.join(storage_path, "transformers", base_model_name), + trust_remote_code=True, + ) + config.torch_dtype = torch_dtype + module = importlib.import_module("transformers") + hf_model_cls = getattr(module, hf_model_class) + base_model = hf_model_cls.from_config( + config, + trust_remote_code=True, + ).to(config.torch_dtype) + + logger.info(f"Downloading {adapter_path}") + from peft import PeftModel + + try: + model = PeftModel.from_pretrained(base_model, adapter_name_or_path) + except Exception as e: + logger.error(f"Failed to load adapter: {e}") + raise RuntimeError(f"LoRA adapter load failed: {e}") + + from sllm_store.transformers import save_lora + + logger.info(f"Saving {adapter_path}") + try: + save_lora(model, adapter_path) + except Exception as e: + logger.error(f"Failed to save {adapter_path}: {e}") + # shutil.rmtree(model_path) # TODO: deal with error in save_model + raise RuntimeError( + f"Failed to save {adapter_name} for transformer backend: {e}" + ) + + return True + + +class VllmModelDownloader: + def __init__(self): + pass + + def download_vllm_model( + self, + model_name: str, + pretrained_model_name_or_path: str, + torch_dtype: str, + tensor_parallel_size: int = 1, + pattern: Optional[str] = None, + max_size: Optional[int] = None, + ): + import gc + from tempfile import TemporaryDirectory + + import torch + from huggingface_hub import snapshot_download + from vllm import LLM + + # set the storage path + storage_path = os.getenv("STORAGE_PATH", "./models") + model_path = os.path.join(storage_path, "vllm", model_name) + if os.path.exists(model_path): + logger.info(f"{model_path} already exists") + return + + cache_dir = TemporaryDirectory() + try: + if os.path.exists(pretrained_model_name_or_path): + input_dir = pretrained_model_name_or_path + else: + # download from huggingface + input_dir = snapshot_download( + model_name, + cache_dir=cache_dir.name, + allow_patterns=[ + "*.safetensors", + "*.bin", + "*.json", + "*.txt", + ], + ) + logger.info(f"Loading model from {input_dir}") + + # load models from the input directory + llm_writer = LLM( + model=input_dir, + download_dir=input_dir, + dtype=torch_dtype, + tensor_parallel_size=tensor_parallel_size, + num_gpu_blocks_override=1, + enforce_eager=True, + max_model_len=1, + ) + # model_executer = llm_writer.llm_engine.model_executor #V0 + model_executer = llm_writer.llm_engine.engine_core # For engine V1 + # save the models in the ServerlessLLM format + model_executer.save_serverless_llm_state( + path=model_path, pattern=pattern, max_size=max_size + ) + for file in os.listdir(input_dir): + # Copy the metadata files into the output directory + if os.path.splitext(file)[1] not in ( + ".bin", + ".pt", + ".safetensors", + ): + src_path = os.path.join(input_dir, file) + dest_path = os.path.join(model_path, file) + logger.info(src_path) + logger.info(dest_path) + if os.path.isdir(src_path): + shutil.copytree(src_path, dest_path) + else: + shutil.copy(src_path, dest_path) + del model_executer + del llm_writer + gc.collect() + if torch.cuda.is_available(): + torch.cuda.empty_cache() + torch.cuda.synchronize() + except Exception as e: + logger.info(f"An error occurred while saving the model: {e}") + # remove the output dir + shutil.rmtree(os.path.join(storage_path, "vllm", model_name)) + raise RuntimeError( + f"Failed to save {model_name} for vllm backend: {e}" + ) + finally: + cache_dir.cleanup() diff --git a/sllm/serve/routers/__init__.py b/sllm/serve/routers/__init__.py new file mode 100644 index 0000000..88cff91 --- /dev/null +++ b/sllm/serve/routers/__init__.py @@ -0,0 +1,22 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +from .migration_router import MigrationRouter +from .roundrobin_router import RoundRobinRouter +from .router_utils import SllmRouter + +__all__ = ["SllmRouter", "RoundRobinRouter", "MigrationRouter"] diff --git a/sllm/serve/routers/migration_router.py b/sllm/serve/routers/migration_router.py new file mode 100644 index 0000000..e346a85 --- /dev/null +++ b/sllm/serve/routers/migration_router.py @@ -0,0 +1,252 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +from typing import Dict + +import ray + +from sllm.serve.inference_instance import start_instance +from sllm.serve.logger import init_logger +from sllm.serve.routers.roundrobin_router import RoundRobinRouter +from sllm.serve.utils import InstanceHandle, InstanceStatus + +logger = init_logger(__name__) + + +class MigrationRouter(RoundRobinRouter): + def __init__( + self, + model_name: str, + resource_requirements: Dict[str, int], + backend: str, + backend_config: Dict, + router_config: Dict, + ) -> None: + super().__init__( + model_name, + resource_requirements, + backend, + backend_config, + router_config, + ) + self.migration_record = {} + self.migration_delta = self.router_config.get("migration_delta", 20) + + async def inference(self, request_data: dict, action: str): + async with self.running_lock: + if not self.running: + return {"error": "Instance stopped"} + + async with self.request_count_lock: + self.request_count += 1 + + instance_allocation = self.loop.create_future() + await self.request_queue.put(instance_allocation) + logger.info(f"Enqueued request for model {self.model_name}") + + instance_id = await instance_allocation + logger.info(f"{request_data}, type: {type(request_data)}") + async with self.instance_management_lock: + if instance_id not in self.ready_instances: + logger.error(f"Instance {instance_id} not found") + return {"error": "Instance not found"} + instance = self.ready_instances[instance_id] + # NOTE: `.remote(request_data)` does not work, don't know why. + # Looks like a known issue: + # https://github.com/ray-project/ray/issues/26283#issuecomment-1780691475 + if action == "generate": + result = await instance.backend_instance.generate.remote( + request_data=request_data + ) + if "preempted" in result: + logger.debug(f"Preempted request: {result}") + target_instance_id = self.migration_record.get(instance_id) + if not target_instance_id: + logger.error(f"No target instance found for {instance_id}") + return {"error": "No target instance found"} + target_instance = self.ready_instances[target_instance_id] + logger.info( + f"Resuming request on target instance: {target_instance_id}" + ) + if "max_tokens" in request_data: + request_data["max_tokens"] -= result["completed_tokens"] + result = await target_instance.backend_instance.resume_generate.remote( + request_data=request_data, + current_output=result["current_output"], + ) + + elif action == "encode": + result = await instance.backend_instance.encode.remote( + request_data=request_data + ) + else: + result = {"error": "Invalid action"} + logger.info(f"Finished processing request") + await instance.add_requests(-1) + async with self.request_count_lock: + self.request_count -= 1 + return result + + async def execute_migration_plan(self, migration_plan): + logger.info(f"Executing migration plan: {migration_plan}") + source_instance = migration_plan.source_instance + source_instance_id = source_instance.instance_id + target_node_id = migration_plan.target_node_id + # start the target_instance on the target node + startup_config = { + "num_cpus": self.resource_requirements["num_cpus"], + "num_gpus": self.resource_requirements["num_gpus"], + "resources": { + "worker_node": 0.1, + f"worker_id_{target_node_id}": 0.1, + }, + } + logger.info(f"Startup config: {startup_config}, {self.backend_config}") + + instance_id = self._new_instance_id() + logger.info( + f"Creating new instance {instance_id} for model {self.model_name}" + ) + # TODO: Add max_queue_length to target_instance + target_instance = InstanceHandle( + instance_id=instance_id, + max_queue_length=10, + num_gpu=self.resource_requirements["num_gpus"], + ) + + ret = await self.model_loading_scheduler.mark_resource.remote( + self.model_name, instance_id, target_node_id + ) + if not ret: + logger.error( + f"Failed to mark resource for instance {instance_id} for model {self.model_name}" + ) + return None + + await start_instance.options( + resources={ + "worker_node": 0.1, + f"worker_id_{target_node_id}": 0.1, + } + ).remote( + instance_id, + self.backend, + self.model_name, + self.backend_config, + startup_config, + ) + logger.info( + f"Started instance {instance_id} for model {self.model_name}" + ) + target_instance.backend_instance = ray.get_actor(instance_id) + async with target_instance.lock: + target_instance.ready = True + target_instance.node_id = target_node_id + logger.info( + f"Initialized instance {instance_id} for model {self.model_name}" + ) + await target_instance.backend_instance.init_backend.remote() + logger.info( + f"Initialized backend for instance {instance_id} for model {self.model_name}" + ) + # migrate the tokens from the source_instance (if still running) to the target_instance + if source_instance_id not in self.ready_instances: + logger.info(f"Instance {source_instance_id} not found") + target_instance.ready = False + await target_instance.backend_instance.shutdown.remote() + ray.kill(target_instance.backend_instance) + return None + source_instance = self.ready_instances[source_instance_id] + migration_iter = 0 + n_previous_tokens = 0 + while True: + logger.info(f"Migration iteration {migration_iter}") + current_tokens = ray.get( + source_instance.backend_instance.get_current_tokens.remote() + ) + if not current_tokens: + logger.info("No tokens found") + break + n_current_tokens = len(current_tokens[0]) + n_delta_tokens = n_current_tokens - n_previous_tokens + logger.info( + f"Number of tokens: {n_current_tokens}, delta: {n_delta_tokens}" + ) + n_previous_tokens = n_current_tokens + if n_delta_tokens <= self.migration_delta: + logger.info( + "Migration completed: remained " + f"{None if not current_tokens else n_delta_tokens} tokens" + ) + break + ray.get( + target_instance.backend_instance.resume_kv_cache.remote( + current_tokens + ) + ) + logger.info(f"Migration iteration {migration_iter} completed") + migration_iter += 1 + + logger.info(f"Migrated instance {source_instance_id} to {instance_id}") + async with self.instance_management_lock: + if source_instance_id not in self.ready_instances: + # source_instance has been removed + logger.error(f"Instance {instance_id} not found") + target_instance.ready = False + await target_instance.backend_instance.shutdown.remote() + ray.kill(target_instance.backend_instance) + return None + _ = self.ready_instances.pop(source_instance_id) + async with source_instance.lock: + source_instance.status = False + self.ready_instances[instance_id] = target_instance + self.migration_record[source_instance_id] = instance_id + logger.info(f"Instance {source_instance_id} removed") + await source_instance.backend_instance.shutdown.remote() + logger.info(f"Shutdown instance {source_instance_id}") + ray.kill(source_instance.backend_instance) + logger.info(f"Killed instance {source_instance_id}") + await self.model_loading_scheduler.deallocate_resource.remote( + self.model_name, source_instance_id, self.resource_requirements + ) + logger.info(f"Deallocated instance {source_instance_id}") + return instance_id + + async def get_instance_status(self, instance_id: str) -> InstanceStatus: + logger.info(f"Getting status for instance: {instance_id}") + async with self.instance_management_lock: + if instance_id not in self.ready_instances: + logger.info(f"Instance {instance_id} not found") + return None + instance = self.ready_instances[instance_id] + logger.info(f"Instance: {instance}") + instance_status = await instance.get_status() + instance_status.model_name = self.model_name + current_tokens = ( + await instance.backend_instance.get_current_tokens.remote() + ) + if current_tokens: + instance_status.num_current_tokens = len(current_tokens[0]) + else: + instance_status.num_current_tokens = 0 + logger.info(f"Instance status: {instance_status}") + return instance_status + + async def fine_tuning(self, request_data: dict): + raise NotImplementedError( + "Fine-tuning is only applicable on roundrobin router" + ) diff --git a/sllm/serve/routers/roundrobin_router.py b/sllm/serve/routers/roundrobin_router.py new file mode 100644 index 0000000..32b4908 --- /dev/null +++ b/sllm/serve/routers/roundrobin_router.py @@ -0,0 +1,459 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import asyncio +import logging +import uuid +from typing import Dict, List, Optional + +import ray + +from sllm.serve.inference_instance import start_instance +from sllm.serve.logger import init_logger + +from ..utils import InstanceHandle +from .router_utils import SllmRouter + +logger = init_logger(__name__) + + +async def auto_scaler( + auto_scaling_metrics: Dict[str, int], auto_scaling_config: Dict[str, int] +) -> int: + """ + Returns desired number of instances for a model based on the auto-scaling policy + """ + + request_count = auto_scaling_metrics.get("request_count", 0) + + min_instances = auto_scaling_config.get("min_instances", 0) + max_instances = auto_scaling_config.get("max_instances", 10) + target_ongoing_requests = auto_scaling_config.get("target", 2) + + desired_instances = ( + request_count + target_ongoing_requests - 1 + ) // target_ongoing_requests + desired_instances = min( + max_instances, max(min_instances, desired_instances) + ) + + return desired_instances + + +class RoundRobinRouter(SllmRouter): + def __init__( + self, + model_name: str, + resource_requirements: Dict[str, int], + backend: str, + backend_config: Dict, + router_config: Dict, + enable_lora: bool = False, + lora_adapters: Optional[Dict[str, str]] = None, + ) -> None: + self.model_name = model_name + self.resource_requirements = resource_requirements + self.backend = backend + self.backend_config = backend_config + self.router_config = router_config + + self.loop_interval = 1 + self.loop = asyncio.get_running_loop() + self.request_queue = asyncio.Queue() # type:ignore + self.starting_instances: Dict[str, InstanceHandle] = {} # type:ignore + self.deleting_instances: Dict[str, InstanceHandle] = {} # type:ignore + self.ready_instances: Dict[str, InstanceHandle] = {} # type:ignore + self.instance_management_lock = asyncio.Lock() + + self.auto_scaling_config = {} + self.auto_scaling_lock = asyncio.Lock() + + self.request_count = 0 + self.request_count_lock = asyncio.Lock() + + self.fine_tuning_count = 0 + self.fine_tuning_count_lock = asyncio.Lock() + + self.running = False + self.running_lock = asyncio.Lock() + + self.idle_time = 0 + self.idle_time_lock = asyncio.Lock() + + self.enable_lora = enable_lora + self.loaded_lora_adapters = lora_adapters + self.lora_lock = asyncio.Lock() + + self.auto_scaler = None + logger.info(f"Created new handler for model {self.model_name}") + + async def start(self, auto_scaling_config: Dict[str, int]): + self.model_loading_scheduler = ray.get_actor("model_loading_scheduler") + async with self.auto_scaling_lock: + self.auto_scaling_config = auto_scaling_config + self.auto_scaler = asyncio.create_task(self._auto_scaler_loop()) + self.load_balancer = asyncio.create_task(self._load_balancer_loop()) + async with self.running_lock: + self.running = True + logger.info(f"Started handler for model {self.model_name}") + + async def update( + self, + auto_scaling_config: Optional[Dict[str, int]] = None, + lora_adapters: Optional[Dict[str, str]] = None, + ): + if auto_scaling_config is not None: + async with self.auto_scaling_lock: + self.auto_scaling_config = auto_scaling_config + + if lora_adapters is not None: + async with self.lora_lock: + self.loaded_lora_adapters = lora_adapters + + logger.info( + f"Model {self.model_name}'s auto scaling config updated to {auto_scaling_config}" + ) + + def _new_instance_id(self): + pattern = "{model_name}_{id}" + return pattern.format(model_name=self.model_name, id=uuid.uuid4()) + + async def inference(self, request_data: dict, action: str): + async with self.running_lock: + if not self.running: + return {"error": "Instance stopped"} + + async with self.fine_tuning_count_lock: + if self.fine_tuning_count > 0: + return { + "error": "Fine-tuning in progress, inference cannot start." + } + + async with self.request_count_lock: + self.request_count += 1 + + async with self.idle_time_lock: + self.idle_time = 0 + + instance_allocation = self.loop.create_future() + await self.request_queue.put(instance_allocation) + logger.info(f"Enqueued {action} request for model {self.model_name}") + + instance_id = await instance_allocation + logger.info(f"{request_data}, type: {type(request_data)}") + async with self.instance_management_lock: + if instance_id not in self.ready_instances: + logger.error(f"Instance {instance_id} not found") + return {"error": "Instance not found"} + instance = self.ready_instances[instance_id] + + # sanity check + if self.enable_lora and "lora_adapter_name" in request_data: + lora_adapter_name = request_data["lora_adapter_name"] + if lora_adapter_name not in self.loaded_lora_adapters: + logger.error(f"Lora adapter {lora_adapter_name} not found") + return {"error": f"Lora adapter {lora_adapter_name} not found"} + await instance.backend_instance.load_lora_adapter.remote( + lora_name=lora_adapter_name, + lora_path=self.loaded_lora_adapters[lora_adapter_name], + ) + # NOTE: `.remote(request_data)` does not work, don't know why. + # Looks like a known issue: + # https://github.com/ray-project/ray/issues/26283#issuecomment-1780691475 + if action == "generate": + result = await instance.backend_instance.generate.remote( + request_data=request_data + ) + elif action == "encode": + result = await instance.backend_instance.encode.remote( + request_data=request_data + ) + else: + result = {"error": "Invalid action"} + logger.info(f"Finished processing request") + await instance.add_requests(-1) + async with self.request_count_lock: + self.request_count -= 1 + return result + + async def fine_tuning(self, request_data: dict): + async with self.running_lock: + if not self.running: + return {"error": "Instance stopped"} + + async with self.request_count_lock: + if self.request_count > 0: + return { + "error": "Inference requests in progress, fine-tuning cannot start." + } + + async with self.fine_tuning_count_lock: + self.fine_tuning_count += 1 + + instance_allocation = self.loop.create_future() + await self.request_queue.put(instance_allocation) + logger.info(f"Enqueued fine-tuning request for model {self.model_name}") + + instance_id = await instance_allocation + logger.info(f"{request_data}, type: {type(request_data)}") + async with self.instance_management_lock: + if instance_id not in self.ready_instances: + logger.error(f"Instance {instance_id} not found") + return {"error": "Instance not found"} + instance = self.ready_instances[instance_id] + instance.concurrency = 1 + + result = await instance.backend_instance.fine_tuning.remote( + request_data=request_data + ) + + logger.info(f"Finished processing fine-tuning") + await instance.add_requests(-1) + async with self.fine_tuning_count_lock: + self.fine_tuning_count -= 1 + return result + + async def delete_adapters(self, lora_adapters: List[str]): + async with self.lora_lock: + for adapter_name in lora_adapters: + if adapter_name in self.loaded_lora_adapters: + del self.loaded_lora_adapters[adapter_name] + logger.info( + f"Deleted LoRA adapters {lora_adapters} on model {self.model_name}" + ) + + async def shutdown(self): + async with self.running_lock: + self.running = False + # stop all instances + # return all unfinished requests + while not self.request_queue.empty(): + request_data, done_event = await self.request_queue.get() + done_event.set_result({"error": "Instance cancelled"}) + + async with self.instance_management_lock: + deleted_instance_id = list(self.ready_instances.keys()) + delete_tasks = [ + self._shutdown_instance(instance_id) + for instance_id in deleted_instance_id + ] + await asyncio.gather(*delete_tasks) + + return deleted_instance_id + + async def _load_balancer_loop(self): + # this is a simple round-robin load balancer + round_robin_index = 0 + while True: + instance_allocation = await self.request_queue.get() + allocated = False + logger.info(f"A request is waiting for model {self.model_name}") + while not allocated: + # 1. get ready instances + instance_options = None + while not instance_options: + await asyncio.sleep(1) + async with self.instance_management_lock: + instance_options = list(self.ready_instances.keys()) + logger.info(f"{instance_options}") + logger.info(f"Got ready instances {instance_options}") + instance_id = instance_options[ + round_robin_index % len(instance_options) + ] + round_robin_index += 1 + async with self.instance_management_lock: + if instance_id not in self.ready_instances: + continue + instance = self.ready_instances[instance_id] + # check if the request queue reaches max length + if await instance.check_request_queue(): + allocated = await instance.add_requests(1) + if allocated: + instance_allocation.set_result(instance_id) + else: + logger.info( + f"Instance {instance_id} cannot add another request" + ) + if not allocated: + await asyncio.sleep(self.loop_interval) + + async def _auto_scaler_loop(self): + while True: + # logger.info(f"Auto-scaling for model {self.model_name}") + async with self.auto_scaling_lock: + auto_scaling_config = self.auto_scaling_config.copy() + auto_scaling_metrics = { + "request_count": self.request_count + self.fine_tuning_count + } + desired_instances = await auto_scaler( + auto_scaling_metrics, auto_scaling_config + ) + async with self.instance_management_lock: + num_running_instances = len(self.starting_instances) + len( + self.ready_instances + ) + logger.info( + f"{self.model_name}: {num_running_instances} instances," + f"need {desired_instances} instances", + ) + if desired_instances > num_running_instances: + logger.info("Creating new instance") + await self._create_instance() + elif desired_instances < num_running_instances: + keep_alive = auto_scaling_config.get("keep_alive", 0) + if self.idle_time >= keep_alive: + logger.info( + f"Stopping instance, idle_time: {self.idle_time}, keep_alive: {keep_alive}" + ) + await self._stop_instance() + async with self.idle_time_lock: + self.idle_time = 0 + else: + logger.info( + f"idle_time: {self.idle_time}, keep_alive: {keep_alive}" + ) + async with self.idle_time_lock: + self.idle_time += self.loop_interval + else: + # logger.info("No scaling needed") + pass + await asyncio.sleep(self.loop_interval) + + async def _create_instance(self): + instance_id = self._new_instance_id() + logger.info( + f"Creating new instance {instance_id} for model {self.model_name}" + ) + # get max_queue_length from auto_scaling_config + if self.auto_scaling_config.get("metric", "") == "concurrency": + max_request_length = self.auto_scaling_config.get("target", 1) + else: + max_request_length = 1 + logger.info( + f"Creating new instance {instance_id} for model {self.model_name}, max queue length is {max_request_length}" + ) + instance = InstanceHandle( + instance_id=instance_id, + max_queue_length=max_request_length, + num_gpu=self.resource_requirements["num_gpus"], + ) + async with self.instance_management_lock: + self.starting_instances[instance_id] = instance + self.loop.create_task(self._start_instance(instance_id)) + + return instance_id + + async def _start_instance(self, instance_id): + async with self.instance_management_lock: + if instance_id not in self.starting_instances: + logger.error(f"Instance {instance_id} not found") + return + instance = self.starting_instances[instance_id] + # Now ask model loading scheduler to load the model + logger.info( + f"Allocating resources for model {self.model_name} on instance {instance_id}" + ) + startup_node = ( + await self.model_loading_scheduler.allocate_resource.remote( + self.model_name, instance_id, self.resource_requirements + ) + ) + startup_config = { + "num_cpus": self.resource_requirements["num_cpus"], + "num_gpus": self.resource_requirements["num_gpus"], + "resources": { + "worker_node": 0.1, + f"worker_id_{startup_node}": 0.1, + }, + } + logger.info(f"Startup config: {startup_config}, {self.backend_config}") + + await start_instance.options( + resources={ + "worker_node": 0.1, + f"worker_id_{startup_node}": 0.1, + } + ).remote( + instance_id, + self.backend, + self.model_name, + self.backend_config, + startup_config, + ) + logger.info( + f"Started instance {instance_id} for model {self.model_name}" + ) + instance.backend_instance = ray.get_actor(instance_id) + async with instance.lock: + instance.ready = True + instance.node_id = startup_node + await instance.backend_instance.init_backend.remote() + + async with self.instance_management_lock: + self.ready_instances[instance_id] = instance + self.starting_instances.pop(instance_id) + return instance_id + + async def _stop_instance(self, instance_id: Optional[str] = None): + while len(self.ready_instances) <= 0: + await asyncio.sleep(1) + + async with self.instance_management_lock: + if instance_id is None: + instance_id, instance = self.ready_instances.popitem() + elif instance_id in self.ready_instances: + instance = self.ready_instances.pop(instance_id) + else: + logger.error(f"Instance {instance_id} not found") + return + self.deleting_instances[instance_id] = instance + logger.info( + f"Stopping instance {instance_id} for model {self.model_name}" + ) + self.loop.create_task(self._finish_instance(instance_id)) + + async def _finish_instance(self, instance_id: str): + async with self.instance_management_lock: + if instance_id not in self.deleting_instances: + logger.error(f"Instance {instance_id} not found") + return + instance = self.deleting_instances.pop(instance_id) + async with instance.lock: + instance.status = False + await instance.backend_instance.stop.remote() + ray.kill(instance.backend_instance) + await self.model_loading_scheduler.deallocate_resource.remote( + self.model_name, instance_id, self.resource_requirements + ) + + async def _shutdown_instance(self, instance_id: str): + logger.info( + f"Force deleting an instance (even if it is busy) for model {self.model_name}" + ) + async with self.instance_management_lock: + if instance_id not in self.ready_instances: + logger.error(f"Instance {instance_id} not found") + return + instance = self.ready_instances.pop(instance_id) + async with instance.lock: + instance.status = False + await instance.backend_instance.shutdown.remote() + ray.kill(instance.backend_instance) + await self.model_loading_scheduler.deallocate_resource.remote( + self.model_name, instance_id, self.resource_requirements + ) + return diff --git a/sllm/serve/routers/router_utils.py b/sllm/serve/routers/router_utils.py new file mode 100644 index 0000000..41e2072 --- /dev/null +++ b/sllm/serve/routers/router_utils.py @@ -0,0 +1,60 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import asyncio +from abc import ABC, abstractmethod +from dataclasses import dataclass +from typing import Dict, Optional + +import ray + +from sllm.serve.logger import init_logger + +logger = init_logger(__name__) + + +class SllmRouter(ABC): + @abstractmethod + def __init__( + self, + model_name: str, + resource_requirements: Dict[str, int], + backend: str, + backend_config: Dict, + router_config: Dict, + ) -> None: + pass + + @abstractmethod + async def start(self, auto_scaling_config: Dict[str, int]): + pass + + @abstractmethod + async def shutdown(self): + pass + + @abstractmethod + async def update(self, auto_scaling_config: Dict[str, int]): + pass + + @abstractmethod + async def inference(self, request_data: dict): + pass + + @abstractmethod + async def fine_tuning(self, request_data: dict): + pass diff --git a/sllm/serve/schedulers/__init__.py b/sllm/serve/schedulers/__init__.py new file mode 100644 index 0000000..d573c10 --- /dev/null +++ b/sllm/serve/schedulers/__init__.py @@ -0,0 +1,22 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +from .fcfs_scheduler import FcfsScheduler +from .scheduler_utils import SllmScheduler +from .storage_aware_scheduler import StorageAwareScheduler + +__all__ = ["FcfsScheduler", "SllmScheduler", "StorageAwareScheduler"] diff --git a/sllm/serve/schedulers/fcfs_scheduler.py b/sllm/serve/schedulers/fcfs_scheduler.py new file mode 100644 index 0000000..d7ed529 --- /dev/null +++ b/sllm/serve/schedulers/fcfs_scheduler.py @@ -0,0 +1,203 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import asyncio +import copy +import time +from typing import Mapping, Optional + +from sllm.serve.logger import init_logger +from sllm.serve.utils import get_worker_nodes + +from .scheduler_utils import SllmScheduler + +logger = init_logger(__name__) + + +class FcfsScheduler(SllmScheduler): + def __init__(self, scheduler_config: Optional[Mapping] = None): + super().__init__() + self.scheduler_config = scheduler_config + + self.queue_lock = asyncio.Lock() + self.model_loading_queues = {} + + self.metadata_lock = asyncio.Lock() + self.worker_nodes = {} + self.model_instance = {} + + self.loop = asyncio.get_running_loop() + + self.running_lock = asyncio.Lock() + self.running = False + + async def start(self) -> None: + async with self.running_lock: + if self.running: + logger.error("FCFS scheduler already started") + return + self.running = True + logger.info("Starting FCFS scheduler") + self.loop_task = self.loop.create_task(self._control_loop()) + + async def shutdown(self) -> None: + async with self.running_lock: + if not self.running: + logger.error("FCFS scheduler not running") + return + self.running = False + async with self.queue_lock: + self.model_loading_queues = {} + if self.loop_task is not None: + await self.loop_task + + async def allocate_resource( + self, model_name: str, instance_id: str, resources: Mapping + ) -> int: + logger.info(f"Model {model_name} requested") + # TODO: consider other resources + num_gpus = resources.get("num_gpus", 0) + async with self.queue_lock: + if model_name not in self.model_loading_queues: + self.model_loading_queues[model_name] = [] + allocation_result = self.loop.create_future() + self.model_loading_queues[model_name].append( + (time.time(), num_gpus, allocation_result) + ) + logger.info(f"Model {model_name} added to the loading queue") + node_id = await allocation_result + async with self.metadata_lock: + if model_name not in self.model_instance: + self.model_instance[model_name] = {} + self.model_instance[model_name][instance_id] = node_id + return node_id + + async def deallocate_resource( + self, model_name: str, instance_id: str, resources: Mapping + ): + logger.info(f"Deallocating model {model_name} instance {instance_id}") + # TODO: consider other resources + num_gpus = resources.get("num_gpus", 0) + async with self.metadata_lock: + if model_name not in self.model_instance: + logger.error(f"Model {model_name} not found") + return + if instance_id not in self.model_instance[model_name]: + logger.error(f"Instance {instance_id} not found") + return + node_id = self.model_instance[model_name].pop(instance_id) + logger.info(f"Node {node_id} deallocated {num_gpus} GPUs") + if node_id not in self.worker_nodes: + logger.error(f"Node {node_id} not found") + return + self.worker_nodes[node_id]["free_gpu"] += num_gpus + logger.info(f"Model {model_name} instance {instance_id} deallocated") + + async def _control_loop(self): + logger.info("Starting control loop") + while self.running: + loading_requests = [] + async with self.queue_lock: + for ( + model_name, + loading_queue, + ) in self.model_loading_queues.items(): + for idx, ( + request_time, + num_gpus, + allocation_result, + ) in enumerate(loading_queue): + loading_requests.append( + ( + model_name, + idx, + request_time, + num_gpus, + allocation_result, + ) + ) + # logger.info(f"Loading requests: {loading_requests}") + # first come first serve + if len(loading_requests) > 0: + worker_nodes = await self._get_worker_nodes() + logger.info(f"Worker nodes: {worker_nodes}") + loading_requests.sort(key=lambda x: x[1]) + for ( + model_name, + idx, + request_time, + num_gpus, + allocation_result, + ) in loading_requests: + allocated = False + for node_id, node_info in worker_nodes.items(): + if node_info["free_gpu"] >= num_gpus: + async with self.queue_lock: + # allocation_result was set + if allocation_result.done(): + allocated = True + # skip current instance + break + try: + self.model_loading_queues[ + model_name + ].remove( + ( + request_time, + num_gpus, + allocation_result, + ) + ) + allocation_result.set_result(node_id) + except ValueError: + break + allocated = True + logger.info( + f"Allocated node {node_id} for model {model_name}" + ) + node_info["free_gpu"] -= num_gpus + break + if not allocated: + logger.info(f"No available node for model {model_name}") + await self._update_worker_nodes(worker_nodes) + + await asyncio.sleep(1) + + async def _get_worker_nodes(self): + worker_nodes = get_worker_nodes() + async with self.metadata_lock: + updated_worker_nodes = copy.deepcopy(self.worker_nodes) + for node_id, node_info in worker_nodes.items(): + if node_id not in updated_worker_nodes: + updated_worker_nodes[node_id] = copy.deepcopy(node_info) + async with self.metadata_lock: + self.worker_nodes = updated_worker_nodes + + return updated_worker_nodes + + # TODO: implement a dedicated class to manage worker nodes + async def _update_worker_nodes(self, worker_nodes) -> None: + async with self.metadata_lock: + updated_worker_nodes = copy.deepcopy(self.worker_nodes) + for node_id, node_info in worker_nodes.items(): + if node_id not in updated_worker_nodes: + logger.error(f"Node {node_id} not found") + continue + updated_worker_nodes[node_id] = copy.deepcopy(node_info) + async with self.metadata_lock: + self.worker_nodes = updated_worker_nodes + logger.info(f"Worker nodes updated: {updated_worker_nodes}") diff --git a/sllm/serve/schedulers/scheduler_utils.py b/sllm/serve/schedulers/scheduler_utils.py new file mode 100644 index 0000000..402da20 --- /dev/null +++ b/sllm/serve/schedulers/scheduler_utils.py @@ -0,0 +1,49 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +from abc import ABC, abstractmethod +from typing import Mapping, Optional + +from sllm.serve.logger import init_logger + +logger = init_logger(__name__) + + +class SllmScheduler(ABC): + @abstractmethod + def __init__(self, scheduler_config: Optional[Mapping] = None): + super().__init__() + + @abstractmethod + async def start(self) -> None: + pass + + @abstractmethod + async def shutdown(self) -> None: + pass + + @abstractmethod + async def allocate_resource( + self, model_name: str, instance_id: str, resources: Mapping + ): + pass + + @abstractmethod + async def deallocate_resource( + self, model_name: str, instance_id: str, resources: Mapping + ): + pass diff --git a/sllm/serve/schedulers/storage_aware_scheduler.py b/sllm/serve/schedulers/storage_aware_scheduler.py new file mode 100644 index 0000000..ce620a0 --- /dev/null +++ b/sllm/serve/schedulers/storage_aware_scheduler.py @@ -0,0 +1,504 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # + +import asyncio +import copy +from dataclasses import dataclass +from typing import List, Mapping, Optional, Tuple + +import ray + +from sllm.serve.logger import init_logger + +from ..utils import InstanceStatus +from .fcfs_scheduler import FcfsScheduler + +logger = init_logger(__name__) + + +@dataclass +class MigrationPlan: + target_node_id: int + source_instance: InstanceStatus + + +class MigrationPlans: + def __init__(self): + # self.evictedInstances = [] # List to store the instances that are evicted + self.total_latency = float( + "inf" + ) # Initialize total_latency to infinity + self.evictedGPUs = 0 # Counter for the total num_gpu freed + self.plans = [] + self.store_info = None + + def append(self, plan: MigrationPlan, total_latency: float): + # Update the total_latency estimate for the current plan + self.total_latency = total_latency + # Update the total num_gpu freed + self.evictedGPUs += plan.source_instance.num_gpu + # Add a instance to the Migration plan + self.plans.append(plan) + + +@dataclass +class AllocationPlan: + node_id: int + latency: float + migration_plans: Optional[MigrationPlans] = None + + +class StorageAwareScheduler(FcfsScheduler): + def __init__(self, scheduler_config: Optional[Mapping] = None): + super().__init__(scheduler_config) + + self.enable_migration = scheduler_config.get("enable_migration", False) + + self.store_manager = None + + self.model_scheduler_config = {} + + async def _control_loop(self): + logger.info("Starting control loop") + while self.running: + loading_requests = [] + logger.info(f"Loading requests: {loading_requests}") + async with self.queue_lock: + for ( + model_name, + loading_queue, + ) in self.model_loading_queues.items(): + for idx, ( + request_time, + num_gpus, + allocation_result, + ) in enumerate(loading_queue): + loading_requests.append( + ( + model_name, + idx, + request_time, + num_gpus, + allocation_result, + ) + ) + if loading_requests: + logger.info(f"Loading requests are: {loading_requests}") + if self.store_manager is None: + try: + self.store_manager = ray.get_actor("store_manager") + except ValueError: + logger.error("Store manager not found") + await asyncio.sleep(1) + continue + # first come first serve + if len(loading_requests) > 0: + worker_nodes = await self._get_worker_nodes() + logger.info(f"Worker nodes: {worker_nodes}") + model_info = await self.store_manager.get_model_info.remote() + logger.info(f"Model info: {model_info}") + store_info = await self.store_manager.get_store_info.remote() + logger.info(f"Store info: {store_info}") + hardware_info = ( + await self.store_manager.get_hardware_info.remote() + ) + logger.info(f"Hardware info: {hardware_info}") + loading_requests.sort(key=lambda x: x[1]) + logger.info(f"Sorted loading requests: {loading_requests}") + for ( + model_name, + idx, + request_time, + num_gpus, + allocation_result, + ) in loading_requests: + logger.info(f"Processing request for model {model_name}") + scheduling_options = await self.schedule( + model_name, + num_gpus, + worker_nodes, + model_info, + store_info, + hardware_info, + ) + # sort by latency + if scheduling_options: + scheduling_options.sort( + key=lambda x: (x.latency, x.node_id) + ) + logger.info( + f"Sorted scheduling options: {scheduling_options}" + ) + allocation_plan = scheduling_options[0] + if allocation_plan.migration_plans is not None: + # execute migration plans + for ( + migration_plan + ) in allocation_plan.migration_plans.plans: + source_instance = migration_plan.source_instance + target_model = source_instance.model_name + target_request_router = ray.get_actor( + target_model, namespace="models" + ) + logger.info( + f"Executing migration plan: {migration_plan}" + ) + target_node_id = migration_plan.target_node_id + logger.info( + f"Target node {target_node_id} for model {target_model}" + ) + worker_nodes[target_node_id]["free_gpu"] -= ( + num_gpus + ) + logger.info( + f"Free GPU on node {target_node_id}: {worker_nodes[target_node_id]['free_gpu']}" + ) + try: + target_instance_id = await target_request_router.execute_migration_plan.remote( + migration_plan + ) + except Exception as e: + logger.error( + f"Failed to execute migration plan: {e}" + ) + target_instance_id = None + if target_instance_id is None: + logger.info( + f"Failed to execute migration plan: {migration_plan}" + ) + worker_nodes[target_node_id][ + "free_gpu" + ] += num_gpus + else: + logger.info( + f"Migrated instance {target_model} to node {target_node_id} instance {target_instance_id}" + ) + + node_id = allocation_plan.node_id + async with self.queue_lock: + self.model_loading_queues[model_name].pop(idx) + logger.info( + f"Allocated node {node_id} for model {model_name}" + ) + allocation_result.set_result(node_id) + + worker_nodes[node_id]["free_gpu"] -= num_gpus + await self.store_manager.load_to_host.remote( + node_id, model_name + ) + else: + logger.info(f"No available node for model {model_name}") + await self._update_worker_nodes(worker_nodes) + + await asyncio.sleep(1) + + async def schedule( + self, + model_name, + num_gpus, + worker_nodes, + model_info, + store_info, + hardware_info, + ) -> List[AllocationPlan]: + scheduling_options = [] + logger.info(f"Checking model {model_name}") + for node_id, node_info in worker_nodes.items(): + logger.info(f"Checking node {node_id}, node info: {node_info}") + if node_id not in store_info: + logger.error(f"Node {node_id} not found in store info") + continue + free_gpu = node_info["free_gpu"] + logger.info(f"Node {node_id} has {free_gpu} free GPUs") + ( + node_store_info, + pinned_memory_pool, + node_waiting_time, + ) = store_info[node_id] + if model_name not in node_store_info: + logger.info(f"Model {model_name} not found in node {node_id}") + # Note(Yao): Downloading from HuggingFace Hub is + # slower than network bandwidth and difficult to estimate. + # So we just consider local checkpoints for now. + continue + latency = self._get_model_loading_time( + model_name, + model_info[model_name], + hardware_info[node_id], + node_waiting_time, + pinned_memory_pool, + ) + if free_gpu >= num_gpus: + scheduling_options.append(AllocationPlan(node_id, latency)) + elif self.enable_migration: + gpu_shortage = num_gpus - free_gpu + logger.info( + f"Node {node_id} does not have enough GPU, trying migration" + ) + migration_plans = await self.get_migration_plans( + model_name, + gpu_shortage, + node_id, + copy.deepcopy(worker_nodes), + copy.deepcopy(model_info), + copy.deepcopy(store_info), + copy.deepcopy(hardware_info), + ) + if migration_plans is not None: + scheduling_options.append( + AllocationPlan( + node_id=node_id, + latency=latency + migration_plans.total_latency, + migration_plans=migration_plans, + ) + ) + logger.info( + f"Migration plans for model {model_name}: {migration_plans}" + ) + else: + logger.info( + f"Node {node_id} does not have enough GPU and migration is disabled" + ) + return scheduling_options + + async def get_migration_plans( + self, + model_name: str, + gpu_shortage: int, + source_node_id: int, + worker_nodes: Mapping, + model_info: Mapping, + store_info: Mapping, + hardware_info: Mapping, + ) -> Optional[MigrationPlans]: + migratable_instances = [] + request_routers = {} + async with self.metadata_lock: + logger.info(f"Checking migratable instances for model {model_name}") + for target_model_name in self.model_instance: + # Skip the instances that is already running the model + if target_model_name == model_name: + continue + for instance_id, node_id in self.model_instance[ + target_model_name + ].items(): + if node_id == source_node_id: + logger.info( + f"Checking instance {instance_id} of model {target_model_name}" + ) + if target_model_name not in request_routers: + request_routers[target_model_name] = ray.get_actor( + target_model_name, namespace="models" + ) + logger.info( + f"Getting status for instance {instance_id} of model {target_model_name}" + ) + instance_status = await request_routers[ + target_model_name + ].get_instance_status.remote(instance_id) + if instance_status: + logger.info( + f"Instance {instance_id} status: {instance_status}" + ) + alpha = self.model_scheduler_config.get( + target_model_name, {} + ).get("alpha", 0.01) + beta = self.model_scheduler_config.get( + target_model_name, {} + ).get("beta", 0.1) + num_current_tokens = ( + instance_status.num_current_tokens + ) + resuming_latency = alpha * num_current_tokens + beta + instance_status.resuming_latency = resuming_latency + migratable_instances.append(instance_status) + + logger.info(f"Migratable instances: {migratable_instances}") + + if not migratable_instances: + return None + + try: + numInstances = len( + migratable_instances + ) # Number of instances currently running + gpu_shortage = int(gpu_shortage) + logger.info( + f"Number of instances: {numInstances}, Required GPUs: {gpu_shortage}" + ) + # Initialize the DP table with MigrationPlans objects + dp = [ + [MigrationPlans() for _ in range(gpu_shortage + 1)] + for _ in range(numInstances + 1) + ] + dp[0][0].total_latency = 0 + dp[0][0].store_info = copy.deepcopy(store_info) + logger.info(f"Number of instances: {numInstances}") + + # Iterate over all instances and GPU capacities + for i in range(1, numInstances + 1): + logger.info(f"Checking instance {i}") + for j in range(gpu_shortage + 1): + logger.info(f"Checking GPU capacity {j}") + current_instance = migratable_instances[i - 1] + # GPU requirement for the current instance + n_gpus = current_instance.num_gpu + logger.info(f"GPU requirement for instance {i}: {n_gpus}") + # Check if the current instance can fit into the current GPU capacity + if j >= n_gpus: + # Calculate total_latency when including the current instance + logger.info( + f"Instance {i} can fit into GPU capacity {j}" + ) + logger.info( + f"Store info: {dp[i - 1][j - n_gpus].store_info}" + ) + target_node_id, loading_time = ( + self._get_migration_target( + current_instance.model_name, + n_gpus, + source_node_id, + worker_nodes, + model_info, + copy.deepcopy(dp[i - 1][j - n_gpus].store_info), + hardware_info, + ) + ) + if not current_instance.resuming_latency: + logger.warn( + f"Resuming latency not found for instance {i}" + ) + current_instance.resuming_latency = 0 + migration_latency = ( + current_instance.resuming_latency + loading_time + ) + plan = MigrationPlan( + target_node_id=target_node_id, + source_instance=current_instance, + ) + total_latency = ( + migration_latency + + dp[i - 1][j - n_gpus].total_latency + ) + logger.info( + f"Total latency for instance {i} with {j} GPUs: {total_latency}" + ) + if total_latency < dp[i - 1][j].total_latency: + # Copy the previous plan and include the current instance + dp[i][j] = copy.deepcopy(dp[i - 1][j - n_gpus]) + dp[i][j].append(plan, total_latency) + dp[i][j].store_info[target_node_id][2] += ( + loading_time + ) + logger.info(f"Store info: {dp[i][j].store_info}") + else: + # Copy the previous plan without including the current instance + dp[i][j] = copy.deepcopy(dp[i - 1][j]) + else: + logger.info( + f"Instance {i} cannot fit into GPU capacity {j}" + ) + # If the instance cannot fit, carry forward the previous plan + dp[i][j] = copy.deepcopy(dp[i - 1][j]) + + # Return the optimal Migration plans + minLatency = float("inf") + optimal_plans = None + for plans in dp[numInstances]: + logger.info(f"Total latency: {plans.total_latency}") + if ( + plans.total_latency < minLatency + and plans.evictedGPUs >= gpu_shortage + ): + minLatency = plans.total_latency + optimal_plans = plans + logger.info(f"Migration plans: {optimal_plans}") + return optimal_plans + except Exception as e: + logger.error(f"Failed to get migration plans: {e}") + return None + + async def mark_resource( + self, model_name: str, instance_id: str, node_id: int + ) -> bool: + logger.info(f"Model {model_name} instance {instance_id} marked") + async with self.metadata_lock: + if model_name not in self.model_instance: + self.model_instance[model_name] = {} + self.model_instance[model_name][instance_id] = node_id + return True + + async def set_model_scheduler_config( + self, model_name: str, scheduler_config: Mapping + ) -> bool: + logger.info(f"Setting scheduler config for model {model_name}") + async with self.metadata_lock: + self.model_scheduler_config[model_name] = scheduler_config + return True + + def _get_model_loading_time( + self, + model_name: str, + model_size: int, + hardware_info: Mapping, + node_waiting_time: float, + pinned_memory_pool: Mapping, + ) -> float: + latency = 0 + if model_name not in pinned_memory_pool: + latency += ( + node_waiting_time + model_size / hardware_info["disk_bandwidth"] + ) + logger.info( + f"Loading model {model_name} will take {latency} seconds" + ) + else: + latency += model_size / hardware_info["pcie_bandwidth"] + logger.info( + f"Loading model {model_name} will take {latency} seconds" + ) + return latency + + def _get_migration_target( + self, + model_name: str, + num_gpu: int, + source_node_id: int, + worker_nodes: Mapping, + model_info: Mapping, + store_info: Mapping, + hardware_info: Mapping, + ) -> Optional[Tuple[int, float]]: + candidate_plans = [] + for node_id, node_info in worker_nodes.items(): + if node_id == source_node_id: + continue + if node_info["free_gpu"] >= num_gpu: + loading_time = self._get_model_loading_time( + model_name, + model_info[model_name], + hardware_info[node_id], + store_info[node_id][2], + store_info[node_id][1], + ) + candidate_plans.append((node_id, loading_time)) + if not candidate_plans: + return None + candidate_plans.sort(key=lambda x: x[1]) + # return the node with the shortest loading time + return candidate_plans[0] diff --git a/sllm/serve/store_manager.py b/sllm/serve/store_manager.py new file mode 100644 index 0000000..275dfda --- /dev/null +++ b/sllm/serve/store_manager.py @@ -0,0 +1,546 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # + +import asyncio +import os +import time +from typing import List, Mapping, Optional + +import ray + +from sllm.serve.hardware_info_collector import collect_all_info +from sllm.serve.logger import init_logger +from sllm.serve.model_downloader import ( + VllmModelDownloader, + download_lora_adapter, + download_transformers_model, +) +from sllm.serve.utils import get_worker_nodes +from sllm_store.client import SllmStoreClient + +logger = init_logger(__name__) + + +class SllmLocalStore: + def __init__( + self, + node_id: str, + client: SllmStoreClient, + mem_pool_size: int, + chunk_size: int, + hardware_info: Mapping, + ): + self.node_id = node_id + self.client = client + self.hardware_info = hardware_info + self.disk_models = {} + self.queued_models = {} + + self.pinned_memory_pool = {} + self.chunk_size = chunk_size + self.pinned_memory_pool_chunks = mem_pool_size // chunk_size + self.pinned_memory_pool_usage = 0 + + self.io_queue = [] + self.lock = asyncio.Lock() + + # Start loading loop + self.loader = asyncio.create_task(self.loading_loop()) + + logger.info( + f"Initialized local store for node {self.node_id}" + f" with {self.pinned_memory_pool_chunks} chunks" + f" (chunk size: {chunk_size})" + ) + + async def register_model( + self, model_name: str, backend: str, backend_config + ): + async with self.lock: + if model_name in self.disk_models: + logger.error(f"{model_name} already registered") + return + model_path = self._get_model_path(model_name, backend) + if backend == "transformers": + model_size = self.client.register_model(model_path) + self.disk_models[model_name] = ([model_path], model_size) + elif backend == "vllm": + tensor_parallel_size = backend_config.get( + "tensor_parallel_size", 1 + ) + model_size = 0 + model_path_list = [] + for rank in range(tensor_parallel_size): + model_rank_path = os.path.join(model_path, f"rank_{rank}") + model_size += self.client.register_model(model_rank_path) + model_path_list.append(model_rank_path) + self.disk_models[model_name] = (model_path_list, model_size) + logger.info(f"{model_name} registered, {self.disk_models}") + + return model_size + + async def get_store_info(self): + async with self.lock: + delta_time = 0 + if len(self.io_queue) > 0: + delta_time = self.io_queue[-1]["estimated_time"] - time.time() + if delta_time < 0: + delta_time = 0 + return [self.disk_models, self.pinned_memory_pool, delta_time] + + async def load_to_host(self, model_name: str) -> bool: + async with self.lock: + if model_name not in self.disk_models: + logger.error(f"{model_name} not found on node {self.node_id}") + return False + if model_name in self.pinned_memory_pool: + logger.info( + f"{model_name} already loaded to node {self.node_id}" + ) + return True + elif model_name in self.queued_models: + logger.info( + f"{model_name} is being loaded to node {self.node_id}" + ) + return True + + _, model_size = self.disk_models[model_name] + start_time = time.time() + if len(self.io_queue) > 0: + start_time = max( + self.io_queue[-1]["estimated_time"], start_time + ) + disk_bandwidth = self.hardware_info.get("disk_bandwidth", 1) + estimated_completion_time = start_time + model_size / disk_bandwidth + self.io_queue.append( + { + "model_name": model_name, + "estimated_time": estimated_completion_time, + } + ) + self.queued_models[model_name] = True + logger.info( + f"{model_name} is being loaded to node {self.node_id}," + " estimated completion time: " + f"{self._format_time(estimated_completion_time)}" + ) + return True + + async def loading_loop(self): + while True: + async with self.lock: + if len(self.io_queue) == 0: + await asyncio.sleep(1) + continue + model_info = self.io_queue[0] + logger.info( + f"Loading {model_info['model_name']} to node {self.node_id}" + ) + + model_name = model_info["model_name"] + model_path_list, model_size = self.disk_models[model_name] + can_load = await self._lru_eviction(model_size) + if not can_load: + logger.warning( + f"{model_name} cannot be loaded to node {self.node_id}" + ) + await asyncio.sleep(1) + continue + logger.info(f"Loading {model_name} to node {self.node_id}") + ret = 1 + for model_path in model_path_list: + ret = ret and self.client.load_into_cpu(model_path) + self.io_queue.pop(0) + self.queued_models.pop(model_name) + if not ret: + logger.error(f"Failed to load {model_name}") + continue + self.pinned_memory_pool[model_name] = time.time() + self.pinned_memory_pool_usage += ( + model_size + self.chunk_size - 1 + ) // self.chunk_size + logger.info(f"{model_name} loaded to host") + + async def _lru_eviction(self, model_size): + # evict the least recently used models until the model can be loaded + async with self.lock: + sorted_models = sorted( + self.pinned_memory_pool.items(), key=lambda x: x[1] + ) + logger.info(f"Sorted models: {sorted_models}") + required_chunks = ( + model_size + self.chunk_size - 1 + ) // self.chunk_size + logger.info( + f"Pinned memory pool usage: {self.pinned_memory_pool_usage} / {self.pinned_memory_pool_chunks}" + f" requires {required_chunks} chunks" + ) + while ( + self.pinned_memory_pool_usage + required_chunks + > self.pinned_memory_pool_chunks + and len(sorted_models) > 0 + ): + model_name, _ = sorted_models.pop(0) + if model_name not in self.queued_models: + model_path_list, _ = self.disk_models[model_name] + for model_path in model_path_list: + self.client.unload_from_cpu(model_path) + self.pinned_memory_pool.pop(model_name) + unloaded_chunks = ( + self.disk_models[model_name][1] + self.chunk_size - 1 + ) // self.chunk_size + self.pinned_memory_pool_usage -= unloaded_chunks + logger.info( + f"{model_name} evicted {unloaded_chunks} chunks" + ) + return ( + self.pinned_memory_pool_usage + required_chunks + <= self.pinned_memory_pool_chunks + ) + + def _get_model_path(self, model_name, backend): + return os.path.join(backend, model_name) + + def _format_time(self, t): + return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime(t)) + + +# @ray.remote(num_cpus=1, resources={"control_node": 0.1}) +class StoreManager: + def __init__(self): + logger.info("Initializing store manager") + self.hardware_info = {} + + self.metadata_lock = asyncio.Lock() + # Storage info + self.round_robin_index = 0 + self.local_servers = {} + self.model_info = {} + self.model_storage_info = {} + + async def initialize_cluster(self) -> bool: + logger.info("Initializing cluster and collecting hardware info") + + # Get worker nodes + worker_node_info = get_worker_nodes() + if not worker_node_info: + logger.error("No worker nodes found") + return False + + # Initialize hardware_info dictionary + self.hardware_info = {} + # Collect hardware info from each node + hardware_info_futures = { + node_id: collect_all_info.options( + resources={f"worker_id_{node_id}": 0.01} + ).remote() + for node_id in worker_node_info + } + + # Gather hardware info + for node_id, future in hardware_info_futures.items(): + try: + hardware_info = await future + self.hardware_info[node_id] = hardware_info + logger.info(f"Hardware info collected for node {node_id}") + except Exception as e: + logger.error( + f"Failed to collect hardware info from node {node_id}: {e}" + ) + continue + + uninitialized_nodes = list(self.hardware_info.keys()) + + while len(uninitialized_nodes) > 0: + for node_id in uninitialized_nodes: + if node_id in worker_node_info: + node_address = worker_node_info[node_id]["address"] + try: + sllm_store_client = SllmStoreClient( + f"{node_address}:8073" + ) + local_server_config = ( + sllm_store_client.get_server_config() + ) + except Exception as e: + logger.warning( + f"Failed to connect to node {node_id}: {e}" + ) + continue + else: + if not local_server_config: + logger.warning( + f"Failed to get server config for node {node_id}" # noqa: E501 + ) + continue + if "chunk_size" not in local_server_config: + logger.error( + f"Chunk size not found in server config for node {node_id}" # noqa: E501 + ) + chunk_size = local_server_config["chunk_size"] + if "mem_pool_size" not in local_server_config: + logger.error( + f"Memory pool size not found in server config for node {node_id}" + ) + mem_pool_size = local_server_config["mem_pool_size"] + self.local_servers[node_id] = SllmLocalStore( + node_id, + sllm_store_client, + mem_pool_size, + chunk_size, + self.hardware_info[node_id], + ) + uninitialized_nodes.remove(node_id) + logger.info( + f"Node {node_id} initialized, chunk size: {chunk_size}" # noqa: E501 + ) + break + logger.info( + f"Waiting for nodes {uninitialized_nodes} to be initialized" # noqa: E501 + ) + await asyncio.sleep(1) + + return True + + async def get_hardware_info(self): + return self.hardware_info + + async def get_model_info(self, model_name: Optional[str] = None): + logger.info(f"Getting info for {model_name}") + async with self.metadata_lock: + if model_name is not None: + return self.model_info.get(model_name, {}) + else: + return self.model_info + + async def get_store_info(self, node_id: Optional[str] = None): + async with self.metadata_lock: + if node_id is not None: + if node_id not in self.local_servers: + logger.error(f"Node {node_id} not found") + return {} + return await self.local_servers[node_id].get_store_info() + else: + node_info = {} + for node_id in self.local_servers: + node_info[node_id] = await self.local_servers[ + node_id + ].get_store_info() + return node_info + + async def load_to_host(self, node_id: str, model_name: str) -> bool: + async with self.metadata_lock: + if node_id not in self.local_servers: + logger.error(f"Node {node_id} not found") + return False + local_server = self.local_servers[node_id] + logger.info(f"Loading {model_name} to node {node_id}") + return await local_server.load_to_host(model_name) + + async def register(self, model_config): + model_name = model_config.get("model") + backend = model_config.get("backend", None) + if backend is None: + logger.error(f"Backend not specified for {model_name}") + return + backend_config = model_config.get("backend_config", {}) + placement_config = model_config.get("placement_config", {}) + if model_name not in self.model_info: + self.model_storage_info[model_name] = {} + logger.info(f"Registering new {model_name}") + + backend = model_config.get("backend", None) + pretrained_model_name_or_path = backend_config.get( + "pretrained_model_name_or_path", None + ) + # 1. download this model to one worker using round-robin + worker_node_info = get_worker_nodes() + + n_nodes = len(worker_node_info) + assert n_nodes > 0, "No worker nodes found" + + for node_id, node_info in worker_node_info.items(): + node_address = node_info["address"] + if node_id not in self.local_servers: + if self.local_servers: + first_node = next(iter(self.local_servers.values())) + self.local_servers[node_id] = SllmLocalStore( + node_id, + SllmStoreClient(f"{node_address}:8073"), + 1, + first_node.chunk_size, + first_node.hardware_info, + ) + else: + logger.error(f"Node {node_id} not found") + raise ValueError(f"Node {node_id} not found") + + local_disk = [] + if placement_config and "local_disk" in placement_config: + local_disk = placement_config["local_disk"] + if not all( + [node_id in worker_node_info for node_id in local_disk] + ): + logger.error( + f"Invalid target nodes {local_disk}, worker nodes: {worker_node_info}" # noqa: E501 + ) + return + else: + # round-robin + node_id = list(worker_node_info.keys())[ + self.round_robin_index % n_nodes + ] + self.round_robin_index += 1 + local_disk = [node_id] + + memory_pool = [] + if placement_config and "memory_pool" in placement_config: + memory_pool = placement_config["memory_pool"] + if not all( + [node_id in worker_node_info for node_id in memory_pool] + ): + logger.error( + f"Invalid target nodes {memory_pool}, worker nodes: {worker_node_info}" # noqa: E501 + ) + return + + logger.info( + f"Downloading model {pretrained_model_name_or_path} to nodes {local_disk}" # noqa: E501 + ) + for node_id in local_disk: + if backend == "transformers": + hf_model_class = backend_config.get("hf_model_class", None) + torch_dtype = backend_config.get("torch_dtype", "float16") + if hf_model_class is None: + logger.error( + "hf_model_type not specified in backend_config." + ) + break + await self.download_transformers_model( + model_name, + pretrained_model_name_or_path, + node_id, + hf_model_class, + torch_dtype, + ) + elif backend == "vllm": + await self.download_vllm_model( + model_name, + pretrained_model_name_or_path, + node_id, + model_config.get("num_gpus", 1), + backend_config.get("tensor_parallel_size", 1), + backend_config.get("torch_dtype", "float16"), + ) + else: + logger.error(f"Backend {backend} not supported") + break + local_server = self.local_servers[node_id] + model_size = await local_server.register_model( + model_name, backend, backend_config + ) + # record the storage info + self.model_storage_info[model_name][node_id] = True + logger.info(f"{model_name} downloaded to node {node_id}") + if node_id in memory_pool: + # preload to memory pool + await self.load_to_host( + node_id, pretrained_model_name_or_path + ) + logger.info(f"{model_name} loaded to memory pool") + self.model_info[model_name] = model_size + logger.info(f"{model_name} registered") + else: + # TODO: apply new placement config, if given + pass + + async def register_lora_adapter( + self, + base_model_name, + adapter_name, + adapter_path, + backend_config, + ) -> int: + if base_model_name not in self.model_storage_info: + logger.error( + f"Base model {base_model_name} not found in storage info" + ) + return -1 + + # Get the first node_id where the model is stored + node_id = next(iter(self.model_storage_info[base_model_name].keys())) + + hf_model_class = backend_config.get("hf_model_class", None) + torch_dtype = backend_config.get("torch_dtype", "float16") + logger.info(f"Downloading {adapter_path} to {node_id}") + return await download_lora_adapter.options( + resources={"worker_node": 0.1, f"worker_id_{node_id}": 0.1} + ).remote( + base_model_name, + adapter_name, + adapter_path, + hf_model_class, + torch_dtype, + ) + + async def download_transformers_model( + self, + model_name, + pretrained_model_name_or_path, + node_id, + hf_model_class, + torch_dtype, + ) -> int: + logger.info( + f"Downloading {pretrained_model_name_or_path} to node {node_id}" + ) + return await download_transformers_model.options( + resources={"worker_node": 0.1, f"worker_id_{node_id}": 0.1} + ).remote( + model_name, + pretrained_model_name_or_path, + torch_dtype, + hf_model_class, + ) + + async def download_vllm_model( + self, + model_name, + pretrained_model_name_or_path, + node_id, + num_gpus, + tensor_parallel_size, + torch_dtype, + ): + logger.info( + f"Downloading {pretrained_model_name_or_path} to node {node_id}" + ) + vllm_backend_downloader = ( + ray.remote(VllmModelDownloader) + .options( + num_gpus=num_gpus, + resources={"worker_node": 0.1, f"worker_id_{node_id}": 0.1}, + ) + .remote() + ) + return await vllm_backend_downloader.download_vllm_model.remote( + model_name, + pretrained_model_name_or_path, + torch_dtype, + tensor_parallel_size, + ) diff --git a/sllm/serve/utils.py b/sllm/serve/utils.py new file mode 100644 index 0000000..6d5e48d --- /dev/null +++ b/sllm/serve/utils.py @@ -0,0 +1,101 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import asyncio +from dataclasses import dataclass +from typing import List, Optional + +import ray + + +def get_worker_nodes(): + ray_nodes = ray.nodes() + worker_node_info = {} + for node in ray_nodes: + ray_node_id = node.get("NodeID", None) + assert ray_node_id is not None, "NodeID not found" + resources = node.get("Resources", {}) + assert resources != {}, "Resources not found" + node_address = node.get("NodeManagerAddress", None) + assert ( + node_address is not None and node_address != "" + ), "NodeManagerAddress not found" + if resources.get("control_node", 0) > 0: + continue # Skip the control node + + for key, value in resources.items(): + if key.startswith("worker_id_"): + node_id = key.split("_")[-1] + worker_node_info[node_id] = { + "ray_node_id": ray_node_id, + "address": node_address, + "free_gpu": resources.get("GPU", 0), + "total_gpu": resources.get("GPU", 0), + } + + return worker_node_info + + +@dataclass +class InstanceStatus: + instance_id: str + node_id: str + num_gpu: int + concurrency: int + + model_name: Optional[str] = None + num_current_tokens: Optional[int] = None + resuming_latency: Optional[float] = None + + +@dataclass +class InstanceHandle: + instance_id: str + max_queue_length: int + num_gpu: int + + node_id: Optional[str] = None + backend_instance: Optional[ray.actor.ActorHandle] = None + ready: bool = False + concurrency: int = 0 + + lock: asyncio.Lock = asyncio.Lock() + + async def add_requests(self, num_requests: int = 1): + async with self.lock: + if not self.ready: + return False + if ( + self.concurrency + num_requests > self.max_queue_length + or self.concurrency + num_requests < 0 + ): + return False + self.concurrency += num_requests + return True + + async def check_request_queue(self): + async with self.lock: + return self.concurrency + 1 <= self.max_queue_length + + async def get_status(self): + async with self.lock: + return InstanceStatus( + self.instance_id, + self.node_id, + self.num_gpu, + self.concurrency, + ) diff --git a/sllm_store/.DS_Store b/sllm_store/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..0bd77c9a95f79de96c7a0e569f785abcaea47c22 GIT binary patch literal 6148 zcmeHKJxc>Y5S`ToLqtdu5EQx2)_|>WhS&?Sv(S8Dz#JFyA$DG!%Aa5%_&aQj_$x%T zv#_=E&F*^HO*WL^@?qzfV1CSi6U~xi#m^+Aj~qJ6$`?jp9jV*SuAC>6+{2s705!?})n8 z!MJbLrybr8XJSkq#kW)gN8E(ZPjMD6N|;v`e0mhqfMT1`%9A~7a=Cv`xfuDTD((oo zKA!`W$J6NG6VVAqU;#Gv$`GTCd2uGE*X`tcjX1AqvRf2u@f6R@GYf8bYUrn)+~e4u zH94)-(zRpcn@rphc73hWMXFO5>u7*=+_sh-+KkT0$zbs0p1@1G{#V4qEK!f=;SK^Fax(VjOE@44A=n-H6{w-feDog zRH;J0VhEKEf1u++jfp~)PC{13b#!H+-%y0C4u2rSNrVc0?-lS0*a|GGuLVB;59YuB z+e!YLSHLUquM`lOO0`nPE$Op$=H~dU4bV=}*f=gxC{xhs<5&*(C|*aChPi+Tz))kN S5FVKSBOqn)omb#j75D-V)A9lU literal 0 HcmV?d00001 diff --git a/sllm_store/.gitignore b/sllm_store/.gitignore new file mode 100644 index 0000000..6ddd5e6 --- /dev/null +++ b/sllm_store/.gitignore @@ -0,0 +1,166 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +.idea/ + +# Ruff cache +.ruff_cache/ + +# CMake +build/ \ No newline at end of file diff --git a/sllm_store/CMakeLists.txt b/sllm_store/CMakeLists.txt new file mode 100644 index 0000000..65eb0f0 --- /dev/null +++ b/sllm_store/CMakeLists.txt @@ -0,0 +1,210 @@ +cmake_minimum_required(VERSION 3.20) + +# Set the project name +project(storage LANGUAGES CXX) + +# Set c++ 17 +set(CMAKE_CXX_STANDARD 17) + +option(BUILD_SLLM_TESTS "Build tests" OFF) +# Disable other tests +set(BUILD_TESTING OFF) + +include(FetchContent) +FetchContent_Declare( + glog + GIT_REPOSITORY https://github.com/google/glog.git + GIT_TAG v0.6.0 +) +FetchContent_Declare( + googletest + GIT_REPOSITORY https://github.com/google/googletest.git + GIT_TAG v1.13.0 +) +set(FETCHCONTENT_QUIET OFF) + +FetchContent_MakeAvailable(glog) +FetchContent_MakeAvailable(googletest) + +find_package(CUDAToolkit QUIET) +find_package(HIP QUIET) + +# set CUDA or HIP +if (CUDAToolkit_FOUND) + message(STATUS "CUDA found") + set(CUDA_SUPPORTED_ARCHS "7.0;7.5;8.0;8.6;8.9;9.0") + set(SLLM_STORE_GPU_LANG "CUDA") + enable_language(CUDA) +elseif (HIP_FOUND) + message(STATUS "HIP found") + set(HIP_SUPPORTED_ARCHS "gfx906;gfx908;gfx90a;gfx940;gfx941;gfx942;gfx1030;gfx1100") + set(SLLM_STORE_GPU_LANG "HIP") + enable_language(HIP) +else() + message(FATAL_ERROR "Neither CUDA nor HIP found") +endif() + + +# Adapted from https://github.com/vllm-project/vllm/blob/a1242324c99ff8b1e29981006dfb504da198c7c3/CMakeLists.txt +include(${CMAKE_CURRENT_LIST_DIR}/cmake/utils.cmake) + +# +# Supported python versions. These versions will be searched in order, the +# first match will be selected. These should be kept in sync with setup.py. +# +set(PYTHON_SUPPORTED_VERSIONS "3.9" "3.10" "3.11" "3.12") + +# +# Try to find python package with an executable that exactly matches +# `SLLM_STORE_PYTHON_EXECUTABLE` and is one of the supported versions. +# +if (SLLM_STORE_PYTHON_EXECUTABLE) + find_python_from_executable(${SLLM_STORE_PYTHON_EXECUTABLE} "${PYTHON_SUPPORTED_VERSIONS}") +else() + message(FATAL_ERROR + "Please set SLLM_STORE_PYTHON_EXECUTABLE to the path of the desired python version" + " before running cmake configure.") +endif() + +# +# Update cmake's `CMAKE_PREFIX_PATH` with torch location. +# +append_cmake_prefix_path("torch" "torch.utils.cmake_prefix_path") + +# +# Import torch cmake configuration. +# Torch also imports CUDA (and partially HIP) languages with some customizations, +# so there is no need to do this explicitly with check_language/enable_language, +# etc. +# +find_package(Torch REQUIRED) + +# +# Normally `torch.utils.cpp_extension.CUDAExtension` would add +# `libtorch_python.so` for linking against an extension. Torch's cmake +# configuration does not include this library (presumably since the cmake +# config is used for standalone C++ binaries that link against torch). +# The `libtorch_python.so` library defines some of the glue code between +# torch/python via pybind and is required by SLLM_STORE extensions for this +# reason. So, add it by manually with `find_library` using torch's +# installed library path. +# +find_library(torch_python_LIBRARY torch_python PATHS + "${TORCH_INSTALL_PREFIX}/lib") + +# +# Override the GPU architectures detected by cmake/torch and filter them by +# the supported versions for the current language. +# The final set of arches is stored in `SLLM_STORE_GPU_ARCHES`. +# +override_gpu_arches(SLLM_STORE_GPU_ARCHES +${SLLM_STORE_GPU_LANG} +"${${SLLM_STORE_GPU_LANG}_SUPPORTED_ARCHS}") + +# +# Query torch for additional GPU compilation flags for the given +# `SLLM_STORE_GPU_LANG`. +# The final set of arches is stored in `SLLM_STORE_GPU_FLAGS`. +# +get_torch_gpu_compiler_flags(SLLM_STORE_GPU_FLAGS ${SLLM_STORE_GPU_LANG}) + +# +# Define extension targets +# + +# +# _C extension +# + +# +# Define source files used in SLLM_STORE_EXT +# + +set(SLLM_STORE_EXT_SRC + "csrc/checkpoint/aligned_buffer.cpp" + "csrc/checkpoint/checkpoint.cpp" + "csrc/checkpoint/checkpoint_py.cpp" + "csrc/checkpoint/tensor_writer.cpp" +) + +# +# NOTE: The following (pure CXX) source files will be excluded from the input +# of the hipify tool. This is a temporary solution to avoid the recursive +# inclusion of the hipify tool (#206). +# +# NOTE: If you are making changes to this section or adding new source files, +# please make sure to update the list of excluded files here. +# + +set(SLLM_STORE_CXX_EXT_SRC + "csrc/checkpoint/aligned_buffer.cpp" + "csrc/checkpoint/checkpoint_py.cpp" + "csrc/checkpoint/tensor_writer.cpp" +) + +define_gpu_extension_target( + _C + DESTINATION sllm_store + LANGUAGE ${SLLM_STORE_GPU_LANG} + SOURCES ${SLLM_STORE_EXT_SRC} + CXX_SRCS ${SLLM_STORE_CXX_EXT_SRC} + COMPILE_FLAGS ${SLLM_STORE_GPU_FLAGS} + ARCHITECTURES ${SLLM_STORE_GPU_ARCHES} + WITH_SOABI) + +# +# _checkpoint_store extension +# + +# pthread +find_package(Threads REQUIRED) + +# +# Define source files used in CHECKPOINT_STORE +# + +set(CHECKPOINT_STORE_SOURCES + "csrc/sllm_store/binary_utils.cpp" + "csrc/sllm_store/checkpoint_store.cpp" + "csrc/sllm_store/checkpoint_store_py.cpp" + "csrc/sllm_store/cuda_memory.cpp" + "csrc/sllm_store/cuda_memory_pool.cpp" + "csrc/sllm_store/gpu_replica.cpp" + "csrc/sllm_store/memory_state.cpp" + "csrc/sllm_store/model.cpp" + "csrc/sllm_store/pinned_memory.cpp" + "csrc/sllm_store/pinned_memory_pool.cpp" +) + +# +# Define pure CXX files used in CHECKPOINT_STORE (files without CUDA code) +# Used for hipify tool to only convert CUDA code +# + +set(CHECKPOINT_STORE_CXX_SOURCES + "csrc/sllm_store/binary_utils.cpp" + "csrc/sllm_store/memory_state.cpp" + "csrc/sllm_store/pinned_memory.cpp" +) + +set(CHECKPOINT_STORE_LIBRARIES + Threads::Threads + glog::glog) + +define_gpu_extension_target( + _checkpoint_store + DESTINATION sllm_store + LANGUAGE ${SLLM_STORE_GPU_LANG} + SOURCES ${CHECKPOINT_STORE_SOURCES} + CXX_SRCS ${CHECKPOINT_STORE_CXX_SOURCES} + COMPILE_FLAGS ${SLLM_STORE_GPU_FLAGS} + ARCHITECTURES ${SLLM_STORE_GPU_ARCHES} + LIBRARIES ${CHECKPOINT_STORE_LIBRARIES} + WITH_SOABI) + +# Enable testing if the option is ON +if(BUILD_SLLM_TESTS) + enable_testing() + + add_subdirectory(tests/cpp) +endif() \ No newline at end of file diff --git a/sllm_store/Dockerfile.builder b/sllm_store/Dockerfile.builder new file mode 100644 index 0000000..f5bdfcf --- /dev/null +++ b/sllm_store/Dockerfile.builder @@ -0,0 +1,60 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # + +# Adapted from https://github.com/vllm-project/vllm/blob/23c1b10a4c8cd77c5b13afa9242d67ffd055296b/Dockerfile +ARG CUDA_VERSION=12.1.1 +#################### BASE BUILD IMAGE #################### +# prepare basic build environment +FROM nvidia/cuda:${CUDA_VERSION}-devel-ubuntu20.04 AS builder +ARG CUDA_VERSION=12.1.1 +ARG PYTHON_VERSION=3.10 +ARG TARGETPLATFORM +ENV DEBIAN_FRONTEND=noninteractive + +# Install Python and other dependencies +RUN echo 'tzdata tzdata/Areas select America' | debconf-set-selections \ + && echo 'tzdata tzdata/Zones/America select Los_Angeles' | debconf-set-selections \ + && apt-get update -y \ + && apt-get install -y ccache software-properties-common git curl sudo \ + && add-apt-repository ppa:deadsnakes/ppa \ + && apt-get update -y \ + && apt-get install -y python${PYTHON_VERSION} python${PYTHON_VERSION}-dev python${PYTHON_VERSION}-venv \ + && update-alternatives --install /usr/bin/python3 python3 /usr/bin/python${PYTHON_VERSION} 1 \ + && update-alternatives --set python3 /usr/bin/python${PYTHON_VERSION} \ + && ln -sf /usr/bin/python${PYTHON_VERSION}-config /usr/bin/python3-config \ + && curl -sS https://bootstrap.pypa.io/get-pip.py | python${PYTHON_VERSION} \ + && python3 --version && python3 -m pip --version + +WORKDIR /app + +COPY requirements-build.txt . +RUN python3 -m pip install --no-cache-dir -r requirements-build.txt + +# Add the rest of the source code +COPY cmake ./cmake +COPY CMakeLists.txt . +COPY csrc ./csrc +COPY sllm_store ./sllm_store +COPY setup.py . +COPY pyproject.toml . +COPY MANIFEST.in . +COPY requirements.txt . +COPY README.md . +COPY proto ./proto + +# ENTRYPOINT [ "/bin/bash", "-c" ] \ No newline at end of file diff --git a/sllm_store/Dockerfile.rocm b/sllm_store/Dockerfile.rocm new file mode 100644 index 0000000..094ef43 --- /dev/null +++ b/sllm_store/Dockerfile.rocm @@ -0,0 +1,108 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # + +ARG BASE_IMAGE="rocm/vllm-dev:base_ROCm-6.3.1_20250528_tuned_20250530" +ARG PYTORCH_ROCM_ARCH="gfx908;gfx90a;gfx942;gfx1100" + +# vLLM branch version +ARG VLLM_BRANCH="v0.9.0.1" + + +# Base image build stage +FROM ${BASE_IMAGE} AS base +ENV DEBIAN_FRONTEND=noninteractive + +RUN apt-get purge -y sccache; python3 -m pip uninstall -y sccache; rm -f "$(which sccache)" + +# Set environment variables for LLVM and paths +ENV LLVM_SYMBOLIZER_PATH=/opt/rocm/llvm/bin/llvm-symbolizer +ENV PATH=$PATH:/opt/rocm/bin:/libtorch/bin +ENV LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/rocm/lib/:/libtorch/lib +ENV CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/libtorch/include:/libtorch/include/torch/csrc/api/include/:/opt/rocm/include/ + +ENV PYTORCH_ROCM_ARCH=${PYTORCH_ROCM_ARCH} + +WORKDIR /app + +### sllm-store wheel build stage +FROM base AS builder +# Add project files +COPY cmake ./cmake +COPY CMakeLists.txt . +COPY csrc ./csrc +COPY sllm_store ./sllm_store +COPY setup.py . +COPY pyproject.toml . +COPY MANIFEST.in . +COPY requirements.txt . +COPY README.md . +COPY proto ./proto + +# Set up the environment using the existing torch version +COPY requirements-build.txt . +COPY using_existing_torch.py . +RUN python3 using_existing_torch.py +RUN python3 -m pip install -r requirements-build.txt + +RUN python3 setup.py sdist bdist_wheel + +### vLLM build stage +FROM base AS build_vllm +ARG VLLM_BRANCH + +WORKDIR /app/third_party + +RUN pip install /opt/rocm/share/amd_smi + +RUN if ls libs/*.whl; then \ + python3 -m pip install libs/*.whl; fi + +RUN git clone https://github.com/vllm-project/vllm.git \ + && cd vllm \ + && git checkout "${VLLM_BRANCH}" \ + && pip install --upgrade numba scipy \ + && pip install huggingface-hub[cli,hf_transfer] \ + && pip install --upgrade setuptools \ + && pip install setuptools_scm \ + && pip install "numpy<2" \ + && pip install -r requirements/rocm.txt + +RUN cd vllm && python3 setup.py clean --all && python3 setup.py develop + +COPY vllm_patch vllm_patch +RUN vllm_patch/patch.sh + +### Final image build stage +FROM build_vllm +WORKDIR /app + +# Copy the built wheels from the builder stage +COPY --from=builder /app/dist /app/dist +COPY --from=builder /app/requirements.txt /app/requirements.txt + +# Install the built wheels +RUN python3 -m pip install /app/dist/*.whl + +# Copy example files +COPY examples /app/examples + +# Set storage path env +ENV STORAGE_PATH=/models + +ENTRYPOINT [ "sllm-store", "start" ] +CMD [ "--storage-path", "/models", "--mem-pool-size", "4GB" ] diff --git a/sllm_store/MANIFEST.in b/sllm_store/MANIFEST.in new file mode 100644 index 0000000..af17fd4 --- /dev/null +++ b/sllm_store/MANIFEST.in @@ -0,0 +1,6 @@ +recursive-include csrc *.cpp *.h *.cc +include requirements.txt +include CMakeLists.txt +include cmake/utils.cmake +include proto/storage.proto +include python/proto/storage.proto \ No newline at end of file diff --git a/sllm_store/README.md b/sllm_store/README.md new file mode 100644 index 0000000..f268f94 --- /dev/null +++ b/sllm_store/README.md @@ -0,0 +1,31 @@ +# ServerlessLLM Store (`sllm-store`) + +## About + +`sllm-store` is an internal library of ServerlessLLM that provides high-performance model loading from local storage into GPU memory. It can also be installed and used independently in other projects. For more details, see our [quick start guide](https://serverlessllm.github.io/docs/stable/store/quickstart). For support for ROCm, see our [ROCm guide](https://serverlessllm.github.io/docs/stable/store/rocm_quickstart). + +## Installation + +### Install with pip + +```bash +pip install serverless-llm-store +``` + +### Install from source +1. Clone the repository and navigate to the `store` directory: + +``` bash +git clone https://github.com/ServerlessLLM/ServerlessLLM.git +cd ServerlessLLM/sllm_store +``` + +2. Install the package from source + +```bash +rm -rf build +pip install . +``` + +## Usage +Refer to our [quick start guide](https://serverlessllm.github.io/docs/stable/store/quickstart) for detailed usage instructions. diff --git a/sllm_store/cmake/hipify.py b/sllm_store/cmake/hipify.py new file mode 100755 index 0000000..cdd79d1 --- /dev/null +++ b/sllm_store/cmake/hipify.py @@ -0,0 +1,78 @@ +#!/usr/bin/env python3 + +# +# A command line tool for running pytorch's hipify preprocessor on CUDA +# source files. +# +# See https://github.com/ROCm/hipify_torch +# and /utils/hipify/hipify_python.py +# + +import argparse +import os +import shutil + +from torch.utils.hipify.hipify_python import hipify + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + + # Project directory where all the source + include files live. + parser.add_argument( + "-p", + "--project_dir", + help="The project directory.", + ) + + # Directory where hipified files are written. + parser.add_argument( + "-o", + "--output_dir", + help="The output directory.", + ) + + # Source files to convert. + parser.add_argument( + "sources", help="Source files to hipify.", nargs="*", default=[] + ) + + args = parser.parse_args() + + # Limit include scope to project_dir only + includes = [os.path.join(args.project_dir, "*")] + + # Get absolute path for all source files. + extra_files = [os.path.abspath(s) for s in args.sources] + + # Copy sources from project directory to output directory. + # The directory might already exist to hold object files so we ignore that. + shutil.copytree(args.project_dir, args.output_dir, dirs_exist_ok=True) + + hipify_result = hipify( + project_directory=args.project_dir, + output_directory=args.output_dir, + header_include_dirs=[], + includes=includes, + extra_files=extra_files, + show_detailed=True, + is_pytorch_extension=True, + hipify_extra_files_only=True, + ) + + hipified_sources = [] + for source in args.sources: + s_abs = os.path.abspath(source) + hipified_s_abs = ( + hipify_result[s_abs].hipified_path + if ( + s_abs in hipify_result + and hipify_result[s_abs].hipified_path is not None + ) + else s_abs + ) + hipified_sources.append(hipified_s_abs) + + assert len(hipified_sources) == len(args.sources) + + # Print hipified source files. + print("\n".join(hipified_sources)) diff --git a/sllm_store/cmake/utils.cmake b/sllm_store/cmake/utils.cmake new file mode 100644 index 0000000..2fac3d2 --- /dev/null +++ b/sllm_store/cmake/utils.cmake @@ -0,0 +1,367 @@ +# Adapted from https://github.com/vllm-project/vllm/blob/a1242324c99ff8b1e29981006dfb504da198c7c3/cmake/utils.cmake +# +# Attempt to find the python package that uses the same python executable as +# `EXECUTABLE` and is one of the `SUPPORTED_VERSIONS`. +# +macro (find_python_from_executable EXECUTABLE SUPPORTED_VERSIONS) + file(REAL_PATH ${EXECUTABLE} EXECUTABLE) + set(Python_EXECUTABLE ${EXECUTABLE}) + find_package(Python COMPONENTS Interpreter Development.Module) + if (NOT Python_FOUND) + message(FATAL_ERROR "Unable to find python matching: ${EXECUTABLE}.") + endif() + set(_VER "${Python_VERSION_MAJOR}.${Python_VERSION_MINOR}") + set(_SUPPORTED_VERSIONS_LIST ${SUPPORTED_VERSIONS} ${ARGN}) + if (NOT _VER IN_LIST _SUPPORTED_VERSIONS_LIST) + message(FATAL_ERROR + "Python version (${_VER}) is not one of the supported versions: " + "${_SUPPORTED_VERSIONS_LIST}.") + endif() + message(STATUS "Found python matching: ${EXECUTABLE}.") +endmacro() + +# +# Run `EXPR` in python. The standard output of python is stored in `OUT` and +# has trailing whitespace stripped. If an error is encountered when running +# python, a fatal message `ERR_MSG` is issued. +# +function (run_python OUT EXPR ERR_MSG) + execute_process( + COMMAND + "${Python_EXECUTABLE}" "-c" "${EXPR}" + OUTPUT_VARIABLE PYTHON_OUT + RESULT_VARIABLE PYTHON_ERROR_CODE + ERROR_VARIABLE PYTHON_STDERR + OUTPUT_STRIP_TRAILING_WHITESPACE) + + if(NOT PYTHON_ERROR_CODE EQUAL 0) + message(FATAL_ERROR "${ERR_MSG}: ${PYTHON_STDERR}") + endif() + set(${OUT} ${PYTHON_OUT} PARENT_SCOPE) +endfunction() + +# Run `EXPR` in python after importing `PKG`. Use the result of this to extend +# `CMAKE_PREFIX_PATH` so the torch cmake configuration can be imported. +macro (append_cmake_prefix_path PKG EXPR) + run_python(_PREFIX_PATH + "import ${PKG}; print(${EXPR})" "Failed to locate ${PKG} path") + list(APPEND CMAKE_PREFIX_PATH ${_PREFIX_PATH}) +endmacro() + +# +# Add a target named `hipify${NAME}` that runs the hipify preprocessor on a set +# of CUDA source files. The names of the corresponding "hipified" sources are +# stored in `OUT_SRCS`. +# ORIG_SRCS - List of original source files. +# CXX_SRCS - List of C++ source files that should not be hipified. (e.g., no CUDA code) +# CXX_SRCS are removed from the list of ORIG_SRCS, in order to fix issue #206. +# +function (hipify_sources_target OUT_SRCS NAME ORIG_SRCS CXX_SRCS) + # + # Split into C++ and non-C++ (i.e. CUDA) sources. + # + set(SRCS ${ORIG_SRCS}) + + # remove CXX_SRCS from the list of SRCS + foreach(CXX_SRC ${CXX_SRCS}) + list(REMOVE_ITEM SRCS ${CXX_SRC}) + endforeach(CXX_SRC ${CXX_SRCS}) + + # + # Generate ROCm/HIP source file names from CUDA file names. + # Since HIP files are generated code, they will appear in the build area + # `CMAKE_CURRENT_BINARY_DIR` directory rather than the original csrc dir. + # + set(HIP_SRCS) + foreach (SRC ${SRCS}) + set(ORIGINAL_SRC ${SRC}) + string(REGEX REPLACE "\.cu$" "\.hip" SRC ${SRC}) + string(REGEX REPLACE "cuda" "hip" SRC ${SRC}) + if(${SRC} STREQUAL ${ORIGINAL_SRC}) + string(REGEX REPLACE "\.cpp$" "_hip\.cpp" SRC ${SRC}) + endif() + list(APPEND HIP_SRCS "${CMAKE_CURRENT_BINARY_DIR}/${SRC}") + endforeach() + + set(CSRC_BUILD_DIR ${CMAKE_CURRENT_BINARY_DIR}/csrc) + add_custom_target( + hipify${NAME} + COMMAND ${CMAKE_SOURCE_DIR}/cmake/hipify.py -p ${CMAKE_SOURCE_DIR}/csrc -o ${CSRC_BUILD_DIR} ${SRCS} + DEPENDS ${CMAKE_SOURCE_DIR}/cmake/hipify.py ${SRCS} + BYPRODUCTS ${HIP_SRCS} + COMMENT "Running hipify on ${NAME} extension source files.") + + # Swap out original extension sources with hipified sources. + list(APPEND HIP_SRCS ${CXX_SRCS}) + set(${OUT_SRCS} ${HIP_SRCS} PARENT_SCOPE) +endfunction() + +# +# Get additional GPU compiler flags from torch. +# +function (get_torch_gpu_compiler_flags OUT_GPU_FLAGS GPU_LANG) + if (${GPU_LANG} STREQUAL "CUDA") + # + # Get common NVCC flags from torch. + # + run_python(GPU_FLAGS + "from torch.utils.cpp_extension import COMMON_NVCC_FLAGS; print(';'.join(COMMON_NVCC_FLAGS))" + "Failed to determine torch nvcc compiler flags") + + if (CUDA_VERSION VERSION_GREATER_EQUAL 11.8) + list(APPEND GPU_FLAGS "-DENABLE_FP8") + endif() + if (CUDA_VERSION VERSION_GREATER_EQUAL 12.0) + list(REMOVE_ITEM GPU_FLAGS + "-D__CUDA_NO_HALF_OPERATORS__" + "-D__CUDA_NO_HALF_CONVERSIONS__" + "-D__CUDA_NO_BFLOAT16_CONVERSIONS__" + "-D__CUDA_NO_HALF2_OPERATORS__") + endif() + + elseif(${GPU_LANG} STREQUAL "HIP") + # + # Get common HIP/HIPCC flags from torch. + # + run_python(GPU_FLAGS + "import torch.utils.cpp_extension as t; print(';'.join(t.COMMON_HIP_FLAGS + t.COMMON_HIPCC_FLAGS))" + "Failed to determine torch nvcc compiler flags") + + list(APPEND GPU_FLAGS + "-DUSE_ROCM" + "-DENABLE_FP8" + "-U__HIP_NO_HALF_CONVERSIONS__" + "-U__HIP_NO_HALF_OPERATORS__" + "-fno-gpu-rdc") + + endif() + set(${OUT_GPU_FLAGS} ${GPU_FLAGS} PARENT_SCOPE) +endfunction() + +# Macro for converting a `gencode` version number to a cmake version number. +macro(string_to_ver OUT_VER IN_STR) + string(REGEX REPLACE "\([0-9]+\)\([0-9]\)" "\\1.\\2" ${OUT_VER} ${IN_STR}) +endmacro() + +# +# Override the GPU architectures detected by cmake/torch and filter them by +# `GPU_SUPPORTED_ARCHES`. Sets the final set of architectures in +# `GPU_ARCHES`. +# +# Note: this is defined as a macro since it updates `CMAKE_CUDA_FLAGS`. +# +macro(override_gpu_arches GPU_ARCHES GPU_LANG GPU_SUPPORTED_ARCHES) + set(_GPU_SUPPORTED_ARCHES_LIST ${GPU_SUPPORTED_ARCHES} ${ARGN}) + message(STATUS "${GPU_LANG} supported arches: ${_GPU_SUPPORTED_ARCHES_LIST}") + + if (${GPU_LANG} STREQUAL "HIP") + # + # `GPU_ARCHES` controls the `--offload-arch` flags. + # `CMAKE_HIP_ARCHITECTURES` is set up by torch and can be controlled + # via the `PYTORCH_ROCM_ARCH` env variable. + # + + # + # Find the intersection of the supported + detected architectures to + # set the module architecture flags. + # + set(${GPU_ARCHES}) + foreach (_ARCH ${CMAKE_HIP_ARCHITECTURES}) + if (_ARCH IN_LIST _GPU_SUPPORTED_ARCHES_LIST) + list(APPEND ${GPU_ARCHES} ${_ARCH}) + endif() + endforeach() + + if(NOT ${GPU_ARCHES}) + message(FATAL_ERROR + "None of the detected ROCm architectures: ${CMAKE_HIP_ARCHITECTURES} is" + " supported. Supported ROCm architectures are: ${_GPU_SUPPORTED_ARCHES_LIST}.") + endif() + + elseif(${GPU_LANG} STREQUAL "CUDA") + # + # Setup/process CUDA arch flags. + # + # The torch cmake setup hardcodes the detected architecture flags in + # `CMAKE_CUDA_FLAGS`. Since `CMAKE_CUDA_FLAGS` is a "global" variable, it + # can't modified on a per-target basis, e.g. for the `punica` extension. + # So, all the `-gencode` flags need to be extracted and removed from + # `CMAKE_CUDA_FLAGS` for processing so they can be passed by another method. + # Since it's not possible to use `target_compiler_options` for adding target + # specific `-gencode` arguments, the target's `CUDA_ARCHITECTURES` property + # must be used instead. This requires repackaging the architecture flags + # into a format that cmake expects for `CUDA_ARCHITECTURES`. + # + # This is a bit fragile in that it depends on torch using `-gencode` as opposed + # to one of the other nvcc options to specify architectures. + # + # Note: torch uses the `TORCH_CUDA_ARCH_LIST` environment variable to override + # detected architectures. + # + message(DEBUG "initial CMAKE_CUDA_FLAGS: ${CMAKE_CUDA_FLAGS}") + + # Extract all `-gencode` flags from `CMAKE_CUDA_FLAGS` + string(REGEX MATCHALL "-gencode arch=[^ ]+" _CUDA_ARCH_FLAGS + ${CMAKE_CUDA_FLAGS}) + + # Remove all `-gencode` flags from `CMAKE_CUDA_FLAGS` since they will be modified + # and passed back via the `CUDA_ARCHITECTURES` property. + string(REGEX REPLACE "-gencode arch=[^ ]+ *" "" CMAKE_CUDA_FLAGS + ${CMAKE_CUDA_FLAGS}) + + # If this error is triggered, it might mean that torch has changed how it sets + # up nvcc architecture code generation flags. + if (NOT _CUDA_ARCH_FLAGS) + message(FATAL_ERROR + "Could not find any architecture related code generation flags in " + "CMAKE_CUDA_FLAGS. (${CMAKE_CUDA_FLAGS})") + endif() + + message(DEBUG "final CMAKE_CUDA_FLAGS: ${CMAKE_CUDA_FLAGS}") + message(DEBUG "arch flags: ${_CUDA_ARCH_FLAGS}") + + # Initialize the architecture lists to empty. + set(${GPU_ARCHES}) + + # Process each `gencode` flag. + foreach(_ARCH ${_CUDA_ARCH_FLAGS}) + # For each flag, extract the version number and whether it refers to PTX + # or native code. + # Note: if a regex matches then `CMAKE_MATCH_1` holds the binding + # for that match. + + string(REGEX MATCH "arch=compute_\([0-9]+a?\)" _COMPUTE ${_ARCH}) + if (_COMPUTE) + set(_COMPUTE ${CMAKE_MATCH_1}) + endif() + + string(REGEX MATCH "code=sm_\([0-9]+a?\)" _SM ${_ARCH}) + if (_SM) + set(_SM ${CMAKE_MATCH_1}) + endif() + + string(REGEX MATCH "code=compute_\([0-9]+a?\)" _CODE ${_ARCH}) + if (_CODE) + set(_CODE ${CMAKE_MATCH_1}) + endif() + + # Make sure the virtual architecture can be matched. + if (NOT _COMPUTE) + message(FATAL_ERROR + "Could not determine virtual architecture from: ${_ARCH}.") + endif() + + # One of sm_ or compute_ must exist. + if ((NOT _SM) AND (NOT _CODE)) + message(FATAL_ERROR + "Could not determine a codegen architecture from: ${_ARCH}.") + endif() + + if (_SM) + # -real suffix let CMake to only generate elf code for the kernels. + # we want this, otherwise the added ptx (default) will increase binary size. + set(_VIRT "-real") + set(_CODE_ARCH ${_SM}) + else() + # -virtual suffix let CMake to generate ptx code for the kernels. + set(_VIRT "-virtual") + set(_CODE_ARCH ${_CODE}) + endif() + + # Check if the current version is in the supported arch list. + string_to_ver(_CODE_VER ${_CODE_ARCH}) + if (NOT _CODE_VER IN_LIST _GPU_SUPPORTED_ARCHES_LIST) + message(STATUS "discarding unsupported CUDA arch ${_VER}.") + continue() + endif() + + # Add it to the arch list. + list(APPEND ${GPU_ARCHES} "${_CODE_ARCH}${_VIRT}") + endforeach() + endif() + message(STATUS "${GPU_LANG} target arches: ${${GPU_ARCHES}}") +endmacro() + +# +# Define a target named `GPU_MOD_NAME` for a single extension. The +# arguments are: +# +# DESTINATION - Module destination directory. +# LANGUAGE - The GPU language for this module, e.g CUDA, HIP, +# etc. +# SOURCES - List of source files relative to CMakeLists.txt +# directory. +# +# Optional arguments: +# +# ARCHITECTURES - A list of target GPU architectures in cmake +# format. +# Refer `CMAKE_CUDA_ARCHITECTURES` documentation +# and `CMAKE_HIP_ARCHITECTURES` for more info. +# ARCHITECTURES will use cmake's defaults if +# not provided. +# COMPILE_FLAGS - Extra compiler flags passed to NVCC/hip. +# INCLUDE_DIRECTORIES - Extra include directories. +# LIBRARIES - Extra link libraries. +# WITH_SOABI - Generate library with python SOABI suffix name. +# CXX_SRCS - List of C++ sources files to not be hipified. +# Usually means they shouldn't contain CUDA code. +# +# Note: optimization level/debug info is set via cmake build type. +# +function (define_gpu_extension_target GPU_MOD_NAME) + cmake_parse_arguments(PARSE_ARGV 1 + GPU + "WITH_SOABI" + "DESTINATION;LANGUAGE" + "SOURCES;ARCHITECTURES;COMPILE_FLAGS;INCLUDE_DIRECTORIES;LIBRARIES;CXX_SRCS" + ) + + # Add hipify preprocessing step when building with HIP/ROCm. + if (GPU_LANGUAGE STREQUAL "HIP") + hipify_sources_target(GPU_SOURCES ${GPU_MOD_NAME} "${GPU_SOURCES}" "${GPU_CXX_SRCS}") + endif() + + if (GPU_WITH_SOABI) + set(GPU_WITH_SOABI WITH_SOABI) + else() + set(GPU_WITH_SOABI) + endif() + + Python_add_library(${GPU_MOD_NAME} MODULE "${GPU_SOURCES}" ${GPU_WITH_SOABI}) + + if (GPU_LANGUAGE STREQUAL "HIP") + # Make this target dependent on the hipify preprocessor step. + add_dependencies(${GPU_MOD_NAME} hipify${GPU_MOD_NAME}) + endif() + + if (GPU_ARCHITECTURES) + set_target_properties(${GPU_MOD_NAME} PROPERTIES + ${GPU_LANGUAGE}_ARCHITECTURES "${GPU_ARCHITECTURES}") + endif() + + set_property(TARGET ${GPU_MOD_NAME} PROPERTY CXX_STANDARD 17) + + target_compile_options(${GPU_MOD_NAME} PRIVATE + $<$:${GPU_COMPILE_FLAGS}>) + + target_compile_definitions(${GPU_MOD_NAME} PRIVATE + "-DTORCH_EXTENSION_NAME=${GPU_MOD_NAME}") + + target_include_directories(${GPU_MOD_NAME} PRIVATE csrc + ${GPU_INCLUDE_DIRECTORIES}) + + target_link_libraries(${GPU_MOD_NAME} PRIVATE torch ${torch_python_LIBRARY} + ${GPU_LIBRARIES}) + + # Don't use `TORCH_LIBRARIES` for CUDA since it pulls in a bunch of + # dependencies that are not necessary and may not be installed. + if (GPU_LANGUAGE STREQUAL "CUDA") + target_link_libraries(${GPU_MOD_NAME} PRIVATE ${CUDA_CUDA_LIB} + ${CUDA_LIBRARIES}) + else() + target_link_libraries(${GPU_MOD_NAME} PRIVATE ${TORCH_LIBRARIES}) + endif() + + install(TARGETS ${GPU_MOD_NAME} LIBRARY DESTINATION ${GPU_DESTINATION}) +endfunction() diff --git a/sllm_store/cpp_build.sh b/sllm_store/cpp_build.sh new file mode 100644 index 0000000..a77df33 --- /dev/null +++ b/sllm_store/cpp_build.sh @@ -0,0 +1,30 @@ +#!/bin/bash +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +set -e + +if [ ! -d "build" ]; then + mkdir build/ +fi +cd build/ + +export SLLM_STORE_PYTHON_EXECUTABLE=$(which python3) +cmake -DCMAKE_BUILD_TYPE=Release \ + -DSLLM_STORE_PYTHON_EXECUTABLE=$SLLM_STORE_PYTHON_EXECUTABLE \ + -G Ninja .. +cmake --build . --target all -j \ No newline at end of file diff --git a/sllm_store/csrc/.DS_Store b/sllm_store/csrc/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..839cbdaa1dd3e8886f3600ff29531b3528686f10 GIT binary patch literal 6148 zcmeHKy-veG47N*$082+E$jE|F-yl@s3Hkt3{SieZB!V(?tjs(BZ^MdsB0it3lBkVf zLKU*B^LO#tcg~k6u8D|8kMkkXfQS+d!QMX97Lj!s8`3k2EOOlAmTIc#hVE#!;q8W9 zWI&$X0nKPh3+Tr4E3Sv*Syk4W^yInAudMQXT2xc4CugruFX8z8qT6@=Yu|d=JpT<_ zBF_gZ@GI#GvlZU7ds?*e{(XddH&?v%9B4NPZwvv8E^)6odMKr zk>pU(wKL!hI0I`20+9w+&cL5C F@C8p;SYQAE literal 0 HcmV?d00001 diff --git a/sllm_store/csrc/checkpoint/aligned_buffer.cpp b/sllm_store/csrc/checkpoint/aligned_buffer.cpp new file mode 100644 index 0000000..4b93340 --- /dev/null +++ b/sllm_store/csrc/checkpoint/aligned_buffer.cpp @@ -0,0 +1,113 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#include "aligned_buffer.h" + +#include +#include + +#include +#include + +AlignedBuffer::AlignedBuffer(const std::string& filename) + : fd_(-1), buf_size_(kBufferSize), buf_pos_(0), file_offset_(0) { + fd_ = open(filename.c_str(), O_WRONLY | O_CREAT | O_DIRECT, 0644); + if (fd_ < 0) { + std::cerr << "Failed to open file " << filename << std::endl; + } + buffer_ = aligned_alloc(kAlignment, kBufferSize); +} + +AlignedBuffer::~AlignedBuffer() { + // if the buffer is not written to file, write it to file + if (buffer_ && buf_pos_) { + pwrite(fd_, buffer_, buf_pos_, file_offset_); + } + if (buffer_) { + free(buffer_); + } + if (fd_ >= 0) { + close(fd_); + } +} + +size_t AlignedBuffer::writeData(const void* data, size_t size) { + size_t written = 0; + while (written < size) { + // if data size is larger than buffer size and buffer is empty + // write data directly to file + if (size - written > buf_size_ && buf_pos_ == 0) { + size_t direct_write_size = (size - written) / kAlignment * kAlignment; + // allocate aligned memory + void* direct_write_buf = aligned_alloc(kAlignment, direct_write_size); + if (!direct_write_buf) { + char err_msg[256]; + strerror_r(errno, err_msg, sizeof(err_msg)); + std::cerr << "Failed to allocate aligned memory: " << err_msg + << std::endl; + std::cerr << "kAlignment: " << kAlignment + << " direct_write_size: " << direct_write_size; + exit(1); + } + memcpy(direct_write_buf, (char*)data + written, direct_write_size); + ssize_t ret = + pwrite(fd_, direct_write_buf, direct_write_size, file_offset_); + if (ret < 0 || ret != direct_write_size) { + std::cerr << "Failed to write to file, ret: " << ret + << " errno: " << errno << std::endl; + return written; + } + written += direct_write_size; + file_offset_ += direct_write_size; + free(direct_write_buf); + } + size_t to_write = std::min(size - written, buf_size_ - buf_pos_); + memcpy(static_cast(buffer_) + buf_pos_, (char*)data + written, + to_write); + buf_pos_ += to_write; + written += to_write; + if (buf_pos_ == buf_size_) { + ssize_t ret = pwrite(fd_, buffer_, buf_size_, file_offset_); + if (ret < 0 || ret != buf_size_) { + std::cerr << "Failed to write to file, ret: " << ret + << " errno: " << errno << std::endl; + return written; + } + buf_pos_ = 0; + file_offset_ += buf_size_; + } + } + return written; +} + +size_t AlignedBuffer::writePadding(size_t padding_size) { + if (padding_size >= 8) { + std::cerr << "Padding size should be less than 8 bytes" << std::endl; + return 0; + } + buf_pos_ += padding_size; + if (buf_pos_ > buf_size_) { + std::cerr << "Padding size is too large" << std::endl; + return 0; + } + if (buf_pos_ == buf_size_) { + pwrite(fd_, buffer_, buf_pos_, file_offset_); + buf_pos_ = 0; + file_offset_ += buf_size_; + } + return padding_size; +} \ No newline at end of file diff --git a/sllm_store/csrc/checkpoint/aligned_buffer.h b/sllm_store/csrc/checkpoint/aligned_buffer.h new file mode 100644 index 0000000..4d9ef0b --- /dev/null +++ b/sllm_store/csrc/checkpoint/aligned_buffer.h @@ -0,0 +1,40 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#pragma once + +#include + +const size_t kAlignment = 4096; // 4k +const size_t kBufferSize = 1L << 30; // 1GB + +// A write buffer that writes to a file (4k aligned). +class AlignedBuffer { + public: + explicit AlignedBuffer(const std::string& filename); + ~AlignedBuffer(); + + size_t writeData(const void* data, size_t size); + size_t writePadding(size_t padding_size); + + private: + int fd_; + size_t buf_size_; + size_t buf_pos_; + size_t file_offset_; + void* buffer_; +}; \ No newline at end of file diff --git a/sllm_store/csrc/checkpoint/checkpoint.cpp b/sllm_store/csrc/checkpoint/checkpoint.cpp new file mode 100644 index 0000000..58c3b6b --- /dev/null +++ b/sllm_store/csrc/checkpoint/checkpoint.cpp @@ -0,0 +1,250 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#include "checkpoint.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include // One-stop header. +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "progress_bar.h" +#include "tensor_writer.h" + +#define BUFFER_SIZE 1 << 30 + +std::unordered_map SaveTensors( + std::vector tensor_names, + std::unordered_map>& tensor_data, + const std::string& path) { + std::string tensor_filename = std::filesystem::path(path) / "tensor.data"; + // make a tensor writer + TensorWriter writer(tensor_filename); + // make a tensor index + std::unordered_map tensor_offsets; + // Some tensors may share the same data, so we need to record the data to + // avoid duplication + std::unordered_map data_record; + + int total = tensor_names.size(); + int count = 0; + + for (const auto& name : tensor_names) { + const auto& [base, size] = tensor_data[name]; + const char* data_ptr = reinterpret_cast(base); + if (data_record.find(data_ptr) != data_record.end()) { + tensor_offsets[name] = tensor_offsets[data_record[data_ptr]]; + continue; + } + data_record[data_ptr] = name; + + uint64_t offset = writer.writeRecord(data_ptr, size); + tensor_offsets[name] = offset; + + // Update progress bar + count++; + float progress = static_cast(count) / total; + showProgressBar(progress, "Saving tensors: "); + } + + return tensor_offsets; +} + +// Function to print the binary array in hexadecimal format +void printBinaryArrayInHex(const unsigned char* data, size_t size) { + std::cout << "Data in Hex: "; + for (size_t i = 0; i < size; ++i) { + std::cout << std::hex << std::setw(2) << std::setfill('0') + << static_cast(data[i]) << " "; + } + std::cout << std::dec + << std::endl; // Switch back to decimal for any future output +} + +// Mapping from string to at::ScalarType +at::ScalarType stringToScalarType(const std::string& dtype_str) { + static const std::unordered_map dtype_map = { + {"torch.float16", torch::kFloat16}, {"torch.float32", torch::kFloat32}, + {"torch.float64", torch::kFloat64}, {"torch.int16", torch::kInt16}, + {"torch.int32", torch::kInt32}, {"torch.int64", torch::kInt64}, + {"torch.uint8", torch::kUInt8}, {"torch.int8", torch::kInt8}, + {"torch.bfloat16", torch::kBFloat16}}; + + auto it = dtype_map.find(dtype_str); + if (it != dtype_map.end()) { + return it->second; + } else { + throw std::invalid_argument("Unknown dtype string: " + dtype_str); + } +} + +std::unordered_map RestoreTensors( + const std::unordered_map< + std::string, std::tuple, std::vector, + std::string>>& meta_state_dict, + const std::unordered_map& memory_base_address, + const std::unordered_map>& + tensor_device_offsets) { + std::unordered_map state_dict; + std::unordered_set handled_memory; + for (const auto& [device, tensor_offset] : tensor_device_offsets) { + for (const auto& p : tensor_offset) { + std::string name = p.first; + if (memory_base_address.find(device) != memory_base_address.end()) { + void* base_address = memory_base_address.at(device); + uint64_t offset = reinterpret_cast(base_address) + p.second; + + torch::Device tensor_device(torch::kCUDA, device); + auto [sizes, strides, type_str] = meta_state_dict.at(name); + at::ScalarType dtype = stringToScalarType(type_str); + // std::cerr << name << " " << sizes << " " << strides << " " << dtype + // << std::endl; + if (p.second == 0 && + handled_memory.find(base_address) == handled_memory.end()) { + torch::Tensor real_tensor = torch::from_blob( + reinterpret_cast(offset), c10::makeArrayRef(sizes), + c10::makeArrayRef(strides), [](void* ptr) { cudaFree(ptr); }, + torch::TensorOptions().device(tensor_device).dtype(dtype)); + state_dict[name] = real_tensor; + handled_memory.insert(base_address); + // std::cerr << "Tensor " << name << " is restored to device " << + // device << std::endl; + } else { + torch::Tensor real_tensor = torch::from_blob( + reinterpret_cast(offset), sizes, strides, [](void* ptr) {}, + torch::TensorOptions().device(tensor_device).dtype(dtype)); + state_dict[name] = real_tensor; + } + } else { + std::cerr << "Cannot find device " << device << std::endl; + exit(1); + } + } + } + return state_dict; +} + +std::unordered_map GetGpuUUID() { + int deviceCount = 0; + cudaGetDeviceCount(&deviceCount); // Get the number of CUDA devices + std::unordered_map uuidToDeviceIdMap; + + for (int devId = 0; devId < deviceCount; ++devId) { + cudaDeviceProp props; + cudaGetDeviceProperties(&props, devId); // Get properties for each device + + // Convert UUID bytes to string with unsigned char casting + char uuidStr[80]; + snprintf( + uuidStr, sizeof(uuidStr), + "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", + (unsigned char)props.uuid.bytes[0], (unsigned char)props.uuid.bytes[1], + (unsigned char)props.uuid.bytes[2], (unsigned char)props.uuid.bytes[3], + (unsigned char)props.uuid.bytes[4], (unsigned char)props.uuid.bytes[5], + (unsigned char)props.uuid.bytes[6], (unsigned char)props.uuid.bytes[7], + (unsigned char)props.uuid.bytes[8], (unsigned char)props.uuid.bytes[9], + (unsigned char)props.uuid.bytes[10], + (unsigned char)props.uuid.bytes[11], + (unsigned char)props.uuid.bytes[12], + (unsigned char)props.uuid.bytes[13], + (unsigned char)props.uuid.bytes[14], + (unsigned char)props.uuid.bytes[15]); + + uuidToDeviceIdMap[std::string(uuidStr)] = devId; + } + + return uuidToDeviceIdMap; +} + +std::unordered_map AllocateCudaMemory( + const std::unordered_map& tensor_sizes) { + std::unordered_map memory_ptrs; + for (const auto& p : tensor_sizes) { + int device = p.first; + size_t size = p.second; + void* ptr = nullptr; + cudaSetDevice(device); + cudaMalloc(&ptr, size); + memory_ptrs[device] = ptr; + } + return memory_ptrs; +} + +std::unordered_map GetCudaMemoryHandles( + const std::unordered_map& memory_ptrs) { + std::unordered_map memory_handles; + for (const auto& p : memory_ptrs) { + int device = p.first; + void* ptr = p.second; + cudaIpcMemHandle_t handle; + cudaSetDevice(device); + cudaIpcGetMemHandle(&handle, ptr); + memory_handles[device] = std::string(reinterpret_cast(&handle), + sizeof(cudaIpcMemHandle_t)); + } + return memory_handles; +} + +std::unordered_map> GetCudaMemoryHandles( + const std::unordered_map>& memory_ptrs) { + std::unordered_map> memory_handles; + for (const auto& p : memory_ptrs) { + auto device = p.first; + const auto& ptrs = p.second; + cudaIpcMemHandle_t handle; + cudaSetDevice(device); + + std::vector handles; + for (const auto& ptr : ptrs) { + cudaIpcGetMemHandle(&handle, ptr); + handles.push_back(std::string(reinterpret_cast(&handle), + sizeof(cudaIpcMemHandle_t))); + } + memory_handles[device] = handles; + } + return memory_handles; +} + +std::unordered_map GetDeviceUuidMap() { + std::unordered_map gpu_uuid = GetGpuUUID(); + std::unordered_map device_uuid_map; + for (const auto& p : gpu_uuid) { + if (device_uuid_map.find(p.second) != device_uuid_map.end()) { + std::cerr << "Duplicate device id: " << p.second << std::endl; + exit(1); + } + device_uuid_map[p.second] = p.first; + } + return device_uuid_map; +} \ No newline at end of file diff --git a/sllm_store/csrc/checkpoint/checkpoint.h b/sllm_store/csrc/checkpoint/checkpoint.h new file mode 100644 index 0000000..692365e --- /dev/null +++ b/sllm_store/csrc/checkpoint/checkpoint.h @@ -0,0 +1,48 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#pragma once + +#include +#include // One-stop header. + +#include +#include + +std::unordered_map SaveTensors( + std::vector tensor_names, + std::unordered_map>& tensor_data, + const std::string& path); + +std::unordered_map RestoreTensors( + const std::unordered_map< + std::string, std::tuple, std::vector, + std::string>>& meta_state_dict, + const std::unordered_map& memory_base_address, + const std::unordered_map>& + tensor_device_offsets); + +// {dev_id: ptr} +std::unordered_map AllocateCudaMemory( + const std::unordered_map& tensor_sizes); +std::unordered_map GetCudaMemoryHandles( + const std::unordered_map& memory_ptrs); +std::unordered_map> GetCudaMemoryHandles( + const std::unordered_map>& memory_ptrs); +std::unordered_map GetDeviceUuidMap(); + +std::unordered_map GetGpuUUID(); \ No newline at end of file diff --git a/sllm_store/csrc/checkpoint/checkpoint_py.cpp b/sllm_store/csrc/checkpoint/checkpoint_py.cpp new file mode 100644 index 0000000..5157289 --- /dev/null +++ b/sllm_store/csrc/checkpoint/checkpoint_py.cpp @@ -0,0 +1,84 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#include + +#include "checkpoint.h" + +namespace py = pybind11; + +// define pybind11 module +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("save_tensors", &SaveTensors, "Save a state dict") + .def("restore_tensors", &RestoreTensors, "Restore a state dict") + .def("allocate_cuda_memory", &AllocateCudaMemory, "Allocate cuda memory") + .def( + "get_cuda_memory_handles", + [](const std::unordered_map& memory_ptrs) { + std::unordered_map memory_handles = + GetCudaMemoryHandles(memory_ptrs); + + std::unordered_map py_memory_handles; + for (const auto& kv : memory_handles) { + py_memory_handles[kv.first] = py::bytes(kv.second); + } + return py_memory_handles; + }, + py::arg("memory_ptrs"), "Get cuda memory handles") + .def( + "get_cuda_memory_handles", + [](const std::unordered_map>& memory_ptrs) { + auto memory_handles = GetCudaMemoryHandles(memory_ptrs); + + std::unordered_map> py_memory_handles; + for (const auto& kv : memory_handles) { + std::vector handles; + for (const auto& handle : kv.second) { + handles.push_back(py::bytes(handle)); + } + py_memory_handles[kv.first] = handles; + } + return py_memory_handles; + }, + py::arg("memory_ptrs"), "Get cuda memory handles") + .def( + "get_cuda_memory_handles", + [](const std::unordered_map>& + memory_ptrs) { + std::unordered_map> memory_ptrs_void; + for (const auto& kv : memory_ptrs) { + std::vector ptrs; + for (const auto& ptr : kv.second) { + ptrs.push_back(reinterpret_cast(ptr)); + } + memory_ptrs_void[kv.first] = ptrs; + } + auto memory_handles = GetCudaMemoryHandles(memory_ptrs_void); + + std::unordered_map> py_memory_handles; + for (const auto& kv : memory_handles) { + std::vector handles; + for (const auto& handle : kv.second) { + handles.push_back(py::bytes(handle)); + } + py_memory_handles[kv.first] = handles; + } + return py_memory_handles; + }, + py::arg("memory_ptrs"), "Get cuda memory handles") + .def("get_device_uuid_map", &GetDeviceUuidMap, "Get device uuid map"); +} \ No newline at end of file diff --git a/sllm_store/csrc/checkpoint/progress_bar.h b/sllm_store/csrc/checkpoint/progress_bar.h new file mode 100644 index 0000000..5644e39 --- /dev/null +++ b/sllm_store/csrc/checkpoint/progress_bar.h @@ -0,0 +1,41 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#include + +void showProgressBar(float progress, std::string message = "") { + const int barWidth = 70; + int progress_percent = int(progress * 100.0); + std::cout << message << progress_percent << "% ["; + int pos = static_cast(barWidth * progress); + for (int i = 0; i < barWidth; ++i) { + if (i < pos) { + std::cout << "="; + } else if (i == pos) { + std::cout << ">"; + } else { + std::cout << " "; + } + } + std::cout << "] " << progress_percent << " %"; + if (progress_percent == 100) { + std::cout << std::endl; + } else { + std::cout << "\r"; + } + std::cout.flush(); +} \ No newline at end of file diff --git a/sllm_store/csrc/checkpoint/tensor_writer.cpp b/sllm_store/csrc/checkpoint/tensor_writer.cpp new file mode 100644 index 0000000..46eb304 --- /dev/null +++ b/sllm_store/csrc/checkpoint/tensor_writer.cpp @@ -0,0 +1,49 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#include "tensor_writer.h" + +#include + +TensorWriter::TensorWriter(const std::string& filename) : filename_(filename) {} + +TensorWriter::~TensorWriter() {} + +uint64_t TensorWriter::writeRecord(const char* data, size_t size) { + if (partition_idx_ == -1 || partition_size_ + size > kPartitionMaxSize) { + // create a new partition + partition_idx_++; + partition_size_ = 0; + std::string partition_filename = + filename_ + "_" + std::to_string(partition_idx_); + buffer_ = std::make_unique(partition_filename); + } + + uint64_t start_offset = offset_; + // make sure the data is 64-bit aligned + size_t padding = (size % 8) ? (8 - size % 8) : 0; + size_t written = buffer_->writeData(data, size); + if (padding) { + written += buffer_->writePadding(padding); + } + offset_ += written; + partition_size_ += written; + // std::cerr << "writeRecord: " << partition_idx_ << " " << partition_size_ << + // " " << kPartitionMaxSize << std::endl; + + return start_offset; +} diff --git a/sllm_store/csrc/checkpoint/tensor_writer.h b/sllm_store/csrc/checkpoint/tensor_writer.h new file mode 100644 index 0000000..0ad7d3f --- /dev/null +++ b/sllm_store/csrc/checkpoint/tensor_writer.h @@ -0,0 +1,42 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#pragma once + +#include +#include +#include + +#include "aligned_buffer.h" + +const size_t kPartitionMaxSize = 10L << 30; // 10GB + +// A tensor writer that writes the raw tensor data to a file in raw binary. +class TensorWriter final { + public: + explicit TensorWriter(const std::string& filename); + ~TensorWriter(); + + uint64_t writeRecord(const char* data, size_t size); + + private: + size_t offset_ = 0; + int partition_idx_ = -1; + size_t partition_size_ = 0; + std::string filename_; + std::unique_ptr buffer_; +}; \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/binary_utils.cpp b/sllm_store/csrc/sllm_store/binary_utils.cpp new file mode 100644 index 0000000..e84449a --- /dev/null +++ b/sllm_store/csrc/sllm_store/binary_utils.cpp @@ -0,0 +1,32 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#include "binary_utils.h" + +#include +#include + +// Function to print the binary array in hexadecimal format +void PrintBinaryArrayInHex(const unsigned char* data, size_t size) { + std::cout << "Data in Hex: "; + for (size_t i = 0; i < size; ++i) { + std::cout << std::hex << std::setw(2) << std::setfill('0') + << static_cast(data[i]) << " "; + } + std::cout << std::dec + << std::endl; // Switch back to decimal for any future output +} \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/binary_utils.h b/sllm_store/csrc/sllm_store/binary_utils.h new file mode 100644 index 0000000..49a12a9 --- /dev/null +++ b/sllm_store/csrc/sllm_store/binary_utils.h @@ -0,0 +1,23 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#pragma once + +#include + +// Function to print the binary array in hexadecimal format +void PrintBinaryArrayInHex(const unsigned char* data, size_t size); \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/checkpoint_store.cpp b/sllm_store/csrc/sllm_store/checkpoint_store.cpp new file mode 100644 index 0000000..a32ae44 --- /dev/null +++ b/sllm_store/csrc/sllm_store/checkpoint_store.cpp @@ -0,0 +1,339 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#include "checkpoint_store.h" + +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "error_handling.h" + +CheckpointStore::CheckpointStore(const std::string& storage_path, + size_t memory_pool_size, int num_thread, + size_t chunk_size) + : storage_path_(storage_path), + memory_pool_size_(memory_pool_size), + num_thread_(num_thread), + chunk_size_(chunk_size) { + // Get number of GPUs + cudaGetDeviceCount(&num_gpus_); + LOG(INFO) << "Number of GPUs: " << num_gpus_; + + LOG(INFO) << "I/O threads: " << num_thread + << ", chunk size: " << chunk_size / MB << "MB"; + LOG(INFO) << "Storage path: " << storage_path_; + + for (size_t i = 0; i < num_gpus_; ++i) { + cudaSetDevice(i); + + cudaDeviceProp props; + cudaGetDeviceProperties(&props, i); + + // Get GPU UUID + char uuidStr[80]; + snprintf( + uuidStr, sizeof(uuidStr), + "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", + (unsigned char)props.uuid.bytes[0], (unsigned char)props.uuid.bytes[1], + (unsigned char)props.uuid.bytes[2], (unsigned char)props.uuid.bytes[3], + (unsigned char)props.uuid.bytes[4], (unsigned char)props.uuid.bytes[5], + (unsigned char)props.uuid.bytes[6], (unsigned char)props.uuid.bytes[7], + (unsigned char)props.uuid.bytes[8], (unsigned char)props.uuid.bytes[9], + (unsigned char)props.uuid.bytes[10], + (unsigned char)props.uuid.bytes[11], + (unsigned char)props.uuid.bytes[12], + (unsigned char)props.uuid.bytes[13], + (unsigned char)props.uuid.bytes[14], + (unsigned char)props.uuid.bytes[15]); + + gpu_info_map_[i].uuid_ = std::string(uuidStr); + LOG(INFO) << "GPU " << i << " UUID: " << gpu_info_map_[i].uuid_; + + // create stream + cudaError_t err = cudaStreamCreate(&gpu_info_map_[i].stream_); + if (err != cudaSuccess) { + LOG(FATAL) << "cudaStreamCreate error: " << cudaGetErrorString(err); + } + } + + // Create a memory pool + memory_pool_ = + std::make_shared(memory_pool_size_, chunk_size_); + LOG(INFO) << "Memory pool created with " << memory_pool_size_ / GB << "GB"; +} + +CheckpointStore::~CheckpointStore() { ClearMem(); } + +int64_t CheckpointStore::RegisterModelInfo(const std::string& model_path) { + std::unique_lock lock_info(model_info_mutex_); + if (model_map_.find(model_path) != model_map_.end()) { + // LOG(WARNING) << "Model " << model_path << " is already regfistered"; + auto model = model_map_.at(model_path); + return model->GetModelSize(); + } + + auto model = std::make_shared(model_path); + + int ret = model->Initialize(storage_path_); + if (ret != 0) { + LOG(ERROR) << "Failed to initialize model " << model_path; + return ret; + } + + model_map_[model_path] = model; + + LOG(INFO) << "Model " << model_path << " is registered"; + + return model->GetModelSize(); +} + +int CheckpointStore::LoadModelFromDisk(const std::string& model_path) { + std::unique_lock lock_info(model_info_mutex_); + auto model = GetModelPtr(model_path); + if (model == nullptr) { + LOG(ERROR) << "Model " << model_path << " is not registered"; + return -1; + } + lock_info.unlock(); + + // Allocate memory + lock_info.lock(); + int remaining_size = model->AllocatePinnedMemory(memory_pool_); + if (remaining_size < 0) { + LOG(ERROR) << "Failed to allocate memory for model " << model_path; + return -1; + } else if (remaining_size > 0) { + int mem_chunks_needed = remaining_size; + std::vector>> + model_last_access_time(model_last_access_time_.begin(), + model_last_access_time_.end()); + std::sort(model_last_access_time.begin(), model_last_access_time.end(), + [](const auto& a, const auto& b) { return a.second < b.second; }); + for (const auto& [model_path, last_access_time] : model_last_access_time) { + auto& model = model_map_[model_path]; + int freed_chunks = + model->TryFreeHost(); // try to free memory, non-blocking + LOG(INFO) << "Free " << freed_chunks << " chunks, remaining " + << mem_chunks_needed; + if (freed_chunks > 0) { + LOG(INFO) << "Model " << model_path << " is freed from memory"; + mem_chunks_needed -= freed_chunks; + if (mem_chunks_needed <= 0) { + break; + } + } + } + if (mem_chunks_needed > 0) { + LOG(ERROR) << "Failed to free enough memory for model " << model_path; + return -1; + } + ssize_t remaining_size = model->AllocatePinnedMemory(memory_pool_); + if (remaining_size < 0) { + LOG(ERROR) << "Failed to allocate memory for model " << model_path; + return -1; + } + } + model_last_access_time_[model_path] = std::chrono::system_clock::now(); + lock_info.unlock(); + + int ret = model->ToHost(num_thread_); + + if (ret != 0) { + LOG(ERROR) << "Failed to load model " << model_path << " to host"; + if (model->FreeHost() != 0) { + LOG(ERROR) << "Failed to free memory for model " << model_path; + } + return ret; + } + + return ret; +} + +int CheckpointStore::LoadModelFromDiskAsync(const std::string& model_path) { + std::unique_lock lock_info(model_info_mutex_); + async_tasks_.emplace(std::async(std::launch::async, [this, model_path]() { + return LoadModelFromDisk(model_path); + })); + + return 0; +} + +int CheckpointStore::LoadModelFromMem( + const std::string& model_path, const std::string& replica_uuid, + const MemCopyHandleListMap& gpu_memory_handles, + const MemCopyChunkListMap& mem_copy_chunks) { + // Sanity check + if (model_path.empty() || replica_uuid.empty()) { + LOG(ERROR) << "Model name or replica uuid is empty"; + return -1; + } else if (mem_copy_chunks.empty()) { + LOG(ERROR) << "No memory copy chunk provided"; + return -1; + } else if (gpu_memory_handles.size() != mem_copy_chunks.size()) { + LOG(ERROR) << "Mismatch between memory handles " + << gpu_memory_handles.size() << " and memory copy chunks " + << mem_copy_chunks.size(); + return -1; + } + std::unique_lock lock_info(model_info_mutex_); + auto model = GetModelPtr(model_path); + if (model == nullptr) { + LOG(ERROR) << "Model " << model_path << " is not registered"; + return -1; + } + model_last_access_time_[model_path] = std::chrono::system_clock::now(); + lock_info.unlock(); + + LOG(INFO) << "Loading model " << model_path; + + // Convert device uuid to device id + std::unordered_map converted_mem_copy_chunks; + for (auto& [device_id, gpu_info] : gpu_info_map_) { + if (mem_copy_chunks.find(gpu_info.uuid_) == mem_copy_chunks.end()) { + continue; + } + converted_mem_copy_chunks[device_id] = mem_copy_chunks.at(gpu_info.uuid_); + } + + std::unordered_map converted_mem_copy_handles; + for (auto& [device_id, gpu_info] : gpu_info_map_) { + if (gpu_memory_handles.find(gpu_info.uuid_) == gpu_memory_handles.end()) { + continue; + } + converted_mem_copy_handles[device_id] = + gpu_memory_handles.at(gpu_info.uuid_); + } + // Convert memory handles to device pointers + auto device_ptrs = GetDevicePtrsFromMemHandles(gpu_memory_handles); + + auto ret = model->ToGpu(replica_uuid, device_ptrs, converted_mem_copy_chunks, + converted_mem_copy_handles); + + // TODO: check if the model is loaded successfully + if (ret != 0) { + LOG(ERROR) << "Failed to load model " << model_path << " to GPU"; + if (model->FreeGpu(replica_uuid) != 0) { + LOG(ERROR) << "Failed to free memory for model " << model_path; + } + } + + return ret; +} + +int CheckpointStore::LoadModelFromMemAsync( + const std::string& model_path, const std::string& replica_uuid, + const std::unordered_map& + gpu_memory_handles, + const std::unordered_map& mem_copy_chunks) { + std::unique_lock lock_info(model_info_mutex_); + async_tasks_.emplace(std::async( + std::launch::async, + [this, model_path, replica_uuid, gpu_memory_handles, mem_copy_chunks]() { + return LoadModelFromMem(model_path, replica_uuid, gpu_memory_handles, + mem_copy_chunks); + })); + + return 0; +} + +int CheckpointStore::WaitModelInGpu(const std::string& model_path, + const std::string& replica_uuid) { + // check if the model is in memory + std::shared_ptr model; + std::unique_lock lock_info(model_info_mutex_); + if (model_map_.find(model_path) == model_map_.end()) { + LOG(ERROR) << "Model " << model_path << " is not registered"; + return 1; + } + model = model_map_[model_path]; + lock_info.unlock(); + + return model->WaitInGpu(replica_uuid); +} + +int CheckpointStore::ClearMem() { + std::unique_lock lock_info(model_info_mutex_); + for (auto& [model_path, model] : model_map_) { + LOG(INFO) << "Unloading model " << model_path; + int ret = model->FreeHost(); + if (ret != 0) { + LOG(ERROR) << "Failed to free memory for model " << model_path; + } + } + model_map_.clear(); + LOG(INFO) << "All models unloaded from memory\n"; + return 0; +} + +int CheckpointStore::UnloadModelFromHost(const std::string& model_path) { + std::unique_lock lock_info(model_info_mutex_); + if (model_map_.find(model_path) == model_map_.end()) { + LOG(ERROR) << "Model " << model_path << " is not registered"; + return 1; + } + auto model = model_map_.at(model_path); + lock_info.unlock(); + + return model->FreeHost(); +} + +ModelPtr CheckpointStore::GetModelPtr(const std::string& model_path) { + if (model_map_.find(model_path) == model_map_.end()) { + LOG(ERROR) << "Model " << model_path << " is not registered"; + return nullptr; + } + return model_map_.at(model_path); +} + +MemPtrListMap CheckpointStore::GetDevicePtrsFromMemHandles( + const MemCopyHandleListMap& memory_handles) { + MemPtrListMap gpu_ptrs; + for (const auto& [device_id, gpu_info] : gpu_info_map_) { + const std::string& uuid = gpu_info.uuid_; + if (memory_handles.find(uuid) == memory_handles.end()) { + continue; + } + auto& handle_list = memory_handles.at(uuid); + for (const auto& handle : handle_list) { + // Convert handle string to cuda handle + cudaIpcMemHandle_t* cuda_handle = + reinterpret_cast(const_cast( + reinterpret_cast(handle.cuda_ipc_handle_.data()))); + void* ptr = nullptr; + + cudaSetDevice(device_id); + cudaError_t err = cudaIpcOpenMemHandle(&ptr, *cuda_handle, + cudaIpcMemLazyEnablePeerAccess); + if (err != cudaSuccess || ptr == nullptr) { + LOG(ERROR) << "Failed to open cuda handle on device " << device_id + << " error: " << cudaGetErrorString(err); + exit(1); + } + + gpu_ptrs[device_id].push_back(ptr); + } + } + return gpu_ptrs; +} \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/checkpoint_store.h b/sllm_store/csrc/sllm_store/checkpoint_store.h new file mode 100644 index 0000000..14a004a --- /dev/null +++ b/sllm_store/csrc/sllm_store/checkpoint_store.h @@ -0,0 +1,107 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +// Third-party library headers +#include + +// Own Headers +#include "cuda_memory.h" +// #include "cuda_memory_pool.h" +#include "model.h" +#include "pinned_memory.h" +#include "pinned_memory_pool.h" +#include "types_and_defs.h" + +class CheckpointStore { + public: + CheckpointStore(const std::string& storage_path, size_t memory_pool_size, + int num_thread, size_t chunk_size); + ~CheckpointStore(); + + int64_t RegisterModelInfo(const std::string& model_path); + int LoadModelFromDisk(const std::string& model_path); + int LoadModelFromDiskAsync(const std::string& model_path); + int LoadModelFromMem(const std::string& model_path, + const std::string& replica_uuid, + const MemCopyHandleListMap& gpu_memory_handles, + const MemCopyChunkListMap& mem_copy_chunks); + int LoadModelFromMemAsync(const std::string& model_path, + const std::string& replica_uuid, + const MemCopyHandleListMap& gpu_memory_handles, + const MemCopyChunkListMap& mem_copy_chunks); + int WaitModelInGpu(const std::string& model_path, + const std::string& replica_uuid); + int UnloadModelFromHost(const std::string& model_path); + int ClearMem(); + + public: + // Get methods + size_t GetMemPoolSize() const { return memory_pool_size_; } + size_t GetChunkSize() const { return chunk_size_; } + + private: + // A GPU info struct + struct GpuInfo { + // uuid + std::string uuid_; + // int device_id_; + size_t total_memory_ = 0; + size_t free_memory_ = 0; + cudaStream_t stream_; + }; + + const std::filesystem::path storage_path_; + int num_gpus_; + std::unordered_map gpu_info_map_; + std::unordered_map> model_map_; + std::unordered_map> + model_last_access_time_; + std::mutex model_info_mutex_; + const size_t memory_pool_size_; + std::shared_ptr memory_pool_; + int num_thread_; + size_t chunk_size_; + + std::queue> async_tasks_; + + size_t GetNumChunkFromTensorSize(size_t tensor_size); + ModelPtr GetModelPtr(const std::string& model_path); + GpuReplicaPtr NewGpuReplica(const std::shared_ptr& model, + const std::string& replica_uuid); + int InitializeModel(const std::shared_ptr& model); + int AllocatePinnedMemory(const std::shared_ptr& model); + std::vector> CalculateChunks(size_t offset, + size_t size); + int AllocateCudaMemory( + const std::shared_ptr& gpu_replica, + std::vector> gpu_memory_sizes); + ModelPtr GetModelByName(const std::string& model_path); + MemPtrListMap GetDevicePtrsFromMemHandles( + const MemCopyHandleListMap& memory_handles); +}; \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/checkpoint_store_py.cpp b/sllm_store/csrc/sllm_store/checkpoint_store_py.cpp new file mode 100644 index 0000000..9835e89 --- /dev/null +++ b/sllm_store/csrc/sllm_store/checkpoint_store_py.cpp @@ -0,0 +1,83 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#include +#include +#include + +#include "checkpoint_store.h" +#include "types_and_defs.h" + +namespace py = pybind11; + +PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + // Binding for MemCopyChunk + py::class_(m, "MemCopyChunk") + .def(py::init<>()) + .def_readwrite("src_offset", &MemCopyChunk::src_offset_) + .def_readwrite("size", &MemCopyChunk::size_) + .def_readwrite("dst_offset", &MemCopyChunk::dst_offset_) + .def_readwrite("handle_idx", &MemCopyChunk::handle_idx_); + + py::class_(m, "CheckpointStore") + .def(py::init(), + py::arg("storage_path"), py::arg("memory_pool_size"), + py::arg("num_thread"), py::arg("chunk_size")) + .def("register_model_info", &CheckpointStore::RegisterModelInfo, + py::arg("model_path"), + "Register the model information and return its size.") + .def("load_model_from_disk_async", + &CheckpointStore::LoadModelFromDiskAsync, py::arg("model_path"), + "Load a model from disk asynchronously.") + .def( + "load_model_from_mem_async", + [](CheckpointStore& cs, const std::string& model_path, + const std::string& replica_uuid, + const std::unordered_map>& + gpu_memory_handles, + const MemCopyChunkListMap& mem_copy_chunks) { + // Convert memory handles to MemCopyHandleListMap + MemCopyHandleListMap gpu_memory_handles_map; + for (const auto& [device_id, handles] : gpu_memory_handles) { + MemCopyHandleList handle_list; + for (const auto& handle : handles) { + handle_list.push_back( + MemCopyHandle{handle.cast()}); + } + gpu_memory_handles_map[device_id] = handle_list; + } + return cs.LoadModelFromMemAsync(model_path, replica_uuid, + gpu_memory_handles_map, + mem_copy_chunks); + }, + py::arg("model_path"), py::arg("replica_uuid"), + py::arg("gpu_memory_handles"), py::arg("mem_copy_chunks"), + "Load a model from memory asynchronously.") + .def("wait_model_in_gpu", &CheckpointStore::WaitModelInGpu, + py::arg("model_path"), py::arg("replica_uuid"), + "Wait for a model to be available in GPU memory.") + .def("unload_model_from_host", &CheckpointStore::UnloadModelFromHost, + py::arg("model_path"), "Unload a model from the host memory.") + .def("clear_mem", &CheckpointStore::ClearMem, + "Clear all allocated memory.") + .def("get_mem_pool_size", &CheckpointStore::GetMemPoolSize, + "Get the memory pool size.") + .def("get_chunk_size", &CheckpointStore::GetChunkSize, + "Get the chunk size.") + .def("__repr__", + [](const CheckpointStore& cs) { return ""; }); +} \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/concurrent_queue.h b/sllm_store/csrc/sllm_store/concurrent_queue.h new file mode 100644 index 0000000..356ca15 --- /dev/null +++ b/sllm_store/csrc/sllm_store/concurrent_queue.h @@ -0,0 +1,65 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#pragma once + +#include +#include +#include + +template +class ConcurrentQueue { + public: + ConcurrentQueue() = default; + ConcurrentQueue(const ConcurrentQueue&) = delete; + ConcurrentQueue& operator=(const ConcurrentQueue&) = delete; + + void enqueue(T item); + T dequeue(); + bool isEmpty(); + + private: + std::queue queue_; + std::mutex mtx_; + std::condition_variable cond_; +}; + +template +void ConcurrentQueue::enqueue(T item) { + std::unique_lock lock(mtx_); + queue_.push(std::move(item)); + lock.unlock(); // explicitly unlock before notifying to minimize the waiting + // time of the notified thread + cond_.notify_one(); +} + +template +T ConcurrentQueue::dequeue() { + std::unique_lock lock(mtx_); + while (queue_.empty()) { + cond_.wait(lock); // release lock and wait to be notified + } + T item = std::move(queue_.front()); + queue_.pop(); + return item; +} + +template +bool ConcurrentQueue::isEmpty() { + std::unique_lock lock(mtx_); + return queue_.empty(); +} \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/concurrent_vector.h b/sllm_store/csrc/sllm_store/concurrent_vector.h new file mode 100644 index 0000000..df1fa6a --- /dev/null +++ b/sllm_store/csrc/sllm_store/concurrent_vector.h @@ -0,0 +1,89 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#pragma once + +#include +#include +#include +#include +#include + +template +class ConcurrentVector { + private: + std::vector data; + std::mutex mtx_; + std::condition_variable cond_; + size_t size_ = 0; + size_t capacity_ = 0; + std::string name_; + std::unordered_set keys_; + + public: + ConcurrentVector() = default; + ConcurrentVector(const ConcurrentVector&) = delete; + ConcurrentVector& operator=(const ConcurrentVector&) = delete; + void init(std::string name, size_t capacity); + size_t capacity(); + bool find(size_t key); + void enqueue(uint64_t key, T item); + T dequeue(size_t pivot); +}; + +template +void ConcurrentVector::init(std::string name, size_t capacity) { + std::lock_guard lock(mtx_); + capacity_ = capacity; + name_ = std::move(name); + data.resize(capacity_); + size_ = 0; +} + +template +size_t ConcurrentVector::capacity() { + std::lock_guard lock(mtx_); + return capacity_; +} + +template +bool ConcurrentVector::find(size_t key) { + std::lock_guard lock(mtx_); + return keys_.find(key) != keys_.end(); +} + +template +void ConcurrentVector::enqueue(uint64_t key, T item) { + std::lock_guard lock(mtx_); + + if (keys_.find(key) != keys_.end()) { + return; + } + + size_t idx = size_; + size_++; + data[idx] = std::move(item); + keys_.insert(key); + cond_.notify_all(); +} + +template +T ConcurrentVector::dequeue(size_t pivot) { + std::unique_lock lock(mtx_); + cond_.wait(lock, [this, pivot] { return pivot < size_; }); + return data[pivot]; +} diff --git a/sllm_store/csrc/sllm_store/cuda_memory.cpp b/sllm_store/csrc/sllm_store/cuda_memory.cpp new file mode 100644 index 0000000..06518fb --- /dev/null +++ b/sllm_store/csrc/sllm_store/cuda_memory.cpp @@ -0,0 +1,70 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#include "cuda_memory.h" + +#include + +CudaMemory::CudaMemory() : data_(nullptr), size_(0), device_(-1) {} + +CudaMemory::~CudaMemory() { + if (data_) { // Ensure we have data to free + cudaFree(data_); + } +} + +int CudaMemory::Allocate(size_t size, int device) { + if (data_) { + LOG(ERROR) << "Memory already allocated\n"; + return 1; // Indicate error + } + + // Check if device and size are valid + int deviceCount; + cudaGetDeviceCount(&deviceCount); + if (device >= deviceCount || size == 0) { + LOG(ERROR) << "Invalid device or size\n"; + return 1; // Indicate error + } + + // Set device and allocate memory on it + cudaSetDevice(device); + cudaError_t status = cudaMalloc(&data_, size); + if (status != cudaSuccess) { + LOG(ERROR) << "Failed to allocate memory on device " << device << ": " + << cudaGetErrorString(status) << "\n"; + return status; + } + device_ = device; + size_ = size; + + // Get IPC handle + status = cudaIpcGetMemHandle(&handle_, data_); + if (status != cudaSuccess) { + cudaFree(data_); + data_ = nullptr; + LOG(ERROR) << "Failed to get IPC handle: " << cudaGetErrorString(status) + << "\n"; + return status; + } + + return cudaSuccess; // Indicate success +} + +void* CudaMemory::get() const { return data_; } + +cudaIpcMemHandle_t CudaMemory::getHandle() const { return handle_; } diff --git a/sllm_store/csrc/sllm_store/cuda_memory.h b/sllm_store/csrc/sllm_store/cuda_memory.h new file mode 100644 index 0000000..9580aa8 --- /dev/null +++ b/sllm_store/csrc/sllm_store/cuda_memory.h @@ -0,0 +1,44 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#pragma once + +#include + +// #include "cuda_memory_pool.h" + +class CudaMemory { + public: + CudaMemory(); + ~CudaMemory(); + + // Disable copying and moving + CudaMemory(const CudaMemory&) = delete; + CudaMemory& operator=(const CudaMemory&) = delete; + CudaMemory(CudaMemory&&) = delete; + CudaMemory& operator=(CudaMemory&&) = delete; + + int Allocate(size_t size, int device); + void* get() const; + cudaIpcMemHandle_t getHandle() const; + + private: + void* data_; + cudaIpcMemHandle_t handle_; + size_t size_; + int device_; +}; diff --git a/sllm_store/csrc/sllm_store/cuda_memory_pool.cpp b/sllm_store/csrc/sllm_store/cuda_memory_pool.cpp new file mode 100644 index 0000000..e689c52 --- /dev/null +++ b/sllm_store/csrc/sllm_store/cuda_memory_pool.cpp @@ -0,0 +1,102 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#include "cuda_memory_pool.h" + +#include + +#include + +CudaMemoryPool::CudaMemoryPool(int device_count, size_t size_per_device) + : device_count_(device_count), size_per_device_(size_per_device) { + pool_.resize(device_count); + handles_.resize(device_count); + free_list_.resize(device_count); + LOG(INFO) << "Creating CudaMemoryPool with " << device_count + << " devices, each with " << size_per_device << " bytes"; + for (int i = 0; i < device_count; ++i) { + cudaError_t err = cudaSetDevice(i); + if (err != cudaSuccess) { + LOG(FATAL) << "Failed to set device: " << cudaGetErrorString(err); + } + void* ptr = nullptr; + err = cudaMalloc(&ptr, size_per_device); + if (err != cudaSuccess) { + LOG(FATAL) << "Failed to allocate memory on device " << i << ": " + << cudaGetErrorString(err); + } + err = cudaIpcGetMemHandle(&handles_[i], ptr); + if (err != cudaSuccess) { + LOG(FATAL) << "Error getting GPU memory handle " + << cudaGetErrorString(err); + } + pool_[i] = ptr; + free_list_[i] = true; + } +} + +CudaMemoryPool::~CudaMemoryPool() { + for (int i = 0; i < device_count_; ++i) { + cudaError_t err = cudaSetDevice(i); + if (err != cudaSuccess) { + LOG(FATAL) << "Failed to set device: " << cudaGetErrorString(err); + } + err = cudaFree(pool_[i]); + if (err != cudaSuccess) { + LOG(FATAL) << "Failed to free memory on device " << i << ": " + << cudaGetErrorString(err); + } + } +} + +int CudaMemoryPool::Allocate(size_t size, int device_id, void*& ptr, + cudaIpcMemHandle_t& handle) { + std::lock_guard lock(mutex_); + if (device_id < 0 || device_id >= device_count_) { + LOG(ERROR) << "Invalid device id " << device_id; + return -1; + } else if (size > size_per_device_) { + LOG(ERROR) << "Requested size " << size << " exceeds size per device " + << size_per_device_; + return -1; + } else if (!free_list_[device_id]) { + LOG(ERROR) << "Device " << device_id << " is not free"; + return -1; + } + + ptr = pool_[device_id]; + handle = handles_[device_id]; + free_list_[device_id] = false; + return 0; +} + +int CudaMemoryPool::Deallocate(int device_id, void* ptr) { + std::lock_guard lock(mutex_); + if (device_id < 0 || device_id >= device_count_) { + LOG(ERROR) << "Invalid device id " << device_id; + return -1; + } else if (free_list_[device_id]) { + LOG(ERROR) << "Device " << device_id << " is already free"; + return -1; + } else if (ptr != pool_[device_id]) { + LOG(ERROR) << "Invalid pointer " << ptr; + return -1; + } + + free_list_[device_id] = true; + return 0; +} diff --git a/sllm_store/csrc/sllm_store/cuda_memory_pool.h b/sllm_store/csrc/sllm_store/cuda_memory_pool.h new file mode 100644 index 0000000..b8bff67 --- /dev/null +++ b/sllm_store/csrc/sllm_store/cuda_memory_pool.h @@ -0,0 +1,43 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#pragma once + +#include + +#include +#include + +class CudaMemoryPool { + public: + CudaMemoryPool(int device_count, size_t size_per_device); + CudaMemoryPool(const CudaMemoryPool&) = delete; + CudaMemoryPool& operator=(const CudaMemoryPool&) = delete; + ~CudaMemoryPool(); + + int Allocate(size_t size, int device_id, void*& ptr, + cudaIpcMemHandle_t& handle); + int Deallocate(int device_id, void* ptr); + + private: + std::mutex mutex_; + int device_count_; + size_t size_per_device_; + std::vector pool_; + std::vector handles_; + std::vector free_list_; +}; diff --git a/sllm_store/csrc/sllm_store/error_handling.h b/sllm_store/csrc/sllm_store/error_handling.h new file mode 100644 index 0000000..596e7fa --- /dev/null +++ b/sllm_store/csrc/sllm_store/error_handling.h @@ -0,0 +1,58 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#pragma once + +#include +#include +#include +#include + +#define CUDA_CHECK(x, msg) \ + { \ + if ((x) != cudaSuccess) { \ + LOG(ERROR) << msg << " " << cudaGetErrorString(cudaGetLastError()) \ + << std::endl; \ + return -1; \ + } \ + } + +#define CHECK_POSIX(x, msg) \ + { \ + if ((x) < 0) { \ + LOG(ERROR) << msg << " errno: " << errno << "msg: " << strerror(errno); \ + return -1; \ + } \ + } + +#define WAIT_FUTURES(futures, msg) \ + { \ + for (auto& future : futures) { \ + int ret = future.get() if (ret != 0) { \ + LOG(ERROR) << msg; \ + return ret; \ + } \ + } \ + } + +#define CHECK_RETURN(x, msg) \ + { \ + if ((x) != 0) { \ + LOG(ERROR) << msg; \ + return -1; \ + } \ + } diff --git a/sllm_store/csrc/sllm_store/gpu_replica.cpp b/sllm_store/csrc/sllm_store/gpu_replica.cpp new file mode 100644 index 0000000..694935f --- /dev/null +++ b/sllm_store/csrc/sllm_store/gpu_replica.cpp @@ -0,0 +1,36 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#include "gpu_replica.h" + +#include +#include + +void GpuReplica::Clear() { + for (auto& [device_id, device_ptr] : device_ptrs_) { + cudaSetDevice(device_id); + cudaError_t err = cudaIpcCloseMemHandle(device_ptr); + if (err != cudaSuccess) { + LOG(ERROR) << "Failed to close memory handle for device " << device_id + << " error: " << cudaGetErrorString(err); + } + } + gpu_loading_queue_.clear(); + tensor_offsets_.clear(); + state_ = MemoryState::INTERRUPTED; + cv_.notify_all(); +} \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/gpu_replica.h b/sllm_store/csrc/sllm_store/gpu_replica.h new file mode 100644 index 0000000..d9c5506 --- /dev/null +++ b/sllm_store/csrc/sllm_store/gpu_replica.h @@ -0,0 +1,36 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#pragma once + +#include +#include +#include + +#include "types_and_defs.h" + +class GpuReplica { + std::condition_variable cv_; + MemoryState state_ = MemoryState::UNINITIALIZED; + + std::unordered_map> gpu_loading_queue_; + std::unordered_map device_ptrs_; + + std::unordered_map tensor_offsets_; + + void Clear(); +}; \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/memory_state.cpp b/sllm_store/csrc/sllm_store/memory_state.cpp new file mode 100644 index 0000000..d0eef9e --- /dev/null +++ b/sllm_store/csrc/sllm_store/memory_state.cpp @@ -0,0 +1,40 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#include "memory_state.h" + +#include + +std::ostream& operator<<(std::ostream& os, const MemoryState state) { + return os << [state]() -> const char* { +#define PROCESS_STATE(p) \ + case (p): \ + return #p; + switch (state) { + PROCESS_STATE(UNINITIALIZED); + PROCESS_STATE(UNALLOCATED); + PROCESS_STATE(ALLOCATED); + PROCESS_STATE(LOADING); + PROCESS_STATE(LOADED); + PROCESS_STATE(CANCELLED); + PROCESS_STATE(INTERRUPTED); + default: + return "UNKNOWN"; + } +#undef PROCESS_STATE + }(); +} \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/memory_state.h b/sllm_store/csrc/sllm_store/memory_state.h new file mode 100644 index 0000000..e911b43 --- /dev/null +++ b/sllm_store/csrc/sllm_store/memory_state.h @@ -0,0 +1,28 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#pragma once + +enum MemoryState : int { + UNINITIALIZED, + UNALLOCATED, + ALLOCATED, + LOADING, + LOADED, + CANCELLED = 100, + INTERRUPTED = 101 +}; \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/model.cpp b/sllm_store/csrc/sllm_store/model.cpp new file mode 100644 index 0000000..2d8a62c --- /dev/null +++ b/sllm_store/csrc/sllm_store/model.cpp @@ -0,0 +1,610 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#include "model.h" + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +// Third-party library headers +#include +#include + +#include "error_handling.h" + +int Model::Initialize(const std::filesystem::path storage_path) { + std::lock_guard lock(mutex_); + if (state_ != MemoryState::UNINITIALIZED) { + return 0; + } + model_size_ = 0; + partition_sizes_.clear(); + partition_paths_.clear(); + // Attempt to read from 0 until the file is not found + for (int partition_id = 0;; ++partition_id) { + auto tensor_path = storage_path / model_path_ / + ("tensor.data_" + std::to_string(partition_id)); + if (access(tensor_path.c_str(), F_OK) == -1) { + LOG(INFO) << "Tensor file " << tensor_path << " does not exist"; + break; + } + struct stat st; + if (stat(tensor_path.c_str(), &st) != 0) { + LOG(ERROR) << "Failed to get file size of " << tensor_path; + return -1; + } + model_size_ += st.st_size; + partition_sizes_.push_back(st.st_size); + partition_paths_.push_back(tensor_path); + } + if (model_size_ == 0) { + LOG(ERROR) << "Model " << model_path_ << " does not exist"; + return -1; + } + state_ = MemoryState::UNALLOCATED; + + return 0; +} + +int Model::ToHost(int num_threads) { + std::unique_lock lock(mutex_); + if (state_ != MemoryState::ALLOCATED) { + if (state_ == MemoryState::LOADING || state_ == MemoryState::LOADED) { + return 0; + } else { + LOG(ERROR) << "Model " << model_path_ << " is at state " << state_; + return -1; + } + } + + std::vector file_descriptors; + // Attempt to read from 0 until the file is not found + for (int partition_id = 0; partition_id < partition_sizes_.size(); + ++partition_id) { + auto tensor_path = partition_paths_[partition_id]; + if (access(tensor_path.c_str(), F_OK) == -1) { + LOG(ERROR) << "File " << tensor_path << " does not exist"; + return -1; + } + + // Open file + int fd = open(tensor_path.c_str(), O_DIRECT | O_RDONLY); + if (fd < 0) { + std::string err = "open() failed for file: " + tensor_path.string() + + ", error: " + strerror(errno); + LOG(ERROR) << err; + return -1; + } + + file_descriptors.push_back(fd); + } + + LOG(INFO) << "Loading model " << model_path_ << " size " << model_size_ + << " to host"; + if (!pinned_mem_ || pinned_mem_->num_chunks() == 0) { + LOG(ERROR) << "CPU memory not allocated"; + return 1; + } + + auto host_buffers = pinned_mem_->get(); + size_t num_chunks = pinned_mem_->num_chunks(); + size_t chunk_size = pinned_mem_->chunk_size(); + host_ptr_vector_ = std::make_shared(); + host_ptr_vector_->init("queue_name", num_chunks); + std::vector> futures; + size_t chunk_per_thread = (num_chunks + num_threads - 1) / num_threads; + LOG(INFO) << "Loading model " << model_path_ << " to host with " + << num_threads << " threads, " << num_chunks << " chunks, " + << chunk_size << " chunk size, " << chunk_per_thread + << " chunks per thread"; + + state_ = MemoryState::LOADING; + lock.unlock(); + + for (int thread_idx = 0; thread_idx < num_threads; ++thread_idx) { + futures.emplace_back(std::async(std::launch::async, [&, thread_idx]() { + size_t partition_id = 0; + size_t file_offset = thread_idx * chunk_per_thread * chunk_size; + while (partition_id < partition_sizes_.size() && + file_offset >= partition_sizes_.at(partition_id)) { + file_offset -= partition_sizes_.at(partition_id); + partition_id += 1; + } + if (partition_id >= partition_sizes_.size()) { + LOG(INFO) << "Thread " << thread_idx << " early exits"; + return 0; + } + LOG(INFO) << "Thread " << thread_idx << " starting from partition " + << partition_id << " offset " << file_offset; + for (size_t chunk_idx = thread_idx * chunk_per_thread; + chunk_idx < (thread_idx + 1) * chunk_per_thread && + chunk_idx < num_chunks; + ++chunk_idx) { + size_t size = + std::min(chunk_size, model_size_ - chunk_idx * chunk_size); + if (host_buffers[chunk_idx] == nullptr) { + LOG(ERROR) << "Host buffer not allocated"; + return -1; + } + + if (state_ == MemoryState::CANCELLED) { + LOG(INFO) << "Loading from disk for model " << model_path_ + << " is cancelled"; + return 0; + } + + int fd = file_descriptors[partition_id]; + ssize_t ret = + pread(fd, (void*)host_buffers[chunk_idx], size, file_offset); + if (ret < 0) { + auto tensor_path = partition_paths_[partition_id]; + LOG(ERROR) << "pread() failed for file: " << tensor_path + << ", error: " << strerror(errno); + return -1; + } else if (ret != size) { + if (ret < size && partition_id + 1 < file_descriptors.size()) { + partition_id += 1; + file_offset = 0; + size_t remaining_size = size - ret; + int fd = file_descriptors[partition_id]; + ret = pread(fd, (void*)(host_buffers[chunk_idx] + ret), + remaining_size, file_offset); + if (ret != remaining_size) { + auto tensor_path = partition_paths_[partition_id]; + LOG(ERROR) << "Failed to read file: " << tensor_path + << " read: " << ret << " expected: " << remaining_size; + return -1; + } + } else { + auto tensor_path = partition_paths_[partition_id]; + LOG(ERROR) << "Failed to read file: " << tensor_path + << " read: " << ret << " expected: " << size; + return -1; + } + } + file_offset += ret; + + host_ptr_vector_->enqueue(chunk_idx, Batch{chunk_idx, size}); + } + + return 0; + })); + } + + bool error = false; + for (auto& future : futures) { + int ret = future.get(); + if (ret != 0) { + LOG(ERROR) << "Error reading from disk, ret " << ret; + error = true; + } + } + + // close file + for (int fd : file_descriptors) { + close(fd); + } + + lock.lock(); + if (error) { + state_ = MemoryState::INTERRUPTED; + // Deal with gpu replicas + for (auto& [replica_uuid, gpu_replica] : gpu_replicas_) { + if (gpu_replica->state_ == MemoryState::LOADING) { + gpu_replica->state_ = MemoryState::CANCELLED; + gpu_replica->cv_.notify_all(); + } + // wait for gpu replicas to finish + gpu_replica->cv_.wait(lock, [&gpu_replica] { + return gpu_replica->state_ == MemoryState::LOADED || + gpu_replica->state_ == MemoryState::INTERRUPTED; + }); + // Note: gpu replicas will be handled by the caller + } + // release pinned memory + pinned_mem_.reset(); + state_ = MemoryState::UNALLOCATED; + + return -1; + } + + state_ = MemoryState::LOADED; + LOG(INFO) << "Finished loading model " << model_path_ << " from disk"; + + return 0; +} + +int Model::ToGpu( + const std::string& replica_uuid, const MemPtrListMap& device_ptrs, + const std::unordered_map& mem_copy_chunks, + const std::unordered_map& mem_copy_handles) { + std::unique_lock lock(mutex_); + if (state_ == MemoryState::UNINITIALIZED) { + LOG(ERROR) << "Model " << model_path_ << " is not initialized"; + return -1; + } + + if (gpu_replicas_.find(replica_uuid) != gpu_replicas_.end()) { + LOG(ERROR) << "Replica " << replica_uuid << " already exists"; + return -1; + } + LOG(INFO) << "Creating replica " << replica_uuid; + gpu_replicas_.emplace(replica_uuid, std::make_shared()); + GpuReplicaPtr gpu_replica = gpu_replicas_.at(replica_uuid); + for (const auto& [device_id, _] : device_ptrs) { + LOG(INFO) << "Creating queue for device " << device_id; + gpu_replica->gpu_loading_queue_.emplace(device_id, + std::make_shared()); + } + gpu_replica->device_ptrs_ = device_ptrs; + gpu_replica->state_ = MemoryState::LOADING; + LOG(INFO) << "Created replica " << replica_uuid; + cv_.notify_all(); + lock.unlock(); + + // Start a dispatcher first + auto dispatch_future = std::async( + std::launch::async, + [this, gpu_replica, mem_copy_chunks, mem_copy_handles]() { + return DispatchToGpu(gpu_replica, mem_copy_chunks, mem_copy_handles); + }); + + LOG(INFO) << "Dispatcher started for model " << model_path_; + + std::unordered_map> futures; + for (auto& [device_id, device_ptr_list] : device_ptrs) { + futures.emplace( + device_id, std::async(std::launch::async, [this, gpu_replica, device_id, + device_ptr_list]() { + auto gpu_loading_queue = + gpu_replica->gpu_loading_queue_.at(device_id); + if (!pinned_mem_ || pinned_mem_->num_chunks() == 0) { + LOG(ERROR) << "CPU memory not allocated"; + return 1; + } + + cudaError_t err = cudaSetDevice(device_id); + if (err != cudaSuccess) { + LOG(ERROR) << "Error setting device " << cudaGetErrorString(err); + return 1; + } + + auto& host_buffers = pinned_mem_->get(); + + size_t loaded_size = 0; + while (true) { + auto [chunk_id, chunk_offset, size, gpu_offset, handle_idx] = + gpu_loading_queue->dequeue(); + if (size == 0) { + break; + } + if (gpu_replica->state_ == MemoryState::CANCELLED) { + LOG(INFO) << "Loading from mem for model " << model_path_ + << " is cancelled," + << " chunk " << chunk_id << " offset " + << " size " << size; + return 0; + } + + CUDA_CHECK( + cudaMemcpy( + (void*)((char*)device_ptr_list[handle_idx] + gpu_offset), + (void*)(host_buffers[chunk_id] + chunk_offset), size, + cudaMemcpyHostToDevice), + "cudaMemcpy Error"); + loaded_size += size; + } + + LOG(INFO) << "Finished loading tensor from memory to device " + << device_id; + + return 0; + })); + } + + LOG(INFO) << "Waiting for model " << model_path_ << " num tasks " + << futures.size() << " state " << gpu_replica->state_; + dispatch_future.wait(); + bool error = false; + for (auto& [device_id, future] : futures) { + int ret = future.get(); + if (ret != 0) { + LOG(ERROR) << "Error copying to device " << device_id; + error = true; + } + } + + lock.lock(); + futures.clear(); + + if (error) { + LOG(ERROR) << "Failed to load model " << model_path_; + gpu_replica->state_ = MemoryState::INTERRUPTED; + } else { + gpu_replica->state_ = MemoryState::LOADED; + } + gpu_replica->cv_.notify_all(); + + // TODO: move to background thread + for (auto& [device_id, device_ptr_list] : gpu_replica->device_ptrs_) { + cudaSetDevice(device_id); + for (auto device_ptr : device_ptr_list) { + cudaError_t err = cudaIpcCloseMemHandle(device_ptr); + if (err != cudaSuccess) { + LOG(ERROR) << "Failed to close memory handle for device " << device_id + << " error: " << cudaGetErrorString(err); + } + } + } + + if (gpu_replica->state_ == MemoryState::INTERRUPTED) { + LOG(ERROR) << "Model " << model_path_ << " replica " << replica_uuid + << " is interrupted"; + return -1; + } + + return 0; +} + +int Model::WaitInHost() { + std::unique_lock lock(mutex_); + if (state_ < MemoryState::LOADED) { + cv_.wait(lock, [this] { + return state_ == MemoryState::LOADED || + state_ == MemoryState::INTERRUPTED; + }); + } + + if (state_ >= MemoryState::INTERRUPTED) { + LOG(INFO) << "Model " << model_path_ << " is interrupted"; + return 1; + } + + return 0; +} + +int Model::WaitInGpu(const std::string& replica_uuid) { + std::unique_lock lock(mutex_); + if (gpu_replicas_.find(replica_uuid) == gpu_replicas_.end()) { + cv_.wait(lock, [this, replica_uuid] { + return gpu_replicas_.find(replica_uuid) != gpu_replicas_.end(); + }); + } + + auto& gpu_replica = gpu_replicas_.at(replica_uuid); + + if (gpu_replica->state_ < MemoryState::LOADED) { + gpu_replica->cv_.wait(lock, [&gpu_replica] { + return gpu_replica->state_ == MemoryState::LOADED || + gpu_replica->state_ == MemoryState::INTERRUPTED; + }); + } + + if (gpu_replica->state_ >= MemoryState::INTERRUPTED) { + LOG(INFO) << "Model " << model_path_ << " is interrupted"; + return 1; + } + + return 0; +} + +int Model::FreeGpu(const std::string& replica_uuid) { + std::unique_lock lock(mutex_); + if (gpu_replicas_.find(replica_uuid) == gpu_replicas_.end()) { + LOG(ERROR) << "Model " << model_path_ << " replica " << replica_uuid + << " is not registered"; + return -1; + } + + auto& gpu_replica = gpu_replicas_.at(replica_uuid); + if (gpu_replica->state_ == MemoryState::UNINITIALIZED) { + LOG(WARNING) << "Model " << model_path_ << " replica " << replica_uuid + << " is not initialized"; + gpu_replicas_.erase(replica_uuid); + return 0; + } + + if (gpu_replica->state_ == MemoryState::LOADING) { + LOG(INFO) << "Waiting for model " << model_path_ << " replica " + << replica_uuid << " to be loaded"; + gpu_replica->cv_.wait(lock, [&gpu_replica] { + return gpu_replica->state_ == MemoryState::LOADED || + gpu_replica->state_ == MemoryState::INTERRUPTED; + }); + } + + gpu_replicas_.erase(replica_uuid); + return 0; +} + +int Model::FreeHost() { + std::unique_lock lock(mutex_); + if (state_ == MemoryState::UNINITIALIZED) { + LOG(WARNING) << "Model " << model_path_ << " is not initialized"; + return 1; + } + + if (state_ == MemoryState::UNALLOCATED) { + LOG(WARNING) << "Model " << model_path_ << " is not allocated"; + return 1; + } + + if (state_ == MemoryState::LOADING) { + LOG(INFO) << "Waiting for model " << model_path_ << " to be loaded"; + cv_.wait(lock, [this] { + return state_ == MemoryState::LOADED || + state_ == MemoryState::INTERRUPTED; + }); + } + + // make sure no gpu replicas are loading + for (auto& [replica_uuid, gpu_replica] : gpu_replicas_) { + if (gpu_replica->state_ == MemoryState::LOADING) { + LOG(INFO) << "Waiting for replica " << replica_uuid << " to be loaded"; + gpu_replica->cv_.wait(lock, [&gpu_replica] { + return gpu_replica->state_ == MemoryState::LOADED || + gpu_replica->state_ == MemoryState::INTERRUPTED; + }); + } + } + + // free pinned memory + int freed_chunks = pinned_mem_->num_chunks(); + pinned_mem_.reset(); + state_ = MemoryState::UNALLOCATED; + + return 0; +} + +int Model::TryFreeHost() { + std::unique_lock lock(mutex_); + if (state_ == MemoryState::UNINITIALIZED) { + LOG(WARNING) << "Model " << model_path_ << " is not initialized"; + return 0; + } + + if (state_ == MemoryState::UNALLOCATED) { + LOG(WARNING) << "Model " << model_path_ << " is not allocated"; + return 0; + } + + if (state_ == MemoryState::LOADING) { + return -1; + } + + // make sure no gpu replicas are loading + for (auto& [replica_uuid, gpu_replica] : gpu_replicas_) { + if (gpu_replica->state_ == MemoryState::LOADING) { + return -1; + } + } + + // free pinned memory + int freed_chunks = pinned_mem_->num_chunks(); + pinned_mem_.reset(); + state_ = MemoryState::UNALLOCATED; + + return freed_chunks; +} + +int Model::DispatchToGpu( + const std::shared_ptr& gpu_replica, + const std::unordered_map& mem_copy_chunks, + const std::unordered_map& mem_copy_handles) { + // device_id, chunk_offset, size, gpu_offset + + size_t num_chunks = pinned_mem_->num_chunks(); + std::vector> chunk_id_to_gpu_chunks(num_chunks); + for (const auto& [device_id, mem_copy_chunk_list] : mem_copy_chunks) { + const auto& device_handles = mem_copy_handles.at(device_id); + std::vector handle_offsets(device_handles.size(), 0); + + for (auto [host_offset, size, gpu_offset, handle_idx] : + mem_copy_chunk_list) { + handle_offsets[handle_idx] = gpu_offset; + + std::vector> chunks = + MapDataToChunks(host_offset, size, pinned_mem_->chunk_size()); + for (const auto& [chunk_id, chunk_offset, size] : chunks) { + chunk_id_to_gpu_chunks[chunk_id].push_back( + std::make_tuple(device_id, chunk_offset, size, + handle_offsets[handle_idx], handle_idx)); + handle_offsets[handle_idx] += size; + } + } + } + + for (int i = 0; i < host_ptr_vector_->capacity(); i++) { + auto data_chunk = host_ptr_vector_->dequeue(i); + auto chunk_id = data_chunk.chunk_id_; + auto& gpu_chunks = chunk_id_to_gpu_chunks[chunk_id]; + for (const auto& [device_id, chunk_offset, size, gpu_offset, handle_idx] : + gpu_chunks) { + auto& gpu_loading_queue = gpu_replica->gpu_loading_queue_.at(device_id); + // LOG(INFO) << "Enqueueing chunk " << chunk_id << " offset " << + // chunk_offset + // << " size " << size << " to device " << device_id; + gpu_loading_queue->enqueue( + GpuBatch{chunk_id, chunk_offset, size, gpu_offset, handle_idx}); + } + } + + // notify end of loading + for (auto& [device_id, gpu_loading_queue] : gpu_replica->gpu_loading_queue_) { + gpu_loading_queue->enqueue(GpuBatch{}); + } + + return 0; +} + +std::vector> Model::MapDataToChunks( + size_t offset, size_t size, size_t chunk_size) { + int start_chunk = offset / chunk_size; + size_t offset_in_start_chunk = offset % chunk_size; + size_t remaining_data = size; + std::vector> output; + + for (int chunk_id = start_chunk; remaining_data > 0; ++chunk_id) { + const size_t chunk_data_size = + (chunk_id == start_chunk) + ? std::min(chunk_size - offset_in_start_chunk, remaining_data) + : std::min(chunk_size, remaining_data); + output.emplace_back(chunk_id, + chunk_id == start_chunk ? offset_in_start_chunk : 0, + chunk_data_size); + remaining_data -= chunk_data_size; + } + + return output; +} + +int Model::AllocatePinnedMemory(std::shared_ptr pool) { + std::lock_guard lock(mutex_); + if (state_ == MemoryState::UNINITIALIZED) { + LOG(ERROR) << "Model " << model_path_ << " is not initialized"; + return -1; + } + if (state_ != MemoryState::UNALLOCATED) { + return 0; + } + pinned_mem_ = std::make_shared(); + int ret = pinned_mem_->Allocate(model_size_, pool); + if (ret < 0) { + LOG(ERROR) << "Error allocating CPU memory for model " << model_path_; + return ret; + } else if (ret > 0) { + LOG(WARNING) << "Not enough memory for model " << model_path_; + return ret; + } else if (!pinned_mem_ || pinned_mem_->num_chunks() == 0) { + LOG(ERROR) << "CPU memory not allocated"; + return -1; + } + + state_ = MemoryState::ALLOCATED; + return 0; +}; \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/model.h b/sllm_store/csrc/sllm_store/model.h new file mode 100644 index 0000000..b60af26 --- /dev/null +++ b/sllm_store/csrc/sllm_store/model.h @@ -0,0 +1,92 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#pragma once + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +// Third-party library headers +#include +#include + +#include "error_handling.h" +#include "pinned_memory.h" +#include "types_and_defs.h" + +struct GpuReplica { + std::condition_variable cv_; + MemoryState state_ = MemoryState::UNINITIALIZED; + + std::unordered_map> gpu_loading_queue_; + MemPtrListMap device_ptrs_; +}; +using GpuReplicaPtr = std::shared_ptr; + +class Model { + public: + Model(const std::filesystem::path& model_path) : model_path_(model_path) {} + int Initialize(const std::filesystem::path storage_path); + int AllocatePinnedMemory(std::shared_ptr pool); + int ToHost(int num_threads); + int ToGpu(const std::string& replica_uuid, const MemPtrListMap& device_ptrs, + const std::unordered_map& mem_copy_chunks, + const std::unordered_map& mem_copy_handles); + int WaitInHost(); + int WaitInGpu(const std::string& replica_uuid); + int FreeGpu(const std::string& replica_uuid); + int FreeHost(); + int TryFreeHost(); + uint64_t GetModelSize() const { return model_size_; } + + private: + std::mutex mutex_; + std::condition_variable cv_; + MemoryState state_ = MemoryState::UNINITIALIZED; + + // Model path + const std::string model_path_; + + // Model info needs to be initialized + size_t model_size_; + std::vector partition_sizes_; + std::vector partition_paths_; + std::shared_ptr pinned_mem_; + + std::unordered_map gpu_replicas_; + + std::shared_ptr host_ptr_vector_; + + std::vector> MapDataToChunks( + size_t offset, size_t size, size_t chunk_size); + int DispatchToGpu( + const std::shared_ptr& gpu_replica, + const std::unordered_map& mem_copy_chunks, + const std::unordered_map& mem_copy_handles); +}; +using ModelPtr = std::shared_ptr; \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/pinned_memory.cpp b/sllm_store/csrc/sllm_store/pinned_memory.cpp new file mode 100644 index 0000000..2e93876 --- /dev/null +++ b/sllm_store/csrc/sllm_store/pinned_memory.cpp @@ -0,0 +1,41 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#include "pinned_memory.h" + +#include + +PinnedMemory::~PinnedMemory() { + LOG(INFO) << "Deallocating " << buffers_.size() << " memory chunks"; + int ret = mempool_->Deallocate(buffers_); + if (ret != 0) { + LOG(ERROR) << "Error deallocating CPU memory"; + } +} + +int PinnedMemory::Allocate(size_t size, + std::shared_ptr mempool) { + if (buffers_.size() > 0) { + LOG(ERROR) << "Memory already allocated"; + return 1; + } + + mempool_ = mempool; + return mempool_->Allocate(size, buffers_); +} + +std::vector& PinnedMemory::get() { return buffers_; } diff --git a/sllm_store/csrc/sllm_store/pinned_memory.h b/sllm_store/csrc/sllm_store/pinned_memory.h new file mode 100644 index 0000000..abf0b0d --- /dev/null +++ b/sllm_store/csrc/sllm_store/pinned_memory.h @@ -0,0 +1,44 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#pragma once + +#include +#include + +#include "pinned_memory_pool.h" + +class PinnedMemory { + public: + PinnedMemory() = default; + ~PinnedMemory(); + + // Disable copying and moving + PinnedMemory(const PinnedMemory&) = delete; + PinnedMemory& operator=(const PinnedMemory&) = delete; + PinnedMemory(PinnedMemory&&) = delete; + PinnedMemory& operator=(PinnedMemory&&) = delete; + + int Allocate(size_t size, std::shared_ptr mempool); + std::vector& get(); + size_t num_chunks() const { return buffers_.size(); } + size_t chunk_size() const { return mempool_->chunk_size(); } + + private: + std::vector buffers_; + std::shared_ptr mempool_; +}; diff --git a/sllm_store/csrc/sllm_store/pinned_memory_pool.cpp b/sllm_store/csrc/sllm_store/pinned_memory_pool.cpp new file mode 100644 index 0000000..488c7c1 --- /dev/null +++ b/sllm_store/csrc/sllm_store/pinned_memory_pool.cpp @@ -0,0 +1,100 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#include "pinned_memory_pool.h" + +#include +#include + +PinnedMemoryPool::PinnedMemoryPool(size_t total_size, size_t chunk_size) + : chunk_size_(chunk_size) { + size_t num_buffers = (total_size + chunk_size - 1) / chunk_size; + if (num_buffers * chunk_size != total_size) { + LOG(ERROR) << "PinnedMemoryPool size not multiple of chunk_size"; + } + LOG(INFO) << "Creating PinnedMemoryPool with " << num_buffers + << " buffers of " << chunk_size << " bytes"; + + for (size_t i = 0; i < num_buffers; ++i) { + char* buffer = static_cast(aligned_alloc(4096, chunk_size_)); + if (buffer == nullptr) { + LOG(FATAL) << "Malloc failed"; + } + + cudaError_t err = + cudaHostRegister(buffer, chunk_size_, cudaHostRegisterDefault); + if (err != cudaSuccess) { + LOG(FATAL) << "cudaHostRegister failed: " << cudaGetErrorString(err); + } + pool_.insert(buffer); + free_list_.insert(buffer); + } +} + +PinnedMemoryPool::~PinnedMemoryPool() { + for (char* buffer : pool_) { + cudaHostUnregister(buffer); + free(buffer); + } +} + +int PinnedMemoryPool::Allocate(size_t size, std::vector& buffers) { + std::lock_guard lock(mutex_); + if (size == 0) { + LOG(ERROR) << "PinnedMemoryPool Allocate size is zero"; + return -1; + } + + int num_buffers_needed = (size + chunk_size_ - 1) / chunk_size_; + if (num_buffers_needed > free_list_.size()) { + LOG(ERROR) << "PinnedMemoryPool out of memory (" << free_list_.size() + << " buffers available, " << num_buffers_needed + << " buffers needed)"; + return num_buffers_needed - free_list_.size(); + } + + buffers.clear(); + buffers.resize(num_buffers_needed); + auto it = free_list_.begin(); + for (size_t i = 0; i < num_buffers_needed; ++i) { + buffers[i] = *it; + it = free_list_.erase(it); + } + + LOG(INFO) << "PinnedMemoryPool Allocate " << buffers.size() << " buffers" + << " free buffers " << free_list_.size() << " total buffers " + << pool_.size(); + + return 0; // Success +} + +int PinnedMemoryPool::Deallocate(std::vector& buffers) { + std::lock_guard lock(mutex_); + for (char* buffer : buffers) { + if (pool_.find(buffer) == pool_.end()) { + LOG(ERROR) << "Buffer not found in pool"; + return -1; + } + if (free_list_.find(buffer) != free_list_.end()) { + LOG(ERROR) << "Buffer already in free list"; + return -1; + } + free_list_.insert(buffer); + } + LOG(INFO) << "Deallocated " << buffers.size() << " buffers"; + return 0; // Success +} diff --git a/sllm_store/csrc/sllm_store/pinned_memory_pool.h b/sllm_store/csrc/sllm_store/pinned_memory_pool.h new file mode 100644 index 0000000..ea3ce45 --- /dev/null +++ b/sllm_store/csrc/sllm_store/pinned_memory_pool.h @@ -0,0 +1,42 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#pragma once + +#include +#include +#include + +class PinnedMemoryPool { + public: + PinnedMemoryPool(size_t total_size, size_t chunk_size); + ~PinnedMemoryPool(); + + int Allocate(size_t size, std::vector& buffers); + int Deallocate(std::vector& buffers); + size_t chunk_size() const { return chunk_size_; } + + // Forbid copy and assignment + PinnedMemoryPool(const PinnedMemoryPool&) = delete; + PinnedMemoryPool& operator=(const PinnedMemoryPool&) = delete; + + private: + std::mutex mutex_; + std::unordered_set free_list_; + std::unordered_set pool_; + size_t chunk_size_; +}; \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/types_and_defs.h b/sllm_store/csrc/sllm_store/types_and_defs.h new file mode 100644 index 0000000..2f8f797 --- /dev/null +++ b/sllm_store/csrc/sllm_store/types_and_defs.h @@ -0,0 +1,74 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#pragma once + +#include +#include +#include + +#include "concurrent_queue.h" +#include "concurrent_vector.h" +#include "memory_state.h" + +struct Batch { + size_t chunk_id_ = 0; + size_t size_ = 0; +}; +typedef ConcurrentVector BatchVector; + +struct GpuBatch { + size_t chunk_id_ = 0; + size_t chunk_offset_ = 0; + size_t size_ = 0; + size_t gpu_offset_ = 0; + size_t handle_idx_ = 0; +}; +typedef ConcurrentQueue BatchQueue; + +struct FileChunk { + int fd_; + size_t file_offset_; + size_t size_; + size_t chunk_id_; + size_t chunk_offset_; +}; + +#define KB (1024LL) +#define MB (1024LL * KB) +#define GB (1024LL * MB) + +// using DeviceMap = std::unordered_map; +struct MemCopyChunk { + size_t src_offset_ = 0; + size_t size_ = 0; + size_t dst_offset_ = 0; + size_t handle_idx_ = 0; +}; +using MemCopyChunkList = std::vector; + +struct MemCopyHandle { + std::string cuda_ipc_handle_; +}; +using MemCopyHandleList = std::vector; + +typedef std::unordered_map MemCopyHandleListMap; +typedef std::unordered_map MemCopyChunkListMap; +typedef std::unordered_map> MemPtrListMap; + +// device_id, chunk_offset, size, gpu_offset. handle_idx +typedef std::tuple GpuChunk; diff --git a/sllm_store/examples/load_lora_adapter.py b/sllm_store/examples/load_lora_adapter.py new file mode 100644 index 0000000..9d56355 --- /dev/null +++ b/sllm_store/examples/load_lora_adapter.py @@ -0,0 +1,65 @@ +import argparse +import time + +import torch + +from transformers import AutoTokenizer + +from sllm_store.transformers import load_model, load_lora + +parser = argparse.ArgumentParser(description="Load a model from ServerlessLLM") +parser.add_argument( + "--model-name", type=str, required=True, help="Model name stored" +) +parser.add_argument( + "--adapter-name", type=str, required=True, help="Lora adapter name" +) +parser.add_argument( + "--adapter-path", type=str, required=True, help="Lora adapter path stored" +) +parser.add_argument( + "--storage-path", + type=str, + default="./models", + help="Local path stored the model.", +) + +args = parser.parse_args() + +model_name = args.model_name +lora_adapter_name = args.adapter_name +lora_adapter_path = args.adapter_path +storage_path = args.storage_path + + +# warm up the GPU +num_gpus = torch.cuda.device_count() +for i in range(num_gpus): + torch.ones(1).to(f"cuda:{i}") + torch.cuda.synchronize() + +start = time.time() +model = load_model( + model_name, + device_map="auto", + torch_dtype=torch.float16, + storage_path=storage_path, + fully_parallel=True, +) + +model = load_lora( + model, + lora_adapter_name, + lora_adapter_path, + device_map="auto", + storage_path=storage_path, + torch_dtype=torch.float16, +) +# Please note the loading time depends on model size and hardware bandwidth. +print(f"Model with lora adapter loading time: {time.time() - start:.2f}s") + +tokenizer = AutoTokenizer.from_pretrained(model_name) +inputs = tokenizer("Hello, my dog is cute", return_tensors="pt").to("cuda") +generate_kwargs = {"adapter_names": [lora_adapter_name]} +outputs = model.generate(**inputs, **generate_kwargs) +print(tokenizer.decode(outputs[0], skip_special_tokens=True)) diff --git a/sllm_store/examples/load_quantized_transformers_model.py b/sllm_store/examples/load_quantized_transformers_model.py new file mode 100644 index 0000000..3fb7d21 --- /dev/null +++ b/sllm_store/examples/load_quantized_transformers_model.py @@ -0,0 +1,66 @@ +import argparse +import time + +import torch + +from transformers import AutoTokenizer, BitsAndBytesConfig +from sllm_store.transformers import load_model + +parser = argparse.ArgumentParser(description="Load a model from ServerlessLLM") +parser.add_argument( + "--model-name", type=str, required=True, help="Model name stored" +) +parser.add_argument( + "--storage-path", + type=str, + default="./models", + help="Local path stored the model.", +) + +parser.add_argument( + "--precision", + type=str, + default="int8", + help="Precision of quantized model. Supports int8, fp4, and nf4", +) + +args = parser.parse_args() + +model_name = args.model_name +storage_path = args.storage_path + +# Define quantization configuration with BitsAndBytesConfig +if args.precision == "int8": + quantization_config = BitsAndBytesConfig(load_in_8bit=True) +elif args.precision == "fp4": + quantization_config = BitsAndBytesConfig(load_in_4bit=True) +elif args.precision == "nf4": + quantization_config = BitsAndBytesConfig( + load_in_4bit=True, bnb_4bit_quant_type="nf4" + ) +else: + quantization_config = None + +# warm up the GPU +num_gpus = torch.cuda.device_count() +for i in range(num_gpus): + torch.ones(1).to(f"cuda:{i}") + torch.cuda.synchronize() + +start = time.time() +model = load_model( + model_name, + device_map="auto", + torch_dtype=torch.float16, + storage_path=storage_path, + fully_parallel=True, + quantization_config=quantization_config, +) +# Please note the loading time depends on model size and hardware bandwidth. +print(f"Model loading time: {time.time() - start:.2f}s") + + +tokenizer = AutoTokenizer.from_pretrained(model_name) +inputs = tokenizer("Hello, my dog is cute", return_tensors="pt").to("cuda") +outputs = model.generate(**inputs) +print(tokenizer.decode(outputs[0], skip_special_tokens=True)) diff --git a/sllm_store/examples/load_transformers_model.py b/sllm_store/examples/load_transformers_model.py new file mode 100644 index 0000000..fcbd63f --- /dev/null +++ b/sllm_store/examples/load_transformers_model.py @@ -0,0 +1,48 @@ +import argparse +import time + +import torch + +from transformers import AutoTokenizer + +from sllm_store.transformers import load_model + +parser = argparse.ArgumentParser(description="Load a model from ServerlessLLM") +parser.add_argument( + "--model-name", type=str, required=True, help="Model name stored" +) +parser.add_argument( + "--storage-path", + type=str, + default="./models", + help="Local path stored the model.", +) + +args = parser.parse_args() + +model_name = args.model_name +storage_path = args.storage_path + + +# warm up the GPU +num_gpus = torch.cuda.device_count() +for i in range(num_gpus): + torch.ones(1).to(f"cuda:{i}") + torch.cuda.synchronize() + +start = time.time() +model = load_model( + model_name, + device_map="auto", + torch_dtype=torch.float16, + storage_path=storage_path, + fully_parallel=True, +) +# Please note the loading time depends on model size and hardware bandwidth. +print(f"Model loading time: {time.time() - start:.2f}s") + + +tokenizer = AutoTokenizer.from_pretrained(model_name) +inputs = tokenizer("Hello, my dog is cute", return_tensors="pt").to("cuda") +outputs = model.generate(**inputs) +print(tokenizer.decode(outputs[0], skip_special_tokens=True)) diff --git a/sllm_store/examples/load_vllm_model.py b/sllm_store/examples/load_vllm_model.py new file mode 100644 index 0000000..dfc9a7f --- /dev/null +++ b/sllm_store/examples/load_vllm_model.py @@ -0,0 +1,44 @@ +import argparse +import os + +from vllm import LLM, SamplingParams + +parser = argparse.ArgumentParser( + description="Save a model from HuggingFace model hub." +) +parser.add_argument( + "--model-name", + type=str, + required=True, + help="Model name from HuggingFace model hub.", +) +parser.add_argument( + "--storage-path", + type=str, + default="./models", + help="Local path to save the model.", +) + +args = parser.parse_args() + +model_name = args.model_name +storage_path = args.storage_path +model_path = os.path.join(storage_path, model_name) + +llm = LLM(model=model_path, load_format="serverless_llm", dtype="float16") + +prompts = [ + "Hello, my name is", + "The president of the United States is", + "The capital of France is", + "The future of AI is", +] + +sampling_params = SamplingParams(temperature=0.8, top_p=0.95) +outputs = llm.generate(prompts, sampling_params) + +# Print the outputs. +for output in outputs: + prompt = output.prompt + generated_text = output.outputs[0].text + print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") diff --git a/sllm_store/examples/save_lora_adapter.py b/sllm_store/examples/save_lora_adapter.py new file mode 100644 index 0000000..0330dac --- /dev/null +++ b/sllm_store/examples/save_lora_adapter.py @@ -0,0 +1,56 @@ +import argparse +import importlib +import os + +import torch +from transformers import AutoModelForCausalLM, AutoConfig +from peft import PeftModel + +from sllm_store.transformers import save_lora + +parser = argparse.ArgumentParser( + description="Save a lora adapter from HuggingFace model hub." +) +parser.add_argument( + "--model-name", + type=str, + required=True, + help="Model name from HuggingFace model hub.", +) +parser.add_argument( + "--adapter-name", + type=str, + required=True, + help="Lora adapter name from HuggingFace model hub.", +) +parser.add_argument( + "--storage-path", + type=str, + default="./models", + help="Local path to save the model.", +) + +args = parser.parse_args() + +base_model_name = args.model_name +lora_adapter_name = args.adapter_name +storage_path = args.storage_path + +config = AutoConfig.from_pretrained( + os.path.join(storage_path, "transformers", base_model_name), + trust_remote_code=True, +) +config.torch_dtype = torch.float16 +module = importlib.import_module("transformers") +hf_model_cls = getattr(module, AutoModelForCausalLM) +base_model = hf_model_cls.from_config( + config, + trust_remote_code=True, +).to(config.torch_dtype) + +# Load a lora adapter from HuggingFace model hub. +model = PeftModel.from_pretrained(base_model, lora_adapter_name) + +# Save the model to the local path. +model_path = os.path.join(storage_path, lora_adapter_name) +save_lora(model, model_path) diff --git a/sllm_store/examples/save_transformers_model.py b/sllm_store/examples/save_transformers_model.py new file mode 100644 index 0000000..17a5ac9 --- /dev/null +++ b/sllm_store/examples/save_transformers_model.py @@ -0,0 +1,37 @@ +import argparse +import os + +import torch +from transformers import AutoModelForCausalLM + +from sllm_store.transformers import save_model + +parser = argparse.ArgumentParser( + description="Save a model from HuggingFace model hub." +) +parser.add_argument( + "--model-name", + type=str, + required=True, + help="Model name from HuggingFace model hub.", +) +parser.add_argument( + "--storage-path", + type=str, + default="./models", + help="Local path to save the model.", +) + +args = parser.parse_args() + +model_name = args.model_name +storage_path = args.storage_path + +# Load a model from HuggingFace model hub. +model = AutoModelForCausalLM.from_pretrained( + model_name, torch_dtype=torch.float16 +) + +# Save the model to the local path. +model_path = os.path.join(storage_path, model_name) +save_model(model, model_path) diff --git a/sllm_store/examples/save_vllm_model.py b/sllm_store/examples/save_vllm_model.py new file mode 100644 index 0000000..5d5e099 --- /dev/null +++ b/sllm_store/examples/save_vllm_model.py @@ -0,0 +1,135 @@ +import argparse +import os +import shutil +from typing import Optional + + +class VllmModelDownloader: + def __init__(self): + pass + + def download_vllm_model( + self, + model_name: str, + torch_dtype: str, + tensor_parallel_size: int = 1, + storage_path: str = "./models", + local_model_path: Optional[str] = None, + pattern: Optional[str] = None, + max_size: Optional[int] = None, + ): + import gc + from tempfile import TemporaryDirectory + + import torch + from huggingface_hub import snapshot_download + from vllm import LLM + + # set the model storage path + storage_path = os.getenv("STORAGE_PATH", storage_path) + + def _run_writer(input_dir, model_name): + # load models from the input directory + llm_writer = LLM( + model=input_dir, + download_dir=input_dir, + dtype=torch_dtype, + tensor_parallel_size=tensor_parallel_size, + num_gpu_blocks_override=1, + enforce_eager=True, + max_model_len=1, + ) + model_path = os.path.join(storage_path, model_name) + model_executer = llm_writer.llm_engine.model_executor + # save the models in the ServerlessLLM format + model_executer.save_serverless_llm_state( + path=model_path, pattern=pattern, max_size=max_size + ) + for file in os.listdir(input_dir): + # Copy the metadata files into the output directory + if os.path.splitext(file)[1] not in ( + ".bin", + ".pt", + ".safetensors", + ): + src_path = os.path.join(input_dir, file) + dest_path = os.path.join(model_path, file) + if os.path.isdir(src_path): + shutil.copytree(src_path, dest_path) + else: + shutil.copy(src_path, dest_path) + del model_executer + del llm_writer + gc.collect() + if torch.cuda.is_available(): + torch.cuda.empty_cache() + torch.cuda.synchronize() + + try: + with TemporaryDirectory() as cache_dir: + input_dir = local_model_path + # download from huggingface + if local_model_path is None: + input_dir = snapshot_download( + model_name, + cache_dir=cache_dir, + allow_patterns=[ + "*.safetensors", + "*.bin", + "*.json", + "*.txt", + ], + ) + _run_writer(input_dir, model_name) + except Exception as e: + print(f"An error occurred while saving the model: {e}") + # remove the output dir + shutil.rmtree(os.path.join(storage_path, model_name)) + raise RuntimeError( + f"Failed to save {model_name} for vllm backend: {e}" + ) from e + + +parser = argparse.ArgumentParser( + description="Save a model from HuggingFace model hub." +) +parser.add_argument( + "--model-name", + type=str, + required=True, + help="Model name from HuggingFace model hub.", +) +parser.add_argument( + "--local-model-path", + type=str, + required=False, + help="Local path to the model snapshot.", +) +parser.add_argument( + "--storage-path", + type=str, + default="./models", + help="Local path to save the model.", +) +parser.add_argument( + "--tensor-parallel-size", + type=int, + default=1, + help="Tensor parallel size.", +) + +args = parser.parse_args() + +model_name = args.model_name +local_model_path = args.local_model_path +storage_path = args.storage_path +tensor_parallel_size = args.tensor_parallel_size + +downloader = VllmModelDownloader() +downloader.download_vllm_model( + model_name, + "float16", + tensor_parallel_size=tensor_parallel_size, + storage_path=storage_path, + local_model_path=local_model_path, +) diff --git a/sllm_store/proto/storage.proto b/sllm_store/proto/storage.proto new file mode 100644 index 0000000..f2f2d32 --- /dev/null +++ b/sllm_store/proto/storage.proto @@ -0,0 +1,94 @@ +syntax = "proto3"; + +package storage; + +service Storage { + rpc LoadModelAsync (LoadModelRequest) returns (LoadModelResponse) {} + rpc ConfirmModel (ConfirmModelRequest) returns (ConfirmModelResponse) {} + rpc UnloadModel (UnloadModelRequest) returns (UnloadModelResponse) {} + + rpc ClearMem (ClearMemRequest) returns (ClearMemResponse) {} + + rpc RegisterModel (RegisterModelRequest) returns (RegisterModelResponse) {} + rpc GetServerConfig (GetServerConfigRequest) returns (GetServerConfigResponse) {} +} + +message GetServerConfigRequest { +} + +message GetServerConfigResponse { + int64 mem_pool_size = 1; + int64 chunk_size = 2; +} + +message RegisterModelRequest { + string model_path = 1; +} + +message RegisterModelResponse { + string model_path = 1; + int64 model_size = 2; +} + +enum DeviceType { + DEVICE_TYPE_DISK = 0; + DEVICE_TYPE_CPU = 1; + DEVICE_TYPE_GPU = 2; +} + +message MemCopyChunk { + uint64 src_offset = 1; + uint64 size = 2; + uint64 dst_offset = 3; + uint64 handle_idx = 4; +} +message MemCopyChunkList { + repeated MemCopyChunk chunks = 1; +} +message MemCopyHandle { + bytes cuda_ipc_handle = 1; +} +message MemCopyHandleList { + repeated MemCopyHandle handles = 1; +} + +// If the handles has one item, all chunks share the same handle, other each chunk should have one handle +message LoadModelRequest { + string model_path = 1; + string replica_uuid = 2; + map chunks = 3; + map handles = 4; + DeviceType target_device_type = 5; +} + +message LoadModelResponse { + string model_path = 1; +} + +message ConfirmModelRequest { + string model_path = 1; + string replica_uuid = 2; + DeviceType target_device_type = 3; +} + +message ConfirmModelResponse { + string model_path = 1; + int32 code = 2; +} + +message UnloadModelRequest { + string model_path = 1; + string replica_uuid = 2; + DeviceType target_device_type = 3; +} + +message UnloadModelResponse { + string model_path = 1; + int32 code = 2; +} + +message ClearMemRequest { +} + +message ClearMemResponse { +} \ No newline at end of file diff --git a/sllm_store/py.typed b/sllm_store/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/sllm_store/pyproject.toml b/sllm_store/pyproject.toml new file mode 100644 index 0000000..e87d5e8 --- /dev/null +++ b/sllm_store/pyproject.toml @@ -0,0 +1,39 @@ +[build-system] +requires = [ + "setuptools", + "wheel", + "cmake>=3.20,<4.0.0", + "ninja", + "torch==2.7.0", + "numpy", +] +build-backend = "setuptools.build_meta" + + +[tool.ruff] +line-length = 80 +exclude = [ + "sllm_store/proto", +] + +[tool.ruff.lint] +select = [ + # pycodestyle + "E", + # Pyflakes + "F", + # pyupgrade + # "UP", + # flake8-bugbear + "B", + # flake8-simplify + "SIM", + # isort + # "I", +] +ignore = [] + + +[tool.isort] +use_parentheses = true +skip_gitignore = true diff --git a/sllm_store/requirements-build.txt b/sllm_store/requirements-build.txt new file mode 100644 index 0000000..7ed6a59 --- /dev/null +++ b/sllm_store/requirements-build.txt @@ -0,0 +1,7 @@ +cmake>=3.20,<4.0.0 +ninja +numpy +peft==0.15.2 +setuptools +torch==2.7.0 +wheel diff --git a/sllm_store/requirements.txt b/sllm_store/requirements.txt new file mode 100644 index 0000000..a227888 --- /dev/null +++ b/sllm_store/requirements.txt @@ -0,0 +1,8 @@ +accelerate==1.7.0 +bitsandbytes==0.46.0 +click>=8.1.7 +grpcio==1.72.1 +grpcio-tools==1.64.0 +peft==0.15.2 +torch==2.7.0 +transformers==4.52.4 diff --git a/sllm_store/setup.py b/sllm_store/setup.py new file mode 100644 index 0000000..aa653b1 --- /dev/null +++ b/sllm_store/setup.py @@ -0,0 +1,246 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import io +import os +import subprocess +import sys +from pathlib import Path +from typing import Dict + +from setuptools import Extension, setup +from setuptools.command.build_ext import build_ext +from setuptools.command.install import install + + +from torch.utils.cpp_extension import CUDA_HOME +from torch.utils.cpp_extension import ROCM_HOME + + +ROOT_DIR = os.path.dirname(__file__) + + +def check_nvcc_installed(cuda_home: str) -> None: + """Check if nvcc (NVIDIA CUDA compiler) is installed.""" + try: + _ = subprocess.check_output( + [cuda_home + "/bin/nvcc", "-V"], universal_newlines=True + ) + except Exception as e: + raise RuntimeError( + "nvcc is not installed or not found in your PATH. " + "Please ensure that the CUDA toolkit is installed and nvcc is available in your PATH." # noqa: E501 + f" Error: {e}" + ) from None + + +def check_hipcc_installed(rocm_home: str) -> None: + """Check if hipcc (AMD HIP compiler) is installed.""" + # can be either /hip/bin/hipcc or /bin/hipcc + hipcc_paths = [rocm_home + "/bin/hipcc", rocm_home + "/hip/bin/hipcc"] + for hipcc in hipcc_paths: + try: + _ = subprocess.check_output( + [hipcc, "--version"], universal_newlines=True + ) + return + except Exception: + continue + raise RuntimeError( + "hipcc is not installed or not found in your PATH. " + "Please ensure that the HIP toolkit is installed and hipcc is available in your PATH." # noqa: E501 + ) from None + + +if CUDA_HOME is not None: + check_nvcc_installed(CUDA_HOME) +elif ROCM_HOME is not None: + check_hipcc_installed(ROCM_HOME) +else: + raise RuntimeError( + "CUDA_HOME or ROCM_HOME environment variable must be set to compile CUDA or HIP extensions." # noqa: E501 + ) + + +def is_ninja_available() -> bool: + try: + subprocess.run(["ninja", "--version"], stdout=subprocess.PIPE) + except FileNotFoundError: + return False + return True + + +class CustomInstall(install): + """Custom installation to ensure proto files are compiled + and extensions are built before installation.""" + + def run(self): + self.run_command("build_ext") + super().run() + + +def fetch_requirements(path): + with open(path, "r") as fd: + return [r.strip() for r in fd.readlines()] + + +def remove_prefix(text, prefix): + if text.startswith(prefix): + return text[len(prefix) :] + return text + + +def get_path(*filepath) -> str: + return os.path.join(ROOT_DIR, *filepath) + + +def read_readme() -> str: + """Read the README file if present.""" + p = get_path("README.md") + if os.path.isfile(p): + return io.open(get_path("README.md"), "r", encoding="utf-8").read() + else: + return "" + + +install_requires = fetch_requirements("requirements.txt") + +extras = {} + +extras["test"] = [ + "pytest", + "accelerate>=0.27.2", + "transformers>=4.37.2", + "parameterized", +] + +sys.path.append(Path.cwd().as_posix()) + + +class CMakeExtension(Extension): + def __init__(self, name: str, cmake_lists_dir: str = ".", **kwa) -> None: + super().__init__(name, sources=[], **kwa) + self.cmake_lists_dir = os.path.abspath(cmake_lists_dir) + + +# Adapted from https://github.com/vllm-project/vllm/blob/a1242324c99ff8b1e29981006dfb504da198c7c3/setup.py +class cmake_build_ext(build_ext): + did_config: Dict[str, bool] = {} + + def configure(self, ext: CMakeExtension) -> None: + if ext.cmake_lists_dir in cmake_build_ext.did_config: + return + + cmake_build_ext.did_config[ext.cmake_lists_dir] = True + + default_cfg = "Debug" if self.debug else "Release" + cfg = os.getenv("CMAKE_BUILD_TYPE", default_cfg) + + outdir = os.path.abspath( + os.path.dirname(self.get_ext_fullpath(ext.name)) + ) + + cmake_args = [ + "-DCMAKE_BUILD_TYPE={}".format(cfg), + "-DCMAKE_LIBRARY_OUTPUT_DIRECTORY={}".format(outdir), + "-DCMAKE_RUNTIME_OUTPUT_DIRECTORY={}".format(outdir), + "-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY={}".format(self.build_temp), + ] + + # verbose = bool(int(os.getenv('VERBOSE', '1'))) + verbose = True + if verbose: + cmake_args += ["-DCMAKE_VERBOSE_MAKEFILE=ON"] + + cmake_args += [ + "-DSLLM_STORE_PYTHON_EXECUTABLE={}".format(sys.executable) + ] + + if is_ninja_available(): + build_tool = ["-G", "Ninja"] + cmake_args += [ + "-DCMAKE_JOB_POOL_COMPILE:STRING=compile", + "-DCMAKE_JOB_POOLS:STRING=compile={}".format(8), + ] + else: + # Default build tool to whatever cmake picks. + build_tool = [] + + subprocess.check_call( + ["cmake", ext.cmake_lists_dir, *build_tool, *cmake_args], + cwd=self.build_temp, + ) + + def build_extensions(self) -> None: + # Ensure that CMake is present and working + try: + subprocess.check_output(["cmake", "--version"]) + except OSError as e: + raise RuntimeError("Cannot find CMake executable") from e + + # Create build directory if it does not exist. + if not os.path.exists(self.build_temp): + os.makedirs(self.build_temp) + + # Build all the extensions + for ext in self.extensions: + self.configure(ext) + + ext_target_name = remove_prefix(ext.name, "sllm_store.") + # num_jobs = 32 + + build_args = [ + "--build", + ".", + "--target", + ext_target_name, + "-j", + # str(num_jobs) + ] + + subprocess.check_call(["cmake", *build_args], cwd=self.build_temp) + print(self.build_temp, ext_target_name) + + +cmdclass = { + "build_ext": cmake_build_ext, + "install": CustomInstall, +} + +setup( + name="serverless-llm-store", + version="0.7.0", + ext_modules=[ + CMakeExtension(name="sllm_store._C"), + CMakeExtension(name="sllm_store._checkpoint_store"), + ], + install_requires=install_requires, + long_description=read_readme(), + long_description_content_type="text/markdown", + extras_require=extras, + entry_points={ + "console_scripts": ["sllm-store=sllm_store.cli:main"], + }, + package_data={ + "sllm_store": ["py.typed", "*.so"], + }, + packages=[ + "sllm_store", + "sllm_store.proto", + ], + cmdclass=cmdclass, +) diff --git a/sllm_store/sllm_store/__init__.py b/sllm_store/sllm_store/__init__.py new file mode 100644 index 0000000..314e503 --- /dev/null +++ b/sllm_store/sllm_store/__init__.py @@ -0,0 +1,17 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # diff --git a/sllm_store/sllm_store/cli.py b/sllm_store/sllm_store/cli.py new file mode 100644 index 0000000..c9b4a87 --- /dev/null +++ b/sllm_store/sllm_store/cli.py @@ -0,0 +1,484 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # + +import asyncio +import importlib +import os +import shutil +import sys +import logging +import time +from typing import Optional +import torch +import click + +from sllm_store.server import serve +from sllm_store.logger import init_logger +from sllm_store.utils import to_num_bytes +from sllm_store.transformers import save_model, save_lora, load_model, load_lora +from transformers import ( + AutoModelForCausalLM, + AutoConfig, + AutoTokenizer, + BitsAndBytesConfig, +) +from peft import PeftModel + + +class VllmModelDownloader: + def __init__(self): + pass + + def download_vllm_model( + self, + model_name: str, + torch_dtype: str, + tensor_parallel_size: int = 1, + storage_path: str = "./models", + local_model_path: Optional[str] = None, + pattern: Optional[str] = None, + max_size: Optional[int] = None, + ): + import gc + from tempfile import TemporaryDirectory + + import torch + from huggingface_hub import snapshot_download + from vllm import LLM + + # set the model storage path + storage_path = os.getenv("STORAGE_PATH", storage_path) + + def _run_writer(input_dir, model_name): + # load models from the input directory + llm_writer = LLM( + model=input_dir, + download_dir=input_dir, + dtype=torch_dtype, + tensor_parallel_size=tensor_parallel_size, + num_gpu_blocks_override=1, + enforce_eager=True, + max_model_len=1, + ) + model_path = os.path.join(storage_path, model_name) + model_executer = llm_writer.llm_engine.engine_core # For engine V1 + # save the models in the ServerlessLLM format + model_executer.save_serverless_llm_state( + path=model_path, pattern=pattern, max_size=max_size + ) + for file in os.listdir(input_dir): + # Copy the metadata files into the output directory + if os.path.splitext(file)[1] not in ( + ".bin", + ".pt", + ".safetensors", + ): + src_path = os.path.join(input_dir, file) + dest_path = os.path.join(model_path, file) + if os.path.isdir(src_path): + shutil.copytree(src_path, dest_path) + else: + shutil.copy(src_path, dest_path) + del model_executer + del llm_writer + gc.collect() + if torch.cuda.is_available(): + torch.cuda.empty_cache() + torch.cuda.synchronize() + + try: + with TemporaryDirectory() as cache_dir: + input_dir = local_model_path + # download from huggingface + if local_model_path is None: + input_dir = snapshot_download( + model_name, + cache_dir=cache_dir, + allow_patterns=[ + "*.safetensors", + "*.bin", + "*.json", + "*.txt", + ], + ) + _run_writer(input_dir, model_name) + except Exception as e: + print(f"An error occurred while saving the model: {e}") + # remove the output dir + shutil.rmtree(os.path.join(storage_path, model_name)) + raise RuntimeError( + f"Failed to save {model_name} for vllm backend: {e}" + ) from e + + +logger = init_logger(__name__) + + +def check_vllm(): + """Simple check if ServerlessLLM patch is applied.""" + try: + # Check if the LoadFormat enum has SERVERLESS_LLM + from vllm.config import LoadFormat + + if not hasattr(LoadFormat, "SERVERLESS_LLM"): + return False + + # Check if ExecutorBase has the save method + from vllm.executor.executor_base import ExecutorBase + + return hasattr(ExecutorBase, "save_serverless_llm_state") + except ImportError: + return False + + +@click.group() +def cli(): + """sllm-store CLI""" + pass + + +@cli.command() +@click.option("--host", default="0.0.0.0", help="Host") +@click.option("--port", default=8073, help="Port") +@click.option("--storage-path", default="./models", help="Storage path") +@click.option("--num-thread", default=4, help="Number of I/O threads") +@click.option( + "--chunk-size", default="32MB", help="Chunk size, e.g., 4KB, 1MB, 1GB" +) +@click.option( + "--mem-pool-size", + default="4GB", + help="Memory pool size, e.g., 1GB, 4GB, 1TB", +) +@click.option( + "--disk-size", default="128GB", help="Disk size, e.g., 1GB, 4GB, 1TB" +) +@click.option( + "--registration-required", + default=False, + help="Require registration before loading model", +) +def start( + host, + port, + storage_path, + num_thread, + chunk_size, + mem_pool_size, + disk_size, + registration_required, +): + """Start the gRPC server.""" + # Convert the chunk size to bytes + chunk_size = to_num_bytes(chunk_size) + + # Convert the memory pool size to bytes + mem_pool_size = to_num_bytes(mem_pool_size) + + try: + logger.info("Starting gRPC server") + asyncio.run( + serve( + host=host, + port=port, + storage_path=storage_path, + num_thread=num_thread, + chunk_size=chunk_size, + mem_pool_size=mem_pool_size, + # disk size is not used + # disk_size=disk_size, + registration_required=registration_required, + ) + ) + except KeyboardInterrupt: + logging.info("Server stopped by user") + sys.exit(0) + + +@cli.command() +@click.option( + "--model", + "model_name", + type=str, + required=True, + help="Model name from HuggingFace model hub", +) +@click.option("--backend", type=str, required=True, help="Backend") +@click.option("--adapter-name", type=str, help="Name of the LoRA adapter") +@click.option( + "--tensor-parallel-size", type=int, default=1, help="Tensor parallel size" +) +@click.option( + "--local-model-path", type=str, help="Local path to the model snapshot" +) +@click.option( + "--storage-path", + default="./models", + help="Local path to save the model", +) +def save( + model_name, + backend, + adapter_name, + tensor_parallel_size, + local_model_path, + storage_path, +): + """ + Saves a model to the sllm-store's storage. + + This command is for adding new models to the sllm-store's local storage. + """ + + logger.info( + f"Saving model {adapter_name if adapter_name else model_name} " + f"to {storage_path}" + ) + + try: + if backend == "vllm": + if not check_vllm(): + logger.error( + "vLLM is not patched. Please run " + "`./sllm_store/vllm_patch/patch.sh` first." + ) + sys.exit(1) + downloader = VllmModelDownloader() + downloader.download_vllm_model( + model_name, + "float16", + tensor_parallel_size=tensor_parallel_size, + storage_path=storage_path, + local_model_path=local_model_path, + ) + elif backend == "transformers": + if adapter_name: + config = AutoConfig.from_pretrained( + model_name, + trust_remote_code=True, + ) + config.torch_dtype = torch.float16 + module = importlib.import_module("transformers") + hf_model_cls = module.AutoModelForCausalLM + base_model = hf_model_cls.from_config( + config, + trust_remote_code=True, + ).to(config.torch_dtype) + + # Load a lora adapter from HuggingFace model hub + model = PeftModel.from_pretrained(base_model, adapter_name) + + # Save the model to the local path + model_path = os.path.join(storage_path, adapter_name) + save_lora(model, model_path) + else: + # Load a model from HuggingFace model hub + model = AutoModelForCausalLM.from_pretrained( + model_name, torch_dtype=torch.float16 + ) + + # Save the model to the local path + model_path = os.path.join(storage_path, model_name) + save_model(model, model_path) + else: + logger.error(f"Unsupported backend '{backend}'") + sys.exit(1) + except Exception as e: + logger.error(f"Failed to save model {model_name}: {e}", exc_info=True) + sys.exit(1) + + logger.info( + f"Model {adapter_name if adapter_name else model_name} " + f"saved successfully to {storage_path}" + ) + + +@cli.command() +@click.option( + "--model", + "model_name", + type=str, + required=True, + help="Model name from HuggingFace model hub", +) +@click.option("--backend", type=str, required=True, help="Backend") +@click.option("--adapter-name", type=str, help="Name of the LoRA adapter") +@click.option( + "--precision", + type=click.Choice(["int8", "fp4", "nf4"]), + help="Precision of quantized model.", +) +@click.option( + "--storage-path", + type=str, + default="./models", + help="Local path where model is saved", +) +def load( + model_name, + backend, + adapter_name, + precision, + storage_path, +): + """ + Loads a model from the sllm-store's storage. + + This command is for loading new models from the sllm-store's local storage. + """ + + logger.info( + f"Loading model {adapter_name if adapter_name else model_name} " + f"from {storage_path}" + ) + + quantization_config = None + if precision: + if precision == "int8": + quantization_config = BitsAndBytesConfig(load_in_8bit=True) + elif precision == "fp4": + quantization_config = BitsAndBytesConfig(load_in_4bit=True) + elif precision == "nf4": + quantization_config = BitsAndBytesConfig( + load_in_4bit=True, bnb_4bit_quant_type="nf4" + ) + + try: + start_load_time = time.time() + + if backend == "vllm": + from vllm import LLM + + if not check_vllm(): + logger.error( + "vLLM is not patched. Please run " + "`./sllm_store/vllm_patch/patch.sh` first." + ) + sys.exit(1) + model_full_path = os.path.join(storage_path, model_name) + llm = LLM( + model=model_full_path, + load_format="serverless_llm", + dtype="float16", + ) + logger.info( + f"Model loading time: {time.time() - start_load_time:.2f}s" + ) + + example_inferences("vllm", model=llm) + + elif backend == "transformers": + # warm up the GPU + num_gpus = torch.cuda.device_count() + for i in range(num_gpus): + torch.ones(1).to(f"cuda:{i}") + torch.cuda.synchronize() + if adapter_name: + model = load_model( + model_name, + device_map="auto", + torch_dtype=torch.float16, + storage_path=storage_path, + fully_parallel=True, + ) + + model = load_lora( + model, + adapter_name, + adapter_path=adapter_name, + device_map="auto", + storage_path=storage_path, + torch_dtype=torch.float16, + ) + else: + model = load_model( + model_name, + device_map="auto", + torch_dtype=torch.float16, + storage_path=storage_path, + fully_parallel=True, + quantization_config=quantization_config, + ) + logger.info( + f"Model loading time: {time.time() - start_load_time:.2f}s" + ) + + example_inferences( + "transformers", + model=model, + model_name=model_name, + adapter_name=adapter_name, + ) + + else: + logger.error(f"Unsupported backend '{backend}'") + sys.exit(1) + + except Exception as e: + logger.error( + f"Failed to load model or perform inference: {e}", exc_info=True + ) + sys.exit(1) + + logger.info( + f"Model {adapter_name if adapter_name else model_name} " + f"loaded successfully from {storage_path}" + ) + + +def example_inferences(backend, model=None, model_name=None, adapter_name=None): + if backend == "vllm": + prompts = [ + "Hello, my name is", + "The president of the United States is", + "The capital of France is", + "The future of AI is", + ] + from vllm import SamplingParams + + sampling_params = SamplingParams(temperature=0.8, top_p=0.95) + outputs = model.generate(prompts, sampling_params) + + # Print the outputs. + for output in outputs: + prompt = output.prompt + generated_text = output.outputs[0].text + print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") + elif backend == "transformers": + from pathlib import Path + + parts = Path(model_name).parts + if len(parts) >= 2: + model_name = f"{parts[-2]}/{parts[-1]}" + tokenizer = AutoTokenizer.from_pretrained(model_name) + inputs = tokenizer("Hello, my dog is cute", return_tensors="pt").to( + "cuda" + ) + generate_kwargs = {} + if adapter_name: + generate_kwargs["adapter_names"] = [adapter_name] + outputs = model.generate(**inputs, **generate_kwargs) + print(tokenizer.decode(outputs[0], skip_special_tokens=True)) + else: + logger.error(f"Unsupported backend '{backend}' for example inferences") + sys.exit(1) + + +# Entry point for the 'sllm-store' CLI +def main(): + cli() diff --git a/sllm_store/sllm_store/client.py b/sllm_store/sllm_store/client.py new file mode 100644 index 0000000..8efead6 --- /dev/null +++ b/sllm_store/sllm_store/client.py @@ -0,0 +1,157 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # + +import grpc +import sllm_store.proto.storage_pb2 as storage_pb2 +import sllm_store.proto.storage_pb2_grpc as storage_pb2_grpc +from sllm_store.logger import init_logger + +logger = init_logger(__name__) + + +# This is a singleton class that manages the checkpoint +class SllmStoreClient: + def __init__(self, server_address="127.0.0.1:8073"): + self.server_address = server_address + self.channel = grpc.insecure_channel(server_address) + self.stub = storage_pb2_grpc.StorageStub(self.channel) + self.checkpoints_in_gpu = {} + + def __del__(self): + # TODO: cleanup + pass + + def load_into_cpu(self, model_path): + request = storage_pb2.LoadModelRequest( + model_path=model_path, + target_device_type=storage_pb2.DeviceType.DEVICE_TYPE_CPU, + ) + try: + response = self.stub.LoadModelAsync(request) + except grpc.RpcError as e: + if e.code() == grpc.StatusCode.CANCELLED: + logger.error(f"Model not loaded {e}") + return False + else: + logger.error(f"Error: {e}") + return False + else: + return response + + def unload_from_cpu(self, model_path): + request = storage_pb2.UnloadModelRequest( + model_path=model_path, + target_device_type=storage_pb2.DeviceType.DEVICE_TYPE_CPU, + ) + try: + response = self.stub.UnloadModel(request) + except grpc.RpcError as e: + logger.error(f"Error: {e}") + return False + else: + return response + + def load_into_gpu( + self, model_path, replica_uuid, tensor_copy_chunks, cuda_memory_handles + ): + logger.debug(f"load_into_gpu: {model_path}, {replica_uuid}") + + gpu_chunk_map = {} + for device_uuid, chunks in tensor_copy_chunks.items(): + gpu_chunk_map[device_uuid] = storage_pb2.MemCopyChunkList( + chunks=[ + storage_pb2.MemCopyChunk( + src_offset=chunk[0], + size=chunk[1], + dst_offset=chunk[2], + handle_idx=chunk[3], + ) + for chunk in chunks + ] + ) + cuda_handle_map = {} + for device_uuid, handles in cuda_memory_handles.items(): + cuda_handle_map[device_uuid] = storage_pb2.MemCopyHandleList( + handles=[ + storage_pb2.MemCopyHandle( + cuda_ipc_handle=handle_str, + ) + for handle_str in handles + ] + ) + request = storage_pb2.LoadModelRequest( + model_path=model_path, + replica_uuid=replica_uuid, + chunks=gpu_chunk_map, + handles=cuda_handle_map, + target_device_type=storage_pb2.DeviceType.DEVICE_TYPE_GPU, + ) + try: + response = self.stub.LoadModelAsync(request) + except grpc.RpcError as e: + if e.code() == grpc.StatusCode.CANCELLED: + logger.error(f"Model not loaded {e}") + else: + logger.error(f"Error: {e}") + return False + else: + logger.info(f"Model loaded: {model_path}, {replica_uuid}") + return response + + def confirm_model_loaded(self, model_path, replica_uuid): + logger.info(f"confirm_model_loaded: {model_path}, {replica_uuid}") + request = storage_pb2.ConfirmModelRequest( + model_path=model_path, + replica_uuid=replica_uuid, + target_device_type=storage_pb2.DeviceType.DEVICE_TYPE_GPU, + ) + try: + _ = self.stub.ConfirmModel(request) + logger.info("Model loaded") + except grpc.RpcError as e: + if e.code() == grpc.StatusCode.CANCELLED: + logger.error("Model not loaded") + return False + else: + logger.error(f"Error: {e}") + return False + + def register_model(self, model_path) -> int: + logger.info(f"register_model: {model_path}") + request = storage_pb2.RegisterModelRequest(model_path=model_path) + try: + response = self.stub.RegisterModel(request) + except grpc.RpcError as e: + logger.error(f"Error: {e}") + return -1 + else: + logger.info("Model registered") + return response.model_size + + def get_server_config(self): + request = storage_pb2.GetServerConfigRequest() + try: + response = self.stub.GetServerConfig(request) + except grpc.RpcError as e: + logger.error(f"Error: {e}") + return None + else: + return { + "chunk_size": response.chunk_size, + "mem_pool_size": response.mem_pool_size, + } diff --git a/sllm_store/sllm_store/device_map_utils.py b/sllm_store/sllm_store/device_map_utils.py new file mode 100644 index 0000000..df31c58 --- /dev/null +++ b/sllm_store/sllm_store/device_map_utils.py @@ -0,0 +1,309 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # +from typing import Dict, List, Optional, Tuple, Union + +import torch +from accelerate import infer_auto_device_map +from accelerate.utils import get_balanced_memory, get_max_memory +from sllm_store.logger import init_logger + +logger = init_logger(__name__) + +DeviceMapType = Union[ + str, Dict[str, Union[int, str, torch.device]], int, torch.device +] + + +def _transform_device_map_to_dict( + device_map: DeviceMapType, +) -> Dict[str, Union[int, torch.device]]: + """Transforms the device_map to a dictionary if it is not already a dictionary.""" # noqa: E501 + + if isinstance(device_map, torch.device): + device_map = {"": device_map} + elif isinstance(device_map, str) and device_map not in [ + "auto", + "balanced", + "balanced_low_0", + "sequential", + ]: + try: + device_map = {"": torch.device(device_map)} + except RuntimeError: + raise ValueError( + "When passing device_map as a string, the value needs to be a device name (e.g. cpu, cuda:0) or " # noqa: E501 + f"'auto', 'balanced', 'balanced_low_0', 'sequential' but found {device_map}." # noqa: E501 + ) from None + elif isinstance(device_map, int): + if device_map < 0: + raise ValueError( + "You can't pass device_map as a negative int. If you want to put the model on the cpu, pass device_map = 'cpu' " # noqa: E501 + ) + else: + device_map = {"": device_map} + return device_map + + +def _expand_tensor_name( + device_map: DeviceMapType, tensor_names: List[str] +) -> Dict[str, Union[int, torch.device]]: + if "" in device_map and len(device_map) != 1: + raise RuntimeError( + f"Device map {device_map} is invalid. If you want to specify the default device, use key ''." # noqa: E501 + ) + + expanded_device_map = {} + for tensor_or_module, device_id in device_map.items(): + if tensor_or_module == "": + return {k: device_id for k in tensor_names} + + for name in tensor_names: + # TODO: use trie to speed up prefix match + if name.startswith(tensor_or_module): + expanded_device_map[name] = device_id + + return expanded_device_map + + +def _compute_device_placement_from_map( + model: torch.nn.Module, + device_map: DeviceMapType, + target_dtype: torch.dtype, + max_memory: Optional[int] = None, +) -> Dict[str, Union[int, torch.device]]: + """ + Computes the device placement for the model based on the device_map. + """ + + if isinstance(device_map, str): + no_split_modules = model._get_no_split_modules(device_map) + if device_map not in [ + "auto", + "balanced", + "balanced_low_0", + "sequential", + ]: + raise ValueError( + "If passing a string for `device_map`, please choose 'auto', 'balanced', 'balanced_low_0' or " # noqa: E501 + "'sequential'." + ) + + device_map_kwargs = {"no_split_module_classes": no_split_modules} + + if device_map != "sequential": + max_memory = get_balanced_memory( + model, + dtype=target_dtype, + low_zero=(device_map == "balanced_low_0"), + max_memory=max_memory, + **device_map_kwargs, + ) + else: + max_memory = get_max_memory(max_memory) + device_map_kwargs["max_memory"] = max_memory + + # Make sure tied weights are tied before creating the device map. + model.tie_weights() + device_map = infer_auto_device_map( + model, dtype=target_dtype, **device_map_kwargs + ) + + return device_map + + +def _compute_device_placement_from_map_fast( + no_split_modules: Dict[str, int], + tied_modules: List[Tuple[List[str], int]], + device_map: DeviceMapType, +) -> Dict[str, Union[int, torch.device]]: + """ + Computes the device placement for no split modules based on the device_map. + """ + + if isinstance(device_map, str): + if device_map not in [ + "auto", + "balanced", + "balanced_low_0", + "sequential", + ]: + raise ValueError( + "If passing a string for `device_map`, please choose 'auto', 'balanced', 'balanced_low_0' or " # noqa: E501 + "'sequential'." + ) + + max_memory = get_max_memory() + # we don't support loading to cpu + max_memory.pop("cpu") + + # tied modules are treated as a single module + for tied_groups, shared_size in tied_modules: + modules = list(no_split_modules.keys()) + for module in modules: + if module in tied_groups: + tied_size = no_split_modules[module] + for m in modules: + if m in tied_groups and m != module: + tied_size += no_split_modules[m] - shared_size + no_split_modules.pop(m) + no_split_modules[module] = tied_size + break + + while next(iter(no_split_modules.values())) > next( + iter(max_memory.values()) + ): + device_id, memory = max_memory.popitem() + logger.warning( + f"Device {device_id} has insufficient memory {memory} for the first module." # noqa: E501 + ) + + total_size = sum(no_split_modules.values()) + + if total_size > sum(max_memory.values()): + raise RuntimeError( + "The total size of the model is greater than the maximum memory available." # noqa: E501 + ) + + placement = None + if device_map == "auto" or device_map == "balanced": + # 1. use dynamic programming to find the best balanced placement + placement = _get_balanced_placement(no_split_modules, max_memory) + elif device_map == "balanced_low_0": + # 2.1 decide minimum modules on device 0 + # 2.2 use dynamic programming to find the best balanced placement for the rest on other devices # noqa: E501 + raise NotImplementedError + else: + # 3. use greedy algorithm to find the best sequential placement + placement = _get_sequential_placement(no_split_modules, max_memory) + + if placement is None: + raise RuntimeError( + "Failed to find a valid placement for the model." + ) + + # reassign tied modules to the same device + for tied_groups, shared_size in tied_modules: # noqa: B007 + modules = list(placement.keys()) + for module in modules: + if module in tied_groups: + for m in tied_groups: + if m != module: + placement[m] = placement[module] + + return placement + + return device_map + + +def _get_balanced_placement( + module_size: Dict[str, int], + device_memory: Dict[torch.device, int], +) -> Dict[str, Union[int, torch.device]]: + """ + Computes the balanced placement for no split modules based on the given device_memory. + """ # noqa: E501 + + module_names = list(module_size.keys()) + assert len(module_names) > 0 and len(module_names) >= len(device_memory) + + length = len(module_names) + n = len(device_memory) + if n <= 0 or length == 0: + logger.error("No device memory or no modules to place.") + return None + + # "balanced" means that the gap between the sums of the partitions is minimized # noqa: E501 + # Initialize DP table + dp = [ + [[float("inf"), float("inf"), 0, []] for _ in range(n + 1)] + for _ in range(length + 1) + ] + dp[0][0] = [ + 0, + float("inf"), + 0, + [[] for _ in range(n)], + ] # [gap, min_size, max_size, partitions] + + # Fill DP table + for i in range(1, length + 1): + for k in range(1, n + 1): + for j in range(i): + current_partition = module_names[j:i] + current_size = sum( + [module_size[module] for module in current_partition] + ) + # check if this partition can fit in the device memory + if current_size > device_memory[k - 1]: + # print(f"Partition {current_partition} is too large for device {k-1}, memory {device_memory[k-1]}") # noqa: E501 + continue + if dp[j][k - 1][0] < float("inf"): + if dp[j][k - 1][1] == float("inf"): + max_gap = 0 + else: + max_gap = max( + abs(dp[j][k - 1][1] - current_size), + abs(dp[j][k - 1][2] - current_size), + ) + if max_gap < dp[i][k][0]: + dp[i][k][0] = max_gap + dp[i][k][1] = min(dp[j][k - 1][1], current_size) + dp[i][k][2] = max(dp[j][k - 1][2], current_size) + dp[i][k][-1] = dp[j][k - 1][-1][:] # Copy partitions + dp[i][k][-1][k - 1] = ( + current_partition # Update last partition + ) + + # Result + result = dp[length][n][-1] + result_device_map = {} + for i, partition in enumerate(result): + for module in partition: + result_device_map[module] = i + return result_device_map + + +def _get_sequential_placement( + module_size: Dict[str, int], + device_memory: Dict[torch.device, int], +) -> Dict[str, Union[int, torch.device]]: + """ + Computes the sequential placement for no split modules based on the given device_memory. + """ # noqa: E501 + + module_names = list(module_size.keys()) + assert len(module_names) > 0 and len(module_names) >= len(device_memory) + + length = len(module_names) + n = len(device_memory) + if n <= 0 or length == 0: + return None + + result_device_map = {} + current_device = 0 + for module, size in module_size.items(): + while current_device < n and size > device_memory[current_device]: + current_device += 1 + if size <= device_memory[current_device]: + result_device_map[module] = current_device + else: + raise RuntimeError( + f"Module {module} is too large for device {current_device}, memory {device_memory[current_device]}" # noqa: E501 + ) + + return result_device_map diff --git a/sllm_store/sllm_store/logger.py b/sllm_store/sllm_store/logger.py new file mode 100644 index 0000000..118538d --- /dev/null +++ b/sllm_store/sllm_store/logger.py @@ -0,0 +1,81 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # + +# Adapted from https://github.com/vllm-project/vllm/blob/0ce0539d4750f9ebcd9b19d7085ca3b934b9ec67/vllm/logger.py +"""Logging configuration for sllm_store.""" + +import logging +import os +import sys + +_FORMAT = "%(levelname)s %(asctime)s %(filename)s:%(lineno)d] %(message)s" +_DATE_FORMAT = "%m-%d %H:%M:%S" + + +class NewLineFormatter(logging.Formatter): + """Adds logging prefix to newlines to align multi-line messages.""" + + def __init__(self, fmt, datefmt=None): + logging.Formatter.__init__(self, fmt, datefmt) + + def format(self, record): + msg = logging.Formatter.format(self, record) + if record.message != "": + parts = msg.split(record.message) + msg = msg.replace("\n", "\r\n" + parts[0]) + return msg + + +_root_logger = logging.getLogger("sllm_store") +_default_handler = None + + +def _setup_logger(): + _root_logger.setLevel(logging.DEBUG) + global _default_handler + + _default_handler = logging.StreamHandler(sys.stdout) + _default_handler.flush = sys.stdout.flush # type: ignore + _default_handler.setLevel(logging.DEBUG) + _root_logger.addHandler(_default_handler) + + fmt = NewLineFormatter(_FORMAT, datefmt=_DATE_FORMAT) + _default_handler.setFormatter(fmt) + # Setting this will avoid the message + # being propagated to the parent logger. + _root_logger.propagate = False + + +_setup_logger() + + +def init_logger(name: str): + # Use the same settings as above for root logger + logger = logging.getLogger(name) + + log_level = os.getenv("LOG_LEVEL", "DEBUG").upper() + logger.setLevel(log_level) + + # Ensure the handler's level matches the logger's level + if _default_handler: + _default_handler.setLevel(log_level) + + logger.addHandler(_default_handler) + logger.propagate = False + + return logger diff --git a/sllm_store/sllm_store/proto/__init__.py b/sllm_store/sllm_store/proto/__init__.py new file mode 100644 index 0000000..314e503 --- /dev/null +++ b/sllm_store/sllm_store/proto/__init__.py @@ -0,0 +1,17 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # diff --git a/sllm_store/sllm_store/proto/storage.proto b/sllm_store/sllm_store/proto/storage.proto new file mode 120000 index 0000000..6772c53 --- /dev/null +++ b/sllm_store/sllm_store/proto/storage.proto @@ -0,0 +1 @@ +../../proto/storage.proto \ No newline at end of file diff --git a/sllm_store/sllm_store/proto/storage_pb2.py b/sllm_store/sllm_store/proto/storage_pb2.py new file mode 100644 index 0000000..fabbbc3 --- /dev/null +++ b/sllm_store/sllm_store/proto/storage_pb2.py @@ -0,0 +1,68 @@ +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: sllm_store/proto/storage.proto +"""Generated protocol buffer code.""" + +from google.protobuf.internal import builder as _builder +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( + b'\n\x1esllm_store/proto/storage.proto\x12\x07storage"\x18\n\x16GetServerConfigRequest"D\n\x17GetServerConfigResponse\x12\x15\n\rmem_pool_size\x18\x01 \x01(\x03\x12\x12\n\nchunk_size\x18\x02 \x01(\x03"*\n\x14RegisterModelRequest\x12\x12\n\nmodel_path\x18\x01 \x01(\t"?\n\x15RegisterModelResponse\x12\x12\n\nmodel_path\x18\x01 \x01(\t\x12\x12\n\nmodel_size\x18\x02 \x01(\x03"X\n\x0cMemCopyChunk\x12\x12\n\nsrc_offset\x18\x01 \x01(\x04\x12\x0c\n\x04size\x18\x02 \x01(\x04\x12\x12\n\ndst_offset\x18\x03 \x01(\x04\x12\x12\n\nhandle_idx\x18\x04 \x01(\x04"9\n\x10MemCopyChunkList\x12%\n\x06\x63hunks\x18\x01 \x03(\x0b\x32\x15.storage.MemCopyChunk"(\n\rMemCopyHandle\x12\x17\n\x0f\x63uda_ipc_handle\x18\x01 \x01(\x0c"<\n\x11MemCopyHandleList\x12\'\n\x07handles\x18\x01 \x03(\x0b\x32\x16.storage.MemCopyHandle"\xf3\x02\n\x10LoadModelRequest\x12\x12\n\nmodel_path\x18\x01 \x01(\t\x12\x14\n\x0creplica_uuid\x18\x02 \x01(\t\x12\x35\n\x06\x63hunks\x18\x03 \x03(\x0b\x32%.storage.LoadModelRequest.ChunksEntry\x12\x37\n\x07handles\x18\x04 \x03(\x0b\x32&.storage.LoadModelRequest.HandlesEntry\x12/\n\x12target_device_type\x18\x05 \x01(\x0e\x32\x13.storage.DeviceType\x1aH\n\x0b\x43hunksEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12(\n\x05value\x18\x02 \x01(\x0b\x32\x19.storage.MemCopyChunkList:\x02\x38\x01\x1aJ\n\x0cHandlesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12)\n\x05value\x18\x02 \x01(\x0b\x32\x1a.storage.MemCopyHandleList:\x02\x38\x01"\'\n\x11LoadModelResponse\x12\x12\n\nmodel_path\x18\x01 \x01(\t"p\n\x13\x43onfirmModelRequest\x12\x12\n\nmodel_path\x18\x01 \x01(\t\x12\x14\n\x0creplica_uuid\x18\x02 \x01(\t\x12/\n\x12target_device_type\x18\x03 \x01(\x0e\x32\x13.storage.DeviceType"8\n\x14\x43onfirmModelResponse\x12\x12\n\nmodel_path\x18\x01 \x01(\t\x12\x0c\n\x04\x63ode\x18\x02 \x01(\x05"o\n\x12UnloadModelRequest\x12\x12\n\nmodel_path\x18\x01 \x01(\t\x12\x14\n\x0creplica_uuid\x18\x02 \x01(\t\x12/\n\x12target_device_type\x18\x03 \x01(\x0e\x32\x13.storage.DeviceType"7\n\x13UnloadModelResponse\x12\x12\n\nmodel_path\x18\x01 \x01(\t\x12\x0c\n\x04\x63ode\x18\x02 \x01(\x05"\x11\n\x0f\x43learMemRequest"\x12\n\x10\x43learMemResponse*L\n\nDeviceType\x12\x14\n\x10\x44\x45VICE_TYPE_DISK\x10\x00\x12\x13\n\x0f\x44\x45VICE_TYPE_CPU\x10\x01\x12\x13\n\x0f\x44\x45VICE_TYPE_GPU\x10\x02\x32\xdc\x03\n\x07Storage\x12I\n\x0eLoadModelAsync\x12\x19.storage.LoadModelRequest\x1a\x1a.storage.LoadModelResponse"\x00\x12M\n\x0c\x43onfirmModel\x12\x1c.storage.ConfirmModelRequest\x1a\x1d.storage.ConfirmModelResponse"\x00\x12J\n\x0bUnloadModel\x12\x1b.storage.UnloadModelRequest\x1a\x1c.storage.UnloadModelResponse"\x00\x12\x41\n\x08\x43learMem\x12\x18.storage.ClearMemRequest\x1a\x19.storage.ClearMemResponse"\x00\x12P\n\rRegisterModel\x12\x1d.storage.RegisterModelRequest\x1a\x1e.storage.RegisterModelResponse"\x00\x12V\n\x0fGetServerConfig\x12\x1f.storage.GetServerConfigRequest\x1a .storage.GetServerConfigResponse"\x00\x62\x06proto3' +) + +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) +_builder.BuildTopDescriptorsAndMessages( + DESCRIPTOR, "sllm_store.proto.storage_pb2", globals() +) +if _descriptor._USE_C_DESCRIPTORS == False: + DESCRIPTOR._options = None + _LOADMODELREQUEST_CHUNKSENTRY._options = None + _LOADMODELREQUEST_CHUNKSENTRY._serialized_options = b"8\001" + _LOADMODELREQUEST_HANDLESENTRY._options = None + _LOADMODELREQUEST_HANDLESENTRY._serialized_options = b"8\001" + _DEVICETYPE._serialized_start = 1297 + _DEVICETYPE._serialized_end = 1373 + _GETSERVERCONFIGREQUEST._serialized_start = 43 + _GETSERVERCONFIGREQUEST._serialized_end = 67 + _GETSERVERCONFIGRESPONSE._serialized_start = 69 + _GETSERVERCONFIGRESPONSE._serialized_end = 137 + _REGISTERMODELREQUEST._serialized_start = 139 + _REGISTERMODELREQUEST._serialized_end = 181 + _REGISTERMODELRESPONSE._serialized_start = 183 + _REGISTERMODELRESPONSE._serialized_end = 246 + _MEMCOPYCHUNK._serialized_start = 248 + _MEMCOPYCHUNK._serialized_end = 336 + _MEMCOPYCHUNKLIST._serialized_start = 338 + _MEMCOPYCHUNKLIST._serialized_end = 395 + _MEMCOPYHANDLE._serialized_start = 397 + _MEMCOPYHANDLE._serialized_end = 437 + _MEMCOPYHANDLELIST._serialized_start = 439 + _MEMCOPYHANDLELIST._serialized_end = 499 + _LOADMODELREQUEST._serialized_start = 502 + _LOADMODELREQUEST._serialized_end = 873 + _LOADMODELREQUEST_CHUNKSENTRY._serialized_start = 725 + _LOADMODELREQUEST_CHUNKSENTRY._serialized_end = 797 + _LOADMODELREQUEST_HANDLESENTRY._serialized_start = 799 + _LOADMODELREQUEST_HANDLESENTRY._serialized_end = 873 + _LOADMODELRESPONSE._serialized_start = 875 + _LOADMODELRESPONSE._serialized_end = 914 + _CONFIRMMODELREQUEST._serialized_start = 916 + _CONFIRMMODELREQUEST._serialized_end = 1028 + _CONFIRMMODELRESPONSE._serialized_start = 1030 + _CONFIRMMODELRESPONSE._serialized_end = 1086 + _UNLOADMODELREQUEST._serialized_start = 1088 + _UNLOADMODELREQUEST._serialized_end = 1199 + _UNLOADMODELRESPONSE._serialized_start = 1201 + _UNLOADMODELRESPONSE._serialized_end = 1256 + _CLEARMEMREQUEST._serialized_start = 1258 + _CLEARMEMREQUEST._serialized_end = 1275 + _CLEARMEMRESPONSE._serialized_start = 1277 + _CLEARMEMRESPONSE._serialized_end = 1295 + _STORAGE._serialized_start = 1376 + _STORAGE._serialized_end = 1852 +# @@protoc_insertion_point(module_scope) diff --git a/sllm_store/sllm_store/proto/storage_pb2_grpc.py b/sllm_store/sllm_store/proto/storage_pb2_grpc.py new file mode 100644 index 0000000..3090d18 --- /dev/null +++ b/sllm_store/sllm_store/proto/storage_pb2_grpc.py @@ -0,0 +1,307 @@ +# Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! +"""Client and server classes corresponding to protobuf-defined services.""" + +import grpc + +from sllm_store.proto import ( + storage_pb2 as sllm__store_dot_proto_dot_storage__pb2, +) + + +class StorageStub(object): + """Missing associated documentation comment in .proto file.""" + + def __init__(self, channel): + """Constructor. + + Args: + channel: A grpc.Channel. + """ + self.LoadModelAsync = channel.unary_unary( + "/storage.Storage/LoadModelAsync", + request_serializer=sllm__store_dot_proto_dot_storage__pb2.LoadModelRequest.SerializeToString, + response_deserializer=sllm__store_dot_proto_dot_storage__pb2.LoadModelResponse.FromString, + ) + self.ConfirmModel = channel.unary_unary( + "/storage.Storage/ConfirmModel", + request_serializer=sllm__store_dot_proto_dot_storage__pb2.ConfirmModelRequest.SerializeToString, + response_deserializer=sllm__store_dot_proto_dot_storage__pb2.ConfirmModelResponse.FromString, + ) + self.UnloadModel = channel.unary_unary( + "/storage.Storage/UnloadModel", + request_serializer=sllm__store_dot_proto_dot_storage__pb2.UnloadModelRequest.SerializeToString, + response_deserializer=sllm__store_dot_proto_dot_storage__pb2.UnloadModelResponse.FromString, + ) + self.ClearMem = channel.unary_unary( + "/storage.Storage/ClearMem", + request_serializer=sllm__store_dot_proto_dot_storage__pb2.ClearMemRequest.SerializeToString, + response_deserializer=sllm__store_dot_proto_dot_storage__pb2.ClearMemResponse.FromString, + ) + self.RegisterModel = channel.unary_unary( + "/storage.Storage/RegisterModel", + request_serializer=sllm__store_dot_proto_dot_storage__pb2.RegisterModelRequest.SerializeToString, + response_deserializer=sllm__store_dot_proto_dot_storage__pb2.RegisterModelResponse.FromString, + ) + self.GetServerConfig = channel.unary_unary( + "/storage.Storage/GetServerConfig", + request_serializer=sllm__store_dot_proto_dot_storage__pb2.GetServerConfigRequest.SerializeToString, + response_deserializer=sllm__store_dot_proto_dot_storage__pb2.GetServerConfigResponse.FromString, + ) + + +class StorageServicer(object): + """Missing associated documentation comment in .proto file.""" + + def LoadModelAsync(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def ConfirmModel(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def UnloadModel(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def ClearMem(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def RegisterModel(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + def GetServerConfig(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details("Method not implemented!") + raise NotImplementedError("Method not implemented!") + + +def add_StorageServicer_to_server(servicer, server): + rpc_method_handlers = { + "LoadModelAsync": grpc.unary_unary_rpc_method_handler( + servicer.LoadModelAsync, + request_deserializer=sllm__store_dot_proto_dot_storage__pb2.LoadModelRequest.FromString, + response_serializer=sllm__store_dot_proto_dot_storage__pb2.LoadModelResponse.SerializeToString, + ), + "ConfirmModel": grpc.unary_unary_rpc_method_handler( + servicer.ConfirmModel, + request_deserializer=sllm__store_dot_proto_dot_storage__pb2.ConfirmModelRequest.FromString, + response_serializer=sllm__store_dot_proto_dot_storage__pb2.ConfirmModelResponse.SerializeToString, + ), + "UnloadModel": grpc.unary_unary_rpc_method_handler( + servicer.UnloadModel, + request_deserializer=sllm__store_dot_proto_dot_storage__pb2.UnloadModelRequest.FromString, + response_serializer=sllm__store_dot_proto_dot_storage__pb2.UnloadModelResponse.SerializeToString, + ), + "ClearMem": grpc.unary_unary_rpc_method_handler( + servicer.ClearMem, + request_deserializer=sllm__store_dot_proto_dot_storage__pb2.ClearMemRequest.FromString, + response_serializer=sllm__store_dot_proto_dot_storage__pb2.ClearMemResponse.SerializeToString, + ), + "RegisterModel": grpc.unary_unary_rpc_method_handler( + servicer.RegisterModel, + request_deserializer=sllm__store_dot_proto_dot_storage__pb2.RegisterModelRequest.FromString, + response_serializer=sllm__store_dot_proto_dot_storage__pb2.RegisterModelResponse.SerializeToString, + ), + "GetServerConfig": grpc.unary_unary_rpc_method_handler( + servicer.GetServerConfig, + request_deserializer=sllm__store_dot_proto_dot_storage__pb2.GetServerConfigRequest.FromString, + response_serializer=sllm__store_dot_proto_dot_storage__pb2.GetServerConfigResponse.SerializeToString, + ), + } + generic_handler = grpc.method_handlers_generic_handler( + "storage.Storage", rpc_method_handlers + ) + server.add_generic_rpc_handlers((generic_handler,)) + + +# This class is part of an EXPERIMENTAL API. +class Storage(object): + """Missing associated documentation comment in .proto file.""" + + @staticmethod + def LoadModelAsync( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/storage.Storage/LoadModelAsync", + sllm__store_dot_proto_dot_storage__pb2.LoadModelRequest.SerializeToString, + sllm__store_dot_proto_dot_storage__pb2.LoadModelResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def ConfirmModel( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/storage.Storage/ConfirmModel", + sllm__store_dot_proto_dot_storage__pb2.ConfirmModelRequest.SerializeToString, + sllm__store_dot_proto_dot_storage__pb2.ConfirmModelResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def UnloadModel( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/storage.Storage/UnloadModel", + sllm__store_dot_proto_dot_storage__pb2.UnloadModelRequest.SerializeToString, + sllm__store_dot_proto_dot_storage__pb2.UnloadModelResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def ClearMem( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/storage.Storage/ClearMem", + sllm__store_dot_proto_dot_storage__pb2.ClearMemRequest.SerializeToString, + sllm__store_dot_proto_dot_storage__pb2.ClearMemResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def RegisterModel( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/storage.Storage/RegisterModel", + sllm__store_dot_proto_dot_storage__pb2.RegisterModelRequest.SerializeToString, + sllm__store_dot_proto_dot_storage__pb2.RegisterModelResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) + + @staticmethod + def GetServerConfig( + request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None, + ): + return grpc.experimental.unary_unary( + request, + target, + "/storage.Storage/GetServerConfig", + sllm__store_dot_proto_dot_storage__pb2.GetServerConfigRequest.SerializeToString, + sllm__store_dot_proto_dot_storage__pb2.GetServerConfigResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + ) diff --git a/sllm_store/sllm_store/server.py b/sllm_store/sllm_store/server.py new file mode 100644 index 0000000..ef80d6b --- /dev/null +++ b/sllm_store/sllm_store/server.py @@ -0,0 +1,238 @@ +import asyncio +import grpc +import sllm_store +from sllm_store.proto import storage_pb2, storage_pb2_grpc +from sllm_store.logger import init_logger + +# this is necessary to avoid libtorch.so not found error +import torch # noqa: F401 + +import ctypes +import os + +ctypes.CDLL(os.path.join(sllm_store.__path__[0], "libglog.so")) + +from sllm_store._checkpoint_store import ( # noqa: E402 + CheckpointStore, + MemCopyChunk, +) + +logger = init_logger(__name__) + + +class StorageServicer(storage_pb2_grpc.StorageServicer): + def __init__( + self, + storage_path, + mem_pool_size, + num_thread, + chunk_size, + registration_required, + ): + if not storage_path: + logger.error("storage_path is empty") + raise ValueError("storage_path is empty") + + if mem_pool_size <= 0: + logger.error("mem_pool_size must be greater than 0") + raise ValueError("Invalid mem_pool_size") + + logger.info( + f"StorageServicer: storage_path={storage_path}, " + f"mem_pool_size={mem_pool_size}, num_thread={num_thread}, " + f"chunk_size={chunk_size}, " + f"registration_required={registration_required}" + ) + + self.storage = CheckpointStore( + storage_path, mem_pool_size, num_thread, chunk_size + ) + self.registration_required = registration_required + + async def LoadModelAsync(self, request, context): + model_path = request.model_path + if not model_path: + logger.error("model_path is empty") + context.set_code(grpc.StatusCode.INVALID_ARGUMENT) + return storage_pb2.LoadModelResponse() + + if not self.registration_required: + model_size = self.storage.register_model_info(model_path) + if model_size < 0: + logger.error("RegisterModel failed") + context.set_code(grpc.StatusCode.INTERNAL) + return storage_pb2.LoadModelResponse() + + device_type = request.target_device_type + if device_type == storage_pb2.DEVICE_TYPE_CPU: + ret = self.storage.load_model_from_disk_async(model_path) + elif device_type == storage_pb2.DEVICE_TYPE_GPU: + replica_uuid = request.replica_uuid + if not replica_uuid: + logger.error("replica_uuid is empty") + context.set_code(grpc.StatusCode.INVALID_ARGUMENT) + return storage_pb2.LoadModelResponse() + + gpu_memory_handles = { + device_uuid: [ + handle.cuda_ipc_handle for handle in handle_list.handles + ] + for device_uuid, handle_list in request.handles.items() + } + + def create_mem_copy_chunk(chunk): + mem_copy_chunk = MemCopyChunk() + mem_copy_chunk.src_offset = chunk.src_offset + mem_copy_chunk.size = chunk.size + mem_copy_chunk.dst_offset = chunk.dst_offset + mem_copy_chunk.handle_idx = chunk.handle_idx + return mem_copy_chunk + + mem_copy_chunks = { + device_uuid: [ + create_mem_copy_chunk(chunk) for chunk in chunk_list.chunks + ] + for device_uuid, chunk_list in request.chunks.items() + } + # logger.debug( + # f"LoadModelAsync: {model_path}, {replica_uuid}, " + # f"{gpu_memory_handles}, {mem_copy_chunks}" + # ) + ret = self.storage.load_model_from_mem_async( + model_path, replica_uuid, gpu_memory_handles, mem_copy_chunks + ) + else: + logger.error(f"Unsupported device type: {device_type}") + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + return storage_pb2.LoadModelResponse() + + if ret != 0: + logger.error("LoadModel failed") + context.set_code(grpc.StatusCode.INTERNAL) + return storage_pb2.LoadModelResponse() + + logger.info( + f"LoadModel: success {model_path} with target {device_type}" + ) + return storage_pb2.LoadModelResponse(model_path=model_path) + + async def ConfirmModel(self, request, context): + model_path = request.model_path + replica_uuid = request.replica_uuid + device_type = request.target_device_type + + if not model_path: + logger.error("model_path is empty") + context.set_code(grpc.StatusCode.INVALID_ARGUMENT) + return storage_pb2.ConfirmModelResponse() + + if device_type != storage_pb2.DEVICE_TYPE_GPU: + logger.error(f"Unsupported device type: {device_type}") + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + return storage_pb2.ConfirmModelResponse() + + for i in range(5): + ret = self.storage.wait_model_in_gpu(model_path, replica_uuid) + if ret == 0: + logger.info( + f"Confirm model {model_path} replica {replica_uuid} success" + ) + return storage_pb2.ConfirmModelResponse(model_path=model_path) + logger.info(f"Confirm model failed, retry {i + 1}") + + await asyncio.sleep(0.05) + + logger.error( + f"Confirm model {model_path} replica {replica_uuid} failed" + ) + context.set_code(grpc.StatusCode.INTERNAL) + return storage_pb2.ConfirmModelResponse() + + async def UnloadModel(self, request, context): + model_path = request.model_path + device_type = request.target_device_type + + if not model_path: + logger.error("model_path is empty") + context.set_code(grpc.StatusCode.INVALID_ARGUMENT) + return storage_pb2.UnloadModelResponse() + + if device_type != storage_pb2.DEVICE_TYPE_CPU: + logger.error(f"Unsupported device type: {device_type}") + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + return storage_pb2.UnloadModelResponse() + + for i in range(5): + ret = self.storage.unload_model_from_host(model_path) + if ret == 0: + logger.info(f"UnloadModel: success {model_path}") + return storage_pb2.UnloadModelResponse(model_path=model_path) + logger.info(f"UnloadModel failed, retry {i + 1}") + + await asyncio.sleep(0.01) + + logger.error(f"UnloadModel failed for model {model_path}") + context.set_code(grpc.StatusCode.INTERNAL) + return storage_pb2.UnloadModelResponse() + + async def ClearMem(self, request, context): + ret = self.storage.clear_mem() + if ret != 0: + logger.error("ClearMem failed") + context.set_code(grpc.StatusCode.INTERNAL) + return storage_pb2.ClearMemResponse() + + async def RegisterModel(self, request, context): + model_path = request.model_path + if not model_path: + logger.error("model_path is empty") + context.set_code(grpc.StatusCode.INVALID_ARGUMENT) + return storage_pb2.RegisterModelResponse() + + model_size = self.storage.register_model_info(model_path) + if model_size < 0: + logger.error("RegisterModel failed") + context.set_code(grpc.StatusCode.INTERNAL) + return storage_pb2.RegisterModelResponse() + + return storage_pb2.RegisterModelResponse( + model_path=model_path, model_size=model_size + ) + + async def GetServerConfig(self, request, context): + return storage_pb2.GetServerConfigResponse( + mem_pool_size=self.storage.get_mem_pool_size(), + chunk_size=self.storage.get_chunk_size(), + ) + + +async def serve( + host, + port, + storage_path, + num_thread, + chunk_size, + mem_pool_size, + registration_required, +): + server = grpc.aio.server() + storage_pb2_grpc.add_StorageServicer_to_server( + StorageServicer( + storage_path, + mem_pool_size, + num_thread, + chunk_size, + registration_required, + ), + server, + ) + listen_addr = f"{host}:{port}" + server.add_insecure_port(listen_addr) + logger.info(f"Starting gRPC server on {listen_addr}") + await server.start() + + try: + await server.wait_for_termination() + except (KeyboardInterrupt, asyncio.CancelledError): + logger.info("Shutting down gRPC server") + await server.stop(5) diff --git a/sllm_store/sllm_store/torch.py b/sllm_store/sllm_store/torch.py new file mode 100644 index 0000000..8516530 --- /dev/null +++ b/sllm_store/sllm_store/torch.py @@ -0,0 +1,162 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # +import json +import os +import time +import uuid +from typing import Dict, Optional, Union + +import torch + +# from accelerate.hooks import add_hook_to_module +from sllm_store._C import ( + allocate_cuda_memory, + get_cuda_memory_handles, + get_device_uuid_map, + restore_tensors, + save_tensors, +) +from sllm_store.client import SllmStoreClient +from sllm_store.device_map_utils import _expand_tensor_name +from sllm_store.logger import init_logger +from sllm_store.utils import ( + calculate_device_memory, + calculate_tensor_device_offsets, +) + +logger = init_logger(__name__) + + +def _get_uuid(): + return str(uuid.uuid4()) + + +def save_dict( + state_dict: Dict[str, torch.Tensor], model_path: Union[str, os.PathLike] +): + tensor_names = list(state_dict.keys()) + tensor_data_index = {} + for name, param in state_dict.items(): + param_storage = param.untyped_storage() + data_ptr = param_storage.data_ptr() + size = param_storage.size() + tensor_data_index[name] = (data_ptr, size) + + if not os.path.exists(model_path): + os.makedirs(model_path, exist_ok=True) + + # save tensors + tensor_offsets = save_tensors(tensor_names, tensor_data_index, model_path) + + # create tensor index + tensor_index = {} + for name, param in state_dict.items(): + # name: offset, size + tensor_index[name] = ( + tensor_offsets[name], + tensor_data_index[name][1], + tuple(param.shape), + tuple(param.stride()), + str(param.dtype), + ) + + # save tensor index + with open(os.path.join(model_path, "tensor_index.json"), "w") as f: + json.dump(tensor_index, f) + + +def load_dict( + model_path: Union[str, os.PathLike], + device_map: Dict[str, int], + storage_path: Optional[str] = None, +): + replica_uuid, state_dict = load_dict_non_blocking( + model_path, device_map, storage_path + ) + + client = SllmStoreClient("127.0.0.1:8073") + client.confirm_model_loaded(model_path, replica_uuid) + + return state_dict + + +def load_dict_non_blocking( + model_path: Optional[Union[str, os.PathLike]], + device_map: Dict[str, int], + storage_path: Optional[str] = None, +): + client = SllmStoreClient("127.0.0.1:8073") + ret = client.load_into_cpu(model_path) + if not ret: + raise ValueError(f"Failed to load model {model_path} into CPU") + + if not storage_path: + storage_path = os.getenv("STORAGE_PATH", "./models") + with open( + os.path.join(storage_path, model_path, "tensor_index.json"), "r" + ) as f: + tensor_index = json.load(f) + + tensor_meta_index = {} + tensor_data_index = {} + for name, (offset, size, shape, stride, dtype) in tensor_index.items(): + tensor_meta_index[name] = (shape, stride, dtype) + tensor_data_index[name] = (offset, size) + + start = time.time() + expanded_device_map = _expand_tensor_name( + device_map, list(tensor_index.keys()) + ) + device_memory = calculate_device_memory( + expanded_device_map, tensor_data_index + ) + # logger.debug(f"calculate_device_memory {device_memory}") + cuda_memory_ptrs = allocate_cuda_memory(device_memory) + # cuda_memory_ptrs = { k: [v] for k,v in cuda_memory_ptrs.items()} + cuda_memory_handles = get_cuda_memory_handles(cuda_memory_ptrs) + device_uuid_map = get_device_uuid_map() + # logger.debug(f"determine device_uuid_map {device_uuid_map}") + tensor_device_offsets, tensor_copy_chunks = calculate_tensor_device_offsets( + expanded_device_map, tensor_data_index + ) + logger.debug(f"allocate_cuda_memory takes {time.time() - start} seconds") + + replica_uuid = _get_uuid() + ret = client.load_into_gpu( + model_path, + replica_uuid, + { + device_uuid_map[device_id]: v + for device_id, v in tensor_copy_chunks.items() + }, + { + device_uuid_map[device_id]: [v] + for device_id, v in cuda_memory_handles.items() + }, + ) + if not ret: + raise ValueError(f"Failed to load model {model_path} into GPU") + + # load model state_dict + start = time.time() + state_dict = restore_tensors( + tensor_meta_index, cuda_memory_ptrs, tensor_device_offsets + ) + logger.info(f"restore state_dict takes {time.time() - start} seconds") + + return replica_uuid, state_dict diff --git a/sllm_store/sllm_store/transformers.py b/sllm_store/sllm_store/transformers.py new file mode 100644 index 0000000..2809165 --- /dev/null +++ b/sllm_store/sllm_store/transformers.py @@ -0,0 +1,498 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # +import concurrent.futures +import json +import os +import time +import uuid +from typing import Optional, Union, Dict, Any + +import torch +from accelerate import dispatch_model, init_empty_weights + +# from accelerate.hooks import add_hook_to_module +from accelerate.utils import set_module_tensor_to_device +from sllm_store._C import ( + allocate_cuda_memory, + get_cuda_memory_handles, + get_device_uuid_map, + restore_tensors, +) +from sllm_store.client import SllmStoreClient +from sllm_store.device_map_utils import ( + DeviceMapType, + _compute_device_placement_from_map, + _compute_device_placement_from_map_fast, + _expand_tensor_name, + _transform_device_map_to_dict, +) +from sllm_store.logger import init_logger +from sllm_store.torch import load_dict_non_blocking, save_dict +from sllm_store.utils import ( + calculate_device_memory, + calculate_tensor_device_offsets, + get_no_split_modules, + get_tied_no_split_modules, + send_module_buffers_to_device, + quantize, +) +from torch import nn +from transformers import AutoConfig +import importlib +from peft import ( + PeftModel, + get_peft_model, + get_peft_model_state_dict, + LoraConfig, +) +from peft.utils import set_peft_model_state_dict +from transformers.utils.quantization_config import ( + QuantizationConfigMixin, +) + +logger = init_logger(__name__) + + +def _get_uuid(): + return str(uuid.uuid4()) + + +def save_model(model: nn.Module, model_path: str): + """ + Args: + model: nn.Module + a model to be saved + storage_path: str + a local path to save the converted model + """ + if not os.path.exists(model_path): + os.makedirs(model_path, exist_ok=True) + + model = model.cpu() + model_state_dict = model.state_dict() + + save_dict(model_state_dict, model_path) + + # This section of code was adopted from the Hugging Face Transformers project under Apache-2.0 License. # noqa: E501 + # Source: https://github.com/huggingface/transformers/blob/241c04d36867259cdf11dbb4e9d9a60f9cb65ebc/src/transformers/modeling_utils.py#L2812-L2856 + # Modifications made: Removed the support for '_hf_peft_config_loaded' + # + # Save the config + model.config.save_pretrained(model_path) + if model.can_generate(): + model.generation_config.save_pretrained(model_path) + + # save module index + no_split_modules = get_no_split_modules(model, model._no_split_modules) + with open(os.path.join(model_path, "no_split_modules.json"), "w") as f: + json.dump(no_split_modules, f) + + # save tied parameters + tied_no_split_modules = get_tied_no_split_modules(model, no_split_modules) + with open(os.path.join(model_path, "tied_no_split_modules.json"), "w") as f: + json.dump(tied_no_split_modules, f) + + +def save_lora(model: PeftModel, lora_path: str): + if not os.path.exists(lora_path): + os.makedirs(lora_path, exist_ok=True) + + model = model.to("cpu") + + lora_state_dict = get_peft_model_state_dict(model) + + save_dict(lora_state_dict, lora_path) + + # save the config + if hasattr(model, "peft_config") and model.peft_config: + adapter_name = getattr(model, "active_adapter", None) + if adapter_name is None: + logger.warning("No active_adapter found") + return + + config = model.peft_config.get(adapter_name, None) + if config is None: + logger.warning(f"No config found for adapter: {adapter_name}") + return + + config.save_pretrained(lora_path) + logger.info( + f"Saved LoRA config for adapter: {adapter_name} to {lora_path}" + ) + + +def load_model( + model_path: Optional[Union[str, os.PathLike]], + device_map: DeviceMapType = "auto", + torch_dtype: Optional[torch.dtype] = None, + quantization_config: Optional[ + Union[QuantizationConfigMixin, Dict[str, Any]] + ] = None, + storage_path: Optional[str] = None, + fully_parallel: bool = False, + hf_model_class: str = "AutoModelForCausalLM", +): + if fully_parallel: + return fully_parallel_load( + model_path=model_path, + hf_model_class=hf_model_class, + device_map=device_map, + torch_dtype=torch_dtype, + quantization_config=quantization_config, + storage_path=storage_path, + ) + # if fully_parallel is disabled, we still try to parallelize the model + # initialization and data loading in the best effort + return best_effort_load( + model_path=model_path, + hf_model_class=hf_model_class, + device_map=device_map, + torch_dtype=torch_dtype, + quantization_config=quantization_config, + storage_path=storage_path, + ) + + +def fully_parallel_load( + model_path: Optional[Union[str, os.PathLike]], + hf_model_class: str, + device_map: DeviceMapType = "auto", + torch_dtype: Optional[torch.dtype] = None, + quantization_config: Optional[ + Union[QuantizationConfigMixin, Dict[str, Any]] + ] = None, + storage_path: Optional[str] = None, +): + if not storage_path: + storage_path = os.getenv("STORAGE_PATH", "./models") + + start = time.time() + device_map = _transform_device_map_to_dict(device_map) + with open( + os.path.join(storage_path, model_path, "tied_no_split_modules.json"), + "r", + ) as f: + tied_no_split_modules = json.load(f) + + if isinstance(device_map, str): + with open( + os.path.join(storage_path, model_path, "no_split_modules.json"), + "r", + ) as f: + no_split_modules = json.load(f) + device_map = _compute_device_placement_from_map_fast( + no_split_modules, tied_no_split_modules, device_map + ) + + # TODO: offload `load_dict_non_blocking` to c++ for real parallelism + with concurrent.futures.ThreadPoolExecutor() as executor: + future = executor.submit( + load_dict_non_blocking, model_path, device_map, storage_path + ) + logger.debug( + f"load_dict_non_blocking takes {time.time() - start} seconds" + ) + + start = time.time() + config = AutoConfig.from_pretrained( + f"{os.path.join(storage_path, model_path)}", trust_remote_code=True + ) + if torch_dtype is not None: + config.torch_dtype = torch_dtype + logger.debug(f"load config takes {time.time() - start} seconds") + + start = time.time() + with init_empty_weights(): + module = importlib.import_module("transformers") + _class = getattr(module, hf_model_class) + model = _class.from_config( + config, + trust_remote_code=True, + ).to(config.torch_dtype) + model.tie_weights() + logger.debug(f"load model takes {time.time() - start} seconds") + + replica_uuid, state_dict = future.result() + + with torch.no_grad(): + if quantization_config and torch.cuda.is_available(): + model = quantize( + model, + state_dict, + quantization_config, + torch_dtype, + device_map, + model_path, + replica_uuid, + logger, + ) + else: + if quantization_config is not None: + logger.debug( + "Quantization on current device is not supported yet" + ) + + for name, param in state_dict.items(): + set_module_tensor_to_device(model, name, param.device, param) + send_module_buffers_to_device(model, device_map) + + dispatch_model( + model, device_map, skip_keys=model._skip_keys_device_placement + ) + client = SllmStoreClient("127.0.0.1:8073") + client.confirm_model_loaded(model_path, replica_uuid) + model.hf_device_map = device_map + model.eval() + return model + + +def best_effort_load( + model_path: Optional[Union[str, os.PathLike]], + hf_model_class: str, + device_map: DeviceMapType = "auto", + torch_dtype: Optional[torch.dtype] = None, + quantization_config: Optional[ + Union[QuantizationConfigMixin, Dict[str, Any]] + ] = None, + storage_path: Optional[str] = None, +): + client = SllmStoreClient("127.0.0.1:8073") + ret = client.load_into_cpu(model_path) + if not ret: + raise ValueError(f"Failed to load model {model_path} into CPU") + + replica_uuid = _get_uuid() + device_map = _transform_device_map_to_dict(device_map) + + if isinstance(device_map, dict) and ( + torch.device("cpu") in device_map.values() + or "cpu" in device_map.values() + ): + raise ValueError("CPU is not supported in device_map.") + + if not storage_path: + storage_path = os.getenv("STORAGE_PATH", "./models") + start = time.time() + config = AutoConfig.from_pretrained( + f"{os.path.join(storage_path, model_path)}", trust_remote_code=True + ) + if torch_dtype is not None: + config.torch_dtype = torch_dtype + + logger.debug(f"load config takes {time.time() - start} seconds") + start = time.time() + with init_empty_weights(): + module = importlib.import_module("transformers") + _class = getattr(module, hf_model_class) + model = _class.from_config(config, trust_remote_code=True).to( + config.torch_dtype + ) + + model.tie_weights() + logger.debug(f"load model takes {time.time() - start} seconds") + + start = time.time() + if isinstance(device_map, str): + device_map = _compute_device_placement_from_map( + model, device_map, config.torch_dtype + ) + logger.debug(f"device_map: {device_map}") + # check if 'cpu' is in device_map values and raise an exception + if "cpu" in device_map.values(): + raise ValueError( + "The GPUs are either unavailable or do not have enough memory. Please ensure they are available and ready for use." # noqa: E501 + ) + + logger.debug( + f"compute_device_placement takes {time.time() - start} seconds" + ) + + with open( + os.path.join(storage_path, model_path, "tensor_index.json"), "r" + ) as f: + tensor_index = json.load(f) + + tensor_meta_index = {} + tensor_data_index = {} + for name, (offset, size, shape, stride, dtype) in tensor_index.items(): + tensor_meta_index[name] = (shape, stride, dtype) + tensor_data_index[name] = (offset, size) + + start = time.time() + expanded_device_map = _expand_tensor_name( + device_map, list(tensor_index.keys()) + ) + device_memory = calculate_device_memory( + expanded_device_map, tensor_data_index + ) + # logger.debug(f"calculate_device_memory {device_memory}") + cuda_memory_ptrs = allocate_cuda_memory(device_memory) + # cuda_memory_ptrs = { k: [v] for k,v in cuda_memory_ptrs.items()} + cuda_memory_handles = get_cuda_memory_handles(cuda_memory_ptrs) + device_uuid_map = get_device_uuid_map() + # logger.debug(f"determine device_uuid_map {device_uuid_map}") + tensor_device_offsets, tensor_copy_chunks = calculate_tensor_device_offsets( + expanded_device_map, tensor_data_index + ) + logger.debug(f"allocate_cuda_memory takes {time.time() - start} seconds") + + ret = client.load_into_gpu( + model_path, + replica_uuid, + { + device_uuid_map[device_id]: v + for device_id, v in tensor_copy_chunks.items() + }, + { + device_uuid_map[device_id]: [v] + for device_id, v in cuda_memory_handles.items() + }, + ) + if not ret: + raise ValueError(f"Failed to load model {model_path} into GPU") + + # load model state_dict + start = time.time() + state_dict = restore_tensors( + tensor_meta_index, cuda_memory_ptrs, tensor_device_offsets + ) + logger.info(f"restore state_dict takes {time.time() - start} seconds") + + with torch.no_grad(): + if quantization_config and torch.cuda.is_available(): + model = quantize( + model, + state_dict, + quantization_config, + torch_dtype, + device_map, + model_path, + replica_uuid, + logger, + ) + else: + if quantization_config is not None: + logger.debug( + "Quantization on current device is not supported yet" + ) + + for name, param in state_dict.items(): + set_module_tensor_to_device(model, name, param.device, param) + send_module_buffers_to_device(model, device_map) + + dispatch_model( + model, device_map, skip_keys=model._skip_keys_device_placement + ) + + client.confirm_model_loaded(model_path, replica_uuid) + model.eval() + model.hf_device_map = device_map + + return model + + +def load_lora( + model: nn.Module, + adapter_name: str, + adapter_path: Optional[Union[str, os.PathLike]], + device_map: DeviceMapType = "auto", + storage_path: Optional[str] = None, + is_trainable: bool = False, + torch_dtype: Optional[torch.dtype] = None, +): + if not storage_path: + storage_path = os.getenv("STORAGE_PATH", "./models") + + config_path = os.path.join( + storage_path, adapter_path, "adapter_config.json" + ) + with open(config_path, "r") as f: + config_dict = json.load(f) + lora_config = LoraConfig(**config_dict) + + if lora_config.is_prompt_learning and is_trainable: + raise ValueError( + "Cannot set a prompt learning adapter to trainable\ + when loading pretrained adapter." + ) + + lora_config.inference_mode = not is_trainable + + client = SllmStoreClient("127.0.0.1:8073") + client.register_model(adapter_path) + + model.add_adapter(lora_config, adapter_name=adapter_name) + + replica_uuid, state_dict = load_dict_non_blocking( + adapter_path, {"": 0}, storage_path + ) + + # https://github.com/huggingface/transformers/blob/de182ba2690fe6c3466f6463c7f4b3a61694b885/src/transformers/integrations/peft.py#L228-L265 + processed_adapter_state_dict = {} + prefix = "base_model.model." + for key, value in state_dict.items(): + new_key = key[len(prefix) :] if key.startswith(prefix) else key + processed_adapter_state_dict[new_key] = value + + incompatible_keys = set_peft_model_state_dict( + model, processed_adapter_state_dict, adapter_name + ) + if incompatible_keys is not None: + err_msg = "" + origin_name = adapter_path if adapter_path is not None else "state_dict" + # Check for unexpected keys. + if ( + hasattr(incompatible_keys, "unexpected_keys") + and len(incompatible_keys.unexpected_keys) > 0 + ): + err_msg = ( + f"Loading adapter weights from {origin_name} led to \ + unexpected keys not found in the model: " + f"{', '.join(incompatible_keys.unexpected_keys)}. " + ) + + # Check for missing keys. + missing_keys = getattr(incompatible_keys, "missing_keys", None) + if missing_keys: + # Filter missing keys specific to the current adapter, \ + # as missing base model keys are expected. + lora_missing_keys = [ + k for k in missing_keys if "lora_" in k and adapter_name in k + ] + if lora_missing_keys: + err_msg += ( + f"Loading adapter weights from {origin_name} led to \ + missing keys in the model: " + f"{', '.join(lora_missing_keys)}" + ) + + if err_msg: + logger.warning(err_msg) + + # convert base model to PeftModel + peft_model = get_peft_model(model, lora_config) + + # synchronize + client.confirm_model_loaded(adapter_path, replica_uuid) + + if lora_config.inference_mode: + peft_model.eval() + + logger.info(f"Available adapters: {peft_model.peft_config.keys()}") + + return peft_model diff --git a/sllm_store/sllm_store/utils.py b/sllm_store/sllm_store/utils.py new file mode 100644 index 0000000..565f71a --- /dev/null +++ b/sllm_store/sllm_store/utils.py @@ -0,0 +1,349 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # +import re +from functools import reduce +from contextlib import suppress + +import torch +from torch import nn +from transformers import BitsAndBytesConfig +from accelerate.utils import find_tied_parameters, set_module_tensor_to_device +from transformers.quantizers.auto import AutoHfQuantizer +from transformers.utils.quantization_config import ( + QuantizationConfigMixin, +) + +from sllm_store.client import SllmStoreClient + + +def set_module_buffer_to_device( + module: nn.Module, + target: str, + device: torch.device, +): + module_path, _, buffer_name = target.rpartition(".") + + mod: torch.nn.Module = module.get_submodule(module_path) + + if not hasattr(mod, buffer_name): + raise AttributeError( + mod._get_name() + " has no attribute `" + buffer_name + "`" + ) + + buffer = mod._buffers[buffer_name] + mod._buffers[buffer_name] = buffer.to(device) + + +def send_module_buffers_to_device( + module: nn.Module, + device_map: dict, +): + if "" in device_map and len(device_map) != 1: + raise RuntimeError( + f"Device map {device_map} is invalid. If you want to specify the default device, use key ''." # noqa: E501 + ) + + buffer_names = [name for name, _ in module.named_buffers()] + for tensor_or_module, device_id in device_map.items(): + if tensor_or_module == "": + for buffer_name in buffer_names: + set_module_buffer_to_device(module, buffer_name, device_id) + else: + for buffer_name in buffer_names: + if buffer_name.startswith(tensor_or_module): + set_module_buffer_to_device(module, buffer_name, device_id) + + +def calculate_device_memory(device_map, tensor_index): + device_memory = {} + tensor_record = {} + for tensor_name, device in device_map.items(): + if tensor_name in tensor_index: + if device not in device_memory: + device_memory[device] = 0 + offset, size = tensor_index[tensor_name] + if (offset, size) in tensor_record: + continue # Skip duplicate tensors + tensor_record[(offset, size)] = True + device_memory[device] += tensor_index[tensor_name][1] + else: + raise ValueError(f"Tensor {tensor_name} not found in tensor_index.") + + return device_memory + + +def calculate_tensor_device_offsets(device_map, tensor_index): + tensor_device_offsets = {} + tensor_copy_chunks = {} + device_offset = {} + tensor_record = {} + for tensor_name, device in device_map.items(): + if device not in tensor_device_offsets: + tensor_device_offsets[device] = {} + tensor_copy_chunks[device] = [] + device_offset[device] = 0 + if tensor_name in tensor_index: + offset, size = tensor_index[tensor_name] + if (offset, size) in tensor_record: + tensor_device_offsets[device][tensor_name] = tensor_record[ + (offset, size) + ] + else: + tensor_record[(offset, size)] = device_offset[device] + tensor_device_offsets[device][tensor_name] = device_offset[ + device + ] + tensor_copy_chunks[device].append( + (offset, size, device_offset[device], 0) + ) + device_offset[device] += size + else: + raise ValueError(f"Tensor {tensor_name} not found in tensor_index.") + + return tensor_device_offsets, tensor_copy_chunks + + +def get_total_parameter_size(module): + total_param_size = 0 + for param in module.parameters(): + total_param_size += param.numel() * dtype_byte_size(param.dtype) + return total_param_size + + +def get_parameter_size(model: nn.Module, param_path: str): + # Split the parameter path by dots + attributes = param_path.split(".") + + # Use reduce to traverse the model's attributes + param = reduce(getattr, attributes, model) + + # Return the size of the parameter + return param.numel() * dtype_byte_size(param.dtype) + + +def get_no_split_modules(model, no_split_modules_list, parent_name=""): + no_split_modules = {} + for name, submodule in model.named_children(): + full_name = f"{parent_name}.{name}" if parent_name else name + module_class_name = submodule.__class__.__name__ + # If the module is a leaf module or in the no_split_modules_list, we don't split it # noqa: E501 + if ( + not list(submodule.children()) + or module_class_name in no_split_modules_list + ): + no_split_modules[full_name] = get_total_parameter_size(submodule) + continue + no_split_modules.update( + get_no_split_modules(submodule, no_split_modules_list, full_name) + ) + + return no_split_modules + + +def get_tied_no_split_modules(model, no_split_modules): + tied_parameters = find_tied_parameters(model) + tied_modules = [] + for tied_param_group in tied_parameters: + tied_module_group = [] + shared_size = None + for tied_param in tied_param_group: + param_size = get_parameter_size(model, tied_param) + if shared_size is None: + shared_size = param_size + else: + assert ( + shared_size == param_size + ), f"Parameter {tied_param} does not have the same size as the other parameters in the group" # noqa: E501 + tied_module = None + while "." in tied_param: + tied_param = tied_param.rsplit(".", 1)[0] + if tied_param in no_split_modules: + tied_module = tied_param + break + if tied_module is None: + raise ValueError( + f"Parameter {tied_param} is not in the no_split_modules list" # noqa: E501 + ) + tied_module_group.append(tied_module) + tied_modules.append((tied_module_group, shared_size)) + + return tied_modules + + +def dtype_byte_size(dtype: torch.dtype) -> int: + return torch.finfo(dtype).bits // 8 + + +def to_num_bytes(value: str) -> int: + """ + Convert a string representing a data size to its equivalent number of bytes. + + The input must strictly follow the format: + + + - : A positive integer. + - : One of the following case-sensitive units: + B, KB, MB, GB, TB, PB, EB, ZB, YB + + No leading, trailing, or middle spaces or other characters are allowed. + + Examples: + "1GB" -> 1073741824 + "512MB" -> 536870912 + + Args: + value (str): The string to convert. + + Returns: + int: The equivalent number of bytes. + + Raises: + ValueError: If the input format is incorrect. + """ + # Define the regular expression pattern for validation + pattern = r"^(\d+)(B|KB|MB|GB|TB|PB|EB|ZB|YB)$" + match = re.fullmatch(pattern, value) + + if not match: + error_message = ( + "Invalid format. The input must be a positive integer " + "followed immediately by a unit " + "(B, KB, MB, GB, TB, PB, EB, ZB, YB), case sensitive, " + "with no spaces or other characters." + ) + raise ValueError(error_message) + + number_str, unit = match.groups() + number = int(number_str) + + # Define the multiplier for each unit + unit_multipliers = { + "B": 1, + "KB": 1024, + "MB": 1024**2, + "GB": 1024**3, + "TB": 1024**4, + "PB": 1024**5, + "EB": 1024**6, + "ZB": 1024**7, + "YB": 1024**8, + } + + bytes_value = number * unit_multipliers[unit] + return bytes_value + + +def quantize( + model, + state_dict, + quantization_config, + torch_dtype, + device_map, + model_path, + replica_uuid, + logger, +): + if isinstance(quantization_config, dict): + try: + quantization_config = BitsAndBytesConfig.from_dict( + quantization_config + ) + except (TypeError, ValueError) as e: + logger.error(f"Invalid quantization_config dictionary: {e}") + raise ValueError( + f"Invalid quantization_config dictionary: {e}" + ) from e + + if not isinstance(quantization_config, QuantizationConfigMixin): + raise ValueError(f"Invalid config type: {type(quantization_config)}") + + quant_method = quantization_config.quant_method + if quant_method in [ + "aqlm", + "awq", + "bitnet", + "quanto", + "vptq", + "quark", + "higgs", + "hqq", + "eetq", + "torchao", + "spqr", + "fp8", + "auto-round", + "fbgemm_fp8", + "compressed_tensors", + ]: + raise ValueError( + f"{quant_method} (requires pre-quantization) " "is not supported." + ) + + logger.info(f"Using quantization method: {quant_method}") + if quantization_config.quant_method == "bitsandbytes": + precision = quantization_config.quantization_method() + logger.info(f"Using precision: {precision}") + + if quantization_config.llm_int8_enable_fp32_cpu_offload: + logger.debug("Offloading is not supported yet") + quantization_config.llm_int8_enable_fp32_cpu_offload = False + else: + with suppress(Exception): + logger.info(f"Using precision: {quantization_config.bits}") + + torch_dtype = torch_dtype or torch.float16 + hf_quantizer = AutoHfQuantizer.from_config( + quantization_config, pre_quantized=False + ) + model.hf_device_map = device_map + model.hf_quantizer = hf_quantizer + hf_quantizer.validate_environment(device_map=device_map) + hf_quantizer.preprocess_model(model, device_map=device_map) + + # synchronize + client = SllmStoreClient("127.0.0.1:8073") + client.confirm_model_loaded(model_path, replica_uuid) + + for name, param in state_dict.items(): + if param.is_floating_point(): + param = param.to(torch_dtype) + if hf_quantizer.check_quantized_param(model, param, name, state_dict): + final_device = param.device + hf_quantizer.create_quantized_param( + model, + param, + name, + final_device, + state_dict, + unexpected_keys=[], + ) + + else: + set_module_tensor_to_device(model, name, param.device, param) + + # converting new biases + for module in model.modules(): + b = getattr(module, "bias", None) + if b is not None and b.dtype != torch_dtype: + b.data = b.data.to(torch_dtype) + + if quant_method == "gptq": + model = model.to("cuda") + + hf_quantizer.postprocess_model(model) + return model diff --git a/sllm_store/tests/.DS_Store b/sllm_store/tests/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..0dd6a6e7800457d9b93e8820a0696fc155769405 GIT binary patch literal 6148 zcmeHKJ5B>J5S<|rT8Snl6>>=%PGF+V3336HL?T6&-2w_acSxLoV{i+4Bo4w2c;gw8 zH7t|}!Hi@-?|i*aT6>3xcy_a%5>1Gx!VqLx42Y-)O$X*IMwT4Y#j0((ffT=2C3_#y ziaP4Hm;L>pKJP6}Ti45NyM(5CI7|2GK-_fHSaTK+cDNAs7vl zVm>-BQTR**?+_eGY0z*Xn pk}M!t7e4`bkaOfX8`U0U4ZmoZ6eWx3b2!j{1TrB$IRihyz#G3OM#BIA literal 0 HcmV?d00001 diff --git a/sllm_store/tests/cpp/CMakeLists.txt b/sllm_store/tests/cpp/CMakeLists.txt new file mode 100644 index 0000000..6806708 --- /dev/null +++ b/sllm_store/tests/cpp/CMakeLists.txt @@ -0,0 +1,32 @@ +# Find GTest +FetchContent_Declare( + googletest + GIT_REPOSITORY https://github.com/google/googletest.git + GIT_TAG v1.13.0 +) +FetchContent_MakeAvailable(googletest) + +# Specify the test source file +set(TEST_SOURCES test_load_to_host.cpp test_pinned_memory.cpp) + +# Create an executable for the tests +add_executable(runTests ${TEST_SOURCES}) + +# set CUDA or HIP +find_package(CUDAToolkit QUIET) +find_package(HIP QUIET) + +if (CUDAToolkit_FOUND) + message(STATUS "CUDA found") +elseif (HIP_FOUND) + message(STATUS "HIP found") + target_compile_definitions(runTests PRIVATE USE_HIP) +else() + message(FATAL_ERROR "Neither CUDA nor HIP found") +endif() + +# Link the test executable with GTest and the main project +target_link_libraries(runTests GTest::gtest_main sllm_store) + +# Register the test +add_test(NAME runTests COMMAND runTests) diff --git a/sllm_store/tests/cpp/test_load_to_host.cpp b/sllm_store/tests/cpp/test_load_to_host.cpp new file mode 100644 index 0000000..7cdc19b --- /dev/null +++ b/sllm_store/tests/cpp/test_load_to_host.cpp @@ -0,0 +1,98 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef USE_HIP +#include "checkpoint_store_hip.h" +#else +#include "checkpoint_store.h" +#endif + +bool WriteBytesToFile(const std::string& file_path, + const std::vector& data) { + // Ensure the directory exists + std::filesystem::create_directories( + std::filesystem::path(file_path).parent_path()); + + std::ofstream file(file_path, std::ios::binary); + if (!file) { + return false; // Failed to open file + } + file.write(reinterpret_cast(data.data()), data.size()); + return file.good(); // Return true if the write was successful +} + +class CheckpointStoreTest : public ::testing::Test { + protected: + static CheckpointStore* storage; + static size_t mem_pool_size; + static std::string storage_path; + static int num_thread; + static size_t chunk_size; + + static void SetUpTestSuite() { + mem_pool_size = 4L * 1024 * 1024 * 1024; // 4GB + storage_path = "./test_models"; + num_thread = 4; + chunk_size = 4 * 1024 * 1024; // 4MB + + storage = new CheckpointStore(storage_path, mem_pool_size, num_thread, + chunk_size); + } + + static void TearDownTestSuite() { delete storage; } +}; + +CheckpointStore* CheckpointStoreTest::storage = nullptr; +size_t CheckpointStoreTest::mem_pool_size = 0; +std::string CheckpointStoreTest::storage_path = ""; +int CheckpointStoreTest::num_thread = 0; +size_t CheckpointStoreTest::chunk_size = 0; + +TEST_F(CheckpointStoreTest, LoadModelFromDisk) { + std::string model_path = "facebook/opt-1.3b"; + size_t model_size = 256 * 1024 * 1024; // 256MB + + std::vector model_data(model_size, 0xFF); + std::string data_path = storage_path + "/" + model_path + "/tensor.data_0"; + + bool write_success = WriteBytesToFile(data_path, model_data); + ASSERT_TRUE(write_success) << "Failed to write test data to file"; + + // Register model + size_t registered_model_size = storage->RegisterModelInfo(model_path); + EXPECT_EQ(registered_model_size, model_size); + + // Load model from disk + EXPECT_EQ(storage->LoadModelFromDisk(model_path), 0); + + // Clear all models + EXPECT_EQ(storage->ClearMem(), 0); + + // Remove the model file + std::filesystem::remove_all(storage_path + "/*"); +} diff --git a/sllm_store/tests/cpp/test_pinned_memory.cpp b/sllm_store/tests/cpp/test_pinned_memory.cpp new file mode 100644 index 0000000..8da15a3 --- /dev/null +++ b/sllm_store/tests/cpp/test_pinned_memory.cpp @@ -0,0 +1,194 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#include + +#include +#include +#include +#include +#include +#include + +#include "pinned_memory.h" +#include "pinned_memory_pool.h" + +class PinnedMemoryPoolTest : public ::testing::Test { + protected: + static size_t mem_pool_size; + static size_t chunk_size; + + static void SetUpTestSuite() { + mem_pool_size = 1L * 1024 * 1024 * 1024; // 1GB + chunk_size = 4 * 1024 * 1024; // 4MB + } +}; + +size_t PinnedMemoryPoolTest::mem_pool_size = 0; +size_t PinnedMemoryPoolTest::chunk_size = 0; + +TEST_F(PinnedMemoryPoolTest, InitializePinnedMemoryPool) { + auto pinned_memory_pool = + std::make_unique(mem_pool_size, chunk_size); + EXPECT_EQ(pinned_memory_pool->chunk_size(), chunk_size); +} + +TEST_F(PinnedMemoryPoolTest, RegularAllocateDeallocate) { + size_t size = 1024; + auto pinned_memory_pool = + std::make_unique(mem_pool_size, chunk_size); + + std::vector buffers; + EXPECT_EQ(pinned_memory_pool->Allocate(size, buffers), 0); + EXPECT_EQ(buffers.size(), 1); + ASSERT_NE(buffers[0], nullptr); + EXPECT_EQ(pinned_memory_pool->Deallocate(buffers), 0); +} + +TEST_F(PinnedMemoryPoolTest, IrregularAllocateDeallocate) { + size_t size = 17 * 1024 * 1024; // 17MB + auto pinned_memory_pool = + std::make_unique(mem_pool_size, chunk_size); + + std::vector buffers; + EXPECT_EQ(pinned_memory_pool->Allocate(size, buffers), 0); + EXPECT_EQ(buffers.size(), 5); + for (auto buffer : buffers) { + ASSERT_NE(buffer, nullptr); + } + EXPECT_EQ(pinned_memory_pool->Deallocate(buffers), 0); +} + +TEST_F(PinnedMemoryPoolTest, OutOfMemoryAllocate) { + size_t size = 1024 * 1024 * 1024; // 1GB + auto pinned_memory_pool = + std::make_unique(mem_pool_size, chunk_size); + + std::vector buffers; + EXPECT_EQ(pinned_memory_pool->Allocate(size, buffers), 0); + EXPECT_EQ(buffers.size(), 256); + for (auto buffer : buffers) { + ASSERT_NE(buffer, nullptr); + } + // When out of memory, Allocate() should return the number of buffers needed + EXPECT_EQ(pinned_memory_pool->Allocate(size, buffers), 256); + EXPECT_EQ(pinned_memory_pool->Deallocate(buffers), 0); + + // Allocate again + EXPECT_EQ(pinned_memory_pool->Allocate(size, buffers), 0); + EXPECT_EQ(buffers.size(), 256); + for (auto buffer : buffers) { + ASSERT_NE(buffer, nullptr); + } + EXPECT_EQ(pinned_memory_pool->Deallocate(buffers), 0); +} + +TEST_F(PinnedMemoryPoolTest, ZeroSizeAllocate) { + size_t size = 0; + auto pinned_memory_pool = + std::make_unique(mem_pool_size, chunk_size); + + std::vector buffers; + EXPECT_NE(pinned_memory_pool->Allocate(size, buffers), 0); +} + +TEST_F(PinnedMemoryPoolTest, DeallocateNonExistentBuffer) { + size_t size = 1024; + auto pinned_memory_pool = + std::make_unique(mem_pool_size, chunk_size); + + std::vector buffers; + EXPECT_EQ(pinned_memory_pool->Allocate(size, buffers), 0); + EXPECT_EQ(pinned_memory_pool->Deallocate(buffers), 0); + EXPECT_NE(pinned_memory_pool->Deallocate(buffers), 0); +} + +TEST_F(PinnedMemoryPoolTest, ConcurrentAllocateDeallocate) { + size_t size = 1024; + auto pinned_memory_pool = + std::make_unique(mem_pool_size, chunk_size); + + std::vector> futures; + for (int i = 0; i < 100; ++i) { + futures.push_back( + std::async(std::launch::async, [size, &pinned_memory_pool]() -> int { + std::vector buffers; + if (pinned_memory_pool->Allocate(size, buffers) == 0) { + if (buffers.size() != 1 || buffers[0] == nullptr) { + return -1; + } + // sleep for a random time + std::this_thread::sleep_for( + std::chrono::milliseconds(rand() % 100)); + return pinned_memory_pool->Deallocate(buffers); + } else { + return -1; + } + })); + } + + for (auto& future : futures) { + EXPECT_EQ(future.get(), 0); + } +} + +class PinnedMemoryTest : public ::testing::Test { + protected: + static size_t mem_pool_size; + static size_t chunk_size; + + static void SetUpTestSuite() { + mem_pool_size = 1L * 1024 * 1024 * 1024; // 1GB + chunk_size = 4 * 1024 * 1024; // 4MB + } +}; + +size_t PinnedMemoryTest::mem_pool_size = 0; +size_t PinnedMemoryTest::chunk_size = 0; + +TEST_F(PinnedMemoryTest, AllocatePinMemory) { + size_t size = 1024; + auto pinned_memory_pool = + std::make_shared(mem_pool_size, chunk_size); + std::unique_ptr pinned_memory = + std::make_unique(); + EXPECT_EQ(pinned_memory->Allocate(size, pinned_memory_pool), 0); + EXPECT_EQ(pinned_memory->num_chunks(), 1); + EXPECT_EQ(pinned_memory->chunk_size(), chunk_size); + auto buffers = pinned_memory->get(); + EXPECT_EQ(buffers.size(), 1); + ASSERT_NE(buffers[0], nullptr); +} + +TEST_F(PinnedMemoryTest, DeallocatePinMemory) { + size_t size = 1024 * 1024 * 1024; // 1GB + auto pinned_memory_pool = + std::make_shared(mem_pool_size, chunk_size); + // PinnedMemory should deallocate memory when it goes out of scope + for (int i = 0; i < 100; ++i) { + std::unique_ptr pinned_memory = + std::make_unique(); + EXPECT_EQ(pinned_memory->Allocate(size, pinned_memory_pool), 0); + EXPECT_EQ(pinned_memory->num_chunks(), 256); + EXPECT_EQ(pinned_memory->chunk_size(), chunk_size); + auto buffers = pinned_memory->get(); + EXPECT_EQ(buffers.size(), 256); + for (auto buffer : buffers) { + ASSERT_NE(buffer, nullptr); + } + } +} \ No newline at end of file diff --git a/sllm_store/tests/python/test_cli.py b/sllm_store/tests/python/test_cli.py new file mode 100644 index 0000000..bb482c2 --- /dev/null +++ b/sllm_store/tests/python/test_cli.py @@ -0,0 +1,605 @@ +import os +import shutil +import unittest +from pathlib import Path +from click.testing import CliRunner +from sllm_store.cli import cli +from huggingface_hub import snapshot_download + +TEST_MODEL_VLLM = "facebook/opt-125m" +TEST_MODEL_TRANSFORMERS = "facebook/opt-125m" +TEST_ADAPTER_MODEL = ( + "jeanlucmarsh/opt-125m-pattern-based_finetuning_with_lora-mnli-mm-d3_fs2" +) +TEST_DIRECTORY_SAVE = "./test_save_models" +TEST_DIRECTORY_LOAD = "./models" + + +class TestCliCommands(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.runner = CliRunner() + + result = cls.runner.invoke( + cli, + [ + "save", + "--model", + TEST_MODEL_VLLM, + "--backend", + "vllm", + "--storage-path", + TEST_DIRECTORY_LOAD + "/vllm", + ], + ) + assert result.exit_code == 0, f"Initial save failed: {result.output}" + + result = cls.runner.invoke( + cli, + [ + "save", + "--model", + TEST_MODEL_TRANSFORMERS, + "--backend", + "transformers", + "--storage-path", + TEST_DIRECTORY_LOAD + "/transformers", + ], + ) + assert result.exit_code == 0, f"Initial save failed: {result.output}" + + result = cls.runner.invoke( + cli, + [ + "save", + "--model", + TEST_MODEL_TRANSFORMERS, + "--backend", + "transformers", + "--adapter-name", + TEST_ADAPTER_MODEL, + "--storage-path", + TEST_DIRECTORY_LOAD, + ], + ) + assert result.exit_code == 0, f"Initial save failed: {result.output}" + + def tearDown(self): + path = Path(TEST_DIRECTORY_SAVE) + if path.exists() and path.is_dir(): + try: + shutil.rmtree(path) + print(f"Removed old test folder: {path}") + except OSError as e: + print(f"Error removing {path}: {e}") + + @classmethod + def tearDownClass(cls): + path = Path(TEST_DIRECTORY_LOAD) + if path.exists() and path.is_dir(): + try: + shutil.rmtree(path) + print(f"[tearDownClass] Removed load folder: {path}") + except OSError as e: + print(f"[tearDownClass] Error removing {path}: {e}") + + # SAVE + + def test_save_vllm_model_default(self): + result = self.runner.invoke( + cli, ["save", "--model", TEST_MODEL_VLLM, "--backend", "vllm"] + ) + self.assertEqual( + result.exit_code, + 0, + f"Command failed with output: {result.output}\n" + f"Stderr: {result.stderr}", + ) + expected_folder = Path("models") / TEST_MODEL_VLLM + self.assertTrue( + expected_folder.is_dir(), + f"Folder does not exist: {expected_folder}", + ) + + # Check if each partition directory was created + tensor_parallel_size = 1 + for i in range(tensor_parallel_size): + self.assertTrue(os.path.exists(f"{expected_folder}/rank_{i}")) + self.assertFalse( + os.path.exists(f"{expected_folder}/rank_{tensor_parallel_size}") + ) + + # Check if certain files exist to verify that the model was saved + expected_files = [ + "tensor_index.json", + "tensor.data_0", + ] + unexpected_files = ["tensor.data_1", "*.bin", "*.safetensors"] + for i in range(tensor_parallel_size): + for filename in expected_files: + self.assertTrue( + os.path.isfile( + os.path.join(expected_folder, f"rank_{i}", filename) + ) + ) + for filename in unexpected_files: + self.assertFalse( + os.path.isfile( + os.path.join(expected_folder, f"rank_{i}", filename) + ) + ) + + for filename in unexpected_files: + self.assertFalse( + os.path.isfile( + os.path.join(expected_folder, f"rank_{i}", filename) + ) + ) + + def test_save_vllm_model_params(self): + tensor_parallel_size = ( + 1 # Change to 2 if you have multiple GPUs and want to test it + ) + result = self.runner.invoke( + cli, + [ + "save", + "--model", + TEST_MODEL_VLLM, + "--backend", + "vllm", + "--tensor-parallel-size", + str(tensor_parallel_size), + "--storage-path", + TEST_DIRECTORY_SAVE, + ], + ) + self.assertEqual( + result.exit_code, + 0, + f"Command failed with output: {result.output}\n" + f"Stderr: {result.stderr}", + ) + expected_folder = Path(TEST_DIRECTORY_SAVE) / TEST_MODEL_VLLM + self.assertTrue( + expected_folder.is_dir(), + f"Folder does not exist: {expected_folder}", + ) + + # Check if each partition directory was created + for i in range(tensor_parallel_size): + self.assertTrue(os.path.exists(f"{expected_folder}/rank_{i}")) + self.assertFalse( + os.path.exists(f"{expected_folder}/rank_{tensor_parallel_size}") + ) + + # Check if certain files exist to verify that the model was saved + expected_files = [ + "tensor_index.json", + "tensor.data_0", + ] + unexpected_files = ["tensor.data_1", "*.bin", "*.safetensors"] + for i in range(tensor_parallel_size): + for filename in expected_files: + self.assertTrue( + os.path.isfile( + os.path.join(expected_folder, f"rank_{i}", filename) + ) + ) + for filename in unexpected_files: + self.assertFalse( + os.path.isfile( + os.path.join(expected_folder, f"rank_{i}", filename) + ) + ) + + for filename in unexpected_files: + self.assertFalse( + os.path.isfile( + os.path.join(expected_folder, f"rank_{i}", filename) + ) + ) + + def test_save_vllm_model_local_path(self): + local_dummy_model_path = Path(TEST_DIRECTORY_SAVE) / "dummy_local_model" + snapshot_download( + repo_id=TEST_MODEL_VLLM, + local_dir=local_dummy_model_path, + local_dir_use_symlinks=False, + ) + + result = self.runner.invoke( + cli, + [ + "save", + "--model", + TEST_MODEL_VLLM, + "--backend", + "vllm", + "--local-model-path", + str(local_dummy_model_path), + "--storage-path", + TEST_DIRECTORY_SAVE, + ], + ) + + self.assertEqual( + result.exit_code, + 0, + f"Command failed with output: {result.output}\n" + f"Stderr: {result.stderr}", + ) + expected_folder = Path(TEST_DIRECTORY_SAVE) / TEST_MODEL_VLLM + self.assertTrue( + expected_folder.is_dir(), + f"Folder does not exist: {expected_folder}", + ) + + # Check if each partition directory was created + tensor_parallel_size = 1 + for i in range(tensor_parallel_size): + self.assertTrue(os.path.exists(f"{expected_folder}/rank_{i}")) + self.assertFalse( + os.path.exists(f"{expected_folder}/rank_{tensor_parallel_size}") + ) + + # Check if certain files exist to verify that the model was saved + expected_files = [ + "tensor_index.json", + "tensor.data_0", + ] + unexpected_files = ["tensor.data_1", "*.bin", "*.safetensors"] + for i in range(tensor_parallel_size): + for filename in expected_files: + self.assertTrue( + os.path.isfile( + os.path.join(expected_folder, f"rank_{i}", filename) + ) + ) + for filename in unexpected_files: + self.assertFalse( + os.path.isfile( + os.path.join(expected_folder, f"rank_{i}", filename) + ) + ) + + for filename in unexpected_files: + self.assertFalse( + os.path.isfile( + os.path.join(expected_folder, f"rank_{i}", filename) + ) + ) + + def test_save_transformers_model_default(self): + result = self.runner.invoke( + cli, + [ + "save", + "--model", + TEST_MODEL_TRANSFORMERS, + "--backend", + "transformers", + ], + ) + self.assertEqual( + result.exit_code, + 0, + f"Command failed with output: {result.output}\n" + f"Stderr: {result.stderr}", + ) + expected_folder = Path("./models") / TEST_MODEL_TRANSFORMERS + self.assertTrue( + expected_folder.is_dir(), + f"Folder does not exist: {expected_folder}", + ) + self.assertTrue( + any(expected_folder.iterdir()), + f"Folder is empty: {expected_folder}", + ) + + # Check if certain files exist to verify that the model was saved + expected_files = [ + "config.json", + "generation_config.json", + "no_split_modules.json", + "tensor_index.json", + "tensor.data_0", + "tied_no_split_modules.json", + ] + for filename in expected_files: + self.assertTrue( + os.path.isfile(os.path.join(expected_folder, filename)) + ) + + unexpected_files = ["tensor.data_1", "*.bin", "*.safetensors"] + for filename in unexpected_files: + self.assertFalse( + os.path.isfile(os.path.join(expected_folder, filename)) + ) + + def test_save_transformers_adapter_valid(self): + result = self.runner.invoke( + cli, + [ + "save", + "--model", + TEST_MODEL_TRANSFORMERS, + "--backend", + "transformers", + "--storage-path", + TEST_DIRECTORY_SAVE, + ], + ) + + result = self.runner.invoke( + cli, + [ + "save", + "--model", + TEST_MODEL_TRANSFORMERS, + "--backend", + "transformers", + "--adapter-name", + TEST_ADAPTER_MODEL, + "--storage-path", + TEST_DIRECTORY_SAVE, + ], + ) + self.assertEqual( + result.exit_code, + 0, + f"Command failed with output: {result.output}\n" + f"Stderr: {result.stderr}", + ) + expected_folder = ( + Path(TEST_DIRECTORY_SAVE) / TEST_ADAPTER_MODEL + ) # Adapters save under adapter_name + self.assertTrue( + expected_folder.is_dir(), + f"Adapter folder does not exist: {expected_folder}", + ) + self.assertTrue( + any(expected_folder.iterdir()), + f"Adapter folder is empty: {expected_folder}", + ) + + # Check if certain files exist to verify that the model was saved + expected_files = [ + "tensor_index.json", + "tensor.data_0", + ] + for filename in expected_files: + self.assertTrue( + os.path.isfile(os.path.join(expected_folder, filename)) + ) + + unexpected_files = ["tensor.data_1", "*.bin", "*.safetensors"] + for filename in unexpected_files: + self.assertFalse( + os.path.isfile(os.path.join(expected_folder, filename)) + ) + + def test_save_invalid_backend(self): + result = self.runner.invoke( + cli, + [ + "save", + "--model", + "facebook/opt-125m", + "--backend", + "unsupported_backend", + ], + ) + self.assertNotEqual(result.exit_code, 0) + self.assertFalse( + (Path(TEST_DIRECTORY_SAVE) / "facebook/opt-125m").exists() + ) + + def test_save_missing_model_name(self): + result = self.runner.invoke(cli, ["save", "--backend", "vllm"]) + self.assertNotEqual(result.exit_code, 0) + self.assertIn("Missing option '--model'", result.stderr) + + def test_save_non_existent_hf_model(self): + non_existent_model = "nonexistent/model-xyz-123" + result = self.runner.invoke( + cli, + [ + "save", + "--model", + non_existent_model, + "--backend", + "transformers", + "--storage-path", + TEST_DIRECTORY_SAVE, + ], + ) + self.assertNotEqual(result.exit_code, 0) + self.assertFalse( + (Path(TEST_DIRECTORY_SAVE) / non_existent_model).exists() + ) + + # LOAD + + def test_load_vllm_model_default(self): + result = self.runner.invoke( + cli, + [ + "load", + "--model", + TEST_MODEL_VLLM, + "--backend", + "vllm", + "--storage-path", + TEST_DIRECTORY_LOAD + "/vllm", + ], + ) + self.assertEqual( + result.exit_code, + 0, + f"Command failed with output: {result.output}\n" + f"Stderr: {result.stderr}", + ) + self.assertIn("Prompt:", result.output) + self.assertIn("Generated text:", result.output) + + def test_load_transformers_model_default(self): + result = self.runner.invoke( + cli, + [ + "load", + "--model", + "transformers/" + TEST_MODEL_TRANSFORMERS, + "--backend", + "transformers", + "--storage-path", + TEST_DIRECTORY_LOAD, + ], + ) + self.assertEqual( + result.exit_code, + 0, + f"Command failed with output: {result.output}\n" + f"Stderr: {result.stderr}", + ) + self.assertIn("Hello, my dog is cute", result.output) + + def test_load_transformers_precision_int8(self): + result = self.runner.invoke( + cli, + [ + "load", + "--model", + "transformers/" + TEST_MODEL_TRANSFORMERS, + "--backend", + "transformers", + "--precision", + "int8", + "--storage-path", + TEST_DIRECTORY_LOAD, + ], + ) + self.assertEqual( + result.exit_code, + 0, + f"Command failed with output: {result.output}\n" + f"Stderr: {result.stderr}", + ) + self.assertIn("Hello, my dog is cute", result.output) + + def test_load_transformers_precision_fp4(self): + result = self.runner.invoke( + cli, + [ + "load", + "--model", + "transformers/" + TEST_MODEL_TRANSFORMERS, + "--backend", + "transformers", + "--precision", + "fp4", + "--storage-path", + TEST_DIRECTORY_LOAD, + ], + ) + self.assertEqual( + result.exit_code, + 0, + f"Command failed with output: {result.output}\n" + f"Stderr: {result.stderr}", + ) + self.assertIn("Hello, my dog is cute", result.output) + + def test_load_transformers_precision_nf4(self): + result = self.runner.invoke( + cli, + [ + "load", + "--model", + "transformers/" + TEST_MODEL_TRANSFORMERS, + "--backend", + "transformers", + "--precision", + "nf4", + "--storage-path", + TEST_DIRECTORY_LOAD, + ], + ) + self.assertEqual( + result.exit_code, + 0, + f"Command failed with output: {result.output}\n" + f"Stderr: {result.stderr}", + ) + self.assertIn("Hello, my dog is cute", result.output) + + def test_load_transformers_precision_invalid(self): + result = self.runner.invoke( + cli, + [ + "load", + "--model", + TEST_MODEL_TRANSFORMERS, + "--backend", + "transformers", + "--precision", + "invalid_precision", + ], + ) + self.assertNotEqual(result.exit_code, 0) + + def test_load_transformers_adapter_valid(self): + result = self.runner.invoke( + cli, + [ + "load", + "--model", + "transformers/" + TEST_MODEL_TRANSFORMERS, + "--backend", + "transformers", + "--adapter-name", + TEST_ADAPTER_MODEL, + "--storage-path", + TEST_DIRECTORY_LOAD, + ], + ) + self.assertEqual( + result.exit_code, + 0, + f"Command failed with output: {result.output}\n" + f"Stderr: {result.stderr}", + ) + self.assertIn("Hello, my dog is cute", result.output) + + def test_load_invalid_backend(self): + result = self.runner.invoke( + cli, + [ + "load", + "--model", + TEST_MODEL_TRANSFORMERS, + "--backend", + "unsupported_backend", + ], + ) + self.assertNotEqual(result.exit_code, 0) + + def test_load_non_existent_model(self): + non_existent_model = "nonexistent/model-xyz-123" + result = self.runner.invoke( + cli, + [ + "load", + "--model", + "transformers/" + non_existent_model, + "--backend", + "transformers", + "--storage-path", + TEST_DIRECTORY_LOAD, + ], + ) + self.assertNotEqual(result.exit_code, 0) + + +if __name__ == "__main__": + unittest.main() diff --git a/sllm_store/tests/python/test_save_lora.py b/sllm_store/tests/python/test_save_lora.py new file mode 100644 index 0000000..13be9b1 --- /dev/null +++ b/sllm_store/tests/python/test_save_lora.py @@ -0,0 +1,78 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import os +import shutil +import unittest + +from peft import LoraConfig, get_peft_model +from sllm_store.transformers import save_lora +from transformers import AutoModelForCausalLM + + +class TestSaveLoraIntegration(unittest.TestCase): + def setUp(self): + # Set up a temporary directory for the test + self.model_name = "bigscience/bloomz-560m" + self.save_dir = "./test_models" + self.model_path = os.path.join(self.save_dir, self.model_name) + + # Ensure the save directory is clean before the test + if os.path.exists(self.save_dir): + shutil.rmtree(self.save_dir) + os.makedirs(self.save_dir) + + os.environ["STORAGE_PATH"] = self.save_dir + + def tearDown(self): + # Clean up by deleting the directory after the test + if os.path.exists(self.save_dir): + shutil.rmtree(self.save_dir) + + def test_save_lora(self): + # Fine-tuning the actual peft model + base_model = AutoModelForCausalLM.from_pretrained(self.model_name) + lora_config = LoraConfig( + r=4, + lora_alpha=16, + target_modules=["query_key_value"], + lora_dropout=0.1, + bias="lora_only", + task_type="CAUSAL_LM", + ) + peft_model = get_peft_model(base_model, lora_config) + # Save the model + save_lora(peft_model, self.model_path) + + # Check if the model directory was created + self.assertTrue(os.path.exists(self.model_path)) + + # Check if certain files exist to verify that the model was saved + expected_files = [ + "tensor_index.json", + "tensor.data_0", + ] + for filename in expected_files: + self.assertTrue( + os.path.isfile(os.path.join(self.model_path, filename)) + ) + + unexpected_files = ["tensor.data_1", "*.bin", "*.safetensors"] + for filename in unexpected_files: + self.assertFalse( + os.path.isfile(os.path.join(self.model_path, filename)) + ) diff --git a/sllm_store/tests/python/test_save_model.py b/sllm_store/tests/python/test_save_model.py new file mode 100644 index 0000000..ac683cc --- /dev/null +++ b/sllm_store/tests/python/test_save_model.py @@ -0,0 +1,76 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import os +import shutil +import unittest + +import torch +from sllm_store.transformers import save_model +from transformers import AutoModelForCausalLM + + +class TestSaveModelIntegration(unittest.TestCase): + def setUp(self): + # Set up a temporary directory for the test + self.model_name = "facebook/opt-1.3b" + self.save_dir = "./test_models" + self.model_path = os.path.join(self.save_dir, self.model_name) + + # Ensure the save directory is clean before the test + if os.path.exists(self.save_dir): + shutil.rmtree(self.save_dir) + os.makedirs(self.save_dir) + + os.environ["STORAGE_PATH"] = self.save_dir + + def tearDown(self): + # Clean up by deleting the directory after the test + if os.path.exists(self.save_dir): + shutil.rmtree(self.save_dir) + + def test_save_model(self): + # Load the actual model + model = AutoModelForCausalLM.from_pretrained( + self.model_name, torch_dtype=torch.float16 + ) + + # Save the model + save_model(model, self.model_path) + + # Check if the model directory was created + self.assertTrue(os.path.exists(self.model_path)) + + # Check if certain files exist to verify that the model was saved + expected_files = [ + "config.json", + "generation_config.json", + "no_split_modules.json", + "tensor_index.json", + "tensor.data_0", + "tied_no_split_modules.json", + ] + for filename in expected_files: + self.assertTrue( + os.path.isfile(os.path.join(self.model_path, filename)) + ) + + unexpected_files = ["tensor.data_1", "*.bin", "*.safetensors"] + for filename in unexpected_files: + self.assertFalse( + os.path.isfile(os.path.join(self.model_path, filename)) + ) diff --git a/sllm_store/tests/python/test_save_vllm_model.py b/sllm_store/tests/python/test_save_vllm_model.py new file mode 100644 index 0000000..bd09540 --- /dev/null +++ b/sllm_store/tests/python/test_save_vllm_model.py @@ -0,0 +1,114 @@ +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +import os +import shutil +import unittest + +import torch +from huggingface_hub import snapshot_download +from vllm import LLM + + +class TestSaveModelIntegration(unittest.TestCase): + def setUp(self): + # Set up a temporary directory for the test + self.model_name = "facebook/opt-1.3b" + self.torch_dtype = "float16" + self.tensor_parallel_size = 1 + self.save_dir = "./test_models" + self.model_path = os.path.join(self.save_dir, self.model_name) + + # Check if at least 2 GPUs are available + if ( + not torch.cuda.is_available() + or torch.cuda.device_count() < self.tensor_parallel_size + ): + raise unittest.SkipTest("Not enough GPUs available for this test") + + # Ensure the save directory is clean before the test + if os.path.exists(self.save_dir): + shutil.rmtree(self.save_dir) + os.makedirs(self.save_dir) + + os.environ["STORAGE_PATH"] = self.save_dir + + def tearDown(self): + # Clean up by deleting the directory after the test + if os.path.exists(self.save_dir): + shutil.rmtree(self.save_dir) + + def test_save_model(self): + # with TemporaryDirectory() as cache_dir: + # cache_dir = "./test_models" + # download model from huggingface + input_dir = snapshot_download( + self.model_name, + # cache_dir=cache_dir, + allow_patterns=["*.safetensors", "*.bin", "*.json", "*.txt"], + ) + # load models from the input directory + model_executer = LLM( + model=input_dir, + download_dir=input_dir, + dtype=self.torch_dtype, + tensor_parallel_size=self.tensor_parallel_size, + num_gpu_blocks_override=1, + enforce_eager=True, + max_model_len=1, + ).llm_engine.engine_core # For engine V1 + # save the models in the ServerlessLLM format + model_executer.save_serverless_llm_state(path=self.model_path) + + # Check if the model directory was created + self.assertTrue(os.path.exists(self.model_path)) + + # Check if each partition directory was created + for i in range(self.tensor_parallel_size): + self.assertTrue(os.path.exists(f"{self.model_path}/rank_{i}")) + self.assertFalse( + os.path.exists( + f"{self.model_path}/rank_{self.tensor_parallel_size}" + ) + ) + + # Check if certain files exist to verify that the model was saved + expected_files = [ + "tensor_index.json", + "tensor.data_0", + ] + unexpected_files = ["tensor.data_1", "*.bin", "*.safetensors"] + for i in range(self.tensor_parallel_size): + for filename in expected_files: + self.assertTrue( + os.path.isfile( + os.path.join(self.model_path, f"rank_{i}", filename) + ) + ) + for filename in unexpected_files: + self.assertFalse( + os.path.isfile( + os.path.join(self.model_path, f"rank_{i}", filename) + ) + ) + + for filename in unexpected_files: + self.assertFalse( + os.path.isfile( + os.path.join(self.model_path, f"rank_{i}", filename) + ) + ) diff --git a/sllm_store/tests/python/test_utils.py b/sllm_store/tests/python/test_utils.py new file mode 100644 index 0000000..46e60ee --- /dev/null +++ b/sllm_store/tests/python/test_utils.py @@ -0,0 +1,129 @@ +import unittest + +from sllm_store.utils import to_num_bytes + + +class TestToNumBytes(unittest.TestCase): + """Unit tests for the to_num_bytes function.""" + + # ------------------- + # Valid Input Tests + # ------------------- + def test_valid_bytes(self): + self.assertEqual(to_num_bytes("1B"), 1) + self.assertEqual(to_num_bytes("0B"), 0) + self.assertEqual(to_num_bytes("1024B"), 1024) + + def test_valid_kilobytes(self): + self.assertEqual(to_num_bytes("1KB"), 1024) + self.assertEqual(to_num_bytes("512KB"), 512 * 1024) + + def test_valid_megabytes(self): + self.assertEqual(to_num_bytes("1MB"), 1024**2) + self.assertEqual(to_num_bytes("256MB"), 256 * 1024**2) + + def test_valid_gigabytes(self): + self.assertEqual(to_num_bytes("1GB"), 1024**3) + self.assertEqual(to_num_bytes("2GB"), 2 * 1024**3) + + def test_valid_terabytes(self): + self.assertEqual(to_num_bytes("1TB"), 1024**4) + self.assertEqual(to_num_bytes("5TB"), 5 * 1024**4) + + def test_valid_petabytes(self): + self.assertEqual(to_num_bytes("1PB"), 1024**5) + self.assertEqual(to_num_bytes("3PB"), 3 * 1024**5) + + def test_valid_exabytes(self): + self.assertEqual(to_num_bytes("1EB"), 1024**6) + self.assertEqual(to_num_bytes("7EB"), 7 * 1024**6) + + def test_valid_zettabytes(self): + self.assertEqual(to_num_bytes("1ZB"), 1024**7) + self.assertEqual(to_num_bytes("9ZB"), 9 * 1024**7) + + def test_valid_yottabytes(self): + self.assertEqual(to_num_bytes("1YB"), 1024**8) + self.assertEqual(to_num_bytes("2YB"), 2 * 1024**8) + + # ------------------- + # Invalid Input Tests + # ------------------- + def test_invalid_unit_lowercase(self): + with self.assertRaises(ValueError) as context: + to_num_bytes("1gb") + self.assertIn("Invalid format", str(context.exception)) + + def test_invalid_unit_mixed_case(self): + with self.assertRaises(ValueError) as context: + to_num_bytes("1Gb") + self.assertIn("Invalid format", str(context.exception)) + + def test_invalid_unit_unknown(self): + with self.assertRaises(ValueError) as context: + to_num_bytes("1ABC") + self.assertIn("Invalid format", str(context.exception)) + + def test_leading_space(self): + with self.assertRaises(ValueError) as context: + to_num_bytes(" 1GB") + self.assertIn("Invalid format", str(context.exception)) + + def test_trailing_space(self): + with self.assertRaises(ValueError) as context: + to_num_bytes("1GB ") + self.assertIn("Invalid format", str(context.exception)) + + def test_middle_space(self): + with self.assertRaises(ValueError) as context: + to_num_bytes("1 GB") + self.assertIn("Invalid format", str(context.exception)) + + def test_leading_zero(self): + # Depending on requirements, leading zeros might be allowed. + self.assertEqual(to_num_bytes("0001GB"), 1024**3) + + def test_non_numeric_value(self): + with self.assertRaises(ValueError) as context: + to_num_bytes("GB") + self.assertIn("Invalid format", str(context.exception)) + + def test_decimal_number(self): + with self.assertRaises(ValueError) as context: + to_num_bytes("1.5GB") + self.assertIn("Invalid format", str(context.exception)) + + def test_negative_number(self): + with self.assertRaises(ValueError) as context: + to_num_bytes("-1GB") + self.assertIn("Invalid format", str(context.exception)) + + def test_empty_string(self): + with self.assertRaises(ValueError) as context: + to_num_bytes("") + self.assertIn("Invalid format", str(context.exception)) + + def test_additional_characters(self): + with self.assertRaises(ValueError) as context: + to_num_bytes("1GBs") + self.assertIn("Invalid format", str(context.exception)) + + # ------------------- + # Boundary Tests + # ------------------- + def test_large_number(self): + self.assertEqual(to_num_bytes("999999999YB"), 999999999 * 1024**8) + + def test_minimal_input(self): + self.assertEqual(to_num_bytes("0B"), 0) + + def test_maximum_unit(self): + self.assertEqual(to_num_bytes("1YB"), 1024**8) + + +# ------------------- +# Running the Tests +# ------------------- + +if __name__ == "__main__": + unittest.main(argv=[""], exit=False) diff --git a/sllm_store/using_existing_torch.py b/sllm_store/using_existing_torch.py new file mode 100644 index 0000000..7e49500 --- /dev/null +++ b/sllm_store/using_existing_torch.py @@ -0,0 +1,20 @@ +# Adapted from https://github.com/vllm-project/vllm/blob/v0.6.6/use_existing_torch.py + +import glob + +requires_files = glob.glob("requirements*.txt") +requires_files += ["pyproject.toml"] +for file in requires_files: + print(f">>> cleaning {file}") + with open(file) as f: + lines = f.readlines() + if "torch" in "".join(lines).lower(): + print("removed:") + with open(file, "w") as f: + for line in lines: + if "torch" not in line.lower(): + f.write(line) + else: + print(line.strip()) + print(f"<<< done cleaning {file}") + print() diff --git a/sllm_store/vllm_patch/check_patch.sh b/sllm_store/vllm_patch/check_patch.sh new file mode 100755 index 0000000..1799256 --- /dev/null +++ b/sllm_store/vllm_patch/check_patch.sh @@ -0,0 +1,44 @@ +#!/bin/bash +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +set -e + +SCRIPT_DIR=$(cd "$(dirname "$0")"; pwd) +PATCH_FILE="$SCRIPT_DIR/sllm_load.patch" +if [ ! -f "$PATCH_FILE" ]; then + echo "File does not exist: $PATCH_FILE" + exit 1 +fi + +VLLM_PATH_OUTPUT=$(python -c "import vllm; import os; print(os.path.dirname(os.path.abspath(vllm.__file__)))" 2>/dev/null) +VLLM_PATH=$(echo "$VLLM_PATH_OUTPUT" | tail -n 1) + +# Sanity check the path +echo "Detected VLLM_PATH: '$VLLM_PATH'" +if [ ! -d "$VLLM_PATH" ]; then + echo "Error: Detected VLLM_PATH is not a valid directory: '$VLLM_PATH'" + echo "Full output from python command was:" + echo "$VLLM_PATH_OUTPUT" + exit 1 +fi + +if patch -p2 --dry-run -d $VLLM_PATH < $PATCH_FILE > /dev/null 2>&1; then + echo "vLLM patch is not applied" +else + echo "vLLM patch has been applied" +fi diff --git a/sllm_store/vllm_patch/patch.sh b/sllm_store/vllm_patch/patch.sh new file mode 100755 index 0000000..c3a2166 --- /dev/null +++ b/sllm_store/vllm_patch/patch.sh @@ -0,0 +1,51 @@ +#!/bin/bash +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +set -e + +SCRIPT_DIR=$(cd "$(dirname "$0")"; pwd) +PATCH_FILE="$SCRIPT_DIR/sllm_load.patch" + +# Check if the patch file exists +if [ ! -f "$PATCH_FILE" ]; then + echo "File does not exist: $PATCH_FILE" + exit 1 +fi + +# Get the vLLM installation path +VLLM_PATH_OUTPUT=$(python -c "import vllm; import os; print(os.path.dirname(os.path.abspath(vllm.__file__)))" 2>/dev/null) +VLLM_PATH=$(echo "$VLLM_PATH_OUTPUT" | tail -n 1) + +# Sanity check the path +echo "Detected VLLM_PATH: '$VLLM_PATH'" +if [ ! -d "$VLLM_PATH" ]; then + echo "Error: Detected VLLM_PATH is not a valid directory: '$VLLM_PATH'" + echo "Full output from python command was:" + echo "$VLLM_PATH_OUTPUT" + exit 1 +fi + +# Attempt a dry run of the patch to check if it's already applied +if patch -p2 --dry-run -d "$VLLM_PATH" < "$PATCH_FILE"; then + echo "vLLM patch is not applied. Applying the patch now..." + # Apply the patch + patch -p2 -d "$VLLM_PATH" < "$PATCH_FILE" + echo "Patch applied successfully." +else + echo "vLLM patch has already been applied. Skipping..." +fi \ No newline at end of file diff --git a/sllm_store/vllm_patch/remove_patch.sh b/sllm_store/vllm_patch/remove_patch.sh new file mode 100755 index 0000000..bc7c3d8 --- /dev/null +++ b/sllm_store/vllm_patch/remove_patch.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# ---------------------------------------------------------------------------- # +# serverlessllm # +# copyright (c) serverlessllm team 2024 # +# # +# licensed under the apache license, version 2.0 (the "license"); # +# you may not use this file except in compliance with the license. # +# # +# you may obtain a copy of the license at # +# # +# http://www.apache.org/licenses/license-2.0 # +# # +# unless required by applicable law or agreed to in writing, software # +# distributed under the license is distributed on an "as is" basis, # +# without warranties or conditions of any kind, either express or implied. # +# see the license for the specific language governing permissions and # +# limitations under the license. # +# ---------------------------------------------------------------------------- # +set -e + +SCRIPT_DIR=$(cd "$(dirname "$0")"; pwd) +PATCH_FILE="$SCRIPT_DIR/sllm_load.patch" +if [ ! -f "$PATCH_FILE" ]; then + echo "File does not exist: $PATCH_FILE" + exit 1 +fi + +VLLM_PATH_OUTPUT=$(python -c "import vllm; import os; print(os.path.dirname(os.path.abspath(vllm.__file__)))" 2>/dev/null) +VLLM_PATH=$(echo "$VLLM_PATH_OUTPUT" | tail -n 1) + +# Sanity check the path +echo "Detected VLLM_PATH: '$VLLM_PATH'" +if [ ! -d "$VLLM_PATH" ]; then + echo "Error: Detected VLLM_PATH is not a valid directory: '$VLLM_PATH'" + echo "Full output from python command was:" + echo "$VLLM_PATH_OUTPUT" + exit 1 +fi + +patch -p2 -d $VLLM_PATH -R < $PATCH_FILE \ No newline at end of file diff --git a/sllm_store/vllm_patch/sllm_load.patch b/sllm_store/vllm_patch/sllm_load.patch new file mode 100644 index 0000000..5b5eac0 --- /dev/null +++ b/sllm_store/vllm_patch/sllm_load.patch @@ -0,0 +1,426 @@ +diff --git a/vllm/config.py b/vllm/config.py +index db35c848b..2c39d9a6b 100644 +--- a/vllm/config.py ++++ b/vllm/config.py +@@ -1586,6 +1586,7 @@ class LoadFormat(str, enum.Enum): + RUNAI_STREAMER = "runai_streamer" + RUNAI_STREAMER_SHARDED = "runai_streamer_sharded" + FASTSAFETENSORS = "fastsafetensors" ++ SERVERLESS_LLM = "serverless_llm" + + + @config +diff --git a/vllm/executor/executor_base.py b/vllm/executor/executor_base.py +index 40ca1d299..5771b5d24 100644 +--- a/vllm/executor/executor_base.py ++++ b/vllm/executor/executor_base.py +@@ -144,7 +144,18 @@ class ExecutorBase(ABC): + def stop_remote_worker_execution_loop(self) -> None: + """Releases parallel workers from model loop.""" + return +- ++ ++ def save_serverless_llm_state( ++ self, ++ path: str, ++ pattern: Optional[str] = None, ++ max_size: Optional[int] = None, ++ ) -> None: ++ ++ self.driver_worker.save_serverless_llm_state( ++ path=path, pattern=pattern, max_size=max_size ++ ) ++ + def add_lora(self, lora_request: LoRARequest) -> bool: + assert lora_request.lora_int_id > 0, "lora_id must be greater than 0." + return all(self.collective_rpc("add_lora", args=(lora_request, ))) +diff --git a/vllm/executor/mp_distributed_executor.py b/vllm/executor/mp_distributed_executor.py +index d1f8c36fb..0d6d94c57 100644 +--- a/vllm/executor/mp_distributed_executor.py ++++ b/vllm/executor/mp_distributed_executor.py +@@ -132,6 +132,17 @@ class MultiprocessingDistributedExecutor(DistributedExecutorBase): + if (worker_monitor := getattr(self, "worker_monitor", + None)) is not None: + worker_monitor.close() ++ ++ def save_serverless_llm_state( ++ self, ++ path: str, ++ pattern: Optional[str] = None, ++ max_size: Optional[int] = None, ++ ) -> None: ++ self._run_workers("save_serverless_llm_state", ++ path=path, ++ pattern=pattern, ++ max_size=max_size) + + def _driver_execute_model( + self, execute_model_req: Optional[ExecuteModelRequest] +diff --git a/vllm/executor/ray_distributed_executor.py b/vllm/executor/ray_distributed_executor.py +index 8e67c7a41..01dc4b9cc 100644 +--- a/vllm/executor/ray_distributed_executor.py ++++ b/vllm/executor/ray_distributed_executor.py +@@ -427,6 +427,17 @@ class RayDistributedExecutor(DistributedExecutorBase): + self.tp_driver_workers.append(worker) + else: + self.non_driver_workers.append(worker) ++ ++ def save_serverless_llm_state( ++ self, ++ path: str, ++ pattern: Optional[str] = None, ++ max_size: Optional[int] = None, ++ ) -> None: ++ self._run_workers("save_serverless_llm_state", ++ path=path, ++ pattern=pattern, ++ max_size=max_size) + + def _driver_execute_model( + self, execute_model_req: Optional[ExecuteModelRequest] +diff --git a/vllm/model_executor/model_loader/__init__.py b/vllm/model_executor/model_loader/__init__.py +index a443a652d..c1869a54a 100644 +--- a/vllm/model_executor/model_loader/__init__.py ++++ b/vllm/model_executor/model_loader/__init__.py +@@ -11,6 +11,7 @@ from vllm.model_executor.model_loader.bitsandbytes_loader import ( + from vllm.model_executor.model_loader.default_loader import DefaultModelLoader + from vllm.model_executor.model_loader.dummy_loader import DummyModelLoader + from vllm.model_executor.model_loader.gguf_loader import GGUFModelLoader ++from vllm.model_executor.model_loader.sllm_loader import ServerlessLLMLoader + from vllm.model_executor.model_loader.runai_streamer_loader import ( + RunaiModelStreamerLoader) + from vllm.model_executor.model_loader.sharded_state_loader import ( +@@ -45,6 +46,9 @@ def get_model_loader(load_config: LoadConfig) -> BaseModelLoader: + + if load_config.load_format == LoadFormat.RUNAI_STREAMER_SHARDED: + return ShardedStateLoader(load_config, runai_model_streamer=True) ++ ++ if load_config.load_format == LoadFormat.SERVERLESS_LLM: ++ return ServerlessLLMLoader(load_config) + + return DefaultModelLoader(load_config) + +diff --git a/vllm/model_executor/model_loader/sllm_loader.py b/vllm/model_executor/model_loader/sllm_loader.py +new file mode 100644 +index 000000000..9bd2fd7f9 +--- /dev/null ++++ b/vllm/model_executor/model_loader/sllm_loader.py +@@ -0,0 +1,150 @@ ++import torch ++from torch import nn ++import collections ++import os ++import gc ++from typing import Dict, Optional ++from vllm.config import LoadConfig, VllmConfig, ModelConfig ++from vllm.model_executor.model_loader.base_loader import BaseModelLoader ++from vllm.model_executor.model_loader.utils import ( ++ initialize_model, set_default_torch_dtype) ++ ++class ServerlessLLMLoader(BaseModelLoader): ++ # DEFAULT_PATTERN = "model-rank-{rank}-part-{part}.safetensors" ++ ++ def __init__(self, load_config: LoadConfig): ++ super().__init__(load_config) ++ extra_config = ({} if load_config.model_loader_extra_config is None ++ else load_config.model_loader_extra_config.copy()) ++ # self.pattern = extra_config.pop("pattern", self.DEFAULT_PATTERN) ++ if extra_config: ++ raise ValueError(f"Unexpected extra config keys for load format " ++ f"{load_config.load_format}: " ++ f"{load_config.model_loader_extra_config.keys()}") ++ ++ @staticmethod ++ def _filter_subtensors( ++ tensors: Dict[str, torch.Tensor]) -> Dict[str, torch.Tensor]: ++ """ ++ Filter out all tensors that share the same memory or a subset of the ++ memory of another tensor. ++ """ ++ same_storage_groups = collections.defaultdict(list) ++ for key, tensor in tensors.items(): ++ if tensor.numel(): ++ ptr = tensor.untyped_storage().data_ptr() ++ same_storage_groups[tensor.device, ptr].append((key, tensor)) ++ ++ def get_end_ptr(tensor: torch.Tensor) -> int: ++ return tensor.view(-1)[-1].data_ptr() + tensor.element_size() ++ ++ result = {} ++ for group in same_storage_groups.values(): ++ for k, t in group: ++ a, b = t.data_ptr(), get_end_ptr(t) ++ for k2, t2 in group: ++ if not t2.is_contiguous(): ++ continue ++ a2, b2 = t2.data_ptr(), get_end_ptr(t2) ++ if a < a2 or b2 < b: ++ continue ++ if a2 < a or b < b2 or not t.is_contiguous(): ++ break # t2 covers strictly more memory than t. ++ if k2 > k: ++ # Same tensors, keep the one with the longer key. ++ break ++ else: ++ result[k] = t ++ return result ++ ++ def load_model(self, *, vllm_config: VllmConfig, **kwargs) -> nn.Module: ++ from sllm_store.torch import load_dict ++ from vllm.distributed import get_tensor_model_parallel_rank ++ ++ assert os.path.isdir(vllm_config.model_config.model) ++ ++ rank = get_tensor_model_parallel_rank() ++ ++ local_model_path = vllm_config.model_config.model ++ local_model_path = os.path.join(local_model_path, f"rank_{rank}") ++ ++ def remove_prefix(path, prefix): ++ # Normalize the paths to ensure consistency across different platforms ++ path = os.path.normpath(path) ++ prefix = os.path.normpath(prefix) ++ ++ # Check if the path starts with the prefix ++ if path.startswith(prefix): ++ # Return the path without the prefix ++ return path[len(prefix):].lstrip(os.sep) ++ ++ # Return the original path if the prefix doesn't exist ++ return path ++ ++ # vLLM needs a local model path to read model config but ++ # ServerlessLLM Store requires a global model path as the model ID ++ storage_path = os.getenv("STORAGE_PATH", "./models") ++ model_path = remove_prefix(local_model_path, storage_path) ++ ++ with set_default_torch_dtype(vllm_config.model_config.dtype): ++ # with torch.device(device_config.device): ++ with torch.device("cpu"): ++ model = initialize_model(vllm_config=vllm_config) ++ model = model.eval() ++ # set all parameters to meta device ++ state_dict = self._filter_subtensors(model.state_dict()) ++ key_list = list(state_dict.keys()) ++ ++ for key, param in model.named_parameters(recurse=True): ++ if key in key_list: ++ param.data = torch.empty(1, device="cuda") ++ gc.collect() ++ ++ device_id = torch.cuda.current_device() ++ device_map = {"": device_id} ++ # Note: storage path is already included in the local model path ++ sllm_state_dict = load_dict(model_path, device_map) ++ ++ for key, param in model.named_parameters(recurse=True): ++ if key in key_list: ++ tensor = sllm_state_dict[key] ++ param.data = tensor ++ state_dict.pop(key) ++ if state_dict: ++ raise ValueError( ++ f"Missing keys {tuple(state_dict)} in loaded state!") ++ ++ for name, buffer in model.named_buffers(recurse=True): ++ if buffer.device.type != 'cuda': ++ buffer.data = buffer.data.to(f'cuda:{device_id}') ++ ++ return model ++ ++ def download_model(self, model_config: ModelConfig) -> None: ++ pass ++ ++ def load_weights(self, model, model_config): ++ pass ++ ++ @staticmethod ++ def save_model( ++ model: torch.nn.Module, ++ path: str, ++ pattern: Optional[str] = None, ++ max_size: Optional[int] = None, ++ ) -> None: ++ from vllm.distributed import get_tensor_model_parallel_rank ++ from sllm_store.torch import save_dict ++ ++ rank = get_tensor_model_parallel_rank() ++ state_dict = ServerlessLLMLoader._filter_subtensors(model.state_dict()) ++ ++ # move all tensors to CPU ++ for key, tensor in state_dict.items(): ++ state_dict[key] = tensor.cpu().contiguous() ++ ++ save_path = os.path.join(path, f"rank_{rank}") ++ if not os.path.exists(save_path): ++ os.makedirs(save_path) ++ ++ save_dict(state_dict, save_path) +\ No newline at end of file +diff --git a/vllm/v1/engine/core.py b/vllm/v1/engine/core.py +index 740ba60fe..1071cb71f 100644 +--- a/vllm/v1/engine/core.py ++++ b/vllm/v1/engine/core.py +@@ -331,6 +331,16 @@ class EngineCore: + self.model_executor.save_sharded_state(path=path, + pattern=pattern, + max_size=max_size) ++ ++ def save_serverless_llm_state( ++ self, ++ path: str, ++ pattern: Optional[str] = None, ++ max_size: Optional[int] = None, ++ ) -> None: ++ self.model_executor.save_serverless_llm_state(path=path, ++ pattern=pattern, ++ max_size=max_size) + + def collective_rpc(self, + method: Union[str, Callable[..., _R]], +diff --git a/vllm/v1/engine/core_client.py b/vllm/v1/engine/core_client.py +index 0d52bc9a6..95adf9af8 100644 +--- a/vllm/v1/engine/core_client.py ++++ b/vllm/v1/engine/core_client.py +@@ -256,6 +256,14 @@ class InprocClient(EngineCoreClient): + pattern: Optional[str] = None, + max_size: Optional[int] = None) -> None: + self.engine_core.save_sharded_state(path, pattern, max_size) ++ ++ def save_serverless_llm_state( ++ self, ++ path: str, ++ pattern: Optional[str] = None, ++ max_size: Optional[int] = None, ++ ) -> None: ++ self.engine_core.save_serverless_llm_state(path, pattern, max_size) + + def collective_rpc(self, + method: Union[str, Callable[..., _R]], +@@ -724,6 +732,14 @@ class SyncMPClient(MPClient): + pattern: Optional[str] = None, + max_size: Optional[int] = None) -> None: + self.call_utility("save_sharded_state", path, pattern, max_size) ++ ++ def save_serverless_llm_state( ++ self, ++ path: str, ++ pattern: Optional[str] = None, ++ max_size: Optional[int] = None, ++ ) -> None: ++ self.call_utility("save_serverless_llm_state", path, pattern, max_size) + + + class AsyncMPClient(MPClient): +@@ -906,6 +922,15 @@ class AsyncMPClient(MPClient): + await self.call_utility_async("save_sharded_state", path, pattern, + max_size) + ++ async def save_serverless_llm_state_async( ++ self, ++ path: str, ++ pattern: Optional[str] = None, ++ max_size: Optional[int] = None, ++ ) -> None: ++ await self.call_utility_async("save_serverless_llm_state", path, pattern, ++ max_size) ++ + async def collective_rpc_async( + self, + method: Union[str, Callable[..., _R]], +diff --git a/vllm/v1/worker/gpu_model_runner.py b/vllm/v1/worker/gpu_model_runner.py +index 910c0e80b..d13645e3b 100644 +--- a/vllm/v1/worker/gpu_model_runner.py ++++ b/vllm/v1/worker/gpu_model_runner.py +@@ -1560,6 +1560,20 @@ class GPUModelRunner(LoRAModelRunnerMixin): + tensorizer_config=tensorizer_config, + ) + ++ def save_serverless_llm_state( ++ self, ++ path: str, ++ pattern: Optional[str] = None, ++ max_size: Optional[int] = None, ++ ) -> None: ++ from vllm.model_executor.model_loader import ServerlessLLMLoader ++ ServerlessLLMLoader.save_model( ++ self.model, ++ path, ++ pattern=pattern, ++ max_size=max_size, ++ ) ++ + def _get_prompt_logprobs_dict( + self, + hidden_states: torch.Tensor, +diff --git a/vllm/v1/worker/gpu_worker.py b/vllm/v1/worker/gpu_worker.py +index bce5cbb5f..55d65c7d3 100644 +--- a/vllm/v1/worker/gpu_worker.py ++++ b/vllm/v1/worker/gpu_worker.py +@@ -325,6 +325,18 @@ class Worker(WorkerBase): + pattern=pattern, + max_size=max_size, + ) ++ ++ def save_serverless_llm_state( ++ self, ++ path: str, ++ pattern: Optional[str] = None, ++ max_size: Optional[int] = None, ++ ) -> None: ++ self.model_runner.save_serverless_llm_state( ++ path, ++ pattern=pattern, ++ max_size=max_size, ++ ) + + def save_tensorized_model( + self, +diff --git a/vllm/worker/model_runner.py b/vllm/worker/model_runner.py +index 8c968faa7..932c943ab 100644 +--- a/vllm/worker/model_runner.py ++++ b/vllm/worker/model_runner.py +@@ -1236,6 +1236,20 @@ class GPUModelRunnerBase(ModelRunnerBase[TModelInputForGPU]): + pattern=pattern, + max_size=max_size, + ) ++ ++ def save_serverless_llm_state( ++ self, ++ path: str, ++ pattern: Optional[str] = None, ++ max_size: Optional[int] = None, ++ ) -> None: ++ from vllm.model_executor.model_loader import ServerlessLLMLoader ++ ServerlessLLMLoader.save_model( ++ self.model, ++ path, ++ pattern=pattern, ++ max_size=max_size, ++ ) + + def save_tensorized_model( + self, +diff --git a/vllm/worker/worker.py b/vllm/worker/worker.py +index 6e45b8423..d87e5e9c6 100644 +--- a/vllm/worker/worker.py ++++ b/vllm/worker/worker.py +@@ -218,6 +218,18 @@ class Worker(LocalOrDistributedWorkerBase): + max_size=max_size, + ) + ++ def save_serverless_llm_state( ++ self, ++ path: str, ++ pattern: Optional[str] = None, ++ max_size: Optional[int] = None, ++ ) -> None: ++ self.model_runner.save_serverless_llm_state( ++ path, ++ pattern=pattern, ++ max_size=max_size, ++ ) ++ + def save_tensorized_model( + self, + tensorizer_config: TensorizerConfig, diff --git a/tests/.DS_Store b/tests/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..c257b4db0587cc32d9751a40c708cebdbfe0e8ed GIT binary patch literal 8196 zcmeHMyGjE=6uqM<0>+rqO4i20%79?IhFA)Le1PVq2J=!AMXLp|v9YkV$Orfz7B;r} zHJ&>&Y-ZW)CTT?RUYI${?me?-4#RBjgospW)GQLM6Hyk8v9N+}O7L@Tu~@Qqn5@7j zYEh4xbVNg3Nr(gDfH)uyhy&ulZ*&0PY>sTgci%jfUK|hy{-p!FKX_=2zQw?x-a63f z5&)RNZ5_Bq9iTa$Mc-mzP*X9csUDQ2DqCVGL&tNE(}BLlz@VX%GIUb*&B|6NO1~XE zPp6ae4N5N#hy!s4xOUG`oodve^GN-EMZ?Z%vD)Z&2Zr{%mzLY@m&^4|zmA;jZZmic zHs1Er^P3Ch56)aIV+@TQqd^^N+w+E)-iO0!Ij+vn`%q_WtZsjzFD);s>w|UWp{YkF zaPv|-+CXp4L}D7(csonYclB;Qg?eXjCfeuaMCY-?^T=TqExLjBRG+ur({f$?-Iq{* z;@Gb5^W;Z$S6KHdUC;IRIkr^v4-XQ&qhdy1AoYYWutYS>;Hq~^Z!3IBatc& zhy#l{pfcrZxdfK2tz&$ywLP?BG!D)S3~CBGU5*3w4*_8Khas*#q%z017#PGIgd7BD L8>ABle$;_)z9s?s literal 0 HcmV?d00001 diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..314e503 --- /dev/null +++ b/tests/__init__.py @@ -0,0 +1,17 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # diff --git a/tests/backend_test/transformers_backend_test.py b/tests/backend_test/transformers_backend_test.py new file mode 100644 index 0000000..35a59e6 --- /dev/null +++ b/tests/backend_test/transformers_backend_test.py @@ -0,0 +1,809 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # +import os +from unittest.mock import patch + +import pytest +import torch +from transformers import AutoModel, AutoModelForCausalLM, AutoTokenizer + +from sllm.serve.backends.backend_utils import BackendStatus +from sllm.serve.backends.transformers_backend import ( + TransformersBackend, +) + + +@pytest.fixture +def model_name(): + return "facebook/opt-125m" + + +@pytest.fixture +def encoder_model_name(): + return "BAAI/bge-small-en-v1.5" + + +@pytest.fixture +def backend_config(): + return { + "pretrained_model_name_or_path": "facebook/opt-125m", + "torch_dtype": "float16", + "hf_model_class": "AutoModelForCausalLM", + } + + +@pytest.fixture +def encoder_config(): + return { + "pretrained_model_name_or_path": "BAAI/bge-small-en-v1.5", + "torch_dtype": "float16", + "hf_model_class": "AutoModel", + } + + +@pytest.fixture +def transformers_backend(model_name, backend_config): + yield TransformersBackend(model_name, backend_config) + + +@pytest.fixture +def encoder_backend(encoder_model_name, encoder_config): + yield TransformersBackend(encoder_model_name, encoder_config) + + +def test_init(transformers_backend, model_name, backend_config): + assert transformers_backend.model_name == model_name + assert transformers_backend.backend_config == backend_config + assert transformers_backend.status == BackendStatus.UNINITIALIZED + + +def test_init_encoder(encoder_backend, encoder_model_name, encoder_config): + assert encoder_backend.model_name == encoder_model_name + assert encoder_backend.backend_config == encoder_config + assert encoder_backend.status == BackendStatus.UNINITIALIZED + + +def test_init_backend(transformers_backend, backend_config): + with patch( + "sllm.serve.backends.transformers_backend.load_model" + ) as mock_load_model: + transformers_backend.init_backend() + mock_load_model.assert_called_once() + storage_path = os.getenv("STORAGE_PATH", "./models") + model_path = os.path.join( + "transformers", + backend_config["pretrained_model_name_or_path"], + ) + device_map = backend_config.get("device_map", "auto") + torch_dtype = backend_config.get("torch_dtype", torch.float16) + torch_dtype = getattr(torch, torch_dtype) + hf_model_class = backend_config.get("hf_model_class", None) + quantization_config = backend_config.get("quantization_config", None) + mock_load_model.assert_called_once_with( + model_path, + device_map=device_map, + torch_dtype=torch_dtype, + storage_path=storage_path, + hf_model_class=hf_model_class, + quantization_config=quantization_config, + ) + + +def test_init_encoder_backend(encoder_backend, encoder_config): + with patch( + "sllm.serve.backends.transformers_backend.load_model" + ) as mock_load_model: + encoder_backend.init_backend() + mock_load_model.assert_called_once() + storage_path = os.getenv("STORAGE_PATH", "./models") + model_path = os.path.join( + "transformers", + encoder_config["pretrained_model_name_or_path"], + ) + device_map = encoder_config.get("device_map", "auto") + torch_dtype = encoder_config.get("torch_dtype", torch.float16) + torch_dtype = getattr(torch, torch_dtype) + hf_model_class = encoder_config.get("hf_model_class", None) + quantization_config = encoder_config.get("quantization_config", None) + mock_load_model.assert_called_once_with( + model_path, + device_map=device_map, + torch_dtype=torch_dtype, + storage_path=storage_path, + hf_model_class=hf_model_class, + quantization_config=quantization_config, + ) + + +@pytest.fixture +def model(): + model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m").to("cpu") + yield model + + +@pytest.fixture +def tokenizer(): + tokenizer = AutoTokenizer.from_pretrained("facebook/opt-125m") + yield tokenizer("test_prompt", return_tensors="pt") + + +@pytest.fixture +def encoder(): + encoder = AutoModel.from_pretrained("BAAI/bge-small-en-v1.5").to("cpu") + yield encoder + + +@pytest.fixture +def encoder_tokenizer(): + encoder_tokenizer = AutoTokenizer.from_pretrained("BAAI/bge-small-en-v1.5") + yield encoder_tokenizer( + ["test_prompt"], + max_length=4096, + padding=True, + truncation=True, + return_tensors="pt", + ) + + +def test_generate(transformers_backend, model, tokenizer): + with patch( + "sllm.serve.backends.transformers_backend.load_model", + return_value=model, + ), patch( + "sllm.serve.backends.transformers_backend.TransformersBackend._tokenize", + return_value=tokenizer, + ): + transformers_backend.init_backend() + input = { + "model": "facebook/opt-125m", + "messages": [ + { + "role": "user", + "content": "Hello, how are you? I am fine, thank you!", + } + ], + "temperature": 0.7, + "max_tokens": 10, + } + result = transformers_backend.generate(input) + assert "error" not in result + assert "choices" in result and len(result["choices"]) == 1 + + +def test_get_current_tokens(transformers_backend, model, tokenizer): + with patch( + "sllm.serve.backends.transformers_backend.load_model", + return_value=model, + ), patch( + "sllm.serve.backends.transformers_backend.TransformersBackend._tokenize", + return_value=tokenizer, + ): + transformers_backend.init_backend() + input = { + "model": "facebook/opt-125m", + "messages": [ + { + "role": "user", + "content": "Hello, how are you? I am fine, thank you!", + } + ], + "temperature": 0.7, + "max_tokens": 128, + } + import threading + + # Create a thread to call the generate method + thread = threading.Thread( + target=transformers_backend.generate, args=(input,) + ) + thread.start() + # Sleep for 1 second to allow the thread to start + import time + + time.sleep(1) + # Get the current tokens + current_tokens = transformers_backend.get_current_tokens() + assert current_tokens + thread.join() + + +def test_resume_kv_cache(transformers_backend, model, tokenizer): + with patch( + "sllm.serve.backends.transformers_backend.load_model", + return_value=model, + ), patch( + "sllm.serve.backends.transformers_backend.TransformersBackend._tokenize", + return_value=tokenizer, + ): + transformers_backend.init_backend() + inputs = transformers_backend._tokenize("") + intermediate_tokens = inputs["input_ids"].tolist() + try: + transformers_backend.resume_kv_cache(intermediate_tokens) + except Exception as e: + assert False, f"Failed to resume kv cache: {e}" + assert transformers_backend.past_key_values + assert ( + len(transformers_backend.past_key_values) + == model.config.num_hidden_layers + ) + assert len(transformers_backend.past_key_values[0]) == 2 + assert transformers_backend.past_key_values[0][0].shape == ( + len(intermediate_tokens), + model.config.num_attention_heads, + len(intermediate_tokens[0]), + model.config.hidden_size // model.config.num_attention_heads, + ) + + +def test_resume_generate(transformers_backend, model, tokenizer): + with patch( + "sllm.serve.backends.transformers_backend.load_model", + return_value=model, + ), patch( + "sllm.serve.backends.transformers_backend.TransformersBackend._tokenize", + return_value=tokenizer, + ): + transformers_backend.init_backend() + input = { + "model": "facebook/opt-125m", + "messages": [ + { + "role": "user", + "content": "Hello, how are you? I am fine, thank you!", + } + ], + "temperature": 0.7, + "max_tokens": 128, + } + intermediate_inputs = transformers_backend._tokenize("") + intermediate_tokens = intermediate_inputs["input_ids"].tolist() + try: + transformers_backend.resume_kv_cache(intermediate_tokens) + except Exception as e: + assert False, f"Failed to resume kv cache: {e}" + + result = transformers_backend.resume_generate( + input, intermediate_tokens + ) + assert result + assert "error" not in result + + +def test_shutdown(transformers_backend, model, tokenizer): + with patch( + "sllm.serve.backends.transformers_backend.load_model", + return_value=model, + ), patch( + "sllm.serve.backends.transformers_backend.TransformersBackend._tokenize", + return_value=tokenizer, + ): + transformers_backend.init_backend() + input = { + "model": "facebook/opt-125m", + "messages": [ + { + "role": "user", + "content": "Hello, how are you? I am fine, thank you!", + } + ], + "temperature": 0.7, + "max_tokens": 128, + } + import threading + + # Create a thread to call the generate method + thread = threading.Thread( + target=transformers_backend.generate, args=(input,) + ) + thread.start() + # Sleep for 1 second to allow the thread to start + import time + + time.sleep(1) + # Shutdown the backend + transformers_backend.shutdown() + thread.join() + + +def test_encode(encoder_backend, encoder, encoder_tokenizer): + with patch( + "sllm.serve.backends.transformers_backend.load_model", + return_value=encoder, + ), patch( + "sllm.serve.backends.transformers_backend.TransformersBackend._encoder_tokenize", + return_value=encoder_tokenizer, + ): + encoder_backend.init_backend() + input = { + "model": "BAAI/bge-small-en-v1.5", + "task_instruct": "Given a question, retrieve passages that answer the question", + "input": ["Hi, How are you?"], + } + result = encoder_backend.encode(input) + assert "error" not in result + assert "data" in result and len(result["data"]) == 1 + + +def test_generate_without_init(transformers_backend): + with patch( + "sllm.serve.backends.transformers_backend.load_model", + return_value=model, + ): + request_data = { + "model": "facebook/opt-125m", + "messages": [ + { + "role": "user", + "content": "Hello, how are you? I am fine, thank you!", + } + ], + "temperature": 0.7, + "max_tokens": 10, + } + response = transformers_backend.generate(request_data) + assert "error" in response + + +# LoRA-related fixtures and tests +@pytest.fixture +def base_model_name(): + return "facebook/opt-125m" + + +@pytest.fixture +def lora_model_name(): + return "peft-internal-testing/opt-125m-dummy-lora" + + +@pytest.fixture +def lora_model_name_2(): + return "monsterapi/opt125M_alpaca" + + +@pytest.fixture +def lora_backend_config(): + return { + "pretrained_model_name_or_path": "facebook/opt-125m", + "torch_dtype": "float16", + "hf_model_class": "AutoModelForCausalLM", + "device_map": "cpu", # Use CPU for testing to avoid GPU memory issues + } + + +@pytest.fixture +def lora_backend(base_model_name, lora_backend_config): + backend = TransformersBackend(base_model_name, lora_backend_config) + yield backend + + +@pytest.fixture +def mock_peft_model(): + """Create a mock PEFT model with the necessary attributes.""" + from unittest.mock import MagicMock + + model = AutoModelForCausalLM.from_pretrained("facebook/opt-125m").to("cpu") + + # Add PEFT-like attributes + model.peft_config = {} + model.add_adapter = MagicMock() + model.set_adapter = MagicMock() + + return model + + +def test_load_lora_adapter_success(lora_backend, mock_peft_model): + """Test successful loading of a LoRA adapter.""" + with patch( + "sllm.serve.backends.transformers_backend.load_model", + return_value=mock_peft_model, + ), patch( + "sllm.serve.backends.transformers_backend.load_lora", + return_value=mock_peft_model, + ) as mock_load_lora: + lora_backend.init_backend() + + # Simulate successful LoRA loading by updating peft_config + def mock_load_lora_side_effect(*args, **kwargs): + mock_peft_model.peft_config["test_lora"] = { + "adapter_name": "test_lora" + } + return mock_peft_model + + mock_load_lora.side_effect = mock_load_lora_side_effect + + # Load the LoRA adapter + result = lora_backend.load_lora_adapter("test_lora", "dummy_path") + + # Verify the adapter is loaded + assert hasattr(lora_backend.model, "peft_config") + assert "test_lora" in lora_backend.model.peft_config + mock_load_lora.assert_called_once() + + +def test_load_lora_adapter_repeated(lora_backend, mock_peft_model): + """Test that loading the same LoRA adapter multiple times doesn't cause issues.""" + with patch( + "sllm.serve.backends.transformers_backend.load_model", + return_value=mock_peft_model, + ), patch( + "sllm.serve.backends.transformers_backend.load_lora", + return_value=mock_peft_model, + ) as mock_load_lora: + lora_backend.init_backend() + + # Simulate LoRA already loaded + mock_peft_model.peft_config["test_lora"] = {"adapter_name": "test_lora"} + + # Load the LoRA adapter first time (should be skipped) + result = lora_backend.load_lora_adapter("test_lora", "dummy_path") + + # Load the same adapter again - should not call load_lora + result = lora_backend.load_lora_adapter("test_lora", "dummy_path") + + # Verify load_lora was not called since adapter already exists + mock_load_lora.assert_not_called() + + # Verify the adapter is still loaded + assert hasattr(lora_backend.model, "peft_config") + assert "test_lora" in lora_backend.model.peft_config + + +def test_load_multiple_lora_adapters(lora_backend, mock_peft_model): + """Test loading multiple LoRA adapters.""" + with patch( + "sllm.serve.backends.transformers_backend.load_model", + return_value=mock_peft_model, + ), patch( + "sllm.serve.backends.transformers_backend.load_lora", + return_value=mock_peft_model, + ) as mock_load_lora: + lora_backend.init_backend() + + # Simulate successful LoRA loading by updating peft_config + def mock_load_lora_side_effect(*args, **kwargs): + adapter_name = args[1] # Second argument is adapter_name + mock_peft_model.peft_config[adapter_name] = { + "adapter_name": adapter_name + } + return mock_peft_model + + mock_load_lora.side_effect = mock_load_lora_side_effect + + # Load first LoRA adapter + lora_backend.load_lora_adapter("test_lora_1", "dummy_path_1") + + # Load second LoRA adapter + lora_backend.load_lora_adapter("test_lora_2", "dummy_path_2") + + # Verify both adapters are loaded + assert hasattr(lora_backend.model, "peft_config") + assert "test_lora_1" in lora_backend.model.peft_config + assert "test_lora_2" in lora_backend.model.peft_config + assert mock_load_lora.call_count == 2 + + +def test_generate_with_lora_adapter(lora_backend, mock_peft_model): + """Test generation with a loaded LoRA adapter.""" + with patch( + "sllm.serve.backends.transformers_backend.load_model", + return_value=mock_peft_model, + ), patch( + "sllm.serve.backends.transformers_backend.load_lora", + return_value=mock_peft_model, + ), patch( + "sllm.serve.backends.transformers_backend.TransformersBackend._tokenize" + ) as mock_tokenize: + lora_backend.init_backend() + + # Setup tokenizer mock + tokenizer = AutoTokenizer.from_pretrained("facebook/opt-125m") + mock_inputs = tokenizer("test prompt", return_tensors="pt") + mock_tokenize.return_value = mock_inputs + + # Simulate LoRA adapter loaded + mock_peft_model.peft_config["test_lora"] = {"adapter_name": "test_lora"} + + # Mock model generation + with patch.object(mock_peft_model, "generate") as mock_generate: + # Create mock output tokens + mock_output = torch.tensor([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]) + mock_generate.return_value = mock_output + + # Generate with LoRA adapter + input_data = { + "model": "facebook/opt-125m", + "messages": [ + { + "role": "user", + "content": "Hello, how are you?", + } + ], + "temperature": 0.7, + "max_tokens": 10, + "lora_adapter_name": "test_lora", + } + + result = lora_backend.generate(input_data) + + # Verify successful generation + assert "error" not in result + assert "choices" in result and len(result["choices"]) == 1 + assert "message" in result["choices"][0] + assert "content" in result["choices"][0]["message"] + + # Verify generate was called with adapter_names + mock_generate.assert_called_once() + call_kwargs = mock_generate.call_args[1] + assert "adapter_names" in call_kwargs + assert call_kwargs["adapter_names"] == ["test_lora"] + + +def test_generate_with_unloaded_lora_adapter(lora_backend, mock_peft_model): + """Test generation with an unloaded LoRA adapter should fail.""" + with patch( + "sllm.serve.backends.transformers_backend.load_model", + return_value=mock_peft_model, + ): + lora_backend.init_backend() + + input_data = { + "model": "facebook/opt-125m", + "messages": [ + { + "role": "user", + "content": "Hello, how are you?", + } + ], + "temperature": 0.7, + "max_tokens": 10, + "lora_adapter_name": "nonexistent_lora", + } + + result = lora_backend.generate(input_data) + + # Verify error is returned + assert "error" in result + assert "LoRA adapter nonexistent_lora not found" in result["error"] + + +def test_generate_base_model_without_lora(lora_backend, mock_peft_model): + """Test generation with base model (no LoRA adapter specified).""" + with patch( + "sllm.serve.backends.transformers_backend.load_model", + return_value=mock_peft_model, + ), patch( + "sllm.serve.backends.transformers_backend.TransformersBackend._tokenize" + ) as mock_tokenize: + lora_backend.init_backend() + + # Setup tokenizer mock + tokenizer = AutoTokenizer.from_pretrained("facebook/opt-125m") + mock_inputs = tokenizer("test prompt", return_tensors="pt") + mock_tokenize.return_value = mock_inputs + + # Mock model generation + with patch.object(mock_peft_model, "generate") as mock_generate: + # Create mock output tokens + mock_output = torch.tensor([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]) + mock_generate.return_value = mock_output + + input_data = { + "model": "facebook/opt-125m", + "messages": [ + { + "role": "user", + "content": "Hello, how are you?", + } + ], + "temperature": 0.7, + "max_tokens": 10, + } + + result = lora_backend.generate(input_data) + + # Verify successful generation + assert "error" not in result + assert "choices" in result and len(result["choices"]) == 1 + assert "message" in result["choices"][0] + assert "content" in result["choices"][0]["message"] + + # Verify generate was called without adapter_names + mock_generate.assert_called_once() + call_kwargs = mock_generate.call_args[1] + assert call_kwargs.get("adapter_names") is None + + +def test_generate_with_lora_on_base_model_error(lora_backend, mock_peft_model): + """Test that requesting LoRA generation on a base model without LoRA loaded fails.""" + with patch( + "sllm.serve.backends.transformers_backend.load_model", + return_value=mock_peft_model, + ): + lora_backend.init_backend() + + # Don't load any LoRA adapter (peft_config is empty) + + input_data = { + "model": "facebook/opt-125m", + "messages": [ + { + "role": "user", + "content": "Hello, how are you?", + } + ], + "temperature": 0.7, + "max_tokens": 10, + "lora_adapter_name": "test_lora", + } + + result = lora_backend.generate(input_data) + + # Verify error is returned + assert "error" in result + assert "LoRA adapter test_lora not found" in result["error"] + + +def test_load_lora_adapter_uninitialized_backend(): + """Test that loading LoRA adapter on uninitialized backend fails.""" + backend_config = { + "pretrained_model_name_or_path": "facebook/opt-125m", + "torch_dtype": "float16", + "hf_model_class": "AutoModelForCausalLM", + } + backend = TransformersBackend("facebook/opt-125m", backend_config) + + # Try to load LoRA without initializing backend + result = backend.load_lora_adapter("test_lora", "dummy_path") + + # Verify error is returned + assert result is not None + assert "error" in result + assert "Model not initialized" in result["error"] + + +def test_generate_with_different_lora_adapters(lora_backend, mock_peft_model): + """Test generation with different LoRA adapters.""" + with patch( + "sllm.serve.backends.transformers_backend.load_model", + return_value=mock_peft_model, + ), patch( + "sllm.serve.backends.transformers_backend.load_lora", + return_value=mock_peft_model, + ), patch( + "sllm.serve.backends.transformers_backend.TransformersBackend._tokenize" + ) as mock_tokenize: + lora_backend.init_backend() + + # Setup tokenizer mock + tokenizer = AutoTokenizer.from_pretrained("facebook/opt-125m") + mock_inputs = tokenizer("test prompt", return_tensors="pt") + mock_tokenize.return_value = mock_inputs + + # Simulate both LoRA adapters loaded + mock_peft_model.peft_config["test_lora_1"] = { + "adapter_name": "test_lora_1" + } + mock_peft_model.peft_config["test_lora_2"] = { + "adapter_name": "test_lora_2" + } + + # Mock model generation + with patch.object(mock_peft_model, "generate") as mock_generate: + # Create mock output tokens + mock_output = torch.tensor([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]) + mock_generate.return_value = mock_output + + input_data_base = { + "model": "facebook/opt-125m", + "messages": [ + { + "role": "user", + "content": "Hello, how are you?", + } + ], + "temperature": 0.0, # Use temperature 0 for deterministic output + "max_tokens": 10, + } + + # Generate with first LoRA adapter + input_data_1 = input_data_base.copy() + input_data_1["lora_adapter_name"] = "test_lora_1" + result_1 = lora_backend.generate(input_data_1) + + # Generate with second LoRA adapter + input_data_2 = input_data_base.copy() + input_data_2["lora_adapter_name"] = "test_lora_2" + result_2 = lora_backend.generate(input_data_2) + + # Generate with base model (no LoRA) + result_base = lora_backend.generate(input_data_base) + + # Verify all generations are successful + assert "error" not in result_1 + assert "error" not in result_2 + assert "error" not in result_base + + # Extract generated content + content_1 = result_1["choices"][0]["message"]["content"] + content_2 = result_2["choices"][0]["message"]["content"] + content_base = result_base["choices"][0]["message"]["content"] + + # Verify they're all valid strings + assert isinstance(content_1, str) + assert isinstance(content_2, str) + assert isinstance(content_base, str) + + # Verify generate was called 3 times + assert mock_generate.call_count == 3 + + +def test_lora_adapter_persistence_across_generations( + lora_backend, mock_peft_model +): + """Test that LoRA adapter remains loaded across multiple generations.""" + with patch( + "sllm.serve.backends.transformers_backend.load_model", + return_value=mock_peft_model, + ), patch( + "sllm.serve.backends.transformers_backend.load_lora", + return_value=mock_peft_model, + ), patch( + "sllm.serve.backends.transformers_backend.TransformersBackend._tokenize" + ) as mock_tokenize: + lora_backend.init_backend() + + # Setup tokenizer mock + tokenizer = AutoTokenizer.from_pretrained("facebook/opt-125m") + mock_inputs = tokenizer("test prompt", return_tensors="pt") + mock_tokenize.return_value = mock_inputs + + # Simulate LoRA adapter loaded + mock_peft_model.peft_config["test_lora"] = {"adapter_name": "test_lora"} + + # Mock model generation + with patch.object(mock_peft_model, "generate") as mock_generate: + # Create mock output tokens + mock_output = torch.tensor([[1, 2, 3, 4, 5, 6]]) + mock_generate.return_value = mock_output + + input_data = { + "model": "facebook/opt-125m", + "messages": [ + { + "role": "user", + "content": "Hello, how are you?", + } + ], + "temperature": 0.7, + "max_tokens": 5, + "lora_adapter_name": "test_lora", + } + + # Generate multiple times + for i in range(3): + result = lora_backend.generate(input_data) + assert "error" not in result + assert "choices" in result and len(result["choices"]) == 1 + + # Verify adapter is still loaded + assert hasattr(lora_backend.model, "peft_config") + assert "test_lora" in lora_backend.model.peft_config + + # Verify generate was called 3 times + assert mock_generate.call_count == 3 diff --git a/tests/backend_test/vllm_backend_test.py b/tests/backend_test/vllm_backend_test.py new file mode 100644 index 0000000..a3fd3d0 --- /dev/null +++ b/tests/backend_test/vllm_backend_test.py @@ -0,0 +1,275 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # +import asyncio +from typing import AsyncIterator +from unittest.mock import AsyncMock, patch + +import pytest +from vllm import ( + CompletionOutput, + EmbeddingOutput, + EmbeddingRequestOutput, + RequestOutput, +) + +from sllm.serve.backends.vllm_backend import ( + BackendStatus, + VllmBackend, +) + + +@pytest.fixture +def model_name(): + return "test-model" + + +@pytest.fixture +def backend_config(): + return { + "pretrained_model_name_or_path": "test-model", + "trace_debug": False, + "load_format": "sharded_state", + "torch_dtype": None, + } + + +async def generate( + inputs, sampling_params, request_id +) -> AsyncIterator[RequestOutput]: + prompt = inputs + tokens = [1, 2, 3] + + yield RequestOutput( + request_id, + prompt, + tokens, + None, + [CompletionOutput(0, "test", [4], 0.5, None)], + True, + ) + await asyncio.sleep(1) + yield RequestOutput( + request_id, + prompt, + tokens, + None, + [CompletionOutput(0, "test output", [4, 5], 0.5, None)], + True, + ) + await asyncio.sleep(1) + yield RequestOutput( + request_id, + prompt, + tokens, + None, + [CompletionOutput(0, "test output result", [4, 5, 6], 0.5, None)], + True, + ) + + +# Mock the encode method +async def encode( + inputs, pooling_params, request_id +) -> AsyncIterator[EmbeddingRequestOutput]: + # Simulate the behavior of real encode with multiple embeddings + yield EmbeddingRequestOutput( + request_id=request_id, + outputs=EmbeddingOutput(embedding=[0.1, 0.2, 0.3]), + prompt_token_ids=[101, 102, 103], + finished=True, + ) + await asyncio.sleep(1) + yield EmbeddingRequestOutput( + request_id=request_id, + outputs=EmbeddingOutput(embedding=[0.4, 0.5, 0.6]), + prompt_token_ids=[104, 105, 106], + finished=True, + ) + + +@pytest.fixture +def async_llm_engine(): + with patch( + "sllm.serve.backends.vllm_backend.AsyncLLMEngine" + ) as MockAsyncLLMEngine: + async_llm_engine_obj = MockAsyncLLMEngine.return_value + async_llm_engine_obj.from_engine_args.return_value = ( + async_llm_engine_obj + ) + async_llm_engine_obj.abort = AsyncMock() + async_llm_engine_obj.generate.side_effect = generate + async_llm_engine_obj.encode.side_effect = encode + yield async_llm_engine_obj + + +@pytest.fixture +def vllm_backend(model_name, backend_config, async_llm_engine): + yield VllmBackend(model_name, backend_config) + + +def test_init(vllm_backend, backend_config): + assert vllm_backend.backend_config == backend_config + assert vllm_backend.status == BackendStatus.UNINITIALIZED + + +@pytest.mark.asyncio +async def test_init_backend(vllm_backend, async_llm_engine): + with patch( + "sllm.serve.backends.vllm_backend.AsyncLLMEngine.from_engine_args", + return_value=async_llm_engine, + ): + await vllm_backend.init_backend() + assert vllm_backend.status == BackendStatus.RUNNING + + +@pytest.mark.asyncio +async def test_generate_without_init(vllm_backend): + request_data = { + "model": "test-model", + "prompt": "user: Hello", + "request_id": "test-request-id", + } + with patch( + "sllm.serve.backends.vllm_backend.AsyncLLMEngine.from_engine_args", + return_value=AsyncMock(), + ): + response = await vllm_backend.generate(request_data) + assert "error" in response + + +@pytest.mark.asyncio +async def test_generate(vllm_backend, async_llm_engine): + request_data = { + "model": "test-model", + "prompt": "user: Hello", + "request_id": "test-request-id", + } + with patch( + "sllm.serve.backends.vllm_backend.AsyncLLMEngine.from_engine_args", + return_value=async_llm_engine, + ): + await vllm_backend.init_backend() + response = await vllm_backend.generate(request_data) + assert "error" not in response + assert "model" in response and response["model"] == "test-model" + assert "id" in response and response["id"] == "test-request-id" + + +@pytest.mark.asyncio +async def test_shutdown(model_name, backend_config, async_llm_engine): + # Open trace debug to avoid clean the finished request in record map + backend_config["trace_debug"] = True + vllm_backend = VllmBackend(model_name, backend_config) + request_data = { + "model": "test-model", + "prompt": "user: Hello", + "request_id": "test-request-id", + } + with patch( + "sllm.serve.backends.vllm_backend.AsyncLLMEngine.from_engine_args", + return_value=async_llm_engine, + ): + await vllm_backend.init_backend() + await vllm_backend.generate(request_data) + await vllm_backend.shutdown() + assert vllm_backend.status == BackendStatus.DELETING + # Since open trace debug, will try to abort the already done task + assert async_llm_engine.abort.call_count == 1 + + +@pytest.mark.asyncio +async def test_stop(vllm_backend, async_llm_engine): + request_data = { + "model": "test-model", + "prompt": "user: Hello", + "request_id": "test-request-id", + } + with patch( + "sllm.serve.backends.vllm_backend.AsyncLLMEngine.from_engine_args", + return_value=async_llm_engine, + ): + await vllm_backend.init_backend() + await vllm_backend.generate(request_data) + with patch( + "sllm.serve.backends.vllm_backend.VllmBackend.shutdown", + new_callable=AsyncMock, + ) as mock_shutdown: + await vllm_backend.stop() + assert vllm_backend.status == BackendStatus.STOPPING + # stop will not call abort + assert async_llm_engine.abort.call_count == 0 + # stop will call shutdown after stop done + assert mock_shutdown.call_count == 1 + + +@pytest.mark.asyncio +async def test_get_current_tokens(model_name, backend_config, async_llm_engine): + # Open trace debug to avoid clean the finished request in record map + backend_config["trace_debug"] = True + vllm_backend = VllmBackend(model_name, backend_config) + request_data = [ + { + "model": "test-model", + "prompt": "user: Hello", + "request_id": f"test-request-id{i}", + } + for i in range(3) + ] + with patch( + "sllm.serve.backends.vllm_backend.AsyncLLMEngine.from_engine_args", + return_value=async_llm_engine, + ): + await vllm_backend.init_backend() + for request in request_data: + await vllm_backend.generate(request) + current_tokens = await vllm_backend.get_current_tokens() + assert len(current_tokens) == 3 + + +@pytest.mark.asyncio +async def test_resume_kv_cache(vllm_backend): + with patch( + "sllm.serve.backends.vllm_backend.AsyncLLMEngine.from_engine_args", + return_value=async_llm_engine, + ): + await vllm_backend.init_backend() + vllm_backend.generate = AsyncMock() + request_datas = [[1, 2, 3], [4, 5, 6]] + await vllm_backend.resume_kv_cache(request_datas) + assert vllm_backend.generate.call_count == len(request_datas) + + +@pytest.mark.asyncio +async def test_encode(backend_config, async_llm_engine, model_name): + backend_config["enforce_eager"] = True + backend_config["enable_prefix_caching"] = False + vllm_backend = VllmBackend(model_name, backend_config) + + request_data = {"model": "test-model", "input": ["Hi, How are you?"]} + + with patch( + "sllm.serve.backends.vllm_backend.AsyncLLMEngine.from_engine_args", + return_value=async_llm_engine, + ): + await vllm_backend.init_backend() + + result = await vllm_backend.encode(request_data) + + assert "error" not in result + assert "data" in result + assert len(result["data"]) == 2 diff --git a/tests/cli_test/__init__.py b/tests/cli_test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/cli_test/delete_test.py b/tests/cli_test/delete_test.py new file mode 100644 index 0000000..43ccf8d --- /dev/null +++ b/tests/cli_test/delete_test.py @@ -0,0 +1,122 @@ +import unittest +from argparse import Namespace +from unittest.mock import MagicMock, patch + +from sllm.cli.delete import DeleteCommand + + +class TestDeleteCommand(unittest.TestCase): + @patch("sllm.cli.delete.requests.post") + def test_delete_single_model_success(self, mock_post): + # Mock the response of the requests.post + mock_response = MagicMock() + mock_response.status_code = 200 + mock_post.return_value = mock_response + + args = Namespace(models=["facebook/opt-1.3b"]) + command = DeleteCommand(args) + command.run() + + mock_post.assert_called_once_with( + "http://127.0.0.1:8343/delete", + headers={"Content-Type": "application/json"}, + json={"model": "facebook/opt-1.3b"}, + ) + self.assertEqual(mock_post.return_value.status_code, 200) + + @patch("sllm.cli.delete.requests.post") + def test_delete_multiple_models_success(self, mock_post): + # Mock the response of the requests.post + mock_response = MagicMock() + mock_response.status_code = 200 + mock_post.return_value = mock_response + + args = Namespace(models=["facebook/opt-1.3b", "facebook/opt-2.7b"]) + command = DeleteCommand(args) + command.run() + + self.assertEqual(mock_post.call_count, 2) + + expected_calls = [ + ( + "http://127.0.0.1:8343/delete", + {"Content-Type": "application/json"}, + {"model": "facebook/opt-1.3b"}, + ), + ( + "http://127.0.0.1:8343/delete", + {"Content-Type": "application/json"}, + {"model": "facebook/opt-2.7b"}, + ), + ] + for call, expected in zip(mock_post.call_args_list, expected_calls): + args, kwargs = call + self.assertEqual(args[0], expected[0]) + self.assertEqual(kwargs["headers"], expected[1]) + self.assertEqual(kwargs["json"], expected[2]) + + @patch("sllm.cli.delete.requests.post") + def test_delete_model_failure(self, mock_post): + # Mock the response of the requests.post + mock_response = MagicMock() + mock_response.status_code = 500 + mock_post.return_value = mock_response + + args = Namespace(models=["facebook/opt-1.3b"]) + command = DeleteCommand(args) + command.run() + + mock_post.assert_called_once_with( + "http://127.0.0.1:8343/delete", + headers={"Content-Type": "application/json"}, + json={"model": "facebook/opt-1.3b"}, + ) + self.assertEqual(mock_post.return_value.status_code, 500) + + @patch("sllm.cli.delete.requests.post") + def test_delete_multiple_lora_adapters_success(self, mock_post): + # Mock the response of the requests.post + mock_response = MagicMock() + mock_response.status_code = 200 + mock_post.return_value = mock_response + + args = Namespace( + models=["facebook/opt-1.3b"], lora_adapters=["adapter1", "adapter2"] + ) + command = DeleteCommand(args) + command.run() + + mock_post.assert_called_once_with( + "http://127.0.0.1:8343/delete", + headers={"Content-Type": "application/json"}, + json={ + "model": "facebook/opt-1.3b", + "lora_adapters": ["adapter1", "adapter2"], + }, + ) + self.assertEqual(mock_post.return_value.status_code, 200) + + @patch("sllm.cli.delete.requests.post") + def test_delete_lora_adapter_failure(self, mock_post): + # Mock the response of the requests.post + mock_response = MagicMock() + mock_response.status_code = 500 + mock_response.text = "Failed to delete LoRA adapters" + mock_post.return_value = mock_response + + args = Namespace( + models=["facebook/opt-1.3b"], lora_adapters=["adapter1"] + ) + command = DeleteCommand(args) + command.run() + + mock_post.assert_called_once_with( + "http://127.0.0.1:8343/delete", + headers={"Content-Type": "application/json"}, + json={"model": "facebook/opt-1.3b", "lora_adapters": ["adapter1"]}, + ) + self.assertEqual(mock_post.return_value.status_code, 500) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/cli_test/deploy_test.py b/tests/cli_test/deploy_test.py new file mode 100644 index 0000000..07d6f49 --- /dev/null +++ b/tests/cli_test/deploy_test.py @@ -0,0 +1,273 @@ +import unittest +from argparse import Namespace +from unittest.mock import MagicMock, patch + +from sllm.cli.deploy import DeployCommand + + +class TestDeployCommand(unittest.TestCase): + @patch("sllm.cli.deploy.read_config") + @patch("sllm.cli.deploy.requests.post") + def test_deploy_with_model_only(self, mock_post, mock_read_config): + # Mock read_config to return a default configuration + mock_read_config.return_value = { + "model": "", + "backend": "vllm", + "num_gpus": 1, + "auto_scaling_config": { + "target": 1, + "min_instances": 1, + "max_instances": 5, + }, + "backend_config": { + "pretrained_model_name_or_path": "", + "device_map": "auto", + "torch_dtype": "float16", + }, + } + + # Mock the response of the requests.post + mock_response = MagicMock() + mock_response.status_code = 200 + mock_post.return_value = mock_response + + args = Namespace( + model="facebook/opt-1.3b", + config=None, + backend=None, + num_gpus=None, + target=None, + min_instances=None, + max_instances=None, + enable_lora=False, + lora_adapters=None, + ) + command = DeployCommand(args) + command.run() + + mock_read_config.assert_called_once() + mock_post.assert_called_once() + self.assertEqual( + mock_post.call_args[1]["json"]["model"], "facebook/opt-1.3b" + ) + + @patch("sllm.cli.deploy.read_config") + @patch("sllm.cli.deploy.requests.post") + def test_deploy_with_custom_config(self, mock_post, mock_read_config): + # Mock the default config + default_config = { + "model": "", + "backend": "vllm", + "num_gpus": 1, + "auto_scaling_config": { + "target": 1, + "min_instances": 1, + "max_instances": 5, + }, + "backend_config": { + "pretrained_model_name_or_path": "", + "device_map": "auto", + "torch_dtype": "float16", + }, + } + mock_read_config.side_effect = [ + default_config, + {"model": "custom-model", "backend": "transformers"}, + ] + + # Mock the response of the requests.post + mock_response = MagicMock() + mock_response.status_code = 200 + mock_post.return_value = mock_response + + args = Namespace( + model=None, + config="path/to/config.json", + backend=None, + num_gpus=None, + target=None, + min_instances=None, + max_instances=None, + enable_lora=False, + lora_adapters=None, + ) + command = DeployCommand(args) + command.run() + + expected_config = default_config + expected_config.update( + {"model": "custom-model", "backend": "transformers"} + ) + + mock_read_config.assert_called() + mock_post.assert_called_once() + self.assertEqual( + mock_post.call_args[1]["json"]["model"], "custom-model" + ) + self.assertEqual( + mock_post.call_args[1]["json"]["backend"], "transformers" + ) + + @patch("sllm.cli.deploy.read_config") + def test_validate_config(self, mock_read_config): + # Mocked valid configuration + mock_read_config.return_value = { + "model": "facebook/opt-1.3b", + "backend": "transformers", + "num_gpus": 1, + "auto_scaling_config": { + "target": 1, + "min_instances": 1, + "max_instances": 5, + }, + "backend_config": { + "pretrained_model_name_or_path": "facebook/opt-1.3b", + "device_map": "auto", + "torch_dtype": "float16", + }, + } + + # Initialize DeployCommand with valid arguments + args = Namespace( + model="facebook/opt-1.3b", + config=None, + backend=None, + num_gpus=None, + target=None, + min_instances=None, + max_instances=None, + enable_lora=False, + lora_adapters=None, + ) + command = DeployCommand(args) + + # Test with valid config (should not raise any exception) + valid_config = mock_read_config.return_value + command.validate_config(valid_config) + + # Test with invalid num_gpus < 1 + invalid_config_num_gpus = valid_config.copy() + invalid_config_num_gpus["num_gpus"] = -1 + with self.assertRaises(ValueError): + command.validate_config(invalid_config_num_gpus) + + # Test with invalid target < 1 + invalid_config_target = valid_config.copy() + invalid_config_target["auto_scaling_config"]["target"] = 0 + with self.assertRaises(ValueError): + command.validate_config(invalid_config_target) + + # Test with min_instances < 0 + invalid_config_min_instances = valid_config.copy() + invalid_config_min_instances["auto_scaling_config"][ + "min_instances" + ] = -1 + with self.assertRaises(ValueError): + command.validate_config(invalid_config_min_instances) + + # Test with max_instances < 0 + invalid_config_max_instances = valid_config.copy() + invalid_config_max_instances["auto_scaling_config"][ + "max_instances" + ] = -1 + with self.assertRaises(ValueError): + command.validate_config(invalid_config_max_instances) + + # Test with min_instances > max_instances + invalid_config_min_greater_than_max = valid_config.copy() + invalid_config_min_greater_than_max["auto_scaling_config"][ + "min_instances" + ] = 6 + invalid_config_min_greater_than_max["auto_scaling_config"][ + "max_instances" + ] = 5 + with self.assertRaises(ValueError): + command.validate_config(invalid_config_min_greater_than_max) + + @patch("sllm.cli.deploy.read_config") + def test_update_config(self, mock_read_config): + default_config = { + "model": "", + "backend": "vllm", + "num_gpus": 1, + "auto_scaling_config": { + "target": 1, + "min_instances": 1, + "max_instances": 5, + }, + "backend_config": { + "pretrained_model_name_or_path": "", + "device_map": "auto", + "torch_dtype": "float16", + }, + } + provided_config = { + "model": "facebook/opt-2.7b", + "backend": "transformers", + } + + args = Namespace( + model=None, + config="path/to/config.json", + backend=None, + num_gpus=None, + target=None, + min_instances=None, + max_instances=None, + enable_lora=False, + lora_adapters=None, + ) + command = DeployCommand(args) + updated_config = command.update_config(default_config, provided_config) + + self.assertEqual(updated_config["model"], "facebook/opt-2.7b") + self.assertEqual(updated_config["backend"], "transformers") + self.assertEqual( + updated_config["auto_scaling_config"]["target"], 1 + ) # Should remain as default + + @patch("sllm.cli.deploy.requests.post") + def test_deploy_model_success(self, mock_post): + # Mock the response of the requests.post + mock_response = MagicMock() + mock_response.status_code = 200 + mock_post.return_value = mock_response + + config_data = { + "model": "facebook/opt-2.7b", + "backend": "transformers", + "num_gpus": 2, + "auto_scaling_config": { + "target": 2, + "min_instances": 1, + "max_instances": 4, + }, + "backend_config": { + "pretrained_model_name_or_path": "facebook/opt-2.7b", + "device_map": "auto", + "torch_dtype": "float16", + }, + } + + args = Namespace( + model="facebook/opt-2.7b", + config=None, + backend=None, + num_gpus=None, + target=None, + min_instances=None, + max_instances=None, + enable_lora=False, + lora_adapters=None, + ) + command = DeployCommand(args) + command.deploy_model(config_data) + + mock_post.assert_called_once() + self.assertEqual( + mock_post.call_args[1]["json"]["model"], "facebook/opt-2.7b" + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/cli_test/fine_tuning_test.py b/tests/cli_test/fine_tuning_test.py new file mode 100644 index 0000000..439611a --- /dev/null +++ b/tests/cli_test/fine_tuning_test.py @@ -0,0 +1,111 @@ +import unittest +from argparse import Namespace +from unittest.mock import MagicMock, patch + +from sllm.cli.fine_tuning import FineTuningCommand + + +class TestFineTuningCommand(unittest.TestCase): + @patch("sllm.cli.fine_tuning.requests.post") + @patch("sllm.cli.fine_tuning.read_config") + def test_fine_tuning_with_model_only(self, mock_read_config, mock_post): + # Mock read_config to return a sample fine-tuning configuration + mock_read_config.return_value = { + "model": "facebook/opt-125m", + "ft_backend": "peft", + "dataset_config": { + "dataset_source": "hf_hub", + "hf_dataset_name": "fka/awesome-chatgpt-prompts", + "tokenization_field": "prompt", + "split": "train[:10%]", + "data_files": "", + "extension_type": "", + }, + "lora_config": { + "r": 4, + "lora_alpha": 1, + "target_modules": ["query_key_value"], + "lora_dropout": 0.05, + "bias": "lora_only", + "task_type": "CAUSAL_LM", + }, + "training_config": { + "auto_find_batch_size": True, + "num_train_epochs": 2, + "learning_rate": 0.0001, + "use_cpu": False, + }, + } + + # Mock a successful POST response + mock_response = MagicMock() + mock_response.status_code = 200 + mock_response.json.return_value = { + "model": "facebook/opt-125m", + "lora_save_path": "./models/ft_facebook/opt-125m", + } + mock_post.return_value = mock_response + + args = Namespace(base_model="facebook/opt-125m", config=None) + command = FineTuningCommand(args) + command.run() + + mock_read_config.assert_called_once_with(command.config_path) + mock_post.assert_called_once() + self.assertEqual( + mock_post.call_args[1]["json"]["model"], "facebook/opt-125m" + ) + self.assertEqual( + mock_response.json.return_value["lora_save_path"], + "./models/ft_facebook/opt-125m", + ) + + @patch("sllm.cli.fine_tuning.read_config") + def test_validate_config_missing_key(self, mock_read_config): + # Missing required key in the configuration + mock_read_config.return_value = { + "ft_backend": "peft", + "dataset_config": {"dataset_source": "hf_hub"}, + } + args = Namespace(base_model="facebook/opt-125m", config=None) + command = FineTuningCommand(args) + + with self.assertRaises(ValueError) as context: + command.validate_config(mock_read_config.return_value) + self.assertIn("Missing key", str(context.exception)) + + @patch("sllm.cli.fine_tuning.requests.post") + @patch("sllm.cli.fine_tuning.read_config") + def test_fine_tuning_request_failure(self, mock_read_config, mock_post): + # Simulate configuration + mock_read_config.return_value = { + "model": "facebook/opt-125m", + "ft_backend": "peft", + "dataset_config": { + "dataset_source": "hf_hub", + "hf_dataset_name": "fka/awesome-chatgpt-prompts", + "tokenization_field": "prompt", + "split": "train[:10%]", + }, + "lora_config": {"r": 4}, + "training_config": {"num_train_epochs": 2}, + } + + # Simulate a failed request + mock_response = MagicMock() + mock_response.status_code = 500 + mock_response.text = "Internal Server Error" + mock_post.return_value = mock_response + + args = Namespace(base_model="facebook/opt-125m", config=None) + command = FineTuningCommand(args) + + with self.assertLogs("sllm.cli.fine_tuning", level="ERROR") as log: + result = command.fine_tuning(mock_read_config.return_value) + self.assertIsNone(result) + mock_post.assert_called_once() + self.assertIn("Failed to do fine-tuning", log.output[0]) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/cli_test/generate_test.py b/tests/cli_test/generate_test.py new file mode 100644 index 0000000..8d18a7b --- /dev/null +++ b/tests/cli_test/generate_test.py @@ -0,0 +1,107 @@ +import unittest +from argparse import Namespace +from unittest.mock import patch + +from sllm.cli.generate import GenerateCommand + + +class TestGenerateCommand(unittest.TestCase): + @patch("sllm.cli.generate.requests.post") + @patch("sllm.cli.generate.read_config") + def test_generate_single_thread_success(self, mock_read_config, mock_post): + # Mock the configuration reading and the POST request + mock_read_config.return_value = { + "model": "facebook/opt-1.3b", + "messages": [{"role": "user", "content": "Hello!"}], + "temperature": 0.3, + "max_tokens": 50, + } + mock_post.return_value.status_code = 200 + mock_post.return_value.json.return_value = { + "choices": [{"message": {"content": "Hi!"}}] + } + + args = Namespace(input_path="/path/to/input.json", threads=1) + command = GenerateCommand(args) + command.run() + self.assertEqual(mock_post.return_value.status_code, 200) + + mock_read_config.assert_called_once_with("/path/to/input.json") + mock_post.assert_called_once_with( + "http://127.0.0.1:8343/v1/chat/completions", + headers={"Content-Type": "application/json"}, + json={ + "model": "facebook/opt-1.3b", + "messages": [{"role": "user", "content": "Hello!"}], + "temperature": 0.3, + "max_tokens": 50, + }, + ) + + @patch("sllm.cli.generate.requests.post") + @patch("sllm.cli.generate.read_config") + def test_generate_single_thread_failure(self, mock_read_config, mock_post): + # Mock the configuration reading and the POST request with failure + mock_read_config.return_value = { + "model": "facebook/opt-1.3b", + "messages": [{"role": "user", "content": "Hello!"}], + "temperature": 0.3, + "max_tokens": 50, + } + mock_post.return_value.status_code = 500 + mock_post.return_value.text = "Internal Server Error" + + args = Namespace(input_path="/path/to/input.json", threads=1) + command = GenerateCommand(args) + command.run() + + mock_read_config.assert_called_once_with("/path/to/input.json") + mock_post.assert_called_once() + self.assertEqual(mock_post.return_value.status_code, 500) + + @patch("sllm.cli.generate.requests.post") + @patch("sllm.cli.generate.read_config") + def test_generate_multi_thread_success(self, mock_read_config, mock_post): + # Mock the configuration reading and the POST request + mock_read_config.return_value = { + "model": "facebook/opt-1.3b", + "messages": [{"role": "user", "content": "Hello!"}], + "temperature": 0.3, + "max_tokens": 50, + } + mock_post.return_value.status_code = 200 + mock_post.return_value.json.return_value = { + "choices": [{"message": {"content": "Hi!"}}] + } + + args = Namespace(input_path="/path/to/input.json", threads=2) + command = GenerateCommand(args) + command.run() + + mock_read_config.assert_called_once_with("/path/to/input.json") + self.assertEqual(mock_post.call_count, 2) + + @patch("sllm.cli.generate.requests.post") + @patch("sllm.cli.generate.read_config") + def test_generate_multi_thread_failure(self, mock_read_config, mock_post): + # Mock the configuration reading and the POST request with failure + mock_read_config.return_value = { + "model": "facebook/opt-1.3b", + "messages": [{"role": "user", "content": "Hello!"}], + "temperature": 0.3, + "max_tokens": 50, + } + mock_post.return_value.status_code = 500 + mock_post.return_value.text = "Internal Server Error" + + args = Namespace(input_path="/path/to/input.json", threads=2) + command = GenerateCommand(args) + command.run() + + mock_read_config.assert_called_once_with("/path/to/input.json") + self.assertEqual(mock_post.call_count, 2) + self.assertEqual(mock_post.return_value.status_code, 500) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/cli_test/sllm_cli_test.py b/tests/cli_test/sllm_cli_test.py new file mode 100644 index 0000000..a134dd5 --- /dev/null +++ b/tests/cli_test/sllm_cli_test.py @@ -0,0 +1,119 @@ +import sys +import unittest +from unittest.mock import patch + +from sllm.cli.sllm_cli import main + + +class TestSllmCLI(unittest.TestCase): + @patch("sllm.cli.deploy.DeployCommand") + def test_deploy_command(self, mock_deploy_command): + # Simulate command-line input + test_args = ["sllm-cli", "deploy", "--model", "facebook/opt-1.3b"] + with patch.object(sys, "argv", test_args): + main() + + # Check that DeployCommand was called with the correct arguments + mock_deploy_command.assert_called_once() + self.assertEqual( + mock_deploy_command.call_args[0][0].model, "facebook/opt-1.3b" + ) + + @patch("sllm.cli.generate.GenerateCommand") + def test_generate_command(self, mock_generate_command): + # Simulate command-line input + test_args = ["sllm-cli", "generate", "input.json"] + with patch.object(sys, "argv", test_args): + main() + + # Check that GenerateCommand was called with the correct arguments + mock_generate_command.assert_called_once() + self.assertEqual( + mock_generate_command.call_args[0][0].input_path, "input.json" + ) + + @patch("sllm.cli.fine_tuning.FineTuningCommand") + def test_fine_tuning_command(self, mock_fine_tuning_command): + # Simulate command-line input + test_args = [ + "sllm-cli", + "fine-tuning", + "--base-model", + "facebook/opt-125m", + ] + with patch.object(sys, "argv", test_args): + main() + + # Check that GenerateCommand was called with the correct arguments + mock_fine_tuning_command.assert_called_once() + self.assertEqual( + mock_fine_tuning_command.call_args[0][0].base_model, + "facebook/opt-125m", + ) + + @patch("sllm.cli.replay.ReplayCommand") + def test_replay_command(self, mock_replay_command): + # Simulate command-line input + test_args = [ + "sllm-cli", + "replay", + "--workload", + "workload.json", + "--dataset", + "dataset.json", + ] + with patch.object(sys, "argv", test_args): + main() + + # Check that ReplayCommand was called with the correct arguments + mock_replay_command.assert_called_once() + self.assertEqual( + mock_replay_command.call_args[0][0].workload, "workload.json" + ) + self.assertEqual( + mock_replay_command.call_args[0][0].dataset, "dataset.json" + ) + + @patch("sllm.cli.delete.DeleteCommand") + def test_delete_command(self, mock_delete_command): + # Simulate command-line input + test_args = [ + "sllm-cli", + "delete", + "facebook/opt-1.3b", + "facebook/opt-2.7b", + ] + with patch.object(sys, "argv", test_args): + main() + + # Check that DeleteCommand was called with the correct arguments + mock_delete_command.assert_called_once() + self.assertEqual( + mock_delete_command.call_args[0][0].models, + ["facebook/opt-1.3b", "facebook/opt-2.7b"], + ) + + @patch("sllm.cli.update.UpdateCommand") + def test_update_command(self, mock_update_command): + # Simulate command-line input + test_args = ["sllm-cli", "update", "--model", "facebook/opt-1.3b"] + with patch.object(sys, "argv", test_args): + main() + + # Check that UpdateCommand was called with the correct arguments + mock_update_command.assert_called_once() + self.assertEqual( + mock_update_command.call_args[0][0].model, "facebook/opt-1.3b" + ) + + @patch("argparse.ArgumentParser.print_help") + def test_no_command(self, mock_print_help): + with patch("sys.argv", ["sllm-cli"]), self.assertRaises(SystemExit): + main() + + # Check that the help message was printed + mock_print_help.assert_called_once() + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/cli_test/status_test.py b/tests/cli_test/status_test.py new file mode 100644 index 0000000..e3b5df3 --- /dev/null +++ b/tests/cli_test/status_test.py @@ -0,0 +1,155 @@ +import sys +import unittest +from argparse import Namespace +from unittest.mock import MagicMock, patch + +# import os +# sys.path.insert(0, os.path.abspath(os.path.dirname(__file__))) +from sllm.cli.status import StatusCommand + + +class TestStatusCommand(unittest.TestCase): + @patch("sllm.cli.status.requests.get") + def test_query_status_success(self, mock_get): + # Mock a successful response + mock_response = MagicMock() + mock_response.status_code = 200 + mock_response.json.return_value = {"data": "mocked_model_status"} + mock_get.return_value = mock_response + + args = Namespace() + command = StatusCommand(args) + # execute query_status method + status = command.query_status() + mock_get.assert_called_once_with( + "http://127.0.0.1:8343/v1/models", + headers={"Content-Type": "application/json"}, + ) + self.assertEqual(status, {"data": "mocked_model_status"}) + + @patch("sllm.cli.status.requests.get") + def test_query_status_failure(self, mock_get): + # Mock a failed response + mock_response = MagicMock() + mock_response.status_code = 500 + mock_response.text = "Internal Server Error" + mock_get.return_value = mock_response + + # Initialize StatusCommand with dummy args + args = Namespace() + command = StatusCommand(args) + + # Execute query_status + status = command.query_status() + + # Assertions + mock_get.assert_called_once_with( + "http://127.0.0.1:8343/v1/models", + headers={"Content-Type": "application/json"}, + ) + self.assertIsNone(status) + + @patch("sllm.cli.status.requests.get") + def test_query_status_invalid_json(self, mock_get): + """Test query_status when the API responds with non-JSON data.""" + # Mock invalid JSON response + mock_response = MagicMock() + mock_response.status_code = 200 + mock_response.json.side_effect = ValueError("Invalid JSON") + mock_response.text = "Not a valid JSON" + mock_get.return_value = mock_response + + # Initialize StatusCommand with dummy args + args = Namespace() + command = StatusCommand(args) + + # Execute query_status + status = command.query_status() + + # Assertions + mock_get.assert_called_once_with( + "http://127.0.0.1:8343/v1/models", + headers={"Content-Type": "application/json"}, + ) + self.assertIsNone(status) + + @patch("sllm.cli.status.requests.get") + def test_query_status_custom_url(self, mock_get): + """Test query_status with a custom server URL.""" + # Mock successful response + mock_response = MagicMock() + mock_response.status_code = 200 + mock_response.json.return_value = {"data": "mocked_model_status"} + mock_get.return_value = mock_response + + # Set custom environment variable for server URL + custom_url = "http://custom-server-url:1234" + with patch.dict("os.environ", {"LLM_SERVER_URL": custom_url}): + args = Namespace() + command = StatusCommand(args) + + # Execute query_status + status = command.query_status() + + # Assertions + mock_get.assert_called_once_with( + custom_url + "/v1/models", + headers={"Content-Type": "application/json"}, + ) + self.assertEqual(status, {"data": "mocked_model_status"}) + + @patch("builtins.print") + @patch.object( + StatusCommand, + "query_status", + return_value={ + "object": "list", + "data": [ + { + "id": "facebook/opt-1.3b", + "object": "model", + "created": 1738960470, + # etc. – the rest of the dict... + } + ], + }, + ) + def test_run_success(self, mock_query_status, mock_print): + """ + Test that StatusCommand.run() logs a success if query_status returns a non-None result. + """ + args = Namespace() + cmd = StatusCommand(args) + cmd.run() + # Check that we actually called query_status + mock_query_status.assert_called_once() + + # Extract all 'print(...)' calls. + printed_lines = [args[0] for args, kwargs in mock_print.call_args_list] + + # You probably have only one print call in this scenario, but let's be safe and check them all: + # We expect something like: "Model status: {'object': 'list', 'data': [...]}" + found_line = any("Model status: {" in line for line in printed_lines) + self.assertTrue( + found_line, + f"Expected a printed line containing 'Model status: {{', got: {printed_lines}", + ) + + @patch("sllm.cli.status.logger.error") + @patch.object(StatusCommand, "query_status", return_value=None) + def test_run_failure(self, mock_query_status, mock_logger_error): + """ + Test that StatusCommand.run() logs an error if query_status returns None. + """ + args = Namespace() + cmd = StatusCommand(args) + cmd.run() + + mock_query_status.assert_called_once() + mock_logger_error.assert_called_once_with( + "Failed to fetch model status." + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/cli_test/update_test.py b/tests/cli_test/update_test.py new file mode 100644 index 0000000..653b5ed --- /dev/null +++ b/tests/cli_test/update_test.py @@ -0,0 +1,94 @@ +import unittest +from argparse import Namespace +from unittest.mock import patch + +from sllm.cli.update import UpdateCommand + + +class TestUpdateCommand(unittest.TestCase): + @patch("sllm.cli.update.requests.post") + @patch("sllm.cli.update.read_config") + @patch("sllm.cli.update.validate_config") + def test_update_with_config_file( + self, mock_validate, mock_read_config, mock_post + ): + # Mock the configuration reading and validation + mock_read_config.return_value = { + "model": "facebook/opt-1.3b", + "backend_config": { + "pretrained_model_name_or_path": "facebook/opt-1.3b" + }, + } + mock_post.return_value.status_code = 200 + + args = Namespace(model=None, config="/path/to/config.json") + command = UpdateCommand(args) + command.run() + + mock_read_config.assert_called_once_with("/path/to/config.json") + mock_validate.assert_called_once() + mock_post.assert_called_once_with( + "http://127.0.0.1:8343/update", + headers={"Content-Type": "application/json"}, + json={ + "model": "facebook/opt-1.3b", + "backend_config": { + "pretrained_model_name_or_path": "facebook/opt-1.3b" + }, + }, + ) + + @patch("sllm.cli.update.requests.post") + @patch("sllm.cli.update.read_config") + def test_update_with_model_name(self, mock_read_config, mock_post): + # Mock the default configuration reading + mock_read_config.return_value = { + "model": "", + "backend_config": {"pretrained_model_name_or_path": ""}, + } + mock_post.return_value.status_code = 200 + + args = Namespace(model="facebook/opt-1.3b", config=None) + command = UpdateCommand(args) + command.run() + + mock_read_config.assert_called_once() + mock_post.assert_called_once_with( + "http://127.0.0.1:8343/update", + headers={"Content-Type": "application/json"}, + json={ + "model": "facebook/opt-1.3b", + "backend_config": { + "pretrained_model_name_or_path": "facebook/opt-1.3b" + }, + }, + ) + + @patch("sllm.cli.update.requests.post") + @patch("sllm.cli.update.read_config") + def test_update_model_failure(self, mock_read_config, mock_post): + # Mock the default configuration reading + mock_read_config.return_value = { + "model": "", + "backend_config": {"pretrained_model_name_or_path": ""}, + } + mock_post.return_value.status_code = 500 + + args = Namespace(model="facebook/opt-1.3b", config=None) + command = UpdateCommand(args) + command.run() + + mock_read_config.assert_called_once() + mock_post.assert_called_once() + self.assertEqual(mock_post.return_value.status_code, 500) + + def test_update_missing_arguments(self): + args = Namespace(model=None, config=None) + command = UpdateCommand(args) + + with self.assertRaises(SystemExit): + command.run() + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..5a04a10 --- /dev/null +++ b/tests/conftest.py @@ -0,0 +1,25 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # +# tests/conftest.py +import os +import sys + +# Add the project root directory to the Python path +sys.path.insert( + 0, os.path.abspath(os.path.join(os.path.dirname(__file__), "..")) +) diff --git a/tests/inference_test/inference_test.py b/tests/inference_test/inference_test.py new file mode 100644 index 0000000..d4524c6 --- /dev/null +++ b/tests/inference_test/inference_test.py @@ -0,0 +1,47 @@ +import json +import os +import pathlib + +import pytest +import torch +from transformers import AutoTokenizer + +from sllm_store.transformers import load_model + +with open("tests/inference_test/supported_models.json") as fh: + models = list(json.load(fh).keys()) + +try: + with open("tests/inference_test/failed_models.json") as fh: + _FAILED = {f["model"] for f in json.load(fh)} +except Exception: + _FAILED = set() + + +@pytest.fixture(scope="session") +def storage_path(tmp_path_factory): + env = os.getenv("MODEL_FOLDER") + return pathlib.Path(env) if env else tmp_path_factory.mktemp("models") + + +@pytest.fixture(scope="session", params=models, ids=models) +def model_name(request): + return request.param + + +def test_inference(model_name, storage_path): + if model_name in _FAILED: + pytest.skip("storage failure") + model = load_model( + model_name, + storage_path=storage_path, + device_map="auto", + torch_dtype=torch.float16, + fully_parallel=True, + ) + tokenizer = AutoTokenizer.from_pretrained(model_name) + inputs = tokenizer("Hello, my dog is cute", return_tensors="pt").to("cuda") + outputs = model.generate(**inputs) + print( + f"{model_name} output: {tokenizer.decode(outputs[0], skip_special_tokens=True)}" + ) diff --git a/tests/inference_test/store_test.py b/tests/inference_test/store_test.py new file mode 100644 index 0000000..737cc4d --- /dev/null +++ b/tests/inference_test/store_test.py @@ -0,0 +1,76 @@ +import json +import os +import pathlib + +import pytest +import torch +from transformers import AutoModelForCausalLM + +from sllm_store.transformers import load_model, save_model + +with open("tests/inference_test/supported_models.json") as fh: + models = list(json.load(fh).keys()) + + +@pytest.fixture(scope="session", params=models, ids=models) +def model_name(request): + return request.param + + +@pytest.fixture(scope="session") +def storage_path(tmp_path_factory): + env = os.getenv("MODEL_FOLDER") + return pathlib.Path(env) if env else tmp_path_factory.mktemp("models") + + +def store_and_compare(model_name, storage_path): + try: + os.makedirs(storage_path, exist_ok=True) + cache_dir = storage_path / model_name + hf_model = AutoModelForCausalLM.from_pretrained( + model_name, torch_dtype=torch.float16, trust_remote_code=True + ) + save_model(hf_model, str(cache_dir)) + + test_model = load_model( + model_name, + storage_path=storage_path, + device_map="auto", + torch_dtype=torch.float16, + fully_parallel=True, + ) + + for name, param in test_model.named_parameters(): + ref = hf_model.state_dict()[name] + if param.dtype != ref.dtype: + return ( + f"dtype mismatch for {name}: {param.dtype} vs {ref.dtype}" + ) + if param.shape != ref.shape: + return ( + f"shape mismatch for {name}: {param.shape} vs {ref.shape}" + ) + if not torch.allclose(param.cpu(), ref.cpu(), atol=1e-6): + return f"value mismatch for {name}" + + del hf_model, test_model + torch.cuda.empty_cache() + return None + + except Exception as exc: + return str(exc) + + +def test_model_can_be_stored(model_name, storage_path, request): + error = store_and_compare(model_name, storage_path) + if error: + failures = request.session.__dict__.setdefault("_model_failures", []) + failures.append({"model": model_name, "error": error}) + assert error is None, error + + +def pytest_sessionfinish(session, exitstatus): + failures = session.__dict__.get("_model_failures", []) + if failures: + with open("tests/inference_test/failed_models.json", "w") as fh: + json.dump(failures, fh, indent=2) diff --git a/tests/inference_test/supported_models.json b/tests/inference_test/supported_models.json new file mode 100644 index 0000000..d9e8ed9 --- /dev/null +++ b/tests/inference_test/supported_models.json @@ -0,0 +1,10 @@ +{ + "facebook/opt-1.3b": { + "can_store": true, + "can_inference": true + }, + "Qwen/Qwen2.5-1.5B": { + "can_store": true, + "can_inference": true + } +} diff --git a/tests/new_cli_test/test_delete.py b/tests/new_cli_test/test_delete.py new file mode 100644 index 0000000..475b06b --- /dev/null +++ b/tests/new_cli_test/test_delete.py @@ -0,0 +1,63 @@ +# tests/new_cli_test/test_delete.py + +import unittest +from unittest import mock + +from click.testing import CliRunner + +from sllm.clic import cli + + +class TestDeleteCommand(unittest.TestCase): + def setUp(self): + self.runner = CliRunner() + + @mock.patch("sllm._cli_utils.requests.post") + def test_delete_success(self, mock_post): + mock_post.return_value.status_code = 200 + mock_post.return_value.text = "OK" + + result = self.runner.invoke(cli, ["delete", "foo", "bar"]) + self.assertEqual(result.exit_code, 0) + self.assertIn("Model 'foo' deleted successfully.", result.output) + self.assertIn("Model 'bar' deleted successfully.", result.output) + + self.assertEqual(mock_post.call_count, 2) + + expected_calls = [ + mock.call( + "http://127.0.0.1:8343/delete/", + headers={"Content-Type": "application/json"}, + json={"model": "foo"}, + ), + mock.call( + "http://127.0.0.1:8343/delete/", + headers={"Content-Type": "application/json"}, + json={"model": "bar"}, + ), + ] + mock_post.assert_has_calls(expected_calls, any_order=False) + + @mock.patch("sllm._cli_utils.requests.post") + def test_delete_failure(self, mock_post): + mock_post.return_value.status_code = 404 + mock_post.return_value.text = "Not Found" + + result = self.runner.invoke(cli, ["delete", "nonexistent"]) + self.assertEqual(result.exit_code, 0) + self.assertIn("Failed to delete model 'nonexistent'", result.output) + + mock_post.assert_called_once_with( + "http://127.0.0.1:8343/delete/", + headers={"Content-Type": "application/json"}, + json={"model": "nonexistent"}, + ) + + def test_delete_no_models(self): + result = self.runner.invoke(cli, ["delete"]) + self.assertEqual(result.exit_code, 0) + self.assertIn("No model names provided for deletion", result.output) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/new_cli_test/test_deploy.py b/tests/new_cli_test/test_deploy.py new file mode 100644 index 0000000..7c049b8 --- /dev/null +++ b/tests/new_cli_test/test_deploy.py @@ -0,0 +1,135 @@ +# tests/new_cli_test/test_deploy.py + +import json +import tempfile +import unittest +from unittest import mock + +from click.testing import CliRunner + +from sllm.clic import cli + + +class TestDeployCommand(unittest.TestCase): + def setUp(self): + self.runner = CliRunner() + + @mock.patch("sllm._cli_utils.requests.post") + @mock.patch("sllm._cli_utils.read_config") + @mock.patch("sllm._cli_utils.os.path.exists", return_value=True) + def test_deploy_success_with_config( + self, mock_exists, mock_read, mock_post + ): + default_config = { + "model": "", + "backend": "vllm", + "num_gpus": 1, + "auto_scaling_config": { + "target": 1, + "min_instances": 1, + "max_instances": 5, + }, + "backend_config": { + "pretrained_model_name_or_path": "", + "device_map": "auto", + "torch_dtype": "float16", + }, + } + user_config = { + "backend": "transformers", + } + + mock_read.side_effect = [default_config, user_config] + mock_post.return_value.status_code = 200 + mock_post.return_value.text = "OK" + + with tempfile.NamedTemporaryFile("w+", suffix=".json") as f: + json.dump(user_config, f) + f.flush() + result = self.runner.invoke( + cli, + ["deploy", "--model", "facebook/opt-2.7b", "--config", f.name], + ) + + self.assertEqual(result.exit_code, 0) + self.assertIn( + "Model 'facebook/opt-2.7b' deployed successfully.", result.output + ) + + request_json = mock_post.call_args[1]["json"] + self.assertEqual(request_json["model"], "facebook/opt-2.7b") + self.assertEqual(request_json["backend"], "transformers") + self.assertEqual( + request_json["auto_scaling_config"]["min_instances"], 1 + ) + + @mock.patch("sllm._cli_utils.requests.post") + @mock.patch("sllm._cli_utils.read_config") + @mock.patch("sllm._cli_utils.os.path.exists", return_value=True) + def test_deploy_failure_status(self, mock_exists, mock_read, mock_post): + mock_read.return_value = { + "model": "", + "backend": "vllm", + } + mock_post.return_value.status_code = 500 + mock_post.return_value.text = "Internal Error" + + result = self.runner.invoke(cli, ["deploy", "--model", "m"]) + self.assertEqual(result.exit_code, 0) + self.assertIn("Deploy failed with status 500", result.output) + + self.assertEqual(mock_post.call_args[1]["json"]["model"], "m") + + @mock.patch("sllm._cli_utils.os.path.exists", return_value=False) + def test_deploy_missing_default_config(self, mock_exists): + result = self.runner.invoke(cli, ["deploy", "--model", "x"]) + self.assertEqual(result.exit_code, 0) + self.assertIn("Default config not found", result.output) + + @mock.patch("sllm._cli_utils.requests.post") + @mock.patch("sllm._cli_utils.read_config") + @mock.patch("sllm._cli_utils.os.path.exists", return_value=True) + def test_deploy_with_extra_flags(self, mock_exists, mock_read, mock_post): + mock_read.return_value = { + "model": "", + "backend": "vllm", + "auto_scaling_config": {}, + "backend_config": {}, + } + mock_post.return_value.status_code = 200 + + result = self.runner.invoke( + cli, + [ + "deploy", + "--model", + "facebook/opt-1.3b", + "--backend", + "transformers", + "--num-gpus", + "2", + "--target", + "3", + "--min-instances", + "1", + "--max-instances", + "5", + ], + ) + self.assertEqual(result.exit_code, 0) + + request_data = mock_post.call_args[1]["json"] + self.assertEqual(request_data["model"], "facebook/opt-1.3b") + self.assertEqual(request_data["backend"], "transformers") + self.assertEqual(request_data["num_gpus"], 2) + self.assertEqual(request_data["auto_scaling_config"]["target"], 3) + self.assertEqual( + request_data["auto_scaling_config"]["min_instances"], 1 + ) + self.assertEqual( + request_data["auto_scaling_config"]["max_instances"], 5 + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/new_cli_test/test_start.py b/tests/new_cli_test/test_start.py new file mode 100644 index 0000000..878ee5b --- /dev/null +++ b/tests/new_cli_test/test_start.py @@ -0,0 +1,39 @@ +# tests/new_cli_test/test_start.py + +import unittest +from unittest import mock + +from click.testing import CliRunner + +from sllm.clic import cli + + +class TestStartCommand(unittest.TestCase): + def setUp(self): + self.runner = CliRunner() + + @mock.patch("sllm._cli_utils.subprocess.run") + @mock.patch("sllm._cli_utils.os.path.exists", return_value=True) + def test_start_success(self, mock_exists, mock_run): + result = self.runner.invoke(cli, ["start"]) + self.assertEqual(result.exit_code, 0) + self.assertIn("SLLM server started successfully.", result.output) + + @mock.patch("sllm._cli_utils.os.path.exists", return_value=False) + def test_start_missing_compose(self, mock_exists): + result = self.runner.invoke(cli, ["start"]) + self.assertEqual(result.exit_code, 0) + self.assertIn("Cannot find docker-compose.yml", result.output) + + @mock.patch( + "sllm._cli_utils.subprocess.run", side_effect=Exception("docker error") + ) + @mock.patch("sllm._cli_utils.os.path.exists", return_value=True) + def test_start_subprocess_exception(self, mock_exists, mock_run): + result = self.runner.invoke(cli, ["start"]) + self.assertEqual(result.exit_code, 0) + self.assertIn("Failed to start services: docker error", result.output) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/new_cli_test/test_status.py b/tests/new_cli_test/test_status.py new file mode 100644 index 0000000..9f82117 --- /dev/null +++ b/tests/new_cli_test/test_status.py @@ -0,0 +1,61 @@ +# tests/new_cli_test/test_status.py + +import unittest +from unittest import mock + +import requests +from click.testing import CliRunner + +from sllm.clic import cli + + +class TestStatusCommand(unittest.TestCase): + def setUp(self): + self.runner = CliRunner() + + @mock.patch("sllm._cli_utils.requests.get") + def test_status_with_models(self, mock_get): + mock_resp = mock_get.return_value + mock_resp.status_code = 200 + mock_resp.json.return_value = {"models": [{"id": "a1"}, {"id": "b2"}]} + + result = self.runner.invoke(cli, ["status"]) + self.assertEqual(result.exit_code, 0) + self.assertIn("Model status retrieved", result.output) + self.assertIn("- a1", result.output) + self.assertIn("- b2", result.output) + + @mock.patch("sllm._cli_utils.requests.get") + def test_status_no_models(self, mock_get): + mock_resp = mock_get.return_value + mock_resp.status_code = 200 + mock_resp.json.return_value = {"models": []} + + result = self.runner.invoke(cli, ["status"]) + self.assertEqual(result.exit_code, 0) + self.assertIn("No models currently deployed.", result.output) + + @mock.patch("sllm._cli_utils.requests.get") + def test_status_http_error(self, mock_get): + mock_resp = mock_get.return_value + mock_resp.status_code = 500 + mock_resp.text = "Internal Error" + + result = self.runner.invoke(cli, ["status"]) + self.assertEqual(result.exit_code, 0) + self.assertIn("Failed with status 500", result.output) + + @mock.patch( + "sllm._cli_utils.requests.get", + side_effect=requests.exceptions.RequestException("ConnErr"), + ) + def test_status_exception(self, mock_get): + result = self.runner.invoke(cli, ["status"]) + self.assertEqual(result.exit_code, 0) + self.assertIn( + "[EXCEPTION] Failed to query status: ConnErr", result.output + ) + + +if __name__ == "__main__": + unittest.main() diff --git a/tests/quantize_test/quantize_test.py b/tests/quantize_test/quantize_test.py new file mode 100644 index 0000000..e64cbc7 --- /dev/null +++ b/tests/quantize_test/quantize_test.py @@ -0,0 +1,132 @@ +import json +import os +import unittest + +import pytest +import torch +from transformers import ( + AutoModelForCausalLM, + BitsAndBytesConfig, +) + +from sllm_store.transformers import load_model, save_model + + +@pytest.fixture(scope="session") +def model_name(): + return "facebook/opt-1.3b" + + +@pytest.fixture(scope="session") +def storage_path(): + model_folder = os.getenv("MODEL_FOLDER") + if model_folder: + return model_folder + return pytest.tmp_path_factory.mktemp("models") + + +@pytest.fixture +def model_path(model_name, storage_path): + return os.path.join(storage_path, model_name) + + +@pytest.fixture(scope="session", autouse=True) +def setup_models(storage_path): + """Save the original model before tests.""" + os.makedirs(storage_path, exist_ok=True) + model = AutoModelForCausalLM.from_pretrained("facebook/opt-1.3b") + save_model(model, os.path.join(storage_path, "facebook/opt-1.3b")) + + +# quantization configs +@pytest.fixture( + params=[ + BitsAndBytesConfig(load_in_4bit=True), + BitsAndBytesConfig(load_in_8bit=True), + BitsAndBytesConfig( + load_in_4bit=True, + bnb_4bit_compute_dtype=torch.float16, + bnb_4bit_quant_type="nf4", + ), + ], + ids=["fp4", "int8", "nf4"], +) +def get_quantization_config(request): + return request.param + + +# model configs +@pytest.fixture +def hf_model(get_quantization_config, model_name): + model = AutoModelForCausalLM.from_pretrained( + model_name, + quantization_config=get_quantization_config, + torch_dtype=torch.float16, + device_map="auto", + ) + yield model + del model + torch.cuda.empty_cache() + + +@pytest.fixture(params=[True, False], ids=["fully_parallel", "best_effort"]) +def sllm_model(get_quantization_config, model_name, storage_path, request): + model = load_model( + model_name, + storage_path=storage_path, + quantization_config=get_quantization_config, + torch_dtype=torch.float16, + fully_parallel=request.param, + device_map="auto", + ) + yield model + del model + torch.cuda.empty_cache() + + +# tests +def compare_state_dicts(transformers_model, sllm_model): + """Compares model state dicts with support for partial quantization.""" + transformers_params = transformers_model.state_dict() + sllm_params = sllm_model.state_dict() + + # ignore lm_head + ignore_candidates = {"lm_head", "lm_head.weight"} + ignore_keys = { + k + for k in ignore_candidates + if k in transformers_params and k in sllm_params + } + + # get comparable keys + transformers_keys = set(transformers_params.keys()) - ignore_keys + sllm_keys = set(sllm_params.keys()) - ignore_keys + assert ( + transformers_keys == sllm_keys + ), f"Key mismatch. Diff: {transformers_keys.symmetric_difference(sllm_keys)}" + + for key in transformers_keys: + t_param = transformers_params[key] + s_param = sllm_params[key] + + # Shape check + assert t_param.shape == s_param.shape, ( + f"Shape mismatch for {key}: " + f"Transformers={t_param.shape}, SLLM={s_param.shape}" + ) + + # Dtype check (accounts for mixed quantization) + assert s_param.dtype == t_param.dtype, ( + f"Dtype mismatch for {key}: " + f"Transformers={t_param.dtype}, SLLM={s_param.dtype}" + ) + + # individual parameter check + assert torch.allclose(t_param, s_param, rtol=1e-2, atol=1e-3), ( + f"Param mismatch for {key}: " + f"Transformers={t_param.dtype}, SLLM={s_param.dtype}", + ) + + +def test_valid_quantization(hf_model, sllm_model): + compare_state_dicts(hf_model, sllm_model) diff --git a/tests/replay_test/README.md b/tests/replay_test/README.md new file mode 100644 index 0000000..0080f83 --- /dev/null +++ b/tests/replay_test/README.md @@ -0,0 +1,62 @@ +# How to test replay command + +## Run the server + +1. Set the `MODEL_FOLDER` environment variable to specify the folder to store the models: + + ```sh + cd path/to/your-folder/ + mkdir models + export MODEL_FOLDER=$PWD/models/ + ``` + +2. Run the server: + + ```sh + bash examples/clean.sh + bash examples/run.sh + ``` + +## Run the test + +In another terminal: + +1. Configuration: + + Set the `LLM_SERVER_URL` environment variable to specify the server URL: + + ```sh + export LLM_SERVER_URL=http://127.0.0.1:8343 + ``` + + Install the package: + + ```sh + pip install . + pip install datasets + ``` + + +2. Run the test: + + Change directory to the test folder: + + ```sh + cd tests/replay_test/ + ``` + + Prepare the gsm8k dataset: + + ```sh + python convert_gsm8k.py + ``` + + Run the test: + ```sh + python deploy_dummy_models.py --num-models 7 + python generate_random_workload.py --num-models 7 --request-rate 1 --duration-minutes 1 + The `replay` subcommand is not implemented in the current version of `sllm`. + You can manually process the workload and dataset files using custom scripts or tools. + Example: + python process_workload.py --workload workload.json --dataset gsm8k_dataset.json + ``` diff --git a/tests/replay_test/convert_gsm8k.py b/tests/replay_test/convert_gsm8k.py new file mode 100644 index 0000000..9a1dece --- /dev/null +++ b/tests/replay_test/convert_gsm8k.py @@ -0,0 +1,64 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # +import json + +from datasets import load_dataset + + +def convert_gsm8k_to_custom_format(config="main", split="train"): + # Load the gsm8k dataset with the specified config + dataset = load_dataset("gsm8k", config, split=split) + + input_texts = [] + output_lengths = [] + + # Extract questions and answers, and compute output lengths + for example in dataset: + question = example["question"] + answer = example["answer"] + input_texts.append(question) + output_lengths.append(calculate_tokens(answer)) + + # Create the final format + formatted_data = { + "input_text": input_texts, + "output_length": output_lengths, + } + + return formatted_data + + +def calculate_tokens(answer): + return len( + answer.split() + ) # TODO: undecided on how to calculate output tokens + + +def main(): + # Convert the dataset + formatted_data = convert_gsm8k_to_custom_format() + + # Save to a JSON file + with open("gsm8k_dataset.json", "w") as f: + json.dump(formatted_data, f, indent=4) + + print("Converted dataset saved as gsm8k_dataset.json") + + +if __name__ == "__main__": + main() diff --git a/tests/replay_test/deploy_dummy_models.py b/tests/replay_test/deploy_dummy_models.py new file mode 100644 index 0000000..531fa5f --- /dev/null +++ b/tests/replay_test/deploy_dummy_models.py @@ -0,0 +1,112 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # +import argparse +import os +import random +import time + +import requests + +# Configuration template +config_template = { + "model": "", + "backend": "dummy", + "num_gpus": 1, + "auto_scaling_config": { + "metric": "concurrency", + "target": 1, + "min_instances": 0, + "max_instances": 10, + }, + "backend_config": { + "pretrained_model_name_or_path": "", + "device_map": "auto", + "torch_dtype": "float16", + }, +} + + +# Function to generate random auto scaling configuration +def generate_auto_scaling_config(): + target = random.randint(1, 10) + min_instances = 0 + max_instances = random.randint( + 10, 20 + ) # Ensure max_instances is greater than min_instances + return { + "metric": "concurrency", + "target": target, + "min_instances": min_instances, + "max_instances": max_instances, + } + + +# Function to generate configuration +def generate_config(model_name, pretrained_model_path): + config = config_template.copy() + config["model"] = model_name + config["backend_config"]["pretrained_model_name_or_path"] = ( + pretrained_model_path + ) + config["auto_scaling_config"] = generate_auto_scaling_config() + return config + + +# Function to deploy model using generated configuration +def deploy_model(config, url): + headers = {"Content-Type": "application/json"} + response = requests.post(url, headers=headers, json=config) + + if response.status_code == 200: + print(f"Successfully deployed model with config: {config['model']}") + else: + print(f"Failed to deploy model with config: {config['model']}") + print(response.text) + + +# Main script to generate and deploy models +def main(num_models, register_url): + models = [f"dummy_model_{i}" for i in range(1, num_models + 1)] + pretrained_paths = [f"dummy_path_{i}" for i in range(1, num_models + 1)] + + for index, (model_name, pretrained_path) in enumerate( + zip(models, pretrained_paths), start=1 + ): + config = generate_config(model_name, pretrained_path) + deploy_model(config, register_url) + time.sleep( + 1 + ) # Sleep for 1 second to avoid deploying two models at the same time + + +if __name__ == "__main__": + parser = argparse.ArgumentParser( + description="Deploy multiple models with generated configurations." + ) + parser.add_argument( + "-n", + "--num-models", + type=int, + required=True, + help="Number of models to deploy.", + ) + args = parser.parse_args() + register_url = ( + os.getenv("LLM_SERVER_URL", "http://127.0.0.1:8343") + "/register" + ) + main(args.num_models, register_url) diff --git a/tests/replay_test/generate_random_workload.py b/tests/replay_test/generate_random_workload.py new file mode 100644 index 0000000..5b22c36 --- /dev/null +++ b/tests/replay_test/generate_random_workload.py @@ -0,0 +1,77 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # +import argparse +import json +import random + + +def generate_random_workload(num_models, total_requests, duration_seconds): + workload = {f"dummy_model_{i}": [] for i in range(1, num_models + 1)} + + for _ in range(total_requests): + model_name = random.choice(list(workload.keys())) + timestamp = int(random.uniform(0, duration_seconds)) + workload[model_name].append(timestamp) + + # Sort timestamps for each model to simulate a real timeline of requests + for model in workload: + workload[model].sort() + + return workload + + +def main(): + parser = argparse.ArgumentParser( + description="Generate random workload.json for sllm-cli" + ) + parser.add_argument( + "--num-models", type=int, required=True, help="Number of models" + ) + parser.add_argument( + "--request-rate", + type=int, + required=True, + help="Request rate per second", + ) + parser.add_argument( + "--duration-minutes", + type=int, + required=True, + help="Duration of the workload in minutes", + ) + + args = parser.parse_args() + + num_models = args.num_models + request_rate = args.request_rate + duration_minutes = args.duration_minutes + duration_seconds = duration_minutes * 60 + total_requests = request_rate * duration_seconds + + workload = generate_random_workload( + num_models, total_requests, duration_seconds + ) + + with open("workload.json", "w") as f: + json.dump(workload, f, indent=4) + + print("Generated workload.json") + + +if __name__ == "__main__": + main() diff --git a/tests/utils.py b/tests/utils.py new file mode 100644 index 0000000..9351aaf --- /dev/null +++ b/tests/utils.py @@ -0,0 +1,30 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # +import unittest + +import torch + + +def is_cuda_available() -> bool: + return torch.cuda.is_available() + + +def require_cuda(test_case: unittest.TestCase): + return unittest.skipUnless(is_cuda_available(), "test requires a GPU")( + test_case + ) -- Gitee From 8dda9cc7e7d77df7b6d1aba74cc5f1e41834600d Mon Sep 17 00:00:00 2001 From: Jack Su Date: Sat, 2 Aug 2025 17:04:25 +0100 Subject: [PATCH 2/2] integrate npu migration code in sllm_store --- .gitignore | 2 + README.en.md | 12 + README.md | 12 + benchmarks/cann_benchmark_utils.py | 130 ++ sllm_store/CMakeLists.txt | 412 +++-- sllm_store/cmake/utils.cmake | 120 +- sllm_store/csrc/checkpoint/cann_ipc.cpp | 563 +++++++ sllm_store/csrc/checkpoint/cann_ipc.h | 111 ++ sllm_store/csrc/checkpoint/checkpoint.cpp | 469 ++++-- sllm_store/csrc/checkpoint/checkpoint.h | 39 +- sllm_store/csrc/checkpoint/checkpoint_py.cpp | 96 +- .../csrc/sllm_store/cann_error_handling.cpp | 37 + .../csrc/sllm_store/cann_error_handling.h | 44 + sllm_store/csrc/sllm_store/cann_memory.cpp | 81 + sllm_store/csrc/sllm_store/cann_memory.h | 49 + .../csrc/sllm_store/cann_memory_pool.cpp | 97 ++ sllm_store/csrc/sllm_store/cann_memory_pool.h | 45 + .../csrc/sllm_store/checkpoint_store.cpp | 633 +++++--- sllm_store/csrc/sllm_store/checkpoint_store.h | 46 +- sllm_store/csrc/sllm_store/error_handling.h | 5 + sllm_store/csrc/sllm_store/gpu_replica.cpp | 73 +- sllm_store/csrc/sllm_store/model.cpp | 1415 +++++++++++------ sllm_store/csrc/sllm_store/model.h | 97 +- .../csrc/sllm_store/pinned_memory_pool.cpp | 154 +- sllm_store/examples/cann_save_vllm_model.py | 136 ++ sllm_store/proto/storage.proto | 8 + sllm_store/requirements-build.txt | 3 +- sllm_store/requirements.txt | 15 +- sllm_store/setup.py | 170 +- sllm_store/sllm_store/cann_utils.py | 146 ++ sllm_store/sllm_store/cli.py | 425 +---- sllm_store/sllm_store/client.py | 11 + sllm_store/sllm_store/proto/storage_pb2.py | 100 +- .../sllm_store/proto/storage_pb2_grpc.py | 339 ++-- sllm_store/sllm_store/server.py | 9 +- sllm_store/sllm_store/torch.py | 66 +- sllm_store/sllm_store/transformers.py | 161 +- sllm_store/tests/python/test_cann_basic.py | 81 + .../tests/python/test_cann_load_model.py | 278 ++++ .../tests/python/test_cann_load_vllm_model.py | 29 + .../tests/python/test_cann_save_model.py | 25 + sllm_store/vllm_patch/sllm_load_npu.patch | 271 ++++ sllm_store/vllm_patch/vllm_ascend.patch | 46 + 43 files changed, 5102 insertions(+), 1959 deletions(-) create mode 100644 .gitignore create mode 100644 benchmarks/cann_benchmark_utils.py create mode 100644 sllm_store/csrc/checkpoint/cann_ipc.cpp create mode 100644 sllm_store/csrc/checkpoint/cann_ipc.h create mode 100644 sllm_store/csrc/sllm_store/cann_error_handling.cpp create mode 100644 sllm_store/csrc/sllm_store/cann_error_handling.h create mode 100644 sllm_store/csrc/sllm_store/cann_memory.cpp create mode 100644 sllm_store/csrc/sllm_store/cann_memory.h create mode 100644 sllm_store/csrc/sllm_store/cann_memory_pool.cpp create mode 100644 sllm_store/csrc/sllm_store/cann_memory_pool.h create mode 100644 sllm_store/examples/cann_save_vllm_model.py create mode 100644 sllm_store/sllm_store/cann_utils.py create mode 100644 sllm_store/tests/python/test_cann_basic.py create mode 100644 sllm_store/tests/python/test_cann_load_model.py create mode 100644 sllm_store/tests/python/test_cann_load_vllm_model.py create mode 100644 sllm_store/tests/python/test_cann_save_model.py create mode 100644 sllm_store/vllm_patch/sllm_load_npu.patch create mode 100644 sllm_store/vllm_patch/vllm_ascend.patch diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1bc2205 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +# vscode +.vscode/ \ No newline at end of file diff --git a/README.en.md b/README.en.md index cc01193..8fa0b8f 100644 --- a/README.en.md +++ b/README.en.md @@ -15,6 +15,18 @@ ServerlessLLM (`sllm`, pronounced "slim") is an open-source serverless framework Curious about how it works under the hood? Check out our [System Walkthrough](https://github.com/ServerlessLLM/ServerlessLLM/tree/main/blogs/serverless-llm-architecture) for a deep dive into the technical design—perfect if you're exploring your own research or building with ServerlessLLM. +## Features supported on GPU/NPU + +| Feature | GPU Support | NPU Support | +|--------------------------------------|-------------|----------------------| +| Storage Aware Scheduling with Docker Compose | ✅ | To Be Done | +| Live Migration of Inference Instances | ✅ | To Be Done | +| LoRA Serving | ✅ | To Be Done | +| Quantization | ✅ | To Be Done | +| sllm | ✅ | To Be Done | +| sllm_store | ✅ | ✅ | +| vLLM Support | ✅ | ✅ | + ## News - **[03/25]** We're excited to share that we'll be giving a ServerlessLLM tutorial at the SESAME workshop, co-located with ASPLOS/EuroSys 2025 in Rotterdam, Netherlands, on March 31. [Slides](https://docs.google.com/presentation/d/1ioGCVpsg0x3oCxX19EiE820aMiY22X5MG6jgImZ1W18/edit?usp=sharing) | [More info](https://sesame25.github.io/) diff --git a/README.md b/README.md index cc01193..8fa0b8f 100644 --- a/README.md +++ b/README.md @@ -15,6 +15,18 @@ ServerlessLLM (`sllm`, pronounced "slim") is an open-source serverless framework Curious about how it works under the hood? Check out our [System Walkthrough](https://github.com/ServerlessLLM/ServerlessLLM/tree/main/blogs/serverless-llm-architecture) for a deep dive into the technical design—perfect if you're exploring your own research or building with ServerlessLLM. +## Features supported on GPU/NPU + +| Feature | GPU Support | NPU Support | +|--------------------------------------|-------------|----------------------| +| Storage Aware Scheduling with Docker Compose | ✅ | To Be Done | +| Live Migration of Inference Instances | ✅ | To Be Done | +| LoRA Serving | ✅ | To Be Done | +| Quantization | ✅ | To Be Done | +| sllm | ✅ | To Be Done | +| sllm_store | ✅ | ✅ | +| vLLM Support | ✅ | ✅ | + ## News - **[03/25]** We're excited to share that we'll be giving a ServerlessLLM tutorial at the SESAME workshop, co-located with ASPLOS/EuroSys 2025 in Rotterdam, Netherlands, on March 31. [Slides](https://docs.google.com/presentation/d/1ioGCVpsg0x3oCxX19EiE820aMiY22X5MG6jgImZ1W18/edit?usp=sharing) | [More info](https://sesame25.github.io/) diff --git a/benchmarks/cann_benchmark_utils.py b/benchmarks/cann_benchmark_utils.py new file mode 100644 index 0000000..39d842b --- /dev/null +++ b/benchmarks/cann_benchmark_utils.py @@ -0,0 +1,130 @@ +# ---------------------------------------------------------------------------- # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # +# # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # +# # +# You may obtain a copy of the License at # +# # +# http://www.apache.org/licenses/LICENSE-2.0 # +# # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # +# ---------------------------------------------------------------------------- # +import gc +import os +import time + +import torch +from torch import nn +import torch_npu +from tqdm import tqdm +from transformers import AutoModelForCausalLM, AutoTokenizer + +from sllm_store.transformers import load_model + + +def _warmup_npu(): + num_npus = torch_npu.npu.device_count() + print(f"Warming up {num_npus} NPUs") + for i in tqdm(range(num_npus)): + torch.ones(1).to(f"npu:{i}") + torch_npu.npu.synchronize() + + +def _warmup_inference(): + print("Warming up inference") + model_name = "facebook/opt-6.7b" + model = AutoModelForCausalLM.from_pretrained( + model_name, torch_dtype=torch.float16, device_map="auto" + ) + prompts = [ + "The quick brown fox jumps over the lazy dog.", + ] + tokenizer = AutoTokenizer.from_pretrained(model_name) + inputs = tokenizer(prompts, return_tensors="pt").to("npu") + with torch.no_grad(): + outputs = model.generate(**inputs, max_new_tokens=50) + del outputs, tokenizer, inputs, model + gc.collect() + torch_npu.npu.empty_cache() + + +def benchmark_inference(model: nn.Module, model_path: str): + # Inference + prompts = [ + "The quick brown fox jumps over the lazy dog.", + ] + tokenizer = AutoTokenizer.from_pretrained(model_path) + inputs = tokenizer(prompts, return_tensors="pt").to("npu") + with torch.no_grad(): + start_time = time.time() + outputs = model.generate(**inputs, max_new_tokens=50) + end_time = time.time() + output_text = tokenizer.decode(outputs[0], skip_special_tokens=True) + end_to_end_time = end_time - start_time + throughput = outputs.shape[1] / end_to_end_time + + del outputs, tokenizer, inputs + gc.collect() + torch_npu.npu.empty_cache() + + return end_to_end_time, throughput, output_text + + +def measure( + model_name: str, model_format: str, model_dir: str, loading_order: list +): + results = [] + print( + f"Measuring loading time for {model_format} model={model_name}, repeating {len(loading_order)} times" + ) + # loading_order = torch.randperm(num_replicas) + for model_idx in loading_order: + print(f"Loading {model_name}_{model_idx}") + model_record = {"model_name": f"{model_name}_{model_idx}"} + + # Model Loading + if model_format == "sllm": + model_path = os.path.join(model_dir, f"{model_name}_{model_idx}") + start_time = time.time() + model = load_model( + f"{model_name}_{model_idx}", + storage_path=model_dir, + device_map="auto", + torch_dtype=torch.float16, + ) + end_time = time.time() + elif model_format == "safetensors": + model_path = os.path.join( + model_dir, f"{model_name}_safetensors_{model_idx}" + ) + start_time = time.time() + model = AutoModelForCausalLM.from_pretrained( + model_path, + torch_dtype=torch.float16, + device_map="auto", + ) + end_time = time.time() + model_record["loading_time"] = end_time - start_time + + # Inference + end_to_end_time, throughput, output_text = benchmark_inference( + model, model_path + ) + + model_record["end_to_end_time"] = end_to_end_time + model_record["throughput"] = throughput + model_record["output_text"] = output_text + + results.append(model_record) + + del model + gc.collect() + torch_npu.npu.empty_cache() + + return results \ No newline at end of file diff --git a/sllm_store/CMakeLists.txt b/sllm_store/CMakeLists.txt index 65eb0f0..9359d61 100644 --- a/sllm_store/CMakeLists.txt +++ b/sllm_store/CMakeLists.txt @@ -1,5 +1,27 @@ cmake_minimum_required(VERSION 3.20) +# Find torch directory - hard coded conda environment +set(Torch_DIR /root/miniconda3/envs/sllm-worker/lib/python3.10/site-packages/torch/share/cmake/Torch) +find_package(Torch REQUIRED) +include_directories(${TORCH_INCLUDE_DIRS}) +link_directories(${TORCH_LIBRARY_DIRS}) + +# Find torch-npu directory - hard coded conda environment +find_library(TORCH_NPU_LIB torch_npu + PATHS ${TORCH_INSTALL_PREFIX}/lib + /root/miniconda3/envs/sllm-worker/lib/python3.10/site-packages/torch_npu/lib # Adjust to your env + NO_DEFAULT_PATH) + +if(NOT TORCH_NPU_LIB) + message(FATAL_ERROR "libtorch_npu.so not found. Ensure torch_npu is installed.") +endif() + +if(TORCH_NPU_LIB) + get_filename_component(TORCH_NPU_LIB_DIR ${TORCH_NPU_LIB} DIRECTORY) + set(TORCH_NPU_DIR ${TORCH_NPU_LIB_DIR}/..) + include_directories(${TORCH_NPU_DIR}/include) +endif() + # Set the project name project(storage LANGUAGES CXX) @@ -7,6 +29,11 @@ project(storage LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) option(BUILD_SLLM_TESTS "Build tests" OFF) +# Build backend options +option(USE_CANN "Enable CANN support" OFF) +option(USE_CUDA "Enable CUDA support" OFF) +option(USE_ROCM "Enable ROCm support" OFF) +option(USE_CPU_ONLY "Build CPU-only version" OFF) # Disable other tests set(BUILD_TESTING OFF) @@ -26,24 +53,99 @@ set(FETCHCONTENT_QUIET OFF) FetchContent_MakeAvailable(glog) FetchContent_MakeAvailable(googletest) -find_package(CUDAToolkit QUIET) -find_package(HIP QUIET) - -# set CUDA or HIP -if (CUDAToolkit_FOUND) - message(STATUS "CUDA found") - set(CUDA_SUPPORTED_ARCHS "7.0;7.5;8.0;8.6;8.9;9.0") - set(SLLM_STORE_GPU_LANG "CUDA") - enable_language(CUDA) -elseif (HIP_FOUND) - message(STATUS "HIP found") - set(HIP_SUPPORTED_ARCHS "gfx906;gfx908;gfx90a;gfx940;gfx941;gfx942;gfx1030;gfx1100") - set(SLLM_STORE_GPU_LANG "HIP") - enable_language(HIP) +# Initialize backend variables +set(BACKEND_FOUND FALSE) +set(SLLM_STORE_GPU_LANG "NONE") + +# Check for explicit backend selection +if(USE_CPU_ONLY) + message(STATUS "Building CPU-only version") + set(BACKEND_FOUND TRUE) + set(SLLM_STORE_GPU_LANG "CPU") +elseif(USE_CANN) + # Check for CANN toolkit + if(DEFINED ASCEND_TOOLKIT_HOME) + set(CANN_TOOLKIT_ROOT ${ASCEND_TOOLKIT_HOME}) + else() + set(CANN_TOOLKIT_ROOT $ENV{ASCEND_TOOLKIT_HOME}) + endif() + + if(NOT CANN_TOOLKIT_ROOT) + set(CANN_TOOLKIT_ROOT "/usr/local/Ascend/ascend-toolkit/8.0.0") + endif() + + if(EXISTS "${CANN_TOOLKIT_ROOT}/include/acl/acl.h") + message(STATUS "CANN found at ${CANN_TOOLKIT_ROOT}") + set(BACKEND_FOUND TRUE) + set(SLLM_STORE_GPU_LANG "CANN") + add_definitions(-DUSE_CANN) + include_directories(${CANN_TOOLKIT_ROOT}/include) + link_directories(${CANN_TOOLKIT_ROOT}/lib64) + else() + message(FATAL_ERROR "CANN toolkit not found at ${CANN_TOOLKIT_ROOT}") + endif() +elseif(USE_CUDA) + find_package(CUDAToolkit QUIET) + if(CUDAToolkit_FOUND) + message(STATUS "CUDA found") + set(CUDA_SUPPORTED_ARCHS "7.0;7.5;8.0;8.6;8.9;9.0") + set(BACKEND_FOUND TRUE) + set(SLLM_STORE_GPU_LANG "CUDA") + enable_language(CUDA) + else() + message(FATAL_ERROR "CUDA toolkit not found") + endif() +elseif(USE_ROCM) + find_package(HIP QUIET) + if(HIP_FOUND) + message(STATUS "HIP found") + set(HIP_SUPPORTED_ARCHS "gfx906;gfx908;gfx90a;gfx940;gfx941;gfx942;gfx1030;gfx1100") + set(BACKEND_FOUND TRUE) + set(SLLM_STORE_GPU_LANG "HIP") + enable_language(HIP) + else() + message(FATAL_ERROR "ROCm/HIP not found") + endif() else() - message(FATAL_ERROR "Neither CUDA nor HIP found") + # Auto-detection fallback (legacy behavior) + find_package(CUDAToolkit QUIET) + find_package(HIP QUIET) + + # Check for CANN toolkit + set(CANN_TOOLKIT_ROOT $ENV{ASCEND_TOOLKIT_HOME}) + if(NOT CANN_TOOLKIT_ROOT) + set(CANN_TOOLKIT_ROOT "/usr/local/Ascend/ascend-toolkit/latest") + endif() + + if(EXISTS "${CANN_TOOLKIT_ROOT}/include/acl/acl.h") + message(STATUS "CANN found at ${CANN_TOOLKIT_ROOT} (auto-detected)") + set(BACKEND_FOUND TRUE) + set(SLLM_STORE_GPU_LANG "CANN") + add_definitions(-DUSE_CANN) + include_directories(${CANN_TOOLKIT_ROOT}/include) + link_directories(${CANN_TOOLKIT_ROOT}/lib64) + elseif (CUDAToolkit_FOUND) + message(STATUS "CUDA found (auto-detected)") + set(CUDA_SUPPORTED_ARCHS "7.0;7.5;8.0;8.6;8.9;9.0") + set(BACKEND_FOUND TRUE) + set(SLLM_STORE_GPU_LANG "CUDA") + enable_language(CUDA) + elseif (HIP_FOUND) + message(STATUS "HIP found (auto-detected)") + set(HIP_SUPPORTED_ARCHS "gfx906;gfx908;gfx90a;gfx940;gfx941;gfx942;gfx1030;gfx1100") + set(BACKEND_FOUND TRUE) + set(SLLM_STORE_GPU_LANG "HIP") + enable_language(HIP) + else() + message(STATUS "No GPU backend found, building CPU-only version") + set(BACKEND_FOUND TRUE) + set(SLLM_STORE_GPU_LANG "CPU") + endif() endif() +if(NOT BACKEND_FOUND) + message(FATAL_ERROR "No backend found or enabled") +endif() # Adapted from https://github.com/vllm-project/vllm/blob/a1242324c99ff8b1e29981006dfb504da198c7c3/CMakeLists.txt include(${CMAKE_CURRENT_LIST_DIR}/cmake/utils.cmake) @@ -52,7 +154,7 @@ include(${CMAKE_CURRENT_LIST_DIR}/cmake/utils.cmake) # Supported python versions. These versions will be searched in order, the # first match will be selected. These should be kept in sync with setup.py. # -set(PYTHON_SUPPORTED_VERSIONS "3.9" "3.10" "3.11" "3.12") +set(PYTHON_SUPPORTED_VERSIONS "3.8" "3.9" "3.10" "3.11") # # Try to find python package with an executable that exactly matches @@ -66,47 +168,78 @@ else() " before running cmake configure.") endif() -# -# Update cmake's `CMAKE_PREFIX_PATH` with torch location. -# -append_cmake_prefix_path("torch" "torch.utils.cmake_prefix_path") - -# -# Import torch cmake configuration. -# Torch also imports CUDA (and partially HIP) languages with some customizations, -# so there is no need to do this explicitly with check_language/enable_language, -# etc. -# -find_package(Torch REQUIRED) - -# -# Normally `torch.utils.cpp_extension.CUDAExtension` would add -# `libtorch_python.so` for linking against an extension. Torch's cmake -# configuration does not include this library (presumably since the cmake -# config is used for standalone C++ binaries that link against torch). -# The `libtorch_python.so` library defines some of the glue code between -# torch/python via pybind and is required by SLLM_STORE extensions for this -# reason. So, add it by manually with `find_library` using torch's -# installed library path. -# -find_library(torch_python_LIBRARY torch_python PATHS - "${TORCH_INSTALL_PREFIX}/lib") - -# -# Override the GPU architectures detected by cmake/torch and filter them by -# the supported versions for the current language. -# The final set of arches is stored in `SLLM_STORE_GPU_ARCHES`. -# -override_gpu_arches(SLLM_STORE_GPU_ARCHES -${SLLM_STORE_GPU_LANG} -"${${SLLM_STORE_GPU_LANG}_SUPPORTED_ARCHS}") - -# -# Query torch for additional GPU compilation flags for the given -# `SLLM_STORE_GPU_LANG`. -# The final set of arches is stored in `SLLM_STORE_GPU_FLAGS`. -# -get_torch_gpu_compiler_flags(SLLM_STORE_GPU_FLAGS ${SLLM_STORE_GPU_LANG}) +# Only try to find and configure torch for GPU backends +if(NOT SLLM_STORE_GPU_LANG STREQUAL "CPU") + # + # Update cmake's `CMAKE_PREFIX_PATH` with torch location. + # + append_cmake_prefix_path("torch" "torch.utils.cmake_prefix_path") + + # + # Import torch cmake configuration. + # Torch also imports CUDA (and partially HIP) languages with some customizations, + # so there is no need to do this explicitly with check_language/enable_language, + # etc. + # + find_package(Torch REQUIRED) + + # + # Normally `torch.utils.cpp_extension.CUDAExtension` would add + # `libtorch_python.so` for linking against an extension. Torch's cmake + # configuration does not include this library (presumably since the cmake + # config is used for standalone C++ binaries that link against torch). + # The `libtorch_python.so` library defines some of the glue code between + # torch/python via pybind and is required by SLLM_STORE extensions for this + # reason. So, add it by manually with `find_library` using torch's + # installed library path. + # + find_library(torch_python_LIBRARY torch_python PATHS + "${TORCH_INSTALL_PREFIX}/lib") + + # + # Override the GPU architectures detected by cmake/torch and filter them by + # the supported versions for the current language. + # The final set of arches is stored in `SLLM_STORE_GPU_ARCHES`. + # + override_gpu_arches(SLLM_STORE_GPU_ARCHES + ${SLLM_STORE_GPU_LANG} + "${${SLLM_STORE_GPU_LANG}_SUPPORTED_ARCHS}") + + # + # Query torch for additional GPU compilation flags for the given + # `SLLM_STORE_GPU_LANG`. + # The final set of arches is stored in `SLLM_STORE_GPU_FLAGS`. + # + get_torch_gpu_compiler_flags(SLLM_STORE_GPU_FLAGS ${SLLM_STORE_GPU_LANG}) +else() + # For CPU-only builds, we still need basic torch for some functionality + # but skip GPU-specific configuration + find_package(Torch QUIET) + if(NOT Torch_FOUND) + message(WARNING "Torch not found, some functionality may be limited") + endif() + + # Find pybind11 for CPU-only builds + find_package(pybind11 QUIET) + if(NOT pybind11_FOUND) + # Try to find pybind11 via Python + execute_process( + COMMAND ${Python_EXECUTABLE} -c "import pybind11; print(pybind11.get_cmake_dir())" + OUTPUT_VARIABLE pybind11_DIR + OUTPUT_STRIP_TRAILING_WHITESPACE + ) + if(pybind11_DIR) + find_package(pybind11 PATHS ${pybind11_DIR}) + endif() + endif() + + if(NOT pybind11_FOUND) + message(FATAL_ERROR "pybind11 is required for CPU-only builds") + endif() + + set(SLLM_STORE_GPU_ARCHES "") + set(SLLM_STORE_GPU_FLAGS "") +endif() # # Define extension targets @@ -122,6 +255,7 @@ get_torch_gpu_compiler_flags(SLLM_STORE_GPU_FLAGS ${SLLM_STORE_GPU_LANG}) set(SLLM_STORE_EXT_SRC "csrc/checkpoint/aligned_buffer.cpp" + "csrc/checkpoint/cann_ipc.cpp" "csrc/checkpoint/checkpoint.cpp" "csrc/checkpoint/checkpoint_py.cpp" "csrc/checkpoint/tensor_writer.cpp" @@ -140,17 +274,57 @@ set(SLLM_STORE_CXX_EXT_SRC "csrc/checkpoint/aligned_buffer.cpp" "csrc/checkpoint/checkpoint_py.cpp" "csrc/checkpoint/tensor_writer.cpp" + "csrc/checkpoint/cann_ipc.cpp" ) -define_gpu_extension_target( - _C - DESTINATION sllm_store - LANGUAGE ${SLLM_STORE_GPU_LANG} - SOURCES ${SLLM_STORE_EXT_SRC} - CXX_SRCS ${SLLM_STORE_CXX_EXT_SRC} - COMPILE_FLAGS ${SLLM_STORE_GPU_FLAGS} - ARCHITECTURES ${SLLM_STORE_GPU_ARCHES} - WITH_SOABI) +# Find CANN libraries if using CANN backend +if(SLLM_STORE_GPU_LANG STREQUAL "CANN") + find_library(ASCENDCL_LIB ascendcl PATHS ${CMAKE_LIBRARY_PATH} $ENV{ASCEND_TOOLKIT_HOME}/lib64 /usr/local/Ascend/ascend-toolkit/latest/lib64) + find_library(ACL_RETR_LIB acl_retr PATHS ${CMAKE_LIBRARY_PATH} $ENV{ASCEND_TOOLKIT_HOME}/lib64 /usr/local/Ascend/ascend-toolkit/latest/lib64) + find_library(ACL_CBLAS_LIB acl_cblas PATHS ${CMAKE_LIBRARY_PATH} $ENV{ASCEND_TOOLKIT_HOME}/lib64 /usr/local/Ascend/ascend-toolkit/latest/lib64) + find_library(ACL_DVPP_LIB acl_dvpp PATHS ${CMAKE_LIBRARY_PATH} $ENV{ASCEND_TOOLKIT_HOME}/lib64 /usr/local/Ascend/ascend-toolkit/latest/lib64) + find_library(RUNTIME_LIB runtime PATHS ${CMAKE_LIBRARY_PATH} $ENV{ASCEND_TOOLKIT_HOME}/lib64 /usr/local/Ascend/ascend-toolkit/latest/lib64) + + if(NOT ASCENDCL_LIB) + message(FATAL_ERROR "Could not find libascendcl.so. Please set ASCEND_TOOLKIT_HOME or add CANN lib path to CMAKE_LIBRARY_PATH") + endif() +endif() + +# Define libraries for _C extension based on GPU language +if(SLLM_STORE_GPU_LANG STREQUAL "CANN") + set(SLLM_STORE_C_LIBRARIES + glog::glog + ${ASCENDCL_LIB} + ${RUNTIME_LIB} + ${TORCH_NPU_LIB} + ) +else() + set(SLLM_STORE_C_LIBRARIES + glog::glog + ) +endif() + +# Only define GPU extension if not CPU-only +if(NOT SLLM_STORE_GPU_LANG STREQUAL "CPU") + define_gpu_extension_target( + _C + DESTINATION sllm_store + LANGUAGE ${SLLM_STORE_GPU_LANG} + SOURCES ${SLLM_STORE_EXT_SRC} + CXX_SRCS ${SLLM_STORE_CXX_EXT_SRC} + COMPILE_FLAGS ${SLLM_STORE_GPU_FLAGS} + ARCHITECTURES ${SLLM_STORE_GPU_ARCHES} + LIBRARIES ${SLLM_STORE_C_LIBRARIES} + WITH_SOABI) +else() + # For CPU-only build, create a simple library target + pybind11_add_module(_C ${SLLM_STORE_EXT_SRC}) + target_link_libraries(_C PRIVATE glog::glog) + set_target_properties(_C PROPERTIES + OUTPUT_NAME "_C" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/sllm_store" + ) +endif() # # _checkpoint_store extension @@ -163,18 +337,63 @@ find_package(Threads REQUIRED) # Define source files used in CHECKPOINT_STORE # -set(CHECKPOINT_STORE_SOURCES - "csrc/sllm_store/binary_utils.cpp" - "csrc/sllm_store/checkpoint_store.cpp" - "csrc/sllm_store/checkpoint_store_py.cpp" - "csrc/sllm_store/cuda_memory.cpp" - "csrc/sllm_store/cuda_memory_pool.cpp" - "csrc/sllm_store/gpu_replica.cpp" - "csrc/sllm_store/memory_state.cpp" - "csrc/sllm_store/model.cpp" - "csrc/sllm_store/pinned_memory.cpp" - "csrc/sllm_store/pinned_memory_pool.cpp" -) +if (SLLM_STORE_GPU_LANG STREQUAL "CANN") + set(CHECKPOINT_STORE_SOURCES + "csrc/sllm_store/binary_utils.cpp" + "csrc/sllm_store/checkpoint_store.cpp" + "csrc/sllm_store/checkpoint_store_py.cpp" + "csrc/sllm_store/cann_memory.cpp" + "csrc/sllm_store/cann_memory_pool.cpp" + "csrc/sllm_store/gpu_replica.cpp" + "csrc/sllm_store/memory_state.cpp" + "csrc/sllm_store/model.cpp" + "csrc/sllm_store/pinned_memory.cpp" + "csrc/sllm_store/pinned_memory_pool.cpp" + "csrc/checkpoint/cann_ipc.cpp" + ) + + set(CHECKPOINT_STORE_LIBRARIES + Threads::Threads + glog::glog + ${ASCENDCL_LIB} + ${ACL_RETR_LIB} + ${ACL_CBLAS_LIB} + ${ACL_DVPP_LIB} + ${RUNTIME_LIB} + ${TORCH_NPU_LIB} + ) +elseif(SLLM_STORE_GPU_LANG STREQUAL "CPU") + set(CHECKPOINT_STORE_SOURCES + "csrc/sllm_store/binary_utils.cpp" + "csrc/sllm_store/checkpoint_store.cpp" + "csrc/sllm_store/checkpoint_store_py.cpp" + "csrc/sllm_store/memory_state.cpp" + "csrc/sllm_store/model.cpp" + "csrc/sllm_store/pinned_memory.cpp" + "csrc/sllm_store/pinned_memory_pool.cpp" + ) + + set(CHECKPOINT_STORE_LIBRARIES + Threads::Threads + glog::glog) +else() + set(CHECKPOINT_STORE_SOURCES + "csrc/sllm_store/binary_utils.cpp" + "csrc/sllm_store/checkpoint_store.cpp" + "csrc/sllm_store/checkpoint_store_py.cpp" + "csrc/sllm_store/cuda_memory.cpp" + "csrc/sllm_store/cuda_memory_pool.cpp" + "csrc/sllm_store/gpu_replica.cpp" + "csrc/sllm_store/memory_state.cpp" + "csrc/sllm_store/model.cpp" + "csrc/sllm_store/pinned_memory.cpp" + "csrc/sllm_store/pinned_memory_pool.cpp" + ) + + set(CHECKPOINT_STORE_LIBRARIES + Threads::Threads + glog::glog) +endif() # # Define pure CXX files used in CHECKPOINT_STORE (files without CUDA code) @@ -185,22 +404,31 @@ set(CHECKPOINT_STORE_CXX_SOURCES "csrc/sllm_store/binary_utils.cpp" "csrc/sllm_store/memory_state.cpp" "csrc/sllm_store/pinned_memory.cpp" + "csrc/checkpoint/cann_ipc.cpp" ) -set(CHECKPOINT_STORE_LIBRARIES - Threads::Threads - glog::glog) - -define_gpu_extension_target( - _checkpoint_store - DESTINATION sllm_store - LANGUAGE ${SLLM_STORE_GPU_LANG} - SOURCES ${CHECKPOINT_STORE_SOURCES} - CXX_SRCS ${CHECKPOINT_STORE_CXX_SOURCES} - COMPILE_FLAGS ${SLLM_STORE_GPU_FLAGS} - ARCHITECTURES ${SLLM_STORE_GPU_ARCHES} - LIBRARIES ${CHECKPOINT_STORE_LIBRARIES} - WITH_SOABI) +# Define checkpoint store extension +if(NOT SLLM_STORE_GPU_LANG STREQUAL "CPU") + define_gpu_extension_target( + _checkpoint_store + DESTINATION sllm_store + LANGUAGE ${SLLM_STORE_GPU_LANG} + SOURCES ${CHECKPOINT_STORE_SOURCES} + CXX_SRCS ${CHECKPOINT_STORE_CXX_SOURCES} + COMPILE_FLAGS ${SLLM_STORE_GPU_FLAGS} + ARCHITECTURES ${SLLM_STORE_GPU_ARCHES} + LIBRARIES ${CHECKPOINT_STORE_LIBRARIES} + WITH_SOABI) + target_link_directories(_checkpoint_store PRIVATE ascendcl) +else() + # For CPU-only build, create a simple library target + pybind11_add_module(_checkpoint_store ${CHECKPOINT_STORE_SOURCES}) + target_link_libraries(_checkpoint_store PRIVATE ${CHECKPOINT_STORE_LIBRARIES}) + set_target_properties(_checkpoint_store PROPERTIES + OUTPUT_NAME "_checkpoint_store" + LIBRARY_OUTPUT_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/sllm_store" + ) +endif() # Enable testing if the option is ON if(BUILD_SLLM_TESTS) diff --git a/sllm_store/cmake/utils.cmake b/sllm_store/cmake/utils.cmake index 2fac3d2..0ed3f95 100644 --- a/sllm_store/cmake/utils.cmake +++ b/sllm_store/cmake/utils.cmake @@ -3,7 +3,7 @@ # Attempt to find the python package that uses the same python executable as # `EXECUTABLE` and is one of the `SUPPORTED_VERSIONS`. # -macro (find_python_from_executable EXECUTABLE SUPPORTED_VERSIONS) +macro(find_python_from_executable EXECUTABLE SUPPORTED_VERSIONS) file(REAL_PATH ${EXECUTABLE} EXECUTABLE) set(Python_EXECUTABLE ${EXECUTABLE}) find_package(Python COMPONENTS Interpreter Development.Module) @@ -21,11 +21,11 @@ macro (find_python_from_executable EXECUTABLE SUPPORTED_VERSIONS) endmacro() # -# Run `EXPR` in python. The standard output of python is stored in `OUT` and -# has trailing whitespace stripped. If an error is encountered when running +# Run `EXPR` in python. The standard output of python is stored in `OUT` and +# has trailing whitespace stripped. If an error is encountered when running # python, a fatal message `ERR_MSG` is issued. # -function (run_python OUT EXPR ERR_MSG) +function(run_python OUT EXPR ERR_MSG) execute_process( COMMAND "${Python_EXECUTABLE}" "-c" "${EXPR}" @@ -42,7 +42,7 @@ endfunction() # Run `EXPR` in python after importing `PKG`. Use the result of this to extend # `CMAKE_PREFIX_PATH` so the torch cmake configuration can be imported. -macro (append_cmake_prefix_path PKG EXPR) +macro(append_cmake_prefix_path PKG EXPR) run_python(_PREFIX_PATH "import ${PKG}; print(${EXPR})" "Failed to locate ${PKG} path") list(APPEND CMAKE_PREFIX_PATH ${_PREFIX_PATH}) @@ -56,7 +56,7 @@ endmacro() # CXX_SRCS - List of C++ source files that should not be hipified. (e.g., no CUDA code) # CXX_SRCS are removed from the list of ORIG_SRCS, in order to fix issue #206. # -function (hipify_sources_target OUT_SRCS NAME ORIG_SRCS CXX_SRCS) +function(hipify_sources_target OUT_SRCS NAME ORIG_SRCS CXX_SRCS) # # Split into C++ and non-C++ (i.e. CUDA) sources. # @@ -73,12 +73,12 @@ function (hipify_sources_target OUT_SRCS NAME ORIG_SRCS CXX_SRCS) # `CMAKE_CURRENT_BINARY_DIR` directory rather than the original csrc dir. # set(HIP_SRCS) - foreach (SRC ${SRCS}) + foreach(SRC ${SRCS}) set(ORIGINAL_SRC ${SRC}) - string(REGEX REPLACE "\.cu$" "\.hip" SRC ${SRC}) + string(REGEX REPLACE "\\.cu$" "\\.hip" SRC ${SRC}) string(REGEX REPLACE "cuda" "hip" SRC ${SRC}) if(${SRC} STREQUAL ${ORIGINAL_SRC}) - string(REGEX REPLACE "\.cpp$" "_hip\.cpp" SRC ${SRC}) + string(REGEX REPLACE "\\.cpp$" "_hip\\.cpp" SRC ${SRC}) endif() list(APPEND HIP_SRCS "${CMAKE_CURRENT_BINARY_DIR}/${SRC}") endforeach() @@ -99,8 +99,8 @@ endfunction() # # Get additional GPU compiler flags from torch. # -function (get_torch_gpu_compiler_flags OUT_GPU_FLAGS GPU_LANG) - if (${GPU_LANG} STREQUAL "CUDA") +function(get_torch_gpu_compiler_flags OUT_GPU_FLAGS GPU_LANG) + if(${GPU_LANG} STREQUAL "CUDA") # # Get common NVCC flags from torch. # @@ -108,10 +108,10 @@ function (get_torch_gpu_compiler_flags OUT_GPU_FLAGS GPU_LANG) "from torch.utils.cpp_extension import COMMON_NVCC_FLAGS; print(';'.join(COMMON_NVCC_FLAGS))" "Failed to determine torch nvcc compiler flags") - if (CUDA_VERSION VERSION_GREATER_EQUAL 11.8) + if(CUDA_VERSION VERSION_GREATER_EQUAL 11.8) list(APPEND GPU_FLAGS "-DENABLE_FP8") endif() - if (CUDA_VERSION VERSION_GREATER_EQUAL 12.0) + if(CUDA_VERSION VERSION_GREATER_EQUAL 12.0) list(REMOVE_ITEM GPU_FLAGS "-D__CUDA_NO_HALF_OPERATORS__" "-D__CUDA_NO_HALF_CONVERSIONS__" @@ -140,7 +140,7 @@ endfunction() # Macro for converting a `gencode` version number to a cmake version number. macro(string_to_ver OUT_VER IN_STR) - string(REGEX REPLACE "\([0-9]+\)\([0-9]\)" "\\1.\\2" ${OUT_VER} ${IN_STR}) + string(REGEX REPLACE "([0-9]+)([0-9])" "\\1.\\2" ${OUT_VER} ${IN_STR}) endmacro() # @@ -154,7 +154,7 @@ macro(override_gpu_arches GPU_ARCHES GPU_LANG GPU_SUPPORTED_ARCHES) set(_GPU_SUPPORTED_ARCHES_LIST ${GPU_SUPPORTED_ARCHES} ${ARGN}) message(STATUS "${GPU_LANG} supported arches: ${_GPU_SUPPORTED_ARCHES_LIST}") - if (${GPU_LANG} STREQUAL "HIP") + if(${GPU_LANG} STREQUAL "HIP") # # `GPU_ARCHES` controls the `--offload-arch` flags. # `CMAKE_HIP_ARCHITECTURES` is set up by torch and can be controlled @@ -166,8 +166,8 @@ macro(override_gpu_arches GPU_ARCHES GPU_LANG GPU_SUPPORTED_ARCHES) # set the module architecture flags. # set(${GPU_ARCHES}) - foreach (_ARCH ${CMAKE_HIP_ARCHITECTURES}) - if (_ARCH IN_LIST _GPU_SUPPORTED_ARCHES_LIST) + foreach(_ARCH ${CMAKE_HIP_ARCHITECTURES}) + if(_ARCH IN_LIST _GPU_SUPPORTED_ARCHES_LIST) list(APPEND ${GPU_ARCHES} ${_ARCH}) endif() endforeach() @@ -183,13 +183,13 @@ macro(override_gpu_arches GPU_ARCHES GPU_LANG GPU_SUPPORTED_ARCHES) # Setup/process CUDA arch flags. # # The torch cmake setup hardcodes the detected architecture flags in - # `CMAKE_CUDA_FLAGS`. Since `CMAKE_CUDA_FLAGS` is a "global" variable, it + # `CMAKE_CUDA_FLAGS`. Since `CMAKE_CUDA_FLAGS` is a "global" variable, it # can't modified on a per-target basis, e.g. for the `punica` extension. # So, all the `-gencode` flags need to be extracted and removed from # `CMAKE_CUDA_FLAGS` for processing so they can be passed by another method. # Since it's not possible to use `target_compiler_options` for adding target # specific `-gencode` arguments, the target's `CUDA_ARCHITECTURES` property - # must be used instead. This requires repackaging the architecture flags + # must be used instead. This requires repackaging the architecture flags # into a format that cmake expects for `CUDA_ARCHITECTURES`. # # This is a bit fragile in that it depends on torch using `-gencode` as opposed @@ -211,7 +211,7 @@ macro(override_gpu_arches GPU_ARCHES GPU_LANG GPU_SUPPORTED_ARCHES) # If this error is triggered, it might mean that torch has changed how it sets # up nvcc architecture code generation flags. - if (NOT _CUDA_ARCH_FLAGS) + if(NOT _CUDA_ARCH_FLAGS) message(FATAL_ERROR "Could not find any architecture related code generation flags in " "CMAKE_CUDA_FLAGS. (${CMAKE_CUDA_FLAGS})") @@ -230,34 +230,34 @@ macro(override_gpu_arches GPU_ARCHES GPU_LANG GPU_SUPPORTED_ARCHES) # Note: if a regex matches then `CMAKE_MATCH_1` holds the binding # for that match. - string(REGEX MATCH "arch=compute_\([0-9]+a?\)" _COMPUTE ${_ARCH}) - if (_COMPUTE) + string(REGEX MATCH "arch=compute_([0-9]+a?)" _COMPUTE ${_ARCH}) + if(_COMPUTE) set(_COMPUTE ${CMAKE_MATCH_1}) endif() - string(REGEX MATCH "code=sm_\([0-9]+a?\)" _SM ${_ARCH}) - if (_SM) + string(REGEX MATCH "code=sm_([0-9]+a?)" _SM ${_ARCH}) + if(_SM) set(_SM ${CMAKE_MATCH_1}) endif() - string(REGEX MATCH "code=compute_\([0-9]+a?\)" _CODE ${_ARCH}) - if (_CODE) + string(REGEX MATCH "code=compute_([0-9]+a?)" _CODE ${_ARCH}) + if(_CODE) set(_CODE ${CMAKE_MATCH_1}) endif() # Make sure the virtual architecture can be matched. - if (NOT _COMPUTE) + if(NOT _COMPUTE) message(FATAL_ERROR "Could not determine virtual architecture from: ${_ARCH}.") endif() # One of sm_ or compute_ must exist. - if ((NOT _SM) AND (NOT _CODE)) + if((NOT _SM) AND (NOT _CODE)) message(FATAL_ERROR "Could not determine a codegen architecture from: ${_ARCH}.") endif() - if (_SM) + if(_SM) # -real suffix let CMake to only generate elf code for the kernels. # we want this, otherwise the added ptx (default) will increase binary size. set(_VIRT "-real") @@ -270,7 +270,7 @@ macro(override_gpu_arches GPU_ARCHES GPU_LANG GPU_SUPPORTED_ARCHES) # Check if the current version is in the supported arch list. string_to_ver(_CODE_VER ${_CODE_ARCH}) - if (NOT _CODE_VER IN_LIST _GPU_SUPPORTED_ARCHES_LIST) + if(NOT _CODE_VER IN_LIST _GPU_SUPPORTED_ARCHES_LIST) message(STATUS "discarding unsupported CUDA arch ${_VER}.") continue() endif() @@ -286,30 +286,30 @@ endmacro() # Define a target named `GPU_MOD_NAME` for a single extension. The # arguments are: # -# DESTINATION - Module destination directory. -# LANGUAGE - The GPU language for this module, e.g CUDA, HIP, -# etc. -# SOURCES - List of source files relative to CMakeLists.txt -# directory. +# DESTINATION - Module destination directory. +# LANGUAGE - The GPU language for this module, e.g CUDA, HIP, +# etc. +# SOURCES - List of source files relative to CMakeLists.txt +# directory. # # Optional arguments: # -# ARCHITECTURES - A list of target GPU architectures in cmake -# format. -# Refer `CMAKE_CUDA_ARCHITECTURES` documentation -# and `CMAKE_HIP_ARCHITECTURES` for more info. -# ARCHITECTURES will use cmake's defaults if -# not provided. -# COMPILE_FLAGS - Extra compiler flags passed to NVCC/hip. +# ARCHITECTURES - A list of target GPU architectures in cmake +# format. +# Refer `CMAKE_CUDA_ARCHITECTURES` documentation +# and `CMAKE_HIP_ARCHITECTURES` for more info. +# ARCHITECTURES will use cmake's defaults if +# not provided. +# COMPILE_FLAGS - Extra compiler flags passed to NVCC/hip. # INCLUDE_DIRECTORIES - Extra include directories. -# LIBRARIES - Extra link libraries. -# WITH_SOABI - Generate library with python SOABI suffix name. -# CXX_SRCS - List of C++ sources files to not be hipified. -# Usually means they shouldn't contain CUDA code. +# LIBRARIES - Extra link libraries. +# WITH_SOABI - Generate library with python SOABI suffix name. +# CXX_SRCS - List of C++ sources files to not be hipified. +# Usually means they shouldn't contain CUDA code. # # Note: optimization level/debug info is set via cmake build type. # -function (define_gpu_extension_target GPU_MOD_NAME) +function(define_gpu_extension_target GPU_MOD_NAME) cmake_parse_arguments(PARSE_ARGV 1 GPU "WITH_SOABI" @@ -318,11 +318,11 @@ function (define_gpu_extension_target GPU_MOD_NAME) ) # Add hipify preprocessing step when building with HIP/ROCm. - if (GPU_LANGUAGE STREQUAL "HIP") + if(GPU_LANGUAGE STREQUAL "HIP") hipify_sources_target(GPU_SOURCES ${GPU_MOD_NAME} "${GPU_SOURCES}" "${GPU_CXX_SRCS}") endif() - if (GPU_WITH_SOABI) + if(GPU_WITH_SOABI) set(GPU_WITH_SOABI WITH_SOABI) else() set(GPU_WITH_SOABI) @@ -330,12 +330,12 @@ function (define_gpu_extension_target GPU_MOD_NAME) Python_add_library(${GPU_MOD_NAME} MODULE "${GPU_SOURCES}" ${GPU_WITH_SOABI}) - if (GPU_LANGUAGE STREQUAL "HIP") + if(GPU_LANGUAGE STREQUAL "HIP") # Make this target dependent on the hipify preprocessor step. add_dependencies(${GPU_MOD_NAME} hipify${GPU_MOD_NAME}) endif() - if (GPU_ARCHITECTURES) + if(GPU_ARCHITECTURES) set_target_properties(${GPU_MOD_NAME} PROPERTIES ${GPU_LANGUAGE}_ARCHITECTURES "${GPU_ARCHITECTURES}") endif() @@ -356,12 +356,26 @@ function (define_gpu_extension_target GPU_MOD_NAME) # Don't use `TORCH_LIBRARIES` for CUDA since it pulls in a bunch of # dependencies that are not necessary and may not be installed. - if (GPU_LANGUAGE STREQUAL "CUDA") + if(GPU_LANGUAGE STREQUAL "CUDA") target_link_libraries(${GPU_MOD_NAME} PRIVATE ${CUDA_CUDA_LIB} ${CUDA_LIBRARIES}) + elseif(GPU_LANGUAGE STREQUAL "CANN") + # Set RPATH for CANN libraries + if(DEFINED ENV{ASCEND_TOOLKIT_HOME}) + set_target_properties(${GPU_MOD_NAME} PROPERTIES + BUILD_RPATH "$ENV{ASCEND_TOOLKIT_HOME}/lib64" + INSTALL_RPATH "$ENV{ASCEND_TOOLKIT_HOME}/lib64" + INSTALL_RPATH_USE_LINK_PATH TRUE) + else() + set_target_properties(${GPU_MOD_NAME} PROPERTIES + BUILD_RPATH "/usr/local/Ascend/ascend-toolkit/latest/lib64" + INSTALL_RPATH "/usr/local/Ascend/ascend-toolkit/latest/lib64" + INSTALL_RPATH_USE_LINK_PATH TRUE) + endif() + target_link_libraries(${GPU_MOD_NAME} PRIVATE ${TORCH_LIBRARIES} ${GPU_LIBRARIES} ) else() target_link_libraries(${GPU_MOD_NAME} PRIVATE ${TORCH_LIBRARIES}) endif() install(TARGETS ${GPU_MOD_NAME} LIBRARY DESTINATION ${GPU_DESTINATION}) -endfunction() +endfunction() \ No newline at end of file diff --git a/sllm_store/csrc/checkpoint/cann_ipc.cpp b/sllm_store/csrc/checkpoint/cann_ipc.cpp new file mode 100644 index 0000000..0ae6b09 --- /dev/null +++ b/sllm_store/csrc/checkpoint/cann_ipc.cpp @@ -0,0 +1,563 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// Licensed under the Apache License, Version 2.0 +// ---------------------------------------------------------------------------- +#ifdef USE_CANN +#include "cann_ipc.h" // Includes the declarations of helper functions and CannIpcManager + +#include // For errno +#include // For open, O_RDWR, O_CREAT etc. +#include +#include // For std::ifstream, std::ofstream +#include +#include +#include +#include + +// System includes for FIFO operations - MUST be in the .cpp where functions are defined +#include // For mkfifo +#include // For unlink (optional, for cleanup), though not used in helper fn, often used with FIFOs + +// * FIFO mechanism is only used for testing purpose, in actual development the pid is using proto to transfer +// Helper function to open a FIFO robustly +int open_fifo_fd(const std::string& fifo_path, int flags) +{ + // Create the FIFO if it doesn't exist. Permissions 0666 allow read/write for all. + if (mkfifo(fifo_path.c_str(), 0666) == -1 && errno != EEXIST) + { + std::cerr << "[ERROR][IPC_UTIL] Failed to create FIFO: " << fifo_path + << ", errno: " << errno << " : " << strerror(errno) << std::endl; + return -1; + } + + // We open as file descriptor first to handle blocking correctly. + // A simple std::fstream will block. + int fd = open(fifo_path.c_str(), flags, 0666); + if (fd == -1) + { + std::cerr << "[ERROR][IPC_UTIL] Failed to open FIFO: " << fifo_path + << ", errno: " << errno << " : " << strerror(errno) << std::endl; + // Consider retrying for transient errors like EINTR or EAGAIN (if O_NONBLOCK were used) + return -1; + } + return fd; +} + +// Helper functions for inter-process communication (using named pipes) +// These are the definitions. + +void send_int32(int32_t value, const std::string& fifo_path) +{ + int fd = open_fifo_fd(fifo_path, O_WRONLY | O_SYNC); // Open for writing, with sync + if (fd == -1) + { + return; + } + + if (write(fd, &value, sizeof(value)) == -1) + { + std::cerr << "[ERROR][IPC_UTIL] Failed to write int32_t to FIFO: " << fifo_path + << ", errno: " << errno << " : " << strerror(errno) << std::endl; + } + close(fd); + std::cout << "[INFO][IPC_UTIL] Sent int32_t value " << value << " to " + << fifo_path << std::endl; +} + +int32_t receive_int32(const std::string& fifo_path) +{ + int fd = open_fifo_fd(fifo_path, O_RDONLY | O_SYNC); // Open for reading, with sync + if (fd == -1) + { + return -1; + } + + int32_t received_value = -1; + ssize_t bytes_read = read(fd, &received_value, sizeof(received_value)); + if (bytes_read == -1) + { + std::cerr << "[ERROR][IPC_UTIL] Failed to read from FIFO: " << fifo_path + << ", errno: " << errno << " : " << strerror(errno) << std::endl; + received_value = -1; + } + else if (bytes_read == 0) + { + std::cerr << "[WARNING][IPC_UTIL] Reached EOF on FIFO: " << fifo_path + << " (no data or writer closed)" << std::endl; + received_value = -1; // Or handle as specific empty state + } + close(fd); + std::cout << "[INFO][IPC_UTIL] Received int32_t value " << received_value + << " from " << fifo_path << std::endl; + return received_value; +} + +void send_handle_info(uint64_t handle_id, size_t size, + const std::string& fifo_path) +{ + int fd = open_fifo_fd(fifo_path, O_WRONLY | O_SYNC); + if (fd == -1) + { + return; + } + + if (write(fd, &handle_id, sizeof(handle_id)) == -1 || + write(fd, &size, sizeof(size)) == -1) + { + std::cerr << "[ERROR][IPC_UTIL] Failed to write handle info to FIFO: " + << fifo_path << ", errno: " << errno << " : " << strerror(errno) + << std::endl; + } + close(fd); + std::cout << "[INFO][IPC_UTIL] Sent handle_id " << std::hex << handle_id + << ", size " << std::dec << size << " to " << fifo_path + << std::endl; +} + +std::pair receive_handle_info( + const std::string& fifo_path) +{ + int fd = open_fifo_fd(fifo_path, O_RDONLY | O_SYNC); + if (fd == -1) + { + return {0, 0}; + } + + uint64_t received_handle_id = 0; + size_t received_size = 0; + ssize_t bytes_read_handle = + read(fd, &received_handle_id, sizeof(received_handle_id)); + ssize_t bytes_read_size = read(fd, &received_size, sizeof(received_size)); + + if (bytes_read_handle == -1 || bytes_read_size == -1) + { + std::cerr << "[ERROR][IPC_UTIL] Failed to read handle info from FIFO: " + << fifo_path << ", errno: " << errno << " : " << strerror(errno) + << std::endl; + received_handle_id = 0; + received_size = 0; + } + else if (bytes_read_handle == 0 || bytes_read_size == 0) + { + std::cerr << "[WARNING][IPC_UTIL] Reached EOF on FIFO for handle info: " + << fifo_path << " (incomplete data or writer closed)" + << std::endl; + received_handle_id = 0; + received_size = 0; + } + close(fd); + std::cout << "[INFO][IPC_UTIL] Received handle_id " << std::hex + << received_handle_id << ", size " << std::dec << received_size + << " from " << fifo_path << std::endl; + return {received_handle_id, received_size}; +} + +// Real CANN IPC implementation using native CANN APIs + +aclError CannIpcManager::createIpcHandle(void** device_ptr, size_t size, + int device_id, uint64_t* handle_id, + int32_t process_b_pid) +{ + std::lock_guard lock(mutex_); + + if (device_ptr == nullptr || *device_ptr == nullptr) + { + std::cerr << "[ERROR] Device pointer is null, cannot create IPC handle" + << std::endl; + return ACL_ERROR_INVALID_PARAM; + } + + void* original_ptr = *device_ptr; // Store the original pointer + + // Set device context + aclError ret = aclrtSetDevice(device_id); + if (ret != ACL_ERROR_NONE) + { + std::cerr << "[ERROR] Failed to set device " << device_id << ": " << ret + << std::endl; + return ret; + } + + // Align size to 2 MB (huge page size) + const size_t granularity = 2 * 1024 * 1024; // 2 MB + size_t aligned_size = ((size + granularity - 1) / granularity) * granularity; + + // First reserve virtual address space + void* vir_ptr = nullptr; + ret = aclrtReserveMemAddress(&vir_ptr, aligned_size, 0, nullptr, 0); + if (ret != ACL_ERROR_NONE) + { + std::cerr << "[ERROR] Failed to reserve memory address: " << ret + << std::endl; + return ret; + } + + // Configure physical memory properties properly + aclrtPhysicalMemProp prop = {}; + prop.handleType = ACL_MEM_HANDLE_TYPE_NONE; + prop.allocationType = ACL_MEM_ALLOCATION_TYPE_PINNED; + prop.memAttr = ACL_HBM_MEM_HUGE; // Use 2MB pages + prop.location.type = ACL_MEM_LOCATION_TYPE_DEVICE; + prop.location.id = static_cast(device_id); + prop.reserve = 0; + + // Allocate physical memory for IPC with proper properties + aclrtDrvMemHandle physical_handle; + ret = aclrtMallocPhysical(&physical_handle, aligned_size, &prop, 0); + if (ret != ACL_ERROR_NONE) + { + std::cerr << "[ERROR] Failed to allocate physical memory for IPC: " << ret + << std::endl; + aclrtReleaseMemAddress(vir_ptr); + return ret; + } + + // Map the physical memory to the reserved virtual address + ret = aclrtMapMem(vir_ptr, aligned_size, 0, physical_handle, 0); + if (ret != ACL_ERROR_NONE) + { + std::cerr << "[ERROR] Failed to map physical memory: " << ret << std::endl; + aclrtFreePhysical(physical_handle); + aclrtReleaseMemAddress(vir_ptr); + return ret; + } + + // Export physical memory handle for sharing + uint64_t shareable_handle; + ret = aclrtMemExportToShareableHandle(physical_handle, ACL_MEM_HANDLE_TYPE_NONE, + 0, &shareable_handle); + if (ret != ACL_ERROR_NONE) + { + std::cerr << "[ERROR] Failed to export shareable handle: " << ret + << std::endl; + aclrtUnmapMem(vir_ptr); + aclrtFreePhysical(physical_handle); + aclrtReleaseMemAddress(vir_ptr); + return ret; + } + + // --- IPC LOGIC FOR PID EXCHANGE (Process A - Sender of Handle, Receiver of PID) --- + + // // 1. Send shareable_handle and its aligned_size to Process B + // std::cout << "[INFO] Process A sending handle info to Process B..." << std::endl; + // send_handle_info(shareable_handle, aligned_size, FIFO_PATH_A_TO_B); + + // // 2. Wait to receive Process B's PID + // std::cout << "[INFO] Process A waiting for Process B's PID on " << FIFO_PATH_B_TO_A << "..." << std::endl; + // int32_t process_b_pid = receive_int32(FIFO_PATH_B_TO_A); + + if (process_b_pid == -1) + { + std::cerr << "[ERROR] Failed to receive Process B's PID. Aborting IPC setup." + << std::endl; + // Perform cleanup for the created resources before returning + aclrtUnmapMem(vir_ptr); + aclrtFreePhysical(physical_handle); + aclrtReleaseMemAddress(vir_ptr); + return ACL_ERROR_INVALID_PARAM; // Or a more appropriate error code + } + + std::cout << "[INFO] Process A received Process B's PID: " << process_b_pid + << std::endl; + + // 3. Allow Process B (identified by process_b_pid) to import the handle + // aclrtMemSetPidToShareableHandle expects an array of PIDs. + int32_t pids_to_whitelist[] = {process_b_pid}; + ret = aclrtMemSetPidToShareableHandle(shareable_handle, pids_to_whitelist, 1); + if (ret != ACL_ERROR_NONE) + { + std::cerr << "[ERROR] Failed to set PID whitelist for shareable handle: " + << ret << std::endl; + // Cleanup on failure + aclrtUnmapMem(vir_ptr); + aclrtFreePhysical(physical_handle); + aclrtReleaseMemAddress(vir_ptr); + return ret; + } + + std::cout << "[INFO] Successfully set pid to whitelist: " << process_b_pid + << std::endl; + + // Use shareable handle as the handle ID + *handle_id = shareable_handle; + + // Store memory info for cleanup (store the mapped pointer, not original) + MemoryInfo mem_info; + mem_info.ptr = vir_ptr; // Store original device_ptr for lookup + mem_info.size = aligned_size; + mem_info.device_id = device_id; + mem_info.physical_handle = physical_handle; + mem_info.shareable_handle = shareable_handle; + mem_info.vir_ptr = vir_ptr; // Store virtual address for release + mem_info.ipc_device_ptr = vir_ptr; // Store the mapped IPC pointer (vir_ptr) + + handle_to_memory_[*handle_id] = mem_info; + // ptr_to_handle_[original_ptr] = *handle_id; // Keep original mapping for lookup + ptr_to_handle_[vir_ptr] = *handle_id; // Also map the shared VA for cleanup + + // Return the shared virtual address to the caller + *device_ptr = vir_ptr; + + std::cout << "[INFO] Created CANN IPC handle " << std::hex << *handle_id + << " for device ptr " << original_ptr << " -> shared VA " << vir_ptr << " on device " << device_id + << ", size: " << aligned_size << std::endl; + + return ACL_ERROR_NONE; +} + +aclError CannIpcManager::openIpcHandle(uint64_t handle_id, int device_id, + void** device_ptr) +{ + std::lock_guard lock(mutex_); + + std::cout << "[INFO] Opening CANN IPC handle " << std::hex << handle_id + << " on device " << device_id << std::endl; + + // Get size from pending imports (this map is populated by stringToHandle when Process B receives the handle string) + auto pending_it = pending_imports_.find(handle_id); + if (pending_it == pending_imports_.end()) + { + std::cerr << "[ERROR] Size information not found for handle " << std::hex + << handle_id << ". Make sure stringToHandle was called." + << std::endl; + return ACL_ERROR_INVALID_PARAM; + } + size_t aligned_size = pending_it->second; // Use aligned_size as stored by stringToHandle + pending_imports_.erase(pending_it); // Clear after use + + // Set device context + aclError ret = aclrtSetDevice(device_id); + if (ret != ACL_ERROR_NONE) + { + std::cerr << "[ERROR] Failed to set device " << device_id << ": " << ret + << std::endl; + return ret; + } + + // Reserve virtual address space first + void* vir_ptr = nullptr; + ret = aclrtReserveMemAddress(&vir_ptr, aligned_size, 0, nullptr, 0); + if (ret != ACL_ERROR_NONE) + { + std::cerr << "[ERROR] Failed to reserve memory address: " << ret + << std::endl; + return ret; + } + + // // Get current process id (Process B's PID) + // int32_t pid_value; + // ret = aclrtDeviceGetBareTgid(&pid_value); + // if (ret != ACL_ERROR_NONE) { + // std::cerr << "[ERROR] Failed to get current process id: " << ret << std::endl; + // aclrtReleaseMemAddress(vir_ptr); + // return ret; + // } + + // --- IPC LOGIC FOR PID EXCHANGE (Process B - Receiver of Handle, Sender of PID) --- + + // ! do this in grpc server, beforehand + // // Send Process B's PID back to Process A + // std::cout << "[INFO] Process B sending its PID (" << pid_value << ") to Process A on " << FIFO_PATH_B_TO_A << "..." << std::endl; + // send_int32(pid_value, FIFO_PATH_B_TO_A); + // Process A should now have received this PID and called aclrtMemSetPidToShareableHandle. + + // Import the shareable handle + aclrtDrvMemHandle imported_handle; + ret = aclrtMemImportFromShareableHandle(handle_id, device_id, &imported_handle); + if (ret != ACL_ERROR_NONE) + { + std::cerr << "[ERROR] Failed to import shareable handle " << std::hex + << handle_id << ": " << ret << std::endl; + aclrtReleaseMemAddress(vir_ptr); + return ret; + } + + // Map the imported physical memory to reserved virtual address + ret = aclrtMapMem(vir_ptr, aligned_size, 0, imported_handle, 0); + if (ret != ACL_ERROR_NONE) + { + std::cerr << "[ERROR] Failed to map imported memory: " << ret << std::endl; + aclrtFreePhysical(imported_handle); + aclrtReleaseMemAddress(vir_ptr); + return ret; + } + + // MOD: Sync after map to ensure data visibility on client + ret = aclrtSynchronizeDevice(); + if (ret != ACL_ERROR_NONE) { + std::cerr << "[ERROR] Failed to synchronize device after IPC map: " << ret << std::endl; + // Cleanup + aclrtUnmapMem(vir_ptr); + aclrtFreePhysical(imported_handle); + aclrtReleaseMemAddress(vir_ptr); + return ret; + } + + // Return the mapped device pointer + *device_ptr = vir_ptr; + + // Store the mapping for cleanup + MemoryInfo mem_info; + mem_info.ptr = vir_ptr; // Store the mapped IPC pointer + mem_info.size = aligned_size; // Store the aligned size for consistency + mem_info.device_id = device_id; + mem_info.physical_handle = imported_handle; + mem_info.shareable_handle = handle_id; + mem_info.vir_ptr = vir_ptr; + mem_info.ipc_device_ptr = vir_ptr; // This is the actual mapped pointer + + handle_to_memory_[handle_id] = mem_info; + ptr_to_handle_[vir_ptr] = handle_id; // Map the *imported* pointer to its handle + + std::cout << "[INFO] Successfully opened CANN IPC handle " << std::hex + << handle_id << " -> device ptr " << *device_ptr << " on device " + << device_id << std::endl; + + return ACL_ERROR_NONE; +} + +aclError CannIpcManager::closeIpcHandle(void* device_ptr) +{ + std::lock_guard lock(mutex_); + + auto it = ptr_to_handle_.find(device_ptr); + if (it == ptr_to_handle_.end()) + { + std::cerr << "[WARNING] Device pointer " << device_ptr + << " not found in IPC registry" << std::endl; + return ACL_ERROR_INVALID_PARAM; + } + + uint64_t handle_id = it->second; + auto mem_it = handle_to_memory_.find(handle_id); + if (mem_it == handle_to_memory_.end()) + { + std::cerr << "[WARNING] Handle " << std::hex << handle_id + << " not found in memory map" << std::endl; + return ACL_ERROR_INVALID_PARAM; + } + + const MemoryInfo& mem_info = mem_it->second; + + // Unmap the memory first + if (mem_info.vir_ptr != nullptr) + { // Use vir_ptr for unmapping + aclrtUnmapMem(mem_info.vir_ptr); + } + + // Free the physical memory handle + if (mem_info.physical_handle) + { + aclrtFreePhysical(mem_info.physical_handle); + } + + // Release the virtual address space + if (mem_info.vir_ptr != nullptr) + { + aclrtReleaseMemAddress(mem_info.vir_ptr); + } + + // std::cout << "[INFO] Closed CANN IPC handle " << std::hex << handle_id + // << " for device ptr " << device_ptr << std::endl; + + handle_to_memory_.erase(handle_id); + ptr_to_handle_.erase(it); + + return ACL_ERROR_NONE; +} + +std::string CannIpcManager::handleToString(uint64_t handle_id) +{ + std::lock_guard lock(mutex_); + + auto it = handle_to_memory_.find(handle_id); + if (it == handle_to_memory_.end()) + { + std::cerr << "[ERROR] Invalid handle ID: " << std::hex << handle_id + << std::endl; + return ""; + } + + const MemoryInfo& mem_info = it->second; + std::ostringstream oss; + // Store the shareable handle and the *aligned* size for consistent import + oss << std::hex << mem_info.shareable_handle << ":" << std::dec + << mem_info.size; + return oss.str(); +} + +uint64_t CannIpcManager::stringToHandle(const std::string& handle_str) +{ + size_t colon_pos = handle_str.find(':'); + if (colon_pos == std::string::npos) + { + std::cerr << "[ERROR] Invalid handle format - missing size: " << handle_str + << std::endl; + return 0; + } + + try + { + // Parse shareable handle (hex) + uint64_t shareable_handle = + std::stoull(handle_str.substr(0, colon_pos), nullptr, 16); + + // Parse buffer size (decimal) - this should be the ALIGNED size from the sender + size_t size = std::stoul(handle_str.substr(colon_pos + 1), nullptr, 10); + + // Store size for import operation + // This is crucial for openIpcHandle to know the correct aligned_size for aclrtReserveMemAddress + pending_imports_[shareable_handle] = size; + + return shareable_handle; + } + catch (const std::exception& e) + { + std::cerr << "[ERROR] Failed to parse handle string '" << handle_str + << "': " << e.what() << std::endl; + return 0; + } +} + +// Convenience functions that mimic CUDA IPC API exactly +aclError cannIpcGetMemHandle(std::string* handle_str, void** device_ptr, + size_t size, int device_id, + int32_t target_process_id) +{ + CannIpcManager& manager = CannIpcManager::getInstance(); + uint64_t handle_id; + + aclError ret = manager.createIpcHandle(device_ptr, size, device_id, + &handle_id, target_process_id); + if (ret != ACL_ERROR_NONE) + { + return ret; + } + + *handle_str = manager.handleToString(handle_id); + return ACL_ERROR_NONE; +} + +aclError cannIpcOpenMemHandle(void** device_ptr, const std::string& handle_str, + int device_id) +{ + CannIpcManager& manager = CannIpcManager::getInstance(); + uint64_t handle_id = manager.stringToHandle(handle_str); + + if (handle_id == 0) + { + std::cerr << "[ERROR] Invalid handle string: " << handle_str << std::endl; + return ACL_ERROR_INVALID_PARAM; + } + + return manager.openIpcHandle(handle_id, device_id, device_ptr); +} + +aclError cannIpcCloseMemHandle(void* device_ptr) +{ + CannIpcManager& manager = CannIpcManager::getInstance(); + return manager.closeIpcHandle(device_ptr); +} + +#endif // USE_CANN \ No newline at end of file diff --git a/sllm_store/csrc/checkpoint/cann_ipc.h b/sllm_store/csrc/checkpoint/cann_ipc.h new file mode 100644 index 0000000..ae3e7e6 --- /dev/null +++ b/sllm_store/csrc/checkpoint/cann_ipc.h @@ -0,0 +1,111 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// Licensed under the Apache License, Version 2.0 +// ---------------------------------------------------------------------------- +#pragma once + +#ifdef USE_CANN +#include "acl/acl.h" +#include +#include +#include +#include +#include +#include // For int32_t, uint64_t +#include // For std::pair + +// Required for named pipes (FIFOs) - needed for declarations +// We only include and if we specifically declare functions that use them. +// For the declarations, these might not be strictly necessary if the types are fundamental. +// However, including them ensures errno and other system-level types are known if helper functions +// were inline or templated (which they are not here). For external functions, it's generally fine. +// and for usage within the helper function definitions. + +// Define FIFO paths for inter-process communication +#define FIFO_PATH_A_TO_B "/tmp/cann_ipc_a_to_b" // Process A sends handle info to Process B +#define FIFO_PATH_B_TO_A "/tmp/cann_ipc_b_to_a" // Process B sends its PID to Process A + + +// Helper functions for inter-process communication (using named pipes) +// These are declarations ONLY. Implementations go into a .cpp file. + +/** + * @brief Sends an int32_t (e.g., a PID) through a named pipe. + * @param value The int32_t value to send. + * @param fifo_path The path to the named pipe. + */ +void send_int32(int32_t value, const std::string& fifo_path); + +/** + * @brief Receives an int32_t (e.g., a PID) from a named pipe. + * @param fifo_path The path to the named pipe. + * @return The received int32_t value, or -1 on error. + */ +int32_t receive_int32(const std::string& fifo_path); + +/** + * @brief Sends a uint64_t handle ID and size_t through a named pipe. + * @param handle_id The uint64_t handle ID to send. + * @param size The size_t value to send. + * @param fifo_path The path to the named pipe. + */ +void send_handle_info(uint64_t handle_id, size_t size, const std::string& fifo_path); + +/** + * @brief Receives a uint64_t handle ID and size_t from a named pipe. + * @param fifo_path The path to the named pipe. + * @return A pair containing the received handle ID and size, or {0, 0} on error. + */ +std::pair receive_handle_info(const std::string& fifo_path); + + +// Real CANN IPC Manager using native CANN APIs +// Uses aclrtMemExportToShareableHandle and aclrtMemImportFromShareableHandle +// Based on CANN documentation: https://www.hiascend.com/document/detail/zh/canncommercial/80RC22/apiref/appdevgapi/aclcppdevg_03_0117.html +class CannIpcManager { +public: + static CannIpcManager& getInstance() { + static CannIpcManager instance; + return instance; + } + + struct MemoryInfo { + void* ptr; // Original or imported device pointer + size_t size; // Memory size + int device_id; // Device ID + aclrtDrvMemHandle physical_handle; // Physical memory handle for CANN IPC + void* ipc_device_ptr; // Mapped IPC device pointer (can be removed if not used) + uint64_t shareable_handle; // CANN shareable handle for inter-process sharing + void* vir_ptr; // Virtual address pointer for cleanup + }; + + // Create IPC handle - mimics cudaIpcGetMemHandle + aclError createIpcHandle(void** device_ptr, size_t size, int device_id, uint64_t* handle_id, int32_t process_b_pid); + + // Open IPC handle - mimics cudaIpcOpenMemHandle + aclError openIpcHandle(uint64_t handle_id, int device_id, void** device_ptr); + + // Close IPC handle - mimics cudaIpcCloseMemHandle + aclError closeIpcHandle(void* device_ptr); + + // Convert handle to/from string for compatibility (enhanced with size info) + std::string handleToString(uint64_t handle_id); + uint64_t stringToHandle(const std::string& handle_str); + +private: + CannIpcManager() : next_handle_id_(1) {} + + std::mutex mutex_; + uint64_t next_handle_id_; + std::unordered_map handle_to_memory_; + std::unordered_map ptr_to_handle_; + std::unordered_map pending_imports_; // Store size info for imports +}; + +// Convenience functions that mimic CUDA IPC API exactly +aclError cannIpcGetMemHandle(std::string* handle_str, void** device_ptr, size_t size, int device_id, int32_t target_process_id); +aclError cannIpcOpenMemHandle(void** device_ptr, const std::string& handle_str, int device_id); +aclError cannIpcCloseMemHandle(void* device_ptr); + +#endif // USE_CANN diff --git a/sllm_store/csrc/checkpoint/checkpoint.cpp b/sllm_store/csrc/checkpoint/checkpoint.cpp index 58c3b6b..a623fd8 100644 --- a/sllm_store/csrc/checkpoint/checkpoint.cpp +++ b/sllm_store/csrc/checkpoint/checkpoint.cpp @@ -2,21 +2,36 @@ // ServerlessLLM // Copyright (c) ServerlessLLM Team 2024 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. // -// You may obtain a copy of the License at +// You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // ---------------------------------------------------------------------------- #include "checkpoint.h" +#include +#include +#include +#include + +#ifdef USE_CANN +#include "acl/acl.h" +#include +#include "torch_npu/csrc/aten/common/from_blob.h" +#include "torch_npu/csrc/core/npu/NPUCachingAllocator.h" +#include // One-stop header. +#include +#include "cann_ipc.h" +#include // For uintptr_t +#else #include #include #include @@ -25,20 +40,24 @@ #include #include #include -#include // One-stop header. +#include // One-stop header. #include #include +#endif +#include +#include #include #include #include #include -#include +#include #include -#include #include +#include #include +#include "aligned_buffer.h" #include "progress_bar.h" #include "tensor_writer.h" @@ -48,65 +67,65 @@ std::unordered_map SaveTensors( std::vector tensor_names, std::unordered_map>& tensor_data, const std::string& path) { - std::string tensor_filename = std::filesystem::path(path) / "tensor.data"; - // make a tensor writer - TensorWriter writer(tensor_filename); - // make a tensor index - std::unordered_map tensor_offsets; - // Some tensors may share the same data, so we need to record the data to - // avoid duplication - std::unordered_map data_record; - - int total = tensor_names.size(); - int count = 0; - - for (const auto& name : tensor_names) { - const auto& [base, size] = tensor_data[name]; - const char* data_ptr = reinterpret_cast(base); - if (data_record.find(data_ptr) != data_record.end()) { - tensor_offsets[name] = tensor_offsets[data_record[data_ptr]]; - continue; - } - data_record[data_ptr] = name; + std::string tensor_filename = std::filesystem::path(path) / "tensor.data"; + // make a tensor writer + TensorWriter writer(tensor_filename); + // make a tensor index + std::unordered_map tensor_offsets; + // Some tensors may share the same data, so we need to record the data to + // avoid duplication + std::unordered_map data_record; - uint64_t offset = writer.writeRecord(data_ptr, size); - tensor_offsets[name] = offset; + int total = tensor_names.size(); + int count = 0; - // Update progress bar - count++; - float progress = static_cast(count) / total; - showProgressBar(progress, "Saving tensors: "); - } + for (const auto& name : tensor_names) { + const auto& [base, size] = tensor_data[name]; + const char* data_ptr = reinterpret_cast(base); + if (data_record.find(data_ptr) != data_record.end()) { + tensor_offsets[name] = tensor_offsets[data_record[data_ptr]]; + continue; + } + data_record[data_ptr] = name; - return tensor_offsets; + uint64_t offset = writer.writeRecord(data_ptr, size); + tensor_offsets[name] = offset; + + // Update progress bar + count++; + float progress = static_cast(count) / total; + showProgressBar(progress, "Saving tensors: "); + } + + return tensor_offsets; } // Function to print the binary array in hexadecimal format void printBinaryArrayInHex(const unsigned char* data, size_t size) { - std::cout << "Data in Hex: "; - for (size_t i = 0; i < size; ++i) { - std::cout << std::hex << std::setw(2) << std::setfill('0') - << static_cast(data[i]) << " "; - } - std::cout << std::dec - << std::endl; // Switch back to decimal for any future output + std::cout << "Data in Hex: "; + for (size_t i = 0; i < size; ++i) { + std::cout << std::hex << std::setw(2) << std::setfill('0') + << static_cast(data[i]) << " "; + } + std::cout << std::dec + << std::endl; // Switch back to decimal for any future output } // Mapping from string to at::ScalarType at::ScalarType stringToScalarType(const std::string& dtype_str) { - static const std::unordered_map dtype_map = { - {"torch.float16", torch::kFloat16}, {"torch.float32", torch::kFloat32}, - {"torch.float64", torch::kFloat64}, {"torch.int16", torch::kInt16}, - {"torch.int32", torch::kInt32}, {"torch.int64", torch::kInt64}, - {"torch.uint8", torch::kUInt8}, {"torch.int8", torch::kInt8}, - {"torch.bfloat16", torch::kBFloat16}}; - - auto it = dtype_map.find(dtype_str); - if (it != dtype_map.end()) { - return it->second; - } else { - throw std::invalid_argument("Unknown dtype string: " + dtype_str); - } + static const std::unordered_map dtype_map = { + {"torch.float16", torch::kFloat16}, {"torch.float32", torch::kFloat32}, + {"torch.float64", torch::kFloat64}, {"torch.int16", torch::kInt16}, + {"torch.int32", torch::kInt32}, {"torch.int64", torch::kInt64}, + {"torch.uint8", torch::kUInt8}, {"torch.int8", torch::kInt8}, + {"torch.bfloat16", torch::kBFloat16}}; + + auto it = dtype_map.find(dtype_str); + if (it != dtype_map.end()) { + return it->second; + } else { + throw std::invalid_argument("Unknown dtype string: " + dtype_str); + } } std::unordered_map RestoreTensors( @@ -118,6 +137,63 @@ std::unordered_map RestoreTensors( tensor_device_offsets) { std::unordered_map state_dict; std::unordered_set handled_memory; + +#ifdef USE_CANN + std::cout << "=== RestoreTensors DEBUG START ===" << std::endl; + std::cout << "Number of devices: " << tensor_device_offsets.size() << std::endl; + std::cout << "Number of base addresses: " << memory_base_address.size() << std::endl; + + for (const auto& [device_id, tensor_offsets] : tensor_device_offsets) { + std::cout << "Processing device " << device_id << " with " << tensor_offsets.size() << " tensors" << std::endl; + + // Check if base address exists for device + auto memory_it = memory_base_address.find(device_id); + if (memory_it == memory_base_address.end()) { + std::cout << "No memory base address found for device " << device_id << std::endl; + continue; + } + + void* base_address = memory_it->second; + std::cout << "Device " << device_id << " base address: " << base_address << std::endl; + + // Synchronize device to ensure transfers are complete + // Note: Ideally called once per device externally; kept here for compatibility + aclrtSynchronizeDevice(); + std::cout << "NPU device " << device_id << " synchronized - all transfers complete" << std::endl; + + for (const auto& [tensor_name, tensor_offset] : tensor_offsets) { + auto meta_it = meta_state_dict.find(tensor_name); + if (meta_it == meta_state_dict.end()) { + std::cout << "Tensor " << tensor_name << " not found in meta_state_dict" << std::endl; + continue; + } + + auto& [sizes, strides, type_str] = meta_it->second; + void* tensor_addr = static_cast(base_address) + tensor_offset; + + // Create tensor + auto torch_dtype = stringToScalarType(type_str); + auto device = torch::Device(c10::DeviceType::PrivateUse1, device_id); + + // Use storage_offset=0 since offset is applied in tensor_addr + torch::Tensor real_tensor = at_npu::native::from_blob( + tensor_addr, + c10::IntArrayRef(sizes), + c10::IntArrayRef(strides), + 0, // storage_offset + torch::TensorOptions().dtype(torch_dtype).device(device), + device); + state_dict[tensor_name] = real_tensor; + + // Track base address for external cleanup (no deleter in NPU from_blob) + if (tensor_offset == 0) { + handled_memory.insert(base_address); + } + } + } + + std::cout << "=== RestoreTensors DEBUG END ===" << std::endl; +#else for (const auto& [device, tensor_offset] : tensor_device_offsets) { for (const auto& p : tensor_offset) { std::string name = p.first; @@ -152,99 +228,226 @@ std::unordered_map RestoreTensors( } } } +#endif return state_dict; } std::unordered_map GetGpuUUID() { - int deviceCount = 0; - cudaGetDeviceCount(&deviceCount); // Get the number of CUDA devices - std::unordered_map uuidToDeviceIdMap; - - for (int devId = 0; devId < deviceCount; ++devId) { - cudaDeviceProp props; - cudaGetDeviceProperties(&props, devId); // Get properties for each device - - // Convert UUID bytes to string with unsigned char casting - char uuidStr[80]; - snprintf( - uuidStr, sizeof(uuidStr), - "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", - (unsigned char)props.uuid.bytes[0], (unsigned char)props.uuid.bytes[1], - (unsigned char)props.uuid.bytes[2], (unsigned char)props.uuid.bytes[3], - (unsigned char)props.uuid.bytes[4], (unsigned char)props.uuid.bytes[5], - (unsigned char)props.uuid.bytes[6], (unsigned char)props.uuid.bytes[7], - (unsigned char)props.uuid.bytes[8], (unsigned char)props.uuid.bytes[9], - (unsigned char)props.uuid.bytes[10], - (unsigned char)props.uuid.bytes[11], - (unsigned char)props.uuid.bytes[12], - (unsigned char)props.uuid.bytes[13], - (unsigned char)props.uuid.bytes[14], - (unsigned char)props.uuid.bytes[15]); - - uuidToDeviceIdMap[std::string(uuidStr)] = devId; - } + int deviceCount = 0; +#ifdef USE_CANN + uint32_t device_count = 0; + aclrtGetDeviceCount(&device_count); + deviceCount = static_cast(device_count); +#else + cudaGetDeviceCount(&deviceCount); +#endif + + std::unordered_map uuidToDeviceIdMap; + + for (int devId = 0; devId < deviceCount; ++devId) { +#ifdef USE_CANN + // For CANN, generate simplified NPU UUIDs + char uuidStr[80]; + snprintf(uuidStr, sizeof(uuidStr), "npu-%02d", devId); + uuidToDeviceIdMap[std::string(uuidStr)] = devId; +#else + cudaDeviceProp props; + cudaGetDeviceProperties(&props, devId); // Get properties for each device + + // Convert UUID bytes to string with unsigned char casting + char uuidStr[80]; + snprintf( + uuidStr, sizeof(uuidStr), + "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", + (unsigned char)props.uuid.bytes[0], (unsigned char)props.uuid.bytes[1], + (unsigned char)props.uuid.bytes[2], (unsigned char)props.uuid.bytes[3], + (unsigned char)props.uuid.bytes[4], (unsigned char)props.uuid.bytes[5], + (unsigned char)props.uuid.bytes[6], (unsigned char)props.uuid.bytes[7], + (unsigned char)props.uuid.bytes[8], (unsigned char)props.uuid.bytes[9], + (unsigned char)props.uuid.bytes[10], + (unsigned char)props.uuid.bytes[11], + (unsigned char)props.uuid.bytes[12], + (unsigned char)props.uuid.bytes[13], + (unsigned char)props.uuid.bytes[14], + (unsigned char)props.uuid.bytes[15]); + + uuidToDeviceIdMap[std::string(uuidStr)] = devId; +#endif + } + + return uuidToDeviceIdMap; +} - return uuidToDeviceIdMap; +#ifdef USE_CANN +// Modify the return type and content of AllocateCannMemory +std::unordered_map> AllocateCannMemory( + const std::unordered_map& tensor_sizes) { + std::unordered_map> memory_info_map; // Changed return type + for (const auto& p : tensor_sizes) { + int device = p.first; + size_t size = p.second; // This is the size! + void* ptr = nullptr; + aclrtSetDevice(device); + aclError ret = aclrtMalloc(&ptr, size, ACL_MEM_MALLOC_HUGE_FIRST); + if (ret != ACL_ERROR_NONE) { + std::cerr << "ACL Error: Failed to allocate " << size << " bytes on device " << device << ": " << ret << std::endl; + // Handle allocation failure appropriately (e.g., throw exception, return empty map) + // For now, we'll continue but this might lead to nullptr in map. + } + memory_info_map[device] = {ptr, size}; // Store both ptr and size + } + return memory_info_map; } +std::unordered_map GetCannMemoryHandles( + // Change input parameter type to match the new AllocateCannMemory return + std::unordered_map>& memory_info_map, + int32_t target_process_id) { + std::unordered_map memory_handles; + for (auto& p : memory_info_map) { // Note: auto& instead of const auto& + int device = p.first; + void* ptr = p.second.first; // The allocated pointer + size_t actual_size = p.second.second; // The actual size! + + std::string handle_str; + + // Use the actual_size directly with target_process_id + // Pass &ptr so it can be updated with shared VA + aclError ret = cannIpcGetMemHandle(&handle_str, &ptr, actual_size, device, target_process_id); + if (ret != ACL_ERROR_NONE) { + // Placeholder for proper logging + // LOG(ERROR) << "Failed to create CANN IPC handle for device " << device + // << " ptr " << ptr << " with size " << actual_size + // << " target_pid " << target_process_id + // << ", error: " << ret; + std::cerr << "ERROR: Failed to create CANN IPC handle for device " << device + << " ptr " << ptr << " with size " << actual_size + << " target_pid " << target_process_id + << ", error: " << ret << std::endl; + // Fallback to old method for compatibility + std::ostringstream oss; + oss << std::hex << reinterpret_cast(ptr) << ":" << std::dec << actual_size; + handle_str = oss.str(); + // LOG(WARNING) << "Using fallback handle format: " << handle_str; + std::cerr << "WARNING: Using fallback handle format: " << handle_str << std::endl; + } else { + // Update the memory map with the shared VA pointer + p.second.first = ptr; + std::cout << "Updated pointer for device " << device << " to shared VA: " << ptr << std::endl; + } + + std::cout << "IPC handle created: " << handle_str << " for target PID: " << target_process_id << std::endl; + memory_handles[device] = handle_str; + } + return memory_handles; +} + +// overloaded function, modify it similarly +// create IPC handle +std::unordered_map> GetCannMemoryHandles( + std::unordered_map>>& memory_info_vectors, // Changed input type + int32_t target_process_id) { + std::unordered_map> memory_handles; + for (auto& p : memory_info_vectors) { // Note: auto& instead of const auto& + auto device = p.first; + auto& ptr_size_pairs = p.second; // This is now a vector of pairs + + std::vector handles; + for (auto& pair_entry : ptr_size_pairs) { // Note: auto& instead of const auto& + void* ptr = pair_entry.first; + size_t actual_size = pair_entry.second; // Get the actual size + + std::string handle_str; + // Pass &ptr so it can be updated with shared VA + aclError ret = cannIpcGetMemHandle(&handle_str, &ptr, actual_size, device, target_process_id); + if (ret != ACL_ERROR_NONE) { + // Placeholder for proper logging + // LOG(ERROR) << "Failed to create CANN IPC handle for device " << device + // << " ptr " << ptr << " with size " << actual_size + // << " target_pid " << target_process_id + // << ", error: " << ret; + std::cerr << "ERROR: Failed to create CANN IPC handle for device " << device + << " ptr " << ptr << " with size " << actual_size + << " target_pid " << target_process_id + << ", error: " << ret << std::endl; + // Fallback to old method for compatibility + std::ostringstream oss; + oss << std::hex << reinterpret_cast(ptr) << ":" << std::dec << actual_size; + handle_str = oss.str(); + // LOG(WARNING) << "Using fallback handle format: " << handle_str; + std::cerr << "WARNING: Using fallback handle format: " << handle_str << std::endl; + } else { + // Update the pair with the shared VA pointer + pair_entry.first = ptr; + std::cout << "Updated pointer for device " << device << " to shared VA: " << ptr << std::endl; + } + + handles.push_back(handle_str); + } + memory_handles[device] = handles; + } + return memory_handles; +} +#else std::unordered_map AllocateCudaMemory( const std::unordered_map& tensor_sizes) { - std::unordered_map memory_ptrs; - for (const auto& p : tensor_sizes) { - int device = p.first; - size_t size = p.second; - void* ptr = nullptr; - cudaSetDevice(device); - cudaMalloc(&ptr, size); - memory_ptrs[device] = ptr; - } - return memory_ptrs; + std::unordered_map memory_ptrs; + for (const auto& p : tensor_sizes) { + int device = p.first; + size_t size = p.second; + void* ptr = nullptr; + cudaSetDevice(device); + cudaMalloc(&ptr, size); + memory_ptrs[device] = ptr; + } + return memory_ptrs; } std::unordered_map GetCudaMemoryHandles( const std::unordered_map& memory_ptrs) { - std::unordered_map memory_handles; - for (const auto& p : memory_ptrs) { - int device = p.first; - void* ptr = p.second; - cudaIpcMemHandle_t handle; - cudaSetDevice(device); - cudaIpcGetMemHandle(&handle, ptr); - memory_handles[device] = std::string(reinterpret_cast(&handle), - sizeof(cudaIpcMemHandle_t)); - } - return memory_handles; + std::unordered_map memory_handles; + for (const auto& p : memory_ptrs) { + int device = p.first; + void* ptr = p.second; + cudaIpcMemHandle_t handle; + cudaSetDevice(device); + cudaIpcGetMemHandle(&handle, ptr); + memory_handles[device] = std::string(reinterpret_cast(&handle), + sizeof(cudaIpcMemHandle_t)); + } + return memory_handles; } std::unordered_map> GetCudaMemoryHandles( const std::unordered_map>& memory_ptrs) { - std::unordered_map> memory_handles; - for (const auto& p : memory_ptrs) { - auto device = p.first; - const auto& ptrs = p.second; - cudaIpcMemHandle_t handle; - cudaSetDevice(device); - - std::vector handles; - for (const auto& ptr : ptrs) { - cudaIpcGetMemHandle(&handle, ptr); - handles.push_back(std::string(reinterpret_cast(&handle), - sizeof(cudaIpcMemHandle_t))); + std::unordered_map> memory_handles; + for (const auto& p : memory_ptrs) { + auto device = p.first; + const auto& ptrs = p.second; + cudaIpcMemHandle_t handle; + cudaSetDevice(device); + + std::vector handles; + for (const auto& ptr : ptrs) { + cudaIpcGetMemHandle(&handle, ptr); + handles.push_back(std::string(reinterpret_cast(&handle), + sizeof(cudaIpcMemHandle_t))); + } + memory_handles[device] = handles; } - memory_handles[device] = handles; - } - return memory_handles; + return memory_handles; } +#endif std::unordered_map GetDeviceUuidMap() { - std::unordered_map gpu_uuid = GetGpuUUID(); - std::unordered_map device_uuid_map; - for (const auto& p : gpu_uuid) { - if (device_uuid_map.find(p.second) != device_uuid_map.end()) { - std::cerr << "Duplicate device id: " << p.second << std::endl; - exit(1); + std::unordered_map gpu_uuid = GetGpuUUID(); + std::unordered_map device_uuid_map; + for (const auto& p : gpu_uuid) { + if (device_uuid_map.find(p.second) != device_uuid_map.end()) { + std::cerr << "Duplicate device id: " << p.second << std::endl; + exit(1); + } + device_uuid_map[p.second] = p.first; } - device_uuid_map[p.second] = p.first; - } - return device_uuid_map; + return device_uuid_map; } \ No newline at end of file diff --git a/sllm_store/csrc/checkpoint/checkpoint.h b/sllm_store/csrc/checkpoint/checkpoint.h index 692365e..c9a3853 100644 --- a/sllm_store/csrc/checkpoint/checkpoint.h +++ b/sllm_store/csrc/checkpoint/checkpoint.h @@ -2,26 +2,28 @@ // ServerlessLLM // Copyright (c) ServerlessLLM Team 2024 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. // -// You may obtain a copy of the License at +// You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // ---------------------------------------------------------------------------- #pragma once #include -#include // One-stop header. +#include // One-stop header. #include #include +#include +#include std::unordered_map SaveTensors( std::vector tensor_names, @@ -36,13 +38,26 @@ std::unordered_map RestoreTensors( const std::unordered_map>& tensor_device_offsets); -// {dev_id: ptr} +// Memory allocation and handle functions for both CUDA and CANN +#ifdef USE_CANN +#include "cann_ipc.h" + +// Function declarations only - implementations are in checkpoint.cpp +std::unordered_map> AllocateCannMemory( + const std::unordered_map& tensor_sizes); +std::unordered_map GetCannMemoryHandles( + std::unordered_map>& memory_info_map, int32_t target_process_id = -1); +std::unordered_map> GetCannMemoryHandles( + std::unordered_map>>& memory_info_vectors, int32_t target_process_id = -1); +#else +// CUDA function declarations std::unordered_map AllocateCudaMemory( const std::unordered_map& tensor_sizes); std::unordered_map GetCudaMemoryHandles( const std::unordered_map& memory_ptrs); std::unordered_map> GetCudaMemoryHandles( const std::unordered_map>& memory_ptrs); -std::unordered_map GetDeviceUuidMap(); +#endif +std::unordered_map GetDeviceUuidMap(); std::unordered_map GetGpuUUID(); \ No newline at end of file diff --git a/sllm_store/csrc/checkpoint/checkpoint_py.cpp b/sllm_store/csrc/checkpoint/checkpoint_py.cpp index 5157289..e139673 100644 --- a/sllm_store/csrc/checkpoint/checkpoint_py.cpp +++ b/sllm_store/csrc/checkpoint/checkpoint_py.cpp @@ -2,30 +2,96 @@ // ServerlessLLM // Copyright (c) ServerlessLLM Team 2024 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. // -// You may obtain a copy of the License at +// You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // ---------------------------------------------------------------------------- #include #include "checkpoint.h" +#include +#include // For getpid() and sleep() + namespace py = pybind11; +void start_profiling() { + std::cout << "PID: " << getpid() << std::endl; + sleep(30); // Pause for 30 seconds to allow perf recording +} + // define pybind11 module PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { + m.def("start_profiling", &start_profiling, "Prints PID and pauses for profiling"); + m.def("save_tensors", &SaveTensors, "Save a state dict") - .def("restore_tensors", &RestoreTensors, "Restore a state dict") - .def("allocate_cuda_memory", &AllocateCudaMemory, "Allocate cuda memory") + .def("restore_tensors", &RestoreTensors, "Restore a state dict"); + +#ifdef USE_CANN + // CANN-specific bindings + m.def("allocate_cann_memory", &AllocateCannMemory, "Allocate CANN memory") + .def( + "get_cann_memory_handles", + [](std::unordered_map>& memory_info_map, + int32_t target_process_id = -1) { + std::unordered_map memory_handles = + GetCannMemoryHandles(memory_info_map, target_process_id); + + std::unordered_map py_memory_handles; + for (const auto& kv : memory_handles) { + py_memory_handles[kv.first] = py::bytes(kv.second); + } + + py::dict updated_ptrs; + for (const auto& kv : memory_info_map) { + updated_ptrs[py::int_(kv.first)] = py::int_(reinterpret_cast(kv.second.first)); + } + + return py::make_tuple(py_memory_handles, updated_ptrs); + }, + py::arg("memory_info_map"), py::arg("target_process_id") = -1, "Get CANN memory handles") + .def( + "get_cann_memory_handles", + [](std::unordered_map>>& memory_info_vectors, + int32_t target_process_id = -1) { + auto memory_handles = GetCannMemoryHandles(memory_info_vectors, target_process_id); + + std::unordered_map> py_memory_handles; + for (const auto& kv : memory_handles) { + std::vector handles; + for (const auto& handle : kv.second) { + handles.push_back(py::bytes(handle)); + } + py_memory_handles[kv.first] = handles; + } + + py::dict updated_ptrs; + for (const auto& kv : memory_info_vectors) { + py::list ptr_list; + for (const auto& pair : kv.second) { + ptr_list.append(py::int_(reinterpret_cast(pair.first))); + } + updated_ptrs[py::int_(kv.first)] = ptr_list; + } + + return py::make_tuple(py_memory_handles, updated_ptrs); + }, + py::arg("memory_info_vectors"), py::arg("target_process_id") = -1, "Get CANN memory handles") + .def("create_pointer_capsule", [](uintptr_t ptr) -> py::capsule { + return py::capsule(reinterpret_cast(ptr)); + }, "Create a capsule from uintptr_t"); +#else + // CUDA-specific bindings + m.def("allocate_cuda_memory", &AllocateCudaMemory, "Allocate cuda memory") .def( "get_cuda_memory_handles", [](const std::unordered_map& memory_ptrs) { @@ -58,7 +124,7 @@ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { .def( "get_cuda_memory_handles", [](const std::unordered_map>& - memory_ptrs) { + memory_ptrs) { std::unordered_map> memory_ptrs_void; for (const auto& kv : memory_ptrs) { std::vector ptrs; @@ -79,6 +145,8 @@ PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { } return py_memory_handles; }, - py::arg("memory_ptrs"), "Get cuda memory handles") - .def("get_device_uuid_map", &GetDeviceUuidMap, "Get device uuid map"); + py::arg("memory_ptrs"), "Get cuda memory handles"); +#endif + + m.def("get_device_uuid_map", &GetDeviceUuidMap, "Get device uuid map"); } \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/cann_error_handling.cpp b/sllm_store/csrc/sllm_store/cann_error_handling.cpp new file mode 100644 index 0000000..bd5ee5d --- /dev/null +++ b/sllm_store/csrc/sllm_store/cann_error_handling.cpp @@ -0,0 +1,37 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#pragma once + +#ifdef USE_CANN +#include "acl/acl.h" +#endif +#include +#include +#include + +#ifdef USE_CANN +#define CANN_CHECK(x, msg) { aclError ret = (x); if (ret != ACL_ERROR_NONE) { LOG(ERROR) << msg << " CANN error: " << ret << std::endl; return -1; } } +#else +#define CANN_CHECK(x, msg) { LOG(ERROR) << "CANN not available: " << msg << std::endl; return -1; } +#endif + +#define CHECK_POSIX(x, msg) { if ((x) < 0) { LOG(ERROR) << msg << " errno: " << errno << "msg: " << strerror(errno); return -1; } } + +#define WAIT_FUTURES(futures, msg) { for (auto& future : futures) { int ret = future.get(); if (ret != 0) { LOG(ERROR) << msg; return ret; } } } + +#define CHECK_RETURN(x, msg) { if ((x) != 0) { LOG(ERROR) << msg; return -1; } } \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/cann_error_handling.h b/sllm_store/csrc/sllm_store/cann_error_handling.h new file mode 100644 index 0000000..54e7529 --- /dev/null +++ b/sllm_store/csrc/sllm_store/cann_error_handling.h @@ -0,0 +1,44 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#pragma once + +#ifdef USE_CANN +#include "acl/acl.h" +#endif +#include +#include +#include + +#ifdef USE_CANN +// Macro to check CANN API call results. If an error occurs, it logs the error and returns -1. +#define CANN_CHECK(x, msg) { aclError ret = (x); if (ret != ACL_ERROR_NONE) { LOG(ERROR) << msg << " CANN error: " << ret << std::endl; return -1; } } +#else +// Placeholder macro when CANN is not enabled. It logs a message indicating CANN is unavailable. +#define CANN_CHECK(x, msg) { LOG(ERROR) << "CANN not available: " << msg << std::endl; return -1; } +#endif + +// Macro to check POSIX system call results. If an error occurs (return value < 0), +// it logs the error message, errno, and strerror, then returns -1. +#define CHECK_POSIX(x, msg) { if ((x) < 0) { LOG(ERROR) << msg << " errno: " << errno << "msg: " << strerror(errno); return -1; } } + +// Macro to wait for a vector of futures. It iterates through each future, +// gets its result, and if any result is non-zero, it logs an error and returns that result. +#define WAIT_FUTURES(futures, msg) { for (auto& future : futures) { int ret = future.get(); if (ret != 0) { LOG(ERROR) << msg; return ret; } } } + +// Macro to check a return value. If the value is non-zero, it logs an error and returns -1. +#define CHECK_RETURN(x, msg) { if ((x) != 0) { LOG(ERROR) << msg; return -1; } } diff --git a/sllm_store/csrc/sllm_store/cann_memory.cpp b/sllm_store/csrc/sllm_store/cann_memory.cpp new file mode 100644 index 0000000..e9593bf --- /dev/null +++ b/sllm_store/csrc/sllm_store/cann_memory.cpp @@ -0,0 +1,81 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#include "cann_memory.h" + +#include +#include +#include + +CannMemory::CannMemory() : data_(nullptr), size_(0), device_(-1) {} + +CannMemory::~CannMemory() { + if (data_) { // Ensure we have data to free +#ifdef USE_CANN + aclError ret = aclrtFree(data_); + if (ret != ACL_ERROR_NONE) { + LOG(ERROR) << "Failed to free CANN memory: " << ret; + } +#endif + } +} + +int CannMemory::Allocate(size_t size, int device) { + if (data_) { + LOG(ERROR) << "Memory already allocated\n"; + return 1; // Indicate error + } + +#ifdef USE_CANN + // Check if device and size are valid + uint32_t deviceCount = 0; + aclError ret = aclrtGetDeviceCount(&deviceCount); + if (ret != ACL_ERROR_NONE || device >= static_cast(deviceCount) || size == 0) { + LOG(ERROR) << "Invalid device or size\n"; + return 1; // Indicate error + } + + // Set device and allocate memory on it + ret = aclrtSetDevice(device); + if (ret != ACL_ERROR_NONE) { + LOG(ERROR) << "Failed to set device " << device << ": " << ret << "\n"; + return ret; + } + + ret = aclrtMalloc(&data_, size, ACL_MEM_MALLOC_HUGE_FIRST); + if (ret != ACL_ERROR_NONE) { + LOG(ERROR) << "Failed to allocate memory on device " << device << ": " << ret << "\n"; + return ret; + } + device_ = device; + size_ = size; + + // Generate IPC handle (CANN uses pointer address as handle string) + std::ostringstream oss; + oss << std::hex << reinterpret_cast(data_); + handle_ = oss.str(); + + return 0; // Indicate success +#else + LOG(ERROR) << "CANN support not compiled\n"; + return 1; +#endif +} + +void* CannMemory::get() const { return data_; } + +std::string CannMemory::getHandle() const { return handle_; } \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/cann_memory.h b/sllm_store/csrc/sllm_store/cann_memory.h new file mode 100644 index 0000000..8c57fa4 --- /dev/null +++ b/sllm_store/csrc/sllm_store/cann_memory.h @@ -0,0 +1,49 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#pragma once + +#include +// CANN headers - these will be available when building with CANN toolkit +#ifdef USE_CANN +#include "acl/acl.h" +#include "hccl/hccl.h" +#endif + +// #include "cann_memory_pool.h" + +class CannMemory { + public: + CannMemory(); + ~CannMemory(); + + // Disable copying and moving + CannMemory(const CannMemory&) = delete; + CannMemory& operator=(const CannMemory&) = delete; + CannMemory(CannMemory&&) = delete; + CannMemory& operator=(CannMemory&&) = delete; + + int Allocate(size_t size, int device); + void* get() const; + std::string getHandle() const; // CANN uses string-based handles + + private: + void* data_; + std::string handle_; // CANN IPC handle as string + size_t size_; + int device_; +}; \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/cann_memory_pool.cpp b/sllm_store/csrc/sllm_store/cann_memory_pool.cpp new file mode 100644 index 0000000..e59e3b2 --- /dev/null +++ b/sllm_store/csrc/sllm_store/cann_memory_pool.cpp @@ -0,0 +1,97 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#include "cann_memory_pool.h" + +#include +#include +#include + +CannMemoryPool::CannMemoryPool(int device_count, size_t size_per_device) + : device_count_(device_count), size_per_device_(size_per_device), + pool_(device_count), handles_(device_count), offsets_(device_count, 0) { + LOG(INFO) << "Creating CannMemoryPool with " << device_count + << " devices and " << size_per_device << " bytes per device"; +#ifdef USE_CANN + for (int i = 0; i < device_count; ++i) { + aclError ret = aclrtSetDevice(i); + if (ret != ACL_ERROR_NONE) { + LOG(FATAL) << "Failed to set device: " << ret; + } + void* ptr; + ret = aclrtMalloc(&ptr, size_per_device, ACL_MEM_MALLOC_HUGE_FIRST); + if (ret != ACL_ERROR_NONE) { + LOG(FATAL) << "Failed to allocate memory on device " << i << ": " << ret; + } + + // Generate IPC handle (CANN uses pointer address as handle string) + std::ostringstream oss; + oss << std::hex << reinterpret_cast(ptr); + handles_[i] = oss.str(); + + pool_[i] = ptr; + } +#else + LOG(FATAL) << "CANN support not compiled"; +#endif +} + +CannMemoryPool::~CannMemoryPool() { +#ifdef USE_CANN + for (int i = 0; i < device_count_; ++i) { + aclError ret = aclrtSetDevice(i); + if (ret != ACL_ERROR_NONE) { + LOG(FATAL) << "Failed to set device: " << ret; + } + ret = aclrtFree(pool_[i]); + if (ret != ACL_ERROR_NONE) { + LOG(ERROR) << "Failed to free memory on device " << i << ": " << ret; + } + } +#endif +} + +int CannMemoryPool::Allocate(size_t size, int device_id, void*& ptr, + std::string& handle) { + if (device_id >= device_count_ || device_id < 0) { + LOG(ERROR) << "Invalid device_id: " << device_id; + return -1; + } + + if (offsets_[device_id] + size > size_per_device_) { + LOG(ERROR) << "Not enough memory on device " << device_id; + return -1; + } + + ptr = static_cast(pool_[device_id]) + offsets_[device_id]; + handle = handles_[device_id]; + offsets_[device_id] += size; + + return 0; +} + +int CannMemoryPool::Deallocate(int device_id, void* ptr) { + if (device_id >= device_count_ || device_id < 0) { + LOG(ERROR) << "Invalid device_id: " << device_id; + return -1; + } + + // Note: Simple pool implementation doesn't actually deallocate individual chunks + // This would need more sophisticated implementation for production use + LOG(WARNING) << "CannMemoryPool deallocate is a no-op in simple implementation"; + return 0; +} \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/cann_memory_pool.h b/sllm_store/csrc/sllm_store/cann_memory_pool.h new file mode 100644 index 0000000..aa10f57 --- /dev/null +++ b/sllm_store/csrc/sllm_store/cann_memory_pool.h @@ -0,0 +1,45 @@ +// ---------------------------------------------------------------------------- +// ServerlessLLM +// Copyright (c) ServerlessLLM Team 2024 +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// ---------------------------------------------------------------------------- +#pragma once + +#include +#include + +// CANN headers - these will be available when building with CANN toolkit +#ifdef USE_CANN +#include "acl/acl.h" +#endif + +class CannMemoryPool { + public: + CannMemoryPool(int device_count, size_t size_per_device); + CannMemoryPool(const CannMemoryPool&) = delete; + CannMemoryPool& operator=(const CannMemoryPool&) = delete; + ~CannMemoryPool(); + + int Allocate(size_t size, int device_id, void*& ptr, + std::string& handle); // CANN uses string handles + int Deallocate(int device_id, void* ptr); + + private: + int device_count_; + size_t size_per_device_; + std::vector pool_; + std::vector handles_; // CANN IPC handles as strings + std::vector offsets_; +}; \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/checkpoint_store.cpp b/sllm_store/csrc/sllm_store/checkpoint_store.cpp index a32ae44..11e8004 100644 --- a/sllm_store/csrc/sllm_store/checkpoint_store.cpp +++ b/sllm_store/csrc/sllm_store/checkpoint_store.cpp @@ -2,18 +2,18 @@ // ServerlessLLM // Copyright (c) ServerlessLLM Team 2024 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. // -// You may obtain a copy of the License at +// You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // ---------------------------------------------------------------------------- #include "checkpoint_store.h" @@ -26,8 +26,14 @@ #include #include #include +#include +#ifdef USE_CANN +#include "cann_error_handling.h" +#include "../checkpoint/cann_ipc.h" +#else #include "error_handling.h" +#endif CheckpointStore::CheckpointStore(const std::string& storage_path, size_t memory_pool_size, int num_thread, @@ -36,210 +42,232 @@ CheckpointStore::CheckpointStore(const std::string& storage_path, memory_pool_size_(memory_pool_size), num_thread_(num_thread), chunk_size_(chunk_size) { - // Get number of GPUs - cudaGetDeviceCount(&num_gpus_); - LOG(INFO) << "Number of GPUs: " << num_gpus_; - - LOG(INFO) << "I/O threads: " << num_thread - << ", chunk size: " << chunk_size / MB << "MB"; - LOG(INFO) << "Storage path: " << storage_path_; - - for (size_t i = 0; i < num_gpus_; ++i) { - cudaSetDevice(i); - - cudaDeviceProp props; - cudaGetDeviceProperties(&props, i); - - // Get GPU UUID - char uuidStr[80]; - snprintf( - uuidStr, sizeof(uuidStr), - "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", - (unsigned char)props.uuid.bytes[0], (unsigned char)props.uuid.bytes[1], - (unsigned char)props.uuid.bytes[2], (unsigned char)props.uuid.bytes[3], - (unsigned char)props.uuid.bytes[4], (unsigned char)props.uuid.bytes[5], - (unsigned char)props.uuid.bytes[6], (unsigned char)props.uuid.bytes[7], - (unsigned char)props.uuid.bytes[8], (unsigned char)props.uuid.bytes[9], - (unsigned char)props.uuid.bytes[10], - (unsigned char)props.uuid.bytes[11], - (unsigned char)props.uuid.bytes[12], - (unsigned char)props.uuid.bytes[13], - (unsigned char)props.uuid.bytes[14], - (unsigned char)props.uuid.bytes[15]); - - gpu_info_map_[i].uuid_ = std::string(uuidStr); - LOG(INFO) << "GPU " << i << " UUID: " << gpu_info_map_[i].uuid_; - - // create stream - cudaError_t err = cudaStreamCreate(&gpu_info_map_[i].stream_); - if (err != cudaSuccess) { - LOG(FATAL) << "cudaStreamCreate error: " << cudaGetErrorString(err); + // Get number of GPUs/NPUs +#ifdef USE_CANN + uint32_t device_count = 0; + aclrtGetDeviceCount(&device_count); + num_gpus_ = static_cast(device_count); +#else + cudaGetDeviceCount(&num_gpus_); +#endif + LOG(INFO) << "Number of GPUs/NPUs: " << num_gpus_; + + LOG(INFO) << "I/O threads: " << num_thread + << ", chunk size: " << chunk_size / MB << "MB"; + LOG(INFO) << "Storage path: " << storage_path_; + + for (size_t i = 0; i < num_gpus_; ++i) { +#ifdef USE_CANN + aclrtSetDevice(i); + + // Get NPU UUID (simplified version for CANN) + char uuidStr[80]; + snprintf(uuidStr, sizeof(uuidStr), "npu-%02zu", i); + gpu_info_map_[i].uuid_ = std::string(uuidStr); + LOG(INFO) << "NPU " << i << " UUID: " << gpu_info_map_[i].uuid_; + + // create stream + aclError ret = aclrtCreateStream(&gpu_info_map_[i].stream_); + if (ret != ACL_ERROR_NONE) { + LOG(FATAL) << "aclrtCreateStream error: " << ret; + } +#else + cudaSetDevice(i); + + cudaDeviceProp props; + cudaGetDeviceProperties(&props, i); + + // Get GPU UUID + char uuidStr[80]; + snprintf( + uuidStr, sizeof(uuidStr), + "%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x", + (unsigned char)props.uuid.bytes[0], (unsigned char)props.uuid.bytes[1], + (unsigned char)props.uuid.bytes[2], (unsigned char)props.uuid.bytes[3], + (unsigned char)props.uuid.bytes[4], (unsigned char)props.uuid.bytes[5], + (unsigned char)props.uuid.bytes[6], (unsigned char)props.uuid.bytes[7], + (unsigned char)props.uuid.bytes[8], (unsigned char)props.uuid.bytes[9], + (unsigned char)props.uuid.bytes[10], + (unsigned char)props.uuid.bytes[11], + (unsigned char)props.uuid.bytes[12], + (unsigned char)props.uuid.bytes[13], + (unsigned char)props.uuid.bytes[14], + (unsigned char)props.uuid.bytes[15]); + + gpu_info_map_[i].uuid_ = std::string(uuidStr); + LOG(INFO) << "GPU " << i << " UUID: " << gpu_info_map_[i].uuid_; + + // create stream + cudaError_t err = cudaStreamCreate(&gpu_info_map_[i].stream_); + if (err != cudaSuccess) { + LOG(FATAL) << "cudaStreamCreate error: " << cudaGetErrorString(err); + } +#endif } - } - // Create a memory pool - memory_pool_ = - std::make_shared(memory_pool_size_, chunk_size_); - LOG(INFO) << "Memory pool created with " << memory_pool_size_ / GB << "GB"; + // Create a memory pool + memory_pool_ = + std::make_shared(memory_pool_size_, chunk_size_); + LOG(INFO) << "Memory pool created with " << memory_pool_size_ / GB << "GB"; } CheckpointStore::~CheckpointStore() { ClearMem(); } int64_t CheckpointStore::RegisterModelInfo(const std::string& model_path) { - std::unique_lock lock_info(model_info_mutex_); - if (model_map_.find(model_path) != model_map_.end()) { - // LOG(WARNING) << "Model " << model_path << " is already regfistered"; - auto model = model_map_.at(model_path); - return model->GetModelSize(); - } + std::unique_lock lock_info(model_info_mutex_); + if (model_map_.find(model_path) != model_map_.end()) { + // LOG(WARNING) << "Model " << model_path << " is already regfistered"; + auto model = model_map_.at(model_path); + return model->GetModelSize(); + } - auto model = std::make_shared(model_path); + auto model = std::make_shared(model_path); - int ret = model->Initialize(storage_path_); - if (ret != 0) { - LOG(ERROR) << "Failed to initialize model " << model_path; - return ret; - } + int ret = model->Initialize(storage_path_); + if (ret != 0) { + LOG(ERROR) << "Failed to initialize model " << model_path; + return ret; + } - model_map_[model_path] = model; + model_map_[model_path] = model; - LOG(INFO) << "Model " << model_path << " is registered"; + LOG(INFO) << "Model " << model_path << " is registered"; - return model->GetModelSize(); + return model->GetModelSize(); } int CheckpointStore::LoadModelFromDisk(const std::string& model_path) { - std::unique_lock lock_info(model_info_mutex_); - auto model = GetModelPtr(model_path); - if (model == nullptr) { - LOG(ERROR) << "Model " << model_path << " is not registered"; - return -1; - } - lock_info.unlock(); - - // Allocate memory - lock_info.lock(); - int remaining_size = model->AllocatePinnedMemory(memory_pool_); - if (remaining_size < 0) { - LOG(ERROR) << "Failed to allocate memory for model " << model_path; - return -1; - } else if (remaining_size > 0) { - int mem_chunks_needed = remaining_size; - std::vector>> - model_last_access_time(model_last_access_time_.begin(), - model_last_access_time_.end()); - std::sort(model_last_access_time.begin(), model_last_access_time.end(), - [](const auto& a, const auto& b) { return a.second < b.second; }); - for (const auto& [model_path, last_access_time] : model_last_access_time) { - auto& model = model_map_[model_path]; - int freed_chunks = - model->TryFreeHost(); // try to free memory, non-blocking - LOG(INFO) << "Free " << freed_chunks << " chunks, remaining " - << mem_chunks_needed; - if (freed_chunks > 0) { - LOG(INFO) << "Model " << model_path << " is freed from memory"; - mem_chunks_needed -= freed_chunks; - if (mem_chunks_needed <= 0) { - break; - } - } - } - if (mem_chunks_needed > 0) { - LOG(ERROR) << "Failed to free enough memory for model " << model_path; - return -1; + std::unique_lock lock_info(model_info_mutex_); + auto model = GetModelPtr(model_path); + if (model == nullptr) { + LOG(ERROR) << "Model " << model_path << " is not registered"; + return -1; } - ssize_t remaining_size = model->AllocatePinnedMemory(memory_pool_); + lock_info.unlock(); + + // Allocate memory + lock_info.lock(); + int remaining_size = model->AllocatePinnedMemory(memory_pool_); if (remaining_size < 0) { - LOG(ERROR) << "Failed to allocate memory for model " << model_path; - return -1; + LOG(ERROR) << "Failed to allocate memory for model " << model_path; + return -1; + } else if (remaining_size > 0) { + int mem_chunks_needed = remaining_size; + std::vector>> + model_last_access_time(model_last_access_time_.begin(), + model_last_access_time_.end()); + std::sort(model_last_access_time.begin(), model_last_access_time.end(), + [](const auto& a, const auto& b) { return a.second < b.second; }); + for (const auto& [model_path, last_access_time] : model_last_access_time) { + auto& model = model_map_[model_path]; + int freed_chunks = + model->TryFreeHost(); // try to free memory, non-blocking + LOG(INFO) << "Free " << freed_chunks << " chunks, remaining " + << mem_chunks_needed; + if (freed_chunks > 0) { + LOG(INFO) << "Model " << model_path << " is freed from memory"; + mem_chunks_needed -= freed_chunks; + if (mem_chunks_needed <= 0) { + break; + } + } + } + if (mem_chunks_needed > 0) { + LOG(ERROR) << "Failed to free enough memory for model " << model_path; + return -1; + } + ssize_t remaining_size = model->AllocatePinnedMemory(memory_pool_); + if (remaining_size < 0) { + LOG(ERROR) << "Failed to allocate memory for model " << model_path; + return -1; + } } - } - model_last_access_time_[model_path] = std::chrono::system_clock::now(); - lock_info.unlock(); + model_last_access_time_[model_path] = std::chrono::system_clock::now(); + lock_info.unlock(); - int ret = model->ToHost(num_thread_); + int ret = model->ToHost(num_thread_); - if (ret != 0) { - LOG(ERROR) << "Failed to load model " << model_path << " to host"; - if (model->FreeHost() != 0) { - LOG(ERROR) << "Failed to free memory for model " << model_path; + if (ret != 0) { + LOG(ERROR) << "Failed to load model " << model_path << " to host"; + if (model->FreeHost() != 0) { + LOG(ERROR) << "Failed to free memory for model " << model_path; + } + return ret; } - return ret; - } - return ret; + return ret; } int CheckpointStore::LoadModelFromDiskAsync(const std::string& model_path) { - std::unique_lock lock_info(model_info_mutex_); - async_tasks_.emplace(std::async(std::launch::async, [this, model_path]() { - return LoadModelFromDisk(model_path); - })); + std::unique_lock lock_info(model_info_mutex_); + async_tasks_.emplace(std::async(std::launch::async, [this, model_path]() { + return LoadModelFromDisk(model_path); + })); - return 0; + return 0; } int CheckpointStore::LoadModelFromMem( const std::string& model_path, const std::string& replica_uuid, const MemCopyHandleListMap& gpu_memory_handles, const MemCopyChunkListMap& mem_copy_chunks) { - // Sanity check - if (model_path.empty() || replica_uuid.empty()) { - LOG(ERROR) << "Model name or replica uuid is empty"; - return -1; - } else if (mem_copy_chunks.empty()) { - LOG(ERROR) << "No memory copy chunk provided"; - return -1; - } else if (gpu_memory_handles.size() != mem_copy_chunks.size()) { - LOG(ERROR) << "Mismatch between memory handles " - << gpu_memory_handles.size() << " and memory copy chunks " - << mem_copy_chunks.size(); - return -1; - } - std::unique_lock lock_info(model_info_mutex_); - auto model = GetModelPtr(model_path); - if (model == nullptr) { - LOG(ERROR) << "Model " << model_path << " is not registered"; - return -1; - } - model_last_access_time_[model_path] = std::chrono::system_clock::now(); - lock_info.unlock(); + // Sanity check + if (model_path.empty() || replica_uuid.empty()) { + LOG(ERROR) << "Model name or replica uuid is empty"; + return -1; + } else if (mem_copy_chunks.empty()) { + LOG(ERROR) << "No memory copy chunk provided"; + return -1; + } else if (gpu_memory_handles.size() != mem_copy_chunks.size()) { + LOG(ERROR) << "Mismatch between memory handles " + << gpu_memory_handles.size() << " and memory copy chunks " + << mem_copy_chunks.size(); + return -1; + } + std::unique_lock lock_info(model_info_mutex_); + auto model = GetModelPtr(model_path); + if (model == nullptr) { + LOG(ERROR) << "Model " << model_path << " is not registered"; + return -1; + } + model_last_access_time_[model_path] = std::chrono::system_clock::now(); + lock_info.unlock(); - LOG(INFO) << "Loading model " << model_path; + LOG(INFO) << "Loading model " << model_path; - // Convert device uuid to device id - std::unordered_map converted_mem_copy_chunks; - for (auto& [device_id, gpu_info] : gpu_info_map_) { - if (mem_copy_chunks.find(gpu_info.uuid_) == mem_copy_chunks.end()) { - continue; + // Convert device uuid to device id + std::unordered_map converted_mem_copy_chunks; + for (auto& [device_id, gpu_info] : gpu_info_map_) { + if (mem_copy_chunks.find(gpu_info.uuid_) == mem_copy_chunks.end()) { + continue; + } + converted_mem_copy_chunks[device_id] = mem_copy_chunks.at(gpu_info.uuid_); } - converted_mem_copy_chunks[device_id] = mem_copy_chunks.at(gpu_info.uuid_); - } - std::unordered_map converted_mem_copy_handles; - for (auto& [device_id, gpu_info] : gpu_info_map_) { - if (gpu_memory_handles.find(gpu_info.uuid_) == gpu_memory_handles.end()) { - continue; + std::unordered_map converted_mem_copy_handles; + for (auto& [device_id, gpu_info] : gpu_info_map_) { + if (gpu_memory_handles.find(gpu_info.uuid_) == gpu_memory_handles.end()) { + continue; + } + converted_mem_copy_handles[device_id] = + gpu_memory_handles.at(gpu_info.uuid_); } - converted_mem_copy_handles[device_id] = - gpu_memory_handles.at(gpu_info.uuid_); - } - // Convert memory handles to device pointers - auto device_ptrs = GetDevicePtrsFromMemHandles(gpu_memory_handles); + // Convert memory handles to device pointers + auto device_ptrs = GetDevicePtrsFromMemHandles(converted_mem_copy_handles, converted_mem_copy_chunks); - auto ret = model->ToGpu(replica_uuid, device_ptrs, converted_mem_copy_chunks, - converted_mem_copy_handles); + auto ret = model->ToGpu(replica_uuid, device_ptrs, converted_mem_copy_chunks, + converted_mem_copy_handles); - // TODO: check if the model is loaded successfully - if (ret != 0) { - LOG(ERROR) << "Failed to load model " << model_path << " to GPU"; - if (model->FreeGpu(replica_uuid) != 0) { - LOG(ERROR) << "Failed to free memory for model " << model_path; + // TODO: check if the model is loaded successfully + if (ret != 0) { + LOG(ERROR) << "Failed to load model " << model_path << " to GPU"; + if (model->FreeGpu(replica_uuid) != 0) { + LOG(ERROR) << "Failed to free memory for model " << model_path; + } } - } - return ret; + return ret; } int CheckpointStore::LoadModelFromMemAsync( @@ -247,93 +275,218 @@ int CheckpointStore::LoadModelFromMemAsync( const std::unordered_map& gpu_memory_handles, const std::unordered_map& mem_copy_chunks) { - std::unique_lock lock_info(model_info_mutex_); - async_tasks_.emplace(std::async( - std::launch::async, - [this, model_path, replica_uuid, gpu_memory_handles, mem_copy_chunks]() { - return LoadModelFromMem(model_path, replica_uuid, gpu_memory_handles, - mem_copy_chunks); - })); - - return 0; + std::unique_lock lock_info(model_info_mutex_); + async_tasks_.emplace(std::async( + std::launch::async, + [this, model_path, replica_uuid, gpu_memory_handles, mem_copy_chunks]() { + return LoadModelFromMem(model_path, replica_uuid, gpu_memory_handles, + mem_copy_chunks); + })); + + return 0; } int CheckpointStore::WaitModelInGpu(const std::string& model_path, const std::string& replica_uuid) { - // check if the model is in memory - std::shared_ptr model; - std::unique_lock lock_info(model_info_mutex_); - if (model_map_.find(model_path) == model_map_.end()) { - LOG(ERROR) << "Model " << model_path << " is not registered"; - return 1; - } - model = model_map_[model_path]; - lock_info.unlock(); + // check if the model is in memory + std::shared_ptr model; + std::unique_lock lock_info(model_info_mutex_); + if (model_map_.find(model_path) == model_map_.end()) { + LOG(ERROR) << "Model " << model_path << " is not registered"; + return 1; + } + model = model_map_[model_path]; + lock_info.unlock(); - return model->WaitInGpu(replica_uuid); + return model->WaitInGpu(replica_uuid); } int CheckpointStore::ClearMem() { - std::unique_lock lock_info(model_info_mutex_); - for (auto& [model_path, model] : model_map_) { - LOG(INFO) << "Unloading model " << model_path; - int ret = model->FreeHost(); - if (ret != 0) { - LOG(ERROR) << "Failed to free memory for model " << model_path; + std::unique_lock lock_info(model_info_mutex_); + for (auto& [model_path, model] : model_map_) { + LOG(INFO) << "Unloading model " << model_path; + int ret = model->FreeHost(); + if (ret != 0) { + LOG(ERROR) << "Failed to free memory for model " << model_path; + } } - } - model_map_.clear(); - LOG(INFO) << "All models unloaded from memory\n"; - return 0; + model_map_.clear(); + LOG(INFO) << "All models unloaded from memory\n"; + return 0; } int CheckpointStore::UnloadModelFromHost(const std::string& model_path) { - std::unique_lock lock_info(model_info_mutex_); - if (model_map_.find(model_path) == model_map_.end()) { - LOG(ERROR) << "Model " << model_path << " is not registered"; - return 1; - } - auto model = model_map_.at(model_path); - lock_info.unlock(); + std::unique_lock lock_info(model_info_mutex_); + if (model_map_.find(model_path) == model_map_.end()) { + LOG(ERROR) << "Model " << model_path << " is not registered"; + return 1; + } + auto model = model_map_.at(model_path); + lock_info.unlock(); - return model->FreeHost(); + return model->FreeHost(); } ModelPtr CheckpointStore::GetModelPtr(const std::string& model_path) { - if (model_map_.find(model_path) == model_map_.end()) { - LOG(ERROR) << "Model " << model_path << " is not registered"; - return nullptr; - } - return model_map_.at(model_path); + if (model_map_.find(model_path) == model_map_.end()) { + LOG(ERROR) << "Model " << model_path << " is not registered"; + return nullptr; + } + return model_map_.at(model_path); } MemPtrListMap CheckpointStore::GetDevicePtrsFromMemHandles( - const MemCopyHandleListMap& memory_handles) { - MemPtrListMap gpu_ptrs; - for (const auto& [device_id, gpu_info] : gpu_info_map_) { - const std::string& uuid = gpu_info.uuid_; - if (memory_handles.find(uuid) == memory_handles.end()) { - continue; - } - auto& handle_list = memory_handles.at(uuid); - for (const auto& handle : handle_list) { - // Convert handle string to cuda handle - cudaIpcMemHandle_t* cuda_handle = - reinterpret_cast(const_cast( - reinterpret_cast(handle.cuda_ipc_handle_.data()))); - void* ptr = nullptr; - - cudaSetDevice(device_id); - cudaError_t err = cudaIpcOpenMemHandle(&ptr, *cuda_handle, - cudaIpcMemLazyEnablePeerAccess); - if (err != cudaSuccess || ptr == nullptr) { - LOG(ERROR) << "Failed to open cuda handle on device " << device_id - << " error: " << cudaGetErrorString(err); - exit(1); - } - - gpu_ptrs[device_id].push_back(ptr); + // Parameter is now correctly keyed by int device_id + const std::unordered_map& memory_handles, + const std::unordered_map& mem_copy_chunks) { + MemPtrListMap gpu_ptrs; + + LOG(INFO) << "=== GetDevicePtrsFromMemHandles DEBUG START ==="; + // Log message corrected to reflect the actual key type + LOG(INFO) << "Total memory handle entries (by device ID): " << memory_handles.size(); + + // Iterate directly over the 'memory_handles' map, as its keys are already device IDs. + // This removes the need for `gpu_info_map_` lookup for finding handles. + for (const auto& [device_id, handle_list] : memory_handles) { + // If you still need the UUID or stream for logging or other operations specific to gpu_info_map_, + // you would look it up using device_id. + // For example: + // auto it = gpu_info_map_.find(device_id); + // if (it == gpu_info_map_.end()) { + // LOG(WARNING) << "GPU info not found for device ID: " << device_id << ". Skipping."; + // continue; + // } + // const std::string& uuid = it->second.uuid_; // If UUID is still needed for context/logging + // aclrtStream stream = it->second.stream_; // If stream is needed for ACL calls + + // Set NPU device context for the current thread/operation +#ifdef USE_CANN + aclrtSetDevice(device_id); + LOG(INFO) << "Set NPU device " << device_id << " context."; +#else + // For CUDA, ensure device is set. + cudaSetDevice(device_id); + LOG(INFO) << "Set CUDA device " << device_id << " context."; +#endif + // Corrected log for device ID being processed + LOG(INFO) << "Processing device " << device_id; + LOG(INFO) << "Found " << handle_list.size() << " handles for device " << device_id; + + for (size_t i = 0; i < handle_list.size(); ++i) { + const auto& handle = handle_list[i]; // This `handle` is a MemCopyHandle object +#ifdef USE_CANN + // Extract the handle string directly from the MemCopyHandle object + std::string handle_str = handle.cuda_ipc_handle_; + LOG(INFO) << "Handle [" << i << "] string: '" << handle_str << "' (length: " << handle_str.length() << ")"; + + if (handle_str.empty()) { + LOG(ERROR) << "Empty CANN IPC handle string for device " << device_id << ". Skipping."; + continue; + } + + // Open IPC handle directly using the handle string + void* ptr = nullptr; + aclError ret = cannIpcOpenMemHandle(&ptr, handle_str, device_id); + if (ret != ACL_ERROR_NONE) { + LOG(ERROR) << "Failed to open CANN IPC handle '" << handle_str + << "' on device " << device_id << ", error: " << ret; + continue; + } + + if (ptr == nullptr) { + LOG(ERROR) << "CANN IPC returned null pointer for handle '" << handle_str << "' on device " << device_id << ". Skipping."; + continue; + } + + LOG(INFO) << "Successfully opened CANN IPC handle '" << handle_str + << "' to device pointer: " << ptr << " on device " << device_id; + + // Optional: Verify the memory is accessible by sampling it + char sample_data[32]; + size_t sample_size = 32; + + // Parse handle string to get size for sampling + size_t actual_shared_size_for_sampling = 0; + size_t colon_pos = handle_str.find(':'); + if (colon_pos != std::string::npos) { + try { + actual_shared_size_for_sampling = std::stoull(handle_str.substr(colon_pos + 1)); + } catch (const std::exception& e) { + LOG(ERROR) << "Failed to parse handle_str '" << handle_str << "': " << e.what(); + actual_shared_size_for_sampling = 0; + } + } else { + LOG(ERROR) << "Invalid handle_str format (missing colon): " << handle_str; + actual_shared_size_for_sampling = 0; + } + + if (actual_shared_size_for_sampling > 0) { + sample_size = std::min(sample_size, actual_shared_size_for_sampling); + } else { + LOG(WARNING) << "Could not determine actual shared memory size for handle '" << handle_str << "'. Sampling with default " << sample_size << " bytes."; + } + + + // * comment it out to increase loading speed + // if (sample_size > 0) { + // aclError sample_ret = aclrtMemcpy( + // sample_data, + // sample_size, + // ptr, + // sample_size, + // ACL_MEMCPY_DEVICE_TO_HOST); + + // if (sample_ret == ACL_ERROR_NONE) { + // LOG(INFO) << "Memory accessibility verified for imported pointer " << ptr; + // std::stringstream ss; + // ss << "Sample data (first " << sample_size << " bytes):" << std::endl; + // for (size_t j = 0; j < sample_size; j += 16) { + // ss << " " << std::hex << std::setfill('0') << std::setw(4) << j << ": "; + // for (size_t k = 0; k < 16 && (j + k) < sample_size; k++) { + // ss << std::setw(2) << static_cast(static_cast(sample_data[j + k])) << " "; + // } + // ss << std::endl; + // } + // LOG(INFO) << ss.str(); + // } else { + // LOG(ERROR) << "Memory accessibility check failed for imported pointer " << ptr + // << ", error: " << sample_ret; + // } + // } else { + // LOG(WARNING) << "Skipping memory accessibility check for handle '" << handle_str << "' as sample size is 0."; + // } + + gpu_ptrs[device_id].push_back(ptr); +#else + // Original CUDA implementation + // Convert handle string to cuda handle + cudaIpcMemHandle_t* cuda_handle = + reinterpret_cast(const_cast( + reinterpret_cast(handle.cuda_ipc_handle_.data()))); + void* ptr = nullptr; + + cudaSetDevice(device_id); + cudaError_t err = cudaIpcOpenMemHandle(&ptr, *cuda_handle, + cudaIpcMemLazyEnablePeerAccess); + if (err != cudaSuccess || ptr == nullptr) { + LOG(ERROR) << "Failed to open cuda handle on device " << device_id + << " error: " << cudaGetErrorString(err); + exit(1); + } + + gpu_ptrs[device_id].push_back(ptr); +#endif } } - return gpu_ptrs; + + LOG(INFO) << "Final gpu_ptrs map size: " << gpu_ptrs.size(); + for (const auto& [dev_id, ptr_list] : gpu_ptrs) { + LOG(INFO) << "Device " << dev_id << " has " << ptr_list.size() << " pointers"; + for (size_t i = 0; i < ptr_list.size(); ++i) { + LOG(INFO) << " Pointer " << i << ": " << ptr_list[i]; + } + } + LOG(INFO) << "=== GetDevicePtrsFromMemHandles DEBUG END ==="; + + return gpu_ptrs; } \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/checkpoint_store.h b/sllm_store/csrc/sllm_store/checkpoint_store.h index 14a004a..f784350 100644 --- a/sllm_store/csrc/sllm_store/checkpoint_store.h +++ b/sllm_store/csrc/sllm_store/checkpoint_store.h @@ -2,18 +2,18 @@ // ServerlessLLM // Copyright (c) ServerlessLLM Team 2024 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. // -// You may obtain a copy of the License at +// You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // ---------------------------------------------------------------------------- #pragma once @@ -27,11 +27,20 @@ #include // Third-party library headers +#ifdef USE_CANN +#include "acl/acl.h" +#else #include +#endif // Own Headers -#include "cuda_memory.h" +#ifdef USE_CANN +#include "cann_memory.h" +// #include "cann_memory_pool.h" +#else +#include "cuda_memory.h_ // #include "cuda_memory_pool.h" +#endif #include "model.h" #include "pinned_memory.h" #include "pinned_memory_pool.h" @@ -72,7 +81,11 @@ class CheckpointStore { // int device_id_; size_t total_memory_ = 0; size_t free_memory_ = 0; - cudaStream_t stream_; +#ifdef USE_CANN + aclrtStream stream_; // CANN stream +#else + cudaStream_t stream_; // CUDA stream +#endif }; const std::filesystem::path storage_path_; @@ -97,11 +110,18 @@ class CheckpointStore { int InitializeModel(const std::shared_ptr& model); int AllocatePinnedMemory(const std::shared_ptr& model); std::vector> CalculateChunks(size_t offset, - size_t size); + size_t size); +#ifdef USE_CANN + int AllocateCannMemory( + const std::shared_ptr& gpu_replica, + std::vector> gpu_memory_sizes); +#else int AllocateCudaMemory( const std::shared_ptr& gpu_replica, std::vector> gpu_memory_sizes); +#endif ModelPtr GetModelByName(const std::string& model_path); MemPtrListMap GetDevicePtrsFromMemHandles( - const MemCopyHandleListMap& memory_handles); + const std::unordered_map& memory_handles, // Mapped by int (device_id) + const std::unordered_map& mem_copy_chunks); }; \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/error_handling.h b/sllm_store/csrc/sllm_store/error_handling.h index 596e7fa..dcacf69 100644 --- a/sllm_store/csrc/sllm_store/error_handling.h +++ b/sllm_store/csrc/sllm_store/error_handling.h @@ -17,7 +17,12 @@ // ---------------------------------------------------------------------------- #pragma once +#ifdef USE_CANN +#include +#include +#else #include +#endif #include #include #include diff --git a/sllm_store/csrc/sllm_store/gpu_replica.cpp b/sllm_store/csrc/sllm_store/gpu_replica.cpp index 694935f..1434b08 100644 --- a/sllm_store/csrc/sllm_store/gpu_replica.cpp +++ b/sllm_store/csrc/sllm_store/gpu_replica.cpp @@ -2,35 +2,66 @@ // ServerlessLLM // Copyright (c) ServerlessLLM Team 2024 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at // -// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 // -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // ---------------------------------------------------------------------------- #include "gpu_replica.h" +#ifdef USE_CANN +#include "acl/acl.h" +#include "../checkpoint/cann_ipc.h" +#else #include +#endif #include void GpuReplica::Clear() { - for (auto& [device_id, device_ptr] : device_ptrs_) { - cudaSetDevice(device_id); - cudaError_t err = cudaIpcCloseMemHandle(device_ptr); - if (err != cudaSuccess) { - LOG(ERROR) << "Failed to close memory handle for device " << device_id - << " error: " << cudaGetErrorString(err); + // Iterate through all device IDs and their corresponding lists of device pointers. + for (auto& [device_id, device_ptr] : device_ptrs_) { +#ifdef USE_CANN + // Set the current NPU device context for the current thread. + aclError ret = aclrtSetDevice(device_id); + if (ret != ACL_ERROR_NONE) { + LOG(ERROR) << "Failed to set device " << device_id << " error: " << ret; + } + + // Iterate through each device pointer that was opened via IPC and close its handle. + aclError close_ret = cannIpcCloseMemHandle(device_ptr); + if (close_ret != ACL_ERROR_NONE) { + LOG(ERROR) << "Failed to close CANN IPC memory handle for device " << device_id + << " pointer " << device_ptr << ", error: " << close_ret; + } else { + LOG(INFO) << "Successfully closed CANN IPC memory handle for device " << device_id + << " pointer " << device_ptr; + } +#else + // For CUDA, set the device and close IPC memory handles. + cudaSetDevice(device_id); + cudaError_t err = cudaIpcCloseMemHandle(device_ptr); + if (err != cudaSuccess) { + LOG(ERROR) << "Failed to close memory handle for device " << device_id + << " error: " << cudaGetErrorString(err); + } +#endif } - } - gpu_loading_queue_.clear(); - tensor_offsets_.clear(); - state_ = MemoryState::INTERRUPTED; - cv_.notify_all(); + // Clear various internal data structures associated with the GPU replica. + gpu_loading_queue_.clear(); // Clear the queue of tensors waiting to be loaded to GPU. + tensor_offsets_.clear(); // Clear the map storing tensor offsets within the GPU memory. + + // Update the memory state to INTERRUPTED, indicating that the replica's memory is no longer valid. + state_ = MemoryState::INTERRUPTED; + + // Notify all waiting threads that the state has changed. This is typically used in conjunction + // with a condition variable (cv_) to unblock threads that might be waiting for the GPU replica + // to be in a specific state (e.g., loaded or ready). + cv_.notify_all(); } \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/model.cpp b/sllm_store/csrc/sllm_store/model.cpp index 2d8a62c..577f416 100644 --- a/sllm_store/csrc/sllm_store/model.cpp +++ b/sllm_store/csrc/sllm_store/model.cpp @@ -2,23 +2,24 @@ // ServerlessLLM // Copyright (c) ServerlessLLM Team 2024 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. // -// You may obtain a copy of the License at +// You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // ---------------------------------------------------------------------------- #include "model.h" #include #include +#include // for posix_memalign <- this fix O_DIRECT issue #include #include @@ -26,585 +27,969 @@ #include #include #include +#include +#include #include #include #include #include // Third-party library headers +#ifdef USE_CANN +#include "acl/acl.h" +#else #include +#endif #include +#ifdef USE_CANN +#include "cann_error_handling.h" +#include "../checkpoint/cann_ipc.h" +#else #include "error_handling.h" +#endif int Model::Initialize(const std::filesystem::path storage_path) { - std::lock_guard lock(mutex_); - if (state_ != MemoryState::UNINITIALIZED) { + std::lock_guard lock(mutex_); + if (state_ != MemoryState::UNINITIALIZED) { + return 0; + } + model_size_ = 0; + partition_sizes_.clear(); + partition_paths_.clear(); + // Attempt to read from 0 until the file is not found + for (int partition_id = 0;; ++partition_id) { + auto tensor_path = storage_path / model_path_ / + ("tensor.data_" + std::to_string(partition_id)); + if (access(tensor_path.c_str(), F_OK) == -1) { + LOG(INFO) << "Tensor file " << tensor_path << " does not exist"; + break; + } + struct stat st; + if (stat(tensor_path.c_str(), &st) != 0) { + LOG(ERROR) << "Failed to get file size of " << tensor_path; + return -1; + } + model_size_ += st.st_size; + partition_sizes_.push_back(st.st_size); + partition_paths_.push_back(tensor_path); + } + if (model_size_ == 0) { + LOG(ERROR) << "Model " << model_path_ << " does not exist"; + return -1; + } + state_ = MemoryState::UNALLOCATED; + return 0; - } - model_size_ = 0; - partition_sizes_.clear(); - partition_paths_.clear(); - // Attempt to read from 0 until the file is not found - for (int partition_id = 0;; ++partition_id) { - auto tensor_path = storage_path / model_path_ / - ("tensor.data_" + std::to_string(partition_id)); - if (access(tensor_path.c_str(), F_OK) == -1) { - LOG(INFO) << "Tensor file " << tensor_path << " does not exist"; - break; - } - struct stat st; - if (stat(tensor_path.c_str(), &st) != 0) { - LOG(ERROR) << "Failed to get file size of " << tensor_path; - return -1; - } - model_size_ += st.st_size; - partition_sizes_.push_back(st.st_size); - partition_paths_.push_back(tensor_path); - } - if (model_size_ == 0) { - LOG(ERROR) << "Model " << model_path_ << " does not exist"; - return -1; - } - state_ = MemoryState::UNALLOCATED; - - return 0; } int Model::ToHost(int num_threads) { - std::unique_lock lock(mutex_); - if (state_ != MemoryState::ALLOCATED) { - if (state_ == MemoryState::LOADING || state_ == MemoryState::LOADED) { - return 0; - } else { - LOG(ERROR) << "Model " << model_path_ << " is at state " << state_; - return -1; - } - } - - std::vector file_descriptors; - // Attempt to read from 0 until the file is not found - for (int partition_id = 0; partition_id < partition_sizes_.size(); - ++partition_id) { - auto tensor_path = partition_paths_[partition_id]; - if (access(tensor_path.c_str(), F_OK) == -1) { - LOG(ERROR) << "File " << tensor_path << " does not exist"; - return -1; - } - - // Open file - int fd = open(tensor_path.c_str(), O_DIRECT | O_RDONLY); - if (fd < 0) { - std::string err = "open() failed for file: " + tensor_path.string() + - ", error: " + strerror(errno); - LOG(ERROR) << err; - return -1; - } - - file_descriptors.push_back(fd); - } - - LOG(INFO) << "Loading model " << model_path_ << " size " << model_size_ - << " to host"; - if (!pinned_mem_ || pinned_mem_->num_chunks() == 0) { - LOG(ERROR) << "CPU memory not allocated"; - return 1; - } - - auto host_buffers = pinned_mem_->get(); - size_t num_chunks = pinned_mem_->num_chunks(); - size_t chunk_size = pinned_mem_->chunk_size(); - host_ptr_vector_ = std::make_shared(); - host_ptr_vector_->init("queue_name", num_chunks); - std::vector> futures; - size_t chunk_per_thread = (num_chunks + num_threads - 1) / num_threads; - LOG(INFO) << "Loading model " << model_path_ << " to host with " - << num_threads << " threads, " << num_chunks << " chunks, " - << chunk_size << " chunk size, " << chunk_per_thread - << " chunks per thread"; - - state_ = MemoryState::LOADING; - lock.unlock(); - - for (int thread_idx = 0; thread_idx < num_threads; ++thread_idx) { - futures.emplace_back(std::async(std::launch::async, [&, thread_idx]() { - size_t partition_id = 0; - size_t file_offset = thread_idx * chunk_per_thread * chunk_size; - while (partition_id < partition_sizes_.size() && - file_offset >= partition_sizes_.at(partition_id)) { - file_offset -= partition_sizes_.at(partition_id); - partition_id += 1; - } - if (partition_id >= partition_sizes_.size()) { - LOG(INFO) << "Thread " << thread_idx << " early exits"; - return 0; - } - LOG(INFO) << "Thread " << thread_idx << " starting from partition " - << partition_id << " offset " << file_offset; - for (size_t chunk_idx = thread_idx * chunk_per_thread; - chunk_idx < (thread_idx + 1) * chunk_per_thread && - chunk_idx < num_chunks; - ++chunk_idx) { - size_t size = - std::min(chunk_size, model_size_ - chunk_idx * chunk_size); - if (host_buffers[chunk_idx] == nullptr) { - LOG(ERROR) << "Host buffer not allocated"; - return -1; + std::unique_lock lock(mutex_); + if (state_ != MemoryState::ALLOCATED) { + if (state_ == MemoryState::LOADING || state_ == MemoryState::LOADED) { + return 0; + } else { + LOG(ERROR) << "Model " << model_path_ << " is at state " << state_; + return -1; } + } - if (state_ == MemoryState::CANCELLED) { - LOG(INFO) << "Loading from disk for model " << model_path_ - << " is cancelled"; - return 0; + LOG(INFO) << "Loading model " << model_path_ << " size " << model_size_ + << " to host"; + if (!pinned_mem_ || pinned_mem_->num_chunks() == 0) { + LOG(ERROR) << "CPU memory not allocated"; + return 1; + } + + auto host_buffers = pinned_mem_->get(); + size_t num_chunks = pinned_mem_->num_chunks(); + size_t chunk_size = pinned_mem_->chunk_size(); + host_ptr_vector_ = std::make_shared(); + host_ptr_vector_->init("queue_name", num_chunks); + std::vector> futures; + size_t chunk_per_thread = (num_chunks + num_threads - 1) / num_threads; + LOG(INFO) << "Loading model " << model_path_ << " to host with " + << num_threads << " threads, " << num_chunks << " chunks, " + << chunk_size << " chunk size, " << chunk_per_thread + << " chunks per thread"; + + state_ = MemoryState::LOADING; + lock.unlock(); + + for (int thread_idx = 0; thread_idx < num_threads; ++thread_idx) { + futures.emplace_back(std::async(std::launch::async, [&, thread_idx]() { + LOG(INFO) << "=== Thread " << thread_idx << " START ==="; + + // Each thread opens its own file descriptors + std::vector thread_fds; + LOG(INFO) << "Thread " << thread_idx << ": Opening " + << partition_sizes_.size() << " partition files"; + + for (int partition_id = 0; partition_id < partition_sizes_.size(); + ++partition_id) { + auto tensor_path = partition_paths_[partition_id]; + LOG(INFO) << "Thread " << thread_idx << ": Opening partition " + << partition_id << ": " << tensor_path; + + // Check file exists first + if (access(tensor_path.c_str(), F_OK) == -1) { + LOG(ERROR) << "Thread " << thread_idx << ": File " << tensor_path + << " does not exist (access check failed)"; + for (int cleanup_fd : thread_fds) close(cleanup_fd); + return -1; + } + + // * If using O_DIRECT, will cause pread() FILE EXISTS error + int fd = open(tensor_path.c_str(), O_DIRECT | O_RDONLY); + if (fd < 0) { + int err_no = errno; + LOG(ERROR) << "Thread " << thread_idx << ": open() failed for " + << tensor_path << ", errno: " << err_no + << ", error: " << strerror(err_no); + for (int cleanup_fd : thread_fds) close(cleanup_fd); + return -1; + } + + // // Get block size for alignment + // struct stat st; + // if (fstat(fd, &st) != 0) { + // int err_no = errno; + // LOG(ERROR) << "Thread " << thread_idx << ": fstat failed for " + // << tensor_path << ", errno: " << err_no + // << ", error: " << strerror(err_no); + // close(fd); + // for (int cleanup_fd : thread_fds) close(cleanup_fd); + // return -1; + // } + // size_t alignment = st.st_blksize; + // if (alignment == 0) { + // alignment = 4096; // Fallback to common page size + // LOG(WARNING) << "Thread " << thread_idx << ": fstat returned 0 blksize, using fallback 4096"; + // } + // LOG(INFO) << "Thread " << thread_idx << ": Using alignment/block size=" << alignment << " for " << tensor_path; + + // // Test pread with aligned buffer and size + // void* test_buf; + // if (posix_memalign(&test_buf, alignment, alignment) != 0) { + // LOG(ERROR) << "Thread " << thread_idx << ": posix_memalign failed for test buffer"; + // close(fd); + // for (int cleanup_fd : thread_fds) close(cleanup_fd); + // return -1; + // } + // ssize_t test_ret = pread(fd, test_buf, alignment, 0); + // free(test_buf); + // if (test_ret < 0) { + // int err_no = errno; + // LOG(ERROR) << "Thread " << thread_idx << ": immediate pread() failed for " + // << tensor_path << ", errno: " << err_no + // << ", error: " << strerror(err_no); + // close(fd); // Clean up this fd before returning + // for (int cleanup_fd : thread_fds) close(cleanup_fd); + // return -1; + // } else { + // LOG(INFO) << "Thread " << thread_idx << ": immediate pread() succeeded, read " + // << test_ret << " bytes"; + // } + + LOG(INFO) << "Thread " << thread_idx << ": Successfully opened " + << "partition " << partition_id << " with fd=" << fd + << ", file size=" << partition_sizes_[partition_id] + << " bytes"; + thread_fds.push_back(fd); + } + + size_t partition_id = 0; + size_t file_offset = thread_idx * chunk_per_thread * chunk_size; + LOG(INFO) << "Thread " << thread_idx + << ": Initial file_offset=" << file_offset; + + // Calculate starting partition + size_t original_offset = file_offset; + while (partition_id < partition_sizes_.size() && + file_offset >= partition_sizes_.at(partition_id)) { + LOG(INFO) << "Thread " << thread_idx << ": Skipping partition " + << partition_id << " (size=" << partition_sizes_.at(partition_id) + << "), remaining offset=" << file_offset; + file_offset -= partition_sizes_.at(partition_id); + partition_id += 1; + } + + if (partition_id >= partition_sizes_.size()) { + LOG(INFO) << "Thread " << thread_idx << " early exits (offset " + << original_offset << " beyond all partitions)"; + for (int fd : thread_fds) close(fd); + return 0; + } + + LOG(INFO) << "Thread " << thread_idx << " starting from partition " + << partition_id << " offset " << file_offset + << " (adjusted from " << original_offset << ")"; + + size_t total_bytes_read = 0; + size_t chunks_processed = 0; + + for (size_t chunk_idx = thread_idx * chunk_per_thread; + chunk_idx < (thread_idx + 1) * chunk_per_thread && + chunk_idx < num_chunks; + ++chunk_idx) { + size_t size = std::min(chunk_size, model_size_ - chunk_idx * chunk_size); + + LOG(INFO) << "Thread " << thread_idx << ": Processing chunk " << chunk_idx + << "/" << num_chunks << ", size=" << size << " bytes"; + + if (host_buffers[chunk_idx] == nullptr) { + LOG(ERROR) << "Thread " << thread_idx << ": Host buffer[" << chunk_idx + << "] is null!"; + for (int fd : thread_fds) close(fd); + return -1; + } + + if (state_ == MemoryState::CANCELLED) { + LOG(INFO) << "Thread " << thread_idx << ": Loading cancelled, processed " + << chunks_processed << " chunks"; + for (int fd : thread_fds) close(fd); + return 0; + } + + size_t remaining_bytes = size; + size_t buffer_offset = 0; + size_t chunk_bytes_read = 0; + + while (remaining_bytes > 0) { + if (partition_id >= partition_sizes_.size()) { + LOG(ERROR) << "Thread " << thread_idx + << ": Unexpected end of partitions at partition " + << partition_id << " while reading chunk " << chunk_idx; + for (int fd : thread_fds) close(fd); + return -1; + } + + int fd = thread_fds[partition_id]; + + // Get alignment again (in case per-partition, but it's per-fd) + struct stat st; + if (fstat(fd, &st) != 0) { + int err_no = errno; + LOG(ERROR) << "Thread " << thread_idx << ": fstat failed during read"; + for (int fd : thread_fds) close(fd); + return -1; + } + size_t alignment = st.st_blksize; + if (alignment == 0) alignment = 4096; + + size_t bytes_left_in_partition = partition_sizes_.at(partition_id) - file_offset; + size_t read_size = std::min(remaining_bytes, bytes_left_in_partition); + + LOG(INFO) << "Thread " << thread_idx << ": Reading " << read_size + << " bytes from partition " << partition_id << " at offset " + << file_offset << " (fd=" << fd << ")"; + + // O_DIRECT aligned read using temp buffer + size_t offset_misalign = file_offset % alignment; + size_t aligned_offset = file_offset - offset_misalign; + size_t aligned_read_size = ((read_size + offset_misalign + alignment - 1) / alignment) * alignment; + + void* temp_buf; + if (posix_memalign(&temp_buf, alignment, aligned_read_size) != 0) { + LOG(ERROR) << "Thread " << thread_idx << ": posix_memalign failed for read buffer"; + for (int fd : thread_fds) close(fd); + return -1; + } + + ssize_t ret = pread(fd, temp_buf, aligned_read_size, aligned_offset); + if (ret < 0) { + int err_no = errno; + auto tensor_path = partition_paths_[partition_id]; + LOG(ERROR) << "Thread " << thread_idx << ": pread() failed for file: " + << tensor_path << ", errno: " << err_no + << ", error: " << strerror(err_no) << ", fd=" << fd + << ", offset=" << aligned_offset << ", size=" << aligned_read_size; + free(temp_buf); + for (int fd : thread_fds) close(fd); + return -1; + } + if (ret < (ssize_t)(read_size + offset_misalign)) { + LOG(ERROR) << "Thread " << thread_idx << ": Short read for file " + << partition_paths_[partition_id] << ": expected at least " + << (read_size + offset_misalign) << " bytes, got " << ret << " (fd=" << fd + << ", offset=" << aligned_offset << ")"; + free(temp_buf); + for (int fd : thread_fds) close(fd); + return -1; + } + + // Copy the relevant part to the host buffer + memcpy((void*)(host_buffers[chunk_idx] + buffer_offset), + (char*)temp_buf + offset_misalign, + read_size); + free(temp_buf); + + // Simulate ret as read_size for the rest of the code + ret = read_size; + + // Sample first few bytes to verify data is non-zero + if (buffer_offset == 0 && chunk_idx % 10 == 0) { + unsigned char* data_ptr = (unsigned char*)(host_buffers[chunk_idx]); + LOG(INFO) << "Thread " << thread_idx << ": Chunk " << chunk_idx + << " first 16 bytes: " << std::hex << std::setfill('0'); + for (int i = 0; i < std::min(16, (int)ret); i++) { + std::cout << std::setw(2) << (int)data_ptr[i] << " "; + } + std::cout << std::dec << std::endl; + } + + remaining_bytes -= ret; + buffer_offset += ret; + file_offset += ret; + chunk_bytes_read += ret; + total_bytes_read += ret; + + // Move to next partition if current one is exhausted + if (file_offset >= partition_sizes_.at(partition_id)) { + LOG(INFO) << "Thread " << thread_idx << ": Finished partition " + << partition_id << ", moving to partition " + << (partition_id + 1); + partition_id += 1; + file_offset = 0; + } + } + + LOG(INFO) << "Thread " << thread_idx << ": Chunk " << chunk_idx + << " completed, read " << chunk_bytes_read << " bytes"; + + host_ptr_vector_->enqueue(chunk_idx, Batch{chunk_idx, size}); + chunks_processed++; + } + + // Close thread-specific file descriptors + LOG(INFO) << "Thread " << thread_idx << ": Closing " + << thread_fds.size() << " file descriptors"; + for (int i = 0; i < thread_fds.size(); i++) { + close(thread_fds[i]); + LOG(INFO) << "Thread " << thread_idx << ": Closed fd=" << thread_fds[i] + << " for partition " << i; + } + + LOG(INFO) << "=== Thread " << thread_idx << " COMPLETE: processed " + << chunks_processed << " chunks, read " << total_bytes_read + << " bytes total ==="; + return 0; + })); + } + + bool error = false; + for (auto& future : futures) { + int ret = future.get(); + if (ret != 0) { + LOG(ERROR) << "Error reading from disk, ret " << ret; + error = true; } + } - int fd = file_descriptors[partition_id]; - ssize_t ret = - pread(fd, (void*)host_buffers[chunk_idx], size, file_offset); - if (ret < 0) { - auto tensor_path = partition_paths_[partition_id]; - LOG(ERROR) << "pread() failed for file: " << tensor_path - << ", error: " << strerror(errno); - return -1; - } else if (ret != size) { - if (ret < size && partition_id + 1 < file_descriptors.size()) { - partition_id += 1; - file_offset = 0; - size_t remaining_size = size - ret; - int fd = file_descriptors[partition_id]; - ret = pread(fd, (void*)(host_buffers[chunk_idx] + ret), - remaining_size, file_offset); - if (ret != remaining_size) { - auto tensor_path = partition_paths_[partition_id]; - LOG(ERROR) << "Failed to read file: " << tensor_path - << " read: " << ret << " expected: " << remaining_size; - return -1; + lock.lock(); + if (error) { + state_ = MemoryState::INTERRUPTED; + // Deal with gpu replicas + for (auto& [replica_uuid, gpu_replica] : gpu_replicas_) { + if (gpu_replica->state_ == MemoryState::LOADING) { + gpu_replica->state_ = MemoryState::CANCELLED; + gpu_replica->cv_.notify_all(); } - } else { - auto tensor_path = partition_paths_[partition_id]; - LOG(ERROR) << "Failed to read file: " << tensor_path - << " read: " << ret << " expected: " << size; - return -1; - } + // wait for gpu replicas to finish + gpu_replica->cv_.wait(lock, [&gpu_replica] { + return gpu_replica->state_ == MemoryState::LOADED || + gpu_replica->state_ == MemoryState::INTERRUPTED; + }); + // Note: gpu replicas will be handled by the caller } - file_offset += ret; + // release pinned memory + pinned_mem_.reset(); + state_ = MemoryState::UNALLOCATED; - host_ptr_vector_->enqueue(chunk_idx, Batch{chunk_idx, size}); - } + return -1; + } - return 0; - })); - } + // === HOST MEMORY VALIDATION DEBUG === + LOG(INFO) << "=== HOST MEMORY VALIDATION START ==="; + LOG(INFO) << "Validating host memory after file loading completion"; + LOG(INFO) << "Total chunks: " << num_chunks << ", chunk size: " << chunk_size; - bool error = false; - for (auto& future : futures) { - int ret = future.get(); - if (ret != 0) { - LOG(ERROR) << "Error reading from disk, ret " << ret; - error = true; - } - } + size_t total_non_zero_bytes = 0; + size_t total_zero_bytes = 0; - // close file - for (int fd : file_descriptors) { - close(fd); - } + // Sample multiple chunks across the entire model + std::vector sample_chunks; + sample_chunks.push_back(0); // First chunk + sample_chunks.push_back(num_chunks / 4); // 25% through + sample_chunks.push_back(num_chunks / 2); // 50% through + sample_chunks.push_back(3 * num_chunks / 4); // 75% through + sample_chunks.push_back(num_chunks - 1); // Last chunk - lock.lock(); - if (error) { - state_ = MemoryState::INTERRUPTED; - // Deal with gpu replicas - for (auto& [replica_uuid, gpu_replica] : gpu_replicas_) { - if (gpu_replica->state_ == MemoryState::LOADING) { - gpu_replica->state_ = MemoryState::CANCELLED; - gpu_replica->cv_.notify_all(); - } - // wait for gpu replicas to finish - gpu_replica->cv_.wait(lock, [&gpu_replica] { - return gpu_replica->state_ == MemoryState::LOADED || - gpu_replica->state_ == MemoryState::INTERRUPTED; - }); - // Note: gpu replicas will be handled by the caller - } - // release pinned memory - pinned_mem_.reset(); - state_ = MemoryState::UNALLOCATED; + for (size_t chunk_idx : sample_chunks) { + if (chunk_idx >= num_chunks) continue; - return -1; - } + LOG(INFO) << "Sampling chunk " << chunk_idx << "/" << num_chunks; + unsigned char* chunk_data = (unsigned char*)host_buffers[chunk_idx]; - state_ = MemoryState::LOADED; - LOG(INFO) << "Finished loading model " << model_path_ << " from disk"; + if (chunk_data == nullptr) { + LOG(ERROR) << "Host buffer[" << chunk_idx << "] is null!"; + continue; + } - return 0; -} + size_t actual_chunk_size = std::min(chunk_size, model_size_ - chunk_idx * chunk_size); + LOG(INFO) << "Chunk " << chunk_idx << " size: " << actual_chunk_size << " bytes"; -int Model::ToGpu( - const std::string& replica_uuid, const MemPtrListMap& device_ptrs, - const std::unordered_map& mem_copy_chunks, - const std::unordered_map& mem_copy_handles) { - std::unique_lock lock(mutex_); - if (state_ == MemoryState::UNINITIALIZED) { - LOG(ERROR) << "Model " << model_path_ << " is not initialized"; - return -1; - } - - if (gpu_replicas_.find(replica_uuid) != gpu_replicas_.end()) { - LOG(ERROR) << "Replica " << replica_uuid << " already exists"; - return -1; - } - LOG(INFO) << "Creating replica " << replica_uuid; - gpu_replicas_.emplace(replica_uuid, std::make_shared()); - GpuReplicaPtr gpu_replica = gpu_replicas_.at(replica_uuid); - for (const auto& [device_id, _] : device_ptrs) { - LOG(INFO) << "Creating queue for device " << device_id; - gpu_replica->gpu_loading_queue_.emplace(device_id, - std::make_shared()); - } - gpu_replica->device_ptrs_ = device_ptrs; - gpu_replica->state_ = MemoryState::LOADING; - LOG(INFO) << "Created replica " << replica_uuid; - cv_.notify_all(); - lock.unlock(); - - // Start a dispatcher first - auto dispatch_future = std::async( - std::launch::async, - [this, gpu_replica, mem_copy_chunks, mem_copy_handles]() { - return DispatchToGpu(gpu_replica, mem_copy_chunks, mem_copy_handles); - }); - - LOG(INFO) << "Dispatcher started for model " << model_path_; - - std::unordered_map> futures; - for (auto& [device_id, device_ptr_list] : device_ptrs) { - futures.emplace( - device_id, std::async(std::launch::async, [this, gpu_replica, device_id, - device_ptr_list]() { - auto gpu_loading_queue = - gpu_replica->gpu_loading_queue_.at(device_id); - if (!pinned_mem_ || pinned_mem_->num_chunks() == 0) { - LOG(ERROR) << "CPU memory not allocated"; - return 1; - } - - cudaError_t err = cudaSetDevice(device_id); - if (err != cudaSuccess) { - LOG(ERROR) << "Error setting device " << cudaGetErrorString(err); - return 1; - } - - auto& host_buffers = pinned_mem_->get(); - - size_t loaded_size = 0; - while (true) { - auto [chunk_id, chunk_offset, size, gpu_offset, handle_idx] = - gpu_loading_queue->dequeue(); - if (size == 0) { - break; + // Count zero vs non-zero bytes in first 1KB + size_t sample_size = std::min((size_t)1024, actual_chunk_size); + size_t chunk_zero_bytes = 0; + size_t chunk_non_zero_bytes = 0; + + for (size_t i = 0; i < sample_size; i++) { + if (chunk_data[i] == 0) { + chunk_zero_bytes++; + } else { + chunk_non_zero_bytes++; + } + } + + total_zero_bytes += chunk_zero_bytes; + total_non_zero_bytes += chunk_non_zero_bytes; + + LOG(INFO) << "Chunk " << chunk_idx << " sample (first " << sample_size + << " bytes): " << chunk_non_zero_bytes << " non-zero, " + << chunk_zero_bytes << " zero bytes"; + + // Show hex dump of first 64 bytes + LOG(INFO) << "Chunk " << chunk_idx << " first 64 bytes (hex):"; + for (size_t i = 0; i < std::min((size_t)64, actual_chunk_size); i += 16) { + std::cout << " " << std::hex << std::setfill('0') << std::setw(8) << i << ": "; + for (size_t j = 0; j < 16 && (i + j) < std::min((size_t)64, actual_chunk_size); j++) { + std::cout << std::setw(2) << (int)chunk_data[i + j] << " "; } - if (gpu_replica->state_ == MemoryState::CANCELLED) { - LOG(INFO) << "Loading from mem for model " << model_path_ - << " is cancelled," - << " chunk " << chunk_id << " offset " - << " size " << size; - return 0; + std::cout << std::dec << std::endl; + } + + // Show as float16 values (first 32 bytes = 16 float16 values) + if (actual_chunk_size >= 32) { + LOG(INFO) << "Chunk " << chunk_idx << " first 16 float16 values:"; + uint16_t* float16_data = (uint16_t*)chunk_data; + for (int i = 0; i < 16; i++) { + // Convert float16 to float32 for display + uint32_t f32_bits = ((uint32_t)(float16_data[i] & 0x8000)) << 16; // Sign + if ((float16_data[i] & 0x7c00) != 0) { // Not zero/denormal + f32_bits |= (((uint32_t)(float16_data[i] & 0x7c00) + 0x1c000)) << 13; // Exponent + f32_bits |= ((uint32_t)(float16_data[i] & 0x03ff)) << 13; // Mantissa + } + float f32_val = *(float*)&f32_bits; + std::cout << f32_val << " "; } + std::cout << std::endl; + } + } - CUDA_CHECK( - cudaMemcpy( - (void*)((char*)device_ptr_list[handle_idx] + gpu_offset), - (void*)(host_buffers[chunk_id] + chunk_offset), size, - cudaMemcpyHostToDevice), - "cudaMemcpy Error"); - loaded_size += size; - } + LOG(INFO) << "HOST MEMORY SUMMARY:"; + LOG(INFO) << " Total sampled bytes: " << (total_zero_bytes + total_non_zero_bytes); + LOG(INFO) << " Non-zero bytes: " << total_non_zero_bytes; + LOG(INFO) << " Zero bytes: " << total_zero_bytes; + LOG(INFO) << " Non-zero percentage: " + << (100.0 * total_non_zero_bytes / (total_zero_bytes + total_non_zero_bytes)) + << "%"; + + if (total_non_zero_bytes == 0) { + LOG(ERROR) << "*** CRITICAL: ALL HOST MEMORY IS ZERO! File loading failed! ***"; + } else if (total_non_zero_bytes < (total_zero_bytes + total_non_zero_bytes) / 10) { + LOG(WARNING) << "*** WARNING: Less than 10% non-zero data in host memory ***"; + } else { + LOG(INFO) << "*** HOST MEMORY VALIDATION PASSED: Contains non-zero data ***"; + } - LOG(INFO) << "Finished loading tensor from memory to device " - << device_id; + LOG(INFO) << "=== HOST MEMORY VALIDATION END ==="; - return 0; - })); - } - - LOG(INFO) << "Waiting for model " << model_path_ << " num tasks " - << futures.size() << " state " << gpu_replica->state_; - dispatch_future.wait(); - bool error = false; - for (auto& [device_id, future] : futures) { - int ret = future.get(); - if (ret != 0) { - LOG(ERROR) << "Error copying to device " << device_id; - error = true; - } - } - - lock.lock(); - futures.clear(); - - if (error) { - LOG(ERROR) << "Failed to load model " << model_path_; - gpu_replica->state_ = MemoryState::INTERRUPTED; - } else { - gpu_replica->state_ = MemoryState::LOADED; - } - gpu_replica->cv_.notify_all(); - - // TODO: move to background thread - for (auto& [device_id, device_ptr_list] : gpu_replica->device_ptrs_) { - cudaSetDevice(device_id); - for (auto device_ptr : device_ptr_list) { - cudaError_t err = cudaIpcCloseMemHandle(device_ptr); - if (err != cudaSuccess) { - LOG(ERROR) << "Failed to close memory handle for device " << device_id - << " error: " << cudaGetErrorString(err); - } - } - } - - if (gpu_replica->state_ == MemoryState::INTERRUPTED) { - LOG(ERROR) << "Model " << model_path_ << " replica " << replica_uuid - << " is interrupted"; - return -1; - } - - return 0; + state_ = MemoryState::LOADED; + LOG(INFO) << "Finished loading model " << model_path_ << " from disk"; + + return 0; +} + +int Model::ToGpu(const std::string& replica_uuid, + const MemPtrListMap& device_ptrs, + const std::unordered_map& mem_copy_chunks, + const std::unordered_map& mem_copy_handles) { + std::unique_lock lock(mutex_); + if (state_ == MemoryState::UNINITIALIZED) { + LOG(ERROR) << "Model " << model_path_ << " is not initialized"; + return -1; + } + + if (gpu_replicas_.find(replica_uuid) != gpu_replicas_.end()) { + LOG(ERROR) << "Replica " << replica_uuid << " already exists"; + return -1; + } + LOG(INFO) << "Creating replica " << replica_uuid; + gpu_replicas_.emplace(replica_uuid, std::make_shared()); + GpuReplicaPtr gpu_replica = gpu_replicas_.at(replica_uuid); + for (const auto& [device_id, _] : device_ptrs) { + LOG(INFO) << "Creating queue for device " << device_id; + gpu_replica->gpu_loading_queue_.emplace(device_id, + std::make_shared()); + } + gpu_replica->device_ptrs_ = device_ptrs; + gpu_replica->state_ = MemoryState::LOADING; + LOG(INFO) << "Created replica " << replica_uuid; + cv_.notify_all(); + lock.unlock(); + + // Start a dispatcher first + auto dispatch_future = std::async( + std::launch::async, + [this, gpu_replica, mem_copy_chunks, mem_copy_handles]() { + return DispatchToGpu(gpu_replica, mem_copy_chunks, mem_copy_handles); + }); + + LOG(INFO) << "Dispatcher started for model " << model_path_; + + std::unordered_map> futures; + for (auto& [device_id, device_ptr_list] : device_ptrs) { + futures.emplace( + device_id, std::async(std::launch::async, [this, gpu_replica, device_id, + device_ptr_list]() { + auto gpu_loading_queue = + gpu_replica->gpu_loading_queue_.at(device_id); + if (!pinned_mem_ || pinned_mem_->num_chunks() == 0) { + LOG(ERROR) << "CPU memory not allocated"; + return 1; + } + +#ifdef USE_CANN + aclError ret = aclrtSetDevice(device_id); + if (ret != ACL_ERROR_NONE) { + LOG(ERROR) << "Error setting device " << ret; + return 1; + } +#else + cudaError_t err = cudaSetDevice(device_id); + if (err != cudaSuccess) { + LOG(ERROR) << "Error setting device " << cudaGetErrorString(err); + return 1; + } +#endif + + auto& host_buffers = pinned_mem_->get(); + + size_t loaded_size = 0; + size_t total_chunks_processed = 0; + LOG(INFO) << "=== NPU LOADING DEBUG: Device " << device_id << " START ==="; + + while (true) { + auto [chunk_id, chunk_offset, size, gpu_offset, handle_idx] = + gpu_loading_queue->dequeue(); + if (size == 0) { + LOG(INFO) << "=== NPU LOADING DEBUG: Device " << device_id + << " - End signal received, processed " << total_chunks_processed << " chunks ==="; + break; + } + if (gpu_replica->state_ == MemoryState::CANCELLED) { + LOG(INFO) << "Loading from mem for model " << model_path_ + << " is cancelled," + << " chunk " << chunk_id << " offset " + << " size " << size; + return 0; + } + +#ifdef USE_CANN + aclrtSetDevice(device_id); + + if (device_ptr_list[handle_idx] == nullptr) { + LOG(ERROR) << "Device pointer is null for handle " << handle_idx << " on Device " << device_id; + return 1; + } + + // Debug: Sample host data before copying + if (total_chunks_processed % 50 == 0) { // Sample every 50th chunk + LOG(INFO) << "NPU COPY DEBUG: Chunk " << chunk_id << ", offset " << chunk_offset + << ", size " << size << ", gpu_offset " << gpu_offset; + + unsigned char* host_data = (unsigned char*)(host_buffers[chunk_id] + chunk_offset); + LOG(INFO) << "Host data before copy (first 32 bytes):"; + for (int i = 0; i < std::min(32, (int)size); i += 16) { + std::cout << " " << std::hex << std::setfill('0') << std::setw(8) << i << ": "; + for (int j = 0; j < 16 && (i + j) < std::min(32, (int)size); j++) { + std::cout << std::setw(2) << (int)host_data[i + j] << " "; + } + std::cout << std::dec << std::endl; + } + } + + aclError ret = aclrtMemcpy( + (void*)((char*)device_ptr_list[handle_idx] + gpu_offset), + size, + (const void*)(host_buffers[chunk_id] + chunk_offset), + size, + ACL_MEMCPY_HOST_TO_DEVICE); + if (ret != 0) { + LOG(ERROR) << "device_ptr_list[handle_idx]" << (void*)((char*)device_ptr_list[handle_idx] + gpu_offset) + << "host buffer" << (const void*)(host_buffers[chunk_id] + chunk_offset) << "size" << size; + + LOG(ERROR) << "Failed to copy memory from host to device " + << device_id << " error: " << ret; + return 1; + } + + // // Debug: Verify NPU data after copying + // if (total_chunks_processed % 50 == 0) { // Sample every 50th chunk + // LOG(INFO) << "NPU COPY SUCCESS: Host→NPU copy completed for chunk " << chunk_id; + + // // Sample NPU memory to verify the copy worked + // char npu_sample[32]; + // aclError sample_ret = aclrtMemcpy( + // npu_sample, + // sizeof(npu_sample), + // (void*)((char*)device_ptr_list[handle_idx] + gpu_offset), + // std::min((size_t)32, size), + // ACL_MEMCPY_DEVICE_TO_HOST); + + // if (sample_ret == ACL_ERROR_NONE) { + // LOG(INFO) << "NPU data after copy (first 32 bytes):"; + // for (int i = 0; i < std::min(32, (int)size); i += 16) { + // std::cout << " " << std::hex << std::setfill('0') << std::setw(8) << i << ": "; + // for (int j = 0; j < 16 && (i + j) < std::min(32, (int)size); j++) { + // std::cout << std::setw(2) << (int)(unsigned char)npu_sample[i + j] << " "; + // } + // std::cout << std::dec << std::endl; + // } + + // // Compare host vs NPU data + // unsigned char* host_data = (unsigned char*)(host_buffers[chunk_id] + chunk_offset); + // bool data_matches = true; + // for (int i = 0; i < std::min(32, (int)size); i++) { + // if (host_data[i] != (unsigned char)npu_sample[i]) { + // data_matches = false; + // break; + // } + // } + + // if (data_matches) { + // LOG(INFO) << "✅ HOST → NPU DATA VERIFICATION PASSED for chunk " << chunk_id; + // } else { + // LOG(ERROR) << "❌ HOST → NPU DATA MISMATCH for chunk " << chunk_id; + // } + // } else { + // LOG(ERROR) << "Failed to sample NPU memory for verification, error: " << sample_ret; + // } + // } +#else + CUDA_CHECK( + cudaMemcpy( + (void*)((char*)device_ptr_list[handle_idx] + gpu_offset), + (void*)(host_buffers[chunk_id] + chunk_offset), size, + cudaMemcpyHostToDevice), + "cudaMemcpy Error"); +#endif + loaded_size += size; + total_chunks_processed++; + } + + LOG(INFO) << "=== NPU LOADING COMPLETE: Device " << device_id + << " - Loaded " << loaded_size << " bytes in " << total_chunks_processed << " chunks ==="; + LOG(INFO) << "Finished loading tensor from memory to device " + << device_id; + + return 0; + })); + } + + LOG(INFO) << "Waiting for model " << model_path_ << " num tasks " + << futures.size() << " state " << gpu_replica->state_; + dispatch_future.wait(); + bool error = false; + for (auto& [device_id, future] : futures) { + int ret = future.get(); + if (ret != 0) { + LOG(ERROR) << "Error copying to device " << device_id; + error = true; + } + } + + lock.lock(); + futures.clear(); + + if (error) { + LOG(ERROR) << "Failed to load model " << model_path_; + gpu_replica->state_ = MemoryState::INTERRUPTED; + } else { + gpu_replica->state_ = MemoryState::LOADED; + } + gpu_replica->cv_.notify_all(); + + // TODO: move to background thread + for (auto& [device_id, device_ptr_list] : gpu_replica->device_ptrs_) { +#ifdef USE_CANN + aclrtSetDevice(device_id); + for (auto device_ptr : device_ptr_list) { + // CRITICAL FIX: Use real CANN IPC cleanup now that we have proper IPC + aclError ret = cannIpcCloseMemHandle(device_ptr); + if (ret != ACL_ERROR_NONE) { + LOG(ERROR) << "Failed to close CANN IPC handle for device " << device_id + << " pointer " << device_ptr << ", error: " << ret; + } else { + LOG(INFO) << "Successfully closed CANN IPC handle for device " << device_id + << " pointer " << device_ptr; + } + } +#else + cudaSetDevice(device_id); + for (auto device_ptr : device_ptr_list) { + cudaError_t err = cudaIpcCloseMemHandle(device_ptr); + if (err != cudaSuccess) { + LOG(ERROR) << "Failed to close memory handle for device " << device_id + << " error: " << cudaGetErrorString(err); + } + } +#endif + } + + if (gpu_replica->state_ == MemoryState::INTERRUPTED) { + LOG(ERROR) << "Model " << model_path_ << " replica " << replica_uuid + << " is interrupted"; + return -1; + } + + return 0; } int Model::WaitInHost() { - std::unique_lock lock(mutex_); - if (state_ < MemoryState::LOADED) { - cv_.wait(lock, [this] { - return state_ == MemoryState::LOADED || - state_ == MemoryState::INTERRUPTED; - }); - } - - if (state_ >= MemoryState::INTERRUPTED) { - LOG(INFO) << "Model " << model_path_ << " is interrupted"; - return 1; - } - - return 0; + std::unique_lock lock(mutex_); + if (state_ < MemoryState::LOADED) { + cv_.wait(lock, [this] { + return state_ == MemoryState::LOADED || + state_ == MemoryState::INTERRUPTED; + }); + } + + if (state_ >= MemoryState::INTERRUPTED) { + LOG(INFO) << "Model " << model_path_ << " is interrupted"; + return 1; + } + + return 0; } int Model::WaitInGpu(const std::string& replica_uuid) { - std::unique_lock lock(mutex_); - if (gpu_replicas_.find(replica_uuid) == gpu_replicas_.end()) { - cv_.wait(lock, [this, replica_uuid] { - return gpu_replicas_.find(replica_uuid) != gpu_replicas_.end(); - }); - } - - auto& gpu_replica = gpu_replicas_.at(replica_uuid); - - if (gpu_replica->state_ < MemoryState::LOADED) { - gpu_replica->cv_.wait(lock, [&gpu_replica] { - return gpu_replica->state_ == MemoryState::LOADED || - gpu_replica->state_ == MemoryState::INTERRUPTED; - }); - } - - if (gpu_replica->state_ >= MemoryState::INTERRUPTED) { - LOG(INFO) << "Model " << model_path_ << " is interrupted"; - return 1; - } - - return 0; + std::unique_lock lock(mutex_); + if (gpu_replicas_.find(replica_uuid) == gpu_replicas_.end()) { + cv_.wait(lock, [this, replica_uuid] { + return gpu_replicas_.find(replica_uuid) != gpu_replicas_.end(); + }); + } + + auto& gpu_replica = gpu_replicas_.at(replica_uuid); + + if (gpu_replica->state_ < MemoryState::LOADED) { + gpu_replica->cv_.wait(lock, [&gpu_replica] { + return gpu_replica->state_ == MemoryState::LOADED || + gpu_replica->state_ == MemoryState::INTERRUPTED; + }); + } + + if (gpu_replica->state_ >= MemoryState::INTERRUPTED) { + LOG(INFO) << "Model " << model_path_ << " is interrupted"; + return 1; + } + + return 0; } int Model::FreeGpu(const std::string& replica_uuid) { - std::unique_lock lock(mutex_); - if (gpu_replicas_.find(replica_uuid) == gpu_replicas_.end()) { - LOG(ERROR) << "Model " << model_path_ << " replica " << replica_uuid - << " is not registered"; - return -1; - } - - auto& gpu_replica = gpu_replicas_.at(replica_uuid); - if (gpu_replica->state_ == MemoryState::UNINITIALIZED) { - LOG(WARNING) << "Model " << model_path_ << " replica " << replica_uuid - << " is not initialized"; + std::unique_lock lock(mutex_); + if (gpu_replicas_.find(replica_uuid) == gpu_replicas_.end()) { + LOG(ERROR) << "Model " << model_path_ << " replica " << replica_uuid + << " is not registered"; + return -1; + } + + auto& gpu_replica = gpu_replicas_.at(replica_uuid); + if (gpu_replica->state_ == MemoryState::UNINITIALIZED) { + LOG(WARNING) << "Model " << model_path_ << " replica " << replica_uuid + << " is not initialized"; + gpu_replicas_.erase(replica_uuid); + return 0; + } + + if (gpu_replica->state_ == MemoryState::LOADING) { + LOG(INFO) << "Waiting for model " << model_path_ << " replica " + << replica_uuid << " to be loaded"; + gpu_replica->cv_.wait(lock, [&gpu_replica] { + return gpu_replica->state_ == MemoryState::LOADED || + gpu_replica->state_ == MemoryState::INTERRUPTED; + }); + } + gpu_replicas_.erase(replica_uuid); return 0; - } - - if (gpu_replica->state_ == MemoryState::LOADING) { - LOG(INFO) << "Waiting for model " << model_path_ << " replica " - << replica_uuid << " to be loaded"; - gpu_replica->cv_.wait(lock, [&gpu_replica] { - return gpu_replica->state_ == MemoryState::LOADED || - gpu_replica->state_ == MemoryState::INTERRUPTED; - }); - } - - gpu_replicas_.erase(replica_uuid); - return 0; } int Model::FreeHost() { - std::unique_lock lock(mutex_); - if (state_ == MemoryState::UNINITIALIZED) { - LOG(WARNING) << "Model " << model_path_ << " is not initialized"; - return 1; - } - - if (state_ == MemoryState::UNALLOCATED) { - LOG(WARNING) << "Model " << model_path_ << " is not allocated"; - return 1; - } - - if (state_ == MemoryState::LOADING) { - LOG(INFO) << "Waiting for model " << model_path_ << " to be loaded"; - cv_.wait(lock, [this] { - return state_ == MemoryState::LOADED || - state_ == MemoryState::INTERRUPTED; - }); - } - - // make sure no gpu replicas are loading - for (auto& [replica_uuid, gpu_replica] : gpu_replicas_) { - if (gpu_replica->state_ == MemoryState::LOADING) { - LOG(INFO) << "Waiting for replica " << replica_uuid << " to be loaded"; - gpu_replica->cv_.wait(lock, [&gpu_replica] { - return gpu_replica->state_ == MemoryState::LOADED || - gpu_replica->state_ == MemoryState::INTERRUPTED; - }); + std::unique_lock lock(mutex_); + if (state_ == MemoryState::UNINITIALIZED) { + LOG(WARNING) << "Model " << model_path_ << " is not initialized"; + return 1; + } + + if (state_ == MemoryState::UNALLOCATED) { + LOG(WARNING) << "Model " << model_path_ << " is not allocated"; + return 1; + } + + if (state_ == MemoryState::LOADING) { + LOG(INFO) << "Waiting for model " << model_path_ << " to be loaded"; + cv_.wait(lock, [this] { + return state_ == MemoryState::LOADED || + state_ == MemoryState::INTERRUPTED; + }); + } + + // make sure no gpu replicas are loading + for (auto& [replica_uuid, gpu_replica] : gpu_replicas_) { + if (gpu_replica->state_ == MemoryState::LOADING) { + LOG(INFO) << "Waiting for replica " << replica_uuid << " to be loaded"; + gpu_replica->cv_.wait(lock, [&gpu_replica] { + return gpu_replica->state_ == MemoryState::LOADED || + gpu_replica->state_ == MemoryState::INTERRUPTED; + }); + } } - } - // free pinned memory - int freed_chunks = pinned_mem_->num_chunks(); - pinned_mem_.reset(); - state_ = MemoryState::UNALLOCATED; + // free pinned memory + int freed_chunks = pinned_mem_->num_chunks(); + pinned_mem_.reset(); + state_ = MemoryState::UNALLOCATED; - return 0; + return 0; } int Model::TryFreeHost() { - std::unique_lock lock(mutex_); - if (state_ == MemoryState::UNINITIALIZED) { - LOG(WARNING) << "Model " << model_path_ << " is not initialized"; - return 0; - } + std::unique_lock lock(mutex_); + if (state_ == MemoryState::UNINITIALIZED) { + LOG(WARNING) << "Model " << model_path_ << " is not initialized"; + return 0; + } - if (state_ == MemoryState::UNALLOCATED) { - LOG(WARNING) << "Model " << model_path_ << " is not allocated"; - return 0; - } + if (state_ == MemoryState::UNALLOCATED) { + LOG(WARNING) << "Model " << model_path_ << " is not allocated"; + return 0; + } - if (state_ == MemoryState::LOADING) { - return -1; - } + if (state_ == MemoryState::LOADING) { + return -1; + } - // make sure no gpu replicas are loading - for (auto& [replica_uuid, gpu_replica] : gpu_replicas_) { - if (gpu_replica->state_ == MemoryState::LOADING) { - return -1; + // make sure no gpu replicas are loading + for (auto& [replica_uuid, gpu_replica] : gpu_replicas_) { + if (gpu_replica->state_ == MemoryState::LOADING) { + return -1; + } } - } - // free pinned memory - int freed_chunks = pinned_mem_->num_chunks(); - pinned_mem_.reset(); - state_ = MemoryState::UNALLOCATED; + // free pinned memory + int freed_chunks = pinned_mem_->num_chunks(); + pinned_mem_.reset(); + state_ = MemoryState::UNALLOCATED; - return freed_chunks; + return freed_chunks; } int Model::DispatchToGpu( const std::shared_ptr& gpu_replica, const std::unordered_map& mem_copy_chunks, const std::unordered_map& mem_copy_handles) { - // device_id, chunk_offset, size, gpu_offset - - size_t num_chunks = pinned_mem_->num_chunks(); - std::vector> chunk_id_to_gpu_chunks(num_chunks); - for (const auto& [device_id, mem_copy_chunk_list] : mem_copy_chunks) { - const auto& device_handles = mem_copy_handles.at(device_id); - std::vector handle_offsets(device_handles.size(), 0); - - for (auto [host_offset, size, gpu_offset, handle_idx] : - mem_copy_chunk_list) { - handle_offsets[handle_idx] = gpu_offset; - - std::vector> chunks = - MapDataToChunks(host_offset, size, pinned_mem_->chunk_size()); - for (const auto& [chunk_id, chunk_offset, size] : chunks) { - chunk_id_to_gpu_chunks[chunk_id].push_back( - std::make_tuple(device_id, chunk_offset, size, - handle_offsets[handle_idx], handle_idx)); - handle_offsets[handle_idx] += size; - } - } - } - - for (int i = 0; i < host_ptr_vector_->capacity(); i++) { - auto data_chunk = host_ptr_vector_->dequeue(i); - auto chunk_id = data_chunk.chunk_id_; - auto& gpu_chunks = chunk_id_to_gpu_chunks[chunk_id]; - for (const auto& [device_id, chunk_offset, size, gpu_offset, handle_idx] : - gpu_chunks) { - auto& gpu_loading_queue = gpu_replica->gpu_loading_queue_.at(device_id); - // LOG(INFO) << "Enqueueing chunk " << chunk_id << " offset " << - // chunk_offset - // << " size " << size << " to device " << device_id; - gpu_loading_queue->enqueue( - GpuBatch{chunk_id, chunk_offset, size, gpu_offset, handle_idx}); - } - } - - // notify end of loading - for (auto& [device_id, gpu_loading_queue] : gpu_replica->gpu_loading_queue_) { - gpu_loading_queue->enqueue(GpuBatch{}); - } - - return 0; + // device_id, chunk_offset, size, gpu_offset + + size_t num_chunks = pinned_mem_->num_chunks(); + std::vector> chunk_id_to_gpu_chunks(num_chunks); + for (const auto& [device_id, mem_copy_chunk_list] : mem_copy_chunks) { + const auto& device_handles = mem_copy_handles.at(device_id); + std::vector handle_offsets(device_handles.size(), 0); + + for (auto [host_offset, size, gpu_offset, handle_idx] : + mem_copy_chunk_list) { + handle_offsets[handle_idx] = gpu_offset; + + std::vector> chunks = + MapDataToChunks(host_offset, size, pinned_mem_->chunk_size()); + for (const auto& [chunk_id, chunk_offset, size] : chunks) { + chunk_id_to_gpu_chunks[chunk_id].push_back( + std::make_tuple(device_id, chunk_offset, size, + handle_offsets[handle_idx], handle_idx)); + handle_offsets[handle_idx] += size; + } + } + } + + for (int i = 0; i < host_ptr_vector_->capacity(); i++) { + auto data_chunk = host_ptr_vector_->dequeue(i); + auto chunk_id = data_chunk.chunk_id_; + auto& gpu_chunks = chunk_id_to_gpu_chunks[chunk_id]; + for (const auto& [device_id, chunk_offset, size, gpu_offset, handle_idx] : + gpu_chunks) { + auto& gpu_loading_queue = gpu_replica->gpu_loading_queue_.at(device_id); + LOG(INFO) << "Enqueueing chunk " << chunk_id << " offset " << chunk_offset + << " size " << size << " to device " << device_id; + gpu_loading_queue->enqueue( + GpuBatch{chunk_id, chunk_offset, size, gpu_offset, handle_idx}); + } + } + + // notify end of loading + for (auto& [device_id, gpu_loading_queue] : gpu_replica->gpu_loading_queue_) { + gpu_loading_queue->enqueue(GpuBatch{}); + } + + return 0; } std::vector> Model::MapDataToChunks( size_t offset, size_t size, size_t chunk_size) { - int start_chunk = offset / chunk_size; - size_t offset_in_start_chunk = offset % chunk_size; - size_t remaining_data = size; - std::vector> output; - - for (int chunk_id = start_chunk; remaining_data > 0; ++chunk_id) { - const size_t chunk_data_size = - (chunk_id == start_chunk) - ? std::min(chunk_size - offset_in_start_chunk, remaining_data) - : std::min(chunk_size, remaining_data); - output.emplace_back(chunk_id, - chunk_id == start_chunk ? offset_in_start_chunk : 0, - chunk_data_size); - remaining_data -= chunk_data_size; - } - - return output; + int start_chunk = offset / chunk_size; + size_t offset_in_start_chunk = offset % chunk_size; + size_t remaining_data = size; + std::vector> output; + + for (int chunk_id = start_chunk; remaining_data > 0; ++chunk_id) { + const size_t chunk_data_size = + (chunk_id == start_chunk) + ? std::min(chunk_size - offset_in_start_chunk, remaining_data) + : std::min(chunk_size, remaining_data); + output.emplace_back(chunk_id, + chunk_id == start_chunk ? offset_in_start_chunk : 0, + chunk_data_size); + remaining_data -= chunk_data_size; + } + + return output; } int Model::AllocatePinnedMemory(std::shared_ptr pool) { - std::lock_guard lock(mutex_); - if (state_ == MemoryState::UNINITIALIZED) { - LOG(ERROR) << "Model " << model_path_ << " is not initialized"; - return -1; - } - if (state_ != MemoryState::UNALLOCATED) { + std::lock_guard lock(mutex_); + if (state_ == MemoryState::UNINITIALIZED) { + LOG(ERROR) << "Model " << model_path_ << " is not initialized"; + return -1; + } + if (state_ != MemoryState::UNALLOCATED) { + return 0; + } + pinned_mem_ = std::make_shared(); + int ret = pinned_mem_->Allocate(model_size_, pool); + if (ret < 0) { + LOG(ERROR) << "Error allocating CPU memory for model " << model_path_; + return ret; + } else if (ret > 0) { + LOG(WARNING) << "Not enough memory for model " << model_path_; + return ret; + } else if (!pinned_mem_ || pinned_mem_->num_chunks() == 0) { + LOG(ERROR) << "CPU memory not allocated"; + return -1; + } + + state_ = MemoryState::ALLOCATED; return 0; - } - pinned_mem_ = std::make_shared(); - int ret = pinned_mem_->Allocate(model_size_, pool); - if (ret < 0) { - LOG(ERROR) << "Error allocating CPU memory for model " << model_path_; - return ret; - } else if (ret > 0) { - LOG(WARNING) << "Not enough memory for model " << model_path_; - return ret; - } else if (!pinned_mem_ || pinned_mem_->num_chunks() == 0) { - LOG(ERROR) << "CPU memory not allocated"; - return -1; - } - - state_ = MemoryState::ALLOCATED; - return 0; -}; \ No newline at end of file +} \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/model.h b/sllm_store/csrc/sllm_store/model.h index b60af26..441ae0e 100644 --- a/sllm_store/csrc/sllm_store/model.h +++ b/sllm_store/csrc/sllm_store/model.h @@ -2,18 +2,18 @@ // ServerlessLLM // Copyright (c) ServerlessLLM Team 2024 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. // -// You may obtain a copy of the License at +// You may obtain a copy of the License at // -// http://www.apache.org/licenses/LICENSE-2.0 +// http://www.apache.org/licenses/LICENSE-2.0 // -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // ---------------------------------------------------------------------------- #pragma once @@ -32,7 +32,12 @@ #include // Third-party library headers +#ifdef USE_CANN +#include +#include +#else #include +#endif #include #include "error_handling.h" @@ -40,53 +45,53 @@ #include "types_and_defs.h" struct GpuReplica { - std::condition_variable cv_; - MemoryState state_ = MemoryState::UNINITIALIZED; + std::condition_variable cv_; + MemoryState state_ = MemoryState::UNINITIALIZED; - std::unordered_map> gpu_loading_queue_; - MemPtrListMap device_ptrs_; + std::unordered_map> gpu_loading_queue_; + MemPtrListMap device_ptrs_; }; using GpuReplicaPtr = std::shared_ptr; class Model { - public: - Model(const std::filesystem::path& model_path) : model_path_(model_path) {} - int Initialize(const std::filesystem::path storage_path); - int AllocatePinnedMemory(std::shared_ptr pool); - int ToHost(int num_threads); - int ToGpu(const std::string& replica_uuid, const MemPtrListMap& device_ptrs, - const std::unordered_map& mem_copy_chunks, - const std::unordered_map& mem_copy_handles); - int WaitInHost(); - int WaitInGpu(const std::string& replica_uuid); - int FreeGpu(const std::string& replica_uuid); - int FreeHost(); - int TryFreeHost(); - uint64_t GetModelSize() const { return model_size_; } +public: + Model(const std::filesystem::path& model_path) : model_path_(model_path) {} + int Initialize(const std::filesystem::path storage_path); + int AllocatePinnedMemory(std::shared_ptr pool); + int ToHost(int num_threads); + int ToGpu(const std::string& replica_uuid, const MemPtrListMap& device_ptrs, + const std::unordered_map& mem_copy_chunks, + const std::unordered_map& mem_copy_handles); + int WaitInHost(); + int WaitInGpu(const std::string& replica_uuid); + int FreeGpu(const std::string& replica_uuid); + int FreeHost(); + int TryFreeHost(); + uint64_t GetModelSize() const { return model_size_; } - private: - std::mutex mutex_; - std::condition_variable cv_; - MemoryState state_ = MemoryState::UNINITIALIZED; +private: + std::mutex mutex_; + std::condition_variable cv_; + MemoryState state_ = MemoryState::UNINITIALIZED; - // Model path - const std::string model_path_; + // Model path + const std::string model_path_; - // Model info needs to be initialized - size_t model_size_; - std::vector partition_sizes_; - std::vector partition_paths_; - std::shared_ptr pinned_mem_; + // Model info needs to be initialized + size_t model_size_; + std::vector partition_sizes_; + std::vector partition_paths_; + std::shared_ptr pinned_mem_; - std::unordered_map gpu_replicas_; + std::unordered_map gpu_replicas_; - std::shared_ptr host_ptr_vector_; + std::shared_ptr host_ptr_vector_; - std::vector> MapDataToChunks( - size_t offset, size_t size, size_t chunk_size); - int DispatchToGpu( - const std::shared_ptr& gpu_replica, - const std::unordered_map& mem_copy_chunks, - const std::unordered_map& mem_copy_handles); + std::vector> MapDataToChunks( + size_t offset, size_t size, size_t chunk_size); + int DispatchToGpu( + const std::shared_ptr& gpu_replica, + const std::unordered_map& mem_copy_chunks, + const std::unordered_map& mem_copy_handles); }; using ModelPtr = std::shared_ptr; \ No newline at end of file diff --git a/sllm_store/csrc/sllm_store/pinned_memory_pool.cpp b/sllm_store/csrc/sllm_store/pinned_memory_pool.cpp index 488c7c1..0851b56 100644 --- a/sllm_store/csrc/sllm_store/pinned_memory_pool.cpp +++ b/sllm_store/csrc/sllm_store/pinned_memory_pool.cpp @@ -2,99 +2,115 @@ // ServerlessLLM // Copyright (c) ServerlessLLM Team 2024 // -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at // -// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 // -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. // ---------------------------------------------------------------------------- #include "pinned_memory_pool.h" +#ifdef USE_CANN +#include "acl/acl.h" +#else #include +#endif #include PinnedMemoryPool::PinnedMemoryPool(size_t total_size, size_t chunk_size) : chunk_size_(chunk_size) { - size_t num_buffers = (total_size + chunk_size - 1) / chunk_size; - if (num_buffers * chunk_size != total_size) { - LOG(ERROR) << "PinnedMemoryPool size not multiple of chunk_size"; - } - LOG(INFO) << "Creating PinnedMemoryPool with " << num_buffers - << " buffers of " << chunk_size << " bytes"; - - for (size_t i = 0; i < num_buffers; ++i) { - char* buffer = static_cast(aligned_alloc(4096, chunk_size_)); - if (buffer == nullptr) { - LOG(FATAL) << "Malloc failed"; + size_t num_buffers = (total_size + chunk_size - 1) / chunk_size; + if (num_buffers * chunk_size != total_size) { + LOG(ERROR) << "PinnedMemoryPool size not multiple of chunk_size"; } + LOG(INFO) << "Creating PinnedMemoryPool with " << num_buffers + << " buffers of " << chunk_size << " bytes"; + + for (size_t i = 0; i < num_buffers; ++i) { +#ifdef USE_CANN + // For CANN, allocate pinned host memory directly + char* buffer = nullptr; + aclError ret = aclrtMallocHost((void**)&buffer, chunk_size_); + if (ret != ACL_ERROR_NONE) { + LOG(FATAL) << "aclrtMallocHost failed: " << ret; + } +#else + char* buffer = static_cast(aligned_alloc(4096, chunk_size_)); + if (buffer == nullptr) { + LOG(FATAL) << "Malloc failed"; + } - cudaError_t err = - cudaHostRegister(buffer, chunk_size_, cudaHostRegisterDefault); - if (err != cudaSuccess) { - LOG(FATAL) << "cudaHostRegister failed: " << cudaGetErrorString(err); + cudaError_t err = + cudaHostRegister(buffer, chunk_size_, cudaHostRegisterDefault); + if (err != cudaSuccess) { + LOG(FATAL) << "cudaHostRegister failed: " << cudaGetErrorString(err); + } +#endif + pool_.insert(buffer); + free_list_.insert(buffer); } - pool_.insert(buffer); - free_list_.insert(buffer); - } } PinnedMemoryPool::~PinnedMemoryPool() { - for (char* buffer : pool_) { - cudaHostUnregister(buffer); - free(buffer); - } + for (char* buffer : pool_) { +#ifdef USE_CANN + aclrtFreeHost(buffer); +#else + cudaHostUnregister(buffer); + free(buffer); +#endif + } } int PinnedMemoryPool::Allocate(size_t size, std::vector& buffers) { - std::lock_guard lock(mutex_); - if (size == 0) { - LOG(ERROR) << "PinnedMemoryPool Allocate size is zero"; - return -1; - } + std::lock_guard lock(mutex_); + if (size == 0) { + LOG(ERROR) << "PinnedMemoryPool Allocate size is zero"; + return -1; + } - int num_buffers_needed = (size + chunk_size_ - 1) / chunk_size_; - if (num_buffers_needed > free_list_.size()) { - LOG(ERROR) << "PinnedMemoryPool out of memory (" << free_list_.size() - << " buffers available, " << num_buffers_needed - << " buffers needed)"; - return num_buffers_needed - free_list_.size(); - } + int num_buffers_needed = (size + chunk_size_ - 1) / chunk_size_; + if (num_buffers_needed > free_list_.size()) { + LOG(ERROR) << "PinnedMemoryPool out of memory (" << free_list_.size() + << " buffers available, " << num_buffers_needed + << " buffers needed)"; + return num_buffers_needed - free_list_.size(); + } - buffers.clear(); - buffers.resize(num_buffers_needed); - auto it = free_list_.begin(); - for (size_t i = 0; i < num_buffers_needed; ++i) { - buffers[i] = *it; - it = free_list_.erase(it); - } + buffers.clear(); + buffers.resize(num_buffers_needed); + auto it = free_list_.begin(); + for (size_t i = 0; i < num_buffers_needed; ++i) { + buffers[i] = *it; + it = free_list_.erase(it); + } - LOG(INFO) << "PinnedMemoryPool Allocate " << buffers.size() << " buffers" - << " free buffers " << free_list_.size() << " total buffers " - << pool_.size(); + LOG(INFO) << "PinnedMemoryPool Allocate " << buffers.size() << " buffers" + << " free buffers " << free_list_.size() << " total buffers " + << pool_.size(); - return 0; // Success + return 0; // Success } int PinnedMemoryPool::Deallocate(std::vector& buffers) { - std::lock_guard lock(mutex_); - for (char* buffer : buffers) { - if (pool_.find(buffer) == pool_.end()) { - LOG(ERROR) << "Buffer not found in pool"; - return -1; + std::lock_guard lock(mutex_); + for (char* buffer : buffers) { + if (pool_.find(buffer) == pool_.end()) { + LOG(ERROR) << "Buffer not found in pool"; + return -1; + } + if (free_list_.find(buffer) != free_list_.end()) { + LOG(ERROR) << "Buffer already in free list"; + return -1; + } + free_list_.insert(buffer); } - if (free_list_.find(buffer) != free_list_.end()) { - LOG(ERROR) << "Buffer already in free list"; - return -1; - } - free_list_.insert(buffer); - } - LOG(INFO) << "Deallocated " << buffers.size() << " buffers"; - return 0; // Success -} + LOG(INFO) << "Deallocated " << buffers.size() << " buffers"; + return 0; // Success +} \ No newline at end of file diff --git a/sllm_store/examples/cann_save_vllm_model.py b/sllm_store/examples/cann_save_vllm_model.py new file mode 100644 index 0000000..102b693 --- /dev/null +++ b/sllm_store/examples/cann_save_vllm_model.py @@ -0,0 +1,136 @@ +import argparse +import os +import shutil +from typing import Optional + + +class VllmModelDownloader: + def __init__(self): + pass + + def download_vllm_model( + self, + model_name: str, + torch_dtype: str, + tensor_parallel_size: int = 1, + storage_path: str = "./models", + local_model_path: Optional[str] = None, + pattern: Optional[str] = None, + max_size: Optional[int] = None, + ): + import gc + from tempfile import TemporaryDirectory + + import torch + import torch_npu + from huggingface_hub import snapshot_download + from vllm import LLM + + # set the model storage path + storage_path = os.getenv("STORAGE_PATH", storage_path) + + def _run_writer(input_dir, model_name): + # load models from the input directory + llm_writer = LLM( + model=input_dir, + download_dir=input_dir, + dtype=torch_dtype, + tensor_parallel_size=tensor_parallel_size, + num_gpu_blocks_override=1, + enforce_eager=True, + max_model_len=1, + ) + model_path = os.path.join(storage_path, model_name) + model_executer = llm_writer.llm_engine.model_executor + # save the models in the ServerlessLLM format + model_executer.save_serverless_llm_state( + path=model_path, pattern=pattern, max_size=max_size + ) + for file in os.listdir(input_dir): + # Copy the metadata files into the output directory + if os.path.splitext(file)[1] not in ( + ".bin", + ".pt", + ".safetensors", + ): + src_path = os.path.join(input_dir, file) + dest_path = os.path.join(model_path, file) + if os.path.isdir(src_path): + shutil.copytree(src_path, dest_path) + else: + shutil.copy(src_path, dest_path) + del model_executer + del llm_writer + gc.collect() + if torch.npu.is_available(): + torch.npu.empty_cache() + torch.npu.synchronize() + + try: + with TemporaryDirectory() as cache_dir: + input_dir = local_model_path + # download from huggingface + if local_model_path is None: + input_dir = snapshot_download( + model_name, + cache_dir=cache_dir, + allow_patterns=[ + "*.safetensors", + "*.bin", + "*.json", + "*.txt", + ], + ) + _run_writer(input_dir, model_name) + except Exception as e: + print(f"An error occurred while saving the model: {e}") + # remove the output dir + shutil.rmtree(os.path.join(storage_path, model_name)) + raise RuntimeError( + f"Failed to save {model_name} for vllm backend: {e}" + ) from e + + +parser = argparse.ArgumentParser( + description="Save a model from HuggingFace model hub." +) +parser.add_argument( + "--model-name", + type=str, + required=True, + help="Model name from HuggingFace model hub.", +) +parser.add_argument( + "--local-model-path", + type=str, + required=False, + help="Local path to the model snapshot.", +) +parser.add_argument( + "--storage-path", + type=str, + default="./models", + help="Local path to save the model.", +) +parser.add_argument( + "--tensor-parallel-size", + type=int, + default=1, + help="Tensor parallel size.", +) + +args = parser.parse_args() + +model_name = args.model_name +local_model_path = args.local_model_path +storage_path = args.storage_path +tensor_parallel_size = args.tensor_parallel_size + +downloader = VllmModelDownloader() +downloader.download_vllm_model( + model_name, + "float16", + tensor_parallel_size=tensor_parallel_size, + storage_path=storage_path, + local_model_path=local_model_path, +) \ No newline at end of file diff --git a/sllm_store/proto/storage.proto b/sllm_store/proto/storage.proto index f2f2d32..20c5973 100644 --- a/sllm_store/proto/storage.proto +++ b/sllm_store/proto/storage.proto @@ -11,6 +11,14 @@ service Storage { rpc RegisterModel (RegisterModelRequest) returns (RegisterModelResponse) {} rpc GetServerConfig (GetServerConfigRequest) returns (GetServerConfigResponse) {} + rpc GetPid (GetPidRequest) returns (GetPidResponse) {} +} + +message GetPidRequest { +} + +message GetPidResponse { + int32 pid = 1; } message GetServerConfigRequest { diff --git a/sllm_store/requirements-build.txt b/sllm_store/requirements-build.txt index 7ed6a59..bae9656 100644 --- a/sllm_store/requirements-build.txt +++ b/sllm_store/requirements-build.txt @@ -3,5 +3,6 @@ ninja numpy peft==0.15.2 setuptools -torch==2.7.0 +torch==2.4.0 +torch-npu==2.4.0.post2 wheel diff --git a/sllm_store/requirements.txt b/sllm_store/requirements.txt index a227888..9f48da3 100644 --- a/sllm_store/requirements.txt +++ b/sllm_store/requirements.txt @@ -1,8 +1,11 @@ -accelerate==1.7.0 -bitsandbytes==0.46.0 +accelerate==1.2.1 +bitsandbytes>=0.41.0,<=0.45.1 click>=8.1.7 -grpcio==1.72.1 -grpcio-tools==1.64.0 +grpcio==1.49.1 +grpcio-tools==1.49.1 peft==0.15.2 -torch==2.7.0 -transformers==4.52.4 +torch==2.5.1 +torch-npu==2.5.1 +transformers==4.47.1 +decorator +attrs==22.2.0 \ No newline at end of file diff --git a/sllm_store/setup.py b/sllm_store/setup.py index aa653b1..f75fa6a 100644 --- a/sllm_store/setup.py +++ b/sllm_store/setup.py @@ -17,6 +17,7 @@ # ---------------------------------------------------------------------------- # import io import os +import platform import subprocess import sys from pathlib import Path @@ -26,29 +27,105 @@ from setuptools import Extension, setup from setuptools.command.build_ext import build_ext from setuptools.command.install import install - -from torch.utils.cpp_extension import CUDA_HOME -from torch.utils.cpp_extension import ROCM_HOME +try: + torch_available = True + # The assert is not needed since Github CI does not use GPU server, + # install cuda library is sufficient + # assert torch.cuda.is_available() == True + from torch.utils.cpp_extension import CUDA_HOME + from torch.utils.cpp_extension import ROCM_HOME + from torch_npu.utils.cpp_extension import NpuExtension +except Exception: + torch_available = False + CUDA_HOME = None + ROCM_HOME = None + print( + "[WARNING] Unable to import torch, pre-compiling ops will be disabled. " + "Please visit https://pytorch.org/ to see how to properly install torch on your system." # noqa: E501 + ) ROOT_DIR = os.path.dirname(__file__) +# Determine build backend based on environment and platform +def detect_build_backend(): + """Detect which backend to build based on environment variables and platform.""" + + # Check for explicit backend selection + use_cann = os.getenv("USE_CANN", "0").lower() in ("1", "true", "yes") + use_cuda = os.getenv("USE_CUDA", "auto").lower() + + # CANN support (Linux only) + ascend_toolkit_home = os.getenv("ASCEND_TOOLKIT_HOME") + print("Reached") + print(f"HOME: {ascend_toolkit_home}") + print(f"USA_CANN {use_cann}") + + if use_cann and ascend_toolkit_home and platform.system() == "Linux": + if check_cann_available(ascend_toolkit_home): + print("Reached") + return "cann", ascend_toolkit_home + else: + print("[WARNING] CANN requested but not available, falling back...") + + # CUDA support + if use_cuda != "false" and CUDA_HOME is not None: + if check_nvcc_installed(CUDA_HOME): + return "cuda", CUDA_HOME + else: + print("[WARNING] CUDA requested but nvcc not available, falling back...") + + # ROCm support + if ROCM_HOME is not None: + if check_hipcc_installed(ROCM_HOME): + return "rocm", ROCM_HOME + else: + print("[WARNING] ROCm available but hipcc not working, falling back...") + + # CPU-only fallback + print("[INFO] Building in CPU-only mode") + return "cpu", None + + +def check_cann_available(ascend_toolkit_home: str) -> bool: + """Check if CANN toolkit is available.""" + try: + # Check for essential CANN headers + include_dir = os.path.join(ascend_toolkit_home, "include") + acl_header = os.path.join(include_dir, "acl", "acl.h") + + if not os.path.exists(acl_header): + print(f"[WARNING] CANN header not found: {acl_header}") + return False + + # Check for CANN libraries + lib_dir = os.path.join(ascend_toolkit_home, "lib64") + acl_lib = os.path.join(lib_dir, "libascendcl.so") + + if not os.path.exists(acl_lib): + print(f"[WARNING] CANN library not found: {acl_lib}") + return False + + print(f"[INFO] CANN toolkit found at: {ascend_toolkit_home}") + return True + except Exception as e: + print(f"[WARNING] Error checking CANN availability: {e}") + return False + -def check_nvcc_installed(cuda_home: str) -> None: +def check_nvcc_installed(cuda_home: str) -> bool: """Check if nvcc (NVIDIA CUDA compiler) is installed.""" try: _ = subprocess.check_output( [cuda_home + "/bin/nvcc", "-V"], universal_newlines=True ) - except Exception as e: - raise RuntimeError( - "nvcc is not installed or not found in your PATH. " - "Please ensure that the CUDA toolkit is installed and nvcc is available in your PATH." # noqa: E501 - f" Error: {e}" - ) from None + return True + except Exception: + print("[WARNING] nvcc is not installed or not found in your PATH.") + return False -def check_hipcc_installed(rocm_home: str) -> None: +def check_hipcc_installed(rocm_home: str) -> bool: """Check if hipcc (AMD HIP compiler) is installed.""" # can be either /hip/bin/hipcc or /bin/hipcc hipcc_paths = [rocm_home + "/bin/hipcc", rocm_home + "/hip/bin/hipcc"] @@ -57,29 +134,24 @@ def check_hipcc_installed(rocm_home: str) -> None: _ = subprocess.check_output( [hipcc, "--version"], universal_newlines=True ) - return + return True except Exception: continue - raise RuntimeError( - "hipcc is not installed or not found in your PATH. " - "Please ensure that the HIP toolkit is installed and hipcc is available in your PATH." # noqa: E501 - ) from None - - -if CUDA_HOME is not None: - check_nvcc_installed(CUDA_HOME) -elif ROCM_HOME is not None: - check_hipcc_installed(ROCM_HOME) -else: - raise RuntimeError( - "CUDA_HOME or ROCM_HOME environment variable must be set to compile CUDA or HIP extensions." # noqa: E501 - ) + print("[WARNING] hipcc is not installed or not found in your PATH.") + return False + +# Detect build backend +BUILD_BACKEND, BACKEND_HOME = detect_build_backend() +print(f"[INFO] Building with backend: {BUILD_BACKEND}") def is_ninja_available() -> bool: + # Allow disabling ninja via environment variable + if os.getenv("DISABLE_NINJA", "0").lower() in ("1", "true", "yes"): + return False try: subprocess.run(["ninja", "--version"], stdout=subprocess.PIPE) - except FileNotFoundError: + except (FileNotFoundError, OSError): return False return True @@ -138,6 +210,7 @@ class CMakeExtension(Extension): # Adapted from https://github.com/vllm-project/vllm/blob/a1242324c99ff8b1e29981006dfb504da198c7c3/setup.py +# Pass -DUSE_CANN=ON to the cmake command to build the extension with CANN support. class cmake_build_ext(build_ext): did_config: Dict[str, bool] = {} @@ -161,6 +234,27 @@ class cmake_build_ext(build_ext): "-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY={}".format(self.build_temp), ] + # Add backend-specific arguments + if BUILD_BACKEND == "cann": + cmake_args.extend([ + "-DUSE_CANN=ON", + "-DASCEND_TOOLKIT_HOME={}".format(BACKEND_HOME), + ]) + elif BUILD_BACKEND == "cuda": + cmake_args.extend([ + "-DUSE_CUDA=ON", + "-DCUDA_TOOLKIT_ROOT_DIR={}".format(BACKEND_HOME), + ]) + elif BUILD_BACKEND == "rocm": + cmake_args.extend([ + "-DUSE_ROCM=ON", + "-DROCM_ROOT={}".format(BACKEND_HOME), + ]) + else: # cpu + cmake_args.extend([ + "-DUSE_CPU_ONLY=ON", + ]) + # verbose = bool(int(os.getenv('VERBOSE', '1'))) verbose = True if verbose: @@ -180,10 +274,15 @@ class cmake_build_ext(build_ext): # Default build tool to whatever cmake picks. build_tool = [] - subprocess.check_call( - ["cmake", ext.cmake_lists_dir, *build_tool, *cmake_args], - cwd=self.build_temp, - ) + try: + subprocess.check_call( + ["cmake", ext.cmake_lists_dir, *build_tool, *cmake_args], + cwd=self.build_temp, + ) + except subprocess.CalledProcessError as e: + print(f"[ERROR] CMake configuration failed with backend {BUILD_BACKEND}") + print(f"[ERROR] Command: cmake {ext.cmake_lists_dir} {' '.join(build_tool)} {' '.join(cmake_args)}") + raise e def build_extensions(self) -> None: # Ensure that CMake is present and working @@ -212,7 +311,12 @@ class cmake_build_ext(build_ext): # str(num_jobs) ] - subprocess.check_call(["cmake", *build_args], cwd=self.build_temp) + try: + subprocess.check_call(["cmake", *build_args], cwd=self.build_temp) + print(f"[INFO] Successfully built extension: {ext_target_name}") + except subprocess.CalledProcessError as e: + print(f"[ERROR] Failed to build extension: {ext_target_name}") + raise e print(self.build_temp, ext_target_name) @@ -243,4 +347,4 @@ setup( "sllm_store.proto", ], cmdclass=cmdclass, -) +) \ No newline at end of file diff --git a/sllm_store/sllm_store/cann_utils.py b/sllm_store/sllm_store/cann_utils.py new file mode 100644 index 0000000..51bf2f3 --- /dev/null +++ b/sllm_store/sllm_store/cann_utils.py @@ -0,0 +1,146 @@ +"""CANN utilities for ServerlessLLM""" +import torch + +# Global variable to track torch_npu import +_torch_npu_imported = False + +def is_cann_available(): + """Check if CANN/NPU is available""" + global _torch_npu_imported + try: + # Check if torch_npu is available and import it + import torch_npu + _torch_npu_imported = True + return torch.npu.is_available() + except ImportError: + return False + +def ensure_torch_npu_imported(): + """Ensure torch_npu is imported before any tensor operations""" + global _torch_npu_imported + if not _torch_npu_imported and is_cann_available(): + try: + import torch_npu + _torch_npu_imported = True + print("torch_npu imported and PrivateUse1HooksInterface registered") + except ImportError: + pass + return _torch_npu_imported + +def get_device_type(): + """Get the device type (cuda or npu)""" + if is_cann_available(): + return "npu" + else: + return "cuda" + +def get_memory_functions(): + """Get the appropriate memory allocation functions""" + if is_cann_available(): + try: + from sllm_store._C import allocate_cann_memory, get_cann_memory_handles + return allocate_cann_memory, _get_cann_memory_handles_with_pid + except ImportError: + raise ImportError("CANN functions not available in compiled extension") + else: + from sllm_store._C import allocate_cuda_memory, get_cuda_memory_handles + return allocate_cuda_memory, get_cuda_memory_handles + +def _get_cann_memory_handles_with_pid(memory_info_map): + """ + Wrapper for get_cann_memory_handles that automatically gets the server PID + """ + from sllm_store._C import get_cann_memory_handles + from sllm_store.client import SllmStoreClient + + try: + # Get server PID via gRPC + client = SllmStoreClient("127.0.0.1:8073") + server_pid = client.get_pid() + + if server_pid is None: + print("Warning: Could not get server PID via gRPC, using default (-1)") + server_pid = -1 + else: + print(f"Got server PID via gRPC: {server_pid}") + + # Call the C++ function with the server PID + return get_cann_memory_handles(memory_info_map, server_pid) + + except Exception as e: + print(f"Error getting server PID: {e}") + print("Falling back to default PID (-1)") + return get_cann_memory_handles(memory_info_map, -1) + +def init_npu_backend(): + """Initialize NPU backend and register with PyTorch""" + if not is_cann_available(): + return False + + try: + import torch_npu + + # Register NPU as a custom backend for PrivateUse1 + # This is essential for PyTorch to recognize NPU devices + try: + # Try the newer API first (PyTorch 2.1+) + if hasattr(torch.utils, 'rename_privateuse1_backend'): + torch.utils.rename_privateuse1_backend("npu") + elif hasattr(torch, 'rename_privateuse1_backend'): + torch.rename_privateuse1_backend("npu") + else: + print("Warning: rename_privateuse1_backend not available, using fallback initialization") + except Exception as e: + print(f"Warning: Failed to register NPU backend name: {e}") + + # Initialize NPU context + # This ensures NPU devices are properly initialized + if torch_npu.npu.device_count() > 0: + # Initialize NPU runtime + try: + # Try to register the NPU module with torch + if hasattr(torch, '_register_device_module'): + torch._register_device_module('npu', torch_npu.npu) + except Exception as e: + print(f"Warning: Failed to register NPU module: {e}") + + # Warm up NPU devices to ensure proper initialization + for i in range(torch_npu.npu.device_count()): + try: + # Create a small tensor to initialize the device + x = torch.empty(1, device=f"npu:{i}") + del x # Clean up + torch_npu.npu.synchronize() + except Exception as e: + print(f"Warning: Failed to initialize NPU device {i}: {e}") + continue + + print(f"NPU backend initialized with {torch_npu.npu.device_count()} devices") + return True + else: + print("No NPU devices found") + return False + + except Exception as e: + print(f"Failed to initialize NPU backend: {e}") + import traceback + traceback.print_exc() + return False + +# Initialize NPU backend when module is imported +_npu_initialized = False + +def ensure_npu_initialized(): + """Ensure NPU backend is initialized""" + global _npu_initialized + if not _npu_initialized and is_cann_available(): + _npu_initialized = init_npu_backend() + return _npu_initialized + +# Automatically initialize NPU when module is imported +if is_cann_available(): + try: + ensure_npu_initialized() + except Exception as e: + print(f"Warning: Failed to auto-initialize NPU backend: {e}") + pass \ No newline at end of file diff --git a/sllm_store/sllm_store/cli.py b/sllm_store/sllm_store/cli.py index c9b4a87..41d924f 100644 --- a/sllm_store/sllm_store/cli.py +++ b/sllm_store/sllm_store/cli.py @@ -17,135 +17,18 @@ # ---------------------------------------------------------------------------- # import asyncio -import importlib -import os -import shutil import sys import logging -import time -from typing import Optional -import torch import click from sllm_store.server import serve from sllm_store.logger import init_logger from sllm_store.utils import to_num_bytes -from sllm_store.transformers import save_model, save_lora, load_model, load_lora -from transformers import ( - AutoModelForCausalLM, - AutoConfig, - AutoTokenizer, - BitsAndBytesConfig, -) -from peft import PeftModel - - -class VllmModelDownloader: - def __init__(self): - pass - - def download_vllm_model( - self, - model_name: str, - torch_dtype: str, - tensor_parallel_size: int = 1, - storage_path: str = "./models", - local_model_path: Optional[str] = None, - pattern: Optional[str] = None, - max_size: Optional[int] = None, - ): - import gc - from tempfile import TemporaryDirectory - - import torch - from huggingface_hub import snapshot_download - from vllm import LLM - - # set the model storage path - storage_path = os.getenv("STORAGE_PATH", storage_path) - - def _run_writer(input_dir, model_name): - # load models from the input directory - llm_writer = LLM( - model=input_dir, - download_dir=input_dir, - dtype=torch_dtype, - tensor_parallel_size=tensor_parallel_size, - num_gpu_blocks_override=1, - enforce_eager=True, - max_model_len=1, - ) - model_path = os.path.join(storage_path, model_name) - model_executer = llm_writer.llm_engine.engine_core # For engine V1 - # save the models in the ServerlessLLM format - model_executer.save_serverless_llm_state( - path=model_path, pattern=pattern, max_size=max_size - ) - for file in os.listdir(input_dir): - # Copy the metadata files into the output directory - if os.path.splitext(file)[1] not in ( - ".bin", - ".pt", - ".safetensors", - ): - src_path = os.path.join(input_dir, file) - dest_path = os.path.join(model_path, file) - if os.path.isdir(src_path): - shutil.copytree(src_path, dest_path) - else: - shutil.copy(src_path, dest_path) - del model_executer - del llm_writer - gc.collect() - if torch.cuda.is_available(): - torch.cuda.empty_cache() - torch.cuda.synchronize() - - try: - with TemporaryDirectory() as cache_dir: - input_dir = local_model_path - # download from huggingface - if local_model_path is None: - input_dir = snapshot_download( - model_name, - cache_dir=cache_dir, - allow_patterns=[ - "*.safetensors", - "*.bin", - "*.json", - "*.txt", - ], - ) - _run_writer(input_dir, model_name) - except Exception as e: - print(f"An error occurred while saving the model: {e}") - # remove the output dir - shutil.rmtree(os.path.join(storage_path, model_name)) - raise RuntimeError( - f"Failed to save {model_name} for vllm backend: {e}" - ) from e - +# Initialize logger for this module logger = init_logger(__name__) -def check_vllm(): - """Simple check if ServerlessLLM patch is applied.""" - try: - # Check if the LoadFormat enum has SERVERLESS_LLM - from vllm.config import LoadFormat - - if not hasattr(LoadFormat, "SERVERLESS_LLM"): - return False - - # Check if ExecutorBase has the save method - from vllm.executor.executor_base import ExecutorBase - - return hasattr(ExecutorBase, "save_serverless_llm_state") - except ImportError: - return False - - @click.group() def cli(): """sllm-store CLI""" @@ -153,25 +36,26 @@ def cli(): @cli.command() -@click.option("--host", default="0.0.0.0", help="Host") -@click.option("--port", default=8073, help="Port") -@click.option("--storage-path", default="./models", help="Storage path") -@click.option("--num-thread", default=4, help="Number of I/O threads") +@click.option("--host", default="0.0.0.0", help="Host for the gRPC server") +@click.option("--port", default=8073, help="Port for the gRPC server") +@click.option("--storage-path", default="./models", help="Local path to store models") +@click.option("--num-thread", default=4, help="Number of I/O threads for the server") @click.option( - "--chunk-size", default="32MB", help="Chunk size, e.g., 4KB, 1MB, 1GB" + "--chunk-size", default="32MB", help="Chunk size for data transfer, e.g., 4KB, 1MB, 1GB" ) @click.option( "--mem-pool-size", default="4GB", - help="Memory pool size, e.g., 1GB, 4GB, 1TB", + help="Memory pool size for the server, e.g., 1GB, 4GB, 1TB", ) @click.option( - "--disk-size", default="128GB", help="Disk size, e.g., 1GB, 4GB, 1TB" + "--disk-size", default="128GB", help="Total disk size available, e.g., 1GB, 4GB, 1TB (Note: currently not used in 'serve' function)" ) @click.option( "--registration-required", + is_flag=True, # Changed to is_flag for boolean option without explicit value default=False, - help="Require registration before loading model", + help="Require registration before loading model (set this flag to enable)", ) def start( host, @@ -180,18 +64,19 @@ def start( num_thread, chunk_size, mem_pool_size, - disk_size, + disk_size, # This parameter is passed but commented out in the serve call below. registration_required, ): - """Start the gRPC server.""" - # Convert the chunk size to bytes + """Start the gRPC server for ServerlessLLM Store""" + # Convert the chunk size string to bytes (e.g., "32MB" -> 33554432) chunk_size = to_num_bytes(chunk_size) - # Convert the memory pool size to bytes + # Convert the memory pool size string to bytes mem_pool_size = to_num_bytes(mem_pool_size) try: - logger.info("Starting gRPC server") + logger.info(f"Starting gRPC server on {host}:{port}") + # Run the asynchronous gRPC server asyncio.run( serve( host=host, @@ -200,285 +85,23 @@ def start( num_thread=num_thread, chunk_size=chunk_size, mem_pool_size=mem_pool_size, - # disk size is not used + # disk_size is not currently used by the serve function, as indicated in the original code. # disk_size=disk_size, registration_required=registration_required, ) ) except KeyboardInterrupt: - logging.info("Server stopped by user") + logging.info("Server stopped by user (KeyboardInterrupt)") sys.exit(0) - - -@cli.command() -@click.option( - "--model", - "model_name", - type=str, - required=True, - help="Model name from HuggingFace model hub", -) -@click.option("--backend", type=str, required=True, help="Backend") -@click.option("--adapter-name", type=str, help="Name of the LoRA adapter") -@click.option( - "--tensor-parallel-size", type=int, default=1, help="Tensor parallel size" -) -@click.option( - "--local-model-path", type=str, help="Local path to the model snapshot" -) -@click.option( - "--storage-path", - default="./models", - help="Local path to save the model", -) -def save( - model_name, - backend, - adapter_name, - tensor_parallel_size, - local_model_path, - storage_path, -): - """ - Saves a model to the sllm-store's storage. - - This command is for adding new models to the sllm-store's local storage. - """ - - logger.info( - f"Saving model {adapter_name if adapter_name else model_name} " - f"to {storage_path}" - ) - - try: - if backend == "vllm": - if not check_vllm(): - logger.error( - "vLLM is not patched. Please run " - "`./sllm_store/vllm_patch/patch.sh` first." - ) - sys.exit(1) - downloader = VllmModelDownloader() - downloader.download_vllm_model( - model_name, - "float16", - tensor_parallel_size=tensor_parallel_size, - storage_path=storage_path, - local_model_path=local_model_path, - ) - elif backend == "transformers": - if adapter_name: - config = AutoConfig.from_pretrained( - model_name, - trust_remote_code=True, - ) - config.torch_dtype = torch.float16 - module = importlib.import_module("transformers") - hf_model_cls = module.AutoModelForCausalLM - base_model = hf_model_cls.from_config( - config, - trust_remote_code=True, - ).to(config.torch_dtype) - - # Load a lora adapter from HuggingFace model hub - model = PeftModel.from_pretrained(base_model, adapter_name) - - # Save the model to the local path - model_path = os.path.join(storage_path, adapter_name) - save_lora(model, model_path) - else: - # Load a model from HuggingFace model hub - model = AutoModelForCausalLM.from_pretrained( - model_name, torch_dtype=torch.float16 - ) - - # Save the model to the local path - model_path = os.path.join(storage_path, model_name) - save_model(model, model_path) - else: - logger.error(f"Unsupported backend '{backend}'") - sys.exit(1) except Exception as e: - logger.error(f"Failed to save model {model_name}: {e}", exc_info=True) + logger.error(f"An unexpected error occurred: {e}") sys.exit(1) - logger.info( - f"Model {adapter_name if adapter_name else model_name} " - f"saved successfully to {storage_path}" - ) - -@cli.command() -@click.option( - "--model", - "model_name", - type=str, - required=True, - help="Model name from HuggingFace model hub", -) -@click.option("--backend", type=str, required=True, help="Backend") -@click.option("--adapter-name", type=str, help="Name of the LoRA adapter") -@click.option( - "--precision", - type=click.Choice(["int8", "fp4", "nf4"]), - help="Precision of quantized model.", -) -@click.option( - "--storage-path", - type=str, - default="./models", - help="Local path where model is saved", -) -def load( - model_name, - backend, - adapter_name, - precision, - storage_path, -): - """ - Loads a model from the sllm-store's storage. - - This command is for loading new models from the sllm-store's local storage. - """ - - logger.info( - f"Loading model {adapter_name if adapter_name else model_name} " - f"from {storage_path}" - ) - - quantization_config = None - if precision: - if precision == "int8": - quantization_config = BitsAndBytesConfig(load_in_8bit=True) - elif precision == "fp4": - quantization_config = BitsAndBytesConfig(load_in_4bit=True) - elif precision == "nf4": - quantization_config = BitsAndBytesConfig( - load_in_4bit=True, bnb_4bit_quant_type="nf4" - ) - - try: - start_load_time = time.time() - - if backend == "vllm": - from vllm import LLM - - if not check_vllm(): - logger.error( - "vLLM is not patched. Please run " - "`./sllm_store/vllm_patch/patch.sh` first." - ) - sys.exit(1) - model_full_path = os.path.join(storage_path, model_name) - llm = LLM( - model=model_full_path, - load_format="serverless_llm", - dtype="float16", - ) - logger.info( - f"Model loading time: {time.time() - start_load_time:.2f}s" - ) - - example_inferences("vllm", model=llm) - - elif backend == "transformers": - # warm up the GPU - num_gpus = torch.cuda.device_count() - for i in range(num_gpus): - torch.ones(1).to(f"cuda:{i}") - torch.cuda.synchronize() - if adapter_name: - model = load_model( - model_name, - device_map="auto", - torch_dtype=torch.float16, - storage_path=storage_path, - fully_parallel=True, - ) - - model = load_lora( - model, - adapter_name, - adapter_path=adapter_name, - device_map="auto", - storage_path=storage_path, - torch_dtype=torch.float16, - ) - else: - model = load_model( - model_name, - device_map="auto", - torch_dtype=torch.float16, - storage_path=storage_path, - fully_parallel=True, - quantization_config=quantization_config, - ) - logger.info( - f"Model loading time: {time.time() - start_load_time:.2f}s" - ) - - example_inferences( - "transformers", - model=model, - model_name=model_name, - adapter_name=adapter_name, - ) - - else: - logger.error(f"Unsupported backend '{backend}'") - sys.exit(1) - - except Exception as e: - logger.error( - f"Failed to load model or perform inference: {e}", exc_info=True - ) - sys.exit(1) - - logger.info( - f"Model {adapter_name if adapter_name else model_name} " - f"loaded successfully from {storage_path}" - ) - - -def example_inferences(backend, model=None, model_name=None, adapter_name=None): - if backend == "vllm": - prompts = [ - "Hello, my name is", - "The president of the United States is", - "The capital of France is", - "The future of AI is", - ] - from vllm import SamplingParams - - sampling_params = SamplingParams(temperature=0.8, top_p=0.95) - outputs = model.generate(prompts, sampling_params) - - # Print the outputs. - for output in outputs: - prompt = output.prompt - generated_text = output.outputs[0].text - print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") - elif backend == "transformers": - from pathlib import Path - - parts = Path(model_name).parts - if len(parts) >= 2: - model_name = f"{parts[-2]}/{parts[-1]}" - tokenizer = AutoTokenizer.from_pretrained(model_name) - inputs = tokenizer("Hello, my dog is cute", return_tensors="pt").to( - "cuda" - ) - generate_kwargs = {} - if adapter_name: - generate_kwargs["adapter_names"] = [adapter_name] - outputs = model.generate(**inputs, **generate_kwargs) - print(tokenizer.decode(outputs[0], skip_special_tokens=True)) - else: - logger.error(f"Unsupported backend '{backend}' for example inferences") - sys.exit(1) - - -# Entry point for the 'sllm-store' CLI +# Entry point for the 'sllm-store' command line tool def main(): + """Main function to run the CLI""" cli() + +if __name__ == "__main__": + main() diff --git a/sllm_store/sllm_store/client.py b/sllm_store/sllm_store/client.py index 8efead6..114a8ff 100644 --- a/sllm_store/sllm_store/client.py +++ b/sllm_store/sllm_store/client.py @@ -155,3 +155,14 @@ class SllmStoreClient: "chunk_size": response.chunk_size, "mem_pool_size": response.mem_pool_size, } + + def get_pid(self): + """Get the server process ID for CANN IPC setup""" + request = storage_pb2.GetPidRequest() + try: + response = self.stub.GetPid(request) + logger.info(f"Server PID {response.pid}") + return response.pid + except grpc.RpcError as e: + logger.error(f"Error getting server PID: {e}") + return None \ No newline at end of file diff --git a/sllm_store/sllm_store/proto/storage_pb2.py b/sllm_store/sllm_store/proto/storage_pb2.py index fabbbc3..6186bc1 100644 --- a/sllm_store/sllm_store/proto/storage_pb2.py +++ b/sllm_store/sllm_store/proto/storage_pb2.py @@ -1,7 +1,7 @@ +# -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! -# source: sllm_store/proto/storage.proto +# source: storage.proto """Generated protocol buffer code.""" - from google.protobuf.internal import builder as _builder from google.protobuf import descriptor as _descriptor from google.protobuf import descriptor_pool as _descriptor_pool @@ -11,9 +11,9 @@ from google.protobuf import symbol_database as _symbol_database _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile( - b'\n\x1esllm_store/proto/storage.proto\x12\x07storage"\x18\n\x16GetServerConfigRequest"D\n\x17GetServerConfigResponse\x12\x15\n\rmem_pool_size\x18\x01 \x01(\x03\x12\x12\n\nchunk_size\x18\x02 \x01(\x03"*\n\x14RegisterModelRequest\x12\x12\n\nmodel_path\x18\x01 \x01(\t"?\n\x15RegisterModelResponse\x12\x12\n\nmodel_path\x18\x01 \x01(\t\x12\x12\n\nmodel_size\x18\x02 \x01(\x03"X\n\x0cMemCopyChunk\x12\x12\n\nsrc_offset\x18\x01 \x01(\x04\x12\x0c\n\x04size\x18\x02 \x01(\x04\x12\x12\n\ndst_offset\x18\x03 \x01(\x04\x12\x12\n\nhandle_idx\x18\x04 \x01(\x04"9\n\x10MemCopyChunkList\x12%\n\x06\x63hunks\x18\x01 \x03(\x0b\x32\x15.storage.MemCopyChunk"(\n\rMemCopyHandle\x12\x17\n\x0f\x63uda_ipc_handle\x18\x01 \x01(\x0c"<\n\x11MemCopyHandleList\x12\'\n\x07handles\x18\x01 \x03(\x0b\x32\x16.storage.MemCopyHandle"\xf3\x02\n\x10LoadModelRequest\x12\x12\n\nmodel_path\x18\x01 \x01(\t\x12\x14\n\x0creplica_uuid\x18\x02 \x01(\t\x12\x35\n\x06\x63hunks\x18\x03 \x03(\x0b\x32%.storage.LoadModelRequest.ChunksEntry\x12\x37\n\x07handles\x18\x04 \x03(\x0b\x32&.storage.LoadModelRequest.HandlesEntry\x12/\n\x12target_device_type\x18\x05 \x01(\x0e\x32\x13.storage.DeviceType\x1aH\n\x0b\x43hunksEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12(\n\x05value\x18\x02 \x01(\x0b\x32\x19.storage.MemCopyChunkList:\x02\x38\x01\x1aJ\n\x0cHandlesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12)\n\x05value\x18\x02 \x01(\x0b\x32\x1a.storage.MemCopyHandleList:\x02\x38\x01"\'\n\x11LoadModelResponse\x12\x12\n\nmodel_path\x18\x01 \x01(\t"p\n\x13\x43onfirmModelRequest\x12\x12\n\nmodel_path\x18\x01 \x01(\t\x12\x14\n\x0creplica_uuid\x18\x02 \x01(\t\x12/\n\x12target_device_type\x18\x03 \x01(\x0e\x32\x13.storage.DeviceType"8\n\x14\x43onfirmModelResponse\x12\x12\n\nmodel_path\x18\x01 \x01(\t\x12\x0c\n\x04\x63ode\x18\x02 \x01(\x05"o\n\x12UnloadModelRequest\x12\x12\n\nmodel_path\x18\x01 \x01(\t\x12\x14\n\x0creplica_uuid\x18\x02 \x01(\t\x12/\n\x12target_device_type\x18\x03 \x01(\x0e\x32\x13.storage.DeviceType"7\n\x13UnloadModelResponse\x12\x12\n\nmodel_path\x18\x01 \x01(\t\x12\x0c\n\x04\x63ode\x18\x02 \x01(\x05"\x11\n\x0f\x43learMemRequest"\x12\n\x10\x43learMemResponse*L\n\nDeviceType\x12\x14\n\x10\x44\x45VICE_TYPE_DISK\x10\x00\x12\x13\n\x0f\x44\x45VICE_TYPE_CPU\x10\x01\x12\x13\n\x0f\x44\x45VICE_TYPE_GPU\x10\x02\x32\xdc\x03\n\x07Storage\x12I\n\x0eLoadModelAsync\x12\x19.storage.LoadModelRequest\x1a\x1a.storage.LoadModelResponse"\x00\x12M\n\x0c\x43onfirmModel\x12\x1c.storage.ConfirmModelRequest\x1a\x1d.storage.ConfirmModelResponse"\x00\x12J\n\x0bUnloadModel\x12\x1b.storage.UnloadModelRequest\x1a\x1c.storage.UnloadModelResponse"\x00\x12\x41\n\x08\x43learMem\x12\x18.storage.ClearMemRequest\x1a\x19.storage.ClearMemResponse"\x00\x12P\n\rRegisterModel\x12\x1d.storage.RegisterModelRequest\x1a\x1e.storage.RegisterModelResponse"\x00\x12V\n\x0fGetServerConfig\x12\x1f.storage.GetServerConfigRequest\x1a .storage.GetServerConfigResponse"\x00\x62\x06proto3' -) + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\rstorage.proto\x12\x07storage\"\x0f\n\rGetPidRequest\"\x1d\n\x0eGetPidResponse\x12\x0b\n\x03pid\x18\x01 \x01(\x05\"\x18\n\x16GetServerConfigRequest\"D\n\x17GetServerConfigResponse\x12\x15\n\rmem_pool_size\x18\x01 \x01(\x03\x12\x12\n\nchunk_size\x18\x02 \x01(\x03\"*\n\x14RegisterModelRequest\x12\x12\n\nmodel_path\x18\x01 \x01(\t\"?\n\x15RegisterModelResponse\x12\x12\n\nmodel_path\x18\x01 \x01(\t\x12\x12\n\nmodel_size\x18\x02 \x01(\x03\"X\n\x0cMemCopyChunk\x12\x12\n\nsrc_offset\x18\x01 \x01(\x04\x12\x0c\n\x04size\x18\x02 \x01(\x04\x12\x12\n\ndst_offset\x18\x03 \x01(\x04\x12\x12\n\nhandle_idx\x18\x04 \x01(\x04\"9\n\x10MemCopyChunkList\x12%\n\x06chunks\x18\x01 \x03(\x0b\x32\x15.storage.MemCopyChunk\"(\n\rMemCopyHandle\x12\x17\n\x0f\x63uda_ipc_handle\x18\x01 \x01(\x0c\"<\n\x11MemCopyHandleList\x12\'\n\x07handles\x18\x01 \x03(\x0b\x32\x16.storage.MemCopyHandle\"\xf3\x02\n\x10LoadModelRequest\x12\x12\n\nmodel_path\x18\x01 \x01(\t\x12\x14\n\x0creplica_uuid\x18\x02 \x01(\t\x12\x35\n\x06chunks\x18\x03 \x03(\x0b\x32%.storage.LoadModelRequest.ChunksEntry\x12\x37\n\x07handles\x18\x04 \x03(\x0b\x32&.storage.LoadModelRequest.HandlesEntry\x12/\n\x12target_device_type\x18\x05 \x01(\x0e\x32\x13.storage.DeviceType\x1aH\n\x0bChunksEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12(\n\x05value\x18\x02 \x01(\x0b\x32\x19.storage.MemCopyChunkList:\x02\x38\x01\x1aJ\n\x0cHandlesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12)\n\x05value\x18\x02 \x01(\x0b\x32\x1a.storage.MemCopyHandleList:\x02\x38\x01\"\'\n\x11LoadModelResponse\x12\x12\n\nmodel_path\x18\x01 \x01(\t\"p\n\x13ConfirmModelRequest\x12\x12\n\nmodel_path\x18\x01 \x01(\t\x12\x14\n\x0creplica_uuid\x18\x02 \x01(\t\x12/\n\x12target_device_type\x18\x03 \x01(\x0e\x32\x13.storage.DeviceType\"8\n\x14ConfirmModelResponse\x12\x12\n\nmodel_path\x18\x01 \x01(\t\x12\x0c\n\x04code\x18\x02 \x01(\x05\"o\n\x12UnloadModelRequest\x12\x12\n\nmodel_path\x18\x01 \x01(\t\x12\x14\n\x0creplica_uuid\x18\x02 \x01(\t\x12/\n\x12target_device_type\x18\x03 \x01(\x0e\x32\x13.storage.DeviceType\"7\n\x13UnloadModelResponse\x12\x12\n\nmodel_path\x18\x01 \x01(\t\x12\x0c\n\x04code\x18\x02 \x01(\x05\"\x11\n\x0fClearMemRequest\"\x12\n\x10ClearMemResponse*L\n\nDeviceType\x12\x14\n\x10DEVICE_TYPE_DISK\x10\x00\x12\x13\n\x0fDEVICE_TYPE_CPU\x10\x01\x12\x13\n\x0fDEVICE_TYPE_GPU\x10\x022\x99\x04\n\x07Storage\x12I\n\x0eLoadModelAsync\x12\x19.storage.LoadModelRequest\x1a\x1a.storage.LoadModelResponse\"\x00\x12M\n\x0cConfirmModel\x12\x1c.storage.ConfirmModelRequest\x1a\x1d.storage.ConfirmModelResponse\"\x00\x12J\n\x0bUnloadModel\x12\x1b.storage.UnloadModelRequest\x1a\x1c.storage.UnloadModelResponse\"\x00\x12\x41\n\x08ClearMem\x12\x18.storage.ClearMemRequest\x1a\x19.storage.ClearMemResponse\"\x00\x12P\n\rRegisterModel\x12\x1d.storage.RegisterModelRequest\x1a\x1e.storage.RegisterModelResponse\"\x00\x12V\n\x0fGetServerConfig\x12\x1f.storage.GetServerConfigRequest\x1a .storage.GetServerConfigResponse\"\x00\x12;\n\x06GetPid\x12\x16.storage.GetPidRequest\x1a\x17.storage.GetPidResponse\"\x00b\x06proto3') _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) _builder.BuildTopDescriptorsAndMessages( @@ -22,47 +22,51 @@ _builder.BuildTopDescriptorsAndMessages( if _descriptor._USE_C_DESCRIPTORS == False: DESCRIPTOR._options = None _LOADMODELREQUEST_CHUNKSENTRY._options = None - _LOADMODELREQUEST_CHUNKSENTRY._serialized_options = b"8\001" + _LOADMODELREQUEST_CHUNKSENTRY._serialized_options = b'8\001' _LOADMODELREQUEST_HANDLESENTRY._options = None - _LOADMODELREQUEST_HANDLESENTRY._serialized_options = b"8\001" - _DEVICETYPE._serialized_start = 1297 - _DEVICETYPE._serialized_end = 1373 - _GETSERVERCONFIGREQUEST._serialized_start = 43 - _GETSERVERCONFIGREQUEST._serialized_end = 67 - _GETSERVERCONFIGRESPONSE._serialized_start = 69 - _GETSERVERCONFIGRESPONSE._serialized_end = 137 - _REGISTERMODELREQUEST._serialized_start = 139 - _REGISTERMODELREQUEST._serialized_end = 181 - _REGISTERMODELRESPONSE._serialized_start = 183 - _REGISTERMODELRESPONSE._serialized_end = 246 - _MEMCOPYCHUNK._serialized_start = 248 - _MEMCOPYCHUNK._serialized_end = 336 - _MEMCOPYCHUNKLIST._serialized_start = 338 - _MEMCOPYCHUNKLIST._serialized_end = 395 - _MEMCOPYHANDLE._serialized_start = 397 - _MEMCOPYHANDLE._serialized_end = 437 - _MEMCOPYHANDLELIST._serialized_start = 439 - _MEMCOPYHANDLELIST._serialized_end = 499 - _LOADMODELREQUEST._serialized_start = 502 - _LOADMODELREQUEST._serialized_end = 873 - _LOADMODELREQUEST_CHUNKSENTRY._serialized_start = 725 - _LOADMODELREQUEST_CHUNKSENTRY._serialized_end = 797 - _LOADMODELREQUEST_HANDLESENTRY._serialized_start = 799 - _LOADMODELREQUEST_HANDLESENTRY._serialized_end = 873 - _LOADMODELRESPONSE._serialized_start = 875 - _LOADMODELRESPONSE._serialized_end = 914 - _CONFIRMMODELREQUEST._serialized_start = 916 - _CONFIRMMODELREQUEST._serialized_end = 1028 - _CONFIRMMODELRESPONSE._serialized_start = 1030 - _CONFIRMMODELRESPONSE._serialized_end = 1086 - _UNLOADMODELREQUEST._serialized_start = 1088 - _UNLOADMODELREQUEST._serialized_end = 1199 - _UNLOADMODELRESPONSE._serialized_start = 1201 - _UNLOADMODELRESPONSE._serialized_end = 1256 - _CLEARMEMREQUEST._serialized_start = 1258 - _CLEARMEMREQUEST._serialized_end = 1275 - _CLEARMEMRESPONSE._serialized_start = 1277 - _CLEARMEMRESPONSE._serialized_end = 1295 - _STORAGE._serialized_start = 1376 - _STORAGE._serialized_end = 1852 -# @@protoc_insertion_point(module_scope) + _LOADMODELREQUEST_HANDLESENTRY._serialized_options = b'8\001' + _DEVICETYPE._serialized_start=1328 + _DEVICETYPE._serialized_end=1404 + _GETPIDREQUEST._serialized_start=26 + _GETPIDREQUEST._serialized_end=41 + _GETPIDRESPONSE._serialized_start=43 + _GETPIDRESPONSE._serialized_end=72 + _GETSERVERCONFIGREQUEST._serialized_start=74 + _GETSERVERCONFIGREQUEST._serialized_end=98 + _GETSERVERCONFIGRESPONSE._serialized_start=100 + _GETSERVERCONFIGRESPONSE._serialized_end=168 + _REGISTERMODELREQUEST._serialized_start=170 + _REGISTERMODELREQUEST._serialized_end=212 + _REGISTERMODELRESPONSE._serialized_start=214 + _REGISTERMODELRESPONSE._serialized_end=277 + _MEMCOPYCHUNK._serialized_start=279 + _MEMCOPYCHUNK._serialized_end=367 + _MEMCOPYCHUNKLIST._serialized_start=369 + _MEMCOPYCHUNKLIST._serialized_end=426 + _MEMCOPYHANDLE._serialized_start=428 + _MEMCOPYHANDLE._serialized_end=468 + _MEMCOPYHANDLELIST._serialized_start=470 + _MEMCOPYHANDLELIST._serialized_end=530 + _LOADMODELREQUEST._serialized_start=533 + _LOADMODELREQUEST._serialized_end=904 + _LOADMODELREQUEST_CHUNKSENTRY._serialized_start=756 + _LOADMODELREQUEST_CHUNKSENTRY._serialized_end=828 + _LOADMODELREQUEST_HANDLESENTRY._serialized_start=830 + _LOADMODELREQUEST_HANDLESENTRY._serialized_end=904 + _LOADMODELRESPONSE._serialized_start=906 + _LOADMODELRESPONSE._serialized_end=945 + _CONFIRMMODELREQUEST._serialized_start=947 + _CONFIRMMODELREQUEST._serialized_end=1059 + _CONFIRMMODELRESPONSE._serialized_start=1061 + _CONFIRMMODELRESPONSE._serialized_end=1117 + _UNLOADMODELREQUEST._serialized_start=1119 + _UNLOADMODELREQUEST._serialized_end=1230 + _UNLOADMODELRESPONSE._serialized_start=1232 + _UNLOADMODELRESPONSE._serialized_end=1287 + _CLEARMEMREQUEST._serialized_start=1289 + _CLEARMEMREQUEST._serialized_end=1306 + _CLEARMEMRESPONSE._serialized_start=1308 + _CLEARMEMRESPONSE._serialized_end=1326 + _STORAGE._serialized_start=1407 + _STORAGE._serialized_end=1944 +# @@protoc_insertion_point(module_scope) \ No newline at end of file diff --git a/sllm_store/sllm_store/proto/storage_pb2_grpc.py b/sllm_store/sllm_store/proto/storage_pb2_grpc.py index 3090d18..f43549d 100644 --- a/sllm_store/sllm_store/proto/storage_pb2_grpc.py +++ b/sllm_store/sllm_store/proto/storage_pb2_grpc.py @@ -1,6 +1,5 @@ # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT! """Client and server classes corresponding to protobuf-defined services.""" - import grpc from sllm_store.proto import ( @@ -18,35 +17,40 @@ class StorageStub(object): channel: A grpc.Channel. """ self.LoadModelAsync = channel.unary_unary( - "/storage.Storage/LoadModelAsync", - request_serializer=sllm__store_dot_proto_dot_storage__pb2.LoadModelRequest.SerializeToString, - response_deserializer=sllm__store_dot_proto_dot_storage__pb2.LoadModelResponse.FromString, - ) + '/storage.Storage/LoadModelAsync', + request_serializer=sllm__store_dot_proto_dot_storage__pb2.LoadModelRequest.SerializeToString, + response_deserializer=sllm__store_dot_proto_dot_storage__pb2.LoadModelResponse.FromString, + ) self.ConfirmModel = channel.unary_unary( - "/storage.Storage/ConfirmModel", - request_serializer=sllm__store_dot_proto_dot_storage__pb2.ConfirmModelRequest.SerializeToString, - response_deserializer=sllm__store_dot_proto_dot_storage__pb2.ConfirmModelResponse.FromString, - ) + '/storage.Storage/ConfirmModel', + request_serializer=sllm__store_dot_proto_dot_storage__pb2.ConfirmModelRequest.SerializeToString, + response_deserializer=sllm__store_dot_proto_dot_storage__pb2.ConfirmModelResponse.FromString, + ) self.UnloadModel = channel.unary_unary( - "/storage.Storage/UnloadModel", - request_serializer=sllm__store_dot_proto_dot_storage__pb2.UnloadModelRequest.SerializeToString, - response_deserializer=sllm__store_dot_proto_dot_storage__pb2.UnloadModelResponse.FromString, - ) + '/storage.Storage/UnloadModel', + request_serializer=sllm__store_dot_proto_dot_storage__pb2.UnloadModelRequest.SerializeToString, + response_deserializer=sllm__store_dot_proto_dot_storage__pb2.UnloadModelResponse.FromString, + ) self.ClearMem = channel.unary_unary( - "/storage.Storage/ClearMem", - request_serializer=sllm__store_dot_proto_dot_storage__pb2.ClearMemRequest.SerializeToString, - response_deserializer=sllm__store_dot_proto_dot_storage__pb2.ClearMemResponse.FromString, - ) + '/storage.Storage/ClearMem', + request_serializer=sllm__store_dot_proto_dot_storage__pb2.ClearMemRequest.SerializeToString, + response_deserializer=sllm__store_dot_proto_dot_storage__pb2.ClearMemResponse.FromString, + ) self.RegisterModel = channel.unary_unary( - "/storage.Storage/RegisterModel", - request_serializer=sllm__store_dot_proto_dot_storage__pb2.RegisterModelRequest.SerializeToString, - response_deserializer=sllm__store_dot_proto_dot_storage__pb2.RegisterModelResponse.FromString, - ) + '/storage.Storage/RegisterModel', + request_serializer=sllm__store_dot_proto_dot_storage__pb2.RegisterModelRequest.SerializeToString, + response_deserializer=sllm__store_dot_proto_dot_storage__pb2.RegisterModelResponse.FromString, + ) self.GetServerConfig = channel.unary_unary( - "/storage.Storage/GetServerConfig", - request_serializer=sllm__store_dot_proto_dot_storage__pb2.GetServerConfigRequest.SerializeToString, - response_deserializer=sllm__store_dot_proto_dot_storage__pb2.GetServerConfigResponse.FromString, - ) + '/storage.Storage/GetServerConfig', + request_serializer=sllm__store_dot_proto_dot_storage__pb2.GetServerConfigRequest.SerializeToString, + response_deserializer=sllm__store_dot_proto_dot_storage__pb2.GetServerConfigResponse.FromString, + ) + self.GetPid = channel.unary_unary( + '/storage.Storage/GetPid', + request_serializer=sllm__store_dot_proto_dot_storage__pb2.GetPidRequest.SerializeToString, + response_deserializer=sllm__store_dot_proto_dot_storage__pb2.GetPidResponse.FromString, + ) class StorageServicer(object): @@ -55,253 +59,208 @@ class StorageServicer(object): def LoadModelAsync(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') def ConfirmModel(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') def UnloadModel(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') def ClearMem(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') def RegisterModel(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') def GetServerConfig(self, request, context): """Missing associated documentation comment in .proto file.""" context.set_code(grpc.StatusCode.UNIMPLEMENTED) - context.set_details("Method not implemented!") - raise NotImplementedError("Method not implemented!") + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetPid(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') def add_StorageServicer_to_server(servicer, server): rpc_method_handlers = { - "LoadModelAsync": grpc.unary_unary_rpc_method_handler( + 'LoadModelAsync': grpc.unary_unary_rpc_method_handler( servicer.LoadModelAsync, request_deserializer=sllm__store_dot_proto_dot_storage__pb2.LoadModelRequest.FromString, response_serializer=sllm__store_dot_proto_dot_storage__pb2.LoadModelResponse.SerializeToString, ), - "ConfirmModel": grpc.unary_unary_rpc_method_handler( + 'ConfirmModel': grpc.unary_unary_rpc_method_handler( servicer.ConfirmModel, request_deserializer=sllm__store_dot_proto_dot_storage__pb2.ConfirmModelRequest.FromString, response_serializer=sllm__store_dot_proto_dot_storage__pb2.ConfirmModelResponse.SerializeToString, ), - "UnloadModel": grpc.unary_unary_rpc_method_handler( + 'UnloadModel': grpc.unary_unary_rpc_method_handler( servicer.UnloadModel, request_deserializer=sllm__store_dot_proto_dot_storage__pb2.UnloadModelRequest.FromString, response_serializer=sllm__store_dot_proto_dot_storage__pb2.UnloadModelResponse.SerializeToString, ), - "ClearMem": grpc.unary_unary_rpc_method_handler( + 'ClearMem': grpc.unary_unary_rpc_method_handler( servicer.ClearMem, request_deserializer=sllm__store_dot_proto_dot_storage__pb2.ClearMemRequest.FromString, response_serializer=sllm__store_dot_proto_dot_storage__pb2.ClearMemResponse.SerializeToString, ), - "RegisterModel": grpc.unary_unary_rpc_method_handler( + 'RegisterModel': grpc.unary_unary_rpc_method_handler( servicer.RegisterModel, request_deserializer=sllm__store_dot_proto_dot_storage__pb2.RegisterModelRequest.FromString, response_serializer=sllm__store_dot_proto_dot_storage__pb2.RegisterModelResponse.SerializeToString, ), - "GetServerConfig": grpc.unary_unary_rpc_method_handler( + 'GetServerConfig': grpc.unary_unary_rpc_method_handler( servicer.GetServerConfig, request_deserializer=sllm__store_dot_proto_dot_storage__pb2.GetServerConfigRequest.FromString, response_serializer=sllm__store_dot_proto_dot_storage__pb2.GetServerConfigResponse.SerializeToString, ), + 'GetPid': grpc.unary_unary_rpc_method_handler( + servicer.GetPid, + request_deserializer=sllm__store_dot_proto_dot_storage__pb2.GetPidRequest.FromString, + response_serializer=sllm__store_dot_proto_dot_storage__pb2.GetPidResponse.SerializeToString, + ), } generic_handler = grpc.method_handlers_generic_handler( - "storage.Storage", rpc_method_handlers - ) + 'storage.Storage', rpc_method_handlers) server.add_generic_rpc_handlers((generic_handler,)) -# This class is part of an EXPERIMENTAL API. + # This class is part of an EXPERIMENTAL API. class Storage(object): """Missing associated documentation comment in .proto file.""" @staticmethod - def LoadModelAsync( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, + def LoadModelAsync(request, target, - "/storage.Storage/LoadModelAsync", + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/storage.Storage/LoadModelAsync', sllm__store_dot_proto_dot_storage__pb2.LoadModelRequest.SerializeToString, sllm__store_dot_proto_dot_storage__pb2.LoadModelResponse.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - ) + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) @staticmethod - def ConfirmModel( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, + def ConfirmModel(request, target, - "/storage.Storage/ConfirmModel", + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/storage.Storage/ConfirmModel', sllm__store_dot_proto_dot_storage__pb2.ConfirmModelRequest.SerializeToString, sllm__store_dot_proto_dot_storage__pb2.ConfirmModelResponse.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - ) + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) @staticmethod - def UnloadModel( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, + def UnloadModel(request, target, - "/storage.Storage/UnloadModel", + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/storage.Storage/UnloadModel', sllm__store_dot_proto_dot_storage__pb2.UnloadModelRequest.SerializeToString, sllm__store_dot_proto_dot_storage__pb2.UnloadModelResponse.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - ) + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) @staticmethod - def ClearMem( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, + def ClearMem(request, target, - "/storage.Storage/ClearMem", + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/storage.Storage/ClearMem', sllm__store_dot_proto_dot_storage__pb2.ClearMemRequest.SerializeToString, sllm__store_dot_proto_dot_storage__pb2.ClearMemResponse.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - ) + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) @staticmethod - def RegisterModel( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, + def RegisterModel(request, target, - "/storage.Storage/RegisterModel", + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/storage.Storage/RegisterModel', sllm__store_dot_proto_dot_storage__pb2.RegisterModelRequest.SerializeToString, sllm__store_dot_proto_dot_storage__pb2.RegisterModelResponse.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - ) + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) @staticmethod - def GetServerConfig( - request, - target, - options=(), - channel_credentials=None, - call_credentials=None, - insecure=False, - compression=None, - wait_for_ready=None, - timeout=None, - metadata=None, - ): - return grpc.experimental.unary_unary( - request, + def GetServerConfig(request, target, - "/storage.Storage/GetServerConfig", + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/storage.Storage/GetServerConfig', sllm__store_dot_proto_dot_storage__pb2.GetServerConfigRequest.SerializeToString, sllm__store_dot_proto_dot_storage__pb2.GetServerConfigResponse.FromString, - options, - channel_credentials, - insecure, - call_credentials, - compression, - wait_for_ready, - timeout, - metadata, - ) + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) + + @staticmethod + def GetPid(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary(request, target, '/storage.Storage/GetPid', + sllm__store_dot_proto_dot_storage__pb2.GetPidRequest.SerializeToString, + sllm__store_dot_proto_dot_storage__pb2.GetPidResponse.FromString, + options, channel_credentials, + insecure, call_credentials, compression, wait_for_ready, timeout, metadata) \ No newline at end of file diff --git a/sllm_store/sllm_store/server.py b/sllm_store/sllm_store/server.py index ef80d6b..99c9496 100644 --- a/sllm_store/sllm_store/server.py +++ b/sllm_store/sllm_store/server.py @@ -205,6 +205,13 @@ class StorageServicer(storage_pb2_grpc.StorageServicer): chunk_size=self.storage.get_chunk_size(), ) + async def GetPid(self, request, context): + """Return the current process ID for cann IPC setup""" + import acl + pid, ret = acl.rt.device_get_bare_tgid() + logger.info(f"GetPid called, returning PID: {pid}") + return storage_pb2.GetPidResponse(pid=pid) + async def serve( host, @@ -235,4 +242,4 @@ async def serve( await server.wait_for_termination() except (KeyboardInterrupt, asyncio.CancelledError): logger.info("Shutting down gRPC server") - await server.stop(5) + await server.stop(5) \ No newline at end of file diff --git a/sllm_store/sllm_store/torch.py b/sllm_store/sllm_store/torch.py index 8516530..7cc174d 100644 --- a/sllm_store/sllm_store/torch.py +++ b/sllm_store/sllm_store/torch.py @@ -1,19 +1,19 @@ # ---------------------------------------------------------------------------- # -# ServerlessLLM # -# Copyright (c) ServerlessLLM Team 2024 # +# ServerlessLLM # +# Copyright (c) ServerlessLLM Team 2024 # # # -# Licensed under the Apache License, Version 2.0 (the "License"); # -# you may not use this file except in compliance with the License. # +# Licensed under the Apache License, Version 2.0 (the "License"); # +# you may not use this file except in compliance with the License. # # # -# You may obtain a copy of the License at # +# You may obtain a copy of the License at # # # -# http://www.apache.org/licenses/LICENSE-2.0 # +# http://www.apache.org/licenses/LICENSE-2.0 # # # -# Unless required by applicable law or agreed to in writing, software # -# distributed under the License is distributed on an "AS IS" BASIS, # -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # -# See the License for the specific language governing permissions and # -# limitations under the License. # +# Unless required by applicable law or agreed to in writing, software # +# distributed under the License is distributed on an "AS IS" BASIS, # +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # +# See the License for the specific language governing permissions and # +# limitations under the License. # # ---------------------------------------------------------------------------- # import json import os @@ -23,10 +23,15 @@ from typing import Dict, Optional, Union import torch +# Import torch_npu BEFORE importing our C++ extension to ensure PrivateUse1HooksInterface is registered +try: + import torch_npu + print("torch_npu imported successfully - PrivateUse1HooksInterface should be registered") +except ImportError: + print("torch_npu not available, NPU operations may fail") + # from accelerate.hooks import add_hook_to_module from sllm_store._C import ( - allocate_cuda_memory, - get_cuda_memory_handles, get_device_uuid_map, restore_tensors, save_tensors, @@ -39,6 +44,16 @@ from sllm_store.utils import ( calculate_tensor_device_offsets, ) +try: + from sllm_store.cann_utils import get_memory_functions, get_device_type + allocate_memory, get_memory_handles = get_memory_functions() + device_type = get_device_type() + from sllm_store._C import create_pointer_capsule +except ImportError: + # Fallback to CUDA + from sllm_store._C import allocate_cuda_memory as allocate_memory, get_cuda_memory_handles as get_memory_handles + device_type = "cuda" + logger = init_logger(__name__) @@ -126,15 +141,22 @@ def load_dict_non_blocking( expanded_device_map, tensor_data_index ) # logger.debug(f"calculate_device_memory {device_memory}") - cuda_memory_ptrs = allocate_cuda_memory(device_memory) - # cuda_memory_ptrs = { k: [v] for k,v in cuda_memory_ptrs.items()} - cuda_memory_handles = get_cuda_memory_handles(cuda_memory_ptrs) + memory_ptrs = allocate_memory(device_memory) + if device_type == "npu": + memory_handles, updated_ptrs = get_memory_handles(memory_ptrs) + memory_ptrs_for_restore = updated_ptrs + else: + memory_handles = get_memory_handles(memory_ptrs) + memory_ptrs_for_restore = memory_ptrs + device_uuid_map = get_device_uuid_map() # logger.debug(f"determine device_uuid_map {device_uuid_map}") tensor_device_offsets, tensor_copy_chunks = calculate_tensor_device_offsets( expanded_device_map, tensor_data_index ) - logger.debug(f"allocate_cuda_memory takes {time.time() - start} seconds") + logger.debug( + f"allocate_{device_type}_memory takes {time.time() - start} seconds" + ) replica_uuid = _get_uuid() ret = client.load_into_gpu( @@ -146,7 +168,7 @@ def load_dict_non_blocking( }, { device_uuid_map[device_id]: [v] - for device_id, v in cuda_memory_handles.items() + for device_id, v in memory_handles.items() }, ) if not ret: @@ -154,9 +176,13 @@ def load_dict_non_blocking( # load model state_dict start = time.time() + if device_type == "npu": + memory_ptrs = {k: create_pointer_capsule(v) for k, v in memory_ptrs_for_restore.items()} + else: + memory_ptrs = memory_ptrs_for_restore state_dict = restore_tensors( - tensor_meta_index, cuda_memory_ptrs, tensor_device_offsets + tensor_meta_index, memory_ptrs, tensor_device_offsets ) logger.info(f"restore state_dict takes {time.time() - start} seconds") - return replica_uuid, state_dict + return replica_uuid, state_dict \ No newline at end of file diff --git a/sllm_store/sllm_store/transformers.py b/sllm_store/sllm_store/transformers.py index 2809165..ca41619 100644 --- a/sllm_store/sllm_store/transformers.py +++ b/sllm_store/sllm_store/transformers.py @@ -16,23 +16,24 @@ # limitations under the License. # # ---------------------------------------------------------------------------- # import concurrent.futures +import importlib import json import os import time import uuid -from typing import Optional, Union, Dict, Any +from typing import Optional, Union import torch +import torch_npu from accelerate import dispatch_model, init_empty_weights # from accelerate.hooks import add_hook_to_module from accelerate.utils import set_module_tensor_to_device -from sllm_store._C import ( - allocate_cuda_memory, - get_cuda_memory_handles, - get_device_uuid_map, - restore_tensors, -) +from peft import LoraConfig, PeftModel, get_peft_model, get_peft_model_state_dict +from peft.utils import set_peft_model_state_dict +from sllm_store._C import get_device_uuid_map, restore_tensors +from sllm_store._C import start_profiling + from sllm_store.client import SllmStoreClient from sllm_store.device_map_utils import ( DeviceMapType, @@ -49,22 +50,25 @@ from sllm_store.utils import ( get_no_split_modules, get_tied_no_split_modules, send_module_buffers_to_device, - quantize, ) from torch import nn from transformers import AutoConfig -import importlib -from peft import ( - PeftModel, - get_peft_model, - get_peft_model_state_dict, - LoraConfig, -) -from peft.utils import set_peft_model_state_dict -from transformers.utils.quantization_config import ( - QuantizationConfigMixin, +from transformers.integrations.bitsandbytes import ( + replace_with_bnb_linear, + set_module_quantized_tensor_to_device, ) +try: + from sllm_store.cann_utils import get_device_type, get_memory_functions + allocate_memory, get_memory_handles = get_memory_functions() + device_type = get_device_type() + from sllm_store._C import create_pointer_capsule +except ImportError: + from sllm_store._C import allocate_cuda_memory as allocate_memory + from sllm_store._C import get_cuda_memory_handles as get_memory_handles + + device_type = "cuda" + logger = init_logger(__name__) @@ -112,7 +116,7 @@ def save_lora(model: PeftModel, lora_path: str): if not os.path.exists(lora_path): os.makedirs(lora_path, exist_ok=True) - model = model.to("cpu") + model = model.cpu() lora_state_dict = get_peft_model_state_dict(model) @@ -140,9 +144,7 @@ def load_model( model_path: Optional[Union[str, os.PathLike]], device_map: DeviceMapType = "auto", torch_dtype: Optional[torch.dtype] = None, - quantization_config: Optional[ - Union[QuantizationConfigMixin, Dict[str, Any]] - ] = None, + quantization_config=None, storage_path: Optional[str] = None, fully_parallel: bool = False, hf_model_class: str = "AutoModelForCausalLM", @@ -173,9 +175,7 @@ def fully_parallel_load( hf_model_class: str, device_map: DeviceMapType = "auto", torch_dtype: Optional[torch.dtype] = None, - quantization_config: Optional[ - Union[QuantizationConfigMixin, Dict[str, Any]] - ] = None, + quantization_config=None, storage_path: Optional[str] = None, ): if not storage_path: @@ -228,19 +228,42 @@ def fully_parallel_load( logger.debug(f"load model takes {time.time() - start} seconds") replica_uuid, state_dict = future.result() + + # # synchronize + # client = SllmStoreClient("127.0.0.1:8073") + # client.confirm_model_loaded(model_path, replica_uuid) + # start_profiling() with torch.no_grad(): if quantization_config and torch.cuda.is_available(): - model = quantize( - model, - state_dict, - quantization_config, - torch_dtype, - device_map, - model_path, - replica_uuid, - logger, + from transformers import BitsAndBytesConfig + + if not isinstance(quantization_config, BitsAndBytesConfig): + raise ValueError( + f"Invalid config type: {type(quantization_config)}" + ) + + logger.debug( + f"using precision: {quantization_config.quantization_method()}" ) + + if quantization_config.llm_int8_enable_fp32_cpu_offload: + logger.debug("Offloading is not supported yet") + quantization_config.llm_int8_enable_fp32_cpu_offload = False + + has_torch_dtype = torch_dtype is not None + model = replace_with_bnb_linear( + model, quantization_config=quantization_config + ) + + for name, param in state_dict.items(): + final_device = param.device + if not has_torch_dtype: + param = param.to(torch.float16) + + set_module_quantized_tensor_to_device( + model, name, final_device, param.to("cpu") + ) else: if quantization_config is not None: logger.debug( @@ -254,9 +277,9 @@ def fully_parallel_load( dispatch_model( model, device_map, skip_keys=model._skip_keys_device_placement ) + client = SllmStoreClient("127.0.0.1:8073") client.confirm_model_loaded(model_path, replica_uuid) - model.hf_device_map = device_map model.eval() return model @@ -266,9 +289,7 @@ def best_effort_load( hf_model_class: str, device_map: DeviceMapType = "auto", torch_dtype: Optional[torch.dtype] = None, - quantization_config: Optional[ - Union[QuantizationConfigMixin, Dict[str, Any]] - ] = None, + quantization_config=None, storage_path: Optional[str] = None, ): client = SllmStoreClient("127.0.0.1:8073") @@ -341,9 +362,17 @@ def best_effort_load( expanded_device_map, tensor_data_index ) # logger.debug(f"calculate_device_memory {device_memory}") - cuda_memory_ptrs = allocate_cuda_memory(device_memory) + cuda_memory_ptrs = allocate_memory(device_memory) # cuda_memory_ptrs = { k: [v] for k,v in cuda_memory_ptrs.items()} - cuda_memory_handles = get_cuda_memory_handles(cuda_memory_ptrs) + if device_type == "npu": + cuda_memory_handles, updated_ptrs = get_memory_handles( + cuda_memory_ptrs + ) + memory_ptrs_for_restore = updated_ptrs + else: + cuda_memory_handles = get_memory_handles(cuda_memory_ptrs) + memory_ptrs_for_restore = cuda_memory_ptrs + device_uuid_map = get_device_uuid_map() # logger.debug(f"determine device_uuid_map {device_uuid_map}") tensor_device_offsets, tensor_copy_chunks = calculate_tensor_device_offsets( @@ -368,23 +397,53 @@ def best_effort_load( # load model state_dict start = time.time() + # Use the prepared memory_ptrs_for_restore + if device_type == "npu": + # For NPU, updated_ptrs is {int: int(uintptr)}, convert to capsules + memory_ptrs = { + k: create_pointer_capsule(v) + for k, v in memory_ptrs_for_restore.items() + } + else: + memory_ptrs = memory_ptrs_for_restore # CUDA returns map state_dict = restore_tensors( - tensor_meta_index, cuda_memory_ptrs, tensor_device_offsets + tensor_meta_index, memory_ptrs, tensor_device_offsets ) logger.info(f"restore state_dict takes {time.time() - start} seconds") with torch.no_grad(): if quantization_config and torch.cuda.is_available(): - model = quantize( - model, - state_dict, - quantization_config, - torch_dtype, - device_map, - model_path, - replica_uuid, - logger, + from transformers import BitsAndBytesConfig + + if not isinstance(quantization_config, BitsAndBytesConfig): + raise ValueError( + f"Invalid config type: {type(quantization_config)}" + ) + + logger.debug( + f"using precision: {quantization_config.quantization_method()}" + ) + + if quantization_config.llm_int8_enable_fp32_cpu_offload: + logger.debug("Offloading is not supported yet") + quantization_config.llm_int8_enable_fp32_cpu_offload = False + + model = replace_with_bnb_linear( + model, quantization_config=quantization_config ) + + client.confirm_model_loaded(model_path, replica_uuid) + + for name, param in state_dict.items(): + if ( + param.dtype not in [torch.uint8, torch.int8] + and torch_dtype is None + ): + param = param.to(torch.float16) + + set_module_quantized_tensor_to_device( + model, name, param.device, param + ) else: if quantization_config is not None: logger.debug( @@ -495,4 +554,4 @@ def load_lora( logger.info(f"Available adapters: {peft_model.peft_config.keys()}") - return peft_model + return peft_model \ No newline at end of file diff --git a/sllm_store/tests/python/test_cann_basic.py b/sllm_store/tests/python/test_cann_basic.py new file mode 100644 index 0000000..15149d3 --- /dev/null +++ b/sllm_store/tests/python/test_cann_basic.py @@ -0,0 +1,81 @@ +import os +import sys +import pytest +import torch + +# Add the parent directory to sys.path to import sllm_store +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) + +try: + import torch_npu + CANN_AVAILABLE = True + print("torch_npu successfully imported") +except ImportError: + CANN_AVAILABLE = False + print("torch_npu not available") + +def test_cann_basic_import(): + """Test basic CANN functionality""" + if not CANN_AVAILABLE: + pytest.skip("CANN not available") + + # Test device detection + try: + device_count = torch_npu.npu.device_count() + print(f"NPU devices detected: {device_count}") + assert device_count > 0, "No NPU devices found" + except Exception as e: + pytest.fail(f"Failed to get NPU device count: {e}") + +def test_sllm_store_import(): + """Test that sllm_store can be imported""" + try: + from sllm_store.transformers import load_model + print("sllm_store.transformers imported successfully") + except ImportError as e: + pytest.fail(f"Failed to import sllm_store.transformers: {e}") + +def test_cann_utils_import(): + """Test CANN utils import""" + if not CANN_AVAILABLE: + pytest.skip("CANN not available") + + try: + from sllm_store.cann_utils import get_memory_functions, get_device_type + allocate_memory, get_memory_handles = get_memory_functions() + device_type = get_device_type() + print(f"Device type: {device_type}") + assert device_type == "npu", f"Expected 'npu', got '{device_type}'" + except ImportError as e: + print(f"CANN utils not available (expected if not compiled with CANN): {e}") + +def test_basic_npu_operations(): + """Test basic NPU tensor operations""" + if not CANN_AVAILABLE: + pytest.skip("CANN not available") + + try: + # Test basic tensor creation and movement + device = torch_npu.npu.device(0) + x = torch.randn(2, 3) + x_npu = x.to(device) + + print(f"Tensor device: {x_npu.device}") + print(f"Tensor shape: {x_npu.shape}") + + # Test basic operation + y_npu = x_npu * 2 + y_cpu = y_npu.cpu() + + assert torch.allclose(y_cpu, x * 2), "NPU computation failed" + print("Basic NPU operations successful") + except Exception as e: + pytest.fail(f"NPU operations failed: {e}") + +if __name__ == "__main__": + print("Testing CANN basic functionality...") + test_cann_basic_import() + test_sllm_store_import() + test_cann_utils_import() + test_basic_npu_operations() + print("All basic tests completed!") \ No newline at end of file diff --git a/sllm_store/tests/python/test_cann_load_model.py b/sllm_store/tests/python/test_cann_load_model.py new file mode 100644 index 0000000..f60a986 --- /dev/null +++ b/sllm_store/tests/python/test_cann_load_model.py @@ -0,0 +1,278 @@ +import time +import torch +import torch_npu +# from torch_npu.contrib import transfer_to_npu +import os +from transformers import AutoTokenizer, AutoModelForCausalLM +from sllm_store.transformers import load_model +from sllm_store.cann_utils import is_cann_available +from sllm_store._C import start_profiling + +# start_profiling() + +# os.environ['ASCEND_RT_VISIBLE_DEVICES']='0,1' + +# --- Configuration --- +model_name = 'facebook/opt-1.3b' +storage_path = "/mnt/model_weights/models/" +target_dtype = torch.float16 +# --- End Configuration --- + +# --- Helper Functions for Weight Inspection --- +def inspect_weights(model_instance, stage_name, target_device=None): + """Prints statistics for key model weights.""" + print(f"\n--- {stage_name} Weight Inspection ---") + + if target_device: + print(f"Model current device: {next(model_instance.parameters()).device}") + + # For Qwen2.5, typically model.model.layers is the list of transformer blocks + # We'll check the first layer's self_attn.q_proj.weight as a representative + try: + # Access the first transformer block's query projection weight + # Path might be model.model.layers[0].self_attn.q_proj.weight for Qwen2.5 + # Or model.decoder.layers[0].self_attn.q_proj.weight for other architectures + + # A safer way to find a relevant weight + target_param = None + for name, param in model_instance.named_parameters(): + if "layers.0.self_attn.q_proj.weight" in name: + target_param = param + break + + if target_param is None: + print("Could not find a common transformer layer weight (e.g., q_proj).") + print("Attempting to inspect the first found trainable parameter.") + for name, param in model_instance.named_parameters(): + if param.requires_grad: + target_param = param + break + + if target_param is not None: + # Ensure the tensor is on CPU for statistical stability when comparing across devices + # and convert to float32 for accurate statistics if it's float16 + param_cpu_float32 = target_param.cpu().float() + + print(f"Inspecting weight: '{name}' (dtype: {target_param.dtype}, device: {target_param.device})") + print(f" Shape: {param_cpu_float32.shape}") + print(f" Mean: {param_cpu_float32.mean().item():.6f}") + print(f" Std: {param_cpu_float32.std().item():.6f}") + print(f" Min: {param_cpu_float32.min().item():.6f}") + print(f" Max: {param_cpu_float32.max().item():.6f}") + + # Check for NaNs/Infs + if torch.isnan(param_cpu_float32).any(): + print("!!! WARNING: NaN values detected in this weight !!!") + if torch.isinf(param_cpu_float32).any(): + print("!!! WARNING: Inf values detected in this weight !!!") + + # Print first few elements to spot obvious corruption patterns + print(" First 10 elements (flattened):") + print(param_cpu_float32.flatten()[:10].tolist()) + else: + print("No trainable parameters found in the model to inspect.") + + except Exception as e: + print(f"Error during weight inspection for '{stage_name}': {e}") + +def compare_weights(model1, model2, name1="Model 1", name2="Model 2"): + print(f"\n--- Comparing selected weights between {name1} and {name2} ---") + + param1 = None + param2 = None + + for n1, p1 in model1.named_parameters(): + if "layers.0.self_attn.q_proj.weight" in n1: + param1_name = n1 + param1 = p1 + break + + for n2, p2 in model2.named_parameters(): + if "layers.0.self_attn.q_proj.weight" in n2: + param2_name = n2 + param2 = p2 + break + + if param1 is None or param2 is None: + print("Could not find corresponding 'q_proj.weight' in both models for comparison.") + print("Falling back to comparing first trainable parameters if available.") + + # Fallback to first trainable parameter + for n1, p1 in model1.named_parameters(): + if p1.requires_grad: + param1_name = n1 + param1 = p1 + break + for n2, p2 in model2.named_parameters(): + if p2.requires_grad: + param2_name = n2 + param2 = p2 + break + + if param1 is not None and param2 is not None: + # Move both to CPU and convert to float32 for accurate comparison + p1_cpu_float32 = param1.cpu().float() + p2_cpu_float32 = param2.cpu().float() + + if p1_cpu_float32.shape != p2_cpu_float32.shape: + print(f"WARNING: Mismatched shapes: {param1_name}: {p1_cpu_float32.shape} vs {param2_name}: {p2_cpu_float32.shape}") + return + + diff = (p1_cpu_float32 - p2_cpu_float32).abs().mean().item() + print(f"Mean absolute difference for '{param1_name}' vs '{param2_name}': {diff:.6f}") + + if diff > 1e-4: # A small tolerance for floating point differences due to precision or operations + print(f"*** WARNING: Significant difference detected (diff > 1e-4) between {name1} and {name2} for this weight! ***") + else: + print(f"Weights are largely similar (diff <= 1e-4).") + else: + print("Could not find suitable parameters in both models for comparison.") + + +# --- Main Script --- + +# Check if NPU is available +device_type = "npu" if is_cann_available() else "cuda" +if not is_cann_available() and torch.cuda.is_available(): + device_type = "cuda" +elif not is_cann_available() and not torch.cuda.is_available(): + print("Neither NPU nor CUDA is available. This script requires an accelerator.") + exit() + +print(f"Using {device_type.upper()} devices") + +# Warm up the device +if device_type == "npu": + try: + num_npus = torch_npu.npu.device_count() + print(f"Number of NPU devices: {num_npus}") + for i in range(num_npus): + torch.ones(1).to(f"npu:{i}") + torch_npu.npu.synchronize() + print("NPU devices warmed up") + except Exception as e: + print(f"Error warming up NPU devices: {e}") + # Proceed with a single device if multi-NPU warm-up fails + device = torch.device("npu:0") +elif device_type == "cuda": + num_gpus = torch.cuda.device_count() + print(f"Number of CUDA devices: {num_gpus}") + for i in range(num_gpus): + torch.ones(1).to(f"cuda:{i}") + torch.cuda.synchronize() + print("CUDA devices warmed up") + +device = torch.device(f"{device_type}") +print(f"Using primary device: {device}") + +# --- 1. Baseline: Load with standard transformers to CPU --- +print("\n--- STEP 1: Loading model with standard transformers (CPU baseline) ---") +start_baseline = time.time() +try: + # Load to CPU first to rule out device-specific issues initially + original_model_cpu = AutoModelForCausalLM.from_pretrained( + model_name, + torch_dtype=target_dtype, + trust_remote_code=True # Qwen models often require this + ) + print(f"Original model loaded successfully to CPU. Time: {time.time() - start_baseline:.2f}s") + inspect_weights(original_model_cpu, "Original CPU Load") + +except Exception as e: + print(f"FAILED: Standard transformers model loading failed: {e}") + print("This indicates an issue with the base model files or Hugging Face setup.") + exit() + +# --- 2. Load model with sllm_store --- +print(f"\n--- STEP 2: Loading model with sllm_store.transformers.load_model ---") +sllm_model_initial = None +sllm_model_on_npu = None +try: + start_sllm_load = time.time() + sllm_model_initial = load_model( + model_name, + device_map="auto", # sllm_store will decide where to initially place + torch_dtype=target_dtype, + storage_path=storage_path, + fully_parallel=True + ) + # Print out the device map + if hasattr(sllm_model_initial, 'hf_device_map'): + print("Loaded model's hf_device_map:") + print(sllm_model_initial.hf_device_map) + else: + print("hf_device_map not attached to model.") + + print(f"sllm_store model loaded successfully. Time: {time.time() - start_sllm_load:.2f}s") + + # Inspect weights immediately after sllm_store load (may still be on CPU or mixed) + inspect_weights(sllm_model_initial, "After sllm_store Load (Initial Placement)") + + # Compare with the original CPU model + compare_weights(original_model_cpu, sllm_model_initial, "Original CPU", "sllm_store Initial") + + # --- 3. Move sllm_store model to target device (NPU/CUDA) --- + print(f"\n--- STEP 3: Skipping move as model is already dispatched via Accelerate ---") + sllm_model_on_npu = sllm_model_initial + start_to_device = time.time() + # sllm_model_on_npu = sllm_model_initial.to(device) + print(f"sllm_store model moved to {device.type.upper()}. Time: {time.time() - start_to_device:.2f}s") + + # Inspect weights after moving to the target device + inspect_weights(sllm_model_on_npu, f"After .to({device.type.upper()})") + + # Compare the sllm_store model after .to() with the original CPU model + compare_weights(original_model_cpu, sllm_model_on_npu, "Original CPU", "sllm_store on NPU") + + # Compare the sllm_store model before and after .to() (if it started on CPU) + if str(next(sllm_model_initial.parameters()).device).startswith('cpu'): + compare_weights(sllm_model_initial, sllm_model_on_npu, "sllm_store Initial (CPU)", "sllm_store on NPU") + +except Exception as e: + print(f"FAILED: sllm_store model loading or device transfer failed: {e}") + # If this fails, the issue is likely within sllm_store or torch_npu's handling + exit() + +# --- 4. Load the tokenizer --- +print("\n--- STEP 4: Loading tokenizer ---") +try: + tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True) + print("Tokenizer loaded successfully.") +except Exception as e: + print(f"FAILED: Tokenizer loading failed: {e}") + exit() + +# --- 5. Prepare input and run inference --- +print("\n--- STEP 5: Preparing input and running inference ---") +inputs = tokenizer('Hello, my dog is cute', return_tensors='pt').to("npu") +print(f"Input tokens on device: {inputs['input_ids'].device}") +print(f"Input tokens decoded: {tokenizer.decode(inputs['input_ids'][0], skip_special_tokens=False)}") + +# for name, param in sllm_model_on_npu.named_parameters(): +# print(name) +# print(param) + +try: + start_inference = time.time() + outputs = sllm_model_on_npu.generate(**inputs, max_new_tokens=100) + print(f"Inference completed. Time: {time.time() - start_inference:.2f}s") + + # Check output tensor for issues + print(f"Output tensor shape: {outputs.shape}") + print(f"Output tensor dtype: {outputs.dtype}") + if torch.isnan(outputs).any(): + print("!!! WARNING: NaN values detected in output tensor !!!") + if torch.isinf(outputs).any(): + print("!!! WARNING: Inf values detected in output tensor !!!") + + # Decode and clean up output + print("\n--- Inference Response ---") + print("Response (raw decoded):", tokenizer.decode(outputs[0], skip_special_tokens=True)) + +except Exception as e: + print(f"FAILED: Inference failed: {e}") + print("This could be due to corrupted weights, NPU issues during computation, or other runtime errors.") + # If the output is "corrupted", this is where it would manifest. + # The weight checks above help determine if it was corrupted *before* inference. + +print("\n--- Testing Complete ---") \ No newline at end of file diff --git a/sllm_store/tests/python/test_cann_load_vllm_model.py b/sllm_store/tests/python/test_cann_load_vllm_model.py new file mode 100644 index 0000000..f8aff09 --- /dev/null +++ b/sllm_store/tests/python/test_cann_load_vllm_model.py @@ -0,0 +1,29 @@ +from vllm import LLM, SamplingParams + +import os + +storage_path = os.getenv("STORAGE_PATH", "/mnt/model_weights/vllm_models") +model_name = "facebook/opt-1.3b" +model_path = os.path.join(storage_path, model_name) + +llm = LLM( + model=model_path, + load_format="serverless_llm", + dtype="float16" +) + +prompts = [ + "Hello, my name is", + "The president of the United States is", + "The capital of France is", + "The future of AI is", +] + +sampling_params = SamplingParams(temperature=0.8, top_p=0.95) +outputs = llm.generate(prompts, sampling_params) + +# Print the outputs. +for output in outputs: + prompt = output.prompt + generated_text = output.outputs[0].text + print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}") \ No newline at end of file diff --git a/sllm_store/tests/python/test_cann_save_model.py b/sllm_store/tests/python/test_cann_save_model.py new file mode 100644 index 0000000..afb8e62 --- /dev/null +++ b/sllm_store/tests/python/test_cann_save_model.py @@ -0,0 +1,25 @@ +# Import necessary modules +from sllm_store.transformers import save_model +import torch +from transformers import AutoModelForCausalLM, AutoTokenizer + +models = [ + # 'facebook/opt-1.3b', + 'facebook/opt-6.7b', + # 'deepseek-ai/DeepSeek-R1-Distill-Llama-8B', + # 'Qwen/Qwen2.5-Coder-14B-Instruct', + # 'deepseek-ai/DeepSeek-R1-Distill-Qwen-32B', + # 'Qwen/Qwen2.5-72B-Instruct' +] + +for model_name in models: + print(model_name) + # Load the model from Hugging Face (as in your code) + loaded_model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.float16) + + # Save the model to the NVMe-mounted path in ServerlessLLM's optimized format + save_model(loaded_model, f'/mnt/model_weights/models/{model_name}') + + # Load and save the tokenizer (using standard Transformers method, as ServerlessLLM focuses on model weights) + tokenizer = AutoTokenizer.from_pretrained(model_name) + tokenizer.save_pretrained(f'/mnt/model_weights/models/{model_name}') \ No newline at end of file diff --git a/sllm_store/vllm_patch/sllm_load_npu.patch b/sllm_store/vllm_patch/sllm_load_npu.patch new file mode 100644 index 0000000..8a67934 --- /dev/null +++ b/sllm_store/vllm_patch/sllm_load_npu.patch @@ -0,0 +1,271 @@ +diff --git a/vllm/config.py b/vllm/config.py +index 8b824a1f..140471eb 100644 +--- a/vllm/config.py ++++ b/vllm/config.py +@@ -1140,6 +1140,7 @@ class LoadFormat(str, enum.Enum): + BITSANDBYTES = "bitsandbytes" + MISTRAL = "mistral" + RUNAI_STREAMER = "runai_streamer" ++ SERVERLESS_LLM = "serverless_llm" + + + @dataclass +diff --git a/vllm/executor/distributed_gpu_executor.py b/vllm/executor/distributed_gpu_executor.py +index deb7cb1c..113c289c 100644 +--- a/vllm/executor/distributed_gpu_executor.py ++++ b/vllm/executor/distributed_gpu_executor.py +@@ -129,6 +129,17 @@ class DistributedGPUExecutor(GPUExecutor): + pattern=pattern, + max_size=max_size) + ++ def save_serverless_llm_state( ++ self, ++ path: str, ++ pattern: Optional[str] = None, ++ max_size: Optional[int] = None, ++ ) -> None: ++ self._run_workers("save_serverless_llm_state", ++ path=path, ++ pattern=pattern, ++ max_size=max_size) ++ + @abstractmethod + def _driver_execute_model( + self, execute_model_req: Optional[ExecuteModelRequest] +diff --git a/vllm/executor/gpu_executor.py b/vllm/executor/gpu_executor.py +index 7fa34456..9d0cf881 100644 +--- a/vllm/executor/gpu_executor.py ++++ b/vllm/executor/gpu_executor.py +@@ -87,6 +87,16 @@ class GPUExecutor(ExecutorBase): + ) -> Optional[List[Union[SamplerOutput, PoolerOutput]]]: + output = self.driver_worker.execute_model(execute_model_req) + return output ++ ++ def save_serverless_llm_state( ++ self, ++ path: str, ++ pattern: Optional[str] = None, ++ max_size: Optional[int] = None, ++ ) -> None: ++ self.driver_worker.save_serverless_llm_state( ++ path=path, pattern=pattern, max_size=max_size ++ ) + + def add_lora(self, lora_request: LoRARequest) -> bool: + assert lora_request.lora_int_id > 0, "lora_id must be greater than 0." +diff --git a/vllm/model_executor/model_loader/loader.py b/vllm/model_executor/model_loader/loader.py +index a9c1fa72..15267ed4 100644 +--- a/vllm/model_executor/model_loader/loader.py ++++ b/vllm/model_executor/model_loader/loader.py +@@ -20,10 +20,11 @@ import numpy as np + import torch + from huggingface_hub import HfApi + from torch import nn ++import gc + from transformers import AutoModelForCausalLM + from transformers.utils import SAFE_WEIGHTS_INDEX_NAME + +-from vllm.config import (LoadConfig, LoadFormat, ModelConfig, ParallelConfig, ++from vllm.config import (LoadConfig, LoadFormat, ModelConfig, ParallelConfig, + VllmConfig, set_current_vllm_config) + from vllm.distributed import (get_tensor_model_parallel_rank, + get_tensor_model_parallel_world_size) +@@ -690,6 +691,140 @@ class ShardedStateLoader(BaseModelLoader): + state_dict_part, + os.path.join(path, filename), + ) ++ ++class ServerlessLLMLoader(BaseModelLoader): ++ # DEFAULT_PATTERN = "model-rank-{rank}-part-{part}.safetensors" ++ ++ def __init__(self, load_config: LoadConfig): ++ super().__init__(load_config) ++ extra_config = ({} if load_config.model_loader_extra_config is None ++ else load_config.model_loader_extra_config.copy()) ++ # self.pattern = extra_config.pop("pattern", self.DEFAULT_PATTERN) ++ if extra_config: ++ raise ValueError(f"Unexpected extra config keys for load format " ++ f"{load_config.load_format}: " ++ f"{load_config.model_loader_extra_config.keys()}") ++ ++ @staticmethod ++ def _filter_subtensors( ++ tensors: Dict[str, torch.Tensor]) -> Dict[str, torch.Tensor]: ++ """ ++ Filter out all tensors that share the same memory or a subset of the ++ memory of another tensor. ++ """ ++ same_storage_groups = collections.defaultdict(list) ++ for key, tensor in tensors.items(): ++ if tensor.numel(): ++ ptr = tensor.untyped_storage().data_ptr() ++ same_storage_groups[tensor.device, ptr].append((key, tensor)) ++ ++ def get_end_ptr(tensor: torch.Tensor) -> int: ++ return tensor.view(-1)[-1].data_ptr() + tensor.element_size() ++ ++ result = {} ++ for group in same_storage_groups.values(): ++ for k, t in group: ++ a, b = t.data_ptr(), get_end_ptr(t) ++ for k2, t2 in group: ++ if not t2.is_contiguous(): ++ continue ++ a2, b2 = t2.data_ptr(), get_end_ptr(t2) ++ if a < a2 or b2 < b: ++ continue ++ if a2 < a or b < b2 or not t.is_contiguous(): ++ break # t2 covers strictly more memory than t. ++ if k2 > k: ++ # Same tensors, keep the one with the longer key. ++ break ++ else: ++ result[k] = t ++ return result ++ ++ def load_model(self, *, vllm_config: VllmConfig) -> nn.Module: ++ from sllm_store.torch import load_dict ++ from vllm.distributed import get_tensor_model_parallel_rank ++ ++ assert os.path.isdir(vllm_config.model_config.model) ++ ++ rank = get_tensor_model_parallel_rank() ++ ++ local_model_path = vllm_config.model_config.model ++ local_model_path = os.path.join(local_model_path, f"rank_{rank}") ++ ++ def remove_prefix(path, prefix): ++ # Normalize the paths to ensure consistency across different platforms ++ path = os.path.normpath(path) ++ prefix = os.path.normpath(prefix) ++ ++ # Check if the path starts with the prefix ++ if path.startswith(prefix): ++ # Return the path without the prefix ++ return path[len(prefix):].lstrip(os.sep) ++ ++ # Return the original path if the prefix doesn't exist ++ return path ++ ++ # vLLM needs a local model path to read model config but ++ # ServerlessLLM Store requires a global model path as the model ID ++ storage_path = os.getenv("STORAGE_PATH", "./models") ++ model_path = remove_prefix(local_model_path, storage_path) ++ ++ with set_default_torch_dtype(vllm_config.model_config.dtype): ++ # with torch.device(device_config.device): ++ with torch.device("cpu"): ++ model = _initialize_model(vllm_config=vllm_config) ++ model = model.eval() ++ # set all parameters to meta device ++ state_dict = self._filter_subtensors(model.state_dict()) ++ key_list = list(state_dict.keys()) ++ ++ for key, param in model.named_parameters(recurse=True): ++ if key in key_list: ++ param.data = torch.empty(1, device="npu") ++ gc.collect() ++ ++ device_id = torch.npu.current_device() ++ device_map = {"": device_id} ++ # Note: storage path is already included in the local model path ++ sllm_state_dict = load_dict(model_path, device_map) ++ ++ for key, param in model.named_parameters(recurse=True): ++ if key in key_list: ++ tensor = sllm_state_dict[key] ++ param.data = tensor ++ state_dict.pop(key) ++ if state_dict: ++ raise ValueError( ++ f"Missing keys {tuple(state_dict)} in loaded state!") ++ ++ return model ++ ++ def download_model(self, model_config: ModelConfig) -> None: ++ pass ++ ++ @staticmethod ++ def save_model( ++ model: torch.nn.Module, ++ path: str, ++ pattern: Optional[str] = None, ++ max_size: Optional[int] = None, ++ ) -> None: ++ from vllm.distributed import get_tensor_model_parallel_rank ++ from sllm_store.torch import save_dict ++ ++ rank = get_tensor_model_parallel_rank() ++ state_dict = ServerlessLLMLoader._filter_subtensors(model.state_dict()) ++ ++ # move all tensors to CPU ++ for key, tensor in state_dict.items(): ++ state_dict[key] = tensor.cpu().contiguous() ++ ++ save_path = os.path.join(path, f"rank_{rank}") ++ if not os.path.exists(save_path): ++ os.makedirs(save_path) ++ ++ save_dict(state_dict, save_path) ++ + + + class BitsAndBytesModelLoader(BaseModelLoader): +@@ -1365,6 +1500,9 @@ def get_model_loader(load_config: LoadConfig) -> BaseModelLoader: + + if load_config.load_format == LoadFormat.SHARDED_STATE: + return ShardedStateLoader(load_config) ++ ++ if load_config.load_format == LoadFormat.SERVERLESS_LLM: ++ return ServerlessLLMLoader(load_config) + + if load_config.load_format == LoadFormat.BITSANDBYTES: + return BitsAndBytesModelLoader(load_config) +diff --git a/vllm/worker/model_runner.py b/vllm/worker/model_runner.py +index 1c6d1bbe..a5a1ff1d 100644 +--- a/vllm/worker/model_runner.py ++++ b/vllm/worker/model_runner.py +@@ -1186,6 +1186,20 @@ class GPUModelRunnerBase(ModelRunnerBase[TModelInputForGPU]): + pattern=pattern, + max_size=max_size, + ) ++ ++ def save_serverless_llm_state( ++ self, ++ path: str, ++ pattern: Optional[str] = None, ++ max_size: Optional[int] = None, ++ ) -> None: ++ from vllm.model_executor.model_loader.loader import ServerlessLLMLoader ++ ServerlessLLMLoader.save_model( ++ self.model, ++ path, ++ pattern=pattern, ++ max_size=max_size, ++ ) + + def save_tensorized_model( + self, +diff --git a/vllm/worker/worker.py b/vllm/worker/worker.py +index f51b51d4..8a5a2fc2 100644 +--- a/vllm/worker/worker.py ++++ b/vllm/worker/worker.py +@@ -165,6 +165,18 @@ class Worker(LocalOrDistributedWorkerBase): + pattern=pattern, + max_size=max_size, + ) ++ ++ def save_serverless_llm_state( ++ self, ++ path: str, ++ pattern: Optional[str] = None, ++ max_size: Optional[int] = None, ++ ) -> None: ++ self.model_runner.save_serverless_llm_state( ++ path, ++ pattern=pattern, ++ max_size=max_size, ++ ) + + def save_tensorized_model( + self, \ No newline at end of file diff --git a/sllm_store/vllm_patch/vllm_ascend.patch b/sllm_store/vllm_patch/vllm_ascend.patch new file mode 100644 index 0000000..2b830f4 --- /dev/null +++ b/sllm_store/vllm_patch/vllm_ascend.patch @@ -0,0 +1,46 @@ +--- a/vllm_ascend/worker/model_runner.py ++++ b/vllm_ascend/worker/model_runner.py +@@ -1156,6 +1156,20 @@ class NPUModelRunner(NPUModelRunnerBase[ModelInputForNPUWithSamplingMetadata]): + attn_backend=self.attn_backend, + ) + return model_input ++ ++ def save_serverless_llm_state( ++ self, ++ path: str, ++ pattern: Optional[str] = None, ++ max_size: Optional[int] = None, ++ ) -> None: ++ from vllm.model_executor.model_loader.loader import ServerlessLLMLoader ++ ServerlessLLMLoader.save_model( ++ self.model, ++ path, ++ pattern=pattern, ++ max_size=max_size, ++ ) + + def prepare_model_input( + self, +diff --git a/vllm_ascend/worker/worker.py b/vllm_ascend/worker/worker.py +index 120d343..9b88c8d 100644 +--- a/vllm_ascend/worker/worker.py ++++ b/vllm_ascend/worker/worker.py +@@ -228,6 +228,18 @@ class NPUWorker(LocalOrDistributedWorkerBase): + max_size=max_size, + ) + ++ def save_serverless_llm_state( ++ self, ++ path: str, ++ pattern: Optional[str] = None, ++ max_size: Optional[int] = None, ++ ) -> None: ++ self.model_runner.save_serverless_llm_state( ++ path, ++ pattern=pattern, ++ max_size=max_size, ++ ) ++ + def save_tensorized_model( + self, + tensorizer_config: TensorizerConfig, \ No newline at end of file -- Gitee

STnhK{Sp_l7elON)BV`~WQ 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