Inplace(인플레이스)는 말 그대로 제자리에서라는 뜻입니다.
프로그래밍에서 새로운 메모리를 할당하지 않고 기존 변수의 메모리 공간에서 직접 값을 변경하는 연산을 의미합니다.
예시 (Python)
x = 10
x += 1 # 기존 메모리 주소에 값만 변경
반대 개념은 Out-of-place 연산입니다.
새로운 메모리를 할당해 연산 결과를 저장하고, 원본은 그대로 유지합니다.
| 구분 | 동작 방식 | 장점 | 단점 |
|---|---|---|---|
| Inplace | 기존 메모리에 덮어씀 | - 메모리 효율적 - 메모리 할당/해제 생략 → 속도 향상 | - 원본 데이터 손실 - 부작용(Side Effect) 가능성 |
| Out-of-place | 새 메모리에 저장 | - 원본 데이터 보존 - 디버깅 및 예측 용이 | - 메모리 사용량 증가 - 할당/해제 오버헤드로 속도 저하 |
Python에서는 +=, -=, *=, /= 같은 복합 할당 연산자와
list.append(), list.sort() 등이 Inplace 연산에 해당합니다.
a = [1, 2, 3]
print(id(a)) # 메모리 주소
a.append(4) # Inplace
print(id(a)) # 동일 주소
b = a + [5] # Out-of-place
print(id(b)) # 새로운 주소
PyTorch에서는 Inplace 연산이 역전파(Backpropagation) 과정에서 문제를 일으킬 수 있습니다.
이유: Inplace 연산이 활성화 값을 덮어쓰면, 역전파 시 필요한 이전 값이 사라질 수 있음.
표기 규칙: 함수명 뒤에 _(밑줄)이 붙으면 Inplace 버전.
x.relu() # Out-of-place (새 텐서 반환)
x.relu_() # Inplace (기존 x 덮어쓰기)
PyTorch 문서에서도 add_, relu_ 같은 Inplace 연산은 주의해서 사용하라고 명시합니다.
📌 Tip: 성능 최적화는 항상 안정성 → 효율성 순서로 고려하세요.
메모리 절약보다 데이터 안정성이 중요한 경우가 대부분입니다.