みらいテックラボ

音声・画像認識や機械学習など, 週末プログラマである管理人が興味のある技術の紹介や実際にトライしてみた様子などメモしていく.

Amazon S3をUbuntuにマウントする

最近, AmazonGPUインスタンス(主に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