M1搭載MacにおけるPytorchのインストール

## 重要！（2021-06-19現在）

継続的に更新されている，M1 Macの環境構築に関する次のとてもためになる記事でも言及されていますが，現在，**簡単に`pip install`でインストール可能になりました**。

```
pip install torch
pip install torchvision
pip install torchaudio
```

https://qiita.com/hjmr/items/b81de997d4c2b64ef140

**以下の記事の内容は，ほぼすべて古い内容です。完全にレガシーです。ご注意ください。**
**ただ，`pytorch-lightning`のインストールが上手くいかないという人に関しては，[`pytorch-lightning`のインストール](#pytorch-lightningのインストール)は有用かもしれません。**

## 概要

* M1搭載MacでのPyTorch（GPU非対応）のインストール手順をまとめています。
* torchaudioのインストールはまだうまくいっていません。

## 前置き

M1搭載Macでは，GPU対応のTensorflowに注目が集まりがちですが，PyTorchを使用したい方も多いかと思います。Tensorflowの導入記事は数多く見つかったのですが，PyTorchの導入記事が見つからず手間取ったので，簡単にまとめました。
2021-01-27時点で，PyTorchはGPU対応ではありませんが，CPU版の導入は可能です。

## 方針

* M1搭載Mac対応のPython環境を提供する`miniforge`の使用を前提とします。

## 手順

### `miniforge`の環境構築

以下のリンク先から， arm64 (Apple Silicon) 版のインストーラ（シェルスクリプト）をダウンロードします。 
https://github.com/conda-forge/miniforge

ダウンロードしたら，インストーラを実行します。（基本的にすべてyes）
   
```zsh
source ~/Downloads/Miniforge3-MacOSX-arm64.sh
```

仮想環境を構築します。`myenv`の箇所は好きな名前で良いです。2021-01-27時点で，python3.9系に対応していない有名パッケージ（例えば`numba`や，`numba`に依存した`librosa`など）があるので，`python=3.8.6`とするのが良いと思います。

```
conda create -n myenv python=3.8.6
conda activate myenv
```

普段使用するパッケージをインストールします。次のパッケージ群は私が普段使っているものなので，すべてインストールする必要はありませんが，**`torch`が依存している`numpy`は必ずインストールしてください**。

```
conda install numpy
conda install numba
conda install pandas
conda install openpyxl
conda install scipy
conda install scikit-learn
conda install matplotlib
conda install seaborn
conda install jupyterlab
```

### PyTorchのインストール

#### `torch`のインストール

2021-01-27現在，**`torch`は`conda install torch`や`pip install torch`ではインストールできません**。
しかし，先人の方々がwheelを作成してくださっているので，それを使用すると簡単にインストールできます。
まず，wheelファイルをダウンロードします。

* 仮想環境作成時に`python=3.8.x`（3.8系）を指定した方は，次のリンクからGoogle Driveのリンクに飛び，画面右上にあるダウンロードのボタンを押し，警告を無視してダウンロードしてください。  
  https://drive.google.com/file/d/1e-7R3tfyJqv0P4ijZOLDYOleAJ0JrGyJ/view
* 仮想環境作成時に`python=3.9.x`（3.9系）を指定した方は，次のリンクからGithubのページに飛び，「Download」ボタンを押してください。  
  https://github.com/wizyoung/AppleSiliconSelfBuilds/blob/main/builds/torch-1.8.0a0-cp39-cp39-macosx_11_0_arm64.whl

ダウンロードしたら，以下のコマンドで`torch`をインストールできます（python3.8系か3.9系かでファイル名が異なるので，微妙にコマンドは変わります）

```bash:python3.8系をダウンロードした場合
pip install ~/Downloads/torch-1.8.0a0-cp38-cp38-macosx_11_0_arm64.whl
```
```bash:python3.9系をダウンロードした場合
pip install ~/Downloads/torch-1.8.0a0-cp39-cp39-macosx_11_0_arm64.whl
```

以上で，`torch`のインストール可能です。

#### `torchvision`のインストール

これまでの手順で`torch`がインストールできていれば，次のコマンドでインストールできます。

```
pip install torchvision
```

#### `torchaudio`のインストール

現時点で，うまくいっていません...

#### `pytorch-lightning`のインストール

[PyTorchLightning](https://github.com/PyTorchLightning/pytorch-lightning)は，PyTorchを効率的に書くためのラッパーパッケージです。
かなり便利なのでおすすめです。

まず，依存パッケージを`conda install`コマンドでインストールします。

```
conda install future pyyaml tqdm fsspec tensorboard
```

あとは，`pip install`コマンドで`pytorch-lightning`をインストールしたら終了です。

```
pip install pytorch-lightning
```

### 後書き

先人の方々に感謝です。`torchaudio`のインストールが残る課題になります。

因みに，`torchaudio`が依存している`librosa`は，`pip install librosa`でインストール可能です。但し，`librosa`が依存しているパッケージ`soundfile`はうまくインストールされず，インストールした直後に`import soundfile`を実行すると`OSError`が送出され，`libsndfile.dylib`が見つからないと言われます。その場合は，見つからないと言われたパスに，`libsndfile.dylib`の実体をコピーしておくとうまくいきます（`libsndfile`自体はHomebrewを使って`brew install libsndfile`でインストールでき，インストールした後の実体を見つからないと言われたパスにコピーします）。

## 参考記事

* miniforgeによるPythonの環境構築
  * https://qiita.com/damyarou/items/f0e0b4026bdda94df46f
  * https://qiita.com/syoyo/items/6ad890c8a902d02d8c5a
* PyTorchのM1搭載Mac対応についてのIssue
  * https://github.com/pytorch/pytorch/issues/48145
* Pytorch-lightningの公式
  * https://github.com/PyTorchLightning/pytorch-lightning