Cluster H20 su AWS EC2: vantaggi, svantaggi e come iniziare

Sebbene i miei ultimi articoli del blog si siano concentrati maggiormente sull’apprendimento automatico e sul deep learning, ho pensato che potrebbe essere un bel cambio di passo scrivere su DevOps in relazione al ML e all’ingegneria dei dati. Dopo tutto, senza l’ingegneria dei dati, le opportunità di apprendimento automatico sono limitate. E senza DevOps, la creazione di un’infrastruttura ripetibile ed economica è molto più difficile e richiede tempo. Gli ingegneri DevOps creano l’infrastruttura come codice che può essere distribuito o modificato facilmente, rapidamente e su richiesta. I data engineer creano pipeline affidabili e ripetibili per spostare i dati da diversi sistemi di origine a una posizione centralizzata dove i data scientist li trasformano in valore. I data engineer, quindi, sono gli eroi non celebrati del panorama dell’analisi (divulgazione completa: sono stato un ingegnere dei dati per molti anni).

Di recente ho iniziato a sperimentare con H2O e devo dire che è un’opzione interessante. Detto questo, ha i suoi punti di forza e di debolezza. Ad esempio, non trovo che sia una buona opzione per il munging dei dati. Tuttavia, una volta che hai un set di dati pronto per l’apprendimento automatico, vale la pena dedicare del tempo all’apprendimento.

Perché considerare H2O?

H2O è “una piattaforma di machine learning open source, in memoria, distribuita, veloce e scalabile”. Puoi usarlo con Python o R e ha anche una variante chiamata Sparkling Water che puoi usare con Apache Spark. Forse la sua caratteristica più intrigante è “AutoML”, una funzione che consente a H2O di eseguire analisi sui tuoi dati utilizzando più algoritmi supervisionati, restituendo una “classifica” che descrive in dettaglio quelli più efficaci.

Scalabilità orizzontale

Una grande caratteristica di H2O è che puoi “ridimensionare” creando un cluster a più nodi. Sebbene le istruzioni ufficiali per la configurazione del cluster siano abbastanza semplici, ho alcuni suggerimenti da aggiungere per:

Certo, puoi eseguire H2O sulla tua macchina locale, ma quando lo esegui su un cluster di VM cloud economiche è una forza con cui fare i conti. In questo post del blog, ti mostrerò come creare un cluster H2O a tre nodi per meno di $ 0,10 l’ora che funzionerà più del doppio rispetto a un MacBook Pro adeguatamente attrezzato (DA VERIFICARE).

Avvertenze

Alcuni disclaimer prima di iniziare:

* Nota per utenti Windows : se stai utilizzando Windows ≤ 8, il modo più semplice per giocare è installare Virtualbox e Ubuntu. Se utilizzi Windows 10, valuta la possibilità di configurare Windows Subsystem per Linux. Se utilizzi Windows 10 Enterprise, Pro o Education, puoi configurare Hyper-V e creare una VM Ubuntu tramite Hyper-V.

Puoi utilizzare l’immagine di una macchina per configurare un server H2O con tutti i vantaggi del prodotto commerciale, inclusa “AI senza driver”. Tuttavia, un singolo nodo del tipo di istanza consigliato dal fornitore (p3.2xlarge) ti farà funzionare più di $ 3,00 l’ora. È vero, queste istanze sono molto più potenti delle istanze t2.large che utilizzeremo, ma ottieni quello per cui paghi.

Presupposti e riepilogo dei passaggi

Questo articolo presuppone che tu abbia una discreta conoscenza di AWS, inclusa la configurazione di un file di configurazione SSH sulla tua macchina locale, la creazione e l’utilizzo di istanze EC2 e gruppi di sicurezza e l’utilizzo dell’interfaccia a riga di comando di AWS. Fortunatamente, Terraform fa gran parte del lavoro pesante per noi.

Ecco una panoramica di ciò che dovrai fare:

In breve, il codice Terraform:

a. Crea un gruppo di sicurezza per consentire la connessione alle VM tramite SSH (per la risoluzione dei problemi e il tunneling SSH) e consente la comunicazione tra i nodi (apre le porte 54321 e 54322 TCP e UDP per la comunicazione tra i nodi).

b. Crea tre istanze EC2 e crea un file nella home directory di ogni nodo (qui, / home / ec2-user ) chiamato flatfile.txt che include gli indirizzi IP privati ​​di tutti e tre nodi e avvia H2O su tutti i nodi come servizio.

c. Associa il gruppo di sicurezza a queste istanze.

Variabili di configurazione

Per prima cosa, dai un’occhiata al file variables.tf . Esistono diverse variabili con valori predefiniti e alcune senza valori. Successivamente assegnerai valori ai valori senza valori predefiniti (se devi sovrascrivere una qualsiasi delle altre variabili, puoi farlo anche utilizzando il seguente processo).

Accedi alla cartella principale del repository e crea o modifica il file terraform.tfvars . Dovrai inserire valori per almeno quattro delle variabili:

Ecco un esempio di come assegnare un valore a una variabile:

iam_instance_profile = & quot; My-IAM-Role-For-EC2-Instances & quot;

Probabilmente non dovrai modificare nessuno degli altri valori delle variabili, ma tieni presente che se non esegui il lancio nella regione AWS us-east-1, dovrai anche modificare la zona di disponibilità come così come l’ID AMI perché sono specifici della regione.

Dopo aver modificato il file terraform.tfvars , accedere alla cartella principale del repository in una finestra di terminale e digitare quanto segue per avviare il codice nel modello Terraform:

sh launch_ondemand.sh /path/to/ssh/key/mykey.pem

La chiave che usi qui dovrebbe essere la stessa che hai impostato nel file terraform.tfvars . Il codice dati utente in bootstrap_h2o_python3.sh (vedi il primo script di seguito) viene eseguito su ogni istanza per installare Java, Python3, alcuni moduli Python e H2O, copiare alcuni file dal repository GitHub e configurare H2O da eseguire come servizio su varianti Linux di systemd come Amazon Linux 2.

Il secondo script di seguito definisce come il servizio viene avviato, arrestato e ricaricato, mentre il terzo script (liberato da un eccellente post di Stack Overflow) è il codice effettivo che viene eseguito quando si digita sudo service h2o start (o stop o restart ) nella riga di comando.

Di seguito è riportato uno screenshot delle regole di sicurezza in entrata per il gruppo di sicurezza per H2O, creato dallo script Terraform. Consente la comunicazione tra i nodi e ti consente di utilizzare SSH e SCP con i tuoi nodi.

Imposta un inoltro dinamico nel file di configurazione SSH locale per inoltrare tutte le connessioni locali sulla porta 8157 all’host remoto

Di seguito è riportato un file di configurazione SSH di esempio che puoi utilizzare per connetterti alle tue istanze H2O. Notare l’inoltro locale sul primo server. Finché sei connesso a quel server h2o1 tramite SSH e H2O è in esecuzione, sarai in grado di connetterti alla GUI basata sul Web inserendo http://127.0.0.1 : 8157 nel browser Web della macchina locale. Modifica questo file per sostituire l’indirizzo IP con l’indirizzo IP pubblico per il server h2o1 . Puoi scegliere di fare lo stesso per gli altri nodi, ma non è necessario a meno che non intendi connetterti a loro tramite SSH per la risoluzione dei problemi.

Quando il codice Terraform viene completato, scrive gli IP privati ​​e gli IP pubblici rispettivamente in flatfile.txt e public_ips.txt e utilizza l’elenco di IP pubblici da copiare il flatfile.txt nella directory home di ogni nodo H2O. H2O utilizza questo file per essere a conoscenza dei nodi disponibili nel cluster.

Una volta completato lo script di avvio e impostato il file di configurazione SSH per il port forwarding, SSH fino al nodo del cluster H2O che hai designato come h2o1 e inserisci il seguente comando:

sudo systemctl status h2o

Dovresti vedere qualcosa di simile al seguente:

Questo è un buon segno: H2O è stato impostato correttamente su almeno un nodo. Mentre sei ancora connesso a h2o1 tramite SSH, apri una finestra del browser Web e inserisci quanto segue per connetterti a H2O Flow:

http://127.0.0.1:8157

Dovresti vedere apparire la GUI di H2O Flow. Ciò accade perché l’istruzione LocalForward che hai aggiunto al nodo h2o1 nel tuo file di configurazione ssh e perché hai una connessione SSH aperta a quel nodo.

Puoi verificare di aver configurato correttamente il tuo cluster facendo clic sul menu Admin e selezionando Cluster Status.


I valori varieranno, ma dovresti vedere queste quattro righe, una per ogni nodo del cluster e una per i valori aggregati di tutti i nodi.

Ecco fatto! Hai appena configurato un cluster H2O economico e potente per $ 0,09 l’ora. Sentiti libero di sperimentare per un po ‘l’interfaccia H2O Flow nel tuo browser per avere un’idea di cosa può fare.

Infine, torna alla directory con il tuo codice Terraform e inserisci terraform destroy per eliminare i nodi del cluster e il gruppo di sicurezza. Dovrai inserire yes al prompt e attendere finché non viene visualizzato un messaggio che conferma che tutte le risorse sono state distrutte correttamente.

Avvertenza importante : è importante sapere che H2O non è impostato per l’alta disponibilità al momento della stesura di questo documento, quindi se uno dei nodi si interrompe, sarà necessario riavviare l’intero cluster piuttosto che riavviare semplicemente il servizio o la VM del nodo guasto.

In un futuro post sul blog, ti mostrerò come utilizzare la potente funzione AutoML di H2O per eseguire il machine learning automatizzato.