Sommario:
Video: Execute Jars and Python scripts on Azure Databricks using Data Factory | Azure Friday 2024
Molti computer oggi sono multicore (due o più processori in un unico pacchetto), alcuni con più CPU fisiche. Uno dei limiti più importanti di Python è che utilizza un singolo core per impostazione predefinita. (È stato creato in un momento in cui i single core erano la norma).
I progetti di scienza dei dati richiedono molti calcoli. In particolare, una parte dell'aspetto scientifico della scienza dei dati si basa su test ripetuti ed esperimenti su diverse matrici di dati. Non dimenticare che lavorare con enormi quantità di dati significa che la maggior parte delle trasformazioni che richiedono tempo ripetono l'osservazione dopo l'osservazione (ad esempio, operazioni identiche e non correlate su parti diverse di una matrice).
L'utilizzo di più core CPU accelera un calcolo di un fattore che corrisponde quasi al numero di core. Ad esempio, avere quattro core significherebbe lavorare al massimo quattro volte più velocemente. Non si ottiene un aumento completo di quattro volte perché c'è un sovraccarico quando si avvia un processo parallelo: nuove istanze Python in esecuzione devono essere configurate con le giuste informazioni in memoria e avviate; di conseguenza, il miglioramento sarà inferiore a quello potenzialmente ottenibile ma comunque significativo.
Sapere come utilizzare più di una CPU è quindi un'abilità avanzata ma incredibilmente utile per aumentare il numero di analisi completate e per velocizzare le operazioni sia durante l'installazione che durante l'utilizzo dei prodotti di dati.
Il multiprocessing funziona replicando lo stesso codice e il contenuto della memoria in varie nuove istanze Python (i lavoratori), calcolando il risultato per ognuno di essi e restituendo i risultati raggruppati alla console principale originale. Se l'istanza originale occupa già gran parte della memoria RAM disponibile, non sarà possibile creare nuove istanze e la macchina potrebbe esaurire la memoria.
Esecuzione del parallelismo multicore
Per eseguire il parallelismo multicore con Python, si integra il pacchetto Scikit-learn con il pacchetto joblib per operazioni dispendiose in termini di tempo, come la replica di modelli per la convalida dei risultati o per la ricerca di i migliori iper-parametri. In particolare, Scikit-learn consente il multiprocessing quando
-
Convalida incrociata: Verifica dei risultati di un'ipotesi di apprendimento automatico utilizzando diversi dati di addestramento e test
-
Ricerca a griglia: Modifica sistematica degli iperparametri di un'ipotesi di apprendimento automatico e test dei risultati conseguenti
-
Predizione multilivello: Esecuzione di un algoritmo più volte su più target quando ci sono molti risultati target diversi da prevedere allo stesso tempo
-
Metodi di machine-learning Ensemble: Modellazione di una grande quantità di classificatori, ciascuno indipendente dall'altro, come quando si utilizza la modellazione basata su RandomForest
Non è necessario fare nulla di speciale per sfruttare i calcoli paralleli: è possibile attivare il parallelismo impostando il parametro n_jobs per un numero di core superiore a 1 o impostando il valore su -1, il che significa che si desidera utilizzare tutte le istanze CPU disponibili.
Se non si sta eseguendo il codice dalla console o da un notebook IPython, è estremamente importante separare il codice da qualsiasi importazione di pacchetto o assegnazione di variabile globale nel proprio script utilizzando if if __name __ == '__ main__': comando all'inizio di qualsiasi codice che esegue il parallelismo multicore. L'istruzione if controlla se il programma viene eseguito direttamente o viene chiamato da una console Python già in esecuzione, evitando qualsiasi confusione o errore dal processo multiparallel (come ricorsivamente chiamando il parallelismo).
Dimostrazione del multiprocessing
È una buona idea usare IPython quando si esegue una dimostrazione di come il multiprocessing possa davvero farvi risparmiare tempo durante i progetti di scienza dei dati. L'utilizzo di IPython offre il vantaggio di utilizzare il comando magico% time per l'esecuzione della temporizzazione. Si inizia caricando un set di dati multiclasse, un algoritmo complesso di apprendimento automatico (il Support Vector Classifier o SVC) e una procedura di convalida incrociata per stimare i punteggi risultanti affidabili da tutte le procedure.
La cosa più importante da sapere è che le procedure diventano piuttosto grandi perché SVC produce 10 modelli, che ripete 10 volte ciascuno usando la convalida incrociata, per un totale di 100 modelli.
da sklearn. set di dati import load_digits digits = load_digits () X, y = cifre. dati, cifre. obiettivo da sklearn. svm importa SVC da sklearn. cross_validation import cross_val_score% timeit single_core_learning = cross_val_score (SVC (), X, y, cv = 20, n_jobs = 1) Out [1]: 1 loop, meglio di 3: 17. 9 s per loop
Dopo questo test, è necessario attivare il parallelismo multicore e cronometrare i risultati utilizzando i seguenti comandi:
% timeit multi_core_learning = cross_val_score (SVC (), X, y, cv = 20, n_jobs = -1) Out [2]: 1 loop, best of 3: 11. 7 s per loop
La macchina di esempio dimostra un vantaggio positivo utilizzando l'elaborazione multicore, nonostante l'utilizzo di un piccolo set di dati in cui Python spende la maggior parte del tempo per avviare le console e eseguire una parte del codice in ciascuna di esse. Questo sovraccarico, di pochi secondi, è ancora significativo dato che l'esecuzione totale si estende per una manciata di secondi. Immagina cosa succederebbe se lavorassi con insiemi di dati più grandi - il tuo tempo di esecuzione potrebbe essere facilmente ridotto di due o tre volte.
Sebbene il codice funzioni bene con IPython, inserendolo in uno script e chiedendo a Python di eseguirlo in una console o utilizzando un IDE può causare errori a causa delle operazioni interne di un'attività multicore. La soluzione è mettere tutto il codice sotto un'istruzione if, che controlla se il programma è stato avviato direttamente e non è stato chiamato in seguito. Ecco uno script di esempio:
da sklearn. i set di dati importano load_digits da sklearn. svm importa SVC da sklearn. cross_validation import cross_val_score if __name__ == '__main__': digits = load_digits () X, y = cifre. dati, cifre. target multi_core_learning = cross_val_score (SVC (), X, y, cv = 20, n_jobs = -1)