28.18 텐서의 뷰(View)와 연속성(Contiguity) 개념

뷰(view)와 연속성(contiguity)은 텐서 라이브러리의 자료 구조를 이해하기 위한 필수 개념이다. 뷰는 동일한 기저 데이터(underlying storage)를 공유하면서 서로 다른 형상·스트라이드 메타데이터를 갖는 텐서 객체를 의미하며, 연속성은 텐서의 논리적 원소 배열이 메모리 상에서 표준적인 선형 순서로 저장되어 있는지를 나타내는 성질이다. 두 개념은 긴밀하게 연결되어 있으며, 메모리 효율, 연산 성능, 그리고 호환성 측면에서 중요한 의미를 갖는다.

1. 뷰의 정의와 구조

하나의 텐서 객체는 일반적으로 다음 네 가지 메타데이터로 기술된다. 첫째, 기저 데이터의 기준 주소 b_0; 둘째, 형상 \mathbf{d} = (d_1, \ldots, d_n); 셋째, 스트라이드 \mathbf{s} = (s_1, \ldots, s_n); 넷째, 데이터 타입. 뷰는 새로운 메타데이터 조합을 가지지만 기저 데이터는 원본과 동일한 메모리 블록을 공유한다. 원소 접근 공식은 다음과 같이 표현된다.

\mathrm{addr}(i_1, \ldots, i_n) = b_0 + \text{itemsize} \cdot \sum_{k=1}^{n} i_k\, s_k

뷰를 생성하는 연산에는 전치(transpose), 축 치환(permute), 재형성(reshape, 연속인 경우), 슬라이싱(slicing), 그리고 차원 확장(squeeze, unsqueeze, expand) 등이 포함된다. 이러한 연산들은 데이터 복사 비용 없이 O(1) 시간에 수행된다.

2. 연속성의 정의

텐서가 C-연속(C-contiguous, 행 우선 연속)이기 위한 필요충분조건은 다음과 같다.

s_n = 1,\qquad s_k = s_{k+1} \cdot d_{k+1}\quad (k = 1, \ldots, n-1)

대칭적으로 F-연속(Fortran-contiguous, 열 우선 연속)의 조건은 다음과 같다.

s_1 = 1,\qquad s_k = s_{k-1} \cdot d_{k-1}\quad (k = 2, \ldots, n)

연속적인 텐서에서는 논리적 순회 순서에 따라 메모리 주소가 단조 증가하며, 형상 (d_1, \ldots, d_n)과 원소 개수 N = \prod_k d_k만으로 메모리 레이아웃이 완전히 결정된다. 반면 전치 또는 비규칙 슬라이싱을 거친 텐서는 비연속(non-contiguous) 상태가 되어, 원소 순회 시 메모리 주소가 단조적으로 증가하지 않는다.

3. 뷰와 복사의 구분

텐서 연산은 결과가 뷰인지 복사(copy)인지에 따라 동작 방식이 근본적으로 다르다. 뷰를 통해 값을 수정하면 원본 텐서의 값도 함께 변경되지만, 복사본을 수정하면 원본에 영향을 주지 않는다. 아래 표는 대표적인 연산의 결과 유형을 요약한다.

연산결과조건/비고
transpose, permute스트라이드만 재배열
squeeze, unsqueeze크기 1 축의 추가/제거
slice (연속 간격)스트라이드 보존 또는 스케일링
reshape (연속인 경우)원본이 연속일 때
reshape (비연속인 경우)복사내부적으로 contiguous() 호출
contiguous()복사표준 스트라이드로 재배열
clone()복사데이터 블록 전체 복제

4. 연속성 검사와 재연속화

텐서 T의 연속성 여부는 앞 절의 조건식을 직접 검사함으로써 판별된다. 비연속 텐서를 연속 상태로 변환하는 연산은 다음과 같이 기술될 수 있다. 비연속 텐서 T의 원소를 순회하여 형상 \mathbf{d}에 맞는 새로운 연속 메모리 블록 T'에 다음과 같이 복사한다.

T'[i_1, \ldots, i_n] = T[i_1, \ldots, i_n], \quad \forall (i_1, \ldots, i_n) \in \prod_{k=1}^{n} \{0, \ldots, d_k - 1\}

이 연산은 O(N)의 시간 복잡도를 가지며, N개 원소 전체를 새 메모리 영역으로 옮긴다. 재형성(reshape) 연산은 원본이 연속이라면 단순한 뷰 변경만으로 처리되지만, 비연속인 경우에는 내부적으로 contiguous()를 호출하여 복사 후 새로운 형상으로 재해석한다.

5. 성능 및 실무적 의의

딥러닝 프레임워크의 많은 커널, 특히 view 연산 기반의 matmul, 합성곱, 그리고 BLAS/cuBLAS 라이브러리는 입력 텐서가 연속 상태임을 전제로 작성된 경우가 많다. 비연속 텐서를 직접 전달하면 명시적 오류가 발생하거나 내부적으로 자동 재연속화가 일어나, 불필요한 메모리 복사와 성능 저하가 유발된다. 따라서 모델의 순전파 및 역전파 코드에서 전치, 치환, 슬라이싱을 수행한 후에는 해당 텐서의 연속성을 확인하고, 필요한 경우 명시적으로 연속화 연산을 삽입하는 것이 성능 최적화의 핵심이다. 뷰와 연속성의 명확한 구분은 텐서 라이브러리의 메모리 모델과 실행 효율을 이해하는 출발점이 되며, 대규모 모델 학습 시스템의 성능을 결정짓는 핵심 요소 중 하나이다.