728x90

pytorch 13

[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] Vision Transformer (ViT) 코드 구현

ViT의 코드를 pytorch로 구현해보았습니다. vit의 경우에는 구현하면서 꽤 애를 먹었습니다. 최대한 논문 성능을 재현해보고자 했으나 ImageNet-1k (그 이상은 현실적으로 안됨..) 데이터셋을 논문 training detail 대로 학습을 시킬 경우 학습 완료 시까지 6일(혹은 12일..) 정도 소요되어 많은 실험이 불가능해서 좀 아쉬웠습니다. 이번 구현의 경우, 최적화 관련한 이슈가 발생해서 다양한 실험을 해보지는 못하고 정말 모델을 학습시키는 것 그 자체에 있어서 삽질을 많이 했던 것 같습니다.. 또 나름 ImageNet-1k 자체도 무거운 데이터셋이기 때문에 분산 학습을 진행했는데 이 과정에서 data parallel 에러를 핸들링하는 데에도 꽤 시간을 많이 잡아먹었던 것 같네요..ㅎㅎ..

[Pytorch] CycleGAN 코드 구현

CycleGAN 같은 경우엔 코드 구현을 해볼 필요가 있겠다는 생각이 들어서 스크래치로 구현을 해보았습니다 (대략 3달 전에 구현했는데 게을러서 지금에야 포스팅을 작성하게 되었습니다 ㅎㅎ) . 최대한 논문만 참고해서 구현을 하도록 노력했지만, 실제로 official code를 보지 않고서는 성능 재현이 어려운 부분도 있었습니다. 일례로, 논문에 나와있는 대로 구현할 경우 discriminator output size가 원하는 크기로 나오지 않거나 마지막 convolution layer의 경우 block이 아닌데 block으로 논문에 적어두거나 하는 문제가 있었습니다. 직접 구현을 해보니 구현을 해야만 체감할 수 있는 부분들이 있어서 즐거운 경험이었습니다. 포스팅은 구현된 코드 및 그에 따른 깨달음, 실험..

[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..

[DL/CV] NN interpolation의 backward propagation

Nearest Neighbor Upsampling FPN(Feature Pyramids Network)에서는 top-down path를 통과할 때 high level feature와 low level feature를 섞기 위해서 upsampling 연산을 하는데, upsampling 방법으로는 Nearest Neighbor Upsampling을 사용한다. Nearest Neighbor Upsampling은 다음과 같은 연산이다. (나중에 Upsampling을 한 번에 정리할 필요가 있다고 느낌) 간단하게 생각하면 upsampling 시, 채워야 하는 부분을 가까운 값의 copy로 채우는 연산이다. NN(Nearest Neighbor) Upsampling의 Backward path NN Upsampling..

728x90