머신러닝을 맥북으로 처음 배우거나 다른 환경을 사용하다 맥으로 옮기시는 분들은 애플에서 개발하고 그렇게 좋다고 하는 M1 혹은 M2 프로세서를 사용하여 머신러닝을 실행하는 방법에 대해 알고자 하실 것 입니다. 당연히 CPU만 사용하는 것이 아닌 CUDA와 같은 가속화 기능을 활용하는 방법을 원하실 것 입니다. 하지만, 대부분의 머신러닝 코드는 Nvidia 그래픽카드를 사용하는 CUDA를 기준으로 작성되어있기 때문에 코드를 일부 변경해야 애플 컴퓨터에서도 학습 가속화를 활용할 수 있습니다.
이번 포스팅에서는 애플의 M2 프로세서가 내장된 애플 컴퓨터에서 학습 가속화 기능을 이용하는 방법을 소개 드리고자 합니다. M2 프로세서를 기준으로 설명드리긴 하지만 M1 프로세서 역시 동일하게 적용할 수 있을 것 같습니다.
Table of Contents
맥북 파이썬 개발환경 설치
VS Code 설치
맥OS나 리눅스 환경에 익숙하지 않으신 Windows 사용자라면 조금은 생소할 수 있는데, 맥에서는 별도의 설치 없이 앱 파일을 복사하는 것으로 준비가 끝나는 경우가 많습니다.
우선 앱 파일을 VS Code 홈페이지에서 다운받습니다. 맥OS 버전을 클릭하면 zip파일을 다운받게 됩니다.
다운받은 압축파일을 더블클릭 하여 압축해제 하면 앱 파일이 나타납니다. 이대로 실행할 수 있지만, 일반적인 루틴을 따라 Application 폴더로 복사할 것을 추천드립니다.
또, 개발 편의를 위해 VS Code의 Python Extension을 설치하면 좋은데, 이 과정은 이번 포스팅에서는 생략하도록 하겠습니다.
Python 설치
Mac OS에 Python이 기본 설치되어 있는데, 버전을 올리는 등 다른 버전의 Python을 사용하고자 한다면 Python 홈페이지에서 인스톨러를 받아 설치하거나 homebrew라는 패키지 매니저를 이용해 설치할 수 있습니다. 개인적으로는 Python 홈페이지에서 직접 설치하는 것을 추천합니다만, 큰 차이가 있는것은 아닙니다. (설치 경로의 차이)
제가 사용하는 Ventura 13.5 OS에 기본 설치된 버전은 Python 3.9.6 으로 확인되고, 저는 이 버전을 그대로 사용합니다. 혹시 다른 버전을 사용하고자 한다면 아래와 같이 설치할 수 있습니다.
(선택사항) Python 가상환경 Virtual Environment 설치
필수는 아니지만 여러 프로젝트를 하나의 환경으로 개발하다 보면 버전차이 등 호환성의 문제가 발생될 수 있어 저는 항상 venv 설치를 권장합니다. 아래 커맨드로 설치할 수 있고, 아래 이름은 사용하시는 환경과 선호하는 이름에 맞춰 대체하시면 됩니다.
cd {프로젝트 폴더}
python3 -m venv {"사용할 환경 이름"}
가상환경 설치가 완료되면 VS Code에서 Interpreter 선택을 통해 새로 만든 파이썬 환경에서 개발을 진행할 수 있습니다.
PyTorch 설치
파이토치는 일반적으로 CUDA 버전에 맞춰 설치하지만, 맥은 CUDA를 사용하지 않기 때문에 호환성을 따질 것이 사실상 없습니다. 터미널을 열어 아래 커맨드를 실행하면 쉽게 설치하게 됩니다. [출처 링크]
pip3 install --pre torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/nightly/cpu
M2 프로세서 인식 확인하기
설치한 환경에서 애플 M2 프로세서를 인식하고 사용할 수 있는지 확인해 보겠습니다. 원하는 위치에 폴더를 새로 만들고 Python Interpreter를 선택한 후 (가상환경을 만들었다면 이를 선택) 아래 코드를 담을 .py 파일을 생성합니다.
#Test code from https://developer.apple.com/metal/pytorch/
import torch
if torch.backends.mps.is_available():
mps_device = torch.device("mps")
x = torch.ones(1, device=mps_device)
print (x)
else:
print ("MPS device not found.")
문제 없이 설치되고 실행되었다면 아래와 같이 애플 프로세서를 인식했다는 메세지를 확인할 수 있습니다.
tensor([1.], device='mps:0')
학습 테스트하기
애플 프로세서를 인식하는 것 까지는 확인했으니 이제 실제로 학습에 사용할 수 있는지 확인해보도록 하겠습니다. 파이썬 공식 예제코드 중 간단한 MNIST Classification 코드를 실행하며 실제로 가속화 기능이 사용되는지 확인하겠습니다.
우선 [여기]에서 코드를 받아올 수 있습니다. 많은 예제코드가 Numpy를 필요로 하는데, 이 예시는 없어도 돌려볼 수 있습니다.
다음으로, python 파일을 새로 만들고 아래 링크에서 받을 수 있는 아래 코드를 붙여넣고 저장합니다. 이 코드는 자동으로 CUDA 혹은 MPS를 확인하고 자동으로 장치를 선택하도록 이미 구성되어 있어 별도의 파라미터 없이 바로 실행하여 가속화 여부를 확인할 수 있습니다.
가속화를 사용하는 핵심 코드만 짧게 먼저 소개드리자면 이렇습니다. 위 예제에서도 볼 수 있듯 프로그램 실행 초기에 어느 장치를 이용할 것인지 선택하는 변수가 있습니다.
if use_cuda:
device = torch.device("cuda")
elif use_mps:
device = torch.device("mps")
else:
device = torch.device("cpu")
이 예시에서는 범용성을 위해 모두 적어두고 고를 수 있게 짜여져 있지만, 하나의 환경에서만 사용한다면 굳이 모두 적을 필요 없이 한가지만 골라서 정해두고 사용해도 됩니다. 맥북의 경우는 아래와 같은 한줄만 있으면 됩니다.
device = torch.device("mps")
그 뒤, 학습에 사용될 네트워크를 구성할 때 아래와 같이 선택한 장치로 준비시켜두면 학습 시 이 장치를 사용하게 됩니다.
model = Net().to(device) # Net().to("mps") 도 가능
다시 예제코드로 돌아가서, 이 코드를 실행하면 아래와 같이 학습이 시작되는 것을 확인할 수 있습니다.
Train Epoch: 1 [0/60000 (0%)] Loss: 2.300024
Train Epoch: 1 [640/60000 (1%)] Loss: 1.141236
Train Epoch: 1 [1280/60000 (2%)] Loss: 0.711558
Train Epoch: 1 [1920/60000 (3%)] Loss: 0.534700
Train Epoch: 1 [2560/60000 (4%)] Loss: 0.394732
Train Epoch: 1 [3200/60000 (5%)] Loss: 0.266304
Train Epoch: 1 [3840/60000 (6%)] Loss: 0.240142
Train Epoch: 1 [4480/60000 (7%)] Loss: 0.223248
Train Epoch: 1 [5120/60000 (9%)] Loss: 0.607467
Train Epoch: 1 [5760/60000 (10%)] Loss: 0.203784
Train Epoch: 1 [6400/60000 (11%)] Loss: 0.404807
Train Epoch: 1 [7040/60000 (12%)] Loss: 0.216695
Train Epoch: 1 [7680/60000 (13%)] Loss: 0.167440
Train Epoch: 1 [8320/60000 (14%)] Loss: 0.176644
Train Epoch: 1 [8960/60000 (15%)] Loss: 0.251940
Train Epoch: 1 [9600/60000 (16%)] Loss: 0.178195
Train Epoch: 1 [10240/60000 (17%)] Loss: 0.453998
학습이 가속화 기능을 사용하는지 확인할 쉬운 방법으로 아래 두가지가 있습니다.
- CPU 만으로 학습하도록 설정하고 학습 소요시간 비교하기
- 학습하는 과정에서 GPU 사용량 체크하기
첫번째 방법은 코드 내 “mps”를 “cpu”로 바꾸거나 코드를 아래 커맨드로 실행하면 CPU 만 사용하는 학습을 실행시켜 볼 수 있습니다.
python3 python_conv_ex.py --no-mps
시간을 측정하지 않더라도 체감상으로도 MPS를 사용할 때와 비교하여 학습이 느려진 것을 쉽게 확인할 수 있습니다.
두번째 방법은 MacOS의 리소스 모니터를 통해 확인할 수 있습니다. 아래 두 방법 중 하나를 선택하여 ‘Activity Monitor’를 실행합니다.
- Launchpad에서 ‘Activity Monitor’를 검색하고 실행
- Application 폴더 내 Utility 폴더 안에 있는 ‘Activity Monitor’를 실행
기본 설정으로는 GPU 사용량이 표시되지 않습니다. 아래와 같이 [View] – [GPU Processes] 를 클릭하여 이를 항목에 추가합니다. 혹은 Activity Monitor 항목을 우클릭 하여 추가할 수도 있습니다.
이제 Activity Monitor에 [% GPU] 항목이 추가된 것을 확인할 수 있습니다. 뒷쪽에 추가되는데, 마우스 드래그로 원하는 위치로 옮길 수 있습니다.
이제 VS Code로 돌아가 앞서 실행했던 코드를 다시 실행합니다. 이번엔 학습 과정에서 GPU 사용량을 확인해보도록 하겠습니다.
위와 같이 Python 프로세스의 GPU 사용량이 높은 상태를 유지하는 것을 확인할 수 있습니다. 추가로, CPU 만 사용하는 학습시에는 GPU 사용이 없는 것도 확인 가능합니다.
마무리
이번 포스팅에서는 애플 프로세서를 이용해 PyTorch 학습 가속화 기능을 활용하는 방법에 대해 소개해 보았습니다. 이미 예제가 있는만큼 별로 어려운 구현은 아니라 처음 설치만 잘 하면 어렵지 않게 따라해볼 수 있습니다. 다른 코드에 적용도 예제코드의 방법을 이용하면 쉽게 적용하실 수 있을 것 같습니다.
애플 프로세서의 학습 처리속도가 고가의 고사양 NVidia 그래픽카드와 경쟁이 될 만큼 빠른것은 아니면서도 노트북 자체가 비싼 면이 있지만, 데스크탑이 아닌 가벼운 노트북이라는 점을 고려하면 그렇게까지는 무겁지 않은 학습량을 처리하는 정도의 머신러닝 개발을 충분히 매력이 있는 것 같습니다.
감사합니다. mps 잘 잡히네요. 가속 시간 재보고 싶은데, 예제 코드 링크가 끊어진 것 같습니다. 한 번 확인해주실 수 있으신가요?
방문 감사드립니다.
블로그에 문제가 있어서 잠시 링크가 빠졌습니다.
이곳에서 받으실 수 있습니다:
https://github.com/pytorch/examples/tree/main/mnist