프로세스와 스레드 사용

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

James Fulton

Climate Informatics Researcher

Dask 기본 스케줄러

스레드

  • Dask arrays
  • Dask DataFrames
  • dask.delayed()로 만든 지연 파이프라인

프로세스

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

스케줄러 선택하기

# 기본 사용
result = x.compute()

result = dask.compute(x)
# 스레드 사용 result = x.compute(scheduler='threads')
result = dask.compute(x, scheduler='threads')
# 프로세스 사용 result = x.compute(scheduler='processes')
result = dask.compute(x, scheduler='processes')
Python에서 Dask로 병렬 프로그래밍

요약 - 스레드 vs. 프로세스

스레드

  • 시작이 매우 빠름
  • 데이터 전송이 불필요함
  • GIL로 제한됨: 한 번에 하나의 스레드만 코드 해석 가능

프로세스

  • 설정에 시간이 듦
  • 데이터 전송이 느림
  • 각자 GIL을 가져 번갈아 코드 해석할 필요 없음
Python에서 Dask로 병렬 프로그래밍

로컬 클러스터 만들기

from dask.distributed import LocalCluster

cluster = LocalCluster(
    processes=True, 
    n_workers=2,
    threads_per_worker=2
)

print(cluster)
LocalCluster(..., workers=2, threads=4, memory=31.38 GiB)
Python에서 Dask로 병렬 프로그래밍

로컬 클러스터 만들기

from dask.distributed import LocalCluster

cluster = LocalCluster(
    processes=False, 
    n_workers=2,
    threads_per_worker=2
)

print(cluster)
LocalCluster(..., workers=2, threads=4, memory=31.38 GiB)
Python에서 Dask로 병렬 프로그래밍

간단한 로컬 클러스터

cluster = LocalCluster(processes=True)

print(cluster)
LocalCluster(..., workers=4 threads=8, memory=31.38 GiB)
cluster = LocalCluster(processes=False)

print(cluster)
LocalCluster(..., workers=1 threads=8, memory=31.38 GiB)
Python에서 Dask로 병렬 프로그래밍

클라이언트 생성

from dask.distributed import Client, LocalCluster
cluster = LocalCluster(
    processes=True, 
    n_workers=4,
    threads_per_worker=2
)

client = Client(cluster)
print(client)
<Client: 'tcp://127.0.0.1:61391' processes=4 threads=8, memory=31.38 GiB>
Python에서 Dask로 병렬 프로그래밍

클라이언트 쉽게 만들기

클러스터를 만든 뒤 클라이언트에 전달

cluster = LocalCluster(
    processes=True, 
    n_workers=4,
    threads_per_worker=2
)

client = Client(cluster)

print(client)
<Client: ... processes=4 threads=8, ...>

클라이언트를 생성하여 자체 클러스터 만들기

client = Client(
    processes=True, 
    n_workers=4,
    threads_per_worker=2
)



print(client)
<Client: ... processes=4 threads=8, ...>
Python에서 Dask로 병렬 프로그래밍

클러스터 사용하기

client = Client(processes=True)

# 기본은 클라이언트를 사용
result = x.compute()

# 다른 스케줄러로 변경 가능 result = x.compute(scheduler='threads')
# 클라이언트를 명시적으로 사용 result = client.compute(x)
Python에서 Dask로 병렬 프로그래밍

다른 종류의 클러스터

  • LocalCluster() - 내 컴퓨터에서 실행되는 클러스터
  • 다른 클러스터 유형은 여러 컴퓨터에 연산을 분산
Python에서 Dask로 병렬 프로그래밍

Ayo berlatih!

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

Preparing Video For Download...