From 43889f3b90f2ccb91ed419addb220a67c4a722af Mon Sep 17 00:00:00 2001 From: lg Date: Wed, 22 Jan 2025 01:20:09 +0000 Subject: [PATCH 1/9] inv cluster.provision/delete works --- K8S_VERSION | 1 + config/granny_aks_kubelet_config.json | 1 + config/granny_aks_os_config.json | 13 +++ tasks/__init__.py | 2 + tasks/cluster.py | 143 ++++++++++++++++++++++++++ tasks/util/env.py | 9 ++ tasks/util/version.py | 23 +++++ 7 files changed, 192 insertions(+) create mode 100644 K8S_VERSION create mode 100644 config/granny_aks_kubelet_config.json create mode 100644 config/granny_aks_os_config.json create mode 100644 tasks/cluster.py create mode 100644 tasks/util/version.py diff --git a/K8S_VERSION b/K8S_VERSION new file mode 100644 index 0000000..82a5f3b --- /dev/null +++ b/K8S_VERSION @@ -0,0 +1 @@ +1.28.5 diff --git a/config/granny_aks_kubelet_config.json b/config/granny_aks_kubelet_config.json new file mode 100644 index 0000000..0b11bb8 --- /dev/null +++ b/config/granny_aks_kubelet_config.json @@ -0,0 +1 @@ +{ "allowedUnsafeSysctls": ["net.*"] } diff --git a/config/granny_aks_os_config.json b/config/granny_aks_os_config.json new file mode 100644 index 0000000..84e27c7 --- /dev/null +++ b/config/granny_aks_os_config.json @@ -0,0 +1,13 @@ +{ + "sysctls": { + "netCoreRmemMax": 16777216, + "netCoreWmemMax": 16777216, + "netIpv4TcpRmem": "4096 87380 16777216", + "netIpv4TcpWmem": "4096 65536 16777216", + "netCoreNetdevMaxBacklog": "30000", + "netCoreRmemDefault": 16777216, + "netCoreWmemDefault": 16777216, + "netIpv4TcpMem": "16777216 16777216 16777216", + "netIpv4RouteFlush": 1 + } +} diff --git a/tasks/__init__.py b/tasks/__init__.py index a25b3b8..352bfe9 100644 --- a/tasks/__init__.py +++ b/tasks/__init__.py @@ -1,5 +1,6 @@ from invoke import Collection +from . import cluster from . import docker from . import format_code @@ -20,6 +21,7 @@ logging.getLogger().setLevel(logging.DEBUG) ns = Collection( + cluster, docker, format_code, ) diff --git a/tasks/cluster.py b/tasks/cluster.py new file mode 100644 index 0000000..f1df932 --- /dev/null +++ b/tasks/cluster.py @@ -0,0 +1,143 @@ +from invoke import task +from os.path import join +from subprocess import run +from tasks.util.env import ( + ACR_NAME, + AKS_CLUSTER_NAME, + AKS_NODE_COUNT, + AKS_REGION, + AKS_VM_SIZE, + AZURE_PUB_SSH_KEY, + AZURE_RESOURCE_GROUP, + CONFIG_DIR, + KUBECTL_BIN, +) +from tasks.util.version import get_k8s_version + + +# AKS commandline reference here: +# https://docs.microsoft.com/en-us/cli/azure/aks?view=azure-cli-latest +def _run_aks_cmd(name, az_args=None): + cmd = [ + "az", + "aks {}".format(name), + "--resource-group {}".format(AZURE_RESOURCE_GROUP), + ] + + if az_args: + cmd.extend(az_args) + + cmd = " ".join(cmd) + print(cmd) + run(cmd, shell=True, check=True) + + +@task +def list(ctx): + """ + List all AKS resources + """ + _run_aks_cmd("list") + + +@task(optional=["sgx"]) +def provision( + ctx, + nodes=AKS_NODE_COUNT, + vm=AKS_VM_SIZE, + location=AKS_REGION, + name=AKS_CLUSTER_NAME, + sgx=False, + granny=True, +): + """ + Provision the AKS cluster + """ + k8s_ver = get_k8s_version() + sgx = sgx and (sgx.lower() != "false") + granny_kubelet_config = join(CONFIG_DIR, "granny_aks_kubelet_config.json") + granny_os_config = join(CONFIG_DIR, "granny_aks_os_config.json") + + if sgx and "Standard_DC" not in vm: + print( + "Error provisioning SGX cluster: only `Standard_DC` VMs are supported" + ) + return + + _run_aks_cmd( + "create", + [ + "--name {}".format(name), + "--node-count {}".format(nodes), + "--node-vm-size {}".format(vm), + "--os-sku Ubuntu", + "--kubernetes-version {}".format(k8s_ver), + "--ssh-key-value {}".format(AZURE_PUB_SSH_KEY), + "--location {}".format(location), + # Could not create a role assignment for ACR. Are you an Owner on this subscription? + # "--attach-acr {}".format(ACR_NAME.split(".")[0]), + "{}".format( + "--kubelet-config {}".format(granny_kubelet_config) + if granny + else "" + ), + "{}".format( + "--linux-os-config {}".format(granny_os_config) + if granny + else "" + ), + "{}".format( + "--enable-addons confcom --enable-sgxquotehelper" + if sgx + else "" + ), + ], + ) + + +@task +def details(ctx): + """ + Show the details of the cluster + """ + _run_aks_cmd( + "show", + [ + "--name {}".format(AKS_CLUSTER_NAME), + ], + ) + + +@task +def delete(ctx, name=AKS_CLUSTER_NAME): + """ + Delete the AKS cluster + """ + _run_aks_cmd( + "delete", + [ + "--name {}".format(name), + "--yes", + ], + ) + + +@task +def credentials(ctx, name=AKS_CLUSTER_NAME, out_file=None): + """ + Get credentials for the AKS cluster + """ + # Set up the credentials + _run_aks_cmd( + "get-credentials", + [ + "--name {}".format(name), + "--overwrite-existing", + "--file {}".format(out_file) if out_file else "", + ], + ) + + # Check we can access the cluster + cmd = "{} get nodes".format(KUBECTL_BIN) + print(cmd) + run(cmd, shell=True, check=True) diff --git a/tasks/util/env.py b/tasks/util/env.py index d44584c..81eb65c 100644 --- a/tasks/util/env.py +++ b/tasks/util/env.py @@ -5,10 +5,19 @@ HOME_DIR = expanduser("~") PROJ_ROOT = dirname(dirname(dirname(realpath(__file__)))) +CONFIG_DIR = join(PROJ_ROOT, "config") FAASM_ROOT = join(HOME_DIR, "faasm") SYSTEM_NAME = "Granny" +AZURE_RESOURCE_GROUP = "faasm" ACR_NAME = "faasm.azurecr.io" +AKS_CLUSTER_NAME = "faasm-cluster" # TODO: named based on $USER ? +AKS_VM_SIZE = "Standard_DS5_v2" +AKS_NODE_COUNT = 4 +AKS_REGION = "eastus" +AZURE_PUB_SSH_KEY = "~/.ssh/id_rsa.pub" +KUBECTL_BIN = join(PROJ_ROOT, "bin", "kubectl") + FAABRIC_EXP_IMAGE_NAME = "faabric-experiments" NATIVE_BUILD_DIR = join(PROJ_ROOT, "build", "native") diff --git a/tasks/util/version.py b/tasks/util/version.py new file mode 100644 index 0000000..46baaaa --- /dev/null +++ b/tasks/util/version.py @@ -0,0 +1,23 @@ +from os.path import join + +from tasks.util.env import PROJ_ROOT + +# Note - this must match the version used by Faasm +KNATIVE_VERSION = "1.1.0" +K9S_VERSION = "0.24.15" + + +def _read_ver_file(file_path): + with open(file_path, "r") as fh: + ver = fh.read() + ver = ver.strip() + + return ver + + +def get_version(): + return _read_ver_file(join(PROJ_ROOT, "VERSION")) + + +def get_k8s_version(): + return _read_ver_file(join(PROJ_ROOT, "K8S_VERSION")) From 1488d1d5d8bcecadc9076fa35dab5376d09bb9ea Mon Sep 17 00:00:00 2001 From: lg Date: Wed, 22 Jan 2025 11:02:35 +0000 Subject: [PATCH 2/9] simplify README --- tasks/kernels_mpi/README.md | 12 ++++++------ tasks/kernels_omp/README.md | 12 ++++++------ tasks/lammps/README.md | 2 +- tasks/lulesh/README.md | 16 ++++++++-------- tasks/makespan/README.md | 18 +++++++++--------- tasks/makespan/eviction.md | 18 +++++++++--------- tasks/openmpi/README.md | 14 +++++++------- 7 files changed, 46 insertions(+), 46 deletions(-) diff --git a/tasks/kernels_mpi/README.md b/tasks/kernels_mpi/README.md index f0ea50e..5f10336 100644 --- a/tasks/kernels_mpi/README.md +++ b/tasks/kernels_mpi/README.md @@ -5,10 +5,10 @@ as a microbenchmark for Granny's MPI implementation. ## Start AKS cluster -In the `experiment-base` terminal, run: +Create a new cluster: ```bash -(faasm-exp-base) inv cluster.provision --vm Standard_D8_v5 --nodes 3 cluster.credentials +inv cluster.provision --vm Standard_D8_v5 --nodes 3 cluster.credentials ``` ## Granny @@ -16,19 +16,19 @@ In the `experiment-base` terminal, run: Deploy the cluster: ```bash -(faasm-exp-faabric) faasmctl deploy.k8s --workers=2 +faasmctl deploy.k8s --workers=2 ``` Upload the WASM file: ```bash -(faasm-exp-faabric) inv kernels-mpi.wasm.upload +inv kernels-mpi.wasm.upload ``` and run the experiment with: ```bash -(faasm-exp-faabric) inv kernels-mpi.run.wasm +inv kernels-mpi.run.wasm ``` finally, delete the Granny cluster: @@ -73,5 +73,5 @@ the plot will be available in [`./plots/kernels-mpi/mpi_kernels_slowdown.pdf`]( Finally, delete the AKS cluster: ```bash -(faasm-exp-base) inv cluster.delete +inv cluster.delete ``` diff --git a/tasks/kernels_omp/README.md b/tasks/kernels_omp/README.md index 3d0f3ef..45d7342 100644 --- a/tasks/kernels_omp/README.md +++ b/tasks/kernels_omp/README.md @@ -5,10 +5,10 @@ as a microbenchmark for Granny's OpenMP implementation. ## Start AKS cluster -In the `experiment-base` terminal, run: +Create a new cluster: ```bash -(faasm-exp-base) inv cluster.provision --vm Standard_D8_v5 --nodes 2 cluster.credentials +inv cluster.provision --vm Standard_D8_v5 --nodes 2 cluster.credentials ``` ## Faasm @@ -16,19 +16,19 @@ In the `experiment-base` terminal, run: Deploy the cluster: ```bash -(faasm-exp-faabric) faasmctl deploy.k8s --workers=1 +faasmctl deploy.k8s --workers=1 ``` Upload the WASM file: ```bash -(faasm-exp-faabric) inv kernels-omp.wasm.upload +inv kernels-omp.wasm.upload ``` and run the experiment with: ```bash -(faasm-exp-faabric) inv kernels-omp.run.wasm +inv kernels-omp.run.wasm ``` finally, delete the cluster: @@ -73,5 +73,5 @@ the plot will be available in [`./plots/kernels-omp/openmp_kernels_slowdown.pdf` Finally, delete the AKS cluster: ```bash -(faasm-exp-base) inv cluster.delete +inv cluster.delete ``` diff --git a/tasks/lammps/README.md b/tasks/lammps/README.md index 132f45b..a608d8f 100644 --- a/tasks/lammps/README.md +++ b/tasks/lammps/README.md @@ -5,7 +5,7 @@ as part of the array experiment. ## Start AKS cluster -In the `experiment-base` terminal, run: +Create a new cluster: ```bash inv cluster.provision --vm Standard_D8_v5 --nodes 3 diff --git a/tasks/lulesh/README.md b/tasks/lulesh/README.md index 0043969..7236088 100644 --- a/tasks/lulesh/README.md +++ b/tasks/lulesh/README.md @@ -10,11 +10,11 @@ This experiment is a single execution of the LULESH simulation using OpenMP. ## Start AKS cluster -In the `experiment-base` terminal, run: +Create a new cluster: ```bash -(faasm-exp-base) inv cluster.provision --vm Standard_D8_v5 --nodes 1 -(faasm-exp-base) inv cluster.credentials +inv cluster.provision --vm Standard_D8_v5 --nodes 1 +inv cluster.credentials ``` ## Granny @@ -22,25 +22,25 @@ In the `experiment-base` terminal, run: Deploy the cluster: ```bash -(faasm-exp-faabric) faasmctl deploy.k8s --workers=1 +faasmctl deploy.k8s --workers=1 ``` Upload the WASM file: ```bash -(faasm-exp-faabric) inv lammps.wasm.upload +inv lammps.wasm.upload ``` and run the experiment with: ```bash -(faasm-exp-faabric) inv lammps.run.granny -w compute -w network +inv lammps.run.granny -w compute -w network ``` To remove the cluster, run: ```bash -(faasm-exp-mpi) faasmctl delete +faasmctl delete ``` ## Native @@ -78,7 +78,7 @@ which will generate a plot in [`./plots/lammps/runtime.png`]( ## Clean-Up -Remember to delete the cluster. From the experiment base terminal: +Remember to delete the cluster. ```bash inv cluster.delete diff --git a/tasks/makespan/README.md b/tasks/makespan/README.md index b455827..6cc0d0a 100644 --- a/tasks/makespan/README.md +++ b/tasks/makespan/README.md @@ -7,11 +7,11 @@ NOTE: we only compare to ourselves! TODO: add README for the conservative plot -First, from the `faasm-exp-base` shell, deploy the VM cluster: +Create a new cluster: ```bash -(faasm-exp-base) inv cluster.provision --vm Standard_D8_v5 --nodes 33 -(faasm-exp-base) inv cluster.credentials +inv cluster.provision --vm Standard_D8_v5 --nodes 33 +inv cluster.credentials ``` ## Native @@ -19,14 +19,14 @@ First, from the `faasm-exp-base` shell, deploy the VM cluster: First, deploy the native `k8s` cluster: ```bash -(faasm-exp-base) inv makespan.native.deploy --num-vms 32 +inv makespan.native.deploy --num-vms 32 ``` Now, you can run the different baselines: ```bash -(faasm-exp-base) inv makespan.run.native-batch --workload mpi-migrate --num-vms 32 --num-tasks 100 -(faasm-exp-base) inv makespan.run.native-slurm --workload mpi-migrate --num-vms 32 --num-tasks 100 +inv makespan.run.native-batch --workload mpi-migrate --num-vms 32 --num-tasks 100 +inv makespan.run.native-slurm --workload mpi-migrate --num-vms 32 --num-tasks 100 ``` Lastly, remove the native `k8s` cluster: @@ -46,20 +46,20 @@ faasmctl deploy.k8s --workers=32 Second, upload the corresponding WASM files: ```bash -(faasm-exp-faabric) inv makespan.wasm.upload +inv makespan.wasm.upload ``` Third, run the experiment: ```bash -(faasm-exp-faabric) inv makespan.run.granny --num-vms 32 --num-tasks 100 --workload mpi-migrate [--migrate] +inv makespan.run.granny --num-vms 32 --num-tasks 100 --workload mpi-migrate [--migrate] ``` During an experiment, you may monitor the state of the cluster (in a separete shell) by using: ```bash -(faasm-exp-faabric) faasmctl monitor.planner +faasmctl monitor.planner ``` ## Plot the results diff --git a/tasks/makespan/eviction.md b/tasks/makespan/eviction.md index b8e9c01..c399b51 100644 --- a/tasks/makespan/eviction.md +++ b/tasks/makespan/eviction.md @@ -1,10 +1,10 @@ # Makespan Experiment (Eviction version) -First, from the `faasm-exp-base` shell, deploy the VM cluster: +Create a new cluster: ```bash -(faasm-exp-base) inv cluster.provision --vm Standard_D8_v5 --nodes 33 -(faasm-exp-base) inv cluster.credentials +inv cluster.provision --vm Standard_D8_v5 --nodes 33 +inv cluster.credentials ``` ## Native @@ -12,14 +12,14 @@ First, from the `faasm-exp-base` shell, deploy the VM cluster: First, deploy the native `k8s` cluster: ```bash -(faasm-exp-base) inv makespan.native.deploy --num-vms 32 +inv makespan.native.deploy --num-vms 32 ``` Now, you can run the different baselines: ```bash -(faasm-exp-base) inv makespan.run.native-batch --workload mpi-evict --num-vms 32 --num-tasks 200 -(faasm-exp-base) inv makespan.run.native-slurm --workload mpi-evict --num-vms 32 --num-tasks 200 +inv makespan.run.native-batch --workload mpi-evict --num-vms 32 --num-tasks 200 +inv makespan.run.native-slurm --workload mpi-evict --num-vms 32 --num-tasks 200 ``` Lastly, remove the native `k8s` cluster: @@ -39,7 +39,7 @@ faasmctl deploy.k8s --workers=32 Second, upload the corresponding WASM files: ```bash -(faasm-exp-faabric) inv makespan.wasm.upload +inv makespan.wasm.upload ``` Third, run the experiment: @@ -49,14 +49,14 @@ Third, run the experiment: # (faasm-exp-faabric) inv makespan.run.granny --workload mpi # Set the --migrate flag to enable migrating Granules at runtime # TODO: rename the workload to `mpi` -(faasm-exp-faabric) inv makespan.run.granny --num-vms 32 --num-tasks 100 --workload mpi-migrate [--migrate] +inv makespan.run.granny --num-vms 32 --num-tasks 100 --workload mpi-migrate [--migrate] ``` During an experiment, you may monitor the state of the cluster (in a separete shell) by using: ```bash -(faasm-exp-faabric) faasmctl monitor.planner +faasmctl monitor.planner ``` ## Plot the results diff --git a/tasks/openmpi/README.md b/tasks/openmpi/README.md index 85dccac..a608d8f 100644 --- a/tasks/openmpi/README.md +++ b/tasks/openmpi/README.md @@ -5,11 +5,11 @@ as part of the array experiment. ## Start AKS cluster -In the `experiment-base` terminal, run: +Create a new cluster: ```bash -(faasm-exp-base) inv cluster.provision --vm Standard_D8_v5 --nodes 3 -(faasm-exp-base) inv cluster.credentials +inv cluster.provision --vm Standard_D8_v5 --nodes 3 +inv cluster.credentials ``` ## Granny @@ -17,25 +17,25 @@ In the `experiment-base` terminal, run: Deploy the cluster: ```bash -(faasm-exp-faabric) faasmctl deploy.k8s --workers=2 +faasmctl deploy.k8s --workers=2 ``` Upload the WASM file: ```bash -(faasm-exp-faabric) inv lammps.wasm.upload +inv lammps.wasm.upload ``` and run the experiment with: ```bash -(faasm-exp-faabric) inv lammps.run.wasm -w compute -w network +inv lammps.run.wasm -w compute -w network ``` To remove the cluster, run: ```bash -(faasm-exp-mpi) faasmctl delete +faasmctl delete ``` ## Native From 146ef4a6fa98cf8feadb40aabce4f977c7fc3e0d Mon Sep 17 00:00:00 2001 From: lg Date: Thu, 23 Jan 2025 20:11:25 +0000 Subject: [PATCH 3/9] pass over documents --- README.md | 18 +++--------------- tasks/makespan/eviction.md | 2 +- tasks/migration/README.md | 10 +++++----- 3 files changed, 9 insertions(+), 21 deletions(-) diff --git a/README.md b/README.md index 91c82c6..c2a4bbb 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,10 @@ # Granny Experiments -This repo contains the experiments for the [Granny paper]( -https://arxiv.org/abs/2302.11358). +This repo contains the experiments for the [Granny paper](https://arxiv.org/abs/2302.11358). -When following any instructions in this repository, it is recommended to -have two open terminals: -* One on the [`experiment-base`](https://github.com/faasm/experiment-base) repo - with the virtual environment activated (`source ./bin/workon.sh`). From now - onward, we will refer to this shell by its venv name: `faasm-exp-base`. -* One with this repo and the virtual environment activated - (`source ./bin/workon.sh`). From now onward, we will refer to this shell by - its venv name: `faasm-exp-faabric`. +When following any instructions in this repository, it is recommended to have a dedicated terminal with virtual environment of this repo activated: (`source ./bin/workon.sh`). -The former is used to provision/deprovision K8s clusters on Azure (with AKS), -and also to access low-level monitoring tools (we recommend `k9s`). - -The latter is used to deploy Faabric clusters, run the experiments, and plot -the results. +This virtual environment provides commands for provision/deprovision K8s clusters on Azure (with AKS), accessing low-level monitoring tools (we recommend `k9s`), and also commands for deploy Faabric clusters, run the experiments, and plot the results. ## Experiments in this repository diff --git a/tasks/makespan/eviction.md b/tasks/makespan/eviction.md index c399b51..016af35 100644 --- a/tasks/makespan/eviction.md +++ b/tasks/makespan/eviction.md @@ -46,7 +46,7 @@ Third, run the experiment: ```bash # TODO: will probably ditch --workload=mpi -# (faasm-exp-faabric) inv makespan.run.granny --workload mpi +# inv makespan.run.granny --workload mpi # Set the --migrate flag to enable migrating Granules at runtime # TODO: rename the workload to `mpi` inv makespan.run.granny --num-vms 32 --num-tasks 100 --workload mpi-migrate [--migrate] diff --git a/tasks/migration/README.md b/tasks/migration/README.md index aaed8b1..466beff 100644 --- a/tasks/migration/README.md +++ b/tasks/migration/README.md @@ -13,31 +13,31 @@ inv cluster.credentials --name ${CLUSTER_NAME} Second, deploy the cluster ```bash -(faasm-exp-faabric) faasmctl deploy.k8s --workers 2 +faasmctl deploy.k8s --workers 2 ``` Second, upload the WASM files: ```bash -(faasm-exp-faabric) inv migration.wasm.upload +inv migration.wasm.upload ``` Third, run the experiments: ```bash -(faasm-exp-faabric) inv migration.run -w compute -w network +inv migration.run -w compute -w network ``` Lastly, plot the results: ```bash -(faasm-exp-faabric) inv migration.plot +inv migration.plot ``` and clean up: ```bash -(faasm-exp-faabric) faasmctl delete +faasmctl delete ``` ## Migration Oracle From 6ddc5cb78b01805cf5992e6a305a9d842818ba04 Mon Sep 17 00:00:00 2001 From: lg Date: Tue, 4 Feb 2025 16:39:45 +0000 Subject: [PATCH 4/9] pass over experiments (WIP) --- tasks/__init__.py | 2 + tasks/elastic/README.md | 8 +++- tasks/k8s.py | 91 +++++++++++++++++++++++++++++++++++++ tasks/kernels_mpi/README.md | 2 +- tasks/kernels_omp/README.md | 2 +- tasks/lammps/README.md | 3 +- tasks/migration/README.md | 3 +- tasks/polybench/README.md | 6 +-- tasks/polybench/native.py | 7 ++- tasks/util/env.py | 8 +++- 10 files changed, 118 insertions(+), 14 deletions(-) create mode 100644 tasks/k8s.py diff --git a/tasks/__init__.py b/tasks/__init__.py index 352bfe9..74d8f83 100644 --- a/tasks/__init__.py +++ b/tasks/__init__.py @@ -3,6 +3,7 @@ from . import cluster from . import docker from . import format_code +from . import k8s import logging @@ -24,6 +25,7 @@ cluster, docker, format_code, + k8s, ) ns.add_collection(elastic_ns, name="elastic") diff --git a/tasks/elastic/README.md b/tasks/elastic/README.md index eab7b6c..ee574f7 100644 --- a/tasks/elastic/README.md +++ b/tasks/elastic/README.md @@ -1,4 +1,4 @@ -# Elastic Scaling Micro-Benchmark +# Elastic Scaling Micro-Benchmark (Fig.12) In this experiment we measure the benefits of elastically scaling-up OpenMP applications to benefit from idle resources. We run a pipe-lined algorithm @@ -44,6 +44,12 @@ You may now plot the results using: inv elastic.plot ``` +the plot will be available in [`./plots/elastic/elastic_speedup.pdf`]( +./plots/elastic/elastic_speedup.pdf), we also include it below: + +![Elastic Scaling Plot](./plots/elastic/elastic_speedup.png) + + ## Clean-Up Finally, delete the Granny cluster: diff --git a/tasks/k8s.py b/tasks/k8s.py new file mode 100644 index 0000000..9e6be95 --- /dev/null +++ b/tasks/k8s.py @@ -0,0 +1,91 @@ +from invoke import task +from os.path import join, exists +from os import makedirs +from shutil import copy, rmtree +from subprocess import run + +from tasks.util.env import ( + BIN_DIR, + GLOBAL_BIN_DIR, + K9S_VERSION, +) + +from tasks.util.version import get_k8s_version + + +def _download_binary(url, binary_name): + makedirs(BIN_DIR, exist_ok=True) + cmd = "curl -LO {}".format(url) + run(cmd, shell=True, check=True, cwd=BIN_DIR) + run("chmod +x {}".format(binary_name), shell=True, check=True, cwd=BIN_DIR) + + return join(BIN_DIR, binary_name) + + +def _symlink_global_bin(binary_path, name): + global_path = join(GLOBAL_BIN_DIR, name) + if exists(global_path): + print("Removing existing binary at {}".format(global_path)) + run( + "sudo rm -f {}".format(global_path), + shell=True, + check=True, + ) + + print("Symlinking {} -> {}".format(global_path, binary_path)) + run( + "sudo ln -s {} {}".format(binary_path, name), + shell=True, + check=True, + cwd=GLOBAL_BIN_DIR, + ) + + +@task +def install_kubectl(ctx, system=False): + """ + Install the k8s CLI (kubectl) + """ + k8s_ver = get_k8s_version() + url = "https://dl.k8s.io/release/v{}/bin/linux/amd64/kubectl".format( + k8s_ver + ) + + binary_path = _download_binary(url, "kubectl") + + # Symlink for kubectl globally + if system: + _symlink_global_bin(binary_path, "kubectl") + + +@task +def install_k9s(ctx, system=False): + """ + Install the K9s CLI + """ + tar_name = "k9s_Linux_amd64.tar.gz" + url = "https://github.com/derailed/k9s/releases/download/v{}/{}".format( + K9S_VERSION, tar_name + ) + print(url) + + # Download the TAR + workdir = "/tmp/k9s-csg" + makedirs(workdir, exist_ok=True) + + cmd = "curl -LO {}".format(url) + run(cmd, shell=True, check=True, cwd=workdir) + + # Untar + run("tar -xf {}".format(tar_name), shell=True, check=True, cwd=workdir) + + # Copy k9s into place + binary_path = join(BIN_DIR, "k9s") + copy(join(workdir, "k9s"), binary_path) + + # Remove tar + rmtree(workdir) + + # Symlink for k9s command globally + if system: + _symlink_global_bin(binary_path, "k9s") diff --git a/tasks/kernels_mpi/README.md b/tasks/kernels_mpi/README.md index 5f10336..f75667a 100644 --- a/tasks/kernels_mpi/README.md +++ b/tasks/kernels_mpi/README.md @@ -1,4 +1,4 @@ -# ParRes Kernels Experiment (MPI) +# ParRes Kernels Experiment - MPI (Fig.9b) This experiment runs a set of the [ParRes Kernels](https://github.com/ParRes/Kernels) as a microbenchmark for Granny's MPI implementation. diff --git a/tasks/kernels_omp/README.md b/tasks/kernels_omp/README.md index 45d7342..598b695 100644 --- a/tasks/kernels_omp/README.md +++ b/tasks/kernels_omp/README.md @@ -1,4 +1,4 @@ -# ParRes Kernels Experiment (OpenMP) +# ParRes Kernels Experiment - OpenMP (Fig.10) This experiment runs a set of the [ParRes Kernels](https://github.com/ParRes/Kernels) as a microbenchmark for Granny's OpenMP implementation. diff --git a/tasks/lammps/README.md b/tasks/lammps/README.md index a608d8f..4ccd6a5 100644 --- a/tasks/lammps/README.md +++ b/tasks/lammps/README.md @@ -8,8 +8,7 @@ as part of the array experiment. Create a new cluster: ```bash -inv cluster.provision --vm Standard_D8_v5 --nodes 3 -inv cluster.credentials +inv cluster.provision --vm Standard_D8_v5 --nodes 3 cluster.credentials ``` ## Granny diff --git a/tasks/migration/README.md b/tasks/migration/README.md index 466beff..b97ac2f 100644 --- a/tasks/migration/README.md +++ b/tasks/migration/README.md @@ -6,8 +6,7 @@ applications to benefit from dynamic changes in the compute environment. First, provision the cluster: ```bash -inv cluster.provision --vm Standard_D8_v5 --nodes 3 --name ${CLUSTER_NAME} -inv cluster.credentials --name ${CLUSTER_NAME} +inv cluster.provision --vm Standard_D8_v5 --nodes 3 cluster.credentials ``` Second, deploy the cluster diff --git a/tasks/polybench/README.md b/tasks/polybench/README.md index 3ecb70d..0b56c36 100644 --- a/tasks/polybench/README.md +++ b/tasks/polybench/README.md @@ -12,8 +12,8 @@ First, provision the cluster. For ease of deployment, we still deploy a K8s cluster of just one node, which we will access directly. ```bash -inv cluster.provision --vm Standard_D8_v5 --nodes 1 --name ${CLUSTER_NAME} -inv cluster.credentials --name ${CLUSTER_NAME} +inv cluster.provision --vm Standard_D8_v5 --nodes 1 +inv cluster.credentials ``` ## Native @@ -81,5 +81,5 @@ which will generate a `.pdf` file in `./plots/polybench/slowdown.pdf`. Lastly, clean the cluster: ```bash -inv cluster.delete --name ${CLUSTER_NAME} +inv cluster.delete ``` diff --git a/tasks/polybench/native.py b/tasks/polybench/native.py index 1528b15..1d292c7 100644 --- a/tasks/polybench/native.py +++ b/tasks/polybench/native.py @@ -17,8 +17,10 @@ def deploy(ctx, backend="k8s", num_vms=1, num_cores_per_vm=8, ctrs_per_vm=1): num_ctrs = int(num_vms) * int(ctrs_per_vm) num_cores_per_ctr = int(num_cores_per_vm / ctrs_per_vm) if backend == "k8s": + print('deploy_native_mpi') deploy_native_mpi( - "polybench", FAABRIC_EXP_IMAGE_NAME, num_ctrs, num_cores_per_ctr + "polybench", FAABRIC_EXP_IMAGE_NAME, num_ctrs, + # num_cores_per_ctr, ) wait_for_pods( @@ -39,7 +41,8 @@ def delete(ctx, backend="k8s", num_vms=2, num_cores_per_vm=8, ctrs_per_vm=1): if backend == "k8s": delete_native_mpi( - "polybench", FAABRIC_EXP_IMAGE_NAME, num_ctrs, num_cores_per_ctr + "polybench", FAABRIC_EXP_IMAGE_NAME, num_ctrs, + # num_cores_per_ctr, ) else: raise RuntimeError("Compose backend not implemented!") diff --git a/tasks/util/env.py b/tasks/util/env.py index 81eb65c..973da5d 100644 --- a/tasks/util/env.py +++ b/tasks/util/env.py @@ -1,17 +1,21 @@ from os.path import dirname, realpath, expanduser, join, exists from shutil import rmtree -from os import makedirs +from os import getenv, makedirs from subprocess import run HOME_DIR = expanduser("~") PROJ_ROOT = dirname(dirname(dirname(realpath(__file__)))) +BIN_DIR = join(PROJ_ROOT, "bin") +GLOBAL_BIN_DIR = "/usr/local/bin" CONFIG_DIR = join(PROJ_ROOT, "config") FAASM_ROOT = join(HOME_DIR, "faasm") SYSTEM_NAME = "Granny" +K9S_VERSION = "0.32.2" + AZURE_RESOURCE_GROUP = "faasm" ACR_NAME = "faasm.azurecr.io" -AKS_CLUSTER_NAME = "faasm-cluster" # TODO: named based on $USER ? +AKS_CLUSTER_NAME = getenv('USER') + "-faasm-cluster" AKS_VM_SIZE = "Standard_DS5_v2" AKS_NODE_COUNT = 4 AKS_REGION = "eastus" From b2eb744429b650bd345079d525f197bde7308dca Mon Sep 17 00:00:00 2001 From: lg Date: Tue, 4 Feb 2025 16:50:58 +0000 Subject: [PATCH 5/9] include plots --- .gitignore | 4 ++-- plots/.gitignore | 1 + plots/elastic/elastic_speedup.png | Bin 0 -> 18168 bytes plots/kernels-mpi/mpi_kernels_slowdown.png | Bin 0 -> 24076 bytes plots/kernels-omp/openmp_kernels_slowdown.png | Bin 0 -> 20905 bytes 5 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 plots/.gitignore create mode 100644 plots/elastic/elastic_speedup.png create mode 100644 plots/kernels-mpi/mpi_kernels_slowdown.png create mode 100644 plots/kernels-omp/openmp_kernels_slowdown.png diff --git a/.gitignore b/.gitignore index 1c488a4..1a0a13e 100644 --- a/.gitignore +++ b/.gitignore @@ -13,8 +13,8 @@ venv/ *.egg-info/ # Plots and results (uncomment once results are stable, and publicly available) -plots/ -results/ +#plots/ +#results/ # Kubernetes .kube/ diff --git a/plots/.gitignore b/plots/.gitignore new file mode 100644 index 0000000..630315c --- /dev/null +++ b/plots/.gitignore @@ -0,0 +1 @@ +0.27.0/* diff --git a/plots/elastic/elastic_speedup.png b/plots/elastic/elastic_speedup.png new file mode 100644 index 0000000000000000000000000000000000000000..03a86baaa8f18995d0c14f14ffd1a7ae340fdcbf GIT binary patch literal 18168 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 g5IFIT=2ys18CsghX4Qo literal 0 HcmV?d00001 diff --git a/plots/kernels-mpi/mpi_kernels_slowdown.png b/plots/kernels-mpi/mpi_kernels_slowdown.png new file mode 100644 index 0000000000000000000000000000000000000000..6f172a8c3fb4fa48065be586426c8cccaaf80f7f GIT binary patch literal 24076 zcmc$`byQaE7cGh{VxWSGln6*jgG!?aA}ygvtCR|&lr$KifCv&&5=xh}bf`!O2-2cR zhlF(Jo!j5z23*>4VFfRwN_`ZW8}(Nt8&qLqei! zCo6S9-7fs^Z+p9a?bIKqC%;8re&r!0c|@Ce_aRd$X1NO0uw>N_L0k(Fsvq3iw6wK9 zsFPl8y{jU<9?Pzh97wMHMfJ-ed5_x*_gq|K3v@K^GoAajY9F~OTEK5&+{JIjzgS{Y zAFjgY6@9{uTynQc{RpKkiR5kuH*)63Ow#}Ua#@v$_@^!ZU;hl8iM`!bY%g%Xi-wGh z%*@PeYIc@UR8+KKFxULI*NYcqr%s*9FDS?~X`rK(I*p(5@K04|k^c1QllL*+CuJKe zFFt-eud1s0=SL=^g@uI>*X(eVYg2+U{j38_SmMSd0|k<^ z=Fb0EU7R#9Fu3^O0nfc(x!-aXCc8>JU%W7APtzT}^Iq#iv~0ksRILwk8t?YtOVMs@ zt(?*gUY?#?KGxK*SMkaC(7e0&eE;!gCue6N%Yn;&m8bsQ+PAm)+gLe9Mn=48MUHTD zb00rz7Gh8!Vmooe)HH?nTU%QY{%)u(&c@~$8_V?auc*_~EB33&Z&j1_u-FlIM?osB zvb5Oknwgg;qs+aS`<5?&;w2sw_iy><`#VY9$zuE2sl`R^78~NmB=gKW^Dn$Se#Vkh z?UaACAEQi`X*<_`I?)gl_mrzCmA{K@&&2;OaSXoOnrx))GTM^lO)sIhE`I9NP8k^) z;=2`Ilu;7@`RULqU;6%@o=5KP(ve2;Hmb3#dtxrVytTUUcl(YVD%r;0M1!a2<_tGC z*70=L#5j3)$d#2F%xbBrsSV7`!i^koEoQbu2n#vSHEVmeR@p|6gN#3l?fE4(*Z7Yd zIWp>U;Whi!&n+z!kG5>vd8Nd`X6W0ST^~bu4Wk&%KRwULp=j0@Xjy@^0NE$bzhhy{v{ zj<(JfGc`4(p`|6WiAYLH!e>LSy>}~p=aOsGq}p^jpZ? z^0n6#?7DE_LXK&>&!0cH*)`G>&YveSsPf^QDav7HV}E?|ii=yWio>-|7@d$xesQF2B9-)Nbz2L6L{!b{ijaz8Bh#ULKS7Ns87#J$Li&u-3pYd5^vQKMP&l9rjX6GjMY5+qO+e zks>}Zk@e7_KB`Xh!w-X`H#A)D2v}5 zsP+pNw(%0S8O^v=v8TACr&|r#lbQ&?q1c)&_I$y0N}8U%bBX zYrG@-xv%(&2fs;u#{F(_8XB5o5-y^y>+?sEV)F|N`R;d#3S0kqs~44>%|BVPNEghl zZ#>ra{<@adOrs3_beH4gmRI57bxYIz%OeR<9zH&mNPWndd^V%%Ct?Byg7sa#)<=kt z?%DIXzTU^3>}XTAiSqo}`f#CgWCKCVf!)T&#>E>eV;q`U+pVmuPQ(;A&kTGG7qQ)c z@#4kf0=GY6yIWXVZtX#~uk7xQnjLO1xPQOlGDoSB_%@H6L*)8cPiQHME?XZxtLZhYE`+(cqG z)w6|B#%G}C(^DxK8MUH^_r%wxE@Df>987uhhI(aX#q3AM7Dh%!@r@;eE{8GBOFlGT zeI+(L-oNLJa@`P$5V7U*`Az!BR8d}3M{Y=H9l7iaZWC|Ez}Wa%QIW{R!~}5(yC%P7 zJnhob(u4lWeWw&cK9)MKes6B>uQ;l2xI8l`C?c{=St|s0S>9LiLRLv>=-at&!;UPY zQSG4se}Am<&Nt`o4|SC|3JMDH;I*J$`VY>8rUkB3=u#x@qdt4%#*L5Ibk|Frgye%b zZvOrGp(AL0aoRwgos#nOo&DLRPRo{;ULLO?itOB6EOM}@-PHM`y}{bJ*{bH|0NZZo z;Ogqj*ohVo9+2Fq31q8_l8DO4;KA#VGBe}QEwsLgViGQD@2?ag-1uJm9FmGaTY=s5 zt*|qumAEdIxRYS{vwgq=G>;m@SG}=1Gvx;)$m!_n^SWJ9#O;m4#GQrH%Ql4Hy?ZzJ z_gC<_Zl?hJ07+k8-_-nkMN^Z1+2+QZ_u6?gzwVduqEMfR*$j({qVMYJ3Kw?{!<(8y ztR^WBxUNm_+O~7=jk*xta0%DQ))bAyr!j^@C;wGP zw#ngR$EuYj*1t5x$!nH4oC)UAy@iScpt2?7-mkNFTM|EE54A?USD2oj=D42m=!0py zgIBAVzEb>6AnDxb>I{ShxgmJ zCmiPfe5woOA8AcF8X;_>N?+UdUK{WKNqRarD)QQN6+Ml((=lu@qzEZX%PfbIUHfTz zYF?kF5q$6nQ9w>ke*XOVM-Ce(*-H~elS|kkNIVAfqphR#LKV_lUe>HdJ`cU35iaMk z1Col>dwY65VqH{{)LT+Ce2E-lJ)+v>yr}!qQr6ScN!XDtea?>3ij3@~eTl>TXP~n^ zlTUv{px~%Q1d>>fG`aVdKi@X>X%{{5qx)$D&*LXNJUrf-|1QkA)4cPwT%37{ z{ZFjlCy~kGn667VZk!S<2ATrP$|Tg{6>j!?d`!}keD#Hp)ew*UjG=LT`0|=ajyFQU&tbFW zy>>8n>C%(+)kOkrez@BT5V!5wvuD5vP0`Y1C;Dfj)6;!{xPofwfk&K{2ZKi&)KCJ) z+S6H1p4{r_=ty!(DZCo{RI|)Q%xbtk&S8F3AzVSe*Ad!+OXD#yCYdYJJ@x*KgM0ZRHc3NP}GR%-+_TIz&$Nb1(WCI zF59y=bB*A0alGPg2?;DOj&iphJAay)**$a8S4!oht4f>xQ0S)9D_&y)a<*`8ms~_P zh@Tcedo~CFFVk_+eEusx0|SG+JQm<(i))HHJFZ??;<)(8JAMw8B@`>vn54#{XFo_e z@5vvKkYEzDhzh^;1hxcLDdq4<5@2%xHqrwJ5&-}A9v9fHudlD?vTTH^c0OIN1Q>JM z2?2q?^5+LkbN0r?#rcJVTy}CQ-WwVAG{KkcQA7mo;>2%*FCGUuv~#`jG{o-}T8{va z|DIV>F)=iZ&8$b{zX}SfB;ziAtHQ;`CM)*Y6{r)haPT?3OAq!T6AMc~U|`^2h**i9 zv$Hd5P_%`4=7$eEuDG76IE*-qcV1mUPU#&RlgCRK>BwdY5}LcSZ{NPbnZerYqO;r1 zAzn{wq$PHryZxQSd7Z_U?pH^L#ZVm;337^iX{n3n7(0WkpO2w+vEtk5Rb8IEJXPhq zq#K?VaeG2K)Fo9;^t#kp`BrQC17PwQ{b4o#U0hLlPdh8;kf;Cf$d_$=E(N=G?wmmp zS4~i&RZvvKO(b067kXuM+xfMe^opy2y1kv+BBcbL0P>}+&34Kno3QrK~5uuh&md&Je%6;bGCBy{+2faHsJsb5DzgarkO?0&y& zo!FUJev`&%>Fv9A4X=3YP*YQTNw1QbnfYgI%&PAT=}T_q^UhR8_yC7~X*l3x@6gaC z_dS%yL>`)zin}T+*LIpa(Dlc^mOLt9Sjb(SdHgl76GnWkLa6*hJoqZ z*QR>Q5pf>vdXD?51sU{;9x9Igy_$O64|}}1$o9U&!niD=)oy8u;o3DSi9jZ%)w4QTR#jQ~ z%!~5$P)22EK|z6EWTeuA2N{)$)D?=tS}%qV9X$96kPy3WxM;Gpf3`uw1Q&^ojs2dk zFHs*Q(GcAb?2jF@UbL9+x~LbVZwF9eG+ZB{lmFoHLB>nuw6xyPsuuy&z%kdw)HkO@v_w^MN6pjf#IDuC;2z2Fr{EQd!oPnunEf7JdunjvZ zHvtaEf93hg2XiH@Qhp2JeTtphH#yl*U^PrsMill@aaKu@EnBuYtDCLY{ssoZ97sr^_h%7E@+4e|TL^ z6e|mVUwrs*CcSipoj^Dm>3YnptR4t_D@2IXy=L@PkGJjOvzxl{aQw$Ry{ZEeYgfK} z_!f~v@%qNi#ztlr5rCo-3=EHtaB96xPj3Khv;*GHcUdo7iCxgD(hvw*Hm+LCnR94z zHAJrgxbD`Rpp2J5`*5Pu(}tAJ>pV57U*QP#)mMK}wfyjFs%0+DhYlUOjz4k-gE%xl z(?_L^h$E+7P^&|ihp}^4sS&4xIxR(>T0%8?U82( z=zWlbyPX#!3eSA3tMlGmpLF%6;(vy=z_impN@(-5I~ic|<6Q^nZkU)Qpa*B7?{ z6dHlzsf!fT{>}TVqC)z2W|5%OrLm!G6^dU;It6^_BTUworeovckW4DM%hsYNb_qBx zn02{sI^S(iQ&d$wB**o>2i1AF-&ex;vm0q=p$!?jYt(>>)9Hrc=fqe3Fm5al(}Nk} z<>&7&S?nVCr;v~k$#e}BvLday;khSfF}EtbXhiK^A!$u7O&f%VhhHzY;|08pM~MU5 z(wM5rf6Kt2HE)0(pE@AE^oUN(VG1Fj3ex0f-u?8ewT-CG%TwhC2#kDyPV{4AqaX41 z#+JweR~cDT%5qI1rGDDJ4 zuvY1_m~A)n(#RcGZ}x6ylH)A!;&x*t9hl%J7_i+;|0pLnlK;0q2ZGiPoj!R|a;NR- z!J1m$I#WX{1~*ntkU5V*ggq{LzROeCsqVRF5?im9_|U}xj*};!pqQcZCuZLZ3kgA8 z;;Oo`n_%Ih&^*kNe7P+~jcje^vJbR`Y_3qjs zX=!O(!2^xk(9n={X~~Zt*OekgmvyRmgoLOV8Dk`U6u=7|7*SJy@}EkRTdluCvDjs8 zTBftJljqDCH2dt51;=ZaRMv$Ez8)AboX^^|xNF+Doi69W zJxLVbKR^l^X*wzmWe@)z$7@62(A~d(AIWVAb*{i=T^PBq9NiIs_xHCKwk?cz#OO_+ z=dhmWq(U!XcJJOucUhSd_f4_d&dzW|+R^2d6Q04oz6a1U8IJ$RysoX?KQ{Jec;f{~ z(~pm~guHoUfPIEm^GsW4V4#~^+%4q6FBKI@`maxG7^7Rj-~9puzhEm94a&7^*VGfQ zJO-s^G51Gh-oa&K*#xXF4=?Y#YwxwN%LBr~w5GP<1uqkE@Ctn-n&@(*3Q{sMM&vN; zheZ1J4A)H;R5;BKcPXRNu2+`+c3i&I$TvSjIz3%1Hm;jH(eVl8h-iyHwCgd7iRl`M z5SSfR$Iaaxu&Ne`;W8LBTsK_E>e&vmBZ-Hfpsq|e$#bLB)=&3WbrjihBk#r`cMAXF zj{Ao8i-(V|4@Df^tVF~5xjRivPo6$qULKC>$h%Ju&dkltjf9G{vBPSZB;S7a)XkeW zM>SAf^X_*OJ(+>)rXn&n(*F@~!At;|XmnG2*Xdo?KB31t#&5iLxFN~}E4F?6_NlKd zQGZ-^kuua!7C4>S!}LF)`{RIs!zAYB=A+A(E?r6mH;Rm8V1BTwUyBD94M;8agUZ%L*U-|M*cc~a2cWGs%Dbqj(5Xlpu z+@UlyG_=quz*rH~J>yKoN@5r!Q-+-D9pR|X5)%)ira9!se7wA0HTFW$A@`^7+^UwOZf9@bJ2+T@68gZ>lA!$0SEjGK zB|M|pEp|{6m^vfHTzRhicA8%4=PLQ3{>GN4KYktX^zo@*d`Js+P}rIka)=T11t*|J zz$OBEx~z<_ghxd1^1SlR&7Jw_ipH|?`}bD>FUgY+UikP7VeRZ39aCyGuV(gb{B|5& zY){i+X4v>@@(y5b{O5-k&kxWW|I!-h?Y&@UmtVViV|0}wB$o8kpK)K_1t}?<4N2cEgv~x zGyByvDWlW!rJKh5S5s4$hOGtlUDs_&bHO8D7q*?KL+f_l+FAgN2qMMs>S*P}a`wbC1l=S5PkWM0zjby8i|XG3*PMk5fKs82hWlcvB=0sW{Ci4DvR#o<#5)$RAny`p(sH=O+a{jJG0zaBxo>~iTlVEj%(w3k2 zN`%WUE<{*ZTK8o)h{vGx*qfi@A;xjp_WQCdd+8V8XxshnqoZakuTVA1)YU zbt5lOVQbJ^#vBF*m^e(L$jZJ=GgpTZq6&U@}0cPpdT0W@qxUHF^Vedx%MX9Xp#{1N6+ zm*tfh78Wk*=;~(A(X)T6>Gx;@K|Z)(N54fYji8oiE*VeIYgwcP7Y9!=3Gs~RZeqv#?eC`h5g z6!$zPCdTR0Ys-KCXx-SsDV(4jRj*M{$7>=rLP<_eVyL6^Ph=vCV3t-46ZraY?T{T` znx|acNytzd45S2FN*v)}D|DDoPCLs?V5fIy@Y$aWr)zw{7-rpWJgF2ec)`$+3F1vv zLj!l!%zq>xuG%>iV6ZIL{!9-(-^$8L3W2~H8b?) zz9op=VLcOM?$-V{0~&UAf)K_=HC&$W0pd&|jg3$63kvtQy-8ff&~MozahNt%!-P{B z&BO4U`=#&hcb5V(6TKTDCM405sgMI5*S9}%ZOF>Zd}ldWv!l!WrktEI^S~!cE$U+` z(Ad21$jTbsnj5U!BG|0fd_JxwSHankk@K>_rffN7gIezYx3_XVI9;_ch?vKiFB4R7$e5<-6nqACyNoxO zrE3gb9`$03sWdi+0@VDKBz4VaY}_v)0JNv;CtT7Ikp0?`x97_jX)CNDpW1(aCZ}1G zkdBd8+VjT94%3Rl$GQIOT5eR`7 zgyp?JpoSX#Oi3?IPWd)W@EJckItB&1fBZNG29@>_;WqH-yOJu~IP3NDCBcJ@E@GPv z;)B;UHGBX3sU~O`fGg^A=G$*T?`TQY3;=L`6%tYnvS4|Au^TW=|6SET!M;g4FVC4W z3-@8Vw=%>&)D&zkU>7+Rm8_JMn}Z7q2Qn+c)rEwHHYTbtg5k-pQIvJ`L_|Ng(q+S9U1Wip$hSZxK`@*%qQTT2(cM?E^+LETx>>02F_C{@?}s7%3=x+g(O}%F~Z{glg+Bir=Nq zZyr4&*}8Qr(OlxC_oL3Xr0eSk-weFYHtqQ~wqMllaQwqG%^?=4XBPK#CD0E=im-Wk zc${EoXK&|gVn^DE7H!m2ZHbdVO3?GD*P1!E59$^@Y_%JBZugmxCacEjuV^3pr!dJ6{TS5YGbJuWEkuho3$z)`5H7qN7#2mjkPo`2p?@h?LL8VW0W zO>~vWBZI+(QT6d73Aovp!MFm0l*RYuzxq#i?!&!3K^udX=eb;5lg)1Yn;W_2A5k{& z$K(Xlg8bV!AMgHZIu!9baCunP@9EQRUeSLXvL&mR6!3A&xY^j-2v3DjK6h|S{o~`Q zW8Yp_DpZ=lK;cIn!6FSp`;@qNB!U*oU(jHv$pL!t7Msh_;eP)vYM5|c%L^Ar_jvq$ zKs4Gzkp2zefeLIV>EJ*)KD&vQL?@VD@WI>MH$=d?v07@eNKY2e?uUB@no-%uycYce zOLvr2tHBz|AZ~phU=>(uPW$-y2;BaDer(>eiJOCiqkY*@CIs6qI^ITgZY;el3mklL zaq*s6-f6nx=nlPf)(F+U z!xv<$?59pC{ME_k3?Qef{9v;_;KTFI3PF%xm`@({s)}cSe7u|PtD7`lUQF?l8aYZ{ zLv^9$z_h4M+mQ6N?oWa7H0vrBs~8yh zjarOKwF-CL+C-zCDf(9_o^Cn@QaHmIQZE&s&(uYE#yA}BcZibKG@!`t&BJKHKq zdlWg&QnwVvN$S!i)of$Mmm@67k+C2Vem-M#BbTlxbp5dze(#I2cSAkByiPJOM1J~v z_NGawv#F(_^|7)2mrb+mT(BkpgAE@(5o#s@r=VX(t0rAmRvt#zNw8=j3q{)trI&-+ zJw?;&JK>3P{QAAViBe`P`ko?}?AIIiS39fDkHy}`^W!=oCi!lC*$qbKvb=nZ%lZoF zt?4%H`_qt%#E9#>?mqR9L5^S7>1JTN{4?e=R2<53pW{>!R#g1P-_vwOM8(8-d3hTh zo}%Ot2wx#eJOX0eA!_OuU^bwkw>s!b8rCQuUJdmS8y6MVt@87XzS3EC>c!KvGM<`W z%;hs-dxMymdsUO#WE){qx}If73M&d>`vNfm-4GQP#vp<2F$-(!FP}bbd3)Y~meenz zGwcUr%;1cs=9NP(ibtONPr0km1?CxMFf~=gHHF`fpxCiQDE7f~tKpRG60cgQT znV1-)gc!d*CU=h!)$^(M#3Mqo+P!DbNkPF7)N?(jX=yy-(w`XL+qghvZ8{ouaI#+F z&MS!tHj`Zu(9sELSN7kAruExD6o%k^wx3oGw-U;8b1S-+s?JWGltDFB)!VQ}1&x4C zWaPcGTS*7m08>8oM`XqYs@y`2o zG#`1Pf=X;GJtY+Nn$ziT6B1Evpy!b z?@GkxnkF?1Yu?`;CbYJv__$)($Y8(5Tk^OI_9f+6OsrRA#*jqF;YPV~g&eq(Fnh?$ z%VY5>M1#c~7dYtXs3I7#bXyG#i$E5m54xtSWZrx)&LVbq$Ww!O}aa8ziTD#Z?xN*+%dE5kLV$6rUymOGcIi@bri#dFO zzhg_HTEc$tR$Nns|1#{Jr;)j2@Eb}-kh6I`iDq5aTR>WdTaA)nesj%a(F11Y<_^8q z(CfuN{Cq|jxpu4E#!DnQYu@RBdx4@90{sOLq7>*#C%C|(en$U zk8C4EsO62-$uozd6>!VMtsx7kAmJ!>Ciqfc_-nyD(camX{EXp!LwM0zAv8R-DOeeOzzf!MWLg2ntJRIYsOGRrY53M zM`J{D2#-aI$I?Ud??We60|eZWX|RhVEiH{k*QplY@5 zX%IhRq+IGBjb47((H+fwoke6^95X7>KrMIK03ZN~I$p!a1|g8MF|bMOg&!1r>44@2 z7%akLiNKjbC!2+3LfcF`K0Xd%g!9VY(3!#jRt}Ewf;MhEh)4A6^w>mHvt=b67!qeV zVpNkdGBdxnuUIx0Sec;khfmI=Tzeml7MDY>_*ixRxb2_s49K;~&Z-ngcde|PulyLO z`1`k~vI5h-%MQsQ9sI6um=bP<2X1{7{lt**;=EHppn4ri^T2im|2~1U35j#x^Of1e z=`4>c>cnm3&!(vzWoEju^AB^p3Ol4PaPu-ADRFc2E;LTQ()+cWl=M|( zr1Rbe9t9<7?l*S)V`~C2fl_l#QBFRA1KYn{udCx5-Tf+Xds5PTlcQ}`)Z-ZLQe5{Aj|5x+RU?jTgx}agOie|Rs~s< zgB9g#XQ*7Y!Zy?lD&pe?OI`Qv<8RwX6_x4c#$i(<+BV|wEOu;DA9pcvB7UQx+$q*DO%}}lypo&gg38nWX#0r)Qs9SW$ym$g{X1y{!#L) z4c-;nAFbS0)?S5$shGT$v(k@^j}8tiU*3`( zt8m843U!%@qe;%Oa>^GaI88h14A!kXOd1Yq8mdjwuq~5QP{g|I*uI?=I~Q;+G6G`d_h^bRxGg(tVLqV;b0PzO&*A^_SYgP+I%frNCNuW;*DG!&&6m*4po z7q%;Wxl(8r^43L+hqo?sTrI+gsLoNHHE)|3J2{d?V zI;3-iqWum_V0;Q?+{j&N(z!pOrkc!W7i9Nt+cl*1@ZzRp&FCV9(Y&KqR++=|&i0~g zU&~u+2X!eeDTVdP8esQR$?vrcX4xs68-5_JpfCl==?e$E?~jI|GI zEz~3)QTCZ$6J01@nOANrGS!$cDqE7&6>yp#)u~PU`}-Q9&ymResC-$FZaY-R!W%C3 z#hR==!R(`QUk>{;^fVO{MUVRfiXUXfkJCZ~OP~TE2&CrbPQ%M`;?PD*_BU-`&QS z9&alMD&aNu{_I-i@TNOcr?$&wvV>*qTR+V~{=0!&S%Dhm^k!OB2mbzjzk&SOK`6xk z1NP9KJ9iFcs~i=1Hp*}02N<4=4#R4Jqzjkoag^Gja5nC&fVJ>4fACU8g6$^2WR^yN6!!H&ii_oI3} z$acnHr$_G)IUGLFFI810Zz!0Vnf>O}n|ttMuqd7wTDWJk3Acn&Z)^O%=S8*&o*zCK ztIfJ9I%%ir+^qie)K1AUz)OiLcz;xh)53`*0h6{JeS9P2@%t48`mU%uNOhAkjt9ge z2DctK8thFYxEkR%Hpp*NY+BU(r9${utx3XX`kwiErTz56QURxwE25>F?JnC10?Sp@ zmeIE@T+J$Rdbpa-Q=dxq<<3vi`S&9YdgAi=7G7j8eu{cBzloo&6IPsX+5MbdxzBlJ zro(fJ=O8!_wrTQ#^?32UGyenLflbCm8;{KE-N#dGp#W? zq226byjQB;*f!e@J>2-w^IYcXCYPp!)iOtICfAK-yXtP&*;_A;9FLk#h#MK3?lGo# zZerf|CDXvJB|U1^!K%P%VLY>bVy5Heu7vCP*@|t>34?>#udId%3Y7(h7T=oJ*_;nY zKW)?c+xaz$MX9HEx_fGm^n+y%CMLI|Z_a+3p=yXtoXcNf^;XUm>lTvice)lQmmA!m zBrV^i&3dBMjqHkBLB3p1KQ{ko58P2l*lJA1FDvChGSaiEbg%)C1? z(-ojC3#+=ZA@XaMO0>Y~$U(}_Pwpu$izLi$yKU<;HCxV@tzFBH%Zu4PYOjxQDtXAs z#l;m%ee8BPWRIu|l>O#2NMF zP3>TI6)CBDves)5lRB$n7q?7^TcI$6sk((0;dnEA1#fIjM2(<^7O#w^K&pbSp7z(6 zOd5=DzT;wAWe(7XYUZs9GZ@f7W_iENo;y~(WU?_yFZ{bD(5`yv?J?18`OQ_H*pacr z2bhji-7qt|{P57eeIC0Gc`K+;X;kNWhjnCYbj<2sqfPgGY%IBbbaCVqRc7p)u)C4@ zkwN9+wMt$p3-llAge5pTuFR_NkY0)xs=8&ix3Y3nIPO@8|J@Mh;v|P>%A@zf)_JRA zj~yS|id-4`H^t?DhIG&0)jXTt zkpFCJB%?sRNk?nP$4Ayrox$~YV zn6yM8=BzrO74%KCO*zXOK`PW>ZHLb zR~I1?jJCM9zyBgEP$OL>BA{g2&$?}$g_nvjo-}XWwhg|j7ENeo3{rPySlLJ^+$$$- zKXr<)zO(v|_8+M#v9+vCRs~+*e3&8$I0m7V#CojlCGghJPgTN;37q%|kg=n{iUoAu z4M21dEsr$xonKGFB7|SVvy^Gke~AQrVa-u} zr%$lSQiH2Ankav-Xpgz|Oxy;-j7UX-_| zF74X2Yp6a#`|ZBAM3twodGR|fJ=j=Z)c@z-g9@+bFv1MZ=MR)cSg&I+AYh+12GAx`312p=BI-5CJM!*ns1cdOW;t4!2Lr}HeB z6RVb2aAI$B8|V|=^es5SXwd%X%le_EEto%iVE69ohoPWZj|dtwNHuzaQQ_r12)J&xO5asv z>pL|yrPF>eYR+TM+FjA=XRlT>-!HzK8Zjg1*3T#1$4^txf#N_kSfX=4e?@3a-@?w6 z<3>PAfZ^h4j<@PogK|sA&mgq9zt2c|WK|HBh>p%_N^nS%Hvf9h3gO8olDjW#@sGyX z#O_D1*KTaA-iIv!6Anan_%kvhrV)_$9}bc2O4P|mge43HQF3_IKqO{nWW2=^xKq7h zJz>B94LxGR2|UmH+EJ5EYEz1KXCR7AertTx>9M|pjJ zvkgrs`KvkB{pt?(U6f$RD=v)15>^+&Ck|T@FRaC&MQ%3%82jX4;f4yGpzsmXTbQ1i z8}FDcn9w^cl$~vT^?>JQYW3}9W-c!oIj57XBZ3FI+>&$`WLIPO9X&cVH~b$KjB`p& zHw&|6<>aXQUfTCydB%tsiU76!1+w1dS_8qquU?V2rRz5!`iQm{gedVdIky|5Z=6B< zE)1f1)a19=X@;yd=jEf7KNKWAhBe*>Mc0YcKY8+mpv=+3$79<-WgaeY3OJ=m3^TyZ zV2nrt&Hp`Kky_8LcgM~HbP8a5li=Zc%nqV1PDRgv|H1}A#fs9u4OSgY-(zGB5MF3voCUH&sG!A3qR)fn{MM%@J3vt1DbYi3`QGyQ8`2!= zDA_XDD>tEG=Zq!!}ti9r$4Q^$?az8DbkTS^Rx8^VnU`-drY7`ZeT!SozG+IRR62wCI1azA$1#|M$0O!;gV_>%QFq6Zo# z;e3Rx(LXYBzoBR};qW0G3-(=+W$@`^z3MP=Wmzn0Y+z6hSL*wFw(9`&3&?_6W)qFRU5F z5DTa&E8Pt=;P&R_7}bGY@Gf;2>(0UX!u*stX1cb);ZUvRdklvqsV%8w0|jui66!k=Aq>NN_h(mfGIz zOW$r`7%dP`G$AD$W1~tzPw)Hw{k@=(vuDqKsTy9t?TNtvclbrXbjm||K0~(;Oe`#8 z(laa3f!trSSn`f!W&F8KE5lf`r(jGekOFr^2>0Pa0a(6dnHVL2*zRt63`&XyM}f(M z&T0&Ajg}alRG^NKvr0{HEO`ZEx_rB(Z7g{Qwu2Tzw6wGoJmFJ#)wdx*VCP0hI2H&iXj0Oh$lBGF6(Z>DSyM43n6(ru6Ps}QzqDK@tv#Wb)OP*$i#9yX88P|+ z1Quo-?GW~4IiDb1@xjypr>-v;Ele>SpXHBALYj!ap<}Am*Q@F>;X}c!e`iEJDn0f# z_SmxCO+8sfW4<#$-5j$Rf{Q#5NJ&)C5%ngK*5T7^Gqba`?KLw2EuxNOr9^ggJL@%S z{KSb_+P|8>_tE*3^WV1b7*(4qhPi`KH?nDqEkHe09P}rTyJk;&Rma0*aKS$K=I)wj z(WRj$y8p4u#1vL~@r;+lPb^_5m>Wd&((>{&1QB9Vb+6*arYBZ$pbm1ZTK&g21KLB>+kQ6QSu^Y)Lt=MJSK3P9Q+W6 zR?cqBXn+BEJ?4PiDvc>g412hyeRL9Gi3UW&-iMN?n{nHn^|@sc(<`9{ zg6KE(<(MUi@laL?L)NX+#WN8U(lRopqO%;JoH1FK(hdGF92)3AK_pQHfI0Y`3)dVd zPo87r^&_!=$O=VBMG#->`1#WkP=gQ$pkp&JZAadjUvu4DKUaI+yF*q%!4Rvo2HPNP zPOPHgUNatm$AX<4Vzkg2Ik;kC4L+lN`<+XXon3Hw$y+$c*m*LwyFXq^)#3Tcnl^MKFR;i$jz@oS!jeE zTD08?wCxjV_J6dh8-5NlCPDXseC9cKP6opp2E^X5GV41^gjetBWWR{o)9-iPPgPG+ z&24_4nmSYBgD!8Dm>xTL@B#*%DvMEY?@;>_L~Rw1}-t}G)mSe`$&w+CbP z0>3Ro_{K3tZU6T}yEUy3@#)e3emWo;+*}sMj4pW}d+hGM1IlXx0-<VP&^^JCY3J-9v7uJ%dF1DJ5aF1p&W_luf==+Ct1@iAvRBp*G#}8M)4^ws?Nd1 z55;@;N3i}FULss)1M}_r!(b7cYy^qRkw5YYhz3ppRC9;Bj07eHf}#m#ApT9#P(H!g zYwzB@Fm@#t#zA$(lf-_vml;EKelXg?rhESy@&6!CPpSz3KoUeH@*U9yVovURNH=(H z-RJ*K26(p``v;?k+i%SMX&k-7{(6tJ3XB9$phkq5h@aa1n?)J|e(U@xLMdmMiJcXf zR#H+bDBS~(G$m@5!L3`8;MaxV$?`GUwskAMeViK;BTuf$5cgo@R<}Ft1W(1>T6GLxOiewQcYG~( z_0e%s2B{4|D{@N8*Zpf4CZxT@=vM7n?;nkCLUd=xbp7s+kmM6#7vH&)iUIQnH*ekg zjGU08HR;bRPb5ow*aRMX8=9hX2Zv9IoRKyCtDY?-8&a0#DW!Yjfc0Oqa3cio4ye&!dSZ~Zuf<*+ra%(b~#cZI;S za9nWd(lUJV@8542O-gJPj){(jR9N2DcFmv=lc`6!bO5xWV`iHF7AB@Q6%_VD ztzZNFKLnE%Y89jWvi2X}q64z35j3-6l@c z-W=BpuJ=Ewt*uSWx9Ap~C4o1oHH7}ik$4*kdWbT>>;**2J%`R@$Wa%yD!-`63Uje$ z!~Z$1AeFdJ2EM?&BYY}_BjZ79u&>U-ZEGl^tU>|8Nd_Ls4_XP>tYBx1fDT9RV5y-a z=*OI4J$L8M9r%TJ!mRf`mvF9lWJwd|rFg~i^75yEa(otjQUtOj!R;;2H7jExgYZIW zrQ4!`BKjxf3Ct~#;iH#ybi!B6a{x~M=Ya^wkQmmZgg=&$3s7P_U=TseJ4vBu^v_N* z3Oh+Mo*F}U#3T{4kCdvNsuVk*O5ibM0LgRo?!zKMn4S2I>v~WShzWZD=wuOn87ZmT z-p&-5rNIzREy20v^+xW%ZSCy;irjZDnhJQv9d$@)!LSl9ATO6T*UyT(!ORUgtKh6m296AY? z;%j-ol+n$?+j-=s)W1{|X5FNkgK6S;r3g8AO=qsUVCNUFP81Qo01HEWMyl7}uUMWt zf=Svd8Ur)j1FN4>3Xgpu%rC5FeEzm0@d2^7;YZQpo*j=7A#UGa>Cz0>Z)<;weKdks zj=uS4jN4B2waB`u!=vrruQG@J-;OY$XzqDQ{0pn2<#F@3IeRa{c}_e|qr^{)C3>ysu_cIzDC=n1#;T3%9Y{@OAn zO--K4c#N;iFtbmq-a5HO&Uu$OvKR9kc!R&lzjWRH=szO@9YKVD10FzOZ&-(=G%p(=FYU)=YQ{U`~P2mlI*OYee_)qhKAAIs8OL{{QgjTW==m)7Mfzc63l3K71I0>{oyWOU^QkSn25KV5k5M z+e=8ue^^zC>jbLDiL0F1&n=`Fs35A!y|?SS!h(ypyhb==yvSiZ@GW=6cL zP`K@ixJ3Ue+Y%d_)OQa?b(_Td<7Jd9jiJ~-xp8Y=z&sty0g!*aq~iCiVc zdwO10<^PcS)sXt%CM*t|Dgsu{#tIX&YQ*^z#83x#hTHH-SzNvFFG9~JDSMINaEj3W z!7L16aWr??_3y)fFHia;Pf<}*^P@ZA2%fDGPReU3NA62QH!-^oQ{6HB@Bv6lVDYSrj$N2rg{p%a5gwY+8>pnDPfL!2M zzlWr=?m-d!SYN*%6T~p+eMGhLV)-E%s9gd(%~H?P0}rgMVld_K9-dd2zZ8Brei<3a;(7dGqN9TSJ03&p6|{1Gn184Q_kq()2;!9(euXDLGbe{* z;=5N1_^;~)mdyH2(>w5c#Q708B4q~k`Kaw}cXosYvQ;+X)@+y?$59X`V*vgTgH-J5 ziI0HhJv}{zeR3WQUYlH6vV+4j1gB&`KOyF0fpcN_(A(>GB(m7YCLW~bEC`%I)11Mk z6X_0w9T2z^ZZ}DoaNsXD#?%$`jz5A;Gz05yyedtdMYhUY0(*LT`u4|FuVds_4tw}D ze8d&MerdxkreN`0Jyv|FXImVhYSBKcxB2_?DroAA${bh_SkY8*#(Q|ty@km^cU>G4 zS;Rmt;XI$uf!~=8Tc!r*hG^_Pc;uzYSVRQq8@5N5>nk?Dw_p8YnLLX=_BBilr-|8W zOic#jRgQ}0MhEI5aZkJ_N{-#unq8PbbVqAQl983gK6Kfu3sYWyettNORLeSX#hT!e z38yuV-q;2(*!lbS@@PuB7s9F?7HDE8W58z1ZcN$3sEmoYf)K{$2)sJW;d-idWU*dza%97M0f_*j&}ZvdoYf(}Qb zd5O?O$SN!E>cPy75!3||0>h$K1R&UZ|Nhkt@7;nEvXZ@Ng#5uUSoD0{fC{^63^%b;wesF`~w63>OQT?%Ti4<2T+_CL5omU@%mrjHs3!7vBW4sN31_JRVIB_XI zKc6_X1T)t93VxKF+}!CL<(vfMW?@OV<#qX7Uw{7@y3W1$_w)@TO*+EV4*z#13_MV~ zw-WW9Fd0FxIo;Lcb=_DJV4Rt-S3}?Q5{W(8TIRaRvCf2+7;~KxfGiJrrLWF;dwUaS z?|F(>VFY&%ah@Kw*DPjk3~t_hH=%z8r={V=CMCv#f!JoCGN^&;y4#le71^C|UpF+QFFoPfUeNjr=R`${Ibv}9GiXS>MYX8@ z)YMdrVzQ@YM9J$_t#o{8z;qc_MI~KNO!v7~;!N@)FvXwWMd!fu#34k+e;0vrUS|IF zJn!g>zS4EYfqm5rA0Yho?N>~wDd$}Fie@can|aX$1AYZ`IBYN#;vBk82Fe1MtxhBC zRWP_r35*#BuCE5YpY?A~B^Ki1<5=+QnM>DC(VRAm3R- zaJ4AzTQ19({sY4QZ?n$-PybHw5rcRjQE)C;a{fh?A{?v(x7g<|U!>N@c`#vzN+ua7 z2}hu0oGLG-$zG1&PR_@vQmUy}n8Hv@%RWji5ZJ7Git4<{46S^0ThQw1Wk}YC|HFEDv1gtSgMGQq5&C;LnhAL1K zEHF?JkieM00JHcJL{Mr0C8p1b?L{wo(ok;EDUBYj^JTWn$C2osCi6Aea z&0e@|j?@?G?5XsT`U_9M*b*hj3jrC;gPE}(VHxa2`@j`e1qg?awzjp^We%Cm-$2UP zt&UlQFcoU)_gjur7bU9=gX!xlR^-wXIDMO(w(5MNh%VtP8Xgyi%kiEyR!P{`)=Lqe z?z?>{;=7#)pxfG&I3jb;R52h^`>z=c$>Q}URsexxe&&x{a&u>A0{@Zk|Jr2Q+Gfxx zEy12##hLtKDzu%`zLI@LA`ngj!|0|5AcB~oHr9Lj_=Hh5s6o~MD*InY7OM4R1hQc8 z0(PsgtTO}|QC2?Z>(EA^d9{+&<71TjrGOdQf@V1AYnJOP1Z#DPu)^Q&3~UPew_ z&8b)k+sO!&y|p5~Kj%Y0nxvLtUQL6r1UVpFy7<;(@1)>!5;`eW3AuTGmNL09-_Id* zxZ@g?&Hz=ErvI@BrY&!I!!3Xt!F30s~ zAXhC*RRm#Zz|hb<#G0azjoGr6hwt6H437H=1yZC^5o#?Y|JA@oB@K;)pWVuxL8l(@ z*+E*KK|!Af@7Pg@A41Kqb==wU@nmH~LxW?a^#)LTzN(13ZU8yixbMBNBz^IgT))rY znTud5l%ltdxdQgxgcPDcHHhO-jR@ApU7ZT_a{#U#I0?E8H9~T}k>_8W^#B%f(Fm$U zTa;$qu<5t7&hJ&v(D|Ho=F@oMa7$%UTm9WviOQO1lb5ldTvI`qz%Vfa-NscXKcx#Y zc;$4qQZyi?^GyQ-18?d)Z4rIwi_hrw`bY0inKA_&l^Z$90^o@vjzonpV><=$!_Ggw zsDN4DcD~ptenN|G(%jvxQ?+3OyLt0w?6(`<CVCc7a++O?ym_2TvyS)|aN z5Xasi4JU1&yY%jwva?G~F8g}}x#+h(>eb(XVEwwSZH|LO!H&yzND>wK-+|c4!qQ?e=?60Y* z>90M`g*4OHUV~v_!0hVn^}w5U@phP-%{0so%5DnY5e612dh=JiEM0wko^w|(&kb!k z+=7e9T;{1W#BA=-WlSV#G&&afoUxZ{*Fd{IG_hx>9$jVC#Jnfs00mq@b@AI*Vg_Y$ z!luG77ZS8#xqe;5=pWg8o*$vA-5(v*gKh(QGPGJo7*{ss6+irQme8nkozJ)*d4Vj< zqfDdBN~j%*$%+!a4h?3Eigj3{c_s)#AD8PpA!Q6I3TA^0It5+s=PYGJBO=ouSGqa> zm|NfJe^C6M)w+D-45qMRTxie+Ui^a}l`#9nOSV0&ZscjEKN?~OgH$u2pui!e;oLZQ zij@bCV~!?$g@r3TC@4s5KlV)!7~TxSR)?`9S6zG-b4>RdTG`y>zOl8gqBU8KD~c%6Qz}sasfjL{Po{BwI!w~w?1tNO?N7B zWer$L?DUEVPmmT7B*8rH(gg`_sWy$iudKCG$;LeWGVI~_gW4ql z#lg?8UhAPh)Hjdz1xQNKlZkPvwiZ|*F$jB1XX;KJBWV`KLF^{{!8(-t_CKUQ2x0L? z>T{-r^@0u<6qW^|K4Y^QcYchQ;2&-g9LYW$io*)95=>W-T+_XmqPzXV2r8vZ9KseT z$_hx-@sZvF>oxRI_J-HdMKC`&f*ynKH0oA5I!@Y98Xa2xsNVtY6i%m^a=GO2`{i#G z%eL?j$dN2aWuQG@XU_NFk5_2nNAZ0NrrPQT(5D@{ff;PMZI!lTD)1Dd*`T lbMjM{)jY-j`|p^GN5S&nMsL5;N-(?P4fpkH&$|U3_!m?dp%?%F literal 0 HcmV?d00001 diff --git a/plots/kernels-omp/openmp_kernels_slowdown.png b/plots/kernels-omp/openmp_kernels_slowdown.png new file mode 100644 index 0000000000000000000000000000000000000000..819539e3b172f311b543ded046e13a1a4b478b4a GIT binary patch literal 20905 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 Date: Tue, 4 Feb 2025 16:54:53 +0000 Subject: [PATCH 6/9] fix md link --- tasks/elastic/README.md | 5 ++--- tasks/kernels_mpi/README.md | 5 ++--- tasks/kernels_omp/README.md | 5 ++--- 3 files changed, 6 insertions(+), 9 deletions(-) diff --git a/tasks/elastic/README.md b/tasks/elastic/README.md index ee574f7..bb95383 100644 --- a/tasks/elastic/README.md +++ b/tasks/elastic/README.md @@ -44,10 +44,9 @@ You may now plot the results using: inv elastic.plot ``` -the plot will be available in [`./plots/elastic/elastic_speedup.pdf`]( -./plots/elastic/elastic_speedup.pdf), we also include it below: +the plot will be available in [`/plots/elastic/elastic_speedup.pdf`](/plots/elastic/elastic_speedup.pdf), we also include it below: -![Elastic Scaling Plot](./plots/elastic/elastic_speedup.png) +![Elastic Scaling Plot](/plots/elastic/elastic_speedup.png) ## Clean-Up diff --git a/tasks/kernels_mpi/README.md b/tasks/kernels_mpi/README.md index f75667a..2a7b526 100644 --- a/tasks/kernels_mpi/README.md +++ b/tasks/kernels_mpi/README.md @@ -63,10 +63,9 @@ To plot the results, just run: inv kernels-mpi.plot ``` -the plot will be available in [`./plots/kernels-mpi/mpi_kernels_slowdown.pdf`]( -./plots/kernels-mpi/mpi_kernels_slowdown.pdf), we also include it below: +the plot will be available in [`/plots/kernels-mpi/mpi_kernels_slowdown.pdf`](/plots/kernels-mpi/mpi_kernels_slowdown.pdf), we also include it below: -![MPI Kernels Slowdown Plot](./plots/kernels-mpi/mpi_kernels_slowdown.png) +![MPI Kernels Slowdown Plot](/plots/kernels-mpi/mpi_kernels_slowdown.png) ## Clean-up diff --git a/tasks/kernels_omp/README.md b/tasks/kernels_omp/README.md index 598b695..c176b0c 100644 --- a/tasks/kernels_omp/README.md +++ b/tasks/kernels_omp/README.md @@ -63,10 +63,9 @@ To plot the results, just run: inv kernels-omp.plot ``` -the plot will be available in [`./plots/kernels-omp/openmp_kernels_slowdown.pdf`]( -./plots/kernels-omp/openmp_kernels_slowdown.pdf), we also include it below: +the plot will be available in [`/plots/kernels-omp/openmp_kernels_slowdown.pdf`](/plots/kernels-omp/openmp_kernels_slowdown.pdf), we also include it below: -![OpenMP Kernels Slowdown Plot](./plots/kernels-omp/openmp_kernels_slowdown.png) +![OpenMP Kernels Slowdown Plot](/plots/kernels-omp/openmp_kernels_slowdown.png) ## Clean-up From 1cdecd511ac024cb30b08c5c09c60d16f7cb2936 Mon Sep 17 00:00:00 2001 From: lg Date: Tue, 4 Feb 2025 16:58:46 +0000 Subject: [PATCH 7/9] fix key error: data-file -> data_file --- tasks/lammps/run.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tasks/lammps/run.py b/tasks/lammps/run.py index c78f838..fb50c37 100644 --- a/tasks/lammps/run.py +++ b/tasks/lammps/run.py @@ -60,7 +60,7 @@ def wasm(ctx, w, repeats=1): ) workload_config = LAMMPS_SIM_WORKLOAD_CONFIGS[workload] data_file = basename( - get_lammps_data_file(workload_config["data-file"])["data"][0] + get_lammps_data_file(workload_config["data_file"])["data"][0] ) csv_name = "lammps_granny_{}.csv".format(workload) @@ -111,7 +111,7 @@ def native(ctx, w, repeats=1): ) ) workload_config = LAMMPS_SIM_WORKLOAD_CONFIGS[workload] - data_file = get_lammps_data_file(workload_config["data-file"])["data"][ + data_file = get_lammps_data_file(workload_config["data_file"])["data"][ 0 ] From 2f74f7558a2f8058531ed1ddfe4cc211c6e9338b Mon Sep 17 00:00:00 2001 From: lg Date: Wed, 5 Feb 2025 11:04:36 +0000 Subject: [PATCH 8/9] fix makedirs --- .../migration/migration_speedup_all-to-all.png | Bin 0 -> 12131 bytes tasks/migration/plot.py | 2 ++ 2 files changed, 2 insertions(+) create mode 100644 plots/migration/migration_speedup_all-to-all.png diff --git a/plots/migration/migration_speedup_all-to-all.png b/plots/migration/migration_speedup_all-to-all.png new file mode 100644 index 0000000000000000000000000000000000000000..b56cd21d78c6a28fd7de974c86a2bf378bb3dd96 GIT binary patch literal 12131 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 Date: Wed, 5 Feb 2025 14:13:05 +0000 Subject: [PATCH 9/9] migration --- .../migration_speedup_all-to-all.png | Bin 12131 -> 12274 bytes .../migration_speedup_very-network.png | Bin 0 -> 12291 bytes tasks/migration/README.md | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 plots/migration/migration_speedup_very-network.png diff --git a/plots/migration/migration_speedup_all-to-all.png b/plots/migration/migration_speedup_all-to-all.png index b56cd21d78c6a28fd7de974c86a2bf378bb3dd96..7e007b7d6252dfb3cb2f1b4251baa7d17ed0b125 100644 GIT binary patch literal 12274 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