Work With MVI From a Notebook

This example will show you how to create and deploy a service straight from a notebook.

Logging in

To log in to your host, first log in using a terminal with username + password and generate a token with mvi token. Use this token for future log-ins from the notebook. This way you do not have to show your username and password. You can set a time limit to the token for better security.

We start by importing some packages and defining the host and token as global variables

[1]:
import requests
import json
import time

HOST = "http://localhost"  # Change to your host
TOKEN = ""  # Add your token here

Note

In jupyter notebooks you can call terminal commands by starting a row with !. We can use this with the MVI CLI to log in to a manager and use all the functionality that we are used to from the command line. You can prepend an argument with $ to use a python variable in your command.

[2]:
!mvi login --host $HOST --token $TOKEN
Changed host to http://localhost

Writing the Service

The service code should be collected in a single cell decorated with the service_cell magic command. We start by importing it from mvi.notebook.

Warning

The function has to imported directly for it to work. IPython will not recognize %%mvi.notebook.service_cell.

[3]:
from mvi.notebook import service_cell

The magic command has an argument for the project name of the service, which is the directory where all the files will be placed.

For example %%service_cell my_service will create a directory with a service.py file with the contents of the cell and a .s2i/environment file that is required by MVI. If the files already exist, only serivce.py will be changed.

[4]:
%%service_cell notebook_service

import logging

import numpy as np

from mvi import service
from mvi.communication import notify, Severity

logger = logging.getLogger(__name__)


@service.entrypoint
def sqrt(number: float) -> float:
    return np.sqrt(number)


if __name__ == "__main__":
    service.run()
[4]:
'Created project notebook_service. Saved service.py'

If the service needs any packages besides mvi that are not included in the python standard library you can add them with the service_requirements magic:

[5]:
from mvi.notebook import service_requirements
[6]:
%%service_requirements notebook_service
numpy
[6]:
'Saved requirements.txt'

Deploy the Service

We can deploy the service like we normally would with the CLI using mvi deploy

[7]:
!mvi deploy notebook_service 1.0.0 notebook_service
time.sleep(5)  # Wait a moment for the service to start
Active host: http://localhost
Deploying service...
Service deployed successfully
MAIN    NAME              VERSION    STATUS    RUNNING
------  ----------------  ---------  --------  -----------------------------------
*       notebook_service  1.0.0      running   Running (since 2021-03-10 08:54:01)

Test the Deployed Service

We can test the service straight from the notebook using the requests package.

[8]:
response = requests.post(
    url=f"{HOST}/services/notebook_service/sqrt",
    json={"number": 2},
    headers={"Authorization": f"Bearer {TOKEN}"}
)
assert response.status_code == 200, f"{response.status_code}, {response.text}"
response.json()
[8]:
1.4142135623730951

Kill the Service

When we are finished we can kill the service.

[9]:
!mvi kill notebook_service 1.0.0 --yes
Active host: http://localhost
MAIN    NAME              VERSION    STATUS    RUNNING
------  ----------------  ---------  --------  -----------------------------------
*       notebook_service  1.0.0      running   Running (since 2021-03-10 08:54:01)

Service notebook_service 1.0.0 killed.