728x90

전체 글 114

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

[DL] Data Shuffling에 대한 짧은 고찰

continual learning survey paper를 읽다가 다음과 같은 구절을 접함. Research on artificial neural networks has focused mostly on static tasks, with usually shuffled data to ensure i.i.d. conditions 각 instance가 Random Variable $X_i$ 라고 하면 시계열 데이터가 아닌 이상 각 R.V는 i.i.d를 가정함. 이러한 i.i.d 조건을 만족함을 보장해주기 위해서는 데이터를 shuffling해줘야함. 그렇다면 왜 R.V가 i.i.d임을 가정해야할까? → i.i.d 가정이 있으니까 Loss를 instance 단위 별로 계산 후, reduction을 시켜주는 거겠지..?

DeepLearning/Basic 2022.10.19

[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으로 논문에 적어두거나 하는 문제가 있었습니다. 직접 구현을 해보니 구현을 해야만 체감할 수 있는 부분들이 있어서 즐거운 경험이었습니다. 포스팅은 구현된 코드 및 그에 따른 깨달음, 실험..

[Paper Review] MLP-Mixer: An all-MLP Architecture for Vision

MLP-Mixer: An all-MLP Architecture for Vision 이번에 리뷰할 논문은 "MLP-Mixer: An all-MLP Architecture for vision" 입니다. 현재 convolution과 attention 기반의 네트워크가 computer vision 분야에서 널리 사용되고 있지만 실상 이 두가지가 꼭 필요한 것은 아니라고 주장하며, 아키텍처 전체가 MLP만을 사용한 MLP-Mixer 구조를 제안하였습니다. MLP-Mixer는 기존의 Convolution과 Attention 모듈 없이 MLP만으로 Image Recognition을 잘 수행할 수 있도록 다음과 같이 두 가지 MLP Block으로 구성된 Mixer Layer를 제안합니다. Channel-Mixing M..

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

[Paper Review] Vision Transformer (ViT)

AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 오늘 리뷰할 논문은 Vision Transformer입니다. 이미지 분류에 Transformer 구조를 성공적으로 적용시킨, 매우 유명한 논문입니다. 2021년 ICLR에서 발표된 이후, 현재 ViT 관련 많은 후속 연구들이 진행되고 있으며 ViT를 backbone으로 한 다양한 architecture들이 기존의 CV task를 푸는 솔루션으로 제안되고 있습니다. ViT는 inductive bias가 약한 대신 보다 통합적이고 일반적인 모델 구조라고 할 수 있으며, inductive bias가 약하여 일반화 성능이 떨어지는 문제를 data-driven training, 즉..

[Python] 프로그래머스 - 하노이의 탑

문제 설명 https://programmers.co.kr/learn/courses/30/lessons/12946 코딩테스트 연습 - 하노이의 탑 하노이 탑(Tower of Hanoi)은 퍼즐의 일종입니다. 세 개의 기둥과 이 기동에 꽂을 수 있는 크기가 다양한 원판들이 있고, 퍼즐을 시작하기 전에는 한 기둥에 원판들이 작은 것이 위에 있도록 순서대 programmers.co.kr n개의 원판을 i번째 기둥에서 j번째 기둥까지 옮기는 방법을 구하는 문제이다. 위의 프로그래머스 문제에서는 n개의 원판을 첫번째 기둥에서 세번째 기둥으로 옮기는 방법을 구하는 문제로 출제되었음. 하노이의 탑은 재귀로 풀이 가능한 전형적인 문제. 문제 접근 처음에 패턴을 파악해서 재귀로 연관지을 수 있는지가 포인트. 또한, 어디로..

[Algorithms/Python] 에라토스테네스의 체

소수를 대량으로 빠르게 찾는 알고리즘이다. 소수는 1보다 큰 자연수 중 1과 자기 자신만을 약수로 갖는 수이다. 자연수 n이 소수인지 아닌지를 판별하기 위해서는 단순히 2부터 n-1까지 반복하면서 나누어 떨어지는지 확인하면 된다. 하나라도 나누어 떨어지는 수가 존재한다면 1과 자기자신을 제외한 수 중 약수를 갖게 되는 것이므로 n은 소수가 아니다. 위의 과정을 Python 코드로 표현하면, def is_prime_number(n): for i in range(2,n): # 2부터 n-1까지 if n % i == 0: # 하나라도 나누어 떨어지는 수가 있다면 return False # 소수가 아니다. return True 위의 방법은 직관적이지만 비효율적이라는 단점이 있다. 2부터 n-1까지 반복해야 하기..

728x90