데이터과학 기초/Python배우기

M1(Apple Silicon)환경에서 Pytorch GPU 가속 사용하기

eigenvector 2022. 7. 16. 12:45
반응형

7월 초 Pytorch 깃헙에서 Pytorch 1.12 를 릴리즈 함에 따라 이제 M1 노트북에서 GPU를 활용한 딥러닝이 가능하게 됐습니다.

 

 

GitHub - pytorch/pytorch: Tensors and Dynamic neural networks in Python with strong GPU acceleration

Tensors and Dynamic neural networks in Python with strong GPU acceleration - GitHub - pytorch/pytorch: Tensors and Dynamic neural networks in Python with strong GPU acceleration

github.com

 

Pytorch를 기준으로 딥러닝을 배웠고, M1을 사용하는 유저에게는 아주 반가운 소식입니다.

 

다만, 맥을 사용한지 얼마 되지 않거나 로컬에서 파이썬을 사용하지 않는 유저에게는 설치가 조금 어려운 부분이 있는데요.

 

오늘은 환경을 어떻게 세팅해야 Pytorch에서 GPU를 사용할 수 있을지 단계별로 알아보도록 하겠습니다.

 


기본 환경 세팅

복잡하게 요구되는 사항은 없지만, 파이토치 공식 페이지의 설치 지원에 따르면 

 

MPS 가속은 맥 OS 12.3 이상에서 지원된다고 언급되어 있기 때문에 몬터레이 12.3 버전 이상의 환경이 필요합니다.

 

설치 방식은 pip와 conda 모두 지원하지만 저 같은 경우 conda를 사용하기 때문에

 

저와 동일하게 conda를 활용해서 설치를 진행해 주시면 되겠습니다.

 

애플 실리콘(M1, M2)를 지원하는 miniconda 혹은 miniforge 저장소에서 파일을 받아 설치를 진행하시면 됩니다.

 

자세한 내용은 conda 설치/환경설정을 설명한 제 포스팅을 참고해 주세요.

 

2022.07.31 - [데이터과학 기초/Python배우기] - conda로 손쉽게 파이썬 환경 관리하자 (Intel부터 M1까지) - 기초

 

위 안내에 따라 애플 실리콘을 지원하는 conda 환경을 설치한 이후, 딥러닝 전용 환경을 새로 생성하면 준비가 끝납니다.

 

(파이썬 버전은 저와 동일하게 python 3.8로 설정하면 되겠습니다)

 

conda create -n dl python=3.8

# 환경 생성 후
conda activate dl

설치 진행

pytorch 설치는 간단히 conda install로 진행하면 됩니다.

 

이 글을 작성하는 시점에서 conda-forge, pytorch 채널 모두 1.12 버전의 pytorch 설치를 지원하고 있기 때문에

 

두 채널 중 본인이 선호하는 채널을 선택하면 쉽게 설치가 가능합니다.

 

* conda-forge를 사용할 경우

 

conda install -c conda-forge pytorch

 

* 만약, torchvsion과 torchaudio를 설치할 경우 pytorch 채널을 사용합니다(2022.07월 기준)

 

conda install -c pytorch pytorch torchvision torchaudio

사용 가능 여부 확인

테스트는 주피터 환경에서 진행했습니다.

 

일단 mps가 현재 환경에서 지원되는지 확인해 봅시다.

 

import torch

print(f"mps 사용 가능 여부: {torch.backends.mps.is_available()}")
print(f"mps 지원 환경 여부: {torch.backends.mps.is_built()}")

mps 사용/지원이 확인됐습니다


테스트 코드

이제 GPU가 사용되는 테스트를 수행해 봅시다. 예제는 간단한 회귀분석 모형으로 결정했습니다.

 

정석적으로는 클래스를 구성하지만, 테스트만 수행할 예정이니 간략한 버전으로 진행하겠습니다.

 

GPU사용의 핵심은 디바이스를 'mps'로 설정하는 것입니다.

 

아래 코드를 천천히 보시면 쉽게 이해하실 수 있습니다.

 

# 추가 모듈 로드
import torch.nn as nn
import time

# torch 데이터 유형, 백엔드 설정
dtype = torch.float
device = torch.device("mps")

# 3개 변수를 가진 다중회귀 모형 샘플 데이터 설정
x = torch.randint(10, (100, 3),device = device, dtype=dtype)
y = torch.randint(100, 200, (100, 1),device = device, dtype=dtype)

# 선형 모델 구성
ml_model = nn.Linear(3,1) # 3x1 (변수 할당)
ml_model.to(device)

# 옵티마이저
optimizer = torch.optim.SGD(ml_model.parameters(), lr = 1e-3)

# epoch 설정
total_epoch = 3000

# 학습 시작
train_start = time.time()
for epoch in range(total_epoch+1):

    # 예측값
    prediction = ml_model(x)

    # 비용 (Class가 아니므로 nn.functional 사용)
    loss = nn.functional.mse_loss(prediction, y)

    # 역전파
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

	# 중간 기록
    if epoch % 100 == 0:
        print(f"Epoch {epoch}/{total_epoch},\t loss : {loss.item()}")
        
train_end = time.time()

# 학습 소요 시간 확인
print()
print(device.type, '학습 소요시간 ',train_end-train_start)

 

코드가 돌아가는 도중, mps 작동 여부를 확인하기 위해 "활성 상태 보기"(응용프로그램->유틸리티 내 존재)"

 

작동시킬 경우, Python이 차지하는 GPU활용 비율이 급격히 상승하는 것을 확인할 수 있습니다.

 


결론

- 이제 M1에서도 GPU를 활용한 Pytorch 학습이 가능해졌다.

- 파라메터 중, 디바이스를 mps로 설정하면 GPU 가속을 사용할 수 있다.

- (보이지 않는) GPU 사용 여부를 확인하려면 "활성 상태 보기" 기능을 쓰면 쉽게 확인 가능하다.

반응형