grpc4bmi
gRPC wrapper for model with a Basic modeling interface
Science Score: 67.0%
This score indicates how likely this project is to be science-related based on various indicators:
-
✓CITATION.cff file
Found CITATION.cff file -
✓codemeta.json file
Found codemeta.json file -
✓.zenodo.json file
Found .zenodo.json file -
✓DOI references
Found 3 DOI reference(s) in README -
✓Academic publication links
Links to: zenodo.org -
○Committers with academic emails
-
○Institutional organization owner
-
○JOSS paper metadata
-
○Scientific vocabulary similarity
Low similarity (15.6%) to scientific vocabulary
Keywords
Keywords from Contributors
Repository
gRPC wrapper for model with a Basic modeling interface
Basic Info
- Host: GitHub
- Owner: eWaterCycle
- License: apache-2.0
- Language: Python
- Default Branch: main
- Homepage: https://grpc4bmi.readthedocs.io
- Size: 822 KB
Statistics
- Stars: 5
- Watchers: 7
- Forks: 5
- Open Issues: 42
- Releases: 21
Topics
Metadata Files
README.md
grpc4bmi
Purpose
This software allows you to wrap your Basic Model Interface (BMI) implementation in a server process and communicate with it via the included Python client. The communication is serialized to protocol buffers by GRPC and occurs over network ports. Can run models in isolated containers using Docker or Apptainer.
Installation
Optionally, create your virtual environment and activate it, Then, run
bash
pip install grpc4bmi
on the client (Python) side. If your server model is implemented in Python, do the same in the server environment (e.g. docker container). If the model is implemented in R, run instead
bash
pip install grpc4bmi[R]
If the model is implemented in Julia, run instead
bash
pip install grpc4bmi[julia]
in the server environment. For bleeding edge version from GitHub use
bash
pip install git+https://github.com/eWaterCycle/grpc4bmi.git#egg=grpc4bmi
Finally if the model is implemented in C or C++, clone this git repo and run
bash
make
make install
in the cpp folder.
Usage
Model written in Python
A model should be a subclass of the Bmi class from the bmipy package.
For inspiration look at the example in the test directory.
To start a server process that allows calls to your BMI implementation, type
bash
run-bmi-server --name <PACKAGE>.<MODULE>.<CLASS> --port <PORT> --path <PATH>
where <PACKAGE>, <MODULE> are the python package and module containing your implementation, <CLASS> is your
bmi model class name, <PORT> is any available port on the host system, and optionally <PATH> denotes an
additional path that should be added to the system path to make your implementation work. The name option above is
optional, and if not provided the script will look at the environment variables BMI_PACKAGE, BMI_MODULE and
BMI_CLASS. Similarly, the port can be defined by the environment variable BMI_PORT.
This software assumes that your implementation constructor has no parameters.
Model written in C/C++ (beta)
Create an executable along the lines of cpp/run-bmi-server.cc. You can copy the file and replace the function
C++
Bmi* create_model_instance()
{
/* Return your new BMI instance pointer here... */
}
with the instantiation of your model BMI. The model needs to implement the csdms BMI for C, but you may also implement our more object-oriented C++ interface BmiCppExtension.
Model written in R
The grpc4bmi Python package can also run BMI models written in R if the model is a subclass of AbstractBmi See https://github.com/eWaterCycle/bmi-r for instruction on R and Docker.
Run the R model a server with
bash
run-bmi-server --lang R [--path <R file with BMI model>] --name [<PACKAGE>::]<CLASS> --port <PORT>
For example with WALRUS use
bash
run-bmi-server --lang R --path ~/git/eWaterCycle/grpc4bmi-examples/walrus/walrus-bmi.r --name WalrusBmi --port 55555
Models written in Julia
The grpc4bmi Python package can also run BMI models written in Julia if the model has an implementation of the BasicModelInterface.jl.
Run the Julia model in Python with
```bash from grpc4bmi.bmijuliamodel import BmiJulia
mymodel = BmiJulia.from_name('
For example with Wflow.jl use
```bash
Install Wflow.jl package in the Julia environment managed by the juliacall Python package.
from juliacall import Main as jl jl.Pkg.add("Wflow")
Create the model
from grpc4bmi.bmijuliamodel import BmiJulia mymodel = BmiJulia.from_name('Wflow.Model', 'Wflow.bmi.BMI') ```
A Julia model has to be run locally. It can not be run in the default gRPC client/server Docker container mode because:
- Julia has no gRPC server implementation
- Calling Julia methods from Python gRPC server causes 100% CPU usage and no progress
- Calling Julia methods from C++ gRPC server causes segmentation faults
The client side
The client side has only a Python implementation. The default BMI client assumes a running server process on a given port.
python
from grpc4bmi.bmi_grpc_client import BmiClient
import grpc
mymodel = BmiClient(grpc.insecure_channel("localhost:<PORT>"))
print mymodel.get_component_name()
mymodel.initialize(<FILEPATH>)
...further BMI calls...
The package contains also client implementation that own the server process, either as a Python subprocess or a Docker
container or a Singularity container or a Apptainer container running the run-bmi-server script. For instance
python
from grpc4bmi.bmi_client_subproc import BmiClientSubProcess
mymodel = BmiClientSubProcess(<PACKAGE>.<MODULE>.<CLASS>)
will automatically launch the server in a sub-process and
python
from grpc4bmi.bmi_client_docker import BmiClientDocker
mymodel = BmiClientDocker(<IMAGE>, <WORK DIR TO MOUNT>, input_dirs=[<INPUT DIRECTORIES TO MOUNT>])
will launch a Docker container based on supplied Docker image
and will mount supplied directories to share files between the container and host.
python
from grpc4bmi.bmi_client_singularity import BmiClientSingularity
mymodel = BmiClientSingularity(<IMAGE>, <WORK DIR TO MOUNT>, input_dirs=[<INPUT DIRECTORIES TO MOUNT>])
will launch a singularity container on based supplied Singularity image
and will mount supplied directories to share files between the container and host.
python
from grpc4bmi.bmi_client_apptainer import BmiClientApptainer
mymodel = BmiClientApptainer(<IMAGE>, <WORK DIR TO MOUNT>, input_dirs=[<INPUT DIRECTORIES TO MOUNT>])
will launch a Apptainer container on based supplied Apptainer image
and will mount supplied directories to share files between the container and host.
For more documentation see https://grpc4bmi.readthedocs.io/.
Development: generating the gRPC code
When developers change the proto-file, it is necessary to install gRPC tools Python packages in your Python environment:
```bash
Create virtual env
python3 -m venv .venv . venv/bin/activate
Make sure latest pip and wheel are install
pip install -U pip wheel pip install -r dev-requirements.txt
For R integration also install the R extras with
pip install -e .[R]
For building docs (cd docs && make html) also install the docs extras with
pip install -e .[docs] ```
and install the C++ runtime and protoc command as described in https://github.com/google/protobuf/blob/master/src/README.md.
After this, simply executing the proto_gen.sh script should do the job.
Owner
- Name: eWaterCycle
- Login: eWaterCycle
- Kind: organization
- Website: http://www.ewatercycle.org
- Repositories: 74
- Profile: https://github.com/eWaterCycle
Citation (CITATION.cff)
# YAML 1.2 # Metadata for citation of this software according to the CFF format (https://citation-file-format.github.io/) cff-version: 1.2.0 message: If you use this software, please cite it using these metadata. title: grpc4bmi doi: 10.5281/zenodo.1462641 authors: - given-names: Gijs family-names: van den Oord affiliation: Netherlands eScience Center orcid: "https://orcid.org/0000-0001-8367-1333" - given-names: Stefan family-names: Verhoeven affiliation: Netherlands eScience Center orcid: "https://orcid.org/0000-0002-5821-2060" - given-names: Inti family-names: Pelupessy affiliation: Netherlands eScience Center repository-code: https://github.com/eWaterCycle/grpc4bmi license: Apache-2.0
GitHub Events
Total
- Issues event: 3
- Issue comment event: 5
- Push event: 3
- Pull request review event: 10
- Pull request review comment event: 6
- Pull request event: 5
- Fork event: 1
- Create event: 2
Last Year
- Issues event: 3
- Issue comment event: 5
- Push event: 3
- Pull request review event: 10
- Pull request review comment event: 6
- Pull request event: 5
- Fork event: 1
- Create event: 2
Committers
Last synced: almost 2 years ago
Top Committers
| Name | Commits | |
|---|---|---|
| Stefan Verhoeven | s****n@g****m | 348 |
| gvdoord | g****d@g****m | 123 |
| Gijs van den Oord | g****d | 5 |
| ipelupessy | i****y@e****l | 4 |
| Abel Soares Siqueira | a****a@g****m | 3 |
| goord | G****d@g****m | 2 |
| Bart Schilperoort | b****t@e****l | 1 |
| dependabot[bot] | 4****] | 1 |
| Niels Drost | n****t@e****l | 1 |
Committer Domains (Top 20 + Academic)
Issues and Pull Requests
Last synced: 5 months ago
All Time
- Total issues: 76
- Total pull requests: 45
- Average time to close issues: 6 months
- Average time to close pull requests: about 2 months
- Total issue authors: 10
- Total pull request authors: 9
- Average comments per issue: 1.74
- Average comments per pull request: 1.51
- Merged pull requests: 34
- Bot issues: 0
- Bot pull requests: 2
Past Year
- Issues: 3
- Pull requests: 3
- Average time to close issues: N/A
- Average time to close pull requests: 22 days
- Issue authors: 2
- Pull request authors: 3
- Average comments per issue: 0.67
- Average comments per pull request: 0.67
- Merged pull requests: 1
- Bot issues: 0
- Bot pull requests: 0
Top Authors
Issue Authors
- sverhoeven (50)
- BSchilperoort (10)
- goord (3)
- Peter9192 (3)
- ipelupessy (3)
- Daafip (2)
- jeromaerts (2)
- nielsdrost (1)
- SarahAlidoost (1)
- mdpiper (1)
Pull Request Authors
- sverhoeven (36)
- BSchilperoort (3)
- Daafip (2)
- hellkite500 (2)
- dependabot[bot] (2)
- mdpiper (2)
- goord (1)
- Peter9192 (1)
- abelsiqueira (1)
Top Labels
Issue Labels
Pull Request Labels
Packages
- Total packages: 1
-
Total downloads:
- pypi 585 last-month
- Total dependent packages: 1
- Total dependent repositories: 4
- Total versions: 28
- Total maintainers: 4
pypi.org: grpc4bmi
Run your BMI implementation in a separate process and expose it as BMI-python with GRPC
- Homepage: https://github.com/eWaterCycle/grpc4bmi
- Documentation: https://grpc4bmi.readthedocs.io/
- License: Apache License 2.0
-
Latest release: 0.5.0
published about 2 years ago
Rankings
Maintainers (4)
Dependencies
- actions/cache v2 composite
- actions/checkout v2 composite
- actions/setup-python v2 composite
- eWaterCycle/setup-singularity v6 composite
- ewatercycle/setup-grpc v4 composite
- sonarsource/sonarcloud-github-action v1.3 composite
- ubuntu bionic build
- actions/checkout v2 composite
- citation-file-format/cffconvert-github-action 2.0.0 composite
- debian buster build
- debian buster build
- python 3.10-buster build
- python 3.10-buster build
- python 3.10-buster build
- python 3.10-buster build
- bmipy *
- docker *
- googleapis-common-protos >=1.5.5
- grpcio *
- grpcio-reflection *
- grpcio-status *
- numpy *
- packaging *
- protobuf >=4,<5
- typeguard *
- julia bullseye build