SageMakerを使っていてディスク容量が足りない!goofysでAmazon S3をマウントしてみよう

SageMakerのノートブックインスタンスでAmazon S3をストレージとしてマウントします。 ライフサイクルを使用して起動時に自動的にマウントも行えるように設定します。
2018.08.25

はじめに

SageMakerは5GBのストレージが提供されています。物体検知などの画像を使用する機械学習を行っていると、容量を使い切ってしまい学習ができない!という自体に陥ることがあります(私は陥りました...)。

ノートブックインスタンス内で複数の学習を行っていたりすると、5GBは心許ないですねAmazon S3(以降、S3)をマウントしてストレージとして使用してみましょう。

やってみた

IAMロールにS3へのアクセス権限を付与

デフォルトのロールであればS3へのフルアクセスが許可されているので設定は不要です。

ノートブックインスタンスを起動して開く

上記の作業でS3への権限が設定されたノートブックインスタンスを起動しましょう。

Terminalを開く

Terminalで作業する必要があります。Terminalは、図のように New → Terminal と起動しましょう。

goofysをインストールする

バケット名は自分のバケット名に置き換えてください。

# goofysの依存パッケージをインストール
sudo yum -y install golang fuse
# GOPATHの設定(SageMakerフォルダ配下にしてください、理由は後述)
export GOPATH=~/SageMaker/go
# PATHの設定
export PATH=$GOPATH/bin/:$PATH"
# goofysをインストール
go get github.com/kahing/goofys
go install github.com/kahing/goofys
# S3をマウント
/home/ec2-user/SageMaker/go/bin/goofys バケット名 ~/SageMaker/goofys-mount/

これでS3をマウントできました!

ですが、このままではノートブックインスタンスの再起動の度に手動でマウントし直す必要があります。面倒なので自動マウントを設定しましょう。

自動マウントといえば/etc/fstabへの記述ですが、ノートブックインスタンスはユーザー領域(~/SageMaker)以外への変更は再起動後失われてしまいます。

ライフサイクルの機能を使って自動マウントを実現してみました。

ライフサイクルを作成

ライフサイクルを作成します。ライフサイクルはroot権限で動作します、~/などユーザーに依存する要素を使用する場合は注意してください。

スクリプトは下記のコードブロックをコピペしてください。こちらもバケット名は自分のバケット名に置き換えてください。

#!/bin/bash

set -e

yum -y install fuse
su ec2-user -c "/home/ec2-user/SageMaker/go/bin/goofys バケット名 ~/SageMaker/goofys-mount/"

fuseも消えてしまっているので都度インストールする必要があります。

ec2-user権限で実行するために、suコマンドでスイッチしてマウントを行っています。

ノートブックインスタンスにライフサイクルを設定

あとがき

ライフサイクルのスクリプトがroot権限で動いていることに気づいていなくて、~/SageMaker/goofys-mount/が存在していないパスを指してしまいマウントが失敗していました。

失敗時のログはCloudWatch Logsで見ることができるのですが、main.FATAL Unable to mount file system, see syslog for detailsとsyslogを見ろというメッセージしか表示されません。

ライフサイクルでコケてしまうとインスタンスが起動せず、syslogを見ることができません。(ライフサイクルを解除して起動したとしても前回のsyslogは消えてしまう)

syslogは見れないので手探りでの調査で辛かったです、もしかしてユーザーかもと思いライフサイクルでwhoamiコマンドを叩いてroot権限であることを確認しました。

今回はS3をマウントしましたが、EFSをマウントするという方法もあります。