- 投稿日:2019-10-21T18:51:40+09:00
TensorFlow2.0 + 無料のColab TPUでDCGANを実装した
TensorFlow2.0とGoogle Colaboratoryの無料TPUを使って、DCGANを実装しました。
訓練経過の様子
— しこあん@『モザイク除去本』好評通販中 (@koshian2) October 21, 2019何をやったか
- 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/1rSm01ZiAFgxsWOcQ48cdtgLiVnwwZNfxTF2.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_imgdistributedデコレーター
これはTensorFlowの組み込みではなく、自分で実装したデコレーターです。
TPUの訓練では(複数GPUと同様)、複数のTPUデバイスにデータをMapしたあと、個々の計算結果(損失値や生成画像)をReduceする必要があります。実装する際、特に意識しないといけないのがReduceで、Reduce用の関数はTFの組み込みでもいくつか用意されています。
しかし、組み込み関数だけでは単体の
train_on_batch
関数を定義したあと、distributed対応の関数を別に書かないといけず、デザイン的に少し野暮ったいのです。そこで、分散訓練の対応+Reduceをいい感じにやってくれるデコレータを自分で実装しました。詳しくはこちら。TensorFlow2.0でDistributed Trainingをいい感じにやるためのデコレーターを作った
デコレーターの引数は各返り値に対するReduceの方法です。
d_loss
とg_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エポック
50エポック
相当綺麗です。バッチサイズが1024と大きいおかげで、勾配の信頼性が高く、DCGANでも安定しやすいのでしょう。ここまで30分程度です。
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を公開しているので、ぜひ遊んでみてください。
- 投稿日:2019-10-21T13:55:16+09:00
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.7TFlops double)
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 cuda3. 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.txz6. tensorflowの設定
ここではAnaconda仮想環境での設定方法を使いました。PyPIより、Anacondaを利用することで、tensorflow自体から、それと関連するライブラリが一括インストールされるので、とても便利です。
conda create -n tf pip python=3.7 source activate tf conda install -c anaconda tensorflow-gpu7. 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 install8. Horovodのインストール
ようやく最後となりますが、下記のコマンドでhorovodをインストールします。
HOROVOD_GPU_ALLREDUCE=NCCL pip install --no-cache-dir horovodHorovodの実装
本記事は、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%であることを分かりました。
実行完了したら、下図の赤枠の部分から、gpu 0とgpu 1の実行時間を確認することができます。
Tensorboardでログデータを確認しましょう。下記の命令を実行して、ブラウザでサーバの6006ポートに接続します。(事前にセキュリティグループのポートを開放する必要があります。)tensorboard --logdir /logs/
gpu 0とgpu 1、10KのStepで99%以上の認識率を確認できました。またstepの回数が多くなるにつれて、Lossが減るのが見えます。
最後
いかがでしたでしょうか
本記事ではAlibaba Cloud マルチGPUを持つインスタンスを利用してHorovodの実現性を検証しました。Horovodを用いてクラスタでの実行とかベンチマークの検証などの内容については、今後の記事で共有したいと思います。 また、従量課金制でAlibaba CloudのGPUインスタンスをお気軽にお試しできるので、ぜひためしてみてください!
- 投稿日:2019-10-21T13:51:49+09:00
【第三回(最終回)】CentOSにPythonの機械学習開発環境を構築する(Tensorflow + Kerasインストール編)
前書き
LinuxディストリビューションのCenOSにJupyter Notebookを使用して、Python、Pythonのライブラリであるscikit-learn、Tensorflowやkeras等を使って機械学習のプログラムを作成できる機械学習の開発環境を作成する手順を紹介したいと思います。
「【第一回】CentOSにPythonの機械学習開発環境を構築する(Anacondaインストール編)」では、Anacondaをインストールし、機械学習用環境(ml_env)を作成しました。
「【第二回】CentOSにPythonの機械学習開発環境を構築する(Jupyter Notebook編)」では、Jupyter Notebookを他のPC等からブラウザで使用できるように設定しました。今回はTensorflowやkeras等の機械学習ライブラリをインストールし、サンプルソースがJupyter Notebookで動作することを確認したいと思います。
環境
- OS:CentOS Linux release 7.7.1908
前提条件
- CentOSにAnaconda3(
Anaconda3-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 ~]$
ipython
、jupyter
、numpy
、scipy
、matplotlib
、scikit-learn
、pandas
、pillow
、msgpack-python
はインストール済みとなっていることがわかります。従って、
tensorflow
、keras
、opencv
、mglearn
をインストールします。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
をインストールします。mglern
はconda
ではインストールできないので、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.pyimport 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)7.
Jupyter Notebook
でサンプルソースの動作確認7.1
scikit-learn
による機械学習のサンプルソースの動作確認
jupyter notebook
でscikit-learn
を使用した以下のソースが実行できることを確認します。
(警告は無視してよいです。)test02.pyfrom 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))7.2
tensorflow + keras
による深層学習のサンプルソースの動作確認
jupyter notebook
でtensorflow + 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動作が確認できました。
以上
リンク
【第一回】CentOSにPythonの機械学習開発環境を構築する(Anacondaインストール編)
【第二回】CentOSにPythonの機械学習開発環境を構築する(Jupyter Notebook編)
【番外編】CentOSにPythonの機械学習開発環境を構築する(systemdでのJupyter Notebookの自動起動編)
- 投稿日:2019-10-21T07:44:52+09:00
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: fec3683NVIDIA 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/kubectlMinikubeのインストール
以下に従って行います。
$ 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 noneDockerイメージの作成
まずは機械学習用の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を指定
pyenv
でAnacondaをインストール
- Anacondaでデータサイエンスに必要なパッケージの全部入りをざっくり入れる
- minicondaで細かく指定して入れる方法もある
conda
でJupyterLabをインストール
- 他のパッケージは好みに合わせてインストールする
pip
でtensorflow-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.yamlapiVersion: 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.yamlkind: 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で機械学習環境を構築しようとした時に、多くの手順に苛まれてなかなかお目当てのディープラーニングまで辿り着けなくてもどかしい思いをした経験から、環境構築からディープラーニングまで一気通貫で記事を構成してみました。
駆け足での説明になってしまいましたが、機械学習に興味がある方の一助になれば幸いです。
参考文献
- Minikubeを使ってローカルにkubernetes環境を構築 - Qiita
- tensorflow2.0 + kerasでGPUメモリの使用量を抑える方法 - Qiita
- Keras+CNNでCIFAR-10の画像分類
- 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')
ただし新しすぎるとドライバがなかったり、バグがあったりするのでリサーチは十分行ってください。 ↩