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 など,大部分のものは 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

コマンドラインツールの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 が追記されるので適宜修正する。

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

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) 環境に戻る。

R

R for macOS Developers に実験的な Apple Silicon 用バイナリがある。正式版は R 4.1.0 以降とのこと。

TeX

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

VS Code

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

X Window System

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

参考