Data Science VM (Ubuntu) on Azure の学習のためのディスク構成

Data Science VM (Ubuntu) on Azure の学習のためのディスク構成
==============================

# 背景
Deep Learning の学習用に Data Science VM (Ubuntu) が良く使われています。Azure の仮想マシンを使う際には、ディスクに特徴がある点を抑えてあることを意識して、ファイルの置き場所を検討します。

- 永続化 : `/` にマウント。
- 非永続化 : `/mnt` にマウント。要は再起動したら、*ファイルが失われる* 可能性がある!「一時ストレージ」

Azureのストレージについて:
https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/about-disks-and-vhds

Deep Learning の学習用のファイル(データセット)は、100GBを超えるものも多くあります。空き容量などのディスク構成を都度調べるのは多少でも費用と時間はかかりますので、ダンプしたものを記します。

## 前提
- Standard HDD (SSDも同じです)
- Managed Disk
- NC6

## 注意点
Azure の仮想マシンイメージは、何の予告なく変更される可能性がありますので、最新の状態を正としてください。

## Data Science VM (Ubuntu)

```bash
dahatake@dahatakedsvm:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev             28G     0   28G   0% /dev
tmpfs           5.6G  9.1M  5.5G   1% /run
/dev/sda1        49G   44G  4.6G  91% /
tmpfs            28G  108K   28G   1% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs            28G     0   28G   0% /sys/fs/cgroup
/dev/sdc1        99G   17G   77G  18% /data
/dev/sdb1       335G   67M  318G   1% /mnt
tmpfs           5.6G   32K  5.6G   1% /run/user/120
tmpfs           5.6G     0  5.6G   0% /run/user/1003
dahatake@dahatakedsvm:~$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb      8:16   0  340G  0 disk
└─sdb1   8:17   0  340G  0 part /mnt
sr0     11:0    1  628K  0 rom
sdc      8:32   0  100G  0 disk
└─sdc1   8:33   0  100G  0 part /data
sda      8:0    0   50G  0 disk
└─sda1   8:1    0   50G  0 part /
dahatake@dahatakedsvm:~$
```

## Ubuntu Server 18.04 LTS

```bash
dahatake@dahatakestd:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
udev             28G     0   28G   0% /dev
tmpfs           5.6G  696K  5.6G   1% /run
/dev/sda1        29G  1.3G   28G   5% /
tmpfs            28G     0   28G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
tmpfs            28G     0   28G   0% /sys/fs/cgroup
/dev/sda15      105M  3.4M  102M   4% /boot/efi
/dev/sdb1       334G   69M  317G   1% /mnt
tmpfs           5.6G     0  5.6G   0% /run/user/1000
dahatake@dahatakestd:~$ lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda       8:0    0   30G  0 disk
├─sda1    8:1    0 29.9G  0 part /
├─sda14   8:14   0    4M  0 part
└─sda15   8:15   0  106M  0 part /boot/efi
sdb       8:16   0  340G  0 disk
└─sdb1    8:17   0  340G  0 part /mnt
sr0      11:0    1  628K  0 rom
dahatake@dahatakestd:~$
```

Data Science VM は、通常のLinux 仮想マシンとは構成が異なることがわかりますね! `/data` が追加されています。
Azure Portal で 仮想マシンの`ディスク`を確認すると、永続ディスクが追加されていることを確認できます。

- Data Science VM
<img width="1066" alt="Data Science VM" src="https://qiita-image-store.s3.amazonaws.com/0/108143/78b0abe1-f690-afbd-dcc0-617d7a5aa545.png">

- Linux 仮想マシン
<img width="1050" alt="Linux 仮想マシン" src="https://qiita-image-store.s3.amazonaws.com/0/108143/786c02b2-4b60-57e1-dc5b-d1854c5396ba.png">

`Standard HDD` と表記があります。これは更に高速化ができます。

Azureの Linux 仮想マシンのストレージの選択肢:
https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/disk-scalability-targets

# Deep Learning 用のデータ置き場所候補
Azureの仮想マシンでは、永続ストレージは、ローカルキャッシュを使うものでも、ネットワーク越しに Azure Storage に書き込みます。

## /data 以下 (Data Science VM のみ) のディスクサイズを増やす
`data` は、100GB あり、/home/user なども含まれています。ですが、100GB ですと不足することもありますので、1TBくらいまでサイズを増やしましょう!

### Azure CLI より
これはドキュメントの通り。

Azure CLI を使用して Linux VM の仮想ハード ディスクを拡張する方法:
https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/expand-disks

### Azure ポータルから

実は、Azureポータルからも簡単に出来ますので、その手順を。

- 仮想マシンの停止 (割り当て解除)

Azure ポータル 上から`停止`をします。

<img width="551" alt="StopVM.png" src="https://qiita-image-store.s3.amazonaws.com/0/108143/76846f38-52a3-22c8-61ad-3ab63703d546.png">

`割り当て解除中`と表示されます。*数分* 待ちます。

<img width="285" alt="deallocate.png" src="https://qiita-image-store.s3.amazonaws.com/0/108143/69050d14-7b4b-753e-5b95-a447f50b8480.png">

割り当て解除が完了すると `開始` ボタンが押せる状態になります。

- `ディスク` のサイズ変更

`ディスク`をクリックします。

<img width="198" alt="DiskButton.png" src="https://qiita-image-store.s3.amazonaws.com/0/108143/b9df2818-a72f-6f73-c175-d20fb6d95925.png">

`データ ディスク` に追加されている 100GB のディスクを選択します。

<img width="586" alt="DataDisk.png" src="https://qiita-image-store.s3.amazonaws.com/0/108143/f6e2cfde-a899-adeb-3acb-0a63317bfe75.png">


`サイズ (GiB)` を適切なサイズにします。私はいつも *1023 (1TB)* にしていますw

<img width="569" alt="ChangeDiskSize.png" src="https://qiita-image-store.s3.amazonaws.com/0/108143/aaa13490-3bbb-e352-41f0-5bc203cd51c5.png">

画面上部の`保存`を押します。

- 仮想マシンの開始

仮想マシンを開始してください。
その後、`ssh`などでログインして、当該ディスクのサイズが変わっている事を確認します。

## 一時ストレージ
Deep Learning の学習で使用する事を考えると、学習のジョブが動いている時だけファイルが存在していればよいため、ローカルでかつ必ずSSDアクセスの *一時ストレージ* も有力な選択肢です。

GPU インスタンス の場合のデフォルトの一時ストレージについて:
https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/sizes-gpu

### 制限
- サイズ変更ができない

## 一時ストレージへのファイルコピー手順 
ファイル (データセット)をBlob Storageに置いている場合は、`AzCopy` でのファイルコピーがオススメです。Data Science VM には残念ながらインストールされていませんので、`sudo apt-get install azcopy` にて、インストールしてください。

詳細は、こちらを。

AzCopy on Linux:
https://docs.microsoft.com/ja-jp/azure/storage/common/storage-use-azcopy-linux?toc=%2fazure%2fstorage%2fblobs%2ftoc.json

## Blobfuse - ファイルコピー不要の可能性大!
Blob StorageにあるファイルをLinuxファイルシステムからアクセスするファイルシステムドライバーです。ローカルキャッシュもうまく使っているようで、非常に高速に動作します。まだ*プレビュー*ではありますが...

AzCopy とどちらが良いか迷うところですが...ベンチマークしてみたいところ。

blobfuse を使用して Blob Storage をファイル システムとしてマウントする方法:
https://docs.microsoft.com/ja-jp/azure/storage/blobs/storage-how-to-mount-container-linux

Linux 仮想マシンのストレージに関しての FAQ はこちら

Azure IaaS VM ディスクと Premium 管理ディスクおよび非管理ディスクについてよく寄せられる質問:
https://docs.microsoft.com/ja-jp/azure/virtual-machines/linux/faq-for-disks