Run your BMI implementation in a separate process and expose it as BMI-python with GRPC
Project description
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
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
pip install grpc4bmi[R]
in the server environment. For bleeding edge version from GitHub use
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
make ; make install
in the cpp folder.
Usage
Model written in Python
For inspiration look at the example in the test directory. To start a server process that allows calls to your BMI implementation, type
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
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
run-bmi-server --lang R [--path <R file with BMI model>] --name [<PACKAGE>::]<CLASS> --port <PORT>
For example with WALRUS use
run-bmi-server --lang R --path ~/git/eWaterCycle/grpc4bmi-examples/walrus/walrus-bmi.r --name WalrusBmi --port 50051
The client side
The client side has only a Python implementation. The default BMI client assumes a running server process on a given port.
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
from grpc4bmi.bmi_client_subproc import BmiClientSubProcess
mymodel = BmiClientSubProcess(<PACKAGE>.<MODULE>.<CLASS>)
will automatically launch the server in a sub-process and
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.
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.
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.
Development: generating the grpc code
When developers change the proto-file, it is necessary to install grpc tools python packages in your python environment:
pip install -r requirements.txt
pip install -e .
# For R integration also install the R extras with
pip install -e .[R]
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.
Future work
More language bindings are underway.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Hashes for grpc4bmi-0.2.16-py3-none-any.whl
Algorithm | Hash digest | |
---|---|---|
SHA256 | 77e11b6810458fc5ced671abc9ceb8af4599e080810e53efc774395dd8feab10 |
|
MD5 | 9d892d4636c33150c7cbbdfb95963e8d |
|
BLAKE2b-256 | 492fb26004395a8d66ab4841147390f2b11d02bafb6932f078ccdb94a4e7e689 |