最近, AmazonのGPUインスタンス(主にP2)をスポットで使用して, Deep Learningを試すことが増えてきた.
その際に, 学習/評価データをAmazon S3に置いたり, 学習途中でのスポットインスタンス強制停止に備えて, 途中の学習経過をS3に保存しておきたいと思い, S3をgoofysを使ってUbuntuからマウントすることにした.
goofysを使ったS3のマウントについてはすでにいくつか記事[1][2][3]があるが, goのバージョンの関係でそのままでは動作しなかったので, まとめておく.
★★★★
2021/6/7の時点で, 下記手順ではgoofysのインストールで失敗する場合があった.
「Amazon S3をUbuntuにマウントする(2)」に別の手順を記載したので, こちらを参照ください.
★★★★
0. OS環境
$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=16.04 DISTRIB_CODENAME=xenial DISTRIB_DESCRIPTION="Ubuntu 16.04.2 LTS"
1. Goインストール
ここから, 最新版のgo1.8.3をダウンロードする.
$ sudo tar -C /usr/local -xzf go1.8.3.linux-amd64.tar.gz $ export PATH=$PATH:/usr/local/go/bin $ go version go version go1.8.3 linux/amd64
注) "apt-get install golang"でインストールするとgo1.6がインストールされ, あとでgoofysのインストールで失敗する.
PATHの設定
$ [ ! -e ~/go/ ] && mkdir ~/go $ export GOPATH=$HOME/go $ export PATH="$PATH:$GOPATH/bin"
2. goofysインストール
2.1 git
$ sudo apt-get install git $ git --version git version 2.7.4
2.2 goofys
$ go get github.com/kahing/goofys $ go install github.com/kahing/goofys $ goofys -h Error: goofys takes exactly two arguments. NAME: goofys - Mount an S3 bucket locally USAGE: goofys [global options] bucket[:prefix] mountpoint VERSION: 0.0.13- GLOBAL OPTIONS: --help, -h Print this help text and exit successfully. :
注) go1.6の場合, 以下のようなエラーが発生する. contextはgo1.7以降で対応.
$ go get github.com/kahing/goofys package context: unrecognized import path "context" (import path does not begin with hostname)
3. AWS CLIインストールと設定
3.1 aws cli
$ sudo apt-get install awscli $ aws --version aws-cli/1.11.61 Python/3.4.3 Linux/3.13.0-107-generic botocore/1.5.24
3.2 設定
$ aws configure AWS Access Key ID [None]: ******************** AWS Secret Access Key [None]: **************************************** Default region name [None]: us-west-2 Default output format [None]: json
3.3 バケットの作成
aws cli環境の設定が完了したら, マウントするためのバケットを作成する.
$ aws s3 mb s3://goofys.aska.oregon make_bucket: goofys.aska.oregon $ aws s3 ls s3:// 2017-07-09 14:59:34 goofys.aska.oregon
4. S3マウントとアンマウント
4.1 マウント
$ mkdir ~/mnt-goofys $ goofys goofys.aska.oregon ~/mnt-goofys $ df -h Filesystem Size Used Avail Use% Mounted on udev 30G 12K 30G 1% /dev tmpfs 6.0G 788K 6.0G 1% /run /dev/xvda1 50G 40G 7.8G 84% / none 4.0K 0 4.0K 0% /sys/fs/cgroup none 5.0M 0 5.0M 0% /run/lock none 30G 0 30G 0% /run/shm none 100M 0 100M 0% /run/user goofys.aska.oregon 1.0P 0 1.0P 0% /home/ubuntu/mnt-goofys
4.2 アンマウント
$ sudo umount ~/mnt-goofys
5. 最後に
EC2インスタンスからS3をマウントできるようにしたことで, S3をファイルシステムとして扱えるようになった.
これで, スポットインスタンスを利用してDeep Learningを試す際に, インスタンス強制停止に備えて途中の学習モデル等を容易に保存できる.
万一インスタンス強制停止となっても, S3に保存されている学習モデルを読み込んで, 途中から学習を継続することが可能に...
G2インスタンスでは1回インスタンス強制停止をくらって, それまでの学習がおじゃんになったことがあるが, 現状ではP2インスタンスはG2インスタンスに比べ急激な時価高騰があまりない感じ...
ただ, AWSの費用を抑えるために, 万一に備えておくことは大事である.
また, 学習が終了した時点で学習モデルやログ等をS3に保存し, スポットインスタンスを自動で停止させることもできる.
これはまだ試していないが, 学習が終了してスポットインスタンスを終了させるのを気にしなくてよくなるので, スポットインスタンスの使い勝手がよくなりそう.
----
[1] goofysを使ってAmazon LinuxにS3をマウントする。 - Qiita
[2] Ubuntu に goofys をインストールして s3 をマウントする (サーバー起動時の自動マウント設定と予期せずマウントが外れた際の対策を含む) - Qiita
[3] https://academy.gmocloud.com/advance/20160812/3438