Frameworks

    [Pytorch] lovely-tensors 라이브러리

    [Pytorch] lovely-tensors 라이브러리

    Introduction 파이토치를 사용하는 코드를 디버그 하다 보면 텐서 정보를 출력해 봐야 할 때가 있다. 인풋 / 아웃풋 텐서 이미지라던지, 중간 activation 결과라던지, 아니면 하다못해 모델 웨이트라던지 다양한 텐서 데이터에 대해 지금 어떤 값을 가지고 있고, 비주얼라이즈 하면 어떤 모습일지 확인해 봐야 하는 상황이 종종 있을 것이다. 하지만 일반적으로 텐서를 출력하면 보이는 모습은 아래와 크게 다르지 않다. >>> tensor tensor([[[[ 0.4419, 0.8523, -0.5494, ..., -0.8664, -0.5186, 0.1264], [ 0.2430, -0.7320, -0.7026, ..., 0.4742, -0.7101, 0.6129], [-0.2232, -0.9372, 0...

    [PyTorch] 데이터의 텐서 변환 시 as_tensor, from_array 속도 비교

    [PyTorch] 데이터의 텐서 변환 시 as_tensor, from_array 속도 비교

    Introduction 파이토치 사용 중에 list나 numpy array를 데이터 copy 없이 torch tensor로 view를 변환해야 하는 일이 굉장히 자주 있다. 파이토치에서는 이런 종류의 변환 작업을 위한 메소드를 이것저것 제공하고 있는데, 문득 어떤 데이터에 어떤 방식을 사용해야 가장 속도가 빠를지 궁금해졌다. 이번 글에서는 간단한 실험을 통해 어떤 상황에서 어떤 도구가 가장 효율적인지 알아보려고 한다. 결론만 말하자면, 꽤 큰 사이즈 의 list라면 as_tensor를 쓰는 게 더 빠르고, np.array에는 from_numpy를 사용하는 쪽이 더 좋다. List to Tensor 먼저 리스트를 CPU 텐서로 변환하는 상황을 살펴보자. 직접 as_tensor 를 통해 리스트에서 텐서로 갈..

    [OpenCV] cv2.fillPoly 도중 Segmentation fault + gdb 사용법

    [OpenCV] cv2.fillPoly 도중 Segmentation fault + gdb 사용법

    Introduction 얼마 전 모델 학습을 돌리다가 시작 후 3~4일쯤 지나서 Segmentation fault (core dumped) 라는 메시지와 함께 아무 에러 트레이스백 없이 프로세스가 종료되는 현상이 반복적으로 발생했다. 따로 디버거를 활성화 시켜 놓고 돌리지도 않았고, 무엇보다도 학습 시작 후 한참 이후에 아무 정보 없이 프로세스가 종료되니 디버그를 도저히 진행할 수가 없었다. 그런데 어느날, 학습 시작 후 몇 분만에 에러가 재현되는 학습 세팅을 발견해 비로소 디버그 작업에 착수할 수 있었다. 빠르게 제목의 상황의 해결법을 보고 싶다면 우측 목차를 통해 문제 해결 단락으로 넘어가자! 삽질의 과정 파이썬 스크립트 실행 도중 Segmentation fault 에러가 발생할 때 파이썬 디버거 (..

    [OpenCV] TypeError: Expected cv::UMat for argument

    [OpenCV] TypeError: Expected cv::UMat for argument

    Introduction Python에서 OpenCV를 이용하다 보면 아래와 같은 에러 메시지를 분명히 본 적이 있을 것이다. TypeError: Expected cv::UMat for argument [...] TypeError: Expected Ptr for argument [...] 벌써부터 화가 난다... 말해주는 바는 명확하다. argument 뒤에 오는 인자의 타입으로 cv::UMat을 기대했지만 실제로는 아니라는 것이다. 하지만 우리가 일반적으로 파이썬 버전의 OpenCV에서 사용하는 데이터 타입은 numpy.ndarray 이다. 이 시점부터 혼란이 시작된다. numpy.ndarray에 어떤 조건이 더 걸려야 cv::UMat으로 타입 인식이 되는 걸까? 조건을 잘 만족시킨 것 같은데 왜 계속 ..

    [PyTorch] 파이토치 프로파일링 (PyTorch profiler API)

    [PyTorch] 파이토치 프로파일링 (PyTorch profiler API)

    Introduction 지지난 글에서는, 파이썬 코드를 실행할 때 코드의 시간 성능을 프로파일러 (profiler) 를 이용해 측정하는 방법을 알아봤었다. 여기 (지지난 글이었지만 글을 수정 하면서 발행일을 업데이트 했고... 목록의 한참 위로 올라가 버렸다) 함수의 호출 수와 개별 / 누적 소모 시간을 한 번에 정리해 주기 때문에 어느 구간에서 프로그램의 연산 병목이 일어나고 있는지 쉽게 찾을 수 있다. 그렇다면 비슷한 느낌으로 파이토치 연산의 전체적인 시간 / 메모리 성능을 한 눈에 보기 쉽게 정리해 주는 기능은 없을까? 일단 위의 프로파일러는 CPU 상에서 실행되는 함수만을 트래킹 하기 때문에, 대부분 GPU를 사용하는 파이토치 모델의 성능 측정에 사용하기에는 적합하지 않다. 다행히도 파이토치 라이..

    [PyTorch] 재현성 (Reproducibility)

    [PyTorch] 재현성 (Reproducibility)

    Introduction 파이토치를 이용하다 보면, 분명 똑같은 세팅으로 실험을 돌렸음에도 불구하고 학습 loss나 세세한 inference 결과 등이 조금씩 차이나는 현상을 볼 수 있다. 분명 non-deterministic 한 부분 (랜덤 시드 등) 을 다 통제했다고 생각했는데, 결과가 매번 다르니 굉장히 난감할 것이다. 오늘은 이에 대한 원인을 간략히 짚어보고, 파이토치의 재현성 (reproducibility) 을 어떻게 보장할 수 있는가에 대해 간단히 정리할 생각이다. 본론부터 말하면, 파이토치가 랜덤한 동작을 보이는 원인은 크게 파이토치 내/외부의 난수 생성기 (random number generator) cuDNN의 컨볼루션 벤치마킹 그리고 PyTorch에서 사용하는 알고리즘 자체의 non-de..

    [PyTorch] RuntimeError: Trying to backward through the graph a second time

    [PyTorch] RuntimeError: Trying to backward through the graph a second time

    Introduction 파이토치를 이용해 다양한 모델을 구현하다 보면, 아래와 같은 에러 메시지를 한번 쯤은 마주할 것이다. RuntimeError: Trying to backward through the graph a second time, but the buffers have already been freed. Specify retain_graph=True when calling backward the first time 오늘은 이 에러 메시지가 어떤 상황에서, 어떤 이유로 출력되는 지 알아보고, 그 해결 방법에 대해 간략히 설명할 예정이다. Autograd Mechanism 기본적으로 파이토치의 autograd 메커니즘은 requires_grad=True 로 설정된 텐서들에 대해, 텐서 데이터가 생..

    [PyTorch] 모델 파라미터 초기화 하기 (parameter initialization)

    [PyTorch] 모델 파라미터 초기화 하기 (parameter initialization)

    Introduction 슬슬 딥러닝 프레임워크에 대해서도 포스트를 올리려 한다. 주로 쓰는 프레임워크는 파이토치(PyTorch) 이며, 간간히 유용하다 싶은 기능들을 찾으면 하나씩 정리해 올릴 생각이다. 새롭게 안 정보를 정리도 할 겸, 공유도 할 겸 적는 글들이니 편하게 봐 줬으면 한다. 이번에는 파이토치에서 모델의 파라미터를 초기화(initialize) 하는 방법에 대해 포스팅한다. 1. Weight Initialization Mechanism 사실 파이토치에서는 기본적인 모듈 클래스(Linear, ConvNd 등) 를 초기화 할 때, 자동으로 파라미터를 적절히 초기화 해 주고 있다. 하나의 예시로, nn.modules의 Linear 클래스의 이니셜라이저를 살펴 보자. class Linear(Modu..