2025. 4. 29. 21:56ㆍDevelopers 공간 [Shorts]/Software Basic
<분류>
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
'Developers 공간 [Shorts] > Software Basic' 카테고리의 다른 글
[Python] parameter & argument 몇가지 특징 기록 (0) | 2025.05.01 |
---|---|
[Git] git에서 add/commit/push를 했는데 다시 돌리고 싶다 (0) | 2025.04.29 |
[Bash] 여러개의 Disk를 모아서 mount하기 (0) | 2025.04.28 |
[PyTorch] scaled dot product에서 Attention Map 디스플레이 하기 (0) | 2025.04.10 |
[Bash] Rsync활용하기 (0) | 2025.03.17 |