はじめに
AWSのECSでGPUを使う場合、ECS側ではGPU搭載のインスタンスはデフォルトでは選べません。今のところ自分自身でどうにかするしかありません。その方法を記載します。
1. ECSでクラスターを作成
ECSで新規にクラスターを作成します。ここで設定するクラスター名は後ほど使います。今回の説明ではecs-clusterという名前で説明します。
2. ECSで動かせるGPUのAMIを作成する
AWSの公式ページにあるので、こちらの手順に沿ってAMIの作成まで行います。
GPUワークロードのAMIの作成
こちらの手順の最後にec2-userでsudoをつけずにDockerを叩けるように設定しておくと構築時に便利になります。
$ sudo usermod -g docker ec2-user
$ sudo /etc/init.d/docker restart
上記のコマンド入力後は一度ターミナルから抜けて再接続する必要があります。
3. 作成したGPUのAMIを使ってインスタンス作成
インスタンスの設定
ここではp2.xlargeを使って、インスタンスを立ち上げます。
以下の点に注意する必要があります
-
作成するインスタンスのロール設定はECSインスタンスロールを与えてください。
作成方法はこちらを参照ください:Amazon ECSインスタンスロール -
インスタンスの設定タブの下部の高度な詳細でユーザデータを設定する(下記)
#!/bin/bash
echo ECS_CLUSTER=ecs-cluster >> /etc/ecs/ecs.config
4. Dockerfileの構築
ここではGPUを使うためのDockerfileを作り、ECRへプッシュします。
今回はtensorflow-gpu 1.4.0を使います。TensorFlowのバージョンに合わせて、nvidiaのイメージを使いますので、下記のURLからご確認ください。
https://www.tensorflow.org/install/install_sources#common_installation_problems
上記のURLで確認するとcuDNN:6 CUDA:8なのでnvidiaのimageはこのバージョンに沿ったものを使います。
下記のDockerfileは一例なので、各自行いたい構築を設定してください。
FROM nvidia/cuda:8.0-cudnn6-devel
RUN apt-get update
RUN apt-get install -y git \
vim \
build-essential \
libncursesw5-dev \
libgdbm-dev \
libc6-dev \
zlib1g-dev \
libsqlite3-dev \
tk-dev \
libssl-dev \
openssl \
libbz2-dev \
libreadline-dev \
checkinstall \
wget \
jq
RUN git clone https://github.com/yyuu/pyenv.git /root/.pyenv
ENV PYENV_ROOT "/root/.pyenv"
ENV PATH "$PYENV_ROOT/bin:$PATH"
ENV PATH "$PYENV_ROOT/shims:$PATH"
RUN pyenv install 3.6.2
RUN pyenv global 3.6.2
RUN pip install tensorflow-gpu==1.4.0
DockerFileを作成したら、ECRへプッシュします。
ECSのリポジトリで新規リポジトリを作成するとプッシュまでの流れが記載されているのでその通りに行います。
個人的にハマった点
tensorflowとtensorflow-gpuは一緒に入れないでください、tensorflowを入れるとCPUで動きます。必ずtensorflow-gpuだけにしてください。
5. タスク定義
ここで重要な部分は下記です。
- 特権付与をつける
- ボリュームマウントでホスト側のnvidia関連をマウントする
ホスト側の「/var/lib/nvidia-docker/volumes/nvidia_driver/latest」とコンテナ側の「/usr/local/nvidia」
以上のことを行えば、ECSでGPUインスタンスを使えて、かつTensorFlowが回せると思います。