Innholdsfortegnelse:
- Utføre multicore parallellisme
- Det er en god ide å bruke IPython når du kjører en demonstrasjon av hvordan multiprocessing virkelig kan spare deg tid i datavitenskapsprosjekter. Bruke IPython gir fordelen av å bruke kommandoen% timeit magic for timing execution. Du starter med å laste inn et multiklass datasett, en kompleks maskinlæringsalgoritme (Support Vector Classifier, eller SVC), og en kryssvalideringsprosedyre for å estimere pålitelige resultatresultater fra alle prosedyrene.
Video: Contain Yourself: An Intro to Docker and Containers by Nicola Kabar and Mano Marks 2025
De fleste datamaskiner i dag er multicore (to eller flere prosessorer i en enkelt pakke), noen er prosessorer i en enkelt pakke. med flere fysiske CPUer. En av de viktigste begrensningene i Python er at den bruker en enkelt kjerne som standard. (Det ble opprettet på en tid da enkeltkjerner var normen.)
Datavitenskapsprosjekter krever ganske mange beregninger. Spesielt er en del av det vitenskapelige aspektet av datavitenskapen avhengig av gjentatte tester og eksperimenter på forskjellige datamatriser. Ikke glem at arbeid med store datamengder betyr at de fleste tidkrevende transformasjoner gjentar observasjon etter observasjon (for eksempel identiske og ikke-relaterte operasjoner på forskjellige deler av en matrise).
Ved å bruke flere CPU-kjerner akselererer en beregning med en faktor som nesten samsvarer med antall kjerner. For eksempel vil ha fire kjerner bety at du arbeider i beste fall fire ganger raskere. Du mottar ikke en full firefoldig økning fordi det er overhead når du starter en parallellprosess - nye løpende Python-forekomster må konfigureres med riktig minneinformasjon og lanseres; Følgelig vil forbedringen være mindre enn mulig oppnåelig, men fortsatt betydelig.
Å vite hvordan du bruker mer enn en CPU, er derfor en avansert, men utrolig nyttig ferdighet for å øke antall analyser som er fullført, og for å øke driften din både når du setter opp og når du bruker dataprodukter.
Multiprosessering fungerer ved å kopiere samme kode og minneinnhold i forskjellige nye Python-forekomster (arbeiderne), beregne resultatet for hver av dem, og returnere de samlede resultatene til hovedkonsollen. Hvis din originale forekomst allerede bruker mye av det tilgjengelige RAM-minnet, vil det ikke være mulig å opprette nye forekomster, og maskinen din kan være tom for minne.
Utføre multicore parallellisme
For å utføre multicore parallellitet med Python integrerer du Scikit-learn-pakken med joblib-pakken for tidkrevende operasjoner, for eksempel replikerende modeller for validering av resultater eller for å lete etter de beste hyperparametrene. Spesielt gjør Scikit-Learning mulighet til multiprocessing når
-
Kryssvalidering: Testing av resultatene av en maskinlæringshypotes ved hjelp av ulike opplærings- og testdata
-
Grid-søking: Systematisk endring av hyperparametrene av en maskinlæringshypotese og teste de resulterende resultatene
-
Multilabel-prediksjon: Kjører en algoritme flere ganger mot flere mål når det er mange forskjellige målutfall å forutsi samtidig.
-
Ensemble maskinlæringsmetoder: Du må ikke gjøre noe spesielt for å utnytte parallelle beregninger - du kan aktivere parallellisme ved å sette inn en rekke klassifiserere, hver som er uavhengig av den andre, for eksempel når du bruker RandomForest-basert modellering. n_jobs -parameteren til en rekke kjerner mer enn 1, eller ved å sette verdien til -1, noe som betyr at du vil bruke alle tilgjengelige CPU-forekomster.
Hvis du ikke kjører koden fra konsollen eller fra en IPython Notebook, er det ekstremt viktig at du skiller koden fra en pakkeimport eller global variabel oppgave i skriptet ditt ved å bruke hvis __name __ == '__ main__': kommando i begynnelsen av en kode som utfører multicore parallellisme. Hvis-setningen kontrollerer om programmet kjøres direkte eller kalles av en allerede kjørt Python-konsoll, unngår det noen forvirring eller feil ved multiparallell prosessen (som rekursivt kaller parallellismen).
Demonstrere multiprosessering
Det er en god ide å bruke IPython når du kjører en demonstrasjon av hvordan multiprocessing virkelig kan spare deg tid i datavitenskapsprosjekter. Bruke IPython gir fordelen av å bruke kommandoen% timeit magic for timing execution. Du starter med å laste inn et multiklass datasett, en kompleks maskinlæringsalgoritme (Support Vector Classifier, eller SVC), og en kryssvalideringsprosedyre for å estimere pålitelige resultatresultater fra alle prosedyrene.
Det viktigste å vite er at prosedyrene blir ganske store fordi SVC produserer 10 modeller, som det gjentar 10 ganger hver med kryssvalidering, for totalt 100 modeller.
fra sklearn. datasett import load_digits digits = load_digits () X, y = sifre. data, sifre. målet fra sklearn. svm import SVC fra Sklearn. cross_val_score% timeit single_core_learning = cross_val_score (SVC (), X, y, cv = 20, n_jobs = 1) Ut [1]: 1 sløyfer, best av 3: 17. 9 s per sløyfe
Etter denne testen, Du må aktivere multicore-parallellismen og klare resultatene ved å bruke følgende kommandoer:
% timeit multi_core_learning = cross_val_score (SVC (), X, y, cv = 20, n_jobs = -1) Ut [2]: 1 sløyfer, best av 3: 11. 7 s per loop
Eksempelmaskinen demonstrerer en positiv fordel ved bruk av multicore-prosessering, til tross for å bruke et lite datasett hvor Python tilbringer mesteparten av konsollen og kjører en del av koden i hver enkelt. Denne overhead, noen få sekunder, er fortsatt viktig gitt at den totale utførelsen strekker seg ut i noen få sekunder. Tenk deg hva som ville skje hvis du jobbet med større datamengder - din kjøretid kunne enkelt klippes med to eller tre ganger.
Selv om koden fungerer bra med IPython, legger den ned i et skript og spør Python om å kjøre den i en konsoll eller ved hjelp av en IDE, kan det føre til feil på grunn av den interne operasjonen til en multicore-oppgave. Løsningen er å sette all koden under en if-setning, som kontrollerer om programmet startet direkte og ikke ble kalt etterpå. Her er et eksempelskript:
fra sklearn. datasett importerer load_digits fra sklearn. svm import SVC fra Sklearn. cross_validation import cross_val_score hvis __name__ == '__main__': siffer = load_digits () X, y = sifre. data, sifre. mål multi_core_learning = cross_val_score (SVC (), X, y, cv = 20, n_jobs = -1)
