자 뉴턴 선생님은 3법칙까지 알려줬으니, 3법칙까지 모르는용어들을 털어보자
Big Data Frameworks(Spark, Flink)는 거대한 데이터(질량)을 처리하기 위해 여러 대의 컴퓨터(힘)를 병렬로 연결하여 가속도를 얻는다.
Lightweight Prototypes: 모바일 기기처럼 자원(힘)이 제한된 곳에서는 모델의 크기(질량)를 줄이는 경량화(Quantization)' 코딩이 필수적이다.
용어의 주소를 찾아가는 길에는 논리적 징검다리가 필요하다.
step1. 리스트와 반복문(기초): for 문을 이용해 리스트의 요소를 하나씩 처리하는 법을 배운다. 이것은 회로로 치면 직렬 연산이다.
step2. 멀티프로세싱(중급): 내 컴퓨터 안의 CPU 코어가 4개라면, 일을 4등분해서 동시에 처리하는 법을 배운다. 디지털 논리 회로의 병렬 가산기(Parallel Adder) 원리와 같다.
step3. 네트워크와 분산(연결고리): 데이터를 내 컴퓨터 메모리가 아닌, 여러 대의 컴퓨터에 나누어 저장하고 각자 계산하게 한 뒤 결과만 합치는 논리를 이해한다.
도착지(Spark). 수천 대의 컴퓨터가 마치 하나의 회로처럼 움직이게 만든다. 논리 회로에서 데이터버스(Bus)를 통해 신호를 주고받듯, Spark는 네트워크를 통해 데이터를 주고받으며 거대한 계산을 수행한다.
--> 파이썬의 multiprocessing 라이브러리를 사용하면 미니 Spark!
import multiprocessing
#[기초] 혼자서 0부터 99까지 합치기(직렬 연산)
total = sum(range(100))
#[심화] 두 명이서 나눠서 합치기(병렬 연산의 기초)
def partialsum(start, end):
return sum(range(start, end))
if _name == "main" :
#CPU 두개(논리 회로의 두 연산 장치)에게 일을 쪼개서 줌
p1 =multiprocessing.Process(target=partial_sum, args=(0, 50))
p2 = multiprocessing.Process(target=partial_sum, args=(50, 100))
#이 과정이 수천 대의 컴퓨터로 확장되면 그게 바로 Spark!
step1. 자료형과 메모리(기초): 파이썬의 int와 float이 메모리를 얼마나 차지하는지 배운다. 보통 실수는 64비트나 32비트를 쓴다.
step2. 넘파이(NumPy)의 정밀도(중급): float64 대신 float32를 쓰면 메모리가 절반으로 줄어든다는 것을 배운다.
step3. 고정소수점 vs 부동소수점(연결고리): 논리회로에서 부동소수점 연산기(FPU)는 회로가 매우 복잡하고 느리다. 반면 정수 연산기(ALU)는 훨씬 단순하고 빠르다.
도착지(Quantization). 인공지능 모델의 복잡한 32비트 소수점 데이터를 8비트 정수로 확 줄여버리는 기술.
--> 디지털 논리회로의 '데이터 폭(Bit-width)' 개념과 정확히 일치! 32비트 연산기를 8비트로 설계하면 얼마나 가벼워질까.
import numpy as np
import sys
#[기초] 일반적인 실수 리스트 (64비트 정밀도)
data_64 = np.array([0.123456789, 0.987654321], dtype=np.float64)
#[심화] 경량화된 실수 리스트 (16비트 정밀도)
data_16 = np.array([0.123456789, 0.987654321], dtype=np.float16)
print(f"64비트 데이터 크기: {sys.getsizeof(data_64)} bytes")
print(f"16비트 데이터 크기: {sys.getsizeof(data_16)} bytes")
#결과: 정확도는 조금 떨어지지만, 용량은 4배나 가벼워진다.
--> 교재에서 import나 리스트, 함수를 배울때 "단순히 기능을 불러오는게 아니라 하드웨어 자원을 어떻게 쓸지 결정하는 거구나"라고 이해하자
용어들이 다시 후두둑 떨어졌으니
출석수업 전에 얼른 파이썬을 공부하면서 이해해봐야겠다.