while (1): study();

[PyTorch] Contiguous Tensor 본문

학습/딥러닝

[PyTorch] Contiguous Tensor

전국민실업화 2021. 9. 29. 15:45
728x90

 Contiguous는 사전에 '인접한, 근접한'이라는 뜻으로 등재되어 있습니다. PyTorch로 구현된 모델의 코드를 따라가다보면 종종 .contiguous()라는 메서드가 호출이 되는데 이는 어떤 역할을 하는 걸까요?

 

 PyTorch에서 Contiguous Tensor란 "원소 간 메모리가 인접해있는 텐서"를 의미합니다. 간단한 예를 들어 메모리가 1~16번 주소까지 있다고 가정합니다. 또한 원소가 4개인 2x2 텐서가 존재한다고 해봅시다. 이때 Non-contiguous Tensor, 즉 원소간 메모리 주소가 인접하지 않은 텐서는 다음과 같이 메모리 주소가 배정되어 있을 겁니다.

1번 원소 2 2번 원소 4
5 6 7 8
3번 원소 10 11 12
13 14 15 4번 원소

 메모리를 효율적으로 사용하기 위해서는 지역성이 중요한데, 위와 같은 배열은 매우 비효율적이라고 볼 수 있습니다. 사람도 찾는 물건이 중구난방으로 흩어져 있으면 찾기 힘드니까요. 물건을 조금 더 구색을 맞춰 정리할 필요가 있습니다. 따라서 Contiguous Tensor는 위의 그림을 다음과 같이 정리합니다.

1번 원소 2번 원소 3 4
3번 원소 4번 원소 7 8
9 10 11 12
13 14 15 16

 이렇게 되면 내가 이 텐서를 사용하고자 할 때, 좀 더 찾아서 사용하기가 용이하겠죠?

 

 기본적으로 PyTorch에서 초기화된 텐서는 contiguous합니다. 따라서 대부분의 경우에는 크게 신경쓰지 않아도 되지만, 딱 한 가지 주의해야할 경우가 있습니다. 바로 인덱스로 차원을 변경하는 작업을 수행할 경우입니다.

 PyTorch가 인덱스로 텐서의 차원을 바꾸기 위해 제공하는 메서드는 대표적으로 두 가지가 있습니다. 바로 transpose와 permute입니다. 기본적인 차이점은 transpose는 두 차원에 대해서만 교환할 수 있다는 것이고, permute는 차원의 수와 관계없이 교환가능하다는 것입니다.

 다만 두 경우 모두 수행한 이후에 결과로 반환된 텐서는 Non-contiguous한 상태가 됩니다. 따라서 전치연산을 수행한 이후에는 습관적으로 .contiguous()를 붙여주는게 좋습니다. 밑은 그 예시입니다.

a = torch.randn(1, 2, 3, 4)
b = a.permute(1, 0, 2, 3) # non-contiguous
c = a.permute(1, 0, 2, 3).contiguous() # contiguous

 

728x90

'학습 > 딥러닝' 카테고리의 다른 글

NLG 지표 간단 정리  (0) 2022.01.15
Comments