[PyTorch] Tensor와의 기본연산시 Broadcasting 문제

2025. 4. 29. 21:56Developers 공간 [Shorts]/Software Basic

728x90
반응형
<분류>
A. 수단
- OS/Platform/Tool : Linux, Kubernetes(k8s), Docker, AWS
- Package Manager : node.js, yarn, brew, 
- Compiler/Transpillar : React, Nvcc, gcc/g++, Babel, Flutter

- Module Bundler  : React, Webpack, Parcel

B. 언어
- C/C++, python, Javacsript, Typescript, Go-Lang, CUDA, Dart, HTML/CSS

C. 라이브러리 및 프레임워크 및 SDK
- OpenCV, OpenCL, FastAPI, PyTorch, Tensorflow, Nsight

 


1. What? (현상)

 

이번 글에서는 PyTorch Tensor와의 기본 연산시 다양한 상황에 대해 설명하려고합니다.

 

 


2. Why? (원인)

  • X

3. How? (해결책)

여러가지 상황으로 나누어서 살펴보겠습니다. (+, -, /, *) 등 모든 기본연산자에 대해 동일하지만 아래 예시는 곱셈( * )으로 보이겠습니다.

 


상황1. 1D Tensor와의 기본 연산 : Tensor A[2] * Tensor B[2, 80, 768]

 

이 경우 아래와 같은 에러가 납니다.

The size of tensor a (2) must match the size of tensor b (768) at non-singleton dimension 2

 

이유는 PyTorch가 자동으로 브로드캐스팅을 시도하는데, 브로드캐스팅할 차원이 없어서 생기는 문제입니다.

 

정확히 이해하려면 아래와 같이 해결하고 났을 때의 결과를 보면 이해가 됩니다.

아래는 1D Tensor A의 차원 개수를 Tensor B와 같이 맞춰줍니다.

A.view(-1,1,1)


이렇게 하면 Tensor A의 차원은 [2, 1, 1]로 변경이 되고 그다음 아래와 같이 브로드캐스팅 규칙에 맞게 내부적으로 자동 차원 확장됩니다.

  • 2 → 2
  • 1 → 80
  • 1 → 768

 

 

상황2. Python 스칼라와의 기본 연산float A * Tensor[2,80, 768]

 

float와 int 같은 Python 스칼라 값은 PyTorch에서는 자동으로 모든 tensor 원소에 브로드캐스팅해서 연산이 됩니다.

 

따라서 문제 없이 실행됩니다.

 

 

상황3. 0D Tensor와의 기본 연산 : Tensor A[] * Tensor B[2, 80, 768]

 

차원이 없는 Tensor(0-dimensional tensor)는 위 Python 스칼라처럼 다뤄지기 때문에 자동으로 브로드캐스팅됩니다.

 

이 경우 주의할 것은, 차원은 위와 같이 모두 브로드캐스팅 되어 해결되지만, device의 경우 mismatch가 나면 에러가 뜰 수도 있으니 직접 처리해주어야합니다.

** 예시 : 하나는 cpu, 하나는 cuda


 

728x90
반응형