본문 바로가기
etc

Mac(맥) M1에 Miniforge로 Python(파이썬), Tensorflow 설치하고 GPU 사용하기

들어가기 전

homebrew 설치

만약 homebrew를 설치하지 않았다면 Homebrew 사이트를 통해 간단히 설치 할 수 있다.

xcode-select 설치

xcode-select --install

1. Miniforge 설치 (Apple Silicon)

homebrew 를 이용한 설치

brew install miniforge

많은 블로그 및 문서를 보면 homebrew를 통해 설치하면 된다 했는데 나의 경우 이상하게 brew install miniforge 를 할 경우 x86버전이 설치되어 나중에 tensorflow가 제대로 설치되지 않아 개인적으로 다음 방법을 이용하는 것을 추천한다.

sh파일을 통한 설치

Miniforge3-MacOSX-arm64.sh 해당 파일을 설치 후 파일을 설치한 경로에서 다음의 명령어를 수행한다.

chmod +x ~/Downloads/Miniforge3-MacOSX-arm64.sh
sh ~/Downloads/Miniforge3-MacOSX-arm64.sh
source ~/miniforge3/bin/activate

Miniforge 설치 확인

conda의 platform이 arm64인지 확인하기

conda info

2. Python, Tensorflow 설치

yaml 파일을 이용한 설치

yaml 파일은 아래와 같이 작성한다.

# tesnsorflow-apple.yml
name: tensorflow

dependencies:
    - python=3.9 #원하는 경우 3.8
    - pip>=19.0
    - jupyter
    - apple::tensorflow-deps==2.5.0
    - scikit-learn
    - scipy
    - pandas
    - pandas-datareader
    - matplotlib
    - pillow
    - tqdm
    - requests
    - h5py
    - pyyaml
    - flask
    - boto3
    - pip:
        - tensorflow-macos==2.5.0
        - tensorflow-metal==0.1.2
        - bayesian-optimization
        - gym
        - kaggle

가상환경 생성

conda env create -f tensorflow-apple.yml -n tensorflow

가상환경 실행

conda activate tensorflow

3. 환경 테스트

버전 확인

# test_environment.py

import sys

import tensorflow.keras
import pandas as pd
import sklearn as sk
import tensorflow as tf

print(f"Tensor Flow Version: {tf.__version__}")
print(f"Keras Version: {tensorflow.keras.__version__}")
print()
print(f"Python {sys.version}")
print(f"Pandas {pd.__version__}")
print(f"Scikit-Learn {sk.__version__}")
gpu = len(tf.config.list_physical_devices('GPU'))>0
print("GPU is", "available" if gpu else "NOT AVAILABLE")

Tensorflow GPU 테스트

# test_gpu.py

import tensorflow_datasets as tfds
import tensorflow as tf

from tensorflow.python.framework.ops import disable_eager_execution
disable_eager_execution()

(ds_train, ds_test), ds_info = tfds.load(
    'mnist',
    split=['train', 'test'],
    shuffle_files=True,
    as_supervised=True,
    with_info=True,
)

def normalize_img(image, label):
  """Normalizes images: `uint8` -> `float32`."""
  return tf.cast(image, tf.float32) / 255., label

batch_size = 128

ds_train = ds_train.map(
    normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)
ds_train = ds_train.cache()
ds_train = ds_train.shuffle(ds_info.splits['train'].num_examples)
ds_train = ds_train.batch(batch_size)
ds_train = ds_train.prefetch(tf.data.experimental.AUTOTUNE)


ds_test = ds_test.map(
    normalize_img, num_parallel_calls=tf.data.experimental.AUTOTUNE)
ds_test = ds_test.batch(batch_size)
ds_test = ds_test.cache()
ds_test = ds_test.prefetch(tf.data.experimental.AUTOTUNE)


model = tf.keras.models.Sequential([
  tf.keras.layers.Conv2D(32, kernel_size=(3, 3),
                 activation='relu'),
  tf.keras.layers.Conv2D(64, kernel_size=(3, 3),
                 activation='relu'),
  tf.keras.layers.MaxPooling2D(pool_size=(2, 2)),
#   tf.keras.layers.Dropout(0.25),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
#   tf.keras.layers.Dropout(0.5),
  tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(
    loss='sparse_categorical_crossentropy',
    optimizer=tf.keras.optimizers.Adam(0.001),
    metrics=['accuracy'],
)

model.fit(
    ds_train,
    epochs=5,
    validation_data=ds_test,
)

실행되는 동안 활성상태를 통해 GPU를 사용하는 것을 알 수 있다.

References


🏋🏻 개인적으로 공부한 내용을 기록하고 있습니다. 
    잘못된 부분이 있다면 과감하게 지적해주세요!!  🏋

댓글