[Boostcamp AI Tech] 3주차 Day 4 학습 기록

bluegun·2021년 8월 20일
0

AI Tech 2기 활동

목록 보기
14/87

학습 내용

모델 불러오기(fine tuning)

  • 기존에 만들어진 모델을 가져와 내 데이터에 맞게 수정해서 학습하는 것이 일반적이다.

  • 학습 결과를 지속적으로 저장할 필요가 있다

    • 남들에게 공유, 특정 환경(colab)에서 학습 내용 증발 방지
  • model.save()

    • 모델 architecture와 parameter를 저장할 수 있다.
    • Early-stopping에 이용 가능, 외부 공유 가능
  • colab에서 dataset을 받을 땐 google drive mount를 쓰는 쪽이 시간이 절약된다.

  • Transfer learning

    • 대용량 데이터로 만든 모델을 가져와 적용하면, 성능이 높게 나온다.

    • 가져온 모델을 일부 변경하여 사용

      • 데이터 형식 맞추기, 마지막 예측 부분만 따로 학습하는 등
    • Freezing : pretrained model을 가져올 때, frozen 된 부분을 지정할 수 있으며, 이 부분은 파라미터가 변화하지 않는다.

Training monitoring 도구

  • 학습 시간이 길어 중간에 잘못 학습되면 시간을 많이 날리게 될 것.

  • Tensorboard, wandb(weight & biases)같은 툴이 존재한다.

  • Tensorboard

    • 학습 그래프, metric, 학습 결과의 시각화를 지원
    • Pytorch도 연결 가능하다
    • scalar, graph, histogram, image, mesh
    • jupyter 내에서 바로 띄우기 가능
  • weight and biases

    • MLOps의 대표적인 툴

Multi-GPU 학습

  • 오늘날 딥러닝 모델은 엄청난 양의 데이터와 파라미터를 갖고 학습을 하기 때문에, 많은 연산량이 필요 -> multi GPU 필수

  • Node : 컴퓨터와 같은 의미로 생각하자

  • n대의 Node에 n개의 GPU를 사용

  • Model parallel, Data parallel

    • model을 둘로 나누거나, Data를 둘로 나누거나
    • AlexNet이 대표적 예시
      • 2개의 GPU 사용, mdoel을 둘로 나눔
    • 각 parallel은 동시에 처리될 수 있어야 한다.(pipeline 구조)
  • Data parallel

    • DataParallel : 데이터를 쪼갠 후 결과를 그대로 평균

      • Data를 각각의 GPU에 쪼갠다
      • 각 GPU는 모델을 하나씩 가진다
      • 각 GPU에서 연산을 실행, 연산한 결과값을 한 곳에 모은다
      • loss가 다 모이면 이에 대해 bp를 구하고 각각의 gpu에 다시 보낸다.
      • 한 곳에 모으므로 GPU 사용 불균형, Batch size 감소(한 곳에 몰린 GPU가 가능한 만큼 맞춰줘야함)
    • DistributedDataParallel

      • GPU만큼 CPU도 각각 할당해줘서, 각각 bp나 loss를 계산 가능

HyperParameter tuning

  • 학습이 잘 안 될 때 할 수 있는 것

    • model 수정
    • data 수정
    • Hyper parameter
  • 모델은 이미 좋은 모델을 알고 있으니 보통 고정되고, 학습에 가장 영향을 미치는 건 데이터이다.

    • Hyperparameter를 수정하는 건 마른 수건 한 번 더 쥐어짜는 느낌..
    • 그래도 성능에 변화를 줄 수 있기 때문에 잘 알아두는 게 좋다
  • Hyperparameter

    • 사람이 직접 지정하는 parameter
      • learning rate, model의 크기, optimizer, ...
  • Grid Layout : 주요 parameter를 일정 간격으로 바꿔가며 잘 되는 걸 찾음

  • Random Layout : random으로 parameter를 바꿔봄

  • 지금은 위 방법보단 Baysian 기법 사용

  • Ray

    • 병렬 처리를 위해 개발, 현재 분산병렬 ML/DL 표준
    • Hyperparameter search를 위한 다양한 기능 제공
    • Ray 사용법을 배워는 두자.
  • 다시 강조하지만 Hyperparameter tuning을 잘한다고 드라마틱하게 성능이 오르지 않는다.

    • 모델, 데이터 최대한 업그레이드 시키고도 더 성능을 올리고 싶을 때 건드리는 걸 추천

Pytorch TroubleShooting

  • Out of memory 문제를 어떻게 관리할까?

    • 왜, 어디서 발생했는지 알기 어렵다..
  • 가장 단순한 방법 : Batch size를 줄이고 GPU clean -> 다시 run 해본다

  • GPUtil

    • GPU의 상태를 보여주는 module
    • GPUtil.showUtilization()
  • torch.cuda.empty_cache()

    • memory cache를 clean 시킴
    • del과는 좀 다름 : del은 del 이후 garbage collector가 완전히 지워야 없어진다.
  • training loop 내의 tensor로 축적되는 변수는 GPU상의 메모리를 사용하며, loop가 누적될 수록 computation graph를 만들며 메모리를 잠식하게 된다.

    • 1번만 사용하는 1-d tensor의 경우 python의 기본 객체로 처리해야함
  • del 명령어 사용

    • python에서는 loop이 끝나도 loop 내부 변수가 메모리를 차지한다.
  • OOM이 발생했다면 batch size를 1로 해서 해본다.

  • torch.no_grad() 사용

    • bp로 인해 메모리가 쌓이는 일이 없음

피어 세션

  • GoogLeNet 발표를 들으며 모델을 이해함(Inception, NIN, 1x1 Convolution 등)

  • 스페셜 피어세션 동안 다른 조와 얘기를 나누며, 스터디나 피어 세션 준비에 관한 여러 얘기를 들을 수 있었다.

멘토링

  • P-stage 기간 동안 대회 협업을 어떻게 할 지, MLOps에 대한 의견을 들을 수 있었다.
    • 대회 때, 초반엔 적절한 모델을 찾는 걸 우선시 하는 게 좋다는 조언을 들었다.
    • MLOps는 장기적으로 공부하면 좋고 관계자들도 관심있어 하지만, 지금 배우기엔 배워야 할 게 많으니 나중에 한다.
  • 팀원들에게 카페 쿠폰(저는 스타벅스 커피와 케잌)을 나눠 주셨다. 감사합니다

공부가 필요한 부분

  • 이번 주 과제로 나온 자료에 나온 내용 전부를 익히고(model, dataset 구성 및 load, parameter search 등) 이를 코드로 볼 수 있고 구현하는 걸 익히는 게 가장 중요하다고 생각한다.

  • 주말에 어떤 해야될 일이 생길 진 모르겠지만, 웬만하면 과제 자료를 다시 보며 핵심을 정리해 블로그에 올려, 대회 및 앞으로에 있어 참고할 가이드처럼 사용하도록 하자.

느낀 점

  • 월요일이 공휴일이어서 4일만 출석한 것인데도 다른 주보다 더 힘들었던 것 같다.

  • 항상 멘탈을 잘 잡는게 제일 중요한 것 같다.(멘탈이나 집중력 흔들리면 책상 앞에 앉아있어도 강의 내용 한 귀로 흘리고 글도 안들어오고..)

  • 3주동안 앞으로 배워야 할 모든 걸 때려박힌 느낌이라 막막하지만, 다짐했던 것처럼 흘린 건 나중에 돌아와 주워 담으면 된다는 마음으로 주울 수 있는 만큼 줍겠다고 생각하고 다음 주를 준비하자.

0개의 댓글