Save

torch.save(model.state_dict(), PATH)

보통 torch.save를 사용해서 pytorch model을 저장하는데 이때 보통 .pt, .pth의 확장자를 쓴다. 그러나 .pth의 경우 python path와 충돌 위험이 있기때문에 .pt 확장자를 사용하는 것을 추천한다. 

Save for resume

torch.save({
            'epoch': epoch,
            'model_state_dict': model.state_dict(),
            'optimizer_state_dict': optimizer.state_dict(),
            'loss': loss,
            ...
            }, PATH)

일반적으로 모델을 저장할 때 학습 재개(resuming)를 위해 모델 파라미터 뿐만 아니라 optimizer, loss, epoch, scheduler등 다양한 정보를 함께 저장한다. 그래서 이러한 checkpoint는 모델만 저장할 때에 비해서 용량이 훨씬 커진다. 이럴때는 .tar 확장자를 사용한다. 나는 주로 .pth.tar를 사용한다.

To save multiple components, organize them in a dictionary and use torch.save() to serialize the dictionary. A common PyTorch convention is to save these checkpoints using the .tar file extension.

reference

'Deep Learning > pytorch' 카테고리의 다른 글

torch.backends.cudnn.benchmark = True 의미  (0) 2021.08.23
[Pytorch] yolo to pytorch(0)  (0) 2021.05.17

의미 그대로 cudnn의 benchmark를 통해 최적의 backend 연산을 찾는 flag를 true로 하겠단 의미.

CNN에서 대부분의 연산을 차지하는 convolution의 경우, 아래 사진의(출처의 두번째 링크) 지원하는 연산 중 최적의 알고리즘을 찾아 적용한다.

cf) 확실한 것은 아니지만 아마 이 벤치마크는 모델이 상수처럼 작동할 때 최적의 연산을 찾을 수 있을 것이다. 예를 들어서 입력크기가 고정되어 모델이 static하게 작동한다면 이 flag가 유효하겠지만, 
입력크기가 다양하거나 또는 dynamic한 연산이 모델의 fowarding에 포함된 경우는 큰 효과를 보지 못할 수도 있을 것같다. 

출처 : https://discuss.pytorch.org/t/why-does-winograd-algorithm-speedup-convolution-given-that-mul-and-add-cost-the-same-clock-cycles-on-gpu/89993/4

https://docs.nvidia.com/deeplearning/cudnn/developer-guide/index.html#tensor-ops-conv-functions-supported-algos

https://discuss.pytorch.org/t/what-does-torch-backends-cudnn-benchmark-do/5936

 

'Deep Learning > pytorch' 카테고리의 다른 글

[pytorch] save pytorch model  (0) 2021.09.15
[Pytorch] yolo to pytorch(0)  (0) 2021.05.17

darknet은 하나의 딥러닝 framework로 볼 수 있는데, 대표적으로 darknet18,53등의 classification 모델을 포함한 yolov3 for detection등의 모델 등이 있다.
나는 pytorch를 주로 쓰는데, 위에 언급한 모델들은 darknet이라는 c++계열의 framework를 쓴다. 그래서 나는 이걸 파이토치로 옮겨오는 방법을 많이 고민했고 그 동안 고민했던 그 흔적들을 정리해보려고한다.
어.. cfg 파일이 뭐니 weight파일이 뭐니 이러한 기초적인 설명은 다 건너 뛸거다. 왜냐면 이글은 공유보다 내 개인적인 기록이 목적인 용도니까.
맨 처음은 당연히 cfg파일을 파싱하는 부분이다.
다크넷의; cfg파일을 보면 각 레이어는 '[' ']' 두 기호로 대표적인 역할을 구분하고 있고, 그 이후로 기타 세부적인 옵션들을 정의하고있다. 그래서 아래 코드는 cfg파일에서 [] 두 기호를 토대로 레이어를 구분하고, 그 옵션들은 저장하는 코드이다.

cfg conv layer 예시
def parse_cfg(self, cfgfile): ''' cfgfile : cfgfile path, e.g. ./cfg/yolov3.cfg return : list of blocks. each block describes a block in the neural network to be built. ''' print(f"parse from '{cfgfile}'") fp = open(cfgfile, 'r') lines = fp.readlines() fp.close() lines = [line.strip() for line in lines if line.strip()] # 공백 제거 lines = [line for line in lines if line[0] != '#'] # 주석 제거 blocks = [] block = {} for line in lines: if line[0] == '[': if block: blocks.append(block) block = {} block["type"] = line[1:-1] if block['type'] == 'convolutional': block['batch_normalize'] = 0 else: key, value = line.split('=') block[key.rstrip()] = value.lstrip() blocks.append(block) print("done", end="\n\n") return blocks[0], blocks[1:]

맨 마지막에 block0 과 그 이후를 구분하는 이유는 모든 다크넷 cfg는 맨처음에 [net]으로 미니배치가 얼마인지, 입력 height widht가 얼마인지등을 정의해놓는데 이것을 구분하기 위함이다.
self 키워드가 있는것을 보아 이미 클래스 내부 함수인 것을 알겠지만 사실 외부 함수로 짜도 그만이라, 아무튼

클래스 내에서 위처럼 짜면 1단계는 완성이다.
이 다음에는 저 block(list())를 통해서 어떻게 pytorch 에서 forwarding을 구성하는지를 구성하겠다.
늘 말하지만, 언제 업로드 될진 모른다.

'Deep Learning > pytorch' 카테고리의 다른 글

[pytorch] save pytorch model  (0) 2021.09.15
torch.backends.cudnn.benchmark = True 의미  (0) 2021.08.23

+ Recent posts