{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "Google_Colab_for_Fastai_General_Template4.ipynb",
      "version": "0.3.2",
      "provenance": [],
      "collapsed_sections": [],
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "accelerator": "GPU"
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "[View in Colaboratory](https://colab.research.google.com/gist/ELC/35db433bec8401e886e227d50aa448e3/google_colab_for_fastai_general_template4.ipynb)"
      ]
    },
    {
      "metadata": {
        "id": "PjOMeCoHHlzQ",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "# Google Colab for Fast.ai Course Template\n",
        "\n",
        "Remember to enable the GPU! ***Edit > Notebook settings > set \"Hardware Accelerator\" to GPU.***\n",
        "\n",
        "Check [the source]() of this template for updates\n"
      ]
    },
    {
      "metadata": {
        "id": "ArPdbxB-vl9Y",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## Installing dependencies ##\n",
        "We need to manually install fastai and pytorch. And maybe other things that fastai depends on (see [here](https://github.com/fastai/fastai/blob/master/requirements.txt)).\n",
        "\n",
        "I will be referring to [this fastai forum thread](http://forums.fast.ai/t/colaboratory-and-fastai/10122/6) and [this blogpost](https://towardsdatascience.com/fast-ai-lesson-1-on-google-colab-free-gpu-d2af89f53604) if I get stuck. This is also a handy resource for using pytorch in colab:   https://jovianlin.io/pytorch-with-gpu-in-google-colab/ (and his [example notebook](https://colab.research.google.com/drive/1jxUPzMsAkBboHMQtGyfv5M5c7hU8Ss2c#scrollTo=ed-8FUn2GqQ4)!). And this [post](https://medium.com/@chsafouane/getting-started-with-pytorch-on-google-colab-811c59a656b6).  **Be careful with python and python3 being the same in this notebook, also there is no difference between pip and pip3**"
      ]
    },
    {
      "metadata": {
        "id": "SY72s-PAwUio",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 84
        },
        "outputId": "ae0b6d52-8aa0-4a9d-baf5-78614a7aeb1f"
      },
      "cell_type": "code",
      "source": [
        "!python3 -V\n",
        "!python -V\n",
        "!pip -V\n",
        "!pip3 -V"
      ],
      "execution_count": 1,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Python 3.6.6\n",
            "Python 3.6.6\n",
            "pip 18.0 from /usr/local/lib/python3.6/dist-packages/pip (python 3.6)\n",
            "pip 18.0 from /usr/local/lib/python3.6/dist-packages/pip (python 3.6)\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "HJoT6vSgGdAe",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "**Installing  fastai (1.x) from PyPI and installing PyTorch 1.x with CUDA 9.2** \n"
      ]
    },
    {
      "metadata": {
        "id": "av1b-3YWBbT2",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "!pip install torch_nightly -f https://download.pytorch.org/whl/nightly/cu92/torch_nightly.html\n",
        "!pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple/ torchvision==0.2.1.post1\n",
        "!pip install fastai"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "TBT_tbpj-7hZ",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "**Installing LEGACY fastai (0.7) from source and installing PyTorch 0.3.1 with CUDA 9.1** \n",
        "\n",
        "Installing from pypi is not recommended as mentioned in [fastai-github-readme](https://github.com/fastai/fastai) (due to it's rapid changes and lack of tests) and you don't want to use conda on Google Colab. So here are few steps to install the library from source."
      ]
    },
    {
      "metadata": {
        "id": "qECKi529HtXm",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 84
        },
        "outputId": "7a406fa5-05ba-45b9-cba3-13ccdc9bf203"
      },
      "cell_type": "code",
      "source": [
        "%%bash\n",
        "\n",
        "if ! [ -d fastai ]\n",
        "then\n",
        "  git clone https://github.com/fastai/fastai.git\n",
        "fi\n",
        "\n",
        "cd fastai\n",
        "\n",
        "git pull\n",
        "\n",
        "cd old\n",
        "\n",
        "pip -q install .  && echo Successfully Installed Fastai 0.7\n",
        "\n",
        "pip -q install http://download.pytorch.org/whl/cu91/torch-0.3.1-cp36-cp36m-linux_x86_64.whl && echo Successfully Installed PyTorch\n",
        "\n",
        "pip -q install torchvision && echo Successfully Installed TorchVision"
      ],
      "execution_count": 9,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Already up to date.\n",
            "Successfully Installed Fastai 0.7\n",
            "Successfully Installed PyTorch\n",
            "Successfully Installed TorchVision\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "sIIDTp5G1Hs2",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "**Import all the libraries**"
      ]
    },
    {
      "metadata": {
        "id": "XB3543WIHN0h",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "Imports for FastAI 1.x"
      ]
    },
    {
      "metadata": {
        "id": "x2kfLCuPHM4b",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "from fastai.imports import *"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "ja8LBm3DZ6vZ",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "Imports for FastAI Legacy"
      ]
    },
    {
      "metadata": {
        "id": "akD5dZfY1Fx8",
        "colab_type": "code",
        "colab": {}
      },
      "cell_type": "code",
      "source": [
        "# This file contains all the main external libs we'll use\n",
        "from fastai.imports import *\n",
        "from fastai.transforms import *\n",
        "from fastai.conv_learner import *\n",
        "from fastai.model import *\n",
        "from fastai.dataset import *\n",
        "from fastai.sgdr import *\n",
        "from fastai.plots import *"
      ],
      "execution_count": 0,
      "outputs": []
    },
    {
      "metadata": {
        "id": "MgvJGuuJs_tL",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "## GPU Check ##\n",
        "\n",
        "Check whether the GPU is enabled"
      ]
    },
    {
      "metadata": {
        "id": "zt_ux_PqxL2N",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 34
        },
        "outputId": "f207fa8c-4fa9-4f99-de97-af00e6a02a6e"
      },
      "cell_type": "code",
      "source": [
        "f'Is CUDA and CUDNN enabled: {torch.cuda.is_available()} and {torch.backends.cudnn.enabled}'"
      ],
      "execution_count": 5,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "'Is CUDA and CUDNN enabled: True and True'"
            ]
          },
          "metadata": {
            "tags": []
          },
          "execution_count": 5
        }
      ]
    },
    {
      "metadata": {
        "id": "NrbLtmTPHyl0",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "**Check how much of the GPU is available**\n",
        "\n",
        "I'm using the following code from [a stackoverflow thread](https://stackoverflow.com/questions/48750199/google-colaboratory-misleading-information-about-its-gpu-only-5-ram-available\n",
        ") to check what % of the GPU is being utilized right now. 100% is bad; 0% is good (all free for me to use!)."
      ]
    },
    {
      "metadata": {
        "id": "tCHMN-qZs5NJ",
        "colab_type": "code",
        "colab": {
          "base_uri": "https://localhost:8080/",
          "height": 67
        },
        "outputId": "e8ac7284-4039-43b2-fd59-0d43ee129998"
      },
      "cell_type": "code",
      "source": [
        "# memory footprint support libraries/code\n",
        "\n",
        "!ln -sf /opt/bin/nvidia-smi /usr/bin/nvidia-smi\n",
        "!pip -q install gputil\n",
        "!pip -q install psutil\n",
        "!pip -q install humanize\n",
        "\n",
        "import psutil\n",
        "import humanize\n",
        "import os\n",
        "import GPUtil as GPU\n",
        "\n",
        "GPUs = GPU.getGPUs()\n",
        "gpu = GPUs[0]\n",
        "process = psutil.Process(os.getpid())\n",
        "\n",
        "print(f\"Number of GPUs: {len(GPUs)}\")\n",
        "print(f\"Gen RAM Free: {humanize.naturalsize( psutil.virtual_memory().available )} | Proc size: {humanize.naturalsize( process.memory_info().rss)}\")\n",
        "print(\"GPU RAM Free: {0:.0f}MB | Used: {1:.0f}MB | Util {2:3.0f}% | Total {3:.0f}MB\".format(gpu.memoryFree, gpu.memoryUsed, gpu.memoryUtil*100, gpu.memoryTotal))"
      ],
      "execution_count": 18,
      "outputs": [
        {
          "output_type": "stream",
          "text": [
            "Number of GPUs: 1\n",
            "Gen RAM Free: 12.8 GB | Proc size: 260.7 MB\n",
            "GPU RAM Free: 11430MB | Used: 11MB | Util   0% | Total 11441MB\n"
          ],
          "name": "stdout"
        }
      ]
    },
    {
      "metadata": {
        "id": "q0WZ3Smd3P6w",
        "colab_type": "text"
      },
      "cell_type": "markdown",
      "source": [
        "# Ready to Go!"
      ]
    }
  ]
}