반응형
딥러닝 프레임워크의 동작 방식
딥러닝 프레임워크는 동작 방식에 따라 '정적 계산 그래프' 혹은 '동적 계산 그래프' 방식으로 나뉜다.
정적 계산 그래프 방식 (Define-and-Run)
계산 그래프를 정의한 뒤 데이터를 흘려보낸다.
즉, 계산 그래프 정의는 사용자가 제공하고, 프레임워크는 주어진 그래프를 컴퓨터가 처리할 수 있는 형태로 변환하여 데이터를 흘려보낸다.
# 계산 그래프 정의 a = Variable('a') b = Variable('b') c = a * b d = c + Constant(1) # 계산 그래프 컴파일 f = compile(d) # 데이터 흘려보내기 d = f(a=np.array(2), b=np.array(3))
- 계산 그래프 정의시, 실제 계산이 이뤄지지는 않는다.
- 즉, '수치'가 아닌 '기호'를 대상으로 프로그래밍 됐는데, 이를 '심볼릭 프로그래밍'이라고 한다.
- 도메인 특화 언어를 사용하여 코딩해야 한다.
예: 텐서플로, 카페, CNTK (텐서플로는 2.0부터 Define-by-Run 방식 도입)
정적 계산 그래프 방식의 장점*
- 가장 큰 장점은 성능. 계산 그래프를 최적화하면 성능도에 따라서 최적화된다.
- 데이터를 흘려보내기 전에 전체 계산 그래프가 파악되므로 전체를 고려하여 최적화할 수 있다.
- 어떻게 컴파일하냐에 따라 다른 실행 파일로 변환할 수 있다. -> 파이썬 자체가 주는 오버헤드가 사라진다.
- 분산 학습할 때에 계산 그래프를 분할하여 보내야 하는데, 이 방식이 유리하다.
동적 계산 그래프 방식 (Define-by-Run)
데이터를 흘려보냄으로써 계산그래프가 정의된다.
'데이터 흘려보내기'와 '계산 그래프 구축'이 동시에 이뤄지는 것이 특징.
Define-by-Run 방식 프레임워크는 넘파이를 사용하는 일반적인 프로그래밍과 같은 형태로 코딩할 수 있다.
차이는 넘파이 데이터를 Variable 클래스로 감쌌다는 것이다.
예: 파이토치, MXNet, DyNet, 텐서플로
동적 계산 그래프 방식의 장점*
- 넘파이를 사용할 때와 같은 방식으로 수치 계산이 가능하다. 즉, '도메인 특화 언어'를 배우지 않아도 된다.
- 계산 그래프를 컴파일하여 변환할 필요가 없다. (if, for 문 등을 그대로 사용 가능하다.)
- 파이썬 프로그램 형태로 실행되기 때문에 디버깅에 유리하다.
- 정적 계산 그래프에서 디버깅이 어려운 것은 '계산 그래프 정의'와 '데이터 흘려보내기'가 분리되어 있다는 데 있다.
- 버그는 주로 데이터를 전파할 때 발견되지만, 문제의 원인은 '계산 그래프 정의에 있는 경우가 대부분이기 때문이다.
- 즉, '문제 발생 시점'과 '원인이 만들어지는 시점'이 떨어져 있어 문제를 특정하기 어렵다.
반응형
'컴퓨터 > 밑딥3' 카테고리의 다른 글
[밑바닥부터 시작하는 딥러닝3] 연산자 오버로드 (0) | 2020.12.14 |
---|---|
[밑바닥부터 시작하는 딥러닝3] 메모리 관리 (0) | 2020.12.13 |