安全かつ最小にTerraformでGPUサーバーを起動する(AWS編)
普段、会社でやっている ML Ops 業務の振り返りを兼ねて最低限必要そうな Amazon VPC 構成用の Terraform Module を作りました。
そして Module には"最小構成"の機械学習環境を作るサンプルを同梱しています。
mazgi/simple-vpc/aws | Terraform Module Registry
Structure
⬇️ くらい"最小"です。
- “Amazon Virtual Private Cloud(VPC)“を 1 つ作る
- VPC の中に GPU 付きの仮想マシン(“Amazon EC2 インスタンス”)を 1 つ起動する
- EC2 インスタンスに SSH ログインする
- EC2 インスタンス上の Docker で Jupyter Notebook を起動する
- Jupyter Notebook に HTTP アクセスする
とてもシンプルですね。
ただし最低限のネットワークセキュリティとして接続元 IP アドレスを限定します。
接続元を IP アドレス制限することで、万が一 SSH の設定を間違えたりパスワードなしで Jupyter Notebook を起動してしまっても想定外のアクセスを軽減できます。
簡単な構成なので AWS の Web コンソールからでもそれほど手間なく作れますがちゃんと"Infrastructure as Code(IaC)“します。
インフラ構成をコードとして表現することでバージョン管理やレビュー, 共有, 再現, 複製ができるようになります。
そして IaC ツールである Terraform の Module にすることでより再利用しやすくなります。
AWS Resources
しかし"最小"とはいっても次のようないくつもの AWS リソースを使っています。
aws_eip
aws_internet_gateway
aws_main_route_table_association
aws_nat_gateway
aws_route_table
aws_route_table_association
aws_security_group
aws_subnet
aws_vpc
aws_vpc_dhcp_options
aws_vpc_dhcp_options_association
今回使う"Amazon EC2"をはじめとした"Infrastructure as a Service(IaaS)“でインフラ構成を考えるとあっという間にこれくらいのコンポーネントを使う必要が生じます。
その代わりに IaaS は自由度が高く多様なインフラを構成できることが魅力です。
VPC も EC2 インスタンスも複数作ることができますし、1 つの VPC を複数の Availability Zone にまたがるように構成して可用性を担保することもよくあります。
ただし今回は図の赤矢印のところに EC2 インスタンスを 1 つ作って起動したいだけなので VPC は 1 つあれば十分です。
最小構成といいつつ細かなところを気にし始めると IaaS はなかなかに複雑ですね。
もしネットワークや仮想マシンをあまり意識せずに AWS で Jupyter Notebook を使いたい場合はAmazon SageMakerのようなサービスもあります。
How to build this structure
今回のサンプルと Module のソースコードはこちらで公開しています。
README 通りに Credentials などを用意し apply
すると GPU インスタンスが起動します。
mazgi/terraform-aws-simple-vpc/examples/simple-ml
Terraform 0.12 に対応したので "${}"
が減ってスッキリしました。
module の output からオブジェクトを返せようになったので map
や zipmap
で無理矢理加工する必要も無くなりました 🎉
0.12
対応の差分は59f19fd0f2f258c46419fe30a08defac528dd7cbなどがわかりやすいです。
That’s all
普段の実務では色々な要件や制約もありシンプルなまま維持するのは難しいこともあるのですが、個人でこうやって基礎から振り返っていくと良い復習になると感じました。
筋トレ的にエンジニアリングの基礎体力を養うためにやっていきたいところです。
なお、実務の泥臭い話はもし ⬇️ builderscon CfP が通ればできる予定です(宣伝)。