호랭이 분석가

Dask #1. 대스크 Delayed 를 사용한 병렬화와 visualize, compute 본문

Python/Dask

Dask #1. 대스크 Delayed 를 사용한 병렬화와 visualize, compute

데이터호랑이 2022. 4. 10. 17:22
반응형

1. Delayed

Delayed 함수를 비교하기 위하여 파이썬 함수와 비교하면서 보겠습니다.

 

# 기본 함수
from time import sleep

def inc(x) : 
	sleep(5)
    return x + 1
    
def add(x, y) :
	sleep(5)
    return x + y

 

%%time

x = inc(1)
y = inc(2)
z = add(x, y)

파이썬에서는 x > y > z 순으로 순차적으로 실행하기 때문에 15초가 걸립니다.

 

import dask.delayed as delayed

@delayed
def inc(x) : 
    sleep(5)
    return x + 1

@delayed
def add(x, y) :
    sleep(5)
    return x + y

Dask의 delayed 함수를 사용하기 위하여 데코레이터를 사용합니다만, 파이썬과 비교를 하기 위해 기본 함수를 사용하여 비교하기를 가정합니다. 데코레이션을 사용하지 않고 사용하기 위해서는 함수 형태로 사용해주시면 됩니다.

 

%%time

x = delayed(inc)(1)
y = delayed(inc)(2)
z = delayed(add)(x, y)

 

z는 지연(Delayed) 객체입니다. 모든 함수에 대한 참조와 해당 입력 및 서로 간의 관계를 포함하여 최종 결과를 계산하는 데 필요한 모든 것을 갖고 있습니다.

 

z​

z가 최종 결과를 산출하는데 필요한 모든 정보를 가지고 있으며 이를 graphviz를 사용해 시각화 할 수 있습니다.

 

z.visualize()​

DAG

 

최종 결과를 직접 산출하기 위해서는 compute 함수를 사용합니다.

 

%%time

z.compute()

 

x와 y를 병렬화하여 동시 실행 후 z를 실행하기 때문에 시간은 10초가 걸렸습니다.

동시 실행을 하기 때문에 단순 비교임에도 sleep(5) 만큼의 차이를 보였습니다.

 

2. Delayed 함수를 사용한 For문 계산

 

data = [1, 2, 3, 4, 5]

 

위에서 사용한 기본 함수들과 1~5의 값을 가진 리스트를 통하여 for문 계산을 진행하겠습니다.

 

%%time

results = []
for x in data :
    y = inc(x)
    results.append(y)
    
total = sum(results)

 

리스트가 갖고 있는 총 5개의 값을 계산하기 위하여 25초의 시간이 소요되었습니다. 

 

%%time

results = []

for x in data : 
    y = delayed(inc)(x)
    results.append(y)
    
total = delayed(sum)(results)

total.compute()

 

total.visualize()

For문 계산 DAG

 

Delayed 연산을 통해 총 5개의 데이터 처리를 위한 for문 계산이 5초 소요되었습니다. 동시에 계산하기 때문에 sleep(5) 만큼의 시간만 소요되었습니다.

 

Dask의 delayed 함수를 사용하면 Python의 기본 연산을 조금 더 효율적으로 진행할 수 있습니다.

Comments