딥러닝과 Pytoch 기초 온라인강의

Nary Kim·2024년 7월 3일
0

Upstage AI lab 3기

목록 보기
10/17
post-thumbnail

딥러닝의 역사부터 원리까지 조근조근 설명해 주어서 좋은 강의였다.
온라인 강의의 이점을 살려, 역전파와 손실함수에 대한 수학적 설명도 여러번 돌려보면서 이해할 수 있었다.

1. Deep Learning

딥러닝 발전 5단계 I : 1단계 ~ 3단계
딥러닝 발전 5단계 II : 4단계 ~ 5단계
딥러닝 기술 종류들 I : 학습 방식에 의한 구분
딥러닝 기술 종류들 II : 데이터 형식, 태스크 종류에 의한 구분
딥러닝 개요
모델 학습법 I : 다층 퍼셉트론
모델 학습법 II : 경사 하강법
모델 학습법 III : 역전파 (기초)
모델 학습법 III : 역전파 (심화)
모델 학습법 IV : 손실 함수
모델 학습법 실습
성능 고도화 방법 I : 과적합, 편향과 분산, 지역/전역 최소값, 네트워크 안정화
성능 고도화 방법 II : 가중치 초기화, 규제화, 학습률
성능 고도화 방법 III : 다양한 최적화 알고리즘
성능 고도화 방법 IV : 데이터 증강 및 그 외 방법들
성능 고도화 방법 실습
CNN
RNN

2. Pytorch

파이토치 소개
환경 설정
텐서 조작의 개념
텐서 조작(1)
텐서 조작(2)
딥러닝을 위한 파이토치가 어떻게 동작하는가?
DNN 구현(1)
DNN 구현(2)
DNN 구현(3)
CNN 구현
RNN 구현
전이학습이란?
timm과 Hugging Face을 통한 전이 학습
모니터링을 위한 TensorBoard와 Wandb
디버깅
파이토치 라이트닝 소개
파이토치 코드를 파이토치 라이트닝 코드로 변환하기
하이드라 소개
파이토치 라이트닝과 하이드라

나중에 혼자 공부할 때 찾아볼 수 있게, 목차를 올려둔다.

💡Apple silicon 사용을 위한 설정

공부를 하다가 gpu 사용을 위해 device를 cuda로 설정하는 부분이 있는데, 나는 맥북을 쓰기 때문에 쓸수가 없었다. 그래서 Apple Silicon을 사용할 수 있는 방법을 찾아보았고, 여기에 남겨두려고 한다.

우선 새로운 가상환경을 설정하도록 한다.

>>>conda create -n pytorch_m1 python=3.10
>>>conda activate pytorch_m1
>>>pip install torch torchvision torchaudio --pre

그리고 xcode, Jupyter 및 ipywidgets은 최신버전으로 업데이트한다.

그런 후

device = torch.device("mps" if torch.backends.mps.is_available() else "cpu")

이렇게 device를 설정하면 된다. 그러나 커다란 문제가 하나 있는데, mps를 쓰는 것보다 cpu를 쓰는게 더 빠르다!!
찾아보니 batch 갯수가 많거나, 실습에서 돌렸던 문제보다 더 복잡한 구조를 가져야 mps를 쓸때, 시간의 차이가 난다고 한다.
참고로 실습에서 batch는 32였고, 4개의 레이어를 사용하였으며, 48000개의 데이터를 train했다.

아래에는 cpu보다 gpu가 빨랐던 샘플코드이다.

import time
import torch
import torch.nn as nn
import torch.optim as optim

# 모델 정의
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc = nn.Sequential(
            nn.Linear(2048, 1024),
            nn.ReLU(),
            nn.Linear(1024, 512),
            nn.ReLU(),
            nn.Linear(512, 256),
            nn.ReLU(),
            nn.Linear(256, 128),
            nn.ReLU(),
            nn.Linear(128, 10),
            nn.LogSoftmax(dim=1)
        )
    
    def forward(self, x):
        return self.fc(x)

# 더미 데이터 생성 (배치 크기 증가)
inputs = torch.randn(1024, 2048)
labels = torch.randint(0, 10, (1024,))

# 훈련 함수 정의
def train(device, model, inputs, labels, num_epochs=10):
    model.to(device)
    model.train()

    start_time = time.time()
    
    for epoch in range(num_epochs):
        optimizer.zero_grad()
        outputs = model(inputs)
        loss = criterion(outputs, labels)
        loss.backward()
        optimizer.step()
    
    end_time = time.time()
    return end_time - start_time

# 손실 함수 및 옵티마이저 정의
criterion = nn.NLLLoss()
optimizer = optim.Adam(SimpleNN().parameters(), lr=0.001)

# CPU에서 훈련
cpu_device = torch.device("cpu")
cpu_model = SimpleNN()
cpu_inputs = inputs.to(cpu_device)
cpu_labels = labels.to(cpu_device)
cpu_time = train(cpu_device, cpu_model, cpu_inputs, cpu_labels)
print(f"CPU Training Time: {cpu_time:.2f} seconds")

# MPS에서 훈련
if torch.backends.mps.is_available():
    mps_device = torch.device("mps")
    mps_model = SimpleNN()
    mps_inputs = inputs.to(mps_device)
    mps_labels = labels.to(mps_device)
    mps_time = train(mps_device, mps_model, mps_inputs, mps_labels)
    print(f"MPS Training Time: {mps_time:.2f} seconds")
else:
    print("MPS device is not available.")
profile
나는 무엇이 될것인가!!

0개의 댓글