From 1efac3fdfee492da7530c3b0f9898f4fa3ee2816 Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Mon, 27 Jan 2025 09:18:44 +0100 Subject: [PATCH 01/27] Create paper.bib --- docs/paper/paper.bib | 128 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 128 insertions(+) create mode 100644 docs/paper/paper.bib diff --git a/docs/paper/paper.bib b/docs/paper/paper.bib new file mode 100644 index 00000000..f36454ff --- /dev/null +++ b/docs/paper/paper.bib @@ -0,0 +1,128 @@ +@inproceedings{slurm, + author = {Morris A. Jette and Andy B. Yoo and Mark Grondona}, + title = {SLURM: Simple Linux Utility for Resource Management}, + booktitle = {In Lecture Notes in Computer Science: Proceedings of Job Scheduling Strategies for Parallel Processing ({JSSPP}) 2003}, + year = {2002}, + pages = {44--60}, + publisher = {Springer-Verlag}, + doi = {10.1007/10968987_3} +} + +@article{fireworks, + author = {Jain, Anubhav and Ong, Shyue Ping and Chen, Wei and Medasani, Bharat and Qu, Xiaohui and Kocher, Michael and Brafman, Miriam and Petretto, Guido and Rignanese, Gian-Marco and Hautier, Geoffroy and Gunter, Daniel and Persson, Kristin A.}, + title = {FireWorks: a dynamic workflow system designed for high-throughput applications}, + journal = {Concurrency and Computation: Practice and Experience}, + volume = {27}, + number = {17}, + pages = {5037-5059}, + doi = {10.1002/cpe.3505}, + year = {2015} +} + +@article{aiida, + author = {Huber, Sebastiaan P. and Zoupanos, Spyros and Uhrin, Martin and Talirz, Leopold and Kahle, Leonid and Häuselmann, Rico and Gresch, Dominik and Müller, Tiziano and Yakutovich, Aliaksandr V. and Andersen, Casper W. Ramirez, Francisco F. and Adorf, Carl S. and Gargiulo, Fernando and Kumbhar, Snehal and Passaro, Elsa and Johnston, Conrad and Merkys, Andrius and Cepellotti, Andrea and Mounet, Nicolas and Marzari, Nicola and Kozinsky, Boris and Pizzi, Giovanni}, + year = {2020}, + title = {AiiDA 1.0, a scalable computational infrastructure for automated reproducible workflows and data provenance}, + journal = {Scientific Data}, + volume = {7}, + number = {1}, + doi = {10.1038/s41597-020-00638-4} +} + +@article{pyiron, + title = {pyiron: An integrated development environment for computational materials science}, + journal = {Computational Materials Science}, + volume = {163}, + pages = {24-36}, + year = {2019}, + issn = {0927-0256}, + doi = {10.1016/j.commatsci.2018.07.043}, + url = {https://www.sciencedirect.com/science/article/pii/S0927025618304786}, + author = {Jan Janssen and Sudarsan Surendralal and Yury Lysogorskiy and Mira Todorova and Tilmann Hickel and Ralf Drautz and Jörg Neugebauer} +} + +@article{myqueue, + doi = {10.21105/joss.01844}, + url = {https://doi.org/10.21105/joss.01844}, + year = {2020}, + publisher = {The Open Journal}, + volume = {5}, + number = {45}, + pages = {1844}, + author = {Jens Jørgen Mortensen and Morten Gjerding and Kristian Sommer Thygesen}, + title = {MyQueue: Task and workflow scheduling system}, + journal = {Journal of Open Source Software} +} + +@inproceedings{psij, + author = {Hategan-Marandiuc, Mihael and Merzky, Andre and Collier, Nicholson and Maheshwari, Ketan and Ozik, Jonathan and Turilli, Matteo and Wilke, Andreas and Wozniak, Justin M. and Chard, Kyle and Foster, Ian and da Silva, Rafael Ferreira and Jha, Shantenu and Laney, Daniel}, + booktitle = {2023 IEEE 19th International Conference on e-Science (e-Science)}, + title = {PSI/J: A Portable Interface for Submitting, Monitoring, and Managing Jobs}, + year = {2023}, + volume = {}, + number = {}, + pages = {1-10}, + doi = {10.1109/e-Science58273.2023.10254912} +} + +@inproceedings{dask, + author = {Matthew Rocklin}, + title = {Dask: Parallel Computation with Blocked algorithms and Task Scheduling}, + booktitle = {Proceedings of the 14th Python in Science Conference}, + pages = {130 - 136}, + year = {2015}, + editor = {Kathryn Huff and James Bergstra} +} + +@inproceedings{parsl, + author = {Babuji, Yadu and Woodard, Anna and Li, Zhuozhao and Katz, Daniel S. and Clifford, Ben and Kumar, Rohan and Lacinski, Lukasz and Chard, Ryan and Wozniak, Justin M. and Foster, Ian and Wilde, Michael and Chard, Kyle}, + title = {Parsl: Pervasive Parallel Programming in Python}, + year = {2019}, + isbn = {9781450366700}, + publisher = {Association for Computing Machinery}, + address = {New York, NY, USA}, + url = {https://doi.org/10.1145/3307681.3325400}, + doi = {10.1145/3307681.3325400}, + booktitle = {Proceedings of the 28th International Symposium on High-Performance Parallel and Distributed Computing}, + pages = {25–36}, + numpages = {12}, + location = {Phoenix, AZ, USA}, + series = {HPDC '19} +} + +@article{jobflow, + doi = {10.21105/joss.05995}, + url = {https://doi.org/10.21105/joss.05995}, + year = {2024}, + publisher = {The Open Journal}, + volume = {9}, + number = {93}, + pages = {5995}, + author = {Andrew S. Rosen and Max Gallant and Janine George and Janosh Riebesell and Hrushikesh Sahasrabuddhe and Jimmy-Xuan Shen and Mingjian Wen and Matthew L. Evans and Guido Petretto and David Waroquiers and Gian-Marco Rignanese and Kristin A. Persson and Anubhav Jain and Alex M. Ganose}, + title = {Jobflow: Computational Workflows Made Simple}, + journal = {Journal of Open Source Software} +} + +@inproceedings{flux, + author = {Ahn, Dong H. and Garlick, Jim and Grondona, Mark and Lipari, Don and Springmeyer, Becky and Schulz, Martin}, + booktitle = {2014 43rd International Conference on Parallel Processing Workshops}, + title = {Flux: A Next-Generation Resource Management Framework for Large HPC Centers}, + year = {2014}, + volume = {}, + number = {}, + pages = {9-17}, + doi = {10.1109/ICPPW.2014.15} +} + +@article{mpi4py, + title = {MPI for Python}, + journal = {Journal of Parallel and Distributed Computing}, + volume = {65}, + number = {9}, + pages = {1108-1115}, + year = {2005}, + issn = {0743-7315}, + doi = {10.1016/j.jpdc.2005.03.010}, + url = {https://www.sciencedirect.com/science/article/pii/S0743731505000560}, + author = {Lisandro Dalcín and Rodrigo Paz and Mario Storti} +} From 3063317438dd1b237fbb98d06a6d6b5787fdeb60 Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Mon, 27 Jan 2025 09:37:20 +0100 Subject: [PATCH 02/27] Create paper.md --- docs/paper/paper.md | 82 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 docs/paper/paper.md diff --git a/docs/paper/paper.md b/docs/paper/paper.md new file mode 100644 index 00000000..b7ff6938 --- /dev/null +++ b/docs/paper/paper.md @@ -0,0 +1,82 @@ +--- +title: 'Executorlib – Up-scaling python functions for high-performance computing' +tags: + - Python + - High Performance Computing + - Task Scheduling +authors: + - name: J. Janssen + orcid: 0000-0001-9948-7119 + affiliation: 1 + - name: M.G. Taylor + orcid: 0000-0003-4327-2746 + affiliation: 2 + - name: P. Yang + orcid: 0000-0003-4726-2860 + affiliation: 2 + - name: J. Neugebauer + orcid: 0000-0002-7903-2472 + affiliation: 1 + - name: D. Perez + orcid: 0000-0003-3028-5249 + affiliation: 2 + +affiliations: + - name: Max Planck Institute for Sustainable Materials, Düsseldorf, Germany + index: 1 + - name: Los Alamos National Laboratory, Los Alamos, NM, United States of America + index: 2 +date: 27 January 2025 +bibliography: paper.bib +--- + +# Summary +Executorlib enables asynchronous execution of Python functions on multiple compute nodes of high-performance computing (HPC) clusters. This is achieved by extending the Executor class interface of the Python standard library for asynchronously executing callables. Internally Executorlib connects to HPC job schedulers, like SLURM or the flux framework, to start Python processes with dedicated computing resources such as CPU cores or GPUs. This enables the targeted use of parallel computing frameworks like the message passing interface (MPI) or of dedicated GPU libraries on a per-function basis. This flexible and hierarchical nature enables Executorlib to up scale Python programs from a workstation computer up to the latest Exascale HPC clusters with minimal code changes. Finally, Executorlib provides several utility functions to accelerate the rapid prototyping of HPC workflows, like the caching of intermediate results, the visualization of the workflow graph and the tracking of execution time, enabling fast and agile development. + +# Statement of need +The Python programming language is commonly used in modern scientific HPC workloads to couple multiple legacy performance-critical scientific software packages written in different programming languages in order to solve complex tasks. To avoid intrusive code changes, interfaces to performance critical scientific software packages were traditionally implemented using file-based communication and control shell scripts, leading to poor maintainability, portability, and scalability. This approach is however losing ground to more efficient alternatives, such as the use of direct Python bindings, as their support is now increasingly common in scientific software packages. This enables the programmer to easily express complex workloads that require the orchestration of multiple codes. Deployment of these approaches on HPC platforms however requires developing strategies and tools to interface HPC job schedulers like the Simple Linux Utility for Resource Management (SLURM) [@slurm] with Python in order to control the execution and manage the computational resources required to execute such complex multi-task workflows. + +We distinguish two main use cases for such interfaces: either to request a queuing system allocation from the job scheduler and or to internally allocate computing resources to individual (sub-)tasks within an existing queuing system allocation. In the context of the SLURM job scheduler, these differences are distinguished by the sbatch and srun command. A number of Python workflow frameworks have been developed for both types of interfaces, ranging from domain-specific solutions for fields like high throughput screening in computational materials science [@fireworks, @aiida, @pyiron], to generalized Python interfaces for job schedulers [@myqueue, @psij] and task scheduling frameworks which implement their own scheduling on top of the HPC job scheduler [@dask, @parsl, @jobflow]. While these tools can be powerful, they introduce new constructs that are not familiar to most python developers, introducing complexity and a barrier to entry. To address this limitation while at the same time leveraging the powerful novel hierarchical HPC resource managers [@flux], we introduce Executorlib, which instead leverages and naturally extends the familiar Executor interface defined by the Python standard library from single-node shared-memory operation to multi-node distributed operation on HPC platforms. In doing so, Executorlib enables the rapid development, prototyping, and deployment of complex HPC workflows using only familiar and easy to maintain Python syntax, hence greatly simplifying the up-scaling of scientific workflows from laptops to very large computational scales. + +#Features and Implementation +Based on prior experience with the development of the pyiron workflow framework [@pyiron], the design philosophy of Executorlib is centered on the timeless principle of not reinventing the wheel. Rather than implementing its own job scheduler, Executorlib instead leverages existing job or task schedulers to request and manage Python processes and associated computing resources. Further, instead of defining a new syntax and concepts, Executorlib extends the existing syntax of the Executor class in the Python standard library. Taken together, this makes changing the mode of execution in Executorlib as easy as changing a single variable, with the interface remaining the same. + +To illustrate the usage of Executorlib and explain the technical processes occurring in the background, we consider the simple example of doubling the numbers in the range from 1 to 4. With Executorlib, this can be achieved with the following code: +```python +from executorlib import Executor + +with Executor(backend="local") as exe: + future_lst = [exe.submit(sum, [i, i]) for i in range(1, 5)] + print([fs.result() for fs in future_lst]) +``` +In this example, each individual summation is concurrently executed in a separate process. We note the strict adherence to the standard python Executor Interface as the example remains functional when the Executorlib Executor `Executor(backend=”local”)` object is replaced with either the ThreadPoolExecutor `ThreadPoolExecutor()` or the ProcessPoolExecutor `ProcessPoolExecutor()` from the Python standard library. In contrast to the standard objects however, the Executorlib Executor allows for execution across multiple nodes of HPC systems, which enables the execution of highly compute intensive workloads that require extensive computational resources, as we now show. + + +## Computing Backends +Currently, Executorlib supports four different computing backends specified by the backend +constructor argument. The first is a “local” backend for rapid prototyping on a local workstation in a way that is functionally similar to the standard ProcessPoolExecutor. The second “slurm_submission” backend can be used to submit Python functions as individual jobs to a SLURM job scheduler using the sbatch command, which can be useful for long running tasks, e.g., that call a compute intensive legacy code. This mode also has the advantage that all required hardware resources don’t have to be secured prior to launching the workflow and can naturally vary in time. The third is a `“slurm_allocation”` backend which distributes Python functions in a existing queuing system allocation using the srun command. Finally, the fourth is a `“flux_allocation”` backend using flux as hierarchical resource manager inside a given SLURM allocation. While the `“slurm_submission”` backend uses file-based communication under the hood e.g., the Python function to execute and its inputs are stored on the file system, executed in a separate Python process whose the output are again stored in a file, the other backends rely on socket-based communication to improve computational efficiency. +\autoref{fig:process}. Illustrates the internal functionality of Executorlib. The submission function `submit()` requests the computational resources from the task scheduler, which can be SLURM, flux or a local task scheduler, depending on the choice of backend. The Python function is then executed asynchronously in a newly created Python process. The user can interact with the asynchronously executing Python process on the right through the concurrent futures Future object returned from the submission function, again as defined by the Python standard library. In the code example above, the concurrent future object is named fs. The concurrent futures Future object offers a function to check the status of the Python process (done() and a function to block the execution of the process on the left until the execution of the process on the right is completed (`result()`). + +![Illustration of the communication between the Executorlib Executor, the task scheduler and the Python process to asynchronously execute the submitted Python function (on the right).\label{fig:process}](process.png) + +## Resource assignment +To assign dedicated computing resources to individual Python functions, the Executorlib Executor class extends the submission function `submit()` to support not only the Python function and its inputs, but also a Python dictionary specifying the requested computing resources resource_dict. The resource dictionary can define the number of compute cores, number of threads, number of GPUs, as well as job scheduler specific parameters like the working directory, maximum run time or the maximum memory. With this hierarchical approach, Executorlib allows the user to finely control the execution of each individual Python function, using parallel communication libraries like the Message Passing Interface (MPI) for Python [@mpi4py] or GPU-optimized libraries to aggressively optimize complex compute intensive tasks that are best solved by tightly-coupled parallelization approaches, while offering a simple and easy to maintain approach to the orchestration of many such weakly-coupled tasks. This ability to seamlessly combine different programming models again accelerates the rapid prototyping of complex HPC workflows without sacrificing performance of critical code components. + +## Dependencies +While two inter-dependent Python functions with similar computational resource requirements can always be combined and executed as a single Python function, this is no longer the case for Python functions with dramatically different resource requirements. In this case Executorlib, again extends the submission function `submit()` to support concurrent futures Future objects from the Python standard library as inputs. When such an argument is passed as input of a subsequent function, the Executor waits until the Python process linked to the concurrent futures Future object completes its execution, before submitting the dependent Python function for execution. In the case of the `“slurm_submission”` backend which uses file-based communication, the dependencies of the Python functions are communicated to the SLURM job scheduler, so the communication is decoupled from the initial Python process, which submitted the Python functions, as the execution can be delayed until the user receives access to the requested computing resources from the SLURM job scheduler. Finally, by enabling the plotting parameter plot_dependency_graph=True during the initialization of the Executorlib Executor class, the resulting dependency graph can be visualized to validate the dependency relationships between the different concurrent futures Future objects. + +## Performance Optimization +While Executorlib is not a priori designed for Python functions with runtimes of less than about a minute, given the overhead of requesting dedicated computing resources and starting a new Python process, the execution of these functions can be significantly accelerated by reusing dedicated computing resources for the submission of multiple Python functions. This is enabled by setting the block allocation parameter block_allocation during the initialization of the Executor class to True. Rather than starting a separate Python process for each submitted Python function, the block allocation mode starts a dedicated number of workers (with a fixed resource allocation over their lifetime) and then allows the user to submit Python functions to these pre-defined workers. +To further improve computational efficiency when working with multiple analysis functions being applied on the same large dataset, data can be pre-loaded during the initialization of the Python function using the initialization function `init_function`. This initializes a Python dictionary in the Python process which is accessible by all subsequently submitted Python functions. + +## Caching +The development of an HPC workflow is commonly an iterative process, which means the initial steps are repeated multiple times until the workflow is fully developed. To accelerate this process, Executorlib provides the option to cache the output of previously evaluated Python functions so these outputs can be reloaded without the need for repeating the evaluation of the same potentially expensive Python functions. Caching in Executorlib uses the same file storage interface as for the file-based communication with the “slurm_submission” backend. The caching is enabled by defining the cache directory parameter cache_directory as additional input during the initialization of the Executorlib Executor class. Finally, the cache also contains the execution time as additional information, enabling performance analysis of the workflow during the development cycle. + +# Usage To-Date +While initially developed in the US DOE Exascale Computing Project’s Exascale Atomistic Capability for Accuracy, Length and Time (EXAALT) to accelerate the development of computational materials science simulation workflows for the Exascale, Executorlib has since been generalized to support a wide-range of backends and HPC clusters at different scales. Based on this generalization, it is also been implemented in the pyiron workflow framework [@pyiron] as primary task scheduling interface. + +# Additional Details +This manuscript provides a general overview of the Executorlib package, the full documentation of the package is available at [executorlib.readthedocs.io](https://executorlib.readthedocs.io) and the corresponding source code at [github.com/pyiron/executorlib](https://github.com/pyiron/executorlib) . Executorlib is developed as open-source library, with a focus on stability, which is achieved with an >95% test coverage, type hinting and a minimalistic functional software design approach. + +# Acknowledgements +J.J. and D.P. acknowledge funding from the Exascale computing project and the hospitality from the “Data-Driven Materials Informatics” program from the Institute of Mathematical and Statistical Innovation (IMSI). J.J, M.G.T, P.Y., J.N. and D.P. acknowledge the hospitality of the Institute of Pure and Applied math (IPAM) as part of the “New Mathematics for the Exascale: Applications to Materials Science” long program From ffd0a074af2984365c7fa1d453ef7a95fb1709a2 Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Mon, 27 Jan 2025 09:38:12 +0100 Subject: [PATCH 03/27] Add files via upload --- docs/paper/process.png | Bin 0 -> 137571 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/paper/process.png diff --git a/docs/paper/process.png b/docs/paper/process.png new file mode 100644 index 0000000000000000000000000000000000000000..dd19a37bdaafbd85fb304f915b64168f57417921 GIT binary patch literal 137571 zcmd43by$^K^FO>d4Jx3b2uKLh0*Z8Qq@)p~OQfZwyHOCN1*99KyIZ8YyITaL8-8n_ zb3lB)*ZcqLxrBZ8+$$#5%x7lS?I&qT;aeE^7!U~LmdHy183+V%1p-0xMneJLxc**z z3V~qc8}Rc>i}3T4NSmAL8W`z7ATK|KhNHd?8NK7Wd6DMjdEeXeg=wD(g!)kt1f#EB z=;aGEPizD}L8F#Aj4b4Px3gA!yxk3<+H~H?H+)@@Pu#s-3+V5|1Q*Zh9{t+j+^pVN ziauICp|n`;s$QOoK7x`M<~P25l!XS%ppw0_v?<~H$uDUZ1%j>*z4zwE=h5h!&&ZgV z9*{6-b6r0=1D(nFqLFQ#%7g4+rt zFW68u0|o||=)W)DW)Xb*15Iivjq;Qn>%x@%t~UFqQO)PHVMcOWV!n@xE$T-uCe0UN zuM;eFG4Be9hy=Sn{Xs+Ku+KV9qC zM-N`SO^+5kE8rIQL@2P;=c}grN7KWbVtwDWcPK=^e#X-k(=`lC6=*vZ;R<`=Vl5-E zds7cR@qWuYF?6g*Kh3t&I|g5k=(vJv4}MiS7dXA_JZv9Belj}Jk?ai_<;l}qTmJN* zkp1~v?P4=Ko|?jEK?SyEsij8r`A=Wp@4kE7eu}3wTaX{oG8;`uKr`N;ZT)8DCL+a4 z#1{hOt|;z7ti%vTJ6c9c-0$LdbHAV+ibOD>n2*~sg?Vc+hwJKTEko)SCS!Q;iNDF( z+)12@+)H7F&d9j39ToDFKq1TOP#9j!9$uBO|DZgCzQ`guILm<8e%lQy5bt_Q`wfxs z4Mg0HJP%Q_?v^c70~_rH49Oc=42t^L?RE0@A_;01>QOwl5i%zq-Ut?^Tha^?8}iS3 zyZ3misHJ?IWmvJUCOxQAu9{CVnjWEj=hOB^NawEzysZr#<+E%--2UL6@RaJlkJn)! zTJQ_@9+Yp`G#}gIJ*4mL-mt{1xH;*`5icx_#e`PvRZ~ax6)CfBEbp1ot$t0Ehe*P8 zVsCh&G4&eke(RRu;If-W#b>&=Z#u*gUjBAO5t~;PkzH)@sYzme=v2x@UJ| z_)Neo!yM<<*`b*`X}$N1DB7d<=(Ol6XkO@ko}8XM-`QS$(tlw|DTE#JY3)c6N3rcHHt0<_P6h<|*csizY35Elw2FAsr&(eQ$%m6h*uic}L1k>O>OK+N8~3 z{*XPSDneDT=7qE5`D3Y|(qO$-i^bu#@b=+Wo3>gx5~>H(PjSL%v}wOkMa!2ZJxzWo z%_Of)Q*dvXDvUN(_Lt1VSBX@kG#{u^Xzo!H%2uQ^#ebG%k>8hFqFJUUmZ?dc5aWAw zlS&-JtH90ttGQoan!DVySDNXMGjTGar43~9wfb2EigJUh zRzj1xpA-Ht(?=#brb#CDNaV;gCSt>SM8&B{F_+sUeCRijh^b{lgLz2tsc)JnK8Msyx1^x*Vxya@#;}iWi_9ilbv&% zv(KL+CPF7kdf#~Q71rk^g2FCV+v4UowclV4!4dqPthQ@k0y6mH@eD`b!gb5NlHKQm?+DhC?%1iu8 zHrG4W*{m0>4}P`oJMSB=6a1QHS7iJBaG#yaGMTN*W@2UJ*I{StsL0&wd8QSkm4};E z&E>v1FR)T@driyUs8*>BRYcny{rb5OxoY3GC&emOic_j(g195Tw6#PSJG_>&*=5bU zGPTaP<9)z3)4QI&+`6Cj+i_NBrg4vBZm|2Q*5l{?&!_CiZN;j(?E{{vMPx=u@K6!E z#3977Xy{D8oMxO}c0P7?tbJFj=^}g~cP;__>KgBA3{`t#eBVp15g*eMQcgvBYdHC#PvQKHvAgKj7txE#I;qsFy&Iu$oXy|AYRfnqtjwxv$2G zl8Rz%;*`M-P7HofU?OOZ;Dr37`p!g%GIl#$q!=#=Q2RH>DvCEq;ZKj?k$2g{Gy zxx_jDAAV1^)ru@$O}}k!Jn|)e@=U4VZEI%=zSsvbh9|O$P3qPhM0be^U7noNa(b%O z6N$Vb|0VKZ=_z|9n`xQ)1mOfbnP)HhrP3GDipbQE64Gpbqeor1Hffcqo8rV_NFx5)Fg!6v zd`7uIigdYmG-rHcA&WtBv3mw~1Ka(yU*x^zi*lGW$_;c}N;LMnGkY@GG9xW^&4-qE zvvjj~%21R;@>1=x>&L2!oz_l=3Du-j;|k78Rih^6CISc&S(%m$mb2T}&gw6`emWjG ziZ~AomHM5y2wYGd<{O8crA|iG;J&|Ma&HVL49A&n4rlVXbw8~yj)H~K#AJM~NM~C9 zmwfLK>Nr;^A)P!;7yZU0kBh@3=9s@bA+ZhpxLx6o1nmp@Ir`O{jlP+_kCPuOOE=Dy z!(Ln0PE=M|2MonZI5h2>A6Refj42dqIJnH7GoT`&5)tk4Dk^BIzA{I1pjzw6Y(%X+tiKhGJ@l$^2)-dIu4eJjU%jg?i!xJk*w)+a1 z8noSOF$}fw_L}X2bB$HLcf$)9{FpvPeWc%EIACEgbT%hnYOBt?kz1m6qr!T=VtS93 z?sJ$J>x5}^?W+CG1l@7=@wjB^nlhnE_xaM{_$W(SNd;$@4gQ$g7y;*!mFlnEUsaC7 z%Nu(RSq`O}3}w?>B-`~3IgM(QSmju#MCioT4$*tIr>zxfU(=AgapFR`hV9k2Dn~bq zCnYCw?H%ovH9Tu=``TBXb{OXuhij@778JeF3Fs5(R-2a)8#>Z|=n?>wKP=ZDa}^2BvrU)SO2N0r+972+;fqmKDi zLPmx5_Ni>@$x-dVnbZx6LJn7#F&C(rI!0it?NC3!us%A9BDxY15E}3q4T1#4haiJb zQ1F)rN^tdA2ucM({O5ZF2*k?(g7n`rlHfP|PayaUAM@{T#Ndw*RPcXyz+c;Vgv+N9 zSK<*bKO=bq8iY@lUql4_men%X(J`^mH?_3wR0fb5g8u%ck_7~EpB(-dDkAgvH<*9K z;I*QqqJ%hymZ>qlrnc!@9eP{i_wacjT(%tGqp^;qCW)=Fk%N4jBQV|AvGA<0jR&w0zIOz+huz zLvQn(-qc)=;TZ_^3{M#u7#Zon6Lc1KCYGAEbS4&L|4wo_kARMambt-uO9N9A68OBD zZ%wT%xk*Xk3tj#Bcb_`827gvEvG|WIz#s#h!tjj#DZ|y=U?>;-TMlUhTOA`M0Rv+o zGq48Fvu7+%x&9gOe@K6pyf#$v+R&#@{~CIY^uI&pEOgBIO^v~#mOOtH_TReKiT@4c zVu160O&0$O`k!xsqW!R4cRQ<>FaI*jKB(Y6+9*Cy7BNxu%_DJz zAfR3U0fQk2WA`Bb>~6dbgFun6|NMB0fMn@>``Q=(kn-Fh&`A_O*#9Ar#P4wa@8qtx zkkD3G^pSl2mjHprO#ihQd~PEW7_5|!Od9F>F5m>Tl~c^?dxo>{1`&!-aSPv#^nVF3 z*s{&vjDRT!(6D=qd(d#8|GOvxM=j!C@&I#>z+7ETJcQ!W{+EE=b42)$5U%~GLjhtU zU_ubQ_T4|rySjF5{*SC72rSqn@#FEgsSy5F0t7B<)c+rgx*2Krxn5VxX6*(2$-yQo zZvZi`2_g?%t&;a&29bW?+U?;F=60~QJDl}ebVDTy)NT!CFBknncqQ+;dV~_p6li`d7Tc**vA zKl>5|Z&1Jf7D(vx67P?cUc9UegQ|HPR@v<&>je;P4=3;kH~*Zp-*2T{9CbWeD5u?Wd26l5!evU=s zUTqlywSkT!?>2a0iB(rv=}aE)$<)}Ip_@($#dbvWS9drH0Yy7f#8>~64Sy2kCY#o> zYO%bq{whg4prV_;<HUY$I5gIu2q7&{3G0)E$c zz{5w+!x_R^jK^9=^0n;DDM{$+1uy4t>$#mL0UPF<_Tk$3{J7FuVyK3bkEku0-BQ^t zlGN4J7`f?*A_<{zH60?#&A`08r{iHE?vJjH9h*koedyWo-kMB~kuYtj(OdpQk9k<|Uw z`SoKn9>91VEdpv5^vTZ9H+qRk=8)bbVTZ-&Xr${JfRD~mt8DY!0)T~Fj9j+q^M=m+ zbGQefb#o4(Xv-Td)S0ev3MLo3uM+C_{m;^D8YJ=1vqWZPhp>w?sh>5+8J{;M8jm6e zfY#iVXFQpCkNI;$L+FS68lBIMk*(CyA6}hG*9&9>{2qlY#YgvOUI%V2b%wi_Tb$JH ztKJ5C^G<_h$8zg5$GLp9>7BQuswBITGYNJk42EbQPOqlDzq`795LujmKiCiW5mz-N zOZ8o$vy)c9pw@chu2x1vv(nlnD>&tPA=^Vv6 z{izZ%RkmB$-=4_{T)DU3;qcYW3`L8x4Eowm>pjloG;%zE*Lf^D6Ht2*=G9(HAr?-5 zue!Cx{f{qlEd?HRDtLhljRgA+f{U`$nRX$Hk4lMA1Rg)xV;TwaOQVA#oswerxSqT3 z*{&ekq$Z$FGDvg^0<{q!iCwEVhEKt{eA+B!S2hNMSIn(6H3lOGbcUpsk#U{Njfx1w5HS!#a`)qzE(gM%qGR`Xq%)`A0B%SXEMW1L{>p4T zvmj7z?WkBEGFR9Ouy6EN^A9c=fw+}{;5DE4g9l7icX0y*A-O-X=65I%fkFY?Yq`s~ zx)Ocq6ivDEkSg$~*LxEO0g4n27_ku*dnI`}ZJiwu*m5x*xe&w+0tAcb-JNo&cQ+Ei z2&x^TEH@JN?;Nl|Wo-1VOQFMNQX$Z@ROC2pG!D15;asus-XxvYCcgrk(SnxaGv}2+ zoE%vdA*)}H_u9h)RJ*;#!In);e-K?t0)l{kmn5FD!!HRtuevTYQz6AVSADzw*orY- z;VV?08ycrClNC<)>7Mg*CNG?em%XZQTe3 zlTojGrGR@=X3bky#_DPVKObhhZAwMW&)aEr7UE>n-g0YzFp_9gYc?`%}ddnu&JGh-ppX zYbpOmzY=C$B~Zhrz5Sw5IK4&~e{+Dy_-w=Cd^c|ZR~nDcM2@b6ND!CZ0>@cA_oiM~ zOh`2^%kAsPHIvmU=GvV!c$*b#`<&xOShpqv z6tYR}$(GlY3MF0!WP2ZT$|pE+?j$#|S}cneB#UT`b1#(M?%_XI0OkMx45v;H>?y97 z;`~PlE<@OTj|MWS-OlK8nZvDSvfAd|*`9nYnM?(#(IVrhFLcV{JVcxI|Tc!X**_uQvWqcR4JZ(s{sgH*QcKXq(oz&2szYyJjhe@5y^esY#dX0Q{Y=Kd~p85U`LzQ%74|}7#lzdcg zcg%=~dWr?*^AzP!5X(Jg$>t{XIS5rYXhJ&;?{MrXpC}j4IU0Rie+k1XzMoceY4)xc zz^cv*{SQL#5cH@aejrq;l-#I1*|62%eT`*Xt%a&oV-PZL-xCna_6RGCmX>2=CM|?g z?9+=6^Mjsb%N;>ET0-r2*@=Q;HfxDW`A~l$9T;j}Z5r)$m#rlz(-+>v*T{IpycIEeKa7f}$ zWLSfi{S9HmLE{?6{bQbtxAbxrCqCQ=zUXAt4%+)>Q9p4Wbwkbc!HUBKUVj>^$5^Ay z>-Th}9|Z|Na4maai7q*8n8{HO#o=c6ZtlHW|C)+pL6{}$LtZRIBNfV+Vi(Ci}Li`f5wb5dF8z+S)FQf-WL^RtZZ0Yi#P@s~Z7Qqe|S z(U#y>NfWG%t2@kV_;?ymG<6{>!&M)44aS%xn?H<6BJD~Wn*H>>jF5*?z&-P>*=kVd zK%J`g*tS&~ye9ATBx(Hi*jrm@*jpo)$QTHcEmo^ASE5(1cycT|tz_MqKjpIh_-MVG zchMh*y0a!cS3T$kE`taFwhNO)rIO<%o4K{g?JH=br)LM|rwby_Uq+zt+!{9hLQPhU z&l=?LT-#ecxn+|>Zeqrue<8^)t}SQU`7ZZRv3B>itEFKN3|~I$fzn2yJS3;DypUP% zROGp7RTp7yeT~*S2V((0>Tp8AasXnV`R|z)r}O-_R6g~!p2T;|g>nAYyhcmnN~L>- z{T3S>hv~qdxSed+I5G1^DP+^+-lxOYiCOcFwVCIkQOXW+RWQ4zFZfEVWlsn7F-<+4G>bD7yYLj=kD|{ z4}=;`O<;IBm=g4$DsGZ@t5l0R^IB4gVh_rs6x!=bIhRl~#xEBNxlR|`Y|4p;t@@nc-9QVj->!}){U*;b&LnByFSiEq4@rDo$!Aqr}mBgOfjzg(zXtx=^#z|`F8tK_512i@tTK?sS*OFH&<>!hwpI5 zuN7xnt&_T_RL|v<&su35xaPb>35pC)0*Q+eJ)a4R-decTw? zJiEbP!zDEFXgi7kgB$}l?5_NXy58Qq16#eUa*_DW4=%g=<4ZzbYthd_x5mqNI!+hx zHboh9vJIwp3C+}YDO!82*2wJ&v~y&=c_KBE)wy@hLbf(VS4jm)OB#$9rrS#VcUXGIWtbubVmSdB|AeQT>N0daG%#{|MRKU z?$^QbqtIwJr?IU51OG{4vw+nfXiY#$RhOG(z!#7t^d-SjEftLjMf zQTvdY8?>j(P7Ajco^?pA^9`jTS$-noDNd_?RqM>Cx7e)fu? z)&y3v30yj@MadZL!SD;e3XP+baPgUox5qb+=DdhWW0;wMi=ysT_2nUam88PDBR9TH zw6^E&`Q*m1<6EJNVJ#PpEwkt}1F@FkX#1Pc$#gp5@=I6*Jpo9@ctWTb@p#?mxb$96 z66(rV|MFz+p3ca&;Y#ZWHGAa%4Xk&A9OgE|5Q}cEElJn-JsNIaJW;7Ws1P7ltKyrkVLX|?r#tQ%Mn~T9Gr?K|laP}_sl5ij zJVT>!sV_~bux0bOo|!Jv*`GRot>n>j-Iuvr^SfGKh%5`|E-t)HVE~+bG#d~;u}XHl zRov@Qx^_xid-$TQ)X=b|X0IuVF;xtAIJG5iLuVkAo}n6DHc{m6(dxljUx6~SUD}$9 z=7iM@z)K=gn*5!WdkQsE_(zXD4INZnDw>}6oT&}_ujMBc5JS0ND@WRsUSijC02NQB zxw;fS6ZPx`ErSsK&VN|_w}<@G*wS|?0v%C$Q=|S;u;CD3YTs}&)WnK#Rfq{RIA~t9 z;WC)m7g{ly63!U4XN^AFZ>sPbO%0`OPgd6?TH9aWnA{exuFzHSz__PvKkdAyKjk9`Fq%dCe%p+*EvQtCF zt!go_J~2T#ZOop_!Fo8S^mL#n`(%~Tp$?WVn=?UovV!4sll$yOV<*)@7~DX?dKQ;-kx+f=JCqapB7k?pEU;K7iYG*rkTbI3l(45=5wRdWfqwHA zq3%=&tH#^IBmlTmn>APuOnYVQfj8Umb%2>_WQKkIInwH6@i|Tfi;(m#&moMcE4XoD z#oMfT+-SsQg~9Fz{%5IhbZ!UH9U3`P3xO45ig+*eC|Rv5;HUwBql*aT42RjRl^h~% zsm*x9T;l+nsi3YQ$lGTU3QPD8I^+b_^VPV_lkt9c7SkU~-I}zy=Q35Lk~2Q0v>Ab$ zj}qu>V4z=3nG-O``~Ko=JB^v6oIb~(ez%ZEJvU&KQu~u3%m%A=>L=gul+*CHwc{eU znmgFzeHIg(j05=3)Wa2G9VF$ecc#e>bU*BQIp9r~m~dEr+ncUh$XS1OmNiwJ=~$*& zZC87Ca&+VE*m}vDRkAJNE%orPpF5hc&plj;zWYfHULAR2aO9nCMt|*ZW{!6$S?9EC zwPzTYgK6&|(ac_RS_Md@&jO)6(+=@O<(VF&HAja=Eh)z?Nji&5+rDS3Nn_Ksn%ySWX86o$3#Jh!olN2pj^ z^2+Suec~tuFNW<6&P#!CsHx6heKJSXVOzH;Zp`^2rmi`?PE z_7aDgoi=Y10`e9Lf;~1Xy&V4~fJJx$lI{11Kdg_+PzT4H z_exMcRO%x;#n7szo%Gq|?KxS-)K2s#o~$}7=IEUL5YhE{HhfTa+96jSe7e6Jr#pOK zE;B+nW8PeK*J%#F$BJkRKX4T6+ZzXAYK%M}t9t?cMxYdBwF<|%!@3G{v8H4nWgzRG>GaJ*0 zs5tZ$R=PvaO9)9aqXvotHr&G-~lUo0+#fja;}9WBVk5U$=jT#Z=?~wf zaLAPv_4HX=joBF-u%(YARF86(@Xc}f+p7q5$C>Vny@Y90X?hI&8s(=qJ~EYN<9@Zo zn9@11bZn=4aW1o2d|@BASD7Zb%&u`fDpa^??eU{A4Rw;4JBo+TOlOTXmYy)pDyqcz zd4JPt7d*on;zO9X{7y3Q$(6{{Pc-zZ!Vm?oF!W)^`UH)*@>tKlFyJ-!#H*uAl+}|8 z$G(+aG2N`y6v@|anFioQOLQo4)ENlu1$Z$N{q=~c;z7sm|nh+Lh~t(XYmseX89n=%nW6MD3<8eq0rOS!42bEdN;{E8)ax?=DqTN_sjgo+dIBn8X{uqnzQlOb9XU{P8T2r{bo~&7DNx#Q=Bn0I3 z;DAj{E^WTgpj_3r=0p`>NHq=a^MTu=l+K3RAJz+l2@mwVBRB?^(y$r8n-N*C z3OI%X(i`pX59nCYoJR_qCvLJ^?Pqam#JgraJn5o)q-IL`C2xsK!69bDBz*6%EN#l* zz-AzAcZ1GPBNs=hWQ0exG_|^N*q&HjSaW#wr{!3M=Mx4NLz?5S4o7p1I!ZrWHrFT@ zxau8mLb<=HgjZZuD&6jZGTjhw+u+{q6*pOmsPe|*W}DGeiA3(^96@3-2DJqxkqFXq zcNO6gqeJNEVnkyMJmpJVzGERE_^YmS-^R? zzI$qAN`l4l?w*?Nq?9lbgI4Es_U7lxFu}DU5sw-t@p9&5n=Dxc%jqWvlX~A{_uJ0( z_nM?IZ-i7Vs#_4=Ka$OrtyWQxO?^!*D{33XB9mssUcR|eDTwHJSd?C1IWL4aS?=4c zZpz*J#!$H|&!#!b!v9wf-&l=O|Ab;s?D~dQa~mkQh&A}!%O?7LK@?EiP$9X9s}YR) zTrXHs-fpw|>$3u`6lJDxsoJw4$6*D;-LiBsp5U(Aw<(I=+4|M2ytc_zUK}c)iYs37 z*i^1{t5Ph>Gw==Ioi-v`zc`6=>3Dfic#P%Eco@6?U8;!aVwigQewMoNi>g=+hkOl& zS1&edIg{`bG}>>E%YdTU(cw<_;$Wg+r-b{+{$7#9a!I%J9C9xKr~S?g)3ZSf!=UfYC~f%r%H+9KIWtZ z(r%Bj!#n>=e{rY`Dlvw$*qpUIZ_oPA&$h?wc|ixrLEO~bXeU>Axt9{!u{9*&4vHsF z`@>SCqF9bio;eR6EHnQm%6BjKe~{~ua<4d*r#}k$B&&R`b}YXkTA`sb_JU|F&hpu3 znc9mUje@n(>LH0wJ3~op$cy#j5pSz4tH*g;#qji zS?`QE(1@kIN_zbEoU5I-*3o2A|IHRaE(gE9D__Dch}#c<8}FL7;9=+a!N6(J*>9%p znBOCyknp!C-_768($Qef75%Y1c>uap-qw%fQD14v+`AlJrwed&6f;^QAIUR>P1fdW zC#7H~)5qr4NT>Ai9uuq4I~@2Il=IE)?cF$^if`tuo>~qZ9dg|#UK8=KC4+K%6NG16 zxhLp-;GW8$Wn2g~*or0+y$aUWDtrgUHz=KoP?+qpqD!{1 z%INMHOT_c{fv;VT7F&!Rz12X-s>D*c$_S9|(1UJL8KE%g44NApk*t+C(url+b*cG& z>}ZSOXlubFTue!eHP2qsdk9ou278NpDNcwR66gZm{n5k+T5lNunoAqo{q(!Cc6DIw z4q7=NwdMo;DXhe%WST2&c7mx`46%JccW)oCHD2jNMR>{Aj5Yw9Au0g{WUj8$@M0R} zvis#gSPOt?{Hf{bR0wFc{9u7wf?aNxE0WBJfNw-TSb?WuH^F`$yivT`4oRRsC>tfB zvx5e)XE10`eNm38_>=d8*mE)*mHEikwE--NX$tcRxSV!G5j4N%n-cUvla?23?QG2R z&XrZv!&_=$VacE$G=mF>8ehxNE*ZfN273rJvZeu>KnDv@zV@HL!kS1Xl)%HrV2{I9 z!3stapb-DjN)>Rw2Q-wF{1CS{@a~nv4O!kxv6H-qXF;PDI!M^><3T&i%}*%kYNQvC z4`H7)&Rr+9cN%?K`ByiB?Ph0rGD-fKw~G2V zC=Ug%7n>JYuF9k<<|ndBb(a5;zzbD)OFL9SJqTyHyM4P?>qQmbHy#8uHo=)@Cx^vW zd}i&*3M-k6*VJh^QRY{=LSuu0an(BQVFf0OqN9a}WT?`w1i)Tl+FKuQ$z&Vij+UCn zX?MpG-nn7`id01bdcQml`$h&m@ouLzb6R#!WhrvyeD1<1@H1a;MCEFGHL5BC<-oI72*| ztye@aE$h-=Aqbe*V5mY|B(q@~E&*#~^Tg)Mh(4$`4rslnxBg&+JbjVda;422NK4>#Jk7u)Z; zyy&{DVZp7R$;}njl1|EyHo80V8GlU_tCTr6=x*IU@&Q(jq#l3Pa+`5ADPX~i*g0^b z+yb=*_T@^SFp?D{quV{*(d=Z%H*f-rT4h^s`_tNE(q)hdneKtk^)kjv%lcrYRp{*@ zh*=DWmAQ!^75k;pySip0gVAy;C%_dh``!!b6ZC00;r9~pS!gxBB|Ho6hcF@4OcjfX zmcFBA2&X3V#bwZ4*zeJ|e)s9}#32dPu|U-fFM{?C_5JXfll5yH8BL|jxIhI3$~T(` z7<9$xIJf;!M8xqrwk1koNTqtkpg$EE<*E@0fySYa(8L?ku`0Tt=Nv6XnIFxOuMU>w zSM4&p zjXYbOs;=yaW|t-Eh*o-6dz|swHo=oChBDx>MC3pwBpTk$mv#g2vjpJ?w_u@PN@rCs zPGqSg;-8x|Fk!T7TXaDiVT`Y&$w?wV_%$jkpQCCZKN-PMjQ(phtH-%pZB?yu3mjwY zmx1uM^5RT>lKISL?PAN;y!qL&l}H><_3p-`igJk&wat{Bo_kk2aKl$N@K~U32s$a3 zFh8Ub4Q9W)7)Lgw@l6T)_v83SYrjSdb!E-h_Ry;H8{Azf-M&!Ewvn-0h~}u4lU}q2 zk$J7y-@h_`aBYHa#@ltn6enld2wEL6ADLDmlOn47n@?}pyYH%N2DdsYxN}Yj<a)NUa8cNI(RamqlE_{AURr%zqKbfe1`}&1+o2 z#t^5Fa4x6(=b<~`j-nI<-)lq#gt*Q91k204!goER1fuEahhj_+pgGI7s5q`T0atn8 z#jV*Utf7p%e>Z1<=<4YJZDapd>lo<77mTJeT^r{Qf*EHGdOFM!aA|qF=DPW~-UT9% z)F*FyzyOF%iPfOi3{wXaEs7HjWTq z7r`(1jZ%JEX_Q=GoYifut$%ST1-Rtpv%tH6i$JgQPgM(;P@MxHZYr5m{8!<^LA*Zi z95`SBxVW60aBe;26F*-U0X7^ls(Ef+YVMCc11q2gY_{rRZHNL9R63PilI0R>zE?d{TdA^1<nXyk;S2SBUfKYSEP^0DdbE4*!lVtcU?4POfd#e*gne z^fKTw?yd#Y1<2=&u50fv5fA{PDU~^<3NR7l!G}24<0aA@6%YX#P9?iA*jaQ*V)C`! zlDwC7b#?A{m*RuN-QbVO_}7S@Ujdsx@VRg@#9&w-_x-Kj4bSCEqs#U}*AH zr=aF_(ayl{%AL|6#Q=_0BEMi<3t-^hA;84?OFbEn!CjKEsIhBHVm|@2HwGdQJ^ z0de?y^k1IB5kUWg4>Zd+zk$uhpQ=8*KJpGwv=qrhuTcfy@uo`>w6E!l1iKK7&?P8g zdkuEh^D$}U8qu>1(0;f;-SdwDOGa`(|1=0(VZY&luhx%0=OYk>p*hX@u}JWQc~cpZQifH%zta?tA6j3Pq{qf?>Ctv#=xHe4So zP602Q%jCV`+o=YKtS?86vvsYHp?f7qu=q)#*LZUK?*X*zAoBB@W6(!5&fbARH}MqH}+&IhW0w7 zx+;&b-1$A=E4f+jhwq*E*8`uy(R^SqGV>aGpl)g39W&LBZGa)Zs;@E2M}>V zoZ^= z8VLz_Lj&FY#mvva%)VL|7d%F7?*+R#13b3(C0xH@m`5`npBQy5aqWKBqw1WW+HDWW zN+An6r6XOJ|CMilR|E_wT`sf4@noH~FJ99I9Ik-JVqsi;n$tCtckaszJ5OJP+II%7>WU=1V6f%tUThE7p5Wxx zu6NJhp7UjBjbHR7V=c7+ISEgU)Xw;H|r-Ir-X{YxeSpT&lq*J*6^kN+Tol%FY;i!q?&T0Lt z%yNTKh(_KBJ9j6J&1}GapgP~N#x8})c{Pz&9ErnF z-3gfV13kUG#5N|7b!Ot(w|n>lC|2w_q>d90rbC};RkSr=@fx87(!TyC?cUXRJ(&Zj zh!tStDd~lWJh&sZF14%77sqRKGPTYM22+V~kELQsdxs}0ZNfeGGRROdPv5$`H2V|c z!RUK4qW{MGAbd-C<2N75!KR;^juwO_OU6i|DE6n_qgVZ&Ib7>_lsFhNB{Ahh-ROPU$ zSxSxlupY9JSgj4+ixJ9}oRl1LSVnv-=<@|i3obrxJVk6FeIEPx z&Eo9$>rN1R0yvi$6OHD9jp~D`kflzQ7DAikAm=l^w&&eniUda))GA1l$SPV;iN(M4 zrL?zXDLp3#=3hcZ@ZlO~5Vsj{%25>@IC5C@x}t+hr|jD?Y6=%p!f8YlH(P^w&bUi5 zn^PrdwR`F)hH#8XpX-W;gM!d_&S#wKwFabUkd@h3pRiZ#s+5|9Di^j0WN{B|EQ0L%0O0TJDl{Iy7wxsL9liCe2M;}~ZyKX(w zQ1HSVs`FjNBK;sH!=VX`h4c>CdqJP7U!{g8b1!fiV#8l0akS21QHlY+vTgeHUZ#pi zIGRy+{pC0w!EwEt5T@n5?pSVG5LQE0`_sfe-MN=+6PF(RsG-`8K5RG#Tt|~Jgp{WS zGwPT>cU3JnU#zk=k-P?h!21;-O~;BU!F(xEd$zBVu2dNIkjqwj%;o{LTqX-vn{a&q zA?IVKlYwy4nxlcwqPd$RX`-PtBulC|*W*Amh!!@wm7_HS!?_x)Nzn(O%2Tl1Lgse=qhE!7 z@|$)l20KI8Yg?O~FFr1(#npsNX<99|1o3Jg{+{ituv&|Ed`F^<|HbDT`k0{vGsVU8 zFEWBkT^N8kq6OO2DN@s`GDR!22{L)y%$*jEfvXo%Imkc$< zbozLEy);hbWPe?!CGe4XGhxC`ODzHNwIVynrS5~7p0FADsKHPL9ZuFu$)7wCFVJbH z^Z35pMi%gtDw2}9IFj4JQ#`sy0mNY~l)(PDC)efd>Ixv$M(~VY6%r;P$K$=9gWl~s14u?kV#wUqP6A8nj(5v+X_Qe(IN#jv*2^wMCoU~wH&lk>V$_4EdwPyl}{ zYEZSpG95&30h5WBG)^ZH;cpw;?00tgTyl1nyW3iV)^$ev@MQAe3O;w80Ir2#ckeG) zLV^uYHn%l#Ndveo>HOAs;5`HsTfu;T4_J&9ZMKK;M z2UI+_*rT1U$rwh`0wNCIP<%~B*Z%rAIH2%1C3hlgkCs$!A}u5Ts=YYpKi)SWnRcmF z;;{ZjH9I>yl!-uH{a#n{PeTS^4M_l^II|m1Ri^;TekmZ}xeIEY1-hLEDDDosy^hZG zg6}mpj`s{1Et;N2aM`&obVd!|Bsmz-3P83=`KzLUHUXkn?FY|$^x*Clme|?xEzlk) zmZ`QEGZ=O*W9C+TH>~Syuk>a(CpV>(*>z%T-b-h9~UBYVnsk9PF55A#Y2-ZmPgtCkmtM=%O*lrP8jK;u)d z>EAOC$l8-&T6T~@wTvW&(A28x+h8OwAxpVf zG(+Byo{;17m)GeVmeU`)S+Ga)=V@29_EG^P`cVaUlce}h-7CZi%T zIfnt*O5yYPXukK;3jIbDDY<&qN*=zayjgb)CtbtGlAuu9Wszd=3Q%9NNbobQrk)q^ zCD(+Fln;dMO~9I(p;l%4s=|7mX1>WUL@$<_`s}#-%gILjo&Jri(uleYxt;8wsqvS` zyEYNf1$Dp2 zGg&sSQU7fD21$hrC)3a~P*N*Lf1(7N>W=oQ?t@&o~exllAizOpQD#skIeZ_=v z!X|5i8>*Goa;Xxx01Wz`BAxJE7g7!)<5<}boWBa)Z{bCN)Vq(z{fW3~K;I)cfcIRH zM!|%Xkkc=CAiW<+Wc^zc7O&%@>V}`K>9Wn)!}q81o9^jDFs^L~jZGRjq&gvAsUU@1 zbz>CwO53f1U5uzFeu-yvvq*{9(Woz&K{2-GgbPEJC@M7{q8GE0cm#Z2pW#CdDoH-Co!(Y$A@@FmNdBT{#ku`ZM8=ST61OlV>Iotfo0Q4C)ib zpW?2mjO2~QwlW1KQh7l#@UGV647k0fP2%Hhzc9Li4;!REz9?s zKjV%9ln`dJy#NIsMS2b0C#@4=&ThWoy*B&H>ni^Qj_Kd>&?Ig+7wGH3lO=d&eNV%b zDuy#4jB`_b%~#A!5*6KOyhP-9Kb=9ZJGMw@iLn76ykxqtNjjZyV0oE zJwO$_NO4D-L^27n9z+r`kXIzXsh?wfGxMbN%W6Fg=Yt^!?9I`(660H2l{Ii37_ipp zbI$^nPEC4!KLCc<=&M|u?sV&tl&Mu(ixe(7Wv35RC?nRBTj(28mDD1gpYE_4cI{Sd z_e)KSC@OwE@`5g$rgU3f^OFDG6$qd!m5k+58Y|s=v*)QBQ z+Fp=C;umG1?yYcA!C2<%)zLz|Qaw%Td)Kz}2ykU1t#tu#USE-c?9ob6K(gbJeP8jo zBFGdhF*Bfo#UXVz(@wf5ft)VqMOEM}GH?(}Vtj;^u5AYmbnYwoBOSqe-+(Ld{=P^+ z?A>JX2z*Rx_Qs;Zy48Nl4v6{MkQ0^F&w+d)dtwHgNvrS}U-8lFlPJSYFlrw_(!NR? zQ#^L_{1$uCYcSfaus=h!9QtOl-{v5rxRo zzEZ~dk1;QU%-48K9^Q1c1}}#;eU8Xl?bj8naop7(D@u3IPy~LtWJzR`%woBUPSE#$ zC_Kw5G2+U<{n}3)G&xA9kah=4K{P}aRQm=`&S&V{l0`y9vz3dhtSVfiy77WEsj3u|1tGe0a3PLyQm-~N=ZqIARsN>p$I759STy?3?neK zfYOL`cf-(~DoA%qH#4Mk46z=*fBk#yGdO{XC$9Ud7t9HLqWjGZ$Wd+^se)@-Rp2ft z&-cYTUL}w0D_|r#Wv9yp+A_u!`%8you|xr@BCxn7hICH%*1_a^qB#8bPM!2ZoyLCn z{k11rMS|^qsoYGJSbOvMgI{ZOWe?en#boGZq19N-SLyxfl0!+NEkRRdKOg)DYF3zm z(_n>$`~l*?%*+AAwoU!qiH<&c4mmj=tjNes{qUt-+CZI5nUtPA|I~N3=))CGbr$nS z38r@+!bsp)2wXpEnBKS7mJhbIm4oQedi#FO%4SPlKXd3 zp4Iava;HCG6o-=rc8p$^9$@7E`$N))yNNvUFtFSgpH9%*kgJ&7s~Q}dhCm-?AdonJ zj}xj21*_x#=kO@c2X|-M?n;pQHGtH2%@OXm*JtY!mHfF)C#~)?)kqq(&$z+uQzm86 zH`kQC>wV;aFnR}25mfcRb$@kd=HeBK2fp;X=(647n^X3sJf&oC=HA|Ts5gH0lIv~J z?n=YV)x_zbcRXBkq7cdm_B{Q22aBS@D0u%g_QVLpF--qA>HII73D_hIe{dT=(I1I~ z4v%1*%+G^yQa+72E$$UKA?_2b{WE(|PlCQcS`Sh@{4`6?DQHIY0POpO_1)tVncw0; zH2B}#y>v(7MFqwJW63WtFcaEeoojpTFSLLyzTb+{rsUhPAAl@;^IKX8?Y^lcovw4J z3kaNux}F?DyN{)-^3^34toNDPW|BMM9R~}*`Ipu7P%uE>Ws_S9DLOU*e6OvxpO@Wh zWXnE&`ceUxjGeZlCihb&tK-EXBZVM5pFKfRRzAjUgi^}B7O6#`Mev`A>3`gM9|nOB z=>K8ZJ6@?Tj>G)t7fkg$MLgsPC1;#-ou%Tk$po}DQ1HNhM=h~x6`j}J zGrYUwafrYx3*zIOcyrHB2z(8zili`6@0*KF@IF_&ZleZ`{=5yuJ&`8xqx@FV9!x9; zPWEI$A9lb{#{#w*z;vZ4o zVJo0^V+epp3Fgm}n5X-TT!2W4Dm7?}yF6)<2loe~`yt6-5k{^|dmp;T+1`(GW9VAD zpGisLL#%iC%BfGJ2K)Y`-~-(WkbreR807GK61cP5xCTz2nVTYBm(~2QJ!}$1UE$4F&RWR7 zHb40FQS=b{m2gAim=)`EVJA{J& zQ_P(EX6mzj^gCk^xFfP_fS758Ee}SbQ=nDN=5t)>|FD^YC%#&8d0B7RfUCPdF&Oo& za{bVTqW%e}pBYA5J9avA{qs2Wt#g}S5PPP=Km}H`M>gDD_8%oz=x$$3+j9I4B-?wd&qo~ z!)uuabo5u8j>u6=3f{(Ic748|lwFzCcflnK| z6Heo1tBAJwVj6vBag`#?!a0J-1IX*G+!J73mJI*q4J3{_etv|17Id6ygsb)3G$z@? z=jz~_7;2}=`TXApbXXY2avR?NI0L|T`3klR#cm8jJxv%QJ5z0K7A_`kU<@n#5pa^m zjvQNzMjSb#V-VJ}06M*k$5G0R?R$`7x`Yy|W`QGwA^o-XdvJ|UhL4ar10RquK#dRD zLozef@8{n59DT*3T3hRho_vJH2sniP%Uh&@L)zYKor;L-9y{Q+1U5%h;bm;*gDH9o zZmW2Z|0ehBst92o$cEwwvh(xaoOQ%NB5yvQ)o{BaO#+X(ydIzd5bfVY);I2m;X&x> zj^5oQ%2M~$^?DO9Kcf|9a_(TWF_di<<=Z^HE_~(vE8s!iO_ZoC>iaOvx_xi5G#P4U z8&w#(Kq3k|E@-eQRL@--FVx6`>*J@&+X0@2#|5FPS7)CJ=&a6|l{<9`o7Rm^KDfG+ zkFW9^EU~?(mT=HgF$fl~XnyHq!%?6;%{;^1?ZNf zMbi1WXVO^28_@vo&rAdi1DYvlu<_t>yDa&A3B=82+J3IS;=!Ez;ab$m_Ed5^t$W7F zD{1F+39o)`nDkN)b2^`&gw13LQ}tjXuUrTT3qAOSdl`g1v0cRPl)bE1`VKGa;}B@# zd9XiZ!~BNKImR#ugU`)X-U}ikBK4-vc4}OB3$q|4B#2S#uxMXvW7P(3ppQ3K7fc!3 zy$o^@2`_Jlr3v%|i^r0$4Sf)JkMoQn*5^0OX!B=(41sKz0>%JWZI904>Y1vn7R+nZ zS$v9cdW_$slp}%Um2UIk&p~jk_@H?yy8XQ3=CLr$B&srd6cLy0A*Y8GoNRSRB#-9vtT4Fz#z z2+~J`Qo!~FB?1~uJ8Xoq7C&M71vH_7q6Bo9=~k|w7#WwbZ65Z7BdwRP(@FpdyRPc7 z(`Owi*F`yLH#aw-$oi&i3CO23A- zL&`CjVciO2g`<2kes|KW3%WL(35Z=i@QG(PKcw0xcJ^Jx1al}osFeyU=>k<+O8eDV zz2wGjue>jj%tvdT07>*qT)wzijg+*f{Wg^borgzO%b5URX=(pw3pOQua^#D4KgVIQ z^>XC+$9DKVmHp!FfjL@nSik*jE^#eqj%T86q-Qk+?99Vt{!2Kvb^Rqa2SPmW$7{E~tjI>m>*FztmR1c3vp5y2wE31P(L7ogapOg$sk3$H0m(4223Kh$zH+__wv|fDjUbmy2+4;2 zo{tqlYpX~`~baLQ-D<;*Q*o`&Nd2>GE&ZTTk-o zrl%{Rq@{jKdAj>Nf5hIaUJVW|;Lv@4;x{C~8U4yXNq@hGsRnB+>DhX3tU^ChXfhLh z53L1Y^T~naAYGfROoQKboR?M&%27z`k**<7-@?iJ*t5d4vwuuuuVw3Up+Q3V>1vLph-2XZVhDT+>mZT2%~CJcwz~kAO^z2TO1(z^s3Rr93=}G1 zqXR|khqo71_hczmfA>6?nIcCGw)_>G<&z(P6xj6~z^_jf3Nl5F8eKN#o#(*>`gw!q zC;@*s4U(#_=<$nyR?G@319iR{Ij{$Y^QyFk1k$lgixwqcl@O~J#z&iDzc;|4!{XXBcX;=em z=00-U<7h@>&$=g$Bl(Wql#l21>a#$<~a4U++w#D^kG26>YIL+(7iAD0ZS?L#Sq5^#!je^@W06=b$-llFpHVU27 zTwf2Vsjg0-Y!a@ngF)9k?+s)(BeId4({TFaq*k&YUD8t6%jq7qG?R^-Gh@%5B-lZ z3JjLOb~Nv8_c;GCl1~(1=qlM&B^EE#!1v9xBe8!fDawD8!BI@;_mF(Br=U(0tY_ue zDPs?%Je71#a6|b>_5PB%X1M!^$%mnXE?#AGHMY~`uZ&?x#;K{#cU zW-2&9khww}0d9yGPNT+zJ{f|$b0tml)@TH6We(eC?C0vSI4V~mzPD+=l?|{mkqxbb zRd8|S9@xi5{;dly$Iwo6|6gqw+8ry9I;NeMBQgrdXXk@%Y1-J&PUWa9T2C4_oC%kZ zk$`@zIZOfD^S4;v1naQsefY|!f%YG>X z_Iq}d*14S`@e`OdU9HTbhU^t-=w*%1b26VZkGi+ zEWaa{u-3>_HXY8RC(X)Sc`fZ1hwH>NF-qikIhTt>Dt!RY%G__n=gSA{0=)CxJ7-T- zA{6Hjk zcCysKsCYm{$89Q^0)8!{8m^< z32B}y#e>6P_K{28{rjJ|9DjesGb@?P0wHVf>q`q|7d#}0S@7I{_(^x6+B*8dPs(!W zOFq1GLO$u!0rOW4~5>+cI~*F)rWjV1>teG^acH zF>oXCjYV$R&__yK7F_-NO|X#)ouBdo+sb9c^>0n{<$glrmIn&hbX*r>ha~R$vk2og zKzxe<5DEgewLrHF#c$2_S$=WqsmGS05)EjjzvVeUjdH*+!E7e$8XKLj+}#u1wLaeC zQ_{ASRz73ivesuZUJ)w^M(mULW7IW|H+Z6eUCG&d<^ zWz9+a&4v0#te|1?`Nb_dfcA5gQhS4<8a-f+78^u9ifh5Ft~&)>F7Gq7-=BJ8Sd<*< zznbn|O!|Pyk{+Pvup0Wyf<}oirI3{Eibg~O+_;4m6PM&=Wb*dvTpF1dv$&Yp+#~e- zt}Qwn%HfllvgX4O#bf~`O5LLjn}jLGT3`4qz!)}IC1d3&^fI`-NsWUIaKT5%L{6#6 zhS&z7t%&Sn_oI#QN|DwRXS~N}fSym5D!rdiE9BVTY?CHnrw?MRzg?>=2Eudz5Y93j zI>`ld*w)AcQ%%m7$8Dp9X682Vr2%K3yb|rm1xlN= z)w!sX!&B^CiYeMdYT?7~9br)AvZNdtFXX(YQm9o`&hK;Jo+#iIJrS+jz3QFWtR8-O z4Cey)okwt=&k8W1h#Ofef{F-vc*{IMzdtO~y##t)Y%6*Y6_>P4%58ZX_13zRwC+X# zY0zx?!cp4;A6qUmBAd3m4@4XqCFtRTc*kGc0pHAcw%}3rU>}~29L*h*7Uw)DobuRj zu}q^Imh#@6;UAH^IB836M0lJ7Iy{cgdep5s0wpglyJ$8=g-dx}6QADM2F~wW7=#}{ zfi`eEG1=wZKSC_MYJr_p-hBC2@CY}ZO&B6!9X%TOnHwCt95kYuwX!M;R&*(p!{nTv za?d+>` zpH}smx?;KpXYz7cwFTC9(F>On*0!KEpcb$odK%?;@jcO($*Q^cyF2-Wv|qTX%I!bw z5X|ss!${#K0ox>VdTSg69{xuIT+O$;Tu8&msPn!S;e{r(MtXG76kfYPIf=>rkYnGv zn^u4K!y$Qjd6^neOcqC! z7`I4m2_je>TKJ#W8Zp%I+o~!8(t+NnsfB_6Q*{Wawk$xGys4jfL zG-59jzPlcrAu*OOsW@$zDxoWj=?^9$nhTU0Oig`&As@b zK99!(%DJ`nWyl2#8U zB^HSzEl|he>5aNSc%WMpakU}BpU7F~fi2FtY4#Lj1$YJ`Lx0?!Uf3*}@HE;4q+D*s zq=|ohcibtRNJ&Y(mf^70 zwC}XXgQ-P9%7xmMAI&KwR_;e`o>i-3mlUaAa6=$c`NqXs#i{x8x|>Yp76T}rkB$oO z;yJ?snWDI3_j(v<@5ybQQQx5#nXbyK2)@ny#kk_!(CxL+?>-xrlD-K_?pwEUyQraY6e zsK2}x{V#ye)%;4icLAqEnobk_GWTJ8j#bj;N5roW>W#8UHylj+DWrdX&w2Sl-o2mH z!!=*P{$QJ5+_Bi&3h;$v?y6NamAE^EvsAT#@=)8cL#5H>lUpnrrVJ|YvfEcuXCj50 z#9LS8c$9oGDiV4e6Gb)OPibU3gmz;#c>_-MuODVdJo5gxB+>A}Yw*;O(*~A_T`KI! z72JAcIK5REj${ewi|0yebNs_M5U-$}e<7d5S2%%6=&fNr%x81k3PJ2=bbU5ldtiF* zxO_V;`tbZk1Xn~Gnd`ULP9ZVsA)=k3WchCB5B3OO`w9in{gkG&`XU`l64FG%qB=Jp z+N5wXlzes8_--$vsgJRt1vRiKZSUavd1Jt}R>>P>vEXs7&MBx8^P&Qd6?xJbns55o zS>NAmrI)?8et)e8FP~$SpK{$d@gL7w!N}afYIb`dMHPP5agQAk-eb$B%i_cq|KM<5jEH5_yXqT;Do5PuP%4H z3>*4}RQgtGu2t07n$BBG)A)@W^>6!J2 zBjFmcSq_sxXD1OpJdYdb%b^=c;4UV7dKU1~N7}qsll=8*VmHzwsMfBHYs?Q^j<4B| z?BrF_#j^5Mp7#2%f0?b_R=Gw+PC%WmXWVf~JY3Ty!VAvUdZhnue1E1LZIV>M@6_t`Y7aVUT#}Q&THxNx)tJzz+3|InN{Uc$|AU3nWXV_-s*1XVPE?T=#Okj@CVkMDwc38ErEO56}( z!=~ku-dxh6Kk=w?msb31bm+F~JU;{n8&Sd#a5ti8pYg)`*11K|Fh+V$)~YW{TavHW)QFg1&QD zd~vi}0(L01hRPbm^*2{%y`!FJpLhF`b)BY?pD1=l)YqIA-$g!MoH9}mwNefyqZQCM zHrr=w!&v^sMWdb<)~qvF6P>>>Zqv-S&{LSw%=K|g_Mm?%rfcISLEI()Ck-Lp^CLGS zwTV{l=rDOUEqiiPm`1!P-_0pDWMe2@4shTQO_C>qIKEQUgl;!i!m+Gc@)q~rSJ)S+ zx{~+}DtvLbE{}_=|LsqUeY@O|@z8D9?B38Hhd`;w+y}rl9so275M0Q-2tp8l|u*!T^n8fK&V{x!-~ z9ptN<)Y5olG9aDlKA)Mm_9+en{YJ@roLL1p_AwvTLoxyJ@kon7YFecXNRxcg zO9_GJ!x#Fx(=TunS9-pE43V;YB@Ufo@=u%h_VUS-yftK=`G$JS<%ovQG2$TFFl~_3#{`;I8A=y$i96eQ>QqrH zb-P<<{mX1tp*84oyS?dcG4}CaQv|gG)sp$1A$u@}LxGW;`0c?eb`pni{lDITmCn$< zd(Ia}o35JF|E(={;w3wNqo$iWtsThg`2|c7xxb$|_umlQxYP9*&<~qar%|~EpH(m` zM1>ua_ApBhB+5gnJX4z9+xPxp2vtmkdhTeXmgFU}qyU)6Oi6o?58UHtuRxnA$= z8ST&GX+G`rUNPfn@sxT(!aONPt?A_j>g3_n`c>|`^rTh}y@Xc9_i1AhCVP%EP0xFN zATIf){0B$25^YA;M$9;nl%&`W#w}4keT>SNCZ5kvpbD6cjE|BMCT?v#lw!m~a`n4E0v zSq!#n4}5p9)!qbF#l4IhlO9q+YZc{I=7-9D~7Vt`%;9P z3K0aPH%$d10D^IhSIKqUIN3ZrrWm^p%%Ek8)66I4Mx(zWRD;?bE+_K(XrMlufAo^( z5>m8(L<+@-pqXVr?-mZOe@O5`$gMIc^kDHJy%8g|?>!t}Us9ZE>#?suoT4sdB->I} zR$fCQDXb$KTX2tmH{olXBVJzG^qGu8;O#FAi(Z=Fh*TYFc?)dMq_B<$-*_ZrPW)Kv z4_N^*pjY7UcHd@Mf%A2*X8wr} z8@kqp=jltPQ|DE7Q%mf@tX;OcvCe4n^@LdEw!tHQ=s(0;JW+w?wR%R!4~}VyKMyx& zG`K9EW5P~WNOOl$(hhG`eUs`1xLF?GmiEq9Xj?EE8@gy*?bU9o*? ze)<>&8W{w%kLei>sFFzV=T0?BOL!iOP9;(|bLy+|*VxH~#^not@Y%9czCQF7-`sgM zr8Ay(I*c^vlxQ!yEK;+@Jyv7z=ruY_Zg0xs`a}1HZxbk$E|FlA{A1;kJ;C;N7*q!bwYJnZo6X$#ZoJ(>2^RyNeOd zq}?(@w36Av43=Xn??Qvcn{E@i5i_T?xr6pa-{q^uI7BFD1cg|0b$;)e73 zq({xmg|7_KH)%{LyKEmST{ufsa2H8giq0hytuZp`G3&zh&E?PRPc)21Ql_Z;nPJqz>Ta(!Ml09zSs)u_ zrNgXA)73~FN|78WA7S&;2DS4QD-zW9N$uD|LwC;uDBQi?r2gP*4J29;cIus1L`5kX#NW zO~uQXNpeYJ=@q^kD`MS=mtk8}c*GCO?AU76+OO`h3}$P)og!FjI7gD)C|VoPQ)h8$ zDHWHq>5X6id+a`y3D;D2bIpe3XP??2JQR1#%WRJJliqPBiD}{DE)p}DaA4Dj+AWEq^NTi(<1qz%EF$KOk%5eYlxD={b-Tr@VDu5UFIZj zg2n2uZtjDNp0t(8PJ@xzDF-CVc~Rqh;WmY9=fl2XDKX9UQNeLN!NaFyc6;YCvSp3p z$U|gb0{F*5O!~n1C{Go$GI7ch)@GQG6BvkrFm(6OP)c%d?v+ z=fH7UP;Q^aJ>2Ay4~^H|i_&`NqG9~?4SFb7I-?_)vlH2_*Lv=+t*$a;p>8?q);&*U zHSeJj-a}&}S|W8w!TNFgl+STV3KqSFhXEt0y@7jIi`dqP_4SPkF3gY=VsYufqZ%4X z+}YpO%`cJ-gc@^5YayM|n;d9KSqz?!UiZeUwy7quG}mn4x)_Hn=($<#&(%v``(vqw z(sIzd=fs{4T!aO;w9V$kpd==GXe&A+xm-@R<&8WWx3&r} zMbdZH<`WxHu2V)j__C)sIp&#tYg0>5jVwE*C3kD>dX|bH3xa*{0M#t_?u!lN&6xGq z^Dgs0r-_H1SWk~asl79Q=k6m~*VgvfBeQRo7`MYa`_R36eszAA+O&}mk^CQ|H{C7F z*9pOW`ls8URs(CUZHDXy{&MBubJ1upJf-3FK$9SIiK%UxJzx*HF`k>KUFa5k18mI1E zHB$TY#hkmdWJtys_o!=bHnH5-4I?O9G#zH@-x7y&F%bi8 zsewUD?1dz1TT-&eAq7L8R67ou_rVm1dQg0qH&Wv04jxqg;EBMe?2RJLVJ)vi z4xLp5xGHF`x1Y46*_|ew!lx8)u6ARXq(Mx=^SxCtim{@u$@O~S_{OfI7yA^wtGc7Z z_*9_j20^d1WPZu6Eu4_n`0vO5R$@_)*R*Gvj;*G(u8fWh$M8j9*QAF5i_;Ipt5FNg z{w!+=jdib^UrqDvg??~63DqHJ^q^9YO`}fEHZaa?Ewn1W88%tSTN3PwOt6_%w+j~U zZpQsEwmUGg@uneNGPPHDr0_oTI*S>)(e8i%(=d5hGS^uR#Gm^hqbtCVI_x~t`_#># zJBiJPq2=Dn1s_R=vbA*I-F{1J0jhdW3!>~zz$=v@q-M6oo9{equB(It2Rw%Og!#%- zoj+GO4TY3NT}zlECrrl7!yYnpwT8ffY8e7#msUAG&Ofqy62u zN5ua9D6TlPu(lAz|B+vpRyt#g}7$OA?IbVBk%D%K!TS~KNPgs+3A0Rjv(m9$u!H$`0qApRjTD!D>x%>DPhK({rh1-LI6CBH z^X#n+kJ8DdPG%-FOeSfLMvr=}S$l%kBsJM(A)kkcP=onnE^RnvBKxV98-L^@(;NHf z0t~wnq;w)VI5A*~PhPBQNqSHZwcA}ut^bhre4Wwti*K>bC*9D<2npgu8M5I<-2--C z=F({&8vV74rnV}5eX+JC;P_?E67GpT(gb5wVdRLkDjHraHH=P(k{h>yAw=7uv*3hDVPMJ~u>P2MiQ+-lIN_^TX`p)fk zI1kBu{ttLWoh!A_xw7lRod54{u4?gv6Ki&D9HK0zZ+&d+i3`f;9oM?;4^N!PekReX zz3nEUkkNxud;=^Q-FtrYD^wXU+OL?u@4)3T`(=nEK{tAKaG|mQ>0emEcHJA3u8@Nb zHA=2~TeU(KOpcIEql+@1K8}ql@#R2|8Qa+h-FrL&XGja6ivm%jx`kA#q0h-esjpM- z_c`4YjrccUtZhT4u)AwqOhq$IxlDqj7>+jVFm{84>UTK57uu&FLfvN9W?MX-=ivTftCafAAq$eAQ=L}Xu&ncN_#4EJ0v{0#S z9j#Nj59pwlW-x3&T_a+re}6VS6(iPVY_Z@!$Y|cnS8acNV#Q@;tC#Uj`6ySf3O(l< zje$%xRit#C`&PHk{u$<@{ns96E#s*g_yT}fsCBQ7G7+w!?!qq5De%8ss}(p@H_O7L`QF+y(E1pY{# zXgRQrjU&!@Uq`ub=x8$n_mpv+JAZ2>#z?L28dX;q^%mJl>%sZ8qi)6@&V@*BH1d%o zuYiF(7c=&^)l0R|LUf~4i-F<3`}PKU#)Dnl;Vbaw+x}gu`Udb?5&ApM`8=|1^f0{e7C}@NxL(KU16RkZtRxj$mgjewDkJ2HV0XJZ({X5frQ6lIBAX4rufWNrHo0%pXu>k%A<^~7{Ad-{S3BQwiug; ze-Hd0FSO#II7jN=)CSjxnIc1WszB#x+ z|E1L=N1Guo$&y@QV86H8b{TRe+c;?Q^`dEXYhtt7u~I3anMBGqd$l42@0)Uw0NpbI&FT zD^lc|os)V+9*xy0=c`Z1Z@2pFWvJbJbvYVU(kop|@E$krpna)5jy_N6F)ZA6-tmeE zwZLJt0o8h${f9ut+jOtcphQbPy%hcOioz0%HjMz2AX{*Ob-oB#{DK3p#tX!4&L;-t4 zdQ7Wp*zOAm$WG(U{b2k_A~GP?inJ&b-cR3T+>>AC9!TT=V%+S>bQD;HX9%|3o0F}Y z+(#6x^bzN2^zN+swd^rK*_EOS@G3KwVK-5TW#zcmY+}qMQfM^@zS{S^wIDhU)j|6= z3h`!X4@8ydRS7#?8@JqFZ$M^xAFEgYwjSP_4?jj?my`!4sA~SgDojE+L`fPM8@iXtI|1i@d9MAKAKUcIw zA~=VIRfPA6Z@29_Xg{T4F;?%x5Y+J1@E)Ob%k(4 z%0dTz)cO3ZE7@${MU&op2#Zk*U!Z-W{pZ_BLc|<$$eoJNL1t-Gv|JEMSWGLS6BD$y zC5{lY6m$I(Qiz@kK|L^KbB1DA6W+yk+ z*LOGnR!aVycVlYe0=g`!<;3DRw7+zavT47=Sx4iuxAlp#yh)m~0bidyi?aKoGV#xH zoiZsFS-ixKU&3yOga@W;H6*{ONpF^ai-PV{frG4%jU-dl=j@+=D}WnRVEiI3H@$d7 z$um3Kd$lb$)Y zyvdqm9?^ay?hO~PZtj7UT2;q?AGf9tj(i9U_Pe-o?yh}uG&w@Vm}mY-$uckF3eiJZ)l>l}wEi!# zcyr&&nX|1nI~YSFW_RwcVPOQ}OtYk(iS@;AE|-H28TWTYh~J_F+04J#XkY9t^V#hD zG*^LV{!&0Rw2>5Q48xh57_>A(pMyhMzUz!8zHmV3#S^YJ6Bjq`^>Ze<9Mr(Y;b{#H zzHMfULA*omEBZxnbqucM=EjBY9uQ#M$*SS1MQB{7$9`S@Ph}vPm3u~i2p4+m`Td3^OieLF=>XO zpH}y@LzZKw6P}b=6jm@ewXvHnw;0Rv8t@W`+I+nx<{3x@2}f4WnuF3qt5( zq3kTVoB!Jd;0aX=%_%@n-BzL%3*LxGWOG<pQ(L@0_U8 zF?UV%YE%_$!+AwnF zQqAYk7{!E1)ffL_RXZ#ig)j*6h+V%-frW!-L9z9=aHX|=kJmA|@^2k1mRz52$lfea z3dWJstbz|%A*vCxjQfkNDtJfN?Ag5#f7+k^$oRB2#CB5H?yF5I(_d0Z)$1LZ0ll*E zicOWBSCL(R#oZ5c-aecB3hZRe@d|Zzvrp01R-7b;YoIvim!C6gY&Jr>m$ia*FcS3L z0$nA{MmSD0>_omfMghJZ zvHJ2~12}EA1}Q}A9hcETPT`$x?mMm<4;Gf%#pf@zjf__%Kuqe{{_5%%%!ld`)WRJK z6?N6F`^H83HAQNX4+RgeE+8VH3c=GDmz4G6sdkW{!$Nnd*jB|hZ;GB{QYnbiZZ)wF zb;c|MZ-z{N$ZzL^3^L%F_RB+$5ro^cC zQ3R=|YNH~OK3L|owrVQ%VZQXkSz_AVeQ6&ZNqw4AlN722>_OB|BOjMc`q%7`a=z2I zkPlp!)kH2_EI%)|3~XyYh<+043n;DEh-Ep9AdkF z_4|tD1O1Wz4^}{O0=*4Ff1V0)w`6gSey;EuayF2CCBx8GZh`%`AdO*tDp(q ztmzKo=sSMH&PC-|KTXv~DRF4$+5SRb z%ay3kZcH(O&<{~^Z*39ntrsTE|7!2I3VLlEZyDs?+taS1G7^Elb4`msIXd+A3cPL8 zLT%3+N_eLwD2+cpad&oh&1=nOi0hOqZF1_7rJS({60_@O7~&FRH*d!)7WNoA&in(9 zsNr~mF21Ef-nDo^Ky#W?CD)>uxJ9q4TW<)X>9WWWB`l{zGtOIp+gUfPr9;Lb5ipJ3 zL-R3nzDrwE{$G{m`5ljMpXbeOe1{6y>MCY;dLMxyrbo(=y;s#Vz8xr?GE5Qn^c%mu zDmpj(biswG%(sBAVpWeRXnKk*tn}Wb? z0N=tUOY|7DiBo?Fut9;nS~P0i^o7%{8aRsG4!(eRC;jX?_mL!7=Y6c8Qn}SXEK1*h z$rb)ipJUFaGPgI35#cuPMx_d;-WA3Ko4D{w=7Mac9G3aI9qm_RT|FLb?)9?iZ$k(S z>Q@;@1rvQy?ha1BBf_oLOJaHUk2@x!3!MFXMTA@(78uE&jk-k&k>f83NMTs7nj>~n zA06O6GoBPTaMNv|^-yzt=yvxXIO2+D+r6H z=9BgQ^yoNhqdSR&Y0pCs!4p-x!)>SA95t;m6xdQFd1Dx;p06MSSl3?2@1{rjT2(&r zuQk&MC8r~@)^hnlh52-GZ>FwMn>P+cQ}8rTv|s4n zlR&{A;%bpBg%RYzX9=Q^WB?;Y}x~IcwtP^F5iIwJAKo<>tZ%d3gWQlSz|0+1) z@KhL1&_(yp3i<4>&(XEuxMYE3Y=Qa@H&L|3K95e}(z)&UGN|yBuvQZDOTsse$X{yQRLymRl zqOQbjO&W|Om<=P%p1;MS7*ih`RAMpMv-Q*`gHSwyoq~@|NsCg8l#6v#ZSRYFKq_7= z=guiH`n+r&$O_e%E*6ANTV9o&-?wAZD*SXykRG1#jiN$IDj2?)CF6SdL~OlE{GY*Y z9EVRvpQ-S50(YC*38j*xMiQ2-*n+EX+0P-@q03eL+X=Bhi$Z1n9ZoJ`#1^ zdrMF~db{Xz%fZ9V_x(r}gb^r3KbJJe05dkr#sqR#*ANo34XR(%vSq__+6MrrBAJB4 z;imi@4_FQBU)s$#^8a8?FhRdF#aGUQ?k82?hc=gjpY1Oy>~lX{%9e}l-KO4r4x$Dj z?uSR9^u@GB+omFRvmR$j_Z99ms0avpL>_4ck_?BU4?jtqfs%(%I|*y(SylJO5&Nf$ z&H(i+To-9iFgdBxK%RggmsW&1h%nH5EAX(4``lbu_N41z1_TC++;DxlJ2ZpvPCq z9E+(nIhWEjCkIn>C#bB87MyQ_s^D^NzM?6xlu~KXO!V&{E!I>F`CUP;x+ghx6GfkX z76uV*ZfmfP&l^`@&s2#Oh^_V$ucu*kp*wxe{Fpu*wQe`u9G23_G~13!Z5Z#>R|uJX z{!WIPIx77-+D)$qy3p#*cE2X}ydt2)vX_AIZA!zbtX=Z`>cH?MX`2oB2*=b0x91hz z3Wis_O33_S4TCm%d3$Lxu+4UTiGlPVy>~C!ml+nRwf<9^xZ?S`C&1*rqc|;FJi)Jr zgV1w_1X4@wQ5|81vZdveB?x$ok#b;{o%6E9bR2poZg=iRbB&bAviaWC;rr`f&`OE3 zYorO0<=f*6>AFyRmL8KAs6bV5>Q9(jV1r(I-*oYt@=dtXFd{8Ox7 z^HM_eGa@_cOU8^56ue|T^$b|e`PBaThMeD}5x= z{1ZxFGXYswceC*|+wrr5cZ4x`nld#P(TN253$CA=>?MD8C?`awSS@^4gzhwABIOZp zpm1M$rM|d_+t~vr@oxoQz!nj4wPUOy(`U27bx&>1`F^$36fyHIPyWX2?5ykVN=mva z>wTU)_E^b!<@4^lyO;X+ZJ`(`+_zQ_!v|$R+Z&{al9GC69|8V9II2vZRobM~QGaXBx?8_mBgBYSCd~5+kH(Pncg8cbt z^8?RH+M`c9M+c;?w;}15#4V)a^M}$`396#Tp0?+-jj5;QYHbf4EDI1j=uCdQjfc(n;db>af~khF{_dA*ck|HczJLFY)od$eX;NHFu9h_5bv6Yg?&l;AygH}ia#*Ez^WbeA zg-N2Mi*l5@K}uZIvs=n}&so$bD{R*G$MRoxG;c4~?SFqT;b}f2P1Wg(hi^gkg?L?x z?CoKW+oJ%y+74bKkxQqW?u{2M8|*$a&NY0%e3cP!B>q)nxS<^~E_n{CKj;u;!EIdC zK5-JxpY@ve?RVWM_}ru@FKV|oWWNw)-f+eMnyD18r>ZZ6dC0l%xm7ch!D zDDhs#f7mYWIoC?N1mxBuWp(yW*Y}IZJvjG5@*QJ8Ee~_9&d;-(;BH7N$GNqt^qrOV zxUq5tip#l@0`9uGyU&t26k;cMCgtwMMRn(!RXeQe2u|ieuz6JMy@9lG%tIh^nO#3O z8@pBNv}ydfn~g>P^*OJ0`(8IdyJXt$mkZpNBPb2Y&%fLjN1f*gybY5!;%G@)&5$CL zuW3Jhex6@_?#l%>TSE@ddLB1A_6akLQ4vBtfU=>Xv*6g#yW@p0k}swY6{G<_WwW4h z&hSof(d`Ze)tC2}lUYfqgaWRnJK^2D`8xfDh2JiLw1->LP!R{mZs8bZVv*|Yw+|>s zD@B-NbUGUwV?r25S@*c}FJ6xy*od>{3#7+@3N3cwVn4wvqPBAs9K@d#T#B6Um5A}h zLWEl{psmk-ZRFll)lO56^>aYzT2RrGB8Oe77Z;Uh%O^DE*p_I1|835*XIEUao&6I;iVp4C14!NQ*BXVGpk(i2CX$=Z#|!89#tLmc!1BiJUY#`W>|@9mN&R2w1W&O zbIQenN=sYuVUR2cNlaGsgr7D|N?SF*`6Tb*VKhbjsp+S##eiEh7RIX@1Sx^(LW_lrI-Etxoo&+?Tq;zm`9IUmJTRZu#RR(yyB!gkXgyax0zW{?}3g5}J|$EcC*X zmHtm>H><2neB^}#pYc>&tAMg;mk-+lTVRH^C~ZJYB;x#vph>0{1Ql#M{pA}{p&T7Fa!W%ul_t8;yS50 z(N~;lPgtH2O6K@M-KC`R=KXu|^#$xt_a!sM#_mm6 zmEY`6%oC3BuC_LsY`)s94J6z+!E}_QZW&dIzR-WZ=OkOEIqqTd zV*b1h$yxdcA9YaL= zOKyEO?cj+r;v7%)*s8J)$!>M+qvqCmSKgW>a!)2dL(kyb8&2vr=!Ha05zHF8z2%x_ zB_^Pj@hCfYV>S&SgOA2IKk?*U=#*{@vz&Ois!ZWbgwda>NL*;H5Sqh}J+~$Nn1n}x z1qFa3ezHhAAwA;6alw`7v+1cXh5}de(Lvy2bDUgC1hDL(6CtRXqcpAk_~TbD|$lPbR-jzM8= zOu|P7!zC+m-SbsSn&U$BJ}tc+EC1^ACmKJC*GN%}WAMyu3`zxFffM%4&a~N4Q)(VK z!1g>iYsdGQh?W}O#$l$YCWzfBj!4+f&Sy`ED%vJrWon%`cCr3v|=MNkzBdVke@cbxQ&C;9gKigMhb&SQZBR7P5g?d;^<)>9& z2@9S$PUkVy;2{9p#^8g7C{r+vwH>kvO9bL$&H4cQrv7IkwSsr)7+G4e(979#AGQeK zF?6Y}Fsfa`thLtQr5I*643U}d0| zX_c$UsWYmD7xE6T>O9hB<;Sdmn0jm>w*@->EeHq+V;d4sSLC=FV;i%)}3*66x5 zc%P?_Y~kn&(nlf+xJZ_FQ(MT{j&kjYoXX)`tMcLBL7+QzZqlG6M&<#iH`s+W`V6Bd zqh-MxRg7#}TI#eM;Q>6YC~UywBi$3p3iiy zd4q9nX<%v#l$9R6oyX3wHX%OFH|?0|1^(CO__d|?4DW)y3$2Yv+ZlE!+cVmodrP%d zl6eiP;$wwFn|5j(wp9ExWjA|@Htr&!9Jd?xYSvt39*(8v=d&vNA69Ggj9^;6gA;fF zbv1!wUF_{VpB8e|I1bGs>Y2XU2)gY{H1FCoiPO*mi`uTDVSPZ1pwST;Q~<}}U=(fS zhZnAfB6k(vQ7tU#4f`rM?5*k3Cad~qdK~VU(<0Oi+;^R*FKWo(*{H=ebdBHh+rnoU zQ?a}#f8 zt33-G4iMPiTY$nzTmSCOVwRfkq7yRikz4&w7}OM4K_?L6s=*G6h`@;xcR_Pl8IWBa z7VqlL=x8#r^3xXT8wyc)nSw+X;Yzq4hGFF^#&g+yFbm~CzcknNDVW{SRvEwdsi0A^#Ao8R&jL|&oth)k~55D?3DER=^p zt6yrIBIQRY=uJiWXyf?mz@4OA0Oi(E16?U@W_IKzw-LGFIY5Yvyo< zT7}C&v~u|5_-AUbwY7ChZZ6-b^X^nA?PY~MebL+(=Pq+-eT*ldiUP9iLFqsTd!s6b z$pkG51}V2_kNrvP(T6H?NS~^ytl}5dA8i?E&ZBufB_ZTNt;9vtO2q9ehBAHYxlzH8 zd%v>iYNmP$1;?%7!HfJ1B%M^SZ$;rryz|8#98(G}0%}6I3$LJQbK1Vzwy{+EQ3&=I z$0J%5Xu|M7rVwlnm30T0AK~{ypmvyPp#|{C_tB9NzbNngh0($%Q3TlyQ_j%GypqK&7SZUTUijD&7T@3D z0{e*^LfBHSm6?seIYye--t%ZbkAZ!-8=9NM_y(VmP;{EVLkJGe_vKPyN22UnX)+l% ze+4uQNjfsf7lfxVr{%gIG@(Paxmu!K&Ld|qN8DCn4g)G zv97R-U7!78xyiHvj?%Y>(-k-LIh4ahc0KZw*TEJ7^GB8E-u&!Rg9?ojCy?GOuG?VubRZu45xu3%G+P+HSB_3GfI8?bFtY1J)! zOqoN=bUAP_T3`n0+8TyA&VQE20y{LY`|D)RLcQftQrc@!XywJi+>en2SP9q13rTwyU8Q|(v|3_9Tt*! zLUnD1xQ4`az)&_dEi+gqNDf!1>lvU3$aV_ynIR6yYRzM>mjBIX?*lbZKxIcLr>ysx z%{yg@2mXN4d8Kvf`3Lh4SLdkO&wt_Nb}AKDjGw1gr@VAKjF(=dWVFit=Yv>bqJ@UV zvHi=yWi{tuQXmy7Z`9Hry?QDXvAWP2(a!+{BFR$3J{n7 zY`D+(?Af!$n->q|&Olp>CwHATR-V4)XO3gZUD^|!sxI}oy8nQ*wus72=(IqUme>S^ z*=8mJ^RMxoh20qp=44zDi`eM&X!>tIcSVpR+w;8j0u5O^nwBeG!J>Bx&@jSrB>-}$ zfUu(!jn!&Ot6(T-3DXkXO4!FjmFtCEN5dH9pJzpz(FpFU?O}NYZ zc)jn5z{sGzN*?SDS0J*I1TKiEm^u-dbhbQ>iC;3ZJc+rGwY3N9{t)r zEm-u;fU^lO%mHSYCVhNFiI6$4KhDg|+yEV$l9HHmJO9yki4gj+7xEDf>_D^vmP1Bc zoG1AQ4V}Q_x$aiw)ps#oUo?I_4-=kejYg{vOK27VR!e$1=WdYu#sqq4Ss8#jK4clC zh5+{V8mSD=!xekKNLd+g1ku?s`6{XQovC_qJlq%-0oH>4iHn8;sBIV^f-w!p;A><2 zow&u90QDrPn`UMgOG``rAC?bt7}jAxs4qfw0E<67(i4725*epwDrfp@0N zBzSN}s_f;V)sMBYw6l|wUo`$n#KoI$OBU$dK~|taCv1h|!eZkDJZ=Y0MnC46j39C+ zAoQT%udS`Uoqof9YnzzbeDE`EHLjLyjRJ1ALA75)(3(7usHB69cN4Bg%br`&ppH;B z8ywV=ISN+bA@`$2$JvSAv|T6%^syqNcv&YvSH878fpGUwXNt4o#t_TK*6d|E$@kPb zy2W8YWyG@;-;oS~Uh^j;xl|}Q5mW>BcA6Y#8wQsRpGTLJ7(diP9tSUcEWGcNfx2p( zeF{2e!_DvSzA@rsD0~pbXbfFvefDX0XXcxGxU$t-g6El~vNeV%G08=pGY39@8Vs2B z9oS=C$_x{s2J{(V72w)VH*JZ0iGe|-;q|$avAa7X1AiSkE~% zl98&z1k*4unVLj+!0`5pu?5UJ5~WdI(5-c;Ozdw?!#30hQfHZVkoKfoN*_XJr=7m~ z>m+_pFiwwbRbeMQEO<-H%e!-pzFxGRsbcD35f+2 zec1uohgwmnN4`q;$+O{?4#=#*2nrDVpzG zj&>eP!)l!=CY=52<4WU4V-LVN6MWD_(wulqk4KY-gj$EkGemkAUeTlzGFG73SPTV$+&DmdU?Y6(5+y}$PJDX!Jh1d7djlaN6q?D_NOD-PK-G&psXu#P1xmPXQG zpuPbTWWCa>l`f(0?&i3#BIA9ytmBL@!1H52`^;1fbU^slGqhkDehjY(g6S`ms7?L# zCyR!`7>bUgodn1AM~qHoJ;Z#%!a<^Qxx+bg~ z&O!^RnW)Eo*^AN4e2@P;Egw`|oDcpR*_!hpC2U5YgO#Bv7>icF8YE((ZoSjW*6tS~ z@TQDCzp>PdPeLA0(1k6AO8s79~gAnx1gsJIR1v6g4 zoC=CL^%rTfk>nNYUmpBFI}?PuD%!C@^N_(fBQ^5FU5U<0abY&0Oj4)sjT(UlF3iaI z;MQR7SnKsQ)vX`)>3|}GCSu2CGfm+v?gnJKf|Noi{MWBPGbD@)iw&3UaR_{vOXvDr z3oh(C@NBxlcgVUm>oPNaSr-x3!ca<9B`V=%sjKDJw4%>p{=H7n@u^7fNB!Z+7_{F{ zL&~(mW;6z!UBg0m2OHzZO{kXwZJ{yWt`FuZd3fkL!+Rjzy5ZezX8#(9-L6kJ>}HI6 zCaD6$L^1?lH2_|dJw{B2_`Mxg5-`mW;dvVC6_|ObdxLe~SCE2-Xr+weMS*GS?hnRx z>iqLwh_D1W&OO_r@|sv1t5lPfmF-EzE|M7-pr~c|cXK-hVNX@n&juCWgvSbr z@khqi%hqTIIlH=QCRX@xFdL%JQYKvtkwYeVoxyMDF31{#K5ge{aXu=MB1rAx+0j^k zMWj)f+jDRe3deT^nt+-r?mm#RTOcVk?~Vj)hV1cSXxgK;G8SZfLVKZ$HgsoUksc?q z+n8`z8Z8$NW|Gud5m%&>y28rvM^Ln1!t&dTyrm@3fO%?l=jKmS^WOJcSaYAPn!a?$ z1Ip54B6t{g&khd?F8k)2G+x4^8H*ufS5umtG`bBL&Cx5rYG(i031lH|=9w}$QNfJj zeM9=mk|b6lFkvFTSx7;?MxPXgugCqxU-Yb!C>fOxuW0G!iU(H_tEr+o70LM zQ%6Tf7Y(XdDEN%gp%m!i9AT=D2>S-~e9$SdV)1$5bPITT!2kftw1!f~1(HA7${J;& ztc{q=L7QMBs|$gy}h4NuUV|MqP>F{(iidBYE_d;jE^f zzkUlE`v5&hD6eMcCsGVp%XEM85il$?-rrefj};e=uR2`fWObY%`}e4#t}z}^zXP*@ zeT@H@iLUQ%8o;^73LDNhB`$ojt}t3ooC-Y1itoL7Hx(z24ou*3fsBhe9Q~e82GWS< zfz^vL9Vol$*WW2SnpcP-IwD&gHudnvl|dHlFnj`nchG#{<_U&$ryuf6#APjX)sXu8 zL31)zU?-+?)XH7csCE+|(F3N}m4{9=*uRH|Y=B*O;)Y>VrHTq>eKYr$PDN47V>XSJ z+D46FsUrZ#kV6Pnjq7uws{MFI&aNrMCfU7hWt~7BzQUb<5d)kMxT!(^cm|U5` zU?k2ro8<@3A;{&&k~}!`8FW`-UuE>$DJO_kzHybc^~E_lm=~j)TfY>Ucd7ybskflu zY2OEI|CuW@$urPM(}a>@MJA|iktpS790EzI^Vnfx@zJ_OC*;QThU?yibk!*jRs@ik z%e`iE?);=8m+A6@PVm{79xCh>E^dYUdxT)Vg1zZ-l&9FS3wei8kNLh!tmQ60E)`l1 ztIdpzDXOWh_2iUGU$_z7bjdO`{1iv8!s&U1#BkS-<$3cuKT<)%8nkd_)tOszf29wd z9xUvqspOdX|C%Y(!VRAL8(x6^erE-pV?_vwqt!uChQ_t8R!|cm8kvByL-L~I+6e3j zn8zz_Jv2;zc0>{-b}#SM(O3k7ddX??BOLx}J}?mHae9JDw;<(DC$wVtwQs1(Jd|ma z{N}d)V#nw*fB<;}fkYARTc1^WBK$upKt=|h)@Xu;(FaoV)IHr{bPC!+W`QB_rMukk zaqnYUIbSt$^qKF2KcY=ctQZnT$3L+`1jy@ATkLi4V*G=jcC!5*8ptvo$|REu^ks~O zv0JzIe!zkEO{34X&o}VXT>M8ud zdqF9zlgXEg)1<_0k;2)zF!h60M?l)@*QU`?Mz0BDA3?f5N7)Y_WX4*S)*Xn^aO@Q0 ztT{uYFq`rQ2;j6pCC@iBo5B3~d>h`Ory-cN+`3f2-BG3qwi_6t5K%OD)yM@T|G&1? zBuZNyv7({n$$++^N)|JI4K_Rq2GjlZWvE$avf=yjOy>>z745?tgmS`{j)^ zaAP0Wxh%((dY(Q4<^1(!v7kwV-Q%%}(jVfofqx%IqK-NyxDsWBPf*81vU2ls3ACJm zn=90BEzt`V7pM=o6L3~;DoYFUG-OcbPNnt^!l#`T&f7EJcbx>VN1y*S2(m$FLMgM& zdTLR#-p3@-{aWp``4;%+fLwlNN+3eae%Hni%?9G7=fF_`cjx-n-X1$KF)=8soR>JX|AC{DVQ%@HCV0?h<^I)@?-Dm!BX1{XiGQqO>>Ke;VKaK z}O}vlKHe!NKhN+2gGrqcl4zX#0&!p9#!o-a7V^UNk-@tS!9(3$o;Wt zNpcNf@pr|GY3?0?eGw|XOEkC*-NZ80ld1r=#1?b8(yVJMc4p(`SUgs!H;#&nMjh-d ziX{At&_DG5Flf=xRbZmJR|)r!NNad#!@6{oG*MCm~oC#(%l+lR$ z$ZpCIp2leL#nQ3_MHs)kny_#X7$x{%%Q?$L_Y&SYcj22*s#Fv@{ul4~-eu7yh_ZXb1~mShcnrX9)6GQ720uw}Db%T3;!Bcrz2W6GYSuFM z@JryhZ@OB7GDJQ6d!@QW{_1rz2v3*YH6?Nw7J#SeCNd5vK-Mr>EkUdcly|1lS0ceq zci^Ls`o8pl=(JLEMsQt*_r3(_7l{``g-=X>NOdy*eb@jwJi|3sHK_hB>a;fBs3A&4 zT$PhEuR#-Tj#zwxhZC(1MS7M6Raw-cBqKqzU(KHGn_bc`3xe>e@U#1x&lDy99x5ws zSTiE=A2d!}V4;M{mzWKeA==|bS#QM`ra)~Kikisypu8N1c`vO#VWh(OI)o?O4@n3a z#Uk9?+(>ZRjblql|LE~97?Su7h!Ck%_;G(>b+-$_YpQvkf7rh;z8za~`s8~hGza@DARA{vEKap2 zaDIo2yVT;zOFU1dN=r&Qq2qX_wTYGuy@(ft?Tk7@QWa0npMAy-U6V;wW5~D=Rr$4L z|1eqn`$WTd*j8()61+d*ojh6$=*;nIv2$c}ltU#lUQiDa_H%dmRrt!!{Y}h&Lv{fV zH`Cw_gpeKEEk?ILXB2#GK2)&Ixk7^;aRXebr+627@|-akL_#o|5+q$C%N)-ttPYjK zy$Ze!oQ3#nhNYN*nwRzP@PL3FOWavvfPn)T)xXgqte3Dkg>A#|g^t>k` zD%$Ohy@!Ha3c4TKL3LijTm!oIA4Mor6A9Pa@YYI=P!5Px|59u1Q*Xrm3MW}GHlhx` zL(Ew1VRHn(HZ}EMeTRnNLftsD!XsxeQ1My%RPQIT=dFOq?2>kFazQ2VJQe`_M>Paf z;g5faL~?^)SUfxEWvK%e;>X???@=sxHT^Yj{J(n+h18%Fa9fFJ%0>CH1rnK6dMQ~y^#Fy+J=RRST@+0CpJTdg1;pU ziQ48T7GDfMvY|d0#~Qv9g}1h)_>}!wPG&<05ZkqsO!AQMp;n)UQLp}{drq3{HA~4MXjDHOsKz3uvW+nr%yb#UbAO&hS>EigJKm3zbWTP=h*%P*ADLlWo6%9ul zwNnC5OYjjv@LFL7?0!MWA?m;G#!CJ3HbMA}z6m*&?Unzh5JBq+FR$sz`R!`(q-(T%cpa@rYIgg}dqGSlh(Q5tCIA5cqA zr!0uT5QCS9QHbPH!@s)%um2MO`2VM(;vo58-~x9myYnsIG1pps*JUqO&;In8z$9Vg_ ziQiE!)OysQB93#LS1n2SP)p7cq0#sV7l0eu0jogt37Do=4s>J-#Al@<>>)^?2pYa< zkiVAi?;tuM*I>upN@mf6(pfoeG%LXh$xvEQ;PT_K4S+=^CJf7*x7jEm#oqU1q=Y|5 zuk_XK%Ag#?j?*DY*O}ybavf~>pgtlLH0ICWZvzw;BOPR3_zlIKr_AtAjK?mos!nxEB>mB=%!c}~rhT*ieKJUx@3d&H z3Pu1mO}8H0x5w~8zV8R+p8h=1!6$YQg>?;j?c5g~q|AF&+dCZN^?IvqdD%XVjlo-42M zsCiU5@3tlbAMESu>a#!AM&qC$-b{G9UgkdokU|ZB-F?UM6Ka+0A2FKgeKM#{uc?ti z9XY#20nO8s=}d*TN3UvtE7(kVLqn%h>;}&6y4g|>$$RL0huKxD@ke*cFgw6XH4D@O$E9Eno45ozXJtiE=tnd5vDTC=`d6iWsg~wt>K0M%|YI zd|ebcN08GLV>%PZyfOI|J66J30FWLxzr66zGW{g;xTopD{k`Yom9E|mq4YAk#UGR5 zMa^dG(nlNKsvFNq|H>$d76OPIR3VOVUQ4TAi6{_wJRt4W4fuCeAAEXsA9}568ENL^ ze2MLYMWr&p#7q*4KGgR7@`K z){^|)LO)9kFE6hG0BgiTKUJRP;B#IlkdE2f-cGG_-NRFC>>CgwT=hokqfCGgi#>gY zkY7_-TU#qIti{L+sw~lKzyD6@UK~RmG}|^msmP)=j|0u~fb_-&r%Ot8(Cd%8r&1r_QyN2h6VES~Mug`J&Jre%l@ePx|Q&@J*p2VQ18F zoc4XlfARo^!ia&uHNboqv9i5GBGE4C6kLSkq#p9D28n(tm`*fDQ!gs~^&aV|t8a z=O2v9FDKvnn#|@~X}5iiUF|YEb1|olWC^IR$(A^QR%Ek|P94)`w>pDIQA=FTQP_qq z36w9WPOg!DFS~@tDNXFr1&Z)K&PZUR*J+q5h5pPocw@GVxD0=N-B#wBXEz~ScwNqyAZ>45S|jSCN6+Vn z>dIlvDYQ8Q4!z6$yqyEdRV*aU3h(dbQ$b+h#uh^YvdUOu&-Y0OTFKLh9{4WbfJ0`7Z*2@`bNUp#*&7Z^RITTxrTAGa$#v$+7oEJD2WTWRlOtul5$RCpY}denxOERWBA3rdwyv8tXDYm-%C0@nXn zD5vCnb6^xOgyQ1Vfj8jNxV1N`V}=S=*;(A#ZuQy(eFa6` zG_nZXT;#PIOZX{L{$Oy;(|9*t{4?a0M5Gk2SjD`9^eT-Z0~i*em`x#_^%Kts6x%L=`C^KjH zFuPWY8|B`7;Tp^hhM~UUXt;Xy>P6RGw;3rj0l2MOe7QqhyHP-v?u?(^uj*?fpd%R` zQDSxrE!|#Uvf_UpO5_C;xZgWd4e6#T^9j@^| zHCew@^LD6g!DW4L^l*4|bd;OTf%?*g=Pv@Fs4U<)@|Yl(lDxcpdGL&Jv2oy!lYHW5 z3Ut1-4}1sbe?E8`KVUk_*(zqbUf7i^D^BS$@g5H`R!v+xQc9jT=9x$m%E@D!QEXP5 zf{y35|C-bgL4&So&ro)6R4Ful#w?4 z6LPSfa9x#@m$Sk(H1vRF_zP+oQLAajh;hEG%&OLHL_D7`=JKOXv7ZCXFn8EEuRW%> zcHTT28ym>dQs*PO3#stR*Ii$4J6?h-bW6H6gi&1M!`;g<-4#|wR7V=r{VxjGi}wiW zsSMj!Hs2noi-@ZF`upSF$}PWtbz(;7-`)GhfUbO?lWT}hur|hYnIZetfrYb6kj$1s zjqw*duJIC0KVm5vUxLHpfd+)6bM^RU?C5+)lDx-L;REPzw?gx9F(i_^yzv9Kma-lK zkof4&KJnw=Y{&zw%V+B+1Hh7mt+8jve(xYUqa4y<$imXnYI%W;f+tL?G27G@{-can zO2xxm7599BlYx z{=$np%}>&8*Dl;70dS!>G`|i!*k;4c3zD9knhFBo!eWAz!dqlZg1|qUxxj@HfmZ}4 zQY5dJy72vmBW;3vm_^AL>xL><5oOLOlWJ^X9Vnn3Dq^+;m)!+9Ik~ij==^;A?-?C0 z!l}AD(^a1xL0du>-xq6YdmuX-I|a4vj2|=#A79DZZ5K7L-*f&v`|mz3ozp0H;C{D% zK&dFied`nJ(>9Q)>j5=eKZd(JXAtqyo=hl1=a%j(8!NVj>;5Otn4ov(C?EMIgRHFA z!cZGcL&IyIjjMCx7H5bvIH1G2_<6n2HXr;>dm36=e@1)i2awIw9JQ7H_k}^oK2|H} zQx4#cvnTi&sVc+iI?s6No8YzltQt9Y&OZ1SgAF)SztUGsBSz0ZViN=Q;$`mV&tz*| z%Nkj?^alo=Qy*kCyYOw#NY?}Txl!*W-tfDRJ}db|DUdj55zq!f^wf_3$_8P?lP3bZF_dq_UCAY=%O)x`ci!DS&m99HZaaQ75VQ)u&JlAmBH=B&(u zUH64@h&&|Zb-0+lPM)h2<*GQr14oA(H=QNgA4dnQPOS{VlCFLJ6wZZdL*-KCSXnRG ziXZ(WJ)LI|7bPvAGKWv|-JQ#4M>MH#Jfa72WyV5?5it0O6DLl?741^pRfmxDjk?y) zdsf0pW2Q~09xUe0(m>K1su|3hY!04%Kj!J8jx*F(zZRI!U43&Jf@8!-bZA&OixRF-}-E^>PFs(U5$2Cu|qr^ z!Bse58-4NdI|IR4DT%Je?p^fgd)78Pxy=mgEgEm)gulRge z7QleY(R#r8<~fC57I@U^2e|PR0K=__rnC^hvHbVU_#taR>NP+qL=!FeW=*%Uj!csu z%S~)YX}sgTtCc>uJXYm%f}T8mS%_)+`44fTsgq-DmIs$}LOK-Ow_}n&gr?lxkr9<~ zcXQ*jo;p8C_3G+MqI$UaJVRhMWhndgAW)7>k6Lr5L5m{mA<|)0+!z{}`V08-I5Z>lv6F@%^oCEr z*AC`>t0wn)NsKwUCWWUMYM}_oVxQr1V(?M6#Z@Qrei;ua8={aTQ>PH`^E(xP_b2mN zy~M(5OgQnSPL#044Z@^rr7nq_B3Sy4iOW;HaYheTUjSYw1?t_(Oq^JBn-P-X=zVs3 zVD-ORTA}8NR~#;K=llMJ5YQ=IJA5Ms0*VuzwcG+y$FnVsxdjCj)^6lsQtpQjq@E-) z{d3)@FjShlHeLCm0%*f^RJU2+w&8!0a}zE^Ar+m=H^7eZv6# zJS^fRtY&)7RJbv+To-kgBgeGwqcU*(qsM}e`*Q@@ZLIu&D`+hO;b$0hA{9_UqBV?R`( zsvoG-# z=zvw``T7FBl#AiGVn&_znS_Z|PX2pmr8wTppIhJ*UV9POLFRlq*wXLBb8?d-nwMC> zw3RuOQhG&^FnDVBBM(+U)xqUSoPsq=U-nPq(@CB@9OIKO_982EK$A?(J3~G;s~t*d zIr2XDFs5>ihI493aTi6ac0WYyuKjq~*xH4I>x{0etGk$2TYAy{!2k2=FC}uG7oiYD z0h%077bP$W1zE|NR!yv_-nUG>J2My(Ho8a>1 zQBNIaks@b~<|v-@l_a9p)lojzMIC3${`aD0UAd84QqK4UMK(18rY7Isi&{~YAKadrp8B|!ABMR}Tu74a6W!eAs@yRl>y4Gwt7T&W z!i1mnSV;+|A@po0w6{$$tR>6M`=QVlt6JE3ONgWN9H4Zuk19KH!85)JDBa1~EBG^N zO+J6TB4q?%NjR#=DPR29kg_V^S5wx!%@n6s+9D)S=iS)xuKb`-ZuyP)%%nIgwY_4V ziP|jk6hrX6Ciju$;`gzVKvFgR5|&S)^rAGHD>vTQtKsJr46PofK6+zggU)Q@;iNji z-)T&CbX45T&pu3NQepLt*nmme)$8bvE+?;O5L1Z%-LDbzcF9Wq3XS}vc4fl7uDC1u z?hAa)L}eBG zG%*Q;^pA0qhU?Cv3CEP*+W=#;@Ieb@fosec7wFPUW2RRIy zEr}6!(o>BJr}iyX*=y0w=@%|{r95PH&fX{Wz!n#JE@g6JGjL-!tWB`c8+8gqH%z~f zIvpNS2J{G##D$a3_&)gJs$9hlw%fP-v>lA}^mM4_%2e{~#ZAqT3}aW9<<1Lf>r_OT z)tb$>-`R+j$5%M_eKtXF+&NA2>^N59|9Cr#_B=$l-csCqzxWLwThVhc{InziTd7(_<8@D$#kJLM5#76vZUC5*>9M{JHBqEDr>&yz> zt#XSJeae1#lww`TbC!@`MMAd2Xl&%VcDX~yi2UB>CY7;G4h`*Z18Jg|S;n|j?j=#Z zv}^x0f5#JUtW18K@U-rQk3tzh(=v@>PAYd$Hon=?E8@zK2LnHUJLjtK9_hKpDoX_-I9Y zGRIc4jMjE0xk+SvVWOt@~B1v0RlhEq(PtmIk2Sr=)OSC)1H6h21GlgZnoRbT4 z3yvdM&)HU((Zzf)%0pXdq6rq#3l!gYzhha5t&w@-Y%`jP)2cg1oNxUUk`-c*D4;FG zFbK!tlU09C?R8(7oLrMZ!U>I#uE4u6n0;%OGZqoK5f+4ejMGW|JV*CuHd{#ePz(p?sLO&aK$FMMWwG4Y}4UiL+ZsvzIoi4M$|iWTw%2oEW@ zPC?lA{>gFq_a3-ZbHm<|5lSf$ATBD}KprB`cGeNA!n$^NwPBCyY^KfJ1oaK zx%BHbMZjDNM~jE*%oSWOZ4!(zMr=XPUb{r zWkhuH zX*zW+#O_uEbta*Ta-n}*r$iz|Hdb)aqkBPufHh16N3Yt0=;_Btz>FjaFg1?riXi9Y zrhIE}NIR_&5IhTHl5}ahw{S_8eHz$*44*yYov%gcf2ols!}S8RKq}y{Z_zx}2qp3t zRGxCwEpTu}NIP+1+t5A<;eUiV%@EPk$>;OrR7TYOBa9{E8iL0U=AN2>Kn{zIN+47JXckE}oG4Eaf0j*7oc zKgDXxdsL+x!QWG8a$MxTAk=zySH*l}EnzUk&fKI=ZR_4=tg$ccaf-qUxjrxEl&nGm z(r%t@wepi1c{#H8EjUTp0^$CBr_^feNViXSZ8~Ty!PB3c*Pxp5t3~_<$HI$>Pdr$k z$xl)QFy?vm6@!J`^V|+>!mpNvHn0B3K_}n2<}w9YpD)0n!Vhq~2W_z`D~TO4`E$Ph zf^?28IOioX&Yk0(oR(CpqvV!_mT-Kg?G`C{8!b7!i`)M4kI^%JnrUv|rO3_jZ1>%%E6u`-0b0+-n#HyLhpD%Ws;GfmdOtVl=TrUXMZKb#KL+8;9BOn$JVH8{Mu7M|b7tLvGl6b?5CjZAZ2T#`SYG zk5H8-vzgrZmb;ubDm9-^QE(a7{V-g{&ZlY-^9=>IQs3;Uo=|Bv8V8Op%Hz!Rkv=wh z5&FX3e_z}_O&>u(YK{a;q5h7%>^akbYy`CI_Mm9OZ~j05%X7_9BIg)%EBKU3h9SAd z1TGk{jq}|^<)bIi9IO1(16*5!0M&B+ei)Y(y5l|62S~?zJ7W1Fj5GiR_=?2Zw=u0_ zq9!n(ER$gAw%3&}VqDsXv^&s+f-F)p(~TEFabhb7mElU%eYZ+a5$6_>`j`E*wNge32FZ z9r)LrcMb;`mQ}F95{@o88p0!+?RxjCKEbp}J^8#k7J(=%5e#aY)qhjr{iE%D8>1V- zbmg*h+TC#KmakF=z_^@p_BSHpiubMP*r65$17>lg{}0>eC=zJ29DcDXULuw+5$smh zJ^U9hw%DNf>mr9F%5s?PKHaTimtc(QRX*#Iwy3E%|HFO z*cFhRjv(0t8!8u%WscI=)+WcT(~=8i^rM46qzq|-#81uji7L577d_NtM&p|*ZWq^C z4%#zJowh0GnJ#;tZyS1^P0W(!A$|wR^lEPzgX#JEqE%$Vh^jYzh0LRDBgV<}nk~#C zUG)#9?_Sxa?aixkBSG5v6FmvtpvzMo%!T-;8D+qK+iaHuO)Bq-a_PCvB7Zc$y>A}t zzdsZnmnC4p>bj#;hdnGD?dIRy1&apbp2}7N6zHf>!;U_$hcKpB z5+#t9s8?3QLaQ*Gmh8!cFTvYT%BrCI{kLq`|NbM_skbUtFaJJ_Y>nEQvL`9zquRh1D_*H46eavhoyrdC@dcO7Ie z{?(Jv=ygvQ%1|hOFMNa8i_ulIdUIN}T2P_iEP_YNAXUJl_AAMu;d!~?@RLnY&_SnMZj%zFwlx-&13gS zag%!Ae@6TlrNat6gzb-v7bD$p)7e={I!Q8R1^|&#Y*~y7^i34P?wwg#SylGilJQ*| z5$IBnd6^EtQpN%tH1Q=Sib>op5QO``e=>HVPkw$%6)xd++#RM;D+O7qh~w4#*alV9 z52%BVBTGy8QZa;G;B8AqOYLc%=Z6i#2qYx`Uh0BIsW=0CZcmNeJUt_SS2#I5BUKH8 z9a&Fj=NnK-j$|uH!Vay39@msGk|Ht`;QrgaL@McFXjgQw<)+c+f$4a~+i!)ZCf{Wi zNlACkcR+WxZu{r~ZPNi~Xgu1j zxC%zb`wh$|Wtvscz+2P<%=zRy)-j(a_K`;(?=E&<0zr5pd?w@D#_ldv5N^*F(-8g0 z*cg+fDG01kFVi_BCbIE+LxD0q1`yYQmQ_-#x6%SDKIWyYr=T(Lxywi50*-vRF?%?4 ze9>aDl2J+W57iCis7_x5SXfxlGJ?8r((xwxpQ?#2P$7k-Fu-PoT9yM6MK^01{#(kI zC`)20?GLP;#0n6~?0cv-(T%>yfwbLkfmwVS z$mJp5m5;!8d*BfarJ&A*;dZtaOxaqi0yg!MghD=qyCbQwEbrOb*+;X9a5b7dZ){#M zEAB%4BFu`pZ?XkEKPY3{hywpek~75iGkB=j1LR0mTrv{q;f$R-65z-9APP489$!eD zgm*dsxa#)tuI4R0k3Bg$HJh1Q)^0~YPO>?tkBZ+IOA0Tx6FiXKK92`C1 z^=M?yP1yfIe(Mu{BvJ7jGL0{=NeCdC^=7 huw#xhDiAkuM&QBh}XSU?hc?(cb|- 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

b#|iIb1Mt~kC7Tl+u_9h-bx0)A!YLtz~| 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 Date: Mon, 27 Jan 2025 09:40:26 +0100 Subject: [PATCH 04/27] Create joss.yml --- .github/workflows/joss.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/workflows/joss.yml diff --git a/.github/workflows/joss.yml b/.github/workflows/joss.yml new file mode 100644 index 00000000..9348b761 --- /dev/null +++ b/.github/workflows/joss.yml @@ -0,0 +1,24 @@ +name: Draft PDF +on: [push] + +jobs: + paper: + runs-on: ubuntu-latest + name: Paper Draft + steps: + - name: Checkout + uses: actions/checkout@v4 + - name: Build draft PDF + uses: openjournals/openjournals-draft-action@master + with: + journal: joss + # This should be the path to the paper within your repo. + paper-path: docs/paper/paper.md + - name: Upload + uses: actions/upload-artifact@v4 + with: + name: paper + # This is the output path where Pandoc will write the compiled + # PDF. Note, this should be the same directory as the input + # paper.md + path: paper.pdf From 579b1f8b5f176492ec97f7d2a06cd2cfc4726d27 Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Mon, 27 Jan 2025 09:42:22 +0100 Subject: [PATCH 05/27] Update joss.yml --- .github/workflows/joss.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/joss.yml b/.github/workflows/joss.yml index 9348b761..e2248bb7 100644 --- a/.github/workflows/joss.yml +++ b/.github/workflows/joss.yml @@ -21,4 +21,4 @@ jobs: # This is the output path where Pandoc will write the compiled # PDF. Note, this should be the same directory as the input # paper.md - path: paper.pdf + path: docs/paper/paper.pdf From 69996df885ce83a4b415020e780072eb5405359f Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Mon, 27 Jan 2025 09:48:06 +0100 Subject: [PATCH 06/27] Update paper.md --- docs/paper/paper.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/paper/paper.md b/docs/paper/paper.md index b7ff6938..e59c0202 100644 --- a/docs/paper/paper.md +++ b/docs/paper/paper.md @@ -36,9 +36,9 @@ Executorlib enables asynchronous execution of Python functions on multiple compu # Statement of need The Python programming language is commonly used in modern scientific HPC workloads to couple multiple legacy performance-critical scientific software packages written in different programming languages in order to solve complex tasks. To avoid intrusive code changes, interfaces to performance critical scientific software packages were traditionally implemented using file-based communication and control shell scripts, leading to poor maintainability, portability, and scalability. This approach is however losing ground to more efficient alternatives, such as the use of direct Python bindings, as their support is now increasingly common in scientific software packages. This enables the programmer to easily express complex workloads that require the orchestration of multiple codes. Deployment of these approaches on HPC platforms however requires developing strategies and tools to interface HPC job schedulers like the Simple Linux Utility for Resource Management (SLURM) [@slurm] with Python in order to control the execution and manage the computational resources required to execute such complex multi-task workflows. -We distinguish two main use cases for such interfaces: either to request a queuing system allocation from the job scheduler and or to internally allocate computing resources to individual (sub-)tasks within an existing queuing system allocation. In the context of the SLURM job scheduler, these differences are distinguished by the sbatch and srun command. A number of Python workflow frameworks have been developed for both types of interfaces, ranging from domain-specific solutions for fields like high throughput screening in computational materials science [@fireworks, @aiida, @pyiron], to generalized Python interfaces for job schedulers [@myqueue, @psij] and task scheduling frameworks which implement their own scheduling on top of the HPC job scheduler [@dask, @parsl, @jobflow]. While these tools can be powerful, they introduce new constructs that are not familiar to most python developers, introducing complexity and a barrier to entry. To address this limitation while at the same time leveraging the powerful novel hierarchical HPC resource managers [@flux], we introduce Executorlib, which instead leverages and naturally extends the familiar Executor interface defined by the Python standard library from single-node shared-memory operation to multi-node distributed operation on HPC platforms. In doing so, Executorlib enables the rapid development, prototyping, and deployment of complex HPC workflows using only familiar and easy to maintain Python syntax, hence greatly simplifying the up-scaling of scientific workflows from laptops to very large computational scales. +We distinguish two main use cases for such interfaces: either to request a queuing system allocation from the job scheduler and or to internally allocate computing resources to individual (sub-)tasks within an existing queuing system allocation. In the context of the SLURM job scheduler, these differences are distinguished by the sbatch and srun command. A number of Python workflow frameworks have been developed for both types of interfaces, ranging from domain-specific solutions for fields like high throughput screening in computational materials science [@fireworks; @aiida; @pyiron], to generalized Python interfaces for job schedulers [@myqueue; @psij] and task scheduling frameworks which implement their own scheduling on top of the HPC job scheduler [@dask; @parsl; @jobflow]. While these tools can be powerful, they introduce new constructs that are not familiar to most python developers, introducing complexity and a barrier to entry. To address this limitation while at the same time leveraging the powerful novel hierarchical HPC resource managers [@flux], we introduce Executorlib, which instead leverages and naturally extends the familiar Executor interface defined by the Python standard library from single-node shared-memory operation to multi-node distributed operation on HPC platforms. In doing so, Executorlib enables the rapid development, prototyping, and deployment of complex HPC workflows using only familiar and easy to maintain Python syntax, hence greatly simplifying the up-scaling of scientific workflows from laptops to very large computational scales. -#Features and Implementation +# Features and Implementation Based on prior experience with the development of the pyiron workflow framework [@pyiron], the design philosophy of Executorlib is centered on the timeless principle of not reinventing the wheel. Rather than implementing its own job scheduler, Executorlib instead leverages existing job or task schedulers to request and manage Python processes and associated computing resources. Further, instead of defining a new syntax and concepts, Executorlib extends the existing syntax of the Executor class in the Python standard library. Taken together, this makes changing the mode of execution in Executorlib as easy as changing a single variable, with the interface remaining the same. To illustrate the usage of Executorlib and explain the technical processes occurring in the background, we consider the simple example of doubling the numbers in the range from 1 to 4. With Executorlib, this can be achieved with the following code: @@ -51,7 +51,6 @@ with Executor(backend="local") as exe: ``` In this example, each individual summation is concurrently executed in a separate process. We note the strict adherence to the standard python Executor Interface as the example remains functional when the Executorlib Executor `Executor(backend=”local”)` object is replaced with either the ThreadPoolExecutor `ThreadPoolExecutor()` or the ProcessPoolExecutor `ProcessPoolExecutor()` from the Python standard library. In contrast to the standard objects however, the Executorlib Executor allows for execution across multiple nodes of HPC systems, which enables the execution of highly compute intensive workloads that require extensive computational resources, as we now show. - ## Computing Backends Currently, Executorlib supports four different computing backends specified by the backend constructor argument. The first is a “local” backend for rapid prototyping on a local workstation in a way that is functionally similar to the standard ProcessPoolExecutor. The second “slurm_submission” backend can be used to submit Python functions as individual jobs to a SLURM job scheduler using the sbatch command, which can be useful for long running tasks, e.g., that call a compute intensive legacy code. This mode also has the advantage that all required hardware resources don’t have to be secured prior to launching the workflow and can naturally vary in time. The third is a `“slurm_allocation”` backend which distributes Python functions in a existing queuing system allocation using the srun command. Finally, the fourth is a `“flux_allocation”` backend using flux as hierarchical resource manager inside a given SLURM allocation. While the `“slurm_submission”` backend uses file-based communication under the hood e.g., the Python function to execute and its inputs are stored on the file system, executed in a separate Python process whose the output are again stored in a file, the other backends rely on socket-based communication to improve computational efficiency. From fbede0bc0345577d99e68d49947c7fbdfbb32ddf Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Mon, 27 Jan 2025 09:51:47 +0100 Subject: [PATCH 07/27] Update joss.yml --- .github/workflows/joss.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/joss.yml b/.github/workflows/joss.yml index e2248bb7..a579fdb4 100644 --- a/.github/workflows/joss.yml +++ b/.github/workflows/joss.yml @@ -1,4 +1,4 @@ -name: Draft PDF +name: JOSS Draft on: [push] jobs: From 572b750aec9af7adb92e8374704c513012a53937 Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Mon, 27 Jan 2025 09:52:06 +0100 Subject: [PATCH 08/27] Update paper.md --- docs/paper/paper.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/paper/paper.md b/docs/paper/paper.md index e59c0202..6fb53e06 100644 --- a/docs/paper/paper.md +++ b/docs/paper/paper.md @@ -79,3 +79,5 @@ This manuscript provides a general overview of the Executorlib package, the full # Acknowledgements J.J. and D.P. acknowledge funding from the Exascale computing project and the hospitality from the “Data-Driven Materials Informatics” program from the Institute of Mathematical and Statistical Innovation (IMSI). J.J, M.G.T, P.Y., J.N. and D.P. acknowledge the hospitality of the Institute of Pure and Applied math (IPAM) as part of the “New Mathematics for the Exascale: Applications to Materials Science” long program + +# References From 8237fb19e225eed0f5aae5698d30de60ada53f9f Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Fri, 31 Jan 2025 16:06:00 +0100 Subject: [PATCH 09/27] Update paper.bib --- docs/paper/paper.bib | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/docs/paper/paper.bib b/docs/paper/paper.bib index f36454ff..2fb0ccc9 100644 --- a/docs/paper/paper.bib +++ b/docs/paper/paper.bib @@ -1,3 +1,23 @@ +@inproceedings{workflows, + author = {da Silva, Rafael Ferreira and Casanova, Henri and Chard, Kyle and Altintas, Ilkay and Badia, Rosa M and Balis, Bartosz and Coleman, Taina and Coppens, Frederik and Di Natale, Frank and Enders, Bjoern and Fahringer, Thomas and Filgueira, Rosa and Fursin, Grigori and Garijo, Daniel and Goble, Carole and Howell, Dorran and Jha, Shantenu and Katz, Daniel S. and Laney, Daniel and Leser, Ulf and Malawski, Maciej and Mehta, Kshitij and Pottier, Loic and Ozik, Jonathan and Peterson, J. Luc and Ramakrishnan, Lavanya and Soiland-Reyes, Stian and Thain, Douglas and Wolf, Matthew}, + booktitle = {2021 IEEE Workshop on Workflows in Support of Large-Scale Science (WORKS)}, + title = {A Community Roadmap for Scientific Workflows Research and Development}, + year = {2021}, + pages = {81-90}, + doi = {10.1109/WORKS54523.2021.00016}, + publisher = {IEEE Computer Society}, + address = {Los Alamitos, CA, USA} +} + +@inproceedings{pythonhpc, + author={Straßel, Dominik and Reusch, Philipp and Keuper, Janis}, + booktitle={2020 IEEE/ACM 9th Workshop on Python for High-Performance and Scientific Computing (PyHPC)}, + title={Python Workflows on HPC Systems}, + year={2020}, + pages={32-40}, + doi={10.1109/PyHPC51966.2020.00009} +} + @inproceedings{slurm, author = {Morris A. Jette and Andy B. Yoo and Mark Grondona}, title = {SLURM: Simple Linux Utility for Resource Management}, From e2c94f9d31db6c4f8529daac4fd5afb608bb6bc7 Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Fri, 31 Jan 2025 16:16:16 +0100 Subject: [PATCH 10/27] Update paper.md --- docs/paper/paper.md | 48 ++++++++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/docs/paper/paper.md b/docs/paper/paper.md index 6fb53e06..1d5afc6d 100644 --- a/docs/paper/paper.md +++ b/docs/paper/paper.md @@ -1,5 +1,5 @@ --- -title: 'Executorlib – Up-scaling python functions for high-performance computing' +title: 'Executorlib – Up-scaling Python workflows for hierarchical heterogenous high-performance computing' tags: - Python - High Performance Computing @@ -26,21 +26,22 @@ affiliations: index: 1 - name: Los Alamos National Laboratory, Los Alamos, NM, United States of America index: 2 -date: 27 January 2025 +date: 31 January 2025 bibliography: paper.bib --- # Summary -Executorlib enables asynchronous execution of Python functions on multiple compute nodes of high-performance computing (HPC) clusters. This is achieved by extending the Executor class interface of the Python standard library for asynchronously executing callables. Internally Executorlib connects to HPC job schedulers, like SLURM or the flux framework, to start Python processes with dedicated computing resources such as CPU cores or GPUs. This enables the targeted use of parallel computing frameworks like the message passing interface (MPI) or of dedicated GPU libraries on a per-function basis. This flexible and hierarchical nature enables Executorlib to up scale Python programs from a workstation computer up to the latest Exascale HPC clusters with minimal code changes. Finally, Executorlib provides several utility functions to accelerate the rapid prototyping of HPC workflows, like the caching of intermediate results, the visualization of the workflow graph and the tracking of execution time, enabling fast and agile development. +Executorlib enables the execution of hierarchical Python workflows on the heterogenous computing resources of high-performance computing (HPC) clusters. This is achieved by extending the Executor class of the Python standard library for asynchronously executing callables with an interface to HPC job schedulers. The initial release of executorlib supports the Simple Linux Utility for Resource Management (SLURM) and the flux framework as HPC job schedulers to start Python processes with dedicated computing resources such as CPU cores, memory or accelerators like GPUs. For heterogenous workflows executorlib enables the use of parallel computing frameworks like the message passing interface (MPI) or of dedicated GPU libraries on a per workflow step basis. Python workflows can be up-scaled with executorlib from a laptop up to the latest Exascale HPC clusters with minimal code changes including support for hierarchical workflows. Finally, Executorlib provides several utility functions to accelerate the rapid prototyping of Python workflows, like the caching of intermediate results, the visualization of the workflow graph and the tracking of execution time, enabling fast and agile development. # Statement of need -The Python programming language is commonly used in modern scientific HPC workloads to couple multiple legacy performance-critical scientific software packages written in different programming languages in order to solve complex tasks. To avoid intrusive code changes, interfaces to performance critical scientific software packages were traditionally implemented using file-based communication and control shell scripts, leading to poor maintainability, portability, and scalability. This approach is however losing ground to more efficient alternatives, such as the use of direct Python bindings, as their support is now increasingly common in scientific software packages. This enables the programmer to easily express complex workloads that require the orchestration of multiple codes. Deployment of these approaches on HPC platforms however requires developing strategies and tools to interface HPC job schedulers like the Simple Linux Utility for Resource Management (SLURM) [@slurm] with Python in order to control the execution and manage the computational resources required to execute such complex multi-task workflows. +The convergence of artificial intelligence (AI) and high-performance computing (HPC) workflows [@workflows] is one of the key drivers for the rise of Python workflows FOR HPC. Previously, the Python programming language was primarily used in scientific HPC workloads to couple performance-critical scientific software packages written in different programming languages in order to solve complex tasks. To avoid intrusive code changes, interfaces to performance critical scientific software packages were traditionally implemented using file-based communication and control shell scripts, leading to poor maintainability, portability, and scalability. This approach is however losing ground to more efficient alternatives, such as the use of direct Python bindings, as their support is now increasingly common in scientific software packages and especially machine learning packages and AI frameworks. This enables the programmer to easily express complex workloads that require the orchestration of multiple codes. Still Python workflows for HPC also come with challenges, like (1) safely terminating Python processes, (2) controlling the resources of Python processes and (3) the management of Python environments [@pythonhpc]. The first two of these challenges can be addressed by developing strategies and tools to interface HPC job schedulers like the SLURM [@slurm] with Python in order to control the execution and manage the computational resources required to execute heterogenous HPC workflows. -We distinguish two main use cases for such interfaces: either to request a queuing system allocation from the job scheduler and or to internally allocate computing resources to individual (sub-)tasks within an existing queuing system allocation. In the context of the SLURM job scheduler, these differences are distinguished by the sbatch and srun command. A number of Python workflow frameworks have been developed for both types of interfaces, ranging from domain-specific solutions for fields like high throughput screening in computational materials science [@fireworks; @aiida; @pyiron], to generalized Python interfaces for job schedulers [@myqueue; @psij] and task scheduling frameworks which implement their own scheduling on top of the HPC job scheduler [@dask; @parsl; @jobflow]. While these tools can be powerful, they introduce new constructs that are not familiar to most python developers, introducing complexity and a barrier to entry. To address this limitation while at the same time leveraging the powerful novel hierarchical HPC resource managers [@flux], we introduce Executorlib, which instead leverages and naturally extends the familiar Executor interface defined by the Python standard library from single-node shared-memory operation to multi-node distributed operation on HPC platforms. In doing so, Executorlib enables the rapid development, prototyping, and deployment of complex HPC workflows using only familiar and easy to maintain Python syntax, hence greatly simplifying the up-scaling of scientific workflows from laptops to very large computational scales. +We distinguish two main use cases for such interfaces: either to request a queuing system allocation from the job scheduler and or to internally allocate computing resources to individual (sub-)tasks within an existing queuing system allocation. In the context of the SLURM job scheduler, these differences are distinguished by the sbatch and srun command. A number of Python workflow frameworks have been developed for both types of interfaces, ranging from domain-specific solutions for fields like high throughput screening in computational materials science [@fireworks; @aiida; @pyiron], to generalized Python interfaces for job schedulers [@myqueue; @psij] and task scheduling frameworks which implement their own task scheduling on top of the HPC job scheduler [@dask; @parsl; @jobflow]. While these tools can be powerful, they introduce new constructs that are not familiar to most python developers, introducing complexity and a barrier to entry. To address this limitation while at the same time leveraging the powerful novel hierarchical HPC resource managers [@flux], we introduce Executorlib, which instead leverages and naturally extends the familiar Executor interface defined by the Python standard library from single-node shared-memory operation to multi-node distributed operation on HPC platforms. In doing so, Executorlib enables the rapid development, prototyping, and deployment of complex HPC workflows using only familiar and easy to maintain Python syntax, hence greatly simplifying the up-scaling of scientific workflows from laptops to very large computational scales. # Features and Implementation Based on prior experience with the development of the pyiron workflow framework [@pyiron], the design philosophy of Executorlib is centered on the timeless principle of not reinventing the wheel. Rather than implementing its own job scheduler, Executorlib instead leverages existing job or task schedulers to request and manage Python processes and associated computing resources. Further, instead of defining a new syntax and concepts, Executorlib extends the existing syntax of the Executor class in the Python standard library. Taken together, this makes changing the mode of execution in Executorlib as easy as changing a single variable, with the interface remaining the same. +## Example To illustrate the usage of Executorlib and explain the technical processes occurring in the background, we consider the simple example of doubling the numbers in the range from 1 to 4. With Executorlib, this can be achieved with the following code: ```python from executorlib import Executor @@ -49,17 +50,16 @@ with Executor(backend="local") as exe: future_lst = [exe.submit(sum, [i, i]) for i in range(1, 5)] print([fs.result() for fs in future_lst]) ``` -In this example, each individual summation is concurrently executed in a separate process. We note the strict adherence to the standard python Executor Interface as the example remains functional when the Executorlib Executor `Executor(backend=”local”)` object is replaced with either the ThreadPoolExecutor `ThreadPoolExecutor()` or the ProcessPoolExecutor `ProcessPoolExecutor()` from the Python standard library. In contrast to the standard objects however, the Executorlib Executor allows for execution across multiple nodes of HPC systems, which enables the execution of highly compute intensive workloads that require extensive computational resources, as we now show. +In this example, each individual summation is concurrently executed in a separate process. We note the strict adherence to the standard python Executor Interface as the example remains functional when the Executorlib Executor `Executor(backend=”local”)` object is replaced with either the ThreadPoolExecutor `ThreadPoolExecutor()` or the ProcessPoolExecutor `ProcessPoolExecutor()` from the Python standard library. Following the initialization of the Executor context with the with-statement, the summation function `sum` is submitted for execution with the argument `[i, i]`, generated from the for-loop iterating over the range 1 to 4. \autoref{fig:process}. Illustrates the internal functionality of Executorlib. The submission function `submit()` requests the computational resources from the job scheduler, which can be SLURM, flux or a local job scheduler, depending on the choice of backend. The Python function is then executed asynchronously in a newly created Python process. The user can interact with the asynchronously executing Python process on the right through the concurrent futures Future object returned from the submission function, again as defined by the Python standard library. In the code example above, the concurrent future object is named `fs`. The concurrent futures Future object offers a function to check the status of the Python process (`done()`) and a function to block the execution of the process on the left until the execution of the process on the right is completed (`result()`). In contrast to the standard objects however, the Executorlib Executor allows for execution across multiple nodes of HPC systems, which enables the execution of highly compute intensive workloads that require extensive computational resources, as we now show. + +![Illustration of the communication between the Executorlib Executor, the job scheduler and the Python process to asynchronously execute the submitted Python function (on the right).\label{fig:process}](process.png) ## Computing Backends Currently, Executorlib supports four different computing backends specified by the backend constructor argument. The first is a “local” backend for rapid prototyping on a local workstation in a way that is functionally similar to the standard ProcessPoolExecutor. The second “slurm_submission” backend can be used to submit Python functions as individual jobs to a SLURM job scheduler using the sbatch command, which can be useful for long running tasks, e.g., that call a compute intensive legacy code. This mode also has the advantage that all required hardware resources don’t have to be secured prior to launching the workflow and can naturally vary in time. The third is a `“slurm_allocation”` backend which distributes Python functions in a existing queuing system allocation using the srun command. Finally, the fourth is a `“flux_allocation”` backend using flux as hierarchical resource manager inside a given SLURM allocation. While the `“slurm_submission”` backend uses file-based communication under the hood e.g., the Python function to execute and its inputs are stored on the file system, executed in a separate Python process whose the output are again stored in a file, the other backends rely on socket-based communication to improve computational efficiency. -\autoref{fig:process}. Illustrates the internal functionality of Executorlib. The submission function `submit()` requests the computational resources from the task scheduler, which can be SLURM, flux or a local task scheduler, depending on the choice of backend. The Python function is then executed asynchronously in a newly created Python process. The user can interact with the asynchronously executing Python process on the right through the concurrent futures Future object returned from the submission function, again as defined by the Python standard library. In the code example above, the concurrent future object is named fs. The concurrent futures Future object offers a function to check the status of the Python process (done() and a function to block the execution of the process on the left until the execution of the process on the right is completed (`result()`). - -![Illustration of the communication between the Executorlib Executor, the task scheduler and the Python process to asynchronously execute the submitted Python function (on the right).\label{fig:process}](process.png) ## Resource assignment -To assign dedicated computing resources to individual Python functions, the Executorlib Executor class extends the submission function `submit()` to support not only the Python function and its inputs, but also a Python dictionary specifying the requested computing resources resource_dict. The resource dictionary can define the number of compute cores, number of threads, number of GPUs, as well as job scheduler specific parameters like the working directory, maximum run time or the maximum memory. With this hierarchical approach, Executorlib allows the user to finely control the execution of each individual Python function, using parallel communication libraries like the Message Passing Interface (MPI) for Python [@mpi4py] or GPU-optimized libraries to aggressively optimize complex compute intensive tasks that are best solved by tightly-coupled parallelization approaches, while offering a simple and easy to maintain approach to the orchestration of many such weakly-coupled tasks. This ability to seamlessly combine different programming models again accelerates the rapid prototyping of complex HPC workflows without sacrificing performance of critical code components. +To assign dedicated computing resources to individual Python functions, the Executorlib Executor class extends the submission function `submit()` to support not only the Python function and its inputs, but also a Python dictionary specifying the requested computing resources resource_dict. The resource dictionary can define the number of compute cores, number of threads, number of GPUs, as well as job scheduler specific parameters like the working directory, maximum run time or the maximum memory. With this hierarchical approach, Executorlib allows the user to finely control the execution of each individual Python function, using parallel communication libraries like the Message Passing Interface (MPI) for Python [@mpi4py] or GPU-optimized libraries to aggressively optimize complex compute intensive tasks of heterogenous HPC that are best solved by tightly-coupled parallelization approaches, while offering a simple and easy to maintain approach to the orchestration of many such weakly-coupled tasks. This ability to seamlessly combine different programming models again accelerates the rapid prototyping of heterogenous HPC workflows without sacrificing performance of critical code components. ## Dependencies While two inter-dependent Python functions with similar computational resource requirements can always be combined and executed as a single Python function, this is no longer the case for Python functions with dramatically different resource requirements. In this case Executorlib, again extends the submission function `submit()` to support concurrent futures Future objects from the Python standard library as inputs. When such an argument is passed as input of a subsequent function, the Executor waits until the Python process linked to the concurrent futures Future object completes its execution, before submitting the dependent Python function for execution. In the case of the `“slurm_submission”` backend which uses file-based communication, the dependencies of the Python functions are communicated to the SLURM job scheduler, so the communication is decoupled from the initial Python process, which submitted the Python functions, as the execution can be delayed until the user receives access to the requested computing resources from the SLURM job scheduler. Finally, by enabling the plotting parameter plot_dependency_graph=True during the initialization of the Executorlib Executor class, the resulting dependency graph can be visualized to validate the dependency relationships between the different concurrent futures Future objects. @@ -71,11 +71,37 @@ To further improve computational efficiency when working with multiple analysis ## Caching The development of an HPC workflow is commonly an iterative process, which means the initial steps are repeated multiple times until the workflow is fully developed. To accelerate this process, Executorlib provides the option to cache the output of previously evaluated Python functions so these outputs can be reloaded without the need for repeating the evaluation of the same potentially expensive Python functions. Caching in Executorlib uses the same file storage interface as for the file-based communication with the “slurm_submission” backend. The caching is enabled by defining the cache directory parameter cache_directory as additional input during the initialization of the Executorlib Executor class. Finally, the cache also contains the execution time as additional information, enabling performance analysis of the workflow during the development cycle. +## Advanced Example +To demonstrate the advanced functionality of executorlib beyond the scope of the Executor interface of the Python standard library a second advanced example is provided. This advanced example requires the flux framework to be installed, with at least one computing node in a given queuing system allocation and with each computing node having at least one GPU. +```python +from executorlib import Executor + +def get_available_gpus(lst): + import socket + from tensorflow.python.client import device_lib + local_device_protos = device_lib.list_local_devices() + return [ + (x.name, x.physical_device_desc, socket.gethostname()) + for x in local_device_protos if x.device_type == 'GPU' + ] + lst + +with Executor(backend="flux_allocation") as exe: + fs = [] + for i in range(1, 4): + fs = exe.submit( + get_available_gpus, + lst=future, + resource_dict={“cores”: 1, "gpus_per_core": 1}, + ) + print(fs.result()) +``` +By adding the resource dictionary parameter in the submission function `resource_dict`, each Python function receives a dedicated CPU core and a corresponding GPU for the execution of the submitted function. In the submitted function the tensorflow machine learning framework is imported to list the metadata of the available GPU. Furthermore, the submission is repeated three times with the output being aggregated in a joined list. For the aggregation of the output of the individual submissions, the previous information is stored in a concurrent futures future object named `fs` and provided as an input to the next function which is submitted. Consequently, the execution is limited to a serial execution. Alternatively the results could be merged into one list after the submission of the individual functions, that would enable the parallel execution of the individual Python functions. + # Usage To-Date While initially developed in the US DOE Exascale Computing Project’s Exascale Atomistic Capability for Accuracy, Length and Time (EXAALT) to accelerate the development of computational materials science simulation workflows for the Exascale, Executorlib has since been generalized to support a wide-range of backends and HPC clusters at different scales. Based on this generalization, it is also been implemented in the pyiron workflow framework [@pyiron] as primary task scheduling interface. # Additional Details -This manuscript provides a general overview of the Executorlib package, the full documentation of the package is available at [executorlib.readthedocs.io](https://executorlib.readthedocs.io) and the corresponding source code at [github.com/pyiron/executorlib](https://github.com/pyiron/executorlib) . Executorlib is developed as open-source library, with a focus on stability, which is achieved with an >95% test coverage, type hinting and a minimalistic functional software design approach. +This manuscript provides a general overview of the Executorlib package, the full documentation including a number of examples for the individual features of the package is available at [executorlib.readthedocs.io](https://executorlib.readthedocs.io) and the corresponding source code at [github.com/pyiron/executorlib](https://github.com/pyiron/executorlib) . Executorlib is developed as open-source library, with a focus on stability, which is achieved with an >95% test coverage, type hinting and a minimalistic functional software design approach. # Acknowledgements J.J. and D.P. acknowledge funding from the Exascale computing project and the hospitality from the “Data-Driven Materials Informatics” program from the Institute of Mathematical and Statistical Innovation (IMSI). J.J, M.G.T, P.Y., J.N. and D.P. acknowledge the hospitality of the Institute of Pure and Applied math (IPAM) as part of the “New Mathematics for the Exascale: Applications to Materials Science” long program From 4d88c717e30bec1cf9804d4fd1db72c54774834f Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Fri, 31 Jan 2025 16:22:24 +0100 Subject: [PATCH 11/27] Add files via upload --- docs/paper/process.png | Bin 137571 -> 148437 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/paper/process.png b/docs/paper/process.png index dd19a37bdaafbd85fb304f915b64168f57417921..84cb5b7167361e4168efc0b6bd4543780589231e 100644 GIT binary patch literal 148437 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 C<Z literal 137571 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 huw#xhDiAkuM&QBh}XSU?hc?(cb|- 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

b#|iIb1Mt~kC7Tl+u_9h-bx0)A!YLtz~| zZ2kvQB{S4T`JNWY^DV6C!#0|OMCz!h+Q*D^=&Og&KY+TYcJE=<95gVLihF9es)E1Ug0@u2&x|i zQR%F^oss#rvz8-?m_xfN*-)dqKykgs9waVkN}U3zWimm=(ky_hbYW-MPZv) z$-gGMg_0Q_`qUTW;jgh`KwCbwY5f4AN|)8dZt{H1qQ@vKpY{n9mJjot(L}WiSXAi0 zfqaf9#t}YJ%1Aq^V}`oy0H4fcdWpMtgKkE>rK3}q$m$k*Ny9HHVm@EzM;Cyr`AFr$ z3zkfuZqF>Zsk%Kn1xj3h5{J9S=nk!q&H2`hj3gxNei8g^(-tf)J{k?}`D6gtml1A& zdzt)B;%Mktmh3N>jU>(V^Wu=!{iFTMsdl(@hP1xi!iS6nJT_NAK1bhnTOZ80fBZFE zd@;!8qqpUUfzyPs!rt|z=6%`_1!4j8fpFdlyi0|QjS+h7%(m;(w2M4j(Z%-<2UP0Z zos8t4Nzu4{d>xf`50}oz2NSzk=%})nO;z&!NU4+Ik{K5UuBP(jQV3<5$_S4=9QW2l z!5Wfy!UF#DT~nWC#}pwW@LozyMT}O-Lzy>s(o&@c8Ql(kX4J7h$s^)?<0I6tJwv8y zjGVs~&Y~_0op6HTj`{F}J53h#x)SUlGS(|$>52>+?>{7*6I~(_Y2?C~nr)9L7xQmP zlZ#L4WG!-Dz@UuWs4Bg(gs%@7)!nGm^Zntt9M_ zqMttvt^pkoxR;^t85hPb;L)c-zojeLm()dJ?+62~6?*R4Pc`&WrYpsK-(8nFj_X7% zItwdbzu}tJ=Z0(TI^~hj^Ws&u^-=y=^s$NeMUf4l@T?+Zx&L9NO5>u42m$$K9Zt3TW;SxMudR}MCy>cr zu9F}=GiQ-wyylVxA#QOa+{@D`VW(Q9dT?aREr*O3dzn>00i+uU`oIA1#C2uhbVoko zK4*!us~i%z;n|@({^N5w%txdVniSMr>8w4BzMx`c>iP2%8M;8e7QVO$uc*>NYC7Sg z-pnF?u~HrLK6BP~9puXk%qp*vAF83FzZ6_FcblkJnCW^W*d+V|?6#>)U;dqQs5Lqh z0gUXkX^$1YDq$_IAx^7mMwu_SZaFXL4Ey>dVDV?$g*36pa)2fI0-Q6$S!Oh4PkmO1 zB93{xk9&GMHISNZz{<;<`{I!^*Dm$>M(6ZP&}(GA zy?<&n@_O?ZX-Ns8^wBR8n3zB7oghx8nV}Xi6#9+RY$K)0EEN_^;4z7S96R96T0dP|vlGgh`G`nF)ZMghgOmCK3)4&bE^7W|3{yd95+~rI5-#-#9d`1WL;#aPG8I=ds`91Gi^EzqNON-aA|GHrlD0Xgi_`ky~MNy_rCfA z|M3|y5#Dc|yI>o0nfG2jeP)Syd*b+o<1&xFzI)c&(-yK(Kd#vBu48j&xM}Qu-)LPl z-+kVszENu~a)}gmEYSCH#l^*?p%l*K-N7zbDFVk#wIm%uAtgsB(io0mQDGJ3(u@7Z zpTJS)@od zSZVj_ELGPX(6sWbSr>Cw#vd&W-iT2=X7BRCA}nk`v6n<=NPY$ap?B`%&1zNC)|cEl zhm?wEKo+QB%yH<2>z`)=WcoAH5}Q|NVhj+MLGih%PK~K|5yL(CQ{C-Ep*BI2&leU_ zkD6aG%GfUqnngykZimLC74l&eotYOAvV7#RySJp&>kyb0LNpBSESi0MPdN4 z@7Txp=gq*K68$VHM>=C~b0$lQwoGCF5iSO9tf~mk#?QrTi9`-UFXhZ1vK|g9fW6*Z z+9T7h^$o2*$cIMc#}leW@LYGll{fZx)AcI#^&w1`z0_vz^-JZ~60J8R7V z=#DX$#7@b9Z|*XP_!bl|FVp;!r!@8_ugl;|3L=Zub`HOh{2oz%PC=NL$7MyAS!G(C`|}oK>-u~|bf!Sm*?b=_;|D+AUgUZp zF2&8_LCj4zdeta7d9pt!<(C-wH3JZjq;$zTJ1&KQ4dpcAA;;&j^}5uvA*puXnzd@R zexGfWK6^#UcdFSd0v$81ZMJhtc>y* zi97|^G?{wOPmH;9#%}Aart+Gq*%#P+1zc8IYTc%c4=Opitqk~KIIJvivlM23up@%Q z@#}=Zf9OcjG2GcW@9ET;_pxv{Y6MWJ`dzzeMto(pZ#7jCVR}J4XEUW>X@A6~LAIg( zQn69vFiFys zQ<{oxCWNvyIMnXMA(BsF$=&yjQ${@E*o5J{BDlk715bzl8n zs>2z=uJ$qEpZQ~8ZcE^ltgYEPVQ(@|nFB)opUH4( zmP)SX^$m^J6!a%ocu7R0Vwd0>8Ml8{ecaJT=g7=51$(M`4m#)p6!8_qZteRsF(FMQ zv*4GBgeFkrVf>6riKA|WrR0C8j)r~)=EFYfmUs_3{poO74stGx)l@*IR;}vo*sBuH zqcezUrF-2Tx3m?(|B${R)6DFnYeqD%cT`Q>DipERn!aW!cTY z&tudcS72=G%39^V84ifgceP6&U4mxNNeD{$Hk26u-+;C+fa^sQs8v;A{>;lGE-wNC z#Jiz0X4a16SS*i`-V1ElHD*7YikCJGT68m?>#l(X9}Zo9u&eG-(fl3;HJ~T6h{$$Y zxm19^(vFJ~Uk-Xf#PCcGuEOO3 zY3(O}nH>$|j>w!8A#*b3-u`MuI7I8@mU#T8+j+$*5&SAlYc`6nZ_#7ol)ea|jA_%c zsk;nl^y*BCTsZagR758ygh3BF3vP)MzC9>jPB|VpUn}a#uC4_=*?i5WRWe(sh-rDZ zCm;aViT4BJ#T(T*pgU0;p>q~|ttsIL5_b~v;7uq#Wl~3%|fsTGx!RZnSrngSDg4#bM zuRTwf>@hdfk_UJb9Do}B5;~SCpj5#S3YQpI4qx|s+7MKyPvl`?*1@XxNU&MYDSWD{ zAlo*Z-&{R^l3Ma?A|kwYbFo>_WK%B!0sw8$O0O5GUlp9Q&?%(zQC_`NR}cInmwGbJ zy|{Se{Y)TJ;tLq)a~ns4WtH>Y`zKeqh7zW{p`pws5dQ7XR5lu_^N8uq?UU5|d3YCk zxz5CH?PtHKakjdi9|xXUjXPpuX&MFk;n0cHfJBM!x7J6EKI(}7*T#bagi@Y=4W~f*zTf>IlYWP`>*}Ihrr}*>Tl}TQEihJ8n|{1@jF!>`JAj%7JMS9PD}mfLc1TwNk43z9BdK|XoktpcUK`eAmA>; zOC{BBwGnu4Wcrq_GH>tI`103gg*re-u8aJo32X*iS&_^e+468(B)Ts$tM0y;uX)nXJx#UyfRB4g!}nK8jttEJAVozrgFAxOOOqXZmG>?oB8^)bCtXPoU#VD~V2H;oAa7V2 zO7KzW&43A6LcwVjbbDWyXko}9h~idzTu%rz{?wW6pk_Vav>l0Dpalq{COK$HkkI$0 zl=S3b^n{_dnVFut(HA~!r+^Se7L}m8+PUO@u|?i_Hkok7O=AsJONaR`nuP&gap#rM z-1KM*7C#(H#}A?RRu@H`vbvRX-l@sl0r9zo(NzqbJENJvnOx zyi*FV_>2nUWb+$tZw(r8IW1m50h4Ae$Z(QkZnc|-&BBa>=(l}jf`MOc^*XQvur8Xq@NX(zU~ zy~+XZjBs!-+(FsRWcsc{7nW=6rsCw|dZiwAQe3ODp9x2qSug1&G{8pd>?$7XWAO2#?ucnGoB+_r#-mrXacfk#C90XJ>N zbs?GINIRurUv%2aEModBDnYl9U#VFYN{UhvJxM4ZA12@f zrO3gi3m8zh84j3LZObD>-Sr_sQo}Loaee#Tb8SWj_NAi)VBw&$}6eTTM~ct z4%F@XogF5`OD%9pY!dt--PKMOufQ2~fmL6z+9fG7{bAdzlR7f*2g5UeS?Eb=Jl#U1 zQlKwb&}N8plGY-PF)$eebCr9ISoH_%a%My8h$`2g;k6UyKG)gfnJUr%r0qU8uI`zk zQnRPSb5^Jp%f=AQG~ApO`Da!CQ};A&+S7Z|PVu#Cdv6Xkmmy+-tmEba9}71FGjW9CC%{d-(5?|IzzV`}g85Tnu-xhbAt7 zvs+K4GsPta(DP*SM>#Tc7E~EMwraUN`fXp`t_m~mc&$~Z7!E4qtGD%PC|Ay39VP(e zW!Sa%rgCR2M=O;nc&+InZ{-ElleR^%lJ%7=vYSjc`i4WFSGkIi&nK)RAD=pG-1)5) z1F7;AKyF|E=1=<>eE)sDX6L8VV)X4(F+(8#|L>bDP7`+J^%?Z`WBS61o1Y ztJ@AM@2o8!|HF`2>OMX+YF_v&1kiA3OD12}Map47R8Oh3>EGYQ>iPIsZ_&K<(g*Fn z?uyYr+y6g(N`%Cd6+~tpQ`$cYydm6OzIL-$(J#P$5XS#&26dv0s+3f^5;$V*-RFBT zPpkv0mIzd) z**l1Ha;A^r7!f!V*m@=bc@T=Sz9-&DM+lmLJK76AaYGowcXRg9$uB1jE^!sXof$Q@YGbL&*16T{w81oNcw zT7|dY>G`cyBW=je`u(jBHH_)}L*2h3&}U_h7Oh?CFYh$Ig(06iQ}uxueC2-* z1}$to!bh5D7Os%^9O2A!f2InPb_La7`%7RR8wk#dyQa$Of1d-7EpU{S%39Mkm~{=3 zarrmZ;5Ut0@R{jm1%tMnh>JLHkMxP>ESX>|y_jw~4E}}_^8oMGTbO%Lon*ok4BXuM zA?7#DP}DP2fsK+8cxL{|0BGYauyt|~zLRj~{7gGv9>P4g&$E3xDT;gyfN)+jX={eC zQolDH*H0?LbZ@}EeS%lqumD?}zC_IOj}=A(PY8-UIRE=d|D&L+fI+)^c@VbRy5?Hi z$=l%;u*6D$wevlO)AJpRHrmfmY`-47$9X|!md zntS2psxAak|4={^URu;xI9v^1E^SeBpFFOu@EOx~y~2p1NQGH*H`~coqLgzt9DyP? z_{kQ()rlLTaSt`r_9gZJI9y?;-b@x9~_~p9)3Ez`5H3XMhwU+y1_Z@j4 z&kb3;6C_9TMFW1s3}}CY!2py9z9IFGmudpOL@ddeT>)7hpL{+Oh-G#F(BIEGd2aXS>WV`RlFB|<~KC};1BKcrLXXkOu|Iwev;fcD9 z2Nq}Gz_WMBsQu$aS%IyX5POf81D8wQxL+^riRqdGT@!{@%dNT5$NIV>)RSh1eeCnL}!ny-9tKe-If68Q2ZS@2R-=JJwY_>)UdLgK`1MH&_0z&(4XV}S}{N|AEtvq5j25S5?Dc=M1W6ax)k z#h}Lmv5BzINuq)hj8eK(lZ==&4WYF>*!0@3xJ-gZy^jwi-R!VYFw-a<+j6{CO9hPh z$tl&p@)h-eldQ1B0!C)0s~F(kiUEJOb~uyLH3(%!U|{1(%cCDc5Uab!#pWWXp%1t? zrTM{Xjoh=pdy<+WbUeUhmRz|N!9Mjt`nyuD?Z10LXA%Lo*K0aC#W|EM(5vruRWh-*D zx5P2E0a;vC?$#p)80SukgJBe3ZPS(=OEo%?jA5hnY{;N`{sW9ddV2ccK3zeVg|&aI zwTD2v_#%zWhyjeR1#g?x8ed!zO9e;gb;KwBf7dq;?3wI>PO=syg3Os;nX%s-)$`jv zxw(dL&Z;kZJmvo+N0*;7uPYcv#{4f=p#fK+f1JI0L>92X!mrVJxY|KDOJHIg|3kjQ!?H&aypQlo>I6Cu*zxDb8-ZSSCa zCFxMDS%l^8Hyl2@_0$sgzkA^{W zMpwf{o9ec^+7>Mzn+E}HG(sx0B~UdZ)zBBCyTIF<8G2?kn-pC-A@xs_aGHo5BYTw6 ztm1j>ch^nKcDF`|`%|-0r}(}<+2Y=3@bSUHSSq)Q$TwXq%d#hhN{BUM! z$}H0EzPa--hko<#Rb2Se#|&dndNbDzoE;{^ICZJ_qgZ(8)0siTHSulJD3Hy1LCEL! zt=3Y#q5;}def`}2X65hRT_NR^5CLO8DGhSqh*k2cgI7j}KI*E0E%5s4ntvSMTf;Ga zl~VE3TD7i4=TASn@rR5eXjqSFx}XT3K|7a~_m_ij6XCjxB;7C#1)h|;rxeGQhDVA_?XX0JhOs0jL&~kD zy_-W@#}WIC;H?wQ!o>OO>nJP`>B8JQ(<#hBa9QcvL~xR!fr<7rG{}t}1c*JAN`1Yr zOr#cl*(T3kl-ShxcjrGtqXk?jOsxbep;Y=pe_>h3*BGKIFQCc_Ocvy_scXrbkeEZ>qjqX!` z^_ZdyI*whwNX&HI+HPCj?<&efUCU^Emm+mpsw}(MaX}?Zv*@ibfyB_?4aGl?YcAp~ z)6V>w+lqfT)!W;@s0Uc7Fxw~byx<5Wi3ucCfb)cUWfDS^Ukh%}+3`2lzaR7|1IgFFB5WQ8 z#066mhy3-2KQ}f$n3V#VC1xxbxQx0!K8dzsvVZNw02qp<(kSIzfvR_e(g&-=L&N*1HqYA6ZY3-lMZu;ulC5Kg1IWdT+3pK02LX%RT9DI*y+cQNsL)=C{aGYF3Cy*0%8UoNO9^Hs%)9kh!`=bc=$faBd|4)A^#Y4wB_&2~35)j>f6v_n-1UelX=YL4fPjD( zAoZ~q=KJ}7wChx)Du&S%8}?OjWl6=}%+nW?#k{k(8I=WTCVnI35uuxl61$-U$FShz zvPtSc!pFx3wyS>gth8B7fqs-E!o6)_V{Qg&jb0W+e0ZO#|A`kv#ov%>x+YJ@r1v#n zcDpIVi09UO?4jenJ8txH(S~ZRD$SN8Lefp0NjAEdjx$}7JQlsCW)+x+N&_v2%H(Fx zlGAaw)p>RD~W(ayr zXEoDAAQ!rKzkJ`B@Rs}e>|8MGtLnQL?xUsrj>0L5^Yc>ZGVUZB8HD1M2saya zjLAK`R^>4VKif*`-4<|`4wO6>k~4|Zmx87R*9XF=!bZrTPS)IUg^eIvfEGW~^k9>< z4FWX$4OoA9&>Kv$!^@P(_U%+%!g@ucVmm9)kR}`Er)3c2#&? zs&-=;k~@ko*GD@=T&n!*3~UH7qjcMWYc=RU@3@(bP;-;yS@v$kH8J+7JgEb&TF zzLWB(eRee@;sSH{nBaBW!`X9H&WF$DH4bmPj6v3t&{iaKxLh%#Oh^RofVD1f`9iMZ z-3uKN1M@Z8IOo(%m{2+y1(POners>KX|jAd*lb;qxvj>#gCc$JiDbxt{&~T>@hi;< z*|biS-xsAcJah~8QYH7g)5Nz;CZgHXq*9vl3u@ijCl(P}Rc9^>$ze-KX{#i zvASQ1U|xWL>P3ZsOZfRkI%D?M5&%d&uzeAqpRHC;}x>!7)tc4XCg_l{Ae#{{Bnm|*LJ3e zevOpNP?2}Th0Yj*r~9W=RK@~rB@=>o?&;~R@H{NF>lPJGI-DuIzb-OdD*39Xuhq9+ zHNEAV@bOKdnxk%wa@w|7<*l5T?X0ENmvx+%x$aahc?b@;M*Gu7Ya#Y8y4w76oX_Lio#}xjeDbT5-bY$Z9s6IVyn;t}lX&-t{ODKf zOg*))Th~Uit1#|ep+T(hT4j53-hZ5`_)4WCPmgSd@tG9%pe+MN^*Mp4D}OfS3V54v zsu&#S4VxtIfFx1c;6R@Jjw7DmJseeTg2b)uH_ zzZrFo<@J?&6&;=P8*l91zpv9p+!4buqOR4Gv+T(|T-}}sG0oiUTkL*{*ZP)-AtZTW zSgB$0Ji*>QTLjl7?~d2S3n>?st<#ctecPo>ha3)H~yT zaU?CLG*|h9>*}7I@WU?t+oOejVdv!clVkYZR9M!(q9M+BEWP{2b^jfP5t-gVNW%ef zftMq-!@F#onS^V4!C~G7+Ux{l-VIBv1^RROx|hmoTzI#35v?j=8D<-cbfhC7my7UI zs(;I6pQoVZiLT`Oe~#qIPi*4G)mW7|-={vqe0;IXN!6Xlj2;nJQJJC6j)NZ=m^5+D z#~_U6{M7PHzS&n~M-jH;;aFpsP&mz0(_+Q6W#_zxYh2Q|NK#nh7s zYiydoRnnioobHpK)WDJU{%CJ`B%}u4vC`4|*;wAKUH2);tlsjFqU_BYZWFZ(#T5g& zuY0Sl1T`*{OGvBnJ!hNkPlx7CmevziV=N|dPsuCFTyix!5iV18i9LG48mrpG-C@a(m8d{rZ_rH=M%Bmm4_Y?O--QCt1?Maut?2V|A6f+H$ zT)Jm+=p~sXv_4K5g&eus76ZK`bQ1U}mL8mm+iSaDVoKTRv$S20H(!HKb2Hz0i4{3K zxf2v+r@!e$(0&~oX?CU|JRPyW$Rc|v8#SFWjtJhqewem@Np)yo8Wb?e0Q#%a%1UN~o_p45@Fzqxrc zJLxS){SPTU=cLw%-lWzhI@gT8LF}J;NF%JLOMTqV0~O27jxkc6ZRLwz5JuRd+Wey) zp`6MD_OuIgPc}(3>*f~<$C-5$$CWXoN!({&wIt`^*zd2`aI0i^KJ|E<mJ z+H3pb+I+h`L0^RX6PcdHz7(4Ww=?wf;CLV)G0&exe(T;F6^sg}@#un{Pfv!+KnO-N&H1H*4mJ zyLcmF+I?F94=FUE7<<(OkIZ@5y7r+)XEzyQg%6CvyvHkNvAgHH*vo_jJ+6B8qDfr|M+)otv&M zReL1{^RLh}8sW_oG-x-GA1K6BXoWmEdN5wQXO$}lWqigjC}I^k3ZO)#t!cFG>4fH+ zqwdbSf}JCeDI;X#@uIQO$_Z%0wwOOKfTr7QB z&h=8d>_6E`xmF=L*U@x!ZLex?*+IxjI8tMEQxDtyrfc2Dt(xogj$H9%=%dTh@QOOP;0-)pEs zN&l|j&O)c3X-DL0pXa7Knh=7uW=R?IkZtF{rXk9xO@o{PDaE{#L{MKkAh9S#f@CfjBXV%OpUrIUP+P>kovXH?b+>C63?>P&^>h|B#-e}Ry&%N$lMRVFfm?23> zkAH#7JyKrPA$_USeZ`TwX_L!)&Co69OHR`c#@@7FqA5att|leBCT7WfRn9~2VO`?= z_10pO)AgV9!VZp&XKJQM#2XwM)m<{`h`SQ{r%K6wtF*YULHD-pzfL35S&>)JQmy2d zhQr>o;mo0;>ay^)ax-(rJ#eAl6jr3vM)9BC-JPjwSs~a=(zRJKB_@2N868G#8u{k< zvvOWGxDR`GZdY0f1e&F8w1o6gZu`(2lDaIX+1RD$6XFb4>#LgaNK&ZtAzdXld1-;*s_a*Ch!C5=2UUyPeOG6{k`2gU*9q;hFYPU^L~=9)a2>`Z z9v=+3n3KEU%_I7i;;&s^pBu1Q)j~%7)U~-6vk`Oc;sgNbNhi7^zg``oK3qzjXZ~?? z+v)SIB0I;Sb@Dmd0f7b9JsX!5;~xb|jPvL5irDuqIvfuAS}gPzzCn67L@lMv3n9ey z>Rg^84nGwnd0(n3HhDgJC7l;_&(`nfEu1+;@RGOfz@yDuzB$Y)VM*M-Uj3*yyU#B1 zW?2e}Lsw1POm;&&ZzQ*+Xedt58-Q&4R?$a9SAvSL#rRrAe!-`+-O&$e1#q6CkHeBle%KH*rSL7N2o3#_}K^3c} zUusP$5o`$gfo_?nlWROydbA7%-h*{ILH*vHJG%LgzFzH&k9pL4m&R*Sbk}@mtz~(W zvaVBZQ2-&KL+~u4z}QsH;X@5awRHiv&9xc=>R?^!p4zEBIl=etSufHhUkp?vdkeaM z5xk_A6nQmk_I5)ij<3i3rJ*$Isn8{sB8$&A2j014oo97RbpO2h)zzvuqvDHZ?Vzi{ zRVA9;Z&NiI>nWBOmi;*PmC5qkC0M-G#Cw zPS^)>dXd+oG&fb!W`2Ho)tfiE`4-E3d!%b~dEC7LJbuj7Qo)?>6Y&vWW5B{_t~f?F!^xtN^aIu- zEHgS~T=_doqQm?-5$7SKaDf^bW36d(_FhJY3+v988(bxw{@YKMuRcB8xKv}_Y||Xp zy20nrTJD|r$z`I$so77T7hIX8`*ZnN+g3;qZ_peJ2oy7t;yDazEA8y>6l^^FI!h4g z`Khp<={~ZRoRkRsOc=k_BQ*5?{7g%tRr#Xdk$q$METiSLJZi|&dwW_NH?veOR+uiC zCWxJm69`5_J8K{#E~=K@z>KNZ;z?(vouWpqNL!%!4mZJ_lS^<}gMKr_OLDKeT3t7$ z#=YCv2!ZnL-LE&Ga?5*;QrP3$FI%-@oqT2hS?X0gRmEknXA7Y zcRl4v=E$y70y6N766wIk<{s8F8hMVrw*~r35UPJIl(ty%<<@;-1m)q-#NjQ`gx7A~ zT_RsAGM3PnkgFf#KXEtLj5kM&AnTY%K93OpN@k$`ecN+_3tX_}Fa_sZcaP(ONPdCl zQK@N|ozp!HR?~jVrjoWS)%3Hj>;<|t4@d32RInWcnQCY%^D5)A<^5~LAcll;8a~6J z;e227GkZKk-73KBt46#F^{uNh`TEK!2@P~%rk^kLJlxI|NWnNt6!Y)>8JZmd$=H3% zOy|zmedFQQsMSvr9b+j_qN_ZbKTia5@0AmE|28e(gD3Y8eYz9W6h`QO&j~F?pu*f>N#%J zIm;Cc$s_g8&FFrMO~RWXHoNBeI5CdMx+=2BvUQp(1&lf$cN!%y)43~L@v0XABS-0> zo7z^U&dgNxjZ1s=&d2ho^#2~A->gjM3Yz}pkb^N62K{6lcCtwb1y{M;!13*Lns~a2 znpFyhnNHfbPTtyo{>*kWu{;tB8R6P@(^l8Vog#0BF#u2oPE1Jl{?fl>9aDik!aTcUy<^E@^1%XE-S)1vXW59iYdG& z?H)|YYV!QT%Ne8Qz{K~Rh~51kTFiGd%I9D1H@xB$Z5KA^IswAN-pQxo!>2#c-}%WUh5<`{-{T?-)iCts#chyppJBx+UCE4 z%(Xu*Sdm5-h}2AIsSsmC6Os$8-q>~CAl;R1cUaMOoX@2h7JXK}N|$zq#6EA9`xNZm z*{ivKly}0lK+pu4f-gXbNfDem0%;j$On-LT6@ES0&PNYG0g&Tn{jDQq@%PkyTEUxq zWtA=)yr%yr8`F>p!dwaN5#^ApGXcNzVwy$!^PmxY5W4J60ok-a;f>8wA&5U4gLNA| z@p$`@2Y%fs46FM8rIkoyG<>Dw%o_4%9rBQ<$1A~m_cVkfgJ4B0f)av%)So5T?z{oh zUZ^~Ld=>02dLjQms<7pMxoZpAELs4RW6wj z7{-R|ZoP*PlTE#T_g7`1#9>7q|Ki+G@ z5u^J*nObY8Y$%+73y_}Gf!gMb0yE~{uOxirn|ulxBOCc5*Q}?N>2M#XdJOPsAZIqF zk(NnGww#yc^ZTb~ps^jxPZqy~zi%WAkb%%{9pKP}U$P^9CG2V|?_`7uq#5%2`bmY! zhMKFJKrxm|(F2K|zA(H$UPD|>4b*e@^0e(A4O|<#ZIteWodv0Lw`3LQCjj?x*?8YcNv89hQ#ax8c=PcPMvA6x3Pl%{u>M(bn^~ zU`0cx#KRIyw&=+-SDSwDDM%)VVzs3ZpW3oTJ_1smKVvi>AL-y_>WrMZ0L?5pbgl#v zUoN(H$Q1a^4L&|H*z!bOW$ma8CMX3!sWd7vRZkW69NuW--cp)e++0%me_K{*Y`Mq@ zczeZdRp5s7bIuEnBK*!MXyEJ651fhx?#4N}=e*tIjj_ADfFn}OOa~l+X{Yf9i{HwX zSMI&J5xDK$-}!6e_C|Gy=}O&Rwgzdns=`60Wt=Z|sha2Cn=)a7z)au?TURR9uIUN+ zZ&0V=+{R))i3yYp^I65#{0h6pE3Foue`kXJ{$E~R({x_u3g!SO_hAld2nVgBSvTwa z9LwNaz_T38uiE$AzOqL1uC(d25Y3<+`<{t{lF#e|(_(io0dD-;ly}=qGkn_`pLs^E zzy(Lowm%LufE&iZq{kS{Rua22c)6b^Fd_CxoBO%k{rB(7<9_dTYi_Dc|J7b}PJL5h z>fNi&dz2a+_OPzIzeAH9xZ>`c?7!G=a&|h^{W23D*Z);LZ~J@Am$%pbSB0z;dcWx= z^18r$Rv+mLvAn=dF^hovc3sW#?r6+5%b9TY)nC@FeV}#3A6gsaCfcU=$pr1GDAbHw z)G{TYzUcY6vmS5v9azePND1p%eB>`I-tNY)_Idp!52gBDmk(w<?xFH)xdFtgz)@Q9QsKjc;7;KFGJXvz1Ya|^U!VG9lAbD*UN+uvuRtbPUN zEZ7=oq@^by9S>rFMO^XkdDGxSz!39BjUP&Z^N)Xvn6!XSO6YP1An Date: Fri, 31 Jan 2025 16:31:45 +0100 Subject: [PATCH 12/27] Update paper.md --- docs/paper/paper.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/paper/paper.md b/docs/paper/paper.md index 1d5afc6d..8ae10d22 100644 --- a/docs/paper/paper.md +++ b/docs/paper/paper.md @@ -56,20 +56,19 @@ In this example, each individual summation is concurrently executed in a separat ## Computing Backends Currently, Executorlib supports four different computing backends specified by the backend -constructor argument. The first is a “local” backend for rapid prototyping on a local workstation in a way that is functionally similar to the standard ProcessPoolExecutor. The second “slurm_submission” backend can be used to submit Python functions as individual jobs to a SLURM job scheduler using the sbatch command, which can be useful for long running tasks, e.g., that call a compute intensive legacy code. This mode also has the advantage that all required hardware resources don’t have to be secured prior to launching the workflow and can naturally vary in time. The third is a `“slurm_allocation”` backend which distributes Python functions in a existing queuing system allocation using the srun command. Finally, the fourth is a `“flux_allocation”` backend using flux as hierarchical resource manager inside a given SLURM allocation. While the `“slurm_submission”` backend uses file-based communication under the hood e.g., the Python function to execute and its inputs are stored on the file system, executed in a separate Python process whose the output are again stored in a file, the other backends rely on socket-based communication to improve computational efficiency. +constructor argument. The first is a `“local”` backend for rapid prototyping on a local workstation in a way that is functionally similar to the standard `ProcessPoolExecutor`. The second `“slurm_submission”` backend can be used to submit Python functions as individual jobs to a SLURM job scheduler using the sbatch command, which can be useful for long running tasks, e.g., that call a compute intensive legacy code. This mode also has the advantage that all required hardware resources don’t have to be secured prior to launching the workflow and can naturally vary in time. The third is a `“slurm_allocation”` backend which distributes Python functions in a existing queuing system allocation using the srun command. Finally, the fourth is a `“flux_allocation”` backend using flux as hierarchical resource manager inside a given SLURM allocation. While the `“slurm_submission”` backend uses file-based communication under the hood e.g., the Python function to execute and its inputs are stored on the file system, executed in a separate Python process whose the output are again stored in a file, the other backends rely on socket-based communication to improve computational efficiency. ## Resource assignment To assign dedicated computing resources to individual Python functions, the Executorlib Executor class extends the submission function `submit()` to support not only the Python function and its inputs, but also a Python dictionary specifying the requested computing resources resource_dict. The resource dictionary can define the number of compute cores, number of threads, number of GPUs, as well as job scheduler specific parameters like the working directory, maximum run time or the maximum memory. With this hierarchical approach, Executorlib allows the user to finely control the execution of each individual Python function, using parallel communication libraries like the Message Passing Interface (MPI) for Python [@mpi4py] or GPU-optimized libraries to aggressively optimize complex compute intensive tasks of heterogenous HPC that are best solved by tightly-coupled parallelization approaches, while offering a simple and easy to maintain approach to the orchestration of many such weakly-coupled tasks. This ability to seamlessly combine different programming models again accelerates the rapid prototyping of heterogenous HPC workflows without sacrificing performance of critical code components. ## Dependencies -While two inter-dependent Python functions with similar computational resource requirements can always be combined and executed as a single Python function, this is no longer the case for Python functions with dramatically different resource requirements. In this case Executorlib, again extends the submission function `submit()` to support concurrent futures Future objects from the Python standard library as inputs. When such an argument is passed as input of a subsequent function, the Executor waits until the Python process linked to the concurrent futures Future object completes its execution, before submitting the dependent Python function for execution. In the case of the `“slurm_submission”` backend which uses file-based communication, the dependencies of the Python functions are communicated to the SLURM job scheduler, so the communication is decoupled from the initial Python process, which submitted the Python functions, as the execution can be delayed until the user receives access to the requested computing resources from the SLURM job scheduler. Finally, by enabling the plotting parameter plot_dependency_graph=True during the initialization of the Executorlib Executor class, the resulting dependency graph can be visualized to validate the dependency relationships between the different concurrent futures Future objects. +While two inter-dependent Python functions with similar computational resource requirements can always be combined and executed as a single Python function, this is no longer the case for Python functions with dramatically different resource requirements. In this case Executorlib, again extends the submission function `submit()` to support concurrent futures Future objects from the Python standard library as inputs. When such an argument is passed as input of a subsequent function, the Executor waits until the Python process linked to the concurrent futures Future object completes its execution, before submitting the dependent Python function for execution. In the case of the `“slurm_submission”` backend which uses file-based communication, the dependencies of the Python functions are communicated to the SLURM job scheduler, so the communication is decoupled from the initial Python process, which submitted the Python functions, as the execution can be delayed until the user receives access to the requested computing resources from the SLURM job scheduler. Finally, by enabling the plotting parameter `plot_dependency_graph=True` during the initialization of the Executorlib Executor class, the resulting dependency graph can be visualized to validate the dependency relationships between the different concurrent futures Future objects. ## Performance Optimization -While Executorlib is not a priori designed for Python functions with runtimes of less than about a minute, given the overhead of requesting dedicated computing resources and starting a new Python process, the execution of these functions can be significantly accelerated by reusing dedicated computing resources for the submission of multiple Python functions. This is enabled by setting the block allocation parameter block_allocation during the initialization of the Executor class to True. Rather than starting a separate Python process for each submitted Python function, the block allocation mode starts a dedicated number of workers (with a fixed resource allocation over their lifetime) and then allows the user to submit Python functions to these pre-defined workers. -To further improve computational efficiency when working with multiple analysis functions being applied on the same large dataset, data can be pre-loaded during the initialization of the Python function using the initialization function `init_function`. This initializes a Python dictionary in the Python process which is accessible by all subsequently submitted Python functions. +While Executorlib is not a priori designed for Python functions with runtimes of less than about a minute, given the overhead of requesting dedicated computing resources and starting a new Python process, the execution of these functions can be significantly accelerated by reusing dedicated computing resources for the submission of multiple Python functions. This is enabled by setting the block allocation parameter `block_allocation` during the initialization of the Executor class to `True`. Rather than starting a separate Python process for each submitted Python function, the block allocation mode starts a dedicated number of workers (with a fixed resource allocation over their lifetime) and then allows the user to submit Python functions to these pre-defined workers. To further improve computational efficiency when working with multiple analysis functions being applied on the same large dataset, data can be pre-loaded during the initialization of the Python function using the initialization function `init_function`. This initializes a Python dictionary in the Python process which is accessible by all subsequently submitted Python functions. ## Caching -The development of an HPC workflow is commonly an iterative process, which means the initial steps are repeated multiple times until the workflow is fully developed. To accelerate this process, Executorlib provides the option to cache the output of previously evaluated Python functions so these outputs can be reloaded without the need for repeating the evaluation of the same potentially expensive Python functions. Caching in Executorlib uses the same file storage interface as for the file-based communication with the “slurm_submission” backend. The caching is enabled by defining the cache directory parameter cache_directory as additional input during the initialization of the Executorlib Executor class. Finally, the cache also contains the execution time as additional information, enabling performance analysis of the workflow during the development cycle. +The development of an HPC workflow is commonly an iterative process, which means the initial steps are repeated multiple times until the workflow is fully developed. To accelerate this process, Executorlib provides the option to cache the output of previously evaluated Python functions so these outputs can be reloaded without the need for repeating the evaluation of the same potentially expensive Python functions. Caching in Executorlib uses the same file storage interface as for the file-based communication with the `“slurm_submission”` backend. The caching is enabled by defining the cache directory parameter `cache_directory` as additional input during the initialization of the Executorlib Executor class. Finally, the cache also contains the execution time as additional information, enabling performance analysis of the workflow during the development cycle. ## Advanced Example To demonstrate the advanced functionality of executorlib beyond the scope of the Executor interface of the Python standard library a second advanced example is provided. This advanced example requires the flux framework to be installed, with at least one computing node in a given queuing system allocation and with each computing node having at least one GPU. From 44cfa7ae7758eb2d7e3c4670cba11fe3f2733ad6 Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Fri, 31 Jan 2025 16:35:23 +0100 Subject: [PATCH 13/27] Update paper.md --- docs/paper/paper.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/paper/paper.md b/docs/paper/paper.md index 8ae10d22..dec70cff 100644 --- a/docs/paper/paper.md +++ b/docs/paper/paper.md @@ -34,7 +34,7 @@ bibliography: paper.bib Executorlib enables the execution of hierarchical Python workflows on the heterogenous computing resources of high-performance computing (HPC) clusters. This is achieved by extending the Executor class of the Python standard library for asynchronously executing callables with an interface to HPC job schedulers. The initial release of executorlib supports the Simple Linux Utility for Resource Management (SLURM) and the flux framework as HPC job schedulers to start Python processes with dedicated computing resources such as CPU cores, memory or accelerators like GPUs. For heterogenous workflows executorlib enables the use of parallel computing frameworks like the message passing interface (MPI) or of dedicated GPU libraries on a per workflow step basis. Python workflows can be up-scaled with executorlib from a laptop up to the latest Exascale HPC clusters with minimal code changes including support for hierarchical workflows. Finally, Executorlib provides several utility functions to accelerate the rapid prototyping of Python workflows, like the caching of intermediate results, the visualization of the workflow graph and the tracking of execution time, enabling fast and agile development. # Statement of need -The convergence of artificial intelligence (AI) and high-performance computing (HPC) workflows [@workflows] is one of the key drivers for the rise of Python workflows FOR HPC. Previously, the Python programming language was primarily used in scientific HPC workloads to couple performance-critical scientific software packages written in different programming languages in order to solve complex tasks. To avoid intrusive code changes, interfaces to performance critical scientific software packages were traditionally implemented using file-based communication and control shell scripts, leading to poor maintainability, portability, and scalability. This approach is however losing ground to more efficient alternatives, such as the use of direct Python bindings, as their support is now increasingly common in scientific software packages and especially machine learning packages and AI frameworks. This enables the programmer to easily express complex workloads that require the orchestration of multiple codes. Still Python workflows for HPC also come with challenges, like (1) safely terminating Python processes, (2) controlling the resources of Python processes and (3) the management of Python environments [@pythonhpc]. The first two of these challenges can be addressed by developing strategies and tools to interface HPC job schedulers like the SLURM [@slurm] with Python in order to control the execution and manage the computational resources required to execute heterogenous HPC workflows. +The convergence of artificial intelligence (AI) and high-performance computing (HPC) workflows [@workflows] is one of the key drivers for the rise of Python workflows for HPC. Previously, the Python programming language was primarily used in scientific HPC workloads to couple performance-critical scientific software packages written in different programming languages in order to solve complex tasks. To avoid intrusive code changes, interfaces to performance critical scientific software packages were traditionally implemented using file-based communication and control shell scripts, leading to poor maintainability, portability, and scalability. This approach is however losing ground to more efficient alternatives, such as the use of direct Python bindings, as their support is now increasingly common in scientific software packages and especially machine learning packages and AI frameworks. This enables the programmer to easily express complex workloads that require the orchestration of multiple codes. Still Python workflows for HPC also come with challenges, like (1) safely terminating Python processes, (2) controlling the resources of Python processes and (3) the management of Python environments [@pythonhpc]. The first two of these challenges can be addressed by developing strategies and tools to interface HPC job schedulers like the SLURM [@slurm] with Python in order to control the execution and manage the computational resources required to execute heterogenous HPC workflows. We distinguish two main use cases for such interfaces: either to request a queuing system allocation from the job scheduler and or to internally allocate computing resources to individual (sub-)tasks within an existing queuing system allocation. In the context of the SLURM job scheduler, these differences are distinguished by the sbatch and srun command. A number of Python workflow frameworks have been developed for both types of interfaces, ranging from domain-specific solutions for fields like high throughput screening in computational materials science [@fireworks; @aiida; @pyiron], to generalized Python interfaces for job schedulers [@myqueue; @psij] and task scheduling frameworks which implement their own task scheduling on top of the HPC job scheduler [@dask; @parsl; @jobflow]. While these tools can be powerful, they introduce new constructs that are not familiar to most python developers, introducing complexity and a barrier to entry. To address this limitation while at the same time leveraging the powerful novel hierarchical HPC resource managers [@flux], we introduce Executorlib, which instead leverages and naturally extends the familiar Executor interface defined by the Python standard library from single-node shared-memory operation to multi-node distributed operation on HPC platforms. In doing so, Executorlib enables the rapid development, prototyping, and deployment of complex HPC workflows using only familiar and easy to maintain Python syntax, hence greatly simplifying the up-scaling of scientific workflows from laptops to very large computational scales. From a306bc76e92b817d9f0bdb5e122a0df80e6eed8a Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Fri, 31 Jan 2025 16:43:10 +0100 Subject: [PATCH 14/27] Update paper.md --- docs/paper/paper.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/paper/paper.md b/docs/paper/paper.md index dec70cff..9a6ce16e 100644 --- a/docs/paper/paper.md +++ b/docs/paper/paper.md @@ -36,7 +36,7 @@ Executorlib enables the execution of hierarchical Python workflows on the hetero # Statement of need The convergence of artificial intelligence (AI) and high-performance computing (HPC) workflows [@workflows] is one of the key drivers for the rise of Python workflows for HPC. Previously, the Python programming language was primarily used in scientific HPC workloads to couple performance-critical scientific software packages written in different programming languages in order to solve complex tasks. To avoid intrusive code changes, interfaces to performance critical scientific software packages were traditionally implemented using file-based communication and control shell scripts, leading to poor maintainability, portability, and scalability. This approach is however losing ground to more efficient alternatives, such as the use of direct Python bindings, as their support is now increasingly common in scientific software packages and especially machine learning packages and AI frameworks. This enables the programmer to easily express complex workloads that require the orchestration of multiple codes. Still Python workflows for HPC also come with challenges, like (1) safely terminating Python processes, (2) controlling the resources of Python processes and (3) the management of Python environments [@pythonhpc]. The first two of these challenges can be addressed by developing strategies and tools to interface HPC job schedulers like the SLURM [@slurm] with Python in order to control the execution and manage the computational resources required to execute heterogenous HPC workflows. -We distinguish two main use cases for such interfaces: either to request a queuing system allocation from the job scheduler and or to internally allocate computing resources to individual (sub-)tasks within an existing queuing system allocation. In the context of the SLURM job scheduler, these differences are distinguished by the sbatch and srun command. A number of Python workflow frameworks have been developed for both types of interfaces, ranging from domain-specific solutions for fields like high throughput screening in computational materials science [@fireworks; @aiida; @pyiron], to generalized Python interfaces for job schedulers [@myqueue; @psij] and task scheduling frameworks which implement their own task scheduling on top of the HPC job scheduler [@dask; @parsl; @jobflow]. While these tools can be powerful, they introduce new constructs that are not familiar to most python developers, introducing complexity and a barrier to entry. To address this limitation while at the same time leveraging the powerful novel hierarchical HPC resource managers [@flux], we introduce Executorlib, which instead leverages and naturally extends the familiar Executor interface defined by the Python standard library from single-node shared-memory operation to multi-node distributed operation on HPC platforms. In doing so, Executorlib enables the rapid development, prototyping, and deployment of complex HPC workflows using only familiar and easy to maintain Python syntax, hence greatly simplifying the up-scaling of scientific workflows from laptops to very large computational scales. +We distinguish two main use cases for such interfaces: either to request a queuing system allocation from the job scheduler and or to internally allocate computing resources to individual (sub-)tasks within an existing queuing system allocation. In the context of the SLURM job scheduler, these differences are distinguished by the `sbatch` and `srun` command. A number of Python workflow frameworks have been developed for both types of interfaces, ranging from domain-specific solutions for fields like high throughput screening in computational materials science [@fireworks; @aiida; @pyiron], to generalized Python interfaces for job schedulers [@myqueue; @psij] and task scheduling frameworks which implement their own task scheduling on top of the HPC job scheduler [@dask; @parsl; @jobflow]. While these tools can be powerful, they introduce new constructs that are not familiar to most python developers, introducing complexity and a barrier to entry. To address this limitation while at the same time leveraging the powerful novel hierarchical HPC resource managers [@flux], we introduce Executorlib, which instead leverages and naturally extends the familiar Executor interface defined by the Python standard library from single-node shared-memory operation to multi-node distributed operation on HPC platforms. In doing so, Executorlib enables the rapid development, prototyping, and deployment of complex HPC workflows using only familiar and easy to maintain Python syntax, hence greatly simplifying the up-scaling of scientific workflows from laptops to very large computational scales. # Features and Implementation Based on prior experience with the development of the pyiron workflow framework [@pyiron], the design philosophy of Executorlib is centered on the timeless principle of not reinventing the wheel. Rather than implementing its own job scheduler, Executorlib instead leverages existing job or task schedulers to request and manage Python processes and associated computing resources. Further, instead of defining a new syntax and concepts, Executorlib extends the existing syntax of the Executor class in the Python standard library. Taken together, this makes changing the mode of execution in Executorlib as easy as changing a single variable, with the interface remaining the same. From 3a2db49a80b43d40a6ae136511887bbee5b91d1c Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Fri, 31 Jan 2025 16:47:14 +0100 Subject: [PATCH 15/27] Update paper.md --- docs/paper/paper.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/paper/paper.md b/docs/paper/paper.md index 9a6ce16e..fc0397d9 100644 --- a/docs/paper/paper.md +++ b/docs/paper/paper.md @@ -36,7 +36,7 @@ Executorlib enables the execution of hierarchical Python workflows on the hetero # Statement of need The convergence of artificial intelligence (AI) and high-performance computing (HPC) workflows [@workflows] is one of the key drivers for the rise of Python workflows for HPC. Previously, the Python programming language was primarily used in scientific HPC workloads to couple performance-critical scientific software packages written in different programming languages in order to solve complex tasks. To avoid intrusive code changes, interfaces to performance critical scientific software packages were traditionally implemented using file-based communication and control shell scripts, leading to poor maintainability, portability, and scalability. This approach is however losing ground to more efficient alternatives, such as the use of direct Python bindings, as their support is now increasingly common in scientific software packages and especially machine learning packages and AI frameworks. This enables the programmer to easily express complex workloads that require the orchestration of multiple codes. Still Python workflows for HPC also come with challenges, like (1) safely terminating Python processes, (2) controlling the resources of Python processes and (3) the management of Python environments [@pythonhpc]. The first two of these challenges can be addressed by developing strategies and tools to interface HPC job schedulers like the SLURM [@slurm] with Python in order to control the execution and manage the computational resources required to execute heterogenous HPC workflows. -We distinguish two main use cases for such interfaces: either to request a queuing system allocation from the job scheduler and or to internally allocate computing resources to individual (sub-)tasks within an existing queuing system allocation. In the context of the SLURM job scheduler, these differences are distinguished by the `sbatch` and `srun` command. A number of Python workflow frameworks have been developed for both types of interfaces, ranging from domain-specific solutions for fields like high throughput screening in computational materials science [@fireworks; @aiida; @pyiron], to generalized Python interfaces for job schedulers [@myqueue; @psij] and task scheduling frameworks which implement their own task scheduling on top of the HPC job scheduler [@dask; @parsl; @jobflow]. While these tools can be powerful, they introduce new constructs that are not familiar to most python developers, introducing complexity and a barrier to entry. To address this limitation while at the same time leveraging the powerful novel hierarchical HPC resource managers [@flux], we introduce Executorlib, which instead leverages and naturally extends the familiar Executor interface defined by the Python standard library from single-node shared-memory operation to multi-node distributed operation on HPC platforms. In doing so, Executorlib enables the rapid development, prototyping, and deployment of complex HPC workflows using only familiar and easy to maintain Python syntax, hence greatly simplifying the up-scaling of scientific workflows from laptops to very large computational scales. +We distinguish two main use cases for such interfaces: either to request a queuing system allocation from the job scheduler and or to internally allocate computing resources to individual (sub-)tasks within an existing queuing system allocation. In the context of the SLURM job scheduler, these differences are distinguished by the `sbatch` and `srun` command. A number of Python workflow frameworks have been developed for both types of interfaces, ranging from domain-specific solutions for fields like high throughput screening in computational materials science [@fireworks; @aiida; @pyiron], to generalized Python interfaces for job schedulers [@myqueue; @psij] and task scheduling frameworks which implement their own task scheduling on top of the HPC job scheduler [@dask; @parsl; @jobflow]. While these tools can be powerful, they introduce new constructs that are not familiar to most python developers, introducing complexity and a barrier to entry. To address this limitation while at the same time leveraging the powerful novel hierarchical HPC resource managers [@flux], we introduce Executorlib, which instead leverages and naturally extends the familiar Executor interface defined by the Python standard library from single-node shared-memory operation to multi-node distributed operation on HPC platforms. In doing so, Executorlib enables the rapid development, prototyping, and deployment of heterogenous HPC workflows using only familiar and easy to maintain Python syntax, hence greatly simplifying the up-scaling of scientific workflows from laptops to very large computational scales. # Features and Implementation Based on prior experience with the development of the pyiron workflow framework [@pyiron], the design philosophy of Executorlib is centered on the timeless principle of not reinventing the wheel. Rather than implementing its own job scheduler, Executorlib instead leverages existing job or task schedulers to request and manage Python processes and associated computing resources. Further, instead of defining a new syntax and concepts, Executorlib extends the existing syntax of the Executor class in the Python standard library. Taken together, this makes changing the mode of execution in Executorlib as easy as changing a single variable, with the interface remaining the same. From 6ecf57d7e2ce69758bfefce807ced08aa88af548 Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Fri, 31 Jan 2025 16:48:05 +0100 Subject: [PATCH 16/27] Update paper.md --- docs/paper/paper.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/paper/paper.md b/docs/paper/paper.md index fc0397d9..437e7a2a 100644 --- a/docs/paper/paper.md +++ b/docs/paper/paper.md @@ -39,7 +39,7 @@ The convergence of artificial intelligence (AI) and high-performance computing ( We distinguish two main use cases for such interfaces: either to request a queuing system allocation from the job scheduler and or to internally allocate computing resources to individual (sub-)tasks within an existing queuing system allocation. In the context of the SLURM job scheduler, these differences are distinguished by the `sbatch` and `srun` command. A number of Python workflow frameworks have been developed for both types of interfaces, ranging from domain-specific solutions for fields like high throughput screening in computational materials science [@fireworks; @aiida; @pyiron], to generalized Python interfaces for job schedulers [@myqueue; @psij] and task scheduling frameworks which implement their own task scheduling on top of the HPC job scheduler [@dask; @parsl; @jobflow]. While these tools can be powerful, they introduce new constructs that are not familiar to most python developers, introducing complexity and a barrier to entry. To address this limitation while at the same time leveraging the powerful novel hierarchical HPC resource managers [@flux], we introduce Executorlib, which instead leverages and naturally extends the familiar Executor interface defined by the Python standard library from single-node shared-memory operation to multi-node distributed operation on HPC platforms. In doing so, Executorlib enables the rapid development, prototyping, and deployment of heterogenous HPC workflows using only familiar and easy to maintain Python syntax, hence greatly simplifying the up-scaling of scientific workflows from laptops to very large computational scales. # Features and Implementation -Based on prior experience with the development of the pyiron workflow framework [@pyiron], the design philosophy of Executorlib is centered on the timeless principle of not reinventing the wheel. Rather than implementing its own job scheduler, Executorlib instead leverages existing job or task schedulers to request and manage Python processes and associated computing resources. Further, instead of defining a new syntax and concepts, Executorlib extends the existing syntax of the Executor class in the Python standard library. Taken together, this makes changing the mode of execution in Executorlib as easy as changing a single variable, with the interface remaining the same. +Based on prior experience with the development of the pyiron workflow framework [@pyiron], the design philosophy of Executorlib is centered on the timeless principle of not reinventing the wheel. Rather than implementing its own job scheduler, Executorlib instead leverages existing job schedulers to request and manage Python processes and associated computing resources. Further, instead of defining a new syntax and concepts, Executorlib extends the existing syntax of the Executor class in the Python standard library. Taken together, this makes changing the mode of execution in Executorlib as easy as changing a single variable, with the interface remaining the same. ## Example To illustrate the usage of Executorlib and explain the technical processes occurring in the background, we consider the simple example of doubling the numbers in the range from 1 to 4. With Executorlib, this can be achieved with the following code: From a963855614f14fbb1c124ca98ac83dfe7cfa13b2 Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Fri, 31 Jan 2025 16:51:46 +0100 Subject: [PATCH 17/27] Update paper.md --- docs/paper/paper.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/paper/paper.md b/docs/paper/paper.md index 437e7a2a..c252cc00 100644 --- a/docs/paper/paper.md +++ b/docs/paper/paper.md @@ -56,7 +56,7 @@ In this example, each individual summation is concurrently executed in a separat ## Computing Backends Currently, Executorlib supports four different computing backends specified by the backend -constructor argument. The first is a `“local”` backend for rapid prototyping on a local workstation in a way that is functionally similar to the standard `ProcessPoolExecutor`. The second `“slurm_submission”` backend can be used to submit Python functions as individual jobs to a SLURM job scheduler using the sbatch command, which can be useful for long running tasks, e.g., that call a compute intensive legacy code. This mode also has the advantage that all required hardware resources don’t have to be secured prior to launching the workflow and can naturally vary in time. The third is a `“slurm_allocation”` backend which distributes Python functions in a existing queuing system allocation using the srun command. Finally, the fourth is a `“flux_allocation”` backend using flux as hierarchical resource manager inside a given SLURM allocation. While the `“slurm_submission”` backend uses file-based communication under the hood e.g., the Python function to execute and its inputs are stored on the file system, executed in a separate Python process whose the output are again stored in a file, the other backends rely on socket-based communication to improve computational efficiency. +constructor argument. The first is a `“local”` backend for rapid prototyping on a local workstation in a way that is functionally similar to the standard `ProcessPoolExecutor`. The second `“slurm_submission”` backend can be used to submit Python functions as individual jobs to a SLURM job scheduler using the `sbatch` command, which can be useful for long running tasks, e.g., that call a compute intensive legacy code. This mode also has the advantage that all required hardware resources don’t have to be secured prior to launching the workflow and can naturally vary in time. The third is a `“slurm_allocation”` backend which distributes Python functions in a existing queuing system allocation using the `srun` command. Finally, the fourth is a `“flux_allocation”` backend using flux as hierarchical resource manager inside a given SLURM allocation. While the `“slurm_submission”` backend uses file-based communication under the hood e.g., the Python function to execute and its inputs are stored on the file system, executed in a separate Python process whose the output are again stored in a file, the other backends rely on socket-based communication to improve computational efficiency. ## Resource assignment To assign dedicated computing resources to individual Python functions, the Executorlib Executor class extends the submission function `submit()` to support not only the Python function and its inputs, but also a Python dictionary specifying the requested computing resources resource_dict. The resource dictionary can define the number of compute cores, number of threads, number of GPUs, as well as job scheduler specific parameters like the working directory, maximum run time or the maximum memory. With this hierarchical approach, Executorlib allows the user to finely control the execution of each individual Python function, using parallel communication libraries like the Message Passing Interface (MPI) for Python [@mpi4py] or GPU-optimized libraries to aggressively optimize complex compute intensive tasks of heterogenous HPC that are best solved by tightly-coupled parallelization approaches, while offering a simple and easy to maintain approach to the orchestration of many such weakly-coupled tasks. This ability to seamlessly combine different programming models again accelerates the rapid prototyping of heterogenous HPC workflows without sacrificing performance of critical code components. From d5786f2883859a1a454ec1b4fceaa091b2981767 Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Fri, 31 Jan 2025 16:53:28 +0100 Subject: [PATCH 18/27] Update paper.md --- docs/paper/paper.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/paper/paper.md b/docs/paper/paper.md index c252cc00..86e53e23 100644 --- a/docs/paper/paper.md +++ b/docs/paper/paper.md @@ -59,7 +59,7 @@ Currently, Executorlib supports four different computing backends specified by t constructor argument. The first is a `“local”` backend for rapid prototyping on a local workstation in a way that is functionally similar to the standard `ProcessPoolExecutor`. The second `“slurm_submission”` backend can be used to submit Python functions as individual jobs to a SLURM job scheduler using the `sbatch` command, which can be useful for long running tasks, e.g., that call a compute intensive legacy code. This mode also has the advantage that all required hardware resources don’t have to be secured prior to launching the workflow and can naturally vary in time. The third is a `“slurm_allocation”` backend which distributes Python functions in a existing queuing system allocation using the `srun` command. Finally, the fourth is a `“flux_allocation”` backend using flux as hierarchical resource manager inside a given SLURM allocation. While the `“slurm_submission”` backend uses file-based communication under the hood e.g., the Python function to execute and its inputs are stored on the file system, executed in a separate Python process whose the output are again stored in a file, the other backends rely on socket-based communication to improve computational efficiency. ## Resource assignment -To assign dedicated computing resources to individual Python functions, the Executorlib Executor class extends the submission function `submit()` to support not only the Python function and its inputs, but also a Python dictionary specifying the requested computing resources resource_dict. The resource dictionary can define the number of compute cores, number of threads, number of GPUs, as well as job scheduler specific parameters like the working directory, maximum run time or the maximum memory. With this hierarchical approach, Executorlib allows the user to finely control the execution of each individual Python function, using parallel communication libraries like the Message Passing Interface (MPI) for Python [@mpi4py] or GPU-optimized libraries to aggressively optimize complex compute intensive tasks of heterogenous HPC that are best solved by tightly-coupled parallelization approaches, while offering a simple and easy to maintain approach to the orchestration of many such weakly-coupled tasks. This ability to seamlessly combine different programming models again accelerates the rapid prototyping of heterogenous HPC workflows without sacrificing performance of critical code components. +To assign dedicated computing resources to individual Python functions, the Executorlib Executor class extends the submission function `submit()` to support not only the Python function and its inputs, but also a Python dictionary specifying the requested computing resources `resource_dict`. The resource dictionary can define the number of compute cores, number of threads, number of GPUs, as well as job scheduler specific parameters like the working directory, maximum run time or the maximum memory. With this hierarchical approach, Executorlib allows the user to finely control the execution of each individual Python function, using parallel communication libraries like the Message Passing Interface (MPI) for Python [@mpi4py] or GPU-optimized libraries to aggressively optimize complex compute intensive tasks of heterogenous HPC that are best solved by tightly-coupled parallelization approaches, while offering a simple and easy to maintain approach to the orchestration of many such weakly-coupled tasks. This ability to seamlessly combine different programming models again accelerates the rapid prototyping of heterogenous HPC workflows without sacrificing performance of critical code components. ## Dependencies While two inter-dependent Python functions with similar computational resource requirements can always be combined and executed as a single Python function, this is no longer the case for Python functions with dramatically different resource requirements. In this case Executorlib, again extends the submission function `submit()` to support concurrent futures Future objects from the Python standard library as inputs. When such an argument is passed as input of a subsequent function, the Executor waits until the Python process linked to the concurrent futures Future object completes its execution, before submitting the dependent Python function for execution. In the case of the `“slurm_submission”` backend which uses file-based communication, the dependencies of the Python functions are communicated to the SLURM job scheduler, so the communication is decoupled from the initial Python process, which submitted the Python functions, as the execution can be delayed until the user receives access to the requested computing resources from the SLURM job scheduler. Finally, by enabling the plotting parameter `plot_dependency_graph=True` during the initialization of the Executorlib Executor class, the resulting dependency graph can be visualized to validate the dependency relationships between the different concurrent futures Future objects. From c4078cefc4f31149ea9a728c92ecc843e8ba43ea Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Fri, 31 Jan 2025 17:02:17 +0100 Subject: [PATCH 19/27] Update paper.md --- docs/paper/paper.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/paper/paper.md b/docs/paper/paper.md index 86e53e23..4b2f5179 100644 --- a/docs/paper/paper.md +++ b/docs/paper/paper.md @@ -81,7 +81,7 @@ def get_available_gpus(lst): local_device_protos = device_lib.list_local_devices() return [ (x.name, x.physical_device_desc, socket.gethostname()) - for x in local_device_protos if x.device_type == 'GPU' + for x in local_device_protos if x.device_type == "GPU" ] + lst with Executor(backend="flux_allocation") as exe: @@ -90,19 +90,19 @@ with Executor(backend="flux_allocation") as exe: fs = exe.submit( get_available_gpus, lst=future, - resource_dict={“cores”: 1, "gpus_per_core": 1}, + resource_dict={"cores": 1, "gpus_per_core": 1}, ) print(fs.result()) ``` -By adding the resource dictionary parameter in the submission function `resource_dict`, each Python function receives a dedicated CPU core and a corresponding GPU for the execution of the submitted function. In the submitted function the tensorflow machine learning framework is imported to list the metadata of the available GPU. Furthermore, the submission is repeated three times with the output being aggregated in a joined list. For the aggregation of the output of the individual submissions, the previous information is stored in a concurrent futures future object named `fs` and provided as an input to the next function which is submitted. Consequently, the execution is limited to a serial execution. Alternatively the results could be merged into one list after the submission of the individual functions, that would enable the parallel execution of the individual Python functions. +By adding the resource dictionary parameter `resource_dict` in the submission function, each Python function receives a dedicated CPU core and a corresponding GPU for the execution of the submitted function. In the submitted function the tensorflow machine learning framework is imported to list the metadata of the available GPU. Furthermore, the submission is repeated three times with the output being aggregated in a joined list. For the aggregation of the output of the individual submissions, the previous information is stored in a concurrent futures future object named `fs` and is provided as an input to the next function during submission. Consequently, the execution is limited to serial execution. Alternatively the results could be merged into one list after the submission of the individual functions, that would enable the parallel execution of the individual Python functions. # Usage To-Date While initially developed in the US DOE Exascale Computing Project’s Exascale Atomistic Capability for Accuracy, Length and Time (EXAALT) to accelerate the development of computational materials science simulation workflows for the Exascale, Executorlib has since been generalized to support a wide-range of backends and HPC clusters at different scales. Based on this generalization, it is also been implemented in the pyiron workflow framework [@pyiron] as primary task scheduling interface. # Additional Details -This manuscript provides a general overview of the Executorlib package, the full documentation including a number of examples for the individual features of the package is available at [executorlib.readthedocs.io](https://executorlib.readthedocs.io) and the corresponding source code at [github.com/pyiron/executorlib](https://github.com/pyiron/executorlib) . Executorlib is developed as open-source library, with a focus on stability, which is achieved with an >95% test coverage, type hinting and a minimalistic functional software design approach. +This manuscript provides a general overview of the Executorlib package, the full documentation including a number of examples for the individual features is available at [executorlib.readthedocs.io](https://executorlib.readthedocs.io) and the corresponding source code at [github.com/pyiron/executorlib](https://github.com/pyiron/executorlib). Executorlib is developed as open-source library, with a focus on stability, which is achieved with an >95% test coverage, type hinting and a minimalistic functional software design approach. # Acknowledgements -J.J. and D.P. acknowledge funding from the Exascale computing project and the hospitality from the “Data-Driven Materials Informatics” program from the Institute of Mathematical and Statistical Innovation (IMSI). J.J, M.G.T, P.Y., J.N. and D.P. acknowledge the hospitality of the Institute of Pure and Applied math (IPAM) as part of the “New Mathematics for the Exascale: Applications to Materials Science” long program +J.J. and D.P. acknowledge funding from the Exascale computing project and the hospitality from the “Data-Driven Materials Informatics” program from the Institute of Mathematical and Statistical Innovation (IMSI). J.J, M.G.T, P.Y., J.N. and D.P. acknowledge the hospitality of the Institute of Pure and Applied math (IPAM) as part of the “New Mathematics for the Exascale: Applications to Materials Science” long program. # References From 6676c13aa6022c5be323ebd222329b1e458f82cf Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Fri, 31 Jan 2025 20:31:03 +0100 Subject: [PATCH 20/27] Update paper.md --- docs/paper/paper.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/paper/paper.md b/docs/paper/paper.md index 4b2f5179..d401db5e 100644 --- a/docs/paper/paper.md +++ b/docs/paper/paper.md @@ -89,7 +89,7 @@ with Executor(backend="flux_allocation") as exe: for i in range(1, 4): fs = exe.submit( get_available_gpus, - lst=future, + lst=fs, resource_dict={"cores": 1, "gpus_per_core": 1}, ) print(fs.result()) From 2737fe494997ead6b0b1afe1b83f4c2c2d08dd0d Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Sun, 2 Feb 2025 15:45:33 +0100 Subject: [PATCH 21/27] Update paper.md --- docs/paper/paper.md | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/paper/paper.md b/docs/paper/paper.md index d401db5e..709340eb 100644 --- a/docs/paper/paper.md +++ b/docs/paper/paper.md @@ -33,10 +33,10 @@ bibliography: paper.bib # Summary Executorlib enables the execution of hierarchical Python workflows on the heterogenous computing resources of high-performance computing (HPC) clusters. This is achieved by extending the Executor class of the Python standard library for asynchronously executing callables with an interface to HPC job schedulers. The initial release of executorlib supports the Simple Linux Utility for Resource Management (SLURM) and the flux framework as HPC job schedulers to start Python processes with dedicated computing resources such as CPU cores, memory or accelerators like GPUs. For heterogenous workflows executorlib enables the use of parallel computing frameworks like the message passing interface (MPI) or of dedicated GPU libraries on a per workflow step basis. Python workflows can be up-scaled with executorlib from a laptop up to the latest Exascale HPC clusters with minimal code changes including support for hierarchical workflows. Finally, Executorlib provides several utility functions to accelerate the rapid prototyping of Python workflows, like the caching of intermediate results, the visualization of the workflow graph and the tracking of execution time, enabling fast and agile development. -# Statement of need -The convergence of artificial intelligence (AI) and high-performance computing (HPC) workflows [@workflows] is one of the key drivers for the rise of Python workflows for HPC. Previously, the Python programming language was primarily used in scientific HPC workloads to couple performance-critical scientific software packages written in different programming languages in order to solve complex tasks. To avoid intrusive code changes, interfaces to performance critical scientific software packages were traditionally implemented using file-based communication and control shell scripts, leading to poor maintainability, portability, and scalability. This approach is however losing ground to more efficient alternatives, such as the use of direct Python bindings, as their support is now increasingly common in scientific software packages and especially machine learning packages and AI frameworks. This enables the programmer to easily express complex workloads that require the orchestration of multiple codes. Still Python workflows for HPC also come with challenges, like (1) safely terminating Python processes, (2) controlling the resources of Python processes and (3) the management of Python environments [@pythonhpc]. The first two of these challenges can be addressed by developing strategies and tools to interface HPC job schedulers like the SLURM [@slurm] with Python in order to control the execution and manage the computational resources required to execute heterogenous HPC workflows. +# Statement of Need +The convergence of artificial intelligence (AI) and high-performance computing (HPC) workflows [@workflows] is one of the key drivers for the rise of Python workflows for HPC. Previously, the Python programming language was primarily used in scientific HPC workloads to couple performance-critical scientific software packages written in different programming languages in order to solve complex tasks. To avoid intrusive code changes, interfaces to performance critical scientific software packages were traditionally implemented using file-based communication and control shell scripts, leading to poor maintainability, portability, and scalability. This approach is however losing ground to more efficient alternatives, such as the use of direct Python bindings, as their support is now increasingly common in scientific software packages and especially machine learning packages and AI frameworks. This enables the programmer to easily express complex workloads that require the orchestration of multiple codes. Still, Python workflows for HPC also come with challenges, like (1) safely terminating Python processes, (2) controlling the resources of Python processes and (3) the management of Python environments [@pythonhpc]. The first two of these challenges can be addressed by developing strategies and tools to interface HPC job schedulers like the SLURM [@slurm] with Python in order to control the execution and manage the computational resources required to execute heterogenous HPC workflows. -We distinguish two main use cases for such interfaces: either to request a queuing system allocation from the job scheduler and or to internally allocate computing resources to individual (sub-)tasks within an existing queuing system allocation. In the context of the SLURM job scheduler, these differences are distinguished by the `sbatch` and `srun` command. A number of Python workflow frameworks have been developed for both types of interfaces, ranging from domain-specific solutions for fields like high throughput screening in computational materials science [@fireworks; @aiida; @pyiron], to generalized Python interfaces for job schedulers [@myqueue; @psij] and task scheduling frameworks which implement their own task scheduling on top of the HPC job scheduler [@dask; @parsl; @jobflow]. While these tools can be powerful, they introduce new constructs that are not familiar to most python developers, introducing complexity and a barrier to entry. To address this limitation while at the same time leveraging the powerful novel hierarchical HPC resource managers [@flux], we introduce Executorlib, which instead leverages and naturally extends the familiar Executor interface defined by the Python standard library from single-node shared-memory operation to multi-node distributed operation on HPC platforms. In doing so, Executorlib enables the rapid development, prototyping, and deployment of heterogenous HPC workflows using only familiar and easy to maintain Python syntax, hence greatly simplifying the up-scaling of scientific workflows from laptops to very large computational scales. +We distinguish two main use cases for such interfaces: either to request a queuing system allocation from the job scheduler and or to internally allocate computing resources to individual (sub-)tasks within an existing queuing system allocation. In the context of the SLURM job scheduler, these differences are distinguished by the `sbatch` and `srun` command. A number of Python workflow frameworks have been developed for both types of interfaces, ranging from domain-specific solutions for fields like high-throughput screening in computational materials science [@fireworks; @aiida; @pyiron], to generalized Python interfaces for job schedulers [@myqueue; @psij] and task scheduling frameworks which implement their own task scheduling on top of the HPC job scheduler [@dask; @parsl; @jobflow]. While these tools can be powerful, they introduce new constructs that are not familiar to most Python developers, introducing complexity and a barrier to entry. To address this limitation while at the same time leveraging the powerful novel hierarchical HPC resource managers [@flux], we introduce Executorlib, which instead leverages and naturally extends the familiar Executor interface defined by the Python standard library from single-node shared-memory operation to multi-node distributed operation on HPC platforms. In doing so, Executorlib enables the rapid development, prototyping, and deployment of heterogenous HPC workflows using only familiar and easy to maintain Python syntax, hence greatly simplifying the up-scaling of scientific workflows from laptops to very large computational scales. # Features and Implementation Based on prior experience with the development of the pyiron workflow framework [@pyiron], the design philosophy of Executorlib is centered on the timeless principle of not reinventing the wheel. Rather than implementing its own job scheduler, Executorlib instead leverages existing job schedulers to request and manage Python processes and associated computing resources. Further, instead of defining a new syntax and concepts, Executorlib extends the existing syntax of the Executor class in the Python standard library. Taken together, this makes changing the mode of execution in Executorlib as easy as changing a single variable, with the interface remaining the same. @@ -50,28 +50,28 @@ with Executor(backend="local") as exe: future_lst = [exe.submit(sum, [i, i]) for i in range(1, 5)] print([fs.result() for fs in future_lst]) ``` -In this example, each individual summation is concurrently executed in a separate process. We note the strict adherence to the standard python Executor Interface as the example remains functional when the Executorlib Executor `Executor(backend=”local”)` object is replaced with either the ThreadPoolExecutor `ThreadPoolExecutor()` or the ProcessPoolExecutor `ProcessPoolExecutor()` from the Python standard library. Following the initialization of the Executor context with the with-statement, the summation function `sum` is submitted for execution with the argument `[i, i]`, generated from the for-loop iterating over the range 1 to 4. \autoref{fig:process}. Illustrates the internal functionality of Executorlib. The submission function `submit()` requests the computational resources from the job scheduler, which can be SLURM, flux or a local job scheduler, depending on the choice of backend. The Python function is then executed asynchronously in a newly created Python process. The user can interact with the asynchronously executing Python process on the right through the concurrent futures Future object returned from the submission function, again as defined by the Python standard library. In the code example above, the concurrent future object is named `fs`. The concurrent futures Future object offers a function to check the status of the Python process (`done()`) and a function to block the execution of the process on the left until the execution of the process on the right is completed (`result()`). In contrast to the standard objects however, the Executorlib Executor allows for execution across multiple nodes of HPC systems, which enables the execution of highly compute intensive workloads that require extensive computational resources, as we now show. +In this example, each individual summation is concurrently executed in a separate process. We note the strict adherence to the standard python Executor Interface as the example remains functional when the Executorlib Executor `Executor(backend=”local”)` object is replaced with either the ThreadPoolExecutor `ThreadPoolExecutor()` or the ProcessPoolExecutor `ProcessPoolExecutor()` from the Python standard library. Following the initialization of the Executor context with the with-statement, the summation function `sum` is submitted for execution with the argument `[i, i]`, generated from the for-loop iterating over the range 1 to 4. \autoref{fig:process}. illustrates the internal functionality of Executorlib. The submission function `submit()` requests the computational resources from the job scheduler, which can be SLURM, flux or a local job scheduler, depending on the choice of backend. The Python function is then executed asynchronously in a newly created Python process. The user can interact with the asynchronously executing Python process on the right through the `concurrent.futures.Future` object returned from the submission function, again as defined by the Python standard library. In the code example above, the `concurrent.futures.Future` object is named `fs`. The concurrent futures Future object offers a function to check the status of the Python process (`done()`) and a function to block the execution of the process on the left until the execution of the process on the right is completed (`result()`). In contrast to the standard objects however, the Executorlib Executor allows for execution across multiple nodes of HPC systems, which enables the execution of highly compute-intensive workloads that require extensive computational resources, as we now show. ![Illustration of the communication between the Executorlib Executor, the job scheduler and the Python process to asynchronously execute the submitted Python function (on the right).\label{fig:process}](process.png) ## Computing Backends Currently, Executorlib supports four different computing backends specified by the backend -constructor argument. The first is a `“local”` backend for rapid prototyping on a local workstation in a way that is functionally similar to the standard `ProcessPoolExecutor`. The second `“slurm_submission”` backend can be used to submit Python functions as individual jobs to a SLURM job scheduler using the `sbatch` command, which can be useful for long running tasks, e.g., that call a compute intensive legacy code. This mode also has the advantage that all required hardware resources don’t have to be secured prior to launching the workflow and can naturally vary in time. The third is a `“slurm_allocation”` backend which distributes Python functions in a existing queuing system allocation using the `srun` command. Finally, the fourth is a `“flux_allocation”` backend using flux as hierarchical resource manager inside a given SLURM allocation. While the `“slurm_submission”` backend uses file-based communication under the hood e.g., the Python function to execute and its inputs are stored on the file system, executed in a separate Python process whose the output are again stored in a file, the other backends rely on socket-based communication to improve computational efficiency. +constructor argument. The first is a `“local”` backend for rapid prototyping on a local workstation in a way that is functionally similar to the standard `ProcessPoolExecutor`. The second `“slurm_submission”` backend can be used to submit Python functions as individual jobs to a SLURM job scheduler using the `sbatch` command, which can be useful for long-running tasks, e.g., that call a compute intensive legacy code. This mode also has the advantage that all required hardware resources do not have to be secured prior to launching the workflow and can naturally vary in time. The third is a `“slurm_allocation”` backend which distributes Python functions in an existing queuing system allocation using the `srun` command. Finally, the fourth is a `“flux_allocation”` backend using flux as hierarchical resource manager inside a given SLURM allocation. While the `“slurm_submission”` backend uses file-based communication under the hood e.g., the Python function to execute and its inputs are stored on the file system, executed in a separate Python process whose the output are again stored in a file, the other backends rely on socket-based communication to improve computational efficiency. -## Resource assignment +## Resource Assignment To assign dedicated computing resources to individual Python functions, the Executorlib Executor class extends the submission function `submit()` to support not only the Python function and its inputs, but also a Python dictionary specifying the requested computing resources `resource_dict`. The resource dictionary can define the number of compute cores, number of threads, number of GPUs, as well as job scheduler specific parameters like the working directory, maximum run time or the maximum memory. With this hierarchical approach, Executorlib allows the user to finely control the execution of each individual Python function, using parallel communication libraries like the Message Passing Interface (MPI) for Python [@mpi4py] or GPU-optimized libraries to aggressively optimize complex compute intensive tasks of heterogenous HPC that are best solved by tightly-coupled parallelization approaches, while offering a simple and easy to maintain approach to the orchestration of many such weakly-coupled tasks. This ability to seamlessly combine different programming models again accelerates the rapid prototyping of heterogenous HPC workflows without sacrificing performance of critical code components. ## Dependencies -While two inter-dependent Python functions with similar computational resource requirements can always be combined and executed as a single Python function, this is no longer the case for Python functions with dramatically different resource requirements. In this case Executorlib, again extends the submission function `submit()` to support concurrent futures Future objects from the Python standard library as inputs. When such an argument is passed as input of a subsequent function, the Executor waits until the Python process linked to the concurrent futures Future object completes its execution, before submitting the dependent Python function for execution. In the case of the `“slurm_submission”` backend which uses file-based communication, the dependencies of the Python functions are communicated to the SLURM job scheduler, so the communication is decoupled from the initial Python process, which submitted the Python functions, as the execution can be delayed until the user receives access to the requested computing resources from the SLURM job scheduler. Finally, by enabling the plotting parameter `plot_dependency_graph=True` during the initialization of the Executorlib Executor class, the resulting dependency graph can be visualized to validate the dependency relationships between the different concurrent futures Future objects. +While two inter-dependent Python functions with similar computational resource requirements can always be combined and executed as a single Python function, this is no longer the case for Python functions with dramatically different resource requirements. In this case Executorlib again extends the submission function `submit()` to support concurrent futures Future objects from the Python standard library as inputs. When such an argument is passed as input of a subsequent function, the Executor waits until the Python process linked to the `concurrent.futures.Future` object completes its execution, before submitting the dependent Python function for execution. In the case of the `“slurm_submission”` backend which uses file-based communication, the dependencies of the Python functions are communicated to the SLURM job scheduler, so the communication is decoupled from the initial Python process, which submitted the Python functions, as the execution can be delayed until the user receives access to the requested computing resources from the SLURM job scheduler. Finally, by enabling the plotting parameter `plot_dependency_graph=True` during the initialization of the Executorlib Executor class, the resulting dependency graph can be visualized to validate the dependency relationships between the different concurrent futures Future objects. ## Performance Optimization While Executorlib is not a priori designed for Python functions with runtimes of less than about a minute, given the overhead of requesting dedicated computing resources and starting a new Python process, the execution of these functions can be significantly accelerated by reusing dedicated computing resources for the submission of multiple Python functions. This is enabled by setting the block allocation parameter `block_allocation` during the initialization of the Executor class to `True`. Rather than starting a separate Python process for each submitted Python function, the block allocation mode starts a dedicated number of workers (with a fixed resource allocation over their lifetime) and then allows the user to submit Python functions to these pre-defined workers. To further improve computational efficiency when working with multiple analysis functions being applied on the same large dataset, data can be pre-loaded during the initialization of the Python function using the initialization function `init_function`. This initializes a Python dictionary in the Python process which is accessible by all subsequently submitted Python functions. ## Caching -The development of an HPC workflow is commonly an iterative process, which means the initial steps are repeated multiple times until the workflow is fully developed. To accelerate this process, Executorlib provides the option to cache the output of previously evaluated Python functions so these outputs can be reloaded without the need for repeating the evaluation of the same potentially expensive Python functions. Caching in Executorlib uses the same file storage interface as for the file-based communication with the `“slurm_submission”` backend. The caching is enabled by defining the cache directory parameter `cache_directory` as additional input during the initialization of the Executorlib Executor class. Finally, the cache also contains the execution time as additional information, enabling performance analysis of the workflow during the development cycle. +The development of a HPC workflow is commonly an iterative process, which means the initial steps are repeated multiple times until the workflow is fully developed. To accelerate this process, Executorlib provides the option to cache the output of previously evaluated Python functions so these outputs can be reloaded without the need for repeating the evaluation of the same potentially expensive Python functions. Caching in Executorlib uses the same file storage interface as for the file-based communication with the `“slurm_submission”` backend. The caching is enabled by defining the cache directory parameter `cache_directory` as additional input during the initialization of the Executorlib Executor class. Finally, the cache also contains the execution time as additional information, enabling performance analysis of the workflow during the development cycle. ## Advanced Example -To demonstrate the advanced functionality of executorlib beyond the scope of the Executor interface of the Python standard library a second advanced example is provided. This advanced example requires the flux framework to be installed, with at least one computing node in a given queuing system allocation and with each computing node having at least one GPU. +To demonstrate the advanced functionality of Executorlib beyond the scope of the Executor interface of the Python standard library a second advanced example is provided. This advanced example requires the flux framework to be installed with at least one computing node in a given queuing system allocation and with each computing node having at least one GPU. ```python from executorlib import Executor @@ -94,13 +94,13 @@ with Executor(backend="flux_allocation") as exe: ) print(fs.result()) ``` -By adding the resource dictionary parameter `resource_dict` in the submission function, each Python function receives a dedicated CPU core and a corresponding GPU for the execution of the submitted function. In the submitted function the tensorflow machine learning framework is imported to list the metadata of the available GPU. Furthermore, the submission is repeated three times with the output being aggregated in a joined list. For the aggregation of the output of the individual submissions, the previous information is stored in a concurrent futures future object named `fs` and is provided as an input to the next function during submission. Consequently, the execution is limited to serial execution. Alternatively the results could be merged into one list after the submission of the individual functions, that would enable the parallel execution of the individual Python functions. +By adding the resource dictionary parameter `resource_dict` in the submission function, each Python function receives a dedicated CPU core and a corresponding GPU for the execution of the submitted function. In the submitted function the tensorflow machine learning framework is imported to list the metadata of the available GPU. Furthermore, the submission is repeated three times with the output being aggregated in a joined list. For the aggregation of the output of the individual submissions, the previous information is stored in a `concurrent.futures.Future` object named `fs` and is provided as an input to the next function during submission. Consequently, the execution is limited to serial execution. Alternatively, the results could be merged into one list after the submission of the individual functions, that would enable the parallel execution of the individual Python functions. # Usage To-Date While initially developed in the US DOE Exascale Computing Project’s Exascale Atomistic Capability for Accuracy, Length and Time (EXAALT) to accelerate the development of computational materials science simulation workflows for the Exascale, Executorlib has since been generalized to support a wide-range of backends and HPC clusters at different scales. Based on this generalization, it is also been implemented in the pyiron workflow framework [@pyiron] as primary task scheduling interface. # Additional Details -This manuscript provides a general overview of the Executorlib package, the full documentation including a number of examples for the individual features is available at [executorlib.readthedocs.io](https://executorlib.readthedocs.io) and the corresponding source code at [github.com/pyiron/executorlib](https://github.com/pyiron/executorlib). Executorlib is developed as open-source library, with a focus on stability, which is achieved with an >95% test coverage, type hinting and a minimalistic functional software design approach. +This manuscript provides a general overview of the Executorlib package, the full documentation including a number of examples for the individual features is available at [executorlib.readthedocs.io](https://executorlib.readthedocs.io) and the corresponding source code at [github.com/pyiron/executorlib](https://github.com/pyiron/executorlib). Executorlib is developed an open-source library with a focus on stability, which is achieved with an >95% test coverage, type hinting and a minimalistic functional software design approach. # Acknowledgements J.J. and D.P. acknowledge funding from the Exascale computing project and the hospitality from the “Data-Driven Materials Informatics” program from the Institute of Mathematical and Statistical Innovation (IMSI). J.J, M.G.T, P.Y., J.N. and D.P. acknowledge the hospitality of the Institute of Pure and Applied math (IPAM) as part of the “New Mathematics for the Exascale: Applications to Materials Science” long program. From 85c2097e642593036679e69538cb0d3823a011ba Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Sun, 2 Feb 2025 15:48:14 +0100 Subject: [PATCH 22/27] Update paper.md --- docs/paper/paper.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/paper/paper.md b/docs/paper/paper.md index 709340eb..22968a2c 100644 --- a/docs/paper/paper.md +++ b/docs/paper/paper.md @@ -50,7 +50,7 @@ with Executor(backend="local") as exe: future_lst = [exe.submit(sum, [i, i]) for i in range(1, 5)] print([fs.result() for fs in future_lst]) ``` -In this example, each individual summation is concurrently executed in a separate process. We note the strict adherence to the standard python Executor Interface as the example remains functional when the Executorlib Executor `Executor(backend=”local”)` object is replaced with either the ThreadPoolExecutor `ThreadPoolExecutor()` or the ProcessPoolExecutor `ProcessPoolExecutor()` from the Python standard library. Following the initialization of the Executor context with the with-statement, the summation function `sum` is submitted for execution with the argument `[i, i]`, generated from the for-loop iterating over the range 1 to 4. \autoref{fig:process}. illustrates the internal functionality of Executorlib. The submission function `submit()` requests the computational resources from the job scheduler, which can be SLURM, flux or a local job scheduler, depending on the choice of backend. The Python function is then executed asynchronously in a newly created Python process. The user can interact with the asynchronously executing Python process on the right through the `concurrent.futures.Future` object returned from the submission function, again as defined by the Python standard library. In the code example above, the `concurrent.futures.Future` object is named `fs`. The concurrent futures Future object offers a function to check the status of the Python process (`done()`) and a function to block the execution of the process on the left until the execution of the process on the right is completed (`result()`). In contrast to the standard objects however, the Executorlib Executor allows for execution across multiple nodes of HPC systems, which enables the execution of highly compute-intensive workloads that require extensive computational resources, as we now show. +In this example, each individual summation is concurrently executed in a separate process. We note the strict adherence to the standard python Executor Interface as the example remains functional when the Executorlib Executor `Executor(backend=”local”)` object is replaced with either the ThreadPoolExecutor `ThreadPoolExecutor()` or the ProcessPoolExecutor `ProcessPoolExecutor()` from the Python standard library. Following the initialization of the Executor context with the with-statement, the summation function `sum` is submitted for execution with the argument `[i, i]`, generated from the for-loop iterating over the range 1 to 4. \autoref{fig:process}. illustrates the internal functionality of Executorlib. The submission function `submit()` requests the computational resources from the job scheduler, which can be SLURM, flux or a local job scheduler, depending on the choice of backend. The Python function is then executed asynchronously in a newly created Python process. The user can interact with the asynchronously executing Python process on the right through the `concurrent.futures.Future` object returned from the submission function, again as defined by the Python standard library. In the code example above, the `concurrent.futures.Future` object is named `fs`. The `concurrent.futures.Future` object offers a function to check the status of the Python process (`done()`) and a function to block the execution of the process on the left until the execution of the process on the right is completed (`result()`). In contrast to the standard objects however, the Executorlib Executor allows for execution across multiple nodes of HPC systems, which enables the execution of highly compute-intensive workloads that require extensive computational resources, as we now show. ![Illustration of the communication between the Executorlib Executor, the job scheduler and the Python process to asynchronously execute the submitted Python function (on the right).\label{fig:process}](process.png) @@ -62,7 +62,7 @@ constructor argument. The first is a `“local”` backend for rapid prototyping To assign dedicated computing resources to individual Python functions, the Executorlib Executor class extends the submission function `submit()` to support not only the Python function and its inputs, but also a Python dictionary specifying the requested computing resources `resource_dict`. The resource dictionary can define the number of compute cores, number of threads, number of GPUs, as well as job scheduler specific parameters like the working directory, maximum run time or the maximum memory. With this hierarchical approach, Executorlib allows the user to finely control the execution of each individual Python function, using parallel communication libraries like the Message Passing Interface (MPI) for Python [@mpi4py] or GPU-optimized libraries to aggressively optimize complex compute intensive tasks of heterogenous HPC that are best solved by tightly-coupled parallelization approaches, while offering a simple and easy to maintain approach to the orchestration of many such weakly-coupled tasks. This ability to seamlessly combine different programming models again accelerates the rapid prototyping of heterogenous HPC workflows without sacrificing performance of critical code components. ## Dependencies -While two inter-dependent Python functions with similar computational resource requirements can always be combined and executed as a single Python function, this is no longer the case for Python functions with dramatically different resource requirements. In this case Executorlib again extends the submission function `submit()` to support concurrent futures Future objects from the Python standard library as inputs. When such an argument is passed as input of a subsequent function, the Executor waits until the Python process linked to the `concurrent.futures.Future` object completes its execution, before submitting the dependent Python function for execution. In the case of the `“slurm_submission”` backend which uses file-based communication, the dependencies of the Python functions are communicated to the SLURM job scheduler, so the communication is decoupled from the initial Python process, which submitted the Python functions, as the execution can be delayed until the user receives access to the requested computing resources from the SLURM job scheduler. Finally, by enabling the plotting parameter `plot_dependency_graph=True` during the initialization of the Executorlib Executor class, the resulting dependency graph can be visualized to validate the dependency relationships between the different concurrent futures Future objects. +While two inter-dependent Python functions with similar computational resource requirements can always be combined and executed as a single Python function, this is no longer the case for Python functions with dramatically different resource requirements. In this case Executorlib again extends the submission function `submit()` to support `concurrent.futures.Future` objects from the Python standard library as inputs. When such an argument is passed as input of a subsequent function, the Executor waits until the Python process linked to the `concurrent.futures.Future` object completes its execution, before submitting the dependent Python function for execution. In the case of the `“slurm_submission”` backend which uses file-based communication, the dependencies of the Python functions are communicated to the SLURM job scheduler, so the communication is decoupled from the initial Python process, which submitted the Python functions, as the execution can be delayed until the user receives access to the requested computing resources from the SLURM job scheduler. Finally, by enabling the plotting parameter `plot_dependency_graph=True` during the initialization of the Executorlib Executor class, the resulting dependency graph can be visualized to validate the dependency relationships between the different concurrent futures Future objects. ## Performance Optimization While Executorlib is not a priori designed for Python functions with runtimes of less than about a minute, given the overhead of requesting dedicated computing resources and starting a new Python process, the execution of these functions can be significantly accelerated by reusing dedicated computing resources for the submission of multiple Python functions. This is enabled by setting the block allocation parameter `block_allocation` during the initialization of the Executor class to `True`. Rather than starting a separate Python process for each submitted Python function, the block allocation mode starts a dedicated number of workers (with a fixed resource allocation over their lifetime) and then allows the user to submit Python functions to these pre-defined workers. To further improve computational efficiency when working with multiple analysis functions being applied on the same large dataset, data can be pre-loaded during the initialization of the Python function using the initialization function `init_function`. This initializes a Python dictionary in the Python process which is accessible by all subsequently submitted Python functions. From 2395c7ef4b36907c5a2f78a2142d4c88901a1d88 Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Sun, 2 Feb 2025 15:48:49 +0100 Subject: [PATCH 23/27] Update paper.md --- docs/paper/paper.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/paper/paper.md b/docs/paper/paper.md index 22968a2c..7bca3443 100644 --- a/docs/paper/paper.md +++ b/docs/paper/paper.md @@ -62,7 +62,7 @@ constructor argument. The first is a `“local”` backend for rapid prototyping To assign dedicated computing resources to individual Python functions, the Executorlib Executor class extends the submission function `submit()` to support not only the Python function and its inputs, but also a Python dictionary specifying the requested computing resources `resource_dict`. The resource dictionary can define the number of compute cores, number of threads, number of GPUs, as well as job scheduler specific parameters like the working directory, maximum run time or the maximum memory. With this hierarchical approach, Executorlib allows the user to finely control the execution of each individual Python function, using parallel communication libraries like the Message Passing Interface (MPI) for Python [@mpi4py] or GPU-optimized libraries to aggressively optimize complex compute intensive tasks of heterogenous HPC that are best solved by tightly-coupled parallelization approaches, while offering a simple and easy to maintain approach to the orchestration of many such weakly-coupled tasks. This ability to seamlessly combine different programming models again accelerates the rapid prototyping of heterogenous HPC workflows without sacrificing performance of critical code components. ## Dependencies -While two inter-dependent Python functions with similar computational resource requirements can always be combined and executed as a single Python function, this is no longer the case for Python functions with dramatically different resource requirements. In this case Executorlib again extends the submission function `submit()` to support `concurrent.futures.Future` objects from the Python standard library as inputs. When such an argument is passed as input of a subsequent function, the Executor waits until the Python process linked to the `concurrent.futures.Future` object completes its execution, before submitting the dependent Python function for execution. In the case of the `“slurm_submission”` backend which uses file-based communication, the dependencies of the Python functions are communicated to the SLURM job scheduler, so the communication is decoupled from the initial Python process, which submitted the Python functions, as the execution can be delayed until the user receives access to the requested computing resources from the SLURM job scheduler. Finally, by enabling the plotting parameter `plot_dependency_graph=True` during the initialization of the Executorlib Executor class, the resulting dependency graph can be visualized to validate the dependency relationships between the different concurrent futures Future objects. +While two inter-dependent Python functions with similar computational resource requirements can always be combined and executed as a single Python function, this is no longer the case for Python functions with dramatically different resource requirements. In this case Executorlib again extends the submission function `submit()` to support `concurrent.futures.Future` objects from the Python standard library as inputs. When such an argument is passed as input of a subsequent function, the Executor waits until the Python process linked to the `concurrent.futures.Future` object completes its execution, before submitting the dependent Python function for execution. In the case of the `“slurm_submission”` backend which uses file-based communication, the dependencies of the Python functions are communicated to the SLURM job scheduler, so the communication is decoupled from the initial Python process, which submitted the Python functions, as the execution can be delayed until the user receives access to the requested computing resources from the SLURM job scheduler. Finally, by enabling the plotting parameter `plot_dependency_graph=True` during the initialization of the Executorlib Executor class, the resulting dependency graph can be visualized to validate the dependency relationships between the different `concurrent.futures.Future` objects. ## Performance Optimization While Executorlib is not a priori designed for Python functions with runtimes of less than about a minute, given the overhead of requesting dedicated computing resources and starting a new Python process, the execution of these functions can be significantly accelerated by reusing dedicated computing resources for the submission of multiple Python functions. This is enabled by setting the block allocation parameter `block_allocation` during the initialization of the Executor class to `True`. Rather than starting a separate Python process for each submitted Python function, the block allocation mode starts a dedicated number of workers (with a fixed resource allocation over their lifetime) and then allows the user to submit Python functions to these pre-defined workers. To further improve computational efficiency when working with multiple analysis functions being applied on the same large dataset, data can be pre-loaded during the initialization of the Python function using the initialization function `init_function`. This initializes a Python dictionary in the Python process which is accessible by all subsequently submitted Python functions. From 97c091972c8521462814d0f61e360c00b894dbb4 Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Sun, 2 Feb 2025 15:54:18 +0100 Subject: [PATCH 24/27] Update paper.md --- docs/paper/paper.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/paper/paper.md b/docs/paper/paper.md index 7bca3443..f6a73486 100644 --- a/docs/paper/paper.md +++ b/docs/paper/paper.md @@ -31,7 +31,7 @@ bibliography: paper.bib --- # Summary -Executorlib enables the execution of hierarchical Python workflows on the heterogenous computing resources of high-performance computing (HPC) clusters. This is achieved by extending the Executor class of the Python standard library for asynchronously executing callables with an interface to HPC job schedulers. The initial release of executorlib supports the Simple Linux Utility for Resource Management (SLURM) and the flux framework as HPC job schedulers to start Python processes with dedicated computing resources such as CPU cores, memory or accelerators like GPUs. For heterogenous workflows executorlib enables the use of parallel computing frameworks like the message passing interface (MPI) or of dedicated GPU libraries on a per workflow step basis. Python workflows can be up-scaled with executorlib from a laptop up to the latest Exascale HPC clusters with minimal code changes including support for hierarchical workflows. Finally, Executorlib provides several utility functions to accelerate the rapid prototyping of Python workflows, like the caching of intermediate results, the visualization of the workflow graph and the tracking of execution time, enabling fast and agile development. +Executorlib enables the execution of hierarchical Python workflows on the heterogenous computing resources of high-performance computing (HPC) clusters. This is achieved by extending the Executor class of the Python standard library for asynchronously executing callables with an interface to HPC job schedulers. The initial release of Executorlib supports the Simple Linux Utility for Resource Management (SLURM) and the flux framework as HPC job schedulers to start Python processes with dedicated computing resources such as CPU cores, memory or accelerators like GPUs. For heterogenous workflows, Executorlib enables the use of parallel computing frameworks like the message passing interface (MPI) or of dedicated GPU libraries on a per workflow step basis. Python workflows can be up-scaled with Executorlib from a laptop up to the latest Exascale HPC clusters with minimal code changes including support for hierarchical workflows. Finally, Executorlib provides several utility functions to accelerate the rapid prototyping of Python workflows, like the caching of intermediate results, the visualization of the workflow graph and the tracking of execution time, enabling fast and agile development. # Statement of Need The convergence of artificial intelligence (AI) and high-performance computing (HPC) workflows [@workflows] is one of the key drivers for the rise of Python workflows for HPC. Previously, the Python programming language was primarily used in scientific HPC workloads to couple performance-critical scientific software packages written in different programming languages in order to solve complex tasks. To avoid intrusive code changes, interfaces to performance critical scientific software packages were traditionally implemented using file-based communication and control shell scripts, leading to poor maintainability, portability, and scalability. This approach is however losing ground to more efficient alternatives, such as the use of direct Python bindings, as their support is now increasingly common in scientific software packages and especially machine learning packages and AI frameworks. This enables the programmer to easily express complex workloads that require the orchestration of multiple codes. Still, Python workflows for HPC also come with challenges, like (1) safely terminating Python processes, (2) controlling the resources of Python processes and (3) the management of Python environments [@pythonhpc]. The first two of these challenges can be addressed by developing strategies and tools to interface HPC job schedulers like the SLURM [@slurm] with Python in order to control the execution and manage the computational resources required to execute heterogenous HPC workflows. @@ -55,8 +55,7 @@ In this example, each individual summation is concurrently executed in a separat ![Illustration of the communication between the Executorlib Executor, the job scheduler and the Python process to asynchronously execute the submitted Python function (on the right).\label{fig:process}](process.png) ## Computing Backends -Currently, Executorlib supports four different computing backends specified by the backend -constructor argument. The first is a `“local”` backend for rapid prototyping on a local workstation in a way that is functionally similar to the standard `ProcessPoolExecutor`. The second `“slurm_submission”` backend can be used to submit Python functions as individual jobs to a SLURM job scheduler using the `sbatch` command, which can be useful for long-running tasks, e.g., that call a compute intensive legacy code. This mode also has the advantage that all required hardware resources do not have to be secured prior to launching the workflow and can naturally vary in time. The third is a `“slurm_allocation”` backend which distributes Python functions in an existing queuing system allocation using the `srun` command. Finally, the fourth is a `“flux_allocation”` backend using flux as hierarchical resource manager inside a given SLURM allocation. While the `“slurm_submission”` backend uses file-based communication under the hood e.g., the Python function to execute and its inputs are stored on the file system, executed in a separate Python process whose the output are again stored in a file, the other backends rely on socket-based communication to improve computational efficiency. +Currently, Executorlib supports four different computing backends specified by the backend constructor argument. The first is a `“local”` backend for rapid prototyping on a local workstation in a way that is functionally similar to the standard `ProcessPoolExecutor`. The second `“slurm_submission”` backend can be used to submit Python functions as individual jobs to a SLURM job scheduler using the `sbatch` command, which can be useful for long-running tasks, e.g., that call a compute intensive legacy code. This mode also has the advantage that all required hardware resources do not have to be secured prior to launching the workflow and can naturally vary in time. The third is a `“slurm_allocation”` backend which distributes Python functions in an existing queuing system allocation using the `srun` command. Finally, the fourth is a `“flux_allocation”` backend using flux as hierarchical resource manager inside a given SLURM allocation. While the `“slurm_submission”` backend uses file-based communication under the hood e.g., the Python function to execute and its inputs are stored on the file system, executed in a separate Python process whose the output are again stored in a file, the other backends rely on socket-based communication to improve computational efficiency. ## Resource Assignment To assign dedicated computing resources to individual Python functions, the Executorlib Executor class extends the submission function `submit()` to support not only the Python function and its inputs, but also a Python dictionary specifying the requested computing resources `resource_dict`. The resource dictionary can define the number of compute cores, number of threads, number of GPUs, as well as job scheduler specific parameters like the working directory, maximum run time or the maximum memory. With this hierarchical approach, Executorlib allows the user to finely control the execution of each individual Python function, using parallel communication libraries like the Message Passing Interface (MPI) for Python [@mpi4py] or GPU-optimized libraries to aggressively optimize complex compute intensive tasks of heterogenous HPC that are best solved by tightly-coupled parallelization approaches, while offering a simple and easy to maintain approach to the orchestration of many such weakly-coupled tasks. This ability to seamlessly combine different programming models again accelerates the rapid prototyping of heterogenous HPC workflows without sacrificing performance of critical code components. @@ -103,6 +102,6 @@ While initially developed in the US DOE Exascale Computing Project’s Exascale This manuscript provides a general overview of the Executorlib package, the full documentation including a number of examples for the individual features is available at [executorlib.readthedocs.io](https://executorlib.readthedocs.io) and the corresponding source code at [github.com/pyiron/executorlib](https://github.com/pyiron/executorlib). Executorlib is developed an open-source library with a focus on stability, which is achieved with an >95% test coverage, type hinting and a minimalistic functional software design approach. # Acknowledgements -J.J. and D.P. acknowledge funding from the Exascale computing project and the hospitality from the “Data-Driven Materials Informatics” program from the Institute of Mathematical and Statistical Innovation (IMSI). J.J, M.G.T, P.Y., J.N. and D.P. acknowledge the hospitality of the Institute of Pure and Applied math (IPAM) as part of the “New Mathematics for the Exascale: Applications to Materials Science” long program. +J.J. and D.P. acknowledge funding from the Exascale Computing Project (17-SC-20-SC), a collaborative effort of the U.S. Department of Energy Office of Science and the National Nuclear Security Administration, and the hospitality from the “Data-Driven Materials Informatics” program from the Institute of Mathematical and Statistical Innovation (IMSI). J.J, M.G.T, P.Y., J.N. and D.P. acknowledge the hospitality of the Institute of Pure and Applied math (IPAM) as part of the “New Mathematics for the Exascale: Applications to Materials Science” long program. Los Alamos National Laboratory is operated by Triad National Security LLC, for the National Nuclear Security administration of the U.S. DOE under Contract No. 89233218CNA0000001. # References From 538def0fbf540e1be9445bf13c7f695d3e26540b Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Sun, 2 Feb 2025 16:37:37 +0100 Subject: [PATCH 25/27] Update paper.md --- docs/paper/paper.md | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/docs/paper/paper.md b/docs/paper/paper.md index f6a73486..0ce7a4b5 100644 --- a/docs/paper/paper.md +++ b/docs/paper/paper.md @@ -36,43 +36,43 @@ Executorlib enables the execution of hierarchical Python workflows on the hetero # Statement of Need The convergence of artificial intelligence (AI) and high-performance computing (HPC) workflows [@workflows] is one of the key drivers for the rise of Python workflows for HPC. Previously, the Python programming language was primarily used in scientific HPC workloads to couple performance-critical scientific software packages written in different programming languages in order to solve complex tasks. To avoid intrusive code changes, interfaces to performance critical scientific software packages were traditionally implemented using file-based communication and control shell scripts, leading to poor maintainability, portability, and scalability. This approach is however losing ground to more efficient alternatives, such as the use of direct Python bindings, as their support is now increasingly common in scientific software packages and especially machine learning packages and AI frameworks. This enables the programmer to easily express complex workloads that require the orchestration of multiple codes. Still, Python workflows for HPC also come with challenges, like (1) safely terminating Python processes, (2) controlling the resources of Python processes and (3) the management of Python environments [@pythonhpc]. The first two of these challenges can be addressed by developing strategies and tools to interface HPC job schedulers like the SLURM [@slurm] with Python in order to control the execution and manage the computational resources required to execute heterogenous HPC workflows. -We distinguish two main use cases for such interfaces: either to request a queuing system allocation from the job scheduler and or to internally allocate computing resources to individual (sub-)tasks within an existing queuing system allocation. In the context of the SLURM job scheduler, these differences are distinguished by the `sbatch` and `srun` command. A number of Python workflow frameworks have been developed for both types of interfaces, ranging from domain-specific solutions for fields like high-throughput screening in computational materials science [@fireworks; @aiida; @pyiron], to generalized Python interfaces for job schedulers [@myqueue; @psij] and task scheduling frameworks which implement their own task scheduling on top of the HPC job scheduler [@dask; @parsl; @jobflow]. While these tools can be powerful, they introduce new constructs that are not familiar to most Python developers, introducing complexity and a barrier to entry. To address this limitation while at the same time leveraging the powerful novel hierarchical HPC resource managers [@flux], we introduce Executorlib, which instead leverages and naturally extends the familiar Executor interface defined by the Python standard library from single-node shared-memory operation to multi-node distributed operation on HPC platforms. In doing so, Executorlib enables the rapid development, prototyping, and deployment of heterogenous HPC workflows using only familiar and easy to maintain Python syntax, hence greatly simplifying the up-scaling of scientific workflows from laptops to very large computational scales. +We distinguish two main use cases for such interfaces: either to request a separate queuing system allocation from the job scheduler for each workflow step or to internally allocate computing resources to individual (sub-)tasks within an existing queuing system allocation. In the context of the SLURM job scheduler, these differences are distinguished by the `sbatch` and `srun` command. A number of Python workflow frameworks have been developed for both types of interfaces, ranging from domain-specific solutions for fields like high-throughput screening in computational materials science [@fireworks; @aiida; @pyiron], to generalized Python interfaces for job schedulers [@myqueue; @psij] and task scheduling frameworks which implement their own task scheduling on top of the HPC job scheduler [@dask; @parsl; @jobflow]. While these tools can be powerful, they introduce new constructs that are not familiar to most Python developers, introducing complexity and a barrier to entry. To address this limitation while at the same time leveraging the powerful novel hierarchical HPC resource managers [@flux], we introduce Executorlib, which instead leverages and naturally extends the familiar Executor interface defined by the Python standard library from single-node shared-memory operation to multi-node distributed operation on HPC platforms. In doing so, Executorlib enables the rapid development, prototyping, and deployment of heterogenous HPC workflows using only familiar and easy to maintain Python syntax, hence greatly simplifying the up-scaling of scientific workflows from laptops to very large computational scales. # Features and Implementation -Based on prior experience with the development of the pyiron workflow framework [@pyiron], the design philosophy of Executorlib is centered on the timeless principle of not reinventing the wheel. Rather than implementing its own job scheduler, Executorlib instead leverages existing job schedulers to request and manage Python processes and associated computing resources. Further, instead of defining a new syntax and concepts, Executorlib extends the existing syntax of the Executor class in the Python standard library. Taken together, this makes changing the mode of execution in Executorlib as easy as changing a single variable, with the interface remaining the same. +Based on prior experience with the development of the pyiron workflow framework [@pyiron], the design philosophy of Executorlib is centered on the timeless principle of not reinventing the wheel. Rather than implementing its own job scheduler, Executorlib instead leverages existing job schedulers to request and manage Python processes and associated computing resources. Further, instead of defining a new syntax and concepts, Executorlib extends the existing syntax of the Executor class in the Python standard library. Taken together, this makes changing the mode of execution in Executorlib as easy as changing the Executor class, with the interface remaining the same. ## Example To illustrate the usage of Executorlib and explain the technical processes occurring in the background, we consider the simple example of doubling the numbers in the range from 1 to 4. With Executorlib, this can be achieved with the following code: ```python -from executorlib import Executor +from executorlib import SingleNodeExecutor -with Executor(backend="local") as exe: +with SingleNodeExecutor() as exe: future_lst = [exe.submit(sum, [i, i]) for i in range(1, 5)] print([fs.result() for fs in future_lst]) ``` -In this example, each individual summation is concurrently executed in a separate process. We note the strict adherence to the standard python Executor Interface as the example remains functional when the Executorlib Executor `Executor(backend=”local”)` object is replaced with either the ThreadPoolExecutor `ThreadPoolExecutor()` or the ProcessPoolExecutor `ProcessPoolExecutor()` from the Python standard library. Following the initialization of the Executor context with the with-statement, the summation function `sum` is submitted for execution with the argument `[i, i]`, generated from the for-loop iterating over the range 1 to 4. \autoref{fig:process}. illustrates the internal functionality of Executorlib. The submission function `submit()` requests the computational resources from the job scheduler, which can be SLURM, flux or a local job scheduler, depending on the choice of backend. The Python function is then executed asynchronously in a newly created Python process. The user can interact with the asynchronously executing Python process on the right through the `concurrent.futures.Future` object returned from the submission function, again as defined by the Python standard library. In the code example above, the `concurrent.futures.Future` object is named `fs`. The `concurrent.futures.Future` object offers a function to check the status of the Python process (`done()`) and a function to block the execution of the process on the left until the execution of the process on the right is completed (`result()`). In contrast to the standard objects however, the Executorlib Executor allows for execution across multiple nodes of HPC systems, which enables the execution of highly compute-intensive workloads that require extensive computational resources, as we now show. +In this example, each individual summation is concurrently executed in a separate process. We note the strict adherence to the standard python Executor Interface as the example remains functional when the Executorlib Executor `SingleNodeExecutor()` object is replaced with either the ThreadPoolExecutor `ThreadPoolExecutor()` or the ProcessPoolExecutor `ProcessPoolExecutor()` from the Python standard library. Following the initialization of the Executor context with the with-statement, the summation function `sum` is submitted for execution with the argument `[i, i]`, generated from the for-loop iterating over the range 1 to 4. \autoref{fig:process}. illustrates the internal functionality of Executorlib. The submission function `submit()` requests the computational resources from the job scheduler, which can be SLURM, flux or a local job scheduler, depending on the choice of backend. The Python function is then executed asynchronously in a newly created Python process. The user can interact with the asynchronously executing Python process on the right through the `concurrent.futures.Future` object returned from the submission function, again as defined by the Python standard library. In the code example above, the `concurrent.futures.Future` object is named `fs`. The `concurrent.futures.Future` object offers a function to check the status of the Python process (`done()`) and a function to block the execution of the process on the left until the execution of the process on the right is completed (`result()`). In contrast to the standard objects however, the Executorlib Executor allows for execution across multiple nodes of HPC systems, which enables the execution of highly compute-intensive workloads that require extensive computational resources, as we now show. ![Illustration of the communication between the Executorlib Executor, the job scheduler and the Python process to asynchronously execute the submitted Python function (on the right).\label{fig:process}](process.png) -## Computing Backends -Currently, Executorlib supports four different computing backends specified by the backend constructor argument. The first is a `“local”` backend for rapid prototyping on a local workstation in a way that is functionally similar to the standard `ProcessPoolExecutor`. The second `“slurm_submission”` backend can be used to submit Python functions as individual jobs to a SLURM job scheduler using the `sbatch` command, which can be useful for long-running tasks, e.g., that call a compute intensive legacy code. This mode also has the advantage that all required hardware resources do not have to be secured prior to launching the workflow and can naturally vary in time. The third is a `“slurm_allocation”` backend which distributes Python functions in an existing queuing system allocation using the `srun` command. Finally, the fourth is a `“flux_allocation”` backend using flux as hierarchical resource manager inside a given SLURM allocation. While the `“slurm_submission”` backend uses file-based communication under the hood e.g., the Python function to execute and its inputs are stored on the file system, executed in a separate Python process whose the output are again stored in a file, the other backends rely on socket-based communication to improve computational efficiency. +## Job Schedulers +Currently, Executorlib supports five different job schedulers implement as different Executor classes. The first is the `SingleNodeExecutor` for rapid prototyping on a laptop or local workstation in a way that is functionally similar to the standard `ProcessPoolExecutor`. The second, `SlurmClusterExecutor` submits Python functions as individual jobs to a SLURM job scheduler using the `sbatch` command, which can be useful for long-running tasks, e.g., that call a compute intensive legacy code. This mode also has the advantage that all required hardware resources do not have to be secured prior to launching the workflow and can naturally vary in time. The third is the `SlurmJobExecutor` which distributes Python functions in an existing SLURM job using the `srun` command. It can be nested in a function submitted to a `SlurmClusterExecutor` to increase the computational efficiency for shorter tasks, as already requested computing resources are sub-divided rather than requesting new computing resources form the SLURM job scheduler. In analogy, the `FluxClusterExecutor` submits Python functions as individual jobs to a flux job scheduler and the `FluxJobExecutor` distributes Python functions in a flux job. Given the hierarchial approach of the flux scheduler there is no limit to the number of `FluxJobExecutor` instances which can be nested inside each other to construct hierarchical workflows. Finally, the `FluxJobExecutor` can also be nested in a `SlurmClusterExecutor` and is commonly more efficient than the `SlurmJobExecutor` as it uses the flux resource manager, rather than communicating with the central SLURM job scheduler using the `srun` command. While the `SlurmClusterExecutor` and `FluxClusterExecutor` use file-based communication under the hood e.g., the Python function to execute and its inputs are stored on the file system, executed in a separate Python process whose the output are again stored in a file, the other Executors rely on socket-based communication to improve computational efficiency. ## Resource Assignment -To assign dedicated computing resources to individual Python functions, the Executorlib Executor class extends the submission function `submit()` to support not only the Python function and its inputs, but also a Python dictionary specifying the requested computing resources `resource_dict`. The resource dictionary can define the number of compute cores, number of threads, number of GPUs, as well as job scheduler specific parameters like the working directory, maximum run time or the maximum memory. With this hierarchical approach, Executorlib allows the user to finely control the execution of each individual Python function, using parallel communication libraries like the Message Passing Interface (MPI) for Python [@mpi4py] or GPU-optimized libraries to aggressively optimize complex compute intensive tasks of heterogenous HPC that are best solved by tightly-coupled parallelization approaches, while offering a simple and easy to maintain approach to the orchestration of many such weakly-coupled tasks. This ability to seamlessly combine different programming models again accelerates the rapid prototyping of heterogenous HPC workflows without sacrificing performance of critical code components. +To assign dedicated computing resources to individual Python functions, the Executorlib Executor classes extend the submission function `submit()` to support not only the Python function and its inputs, but also a Python dictionary specifying the requested computing resources `resource_dict`. The resource dictionary can define the number of compute cores, number of threads, number of GPUs, as well as job scheduler specific parameters like the working directory, maximum run time or the maximum memory. With this hierarchical approach, Executorlib allows the user to finely control the execution of each individual Python function, using parallel communication libraries like the Message Passing Interface (MPI) for Python [@mpi4py] or GPU-optimized libraries to aggressively optimize complex compute intensive tasks of heterogenous HPC that are best solved by tightly-coupled parallelization approaches, while offering a simple and easy to maintain approach to the orchestration of many such weakly-coupled tasks. This ability to seamlessly combine different programming models again accelerates the rapid prototyping of heterogenous HPC workflows without sacrificing performance of critical code components. ## Dependencies -While two inter-dependent Python functions with similar computational resource requirements can always be combined and executed as a single Python function, this is no longer the case for Python functions with dramatically different resource requirements. In this case Executorlib again extends the submission function `submit()` to support `concurrent.futures.Future` objects from the Python standard library as inputs. When such an argument is passed as input of a subsequent function, the Executor waits until the Python process linked to the `concurrent.futures.Future` object completes its execution, before submitting the dependent Python function for execution. In the case of the `“slurm_submission”` backend which uses file-based communication, the dependencies of the Python functions are communicated to the SLURM job scheduler, so the communication is decoupled from the initial Python process, which submitted the Python functions, as the execution can be delayed until the user receives access to the requested computing resources from the SLURM job scheduler. Finally, by enabling the plotting parameter `plot_dependency_graph=True` during the initialization of the Executorlib Executor class, the resulting dependency graph can be visualized to validate the dependency relationships between the different `concurrent.futures.Future` objects. +While two inter-dependent Python functions with similar computational resource requirements can always be combined and executed as a single Python function, this is no longer the case for Python functions with dramatically different resource requirements. In this case Executorlib again extends the submission function `submit()` to support `concurrent.futures.Future` objects from the Python standard library as inputs. When such an argument is passed as input of a subsequent function, the Executor waits until the Python process linked to the `concurrent.futures.Future` object completes its execution, before submitting the dependent Python function for execution. In the case of the `SlurmClusterExecutor` and the `FluxClusterExecutor` which use file-based communication, the dependencies of the Python functions are communicated to the job scheduler, so the communication is decoupled from the initial Python process, which submitted the Python functions, as the execution can be delayed until the user receives access to the requested computing resources from the job scheduler. Finally, by enabling the plotting parameter `plot_dependency_graph=True` during the initialization of the Executorlib Executor classes, the resulting dependency graph can be visualized to validate the dependency relationships between the different `concurrent.futures.Future` objects. ## Performance Optimization While Executorlib is not a priori designed for Python functions with runtimes of less than about a minute, given the overhead of requesting dedicated computing resources and starting a new Python process, the execution of these functions can be significantly accelerated by reusing dedicated computing resources for the submission of multiple Python functions. This is enabled by setting the block allocation parameter `block_allocation` during the initialization of the Executor class to `True`. Rather than starting a separate Python process for each submitted Python function, the block allocation mode starts a dedicated number of workers (with a fixed resource allocation over their lifetime) and then allows the user to submit Python functions to these pre-defined workers. To further improve computational efficiency when working with multiple analysis functions being applied on the same large dataset, data can be pre-loaded during the initialization of the Python function using the initialization function `init_function`. This initializes a Python dictionary in the Python process which is accessible by all subsequently submitted Python functions. ## Caching -The development of a HPC workflow is commonly an iterative process, which means the initial steps are repeated multiple times until the workflow is fully developed. To accelerate this process, Executorlib provides the option to cache the output of previously evaluated Python functions so these outputs can be reloaded without the need for repeating the evaluation of the same potentially expensive Python functions. Caching in Executorlib uses the same file storage interface as for the file-based communication with the `“slurm_submission”` backend. The caching is enabled by defining the cache directory parameter `cache_directory` as additional input during the initialization of the Executorlib Executor class. Finally, the cache also contains the execution time as additional information, enabling performance analysis of the workflow during the development cycle. +The development of a HPC workflow is commonly an iterative process, which means the initial steps are repeated multiple times until the workflow is fully developed. To accelerate this process, Executorlib provides the option to cache the output of previously evaluated Python functions so these outputs can be reloaded without the need for repeating the evaluation of the same potentially expensive Python functions. Caching in Executorlib uses the same file storage interface as for the file-based communication with the `SlurmClusterExecutor` or the `FluxClusterExecutor`. The caching is enabled by defining the cache directory parameter `cache_directory` as additional input during the initialization of the Executorlib Executor class. Finally, the cache also contains the execution time as additional information, enabling performance analysis of the workflow during the development cycle. ## Advanced Example -To demonstrate the advanced functionality of Executorlib beyond the scope of the Executor interface of the Python standard library a second advanced example is provided. This advanced example requires the flux framework to be installed with at least one computing node in a given queuing system allocation and with each computing node having at least one GPU. +To demonstrate the advanced functionality of Executorlib beyond the scope of the Executor interface of the Python standard library a second advanced example is provided. This advanced example requires the flux framework to be installed and started with at least one computing node in a given queuing system allocation and with at least one computing node having one GPU. ```python -from executorlib import Executor +from executorlib import FluxJobExecutor def get_available_gpus(lst): import socket @@ -83,7 +83,7 @@ def get_available_gpus(lst): for x in local_device_protos if x.device_type == "GPU" ] + lst -with Executor(backend="flux_allocation") as exe: +with FluxJobExecutor() as exe: fs = [] for i in range(1, 4): fs = exe.submit( @@ -93,13 +93,13 @@ with Executor(backend="flux_allocation") as exe: ) print(fs.result()) ``` -By adding the resource dictionary parameter `resource_dict` in the submission function, each Python function receives a dedicated CPU core and a corresponding GPU for the execution of the submitted function. In the submitted function the tensorflow machine learning framework is imported to list the metadata of the available GPU. Furthermore, the submission is repeated three times with the output being aggregated in a joined list. For the aggregation of the output of the individual submissions, the previous information is stored in a `concurrent.futures.Future` object named `fs` and is provided as an input to the next function during submission. Consequently, the execution is limited to serial execution. Alternatively, the results could be merged into one list after the submission of the individual functions, that would enable the parallel execution of the individual Python functions. +By adding the resource dictionary parameter `resource_dict` in the submission function, each Python function receives a dedicated CPU core and a corresponding GPU for the execution of the submitted function. In the submitted function the `tensorflow` machine learning framework is imported to list the metadata of the available GPU. Furthermore, the submission is repeated three times with the output being aggregated in a joined list. For the aggregation of the output of the individual submissions, the previous information is stored in a `concurrent.futures.Future` object named `fs` and is provided as an input to the next function during submission. Consequently, the execution is limited to serial execution. Alternatively, the results could be merged into one list after the submission of the individual functions, that would enable the parallel execution of the individual Python functions. # Usage To-Date While initially developed in the US DOE Exascale Computing Project’s Exascale Atomistic Capability for Accuracy, Length and Time (EXAALT) to accelerate the development of computational materials science simulation workflows for the Exascale, Executorlib has since been generalized to support a wide-range of backends and HPC clusters at different scales. Based on this generalization, it is also been implemented in the pyiron workflow framework [@pyiron] as primary task scheduling interface. # Additional Details -This manuscript provides a general overview of the Executorlib package, the full documentation including a number of examples for the individual features is available at [executorlib.readthedocs.io](https://executorlib.readthedocs.io) and the corresponding source code at [github.com/pyiron/executorlib](https://github.com/pyiron/executorlib). Executorlib is developed an open-source library with a focus on stability, which is achieved with an >95% test coverage, type hinting and a minimalistic functional software design approach. +This manuscript provides a general overview of the Executorlib package, the full documentation including a number of examples for the individual features is available at [executorlib.readthedocs.io](https://executorlib.readthedocs.io) and the corresponding source code at [github.com/hpc/executorlib](https://github.com/hpc/executorlib). Executorlib is developed an open-source library with a focus on stability, which is achieved with an >95% test coverage, type hinting and a minimalistic functional software design approach. # Acknowledgements J.J. and D.P. acknowledge funding from the Exascale Computing Project (17-SC-20-SC), a collaborative effort of the U.S. Department of Energy Office of Science and the National Nuclear Security Administration, and the hospitality from the “Data-Driven Materials Informatics” program from the Institute of Mathematical and Statistical Innovation (IMSI). J.J, M.G.T, P.Y., J.N. and D.P. acknowledge the hospitality of the Institute of Pure and Applied math (IPAM) as part of the “New Mathematics for the Exascale: Applications to Materials Science” long program. Los Alamos National Laboratory is operated by Triad National Security LLC, for the National Nuclear Security administration of the U.S. DOE under Contract No. 89233218CNA0000001. From 7dd5680ebae223139008985f3497e562f500c3da Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Sun, 2 Feb 2025 16:49:14 +0100 Subject: [PATCH 26/27] Update paper.md --- docs/paper/paper.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/paper/paper.md b/docs/paper/paper.md index 0ce7a4b5..f5bde0dd 100644 --- a/docs/paper/paper.md +++ b/docs/paper/paper.md @@ -42,7 +42,7 @@ We distinguish two main use cases for such interfaces: either to request a separ Based on prior experience with the development of the pyiron workflow framework [@pyiron], the design philosophy of Executorlib is centered on the timeless principle of not reinventing the wheel. Rather than implementing its own job scheduler, Executorlib instead leverages existing job schedulers to request and manage Python processes and associated computing resources. Further, instead of defining a new syntax and concepts, Executorlib extends the existing syntax of the Executor class in the Python standard library. Taken together, this makes changing the mode of execution in Executorlib as easy as changing the Executor class, with the interface remaining the same. ## Example -To illustrate the usage of Executorlib and explain the technical processes occurring in the background, we consider the simple example of doubling the numbers in the range from 1 to 4. With Executorlib, this can be achieved with the following code: +To illustrate the usage of Executorlib and explain the technical processes occurring in the background, we consider the simple example of doubling the numbers in the range from 1 to 4 on a laptop, local workstation or a single computing node of an HPC. With Executorlib, this can be achieved using the following code: ```python from executorlib import SingleNodeExecutor @@ -50,7 +50,7 @@ with SingleNodeExecutor() as exe: future_lst = [exe.submit(sum, [i, i]) for i in range(1, 5)] print([fs.result() for fs in future_lst]) ``` -In this example, each individual summation is concurrently executed in a separate process. We note the strict adherence to the standard python Executor Interface as the example remains functional when the Executorlib Executor `SingleNodeExecutor()` object is replaced with either the ThreadPoolExecutor `ThreadPoolExecutor()` or the ProcessPoolExecutor `ProcessPoolExecutor()` from the Python standard library. Following the initialization of the Executor context with the with-statement, the summation function `sum` is submitted for execution with the argument `[i, i]`, generated from the for-loop iterating over the range 1 to 4. \autoref{fig:process}. illustrates the internal functionality of Executorlib. The submission function `submit()` requests the computational resources from the job scheduler, which can be SLURM, flux or a local job scheduler, depending on the choice of backend. The Python function is then executed asynchronously in a newly created Python process. The user can interact with the asynchronously executing Python process on the right through the `concurrent.futures.Future` object returned from the submission function, again as defined by the Python standard library. In the code example above, the `concurrent.futures.Future` object is named `fs`. The `concurrent.futures.Future` object offers a function to check the status of the Python process (`done()`) and a function to block the execution of the process on the left until the execution of the process on the right is completed (`result()`). In contrast to the standard objects however, the Executorlib Executor allows for execution across multiple nodes of HPC systems, which enables the execution of highly compute-intensive workloads that require extensive computational resources, as we now show. +In this example, each individual summation is concurrently executed in a separate process on the same laptop, workstation or computing node of an HPC. We note the strict adherence to the standard python Executor Interface as the example remains functional when the Executorlib Executor `SingleNodeExecutor()` object is replaced with either the ThreadPoolExecutor `ThreadPoolExecutor()` or the ProcessPoolExecutor `ProcessPoolExecutor()` from the Python standard library. Following the initialization of the Executor context with the with-statement, the summation function `sum` is submitted for execution with the argument `[i, i]`, generated from the for-loop iterating over the range 1 to 4. \autoref{fig:process}. illustrates the internal functionality of Executorlib. The submission function `submit()` requests the computational resources from the job scheduler, which can be SLURM, flux or a local job scheduler, depending on the choice of backend. The Python function is then executed asynchronously in a newly created Python process. The user can interact with the asynchronously executing Python process on the right through the `concurrent.futures.Future` object returned from the submission function, again as defined by the Python standard library. In the code example above, the `concurrent.futures.Future` object is named `fs`. The `concurrent.futures.Future` object offers a function to check the status of the Python process (`done()`) and a function to block the execution of the process on the left until the execution of the process on the right is completed (`result()`). In contrast to the standard objects however, the Executorlib Executor allows for execution across multiple nodes of HPC systems, which enables the execution of highly compute-intensive workloads that require extensive computational resources, as we now show. ![Illustration of the communication between the Executorlib Executor, the job scheduler and the Python process to asynchronously execute the submitted Python function (on the right).\label{fig:process}](process.png) From a99c33c078d60d534cd061af55f441943755244d Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Sun, 2 Feb 2025 17:10:07 +0100 Subject: [PATCH 27/27] Update paper.md --- docs/paper/paper.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/paper/paper.md b/docs/paper/paper.md index f5bde0dd..23f1f3b5 100644 --- a/docs/paper/paper.md +++ b/docs/paper/paper.md @@ -50,12 +50,12 @@ with SingleNodeExecutor() as exe: future_lst = [exe.submit(sum, [i, i]) for i in range(1, 5)] print([fs.result() for fs in future_lst]) ``` -In this example, each individual summation is concurrently executed in a separate process on the same laptop, workstation or computing node of an HPC. We note the strict adherence to the standard python Executor Interface as the example remains functional when the Executorlib Executor `SingleNodeExecutor()` object is replaced with either the ThreadPoolExecutor `ThreadPoolExecutor()` or the ProcessPoolExecutor `ProcessPoolExecutor()` from the Python standard library. Following the initialization of the Executor context with the with-statement, the summation function `sum` is submitted for execution with the argument `[i, i]`, generated from the for-loop iterating over the range 1 to 4. \autoref{fig:process}. illustrates the internal functionality of Executorlib. The submission function `submit()` requests the computational resources from the job scheduler, which can be SLURM, flux or a local job scheduler, depending on the choice of backend. The Python function is then executed asynchronously in a newly created Python process. The user can interact with the asynchronously executing Python process on the right through the `concurrent.futures.Future` object returned from the submission function, again as defined by the Python standard library. In the code example above, the `concurrent.futures.Future` object is named `fs`. The `concurrent.futures.Future` object offers a function to check the status of the Python process (`done()`) and a function to block the execution of the process on the left until the execution of the process on the right is completed (`result()`). In contrast to the standard objects however, the Executorlib Executor allows for execution across multiple nodes of HPC systems, which enables the execution of highly compute-intensive workloads that require extensive computational resources, as we now show. +In this example, each individual summation is concurrently executed in a separate process. We note the strict adherence to the standard python Executor Interface as the example remains functional when the Executorlib Executor `SingleNodeExecutor()` object is replaced with either the ThreadPoolExecutor `ThreadPoolExecutor()` or the ProcessPoolExecutor `ProcessPoolExecutor()` from the Python standard library. Following the initialization of the Executor context with the with-statement, the summation function `sum` is submitted for execution with the argument `[i, i]`, generated from the for-loop iterating over the range 1 to 4. \autoref{fig:process}. illustrates the internal functionality of Executorlib. The submission function `submit()` requests the computational resources from the job scheduler, which can be SLURM, flux or a local job scheduler, depending on the choice of Executor class. The Python function is then executed asynchronously in a newly created Python process. The user can interact with the asynchronously executing Python process on the right through the `concurrent.futures.Future` object returned from the submission function, again as defined by the Python standard library. In the code example above, the `concurrent.futures.Future` object is named `fs`. The `concurrent.futures.Future` object offers a function to check the status of the Python process (`done()`) and a function to block the execution of the process on the left until the execution of the process on the right is completed (`result()`). In contrast to the standard objects however, the Executorlib Executor allows for execution across multiple nodes of HPC systems, which enables the execution of highly compute-intensive workloads that require extensive computational resources, as we now show. ![Illustration of the communication between the Executorlib Executor, the job scheduler and the Python process to asynchronously execute the submitted Python function (on the right).\label{fig:process}](process.png) ## Job Schedulers -Currently, Executorlib supports five different job schedulers implement as different Executor classes. The first is the `SingleNodeExecutor` for rapid prototyping on a laptop or local workstation in a way that is functionally similar to the standard `ProcessPoolExecutor`. The second, `SlurmClusterExecutor` submits Python functions as individual jobs to a SLURM job scheduler using the `sbatch` command, which can be useful for long-running tasks, e.g., that call a compute intensive legacy code. This mode also has the advantage that all required hardware resources do not have to be secured prior to launching the workflow and can naturally vary in time. The third is the `SlurmJobExecutor` which distributes Python functions in an existing SLURM job using the `srun` command. It can be nested in a function submitted to a `SlurmClusterExecutor` to increase the computational efficiency for shorter tasks, as already requested computing resources are sub-divided rather than requesting new computing resources form the SLURM job scheduler. In analogy, the `FluxClusterExecutor` submits Python functions as individual jobs to a flux job scheduler and the `FluxJobExecutor` distributes Python functions in a flux job. Given the hierarchial approach of the flux scheduler there is no limit to the number of `FluxJobExecutor` instances which can be nested inside each other to construct hierarchical workflows. Finally, the `FluxJobExecutor` can also be nested in a `SlurmClusterExecutor` and is commonly more efficient than the `SlurmJobExecutor` as it uses the flux resource manager, rather than communicating with the central SLURM job scheduler using the `srun` command. While the `SlurmClusterExecutor` and `FluxClusterExecutor` use file-based communication under the hood e.g., the Python function to execute and its inputs are stored on the file system, executed in a separate Python process whose the output are again stored in a file, the other Executors rely on socket-based communication to improve computational efficiency. +Currently, Executorlib supports five different job schedulers implement as different Executor classes. The first is the `SingleNodeExecutor` for rapid prototyping on a laptop or local workstation in a way that is functionally similar to the standard `ProcessPoolExecutor`. The second, `SlurmClusterExecutor` submits Python functions as individual jobs to a SLURM job scheduler using the `sbatch` command, which can be useful for long-running tasks, e.g., that call a compute intensive legacy code. This mode also has the advantage that all required hardware resources do not have to be secured prior to launching the workflow and can naturally vary in time. The third is the `SlurmJobExecutor` which distributes Python functions in an existing SLURM job using the `srun` command. It can be nested in a function submitted to a `SlurmClusterExecutor` to increase the computational efficiency for shorter tasks, as already requested computing resources are sub-divided rather than requesting new computing resources form the SLURM job scheduler. In analogy, the `FluxClusterExecutor` submits Python functions as individual jobs to a flux job scheduler and the `FluxJobExecutor` distributes Python functions in a flux job. Given the hierarchial approach of the flux scheduler there is no limit to the number of `FluxJobExecutor` instances which can be nested inside each other to construct hierarchical workflows. Finally, the `FluxJobExecutor` can also be nested in a `SlurmClusterExecutor` and is commonly more efficient than the `SlurmJobExecutor` as it uses the flux resource manager, rather than communicating with the central SLURM job scheduler using the `srun` command. While the `SlurmClusterExecutor` and the `FluxClusterExecutor` use file-based communication under the hood e.g., the Python function to execute and its inputs are stored on the file system, executed in a separate Python process whose the output are again stored in a file, the other Executors rely on socket-based communication to improve computational efficiency. ## Resource Assignment To assign dedicated computing resources to individual Python functions, the Executorlib Executor classes extend the submission function `submit()` to support not only the Python function and its inputs, but also a Python dictionary specifying the requested computing resources `resource_dict`. The resource dictionary can define the number of compute cores, number of threads, number of GPUs, as well as job scheduler specific parameters like the working directory, maximum run time or the maximum memory. With this hierarchical approach, Executorlib allows the user to finely control the execution of each individual Python function, using parallel communication libraries like the Message Passing Interface (MPI) for Python [@mpi4py] or GPU-optimized libraries to aggressively optimize complex compute intensive tasks of heterogenous HPC that are best solved by tightly-coupled parallelization approaches, while offering a simple and easy to maintain approach to the orchestration of many such weakly-coupled tasks. This ability to seamlessly combine different programming models again accelerates the rapid prototyping of heterogenous HPC workflows without sacrificing performance of critical code components. @@ -64,7 +64,7 @@ To assign dedicated computing resources to individual Python functions, the Exec While two inter-dependent Python functions with similar computational resource requirements can always be combined and executed as a single Python function, this is no longer the case for Python functions with dramatically different resource requirements. In this case Executorlib again extends the submission function `submit()` to support `concurrent.futures.Future` objects from the Python standard library as inputs. When such an argument is passed as input of a subsequent function, the Executor waits until the Python process linked to the `concurrent.futures.Future` object completes its execution, before submitting the dependent Python function for execution. In the case of the `SlurmClusterExecutor` and the `FluxClusterExecutor` which use file-based communication, the dependencies of the Python functions are communicated to the job scheduler, so the communication is decoupled from the initial Python process, which submitted the Python functions, as the execution can be delayed until the user receives access to the requested computing resources from the job scheduler. Finally, by enabling the plotting parameter `plot_dependency_graph=True` during the initialization of the Executorlib Executor classes, the resulting dependency graph can be visualized to validate the dependency relationships between the different `concurrent.futures.Future` objects. ## Performance Optimization -While Executorlib is not a priori designed for Python functions with runtimes of less than about a minute, given the overhead of requesting dedicated computing resources and starting a new Python process, the execution of these functions can be significantly accelerated by reusing dedicated computing resources for the submission of multiple Python functions. This is enabled by setting the block allocation parameter `block_allocation` during the initialization of the Executor class to `True`. Rather than starting a separate Python process for each submitted Python function, the block allocation mode starts a dedicated number of workers (with a fixed resource allocation over their lifetime) and then allows the user to submit Python functions to these pre-defined workers. To further improve computational efficiency when working with multiple analysis functions being applied on the same large dataset, data can be pre-loaded during the initialization of the Python function using the initialization function `init_function`. This initializes a Python dictionary in the Python process which is accessible by all subsequently submitted Python functions. +While Executorlib is not a priori designed for Python functions with runtimes of less than about a minute, given the overhead of requesting dedicated computing resources and starting a new Python process, the execution of these functions can be significantly accelerated by reusing dedicated computing resources for the submission of multiple Python functions in the `SingleNodeExecutor`, `SlurmJobExecutor` or `FluxJobExecutor`. This is enabled by setting the block allocation parameter `block_allocation` during the initialization of the corresponding Executor class to `True`. Rather than starting a separate Python process for each submitted Python function, the block allocation mode starts a dedicated number of workers (with a fixed resource allocation over their lifetime) and then allows the user to submit Python functions to these pre-defined workers. To further improve computational efficiency when working with multiple analysis functions being applied on the same large dataset, data can be pre-loaded during the initialization of the Python function using the initialization function `init_function`. This initializes a Python dictionary in the Python process which is accessible by all subsequently submitted Python functions. ## Caching The development of a HPC workflow is commonly an iterative process, which means the initial steps are repeated multiple times until the workflow is fully developed. To accelerate this process, Executorlib provides the option to cache the output of previously evaluated Python functions so these outputs can be reloaded without the need for repeating the evaluation of the same potentially expensive Python functions. Caching in Executorlib uses the same file storage interface as for the file-based communication with the `SlurmClusterExecutor` or the `FluxClusterExecutor`. The caching is enabled by defining the cache directory parameter `cache_directory` as additional input during the initialization of the Executorlib Executor class. Finally, the cache also contains the execution time as additional information, enabling performance analysis of the workflow during the development cycle.