7 minute read

Day 1

  • 학습 강의 : PyTorch 1 ~ 3강
  • 과제 : [필수과제] Custom Model 개발하기

1. 강의 복습

PyTorch

1강 : Introduction to PyTorch

  • PyTorch와 TensorFlow의 차이점 :
    • PyTorch는 Define by Run(Dynamic Computational Graph, DCG) 방식으로 실행을 하면서 그래프를 생성한다. 논문을 쓰거나 개발 중일 때 용이하다.
    • TensorFlow는 Define and Run 방식으로 그래프를 먼저 정의하고 실행 시점에 데이터를 feed한다. 개발 후 배포할 때 용이하다.


2강 : PyTorch Basics

  • PyTorch의 연산의 장점은 Numpy + AutoGrad에 있다.
  • torch.FloatTensor()로 Tensor를 생성할 수 있다.
  • list나 ndarray를 사용하여 Tensor를 생성할 수도 있다. ndarray의 경우 torch.from_numpy(nd_array) 형식으로 생성 가능
  • view, squeeze, unsqueeze 등으로 tensor의 차원을 조정할 수 있다.
  • 행렬곱셈 연산은 dot이 아닌 mm을 사용, mm은 matmul과 달리 broadcasting을 지원하지 않는다.
  • backward 함수를 사용해 자동 미분이 가능하다.
    a = torch.tensor([2., 3.], requires_grad = True)
    b = torch.tensor([6., 4.], requires_grad = True)
    Q = 3*a**3 - b**2
    external_grad = torch.tensor([1., 1.])
    Q.backward(gradient = external_grad)
    a.grad 
    >>> tensor([36., 81.])
    b.grad
    >>> tensor([-12., -8.])
    


3강 : PyTorch 프로젝트 구조 이해하기

  • 프로젝트 템플릿 이용하기
  • 코랩을 ssh로 연결하여 vscode로 작업환경 세팅하기(ngrox 이용)


2. 새로 알게된 내용 / 고민한 내용 (강의, 과제, 퀴즈)

  • 필수 과제를 통해 torch 모듈에 존재하는 여러 수학적 연산, indexing에 대해 공부했고 특히 gather함수의 실습을 통해 Tensor의 dim에 따른 연산을 더 잘 이해할 수 있었다.
  • hook에 대한 개념을 배웠고 이를 forward, backward 함수에 적용하는 것을 배웠다.
  • apply에 대해서 배웠고 hook을 이용해 forward함수에 변화를 줄 수 있다는 것을 알게 되었다.

3. 참고할 만한 자료

4. 피어세션

  • 문석암 캠퍼님의 github의 pull request에 대한 설명과 적용 과정
  • 이예빈 캠퍼님의 당일 강의 요약
  • 자세한 내용은 Peer Session 참조


Day 2

  • 학습 강의 : DL Basic 4 ~ 5강
  • 과제 : [필수과제] Custom Dataset 과제

1. 강의 복습

PyTorch

4강 : AutoGrad & Optimizer

  • 하나의 Layer를 하나의 레고블럭으로 생각하면 편하다. 결국 딥러닝 모델은 각각의 레고블럭을 정의하고 이러한 레고블럭들을 연결시킨 것이다. (블록 반복의 연속)
  • torch.nn.Module은 딥러닝을 구성하는 Layer의 base class이다.
    • 기본적으로 Input, Output, Forward, Backward, 그리고 학습의 대상이 되는 parameter(tensor)를 정의한다.
  • nn.Parameter(Tensor 객체의 상속객체)를 통해 학습의 대상이 되는 parameter를 정의한다.
    • *nn.module 내에서 attribute가 될 때에는 required_grad = True로 지정해서 학습의 대상이 된다.
    • 대부분의 layer에서는 weight 값들이 지정되어 있다.
  • backward 함수를 통해 layer에 존재하는 parameter들의 미분을 진행(loss function 미분)
  • optimizer.zero_grad()를 이용해 이전의 gradient 값이 현재의 gradient 계산에 영향을 주는 것을 제거하기 위해 초기화


5강 : Dataset & Dataloader

  • Dataset class의 getitem() method를 이용해 하나의 데이터를 불러올 때 반환하는 방식을 결정한다.
  • Data 형태에 따라 Dataset class의 각 함수를 다르게 정의해야 한다.
  • DataLoader는 Data의 Batch를 생성해주는 클래스
  • collate_fn은 Variable length를 정의해주고 padding을 해줄 때 많이 사용한다.(시퀀스 데이터 처리)


2. 새로 알게된 내용 / 고민한 내용 (강의, 과제, 퀴즈)

  • 필수 과제를 통해 Dataset class와 DataLoader class의 여러 파라미터와 적용 방법 등을 배웠다.
  • transform class를 통해 이미지를 tensor로 바꿀 수 있고 이미지의 Data Augumetation 할 수 있다.
  • Custom Dataset을 만드는 연습을 했고 이 과정에서 pandas를 다시 복습하였고 tqdm에 대해 알게 되었다.
    • init, len, getitem method를 정의하면서 각 method의 역할과 데이터 셋을 불러오고 전처리하여 처리하는 과정을 직접 실습하면서 배울 수 있었다.
  • torch에서 지원해주는 여러 Dataset에 대해 살펴볼 수 있었다.(MNIST, AG_NEWS 등)

3. 참고할 만한 자료

4. 피어세션

  • 1일차 필수과제에 대한 질의응답
  • 문석암 캠퍼님의 당일 강의 요약
  • 1일차 알고리즘 문제 풀이 코드 리뷰
  • 자세한 내용은 Peer Session 참조


Day 3

  • 학습 강의 : DL Basic 6 ~ 7강
  • 과제 : [선택과제] Transfer Learning + Parameter Tuning

1. 강의 복습

PyTorch

6강 : 모델 불러오기

  • 최근 AI의 트렌드는 Backbone이라고 하는 기본적인 모델(이미 학습되어 있는)을 가져와 원하는 데이터를 학습시키는 것이 대세이다. -> fine tuning이라고 불린다.
  • 학습의 결과를 저장할 필요가 있기 때문에 PyTorch에서는 model.save()라는 함수를 지원해준다.
    • 모델 형태(architecture)와 paramter를 저장
    • 학습 중간 과정의 저장을 통해 최선의 결과 모델 선택(Early stopping)
  • model.state_dict() : 모델의 paramter를 표시, torch.save(model.state_dict(), os.paht.join(MODEL_PATH, "model.pt")) 형식으로 모델 parameter 저장, model.load_state_dict(torch.load(...)) 형식으로 parameter를 같은 형태의 모델에 load
  • torch.save(model, …)은 모델 형태 저장, torch.load(…)은 모델 형태 load -> pickle 형태로 저장
  • checkpoints : 학습의 중간 결과를 저장하여 최선의 결과를 선택
    • epoch, loss, metric을 함께 저장하여 확인
    • colab에서 지속적인 학습을 위해 필요
  • Transfer learning : 다른 데이터셋으로 만든 모델을 현재 데이터에 적용
    • 대용량 데이터셋으로 만든 모델의 경우 성능이 좋기 때문에 이를 활용
    • 현재 딥러닝에서 가장 일반적인 학습 방법이다.
    • TorchVison이나 NLP의 경우 HuggingFace에서 모델을 지원
  • Freezing : pretrained model 활용 시 모델 일부분의 parameter를 변경하지 못하게 하는 것(requires_grad = False로 바꿔준다.)


7강 : Monitoring tools for PyTorch

  • 학습 모터닝 도구에는 Tensorboard, weight & biases 등이 있다.(시각화 도구)
  • Tensorboard
    • scalar : matric(Acc, Loss) 등 상수 값의 연속(epoch)을 표시
    • graph : 모델의 computational graph 표시
    • histogram : weight 등 값의 분포를 표시
    • image : 예측 값과 실제 값을 비교 표시
    • mesh : 3d 형태의 데이터를 표형하는 도구
  • torchvision.utils.make_grid(image)를 사용하면 image grid를 생성해준다.
  • weight&biases : MLops 도구 중 하나로 볼 수 있다.
    • 협업, code versioning, 실험 결과 기록 등을 제공


2. 새로 알게된 내용 / 고민한 내용 (강의, 과제, 퀴즈)

  • 딥러닝의 학습 방법은 Transfer learning이 가장 대세이다.
  • 모델을 불러오고 fine tuning을 하는 방법, Freezing에 대한 개념을 배웠다.
  • 학습 중간 결과를 확인하기 위해 Tensorboard, weight & bias 등의 도구를 사용한다. 시각화 도구를 이용함으로써 좀 더 편하게 paramter 값의 변화를 histogram으로 살펴볼 수 있고 이를 공유하기도 쉽다.

3. 참고할 만한 자료

4. 피어세션

  • 김다인 캠퍼님의 강의 요약 및 캐글 간단 설명
  • 필수과제 1, 2에 대한 질의 응답
  • Attention Is All You Need 가볍게 읽어보기
  • 차주 강의요약 발표자 선정
  • 자세한 내용은 Peer Session 참조


Day 4

  • 학습 강의 : PyTorch 8 ~ 10강
  • 과제 : [선택과제] Transfer Learning + Parameter Tuning

1. 강의 복습

PyTorch

8강 : Multi-GPU 학습

  • Node는 한 대의 컴퓨터를 말한다. ex) Single Node Single GPU라는 것은 1대 컴퓨터 내 1개의 GPU를 말한다.
  • Multi GPU를 이용해서 학습하는 방법에는 Model parallel, Data parallel이 있다.
  • Model parallel는 모델의 병목, 파이프라인의 문제점 등이 존재한다.
  • Data parallel은 데이터를 나눠 GPU에 할당하고 각 결과의 평균을 취한다.
    • DataParallel : 단순히 데이터를 분배하고 평균을 취함 -> GPU 사용 불균형 문제, Batch 사이즈 감소(한 GPU가 병목), GIL(
      • DistributedDataParallel : 각 CPU마다 process를 생성하여 개별 GPU에 할당
  • torch.nn.DataParallel(model) 을 통해 DataParallel 구현
  • DistributedDataParallel의 경우 torch.utils.data.distributed.DistributedSampler(train data) 형식의 코드를 통해 Sampler를 사용해야 하고 pin_memory = True로 설정해야 한다.


9강 : Hyperparameter Tuning

  • 학습 성능을 높이는 데 가장 큰 요소로 작용하는 부분인 데이터 부분이다(좋은 모델은 이미 고정되어 있기 때문에).
  • 데이터는 많으면 많을수록 좋다. 그 다음이 Hyperparameter Tuning이다.
  • Hyperparameter Tuning의 기본적인 방법은 grid 방식과 random 방식이 있다. 최근에는 베이지안 기반 기법을 많이 사용(BOHB)
  • Ray라는 도구를 이용해 Hyperparameter Tuning을 진행
    • multi-node multi processing을 지원하는 모듈
    • ML/DL의 병렬 처리를 위해 개발된 모듈
    • config에 search space 지정 -> 학습 스케줄링 알고리즘 지정 -> 결과 출력 양식 지정 -> 병렬 처리 양식으로 학습 시행
    • 베이지안 관련 알고리즘을 선택할 수 있고 이를 활용하면 효율적으로 Hyperparameter Tuning가능
  • 학습 과정이 함수로 되어있어야 Ray를 사용할 수 있다.
  • 좋은 데이터가 제일 중요하다!!!


10강 : PyTorch Troubleshooting

  • OOM = Out Of Memory : 왜, 어디서 발생했는지 알기 어려움, 메모리의 이전 상황 파악이 어려움
  • 가장 기본적인 해결법은 Batch size를 줄이고 GPU를 clean하게 하는 것
  • GPUtil을 사용해서 GPU 상태를 확인하기(GPUtil.showUtilization())
  • torch.cuda.empty_cache() 쓰기 : 사용되지 않은 GPU상 cache를 정리하여 가용 메모리를 확보한다. del과는 구분이 필요
    • 학습 시작 전에 코드를 추가하여 이전 학습에 의해 생긴 메모리의 영향을 없앨 수 있다.
  • training loop에 tensor로 축적되는 변수 확인(1-d tensor의 경우 python 기본 객체로 변환하여 처리 -> 메모리에 적층되는 것을 방지)
  • del 명령어를 적절히 사용하기
    • 필요가 없어진 변수 삭제(python의 메모리 배치 특성상 loop이 끝나도 메모리를 차지하기 때문)
  • 가능 batch 사이즈 실험해보기
  • torch.no_grad() 사용하기 : Inference 시점에서 사용(validate나 test할 때)


2. 새로 알게된 내용 / 고민한 내용 (강의, 과제, 퀴즈)

  • 과제를 진행하면서 Pre-trained model을 불러와서 적용하는 과정을 코드를 따라가면서 확인할 수 있었다.
  • Ray에 대한 사용법을 배울 수 있었다.
  • 가장 중요한 것은 모델, 데이터, Hyperparameter tuning 순인데 모델은 좋은 모델이 거의 결정되어 있기 때문에 좋은 데이터가 학습 성능을 좌우한다. 어떻게 하면 좋은 데이터를 만들고 수집할 지가 가장 중요한 부분인 것 같다. Hyperparameter tuning은 마지막 단계에서 작은 수치만큼의 성능을 높일 때 사용하자!

3. 참고할 만한 자료

4. 피어세션

  • 팀회고를 진행했다.
  • 김현욱 캠퍼님의 강의 요약
  • 자세한 내용은 Peer Session 참조


주간 회고

  1. PyTorch 과제를 수행하는 과정에서 많은 배움을 얻었고 좋은 모델은 무엇인가, 좋은 데이터란 무엇이고 어떻게 만들 것인가에 대한 고민을 가지게 되었다. 모델, 데이터의 기본 개념조차 헷갈렸던 처음과 비교하면 많이 발전하고 있는 게 느껴져서 뿌듯하다.
  2. 오피스 아워 시간을 통해 과제를 만드신 멘토님들의 출제 의도를 들으면서 인공지능 학습 과정의 flow를 좀 더 파악하는 시간이 되었다. 과제를 스스로 다 해결하긴 했지만 솔루션을 함께 보면서 복습하는 게 많은 도움이 될 것 같다. 뿐만 아니라 지난 주 과제를 할 때 이해하지 못한 상태에서 제출을 했는데 다시 한 번 복습하면 얻는 것이 많을 것 같다.
  3. 지난 주에 비해서 학습 정리도 제 때 다 진행해서 나름 계획했던 걸 지킨 주가 된 것 같다.(마지막날이 밀리긴 했지만 …) 지금처럼만 꾸준하게 할 일 해나가자!!!
  4. 라이엇게임즈 CTO 님의 개발자의 자세와 TDD에 대한 특강이 있었다. 한 줄의 코드를 짤 때도 항상 가독성을 생각하고 필요없는 부분이 있는지 생각해야 한다고 다짐했다.
  5. 최성철님의 마스터 클래스 또한 유익한 강의였다. MLops에 대한 것들을 알려주시면서 결국 엔지니어로서 성공하기 위해서는 AI 뿐만 아니라 데이터베이스, 리눅스, 도커, 쿠버네티스 등 다양한 분야의 능력을 기르는 것이 중요하다고 알려주셨다. 부스트코스를 잘 수료하고 난 뒤 언급한 내용들을 공부해서 엔지니어로서의 역량을 높여야 겠다. 당장은 부스트코스 따라가기도 벅찬 수준…