Logo Idiwork

Experiment #102 How to Create an Azure Notebooks Project and Deploy a Summarization Service

In this new post, we will learn step by step how to create an Azure Notebook Project for our Experiment #102 and implement a text summary service by writing some scripts in Python and running them with Jupyter.

1.     Create an Azure Notebooks Project

First, we can access this Azure Notebooks Service by visiting https://notebooks.azure.com/ and then, we can create a new Azure Notebooks Project from “My Projects”.

 

 

2.     Install Machine Learning Libraries

Before creating our own functions, we must load a bundle of Python libraries that includes Azure Machine Learning SDK (azureml-sdk), ONNX Runtime (onnxruntime) and the Natural Language Toolkit (nltk).

The “init” file or Python script looks like that:

!pip install --upgrade azureml-sdk[notebooks]
%%sh
pip install onnxruntime
import nltk
nltk.download('all')

 

After that, we need to upload the file to our Azure Notebook project. Then, we can go inside, see the code and run it from Jupyter to load all the libraries. This step may take a few minutes to complete.

 

 

3.     Test a Simple Service Usage Example

For our example we will create a new “.ipynb” file that imports some of the libraries we load before.

import nltk
import re
import unicodedata
import numpy as np
from gensim.summarization import summarize

 

Then, we need to create two functions: one for normalize the text and other for summarize it.

def normalize_text(text):
    text = re.sub('\n', ' ', text)
    text = text.strip()
    sentences = nltk.sent_tokenize(text)
    sentences = [sentence.strip() for sentence in sentences]
    return sentences

def summarize_text(text, summary_ratio=None, word_count=30):
    sentences = normalize_text(text)
    cleaned_text = ' '.join(sentences)
    summary = summarize(cleaned_text, split=True, ratio=summary_ratio, word_count=word_count)
    return summary

 

Now, we can pass a sample text to our main function, run the commands and see the Summarize service in action.

 

 

4.     Create a Machine Learning Workspace

Meanwhile, in our Azure subscription, we need to create an Azure Machine Learning Service Workspace resource in order to get a few necessary configuration parameters to continue.

 

 

5.     Connect to Workspace and Prepare the Model

Now, we will set up a “.ipynb” file to connect to the Azure Machine Learning Service Workspace and prepare the Machine Learning model to deploy it in an Azure Container Instance.

First, we must provide the Workspace connection parameters and import the needed libraries.

subscription_id = "xxx-xxx-xxx-xxx-xxx" 
resource_group = "Machine_Learning_Experiment" 
workspace_name = "Experiment_Workspace" 
workspace_region = "westeurope" 
import azureml.core
print('azureml.core.VERSION: ', azureml.core.VERSION)

from azureml.core import Workspace

ws = Workspace.create(
    name = workspace_name,
    subscription_id = subscription_id,
    resource_group = resource_group, 
    location = workspace_region, 
    exist_ok = True)

ws.write_config()
print('Workspace configuration succeeded')
!cat .azureml/config.json

 

Then, we can define our model, package it by using the Azure Machine Learning SDK and deploy a web service in an Azure Container Instance

%%writefile summarizer_service.py

import re
import nltk
import unicodedata
from gensim.summarization import summarize, keywords

def clean_and_parse_document(document):
    if isinstance(document, str):
        document = document
    elif isinstance(document, unicode):
        return unicodedata.normalize('NFKD', document).encode('ascii', 'ignore')
    else:
        raise ValueError("Document is not string or unicode.")
    document = document.strip()
    sentences = nltk.sent_tokenize(document)
    sentences = [sentence.strip() for sentence in sentences]
    return sentences

def summarize_text(text, summary_ratio = None, word_count = 30):
    sentences = clean_and_parse_document(text)
    cleaned_text = ' '.join(sentences)
    summary = summarize(cleaned_text, split = True, ratio = summary_ratio, word_count = word_count)
    return summary 

def init():  
    nltk.download('all')
    return

def run(input_str):
    try:
        return summarize_text(input_str)
    except Exception as e:
        return (str(e))
from azureml.core.conda_dependencies import CondaDependencies 

myacienv = CondaDependencies.create(pip_packages = ['gensim','nltk'])

with open("mydeployenv.yml","w") as f:
    f.write(myacienv.serialize_to_string())
from azureml.core.webservice import AciWebservice, Webservice

aci_config = AciWebservice.deploy_configuration(
    cpu_cores = 1, 
    memory_gb = 1, 
    tags = {'name':'Summarization'}, 
    description = 'Summarizes text.')
service_name = "summarizer"
runtime = "python"
driver_file = "summarizer_service.py"
conda_file = "mydeployenv.yml"

from azureml.core.image import ContainerImage

image_config = ContainerImage.image_configuration(execution_script = driver_file,
                                                  runtime = runtime,
                                                  conda_file = conda_file)
webservice = Webservice.deploy(
  workspace = ws, 
  name = service_name, 
  model_paths = [],
  deployment_config = aci_config,
  image_config = image_config, 
  )

webservice.wait_for_deployment(show_output = True)

 

After that, we can set an example to test the service.

example = """
I would like to thank you for a wonderful stay at the Hotel California.   
The room we stayed in was very nice and had plenty of room for the whole family and the beds were especially comfortable.  
The kids loved going to the Kids Club and the swimming pools all day which gave us some time to relax and have a few cocktails before eating at the Bistro restaurant. The food was great and the kids menu was priced very reasonably.
A big thank you to all the staff who couldn't do enough for us and were polite and friendly throughout our stay. 
We had a great family holiday and can't wait to book again for next year. 
"""
result = webservice.run(input_data = example)
print(result)
webservice.scoring_uri

 

6.     Deploy and Test the Web Service

Finally, we can upload this file an run the project to deploy and test the model.

 

 

 

Stay up to date!



Leave a comment