Executing packaged app locally

The MONAI Application Runner (MAR) is a command-line utility to run and test a MONAI Application Package (MAP) locally, allowing the users to specify input and output paths on the local file system which it then maps to the input and output of MAP during execution.

MAR is developed to make the running and testing of MAPs locally an easy process for developers and scientists by abstracting away the need to understand the internal details of the MAP. It makes use of the run command of the Holoscan SDK CLI, albeit with monai-deploy run as the actual command.

Setting Up

MONAI Application Runner is installed as part of the MONAI Deploy App SDK, and can be accessed as a run subcommand to the CLI. You can see the help message for MAR using the following command:

monai-deploy run --help

As can be seen in the following output, there are many optional arguments, though only a few are required in typical use cases.

usage: monai-deploy run [-h] [-l {DEBUG,INFO,WARN,ERROR,CRITICAL}] [--address ADDRESS] [--driver]
                        [-i <input>] [-o <output>] [-f FRAGMENTS] [--worker]
                        [--worker-address WORKER_ADDRESS] [--config CONFIG] [--name NAME] [-n NETWORK]
                        [--nic NIC] [-r] [-q] [--shm-size SHM_SIZE] [--terminal] [--uid UID] [--gid GID]
                        <image[:tag]>

positional arguments:
  <image[:tag]>         HAP/MAP image name.

optional arguments:
  -h, --help            show this help message and exit
  -l {DEBUG,INFO,WARN,ERROR,CRITICAL}, --log-level {DEBUG,INFO,WARN,ERROR,CRITICAL}
                        set the logging level (default: INFO)
  --address ADDRESS     address ('[<IP or hostname>][:<port>]') of the App Driver. If not specified, the App
                        Driver uses the default host address ('0.0.0.0') with the default port number
                        ('8765').
  --driver              run the App Driver on the current machine. Can be used together with the '--worker'
                        option to run both the App Driver and the App Worker on the same machine.
  -i <input>, --input <input>
                        input data directory path.
  -o <output>, --output <output>
                        output data directory path.
  -f FRAGMENTS, --fragments FRAGMENTS
                        comma-separated names of the fragments to be executed by the App Worker. If not
                        specified, only one fragment (selected by the App Driver) will be executed. 'all'
                        can be used to run all the fragments.
  --worker              run the App Worker.
  --worker-address WORKER_ADDRESS
                        address (`[<IP or hostname>][:<port>]`) of the App Worker. If not specified, the App
                        Worker uses the default host address ('0.0.0.0') with the default port number
                        randomly chosen from unused ports (between 10000 and 32767).

advanced run options:
  --config CONFIG       path to the configuration file. This will override the configuration file embedded
                        in the application.
  --name NAME           name and hostname of the container to create.
  -n NETWORK, --network NETWORK
                        name of the Docker network this application will be connected to. (default: host)
  --nic NIC             name of the network interface to use with a distributed multi-fragment application.
                        This option sets UCX_NET_DEVICES environment variable with the value specified.
  -r, --render          enable rendering (default: False); runs the container with required flags to enable
                        rendering of graphics.
  -q, --quiet           suppress the STDOUT and print only STDERR from the application. (default: False)
  --shm-size SHM_SIZE   sets the size of /dev/shm. The format is
                        <number(int,float)>[MB|m|GB|g|Mi|MiB|Gi|GiB]. Use 'config' to read the shared memory
                        value defined in the app.json manifest. If not specified, the container is launched
                        using '--ipc=host' with host system's /dev/shm mounted.
  --terminal            enters terminal with all configured volume mappings and environment variables.
                        (default: False)

security options:
  --uid UID             runs the container with the UID. (default:1000)
  --gid GID             runs the container with the GID. (default:1000)

Syntax

For use cases where a MAP reads from a input folder and saves results to a output folder, the command is as simply as the following

monai-deploy run <container-image-name>[:tag] -i <input> -o <output>

Example

After you have written your application using MONAI Application SDK and have packaged the application, let’s try running it on your workstation using the MONAI Application Runner.

Example MAP and input

Given the following information.

  • MAP name and tag : my_app-x64-workstation-dgpu-linux-amd64:latest

  • Input folder : ./input

  • Output folder : ./output

Launching the application

monai-deploy run my_app-x64-workstation-dgpu-linux-amd64:latest -i input -o output

Output:

[2023-08-23 16:24:20,007] [INFO] (runner) - Checking dependencies...
[2023-08-23 16:24:20,007] [INFO] (runner) - --> Verifying if "docker" is installed...

[2023-08-23 16:24:20,007] [INFO] (runner) - --> Verifying if "docker-buildx" is installed...

[2023-08-23 16:24:20,008] [INFO] (runner) - --> Verifying if "my_app-x64-workstation-dgpu-linux-amd64:latest" is available...

[2023-08-23 16:24:20,081] [INFO] (runner) - Reading HAP/MAP manifest...
Successfully copied 2.56kB to /tmp/tmp21lldix4/app.json
Successfully copied 2.05kB to /tmp/tmp21lldix4/pkg.json
[2023-08-23 16:24:20,232] [INFO] (runner) - --> Verifying if "nvidia-ctk" is installed...

[2023-08-23 16:24:20,433] [INFO] (common) - Launching container (56c721f5a48b) using image 'my_app-x64-workstation-dgpu-linux-amd64:latest'...
    container name:      flamboyant_galileo
    host name:           *****
    network:             host
    user:                1000:1000
    ulimits:             memlock=-1:-1, stack=67108864:67108864
    cap_add:             CAP_SYS_PTRACE
    ipc mode:            host
    shared memory size:  67108864
    devices:
2023-08-23 23:24:21 [INFO] Launching application python3 /opt/holoscan/app/app.py ...
...
...
[2023-08-23 16:24:55,490] [INFO] (common) - Container 'flamboyant_galileo'(56c721f5a48b) exited.

Note

  • Currently MAR does not validate all resources specified in the MAP manifest.