ML Frameworks/Pytorch

맥북 프로 m1에서 ML PyTorch파이토치 세팅하기

makeitworth 2022. 11. 7. 09:03

환경

맥북 프로 18, 1 (애플 M1 Pro 칩, 메모리 16GB)

맥 OS (Monterey 12.5.1)

  • 10-core CPU with 8 performance cores and 2 efficiency cores
  • 16-core GPU

prerequisites

파이썬3.7 이상 (그 이상도 잘 지원해줄 것 같지만, 내가 사용하려던 모델의 권장 버전이 3.7이라서 3.7.13으로 설치하여 사용하였다. 맥북 m1에서 파이썬 3.7 이하를 설치하여 사용하는 방법은 다음 포스팅 참고)

가상환경 만들기 (나는 원래 virtualenv를 훨씬 선호하지만, m1에서 파잇썬 3.7 이하를 설치하는데 애로사항이 있어 어쩔 수 없이 pyenv로 가상환경을 만들었다.

파이토치 1.12.0이상 설치하기

python -m pip install torch

작동 테스트

테스트를 위해 주피터 노트북을 새로 만들고 파이토치를 설치한 가상환경을 연결해주었다.

먼저 gpu를 잘 잡아주는지 확인한다. 참고로 PyTorch에서는 TensorFlow와 달리 맥북 gpu의 device name 이 mps라고 한다.

device = torch.device('mps:0' if torch.backends.mps.is_available() else 'cpu')
device

[OUTPUT]

device(type='mps', index=0)

 

잘 잡아주고 있는 것 같다. M1 텐서플로우 테스트를 할 때와 마찬가지로 MNIST로 간단한 테스트를 해보자.

코드는 여기를 참고했고, device 만 cuda에서 mps로 변경하였다.

# import libraries
import torchvision.datasets as dsets
import torchvision.transforms as transforms
import torch.nn.init
# device 설정
device = torch.device('mps' if torch.backends.mps.is_available() else 'cpu')

# 랜덤 시드 고정
torch.manual_seed(777)

# GPU 사용 가능일 경우 랜덤 시드 고정
if device == 'mps':
    torch.cuda.manual_seed_all(777)
# 학습 파라미터 세팅
learning_rate = 0.001
training_epochs = 15
batch_size = 100
#데이터셋 정의
mnist_train = dsets.MNIST(root='MNIST_data/', # 다운로드 경로 지정
                          train=True, # True를 지정하면 훈련 데이터로 다운로드
                          transform=transforms.ToTensor(), # 텐서로 변환
                          download=True)

mnist_test = dsets.MNIST(root='MNIST_data/', # 다운로드 경로 지정
                         train=False, # False를 지정하면 테스트 데이터로 다운로드
                         transform=transforms.ToTensor(), # 텐서로 변환
                         download=True)
# 데이터 로더로 배치 사즈 설정
data_loader = torch.utils.data.DataLoader(dataset=mnist_train,
                                          batch_size=batch_size,
                                          shuffle=True,
                                          drop_last=True)
# 클래스로 모델을 설계
class CNN(torch.nn.Module):

    def __init__(self):
        super(CNN, self).__init__()

        self.layer1 = torch.nn.Sequential(
            torch.nn.Conv2d(1, 32, kernel_size=3, stride=1, padding=1),
            torch.nn.ReLU(),
            torch.nn.MaxPool2d(kernel_size=2, stride=2))
        self.layer2 = torch.nn.Sequential(
            torch.nn.Conv2d(32, 64, kernel_size=3, stride=1, padding=1),
            torch.nn.ReLU(),
            torch.nn.MaxPool2d(kernel_size=2, stride=2))

        self.fc = torch.nn.Linear(7 * 7 * 64, 10, bias=True)

        torch.nn.init.xavier_uniform_(self.fc.weight)

    def forward(self, x):
        out = self.layer1(x)
        out = self.layer2(out)
        out = out.view(out.size(0), -1)   # 전결합층을 위해서 Flatten
        out = self.fc(out)
        return out

# CNN 모델 정의
model = CNN().to(device)
# 비용 함수와 옵티마이저를 정의
criterion = torch.nn.CrossEntropyLoss().to(device) 
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)
# 총 배치의 수
total_batch = len(data_loader)
print('총 배치의 수 : {}'.format(total_batch))

for epoch in range(training_epochs):
    avg_cost = 0

    for X, Y in data_loader: # 미니 배치 단위로 꺼내온다. X는 미니 배치, Y느 ㄴ레이블.
        # image is already size of (28x28), no reshape
        # label is not one-hot encoded
        X = X.to(device)
        Y = Y.to(device)

        optimizer.zero_grad()
        hypothesis = model(X)
        cost = criterion(hypothesis, Y)
        cost.backward()
        optimizer.step()

        avg_cost += cost / total_batch

    print('[Epoch: {:>4}] cost = {:>.9}'.format(epoch + 1, avg_cost))

 

다행히 코드도 잘 돌아가고, 맥의 활성 상태 보기 앱을 확인하면

GPU도 열일을 하고 있다는 것을 알 수 있다.

 

다른 분의 포스팅을 보면 직접 벤치마크 테스트를 했을 때 코랩 프로보다 훨씬 안습한 결과가 나왔다고는 하는데, 요즘 다양한 모델과 플랫폼을 테스트해보는 중인데, 코랩 프로는 매번 dependency 설치하는데 너무 많은 시간이 소요되어 시간 낭비가 심하다는 생각이 들어서 세팅을 해봤다. (매일 출근해서 새로 켜면 1시간 씩 걸리는 것 같음) 기존에 빌딩된 pre-trained model을 활용하는데도 원활하게 쓸 수 있는지 테스트해 볼 필요가 있겠다.

 

 

참고: https://bio-info.tistory.com/184

https://wikidocs.net/63565

https://velog.io/@heiswicked/%EB%8B%88%EB%93%A4%EC%9D%B4-mps%EB%A5%BC-%EC%95%84%EB%8A%90%EB%83%90-Install-PytorchGPU-on-M1-ver.220624