Programming/Pytorch

[Pytorch] torch.Tensor.contiguous 사용 목적

프로자기개발러 2023. 2. 27. 20:01

 

 

contiguous 는 인접한, 근접한 이라는 의미이다.

이 의미에서 유추할 수 있듯이 contiguous 는 특정 값이 인접하도록 하는 메소드 이다.

좀 더 정확히는, tensor 데이터 메모리 위치가 인접하도록 재정의 하는 것을 의미한다. 

 

view(), transpose(), narrow(), expand() 같은 몇몇의 메소드는 데이터를 생성하는게 아닌 기존 메모리주소를 공유 한채로 연산한다.

 

 

아래 예제를 보자

 

import torch

a = torch.randn(2, 3)

for i in range(2):
    for j in range(3):
        print(a[i][j].data_ptr()) # numpy.data_ptr() 는 메모리 주소 반환
        
"""
100803712
100803716
100803720
100803724
100803728
100803732
"""

다차원 배열을 생성 시 메모리에 순차적으로 할당 된다. 

 

 

이 때, 해당 데이터에 변형(e.g. transpose)을 주면 텐서를 초기화하는 것이 아닌 기존에 할당된 메모리 주소는 유지한채로 데이터에 변형만 일으킨다.

a.transpose_(0, 1)

for i in range(3):
    for j in range(2):
        print(a[i][j].data_ptr())


"""
100803712
100803724
100803716
100803728
100803720
100803732
"""

 

 

contiguous 메소드를 이용하면 tensor의 메모리 주소를 인접하도록 재정의할 수 있다.

a = a.contiguous()

for i in range(2):
    for j in range(3):
        print(a[i][j].data_ptr())
        
"""
100803712
100803716
100803720
100803724
100803728
100803732
"""

 

 

python 에서 list 타입의 변수는 크기가 가변적이고 아무 데이터 형태나 저장 가능하지만 독립적인 메모리에 저장되어 접근 속도가 느리다.

 

하지만 인접한 배열의 데이터는 접근속도나 transpose 같은 데이터 변형 연산이 매우 빠르게 된다.

 

이러한 이점을 챙기기 위해 사용하는 것이 contiguous 메소드이다.