본문 바로가기
AI 빅데이터/Python 테크틱과 팁

[Apple M1] Apple 실리콘용 Tensorflow 실행하기

by 마고커 2020. 12. 22.


요 글로 유입이 많아서, 안내 드립니다. Apple에서 M1 Silicon에 맞추어 Tensorflow를 공개했고, 아래 포스팅을 이용하여 설치 가능합니다. 다만, tensorflow_text라든가 일부 패키지는 apple이 지원하지 않아 아직 사용 안되는 듯 합니다.

 

[Apple M1] M1 칩용 Tensorflow 설치 (tistory.com)

 

[Apple M1] M1 칩용 Tensorflow 설치

M1 Air를 사고 아래와 같이 삽질하면 Tensorflow를 설치하는 데 까지는 성공했으나, 성능에서 만족은 느낄 수 없었다. [Apple M1] Apple 실리콘용 Tensorflow 실행하기 높으신 분의 은혜로 출시일에 맞춰 주

magoker.tistory.com

 

------------

 

높으신 분의 은혜로 출시일에 맞춰 주문했고, 오늘 M1 맥북에어를 손에 넣었다(무려 램도 늘려 주셨다). 제일 관심 갔던 것은 아무래도 뉴럴칩으로 머신러닝이 가능하다는 것이었다. 

 

 

Accelerating TensorFlow Performance on Mac

Accelerating TensorFlow 2 performance on Mac

blog.tensorflow.org

Tensorflow for Mac은 현재 Python 3.8하고만 호환되면 Tensorflow 2.4 RC버전으로 제작되어 있다. 최신 버전인 Python 3.9는 호환되지 않으니 굳이 설치하지 말자. M1에는 3.8이 Default로 설치되어 있다. Tensorflow 2.4 정식버전도 출시되어 있지만, Intel용이므로 Rosetta2 상에서 작동한다. 아직까지는 아래 링크에서 시키는 대로 Tensorflow 2.4 RC버전만 설치한다.

 

 

apple/tensorflow_macos

TensorFlow for macOS 11.0+ accelerated using Apple's ML Compute framework. - apple/tensorflow_macos

github.com

핵심만 요약하면 아래 명령어만 수행하면된다.

 

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/apple/tensorflow_macos/master/scripts/download_and_install.sh)"

 

수행 마지막 부분에 Virtual Environment 이름을 지정할 것을 묻는데, Default(tensorflow_macos_venv)로 두었다. 가상 환경을 아래와 같이 실행하고 Python3를 실행한 후 Tensorflow가 제대로 설치되었는 지 확인한다.

 

my macbook % source tensorflow_macos_venv/bin/activate 
(tensorflow_macos_venv) my macbook % python3
Python 3.8.2 (default, Nov  4 2020, 21:23:28) 
[Clang 12.0.0 (clang-1200.0.32.28)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
>>> print(tf.__version__)
2.4.0-rc0

 

정상적으로 설치되었다. 콘솔에서 작업할 수 없으니 Jupyter Lab을 설치하자. 원인은 모르겠으나, 유저모드로 설치되지 않아 sudo로 설치하였다.

 

sudo -H pip3 install jupyterlab

 

가상환경에서  jupyter lab을 수행해서 tensorflow를 import하면 'no module named : tensorflow' 에러가 발생한다. 가상환경과 jupyter의 python executable이 달라서 발생하는 문제인데, 아래 명령어를 수행하여 jupyter kernel을 추가한 후, jupyter lab에서 해당 kernel을 선택하면 정상적으로 import 된다.

 

python3 -m ipykernel install --user --name tensorflow_macos_venv --display-name “tensorflow_m1”

아쉬운 점은 gcc로 작성된 pandas나 seaborn 같은 패키지들은 아직 설치/사용할 수 없다는 것이다. 물론 rosetta2를 이용해 intel emulation으로 python을 실행하면 되지만, m1의 GPU를 활용할 수 없기 때문에 여기서는 언급하지 않는다. 단, rosetta2를 이용해도 18년 맥북프로 대비 70%의 성능향상이 있다는 이야기가 있다(CPU가 빨라져서겠지).

 

내친김에 mnist 모델을 테스트해 본다.

 

import tensorflow as tf
print(tf.__version__)

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

from tensorflow.python.compiler.mlcompute import mlcompute
mlcompute.set_mlc_device(device_name='gpu')

import numpy as np
from numpy import unique
from numpy import argmax
from tensorflow.keras.datasets.mnist import load_data
from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, Conv2D, MaxPool2D, Flatten,Dropout
import time

(trainX, trainy), (testX, testy) = tf.keras.datasets.mnist.load_data(
    path='mnist.npz'
)

print('Train: X=%s, y=%s' % (trainX.shape, trainy.shape))
print('Test: X=%s, y=%s' % (testX.shape, testy.shape))

trainX = trainX.reshape((trainX.shape[0], trainX.shape[1], trainX.shape[2], 1))
testX = testX.reshape((testX.shape[0], testX.shape[1], testX.shape[2], 1))

in_shape = trainX.shape[1:]
in_shape

n_classes = len(unique(trainy))
n_classes

# Normalize
trainX = trainX.astype('float32') / 255.0
testX = testX.astype('float32') / 255.0

# Create CNN Model
model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', kernel_initializer='he_uniform', input_shape=in_shape))
model.add(MaxPool2D((2, 2), strides=(2,2)))
model.add(Conv2D(32, (2, 2), activation='relu', kernel_initializer='he_uniform', input_shape=in_shape))
model.add(MaxPool2D((2, 2), strides=(2,2)))
model.add(Flatten())
model.add(Dense(500, activation='relu', kernel_initializer='he_uniform'))
# model.add(Dropout(0.5))
model.add(Dense(n_classes, activation='softmax'))

model.summary()

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

start_time = time.time()
model.fit(trainX, trainy, epochs=10, batch_size=128, verbose=1)
elapsed_time = time.time() - start_time

print(f"Time: {elapsed_time}")

# Evaluate
loss, acc = model.evaluate(testX, testy, verbose=0)
print('Accuracy: %.3f' % acc)

 

이상하게도 gpu로 수행할 때 94초, cpu로 수행하면 66초가 소요되었다. 1080ti 만큼의 학습 속도를 보인다고 한 말은 특수한 상황인 것인가. 그 말만 믿고 16GB로 업그레이드 한 것인데. ㅠ 참고로 Google Colab으로 동일 내용을 수행했을 때 불과 23초만 소요(Tesla T4)되었다. 머신러닝/딥러닝 공부에는 그저 colab이 답이다. 로컬 머신에 투자하지 말자. 흑 ㅠ



댓글