Cursus
Hoewel AWS EC2 marktleider is in cloud computing, heeft Google Cloud een zeer aantrekkelijk en concurrerend cloudplatform ontwikkeld.
In deze tutorial leer je hoe je:
- Een instantie maakt op Google Compute Engine (GCE),
- Een data science-omgeving installeert op basis van de Anaconda Python-distributie, en
- Jupyter-notebooks online toegankelijk maakt en uitvoert.
Werken in de cloud in plaats van op je eigen machine heeft twee grote voordelen voor data science-projecten:
- Schaalbaarheid: je kunt de kracht (RAM, CPU, GPU) van je instantie afstemmen op je directe behoeften. Begin met een kleine en goedkope instantie en voeg geheugen, opslag, CPU’s of GPU’s toe naarmate je project groeit.
- Reproduceerbaarheid: een belangrijke voorwaarde voor elk data science-project. Andere data scientists je modellen laten beoordelen en je onderzoek laten reproduceren is noodzakelijk voor een succesvolle implementatie. Door een werkende omgeving op een virtuele instantie in te richten, zorg je ervoor dat je werk eenvoudig gedeeld, gereproduceerd en gecontroleerd kan worden door andere teamleden.
Google Compute Engine
Hoewel ze rond dezelfde concepten en elementen (instanties, images en snapshots) zijn opgebouwd, verschillen EC2 en GCE in zowel toegang als organisatie van resources.
Een belangrijk aspect van het Google Cloud Platform (GCP) is de projectgerichte organisatie. Alle facturatie, permissies, resources en instellingen zijn gegroepeerd binnen een door de gebruiker gedefinieerd project dat in feite fungeert als een globale namespace. Dit vereenvoudigt niet alleen de onderlinge koppeling van de resources die je gebruikt (opslag, databases, instanties, ...) maar ook het toegangsbeheer van rolgebaseerde permissies tot daadwerkelijke ssh-sleutels en beveiliging. Wat gebruiksvriendelijkheid en toegangs- en rollenbeheer betreft, vind ik werken op GCP eenvoudiger dan met AWS, zeker wanneer je meerdere services gebruikt.
GCP biedt ook bepaalde services die bijzonder relevant zijn voor data science, waaronder maar niet beperkt tot:
- Dataprep om datapijplijnen te bouwen,
- Datalab voor data-exploratie,
- de Google Machine Learning Engine gebouwd op TensorFlow
- BigQuery, een datawarehouse-oplossing met veel fascinerende Big Data-datasets.
Een lage leercurve en data-vriendelijke services maken GCP onmisbaar in je data scientist-toolbox.
Voordat je instanties gaat starten en Python-pakketten installeert, nemen we kort een aantal veelgebruikte termen in cloud computing door.
VM’s, disks, images en snapshots
Een Virtual Machine (VM), ook wel een "instantie" genoemd, is een server op afroep die je activeert wanneer nodig. De onderliggende hardware wordt op een transparante manier met andere gebruikers gedeeld en is voor jou volledig virtueel. Je kiest alleen een globale geografische locatie van de instantie, gehost in een van Google’s datacenters.
Een VM wordt gedefinieerd door het type persistente schijf en het besturingssysteem (OS), zoals Windows of Linux, waarop hij is gebaseerd. De persistente schijf is jouw virtuele stukje hardware.
Een image is de fysieke combinatie van een persistente schijf en het besturingssysteem. VM-images worden vaak gebruikt om een bepaalde configuratie te delen en op meerdere andere VM’s te implementeren. Publieke images zijn die welke door Google worden geleverd met een keuze aan specifieke besturingssystemen, terwijl private images door gebruikers zijn aangepast.
Een snapshot is een momentopname van de inhoud van een VM (schijf, software, libraries, bestanden) op een bepaald tijdstip en wordt vooral gebruikt voor directe back-ups. Het belangrijkste verschil tussen snapshots en images is dat snapshots als diffs worden opgeslagen, relatief ten opzichte van eerdere snapshots, terwijl images dat niet zijn.
Je kunt zowel een image als een snapshot gebruiken om een nieuwe VM te definiëren en te starten.
Samengevat: wanneer je een nieuwe instantie start, begint GCE met het koppelen van een persistente schijf aan je VM. Dit levert de schijfruimte en geeft de instantie het root-bestandssysteem dat nodig is om op te starten. De schijf installeert het OS dat hoort bij de image die je hebt gekozen. Door snapshots van een image te nemen, maak je directe back-ups en kun je gegevens van bestaande VM’s kopiëren om nieuwe VM’s te starten.
We gaan dit nu in de praktijk brengen en aan de slag met je eerste VM!
Aan de slag met je eerste VM op GCP
Maak een account en project aan
Om een account op GCP te openen, heb je een standaard Google (Gmail) account nodig. Op het moment van schrijven biedt Google een gratis proefperiode van 12 maanden / $300 voor het platform. Hoewel deze aanbieding met bepaalde beperkingen komt (bijvoorbeeld geen bitcoin mining), is het voldoende om in deze omgeving aan de slag te gaan.
Om je GCP-account met de gratis proefperiode te maken, ga je naar cloud.google.com en klik je op de knop try it free. Je wordt gevraagd in te loggen met je Google-account en je factuurgegevens toe te voegen. Zodra je account is aangemaakt, kun je de webconsole openen via http://console.cloud.google.com/.
Je gebruikt eerst de webconsole om een Debian-gebaseerde instantie te definiëren en te starten en schakelt vervolgens over naar de webgebaseerde shellterminal om alle benodigde pakketten voor je data science-stack te installeren.
Maar eerst maak je een nieuw project aan:
- Ga naar de Resource Management-pagina,
- Klik op "Create a new project",
- Geef de titel van je project op en let op hoe Google direct een project-ID genereert.
- Bewerk de project-ID indien nodig en klik op "Create".
De project-ID moet uniek zijn binnen de GCP-namespacenaamgeving, terwijl de projecttitel alles kan zijn wat je wilt. Ik noem mijn project datacamp-gcp zoals hieronder weergegeven:

Standaard wordt bij het maken van een nieuw project je Google-account ingesteld als eigenaar van het project, met volledige permissies en toegang tot alle resources en facturatie van het project.
In de sectie Rollen op de IAM-pagina kun je mensen met specifieke rollen aan je project toevoegen. Voor deze tutorial sla je dat over en blijf je de enige gebruiker en beheerder van het project.
Maak een instantie
Om je eerste VM te maken, doorloop je de volgende stappen:
- Ga naar je dashboard op https://console.cloud.google.com/home/dashboard en selecteer het project dat je zojuist hebt gemaakt.
- Selecteer in het menu linksboven "Compute Engine" en klik op "VM instances".
- Klik in het dialoogvenster op de knop "Create".

Je bent nu op de pagina "Create an Instance".
-
Geef de instantie een naam: je kunt elke naam kiezen die je wilt. Ik noem mijn instantie
starling. -
Selecteer de regio: als vuistregel kies je de goedkoopste regio die het dichtst bij je in de buurt is om de latentie te minimaliseren. Ik kies
east-d. Let op: prijzen variëren aanzienlijk per regio. -
Selecteer het geheugen, de opslag en de CPU die je nodig hebt. Je kunt een van de presets gebruiken of je eigen instantie samenstellen. Hier kies ik de standaardconfiguratie
n1-standard-1met 3,75 GB RAM en 1 vCPU voor een geschatte prijs van $24,67 per maand. -
Selecteer de boot disk en ga voor de standaard Debian GNU/Linux 9 (stretch) OS met 10 GB. Als je liever Ubuntu of een andere Linux-distributie gebruikt, klik dan op de knop "Change" en maak de juiste keuze. Omdat Ubuntu nauw verwant is aan Debian, werken beide distributies voor deze tutorial.

5.Zorg dat je de VM via internet kunt benaderen door http- en https-verkeer toe te staan.

6.(Optioneel) Schakel een persistente schijf in voor back-updoeleinden: Klik op de link "Management, Disks, networking, SSH keys". Er verschijnt een set tabbladen, selecteer het tabblad "Disks" en deselecteer de "Deletion Rule". Zo wordt bij het verwijderen van je instantie de schijf niet verwijderd en kun je die later gebruiken om een nieuwe instantie te starten.

7.Klik tot slot op "Create". Je instantie is binnen enkele minuten gereed.
Let op de link "Equivalent command line" onder de knop Create. Deze link toont de equivalente opdrachtregel die nodig is om dezelfde instantie from scratch te maken. Dit is een erg slimme functie die het leren van de syntaxis van de gcloud SDK vergemakkelijkt.
Op dit punt heb je een draaiende instantie die nog vrijwel leeg is. Er zijn 2 manieren om toegang te krijgen tot de instantie. Ofwel door de gcloud SDK op je lokale machine te installeren of door de Google Cloud Shell te gebruiken.
Google Cloud Shell
Google Cloud Shell is een zelfstandige terminal in je browser waarmee je je resources kunt benaderen en beheren. Je activeert de Google shell door op het >\_-icoon rechtsboven op de consolepagina te klikken. Het onderste deel van je browser wordt een shellterminal.

Deze terminal draait op een f1-micro Google Compute Engine-virtuele machine met een Debian-besturingssysteem en 5 GB opslag. Hij wordt per gebruiker en per sessie aangemaakt. Hij blijft actief zolang je cloud shell-sessie actief is en wordt na 20 minuten inactiviteit verwijderd. Omdat de bijbehorende schijf persistent is tussen sessies, is je content (bestanden, configuraties, ...) van sessie tot sessie beschikbaar. De cloud shell-instantie wordt geleverd met vooraf geïnstalleerde gcloud SDK en vim.

Het is belangrijk onderscheid te maken tussen de Cloud Shell-instantie, die gebruikersgebonden is, en de instantie die je zojuist hebt gemaakt. De instantie onder de cloud shell is slechts een handige manier om een resourcebeheeromgeving te hebben en je configuraties op een vluchtige instantie op te slaan. De VM-instantie die je zojuist hebt gemaakt, in het bovenstaande voorbeeld starling genoemd, is de instantie waarop je je data science-omgeving wilt installeren.
In plaats van de Google Cloud Shell te gebruiken, kun je ook de gcloud SDK installeren op je lokale machine en alles vanuit je lokale omgeving beheren.
Hier zijn een paar handige opdrachten om je instanties te beheren.
-
Je instanties weergeven
gcloud compute instances list -
De instantie stoppen (duurt enkele seconden)
gcloud compute instances stop <instance name> -
De instantie starten (duurt ook enkele seconden)
gcloud compute instances start <instance name> -
en via ssh inloggen op de starling-instantie
gcloud compute ssh <instance name>
De VM inrichten
Voer die laatste opdracht uit in je Google Shell-venster om in te loggen op je instantie. De volgende stappen bestaan uit:
- Een paar Debian-pakketten installeren met
apt-get install. - De Anaconda- of Miniconda-distributie installeren.
- De instantie zo instellen dat Jupyter-notebooks veilig online toegankelijk zijn.
Debian-pakketten
We beginnen met het installeren van de Debian-pakketten:
- bzip2, vereist voor het installeren van Mini/Anaconda,
- git, altijd handig om te hebben, en
- libxml2-dev, nu niet vereist maar vaak nodig bij het installeren van aanvullende Python-libraries.
Voer de volgende opdrachten uit, die zowel voor Ubuntu als Debian werken, in de terminal:
$ sudo apt-get update
$ sudo apt-get install bzip2 git libxml2-dev
Anaconda / Miniconda
Zodra bovenstaande pakketten zijn geïnstalleerd, kun je de Anaconda-distributie voor Python 3 installeren. Je kunt kiezen tussen de volledige Anaconda-versie, die veel wetenschappelijke Python-libraries bevat die je misschien niet allemaal nodig hebt, of de lichtere Miniconda-versie, waarbij je de Jupyter-libraries handmatig moet installeren. Het proces is in beide gevallen erg vergelijkbaar.
Om de lichtere Miniconda-distributie te installeren, voer je uit
$ wget https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh
$ bash Miniconda3-latest-Linux-x86_64.sh
$ rm Miniconda3-latest-Linux-x86_64.sh
$ source .bashrc
$ conda install scikit-learn pandas jupyter ipython
Het installatiescript wordt gedownload en uitgevoerd met de eerste 2 regels. Je accepteert de licentie en standaardlocatie. In regel 3 wordt het shellbestand, dat niet meer nodig is, verwijderd. Door .bashrc te sourcen in regel 4, wordt het conda-commando aan je $PATH toegevoegd zonder een nieuwe terminal te hoeven openen. En tot slot installeert de laatste regel de vereiste Python-libraries: scikit-learn pandas jupyter ipython.
De opdrachten om de volledige Anaconda-distributie te installeren zijn zeer vergelijkbaar. Controleer de downloadpagina om de nieuwste versie van het shellscript te gebruiken:
$ wget https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh
$ bash Anaconda3-5.0.1-Linux-x86_64.sh
$ rm Anaconda3-5.0.1-Linux-x86_64.sh
$ source .bahsrc
Om te verifiëren dat alles correct is geïnstalleerd, controleer je je Python-versie met python --version en verifieer je met het commando which python dat de juiste Python standaard wordt aangeroepen. Je zou iets vergelijkbaars moeten krijgen als

Je hebt nu een werkende Python-omgeving met de standaard data science-libraries geïnstalleerd (sklearn, pandas).
Webtoegang toestaan
De derde en laatste stap is het configureren van je VM om webtoegang tot je Jupyter-notebooks toe te staan.
Je moet eerst de VM vanaf het web bereikbaar maken. Hiervoor maak je via de Google Cloud-console een firewallregel aan. Ga terug naar je Instances-dashboard en selecteer in het menu linksboven "VPC Network > Firewall rules". Klik op de link "CREATE FIREWAL RULE" en vul de volgende waarden in:
- Name: jupyter-rule (je kunt elke naam kiezen)
- Source IP ranges: 0.0.0.0/0
- Specified protocols and ports: tcp:8888
- en laat alle andere variabelen op hun standaardwaarden staan.
Het formulier zou er zo uit moeten zien:

Deze firewallregel staat al het inkomende verkeer (van alle IP’s) naar poort 8888 toe.
Via de link "Equivalent command line" kun je zien dat de firewallregel ook vanaf de terminal kan worden gemaakt met de volgende opdrachtregel:
$ gcloud compute --project=datacamp-gcp firewall-rules create jupyter-rule --direction=INGRESS --priority=1000 --network=default --action=ALLOW --rules=tcp:8888 --source-ranges=0.0.0.0/0
Ga nu terug naar de VM-pagina (menu linksboven > Compute Engine > VM instances), klik op de naam van je VM.
Noteer het IP-adres van je VM. Dit is het IP-adres dat je in je browser gebruikt om toegang te krijgen tot je Jupyter-omgeving. In mijn voorbeeld is het IP-adres: 35.196.81.49, het jouwe zal anders zijn.

en controleer of de firewallregels zijn aangevinkt:

Jupyter-configuratie
Jupyter-notebooks hebben een configuratiebestand dat moet worden gegenereerd en bewerkt om online toegang tot je notebooks in te stellen. Voer in de terminal jupyter notebook --generate-config uit om het configuratiebestand te genereren. En jupyter notebook password om een wachtwoord te genereren.
Tip: zorg dat dit een sterk wachtwoord is!
Bewerk nu het configuratiebestand dat je zojuist hebt gemaakt met vim .jupyter/jupyter_notebook_config.py en voeg de volgende regel bovenaan het bestand toe
c.NotebookApp.ip = '*'
(om in vim naar de bewerkmodus te gaan, typ je gewoon het teken i). Afsluiten en opslaan met de volgende reeks ESC:wq.
Dit zorgt ervoor dat de notebook beschikbaar is voor alle IP-adressen op je VM en niet alleen de URL http://localhost:8888 die je misschien kent wanneer je op je lokale machine werkt.
Starten
Je bent nu klaar om je Jupyter-notebook te starten met de opdrachtregel:
$ jupyter-notebook --no-browser --port=8888
En je zou zoiets moeten zien in de terminal:

Ga in je browser naar de URL: http://<your_VM_IP>:8888/ om toegang te krijgen tot je zojuist operationele Jupyter-notebook.
Om te controleren of alles werkt zoals verwacht, maak je een nieuwe Python 3-notebook en import pandas

Intermezzo
Een paar opmerkingen over je huidige setup:
-
Het IP-adres dat je in je browser hebt gebruikt, is vluchtig. Dat betekent dat elke keer dat je je VM opnieuw start, je notebooks een andere URL hebben. Je kunt dat IP-adres statisch maken door te gaan naar: Menu linksboven > VPC Network > External IP addresses en "static" te selecteren in het dropdownmenu

-
De beveiliging van je huidige setup is afhankelijk van de sterkte van het Jupyter-notebookwachtwoord dat je eerder hebt ingesteld. Iedereen op internet kan je Jupyter-omgeving openen via dezelfde URL die jij gebruikt (en bots zullen dat absoluut proberen). Een krachtige maar zeer onveilige kernfunctie van Jupyter-notebooks is dat je vanuit de notebook een terminal met sudo-toegang kunt openen. Dit betekent dat iedereen die toegang krijgt tot je notebook je VM kan overnemen na het kraken van je notebookwachtwoord en mogelijk alles kan uitvoeren wat je rekeningen de pan uit doet rijzen. De eerste maatregelen om dit te voorkomen zijn onder meer
-
Zorg ervoor dat je Jupyter-wachtwoord sterk is
- Vergeet niet je VM te stoppen wanneer je er niet aan werkt
Je draait de server momenteel ook via http en niet https, wat niet voldoende veilig is. Let’s Encrypt biedt gratis SSL/TLS-certificaten en is de versleutelingsoplossing die in de Jupyter-documentatie wordt aanbevolen. Lees dit voor meer informatie over beveiligingskwesties bij het uitvoeren van een openbare Jupyter-notebook.
IPython
Jupyter-notebooks zijn erg handig voor online samenwerking. Maar je kunt ook een IPython-sessie uitvoeren vanuit je terminal met het commando ipython. Dat opent een IPython-sessie met alle toeters en bellen van een Jupyter-notebook zoals magic commands (%paste, %run, ...) maar dan zonder de webinterface.
R
Het is eenvoudig om je VM zo in te stellen dat R-notebooks in je Jupyter-console mogelijk zijn. De instructies voor het inschakelen van R Markdown zijn beschikbaar in deze geweldige DataCamp-tutorial: Jupyter And R Markdown: Notebooks With R door Karlijn Willems.
Conclusie
Google Cloud biedt veel interessante diensten voor data science en krachtige maar eenvoudig in te richten VM-instanties, naast een zeer aantrekkelijke gratis proefperiode. De webconsole is makkelijk te navigeren en toont vaak het equivalente commandoregelcommando bij de huidige configuratiepagina’s, waardoor de drempel voor het gebruik van de gcloud SDK lager wordt.
In dit artikel heb je geleerd hoe je een VM-instantie selecteert en start, de benodigde Debian-pakketten, Anaconda-distributie en data science-stack installeert en hoe je de toegangsregels instelt om een Jupyter-notebook te starten die vanuit je browser toegankelijk is.
Hoewel het hele proces de eerste keer wat complex kan lijken, wordt het al snel vertrouwd naarmate je meer VM’s maakt en start. En mocht het te rommelig worden, dan kun je altijd de VM waarop je werkt verwijderen en opnieuw beginnen. Dat is een van de voordelen van werken in de cloud. Na een paar keer kun je binnen enkele minuten complete data science-omgevingen op Google Cloud opzetten. Neem gerust contact op en deel je opmerkingen en vragen met me op Twitter: @alexip.
