AI/PyTorch 5

텐서에서 Top-K 결과를 받아오는 방법

최근 RAG(Retrieval Augmented Generation)과 같은 반환 기반의 솔루션들이 많이 사용되면서 정보 반환의 중요성이 더 강조되어지고 있다. 물론 벡터 데이터베이스 등의 다른 솔루션을 사용해서 문제를 해결할 수도 있으나, 상황에 따라 상위 K개의 결과를 반환하는 알고리즘 및 기능을 직접 구현해야 하기도 할 것이다. FAISS나 ChromaDB도 좋은 툴이지만, 개인적으로는 torch.topk() 메소드를 사용하는 유사도 반환 방식 역시 알아둘 필요가 있다고 본다. 가장 큰 이유는, FAISS나 ChromaDB 등의 솔루션의 경우에는 상당한 양의 메모리를 소모한다. 더 빠른 결과의 반환을 위해 인덱싱을 하다보니 그만큼 많은 메모리를 사용하게 된다. 이는 다시 말해, 물리적 한계로 인해 ..

AI/PyTorch 2023.10.26

cuDNN benchmark 활성화를 통한 최적의 알고리즘 선택

PyTorch 프레임워크 내에는 다양한 CUDA 커널들이 있다. 이로 인해 다양한 환경에서도 최적의 성능을 낼 수 있게 하지만, 어떤 의미로 보면 너무 복잡하게 느껴질 수도 있다. 실제로, CNN에서 Conv2D 레이어의 forward pass에 대한 cuDNN 알고리즘만 하더라도 하나가 아니다. 물론, 모두 충분히 빠르다고 할 수 있지만, 그럼에도 현재 실행되는 환경에 더 최적화된 커널이 존재하는 법이다. 파이토치의 백엔드 cudnn API에는 benchmark라는 플래그가 있는데, 이 플래그를 활성화시키면 파이토치에 내장된 auto-tuner가 활성화되면서 가장 최적화된 cudnn 알고리즘을 자동으로 선택해주게 된다. import torch.backends.cudnn as cudnn # type: i..

AI/PyTorch 2023.10.14

PyTorch에서 이미지 데이터에 대해 normalize를 할 때, mean=[0.485, 0.456, 0.406]과 std=[0.229, 0.224, 0.225]를 쓰는 이유는?

PyTorch vision 모델 페이지에 가보면, "All pre-trained models expect input images normalized in the same way, i.e. mini-batches of 3-channel RGB images of shape (3 x H x W), where H and W are expected to be at least 224" 라는 내용을 볼 수 있다. 그 다음에 아래와 같은 코드를 볼 수 있을 것이다. normalize = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) 보다시피, mean과 std 값으로 뭔가 이상한 값들이 세팅되어 있다. 많은 사용자들이 이 값들을 ..

AI/PyTorch 2023.10.09

Softmax 결과의 총합이 1 이하로 나오는 경우

만약 softmax를 썼는데 결과의 총합이 1이 아닐 경우, 이는 softmax를 사용한 위치와 loss 함수의 특성을 다시 한번 살펴봐야 한다. 대표적인 예로, 만약 loss 함수로 CrossEntropyLoss를 쓰는데 모델이 output을 logit이 아니라 softmax의 결과 값을 쓴다면 이와 같은 문제가 발생할 수 있다. PyTorch에서 CrossEntropyLoss는 내부적으로 log_softmax와 NLLLoss를 사용하며, input 값이 probability가 아닌 logit 값이 들어오기를 기대한다. 따라서, softmax와 log_softmax의 중복으로 인해 위와 같은 문제가 발생할 수 있다. 당연히 이는 학습을 불안정하게 하는 원인이 된다. 참고: https://discuss...

AI/PyTorch 2022.07.18

Torch.mm과 Torch.matmul 차이점

torch.matmul vector 및 matrix 간의 다양한 곱을 수행한다. broadcast 기능을 제공하며 가장 일반적으로 사용되나, broadcast 기능이 도리어 debug point가 될 수 있다. broadcast 기능은 아래의 예제와 같이 T1(10, 3, 4) T2(4)을 곱할 때, 맨 앞의 dim이 3개 일 때는 첫 dim을 batch로 간주하고 T1 (3, 4) tensor의 10개의 batch와 각각 T2(4)랑 곱을 해주는 것이다. torch.matmul(input, other, *, out=None) → Tensor torch.mm torch.matmul과 차이점은 broadcast가 안 된다는 점이다. 즉 mm은 정확하게 matrix 곱의 사이즈가 맞아야 사용이 가능하다. 따..

AI/PyTorch 2022.03.16