オペレーションの方法

SmallTrain オペレーションの方法を説明します。

ご自身で学習や予測を行うためのオペレーションの方法をご説明します。

Overview

  • (例として、Getting Started(CIFAR-10 image classification)を実行した直後のサーバにアクセスしていることを想定します。)

  • SmallTrainは、オペレーションという単位で、学習や予測の処理を実行します。 オペレーションオペレーションファイルにより設定し、制御することができます。 このチュートリアルでは、ご自身で準備した画像ファイルを画像認識する方法をご説明します。

  • オペレーションを実行するために必要なオペレーションファイルの雛形として、CIFAR-10 image classificationチュートリアルのためのオペレーションファイルを使いましょう。 オペレーションファイルはSmallTrain Dockerコンテナ上の/var/smalltrain/operation/にあります。

  • SmallTrain Dockerコンテナにログインして、オペレーションファイルを見てみましょう。

on the container

$ cd /var/smalltrain/operation/
$ less IR_2D_CNN_V2_l49-c64_TUTORIAL-DEBUG-WITH-SMALLDATASET-20200708-TRAIN.json

チュートリアルのオペレーションファイルの内容

/var/smalltrain/operation/IR_2D_CNN_V2_l49-c64_TUTORIAL-DEBUG-WITH-SMALLDATASET-20200708-TRAIN.json

{
    "train_id": "IR_2D_CNN_V2_l49-c64_TUTORIAL-DEBUG-WITH-SMALLDATASET-20200708-TRAIN",
    "### COMMENT ###": "tutorial training CIFAR-10 with small data set",
    ...
    "data_dir_path": "/var/data/cifar-10-image/",
    "data_set_def_path": "/var/data/cifar-10-image/data_set_def/train_cifar10_classification_small.csv",
    "cache_data_set_id": "train_cifar10_classification_small",
    "##### memo": "If cache_data_set_id is None, then set with train_id",
    ...

新しいオペレーションファイルを、このファイルのコピーとして作成します。例として、IR_2D_CNN_V2_l49-c64_TUTORIAL-MYDATASET-TRAIN.jsonというファイル名にします。

on the container

$ cp IR_2D_CNN_V2_l49-c64_TUTORIAL-DEBUG-WITH-SMALLDATASET-20200708-TRAIN.json IR_2D_CNN_V2_l49-c64_TUTORIAL-MYDATASET-TRAIN.json
  • 設定のポイント
    • train_id
      • オペレーションファイル名に合わせて変更します(IR_2D_CNN_V2_l49-c64_TUTORIAL-MYDATASET-TRAIN)
    • data_dir_path
      • 新しく学習、予測処理をする対象のデータディレクトリのパスを指定します。ここでは新しく/var/data/mydataset/というディレクトリを用意することにします。
    • data_set_def_path
      • データセット定義ファイルのパスを指定します。ここでは新しく/var/data/mydataset/data_set_def/train_cifar10_classification_mydataset.csvというデータセット定義ファイル用意することにします。
    • cache_data_set_id
      • データセットをキャッシュDB(Redis)に格納する際に使うデータセットIDを指定します。新しいデータセットに対応したデータセットIDを指定するか、空の値(null)を設定してください。 (nullを指定すると、cache_data_set_idにはオペレーションファイル名がセットされます)

/var/smalltrain/operation/IR_2D_CNN_V2_l49-c64_TUTORIAL-MYDATASET-TRAIN.json

{
    "train_id": "IR_2D_CNN_V2_l49-c64_TUTORIAL-MYDATASET-TRAIN",
    "### COMMENT ###": "tutorial training CIFAR-10 with small data set",
    ...
    "data_dir_path": "/var/data/mydataset/",
    "data_set_def_path": "/var/data/mydataset/data_set_def/train_cifar10_classification_mydataset.csv",
    "cache_data_set_id": null,
    "##### memo": "If cache_data_set_id is None, then set with train_id",
    ...

続いて、データセットを用意します。上記で指定したデータディレクトリを、既存のCIFAR-10のデータディレクトリのコピーとして作成します。

on the container

$ cd /var/data/
$ ls -l
total 20
drwxr-xr-x 2 2156 1103 4096 Jun  4  2009 cifar-10-batches-py
drwxr-xr-x 9 root root 4096 Aug  3 04:31 cifar-10-image
drwxr-xr-x 3 root root 4096 Aug  3 04:31 smalltrain
drwxr-xr-x 2 root root 4096 Aug  3 04:31 work

$ cp -Rf cifar-10-image mydataset
$ ls -l
total 20
drwxr-xr-x 2 2156 1103 4096 Jun  4  2009 cifar-10-batches-py
drwxr-xr-x 9 root root 4096 Aug  3 04:31 cifar-10-image
drwxr-xr-x 9 root root 4096 Aug  3 07:35 mydataset
drwxr-xr-x 3 root root 4096 Aug  3 04:31 smalltrain
drwxr-xr-x 2 root root 4096 Aug  3 04:31 work

作成したデータディレクトリmydatasetに新しく予測対象となる画像を追加します。ここでは例として、ネコの画像を準備し、cat1.jpg, cat2.jpgというようなファイル名で、mydatasetディレクトリ内にコピーします。 (Tips Jupyter Lab Notebookを利用した簡易的ファイル操作)

続いて、データセット定義ファイルを編集します。先ほど追加したネコの画像を、予測対象に指定します。

  • まず、CIFAR-10チュートリアルのデータセット定義ファイル/var/data/cifar-10-image/data_set_def/train_cifar10_classification_small.csv をコピーして、新しい定義ファイル/var/data/mydataset/data_set_def/train_cifar10_classification_mydataset.csvを作成し、
$ cp /var/data/cifar-10-image/data_set_def/train_cifar10_classification_small.csv /var/data/mydataset/data_set_def/train_cifar10_classification_mydataset.csv
  • データセット定義ファイルに用意したネコの画像を追加します。
$ vi /var/data/mydataset/data_set_def/train_cifar10_classification_mydataset.csv

data_set_id,label,sub_label,test,group
/var/data/mydataset/cat1.jpg,3,3,1,TRAIN <- add cat1 image as a test data
/var/data/mydataset/cat2.jpg,3,3,1,TRAIN <- add cat1 image as a test data
/var/data/cifar-10-image/data_batch_1/data_batch_1_i9_c3.png,3,3,0,TRAIN
/var/data/cifar-10-image/data_batch_1/data_batch_1_i90_c2.png,2,2,0,TRAIN
/var/data/cifar-10-image/data_batch_1/data_batch_1_i91_c3.png,3,3,0,TRAIN
/var/data/cifar-10-image/data_batch_1/data_batch_1_i92_c8.png,8,8,0,TRAIN
  • data_set_idにファイルパスを、labelにラベル番号を(ここではCIFAR-10の学習済みモデルを利用しますので、CIFAR-10のラベル番号を指定します)、test1(テストデータとして使う)、groupTRAIN(デフォルト値)を指定します。 (詳しくはデータセットの準備の仕方を参照してください)

以上でオペレーションの設定は完了です。

オペレーションを実行します

いよいよオペレーションを実行します。オペレーションは、次のようなスクリプトから実行することができます。

# オペレーションID(train_id)を指定
$ OPERATION_ID=IR_2D_CNN_V2_l49-c64_TUTORIAL-MYDATASET-TRAIN
# オペレーションを実行
$ nohup /var/smalltrain/tutorials/image_recognition/operation_tutorials.sh $OPERATION_ID &
- TensorBoardを確認したり(ブラウザから`http://<YOURHOST>:<TENSORBOARD_PORT>`にアクセス)、ログを確認します。
```sh
tail -f /var/smalltrain/logs/IR_2D_CNN_V2_l49-c64_TUTORIAL-MYDATASET-TRAIN.log
```

オペレーションの実行結果は/var/data/smalltrain/results/report/$OPERATION_ID/に出力されます。99ステップの学習の後の予測結果を表示させてみましょう。

$ less /var/data/smalltrain/results/report/$OPERATION_ID/prediction_e99_all.csv
DateTime,Estimated,MaskedEstimated,True
/var/data/mydataset/cat1.jpg_0,2,0.0,3
/var/data/mydataset/cat2.jpg_0,3,0.0,3
/var/data/cifar-10-image/test_batch/test_batch_i9_c1.png_0,1,0.0,1
...

cat1.jpgはEstimated2(bird)と間違っていますが、cat2.jpgに対してはEstimated3(cat)と正しく分類できました。