태스크 그래프와 스케줄링 방법

Python에서 Dask로 병렬 프로그래밍

James Fulton

Climate Informatics Researcher

태스크 그래프 시각화

# 지연 객체 2개 생성
delayed_num1 = delayed(my_square_function)(3)
delayed_num2 = delayed(my_square_function)(4)

# 서로 더하기
result = delayed_num1 + delayed_num2

# 태스크 그래프 그리기 result.visualize()

결과 계산에 필요한 단계 다이어그램. my-square-function이 두 번 실행되고, 두 출력이 add 함수에 전달되어 하나의 출력이 생성됩니다.

Python에서 Dask로 병렬 프로그래밍

겹치는 태스크 그래프

delayed_intermediate = delayed(my_square_function)(3)

# 두 결과 모두 delayed_intermediate_result를 사용
delayed_result1 = delayed_intermediate - 5
delayed_result2 = delayed_intermediate + 4
Python에서 Dask로 병렬 프로그래밍

겹치는 태스크 그래프

delayed_result1.visualize()

결과 1의 태스크 그래프를 보여주는 다이어그램.

delayed_result2.visualize()

결과 2의 태스크 그래프를 보여주는 다이어그램.

Python에서 Dask로 병렬 프로그래밍

겹치는 태스크 그래프

# 태스크 그래프 그리기
dask.visualize(delayed_result1, delayed_result2)

태스크 그래프: 결과 1과 결과 2가 중간 결과를 공유함을 보여줍니다.

Python에서 Dask로 병렬 프로그래밍

멀티스레딩 vs. 병렬 처리

데이터 이동

병렬 처리
  • 프로세스는 각자 RAM 공간을 가짐
멀티스레딩
  • 스레드는 같은 RAM 공간을 사용함
Python에서 Dask로 병렬 프로그래밍

멀티스레딩 vs. 병렬 처리

# 두 개의 큰 배열에 대해 합계 실행
sum1 = delayed(np.sum)(big_array1)
sum2 = delayed(np.sum)(big_array2)

# 프로세스로 계산
dask.compute(sum1, sum2)
  • 병렬 처리 시 느림

다이어그램은 한 Python 프로세스에서 생성된 두 배열이 다른 두 Python 프로세스로 전송되어야 함을 보여줍니다.

Python에서 Dask로 병렬 프로그래밍

멀티스레딩 vs. 병렬 처리

# 두 개의 큰 배열에 대해 합계 실행
sum1 = delayed(np.sum)(big_array1)
sum2 = delayed(np.sum)(big_array2)

# 스레드로 계산
dask.compute(sum1, sum2)
  • 멀티스레딩 시 빠름

다이어그램은 두 배열을 전혀 복사할 필요가 없음을 보여줍니다.

Python에서 Dask로 병렬 프로그래밍

GIL

Global interpreter lock - 한 번에 하나의 스레드만 Python 스크립트를 해석 가능

def sum_to_n(n):
    """0부터 n까지 합산"""
    total = 0
    for i in range(n+1):
        total += i
    return total
  • 여기서는 멀티스레딩이 도움 되지 않음
  • 병렬 처리는 효과적임
sum1 = delayed(sum_to_n)(1000)
sum2 = delayed(sum_to_n)(1000)
Python에서 Dask로 병렬 프로그래밍

예시 타이밍 - GIL

간단한 Python 함수를 16번 실행한 타이밍을 보여주는 3개의 간트 차트. 세 가지 스케줄링 방법 중 프로세스가 가장 빨랐습니다.

Python에서 Dask로 병렬 프로그래밍

GIL을 해제하는 함수들

  • 예: pd.read_csv()는 GIL을 해제함
df1 = delayed(pd.read_csv)('file1.csv')
df2 = delayed(pd.read_csv)('file2.csv')
Python에서 Dask로 병렬 프로그래밍

예시 타이밍 - 데이터 로딩

CSV에서 데이터를 로드하는 함수를 16번 실행한 타이밍을 보여주는 3개의 간트 차트. 세 가지 스케줄링 방법 중 스레드가 가장 빨랐습니다.

Python에서 Dask로 병렬 프로그래밍

요약

스레드

  • 시작이 매우 빠름
  • 메인 세션과 메모리 공간을 공유
  • 메모리 전송 불필요
  • 한 번에 하나의 스레드만 코드 해석 가능(GIL 제한)

프로세스

  • 설정에 시간과 메모리 소요
  • 별도 메모리 풀 보유
  • 서로 및 메인 세션 간 데이터 전송이 매우 느림
  • 각자 GIL이 있어 코드 해석을 번갈아 할 필요 없음
Python에서 Dask로 병렬 프로그래밍

Ayo berlatih!

Python에서 Dask로 병렬 프로그래밍

Preparing Video For Download...