Alibaba CloudにGPUインスタンス登場!Tensorflowで機械学習を試す

SBCloud エンジニアの南(cjnan)です。最近、ついにAlibaba Cloudの日本サイトでもGPUインスタンスをリリースしました!なので早速試してみたいと思います。この記事ではAlibaba CloudのGPUインスタンスを利用して、Tensorflowなどの簡単なセットアップとデモを紹介します。

1. Alibaba CloudのGPUインスタンスを購入する

現時点(2017/12/1)では、残念ながらまだ日本リージョンでGPUインスタンスが購入できないので、今回は中国北部2のGPUインスタンスを購入して試してみます。NVIDIA P100のシリーズが使えるようになっています。従量課金制で購入できるので、利用した分だけの費用でお手軽にためせます。

  • リージョン:中国北部2
  • イメージ:Ubuntu 16.04 64bit
  • ストレージ:Ultraクラウドディスク40GB
  • インスタンスタイプ:ecs.gn5-c4g1.xlarge(4Core、30GB RAM)
  • CPUスペック:Intel Xeon E5-2682 V4(2.5GHz)
  • GPUスペック:NVIDIA P100(3584 Pascal CUDA Core、12GB GDDR5 ビデオメモリ、9.3TFlops single、4.7T​​Flops double)

2. CUDAの設定

インスタンスを購入し、ログインしたらまずは、CUDAをインストールします。現時点(2017/12/1)の最新バージョンのリンクからToolkitをダウンロードします。

$ wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_9.0.176-1_amd64.deb

$ sudo dpkg -i cuda-repo-ubuntu1604_9.0.176-1_amd64.deb

$ sudo apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/7fa2af80.pub

$ sudo apt-get update
$ sudo apt-get install cuda

インストールできたらnvidia-smiで動作確認をします。

3. Tensorflowの設定

本記事では簡単な検証を行うため、ここではAnaconda Baseでの設定方法を紹介します。本番環境などに投入する場合はノーマル方法で設定することをおすすめします。
Pythonでは、機械学習やデータ分析に必要なたくさんのライブラリが存在しますが個別でインストールが必要で環境のセットアップは大変です。Annacondaを利用することで、Python自体のインストールから関連するライブラリのインストールなどが用意になるので利用することをおすすめします。

Anacondaの設定

$ wget https://repo.continuum.io/archive/Anaconda2-5.0.1-Linux-x86_64.sh

$ sudo bash Anaconda2-5.0.1-Linux-x86_64.sh

インストールが終わたらターミナルを閉じてssh再接続します。

$ conda update anaconda

Anaconda環境でTensorflowをインストール

$ conda create -n tensorflow python=2.7
$ source activate tensorflow
(tensorflow)$ conda install -c conda-forge tensorflow
(tensorflow)$ conda update tensorflow

(オプション)Jupyter notebookのリモート環境を設定する

$ conda install jupyter
$ jupyter notebook --generate-config -allow-root
$ python -c "from notebook.auth import passwd;print(passwd())"

Enter password: xxxxxxxxx

Verify password: xxxxxxxxx

sha1:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Jupyterのconfigファイルを編集します。

$ vim ~/.jupyter/jupyter_notebook_config.py

c.NotebookApp.ip='*'

c.NotebookApp.password = u' sha1:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx '

c.NotebookApp.open_browser = False

c.NotebookApp.allow_root = True

c.NotebookApp.port =8888

Tensorflowを利用しない場合は

(tensorflow)$ source deactivate

でtensorflow環境を閉じることができます。

4. MNIST手書き文字認識のデモ

  • データ

MNISTのcsvダウンロード

$ wget https://pjreddie.com/media/files/mnist_train.csv

$ wget https://pjreddie.com/media/files/mnist_test.csv

データはtrain set, evaluation set, test setにわけて検証します。

  • モデル

CNNは基礎的の7層AlexNetモデルを実現します。AlexNetのモデルコードはGithubから探せますので、ここでは説明を省略させて頂きます。

  • 学習
  1. 学習データは10K回のIterationに分けて行います。
  2. 1K回ずつ、evaluation setで検証し、モデルの性能を確認します。
  3. 10K回のIterationで一番良いモデルを選択してパラメタを固定します。

詳しい内容は下記のコードを参考してください。

import tensorflow as tf

import mnist_conv2d_medium_tutorial.mnist as mnist
from mnist_conv2d_medium_tutorial.model import Model

FLAGS = tf.app.flags.FLAGS
NUM_LABELS = 10

def train():
    model = Model()

    with tf.Graph().as_default():
        images, val_images, labels, val_labels = mnist.load_train_data(FLAGS.train_data)

        x = tf.placeholder(shape=[None, mnist.IMAGE_SIZE, mnist.IMAGE_SIZE, 1], dtype=tf.float32, name='x')
        y = tf.placeholder(shape=[None, NUM_LABELS], dtype=tf.float32, name='y')
        keep_prob = tf.placeholder(tf.float32, name='dropout_prob')
        global_step = tf.contrib.framework.get_or_create_global_step()

        logits = model.inference(x, keep_prob=keep_prob)
        loss = model.loss(logits=logits, labels=y)

        accuracy = model.accuracy(logits, y)
        summary_op = tf.summary.merge_all()
        train_op = model.train(loss, global_step=global_step)

        init = tf.global_variables_initializer()
        saver = tf.train.Saver()

        with tf.Session(config=tf.ConfigProto(log_device_placement=True)) as sess:
            writer = tf.summary.FileWriter(FLAGS.summary_dir, sess.graph)
            sess.run(init)
            for i in range(FLAGS.num_iter):
                offset = (i * FLAGS.batch_size) % (len(images) - FLAGS.batch_size)
                batch_x, batch_y = images[offset:(offset + FLAGS.batch_size), :], labels[
                                                                                  offset:(offset + FLAGS.batch_size), :]

                _, cur_loss, summary = sess.run([train_op, loss, summary_op],
                                                feed_dict={x: batch_x, y: batch_y, keep_prob: 0.5})
                writer.add_summary(summary, i)
                print(i, cur_loss)
                if i % 1000 == 0:
                    validation_accuracy = accuracy.eval(feed_dict={x: val_images, y: val_labels, keep_prob: 1.0})
                    print('Iter {} Accuracy: {}'.format(i, validation_accuracy))

                if i == FLAGS.num_iter - 1:
                    saver.save(sess, FLAGS.checkpoint_file_path, global_step)


def main(argv=None):
    train()


if __name__ == '__main__':
    tf.app.flags.DEFINE_integer('batch_size', 128, 'size of training batches')
    tf.app.flags.DEFINE_integer('num_iter', 10000, 'number of training iterations')
    tf.app.flags.DEFINE_string('checkpoint_file_path', 'checkpoints/model.ckpt-10000', 'path to checkpoint file')
    tf.app.flags.DEFINE_string('train_data', 'data/mnist_train.csv', 'path to train and test data')
    tf.app.flags.DEFINE_string('summary_dir', 'graphs', 'path to directory for storing summaries')

    tf.app.run()
  • 結果

AlexNetで10K回学習した結果、想定どおり98%の認識率を出しました。ではTensorboardでログデータを確認しましょう。下記の命令を実行して、ブラウザでサーバの6006ポートに接続します。

tensorboard --logdir=/to/your/path/

△TensorboardからみたモデルGraph

△Accuracy。10KのIterationで98%の認識率がでるのが確認できる

△同じくIterの回数が多くなるほど、Lossが減るのが見える

5. さいごに

本記事ではGPUの検証であり、CNNのDropboxや分散加速などの方法は含まれていません。機会学習の内容については今後の記事で共有したいと思います。
また、従量課金制でAlibaba CloudのGPUインスタンスをお気軽にお試しできるので、ぜひためしてみてください!

この記事をシェアする