WSL2で材料シミュレーション

# はじめに

普段Linux計算機に触れていない方が材料シミュレーションに取り組むきっかけになればと思い記事を書いてきましたが、その完結編です。WSL2のおかげで、Windows上にLinux環境を構築することが容易になりました。~~WSL2の正式リリースは数か月後に迫っていますが、Insider Programに参加すると今すぐに利用できます。~~WSL2は、2020年5月の大型アップデートで正式導入されました。
WSL2の使い方、特にUbuntuの始め方についてはすでに多くの有益な情報がありますので、私が参考にした情報へのリンクを示すにとどめます。
[WSL2の環境構築手順](https://qiita.com/poramal/items/3562472d52fe60f61c56)

## Windows Terminal

WSL2と併せて利用できるWindows Terminalも注目に値します。こちらは~~Insider Programではなく、~~Storeから~~Preview版を~~入手します。設定など、次の記事が詳しいです。
[Windows Terminal (v0.7 ～ v1.0) メモ](https://qiita.com/rubytomato@github/items/e88cab84f36e44797cf2)

## Insider Program をやめる準備（予約）をする

(WSL2は2020年5月に正式リリースされました。利用のために、Insider Programに参加する必要はありません。）

Insider Programは好きなタイミングで直ちにやめる（オプトアウトする）ことが出来ません。オプトアウトできるのはWindowsの大型アップデート時のみです。次の大型アップデート（2020年5月頃？）にはWSL2が含まれるはずですので、WSL2の利用を目的にInsider Programに参加した方は、オプトアウトを予約すると良いでしょう。
![optout.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159352/d0094fe8-2d10-2975-3480-1e331868dc78.png)

# Ubuntuで材料シミュレーション

追加ソフトウェアをインストールするためのコマンド（と引数）がディストリビューションごとに異なります。

```shell-session
$ sudo apt install -y make gnuplot-nox gfortran libopenmpi-dev libfftw3-dev
```

その他の操作はLinux環境でほぼ共通です。例えばPHASE/0のインストール手順は、CentOSを対象とした[こちら](https://qiita.com/USAMI_Mamoru/items/385e4eaf8fc30fbb4db2#phase0)とほとんど同じです。唯一の違いは、FFTW3ライブラリのディレクトリに`/usr/lib`を指定することです。同ディレクトリにライブラリはありませんが、/usr/includeにあるインクルードファイルを認識させるためです。ライブラリ本体は/usr/lib/x86_64-linux-gnuにあり、指定せずともコンパイラが見つけてくれます。

以前と同じ課題で、ベンチマークしました。
https://qiita.com/USAMI_Mamoru/items/830d6ddb54ae96c82184#性能評価
今回利用するのは、Core i5-4210Uを搭載したノートPCです。物理2コア、Hyper Threadingを利用して論理4コアで動作しています。PHASE/0は執筆時点の最新版である、2019.01.01を用いました。

|並列設定|所要時間|
| --: | :--: |
| 並列なし| 620秒 |
| k点2並列| 430秒 |

......期待が大き過ぎたのでしょうか。今後のさらなるWSL2のチューニングに期待します。（期待できないかもしれません；[WSL 2、実はWSLからパフォーマンス向上ほとんどなし？](https://news.mynavi.jp/article/20191216-938538/)）
なお、科学技術計算では、Hyper Threadingによる高速化は（ほとんど）期待できないといわれています。具体的数値を示しませんが、本例題でもその傾向が見られました。

# WSLでCentOSを使う

Linuxのデスクトップ環境利用ではUbuntuのシェアが高いのですが、材料シミュレーションを含む科学技術計算のための大規模並列実行環境では、CentOSが優勢です。大規模計算に取り組む意欲があれば、CentOSに慣れておくのも良いでしょう。とはいえ、管理者にならない限り、使い方は大差ありません。OS（ディストリビューション）の差異よりも、ジョブ管理システム、コンパイラ（MPIなどライブラリを含む）など計算機ごとに追加インストールされているソフトウェアの利用方法の違いの方が、影響が大きいと思います。

WSL2で動作するCentOS8の配布元はこちらです。
https://git.io/centwsl
こちらのサイト[WSL2を使用し無料でCentOS8を使う方法](https://pa3301.com/howtowsl2-centos8/)を参考に作業したのですが、リンク先が（見え）なくなってしまったので、簡潔に説明します。

ダウンロードした`CentOS8.zip`を展開し、フォルダ内の`CentOS8.exe`を実行すると、その場にCentOSがインストール（ファイルが展開）されます。Ubuntuの場合は`c:\Users\ユーザー名\AppData\Local\Packages\`以下にインストールされるので、それを真似て、ZIPを展開した`CentOS8`フォルダを、`c:\Users\ユーザー名\AppData\Local\Packages\CentOS8`に移動します。`CentOS8.exe`を実行すれば、インストール完了です。
`CentOS8.exe`の名前を変えると複数のCentOS環境を作成できます。失敗を恐れずにジャンジャン実験しましょう。
インストール直後はWSL1です。このままでも良さそうですが、WSL2に変換します。

```shell-session
> wsl --set-version CentOS8 2
```


初回起動時には、パッケージをアップデートします。

```shell-session
# dnf update -y
```

何もしなければrootでログインしています。有効なパスワードは設定されていませんのでそのまま放置しても良いですが、パスワードを設定する場合は`passwd`コマンドを使います。後で利用する`sudo`コマンドと併せてインストールします。

```shell-session
# dnf install -y passwd cracklib-dicts sudo
```

次に、普段使いのための一般ユーザーのアカウントを作成します。パスワードを設定し、`sudo`コマンドを実行できるように`wheel`グループに追加します。

```shell-session
# adduser [user-name]
# passwd [user-name]
# usermod -G wheel [user-name]
```

一旦ログアウトして、`CentOS8.exe`を使って、デフォルトユーザーを変更します。

```shell-session
> CentOS8.exe config --default-user [user-name]
```

次からは、一般ユーザーでログインできます。追加ソフトウェアのインストールなど管理者権限が必要なコマンド実行には`sudo`コマンドを使います。

```shell-session
$ sudo dnf install -y zsh which bzip2 python36 util-linux-user
```

PHASE/0のコンパイルと計算実行（計算結果のグラフ化）に必要なソフトウェアを追加インストールします。

```shell-session
$ sudo dnf install -y gcc-gfortran fftw-static perl gnuplot make patch
```

OpenMPIもパッケージからインストールできるのですが、これを使ってコンパイルしたPHASE/0の計算は異常終了してしまいました。そこで、（安定していることを期待して最新版ではない3.1.5を）ソースからインストールします。OpenMPIのコンパイルと実行に必要なソフトウェアを追加します。

```shell-session
$ sudo dnf install -y gcc-c++ openssh-clients
```
OpenMPIのソースは[ダウンロード](https://www.open-mpi.org/software/ompi/v3.1/)してください。

```shell-session
$ tar jxf openmpi-3.1.5.tar.bz2
$ cd openmpi-3.1.5
$ ./configure && make
$ sudo make install
```

PHASE/0のコンパイル手順は[こちら](https://qiita.com/USAMI_Mamoru/items/385e4eaf8fc30fbb4db2#phase0)と同じです。

## トラブルシューティング：パッケージのデータベースが壊れたら

```shell-session
$ sudo rm -f /var/lib/rpm/__db*
$ sudo dnf update
```

## トラブルシューティング：WSL2 requires an update to its kernel component.

3月のWindows update後にWSL2が起動しなくなりました。メッセージの続きにある通り、[https://aka.ms/wsl2kernel](https://aka.ms/wsl2kernel)にアクセスして、MSIパッケージを追加インストールすれば解決します。
[WSL2 will be generally available in Windows 10, version 2004](https://devblogs.microsoft.com/commandline/wsl2-will-be-generally-available-in-windows-10-version-2004/)

# コンテナを使う

WSL2があれば、Windows 10 HomeにDocker Desktop（Stable可）をインストールできます。
[Docker Desktop for Windows Home is here!](https://www.docker.com/blog/docker-desktop-for-windows-home-is-here/)
[Docker Desktop Community 2.3.0.2リリースノート](https://docs.docker.com/docker-for-windows/release-notes/#docker-desktop-community-2302)

材料シミュレーションに限らず、アプリケーションをコンテナに組み込んで配布するケースが増えています。例えば古典分子動力学計算LAMMPSには、[公式コンテナ](https://hub.docker.com/r/lammps/lammps)があるようです。