From 214125bec9770a6da5029e15500fd7854631962c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Jan=C3=9Fen?= Date: Sun, 26 Feb 2023 06:30:56 -0700 Subject: [PATCH 1/4] Communicated via zmq --- .ci_support/environment-mpich.yml | 13 ++++++++++ ...nvironment.yml => environment-openmpi.yml} | 1 + .github/workflows/UpdateDependabotPR.yml | 3 ++- pylammpsmpi/mpi/lmpmpi.py | 16 ++++++++---- pylammpsmpi/utils/lammps.py | 25 +++++++++++++------ setup.py | 2 +- 6 files changed, 46 insertions(+), 14 deletions(-) create mode 100644 .ci_support/environment-mpich.yml rename .ci_support/{environment.yml => environment-openmpi.yml} (91%) diff --git a/.ci_support/environment-mpich.yml b/.ci_support/environment-mpich.yml new file mode 100644 index 00000000..8211da89 --- /dev/null +++ b/.ci_support/environment-mpich.yml @@ -0,0 +1,13 @@ +channels: + - conda-forge +dependencies: + - coveralls + - coverage + - codacy-coverage + - lammps >=2022.06.23 + - mpi4py =3.1.4 + - mpich + - numpy + - distributed + - dask-jobqueue + - pyzmq =25.0.0 \ No newline at end of file diff --git a/.ci_support/environment.yml b/.ci_support/environment-openmpi.yml similarity index 91% rename from .ci_support/environment.yml rename to .ci_support/environment-openmpi.yml index 664c3da3..7899186e 100644 --- a/.ci_support/environment.yml +++ b/.ci_support/environment-openmpi.yml @@ -10,3 +10,4 @@ dependencies: - numpy - distributed - dask-jobqueue + - pyzmq =25.0.0 \ No newline at end of file diff --git a/.github/workflows/UpdateDependabotPR.yml b/.github/workflows/UpdateDependabotPR.yml index 51aa5209..8157bb95 100644 --- a/.github/workflows/UpdateDependabotPR.yml +++ b/.github/workflows/UpdateDependabotPR.yml @@ -20,7 +20,8 @@ jobs: package=$(echo "${{ github.event.pull_request.title }}" | awk '{print $2}') from=$(echo "${{ github.event.pull_request.title }}" | awk '{print $4}') to=$(echo "${{ github.event.pull_request.title }}" | awk '{print $6}') - sed -i "/${package}/s/${from}/${to}/g" .ci_support/environment.yml + sed -i "/${package}/s/${from}/${to}/g" .ci_support/environment-openmpi.yml + sed -i "/${package}/s/${from}/${to}/g" .ci_support/environment-mpich.yml - name: UpdateDependabotPR commit run: | git config --local user.email "41898282+github-actions[bot]@users.noreply.github.com" diff --git a/pylammpsmpi/mpi/lmpmpi.py b/pylammpsmpi/mpi/lmpmpi.py index d067d79c..b933d35d 100644 --- a/pylammpsmpi/mpi/lmpmpi.py +++ b/pylammpsmpi/mpi/lmpmpi.py @@ -7,6 +7,7 @@ import numpy as np import pickle import sys +import zmq from lammps import lammps __author__ = "Sarath Menon, Jan Janssen" @@ -43,8 +44,8 @@ # Lammps executable args = ["-screen", "none"] -if len(sys.argv) > 1: - args.extend(sys.argv[1:]) +if len(sys.argv) > 3: + args.extend(sys.argv[3:]) job = lammps(cmdargs=args) @@ -483,9 +484,15 @@ def _gather_data_from_all_processors(data): if __name__ == "__main__": + if MPI.COMM_WORLD.rank == 0: + context = zmq.Context() + socket = context.socket(zmq.PAIR) + argument_lst = sys.argv + port_selected = argument_lst[argument_lst.index("--zmqport") + 1] + socket.connect("tcp://localhost:" + port_selected) while True: if MPI.COMM_WORLD.rank == 0: - input_dict = pickle.load(sys.stdin.buffer) + input_dict = pickle.loads(socket.recv()) # with open('process.txt', 'a') as file: # print('Input:', input_dict, file=file) else: @@ -498,5 +505,4 @@ def _gather_data_from_all_processors(data): if MPI.COMM_WORLD.rank == 0 and output is not None: # with open('process.txt', 'a') as file: # print('Output:', output, file=file) - pickle.dump(output, sys.stdout.buffer) - sys.stdout.flush() + socket.send(pickle.dumps(output)) diff --git a/pylammpsmpi/utils/lammps.py b/pylammpsmpi/utils/lammps.py index 1b61bba3..437cdf4c 100644 --- a/pylammpsmpi/utils/lammps.py +++ b/pylammpsmpi/utils/lammps.py @@ -5,6 +5,7 @@ import os import pickle import subprocess +import zmq __author__ = "Sarath Menon, Jan Janssen" @@ -20,23 +21,33 @@ class LammpsBase: - def __init__(self, cores=8, working_directory=".", cmdargs=None): + def __init__( + self, cores=8, oversubscribe=False, working_directory=".", cmdargs=None + ): self.cores = cores self.working_directory = working_directory self._process = None + self._oversubscribe = oversubscribe self._cmdargs = cmdargs + self._socket = None def start_process(self): executable = os.path.join( os.path.dirname(os.path.abspath(__file__)), "../mpi", "lmpmpi.py" ) - cmds = [ - "mpiexec", - "--oversubscribe", + context = zmq.Context() + self._socket = context.socket(zmq.PAIR) + port_selected = self._socket.bind_to_random_port("tcp://*") + cmds = ["mpiexec"] + if self._oversubscribe: + cmds += ["--oversubscribe"] + cmds += [ "-n", str(self.cores), "python", executable, + "--zmqport", + str(port_selected), ] if self._cmdargs is not None: cmds.extend(self._cmdargs) @@ -64,8 +75,7 @@ def _send(self, command, data=None): ------- None """ - pickle.dump({"c": command, "d": data}, self._process.stdin) - self._process.stdin.flush() + self._socket.send(pickle.dumps({"c": command, "d": data})) def _receive(self): """ @@ -80,7 +90,7 @@ def _receive(self): data : string data from the command """ - output = pickle.load(self._process.stdout) + output = pickle.loads(self._socket.recv()) return output @property @@ -670,6 +680,7 @@ def close(self): except AttributeError: pass self._process = None + self._socket = None # TODO def __del__(self): diff --git a/setup.py b/setup.py index 988e1283..5d2548ed 100644 --- a/setup.py +++ b/setup.py @@ -26,7 +26,7 @@ keywords='lammps, mpi4py', packages=find_packages(exclude=["*tests*"]), install_requires=[ - 'mpi4py==3.1.4' + 'mpi4py==3.1.4', "pyzmq==25.0.0" ], cmdclass=versioneer.get_cmdclass(), ) From ade1e87570b46fbee3758d1731541b7f15eff094 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Jan=C3=9Fen?= Date: Sun, 26 Feb 2023 06:34:16 -0700 Subject: [PATCH 2/4] workflow fixes --- .github/workflows/coverage.yml | 2 +- .github/workflows/pypicheck.yml | 2 +- .../{unittests.yml => unittests-mpich.yml} | 4 +-- .github/workflows/unittests-openmpi.yml | 36 +++++++++++++++++++ 4 files changed, 40 insertions(+), 4 deletions(-) rename .github/workflows/{unittests.yml => unittests-mpich.yml} (92%) create mode 100644 .github/workflows/unittests-openmpi.yml diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml index d8f6dc53..eaa0abd2 100644 --- a/.github/workflows/coverage.yml +++ b/.github/workflows/coverage.yml @@ -22,7 +22,7 @@ jobs: channels: conda-forge channel-priority: strict use-mamba: true - environment-file: .ci_support/environment.yml + environment-file: .ci_support/environment-openmpi.yml - name: Setup shell: bash -l {0} run: | diff --git a/.github/workflows/pypicheck.yml b/.github/workflows/pypicheck.yml index 4c31a5f9..2645eb1a 100644 --- a/.github/workflows/pypicheck.yml +++ b/.github/workflows/pypicheck.yml @@ -18,7 +18,7 @@ jobs: channels: conda-forge channel-priority: strict use-mamba: true - environment-file: .ci_support/environment.yml + environment-file: .ci_support/environment-openmpi.yml - name: Setup shell: bash -l {0} run: | diff --git a/.github/workflows/unittests.yml b/.github/workflows/unittests-mpich.yml similarity index 92% rename from .github/workflows/unittests.yml rename to .github/workflows/unittests-mpich.yml index ff9a7864..e2ef27fd 100644 --- a/.github/workflows/unittests.yml +++ b/.github/workflows/unittests-mpich.yml @@ -1,7 +1,7 @@ # This workflow will install Python dependencies, run tests and lint with a variety of Python versions # For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions -name: Python package +name: mpich on: push: @@ -26,7 +26,7 @@ jobs: channels: conda-forge channel-priority: strict use-mamba: true - environment-file: .ci_support/environment.yml + environment-file: .ci_support/environment-mpich.yml - name: Setup shell: bash -l {0} run: | diff --git a/.github/workflows/unittests-openmpi.yml b/.github/workflows/unittests-openmpi.yml new file mode 100644 index 00000000..29669d3f --- /dev/null +++ b/.github/workflows/unittests-openmpi.yml @@ -0,0 +1,36 @@ +# This workflow will install Python dependencies, run tests and lint with a variety of Python versions +# For more information see: https://help.github.com/actions/language-and-framework-guides/using-python-with-github-actions + +name: OpenMPI + +on: + push: + branches: [ main ] + pull_request: + branches: [ main ] + +jobs: + build: + + runs-on: ubuntu-latest + strategy: + matrix: + python-version: ['3.8', '3.9', '3.10', '3.11'] + + steps: + - uses: actions/checkout@v2 + - uses: conda-incubator/setup-miniconda@v2 + with: + python-version: ${{ matrix.python-version }} + miniforge-variant: Mambaforge + channels: conda-forge + channel-priority: strict + use-mamba: true + environment-file: .ci_support/environment-openmpi.yml + - name: Setup + shell: bash -l {0} + run: | + pip install --no-deps . + - name: Test + shell: bash -l {0} + run: coverage run --omit pylammpsmpi/_version.py -m unittest discover tests From a4c3f7a67abf0954d2e94163f33342ca176e527f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Jan=C3=9Fen?= Date: Sun, 26 Feb 2023 07:02:09 -0700 Subject: [PATCH 3/4] make oversubscribe available to the user --- pylammpsmpi/lammps_wrapper.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pylammpsmpi/lammps_wrapper.py b/pylammpsmpi/lammps_wrapper.py index 771c1189..8fd4ff8a 100644 --- a/pylammpsmpi/lammps_wrapper.py +++ b/pylammpsmpi/lammps_wrapper.py @@ -23,10 +23,11 @@ class LammpsLibrary: """ def __init__( - self, cores=1, working_directory=".", client=None, mode="local", cmdargs=None + self, cores=1, oversubscribe=False, working_directory=".", client=None, mode="local", cmdargs=None ): self.cores = cores self.working_directory = working_directory + self.oversubscribe = oversubscribe self.client = client self.mode = mode @@ -34,6 +35,7 @@ def __init__( fut = self.client.submit( LammpsBase, cores=self.cores, + oversubscribe=self.oversubscribe, working_directory=self.working_directory, cmdargs=cmdargs, actor=True, @@ -46,6 +48,7 @@ def __init__( elif self.mode == "local": self.lmp = LammpsBase( cores=self.cores, + oversubscribe=self.oversubscribe, working_directory=self.working_directory, cmdargs=cmdargs, ) From 3bcd4e0bfcc4b922d24e58ea2f802578d5ce7f1d Mon Sep 17 00:00:00 2001 From: pyiron-runner Date: Sun, 26 Feb 2023 14:03:50 +0000 Subject: [PATCH 4/4] Format black --- pylammpsmpi/lammps_wrapper.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pylammpsmpi/lammps_wrapper.py b/pylammpsmpi/lammps_wrapper.py index 8fd4ff8a..c88e3791 100644 --- a/pylammpsmpi/lammps_wrapper.py +++ b/pylammpsmpi/lammps_wrapper.py @@ -23,7 +23,13 @@ class LammpsLibrary: """ def __init__( - self, cores=1, oversubscribe=False, working_directory=".", client=None, mode="local", cmdargs=None + self, + cores=1, + oversubscribe=False, + working_directory=".", + client=None, + mode="local", + cmdargs=None, ): self.cores = cores self.working_directory = working_directory