Civo ML provides an excellent platform for the training and deployment of machine learning models, amongst other things.
Django is one of Pythons' most powerful web frameworks. It follows the Model-View-Controller (MVC) architectural design pattern and is used to build scalable web applications. We will be using it in this article to create a simple front end for our sample Civo ML model.
Civo KfaaS (Kubeflow as a Service) refers to a serverless platform offered by Civo that aids in running and deployment of serverless functions using Kubernetes. Training your machine learning models using Civo KfaaS eradicates the backlog of individually setting up and maintaining your development environment. This in turn enables you to focus mostly on the data analysis process. Effective resource allocation also comes in handy when we choose Civo KfaaS to train our machine learning models. For example, while using Civo KfaaS, we are allocated sufficient CPU, memory and GPU, according to our dataset and model size, making it the best for training large scale models. This ensures our models train faster and a bit more efficiently.
In this article, I will take you through how to use Civo KfaaS to train a sample machine learning model, then connect it to a simple Django frontend.
You can learn more about Civo’s machine learning offering here:
- Civo ML product page
- Civo ML documentation
- Unlocking the Potential of Machine Learning on the Cloud
- How Cloud Native Can Reduce the Cost of Machine Learning
Prerequisites
Accessing Civo ML
In order to access Civo KfaaS, follow these steps:
Log into your Civo account and navigate to the products sub-menu > select “Machine Learning” > click the “Launch your CPU ML project” button found at the center of the page.
Once you have completed the previous steps, go ahead and create a KfaaS cluster by clicking on the “Create a KfaaS cluster” button.
Fill in the specifications for your cluster, then click on the “create KfaaS” button.
From here, the cluster takes a few minutes to build before it is ready.
When your KfaaS cluster is finally ready, you can access your Kubeflow dashboard (via the Kubeflow dashboard button at the bottom of the page) by login in.
Your Kubeflow dashboard should look like the image below:
On the left side menu, click on “Notebooks' ' which will successfully launch a Jupyter Notebook server built on top of the Kubeflow environment.
For you to efficiently run a notebook server in a Kubeflow environment, CPU, memory, storage, and networking are some of the basic requirements that need to be met. Their specifications depend on the type of notebook server you need to run.
For the CPU, a minimum of 2vCPUs is highly recommended, but it could be adjusted based on the workload intended. For the memory specification, it is advisable to have a minimum of 4GB so that your notebook server can run efficiently. However, just like the CPU specification, the memory specification can be adjusted according to your project needs.
Training a sample model
In this example, we are going to train a simple language translation machine learning model that will help us translate English to French. For this, we will upload a local dataset to our Notebook server.
To upload datasets to our Kubeflow Notebooks, go to the interface's file browser section and click on the "upload" button.
Once our dataset has been uploaded, you will see the code below on the Notebook:
# modules import
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.linear_model import LogisticRegression
# Load the dataset
df = pd.read_csv('translation_dataset.csv')
# Split the dataset into input (English) and target (French) texts
X = df['English_Text']
y = df['French_Text']
# Split the dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# Create a CountVectorizer to convert text into numerical features
vectorizer = CountVectorizer()
X_train_vec = vectorizer.fit_transform(X_train)
X_test_vec = vectorizer.transform(X_test)
# Train a logistic regression model
model = LogisticRegression()
model.fit(X_train_vec, y_train)
# Evaluate the model
accuracy = model.score(X_test_vec, y_test)
print("Accuracy:", accuracy)
Once we are satisfied with our model, we are going to package it so that we use it in our Django front end.
Add the code below on the last cell of your Notebook instance:
import joblib
# model = LogisticRegression()
model.fit(X_train_vec, y_train)
# Save the model to a file
joblib.dump(model, 'model.pkl')
In the code we used above to train our model, we made use of a logistic regression algorithm. A logistic regression algorithm is a statistical model used to predict and give the highest probability between one or more outcomes based on an input feature. We mostly use logistic regression algorithms to help solve binary classification issues.
For example, we can use logistic regression to predict the probability of customers clicking on links/adverts on a certain site. Assuming we have a customer's dataset, we could use a logistic regression algorithm to predict a binary outcome by fitting a linear model, using the sigmoid
function, to the data provided. Once the model is trained to our satisfaction, we can then go ahead and predict the highest probability of a customer clicking on a link/advert.
You can read more on Logistic regression algorithms here.
In our trained model above, we used the joblib.dump
function to save our trained model. Our saved model is now stored in a file named model.pkl
. This method of saving our model into a file is referred to as model pickling. By making use of model pickling, it becomes easier to export and use in other applications of your choice, eradicating the need to re-train our model every time we need to use it. After model pickling, our model is also able to load faster because our interpreter quickly interprets and reconstructs our model architecture from our file and uses it as needed.
We can now download our model from the Kubeflow Notebook environment to our local machine, where we are going to develop a simple Django front end.
Select "Download" from the Notebook interface to begin the download process. Once this is complete, a copy of the trained model should be available on the local machine.
Building the Django frontend
Now that we have our model trained to our satisfaction and saved, let us begin setting up our front end, which will be used to display and test out the new model.
Creating Django project and app
Before the development of every Python project, you need to create a virtual environment for it. To create a virtual environment, check out Python documentation here..
Once we are done creating our virtual environment, run the below command into your terminal to create a new Django project named djangoProject
:
django-admin startproject djangoProject
Then run the following command to install Django into your project:
pip3 install django==3.*
Once we are done with the Django installation, you need to change directories for the new project by running the command:
cd djangoProject
The project directory should have the following structure:
djangoProject/
manage.py
djangoProject/
__init__.py
settings.py
urls.py
wsgi.py
asgi.py
Inside our djangoProject
directory, run the command below to create a new app named djangoApp
, which we will then use to develop our front end.
python3 manage.py startapp djangoApp
The app directory should now look like the one below:
djangoApp/
migrations/
__init__.py
__init__.py
admin.py
apps.py
models.py
tests.py
views.py
To properly configure and connect the djangoProject
and djangoApp
, there is a couple of steps you’ll need to do:
- Navigate to
djangoProject
and into the settings file,and add the app name,djangoApp
into theInstalled_App
list. - Create a new URL file,
urls.py
in thedjangoApp
: The URL file helps us define the patterns of our app by mapping each view to a specific URL pattern. - In the project’s URL file, import the
include
function fromdjango.urls
then add the app’s URL as a new URL pattern using theinclude
function.
After following these steps, you have successfully connected djangoProject
and djangoApp
.
Loading saved model to the Django project
Now that the Django project is set up, we can create a new directory called savedModel
at our project root, where we will store our saved Civo KfaaS model. Then you can export the model.pkl
file to the savedModel
directory, resulting in the trained Civo KfaaS model properly placed in your Django project.
From here, we are going to load the model in our views
file.
*djangoApp/views.py*
from django.shortcuts import render
from django.http import JsonResponse
from sklearn.externals import joblib
def translation_view(request):
if request.method == 'POST':
# Load the saved model
model_path = 'djangoProject/djangoApp/savedModel/model.pkl'
model = joblib.load(model_path)
# Get the input text from the request
input_text = request.POST.get('text', '')
# Perform translation using the loaded model
translated_text = model.predict([input_text])[0]
# Return the translated text as a JSON response
return JsonResponse({'translated_text': translated_text})
return render(request, 'translation.html')
Next, you’ll need to have a translation_view
function that takes a request object as a parameter and checks if the HTTP request method is a POST request before executing the function. The next line then loads the model into the view file. After this, you’ll have an input_text
variable that is assigned to the value of text
in POST request data.
Next, our model calls the predict method to our [input_text]
, then the result is assigned to the translated_text
variable. A JSON response object is then returned with translated_text
as content. A HTML template is rendered after all the functions' conditions are met.
In the URLs, we are going to define a URL pattern that will map to the above translation view:
*djangoApp/urls.py*
from django.urls import path
from . import views
urlpatterns = [
path('translate/', views.translation_view, name='translate'),
]
The final thing we are going to do is create a HTML template that is going to display our Django frontend:
- In the
djangoApp
directory, create a new directory namedtemplates
- Inside the
templates
directory, create a new file namedindex.html
To generate a simple form that lets users enter sample texts and sentences for English-French translation, enter the following code in the index.html
file:
*djangoApp/templates/index.html*
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title> Django </title>
</head>
<body>
<h1>Language translation</h1>
<form method="POST" action="{% url 'translate' %}">
{% csrf_token %}
<input type="text" name="text" placeholder="Enter English text">
<button type="submit">Translate</button>
</form>
</body>
</html>
Finally, run the command below in the terminal to test the application on the local server:
python3 manage.py runserver
In your browser, you should be able to see a layout similar to the one below:
Once satisfied with the application, go ahead and publicly deploy it on different platforms!
Summary
Following the instruction above, we successfully used Civo ML and Civo KfaaS to train a sample translation model, save it using model pickling, and connect it to a minimal Django frontend. From this, developers can leverage Civo ML with Django's flexibility to create faster and more impactful machine learning apps by following the methods outlined above.
By exploring more Kubeflow and Django documentation, you can transform your serverless machine learning journey!