рдбрд╕реНрдХ рд╣реЛрдо рдХреНрд▓рд╕реНрдЯрд░

рдЫрд╡рд┐


рдореИрдВрдиреЗ рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдПрдХ рдЕрдзреНрдпрдпрди рдХрд┐рдпрд╛ рдЬрд┐рд╕рдореЗрдВ рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХреЗ рдХрдИ рд╕реМ рд╣рдЬрд╛рд░ рд╕реЗрдЯреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рдерд╛ред рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП - рдХреБрдЫ рдЧрдгрдирд╛ рдХрд░реЗрдВ, рд╕рднреА рдЧрдгрдирд╛рдУрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ рдФрд░ рдХреБрдЫ рдорд╛рдирджрдВрдбреЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ "рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда" рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдпрд╣ рдмреНрд░реВрдЯрдлреЛрд░реНрд╕ рдмрд╕реНрдЯ рд╣реИред рдПрдХ рд╣реА рдмрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдПрдордПрд▓ рдореЙрдбрд▓ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╕рдордп рд╣реЛрддрд╛ рд╣реИ GridSearchред


рд╣рд╛рд▓рд╛рдБрдХрд┐, рдХреБрдЫ рдмрд┐рдВрджреБ рд╕реЗ, рдЧрдгрдирд╛рдУрдВ рдХрд╛ рдЖрдХрд╛рд░ рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрдИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдореЗрдВ рдЪрд▓рд╛рддреЗ рд╣реЛрдВ joblibред рдпрд╛, рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд░реВрдк рд╕реЗ, рдпрд╣ рдПрдХ рдЕрдзреАрд░ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред


рдФрд░ рдЪреВрдВрдХрд┐ рдПрдХ рдЖрдзреБрдирд┐рдХ рдЕрдкрд╛рд░реНрдЯрдореЗрдВрдЯ рдореЗрдВ рдЖрдк рдЕрдм рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ "рдЕрдВрдбрд░рд▓реЛрдб" рдХрдВрдкреНрдпреВрдЯрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдХрд╛рд░реНрдп рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ рд╕рдВрдЧрд╛рдорд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ - рдпрд╣ рдЖрдкрдХреЗ рд╣реЛрдо рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдиреЗ рдФрд░ рдЙрд╕ рдкрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЪрд▓рд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИред


Dask рд▓рд╛рдЗрдмреНрд░реЗрд░реА ( https://dask.org/ ) "рд╣реЛрдо рдХреНрд▓рд╕реНрдЯрд░" рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХрджрдо рд╕рд╣реА рд╣реИ ред рдиреЛрдбреНрд╕ рдкрд░ рдорд╛рдВрдЧ рдХрд░рдирд╛ рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЬреЛ рдХреНрд▓рд╕реНрдЯрд░ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдореЗрдВ "рдкреНрд░рд╡реЗрд╢ рд╕реНрддрд░" рдХреЛ рдЧрдВрднреАрд░рддрд╛ рд╕реЗ рдХрдо рдХрд░рддрд╛ рд╣реИред


рдЕрдкрдиреЗ рдХреНрд▓рд╕реНрдЯрд░ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕рднреА рдХрдВрдкреНрдпреВрдЯрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


  • рдЕрдЬрдЧрд░ рджреБрднрд╛рд╖рд┐рдпрд╛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
  • dask
  • (scheduler) (worker)

, , тАФ , .



(https://docs.dask.org/) . , .


python


Dask pickle, , python.
3.6 3.7 , . 3.8 - pickle.


" ", , , .


Dask


Dask pip conda


pip install dask distributed bokeh

dask, bokeh , , "-" dask dashboard.
. .


gcc, :


  • MacOS xcode
  • docker image docker-worker, "" , python:3.6-slim-buster . , python:3.6.

dask


- . . тАФ .


$ dask-scheduler

- , .


$ dask-worker schedulerhost:8786 --nprocs 4 --nthreads 1 --memory-limit 1GB --death-timeout 120 -name MyWorker --local-directory /tmp/

  • nprocs / nthreads тАФ , , . GIL -, - , numpy. .
  • memory-limit тАФ , . тАФ - , . , .
  • death-timeout тАФ , - , . -. , , .
  • name тАФ -, . , "" -.
  • local-directory тАФ ,

- Windows


, dask-worker . , , dask-worker .


" " . NSSM (https://www.nssm.cc/).


NSSM, , , . , , - . NSSM .


NSSM . " "


Firewall


firewall: -.


, , -, тАФ . , тАФ . , , .


- . , .


Dask



:


from dask.distributed import Client

client = Client('scheduler_host:port')

тАФ "" , .



, , . pandas, numpy, scikit-learn, tensorflow.
, .


, ? тАФ pip


def install_packages():
    try:
        import sys, subprocess
        subprocess.check_call([sys.executable, '-m', 'pip', 'install', 'mypackage'])
        return (0)
    except:
        return (1)

from dask.distributed import Client

client = Client('scheduler:8786')
client.run(install_packages)

, , . . "" , , .



, , тАФ .
, , Dask .


. Client upload_file(). , .


- , zip.


from dask.distributed import Client 
import numpy as np
from my_module import foo
from my_package import bar 

def zoo(x)
  return (x**2 + 2*x + 1)

x = np.random.rand(1000000)

client = Client('scheduler:8786')

#        . 
#     
r3 = client.map(zoo, x) 

#  foo  bar     ,
#            
client.upload_file('my_module.py')
client.upload_file('my_package.zip')

#    
r1 = client.map(foo, x)
r2 = client.map(bar, x) 

joblib


joblib . joblib тАФ :


joblib


from joblib import Parallel, delayed
...
res = Parallel(n_jobs=-1)(delayed(my_proc)(c, ref_data) for c in candidates)

joblib + dask


# 
from joblib import Parallel, delayed, parallel_backend
from dask.distributed import Client
...
client = Client('scheduler:8786')

with parallel_backend('dask'): #  ""    
  res = Parallel(n_jobs=-1)(delayed(my_proc)(c, ref_data) for c in candidates)

, , . , тАФ :



16 , .



тАФ 10-20 , 200.


, - .


# 
from joblib import Parallel, delayed, parallel_backend
from dask.distributed import Client
...
client = Client('scheduler:8786')

with parallel_backend('dask', scatter = [ref_data]):
  res = Parallel(n_jobs=-1, batch_size=<N>, pre_dispatch='3*n_jobs')(delayed(my_proc)(c, ref_data) for c in candidates)

batch_size. тАФ , , .
pre_dispatch.



, .



  • тАФ . , .
  • тАФ ( )
  • тАФ

3.5-4 , . : , - , , .


, batch_size pre_dispatch . 8-10 .


, , - (, , ), scatter. .


, .


GridSearchCV


scikit-learn joblib , тАФ dask


:


...

lr = LogisticRegression(C=1, solver="liblinear", penalty='l1', max_iter=300)

grid = {"C": 10.0 ** np.arange(-2, 3)}

cv = GridSearchCV(lr, param_grid=grid, n_jobs=-1, cv=3, 
                  scoring='f1_weighted', 
                  verbose=True, return_train_score=True )

client = Client('scheduler:8786')

with joblib.parallel_backend('dask'):
    cv.fit(x1, y)

clf = cv.best_estimator_
print("Best params:", cv.best_params_)
print("Best score:", cv.best_score_)

:


Fitting 3 folds for each of 5 candidates, totalling 15 fits
[Parallel(n_jobs=-1)]: Using backend DaskDistributedBackend with 12 concurrent workers.
[Parallel(n_jobs=-1)]: Done   8 out of  15 | elapsed:  2.0min remaining:  1.7min
[Parallel(n_jobs=-1)]: Done  15 out of  15 | elapsed: 16.1min finished
/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/sklearn/linear_model/_logistic.py:1539: UserWarning: 'n_jobs' > 1 does not have any effect when 'solver' is set to 'liblinear'. Got 'n_jobs' = 16.
  " = {}.".format(effective_n_jobs(self.n_jobs)))
Best params: {'C': 10.0}
Best score: 0.9748830491726451

dask. -.
тАФ .


, ( ) тАФ . тАФ .




рдЯрд╛рд╕реНрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдмреЗрд╣рддрд░реАрди рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдЯреВрд▓ рд╣реИред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рдХреЗрд╡рд▓ рдореВрд▓ dask.distributed рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╡рд┐рд╢реЗрд╖ рдПрдХреНрд╕рдЯреЗрдВрд╢рди dask.dataframe, dask.array, dask.ml рдХреЛ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВ - рддреЛ рдЖрдк рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рддреЗрдЬ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдЧрдгрдирд╛ рдХреЗ рд▓рдЧрднрдЧ рд░реИрдЦрд┐рдХ рддреНрд╡рд░рдг рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдФрд░ рдпрд╣ рд╕рдм рдЗрд╕ рдмрд╛рдд рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдШрд░ рдкрд░ рдХреНрдпрд╛ рд╣реИ, рдФрд░ рд╡реАрдбрд┐рдпреЛ рджреЗрдЦрдиреЗ, рдЕрдВрддрд╣реАрди рд╕рдорд╛рдЪрд╛рд░ рдлреАрдб рдпрд╛ рдЧреЗрдо рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрди рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдкреВрд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ!


All Articles