機械学習用のクラウドインスタンスを管理するためのメモ


Linuxで最初にやっておくべき設定

EC2やGCEなどクラウドで機械学習用のインスタンスを立ち上げる際、
安定した運用をするために共通してこれらの設定はやっておく必要がある

スワップメモリの設定

クラウドのインスタンスではデフォルトでスワップメモリが設定されていないため、念のため設定しておく必要がある。

RHEL6(CentOS6)以前、Amazon Linuxもこちら

sudo sh -c 'fallocate -l 4040132k /swap.img && chmod 600 /swap.img && mkswap /swap.img && swapon /swap.img'

RHEL7(CentOS7)以降

sudo sh -c 'dd if=/dev/zero of=/swap.img count=4096 bs=1MiB && chmod 600 /swap.img && mkswap /swap.img && swapon /swap.img'

タイムゾーンの設定

デフォルトのタイムゾーンがUTCなのでJSTに設定しておく

sudo timedatectl set-timezone Asia/Tokyo

SELinuxの無効化

sudo vi /etc/selinux/config
sudo setenforce 0

カーネルパニックは10秒後に再起動

# 一時的
sudo sysctl kernel.panic=10
# 永続的
sudo sh -c "echo 'kernel.panic = 10' >> /etc/sysctl.conf && sysctl -p"

OOM killerが出ないようにする

# 一時的
sudo sysctl vm.overcommit_memory=2
# 永続的
sudo sh -c "echo 'vm.overcommit_memory=2' >> /etc/sysctl.conf && sysctl -p"

これでもOOM killerは少しは発生するが、特定のプロセスに対して絶対発生させないようにするためには

sudo echo -17 > /proc/プロセスID/oom_adj

/etc/rc.localの有効化

CentOS7の場合
これらのコマンドをシステム起動時に自動実行するためには(公式には古い非推奨の方法だが)/etc/rc.localを使うのが簡単。
デフォルトではこのファイルには実行権限が付けられていないために無効化されているので、実行権限を付ければ有効になる。

sudo chmod 755 /etc/rc.local

Ubuntu16では以下の通り

https://qiita.com/onokatio/items/b2ecabf5da3c725fa542

Redhat系Linux、Debian系Linux、MacOSのパッケージ管理ツールの比較

  • Redhat系(RHEL, CentOS, SUSEなど)
  • Debian系(Debian, Ubuntuなど)
  • Mac(ただしHomebrew)
yum apt Homebrew
インストール yum install packagename apt-get install packagename brew install packagename
アンインストール yum remove packagename apt-get remove packagename brew uninstall packagename
名前で検索 yum search keyword apt-cache search keyword brew search keyword
含まれるファイル名で検索 yum provides filename apt-file search filename
全更新 yum upgrade apt-get dist-upgrade brew upgrade && brew cleanup
インストール済み一覧 yum list installed apt list –installed brew list

Homebrewの場合インストール直後には実行バイナリのパスが$PATHに含まれていないため実行できない。そこでリンクをする必要がある。

全てのパッケージをリンクする

brew list -1 | while read line; do brew unlink $line; brew link --force $line; done

Google Cloud Storageのマウント

Google Cloud Storage上にデータファイルや学習済みモデルなどの大きなファイルを格納するが、
gsutilコマンドではなく通常のローカルファイルと同様にコマンドラインで扱えるようにしたい。
そこでGCS上のバケットをローカルのディレクトリにマウントするツールであるgcsfuseを使う。

gcsfuseのインストール

https://github.com/GoogleCloudPlatform/gcsfuse/blob/master/docs/installing.md

のとおり。

gcsfuseコマンドの使い方

ローカルにマウントポイントとなるディレクトリを作成し、指定のバケットをマウントする。

gcsfuse バケット名 マウントポイント

このままではバケット直下のファイルにしかアクセスできない。バケット内のフォルダにアクセスできないのだが、mkdirコマンドで空のディレクトリを作ることで、その中のファイルにアクセスできるようになる。たとえばgs://バケット名/my_folderの中身にアクセスできるようするには

mkdir マウントポイント/my_folder

個別にmkdirせずに全てのサブディレクトリも同時に読み込めるようにするには、マウント時に

gcsfuse --implicit-dirs バケット名 マウントポイント

デフォルトでキャッシュが効くため、ファイルの更新が反映されにくい。キャッシュを無効にするには

gcsfuse バケット名 マウントポイント --stat-cache-ttl 0 and --type-cache-ttl 0

アンマウントするには

fusermount -u マウントポイント

EC2などのGCE以外の環境では環境変数$GOOGLE_APPLICATION_CREDENTIALSにcredentialを明示的に指定しておく必要がある。

export GOOGLE_APPLICATION_CREDENTIALS=/home/my_user/service-account.json

これを~/.bash_profileなどに記述しておいてあらかじめ実行されるようにしておくといい