スパコン利用者のための仮想環境構築入門

# はじめに

プログラムをコンパイルしたり動かしたりするために様々な環境が必要になることはよくあります。しかし、スパコンセンターで計算機を使うような場合、普通は自分の思い通りにプログラムをインストールできないため、プログラムが実行できないということが良くおこります。インストールできないのは、(1)root権限がないこと、（2）外部とhttpで通信できないことの二つの理由があります。

そうした問題を解決するため、この記事ではスパコンセンターでsingularityという仮想環境が動かせることを仮定して、そこで自分に必要な環境を整える方法を説明したいと思います。

そのためには以下の記事が参考になります。この記事は以下の記事をもう一段階親切にすることを目標としています。[Dockerイメージをスパコン上のSingularityで動かしたい](https://itsuka-naritai.com/2020/11/20/docker%E3%82%A4%E3%83%A1%E3%83%BC%E3%82%B8%E3%82%92%E3%82%B9%E3%83%91%E3%82%B3%E3%83%B3%E4%B8%8A%E3%81%AEsingularity%E3%81%A7%E5%8B%95%E3%81%8B%E3%81%97%E3%81%9F%E3%81%84/)

本記事では以下のような順序で説明したいと思います。
1. root権限が使えるlinux環境にsingurarityをインストール
    1.1. ローカル環境にvirtualboxをインストール
    1.2. virtualboxにゲストOSをインストール
    1.3. ゲストOSにsingularityをインストール
2. singularityで最終的な計算に必要な環境を整え、sifファイルを作成
3. sifファイルをスパコンに持ち込み、計算を実行

1の手順は2でsifファイルを作るためにあります。つまり他の手法でsifファイルが作れれば3からスタートできます。ただし、試行錯誤でテストしながらいろいろなソフトをインストールしてみる場合にはどうしても1の手順が必要です。

1の手順が意外と面倒でして上記のように3つの手順にわけて説明しています。


# ローカル環境にvirtualboxをインストール
第一の目標はスパコンと同じバージョンのsingulariryをあなたのパソコンに用意することです。ただしsingulariryのインストールにもいろいろ必要なものが多いので、あなたのパソコンの環境を汚さないために、virtualboxのゲストOS上にsingularityをインストールしましょう。あなたのパソコンがwindowsの場合とmacの場合をリンクを示します。
- [ホストがwindowsの場合](https://qiita.com/HirMtsd/items/be1c8afe708e901e1100)
- [ホストがMacの場合](https://pc-karuma.net/mac-virtualbox-install/)

# virtualboxにゲストOSをインストール
適当なlinuxをインストールします。私はよくlubunts, almalinuxを使っていますが、どのようなものでも構いません。使用するストレージは多めにとっておいたほうが良いかもしれません。例えば80GBなど。

- [lubunts](https://lubuntu.me/)
- [almalinux](https://almalinux.org/), [virtualboxにインストール](https://note.com/kokoronokori/n/n6bd3c44b8706/)


## GuestAdditionをインストール
virtualboxを使う上で、ゲストOSとホストOSの間でコピーペーストなどができると楽です。また、ゲストOSのデスクトップの大きさなどが可変であったりすると便利です。そうしたことを実現するためにはvirtualboxのGuestAdditionをゲストOSにインストールする必要があります。

[Guest Additionのインストール](https://qiita.com/HirMtsd/items/225c20b77a7cd5194834#%E7%94%BB%E9%9D%A2%E3%82%B5%E3%82%A4%E3%82%BA%E3%81%AE%E5%A4%89%E6%9B%B4)

しかしGuestAdditionのインストールに失敗することがあります。GuestAdditionが正常にインストールされているかどうかは、[Host key]-NでRumtime infomationを見るとすぐにわかります。デフォルトの[Host key]はwindowsの場合、right-Ctrlです。Macの場合left-commandです。

インストールに失敗した場合は、エラーメッセージを検索して解決法を探してみてください。例えば[この記事](https://it-study.info/centos8-guest-additions/)のように必要なものがインストールされてないなどです（リンク先に書かれたyumは今はdnfに変更したほうが良いかもしれません）。またkernel*をupdateしてはrebootを繰り返し、最新版にしてからGuestAdditionをインストールすることで成功することがあります。

## クリップボード共有をONにする
以下の手順でクリップボード共有が可能になります。virtualboxのメニューバーから「Devices」→「Shared Clipboard」→「Bidirectional」を選択。

## 共有フォルダーの設定
ホストOSとゲストOSでファイルをやりとりするために共有フォルダーを設定する。デバイス(device)からshared folderを設定する。

設定したフォルダーにアクセスするためにはパーミッションを変える必要がある。[redhad系](https://qiita.com/lynlea/items/358b2194a15cf8137075), [ubuntsu系](https://www-creators.com/archives/337)

# ゲストOSにsingularityをインストール
まず使用したいスパコンにおけるsingularityのバージョンを確認しておいてください。以下を参照し、そのバージョンのsingulariryをインストールしてください。[singularityのインストール](https://qiita.com/fleming_tone/items/fc03570ac5b8de1cf027), [REDHAT系の場合はこちら](https://qiita.com/mkt3/items/b9f86f5ddf9eb0f43608#2-1%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%AB%E5%BF%85%E8%A6%81%E3%81%AA%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)。ただし、これらのリンク通りに実行しても、僕はうまくインストールできませんでした。リンクとか設定とかがちょっと変わっているようです。そんなに難しいことが要求されているわけではないので、めげずに以下を試してください。

singulariryのダウンロードがうまくいかない場合は、以下を参照。ここでは、version 3.4.0をダウンロードしている。他のバージョンについては[こちらから](https://github.com/sylabs/singularity/tags)。
```bash:
wget https://github.com/sylabs/singularity/archive/refs/tags/v3.4.0.tar.gz
tar -xzf v3.4.0.tar.gz
cd singularity-3.4.0/
./mconfig -V 3.4.0
cd builddir
make
sudo make install
```

goがうまくインストールされなかったり、singularityをbuildするときに見つからない時は、初心に立ち返って[goのオフィシャルなサイト](
https://go.dev/doc/install)からダウンロードしましょう。バージョンはそのときの最新のものにするのが良いかと思います。以下のコマンドの後半はオフィシャルなページのインストラクションに書いてあったものです。

```bash:
wget https://go.dev/dl/go1.18.4.linux-amd64.tar.gz
sudo rm -rf /usr/local/go && sudo tar -C /usr/local -xzf go1.18.4.linux-amd64.tar.gz
```
# singularityで最終的な計算に必要な環境を整え、sifファイルを作成

## docker hub等からダウンロード
[docker hub](https://hub.docker.com/)にはいろいろな環境（コンテナ）がアップロードされています。自分の欲しい環境がここで見つかれば簡単です。このdockerの環境をsingularity用の環境に変換するには以下のようにします。tagはバージョンを表します。

```bash:
singularity pull docker://image:tag
```
例えば、天体物理で星の進化の計算を行う[MESAコードのdocker](https://github.com/evbauer/MESA-Docker)を使用する場合、以下のようにします。
```bash:
singularity pull docker://evbauer/mesa_lean:r22.05.1.01
```
例えば、yaml形式をpythonで扱う[pyyaml](https://maku77.github.io/python/io/yaml.html)を使用する場合、以下のようにします。以下のimageはただ新しいから選んだだけです。
```bash:
singularity pull docker://amritpalnagrame/pyyaml:latest
```
## 環境を一から作成する
まずはサンドボックスを取得。以下では、dockerhubからchainerをサンドボックスとして読み出している。他のものでも良い。
```bash:
sudo singularity build --sandbox ch_sandbox docker://chainer/chainer:latest-python3 
```
以下のコマンドでsingurarityのシェルに入れ、自由に編集できる。/rootにいる状態になることに注意。
```bash:
sudo singularity shell --writable ch_sandbox
```
次に必要なものをインストールする。必要なものがインストールされたらシェルから出る。
```bash:
apt-get install -y ???
exit
```
最後にsifファイルをつくる。
```bash:
$ sudo singularity build my_chainer.sif ch_sandbox
```
### 参考リンク
[singularity使ってみた @fleming_tone](https://qiita.com/fleming_tone/items/fc03570ac5b8de1cf027)
[SandboxでSingularityコンテナを編集する方法 アメリエフの技術ブログ](https://staffblog.amelieff.jp/entry/Sandbox.Singularity)

# sifファイルをスパコンに持ち込み、計算を実行

いよいよsingularityの使い方を説明します。[京大化学研究所のページ](https://www.scl.kyoto-u.ac.jp/Appli/singularity.html)にはコンパクトに使い方がまとまっています。天文関係では[CfCA](https://www.cfca.nao.ac.jp/gpgpu)でも簡単に説明が書かれています。
## コンテナの中にログイン
スパコン上でimage.sifがあるディレクトリにおいて以下のようにして実行します。
```bash:
singularity shell image.sif
```
このコマンドによってsifファイルで持ちこんだ環境が、これを実行したディレクトリをマウントしたような形になります。

## コンテナの中でコマンドを実行
```bash:
singularity exec image.sif --bind $PWD command
```