.. _sec_aws:
AWS EC2 インスタンスの使用
==========================
この節では、素の Linux
マシンにすべてのライブラリをインストールする方法を示す。
:numref:`sec_sagemaker` では Amazon SageMaker
の使い方を説明したが、AWS
では自分でインスタンスを構築するほうが費用は安く済む。手順は次の 3
ステップである。
1. AWS EC2 から GPU 搭載の Linux インスタンスを要求する。
2. CUDA をインストールする(または CUDA があらかじめインストールされた
Amazon Machine Image を使う)。
3. 本書のコードを実行するための深層学習フレームワークやその他のライブラリをインストールする。
この手順は、多少の変更は必要だが、他のインスタンス(および他のクラウド)にも適用できる。先に進む前に
AWS アカウントを作成する必要がある。詳細は :numref:`sec_sagemaker`
を参照されたい。
EC2 インスタンスの作成と実行
----------------------------
AWS アカウントにログインしたら、“EC2” をクリックして
(:numref:`fig_aws`) EC2 パネルへ移動する。
.. _fig_aws:
.. figure:: ../img/aws.png
:width: 400px
EC2 コンソールを開く。
:numref:`fig_ec2` に EC2 パネルを示す。
.. _fig_ec2:
.. figure:: ../img/ec2.png
:width: 700px
EC2 パネル。
場所の事前設定
~~~~~~~~~~~~~~
遅延を減らすため、近くのデータセンターを選択する。たとえば、右上の赤枠で示した
“Oregon” である
(:numref:`fig_ec2`)。中国にいる場合は、ソウルや東京など、近いアジア太平洋リージョンを選択できる。なお、データセンターによっては
GPU インスタンスが利用できない場合がある。
制限の増加
~~~~~~~~~~
インスタンスを選ぶ前に、左側のバーにある “Limits”
ラベルをクリックして、数量制限があるかどうかを確認する。
:numref:`fig_ec2` に示すようにする。 :numref:`fig_limits`
はそのような制限の例である。現在のアカウントでは、リージョンの制約により
“p2.xlarge” インスタンスを起動できない。1
つ以上のインスタンスを起動する必要がある場合は、“Request limit increase”
リンクをクリックして、より高いインスタンス割り当てを申請する。通常、申請の処理には
1 営業日かかる。
.. _fig_limits:
.. figure:: ../img/limits.png
:width: 700px
インスタンス数の制限。
インスタンスの起動
~~~~~~~~~~~~~~~~~~
次に、 :numref:`fig_ec2` の赤枠で示した “Launch Instance”
ボタンをクリックして、インスタンスを起動する。
まず、適切な Amazon Machine Image (AMI) を選択する。Ubuntu
インスタンスを選ぶ (:numref:`fig_ubuntu`)。
.. _fig_ubuntu:
.. figure:: ../img/ubuntu-new.png
:width: 700px
AMI を選択する。
EC2
では、さまざまなインスタンス構成を選べる。初心者には少し圧倒されるかもしれない。
:numref:`tab_ec2` に適したマシンの例を示する。
:さまざまな EC2 インスタンスタイプ
.. table:: 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 で十分です (:numref:`fig_p2x`
の赤枠で示している)。
.. _fig_p2x:
.. figure:: ../img/p2x.png
:width: 700px
インスタンスを選択する。
GPU を使うには、適切なドライバと GPU
対応の深層学習フレームワークを備えた GPU
有効インスタンスを使う必要があることに注意する。そうでなければ、GPU
を使う利点は得られない。
続いて、インスタンスにアクセスするためのキーペアを選択する。キーペアがない場合は、
:numref:`fig_keypair` の “Create new key pair”
をクリックしてキーペアを生成する。その後、以前に生成したキーペアを選択できる。新しいキーペアを生成した場合は、必ずダウンロードして安全な場所に保管する。これはサーバーへ
SSH 接続する唯一の方法である。
.. _fig_keypair:
.. figure:: ../img/keypair.png
:width: 500px
キーペアを選択する。
この例では、“Network settings”
の既定設定はそのままにする(サブネットやセキュリティグループなどを設定するには
“Edit” ボタンをクリックする)。ここでは、既定のハードディスクサイズを 64
GB に増やすだけにする (:numref:`fig_disk`)。CUDA だけでもすでに 4 GB
を占有することに注意する。
.. _fig_disk:
.. figure:: ../img/disk.png
:width: 700px
ハードディスクサイズを変更する。
“Launch Instance” をクリックして作成したインスタンスを起動する。
:numref:`fig_launching` に示すインスタンス ID
をクリックすると、このインスタンスの状態を確認できる。
.. _fig_launching:
.. figure:: ../img/launching.png
:width: 700px
インスタンス ID をクリックする。
インスタンスへの接続
~~~~~~~~~~~~~~~~~~~~
:numref:`fig_connect`
に示すように、インスタンスの状態が緑色になったら、インスタンスを右クリックして
``Connect`` を選択し、インスタンスへの接続方法を表示する。
.. _fig_connect:
.. figure:: ../img/connect.png
:width: 700px
インスタンスへの接続方法を表示する。
これが新しい鍵である場合、SSH
を機能させるには公開表示されていてはいけない。\ ``D2L_key.pem``
を保存したフォルダに移動し、次のコマンドを実行して鍵を公開表示不可にする。
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
chmod 400 D2L_key.pem
.. _fig_chmod:
.. figure:: ../img/chmod.png
:width: 400px
インスタンスへの接続方法と起動方法を表示する。
次に、 :numref:`fig_chmod` の下側の赤枠にある SSH
コマンドをコピーして、コマンドラインに貼り付ける。
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
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
を押し、インスタンスにログインする。
これでサーバーの準備は完了である。
CUDA のインストール
-------------------
CUDA をインストールする前に、最新のドライバでインスタンスを更新する。
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
sudo apt-get update && sudo apt-get install -y build-essential git libgfortran3
ここでは CUDA 12.1 をダウンロードする。NVIDIA の `official
repository `__
にアクセスして、 :numref:`fig_cuda`
に示すようにダウンロードリンクを見つけよ。
.. _fig_cuda:
.. figure:: ../img/cuda121.png
:width: 500px
CUDA 12.1 のダウンロード先を見つける。
指示をコピーして端末に貼り付け、CUDA 12.1 をインストールする。
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
# 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 を確認する。
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
nvidia-smi
最後に、CUDA
をライブラリパスに追加して他のライブラリが見つけられるようにする。たとえば、次の行を
``~/.bashrc`` の末尾に追加する。
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
export PATH="/usr/local/cuda-12.1/bin:$PATH"
export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:/usr/local/cuda-12.1/lib64
コード実行用ライブラリのインストール
------------------------------------
本書のコードを実行するには、EC2 インスタンス上の Linux ユーザー向けに
:ref:`chap_installation` の手順に従い、リモート Linux
サーバーで作業する際には次のヒントを使っよ。
- Miniconda のインストールページにある bash
スクリプトをダウンロードするには、ダウンロードリンクを右クリックして
“Copy Link Address” を選び、\ ``wget [コピーしたリンクアドレス]``
を実行する。
- ``~/miniconda3/bin/conda init``
を実行した後は、現在のシェルを閉じて開き直す代わりに
``source ~/.bashrc`` を実行してもかまわない。
Jupyter Notebook をリモートで実行する
-------------------------------------
Jupyter Notebook をリモートで実行するには、SSH
のポートフォワーディングを使う必要がある。そもそも、クラウド上のサーバーにはモニターもキーボードもない。そのため、次のようにデスクトップ(またはノートパソコン)からサーバーにログインする。
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
# 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
インスタンス上で本書のダウンロード済みコードの場所に移動し、以下を実行する。
.. raw:: latex
\diilbookstyleinputcell
.. code:: python
conda activate d2l
jupyter notebook
:numref:`fig_jupyter` は、Jupyter Notebook
を実行した後に得られる出力例を示している。最後の行がポート 8888 の URL
である。
.. _fig_jupyter:
.. figure:: ../img/jupyter.png
:width: 700px
Jupyter Notebook 実行後の出力。最後の行がポート 8888 の URL である。
ポートフォワーディングで 8889 番ポートを使っているので、
:numref:`fig_jupyter` の赤枠内の最後の行をコピーし、URL の “8888” を
“8889” に置き換えて、ローカルのブラウザで開く。
使用していないインスタンスを終了する
------------------------------------
クラウドサービスは使用時間に応じて課金されるため、使っていないインスタンスは閉じるべきである。なお、次の
2 つの方法がある。
- インスタンスを “Stopping”
すると、再び起動できるようになる。これは通常のサーバーの電源を切るのに似ている。ただし、停止中のインスタンスでも、保持されているハードディスク領域に対して少額の課金は続く。
- インスタンスを “Terminating”
すると、それに関連付けられたすべてのデータが削除される。これにはディスクも含まれるため、再起動することはできない。将来使う予定がないと確信している場合にのみ実行する。
このインスタンスをさらに多くのインスタンスのテンプレートとして使いたい場合は、
:numref:`fig_connect` の例を右クリックして “Image” :math:`\rightarrow`
“Create” を選び、インスタンスのイメージを作成する。完了したら、“Instance
State” :math:`\rightarrow` “Terminate”
を選んでインスタンスを終了する。次回このインスタンスを使いたいときは、この節の手順に従って保存したイメージを基にインスタンスを作成できる。違いは、
:numref:`fig_ubuntu` に示した “1. Choose AMI” で、左側の “My AMIs”
オプションを使って保存したイメージを選択する点だけである。作成されたインスタンスには、イメージのハードディスクに保存されていた情報が保持される。たとえば、CUDA
やその他の実行環境を再インストールする必要はない。
まとめ
------
- 自分でコンピュータを購入して構築しなくても、必要に応じてインスタンスを起動・停止できる。
- GPU 対応の深層学習フレームワークを使う前に CUDA
をインストールする必要がある。
- ポートフォワーディングを使えば、リモートサーバー上で Jupyter Notebook
を実行できる。
演習
----
1. クラウドは便利であるが、安くはない。費用を抑えるために `spot
instances `__
を起動する方法を調べよ。
2. さまざまな GPU サーバーを試してみよ。どれくらい速いだろうか。
3. マルチ GPU
サーバーを試してみよ。どの程度スケールアップできるだろうか。