Share
Embed
Transcript
42 slides
-
ฒྻॲཧͱOut-of-coreॲཧ ฒྻॲཧ 0VUPGDPSFॲཧ • ฒྻॲཧ: ෳͷλεΫΛฒྻͰॲཧ͢Δ • Out-of-coreॲཧ: ϝϞϦʹΒͳ͍σʔλΛஞ࣍ॲཧ͢Δ •
ഉଞͰͳ͍ (Out-of-coreॲཧΛฒྻͰߦ͏͜ͱ͋Δ) -
(Incomplete) List of OSS uses Dask • (TFLearn) Deep learning
library featuring a higher-level API for TensorFlow. • (Distributed Scheduler) A platform to author, schedule and monitor workflows. • Image Processing SciKit. • N-D labeled arrays and datasets in Python. • Executes end-to-end data science and analytics pipelines entirely on GPUs. Airflow -
Daskͷσʔλߏ(API) %BTL"1* #BTF$MBTT %FGBVMU4DIFEVMFS %BTL"SSBZ /VN1ZOEBSSBZ UISFBEJOH %BTL%BUB'SBNF QBOEBT%BUB'SBNF UISFBEJOH
%BTL#BH 1Z5PPM[ MJTU TFU EJDU NVMUJQSPDFTTJOH DBOOPUSFMFBTF(*- %BTL%FMBZFE ҙͷؔ UISFBEJOH -
array([[ 1., 1., 1., 1., 1., 1., 1., 1., 1.,
1.], [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]]) Dask Array import numpy as np x = np.ones((10, 10)) x import dask.array as da dx = da.ones((10, 10), chunks=(5, 5)) dx dask.array<ones, shape=(10, 10), dtype=float64, chunksize=(5, 5)> YͷOEBSSBZΛ࡞ Yͷ%BTL"SSBZΛ࡞ ෦YͷͭͷDIVOLʹׂ -
Dask Array import dask.array as da dx = da.ones((10, 10),
chunks=(5, 5)) dx dask.array<ones, shape=(10, 10), dtype=float64, chunksize=(5, 5)> dx.visualize() ෦ͷܭࢉάϥϑΛදࣔ ֤ϊʔυ ༿ ͕֤DIVOLʹରԠ Yͷ%BTL"SSBZΛ࡞ ෦YͷͭͷDIVOLʹׂ -
ߦྻͷ QBOEBT%BUB'SBN FΛ࡞ Dask Array dy = dx.sum(axis=0) dy dask.array<sum-aggregate,
shape=(10,), dtype=float64, chunksize=(5,)> BYJTʹԊͬͯΛ߹ܭ dy.visualize() dy.compute() array([10., 10., 10., 10., 10., 10., 10., 10., 10., 10.]) 4VN 4VN -
Dask Array dy2 = dx.sum() dy2 dask.array<sum-aggregate, shape=(), dtype=float64, chunksize=()>
શͯͷΛ߹ܭ dy2.visualize() dy2.compute() 100.0 -
Dask Array • Dask Array ҙͷ shape ͱ chunk sizeΛͭ
• chunkؒͷॲཧ͕ൃੜ͢Δ߹ɺchunk size Ұகͤͨ͞ํ͕ྑ͍ da.ones((30, 20, 1, 15), chunks=(3, 7, 1, 2)) dask.array<ones, shape=(30, 20, 1, 15), dtype=float64, chunksize=(3, 7, 1, 2)> -
Dask DataFrame QBSUJUJPO EJWJTJPO EJWJTJPO • ෳͷpandas DataFrameʹΑͬͯߏ • ෦తʹɺindex
(ߦϥϕϧ)ʹԊͬͯPartitionʹׂ QBOEBT%BUB'SBNF %BTL%BUB'SBNF -
ߦྻͷ QBOEBT%BUB'SBNFΛ࡞ Dask DataFrame import dask.dataframe as dd ddf =
dd.from_pandas(df, 2) ddf QBSUJUJPO QBSUJUJPO EJWJTJPO EJWJTJPO EJWJTJPO -
Blocked Algorithm (Mean) ddf.mean().visualize() 4VN PWFSQBSUJUJPOT $PVOU PWFSQBSUJUJPOT .FBO4VN$PVOU 4VN
QFSQBSUJUJPO $PVOU QFSQBSUJUJPO -
ܭࢉάϥϑͷ࣮ߦΠϝʔδ • ܭࢉάϥϑͷґଘؔͷղੳ • ࠷ऴ݁ՌʹෆཁͳλεΫͷআ • ಉҰλεΫͷϚʔδ • ܭࢉॱংͷ੩తɾಈతͳղੳ •
ܭࢉάϥϑͷ࠷దԽ • ಛఆॲཧͷΠϯϥΠϯԽ • ࿈ଓ͢ΔλεΫΛಉҰͷϫʔΧʔʹׂΓͯ -
Dask Internals • ͋ΒΏΔDaskͷॲཧܭࢉάϥϑͱͯ͠දݱ͞ ΕΔ • DaskͰઢܗͳͲͷෳࡶͳΞϧΰϦζϜ ࣮ (dask.array.linalg) •
Ϣʔβࣗͷσʔλߏؔܭࢉάϥϑ Ͱ࣮Մೳ (dask.delayed) -
Linear Algebra 'VODUJPO %FTDSJQUJPO MJOBMHDIPMFTLZ 3FUVSOTUIF$IPMFTLZEFDPNQPTJUJPO PSPGB)FSNJUJBOQPTJUJWFEFpOJUF NBUSJY" MJOBMHJOW $PNQVUFUIFJOWFSTFPGBNBUSJYXJUI-6EFDPNQPTJUJPOBOEGPSXBSE
CBDLXBSETVCTUJUVUJPOT MJOBMHMTUTR 3FUVSOUIFMFBTUTRVBSFTTPMVUJPOUPBMJOFBSNBUSJYFRVBUJPOVTJOH23 EFDPNQPTJUJPO MJOBMHMV $PNQVUFUIFMVEFDPNQPTJUJPOPGBNBUSJY MJOBMHOPSN .BUSJYPSWFDUPSOPSN MJOBMHRS $PNQVUFUIFRSGBDUPSJ[BUJPOPGBNBUSJY MJOBMHTPMWF 4PMWFUIFFRVBUJPOBYCGPSY MJOBMHTPMWF@USJBOHVMBS 4PMWFUIFFRVBUJPOBYCGPSY BTTVNJOHBJTBUSJBOHVMBSNBUSJY MJOBMHTWE $PNQVUFUIFTJOHVMBSWBMVFEFDPNQPTJUJPOPGBNBUSJY MJOBMHTWE@DPNQSFTTFE 3BOEPNMZDPNQSFTTFESBOLLUIJO4JOHVMBS7BMVF%FDPNQPTJUJPO MJOBMHTGRS %JSFDU4IPSUBOE'BU23 MJOBMHUTRS %JSFDU5BMMBOE4LJOOZ23BMHPSJUIN -
Blocked LU Decomposition • Diagonal Block • Row-direction(i < j)
• Columns direction (i < j) ∴ ∴ * LU: Function to solve LU decomposition * Solve: Function to solve equation -
Blocked LU Decomposition arr = da.random.random((9, 9), chunks=(3, 3)) arr
dask.array<random_sample, shape=(9, 9), dtype=float64, chunksize=(3, 3)> from dask import compute t, l, u = da.linalg.lu(arr) t, l, u = compute(t, l, u) ͭͷܭࢉάϥϑΛ Ϛʔδ࣮ͯ͠ߦ -
DaskʹΑΔॲཧͷશମ૾ ஞ࣍ॲཧ /VN1Z QBOEBT TDJLJUMFBSO %BTL %BTL %JTUSJCVUFE ฒྻॲཧ ϊʔυ
0VUPGDPSF ॲཧ ϊʔυ ࢄॲཧ ϊʔυؒ %BTL.- ߦྻܭࢉ ςʔϒϧ σʔλॲཧ ػցֶश -
scikit-learnͷฒྻॲཧ • “n_jobs” ҾͰฒྻ࣮ߦΛࢦఆ • ෦తʹjoblibΛར༻ • scikit-learnίϛολத৺ʹ։ൃ • ϊʔυฒྻ
(threading, multiprocessing) • Out-of-coreॲཧϊʔυؒࢄॲཧͰ͖ͳ͍ from sklearn.model_selection import GridSearchCV grid = GridSearchCV(pipe, cv=3, n_jobs=12, param_grid=param_grid) -
DaskʹΑΔॲཧͷશମ૾ ஞ࣍ॲཧ /VN1Z QBOEBT TDJLJUMFBSO %BTL %BTL %JTUSJCVUFE ฒྻॲཧ ϊʔυ
0VUPGDPSF ॲཧ ϊʔυ ࢄॲཧ ϊʔυؒ %BTL.- ߦྻܭࢉ ςʔϒϧ σʔλॲཧ ػցֶश -
Dask ML • ػցֶशͷͨΊͷαϒύοέʔδΛఏڙ • Preprocessing • Model Selection •
Cross validation • Hyper parameter search • GLM • Clustering • Incremental • ParallelPostFit • XGBoost • TensorFlow %BTLʹରԠͨ͠ TDJLJUMFBSOޓͷ ֶशثΛఏڙ TDJLJUMFBSOΛϥοϓ͠ ฒྻɾ0VUPGDPSFԽ TDJLJUMFBSOҎ֎ͷ ύοέʔδରԠ -
• scikit-learnޓͷֶशثͰDaskͷσʔλߏΛ ѻ͑Δ Dask ML TDJLJU MFBSO %BTL .- /VN1Z
OEBSSBZ %BTL "SSBZ /VN1Z OEBSSBZ /VN1Z OEBSSBZ %BTL "SSBZ %BTL "SSBZ "SSBZ*OUFSGBDFʹΑΓɺ /VN1ZOEBSSBZʹม ܭࢉॲཧ ܭࢉॲཧ %BTLͷσʔλߏΛҡ࣋ͯ͠ ॲཧΛ࣮ߦ -
k-means (Dask ML) ʜ $IVOL ʜ $IVOL ʜ $IVOL 4BNQMJOH
σʔληοτ͔Βη ϯτϩΠυͷॳظ Λܾఆ ηϯτϩΠυ͔Βͷ ڑΛܭࢉ͠ɺΫϥ ελʹྨ $IVOL͝ͱʹ࣮ߦ Ϋϥελ͝ͱʹϨίʔ υΛू͠ɺηϯτ ϩΠυΛߋ৽ $IVOL͝ͱʹ࣮ߦˠ ू 4VN 4VN $PVOU ʜ طఆͰ4DBMBCMF,NFBOT #BINBOJFUBM ͷ,NFBOTccͰηϯτϩΠυΛॳظԽ -
Incremental • partial_fitΛॱʹద༻͢Δ ߦྻͷQBOEBT%BUB'SBNFΛ࡞ pU %BTL "SSBZ *ODSFNFOUBM QBSUJBM@pU $IVOL
$IVOL ʜ ʜ QBSUJBM@pUΛஞ࣮࣍ߦ ฒྻॲཧ͞Εͳ͍ -
Incremental • IncrementalͰֶशثΛϥοϓ • ྨͷ߹ɺΫϥεΛclassesҾͰ͢ • ෳΤϙοΫͰֶश͢Δ߹ Incremental.partial_fit • for
_ in range(10): inc.partial_fit(X_train, y_train, classes=classes) print('Score:', inc.score(X_test, y_test)) from sklearn.linear_model import SGDClassifier from dask_ml.wrappers import Inclemental clf = SGDClassifier(loss='log', penalty='l2', tol=1e-3)) inc = Incremental(clf, scoring='accuracy') inc.fit(X_train, y_train, classes=classes) -
• ParallelPostFitͰֶशثΛϥοϓ • fit࣌ԿߦΘͳ͍ (scikit-learnͷॲཧͱಉҰ) • ΑΓେ͖ͳσʔλʹରͯ͠ predict ΛฒྻͰߦ͏ ParallelPostFit
y_pred = clf.predict(X_large) y_pred from sklearn.linear_model import LogisticRegressionCV from dask_ml.wrappers import ParallelPostFit clf = ParallelPostFit(LogisticRegressionCV(cv=3)) clf.fit(X_train, y_train) -
DaskʹΑΔॲཧͷશମ૾ ஞ࣍ॲཧ /VN1Z QBOEBT TDJLJUMFBSO %BTL %BTL %JTUSJCVUFE ฒྻॲཧ ϊʔυ
0VUPGDPSF ॲཧ ϊʔυ ࢄॲཧ ϊʔυؒ %BTL.- ߦྻܭࢉ ςʔϒϧ σʔλॲཧ ػցֶश -
Dask Distributed • DaskຊମҎԼ2छྨͷεέδϡʔϥΛαϙʔ τ: • threading • multiprocessing •
Dask DistributedύοέʔδϊʔυؒࢄΛߦ ͏εέδϡʔϥΛఏڙ -
Dask Distributed • εέδϡʔϥͰͷܭࢉ࣮ߦΛෳϊʔυͰࢄͰ͖Δ • ϨΠςϯγ: λεΫຖͷΦʔόʔϔου1msఔ • WorkerؒͰͷσʔλڞ༗: σʔλసૹWorkerؒͰ࣮ࢪ
• ෳࡶͳεέδϡʔϦϯά: ҙͷܭࢉάϥϑΛ࣮ߦՄ • ہॴੑ: WorkerؒͷσʔλసૹΛͳΔ͘ߦΘͳ͍ %JTUSJCVUFE 8PSLFS %JTUSJCVUFE 8PSLFS %JTUSJCVUFE 4DIFEVMFS %JTUSJCVUFE $MJFOU -
Distributed joblib • ϓϥΨϒϧAPI • with ϒϩοΫͰ joblib.Parallel ͷطఆόοΫΤϯυΛมߋՄ •
ҙ • scikit-learnʹόϯυϧ͞Ε͍ͯΔjoblibΛ͏ (sklearn.externals.joblib) • ࢄͰ͖ͳ͍߹͋Δ • backendͱͯ͠threading / multiprocessing͕໌ࣔ͞Ε͍ͯΔͷ import distributed.joblib from sklearn.externals.joblib import parallel_backend with parallel_backend('dask.distributed', scheduler_host=‘scheduler-addr:8786’): grid.fit(digits.data, digits.target) -
·ͱΊ • Daskͱ • NumPy pandas ޓͷσʔλߏΛఏڙ • ػցֶशʹ͓͚ΔDaskͷ׆༻ •
Dask ML: ػցֶशͰDaskͷσʔλߏΛѻ͑ Δ • Distributed: scikit-learnͷॲཧΛϊʔυؒͰࢄ ॲཧͰ͖Δ