#はじめに
本記事はAWSのLambda上でPyTorchを動かして見ようという試みについてのまとめです。DeepLearningタグをつけていますが、学習については触れません。ゴールはLambda上で何かしらの推論を動かしてみるというところまでです。
ざっくりまとめ
- EFS使ってみる
- LambdaでPyTorch
- slackからも呼ぶ
の三本立てです。
背景
AWS Lambdaは非常に構築が楽で便利なのですが、様々な制限があります。機械学習をするときにとくに問題になりそうなのが、デプロイパッケージサイズと/tmp
領域サイズです。
デプロイパッケージサイズ
50 MB (zip 圧縮済み、直接アップロード)
250 MB (解凍、レイヤーを含む)
3 MB (コンソールエディタ)
/tmp ディレクトリのストレージ
512 MB
TensorFlow, PyTorchなどのライブラリも益々巨大化していきますしモデルファイルも大きくなってきています。Lambdaに搭載したいが容量オーバーで諦めるということが往々にしてあります。
2020年6月のアップデートでLambdaがAmazon Elastic File System(EFS)をマウントすることができるようになりました。
これにより以下のような恩恵があります。
- /tmpで使用可能な容量(512MB)より大きいデータを処理またはロードする。
- 頻繁に変更されるファイルの最新バージョンをロードする。
- モデルやその他の依存関係をロードするためにストレージ容量を必要とするデータサイエンスパッケージを使用する。
- 呼び出し間で関数の状態を保存する(一意のファイル名またはファイルシステムロックを使用)。
- 大量の参照データへのアクセスを必要とするアプリケーションの構築。
- レガシーアプリケーションをサーバーレスアーキテクチャに移行する。
- ファイルシステムアクセス用に設計されたデータ集約型ワークロードとの相互作用。
- ファイルを部分的に更新する(同時アクセス用のファイルシステムロックを使用)。
- アトミック操作でファイルシステム内のディレクトリとそのすべてのコンテンツを移動する。
特に今回の場合は、モデルやその他の依存関係をロードするためにストレージ容量を必要とするデータサイエンスパッケージを使用する。
が該当するでしょうか。
EFSを用意
EFSの準備は、先行事例を大いに参考にさせてもらいます。
EFSの作成とアクセスポイントの準備
PyTorch用のEC2を準備
Python3.7を使用するつもりなので、AmazonLinuxを指定します。(Python3.8ならAmazonLinux2を利用しましょう。)
Python2系しか入っていないのでPython3.7をインストールします。この記事はPython3.8用ですがPython3.7に読み替えておきます。
EFSをEC2にマウント
EFSのマウントにEFSマウントヘルパーが必要なので、
$ sudo yum install -y amazon-efs-utils
で入れておきます。
EFSのセキュリティーグループにEC2のセキュリティグループを追加しておきます。
インバウンドルールにタイプをNFS
とプロトコルにTCP
、ポート範囲2049
を指定してソースにEC2インスタンスのセキュリティグループを指定しておきます。
EC2にログインして以下のコマンドを叩きましょう。
$ sudo mount -t efs [ファイルシステムID]:/ /mnt
EC2で必要なライブラリをインストール
必要なライブラリをインストールします。
$ sudo pip3 install torch==1.6.0+cpu torchvision==0.7.0+cpu -f https://download.pytorch.org/whl/torch_stable.html
これでEFSにPyTorchがインストールできたので、次回Lambdaから読み込みます。(Lambdaでimport編)