파이토치&텐서플로우&관련코딩
-
[미]파이토치 DataParallel, DistributedDataParallel, apex + amp 정리파이토치&텐서플로우&관련코딩 2021. 6. 13. 14:47
ICCV KD rebuttal 때 이미지넷 요청을 받았었는데 시간이 없어서 찾아보고 적용. 먼저 정리하자면, 분산처리에는 2가지 방법이 있고 파이토치에서는 크게 DataParallel과 Distributed.DataParallel이 있다. 하지만 Distributed는 오류가 뜬다 하여 nvidia에서 제공하는 apex를 썼다. 예를 들어 배치가 128이고 resnet101을 훈련시킨다고 하자. 속도의 향상, 또는 VRAM의 부족으로 인해 분산처리를 이용하여 훈련하려고 한다. 서버 컴이 다 돌아가고 있어서 순서 설명은 GPU4개를 이용하는 것으로 설명하였고, 실제 코드는 확장성을 위해 GPU는 4개중 0,1,3 3개를 이용하는 것으로 구현하였다. 기준 GPU는 0. 1. DataParallel 1. 배치..
-
(미결) GAN학습 할 때 G부터? D부터? + 추론시간은 모델 크기에 비례?파이토치&텐서플로우&관련코딩 2021. 5. 31. 16:32
2021-05-31 : 정석대로라면 보통 D부터 훈련하는게 맞다고 들었다. 그런데 BEGAN을 훈련하다보니 훈련속도가 너무 느려서 오피셜 코드와 비교하다 보니 흥미로운 사실을 발견함. 아래 코드처럼 모든 코드가 같고 훈련 순서만 바꿔서 훈련해보았는데 G부터 훈련하는것이 약 8배정도 더 빠르다. 빠른 코드 느린 코드 또한 DCGAN에서는 위의 경우가 거의 해당하지는 않았지만 G부터 훈련하는것이 약 10퍼센트정도 더 빨랐다. self.conv_layer.append(nn.Conv2d(128, 128, kernel_size=3, padding=1, stride=1)) self.conv_layer.append(nn.BatchNorm2d(128,0.8)) self.conv_layer.append(nn.LeakyR..
-
SoftmaxGAN에서 모델 그래프 구조 공부파이토치&텐서플로우&관련코딩 2021. 5. 5. 23:29
아래 그림은 SoftGAN의 그래프이다. 이대로 구현 하면 되는데 이전의 GAN들과 다른 점은 Generator를 훈련시키기 위해 real logit도 쓴다는 점이다. **순서에 주의하자. 먼저 D를 업데이트 시키고 업데이트 된 D에서 logit을 추출하여 G_loss를 만든다. 또한 D를 훈련시킬때에는 optimizer_D를 사용하고 G는 optimizer_G를 사용하므로 그래프가 연결되어 있어도 업데이트는 각각 될 수 밖에없다. (다시말하면, optimizer_D.step()을 하면 D의 parameter만 업데이트 된다.) ** 아래 코드가 안되는 이유는 D를 훈련시키고 retain_graph=True로 하여 그래프를 남긴다. 그 뒤에 G_loss를 계산하기 위해 처음에 계산한 real_logit과..
-
torch gradient 계산 정리파이토치&텐서플로우&관련코딩 2021. 4. 28. 11:38
만약 FloatTensor만 선언한다면 requres_grad는 False로 지정되어있어서 backward에서 오류가 난다. 무조건 지정 해줘야함. 단, label같은건 안해도 되지. 그러고 곱셈을 한다. 이때에는 asd의 grad는 none이다. 그 다음에 backward를 실행하면 c의 grad_fn은 multiplication으로 되고 asd와 qwe의 grad가 정해진다. torch.autograd.grad : WGAN-GP를 구현하다 사용한 함수 역할은 그래디언트를 직접적으로 텐서로 볼 수 있는 함수이다. 그래디언트를 직접 계산 해보거나 그래디언트가 손실 함수에 들어가야 할 때 쓸 수 있다. 위에있는 이미지는 실제 WGAN-GP에서 쓰인 gp 항을 계산하기 위한 코드이다. 그 중 torch.au..
-
LR Schedulr 정리파이토치&텐서플로우&관련코딩 2021. 4. 25. 15:40
사용법은 간단하다. 최적화에 사용할 옵티마이저 정의 스케줄러를 정의 할 때, 어느 옵티마이저에 적용할지와, 다른 매개변수를 정의. 훈련때는 옵티마이저는 훈련 과정에 보통때와 같이 쓰고, 일반적으로 스케줄러는 보통 에폭를 기준으로 몇 에폭마다 학습률을 바꾸는지 결정하므로 스케줄러의 step함수가 에폭을 기준으로 사용하는지를 확인. 예시 코드는 아래와 같다. // 옵티마이저와 스케줄러 정의 optimizer_G = torch.optim.Adam(generator.parameters(), lr=args.lr, betas=args.betas) optimizer_D = torch.optim.Adam(discriminator.parameters(), lr=args.lr, betas=args.betas) schedu..
-
view vs reshape파이토치&텐서플로우&관련코딩 2021. 4. 23. 11:01
기능은 같지만 한번도 다루지 않은 데이터같은 경우는 view로 해도 되는데 중간에 네트워크에서 다루다가 크기를 조정 할 떄에는 reshape를 써야한다. 이유는 reshape는 contiguous한 메모리 배열을 가능하게 한다. view 는 contiguous 한 텐서에 대해서만 적용가능하다. reshape은 그렇지 않아도 적용 가능하고, contiguous 하지 않은 텐서에 적용하고 반환하는 경우 바뀐 텐서를 먼제 copy한 뒤에 contiguous하게 만들어 준다. 그래서 view 를 사용한 코드는 중간중간에 텐서를 contiguous하게 바꿔 주는 경우가 종종 있다. 메모리를 아끼려면 copy를 하지 않고 view와 contiguous 함수만 사용해서 짜면 좋지만 복잡해 질 수 있다.
-
모델 저장파이토치&텐서플로우&관련코딩 2021. 4. 22. 15:46
1. 2021-04-22 hubmap 모델 5개 앙상블 병렬처리 하다가 생긴 문제. model을 저장하고 로드하는데에 key가 안맞는 오류가 생겨서 헤맸다 => GPU 병렬처리하면 key들의 맨 앞에 module.이 추가로 붙는다 따라서 아래 코드로 이걸 다 없얘줘야 로드가 가능하다. for key in list(state_dict.keys): if "module." in key: state_dict[key.replace("module.", "") = state_dict[key] del state_dict[key] del을 안하면 state_dict 는 OrderedDict 이므로 이전의 module.이 붙은 key들이 안사라지고 새로운 module.안붙은 것이 추가만 되므로 꼭 삭제 해 줘야한다.