본문 바로가기
Python

[PyTorch] in-place 연산이란?

by ds31x 2025. 3. 13.

in-place 연산이란?

in-place 연산은 원본 데이터 구조를 직접 수정하여 별도의 복사본을 만들지 않는 연산 방식을 가리킴.

  • 메모리 효율성이 높지만,
  • 원본 데이터가 변경된다는 점을 주의해야 함.

주의할 점은 in-place 연산을 사용할 때 자동 미분(autograd)에서 문제가 발생할 수 있음.

  • requires_grad=True인 텐서에 대해 in-place 연산을 수행하면
  • 계산 그래프가 올바르게 유지되지 않을 수 있으므로 주의해야 함.

autograd를 사용할 때는 in-place 연산을 피해야 함.
즉, 모델 학습 중에는 in-place 연산을 사용하지 말 것.


PyTorch에서의 in-place 연산

PyTorch에서는 method 이름 끝에 언더스코어(_)를 붙여 in-place operation 임을 표시

  • PyTorch에서는 다양한 in-place 연산이 있고 이러한 연산들은 보통 메소드 이름 끝에 언더스코어(_)를 붙여 표시함.
  • 이는 새로운 텐서를 생성하지 않고 기존 텐서를 직접 수정한다는 것을 의미.

PyTorch의 주요 in-place 연산들은 다음과 같음:


1. 산술 연산:

   tensor.add_(value)      # 더하기
   tensor.sub_(value)      # 빼기
   tensor.mul_(value)      # 곱하기
   tensor.div_(value)      # 나누기

2. 초기화 연산:

   tensor.fill_(value)     # 모든 요소를 특정 값으로 채우기
   tensor.zero_()          # 모든 요소를 0으로 초기화
   tensor.ones_()          # 모든 요소를 1로 초기화

3. 변형 연산:

   tensor.abs_()           # 절대값 취하기
   tensor.neg_()           # 부호 반전
   tensor.sqrt_()          # 제곱근 계산
   tensor.pow_(exponent)   # 거듭제곱 계산

4.차원 변환:

   tensor.transpose_(dim0, dim1)  # 차원 전치
   tensor.squeeze_(dim)           # 크기가 1인 차원 제거
   tensor.unsqueeze_(dim)         # 새 차원 추가

5. 인덱싱 기반 연산:

   tensor.index_fill_(dim, indices, value)  # 특정 인덱스의 요소 채우기
   tensor.scatter_(dim, index, src)         # 특정 위치에 값 분산

6. 연산자 오버로딩 (Augmented Assignment):

   tensor += value  # in-place 더하기
   tensor -= value  # in-place 빼기
   tensor *= value  # in-place 곱하기
   tensor /= value  # in-place 나누기

참고: NumPy의 인플레이스 연산

NumPy에서는 PyTorch와 달리 _를 사용하지 않고 in-place 연산을 제공:

# NumPy의 in-place method
arr = np.array([1, 2, 3])
arr.fill(5)  # arr은 이제 [5, 5, 5]

# 연산자를 통한 인플레이스 연산
arr += 2  # arr은 이제 [7, 7, 7]