Define-by-Run

‘Define-by-Run(디파인 바이 런)‘은 딥러닝 프레임워크에서 신경망의 연산 그래프(Computation Graph)를 구축하는 방식 중 하나로, 쉽게 말해 “코드를 실행(Run)하는 시점에 연산 그래프를 실시간으로 정의(Define)하는 방식”을 뜻합니다.

이 방식을 동적 계산 그래프(Dynamic Computation Graph) 방식이라고도 부릅니다. 이 개념을 잘 이해하기 위해 기존의 방식이었던 ‘Define-and-Run(정적 그래프)‘과 비교하여 설명해 드리겠습니다.


1. 두 가지 방식의 비교 (비유적 설명)

  • Define-and-Run (정적 그래프 방식)
    • 비유: 롤러코스터 레일(그래프)을 설계도에 따라 처음부터 끝까지 먼저 다 지어놓고, 그 후에 기차(데이터)를 출발시켜 정해진 길로만 달리게 하는 것입니다.
    • 특징: 실행하기 전에 모양이 고정되어 있습니다. (과거 TensorFlow 1.x 방식)
  • Define-by-Run (동적 그래프 방식)
    • 비유: 기차(데이터)가 앞으로 나아가면서, 마치 영화 <월레스와 그로밋>처럼 실시간으로 앞길에 레일(그래프)을 깔면서 달리는 것입니다.
    • 특징: 기차가 가는 방향(데이터의 흐름, if문 등)에 따라 레일의 모양이 매번 유연하게 바뀝니다. (PyTorch, TensorFlow 2.x 방식)

2. Define-by-Run의 주요 장점

① 압도적인 디버깅의 편리함

  • 가장 큰 장점입니다. 파이썬 코드가 한 줄씩 실행될 때마다 연산이 즉시 수행됩니다.
  • 만약 코드 중간에 에러가 발생하면 파이썬 표준 디버거를 쓰거나, 단순히 중간에 print() 함수를 넣어 텐서(데이터)의 값을 실시간으로 눈으로 확인할 수 있습니다.

② 파이썬 제어문(if, for, while)의 자유로운 사용

  • 데이터의 크기나 조건에 따라 신경망의 구조를 다르게 하고 싶을 때, 파이썬의 if, for문을 그대로 사용할 수 있습니다.
  • 자연어 처리(NLP)처럼 입력되는 문장의 길이가 매번 달라지는 가변 길이 데이터를 다룰 때 매우 직관적이고 구현이 쉽습니다.

③ 직관적이고 쉬운 코드 작성

  • 그래프를 선언하는 부분과 실행하는 부분이 나뉘어 있지 않아서 프로그래머가 생각하는 흐름 그대로 코딩할 수 있습니다.

3. Define-by-Run의 단점

① 최적화의 한계 및 속도 저하

  • 정적 그래프(Define-and-Run)는 전체 모델의 구조를 미리 알기 때문에 “어느 부분의 메모리를 아낄지, 어떤 연산을 병렬로 처리할지” 프레임워크가 사전에 최적화(Optimization)를 할 수 있습니다.
  • 하지만 동적 그래프는 매번 실행할 때마다 그래프를 새로 만들기 때문에, 파이썬의 인터프리터 오버헤드가 발생하여 이론적으로 연산 속도가 조금 느리고 메모리 효율이 떨어질 수 있습니다.

② 배포(Deployment)의 어려움

  • 학습된 모델을 모바일 기기나 특정 하드웨어에 배포할 때는 고정된 형태의 그래프가 유리한데, 순수한 파이썬 코드에 의존하는 동적 그래프는 독립적인 환경에서 실행하기가 까다롭습니다.

4. 프레임워크의 변화

  • 과거: 딥러닝 초기에는 연산 속도와 효율을 위해 TensorFlow 1.x와 Theano가 주도하는 Define-and-Run(정적 그래프) 방식이 대세였습니다.
  • 게임 체인저: 일본에서 개발한 Chainer라는 프레임워크가 최초로 Define-by-Run 개념을 제시했고, 이후 PyTorch(파이토치)가 이 방식을 적극 채택하면서 연구자들 사이에서 폭발적인 인기를 끌게 됩니다. (코딩이 너무 편하니까요!)
  • 현재: PyTorch의 대성공에 자극받은 텐서플로우 진영도 TensorFlow 2.x부터는 기본 작동 방식을 Eager Execution(즉시 실행)이라는 이름으로 도입하여, 사실상 현대 딥러닝계의 표준은 Define-by-Run 방식이 되었습니다.

(참고: 최근 PyTorch나 TensorFlow 모두 개발할 때는 동적 그래프 방식의 편리함을 누리고, 실제 배포나 대규모 학습을 할 때는 코드를 정적 그래프로 변환해주는 기능(PyTorch의 TorchScript, TF의 @tf.function)을 제공하여 두 방식의 장점을 모두 취하고 있습니다.)

Entities