Re:ゼロから始めるML生活

どちらかといえばエミリア派です

GCPでPyTorch(GPU)を使えるようにするまでにやったことのメモ

f:id:nogawanogawa:20181109131209j:plain:w600

だいぶ期間が空いてしまいましたが、結構前にGoogle Cloud Platformの使い方を勉強していました。 (別に諦めてたわけではなく、単純にAWSでいろいろやることがあったので、そっちを使ってただけです)

tsunotsuno.hatenablog.com

当初の目的としては、GPUを使ってDeep Learningをサクサク回していきたいという意図でした。 今回は手元のコードをGCPGPUを使って学習するまでにやったことのメモです。

環境構築

簡単な方法は大きく分けて2通りあって、

  • Google公式のVMを使用
  • NVIDIA-Dockerを使ってDockerコンテナ内からGPUを操作できるようにする

ですね。

その他、自前でツールインストールしても良いんですが、この時代ですしDockerで良いんじゃないかと。 楽できるところは楽していく主義なので。。。

公式のVMはお手軽に使えるのでいいですね。(正直GPUが使えればなんでもいい。。。) どこでも同じ環境を作りたい人(複数環境対応のサービスを提供する場合とか?)だとNVIDIA-Dockerを用意するのが良さそうです。

その他、注意点としては、GPUが使用できないリージョンがある点です。

<参考url>
GPUs on Compute Engine  |  Compute Engine Documentation  |  Google Cloud

距離が近く、レイテンシの小さい東京リージョンではGPUは残念ながら利用できません。 記載のあるリージョンでインスタンスを立てて使用してください。

Google公式のVMを使用

公式ページはこちら。

console.cloud.google.com

指示に従って4~5回クリックすればインスタンスの出来上がりです。 すごい簡単です。GCPだけ使うならこのやり方一択だと思います。

あんまり良くわかってませんが、インスタンスできちゃいましたし。

NVIDIA-Dockerを使ってDockerコンテナ内からGPUを操作できるようにする

上のやり方を見たあとだとちょっと面倒ではありますが、環境をどこでも統一できるという意味では良いのではないでしょうか。 用途によりけりですが、個人的にはこちらで進めたいと思います。

nvidia-dockerはこちらから使用できます。

github.com

GPUを使用する設定

GPU割当申請

複数GPUを使用したい方はGPUの割当申請をします。 デフォルトで1つはGPUが使えるようなので、一つでいい方はこちらは読み飛ばしてください。

「IAMと管理」 >「 割り当て」 から指標で好きなGPUを選択して表示します。

f:id:nogawanogawa:20181109143953p:plain

チェックを付けて「割り当てを編集」で申請を出せます。 あんまり数が多いと英語でメールのやり取りが必要になるようですが、2~3つなら設定完了のメールを待てばOKのようです。

インスタンスの作成

プロジェクトの作成

GCPにのコンソールから適当な名前でプロジェクトを作成して下さいませ。

インスタンスの作成

GCPコンソール > 「Compute Engine」 > 「VMインスタンス」> 「作成」でインスタンスを作成します。

f:id:nogawanogawa:20181109152256p:plain

今回は試しに

  • リージョン:台湾
  • OS:Ubuntu 18.04 LTS
  • GPU:K80
  • ストレージ30GB

でやってみます。

CUDAのインストール

大本のインスタンスにCUDAをインストールします。

https://developer.nvidia.com/cuda-downloads?target_os=Linux&target_arch=x86_64&target_distro=Ubuntu&target_version=1804&target_type=debnetwork

やり方はこちらを参考にdeb(network)でインストールしました。

https://qiita.com/yukoba/items/4733e8602fa4acabcc35

NVIDIA Dockerのインストール

基本的にはgithubに書いてあるとおりにしていただければ問題ないかと。

https://github.com/NVIDIA/nvidia-docker

一応こんな感じで打ちました。

# NVIDIA Driver のインストール
sudo apt-get update
wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
sudo dpkg -i cuda-repo-ubuntu1804_10.0.130-1_amd64.deb
sudo apt update
sudo apt install cuda cuda-drivers
sudo reboot
export PATH="/usr/local/cuda/bin:$PATH"
export LD_LIBRARY_PATH="/usr/local/cuda/lib64:$LD_LIBRARY_PATH"
sudo apt  install docker.io

# NVIDIA Dockerのインストール
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey |   sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)

# docker-ceがないと怒られたので暫定対応
sudo apt remove docker docker-engine docker.io
sudo apt-get update
sudo apt-get install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository    "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
sudo apt-get update
sudo apt-get install docker-ce

# nvidia dockerのインストール
sudo apt-get install -y nvidia-docker2
sudo pkill -SIGHUP dockerd
sudo docker run --runtime=nvidia --rm nvidia/cuda:9.0-base nvidia-smi

動作確認

上のやり方のどちらでやっていただいても大丈夫なんですが、NVIDIA Dockerがちゃんと動いているかの確認をします。

こちらからDockerfileを拝借してきました。

github.com

FROM nvidia/cuda:9.0-base-ubuntu16.04

# Install some basic utilities
RUN apt-get update && apt-get install -y \
    curl \
    ca-certificates \
    sudo \
    git \
    bzip2 \
    libx11-6 \
 && rm -rf /var/lib/apt/lists/*

# Create a working directory
RUN mkdir /app
WORKDIR /app

# Create a non-root user and switch to it
RUN adduser --disabled-password --gecos '' --shell /bin/bash user \
 && chown -R user:user /app
RUN echo "user ALL=(ALL) NOPASSWD:ALL" > /etc/sudoers.d/90-user
USER user

# All users can use /home/user as their home directory
ENV HOME=/home/user
RUN chmod 777 /home/user

# Install Miniconda
RUN curl -so ~/miniconda.sh https://repo.continuum.io/miniconda/Miniconda3-4.5.1-Linux-x86_64.sh \
 && chmod +x ~/miniconda.sh \
 && ~/miniconda.sh -b -p ~/miniconda \
 && rm ~/miniconda.sh
ENV PATH=/home/user/miniconda/bin:$PATH
ENV CONDA_AUTO_UPDATE_CONDA=false

# Create a Python 3.6 environment
RUN /home/user/miniconda/bin/conda install conda-build \
 && /home/user/miniconda/bin/conda create -y --name py36 python=3.6.5 \
 && /home/user/miniconda/bin/conda clean -ya
ENV CONDA_DEFAULT_ENV=py36
ENV CONDA_PREFIX=/home/user/miniconda/envs/$CONDA_DEFAULT_ENV
ENV PATH=$CONDA_PREFIX/bin:$PATH

# CUDA 9.0-specific steps
RUN conda install -y -c pytorch \
    cuda90=1.0 \
    magma-cuda90=2.3.0 \
    "pytorch=0.4.1=py36_cuda9.0.176_cudnn7.1.2_1" \
    torchvision=0.2.1 \
 && conda clean -ya

# Install HDF5 Python bindings
RUN conda install -y h5py=2.8.0 \
 && conda clean -ya
RUN pip install h5py-cache==1.0

# Install Torchnet, a high-level framework for PyTorch
RUN pip install torchnet==0.0.4

# Install Requests, a Python library for making HTTP requests
RUN conda install -y requests=2.19.1 \
 && conda clean -ya

# Install Graphviz
RUN conda install -y graphviz=2.38.0 \
 && conda clean -ya
RUN pip install graphviz==0.8.4

# Install OpenCV3 Python bindings
RUN sudo apt-get update && sudo apt-get install -y --no-install-recommends \
    libgtk2.0-0 \
    libcanberra-gtk-module \
 && sudo rm -rf /var/lib/apt/lists/*
RUN conda install -y -c menpo opencv3=3.1.0 \
 && conda clean -ya

# Set the default command to python3
CMD ["python3"]

Python3で確認します。

Python 3.6.5 |Anaconda, Inc.| (default, Apr 29 2018, 16:14:56)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import torch
>>> print(torch.cuda.is_available())
True

GPUがちゃんと見えているので、一応ちゃんと動いてるっぽいです。 めでたしめでたし。