스케일업/개발환경

Apple Silicon(M1)에서 Python 환경 제대로 설정

gamz 2023. 9. 1. 00:41

문제

$ python -c "import tensorflow as tf"
zsh: illegal hardware instruction python

사용하려는 Python 패키지의 Native 코드 아키텍쳐와 현재 컴퓨터 아키텍쳐와 달라 생기는 문제이다. (그런데 그동안 다른 x86 기반 패키지들을 사용할때는 Rosetta 에뮬레이션 통해서 잘 썼었는데, 특히 이 tensorflow 같은 패키지에서 문제가 발생한거보니 보니 CPU쪽이 아니라 GPU 같은 다른 하드웨어를 사용하는 네이티브 코드쪽에서 발생한게 아닌가 추측해본다.)

나 같은 경우는 Intel Chipset 일때 사용하던 brew 가 있었고 그 기반으로 Python 을 셋업해서 쓰고 있던 상황에서, 이를 M1 맥북으로 마이그레이션해서 사용하고 있었기에 Native 코드가 있는 패키지들을 사용할때 현재 아키텍쳐랑 달라 발생했다. 그럴땐 이렇게 하자.

 

M1을 위한 brew 설치

이제는 brew 를 설치하면 알아서 arch 를 판단해서 M1 인 경우는 arm64 기반의 brew 를 설치해준다. 예전 Intel Chipset 일때 brew 는 /usr/local/bin/brew 에 설치되었던터라 M1 용 brew 는 충돌을 피하기 위해 /opt/homebrew/bin/brew 에 설치된다.

$ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

 

하지만 x86 brew 도 버리지 말고 챙기자

M1 이라지만 여전히 Rosetta 를 통해서 x86 계열 코드가 돌아갈 수 있기 때문에 x86 brew 도 같이 셋업해두면 유용하다. 만약 기존에 이미 설치되어있으면 바로 ibrew alias 만 설정해서 사용하면 되고, 아니면 이렇게 설치할 수 있다.

$ cd /usr/local
$ mkdir homebrew && curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew

ibrew alias 설정

$ echo "alias ibrew='arch -x86_64 /usr/local/bin/brew'" >> ~/.zshrc
$ source ~/.zshrc

# 두 brew 를 모두 사용할 수 있음
$ which brew
/opt/homebrew/bin/brew
$ brew --version
Homebrew 4.1.7
$ ✗ which ibrew
ibrew: aliased to arch -x86_64 /usr/local/bin/brew
$ ibrew --version
Homebrew 4.1.7-16-g59cc141
Homebrew/homebrew-core (git revision fc92f5c2c29; last commit 2023-08-31)
Homebrew/homebrew-cask (git revision b069313fe2; last commit 2023-08-31)

 

이제 pyenv 를 설치하자

아마도 brew install pyenv 하면 잘 되어야하는데 안된다는 글도 좀 보인다. 그래서 클래식하게 접근해보면,

$ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
$ cd ~/.pyenv && src/configure && make -C src

그리고 pyenv-virtualenv 플러그인을 깔아주자. (취향에 따라 스킵 가능)

$ git clone https://github.com/pyenv/pyenv-virtualenv.git $(pyenv root)/plugins/pyenv-virtualenv

마지막으로 pyenv 관련 환경변수 및 스타트업 설정을 해주자.

# 아래 내용을 ~/.zshrc 에 추가
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
eval "$(pyenv init --path)"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

 

원하는 버전의 python 을 설치

설치하기 전에 기본적으로 필요한 native library 들이 있어서 먼저 설치해주자.

$ brew install openssl readline sqlite3 xz zlib libb2 gettext

그런 후에 python 을 설치하면,

$ pyenv install 3.11.5
python-build: use openssl from homebrew
python-build: use readline from homebrew
Installing Python-3.11.5...
python-build: use readline from homebrew
python-build: use zlib from xcode sdk
Installed Python-3.11.5 to /Users/gamz/.pyenv/versions/3.11.5

 

문제 없는지 확인

$ pyenv virtualenv 3.11.5 tf-env
$ pyenv activate tf-env
$ pip install tensorflow
$ python
Python 3.11.5 (main, Sep  1 2023, 00:27:20) [Clang 14.0.3 (clang-1403.0.22.14.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> from tensorflow import keras
>>>

잘 되는 것 같다.

 

참고

https://laict.medium.com/install-homebrew-on-macos-11-apple-silicon-630f37a74490
https://laict.medium.com/install-python-on-macos-11-m1-apple-silicon-using-pyenv-12e0729427a9
https://stackoverflow.com/questions/70152525/cannot-install-python-3-10-0-on-m1-apple-silicon-ld-symbols-not-found-for-a
https://github.com/pyenv/pyenv/issues/1529
https://developer.apple.com/metal/tensorflow-plugin/

'스케일업 > 개발환경' 카테고리의 다른 글

Flutter2 for Windows Desktop  (0) 2021.03.24
Git over SSH on Windows  (0) 2021.03.19