컴퓨터/밑딥3

[밑바닥부터 시작하는 딥러닝3] 딥러닝 프레임워크의 동작 방식

xeskin 2020. 12. 18. 09:00
반응형

딥러닝 프레임워크의 동작 방식

  • 딥러닝 프레임워크는 동작 방식에 따라 '정적 계산 그래프' 혹은 '동적 계산 그래프' 방식으로 나뉜다.

    1. 정적 계산 그래프 방식 (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 방식 도입)

        정적 계산 그래프 방식의 장점*

        1. 가장 큰 장점은 성능. 계산 그래프를 최적화하면 성능도에 따라서 최적화된다.
        2. 데이터를 흘려보내기 전에 전체 계산 그래프가 파악되므로 전체를 고려하여 최적화할 수 있다.
        3. 어떻게 컴파일하냐에 따라 다른 실행 파일로 변환할 수 있다. -> 파이썬 자체가 주는 오버헤드가 사라진다.
        4. 분산 학습할 때에 계산 그래프를 분할하여 보내야 하는데, 이 방식이 유리하다.
    2. 동적 계산 그래프 방식 (Define-by-Run)

      • 데이터를 흘려보냄으로써 계산그래프가 정의된다.

      • '데이터 흘려보내기'와 '계산 그래프 구축'이 동시에 이뤄지는 것이 특징.

      • Define-by-Run 방식 프레임워크는 넘파이를 사용하는 일반적인 프로그래밍과 같은 형태로 코딩할 수 있다.

      • 차이는 넘파이 데이터를 Variable 클래스로 감쌌다는 것이다.

      • 예: 파이토치, MXNet, DyNet, 텐서플로

        동적 계산 그래프 방식의 장점*

        1. 넘파이를 사용할 때와 같은 방식으로 수치 계산이 가능하다. 즉, '도메인 특화 언어'를 배우지 않아도 된다.
        2. 계산 그래프를 컴파일하여 변환할 필요가 없다. (if, for 문 등을 그대로 사용 가능하다.)
        3. 파이썬 프로그램 형태로 실행되기 때문에 디버깅에 유리하다.
          • 정적 계산 그래프에서 디버깅이 어려운 것은 '계산 그래프 정의'와 '데이터 흘려보내기'가 분리되어 있다는 데 있다.
          • 버그는 주로 데이터를 전파할 때 발견되지만, 문제의 원인은 '계산 그래프 정의에 있는 경우가 대부분이기 때문이다.
          • 즉, '문제 발생 시점'과 '원인이 만들어지는 시점'이 떨어져 있어 문제를 특정하기 어렵다.
반응형