병렬처리
- 병렬 처리는 주로 단일 머신 내의 여러 코어나 프로세서를 사용하여 작업을 동시에 수행하는 것
- 여러개의 코어에서 동시다발적으로 일을 나누어서 수행하는 것
- CPU는 여러 개의 코어(일꾼)로 이루어져 있고, 파이썬은 기본적으로는 1개를 사용
- 보통 8코어, 회사 16~60코어
- 여러개를 시키도록 나눠주는 것이 병렬처리 > 몇십대씩 이으면 수백코어로 사용 가능
분산처리
- 분산 처리는 네트워크를 통해 연결된 여러 대의 컴퓨터(노드)가 각각의 작업을 수행하는 것
- Spark를 포함해 Ray, Dask 등의 라이브러리를 사용할 수 있다
- Multiprocessing이나 joblib이 흔히 사용
- sklearn의 njobs가 이를 제어하는 기능
CPU vs GPU
- 스파크는 기본적으로 CPU를 사용하지만, GPU 기반의 병렬처리도 발달
- 특히 LLM(Large Language Model)의 발달로 GPU에 대한 수요가 크게 늘었다. 다만 이쪽은 프레임워크가 다름
- Spark도 GPU를 지원하지만, CPU를 사용하는 것이 일반적입니다

병렬 처리 vs Vectorize
- 굉장히 ❗중요한 부분❗으로, 전처리 단계에서 삶의 질을 크게 향상할 수 있는 방법(심하면 속도가 수천배 차이남)
- 한 기기의 메모리 안에서 처리가 가능한 규모라면, 굳이 Spark를 사용하는 것보다는 연산을 최적화하는 것이 일반적으로 더 낫다
- Numpy(Pandas 포함)는 벡터화 연산을 통해 단순 반복작업을 굉장히 빠르게 처리할 수 있다
- 전처리 시 최소 수십, 최대 수백배 이상 속도의 차이가 날 수 있다
- 특히 for문의 순회를 최적화하는데 많이 사용 (for문 최대한 피한다!)
- 스파크에서도 개별 머신은 벡터화를 수행하여 속도를 최적화할 수 있다
병렬 처리의 기술 - Pickling과 Job broker
- 스파크를 포함해 분산/병렬처리 도구들은 내부에서 데이터를 Picklie로 변환하여 송수신한다.
- 또한 어떤 프로세서에 어떤 데이터를 보내고, 어떤 작업을 시킬 것이며, 어떻게 취합할 것인지에 대한 매니저가 필요하며, 이를 Job broker라 합니다
- 스파크에서는 클러스터 매니저Cluster Manager가 Yarn, Mesos, Kube 등을 이용합
- 병렬 처리에서는 명시적으로 드러나는 매니저는 없지만, 내부적으로는 해당 기능이 필요
- Airflow의 경우 Celery나 Rabbit MQ 등을 사용할 수 있다 (일거리를 나눠주는 놈~)
스레드와 프로세스

- 프로세스는 독립된 메모리 공간을 가지는 반면, 스레드는 같은 메모리 공간을 공유한다는 것이 가장 큰 차이
- 파이썬은 글로벌 인터프리터 락(GIL, Global Interpreter Lock) 때문에 한 번에 하나의 스레드만 파이썬 바이트코드를 실행할 수 있다
- 아무튼 파이썬은 멀티프로세싱이 일반적
Joblib과 머신러닝
- 파이썬에서는 병렬처리를 위해 다양한 패키지를 제공
- 그 중 가장 손쉽고 안정적으로 쓸 수 있는 패키지는 Joblib (Sklearn이 내부에서 joblib을 사용)
- 단점으로는, k개의 멀티프로세싱을 할 때 k개 완료 되어야 다음 순회로 넘어감
- 20개의 작업을 4개의 프로세서로 멀티프로세싱을 한다면
- 1,2,3,4번이 모두 완료되어야 5,6,7,8번 작업으로 넘어간다는 것
- 이로 인한 약간의 비효율이 발생할 수 있다
- 그 외의 대안으로는 multiprocessing 패키지도 많이 사용
'SPARK' 카테고리의 다른 글
| [SPRAK] 스파크를 최대한 안쓰기 위한 방법 (Sampling,분할처리,Dask,자동화) (0) | 2024.07.18 |
|---|---|
| [SPARK] 클라우드 사용 이유 3가지 (스토리지, 엔진, 데이터베이스) (0) | 2024.07.15 |
| [SPARK] 파일 유형, I/O (0) | 2024.07.15 |
| [SPARK] (중요)파이썬과 데이터 - RAM, Disk, CPU, Data type (0) | 2024.07.15 |
| [SPARK] SPARK란? 사용이유 (0) | 2024.07.15 |