20191021のTensorFlowに関する記事は4件です。

TensorFlow2.0 + 無料のColab TPUでDCGANを実装した

TensorFlow2.0とGoogle Colaboratoryの無料TPUを使って、DCGANを実装しました。

訓練経過の様子

何をやったか

  • Google ColabのTPU+TF2.0でCelebA(約20万枚)をDCGANで生成
  • TF1.X系のTPUでは、同時に実行可能なグラフは1個の制約があったため、GANの訓練が容易ではなかった(こちらの記事にある通り、不可能であったわけではない。しかし、低レベルAPIが必須で決して容易ではなかった)。TF2.X系のTPUでは、もっと容易にGANを実装できた
  • DCGANの論文通りのモデル(パラメーター数:G=12.7M, D=11.0M)で。64x64の画像20万枚を、1エポックを40秒程度で訓練可能。100エポック回しても1時間程度。
  • 大きなバッチサイズ(BS=1024)で訓練できた。BigGANの論文にもあるように、バッチサイズを大きくすることは生成画像の質・安定性の向上ともに重要。
  • 1時間程度で以下のような顔画像が生成できた

Colab Notebook

こちらから遊べます
https://colab.research.google.com/drive/1rSm01ZiAFgxsWOcQ48cdtgLiVnwwZNfx

TF2.0のTPUの使い方について

基本的な使い方は、MNISTサンプルの記事を書いたのでこちらを参照ください。

TensorFlow2.0 with KerasでいろいろなMNIST(TPU対応)

訓練ループの中身

ポイントをかいつまんで解説していきます。

GANの訓練ループをどう書いているかについて。1バッチ単位での訓練は次のようにします。

@distrtibuted(Reduction.SUM, Reduction.SUM, Reduction.CONCAT)
def train_on_batch(real_img1, real_img2):
    # concat x1, x2
    real_img = tf.concat([real_img1, real_img2], axis=0)
    # generate fake images
    with tf.GradientTape() as d_tape, tf.GradientTape() as g_tape:
        z = tf.random.normal(shape=(real_img.shape[0], 1, 1, 100))
        fake_img = model_G(z)
    # train discriminator
    with d_tape:
        fake_out = model_D(fake_img)
        real_out = model_D(real_img)
        d_loss = (loss_func(tf.zeros(shape=(z.shape[0], 1)), fake_out)
                    + loss_func(tf.ones(shape=(z.shape[0], 1)), real_out)) / 2.0
        d_loss = tf.reduce_sum(d_loss) * (1.0 / batch_size)
    gradients = d_tape.gradient(d_loss, model_D.trainable_weights)
    param_D.apply_gradients(zip(gradients, model_D.trainable_weights))
    # train generator
    with g_tape:
        fake_out = model_D(fake_img)
        g_loss = loss_func(tf.ones(shape=(z.shape[0], 1)), fake_out)
        g_loss = tf.reduce_sum(g_loss) * (1.0 / batch_size)
    gradients = g_tape.gradient(g_loss, model_G.trainable_weights)
    param_G.apply_gradients(zip(gradients, model_G.trainable_weights))
    return d_loss, g_loss, fake_img 

distributedデコレーター

これはTensorFlowの組み込みではなく、自分で実装したデコレーターです。

TPUの訓練では(複数GPUと同様)、複数のTPUデバイスにデータをMapしたあと、個々の計算結果(損失値や生成画像)をReduceする必要があります。実装する際、特に意識しないといけないのがReduceで、Reduce用の関数はTFの組み込みでもいくつか用意されています。

しかし、組み込み関数だけでは単体のtrain_on_batch関数を定義したあと、distributed対応の関数を別に書かないといけず、デザイン的に少し野暮ったいのです。そこで、分散訓練の対応+Reduceをいい感じにやってくれるデコレータを自分で実装しました。詳しくはこちら。

TensorFlow2.0でDistributed Trainingをいい感じにやるためのデコレーターを作った

デコレーターの引数は各返り値に対するReduceの方法です。d_lossg_lossはSUM、fake_imgはaxis=0でCONCATしています(Concatは組み込みのreduce関数で非対応なので、デコレーターを実装する際は少し工夫がいる)。

2つのGradient Tape

GとDという2つのモデルを訓練(偏微分を計算)しないといけないので、Gradient Tapeは2個用意します。これはtape.gradient()で偏微分を計算してしまうと、それまでの計算グラフがリセットされてしまうからです。これはPyTorchでも同じです。

TF2.0では、Gradient Tape以下の計算は自動微分可能です。最初のfake_imgの生成では2個のTapeがあるので、どちらのTapeでもGは微分可能ということになります(もう少し賢い書き方あるかもしれません)。

そして、DのTapeとGのTapeで敵対的学習するようなロスを定義し、学習ステップを進めています。

ここでは生成画像fake_imgをDとGの間で使いまわししています。DとGの順番に注意しましょう。Dを訓練した後はGの係数は変わりませんが、Gを訓練した後は当然Gの係数が変わります。したがって、Gの訓練→Dの訓練での生成画像の使いまわしはできません。D→Gなら使いまわしできます

ちなみにGradient Tapeを2個使って、2階微分の計算なんかもできたりします。WGAN-GPをやりたいときに便利ではないでしょうか。

データの読み込みについて

GANの訓練よりも実はここが一番のポイントだったりします。いくつかトラップがあります。

TPU+tf.dataではローカルファイルから読み込めない(らしい)

例えば、tf.data.Dataset.list_filesを使って、「ファイルパス→tf.data内で画像を読み込んでテンソルを返す」という処理は、CPUやGPUでもできてもTPUでは現状はできないようです。

これはTPUのトラブルシューティングにも書いてあります(同じのエラーが出ます)。

ローカル ファイルシステムを使用できない
エラー メッセージ
InvalidArgumentError: Unimplemented: File system scheme '[local]' not implemented

詳細
すべての入力ファイルとモデル ディレクトリは Cloud Storage バケットパス(gs://bucket-name/...)を使用する必要があり、このバケットは TPU サーバーからアクセス可能である必要があります。すべてのデータ処理とモデル チェックポインティングは、ローカルマシンではなく TPU サーバー上で実行されることに注意してください

これを読む限り、Cloud Storageでないと無理みたいですね。一応、TensorFlowのソースを読んでいくと、StreamingFilesDatasetというのもあり、コメントを読んでいる限りなんかローカルファイルでも使えそうな気がします。残念ながらドキュメントがなく、どう使うのかはよくわかりませんでした。

そこで今回は、一度全ての画像を解像度が64x64のNumpy配列に格納し、それをfrom_tensor_slicesでtf.dataに読み込ませることで解決を図りました。

TensorFlowのオブジェクトの2GBの壁

Numpy配列化すれば全て解決というわけではありません。CelebAをNumpy配列化すると、uint8型でも202599枚 × 64px × 64px × 3ch = 2.31GBと大容量になってしまいます。

TensorFlowのオブジェクトには1個あたり2GBの制約があります。from_tensor_slicesでは、内部的に一度Numpy配列を定数のテンソルに置き換えている(と思われる)ので、2GBをオーバーするとエラーが出ます。公式ドキュメントにも以下のような記載があります。

Note that if tensors contains a NumPy array, and eager execution is not enabled, the values will be embedded in the graph as one or more tf.constant operations. For large datasets (> 1 GB), this can waste memory and run into byte limits of graph serialization.

そこで、今回はデータを半分に分割して、あたかも2つの画像テンソルが流れてくるようなデータセットとみなすようにしました。全体のテンソルは2.31GBなので、半分に分割すれば2GBの制約はクリアできます。前半をX1、後半をX2とします。擬似コードですが、

for X1, X2 in dataset:
    # TPUデバイス内で
    X = tf.concat([X1, X2], axis=0)

とすれば、データを半分に分割しても、個々のTPUデバイス側で結合することができます(だいぶ頭おかしい解決方法)。これでちゃんと訓練できました。動いてしまえば正義ですね。

ちなみにNumpy配列化したときに、そこまで容量が大きくなければ(2GBを超えなければ)このような心配をする必要はありません。

訓練経過

1エポック

25エポック

そこそこ形にはなってきました。
epoch_0024.png

50エポック

相当綺麗です。バッチサイズが1024と大きいおかげで、勾配の信頼性が高く、DCGANでも安定しやすいのでしょう。ここまで30分程度です。
epoch_0050.png

100エポック

1時間ちょいでこのようになりました。ただのDCGANでここまでいけるのはすごい。

まとめ

この記事では、TensorFlow2.0+Colab TPUを使って、CelebA20万枚をDCGANで1時間程度で訓練する方法を紹介しました。

今までは、GANをColab上で訓練することは厳しかったが実情でした。なぜなら、TPUでは訓練コードを書くことが容易ではなかったですし、GPUでは実行時間12時間の制約にかかりやすく、小さい解像度でしか訓練できなかったからです。GANでは自前のGPUが推奨で、遊ぶためのハードルが高いのが現実問題としてありました。

しかし、TensorFlow2.0を使うと、TPUでもGANが容易な形で実装可能(データの読み込みなど多少面倒なところはありますが)となったため、GANのハードルがぐっと下がったといえるでしょう。

さらに、TPUの計算はfloat32でも非常に高速で、同じ内容をGPUで行う場合、1ポック40秒程度で回すのは相当なGPU数がいると思われます(まずバッチサイズ1024で訓練するのが相当大変)。それだけの計算資源を無料で得られるわけですから、やはりTPUはすごい。

記事の冒頭にNotebookを公開しているので、ぜひ遊んでみてください。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

HorovodでTensorflowの分散トレーニングについて

最新のディープラーニング モデルのトレーニングには、多くの場合、GPU によって提供される大量の計算が必要です。1 つの GPU から多くの GPU へのスケーリングにより、トレーニングと研究のプロセスを大幅に短縮できます。この記事ではAlibaba CloudのマルチGPUのインスタンスを利用して、Horovodなどの簡単なセットアップとデモを紹介します。

Horovodとは

Horovodは、2017年Uberが開発したTensorFlowのオープンソース分散トレーニングフレームワークです。その目標は、分散ディープラーニングを集約処理(オールリデュース)を介して迅速かつ使いやすくするものであり、通常のtensorflow実装に対して、少ない変更量で分散実行できるようになるのは優れたメリットです。

[https://github.com/horovod/horovod:embed:cite]

環境構築

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

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

f:id:sbc_kou:20190910101901p:plain

2. CUDAの設定

現時点(2019/9/10)の最新バージョン(CUDA Toolkit 10.1 )のリンクからToolkitをダウンロードしてインストールします。

wget https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-ubuntu1604.pin
sudo mv cuda-ubuntu1604.pin /etc/apt/preferences.d/cuda-repository-pin-600
wget http://developer.download.nvidia.com/compute/cuda/10.1/Prod/local_installers/cuda-repo-ubuntu1604-10-1-local-10.1.243-418.87.00_1.0-1_amd64.deb
sudo dpkg -i cuda-repo-ubuntu1604-10-1-local-10.1.243-418.87.00_1.0-1_amd64.deb
sudo apt-key add /var/cuda-repo-10-1-local-10.1.243-418.87.00/7fa2af80.pub
sudo apt-get update
sudo apt-get -y install cuda

3. cuDNNの設定

cuDNNは、ディープニューラルネットワーク用のGPUアクセラレーションライブラリであり、フォワードおよびバックレコンボリューション、プーリング、正規化などの標準ルーチンに対しての実装を提供します。本記事で最新のバージョンv7.6.3を使いました。

wget https://developer.nvidia.com/compute/machine-learning/cudnn/secure/7.6.3.30/Production/10.1_20190822/cudnn-10.1-linux-x64-v7.6.3.30.tgz
tar -xzvf cudnn-9.0-linux-x64-v7.tgz
sudo cp cuda/include/cudnn.h /usr/local/cuda/include
sudo cp cuda/lib64/libcudnn* /usr/local/cuda/lib64
sudo chmod a+r /usr/local/cuda/include/cudnn.h /usr/local/cuda/lib64/libcudnn*

4. NCCLの設定

NCCLはNVIDIAが提供しているマルチGPU向けの集合通信用のライブラリです、下記のコマンドで最新のバージョンをダウンロードします。

wget https://developer.nvidia.com/compute/machine-learning/nccl/secure/v2.4/prod//nccl_2.4.8-1%2Bcuda10.1_x86_64.txz
cd /usr/local 
tar xvf nccl_2.4.8-1+cuda10.1_x86_64.txz

6. tensorflowの設定

ここではAnaconda仮想環境での設定方法を使いました。PyPIより、Anacondaを利用することで、tensorflow自体から、それと関連するライブラリが一括インストールされるので、とても便利です。

conda create -n tf pip python=3.7
source activate tf
conda install -c anaconda tensorflow-gpu 

7. MPIの設定

MPIは、並列コンピューティング利用するための標準化された規格であり、ここでMPIのオープンソース版Open MPIを使いました。

wget https://download.open-mpi.org/release/open-mpi/v3.1/openmpi-3.1.2.tar.bz2
gunzip -c openmpi-3.1.2.tar.gz | tar xf -
cd openmpi-4.0.1
 ./configure --prefix=/usr/local
make all install

8. Horovodのインストール

ようやく最後となりますが、下記のコマンドでhorovodをインストールします。

HOROVOD_GPU_ALLREDUCE=NCCL pip install --no-cache-dir horovod

Horovodの実装

本記事は、horovod検証の目的から、tensorflowの公式サイトに紹介されたシンプルな4層のCNNモデルを用いて、MNISTデータセット内の手書きの数字を認識する例を使いました。またマルチGPUに並列処理させる為に、データセットを分割して複数のGPU間でデータセットを準備する必要があります。

下記ソースコードのコメントアウトのように、hovorodモジュールをインポートして、ただ数箇所を変更して簡単に済むことができます。このような手間を削減するのは、特に開発エンジニアやデータサイエンティストにとっては楽となります。

import os
import tensorflow as tf
import horovod.tensorflow as hvd
import numpy as np
import time
from tensorflow import keras

layers = tf.layers
tf.logging.set_verbosity(tf.logging.INFO)

def conv_model(feature, target, mode):

    target = tf.one_hot(tf.cast(target, tf.int32), 10, 1, 0)
    feature = tf.reshape(feature, [-1, 28, 28, 1])

    with tf.variable_scope('conv_layer1'):
        h_conv1 = layers.conv2d(feature, 32, kernel_size=[5, 5],
                                activation=tf.nn.relu, padding="SAME")
        h_pool1 = tf.nn.max_pool(
            h_conv1, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')

    with tf.variable_scope('conv_layer2'):
        h_conv2 = layers.conv2d(h_pool1, 64, kernel_size=[5, 5],
                                activation=tf.nn.relu, padding="SAME")
        h_pool2 = tf.nn.max_pool(
            h_conv2, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
        h_pool2_flat = tf.reshape(h_pool2, [-1, 7 * 7 * 64])

    h_fc1 = layers.dropout(
        layers.dense(h_pool2_flat, 1024, activation=tf.nn.relu),
        rate=0.5, training=mode == tf.estimator.ModeKeys.TRAIN)

    logits = layers.dense(h_fc1, 10, activation=None)
    loss = tf.losses.softmax_cross_entropy(target, logits)
    tf.summary.scalar('loss', loss)

    correct_prediction = tf.equal(tf.argmax(logits, 1),
                                  tf.argmax(target, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
    tf.summary.scalar('accuracy', accuracy)

    return tf.argmax(logits, 1), loss, accuracy

def train_input_generator(x_train, y_train, batch_size=64):
    assert len(x_train) == len(y_train)
    while True:
        p = np.random.permutation(len(x_train))
        x_train, y_train = x_train[p], y_train[p]
        index = 0
        while index <= len(x_train) - batch_size:
            yield x_train[index:index + batch_size], \
                  y_train[index:index + batch_size],
            index += batch_size

def main(_):
    start_time = time.time()

    '''---------------------- horovodの初期化 ----------------------'''
    hvd.init()

    (x_train, y_train), (x_test, y_test) = \
        keras.datasets.mnist.load_data('MNIST-data-%d' % hvd.rank())


    x_train = np.reshape(x_train, (-1, 784)) / 255.0
    x_test = np.reshape(x_test, (-1, 784)) / 255.0

    with tf.name_scope('input'):
        image = tf.placeholder(tf.float32, [None, 784], name='image')
        label = tf.placeholder(tf.float32, [None], name='label')
    predict, loss, accuracy = conv_model(image, label, tf.estimator.ModeKeys.TRAIN)

    '''------------- GPUの数に基づいて学習速度を調整する --------------'''
    opt = tf.train.AdamOptimizer(0.001 * hvd.size())

    '''------------- horovod分散オプティマイザを追加する--------------'''
    opt = hvd.DistributedOptimizer(opt)

    global_step = tf.train.get_or_create_global_step()
    train_op = opt.minimize(loss, global_step=global_step)

    hooks = [
        '''------------- 各GPU上のモデルを同じ値で初期化 --------------'''
        hvd.BroadcastGlobalVariablesHook(0),
        tf.train.StopAtStepHook(last_step=20000 // hvd.size()),
        tf.train.LoggingTensorHook(tensors={'step': global_step,
                       'loss': loss,
                       'accuracy':accuracy},
                                   every_n_iter=10),
    ]

    '''------------- 各プロセスにGPUを割り当てる --------------'''
    config = tf.ConfigProto()
    config.gpu_options.allow_growth = True
    config.gpu_options.visible_device_list = str(hvd.local_rank())

 '''-------- チェックポイントをワーカー0にのみ保存する---------'''
    checkpoint_dir = './new/checkpoints' if hvd.rank() == 0 else None
    training_batch_generator = train_input_generator(x_train,
                                                     y_train, batch_size=100)

    merged = tf.summary.merge_all()
    with tf.train.MonitoredTrainingSession(checkpoint_dir=checkpoint_dir,
                                           hooks=hooks,
                                           config=config) as mon_sess:
         writer = tf.summary.FileWriter("./tflog/%d" % hvd.rank(), mon_sess.graph)
         while not mon_sess.should_stop():
             image_, label_ = next(training_batch_generator)
             _, result, step = mon_sess.run([train_op,merged,global_step], feed_dict={image: image_, label: label_})
             if step % 100 == 0:
                 writer.add_summary(result,step)
    duration = time.time()-start_time
    print("/device:GPU:" + str(hvd.local_rank()) + "runtime is --- %s seconds ---" % duration)

if __name__ == "__main__":
    tf.app.run()

実行

2つのGPUで同時に実行させるため、下記の命令でtrain.pyスクリプトを実行します。

mpirun -np 2 -bind-to none -map-by slot -x NCCL_DEBUG=INFO -x LD_LIBRARY_PATH -x PATH -mca pml ob1 -mca btl ^openib --allow-run-as-root python train.py

上記のスクリプト実行の途中に、別セッションでnvidia-smiコマンドでGPUの利用状況を確認すると、下図の赤枠に示したように、gpu device 0とgpu device 1、それぞれGPUの使用率が45%であることを分かりました。

f:id:sbc_kou:20190910152512p:plain

実行完了したら、下図の赤枠の部分から、gpu 0とgpu 1の実行時間を確認することができます。

f:id:sbc_kou:20190910152837p:plain


Tensorboardでログデータを確認しましょう。下記の命令を実行して、ブラウザでサーバの6006ポートに接続します。(事前にセキュリティグループのポートを開放する必要があります。)
tensorboard --logdir /logs/

gpu 0とgpu 1、10KのStepで99%以上の認識率を確認できました。またstepの回数が多くなるにつれて、Lossが減るのが見えます。

f:id:sbc_kou:20190910133912p:plain

最後

いかがでしたでしょうか

本記事ではAlibaba Cloud マルチGPUを持つインスタンスを利用してHorovodの実現性を検証しました。Horovodを用いてクラスタでの実行とかベンチマークの検証などの内容については、今後の記事で共有したいと思います。 また、従量課金制でAlibaba CloudのGPUインスタンスをお気軽にお試しできるので、ぜひためしてみてください!

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【第三回(最終回)】CentOSにPythonの機械学習開発環境を構築する(Tensorflow + Kerasインストール編)

前書き

LinuxディストリビューションのCenOSJupyter Notebookを使用して、Python、Pythonのライブラリであるscikit-learnTensorflowkeras等を使って機械学習のプログラムを作成できる機械学習の開発環境を作成する手順を紹介したいと思います。

「【第一回】CentOSにPythonの機械学習開発環境を構築する(Anacondaインストール編)」では、Anacondaをインストールし、機械学習用環境(ml_env)を作成しました。
「【第二回】CentOSにPythonの機械学習開発環境を構築する(Jupyter Notebook編)」では、Jupyter Notebookを他のPC等からブラウザで使用できるように設定しました。

今回はTensorflowkeras等の機械学習ライブラリをインストールし、サンプルソースがJupyter Notebookで動作することを確認したいと思います。

環境

  • OS:CentOS Linux release 7.7.1908

前提条件

  • CentOSAnaconda3Anaconda3-2019.07-Linux-x86_64.sh)がインストールされていること
  • 機械学習用の環境(ml_env)が作成されていること

「【第一回】CentOSにPythonの機械学習開発環境を構築する(Anacondaインストール編)」で紹介)

  • Jupyter Notebookを使用可能な設定が完了していること

「【第二回】CentOSにPythonの機械学習開発環境を構築する(Jupyter Notebook編)」で紹介)

機械学習で使うためインストールしたいパッケージ

パッケージ名 概要 インストール済みかどうか
ipython Pythonの対話型インタプリタを拡張したもの インストール済み
jupyter プログラムを実行し、実行結果を記録できるツール(Jupyter Notebook) インストール済み
tensorflow Google社が提供する機械学習用のオープンソースソフトウェアライブラリ 未インストール
keras TensorFlowのラッパーライブラリ 未インストール
numpy 数値計算を効率的に行うための拡張モジュール インストール済み
scipy プログラミング数学、科学、工学のための数値解析ソフトウェア インストール済み
matplotlib プログラミング言語Pythonおよびその科学計算用ライブラリNumPyのためのグラフ描画ライブラリ インストール済み
scikit-learn Pythonのオープンソース機械学習ライブラリ インストール済み
pandas データ解析を支援する機能を提供するライブラリ インストール済み
pillow 画像処理ライブラリ インストール済み
msgpack-python MessagePackフォーマットを使用するためのライブラリ インストール済み
opencv 画像処理ライブラリ 未インストール
mglearn コードの簡略化に役立つライブラリ(「Pythonではじめる機械学習」の著者が作成) 未インストール

手順

1. インストール済みパッケージの確認

1.1 anacondaユーザーでログイン

CentOSにanacondaユーザーでログインまたはスイッチします。
su - anaconda

コマンド実行結果
[root@CENTOS7 ~]# su - anaconda
最終ログイン: 2019/10/20 (日) 15:32:56 JST日時 pts/0
[anaconda@CENTOS7 ~]$

1.2 環境変数の読み込み

「【第一回】CentOSにPythonの機械学習開発環境を構築する(Anacondaインストール編)」で作成した環境変数.anaconda.envを読み込みます。

source ./.anaconda.env

コマンド実行結果
[anaconda@CENTOS7 ~]$ source ./.anaconda.env
[anaconda@CENTOS7 ~]$

1.3 機械学習用環境(ml_env)をアクティブにする

「【第一回】CentOSにPythonの機械学習開発環境を構築する(Anacondaインストール編)」で作成した機械学習用環境(ml_env)をアクティブにします。

conda activate ml_env

コマンド実行結果
[anaconda@CENTOS7 ~]$ conda activate ml_env
(ml_env) [anaconda@CENTOS7 ~]$

1.4 機械学習用環境(ml_env)のインストール済みパッケージの一覧を確認

機械学習用環境(ml_env)にインストールされているパッケージの確認をします。
conda list
conda list | grep <名前>

コマンド実行結果
(ml_env) [anaconda@CENTOS7 ~]$ conda list
# packages in environment at /home/anaconda/anaconda3/envs/ml_env:
#
# Name                    Version                   Build  Channel
_anaconda_depends         2019.03                  py37_0
_libgcc_mutex             0.1                        main
alabaster                 0.7.12                   py37_0
anaconda                  custom                   py37_1
anaconda-client           1.7.2                    py37_0
anaconda-project          0.8.3                      py_0
asn1crypto                1.0.1                    py37_0
astroid                   2.3.1                    py37_0
astropy                   3.2.2            py37h7b6447c_0
atomicwrites              1.3.0                    py37_1
attrs                     19.2.0                     py_0
babel                     2.7.0                      py_0
backcall                  0.1.0                    py37_0
backports                 1.0                        py_2
backports.os              0.1.1                    py37_0
backports.shutil_get_terminal_size 1.0.0                    py37_2
beautifulsoup4            4.8.0                    py37_0
bitarray                  1.0.1            py37h7b6447c_0
bkcharts                  0.2                      py37_0
blas                      1.0                         mkl
bleach                    3.1.0                    py37_0
blosc                     1.16.3               hd408876_0
bokeh                     1.3.4                    py37_0
boto                      2.49.0                   py37_0
bottleneck                1.2.1            py37h035aef0_1
bzip2                     1.0.8                h7b6447c_0
ca-certificates           2019.8.28                     0
cairo                     1.14.12              h8948797_3
certifi                   2019.9.11                py37_0
cffi                      1.12.3           py37h2e261b9_0
chardet                   3.0.4                 py37_1003
click                     7.0                      py37_0
cloudpickle               1.2.2                      py_0
clyent                    1.2.2                    py37_1
colorama                  0.4.1                    py37_0
contextlib2               0.6.0                      py_0
cryptography              2.7              py37h1ba5d50_0
curl                      7.65.3               hbc83047_0
cycler                    0.10.0                   py37_0
cython                    0.29.13          py37he6710b0_0
cytoolz                   0.10.0           py37h7b6447c_0
dask                      2.5.2                      py_0
dask-core                 2.5.2                      py_0
dbus                      1.13.6               h746ee38_0
decorator                 4.4.0                    py37_1
defusedxml                0.6.0                      py_0
distributed               2.5.2                      py_0
docutils                  0.15.2                   py37_0
entrypoints               0.3                      py37_0
et_xmlfile                1.0.1                    py37_0
expat                     2.2.6                he6710b0_0
fastcache                 1.1.0            py37h7b6447c_0
filelock                  3.0.12                     py_0
flask                     1.1.1                      py_0
fontconfig                2.13.0               h9420a91_0
freetype                  2.9.1                h8a8886c_1
fribidi                   1.0.5                h7b6447c_0
fsspec                    0.5.2                      py_0
get_terminal_size         1.0.0                haa9412d_0
gevent                    1.4.0            py37h7b6447c_0
glib                      2.56.2               hd408876_0
glob2                     0.7                        py_0
gmp                       6.1.2                h6c8ec71_1
gmpy2                     2.0.8            py37h10f8cd9_2
graphite2                 1.3.13               h23475e2_0
greenlet                  0.4.15           py37h7b6447c_0
gst-plugins-base          1.14.0               hbbd80ab_1
gstreamer                 1.14.0               hb453b48_1
h5py                      2.9.0            py37h7918eee_0
harfbuzz                  1.8.8                hffaf4a1_0
hdf5                      1.10.4               hb1b8bf9_0
heapdict                  1.0.1                      py_0
html5lib                  1.0.1                    py37_0
icu                       58.2                 h9c2bf20_1
idna                      2.8                      py37_0
imageio                   2.6.0                    py37_0
imagesize                 1.1.0                    py37_0
importlib_metadata        0.23                     py37_0
intel-openmp              2019.4                      243
ipykernel                 5.1.2            py37h39e3cac_0
ipython                   7.8.0            py37h39e3cac_0
ipython_genutils          0.2.0                    py37_0
ipywidgets                7.5.1                      py_0
isort                     4.3.21                   py37_0
itsdangerous              1.1.0                    py37_0
jbig                      2.1                  hdba287a_0
jdcal                     1.4.1                      py_0
jedi                      0.15.1                   py37_0
jeepney                   0.4.1                      py_0
jinja2                    2.10.3                     py_0
joblib                    0.13.2                   py37_0
jpeg                      9b                   h024ee3a_2
json5                     0.8.5                      py_0
jsonschema                3.0.2                    py37_0
jupyter                   1.0.0                    py37_7
jupyter_client            5.3.3                    py37_1
jupyter_console           6.0.0                    py37_0
jupyter_core              4.5.0                      py_0
jupyterlab                1.1.4              pyhf63ae98_0
jupyterlab_server         1.0.6                      py_0
keyring                   18.0.0                   py37_0
kiwisolver                1.1.0            py37he6710b0_0
krb5                      1.16.1               h173b8e3_7
lazy-object-proxy         1.4.2            py37h7b6447c_0
libarchive                3.3.3                h5d8350f_5
libcurl                   7.65.3               h20c2e04_0
libedit                   3.1.20181209         hc058e9b_0
libffi                    3.2.1                hd88cf55_4
libgcc-ng                 9.1.0                hdf63c60_0
libgfortran-ng            7.3.0                hdf63c60_0
liblief                   0.9.0                h7725739_2
libpng                    1.6.37               hbc83047_0
libsodium                 1.0.16               h1bed415_0
libssh2                   1.8.2                h1ba5d50_0
libstdcxx-ng              9.1.0                hdf63c60_0
libtiff                   4.0.10               h2733197_2
libtool                   2.4.6                h7b6447c_5
libuuid                   1.0.3                h1bed415_2
libxcb                    1.13                 h1bed415_1
libxml2                   2.9.9                hea5a465_1
libxslt                   1.1.33               h7d1a2b0_0
llvmlite                  0.29.0           py37hd408876_0
locket                    0.2.0                    py37_1
lxml                      4.4.1            py37hefd8a0e_0
lz4-c                     1.8.1.2              h14c3975_0
lzo                       2.10                 h49e0be7_2
markupsafe                1.1.1            py37h7b6447c_0
matplotlib                3.1.1            py37h5429711_0
mccabe                    0.6.1                    py37_1
mistune                   0.8.4            py37h7b6447c_0
mkl                       2019.4                      243
mkl-service               2.3.0            py37he904b0f_0
mkl_fft                   1.0.14           py37ha843d7b_0
mkl_random                1.1.0            py37hd6b4f25_0
mock                      3.0.5                    py37_0
more-itertools            7.2.0                    py37_0
mpc                       1.1.0                h10f8cd9_1
mpfr                      4.0.1                hdf1c602_3
mpmath                    1.1.0                    py37_0
msgpack-python            0.6.1            py37hfd86e86_1
multipledispatch          0.6.0                    py37_0
nbconvert                 5.6.0                    py37_1
nbformat                  4.4.0                    py37_0
ncurses                   6.1                  he6710b0_1
networkx                  2.3                        py_0
nltk                      3.4.5                    py37_0
nose                      1.3.7                    py37_2
notebook                  6.0.1                    py37_0
numba                     0.45.1           py37h962f231_0
numexpr                   2.7.0            py37h9e4a6bb_0
numpy                     1.17.2           py37haad9e8e_0
numpy-base                1.17.2           py37hde5b4d6_0
numpydoc                  0.9.1                      py_0
olefile                   0.46                     py37_0
openpyxl                  3.0.0                      py_0
openssl                   1.1.1d               h7b6447c_2
packaging                 19.2                       py_0
pandas                    0.25.1           py37he6710b0_0
pandoc                    2.2.3.2                       0
pandocfilters             1.4.2                    py37_1
pango                     1.42.4               h049681c_0
parso                     0.5.1                      py_0
partd                     1.0.0                      py_0
patchelf                  0.9                  he6710b0_3
path.py                   12.0.1                     py_0
pathlib2                  2.3.5                    py37_0
patsy                     0.5.1                    py37_0
pcre                      8.43                 he6710b0_0
pep8                      1.7.1                    py37_0
pexpect                   4.7.0                    py37_0
pickleshare               0.7.5                    py37_0
pillow                    6.2.0            py37h34e0f95_0
pip                       19.2.3                   py37_0
pixman                    0.38.0               h7b6447c_0
pkginfo                   1.5.0.1                  py37_0
pluggy                    0.13.0                   py37_0
ply                       3.11                     py37_0
prometheus_client         0.7.1                      py_0
prompt_toolkit            2.0.10                     py_0
psutil                    5.6.3            py37h7b6447c_0
ptyprocess                0.6.0                    py37_0
py                        1.8.0                    py37_0
py-lief                   0.9.0            py37h7725739_2
pycodestyle               2.5.0                    py37_0
pycosat                   0.6.3            py37h14c3975_0
pycparser                 2.19                     py37_0
pycrypto                  2.6.1            py37h14c3975_9
pycurl                    7.43.0.3         py37h1ba5d50_0
pyflakes                  2.1.1                    py37_0
pygments                  2.4.2                      py_0
pylint                    2.4.2                    py37_0
pyodbc                    4.0.27           py37he6710b0_0
pyopenssl                 19.0.0                   py37_0
pyparsing                 2.4.2                      py_0
pyqt                      5.9.2            py37h05f1152_2
pyrsistent                0.15.4           py37h7b6447c_0
pysocks                   1.7.1                    py37_0
pytables                  3.5.2            py37h71ec239_1
pytest                    5.2.1                    py37_0
pytest-arraydiff          0.3              py37h39e3cac_0
pytest-astropy            0.5.0                    py37_0
pytest-doctestplus        0.4.0                      py_0
pytest-openfiles          0.4.0                      py_0
pytest-remotedata         0.3.2                    py37_0
python                    3.7.4                h265db76_1
python-dateutil           2.8.0                    py37_0
python-libarchive-c       2.8                     py37_13
pytz                      2019.3                     py_0
pywavelets                1.0.3            py37hdd07704_1
pyyaml                    5.1.2            py37h7b6447c_0
pyzmq                     18.1.0           py37he6710b0_0
qt                        5.9.7                h5867ecd_1
qtawesome                 0.6.0                      py_0
qtconsole                 4.5.5                      py_0
qtpy                      1.9.0                      py_0
readline                  7.0                  h7b6447c_5
requests                  2.22.0                   py37_0
rope                      0.14.0                     py_0
ruamel_yaml               0.15.46          py37h14c3975_0
scikit-image              0.15.0           py37he6710b0_0
scikit-learn              0.21.3           py37hd81dba3_0
scipy                     1.3.1            py37h7c811a0_0
seaborn                   0.9.0                    py37_0
secretstorage             3.1.1                    py37_0
send2trash                1.5.0                    py37_0
setuptools                41.4.0                   py37_0
simplegeneric             0.8.1                    py37_2
singledispatch            3.4.0.3                  py37_0
sip                       4.19.8           py37hf484d3e_0
six                       1.12.0                   py37_0
snappy                    1.1.7                hbae5bb6_3
snowballstemmer           2.0.0                      py_0
sortedcollections         1.1.2                    py37_0
sortedcontainers          2.1.0                    py37_0
soupsieve                 1.9.3                    py37_0
sphinx                    2.2.0                      py_0
sphinxcontrib             1.0                      py37_1
sphinxcontrib-applehelp   1.0.1                      py_0
sphinxcontrib-devhelp     1.0.1                      py_0
sphinxcontrib-htmlhelp    1.0.2                      py_0
sphinxcontrib-jsmath      1.0.1                      py_0
sphinxcontrib-qthelp      1.0.2                      py_0
sphinxcontrib-serializinghtml 1.1.3                      py_0
sphinxcontrib-websupport  1.1.2                      py_0
spyder                    3.3.6                    py37_0
spyder-kernels            0.5.2                    py37_0
sqlalchemy                1.3.9            py37h7b6447c_0
sqlite                    3.30.0               h7b6447c_0
statsmodels               0.10.1           py37hdd07704_0
sympy                     1.4                      py37_0
tbb                       2019.8               hfd86e86_0
tblib                     1.4.0                      py_0
terminado                 0.8.2                    py37_0
testpath                  0.4.2                    py37_0
tk                        8.6.8                hbc83047_0
toolz                     0.10.0                     py_0
tornado                   6.0.3            py37h7b6447c_0
tqdm                      4.36.1                     py_0
traitlets                 4.3.3                    py37_0
unicodecsv                0.14.1                   py37_0
unixodbc                  2.3.7                h14c3975_0
urllib3                   1.24.2                   py37_0
wcwidth                   0.1.7                    py37_0
webencodings              0.5.1                    py37_1
werkzeug                  0.16.0                     py_0
wheel                     0.33.6                   py37_0
widgetsnbextension        3.5.1                    py37_0
wrapt                     1.11.2           py37h7b6447c_0
wurlitzer                 1.0.3                    py37_0
xlrd                      1.2.0                    py37_0
xlsxwriter                1.2.1                      py_0
xlwt                      1.3.0                    py37_0
xz                        5.2.4                h14c3975_4
yaml                      0.1.7                had09818_2
zeromq                    4.3.1                he6710b0_3
zict                      1.0.0                      py_0
zipp                      0.6.0                      py_0
zlib                      1.2.11               h7b6447c_3
zstd                      1.3.7                h0b5b093_0
(ml_env) [anaconda@CENTOS7 ~]$

ipythonjupyternumpyscipymatplotlibscikit-learnpandaspillowmsgpack-pythonはインストール済みとなっていることがわかります。

従って、tensorflowkerasopencvmglearnをインストールします。

2. tensorflowのインストール

tensorflowをインストールします。
conda install tensorflow

コマンド実行結果
(ml_env) [anaconda@CENTOS7 ~]$ conda install tensorflow
Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: /home/anaconda/anaconda3/envs/ml_env

  added / updated specs:
    - tensorflow


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    _tflow_select-2.3.0        |              mkl           2 KB
    absl-py-0.8.0              |           py37_0         164 KB
    astor-0.8.0                |           py37_0          46 KB
    c-ares-1.15.0              |    h7b6447c_1001          89 KB
    gast-0.3.2                 |             py_0          13 KB
    google-pasta-0.1.7         |             py_0          41 KB
    grpcio-1.16.1              |   py37hf8bcb03_1         984 KB
    keras-applications-1.0.8   |             py_0          33 KB
    keras-preprocessing-1.1.0  |             py_1          36 KB
    libprotobuf-3.9.2          |       hd408876_0         2.9 MB
    markdown-3.1.1             |           py37_0         118 KB
    openssl-1.1.1d             |       h7b6447c_3         3.7 MB
    protobuf-3.9.2             |   py37he6710b0_0         631 KB
    tensorboard-1.14.0         |   py37hf484d3e_0         3.1 MB
    tensorflow-1.14.0          |mkl_py37h45c423b_0           4 KB
    tensorflow-base-1.14.0     |mkl_py37h7ce6ba3_0        84.4 MB
    tensorflow-estimator-1.14.0|             py_0         291 KB
    termcolor-1.1.0            |           py37_1           8 KB
    ------------------------------------------------------------
                                           Total:        96.5 MB

The following NEW packages will be INSTALLED:

  _tflow_select      pkgs/main/linux-64::_tflow_select-2.3.0-mkl
  absl-py            pkgs/main/linux-64::absl-py-0.8.0-py37_0
  astor              pkgs/main/linux-64::astor-0.8.0-py37_0
  c-ares             pkgs/main/linux-64::c-ares-1.15.0-h7b6447c_1001
  gast               pkgs/main/noarch::gast-0.3.2-py_0
  google-pasta       pkgs/main/noarch::google-pasta-0.1.7-py_0
  grpcio             pkgs/main/linux-64::grpcio-1.16.1-py37hf8bcb03_1
  keras-applications pkgs/main/noarch::keras-applications-1.0.8-py_0
  keras-preprocessi~ pkgs/main/noarch::keras-preprocessing-1.1.0-py_1
  libprotobuf        pkgs/main/linux-64::libprotobuf-3.9.2-hd408876_0
  markdown           pkgs/main/linux-64::markdown-3.1.1-py37_0
  protobuf           pkgs/main/linux-64::protobuf-3.9.2-py37he6710b0_0
  tensorboard        pkgs/main/linux-64::tensorboard-1.14.0-py37hf484d3e_0
  tensorflow         pkgs/main/linux-64::tensorflow-1.14.0-mkl_py37h45c423b_0
  tensorflow-base    pkgs/main/linux-64::tensorflow-base-1.14.0-mkl_py37h7ce6ba3_0
  tensorflow-estima~ pkgs/main/noarch::tensorflow-estimator-1.14.0-py_0
  termcolor          pkgs/main/linux-64::termcolor-1.1.0-py37_1

The following packages will be UPDATED:

  openssl                                 1.1.1d-h7b6447c_2 --> 1.1.1d-h7b6447c_3


Proceed ([y]/n)?

インストール、アップデートされるパッケージが表示され、続行するか聞かれるので、yを入力します。
y

コマンド実行結果
Proceed ([y]/n)? y


Downloading and Extracting Packages
gast-0.3.2           | 13 KB     | ##################################### | 100%
absl-py-0.8.0        | 164 KB    | ##################################### | 100%
openssl-1.1.1d       | 3.7 MB    | ##################################### | 100%
libprotobuf-3.9.2    | 2.9 MB    | ##################################### | 100%
tensorflow-estimator | 291 KB    | ##################################### | 100%
protobuf-3.9.2       | 631 KB    | ##################################### | 100%
keras-applications-1 | 33 KB     | ##################################### | 100%
tensorflow-1.14.0    | 4 KB      | ##################################### | 100%
keras-preprocessing- | 36 KB     | ##################################### | 100%
_tflow_select-2.3.0  | 2 KB      | ##################################### | 100%
google-pasta-0.1.7   | 41 KB     | ##################################### | 100%
termcolor-1.1.0      | 8 KB      | ##################################### | 100%
grpcio-1.16.1        | 984 KB    | ##################################### | 100%
astor-0.8.0          | 46 KB     | ##################################### | 100%
markdown-3.1.1       | 118 KB    | ##################################### | 100%
tensorboard-1.14.0   | 3.1 MB    | ##################################### | 100%
c-ares-1.15.0        | 89 KB     | ##################################### | 100%
tensorflow-base-1.14 | 84.4 MB   | ##################################### | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
(ml_env) [anaconda@CENTOS7 ~]$

tensorflowがインストールされました。

3. kerasのインストール

kerasをインストールします。
conda install keras

コマンド実行結果
(ml_env) [anaconda@CENTOS7 ~]$ conda install keras
Collecting package metadata (current_repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: /home/anaconda/anaconda3/envs/ml_env

  added / updated specs:
    - keras


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    keras-2.2.4                |                0           5 KB
    keras-base-2.2.4           |           py37_0         421 KB
    ------------------------------------------------------------
                                           Total:         426 KB

The following NEW packages will be INSTALLED:

  keras              pkgs/main/linux-64::keras-2.2.4-0
  keras-base         pkgs/main/linux-64::keras-base-2.2.4-py37_0


Proceed ([y]/n)?

インストールされるパッケージが表示され、続行するか聞かれるので、yを入力します。
y

コマンド実行結果
Proceed ([y]/n)? y


Downloading and Extracting Packages
keras-2.2.4          | 5 KB      | ##################################### | 100%
keras-base-2.2.4     | 421 KB    | ##################################### | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
(ml_env) [anaconda@CENTOS7 ~]$

kerasがインストールされました。

4. opencvのインストール

opencvをインストールします。
conda install opencv

コマンド実行結果
(ml_env) [anaconda@CENTOS7 ~]$ conda install opencv
Collecting package metadata (current_repodata.json): done
Solving environment: failed with initial frozen solve. Retrying with flexible solve.
Solving environment: failed with repodata from current_repodata.json, will retry with next repodata source.
Collecting package metadata (repodata.json): done
Solving environment: done

## Package Plan ##

  environment location: /home/anaconda/anaconda3/envs/ml_env

  added / updated specs:
    - opencv


The following packages will be downloaded:

    package                    |            build
    ---------------------------|-----------------
    ffmpeg-4.0                 |       hcdf2ecd_0        53.3 MB
    freeglut-3.0.0             |       hf484d3e_5         176 KB
    h5py-2.8.0                 |   py37h989c5e5_3         910 KB
    hdf5-1.10.2                |       hba1933b_1         3.8 MB
    jasper-2.0.14              |       h07fcdf6_1         707 KB
    libglu-9.0.0               |       hf484d3e_1         271 KB
    libopencv-3.4.2            |       hb342d67_1        21.8 MB
    libopus-1.3                |       h7b6447c_0         436 KB
    libvpx-1.7.0               |       h439df22_0         1.2 MB
    opencv-3.4.2               |   py37h6fd60c2_1          11 KB
    py-opencv-3.4.2            |   py37hb342d67_1         1.0 MB
    pytables-3.4.4             |   py37ha205bf6_0         1.2 MB
    ------------------------------------------------------------
                                           Total:        84.9 MB

The following NEW packages will be INSTALLED:

  ffmpeg             pkgs/main/linux-64::ffmpeg-4.0-hcdf2ecd_0
  freeglut           pkgs/main/linux-64::freeglut-3.0.0-hf484d3e_5
  jasper             pkgs/main/linux-64::jasper-2.0.14-h07fcdf6_1
  libglu             pkgs/main/linux-64::libglu-9.0.0-hf484d3e_1
  libopencv          pkgs/main/linux-64::libopencv-3.4.2-hb342d67_1
  libopus            pkgs/main/linux-64::libopus-1.3-h7b6447c_0
  libvpx             pkgs/main/linux-64::libvpx-1.7.0-h439df22_0
  opencv             pkgs/main/linux-64::opencv-3.4.2-py37h6fd60c2_1
  py-opencv          pkgs/main/linux-64::py-opencv-3.4.2-py37hb342d67_1

The following packages will be DOWNGRADED:

  h5py                                 2.9.0-py37h7918eee_0 --> 2.8.0-py37h989c5e5_3
  hdf5                                    1.10.4-hb1b8bf9_0 --> 1.10.2-hba1933b_1
  pytables                             3.5.2-py37h71ec239_1 --> 3.4.4-py37ha205bf6_0


Proceed ([y]/n)?

インストール、アップデート、ダウングレードされるパッケージが表示され、続行するか聞かれるので、yを入力します。
y

コマンド実行結果
Proceed ([y]/n)? y


Downloading and Extracting Packages
ffmpeg-4.0           | 53.3 MB   | ##################################### | 100%
libopencv-3.4.2      | 21.8 MB   | ##################################### | 100%
libglu-9.0.0         | 271 KB    | ##################################### | 100%
freeglut-3.0.0       | 176 KB    | ##################################### | 100%
hdf5-1.10.2          | 3.8 MB    | ##################################### | 100%
h5py-2.8.0           | 910 KB    | ##################################### | 100%
py-opencv-3.4.2      | 1.0 MB    | ##################################### | 100%
jasper-2.0.14        | 707 KB    | ##################################### | 100%
opencv-3.4.2         | 11 KB     | ##################################### | 100%
libvpx-1.7.0         | 1.2 MB    | ##################################### | 100%
libopus-1.3          | 436 KB    | ##################################### | 100%
pytables-3.4.4       | 1.2 MB    | ##################################### | 100%
Preparing transaction: done
Verifying transaction: done
Executing transaction: done
(ml_env) [anaconda@CENTOS7 ~]$

opencvがインストールされました。

5. mglearnのインストール

mglernをインストールします。mglerncondaではインストールできないので、pipでインストールします。
pip install mglearn

コマンド実行結果
(ml_env) [anaconda@CENTOS7 ~]$ pip install mglearn
Collecting mglearn
  Downloading https://files.pythonhosted.org/packages/fb/01/8d3630ecc767c9de96a9c46e055f2a3a5f9e14a47d3d0348a36a5005fe67/mglearn-0.1.7.tar.gz (540kB)
     |????????????????????????????????| 542kB 533kB/s
Requirement already satisfied: numpy in ./anaconda3/envs/ml_env/lib/python3.7/site-packages (from mglearn) (1.17.2)
Requirement already satisfied: matplotlib in ./anaconda3/envs/ml_env/lib/python3.7/site-packages (from mglearn) (3.1.1)
Requirement already satisfied: scikit-learn in ./anaconda3/envs/ml_env/lib/python3.7/site-packages (from mglearn) (0.21.3)
Requirement already satisfied: pandas in ./anaconda3/envs/ml_env/lib/python3.7/site-packages (from mglearn) (0.25.1)
Requirement already satisfied: pillow in ./anaconda3/envs/ml_env/lib/python3.7/site-packages (from mglearn) (6.2.0)
Requirement already satisfied: cycler in ./anaconda3/envs/ml_env/lib/python3.7/site-packages (from mglearn) (0.10.0)
Requirement already satisfied: imageio in ./anaconda3/envs/ml_env/lib/python3.7/site-packages (from mglearn) (2.6.0)
Requirement already satisfied: kiwisolver>=1.0.1 in ./anaconda3/envs/ml_env/lib/python3.7/site-packages (from matplotlib->mglearn) (1.1.0)
Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in ./anaconda3/envs/ml_env/lib/python3.7/site-packages (from matplotlib->mglearn) (2.4.2)
Requirement already satisfied: python-dateutil>=2.1 in ./anaconda3/envs/ml_env/lib/python3.7/site-packages (from matplotlib->mglearn) (2.8.0)
Requirement already satisfied: scipy>=0.17.0 in ./anaconda3/envs/ml_env/lib/python3.7/site-packages (from scikit-learn->mglearn) (1.3.1)
Requirement already satisfied: joblib>=0.11 in ./anaconda3/envs/ml_env/lib/python3.7/site-packages (from scikit-learn->mglearn) (0.13.2)
Requirement already satisfied: pytz>=2017.2 in ./anaconda3/envs/ml_env/lib/python3.7/site-packages (from pandas->mglearn) (2019.3)
Requirement already satisfied: six in ./anaconda3/envs/ml_env/lib/python3.7/site-packages (from cycler->mglearn) (1.12.0)
Requirement already satisfied: setuptools in ./anaconda3/envs/ml_env/lib/python3.7/site-packages (from kiwisolver>=1.0.1->matplotlib->mglearn) (41.4.0)
Building wheels for collected packages: mglearn
  Building wheel for mglearn (setup.py) ... done
  Created wheel for mglearn: filename=mglearn-0.1.7-py2.py3-none-any.whl size=582705 sha256=8469eec58ee79211eb68796729d3aab8f0e2ef43f7797a424b5d53d864b4e234
  Stored in directory: /home/anaconda/.cache/pip/wheels/74/cf/8d/04f4932d15854a36726c6210763c7127e62de28f5c8ddfcf3b
Successfully built mglearn
Installing collected packages: mglearn
Successfully installed mglearn-0.1.7
(ml_env) [anaconda@CENTOS7 ~]$

mglearnがインストールされました。

6. Jupyter Notebookでインストールの確認

Jupyter Notebookでライブラリがinportできるか確認します。

6.1 Jupyter Notebookを起動します。

jupyter notebook

コマンド実行結果
(ml_env) [anaconda@CENTOS7 ~]$ jupyter notebook
[W 10:57:39.026 NotebookApp] WARNING: The notebook server is listening on all IP addresses and not using encryption. This is not recommended.
[I 10:57:39.053 NotebookApp] JupyterLab extension loaded from /home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/jupyterlab
[I 10:57:39.053 NotebookApp] JupyterLab application directory is /home/anaconda/anaconda3/envs/ml_env/share/jupyter/lab
[I 10:57:39.054 NotebookApp] Serving notebooks from local directory: /home/anaconda/work
[I 10:57:39.055 NotebookApp] The Jupyter Notebook is running at:
[I 10:57:39.055 NotebookApp] http://CENTOS7:8888/
[I 10:57:39.055 NotebookApp] Use Control-C to stop this server and shut down all kernels (twice to skip confirmation).

6.2 jupyter notebookライブラリをインポート

jupyter notebookで以下のソースを実行し、ライブラリがインポートできることを確認します。

test01.py
import tensorflow
import keras
import cv2
import mglearn

以下の警告が出力されますが、エラーが発生していなければインストールはOKです。

実行結果
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:516: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_qint8 = np.dtype([("qint8", np.int8, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:517: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_quint8 = np.dtype([("quint8", np.uint8, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:518: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_qint16 = np.dtype([("qint16", np.int16, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:519: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_quint16 = np.dtype([("quint16", np.uint16, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:520: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_qint32 = np.dtype([("qint32", np.int32, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:525: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  np_resource = np.dtype([("resource", np.ubyte, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:541: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_qint8 = np.dtype([("qint8", np.int8, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:542: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_quint8 = np.dtype([("quint8", np.uint8, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:543: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_qint16 = np.dtype([("qint16", np.int16, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:544: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_quint16 = np.dtype([("quint16", np.uint16, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:545: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_qint32 = np.dtype([("qint32", np.int32, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:550: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  np_resource = np.dtype([("resource", np.ubyte, 1)])
Using TensorFlow backend.
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/sklearn/externals/six.py:31: DeprecationWarning: The module is deprecated in version 0.21 and will be removed in version 0.23 since we've dropped support for Python 2.7. Please rely on the official version of six (https://pypi.org/project/six/).
  "(https://pypi.org/project/six/).", DeprecationWarning)
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/sklearn/externals/joblib/__init__.py:15: DeprecationWarning: sklearn.externals.joblib is deprecated in 0.21 and will be removed in 0.23. Please import this functionality directly from joblib, which can be installed with: pip install joblib. If this warning is raised when loading pickled models, you may need to re-serialize those models with scikit-learn 0.21+.
  warnings.warn(msg, category=DeprecationWarning)

【jupyter notebookの実行結果画面】
J01.png

7. Jupyter Notebookでサンプルソースの動作確認

7.1 scikit-learnによる機械学習のサンプルソースの動作確認

jupyter notebookscikit-learnを使用した以下のソースが実行できることを確認します。
(警告は無視してよいです。)

test02.py
from sklearn.model_selection import train_test_split
from sklearn import datasets, svm, metrics
from sklearn.metrics import accuracy_score

# データを読み込む 
digits = datasets.load_digits()
x = digits.images
y = digits.target
x = x.reshape((-1, 64)) # 二次元配列を一次元配列に変換 

# データを学習用とテスト用に分割する 
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)

# データを学習  (アルゴリズムSVM:(サポートベクトルマシン/サポートベクターマシン))
clf = svm.LinearSVC()
clf.fit(x_train, y_train)

# 予測して精度を確認する
y_pred = clf.predict(x_test)
print(accuracy_score(y_test, y_pred))

【jupyter notebookの実行結果画面】
J02.png

7.2 tensorflow + kerasによる深層学習のサンプルソースの動作確認

jupyter notebooktensorflow + kerasを使用した以下のソースが実行できることを確認します。
(警告は無視してよいです。)

test03.py
%matplotlib inline
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import RMSprop
from keras.datasets import mnist
import matplotlib.pyplot as plt

# 入力と出力を指定
in_size = 28 * 28
out_size = 10

# MNISTのデータを読み込み 
(X_train, y_train), (X_test, y_test) = mnist.load_data()
# データを28*28=784の一次元配列に変換
X_train = X_train.reshape(-1, 784).astype('float32') / 255
X_test = X_test.reshape(-1, 784).astype('float32') / 255
# ラベルデータをone-hotベクトルに直す
y_train = keras.utils.np_utils.to_categorical(y_train.astype('int32'),10)
y_test = keras.utils.np_utils.to_categorical(y_test.astype('int32'),10)

# MLPモデル構造を定義 
model = Sequential()
model.add(Dense(512, activation='relu', input_shape=(in_size,)))
model.add(Dropout(0.2))
model.add(Dense(512, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(out_size, activation='softmax'))

# モデルをコンパイル 
model.compile(loss='categorical_crossentropy', optimizer=RMSprop(), metrics=['accuracy'])

# 学習を実行 
hist = model.fit(X_train, y_train, batch_size=128, epochs=50, verbose=1, validation_data=(X_test, y_test))

# モデルを評価 
score = model.evaluate(X_test, y_test, verbose=1)
print('正解率=', score[1], 'loss=', score[0])

# 学習の様子をグラフへ描画
# 正解率の推移をプロット
plt.plot(hist.history['acc'])
plt.plot(hist.history['val_acc'])
plt.title('Accuracy')
plt.legend(['train', 'test'], loc='upper left')
plt.show()

# ロスの推移をプロット
plt.plot(hist.history['loss'])
plt.plot(hist.history['val_loss'])
plt.title('Loss')
plt.legend(['train', 'test'], loc='upper left')
plt.show()
実行結果
Using TensorFlow backend.
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:516: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_qint8 = np.dtype([("qint8", np.int8, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:517: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_quint8 = np.dtype([("quint8", np.uint8, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:518: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_qint16 = np.dtype([("qint16", np.int16, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:519: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_quint16 = np.dtype([("quint16", np.uint16, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:520: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_qint32 = np.dtype([("qint32", np.int32, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorflow/python/framework/dtypes.py:525: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  np_resource = np.dtype([("resource", np.ubyte, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:541: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_qint8 = np.dtype([("qint8", np.int8, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:542: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_quint8 = np.dtype([("quint8", np.uint8, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:543: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_qint16 = np.dtype([("qint16", np.int16, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:544: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_quint16 = np.dtype([("quint16", np.uint16, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:545: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  _np_qint32 = np.dtype([("qint32", np.int32, 1)])
/home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorboard/compat/tensorflow_stub/dtypes.py:550: FutureWarning: Passing (type, 1) or '1type' as a synonym of type is deprecated; in a future version of numpy, it will be understood as (type, (1,)) / '(1,)type'.
  np_resource = np.dtype([("resource", np.ubyte, 1)])
WARNING:tensorflow:From /home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:74: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead.

WARNING:tensorflow:From /home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:517: The name tf.placeholder is deprecated. Please use tf.compat.v1.placeholder instead.

WARNING:tensorflow:From /home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:4138: The name tf.random_uniform is deprecated. Please use tf.random.uniform instead.

WARNING:tensorflow:From /home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:133: The name tf.placeholder_with_default is deprecated. Please use tf.compat.v1.placeholder_with_default instead.

WARNING:tensorflow:From /home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:3445: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.
Instructions for updating:
Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.
WARNING:tensorflow:From /home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/keras/optimizers.py:790: The name tf.train.Optimizer is deprecated. Please use tf.compat.v1.train.Optimizer instead.

WARNING:tensorflow:From /home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/keras/backend/tensorflow_backend.py:3295: The name tf.log is deprecated. Please use tf.math.log instead.

WARNING:tensorflow:From /home/anaconda/anaconda3/envs/ml_env/lib/python3.7/site-packages/tensorflow/python/ops/math_grad.py:1250: add_dispatch_support.<locals>.wrapper (from tensorflow.python.ops.array_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Use tf.where in 2.0, which has the same broadcast rule as np.where
Train on 60000 samples, validate on 10000 samples
Epoch 1/50
60000/60000 [==============================] - 10s 161us/step - loss: 0.2458 - acc: 0.9236 - val_loss: 0.1026 - val_acc: 0.9684
Epoch 2/50
60000/60000 [==============================] - 9s 152us/step - loss: 0.1012 - acc: 0.9695 - val_loss: 0.0773 - val_acc: 0.9760
Epoch 3/50
60000/60000 [==============================] - 9s 156us/step - loss: 0.0725 - acc: 0.9787 - val_loss: 0.0696 - val_acc: 0.9793
Epoch 4/50
60000/60000 [==============================] - 9s 158us/step - loss: 0.0598 - acc: 0.9824 - val_loss: 0.0682 - val_acc: 0.9809
Epoch 5/50
60000/60000 [==============================] - 9s 155us/step - loss: 0.0504 - acc: 0.9851 - val_loss: 0.0790 - val_acc: 0.9797
Epoch 6/50
60000/60000 [==============================] - 9s 158us/step - loss: 0.0435 - acc: 0.9872 - val_loss: 0.0722 - val_acc: 0.9811
Epoch 7/50
60000/60000 [==============================] - 9s 154us/step - loss: 0.0377 - acc: 0.9885 - val_loss: 0.0849 - val_acc: 0.9799
Epoch 8/50
60000/60000 [==============================] - 9s 156us/step - loss: 0.0364 - acc: 0.9892 - val_loss: 0.0740 - val_acc: 0.9840
Epoch 9/50
60000/60000 [==============================] - 9s 155us/step - loss: 0.0314 - acc: 0.9912 - val_loss: 0.0766 - val_acc: 0.9836
Epoch 10/50
60000/60000 [==============================] - 9s 153us/step - loss: 0.0295 - acc: 0.9909 - val_loss: 0.0764 - val_acc: 0.9828
Epoch 11/50
60000/60000 [==============================] - 10s 159us/step - loss: 0.0258 - acc: 0.9928 - val_loss: 0.0865 - val_acc: 0.9843
Epoch 12/50
60000/60000 [==============================] - 9s 151us/step - loss: 0.0246 - acc: 0.9930 - val_loss: 0.0901 - val_acc: 0.9832
Epoch 13/50
60000/60000 [==============================] - 9s 153us/step - loss: 0.0225 - acc: 0.9936 - val_loss: 0.0983 - val_acc: 0.9823
Epoch 14/50
60000/60000 [==============================] - 9s 155us/step - loss: 0.0214 - acc: 0.9944 - val_loss: 0.1021 - val_acc: 0.9825
Epoch 15/50
60000/60000 [==============================] - 9s 152us/step - loss: 0.0220 - acc: 0.9940 - val_loss: 0.0872 - val_acc: 0.9845
Epoch 16/50
60000/60000 [==============================] - 10s 172us/step - loss: 0.0218 - acc: 0.9943 - val_loss: 0.1009 - val_acc: 0.9827
Epoch 17/50
60000/60000 [==============================] - 10s 159us/step - loss: 0.0199 - acc: 0.9944 - val_loss: 0.0966 - val_acc: 0.9837
Epoch 18/50
60000/60000 [==============================] - 9s 156us/step - loss: 0.0197 - acc: 0.9950 - val_loss: 0.1083 - val_acc: 0.9829
Epoch 19/50
60000/60000 [==============================] - 9s 155us/step - loss: 0.0159 - acc: 0.9955 - val_loss: 0.1198 - val_acc: 0.9819
Epoch 20/50
60000/60000 [==============================] - 9s 156us/step - loss: 0.0175 - acc: 0.9949 - val_loss: 0.1089 - val_acc: 0.9849
Epoch 21/50
60000/60000 [==============================] - 9s 152us/step - loss: 0.0172 - acc: 0.9954 - val_loss: 0.1113 - val_acc: 0.9843
Epoch 22/50
60000/60000 [==============================] - 9s 152us/step - loss: 0.0159 - acc: 0.9959 - val_loss: 0.1062 - val_acc: 0.9848
Epoch 23/50
60000/60000 [==============================] - 9s 151us/step - loss: 0.0162 - acc: 0.9960 - val_loss: 0.1157 - val_acc: 0.9838
Epoch 24/50
60000/60000 [==============================] - 9s 155us/step - loss: 0.0143 - acc: 0.9963 - val_loss: 0.1195 - val_acc: 0.9841
Epoch 25/50
60000/60000 [==============================] - 9s 156us/step - loss: 0.0171 - acc: 0.9958 - val_loss: 0.1180 - val_acc: 0.9840
Epoch 26/50
60000/60000 [==============================] - 9s 153us/step - loss: 0.0172 - acc: 0.9960 - val_loss: 0.1198 - val_acc: 0.9848
Epoch 27/50
60000/60000 [==============================] - 9s 158us/step - loss: 0.0136 - acc: 0.9964 - val_loss: 0.1101 - val_acc: 0.9861
Epoch 28/50
60000/60000 [==============================] - 9s 152us/step - loss: 0.0145 - acc: 0.9968 - val_loss: 0.1194 - val_acc: 0.9850
Epoch 29/50
60000/60000 [==============================] - 10s 164us/step - loss: 0.0145 - acc: 0.9964 - val_loss: 0.1306 - val_acc: 0.9825
Epoch 30/50
60000/60000 [==============================] - 9s 152us/step - loss: 0.0142 - acc: 0.9966 - val_loss: 0.1237 - val_acc: 0.9856
Epoch 31/50
60000/60000 [==============================] - 9s 153us/step - loss: 0.0148 - acc: 0.9967 - val_loss: 0.1366 - val_acc: 0.9832
Epoch 32/50
60000/60000 [==============================] - 9s 156us/step - loss: 0.0148 - acc: 0.9965 - val_loss: 0.1185 - val_acc: 0.9857
Epoch 33/50
60000/60000 [==============================] - 10s 158us/step - loss: 0.0122 - acc: 0.9972 - val_loss: 0.1239 - val_acc: 0.9837
Epoch 34/50
60000/60000 [==============================] - 9s 157us/step - loss: 0.0150 - acc: 0.9965 - val_loss: 0.1289 - val_acc: 0.9826
Epoch 35/50
60000/60000 [==============================] - 10s 162us/step - loss: 0.0131 - acc: 0.9970 - val_loss: 0.1375 - val_acc: 0.9829
Epoch 36/50
60000/60000 [==============================] - 9s 158us/step - loss: 0.0133 - acc: 0.9971 - val_loss: 0.1265 - val_acc: 0.9845
Epoch 37/50
60000/60000 [==============================] - 10s 159us/step - loss: 0.0107 - acc: 0.9974 - val_loss: 0.1365 - val_acc: 0.9842
Epoch 38/50
60000/60000 [==============================] - 10s 159us/step - loss: 0.0134 - acc: 0.9970 - val_loss: 0.1377 - val_acc: 0.9846
Epoch 39/50
60000/60000 [==============================] - 9s 157us/step - loss: 0.0139 - acc: 0.9971 - val_loss: 0.1560 - val_acc: 0.9815
Epoch 40/50
60000/60000 [==============================] - 9s 157us/step - loss: 0.0121 - acc: 0.9969 - val_loss: 0.1388 - val_acc: 0.9839
Epoch 41/50
60000/60000 [==============================] - 9s 157us/step - loss: 0.0163 - acc: 0.9971 - val_loss: 0.1379 - val_acc: 0.9843
Epoch 42/50
60000/60000 [==============================] - 9s 157us/step - loss: 0.0126 - acc: 0.9973 - val_loss: 0.1313 - val_acc: 0.9844
Epoch 43/50
60000/60000 [==============================] - 9s 157us/step - loss: 0.0139 - acc: 0.9972 - val_loss: 0.1480 - val_acc: 0.9825
Epoch 44/50
60000/60000 [==============================] - 9s 157us/step - loss: 0.0122 - acc: 0.9974 - val_loss: 0.1434 - val_acc: 0.9840
Epoch 45/50
60000/60000 [==============================] - 9s 152us/step - loss: 0.0120 - acc: 0.9975 - val_loss: 0.1459 - val_acc: 0.9843
Epoch 46/50
60000/60000 [==============================] - 9s 152us/step - loss: 0.0139 - acc: 0.9971 - val_loss: 0.1318 - val_acc: 0.9851
Epoch 47/50
60000/60000 [==============================] - 9s 152us/step - loss: 0.0110 - acc: 0.9977 - val_loss: 0.1363 - val_acc: 0.9850
Epoch 48/50
60000/60000 [==============================] - 9s 152us/step - loss: 0.0108 - acc: 0.9977 - val_loss: 0.1417 - val_acc: 0.9832
Epoch 49/50
60000/60000 [==============================] - 9s 152us/step - loss: 0.0144 - acc: 0.9971 - val_loss: 0.1478 - val_acc: 0.9835
Epoch 50/50
60000/60000 [==============================] - 9s 151us/step - loss: 0.0107 - acc: 0.9978 - val_loss: 0.1319 - val_acc: 0.9852
10000/10000 [==============================] - 1s 75us/step
正解率= 0.9852 loss= 0.13187411594858459

J03.png
J04.png

動作が確認できました。

以上

リンク

【第一回】CentOSにPythonの機械学習開発環境を構築する(Anacondaインストール編)
【第二回】CentOSにPythonの機械学習開発環境を構築する(Jupyter Notebook編)
【番外編】CentOSにPythonの機械学習開発環境を構築する(systemdでのJupyter Notebookの自動起動編)

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MinikubeとTensorFlow 2.0でGPUを使ってCIFAR-10

LinuxでGPU環境を構築して暫く経ちました。今回いろいろ古くなった環境を再構築する機会があったので、Linuxにおける機械学習の環境構築とCIFAR-10でディープラーニングに至る道程について簡単に記録に残しておくことにしました。

(本記事は自分のブログからの転載記事です。)

対象読者

本記事は、LinuxでGPUを用いた機械学習の環境を構築してみたい方を対象にしています。また、MLOpsに興味があり、機械学習基盤の構築に興味がある方にもおすすめします。本記事では実際に機械学習の環境を構築してディープラーニングで画像分類をおこなうところまでの手順を説明します。その際以下の知識があったほうがより深く理解が出来ますが、本記事を読むのに必須ではありません。

  • Kubernetes
  • JupyterLab
  • TensorFlow
  • Keras
  • CNN(Convolutional Neural Network)

マシンの準備

まずは機械学習用のマシンを調達します。マシンはLinuxが動作してNVIDIAのグラフィックボードを認識できれば問題ないです。グラフィックボードはなるべく新しいものの方が計算速度が速いのでいいと思います1
自分は「NVIDIA GeForce GTX1080 Ti」を利用しています。

OSのインストール

Ubuntu 18.04を利用します。以下からダウンロードしてインストールします。

NVIDIAドライバのインストール

「ソフトウェアとアップデート」を起動して「追加のドライバー」タブから「プロプライエタリ、検証済み」のドライバを選択して「変更の適用」をします。適用後に再起動してください。

nvidia-smiコマンドが利用できて以下のような感じになればOKです。

$ nvidia-smi
Sun Oct 20 09:55:26 2019
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.26       Driver Version: 430.26       CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 108...  Off  | 00000000:01:00.0  On |                  N/A |
| 25%   36C    P8    13W / 250W |    261MiB / 11175MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|    0      1670      G   /usr/lib/xorg/Xorg                            18MiB |
|    0      1704      G   /usr/bin/gnome-shell                          49MiB |
|    0      3918      G   /usr/lib/xorg/Xorg                            87MiB |
|    0      4031      G   /usr/bin/gnome-shell                         103MiB |
+-----------------------------------------------------------------------------+

Docker Engine for Community のインストール

以下の手順どおりに実行します。

以下はコマンドの抜粋です。

$ sudo apt-get remove docker docker-engine docker.io containerd runc
$ sudo apt-get update
$ sudo apt-get install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    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 docker-ce-cli containerd.io

インストール後は「docker version」のコマンドで確認します。

$ sudo docker version
Client: Docker Engine - Community
 Version:           19.03.3
 API version:       1.40
 Go version:        go1.12.10
 Git commit:        a872fc2f86
 Built:             Tue Oct  8 00:59:59 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.3
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.10
  Git commit:       a872fc2f86
  Built:            Tue Oct  8 00:58:31 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.10
  GitCommit:        b34a5c8af56e510852c35414db4c1f4fa6172339
 nvidia:
  Version:          1.0.0-rc8+dev
  GitCommit:        3e425f80a8c931f88e6d94a8c831b9d5aa481657
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

NVIDIA Container Toolkitのインストール

以下に従って行います。

$ distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
$ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
$ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

$ sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit

デフォルトのコンテナランタイムを変更するため/etc/docker/daemon.jsonに以下を記載します。

{
    "default-runtime": "nvidia",
    "runtimes": {
        "nvidia": {
            "path": "/usr/bin/nvidia-container-runtime",
            "runtimeArgs": []
        }
    }
}

dockerを再起動します。

$ sudo systemctl restart docker

以下のコマンドでdockerからGPUが見えているか確認します。

$ docker run nvidia/cuda:10.0-base nvidia-smi
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 430.26       Driver Version: 430.26       CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  GeForce GTX 108...  Off  | 00000000:01:00.0  On |                  N/A |
| 25%   37C    P8    13W / 250W |    262MiB / 11175MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
+-----------------------------------------------------------------------------+

kubectlのインストール

以下の手順でインストールします。

$ curl -LO https://storage.googleapis.com/kubernetes-release/release/`curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
$ curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.16.0/bin/linux/amd64/kubectl
$ chmod +x ./kubectl
$ sudo mv ./kubectl /usr/local/bin/kubectl

Minikubeのインストール

以下に従って行います。

$ curl -Lo minikube https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && chmod +x minikube
$ sudo cp minikube /usr/local/bin && rm minikube

以下のコマンドでMinikubeを実行します。--vm-driver noneがポイントでこれをつけるとホスト上のDockerでKubernetesが実行されます。

sudo -E minikube start --vm-driver none

Dockerイメージの作成

まずは機械学習用のDockerfileを作成します。Dockerfileは以下のとおりです。

FROM nvidia/cuda:10.0-cudnn7-devel

WORKDIR /
ENV PYENV_ROOT /.pyenv
ENV PATH $PYENV_ROOT/shims:$PYENV_ROOT/bin:$PATH

RUN apt-get update && apt-get install -y \
    curl \
    git \
    unzip \
    imagemagick \
    bzip2 \
    graphviz \
    vim \
    tree \
   && apt-get clean \
   && rm -rf /var/lib/apt/lists/*

RUN git clone git://github.com/yyuu/pyenv.git .pyenv

RUN pyenv install anaconda3-2019.10
RUN pyenv global anaconda3-2019.10
RUN pyenv rehash

RUN pip install tensorflow-gpu==2.0.0 gym

RUN conda install -c conda-forge jupyterlab
RUN conda install -c anaconda pandas-datareader
RUN conda install -c anaconda py-xgboost
RUN conda install -c anaconda graphviz
RUN conda install -c anaconda h5py
RUN conda install -c conda-forge tqdm

RUN mkdir /jupyter
WORKDIR /jupyter

ENV HOME  /jupyter
ENV LD_LIBRARY_PATH $LD_LIBRARY_PATH:/usr/local/cuda/extras/CUPTI/lib64
ENV SHELL /bin/bash

EXPOSE 8888

ENTRYPOINT ["jupyter", "lab", "--ip=0.0.0.0", "--no-browser", "--allow-root", "--NotebookApp.token=''"]

ポイントは以下のとおりです。

  • ベースイメージとしてnvidia/cuda:10.0-cudnn7-develを指定
    • TensorFlow 2.0が動作可能なCUDAとcuDNNを指定
  • pyenvAnacondaをインストール
    • Anacondaでデータサイエンスに必要なパッケージの全部入りをざっくり入れる
    • minicondaで細かく指定して入れる方法もある
  • condaでJupyterLabをインストール
    • 他のパッケージは好みに合わせてインストールする
  • piptensorflow-gpu(2.0.0)をインストール
    • まだAnacondaに最新パッケージがなかったのでpipでインストール
  • LD_LIBRARY_PATHにCUPTIのライブラリのパスを指定
    • TensorFlowで利用されるのでパスを通しておく
  • ENTRYPOINTでJupyterLabが起動するように指定する

次に以下のコマンドでイメージのビルドを行います。

$ docker build -t ml/all:v0.1 .

以下のコマンドでイメージが作成できているかどうか確認します。

$ docker image ls ml/all
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ml/all              v0.1               e23280bc3856        18 hours ago        11.3GB

デプロイメントの作成

以下のようなyamlファイルを作成し、上記で作成したイメージをMinikubeにデプロイします。

ml-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ml-deployment
  labels:
    app: ml-deploy
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ml-deploy
  template:
    metadata:
      annotations:
        kubernetes.io/change-cause: "modified at 2019-10-20 05:50:40 +0900"
      labels:
        app: ml-deploy
    spec:
      containers:
        - name: ml-deploy
          image: ml/all:v1.0
          ports:
            - containerPort: 8888
          volumeMounts:
            - name: notebook
              mountPath: /jupyter
          imagePullPolicy: IfNotPresent
      volumes:
        - name: notebook
          hostPath:
            path: /home/jupyter/ml-all
            type: Directory

以下のコマンドでデプロイメントの作成を行います。

kubectl apply -f ml-deploy.yml

以下のコマンドでデプロイメントが作成されていることを確認します。

$ kubectl get deployments
NAME            READY   UP-TO-DATE   AVAILABLE   AGE
ml-deployment   1/1     1            1           36h

サービスの作成

以下のようなyamlファイルを作成し、上記で作成したイメージをデプロイメントをサービスとして公開します。

ml-svc.yaml
kind: Service
apiVersion: v1
metadata:
  name: ml-svc
spec:
  selector:
    app: ml-deploy
  ports:
    - protocol: TCP
      port: 8888
      targetPort: 8888
      nodePort: 30001
  type: NodePort

以下のコマンドでサービスの作成を行います。

$ kubectl apply -f ml-svc.yml

以下のコマンドでサービスが作成されていることを確認します。

$ kubectl get services
NAME         TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP          37h
ml-svc       NodePort    10.103.99.171   <none>        8888:30001/TCP   36h

サービスの作成はkubectlのexposeコマンドを用いても行うことができます。
ここまででようやく機械学習の環境が整いました。

JupyterLabでノートブックを作成

ブラウザで以下のアドレスにアクセスします。

http://(minikubeが起動しているマシンのIPアドレス):30001/

+ボタンを押して、Lancherを起動し、Python3のノートブックを作成します。


 
最初は「Untitled.ipynb」というファイル名で作成されますが、ファイルを右クリックで「Rename」を選択してファイル名を変更できます。今回は「cifar10.ipynb」に変更します。

TensorFlow 2.0 with Kerasで画像分類(CIFAR-10)

ようやくお待ちかねのディープラーニングのターンです。今回はようやく最近正式リリースされたTensorFlow 2.0とTensorFlowに密に統合されたKerasのAPIを利用してCIFAR-10の画像セットを用いて画像分類を行います。

ソースコードはkeras/cifar10_cnn.pyをベースにtensorflow対応や可視化表示のコードを加えたものになります。先程作成したノートブックに貼り付けて実行してください。適当にセルに分割して実行したほうが良いと思います。

import tensorflow as tf
import numpy as np
import os
# GPUをオフにする場合
# os.environ["CUDA_VISIBLE_DEVICES"]="-1"
from tensorflow import keras
from tensorflow.keras.datasets import cifar10
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten
from tensorflow.keras.layers import Conv2D, MaxPooling2D
import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
%matplotlib inline

# GPUのメモリを必要な量だけ使うようにする
physical_devices = tf.config.experimental.list_physical_devices('GPU')[0]
tf.config.experimental.set_memory_growth(physical_devices, True)

# パラメータの宣言
batch_size = 32
num_classes = 10
epochs = 15
num_predictions = 20
save_dir = os.path.join(os.getcwd(), 'saved_models')
model_name = 'keras_cifar10_trained_model.h5'

# CIFAR-10のデータロード
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')


# 画像の表示
LABELS = ('airplane', 'mobile', 'bird', 'cat', 'deer',
          'dog', 'frog', 'horse','ship', 'truck')

def to_label(v):
  idx = np.argmax(v)
  if idx < len(LABELS):
    return LABELS[idx]
  else:
    return None

plt.clf()
for i in range(0, 40):
  plt.subplot(5, 8, i+1)
  plt.tight_layout()
  pixels = x_train[i,:,:,:]
  plt.title(to_label(y_train[i]), fontsize=8)
  fig = plt.imshow(pixels)
  fig.axes.get_xaxis().set_visible(False)
  fig.axes.get_yaxis().set_visible(False)

# One-Hot Vectorに変換
y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

# モデルの構築
model = Sequential()
model.add(Conv2D(32, (3, 3), padding='same',
                 input_shape=x_train.shape[1:]))
model.add(Activation('relu'))
model.add(Conv2D(32, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Conv2D(64, (3, 3), padding='same'))
model.add(Activation('relu'))
model.add(Conv2D(64, (3, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))

model.add(Flatten())
model.add(Dense(512))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes))
model.add(Activation('softmax'))

# モデルのコンパイル
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
model.summary()

# データの正規化
x_train = x_train.astype('float32')
x_test = x_test.astype('float32')
x_train /= 255
x_test /= 255

# モデルの訓練
history = model.fit(x_train, y_train,
              batch_size=batch_size,
              epochs=epochs,
              validation_data=(x_test, y_test),
              shuffle=True)

# 訓練したモデルの保存
if not os.path.isdir(save_dir):
    os.makedirs(save_dir)
model_path = os.path.join(save_dir, model_name)
model.save(model_path)
print('Saved trained model at %s ' % model_path)

# モデルの評価
scores = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', scores[0])
print('Test accuracy:', scores[1])


# モデルの訓練仮定の可視化
loss     = history.history['loss']
val_loss = history.history['val_loss']

nb_epoch = len(loss)
plt.plot(range(nb_epoch), loss,     marker='.', label='loss')
plt.plot(range(nb_epoch), val_loss, marker='.', label='val_loss')
plt.legend(loc='best', fontsize=10)
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()

実行結果

分類対象の画像です。CIFAR-10では32x32のサイズの画像を10種類に分類します。

モデルの要約です。畳み込み層、プーリング層、ドロップアウト層、活性化層(relu)を利用した典型的なCNNになっています。最後の出力には全結合層と活性化層(SoftMax)を利用しています。

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 32, 32, 32)        896       
_________________________________________________________________
activation (Activation)      (None, 32, 32, 32)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 30, 30, 32)        9248      
_________________________________________________________________
activation_1 (Activation)    (None, 30, 30, 32)        0         
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 15, 15, 32)        0         
_________________________________________________________________
dropout (Dropout)            (None, 15, 15, 32)        0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 15, 15, 64)        18496     
_________________________________________________________________
activation_2 (Activation)    (None, 15, 15, 64)        0         
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 13, 13, 64)        36928     
_________________________________________________________________
activation_3 (Activation)    (None, 13, 13, 64)        0         
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 6, 6, 64)          0         
_________________________________________________________________
dropout_1 (Dropout)          (None, 6, 6, 64)          0         
_________________________________________________________________
flatten (Flatten)            (None, 2304)              0         
_________________________________________________________________
dense (Dense)                (None, 512)               1180160   
_________________________________________________________________
activation_4 (Activation)    (None, 512)               0         
_________________________________________________________________
dropout_2 (Dropout)          (None, 512)               0         
_________________________________________________________________
dense_1 (Dense)              (None, 10)                5130      
_________________________________________________________________
activation_5 (Activation)    (None, 10)                0         
=================================================================
Total params: 1,250,858
Trainable params: 1,250,858
Non-trainable params: 0

訓練経過です。だいたい1エポック9秒程度で終わっています。また検証データの正解率(val_accuracy)も77%程度になっています。ちなみに下記の結果はGPUを使用したものですが、CPUの場合は1エポックで43秒程かかりました。GPUは偉大です・・・

Train on 50000 samples, validate on 10000 samples
Epoch 1/15
50000/50000 [==============================] - 10s 199us/sample - loss: 1.5545 - accuracy: 0.4320 - val_loss: 1.1938 - val_accuracy: 0.5681
Epoch 2/15
50000/50000 [==============================] - 9s 177us/sample - loss: 1.1665 - accuracy: 0.5840 - val_loss: 0.9679 - val_accuracy: 0.6565
Epoch 3/15
50000/50000 [==============================] - 8s 162us/sample - loss: 1.0074 - accuracy: 0.6419 - val_loss: 0.8711 - val_accuracy: 0.6919
Epoch 4/15
50000/50000 [==============================] - 8s 163us/sample - loss: 0.9178 - accuracy: 0.6771 - val_loss: 0.8321 - val_accuracy: 0.7100
Epoch 5/15
50000/50000 [==============================] - 9s 187us/sample - loss: 0.8527 - accuracy: 0.6999 - val_loss: 0.7774 - val_accuracy: 0.7309
Epoch 6/15
50000/50000 [==============================] - 9s 186us/sample - loss: 0.8061 - accuracy: 0.7175 - val_loss: 0.7574 - val_accuracy: 0.7349
Epoch 7/15
50000/50000 [==============================] - 9s 173us/sample - loss: 0.7724 - accuracy: 0.7287 - val_loss: 0.7334 - val_accuracy: 0.7482
Epoch 8/15
50000/50000 [==============================] - 8s 168us/sample - loss: 0.7343 - accuracy: 0.7417 - val_loss: 0.7231 - val_accuracy: 0.7535
Epoch 9/15
50000/50000 [==============================] - 9s 185us/sample - loss: 0.7121 - accuracy: 0.7495 - val_loss: 0.7061 - val_accuracy: 0.7586
Epoch 10/15
50000/50000 [==============================] - 8s 166us/sample - loss: 0.6878 - accuracy: 0.7577 - val_loss: 0.6602 - val_accuracy: 0.7716
Epoch 11/15
50000/50000 [==============================] - 8s 162us/sample - loss: 0.6672 - accuracy: 0.7675 - val_loss: 0.6990 - val_accuracy: 0.7614
Epoch 12/15
50000/50000 [==============================] - 8s 163us/sample - loss: 0.6462 - accuracy: 0.7729 - val_loss: 0.6837 - val_accuracy: 0.7645
Epoch 13/15
50000/50000 [==============================] - 8s 169us/sample - loss: 0.6322 - accuracy: 0.7777 - val_loss: 0.6593 - val_accuracy: 0.7787
Epoch 14/15
50000/50000 [==============================] - 9s 172us/sample - loss: 0.6197 - accuracy: 0.7826 - val_loss: 0.6672 - val_accuracy: 0.7761
Epoch 15/15
50000/50000 [==============================] - 8s 159us/sample - loss: 0.6035 - accuracy: 0.7887 - val_loss: 0.6811 - val_accuracy: 0.7682

損失の経過を表したグラフです。見ての通り10エポック以降から過学習をおこしています。

まとめ

本記事ではLinuxでGPUを用いた機械学習環境を構築する手順を紹介しました。特に初学者から中級者レベルの方が自宅に機械学習環境をシンプルに構築したいシチュエーションを想定して以下の環境構築を一気通貫で実施しました。

  • Minikube(Kubernetes)
  • JupyterLab
  • TensorFlow
  • Keras
  • CNN(Convolutional Neural Network)

今回なぜLinux+Minikube+JupyterLabの構成にしたかというと、まず機械学習の環境は依存関係が複雑な上に開発のスピードが非常に速いという問題があるからです。特にGPUのドライバのバージョンとCUDAとcuDNNとフレームワーク(TensorFlow等)のバージョンの関係は非常にセンシティブなため、コンテナとして管理した方が非常に安心してバージョンアップができます。特にMinikube(Kubernetes)で管理すれば一つ前のデプロイメントに戻すのも簡単なので環境構築の試行錯誤とノウハウの蓄積も簡単になります。そして、本記事ではMinikubeで構築しましたが、複数マシンのKubernetesクラスタで構築すれば複数人でも利用可能な機械学習基盤になり、MLOpsにも繋がっています。

またJupyterLabはいわゆるノートブックの環境で機械学習を環境としては、試行錯誤が容易でコーディングと結果の可視化が両立されており非常に使い勝手が良いのでおすすめです。ノートブックに関しては以前に全プログラマに捧ぐ!図解「ノートブック」という記事を書いたのでそちらを参照してください。

本記事は自分が一番最初にLinuxで機械学習環境を構築しようとした時に、多くの手順に苛まれてなかなかお目当てのディープラーニングまで辿り着けなくてもどかしい思いをした経験から、環境構築からディープラーニングまで一気通貫で記事を構成してみました。

駆け足での説明になってしまいましたが、機械学習に興味がある方の一助になれば幸いです。

参考文献

  1. Minikubeを使ってローカルにkubernetes環境を構築 - Qiita
  2. tensorflow2.0 + kerasでGPUメモリの使用量を抑える方法 - Qiita
  3. Keras+CNNでCIFAR-10の画像分類
  4. CIFAR-10のデータセットを用いてCNNの画像認識を行ってみる - AI人工知能テクノロジー

おまけ

DockerfileはGitで管理しておくと便利です。また、Dockerfileのビルドからデプロイおよびコミットまで自動化しておくと間違いがありません。以下はRubyスクリプトですが自分が使っているものです。ポイントはsedでkubernetes.io/change-causeを書換えていることです。こうすることでデプロイメントを更新可能にしています。イメージのバージョンは大きな変更をした場合だけ上げるようにして、ちょっとした変更(機械学習用のライブラリ追加等)はDockerfileをちょっと修正してこのスクリプトを実行するだけで環境のアップデートが終わるので非常に楽です。

#!/usr/bin/env ruby

$VERSION = "v1.13"
system("docker build -t ml/all:#{$VERSION} .") || raise('Failed to docker build')

msg = "\"modified at #{Time.now}\""
cmd = "sed -i -e 's/\\(kubernetes.io\\/change-cause: \\).*$/\\1#{msg}/' ml-deploy.yml"
system(cmd) || raise('Failed to sed')

system("kubectl apply -f ml-deploy.yml") || raise('Failed to sed')
system("git add ml-deploy.yml") || raise('Failed to add')
system("git add Dockerfile") || raise('Failed to add')
system("git commit -m 'modify ml/all image'") || raise('Failed to commit')

  1. ただし新しすぎるとドライバがなかったり、バグがあったりするのでリサーチは十分行ってください。 

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む