본문 바로가기
Python

[Python] Dask: Parallel Computing

by Henry Cho 2024. 7. 22.
728x90

포스트 난이도: HOO_Middle


# 당신의 파이썬은 더 이상 답답하지 않다.

데이터를 다루는 프로그래밍을 할 때 우리는 파이썬 기반의 작업을 정말 많이 하는 편이다. 파이썬과 연관되어 있는 다양한 데이터 분석 관련 라이브러리가 있다는 점도 있지만 내 개인적인 생각에는 속도가 다소 느리더라도 복잡한 데이터 분석에 대한 구조를 이해하고 작업하는 데 있어서 파이썬 언어가 편하기 때문이다. 따라서 시뮬레이션이나 파일럿 모델을 구축하는 데 있어서 파이썬 기반으로 모델링을 많이 하는 편인데 문제는 해당 모델링의 구조나 사이즈가 점차적으로 커지고 복잡해진다면 아무리 시뮬레이션이라고 할지라도 답답해지고 제 역할을 못하게 된다. 이때 프로세스 (Process)라고 부르는 작업 스케줄링을 병렬 연산을 통해서 더 빠르게 처리가 될 수 있도록 도와주는 라이브러리가 바로 Dask이다.

Figure 1. Dask Logo


# 언제 사용하는 건데?

내가 Dask 라이브러리를 사용하는 경우는 사실 모델링 작업이나 시뮬레이션 프로젝트를 할때 사용하는 편이다. 포스트 난이도 HOO_Middle를 읽는 브로들은 잘 알겠지만 사실 데이터 분석하는 방법에 있어서 데이터 양이 정말 정말 무수하게 많아지고 여러 경우의 수 (Certainity)를 고려해야 한다면 우리는 Mahcine Learning (ML)로 가버리는 편이다. 왜냐하면 요새는 ML이 너무너무 잘 나와 있어서 마치 밀키트처럼 맛있게 잘 되어 있기 때문이다. 하. 지. 만 ML까지가 필요하지 않은 경우에는 라이브러리에서 적용하는 연산 프로세스를 바꿔줌으로써도 충분히 역할을 다할 수 있다는 것이다. 마치 시제품을 만드는데 공장부터 사서 제조 라인을 만든 다음에 수만 개의 제품을 생산할 필요 없이 그냥 연구원 한 명이 먼저 시제품을 만들어서 보여주고 나서 평가를 해보는 방법과 같다는 것이다.

 

거두절미하고 내 경우에는 초기 단계의 Agent-based model에서 점차 복잡해지고 다양성이 많아지는 경우에 데이터 분석이 어려워질 경우 파이썬 내에서 연산 처리 방법을 Dask와 같이 바꿔볼때 사용하는 편이다. 특히 AI를 사용하지 않으면서도 기존 방식에서 프로세스 효율성을 높이고 싶다는 요청을 받았을때 사용한다.


# 어떻게 사용하냐는 말이야!

우선 Dask가 좋은 점은 일반적으로 정말 많이 사용하는 파이썬 기본 모듈들과도 같이 적용해서 사용할 수 있도록 확장이 되어 있다. 예를 들어서 Numpy나 Pandas와 같이 사용할 수 있기에 별도로 기존 모델이나 시뮬레이션 코드 자체를 바꿔야 하는 어려움이 없다. 그냥 점하나 더 붙이고 dask를 사용해 주면 그만이기 때문이다. 아래의 코드를 보면 dask를 어떻게 사용하는 지와 Numpy와 비교해 볼 수 있는 간단한 코드이다.

import numpy as np
import dask.array as da
import time

# Create a large NumPy array
large_array = np.random.random((10000, 10000))

# Measure time for NumPy operation
start_time = time.time()
numpy_result = large_array.mean()
end_time = time.time()
numpy_time = end_time - start_time

print(f"NumPy mean: {numpy_result}")
print(f"Time taken by NumPy: {numpy_time:.4f} seconds")

# Convert the NumPy array to a Dask array
dask_array = da.from_array(large_array, chunks=(1000, 1000))

# Measure time for Dask operation
start_time = time.time()
dask_result = dask_array.mean().compute()
end_time = time.time()
dask_time = end_time - start_time

print(f"Dask mean: {dask_result}")
print(f"Time taken by Dask: {dask_time:.4f} seconds")

 

Figure 2. 예제코드 1의 산출 값

위의 예제코드를 돌려보면 결과적으로 Dask 프로세스 시간이 아주 조금 더 길게 나온다는 걸 알 수 있다. 그 이유는 랜덤 값으로 주어진 값의 범위가 크지 않기 때문에 이런 경우에서는 굳이 Dask를 사용할 필요없이 Numpy가 더 유리하다. 한마디로 빅데이터에 해당하는 규모의 데이터를 chunk 단위로 나눠서 작업 처리를 하려면 Dask를 사용하는 것이 효율적이지만 그렇지 않은 경우에는 기존의 자주 사용하는 Pandas나 Numpy 라이브러리로도 충분하다. 아래의 예제코드를 보면 Dask를 사용했을 때의 시간이 더 짧음을 확인할 수 있다.

import numpy as np
import dask.array as da
import time

# Create a much larger NumPy array
large_array = np.random.random((100000, 100000))

# Measure time for NumPy operation
start_time = time.time()
numpy_result = large_array.mean()
end_time = time.time()
numpy_time = end_time - start_time

print(f"NumPy mean: {numpy_result}")
print(f"Time taken by NumPy: {numpy_time:.4f} seconds")

# Convert the NumPy array to a Dask array
dask_array = da.from_array(large_array, chunks=(10000, 10000))

# Measure time for Dask operation
start_time = time.time()
dask_result = dask_array.mean().compute()
end_time = time.time()
dask_time = end_time - start_time

print(f"Dask mean: {dask_result}")
print(f"Time taken by Dask: {dask_time:.4f} seconds")

Figure 3. 예제코드 2에 대한 산출 값


# 파이썬 라이브러리로도 충분하다.

Dask는 AI 모델을 구현하기 전에 빅데이터를 다루는 모델링 작업을 할때 사용하기 매우 좋다. 나의 경우 프로젝트에서 Million 또는 Billion 경우 수에 대한 시뮬레이션을 돌린다고 했을 때 Dask를 사용하여 병렬 프로세스 작업으로 바꿔주는 편이다. 이후에 전체적인 모델이나 시뮬레이션 코드에 대해 완벽히 구축된다면 ML기반의 모델링으로 변환해 주는 작업을 하고 있다. AI 기반의 Data science라는 직업을 가지고 있음에도 내가 봤을 때는 모든 과정에서 인공지능을 접목할 필요는 없다고 본다. 마치 라면 끓이는데 매번 일류 요리사가 필요하지 않듯이 기존 라이브러리도 분석해 낼 수 있는 방법이 정말 많고 용이하다.


 

728x90

댓글