23.3. AWS EC2 インスタンスの使用

この節では、素の Linux マシンにすべてのライブラリをインストールする方法を示す。 23.2 章 では Amazon SageMaker の使い方を説明したが、AWS では自分でインスタンスを構築するほうが費用は安く済む。手順は次の 3 ステップである。

  1. AWS EC2 から GPU 搭載の Linux インスタンスを要求する。

  2. CUDA をインストールする(または CUDA があらかじめインストールされた Amazon Machine Image を使う)。

  3. 本書のコードを実行するための深層学習フレームワークやその他のライブラリをインストールする。

この手順は、多少の変更は必要だが、他のインスタンス(および他のクラウド)にも適用できる。先に進む前に AWS アカウントを作成する必要がある。詳細は 23.2 章 を参照されたい。

23.3.1. EC2 インスタンスの作成と実行

AWS アカウントにログインしたら、“EC2” をクリックして (図 23.3.1) EC2 パネルへ移動する。

../_images/aws.png

図 23.3.1 EC2 コンソールを開く。

図 23.3.2 に EC2 パネルを示す。

../_images/ec2.png

図 23.3.2 EC2 パネル。

23.3.1.1. 場所の事前設定

遅延を減らすため、近くのデータセンターを選択する。たとえば、右上の赤枠で示した “Oregon” である (図 23.3.2)。中国にいる場合は、ソウルや東京など、近いアジア太平洋リージョンを選択できる。なお、データセンターによっては GPU インスタンスが利用できない場合がある。

23.3.1.2. 制限の増加

インスタンスを選ぶ前に、左側のバーにある “Limits” ラベルをクリックして、数量制限があるかどうかを確認する。 図 23.3.2 に示すようにする。 図 23.3.3 はそのような制限の例である。現在のアカウントでは、リージョンの制約により “p2.xlarge” インスタンスを起動できない。1 つ以上のインスタンスを起動する必要がある場合は、“Request limit increase” リンクをクリックして、より高いインスタンス割り当てを申請する。通常、申請の処理には 1 営業日かかる。

../_images/limits.png

図 23.3.3 インスタンス数の制限。

23.3.1.3. インスタンスの起動

次に、 図 23.3.2 の赤枠で示した “Launch Instance” ボタンをクリックして、インスタンスを起動する。

まず、適切な Amazon Machine Image (AMI) を選択する。Ubuntu インスタンスを選ぶ (図 23.3.4)。

../_images/ubuntu-new.png

図 23.3.4 AMI を選択する。

EC2 では、さまざまなインスタンス構成を選べる。初心者には少し圧倒されるかもしれない。 tab_ec2 に適したマシンの例を示する。

:さまざまな EC2 インスタンスタイプ

表 23.3.1 label:tab_ec2

Name

GPU

Notes

g2

Grid K520

ancient

p2

Kepler K80

old but often cheap as spot

g3

Maxwell M60

good trade-off

p3

Volta V100

high performance for FP16

p4

Ampere A100

high performance for large-scale training

g4

Turing T4

inference optimized FP16/INT8

これらのサーバーには、使用する GPU の数を示す複数のバリエーションがある。たとえば、p2.xlarge は GPU が 1 基、p2.16xlarge は GPU が 16 基で、メモリも多くなる。詳細は AWS EC2 documentation または summary page を参照する。説明のためには p2.xlarge で十分です (図 23.3.5 の赤枠で示している)。

../_images/p2x.png

図 23.3.5 インスタンスを選択する。

GPU を使うには、適切なドライバと GPU 対応の深層学習フレームワークを備えた GPU 有効インスタンスを使う必要があることに注意する。そうでなければ、GPU を使う利点は得られない。

続いて、インスタンスにアクセスするためのキーペアを選択する。キーペアがない場合は、 図 23.3.6 の “Create new key pair” をクリックしてキーペアを生成する。その後、以前に生成したキーペアを選択できる。新しいキーペアを生成した場合は、必ずダウンロードして安全な場所に保管する。これはサーバーへ SSH 接続する唯一の方法である。

../_images/keypair.png

図 23.3.6 キーペアを選択する。

この例では、“Network settings” の既定設定はそのままにする(サブネットやセキュリティグループなどを設定するには “Edit” ボタンをクリックする)。ここでは、既定のハードディスクサイズを 64 GB に増やすだけにする (図 23.3.7)。CUDA だけでもすでに 4 GB を占有することに注意する。

../_images/disk.png

図 23.3.7 ハードディスクサイズを変更する。

“Launch Instance” をクリックして作成したインスタンスを起動する。 図 23.3.8 に示すインスタンス ID をクリックすると、このインスタンスの状態を確認できる。

../_images/launching.png

図 23.3.8 インスタンス ID をクリックする。

23.3.1.4. インスタンスへの接続

図 23.3.9 に示すように、インスタンスの状態が緑色になったら、インスタンスを右クリックして Connect を選択し、インスタンスへの接続方法を表示する。

../_images/connect.png

図 23.3.9 インスタンスへの接続方法を表示する。

これが新しい鍵である場合、SSH を機能させるには公開表示されていてはいけない。D2L_key.pem を保存したフォルダに移動し、次のコマンドを実行して鍵を公開表示不可にする。

chmod 400 D2L_key.pem
../_images/chmod.png

図 23.3.10 インスタンスへの接続方法と起動方法を表示する。

次に、 図 23.3.10 の下側の赤枠にある SSH コマンドをコピーして、コマンドラインに貼り付ける。

ssh -i "D2L_key.pem" ubuntu@ec2-xx-xxx-xxx-xxx.y.compute.amazonaws.com

コマンドラインで “Are you sure you want to continue connecting (yes/no)” と表示されたら、“yes” と入力して Enter を押し、インスタンスにログインする。

これでサーバーの準備は完了である。

23.3.2. CUDA のインストール

CUDA をインストールする前に、最新のドライバでインスタンスを更新する。

sudo apt-get update && sudo apt-get install -y build-essential git libgfortran3

ここでは CUDA 12.1 をダウンロードする。NVIDIA の official repository にアクセスして、 図 23.3.11 に示すようにダウンロードリンクを見つけよ。

../_images/cuda121.png

図 23.3.11 CUDA 12.1 のダウンロード先を見つける。

指示をコピーして端末に貼り付け、CUDA 12.1 をインストールする。

# The link and file name are subject to changes
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu2204/x86_64/cuda-ubuntu2204.pin
sudo mv cuda-ubuntu2204.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget https://developer.download.nvidia.com/compute/cuda/12.1.0/local_installers/cuda-repo-ubuntu2204-12-1-local_12.1.0-530.30.02-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu2204-12-1-local_12.1.0-530.30.02-1_amd64.deb
sudo cp /var/cuda-repo-ubuntu2204-12-1-local/cuda-*-keyring.gpg /usr/share/keyrings/
sudo apt-get update
sudo apt-get -y install cuda

プログラムをインストールした後、次のコマンドを実行して GPU を確認する。

nvidia-smi

最後に、CUDA をライブラリパスに追加して他のライブラリが見つけられるようにする。たとえば、次の行を ~/.bashrc の末尾に追加する。

export PATH="/usr/local/cuda-12.1/bin:$PATH"
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda-12.1/lib64

23.3.3. コード実行用ライブラリのインストール

本書のコードを実行するには、EC2 インスタンス上の Linux ユーザー向けに インストール の手順に従い、リモート Linux サーバーで作業する際には次のヒントを使っよ。

  • Miniconda のインストールページにある bash スクリプトをダウンロードするには、ダウンロードリンクを右クリックして “Copy Link Address” を選び、wget [コピーしたリンクアドレス] を実行する。

  • ~/miniconda3/bin/conda init を実行した後は、現在のシェルを閉じて開き直す代わりに source ~/.bashrc を実行してもかまわない。

23.3.4. Jupyter Notebook をリモートで実行する

Jupyter Notebook をリモートで実行するには、SSH のポートフォワーディングを使う必要がある。そもそも、クラウド上のサーバーにはモニターもキーボードもない。そのため、次のようにデスクトップ(またはノートパソコン)からサーバーにログインする。

# This command must be run in the local command line
ssh -i "/path/to/key.pem" ubuntu@ec2-xx-xxx-xxx-xxx.y.compute.amazonaws.com -L 8889:localhost:8888

次に、EC2 インスタンス上で本書のダウンロード済みコードの場所に移動し、以下を実行する。

conda activate d2l
jupyter notebook

図 23.3.12 は、Jupyter Notebook を実行した後に得られる出力例を示している。最後の行がポート 8888 の URL である。

../_images/jupyter.png

図 23.3.12 Jupyter Notebook 実行後の出力。最後の行がポート 8888 の URL である。

ポートフォワーディングで 8889 番ポートを使っているので、 図 23.3.12 の赤枠内の最後の行をコピーし、URL の “8888” を “8889” に置き換えて、ローカルのブラウザで開く。

23.3.5. 使用していないインスタンスを終了する

クラウドサービスは使用時間に応じて課金されるため、使っていないインスタンスは閉じるべきである。なお、次の 2 つの方法がある。

  • インスタンスを “Stopping” すると、再び起動できるようになる。これは通常のサーバーの電源を切るのに似ている。ただし、停止中のインスタンスでも、保持されているハードディスク領域に対して少額の課金は続く。

  • インスタンスを “Terminating” すると、それに関連付けられたすべてのデータが削除される。これにはディスクも含まれるため、再起動することはできない。将来使う予定がないと確信している場合にのみ実行する。

このインスタンスをさらに多くのインスタンスのテンプレートとして使いたい場合は、 図 23.3.9 の例を右クリックして “Image” \(\rightarrow\) “Create” を選び、インスタンスのイメージを作成する。完了したら、“Instance State” \(\rightarrow\) “Terminate” を選んでインスタンスを終了する。次回このインスタンスを使いたいときは、この節の手順に従って保存したイメージを基にインスタンスを作成できる。違いは、 図 23.3.4 に示した “1. Choose AMI” で、左側の “My AMIs” オプションを使って保存したイメージを選択する点だけである。作成されたインスタンスには、イメージのハードディスクに保存されていた情報が保持される。たとえば、CUDA やその他の実行環境を再インストールする必要はない。

23.3.6. まとめ

  • 自分でコンピュータを購入して構築しなくても、必要に応じてインスタンスを起動・停止できる。

  • GPU 対応の深層学習フレームワークを使う前に CUDA をインストールする必要がある。

  • ポートフォワーディングを使えば、リモートサーバー上で Jupyter Notebook を実行できる。

23.3.7. 演習

  1. クラウドは便利であるが、安くはない。費用を抑えるために spot instances を起動する方法を調べよ。

  2. さまざまな GPU サーバーを試してみよ。どれくらい速いだろうか。

  3. マルチ GPU サーバーを試してみよ。どの程度スケールアップできるだろうか。