728x90

DeepLearning/Pytorch 9

[Pytorch] torch.no_grad() versus requires_grad=False

prompt learning 코드 보는데 갑자기 이해가 안가는 점이 생김. 궁금증은 아래 이슈에서부터 시작됨. https://github.com/KaiyangZhou/CoOp/issues/7 question about gradients on text encoder · Issue #7 · KaiyangZhou/CoOp Hi, may I ask if the gradients of the original CLIP text encoder are frozen or not? The paper mentioned that the gradients of text encoder is frozen, but I couldn't find that part in the code... Th... github.com 여기 보면, C..

[Pytorch] Distributed Data Parallel (multi-gpu 학습)

오늘은 여러 gpu 디바이스에서 분산 학습을 수행하는 방법을 정리해보겠습니다. 하기한 내용에 오류가 있을 경우 댓글 부탁드립니다. How to parallel Model parallel 모델을 쪼개서 여러 gpu (병렬적)로 뿌려주는 경우입니다. model이 너무 커서 하나의 gpu 메모리가 충분하지 못할 때의 문제인 것 같습니다. 1번 디바이스에서는 전체 forward process의 part1을 맡고, 2번 디바이스에서는 part2를 맡는 방식으로 분산 학습이 진행됩니다. 간단히 코드를 작성해보면 아래와 같습니다. class ModelParallel(nn.Module): def __init__(self, *args, **kwargs): super(ModelParallel, self).__init__(..

[Pytorch] 여러 gpu 사용할 때 torch.save & torch.load (feat. map_location)

굳이 multi-gpu에서 분산 학습을 한 게 아니더라도, 여러 gpu를 사용할 수 있는 환경이라면 한 번쯤 겪어볼 만한 error에 대한 해결책 정리. 0번 gpu에서 모델을 학습시키고 torch.save를 통해 저장한 상황이라고 할 때, 1번 gpu에서 torch.load를 통해 해당 weight을 가져와서 학습을 재개하고자 하는 경우 혹은 재학습시키고자 하는 경우 device가 일치하지 않는다는 error가 뜨는 경우가 존재함. 이는, torch.save를 통해서 모델을 가져올 때 map location을 지정해주지 않아서 생기는 문제. torch DDP docs를 보다가 아래와 같은 note를 발견함. If you use torch.save on one process to checkpoint th..

[Pytorch] model.zero_grad() vs. optimizer.zero_grad()

gradient accumulation 관련 코드를 찾아보다 model.zero_grad()를 처음 보게 되어서 글 짧게 남깁니다. def train(opt): optimizer = torch.optim.Adam(model.parameters(), ...) for epoch in opt.n_epochs: model.train() for step, batch in enumerate(train_loader): optimizer.zero_grad() x, y = batch[0].to(opt.device), batch[1].to(device) output = model(x) loss = criterion(output, y) loss.backward() # backward 시 gradient가 계산되며 텐서의 g..

[Pytorch] Learning Rate Scheduler 커스텀하기

CycleGAN을 구현하던 도중 learning rate decay를 linear하게 주었다는 부분을 확인할 수 있었다. 그러나 내가 찾아본 바로는 torch 내의 learning rate scheduler는 linear decay를 적용하는 scheduler가 없었다 (아마 그런 scheduling이 좋지 않으니까 구현이 안되어 있는 게 아닐까 한다). 하지만 논문을 최대한 반영해서 구현해보고 싶어서 직접 구현해보기로 했다. 코드 구현 자체는 어렵지 않으나 pytorch 내에서 어떻게 learning rate scheduler가 작동하는지의 원리를 파악할 필요가 있었다. _LRScheduler 파이토치 내에 구현되어 있는 scheduler의 베이스 클래스이다. """ code reference: htt..

[Pytorch] 실험 재현(reproducibility)을 위한 실험 환경 randomness 제어하기

실험을 여러번 했을 때 똑같은 결과를 보장하는 것을 '재현성(reproducibility)' 라고 한다. 파이토치에서 실험 재현성을 보장하기 위해서 해주어야 하는 사전 절차는 다음과 같다. reproducibility 실험 재현성을 위해서 제어해야할 randomness는 다음과 같다. 1. torch의 randomness 2. torch.cuda의 randomness - multi-gpu를 사용할 경우에는 manual_seed_all로 제어해줘야 함 - pytorch document에 의하면 torch.manual_seed로 모든 device에서의 randomness를 제어 가능한 것으로 나오지만 다른 코드를 더 찾아보니 이 부분도 제어해주기에 추가 3. torch.backends.cudnn (bench..

[Pytorch] hook (forward_hook, backward_hook)

Hook 패키지 중간에 자기가 원하는 코드 끼워넣을 수 있는 부분 정도로 이해하면 될 듯하다! (register hook) hook: 일반적으로 hook은 프로그램, 혹은 특정 함수 실행 후에 걸어놓는 경우를 일컬음. pre-hook: 프로그램 실행 전에 걸어놓는 hook forward hook register_forward_hook: forward 호출 후에 forward output 계산 후 걸어두는 hook # register_forward_hook should have the following signature hook(module, input, output) -> None or modified output input은 positional arguments만 담을 수 있으며 (index 같은?) ..

[Pytorch] nn.Module & super().__init__()

우리는 pytorch에서 각자 레이어 혹은 모델을 구성할 때, nn.Module을 상속받는다. 왜 상속을 받을까? 또 상속받을 때, super().__init__()은 왜 해주는 것일까? 해당 코드를 작성함으로써 어떤 속성을 갖게되는 걸까? 이번 글에서는 이 두 가지를 중점적으로 정리해볼 것이다. 아래의 코드는 간단히 convolution block을 구현한 것이다. import torch import torch.nn as nn class ConvBlock(nn.Module): """ conv2d - batchnorm - relu - max_pooling2d 로 구성된 conv block을 만들어봄 """ def __init__(self, kernel_size, stride, padding, pool, ..

728x90