{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "\"SWAN\"\n", "\"EP-SFT\"\n", "

\n", "

Handwritten Digit Classification using Deep Feed Forward Neural Network

\n", "

Using Apache Spark and Intel BigDL

\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Handwritten Digit Classification using Deep Feed Forward Neural Network Using Spark and BigDL\n", "***Author: Riccardo Castellotti***_ \n", "***Contact: Riccardo Castellotti / Luca Canali / Prasanth Kothuri*** \n", " \n", "To run this notebook we used the following configuration:\n", "* *Software stack*: LCG 94 (it has spark 2.3.1)\n", "* *Platform*: centos7-gcc7\n", "* *Spark cluster*: Analytix\n", "\n", "The tutorial presented will tackle the MNIST digit classification problem. We will build a deep feed forward neural network to help us solve the problem, which is actually a Multilayer Perceptron with two hidden layers. In a feed forward network information always moves one direction instead of ever going backwards, i.e. it has no loop or cycle inside. It's the simplest type of neural networks so it's easy and great to start with to be familiar with how to use BigDL to unleash its power. \n", " \n", "Link to Intel BigDL framework - https://bigdl-project.github.io/0.7.0/" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "sc.addPyFile(\"/eos/project/s/swan/public/BigDL/bigdl-0.7.0-python-api.zip\")" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/tmp/spark-f9321949-7729-4507-9930-2e5642682f77/userFiles-ebfa5df3-2d3e-47a1-8b1d-cfcf8324de47/bigdl-0.7.0-python-api.zip/bigdl/util/engine.py:41: UserWarning: Find both SPARK_HOME and pyspark. You may need to check whether they match with each other. SPARK_HOME environment variable is set to: /cvmfs/sft.cern.ch/lcg/releases/spark/2.3.1-e21e3/x86_64-centos7-gcc7-opt, and pyspark is found in: /cvmfs/sft.cern.ch/lcg/views/LCG_94/x86_64-centos7-gcc7-opt/lib/python2.7/site-packages/pyspark/__init__.py. If they are unmatched, please use one source only to avoid conflict. For example, you can unset SPARK_HOME and use pyspark only.\n" ] } ], "source": [ "from __future__ import print_function\n", "import matplotlib\n", "import pandas\n", "import numpy as np\n", "import datetime as dt\n", "from bigdl.nn.layer import *\n", "from bigdl.nn.criterion import *\n", "from bigdl.optim.optimizer import *\n", "from bigdl.util.common import *\n", "from bigdl.util import common\n", "from bigdl.dataset.transformer import *\n", "from bigdl.dataset import mnist\n", "import matplotlib.pyplot as plt\n", "from pyspark import SparkContext\n", "from matplotlib.pyplot import imshow" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "init_engine()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Load MNIST dataset\n", "First, we should get and store MNIST into RDD of Sample.\n", "Note: *edit the \\\"mnist_path\\\" accordingly. If the \\\"mnist_path\\\" directory does not consist of the mnist data, mnist.read_data_sets method will download the dataset directly to the directory*" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "def get_mnist(sc, mnist_path):\n", " # target is start from 0,\n", " (train_images, train_labels) = mnist.read_data_sets(mnist_path, \"train\")\n", " (test_images, test_labels) = mnist.read_data_sets(mnist_path, \"test\")\n", " training_mean = np.mean(train_images)\n", " training_std = np.std(train_images)\n", " rdd_train_images = sc.parallelize(train_images)\n", " rdd_train_labels = sc.parallelize(train_labels)\n", " rdd_test_images = sc.parallelize(test_images)\n", " rdd_test_labels = sc.parallelize(test_labels)\n", "\n", " rdd_train_sample = rdd_train_images.zip(rdd_train_labels).map(lambda features_label:\n", " common.Sample.from_ndarray(\n", " (features_label[0] - training_mean) / training_std,\n", " features_label[1] + 1))\n", " rdd_test_sample = rdd_test_images.zip(rdd_test_labels).map(lambda features_label1:\n", " common.Sample.from_ndarray(\n", " (features_label1[0] - training_mean) / training_std,\n", " features_label1[1] + 1))\n", " return (rdd_train_sample, rdd_test_sample)\n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "('Extracting', 'datasets/mnist/train-images-idx3-ubyte.gz')\n", "('Extracting', 'datasets/mnist/train-labels-idx1-ubyte.gz')\n", "('Extracting', 'datasets/mnist/t10k-images-idx3-ubyte.gz')\n", "('Extracting', 'datasets/mnist/t10k-labels-idx1-ubyte.gz')\n", "60000\n", "10000\n" ] } ], "source": [ "mnist_path = \"datasets/mnist\"\n", "(train_data, test_data) = get_mnist(sc, mnist_path)\n", "print(train_data.count())\n", "print(test_data.count())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 2. Hyperparameter setup\n", "NOTE: the `batch_size` variable has to be divisible by the number of cores available (for BigDL to be able to distribute the workload). If you change the configuration of the SparkSession, you also need to change the `batch_size` value. " ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "learning_rate = 0.2\n", "training_epochs = 15\n", "batch_size = 2048\n", "display_step = 1\n", "# Network Parameters\n", "n_hidden_1 = 256 # 1st layer number of features\n", "n_hidden_2 = 256 # 2nd layer number of features\n", "n_input = 784 # MNIST data input (img shape: 28*28)\n", "n_classes = 10 # MNIST total classes (0-9 digits)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 3. Model creation\n", "Let's define our multilayer_perceptron(MLP) model with 2 hidden layers here." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "creating: createSequential\n", "creating: createReshape\n", "creating: createLinear\n", "creating: createReLU\n", "creating: createLinear\n", "creating: createReLU\n", "creating: createLinear\n", "creating: createLogSoftMax\n" ] } ], "source": [ "def multilayer_perceptron(n_hidden_1, n_hidden_2, n_input, n_classes):\n", "# Initialize a sequential container\n", " model = Sequential()\n", " # Hidden layer with ReLu activation\n", " model.add(Reshape([28*28]))\n", " model.add(Linear(n_input, n_hidden_1).set_name('mlp_fc1'))\n", " model.add(ReLU())\n", " # Hidden layer with ReLu activation\n", " model.add(Linear(n_hidden_1, n_hidden_2).set_name('mlp_fc2'))\n", " model.add(ReLU())\n", " # output layer\n", " model.add(Linear(n_hidden_2, n_classes).set_name('mlp_fc3'))\n", " model.add(LogSoftMax())\n", " return model\n", "\n", "model = multilayer_perceptron(n_hidden_1, n_hidden_2, n_input, n_classes)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 4. Optimizer setup and training\n", "Let's create an optimizer for training. As presented in the code, we are trying to optimize a [ClassNLLCriterion](https://bigdl-project.github.io/master/#APIGuide/Losses/#classnllcriterion) and use Stochastic Gradient Descent to update the weights. Also in order to enable visualization support, we need to [generate summary info in BigDL](https://bigdl-project.github.io/master/#ProgrammingGuide/visualization/" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "creating: createClassNLLCriterion\n", "creating: createDefault\n", "creating: createSGD\n", "creating: createMaxEpoch\n", "creating: createDistriOptimizer\n", "creating: createEveryEpoch\n", "creating: createTop1Accuracy\n", "creating: createTrainSummary\n", "creating: createSeveralIteration\n", "creating: createValidationSummary\n", "saving logs to multilayer_perceptron-20181206-201037\n" ] } ], "source": [ "optimizer = Optimizer(\n", "model=model,\n", "training_rdd=train_data,\n", "criterion=ClassNLLCriterion(),\n", "optim_method=SGD(learningrate=learning_rate),\n", "end_trigger=MaxEpoch(training_epochs),\n", "batch_size=batch_size)\n", "\n", "# Set the validation logic\n", "optimizer.set_validation(\n", "batch_size=batch_size,\n", "val_rdd=test_data,\n", "trigger=EveryEpoch(),\n", "val_method=[Top1Accuracy()]\n", ")\n", "\n", "app_name='multilayer_perceptron-'+dt.datetime.now().strftime(\"%Y%m%d-%H%M%S\")\n", "train_summary = TrainSummary(log_dir='/tmp/bigdl_summaries',\n", " app_name=app_name)\n", "train_summary.set_summary_trigger(\"Parameters\", SeveralIteration(50))\n", "val_summary = ValidationSummary(log_dir='/tmp/bigdl_summaries',\n", "app_name=app_name)\n", "optimizer.set_train_summary(train_summary)\n", "optimizer.set_val_summary(val_summary)\n", "print(\"saving logs to \",app_name)" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Optimization Done.\n", "CPU times: user 22.5 s, sys: 11.4 s, total: 33.9 s\n", "Wall time: 2min 36s\n" ] } ], "source": [ "%%time\n", "# Boot training process\n", "trained_model = optimizer.optimize()\n", "print(\"Optimization Done.\")\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 5. Loss visualization\n", "\n", "\"After training, we can draw the preformance curves from the previous `train_summary` and `val_summary` variables.\"" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAt8AAALQCAYAAABIXBwRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzs3Xd0XNW5xuHfnq4uW829N9zAFdNsmRZqCDVAAgESSghJCAmBFFqSe0kFwiXUEAgJIXSHTgBbLhRj3HvHtmxZsmyrSyPNzL5/zEiWbMmWrNFI9rzPWl5ozpw5Z0s5y3m1/e1vG2stIiIiIiLS8RydPQARERERkXih8C0iIiIiEiMK3yIiIiIiMaLwLSIiIiISIwrfIiIiIiIxovAtIiIiIhIjCt8iIkchY8y9xpjizh6HiIg0pfAtIiIiIhIjCt8iIiIiIjGi8C0iEoeMMQONMTOMMWXGmHJjzJvGmCH7nfNtY8xKY0y1MabYGDPbGDOq0fs/M8ZsMMbUGGMKjTHvGWN6xP67ERE5crg6ewAiIhJbxhgv8BFQB1wPBID7gNnGmDHW2j3GmKnA48DdwKdAKnACkBa5xtXAz4E7gJVABnAqkBTb70ZE5Mii8C0iEn+uBfoBw6y1mwCMMfOBTcCNwP3AZGCZtfb+Rp97o9HXk4H/WmsfbXTstQ4dtYjIUUBlJyIi8WcysKg+eANYa/OBj4GTI4eWAOOMMQ8aY6YaYzz7XWMJcI4x5j5jzGRjjDMmIxcROcIpfIuIxJ+eQGEzxwuB7gDW2g8Jz5BPBfKAYmPMo8aY+rKSvxEuO7kMmA8UGmN+rRAuInJwCt8iIvGnAMhu5ngOsKf+hbX279baCZHjtwPXAHdF3gtZax+01h5DuITlj4TD+PUdO3QRkSObwreISPyZD0wwxgysP2CM6Q2cCMzb/2Rr7S5r7RPAXGBkM+9vs9b+FtjQ3PsiIrKPFlyKiBy9PMaYS5o5PoNwl5J3jTF3A0HgXqAYeALAGHMf4RKUvMjxccA04M7I+08QniX/DCgFpgNDI9cVEZEWKHyLiBy9UoCXmzk+HTgdeAB4GjCEQ/ZF1tr6spMFwI+AyyPX2UI4oP858v6nhEtMbgR8hGe9r7fWzuiA70NE5KhhrLWdPQYRERERkbigmm8RERERkRhR+BYRERERiRGFbxERERGRGFH4FhERERGJkaO620l6erodMmRIZw9DjnCVlZUkJSUd+kSRg9BzJO2lZ0iiQc9Rx1m4cGGxtTbrUOcd1eE7JyeHL774orOHIUe4vLw8cnNzO3sYcoTTcyTtpWdIokHPUccxxmxpzXkqOxERERERiRGFbxERERGRGFH4FhERERGJEYVvEREREZEYUfgWEREREYkRhW8RERERkRhR+BYRERERiRGFbxERERGRGFH4FhERERGJEYVvEREREZEYUfgWEREREYmRoz583/SPhfzh/TWdPQwREREREVydPYCOtqeylqKNNZ09DBERERGRo3/me3TvNFYVlBEM2c4eioiIiIjEuTgI36nU1IXYuKuis4ciIiIiInEuDsJ3GgArtpd28khEREREJN4d9eF7cFYyPreDFdvLOnsoIiIiIhLnjvrw7XQYRvZM1cy3iIiIiHS6oz58Q7j0ZOWOUkJadCkiIiIinSg+wnevNCprg3y5u7KzhyIiIiIicSw+wndk0eVylZ6IiIiISCeKi/A9NCcZj9PByh1adCkiIiIinScuwrfb6WBEzxQtuhQRERGRThUX4RvCpScrtpdirRZdioiIiEjniJ/w3SuNspoA2/ZUd/ZQRERERCROxU/47p0KwIodKj0RERERkc4RN+F7eI8UXA6jjiciIiIi0mniJnx7XU4GZSWxvrC8s4ciIiIiInEqbsI3wNCcFNYVVnT2MEREREQkTsVV+B6WncK2vVVU1wY7eygiIiIiEofiK3znJGMtbCjS7LeIiIiIxF5che+hOckArC9S3beIiIiIxF5che/+GUm4nUZ13yIiIiLSKeIqfLudDgZlJqvjiYiIiIh0irgK3xAuPVmnshMRERER6QRxF76H5aSwbU+1Op6IiIiISMzFXfgelJUEwObiyk4eiYiIiIjEm/gL35nhjicK3yIiIiISa3EXvgdkJgKwaZc6noiIiIhIbMVd+E70uOiV5mOTZr5FREREJMbiLnwDDMpK1sy3iIiIiMRcnIbvJDYVV2Kt7eyhiIiIiEgcicvwPTAzifKaAMUVtZ09FBERERGJI3EZvgdlhTueqPRERERERGIpPsN3ZrjXtxZdioiIiEgsxWX47p2egNNhyN9b1dlDEREREZE40iXCtzGmrzFmljFmtTFmpTHmh82cY4wxDxtjNhhjlhljxh/u/RwO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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "loss = np.array(train_summary.read_scalar(\"Loss\"))\n", "top1 = np.array(val_summary.read_scalar(\"Top1Accuracy\"))\n", "\n", "plt.figure(figsize = (12,12))\n", "\n", "ax=plt.subplot(2,1,1)\n", "ax.plot(loss[:,0],loss[:,1])\n", "plt.xlim(0,loss.shape[0]+10)\n", "ax.grid(True)\n", "ax.set_xlabel(\"Iterations\",fontSize=15)\n", "ax.set_ylabel(\"Loss\",fontSize=15)\n", "plt.title(\"Loss\",fontSize=15)\n", "\n", "ax=plt.subplot(2,1,2)\n", "plt.plot(top1[:,0],top1[:,1])\n", "plt.xlim(0,loss.shape[0]+10)\n", "plt.title(\"Validation accuracy\",fontSize=15)\n", "ax.set_xlabel(\"Iterations\",fontSize=15)\n", "ax.set_ylabel(\"Validation accuracy\",fontSize=15)\n", "plt.grid(True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 6. Prediction on test data\n", "\n", "Now, let's see the prediction results on test data by our trained model." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "def map_predict_label(l):\n", " return np.array(l).argmax()\n", "def map_groundtruth_label(l):\n", " return int(l[0] - 1)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ground Truth labels:\n", "7, 2, 1, 0, 4, 1, 4, 9\n", "Predicted labels:\n", "7, 2, 1, 0, 4, 1, 4, 9\n", "CPU times: user 83 ms, sys: 29.7 ms, total: 113 ms\n", "Wall time: 1.06 s\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "%%time\n", "predictions = trained_model.predict(test_data)\n", "imshow(np.column_stack([np.array(s.features[0].to_ndarray()).reshape(28,28) for s in test_data.take(8)]),cmap='gray'); plt.axis('off')\n", "print('Ground Truth labels:')\n", "print(', '.join(str(map_groundtruth_label(s.label.to_ndarray())) for s in test_data.take(8)))\n", "print('Predicted labels:')\n", "print(', '.join(str(map_predict_label(s)) for s in predictions.take(8)))" ] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.15" }, "sparkconnect": { "bundled_options": [], "list_of_options": [ { "name": "spark.jars", "value": "/eos/project/s/swan/public/BigDL/bigdl-SPARK_2.3-0.7.0-jar-with-dependencies.jar" }, { "name": "spark.scheduler.minRegisteredResourcesRatio", "value": "1.0" }, { "name": "spark.shuffle.reduceLocality.enabled", "value": "false" }, { "name": "spark.shuffle.blockTransferService", "value": "nio" }, { "name": "spark.dynamicAllocation.enabled", "value": "false" }, { "name": "spark.speculation", "value": "false" }, { "name": "spark.executor.instances", "value": "8" }, { "name": "spark.executor.cores", "value": "4" }, { "name": "spark.yarn.dist.files", "value": "/eos/project/s/swan/public/BigDL/bigdl-0.7.0-python-api.zip" } ] } }, "nbformat": 4, "nbformat_minor": 2 }