Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

M1 MacBookでの開発環境構築

  • Apple Siliconのネイティブ環境を構築メモ。
  • QEMUの記述が増えてきたので別ページに移動(2019/01/09)
  • 今となっては不要な記述などを削除して整理(2021/01/31)
  • gcc に Fortran からの C関数呼び出しの不具合に fix が入って scipy が小細工なしにインストールできるようになった(2021/02/25)
  • PyTorchのインストール手順を最新のソースツリーからの手順に更新(2021/03/01)
  • TensorFlor for macOSの手順をPython 3.8.8を用いたものに更新(2021/03/05)

Homebrew周り

  • gcc や OpenBLAS,go や Rust などほとんどがARM対応になっていて,/opt/homebrew をベースディレクトリにしている場合は bottle(バイナリ)がインストールされるようになっている(2021/01/02追記)

Homebrew本体

  • intel版は /opt/brew_x86 に,ARM版は /opt/homebrew に入れている。(2021/01/09変更)
  • シェルのバージョンに合わせてパスを変更するように,.zshenv に以下のように記述。これにより,ARMで動いている場合は,まずARM版の実行ファイルを探し,無ければx86_64版を実行,x86_64で動いている場合はARM版は探さないようにする。
.zshenv
 ARCH=$(uname -m)
 if [ "$ARCH" = "arm64" ]; then
   export BREWx86_BASE=/opt/brew_x86
   export BREW_BASE=/opt/homebrew
   export PATH=${BREWx86_BASE}/bin:${BREWx86_BASE}/sbin${PATH:+:${PATH}}
   export PATH=${BREW_BASE}/bin:${BREW_BASE}/sbin${PATH:+:${PATH}}
 fi
 if [ "$ARCH" = "x86_64" ]; then
   export BREW_BASE=/opt/brew_x86
   # export PATH=${BREW_BASE}/bin:${BREW_BASE}/sbin${PATH:+:${PATH}}
   export PATH=${PATH//¥/homebrew¥//¥/brew_x86¥/}
 fi

zsh

  • zshrc でアーキテクチャによってプロンプトを変更して今どっちで動いているかわかるように,プロンプトを以下のように設定。
  • 下記 _my_venv_prompt_msg は Python の virtualenv の情報を書き出す関数。
  • _my_short_pwd はカレントパスを短縮して表示する自前関数。

    .zshrc
     ARCH=$(uname -m)
     if [ "$ARCH" = "arm64" ]; then
       PR_ARCH="ARM"
     else
       PR_ARCH="x86"
     fi
    
     PROMPT='%B$(_my_venv_prompt_msg)%F{black}%K{white} $(_my_short_pwd)$(_my_vcs_prompt_msg)%f%k%b
     %F{008}${PR_ARCH}%F{green}%k❯%f%b '
     RPROMPT="%F{008}[%D{%m/%d} %T]%f"
    
  • alias x86 = "arch -x86_64 zsh" のようにしておいて,x86と叩けば intel版のシェルを起動できるように。

  • alise xbrew = /opt/brew_x86/opt/bin/brew って書いてるけどパスとかも色々変えないといかんのでARMシェルからintel版brewを動かすのはちょっと大変そう。

ffmpeg

  • Homebrew で普通にインストールできる。
  • options が設定できた方がいいんで,自分では開発元の fomula を tap している。

    shell
     $ brew tap homebrew-ffmpeg/ffmpeg
     $ brew install homebrew-ffmpeg/ffmpeg/ffmpeg
    

Emacs

  • mitsuharu版Emacsをインストール。速い。

    shell
     $ brew tap railwaycat/emacsmacport
     $ brew install emacs-mac
    
  • 懸念してた vterm モジュールも問題なく動いている。すごい。

Python周り

Pyenv

  • Homebrew版は対応が遅いので,GitHubから直接持ってきている。

    shell
     $ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
    
  • そのあとは .zshrc.zshenv に以下の記述

    .zshenv
     # Pyenv
     export PYENV_ROOT="${HOME}/.pyenv"
     if [ -x "${PYENV_ROOT}/bin" ]; then
       export PATH=${PYENV_ROOT}/bin:${PATH}
     fi
    
    .zshrc
     # pyenv
     if [ -x "$(which pyenv)" ]; then
       eval "$(pyenv init - zsh)"
     fi
    

Python

3.9系

  • 3.9.1がリリースされて pyenv でも問題なくインストールできるようになった(2020/12/11)

3.8系

  • TensorFlow_macOS を利用する場合に3.8系のPythonが必要。そもそもはシステムに最初からインストールされている 3.8.3 の利用を想定している。
  • しかし,Homebrew の依存関係で Python(3.9) が入っていると pyenv で system を指定しても Homebrew のPython が指定され,macOS の Python 3.8.3 が利用できない。
  • そこで以下のように pyenv の方でパッチを当ててインストールする。これを使うように pyenv local でしてしておくと,TensorFlow_macOS が利用できる(2021/02/10)
  • Python 3.8.8 も同じパッチを当ててインストールできた(2021/02/22追記)
shell
  $ PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install --patch 3.8.7 <<(curl -sSL "https://raw.githubusercontent.com/Homebrew/formula-patches/9811be33170a8f31a684fae6955542e31eb4e61e/python/3.8.7.patch")

numpy

  • 普通に現行バージョン(1.20.0)がインストールできる。
  • ただし常にソースからビルドしようとするんで時間がかかる。

pillow

  • 8.0.1 が問題なくインストールできる(matplotlibと一緒にインストールされる)。
  • Homebrew で先に jpeg をインストールしておく必要あり(コンパイル時にエラーが出る)。

matplotlib

  • 3.3.3が問題なくインストールできる。

Cython

  • 普通に現行バージョン(0.29.14)がインストールできる。

Pandas

  • 1.2.0から普通にインストールできる。

SciPy

  • gcc の修正が Homebrew に反映された(gcc 10.2.0_4)。これを利用する場合は特に注意する必要もなく以下の手順でインストール可能(2021/02/25更新)
  1. gcc のバージョンを確認(10.2.0_4になっていることを確認)

    shell
     $ gcc-10 --version
     gcc-10 (Homebrew GCC 10.2.0_4) 10.2.1 20201220
     Copyright (C) 2020 Free Software Foundation, Inc.
     This is free software; see the source for copying conditions.  There is NO
     warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
    
  2. Homebrew で OpenBLAS をインストール後,~/.numpy-site.cfg にこれを指定。

    .numpy-site.cfg
     [openblas]
     libraries = openblas
     library_dirs = /opt/brew/opt/openblas/lib
     include_dirs = /opt/brew/opt/openblas/include 
    
  3. その後 scipy をインストールする。

    shell
     $ poetry add scipy
    

Python 3.8.7でインストールする場合

TensorFlow for macOSを使う場合は Python 3.8.7 を使う事になるが,その場合,上記の手順でインストールではインストールできない。最後の手順を以下のように変更する。

shell
 $ NPY_DISTUTILS_APPEND_FLAGS=1 poetry add scipy

scikit-learn

  • 普通の手順でインストールできる。

PyTorch

  • PyTorch は以下の手順でインストールできる。(2021/01/12追記)
  • 最新のソースのインストールはうまく動かなかったのでとりあえず1.8系の最新開発バージョンでのインストール手順を掲載(2021/03/01更新)
  1. まず Poetry で必要なパッケージをインストール。とはいえ,scikit-learn までインストールしてたらそんなに必要なかった(2021/02/08 typing_extensions を追加)

    shell
     $ poetry add pyyaml typing_extensions
    
  2. 次にGitHubからソースを取得。

    shell
     $ git clone --recursive https://github.com/pytorch/pytorch
     $ cd pytorch
    
  3. バージョン1.8.0の最新版ソース(執筆時点で rc5 )に切り替える。

    shell
     $ git checkout v1.8.0-rc5
    
  4. サブモジュールの更新

    shell
     $ git submodule sync
     $ git submodule update --init --recursive
    
  5. OpenBLASを使うこともできるが,聞くところによるとOpenBLASよりもAppleのAccelerate.frameworkの方が今のところは速いらしいので,そちらを使えるようにファイルを書き換える。(OpenBLASを利用する場合はここは書き換えなくても良い)

    pytorch.diff
    diff --git a/cmake/Modules/FindvecLib.cmake b/cmake/Modules/FindvecLib.cmake
    index 6b463b9e92..4dc663b981 100644
    --- a/cmake/Modules/FindvecLib.cmake
    +++ b/cmake/Modules/FindvecLib.cmake
    @@ -17,6 +17,7 @@ find_path(vecLib_INCLUDE_DIR vecLib.h
               PATHS /System/Library/Frameworks/Accelerate.framework/Versions/Current/${__veclib_include_suffix}
                     /System/Library/${__veclib_include_suffix}
                     /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Headers/
    +                /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Headers/
               NO_DEFAULT_PATH)
    
     include(FindPackageHandleStandardArgs)
    

    Xcode.app をインストールせずコマンドラインツールのみインストールしている場合は以下のように書き換える。

    pytorch.diff
    diff --git a/cmake/Modules/FindvecLib.cmake b/cmake/Modules/FindvecLib.cmake
    index 6b463b9e92..4dc663b981 100644
    --- a/cmake/Modules/FindvecLib.cmake
    +++ b/cmake/Modules/FindvecLib.cmake
    @@ -17,6 +17,7 @@ find_path(vecLib_INCLUDE_DIR vecLib.h
               PATHS /System/Library/Frameworks/Accelerate.framework/Versions/Current/${__veclib_include_suffix}
                     /System/Library/${__veclib_include_suffix}
                     /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk/System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Headers/
    +                /Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/System/Library/Frameworks/Accelerate.framework/Versions/Current/Frameworks/vecLib.framework/Headers/
               NO_DEFAULT_PATH)
    
      include(FindPackageHandleStandardArgs)
    
  6. コンパイルして wheel を作成。

    shell
     $ MACOSX_DEPLOYMENT_TARGET=11.1 CC=clang CXX=clang++ python setup.py bdist_wheel
    

    OpenBLASを使う場合は以下のように BLAS="OpenBLAS" を追加。

    shell
     $ MACOSX_DEPLOYMENT_TARGET=11.1 CC=clang CXX=clang++ BLAS="OpenBLAS" python setup.py bdist_wheel
    
  7. dist ディレクトリ下に wheel ができているので,それを適当な場所に移動してからインストール。

    shell
     $ poetry add $(the_location_of_wheel)/torch-1.8.0a0+XXXXXXXX-cp39-cp39-macosx_11_0_arm64.whl
    

TorchText

  1. まず GitHub からソースを取得。

    shell
     $ git clone --recursive https://github.com/pytorch/text torchtext
     $ cd torchtext
    

    なお,更新する際は git clone せずにディレクトリに入り以下を実行する。

    shell
     $ cd torchtext
     $ git pull
     $ git submodule update --init --recursive
    
  2. (Optional)すでに一度コンパイルしているなら,それをクリアする。

     $ python setup.py clean
    
  3. コンパイルして wheel を作成。これをインストールする。

    shell
     $ MACOSX_DEPLOYMENT_TARGET=11.1 CC=clang CXX=clang++ python setup.py bdist_wheel
    

TensorFlow for macOS

Appleが配布しているTensorFlow for macOSのインストール。Pyenv と Poetry を使うのでインストールしておく。

  • Python 3.8.8 を利用するように変更(2021/03/05更新)
  1. 準備
    TensorFlow for macOS の tar ball をダウンロード,適当な場所に展開しておく。さらに,あとで利用するために展開した場所(ディレクトリ)を環境変数に設定しておく。

    shell
    $ tar xzf tensorflow_macos-0.1alpha2.tar.gz
    $ export TFMAC_DIR=$(PWD)/tensorflow_macos/arm64
    
  2. TensorFlow for macOS は元々はシステムに入っている Python 3.8.2 の使用を想定しており,Python 3.8系でなければインストールできないので,まず,Python 3.8系の最新版 Python 3.8.8 を入れる(上に書いてある方法と同じ)。

    shell
    $ PYTHON_CONFIGURE_OPTS="--enable-framework" \
    pyenv install --patch 3.8.8 << (curl -sSL "https://raw.githubusercontent.com/Homebrew/formula-patches/9811be33170a8f31a684fae6955542e31eb4e61e/python/3.8.7.patch")
    
  3. プロジェクト用のディレクトリを作成し,そのプロジェクトでは Python 3.8.8 を利用するように設定。

    shell
    $ mkdir my_project
    $ cd my_project
    $ pyenv local 3.8.8
    
  4. Poetry で仮想環境を初期化。

    shell
    $ poetry init -n
    
  5. TensorFlow for macOSで配布されているパッケージをインストール。

    shell
    $ poetry add ${TFMAC_DIR}/numpy-1.18.5-cp38-cp38-macosx_11_0_arm64.whl
    $ poetry add ${TFMAC_DIR}/grpcio-1.33.2-cp38-cp38-macosx_11_0_arm64.whl
    $ poetry add ${TFMAC_DIR}/h5py-2.10.0-cp38-cp38-macosx_11_0_arm64.whl
    
  6. TensorFlow for macOS Addons をインストール。

    shell
    $ poetry add ${TFMAC_DIR}/tensorflow_addons_macos-0.1a2-cp38-cp38-macosx_11_0_arm64.whl
    
  7. Tensorflow for macOS 本体のインストール。依存関係の問題で Poetry ではインストールできないので,Poetry経由で起動した pip でインストールする。

    shell
    $ poetry run pip install --no-dependencies ${TFMAC_DIR}/tensorflow_macos-0.1a2-cp38-cp38-macosx_11_0_arm64.whl
    
  8. その他必要なパッケージをインストールする。

    shell
    $ poetry add absl-py astunparse flatbuffers gast google_pasta keras_preprocessing opt_einsum protobuf tensorflow_estimator termcolor typing_extensions wrapt wheel tensorboard typeguard
    
  9. これで TensorFlow for macOS が動くはず。

    shell
    $ poetry run python
    Python 3.8.8 (default, Feb 22 2021, 09:50:21) 
    [Clang 12.0.0 (clang-1200.0.32.29)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import tensorflow as tf
    >>> 
    
  10. (Optional)SciPyが必要なら以下のようにしてインストールする。

    shell
    $ NPY_DISTUTILS_APPEND_FLAGS=1 poetry add scipy
    

その他のツール

gfortran

  • Homebrew で gcc(含gfortran)が入れられるようになってた(2021/01/02追記)

OpenBLAS

  • Homebrew で OpenBLAS が入れられるようになってた(2021/01/02追記)
hjmr
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away