Anaconda๋ ์ฃผ๋ก Python๊ณผ R์์ ํจํค์ง ๊ด๋ฆฌ์ ํจํค์ง ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํด์ ์ฌ์ฉํ๋ค. ์ฃผ๋ก ๊ฐ์ํ๊ฒฝ์ ๋ง๋ค์ด์ ๊ฐ์ํ๊ฒฝ๋ณ๋ก ๋
๋ฆฝ์ ์ธ ํจํค์ง ๋ฒ์ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค๋ ์ฅ์ ์ด ์๋ค.
์๋์ฝ๋ค ์ค์น ํ initialize๊ฐ ๋ ์ํ์์ ๊ฐ์ํ๊ฒฝ์ ๋ฐ๋ก ๋ง๋ค์ง ์์ ๊ฒฝ์ฐ base ํ๊ฒฝ์ด๋ผ๊ณ ํํํฉ๋๋ค.
base์์ pytorch๊ฐ ์ค์น๋์ด ์์ง ์๊ณ ,
A๋ผ๋ ๊ฐ์ํ๊ฒฝ์ ์๋์ฝ๋ค๋ก ๋ง๋ค์ด 1.2.0 ๋ฒ์ ์ pytorch๋ฅผ ์ค์นํ๊ณ ,
B๋ผ๋ ๊ฐ์ํ๊ฒฝ์์ 1.8.0 ๋ฒ์ ์ ์ค์นํ์ผ๋ฉด,
์ฐ๋ฆฌ๋ base์ A, B๋ผ๋ ๊ฐ๊ฐ ๋
๋ฆฝ์ ์ผ๋ก ๋ค๋ฅธ ํ๊ฒฝ์ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๊ฐ๊ฐ์ ๊ฐ์ํ๊ฒฝ๋ค์ ๊ฐ์์ ํจํค์ง ๋ฒ์ ์ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
ํนํ, ๋ฅ๋ฌ๋ ์ฐ๊ตฌ์์ ์
์ฅ์์ ๋ค์ํ ํ๋ก์ ํธ์ ์ฝ๋๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ์์ด์๋ ์๋๋ ์ค์ํ ์ญํ ์ ํ๋ค.
https://www.anaconda.com/ ์์ Mac์ ํธํ๋๋ ํ์ผ์ ๋ค์ด๋ฐ๊ณ , ํ์ผ์ ํด๋ฆญํ์ฌ ์ค์น๋ฅผ ์งํํ๋ค.
์ค์น๊ฐ ๋๋ ํ, conda ๋ช ๋ น์ด๋ฅผ ์ฐ๋ ค๊ณ ํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์๋ฌ๊ฐ ๋๋ค.
% conda --help
zsh: command not found: conda
์๋์ฝ๋ค ์ค์น ํด๋๊ฐ ํ๊ฒฝ๋ณ์์ ์ ๋๋ก ๋ฑ๋ก๋์ง ์์๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋ฌธ์ ์ด๋ค. ์ด ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ํตํด ํ๊ฒฝ๋ณ์๋ฅผ ์ ์ฉ์์ผ์ค๋ค.
% source ~/.zshrc
ํ๊ฒฝ๋ณ์ ์ ์ฉ ํ ๋ค์ ์คํํ๋ฉด ์ ์์ ์ผ๋ก ์๋ํ์ฌ conda ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ค.

Pytorch๋ ํ์ด์ค๋ถ์ ์ธ๊ณต์ง๋ฅ ์ฐ๊ตฌํ์ด ๊ฐ๋ฐํ ํ์ด์ฌ ๊ธฐ๋ฐ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Torch์ ๋ฐํ์ ๋๊ณ ๋ง๋ค์ด์ง ํ๋ ์์ํฌ์ด๋ค. ์ฝ๋๋ฅผ ๊น๋ํ๊ณ ์ง๊ด์ ์ผ๋ก ์์ฑํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ผ๋ฉฐ, ๊ทธ๋ํ๋ฅผ ๋ง๋ค๋ฉด์ ๋์์ ๊ฐ์ ํ ๋นํ๋ Define by run ๋ฐฉ์์ ์ฌ์ฉํ๋ค.
TensorFlow๋ ์ ๊ฒฝ๋ง์ ์ ๊ธฐ์ ์ผ๋ก ๋ง๋ค ์ ์๋ค๋ ์ฑ๋ฅ์ ํ๊ณ๊ฐ ์์ง๋ง, Pytorch๋ ๋ฉ๋ชจ๋ฆฌ์์ ์ฐ์ฐ ํ๋ฉด์๋ ์ ๊ฒฝ๋ง ์ฌ์ด์ฆ๋ ์ต์ ์ผ๋ก ๋์์ํฌ ์ ์๋ค๋ ๊ฐ์ ์ด ์๊ณ , ํ์ต ์๋๋ ๋ ๋น ๋ฅด๋ค. Pytorch๋ Numpy๋ฅผ ๋์ฒดํ ์ ์์ผ๋ฉฐ GPU๋ฅผ ์ด์ฉํ ์ฐ์ฐ๋ ๊ฐ๋ฅํ๋ฏ๋ก, ์ต๊ทผ ๋ฅ๋ฌ๋ ๊ด๋ จ ๋
ผ๋ฌธ๋ค์ด๋ ์
๊ณ์์๋ ํ
์ํ๋ก์ฐ๋ณด๋ค๋ ์ฐ์ฐ๋ ๊ฐ๋ฅํ๊ณ ์๋๋ ๋น ๋ฅธ Pytorch๋ฅผ ์ ํธํ๋ ์ถ์ธ์ด๋ค.
https://pytorch.org/get-started/locally/ ์์ ๋ณธ์ธ์๊ฒ ๋ง๋ ๋ฒ์ ์ ํํ๊ณ ๋ณต์ฌํ์ฌ ํฐ๋ฏธ๋์ ๋ถ์ฌ ๋ฃ๋๋ค.

# MPS acceleration is available on MacOS 12.3+
% conda install pytorch::pytorch torchvision torchaudio -c pytorch
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๋ ๊ตฌ๊ธ(Google)์์ ๋ง๋ , ๋ฅ๋ฌ๋ ํ๋ก๊ทธ๋จ์ ์ฝ๊ฒ ๊ตฌํํ ์ ์๋๋ก ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค. Python์ ์ต์ฐ์ ์ผ๋ก ์ง์ํ๋ฉฐ ๋๋ถ๋ถ์ ํธํ ๊ธฐ๋ฅ๋ค์ด ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก๋ง ๊ตฌํ๋์ด ์์ด Python์์ ๊ฐ๋ฐํ๋ ๊ฒ์ด ํธํ๋ค. TensorFlow๋ฅผ ์ฌ์ฉํ๋ ๊ฐ์ฅ ํฐ ์ฅ์ ์ ์ถ์ํ์ ์๊ณ , ๋๋ฒ๊น
๊ณผ ์๊ฐํ์ ๋งค์ฐ ๋ฅํ ํ๋ซํผ์ด๋ค.
conda install -c apple tensorflow-deps
python -m pip install tensorflow-macos
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๋ฅผ ์ด์ฉํ์ฌ ๋ชจ๋ธ์ ํ์ต์ ๋ ๋น ๋ฅด๊ฒ ์งํํ ์ ์๋ค.