M1 Mac

はじめに

2020-11-13 に Apple Store で注文した MacBook Air 16G/256G が 2020-11-29 に届いたのでさっそく設定。

2020-11-20 に生協に注文した Mac mini 16G/256G は 2021-01-12 に届いた。

どちらもメモリ16Gにしたが,通常の用途には8Gで十分かも。SSDは満タンの半分程度で使うつもりで選ぶほうが安心らしいので,据置き用には外付けHDDをAPFSフォーマットして使う。

セットアップと一般的な設定

他の Mac からコピーという手もあったが,ここはクリーンセットアップすることにする。Apple ID を設定したら iCloud から多くの設定を拾ってくれたので,たいした手間ではない。セットアップ中に「コンピュータアカウントを作成」でサジェストされるアカウント名(私の場合は okumuraharuhiko だった)は,普段使っているユーザ名(私の場合 okumura)に直す(後でも直せる)。

まずは「システム環境設定」→「ソフトウェアアップデート」でOSをアップデート。「セキュリティとプライバシー」で FileVault(暗号化)をオンにする。ドライブを暗号化しておけば,盗まれても安心だし,廃棄する際にも鍵を捨てるだけで復号不能になる。パフォーマンス低下は無視できるはず。

コンピュータ名が長ったらしいものになったのでシステム環境設定の「共有」で直す。ついでに「リモートログイン」を許可しておく(ssh でログインするため)。いずれにしてもパスワードは十分複雑なものにしておく。ちなみにパスワードは大文字小文字数字記号を混在させる必要はない。その分,長くすれば,問題ない。

Finder の環境設定→詳細で「すべてのファイル名拡張子を表示」をオンにする。Safari の環境設定「一般」で「ダウンロード後、“安全な”ファイルを開く」をオフにする。

メール設定では,表示→「メッセージ内のリモートコンテンツを読み込む」をオフに,作成→メッセージのフォーマットを「標準テキスト」に。

システム環境設定でキーボード→ショートカット→入力ソースのショートカットは Emacs に有害なので外す。キーボード→音声入力はデフォルトではControlキーを2回だが,これもControlキーを多用すると間違いやすいので,これ以外(例えばFnを2回)にする。ついでにキーリピートを最速にする(爆速にする方法もある)。

コントロールセンターでキーボードの輝度をゼロに(MacBook Air)。

「システム環境設定」→「ディスプレイ」で正しい解像度が選べない場合は Option キーを押しながら「変更」をクリック(→ Apple M1チップ搭載MacとEIZOモニターの互換性)。

(これは好みだが)システム環境設定でディスプレイの色温度を自分好みに設定する。あるいは1日中 Night Shift に設定するのが簡単。

以上以外に,私は非常に慎重を期すためにいつも自分を管理者から外している。具体的には,システム環境設定の「ユーザとグループ」で自分(奥村)以外に管理者(名前は例えば admin とする)を一人作成し,その管理者(Apple ID には紐付けない)でログインし直して奥村を一般ユーザに格下げする。これで何か重要なことをする際には管理者の名前とパスワードを聞いてくるのでうっかり危ないコマンドを実行する危険性が減る。Unix 的には sudoers から外したことに相当する。コマンドでシステム領域に触れたいときは su admin してから sudo 何々 する。ただ,macOS はデフォルトでずいぶん安全になったので,今はここまでする必要はないかもしれない。

初期の M1 Mac にあった問題(おそらく Big Sur 11.2 で改善されたはず):

ターミナル

ターミナルを開き,試しに uname -m と打ち込むと arm64 と表示される。いったんターミナルを閉じて,Finder でターミナルを選択して「情報を見る」で「Rosettaを使用して開く」にチェックを付けると Rosetta がインストールされる(一般には任意の x86_64 なアプリを最初に起動したときに Rosetta がインストールされるのであろう)。Rosetta で開かれたターミナルに uname -m と打ち込むと x86_64 と表示される。今度は「Rosettaを使用して開く」をオフにしてターミナルを開き直して uname -m するとまた arm64 になるが,Rosetta がインストールされたので

arch -x86_64 uname -m

と打ち込むと x86_64 になる(Rosetta がない状態ではこのコマンドは Bad CPU type in executable エラーになる)。このようにちょっとしたコマンドなら arch -x86_64 を冠することにより Rosetta で実行できるが,まとまったことをするには

arch -x86_64 zsh

とすれば Rosetta で zsh が立ち上がる。x86_64 のコードを実行するにはこの状態で行う。.zshrc に alias x86='arch -x86_64 zsh' のようにエイリアスを作っておけば x86 と入力するだけでこの状態になる。

シェル

今まで bash を使っていたが,クリーンセットアップしたので zsh になった。とりあえずプロンプトを見やすくするために ~/.zshrcPROMPT='%m:%~%# ' と書き込む。あるいは Rosetta 状態かどうかをプロンプトに含めてもよい:

ARCH=`uname -m`
PROMPT="${ARCH} %m:%~%# "

あるいは場合分けもできる:

ARCH=`uname -m`
if [[ $ARCH == 'arm64' ]]; then
    PROMPT="[a] %m:%~%# "
else
    PROMPT="[x] %m:%~%# "
fi

ほかに例えば次のようなオプションを設定しておく:

HISTFILE=~/.zsh_history
HISTSIZE=1000
SAVEHIST=1000
setopt HIST_VERIFY
setopt INC_APPEND_HISTORY
setopt HIST_IGNORE_ALL_DUPS
setopt HIST_ALLOW_CLOBBER
setopt HIST_REDUCE_BLANKS
setopt HIST_IGNORE_SPACE
setopt NO_HIST_BEEP
setopt NO_CLOBBER

環境変数は ~/.zshenv で設定するが,NO_GLOBAL_RCS オプションを指定しないと PATH を上書きされてしまう。

setopt NO_GLOBAL_RCS
export PATH=... # bashと同様

PATH は場合分けして設定できる。例えば

setopt NO_GLOBAL_RCS
ARCH=`uname -m`
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
PATH=/Library/Frameworks/R.framework/Versions/4.0/Resources/bin:$PATH
if [[ $ARCH == 'arm64' ]]; then
    PATH=/usr/local/texlive/2020/bin/custom:$PATH
    PATH=/opt/homebrew/bin:/opt/homebrew/sbin:$PATH
    PATH=/opt/homebrew/Caskroom/miniforge/base/bin:$PATH
else
    PATH=/usr/local/texlive/2020/bin/x86_64-darwin:$PATH
    PATH=/Library/Frameworks/Python.framework/Versions/3.9/bin:$PATH
    PATH=/Users/okumura/Library/Python/3.9/bin:$PATH
fi
export PATH

Command Line Tools

コマンドラインで開発する場合,巨大な Xcode をインストールする必要はない。コマンドライン用の開発ツールは,何らかの開発用コマンド(gcc とか python3 とか)を実行しようとするとインストールを促される。より確実な方法は,ターミナルに xcode-select --install と打ち込むか,https://developer.apple.com/downloads からダウンロードしてインストールする。OS を更新するとコマンドラインツールも再インストールが必要になることが多いので注意。

Homebrew

Homebrew 3.0.0: "Apple Silicon is now officially supported for installations in /opt/homebrew."

wget,gnupg,pinentry-mac,imagemagick,poppler,ffmpeg,graphviz,pandoc など,大部分のものは Apple Silicon 版が用意されるようになった。pandoc はまだ Intel 版だけ。

ARM 版は,Installation にあるように /opt/homebrew(ユーザ権限で書き込めるようにしておく)にインストールする:

cd /opt
curl -L https://github.com/Homebrew/brew/tarball/master | tar xz --strip 1 -C homebrew

Rosetta で実行する Intel 版は通常通り Homebrew の最初に書いてあるコマンドを uname -m が x86_64 なターミナルに打ち込めばインストールできる。

Emacs 27

Emacs for Mac OS X にある 27.2-2 は arm64 対応のユニバーサルバイナリである。下の自分でビルドしたものと比べて,日本語入力中に画面表示がちらつくことがあるが,許容範囲内であろう。

初回の起動は右クリックして「開く」。そのままではディスクにアクセスできないので,システム環境設定の「セキュリティとプライバシー」の「プライバシー」で「フルディスクアクセス」を許可する必要がある。私の場合,なぜかフルディスクアクセスを許可しても外付けHDDにアクセスできなかったが,ターミナルから一度 open -a Emacs /Volumes/opt と打ち込んで強制的にアクセスさせたら,以後は問題なくなった。

Homebrew 環境でソースからビルドするには次のようにする:

wget -N http://ftp.gnu.org/gnu/emacs/emacs-27.2.tar.xz
wget -N ftp://ftp.math.s.chiba-u.ac.jp/emacs/emacs-27.2-mac-8.2.tar.gz
tar xvzf emacs-27.2.tar.xz
tar xvzf emacs-27.2-mac-8.2.tar.gz
cd emacs-27.2
patch -p1 < ../emacs-27.2-mac-8.2/patch-mac
cp -R ../emacs-27.2-mac-8.2/mac .
cp ../emacs-27.2-mac-8.2/src/* src/
cp ../emacs-27.2-mac-8.2/lisp/term/mac-win.el lisp/term/
cp nextstep/Cocoa/Emacs.base/Contents/Resources/*.icns mac/Emacs.app/Contents/Resources/
./configure --prefix=/opt/homebrew --without-x
make 
make install

これで mac サブディレクトリの中にできる Emacs.app を /Applications にドラッグ&ドロップでコピーする。

ARM 版 Homebrew で brew install emacs でインストールされる emacs はターミナル版。brew install --cask emacs でインストールされるものは Emacs for Mac OS X のもの。

Python

いろいろ試したが,結局最後の「tensorflow-metal」と書いたところのやりかた(ただし tensorflow-metal そのものはインストールしない)に落ち着いた。

コマンドラインツールのPython

Apple のコマンドラインツールに入っている /usr/bin/python,/usr/bin/python3 は universal binary である:

% file /usr/bin/python
/usr/bin/python: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64e:Mach-O 64-bit executable arm64e]
/usr/bin/python (for architecture x86_64):	Mach-O 64-bit executable x86_64
/usr/bin/python (for architecture arm64e):	Mach-O 64-bit executable arm64e
% /usr/bin/python --version
Python 2.7.16

% file /usr/bin/python3
/usr/bin/python3: Mach-O universal binary with 2 architectures: [x86_64:Mach-O 64-bit executable x86_64] [arm64e:Mach-O 64-bit executable arm64e]
/usr/bin/python3 (for architecture x86_64):	Mach-O 64-bit executable x86_64
/usr/bin/python3 (for architecture arm64e):	Mach-O 64-bit executable arm64e
% /usr/bin/python3 --version
Python 3.8.2

この arm64e 側を使うことは可能だが,現状では pip でライブラリを追加することは困難。

本家のPython 3.9

本家 python.org の Python が 3.9.1 から universal バイナリも experimental という括弧書きで提供されるようになった。ただし現状では pip で簡単にパッケージを追加できる状況にないので,混乱しないためには通常の macOS 64-bit Intel installer でインストールし,Rosetta で使うのが簡単である。インストールすると zsh を使っている場合は .zprofile に PATH が追記されるので適宜修正する。

numpy の Apple Silicon 対応バイナリが出た。pandas や matplotlib はソースからビルドすることになるが,基本的なことであれば universal バイナリを arm64 環境で使うことができる。まだ scipy や scikit-learn や tensorflow-macos はうまくインストールできない。

miniforgeのPython 3.9

miniforge を使えば主要ライブラリを含めて arm64 版がインストールできる。

miniforge は単体で入れることもできるが,Homebrew で入れるには /opt/homebrew/bin/brew install miniforge とすればよい。/opt/homebrew/Caskroom/miniforge 以下に入るので /opt/homebrew/Caskroom/miniforge/base/bin をPATHに加える。conda update --allconda listconda install ... のようにして管理する。パッケージは /opt/homebrew/Caskroom/miniforge/base/lib/python3.9/site-packages に入る。

PyTorch は miniforge の Python 3.9 に普通にインストールできるようだ。次の TensorFlow と同様の Apple Silicon への最適化は要望はあるがまだのようだ。

conda install pytorch torchvision  # torchaudio はまだダメ

miniforgeのPython 3.8とAppleのTensorFlow(古)

tensorflow_macos はアーカイブ入りした。最新の方法は次の tensorflow-metal にある。

Apple の tensorflow_macos は Apple Silicon に最適化されている(TensorFlow Blog の Accelerating TensorFlow Performance on Mac 参照)。Instructions to install TensorFlow in a Conda Environment のようにすれば miniforge の Python 3.8 環境にインストールできる。以下では apple という名前の環境を作る:

wget -N https://raw.githubusercontent.com/mwidjaja1/DSOnMacARM/main/environment.yml
conda env create --file=environment.yml --name=apple
conda init zsh

.zshrc が書き変わるのでzshを再起動するか . ~/.zshrc と打ち込む。プロンプトの先頭に (base) が付くようになる。

conda activate apple

とすれば新しい環境に移行する(プロンプトの先頭が (apple) になる)。この状態で Apple の TensorFlow をインストールする。

pip install --upgrade --force --no-dependencies \
    https://github.com/apple/tensorflow_macos/releases/download/v0.1alpha3/tensorflow_macos-0.1a3-cp38-cp38-macosx_11_0_arm64.whl
    https://github.com/apple/tensorflow_macos/releases/download/v0.1alpha3/tensorflow_addons_macos-0.1a3-cp38-cp38-macosx_11_0_arm64.whl

うまくインストールできたか IPython で試してみる:

ipython

In [1]: import tensorflow as tf

In [2]: tf.__version__
Out[2]: '2.4.0-rc0'

In [3]: quit

conda deactivate とすれば元の (base) 環境に戻る。

tensorflow-metal

Getting Started with tensorflow-metal PluggableDevice 参照。macOS 12+ となっているが Big Sur にもとりあえず入った。正しく動いていない気もする。後で書くように,tensorflow-metal は入れず,tensorflow-macos だけにするほうがいいかもしれない。

まず Miniforge3-MacOSX-arm64.sh をダウンロードし,sh Miniforge3-MacOSX-arm64.sh とすると miniforge のインストールが始まる。

Welcome to Miniforge3 4.10.1-4

In order to continue the installation process, please review the license
agreement.
Please, press ENTER to continue
>>> ENTER

...中略...

Do you accept the license terms? [yes|no]
[no] >>> yes

Miniforge3 will now be installed into this location:
/Users/okumura/miniforge3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below

[/Users/okumura/miniforge3] >>> ENTER

...中略...

Do you wish the installer to initialize Miniforge3
by running conda init? [yes|no]
[no] >>> yes

==> For changes to take effect, close and re-open your current shell. <==

If you'd prefer that conda's base environment not be activated on startup, 
   set the auto_activate_base parameter to false: 

conda config --set auto_activate_base false

Thank you for installing Miniforge3!

これでシェルを立ち上げ直す。.zshrc に追記されていることを確認し conda install -c apple tensorflow-deps と打つ。

...中略...

Proceed ([y]/n)? ENTER

最後に

python -m pip install tensorflow-macos
python -m pip install tensorflow-metal

で完成。とりあえず conda install ipython して,確認:

% ipython
Python 3.9.4 | packaged by conda-forge | (default, May 10 2021, 22:10:52) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.24.1 -- An enhanced Interactive Python. Type '?' for help.

In [1]: import tensorflow as tf
Init Plugin
Init Graph Optimizer
Init Kernel

In [2]: tf.__version__
Out[2]: '2.5.0'

なぜか遅いので,pip uninstall tensorflow-metal してしまった。このほうが速い。

R

R 4.1.0 で Apple Silicon に対応した。

TeX

TeX Live 2021 からユニバーサルバイナリになった。

インストールにはいくつかの方法があるが,以下はネットワークインストールによる方法を説明する。あらかじめ(例えば)/usr/local/texlive というディレクトリを作っておき,ユーザ権限で書き込めるようにしておく(私の場合,この中に歴代の TeX Live と,それ以外のものを入れるための texmf-local ディレクトリがある)。適当な作業ディレクトリで Installing TeX Live over the Internet から install-tl-unx.tar.gz をダウンロードし,

tar xvzf install-tl-unx.tar.gz

とすると install-tl-2021XXXX のような名前のディレクトリにインストーラが展開されるので,その中に入り,./install-tl で起動する。GUIが嫌なら ./install-tl --no-gui とする。特定の(近場の)リポジトリを指定したいなら例えば

./install-tl --no-gui --repository http://ftp.jaist.ac.jp/pub/CTAN/systems/texlive/tlnet/

のような感じで指定する。次のようなメニューが出る:

======================> TeX Live installation procedure <=====================

======>   Letters/digits in <angle brackets> indicate   <=======
======>   menu items for actions or customizations      <=======
= help>   https://tug.org/texlive/doc/install-tl.html   <=======

 Detected platform: MacOSX current (10.14-) on ARM/x86_64
 
 <B> set binary platforms: 1 out of 16

 <S> set installation scheme: scheme-custom

 <C> set installation collections:
     40 collections out of 41, disk space required: 7143 MB

 <D> set directories:
   TEXDIR (the main TeX directory):
     /usr/local/texlive/2021
   TEXMFLOCAL (directory for site-wide local files):
     /usr/local/texlive/texmf-local
   TEXMFSYSVAR (directory for variable and automatically generated data):
     /usr/local/texlive/2021/texmf-var
   TEXMFSYSCONFIG (directory for local config):
     /usr/local/texlive/2021/texmf-config
   TEXMFVAR (personal directory for variable and automatically generated data):
     ~/Library/texlive/2021/texmf-var
   TEXMFCONFIG (personal directory for local config):
     ~/Library/texlive/2021/texmf-config
   TEXMFHOME (directory for user-specific files):
     ~/Library/texmf

 <O> options:
   [ ] use letter size instead of A4 by default
   [X] allow execution of restricted list of programs via \write18
   [X] create all format files
   [X] install macro/font doc tree
   [X] install macro/font source tree
   [ ] create symlinks to standard directories

 <V> set up for portable installation

Actions:
 <I> start installation to hard disk
 <P> save installation profile to 'texlive.profile' and exit
 <Q> quit

Enter command: 

ここで I を入力するとインストールが始まる。あとは気長に待つだけ。上の設定では /usr/local/texlive/2021 以下にインストールされるので,その下の bin/universal-darwin にPATHを設定する。これで完了。あとはときどき tlmgr update --self --all と打ち込んでアップデートする。

ちなみに,私は何台もMacを持っているので,一つだけで上記のようにインストール・アップデートし,他のマシンはそこから rsync している:

cd /usr/local/texlive
rsync -auvz --exclude='backups/*' メインマシン:/usr/local/texlive/2021 .

VS Code

VS Code は Universal/Intel/Arm の3通りのバイナリがダウンロードできる。

X Window System

XQuartz は 2.8.0 beta1 以降で Apple Silicon をサポート。

参考