grpc4bmi

gRPC wrapper for model with a Basic modeling interface

https://github.com/ewatercycle/grpc4bmi

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

bmi grpc python

Keywords from Contributors

hydrology ansible ewatercycle copier copier-python copier-template python-template research-software mesh sequences
Last synced: 4 months ago · JSON representation ·

Repository

gRPC wrapper for model with a Basic modeling interface

Basic Info
Statistics
  • Stars: 5
  • Watchers: 7
  • Forks: 5
  • Open Issues: 42
  • Releases: 21
Topics
bmi grpc python
Created over 7 years ago · Last pushed 6 months ago
Metadata Files
Readme License Citation Zenodo

README.md

grpc4bmi

DOI CI Documentation Status Quality Gate Status Coverage

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('.', 'BasicModelInterface') ```

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:

  1. Julia has no gRPC server implementation
  2. Calling Julia methods from Python gRPC server causes 100% CPU usage and no progress
  3. 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

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

All Time
  • Total Commits: 488
  • Total Committers: 9
  • Avg Commits per committer: 54.222
  • Development Distribution Score (DDS): 0.287
Past Year
  • Commits: 111
  • Committers: 2
  • Avg Commits per committer: 55.5
  • Development Distribution Score (DDS): 0.009
Top Committers
Name Email 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
enhancement (4) bug (3) question (1)
Pull Request Labels
dependencies (2)

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

  • Versions: 28
  • Dependent Packages: 1
  • Dependent Repositories: 4
  • Downloads: 585 Last month
Rankings
Dependent packages count: 4.8%
Dependent repos count: 7.5%
Average: 14.0%
Downloads: 15.3%
Forks count: 19.2%
Stargazers count: 23.1%
Last synced: 5 months ago

Dependencies

.github/workflows/ci.yml actions
  • 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
Dockerfile docker
  • ubuntu bionic build
.github/workflows/cffconvert.yml actions
  • actions/checkout v2 composite
  • citation-file-format/cffconvert-github-action 2.0.0 composite
test/heat-images/c-bmi20/Dockerfile docker
  • debian buster build
test/heat-images/cxx-bmi20/Dockerfile docker
  • debian buster build
test/heat-images/python-bmi02/Dockerfile docker
  • python 3.10-buster build
test/heat-images/python-bmi02-legacy/Dockerfile docker
  • python 3.10-buster build
test/heat-images/python-bmi20/Dockerfile docker
  • python 3.10-buster build
test/heat-images/python-bmi20-pb4/Dockerfile docker
  • python 3.10-buster build
dev-requirements.txt pypi
pyproject.toml pypi
  • bmipy *
  • docker *
  • googleapis-common-protos >=1.5.5
  • grpcio *
  • grpcio-reflection *
  • grpcio-status *
  • numpy *
  • packaging *
  • protobuf >=4,<5
  • typeguard *
test/heat-images/c-julia/Dockerfile docker
  • julia bullseye build