Dask Array — NumPy 인터페이스의 블록 알고리즘
Dask Array
배열 하나가 메모리에 안 들어가면 일반 NumPy로는 손도 못 대요. Dask Array는 NumPy ndarray 인터페이스의 일부를 블록 알고리즘으로 구현해서, 큰 배열을 많은 작은 배열로 잘라 메모리보다 큰 배열도 모든 코어로 계산할 수 있게 해줘요. 블록 알고리즘은 Dask 그래프로 조정돼요.
설계
Dask 배열은 많은 NumPy 배열(또는 CuPy·Sparse 같은 NumPy처럼 생긴 "duck array")을 격자(grid)로 배치해 조정해요. 이 배열들은 디스크나 다른 머신에 있을 수 있어요. 미등록 duck array 유형의 이진 연산은 NumPy ufunc/함수로 연기(NotImplemented)되지만, 어떤 ndarray류든 from_array()로 Dask Array에 넣을 수 있어요.
사용 분야
대기·해양 과학, 대규모 이미징, 유전체학, 최적화·통계용 수치 알고리즘 등에서 쓰여요.
범위
Dask Array는 다음 같은 NumPy 인터페이스 대부분을 지원해요.
- 슬라이싱·리샤이핑·reduction·배열 연산
- NumPy의 많은 ufunc
map_blocks등으로 커스텀 함수 적용
다만 전체 NumPy 인터페이스를 구현하진 않아요. tolist처럼 큰 데이터셋에 비효율적인 연산과, for 루프 반복은 지원하지 않아요. 또 Dask 개발은 당장의 필요에 의해 진행되므로 많이 안 쓰이는 함수는 아직 구현되지 않았어요. 더 자세한 기능 목록은 dask.array API를 참고해요.
실행
Dask Array는 기본적으로 데이터 전송 비용을 피하고 NumPy가 GIL을 잘 놓아주기 때문에 스레드 스케줄러를 써요. 클러스터에서는 dask.distributed 스케줄러로도 잘 동작해요.