문제
$ 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 |