[Mac] Setup M1 MacBook for Machine Learning

๊น€ํฌ์›ยท2023๋…„ 6์›” 17์ผ
post-thumbnail

๐Ÿ“ANACONDA

Anaconda๋Š” ์ฃผ๋กœ Python๊ณผ R์—์„œ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์™€ ํŒจํ‚ค์ง€ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค. ์ฃผ๋กœ ๊ฐ€์ƒํ™˜๊ฒฝ์„ ๋งŒ๋“ค์–ด์„œ ๊ฐ€์ƒํ™˜๊ฒฝ๋ณ„๋กœ ๋…๋ฆฝ์ ์ธ ํŒจํ‚ค์ง€ ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค.

์•„๋‚˜์ฝ˜๋‹ค ์„ค์น˜ ํ›„ initialize๊ฐ€ ๋œ ์ƒํƒœ์—์„œ ๊ฐ€์ƒํ™˜๊ฒฝ์„ ๋”ฐ๋กœ ๋งŒ๋“ค์ง€ ์•Š์€ ๊ฒฝ์šฐ base ํ™˜๊ฒฝ์ด๋ผ๊ณ  ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

  • base์—์„œ pytorch๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š๊ณ ,

  • A๋ผ๋Š” ๊ฐ€์ƒํ™˜๊ฒฝ์„ ์•„๋‚˜์ฝ˜๋‹ค๋กœ ๋งŒ๋“ค์–ด 1.2.0 ๋ฒ„์ „์˜ pytorch๋ฅผ ์„ค์น˜ํ•˜๊ณ ,

  • B๋ผ๋Š” ๊ฐ€์ƒํ™˜๊ฒฝ์—์„  1.8.0 ๋ฒ„์ „์„ ์„ค์น˜ํ–ˆ์œผ๋ฉด,

์šฐ๋ฆฌ๋Š” base์™€ A, B๋ผ๋Š” ๊ฐ๊ฐ ๋…๋ฆฝ์ ์œผ๋กœ ๋‹ค๋ฅธ ํ™˜๊ฒฝ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๊ฐ๊ฐ์˜ ๊ฐ€์ƒํ™˜๊ฒฝ๋“ค์€ ๊ฐ์ž์˜ ํŒจํ‚ค์ง€ ๋ฒ„์ „์— ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋Š”๋‹ค.
ํŠนํžˆ, ๋”ฅ๋Ÿฌ๋‹ ์—ฐ๊ตฌ์ž์˜ ์ž…์žฅ์—์„  ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ์˜ ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์—†์–ด์„œ๋Š” ์•ˆ๋˜๋Š” ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•œ๋‹ค.

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป Anaconda ์„ค์น˜

โœ๏ธ Anaconda ๋‹ค์šด๋กœ๋“œ

https://www.anaconda.com/ ์—์„œ Mac์— ํ˜ธํ™˜๋˜๋Š” ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›๊ณ , ํŒŒ์ผ์„ ํด๋ฆญํ•˜์—ฌ ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

โœ๏ธ Conda ์„ค์ • ๋ฐ˜์˜ํ•˜๊ธฐ

์„ค์น˜๊ฐ€ ๋๋‚œ ํ›„, conda ๋ช…๋ น์–ด๋ฅผ ์“ฐ๋ ค๊ณ  ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์—๋Ÿฌ๊ฐ€ ๋‚œ๋‹ค.

% conda --help 
zsh: command not found: conda

์•„๋‚˜์ฝ˜๋‹ค ์„ค์น˜ ํด๋”๊ฐ€ ํ™˜๊ฒฝ๋ณ€์ˆ˜์— ์ œ๋Œ€๋กœ ๋“ฑ๋ก๋˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ์ด ๊ฒฝ์šฐ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ ์šฉ์‹œ์ผœ์ค€๋‹ค.

% source ~/.zshrc

ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ ์šฉ ํ›„ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๋ฉด ์ •์ƒ์ ์œผ๋กœ ์ž‘๋™ํ•˜์—ฌ conda ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“PYTORCH

Pytorch๋Š” ํŽ˜์ด์Šค๋ถ์˜ ์ธ๊ณต์ง€๋Šฅ ์—ฐ๊ตฌํŒ€์ด ๊ฐœ๋ฐœํ•œ ํŒŒ์ด์ฌ ๊ธฐ๋ฐ˜ ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Torch์— ๋ฐ”ํƒ•์„ ๋‘๊ณ  ๋งŒ๋“ค์–ด์ง„ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ์ฝ”๋“œ๋ฅผ ๊น”๋”ํ•˜๊ณ  ์ง๊ด€์ ์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์œผ๋ฉฐ, ๊ทธ๋ž˜ํ”„๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ๋™์‹œ์— ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” Define by run ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.
TensorFlow๋Š” ์‹ ๊ฒฝ๋ง์„ ์œ ๊ธฐ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์—†๋‹ค๋Š” ์„ฑ๋Šฅ์˜ ํ•œ๊ณ„๊ฐ€ ์žˆ์ง€๋งŒ, Pytorch๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์—ฐ์‚ฐ ํ•˜๋ฉด์„œ๋„ ์‹ ๊ฒฝ๋ง ์‚ฌ์ด์ฆˆ๋„ ์ตœ์ ์œผ๋กœ ๋™์ž‘์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฐ•์ ์ด ์žˆ๊ณ , ํ•™์Šต ์†๋„๋„ ๋” ๋น ๋ฅด๋‹ค. Pytorch๋Š” Numpy๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ GPU๋ฅผ ์ด์šฉํ•œ ์—ฐ์‚ฐ๋„ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ, ์ตœ๊ทผ ๋”ฅ๋Ÿฌ๋‹ ๊ด€๋ จ ๋…ผ๋ฌธ๋“ค์ด๋‚˜ ์—…๊ณ„์—์„œ๋„ ํ…์„œํ”Œ๋กœ์šฐ๋ณด๋‹ค๋Š” ์—ฐ์‚ฐ๋„ ๊ฐ€๋Šฅํ•˜๊ณ  ์†๋„๋„ ๋น ๋ฅธ Pytorch๋ฅผ ์„ ํ˜ธํ•˜๋Š” ์ถ”์„ธ์ด๋‹ค.

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป Pytorch ์„ค์น˜

โœ๏ธ Pytorch ๋‹ค์šด๋กœ๋“œ

https://pytorch.org/get-started/locally/ ์—์„œ ๋ณธ์ธ์—๊ฒŒ ๋งž๋Š” ๋ฒ„์ „์„ ํƒํ•˜๊ณ  ๋ณต์‚ฌํ•˜์—ฌ ํ„ฐ๋ฏธ๋„์— ๋ถ™์—ฌ ๋„ฃ๋Š”๋‹ค.

# MPS acceleration is available on MacOS 12.3+
% conda install pytorch::pytorch torchvision torchaudio -c pytorch

โœ๏ธ GPU ๊ฐ€์†ํ•˜๊ธฐ (Feat. MPS)

NVIDIA GPU์—์„œ cuda ์žฅ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, Apple Silicon์—์„œ๋Š” mps ์žฅ์น˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. mps๋Š” Apple์˜ Metal Performance Shaders Framework๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถ™์—ฌ์ง„ ์ด๋ฆ„์ด๋‹ค.

ํ˜„์žฌ ์„ค์น˜๋œ PyTorch ๋นŒ๋“œ๊ฐ€ mps backend๋ฅผ ์ง€์›ํ•˜๋Š”์ง€๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™•์ธํ•ด๋ณด์‹ค ์ˆ˜ ์žˆ๋‹ค.

>>> import torch
>>> print(torch.__version__)  # pytorch ๋ฒ„์ „ ํ™•์ธ
>>> print(torch.backends.mps.is_available())  # ํ˜„์žฌ ๊ธฐ๊ธฐ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ MPS ์žฅ์น˜๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธ (= torch.cuda.is_available())
>>> print(torch.backends.mps.is_built())  # ํ˜„์žฌ ์„ค์น˜๋œ PyTorch ๋นŒ๋“œ๊ฐ€ mps backend๋ฅผ ์ง€์›ํ•˜๋Š”์ง€ ํ™•์ธ
2.0.1
True
True

๋งŒ์•ฝ torch.backends.mps.is_built()์˜ ๊ฒฐ๊ณผ๊ฐ€ True๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด, conda ๋˜๋Š” PyTorch๋ฅผ ๋‹ค์‹œ ์„ค์น˜ํ•ด์•ผ ํ•œ๋‹ค.

cuda ์žฅ์น˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ torch.device("mps")์™€ ๊ฐ™์ด mps ์žฅ์น˜๋ฅผ ์ง€์ •ํ•œ ๋’ค, Tensor๋‚˜ ๋ชจ๋ธ์„ ์ด๋™ํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
์•„๋ž˜๋Š” PyTorch ๊ณต์‹ ๋ฌธ์„œ์˜ ์˜ˆ์‹œ ์ฝ”๋“œ์ด๋‹ค.

mps_device = torch.device("mps")

# MPS ์žฅ์น˜์— ๋ฐ”๋กœ tensor๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
x = torch.ones(5, device=mps_device)
# ๋˜๋Š”
x = torch.ones(5, device="mps")

# GPU ์ƒ์—์„œ ์—ฐ์‚ฐ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
y = x * 2

# ๋˜๋Š”, ๋‹ค๋ฅธ ์žฅ์น˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ MPS๋กœ ์ด๋™ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
model = YourFavoriteNet()  # ์–ด๋–ค ๋ชจ๋ธ์˜ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ ๋’ค,
model.to(mps_device)       # MPS ์žฅ์น˜๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.

# ์ด์ œ ๋ชจ๋ธ๊ณผ ํ…์„œ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด GPU์—์„œ ์—ฐ์‚ฐ์ด ์ด๋ค„์ง‘๋‹ˆ๋‹ค.
pred = model(x)

๐Ÿ“TENSORFLOW

TensorFlow๋Š” ๊ตฌ๊ธ€(Google)์—์„œ ๋งŒ๋“ , ๋”ฅ๋Ÿฌ๋‹ ํ”„๋กœ๊ทธ๋žจ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋‹ค. Python์„ ์ตœ์šฐ์„ ์œผ๋กœ ์ง€์›ํ•˜๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ํŽธํ•œ ๊ธฐ๋Šฅ๋“ค์ด ํŒŒ์ด์ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ๋งŒ ๊ตฌํ˜„๋˜์–ด ์žˆ์–ด Python์—์„œ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•˜๋‹ค. TensorFlow๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ์ถ”์ƒํ™”์— ์žˆ๊ณ , ๋””๋ฒ„๊น…๊ณผ ์‹œ๊ฐํ™”์— ๋งค์šฐ ๋Šฅํ•œ ํ”Œ๋žซํผ์ด๋‹ค.

๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป TensorFlow ์„ค์น˜

โœ๏ธ TensorFlow ๋‹ค์šด๋กœ๋“œ

  1. TensorFlow dependencies ์„ค์น˜
conda install -c apple tensorflow-deps
  1. TensorFlow ์„ค์น˜
python -m pip install tensorflow-macos
  1. TensorFlow-Metal (GPU framework) ์„ค์น˜
python -m pip install tensorflow-metal

TensorFlow ์„ค์น˜๋Š” ์™„๋ฃŒํ•˜์˜€๊ณ , ์ œ๋Œ€๋กœ ์„ค์น˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

import tensorflow as tf
print("Num GPUs Available: ", len(tf.config.experimental.list_physical_devices('GPU')))

๋‹ค์Œ๊ณผ ๊ฐ™์€ OUTPUT์ด ๋‚˜์˜ค๋ฉด GPU๊ฐ€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Num GPUs Available: 1

GPU๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ชจ๋ธ์˜ ํ•™์Šต์„ ๋” ๋น ๋ฅด๊ฒŒ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€