AWS/EC2でGPUマシンを起動してみる

目次

EC2は立ち上げているとどんどんお金が請求されていきます!

私の計算環境については、プライベートではオンプレのGPU環境を自分で整備してきていましたし、EC2のGPU環境も使ってきています。

ただ今まで使ってきたEC2は得意な人に用意してもらったEC2を使わせてもらうことばかりでした。

というわけで自分でEC2を立ち上げる経験はあまりないので、今回チャレンジしてみます。(このブログ自体はEC2で動かしていますが…)

今回参考にさせて頂いたのは以下の記事です。とても丁寧でわかりやすかったです。

作成するインスタンス料金の調査

そこそこ動けばいいかなと思いつつ、ポケットマネーなので料金を調べておきます。料金を調べるのには以下のサイトを使いました。

本家のサイトもあるのですが、ざっくり把握するのには向かないのでこちらの方がいいですね。

今回はp2.xlargeというGPUインスタンスを使います。スペックはこんな感じ。

名称GPUvCPURAM(GiB)ネットワーク帯域幅価格/時間
p2.xlarge14610.9USD
p2.xlargeの料金(出所:https://aws.amazon.com/jp/ec2/instance-types/p2/)

ざっくり計算すると以下でした。

ざっくり計算した結果

東京リージョンでつけっぱなしだと13万くらいかかりそうなので気をつけます。ちなみに料金アラートを別途設定しているので、別記事で残しておいておこうと思います。

インスタンスの作成

いよいよインスタンスを作成していきます。まずAWSコンソールにアクセスします。この時に右上がバージニア北部になっていることを確認します。(東京リージョンだと料金が高いので)

メニューから「EC2 > インスタンスを起動」を選択します。すると以下のような画面が出てきますので、検索窓に「Deep Learning」を入力して、AMIを探します。

今回は「Deep Learning AMI (Ubuntu 18.04) Version 48.0」を使うことにします。

AMIの選択画面

選択するとインスタンスタイプを選択する画面に遷移するので、p2.xlargeを選択します。

インスタンスタイプの選択

「ストレージの追加」でとりあえずボリュームタイプgp2で200GBにしておきます。「セキュリティグループ」には 自宅の固定IPのみからアクセスできるようにSSHの設定をしておきました。

終わったら「確認と作成」で起動します。

起動すると以下画面のようなポップアップが出てきますので、「新しいキーペアの作成」を選択します。

キーペア名を入力して、キーペア(pem)をダウンロードしておきます。そしてインスタンスの作成をクリック。こんな感じで作成が開始されます。

EC2のダッシュボードから起動が確認できました。

作成したEC2に初回アクセス

私はWindowsを使っているので、Gitbashを開いて、先ほど保存したpemファイルの権限を変更しておきます。変更には以下コマンドを使います。

chmod 400 kazushi_ec2.pem

sshコマンドでの接続を確認します。

ssh -i /c/Users/kazushi/Desktop
/kazushi_ec2.pem ubuntu@ec2-XXX-XXX-XXX-XXX.compute-1.amazonaws.com

ちなみにubuntu@ec2-XXX-XXX-XXX-XXX.compute-1.amazonaws.comの部分はEC2のダッシュボードで確認できます。

接続できたらこんな感じになります。

=============================================================================
       __|  __|_  )
       _|  (     /   Deep Learning AMI (Ubuntu 18.04) Version 48.0
      ___|\___|___|
=============================================================================

Welcome to Ubuntu 18.04.5 LTS (GNU/Linux 5.4.0-1054-aws x86_64v)

Please use one of the following commands to start the required environment with the framework of your choice:
for AWS MX 1.7 (+Keras2) with Python3 (CUDA 10.1 and Intel MKL-DNN) _______________________________ source activate mxnet_p36
for AWS MX 1.8 (+Keras2) with Python3 (CUDA + and Intel MKL-DNN) ___________________________ source activate mxnet_latest_p37
for AWS MX(+AWS Neuron) with Python3 ___________________________________________________ source activate aws_neuron_mxnet_p36
for AWS MX(+Amazon Elastic Inference) with Python3 _______________________________________ source activate amazonei_mxnet_p36
for TensorFlow(+Keras2) with Python3 (CUDA + and Intel MKL-DNN) _____________________________ source activate tensorflow_p37
for Tensorflow(+AWS Neuron) with Python3 _________________________________________ source activate aws_neuron_tensorflow_p36
for TensorFlow 2.3(+Keras2) with Python3 (CUDA +  and Intel MKL-DNN) _______________________ source activate tensorflow2_p37
for TensorFlow 2.4 with Python3.7 (CUDA + and Intel MKL-DNN) ________________________ source activate tensorflow2_latest_p37
for PyTorch 1.4 with Python3 (CUDA 10.1 and Intel MKL) _________________________________________ source activate pytorch_p36
for PyTorch 1.7.1 with Python3.7 (CUDA 11.1 and Intel MKL) ________________________________ source activate pytorch_latest_p37
for PyTorch (+AWS Neuron) with Python3 ______________________________________________ source activate aws_neuron_pytorch_p36
for base Python3 (CUDA 10.0) _______________________________________________________________________ source activate python3

To automatically activate base conda environment upon login, run: 'conda config --set auto_activate_base true'
Official Conda User Guide: https://docs.conda.io/projects/conda/en/latest/user-guide/
AWS Deep Learning AMI Homepage: https://aws.amazon.com/machine-learning/amis/
Developer Guide and Release Notes: https://docs.aws.amazon.com/dlami/latest/devguide/what-is-dlami.html
Support: https://forums.aws.amazon.com/forum.jspa?forumID=263
For a fully managed experience, check out Amazon SageMaker at https://aws.amazon.com/sagemaker
When using INF1 type instances, please update regularly using the instructions at: https://github.com/aws/aws-neuron-sdk/tree/master/release-notes
=============================================================================

VSCodeからEC2にアクセス

ここからは参考にしたリンクにはなかったのですが、結局使う時にはVSCodeにアクセスしないとしんどいので、アクセスの設定をしておきます。

私はRemoteSSHを使っているので、そちらで設定していきます。

まず先ほどのpemファイルを.sshディレクトリに入れておきます。

そして.ssh内のconfigファイルに以下を設定します。

Host kazushi_ML
 HostName ec2-XXX-XXX-XXX-XXX.compute-1.amazonaws.com
 IdentityFile ~/.ssh/kazushi_ec2.pem
 User ubuntu
 Port XXXX

ちなみにHostNameのところは起動のたびに代わってしまうので、Elastic IPをアタッチしておくと便利です。

そしてVSCode左上の「SSH Targets」横に出てくる「kazushi_ML」を選択してアクセスしてみます。

VSCodeでのアクセスの様子

無事にアクセスできました。

GPUが認識できているか確認する

ちゃんと動作しているか一応みておきます。まずPythonの仮想環境をtensorflow_p37に変更して、env_check.pyファイルとして以下を準備します。

from tensorflow.python.client import device_lib
print(device_lib.list_local_devices())

これをpythonで実行すると以下のようなGPUに関する情報が出ていればOK。

incarnation: 1611944860646921124
physical_device_desc: "device: XLA_CPU device"
, name: "/device:XLA_GPU:0"
device_type: "XLA_GPU"
memory_limit: 17179869184

注意

EC2は立ち上げているとどんどんお金が請求されていくので、ちゃんと落とすようにしておくこと!p2.xlargeでも1か月放置すると10万円くらい請求されるのでめっちゃ注意!

ちなみに今回は200GBのストレージをつけて作成したが、こちらはEC2を立ち上げていなくても確保しているかぎり請求されてしまう。