레이블이 tfrecord인 게시물을 표시합니다. 모든 게시물 표시
레이블이 tfrecord인 게시물을 표시합니다. 모든 게시물 표시

2018년 4월 11일 수요일

축약형 ILSVRC2012_img_train_t3.tar을 이용한 training dataset 준비

원래 tensorflow로 inception v3를 테스트할 때는 보통 128만장의 사진을 담은 138GB짜리 ILSVRC2012_img_train.tar를 씁니다만, 요즘 image-net.org의 서버 사정이 안 좋은지 download가 제대로 되지 않습니다.  대신 강아지들의 사진만 따로 담은 훨씬 작은 760MB 정도의 ILSVRC2012_img_train_t3.tar을 써서 동일한 테스트를 할 수 있습니다.

테스트에 필요한 파일들은 ILSVRC2012_img_train_t3.tar와 ILSVRC2012_img_val.tar, 그리고 bounding_box를 위한 xml 파일들을 담은 Annotation.tar.gz 입니다.

[user1@ac922 raw-data]$ pwd
/home/user1/ilsvrc2012/raw-data

[user1@ac922 raw-data]$ ls -l ../../files/IL*.tar
-rw-rw-r--. 1 user1 user1  762460160 Jul  4  2012 ../../files/ILSVRC2012_img_train_t3.tar
-rw-rw-r--. 1 user1 user1 6744924160 Jun 15  2012 ../../files/ILSVRC2012_img_val.tar

[user1@ac922 raw-data]$ wget http://image-net.org/Annotation/Annotation.tar.gz

다음과 같이 ILSVRC2012_img_train_t3.tar을 train directory에 풀어놓습니다.  n02085620 등의 이름으로 된 sub-directory별로 사진들이 들어 있습니다.

[user1@ac922 raw-data]$ cd train

[user1@ac922 train]$ tar -xf ../../../files/ILSVRC2012_img_train_t3.tar

[user1@ac922 train]$ for i in `ls n*.tar | cut -d. -f1`
> do
> mkdir ${i}
> tar -xf ${i}.tar -C ${i}
> rm ${i}.tar
> done

원래의 ILSVRC2012_img_train.tar라면 총 1000개의 directory가 생기겠으나, 이 ILSVRC2012_img_train_t3.tar는 120개입니다.

[user1@ac922 train]$ ls -1 | wc -l
120

[user1@ac922 train]$ ls | head
n02085620
n02085782
n02085936
n02086079
n02086240
n02086646
n02086910
n02087046
n02087394
n02088094

[user1@ac922 train]$ du -sm .
753     .

6GB 정도되는 ILSVRC2012_img_val.tar는 일단 validation directory에 그냥 풀어넣습니다.  이건 총 50000장의 사진입니다.

[user1@ac922 validation]$ tar -xf ../../../files/ILSVRC2012_img_val.tar

[user1@ac922 validation]$ ls | head
ILSVRC2012_val_00000001.JPEG
ILSVRC2012_val_00000002.JPEG
ILSVRC2012_val_00000003.JPEG
ILSVRC2012_val_00000004.JPEG
ILSVRC2012_val_00000005.JPEG
ILSVRC2012_val_00000006.JPEG
ILSVRC2012_val_00000007.JPEG
ILSVRC2012_val_00000008.JPEG
ILSVRC2012_val_00000009.JPEG
ILSVRC2012_val_00000010.JPEG

[user1@ac922 validation]$ ls | wc -l
50000

[user1@ac922 validation]$ du -sm .
6496    .

이제 bounding_boxes를 위해 Annotation.tar.gz을 풀어놓습니다.  이 속에도 directory별로 tar.gz 파일들이 들어있습니다.

[user1@ac922 validation]$ cd ..

[user1@ac922 raw-data]$ tar -zxf ./Annotation.tar.gz

[user1@ac922 raw-data]$ for i in `ls n*.tar.gz`
> do
> tar -zxf ${i}
> rm ${i}
> done

이제 이 Annotation이라는 이름의 directory를 bounding_boxes라는 이름으로 바꿉니다.

[user1@ac922 raw-data]$ mv Annotation bounding_boxes

[user1@ac922 bounding_boxes]$ ls | head
n00007846
n00015388
n00017222
n00021265
n00439826
n00440039
n00440941
n00441824
n00443692
n00445351

이 속에는 총 3627개의 directory가 있으며, 그 각각마다 xml 파일들이 들어있습니다.

[user1@ac922 bounding_boxes]$ ls | wc -l
3627

[user1@ac922 bounding_boxes]$ ls n00007846 | head
n00007846_103856.xml
n00007846_104163.xml
n00007846_104414.xml
n00007846_105689.xml
n00007846_106069.xml
n00007846_107024.xml
n00007846_109518.xml
n00007846_109796.xml
n00007846_110945.xml
n00007846_111865.xml

이 xml 파일들과 raw image들을 TFRecord 포맷으로 변환하겠습니다. 거기에는 아래 github에서 제공되는 script tool과 label 들을 사용합니다.

[user1@ac922 ~]$ git clone https://github.com/tensorflow/models.git

[user1@ac922 ~]$ cd ~/models/research/inception/inception/data

이 속에 들어있는 imagenet_metadata.txt 등의 각종 label 파일들은 모두 ILSVRC2012_img_train_t3.tar가 아니라 ILSVRC2012_img_train.tar를 기준으로 만들어진 것입니다.  이것을 그대로 사용하면 TFRecord로 변환할 때 error가 생길 것이므로, 이 중에서 ILSVRC2012_img_train_t3.tar에 들어있는 label들만 골라내어 새로 만드는 작업을 해야 합니다.

먼저 backup을 떠놓습니다.

[user1@ac922 data]$ cp imagenet_metadata.txt imagenet_metadata.txt.org

[user1@ac922 data]$ head imagenet_metadata.txt
n00004475       organism, being
n00005787       benthos
n00006024       heterotroph
n00006484       cell
n00007846       person, individual, someone, somebody, mortal, soul
n00015388       animal, animate being, beast, brute, creature, fauna
n00017222       plant, flora, plant life
n00021265       food, nutrient
n00021939       artifact, artefact
n00120010       hop

[user1@ac922 data]$ wc -l imagenet_metadata.txt
21842 imagenet_metadata.txt

다음과 같이 실제로 ~/ilsvrc2012/raw-data/train directory 속에 들어있는 이름들만 골라서 새로  imagenet_metadata.txt.new를 만든 뒤, 그것을  imagenet_metadata.txt에 overwrite합니다.

[user1@ac922 data]$ for i in `ls ~/ilsvrc2012/raw-data/train`
> do
> grep $i imagenet_metadata.txt >> imagenet_metadata.txt.new
> done

총 120개만 골라진 것을 볼 수 있고, 또 거기 들어간 이름들은 모두 멍멍이 종류인 것을 볼 수 있습니다.

[user1@ac922 data]$ wc -l imagenet_metadata.txt.new
120 imagenet_metadata.txt.new

[user1@ac922 data]$ head imagenet_metadata.txt.new
n02085620       Chihuahua
n02085782       Japanese spaniel
n02085936       Maltese dog, Maltese terrier, Maltese
n02086079       Pekinese, Pekingese, Peke
n02086240       Shih-Tzu
n02086646       Blenheim spaniel
n02086910       papillon
n02087046       toy terrier
n02087394       Rhodesian ridgeback
n02088094       Afghan hound, Afghan


imagenet_lsvrc_2015_synsets.txt에 대해서도 동일한 작업을 해줍니다.

[user1@ac922 data]$ wc -l imagenet_lsvrc_2015_synsets.txt
1000 imagenet_lsvrc_2015_synsets.txt.org

[user1@ac922 data]$ cp imagenet_lsvrc_2015_synsets.txt imagenet_lsvrc_2015_synsets.txt.org

[user1@ac922 data]$ head imagenet_lsvrc_2015_synsets.txt
n01440764
n01443537
n01484850
n01491361
n01494475
n01496331
n01498041
n01514668
n01514859
n01518878

[user1@ac922 data]$ for i in `ls ~/ilsvrc2012/raw-data/train`
> do
> grep $i imagenet_lsvrc_2015_synsets.txt >> imagenet_lsvrc_2015_synsets.txt.new
> done

[user1@ac922 data]$ wc -l imagenet_lsvrc_2015_synsets.txt.new
120 imagenet_lsvrc_2015_synsets.txt.new

[user1@ac922 data]$ cp imagenet_lsvrc_2015_synsets.txt.new imagenet_lsvrc_2015_synsets.txt

[user1@ac922 data]$ head imagenet_lsvrc_2015_synsets.txt
n02085620
n02085782
n02085936
n02086079
n02086240
n02086646
n02086910
n02087046
n02087394
n02088094


[user1@ac922 data]$ wc -l imagenet_lsvrc_2015_synsets.txt
120 imagenet_lsvrc_2015_synsets.txt


그리고 validation용 label인 imagenet_2012_validation_synset_labels.txt에 대해서도 비슷한 작업을 해줍니다.

[user1@ac922 data]$ wc -l imagenet_2012_validation_synset_labels.txt
50000 imagenet_2012_validation_synset_labels.txt

[user1@ac922 data]$ cp imagenet_2012_validation_synset_labels.txt imagenet_2012_validation_synset_labels.txt.org

[user1@ac922 data]$ head imagenet_2012_validation_synset_labels.txt
n01751748
n09193705
n02105855
n04263257
n03125729
n01735189
n02346627
n02776631
n03794056
n02328150


[user1@ac922 data]$ for i in `ls ~/ilsvrc2012/raw-data/train`
> do
> grep $i imagenet_2012_validation_synset_labels.txt >> imagenet_2012_validation_synset_labels.txt.new
> done

이 작업을 통해 총 5만장이던 validation용 이미지가 이제 6천장으로 줄어든 것을 보실 수 있습니다.

[user1@ac922 data]$ wc -l imagenet_2012_validation_synset_labels.txt.new
6000 imagenet_2012_validation_synset_labels.txt.new

이제 bounding_boxes에 들어있는 것들도 비슷한 작업을 통해 개수를 줄여줍니다.

[user1@ac922 data]$ for i in `ls ~/ilsvrc2012/raw-data/bounding_boxes`
> do
> grep ${i} imagenet_lsvrc_2015_synsets.txt
> if [[ $? -ne 0 ]]
> then
> rm -rf ~/ilsvrc2012/raw-data/bounding_boxes/${i}
> fi
> done

다음과 같이 120개 directory만 남은 것을 보실 수 있습니다.

[user1@ac922 data]$ ls ~/ilsvrc2012/raw-data/bounding_boxes | wc -l
120

이제 TFRecord 파일들을 담을 directory를 만들어 줍니다.

[user1@ac922 data]$ mkdir ~/ilsvrc2012/tfrecord

원래 github에서 제공되는 download_and_preprocess_imagenet.sh를 수행하면 download 부터 TFRecord로의 변환까지 일괄적으로 수행됩니다만, 여기서는 138GB의 data를 download 받을 수도 없고 또 이런저런 환경이 다르므로, 아래와 같이 그 핵심부분만 따와서 새로 tf_preprocess.sh라는 script를 만들었습니다.

[user1@ac922 data]$ vi tf_preprocess.sh
#!/bin/bash
DATA_DIR="${1%/}"
SCRATCH_DIR="${DATA_DIR}/raw-data/"
WORK_DIR="$HOME/models/research/inception/inception"

TRAIN_DIRECTORY="${SCRATCH_DIR}train/"
VALIDATION_DIRECTORY="${SCRATCH_DIR}validation/"

BOUNDING_BOX_SCRIPT="${WORK_DIR}/data/process_bounding_boxes.py"
BOUNDING_BOX_FILE="${SCRATCH_DIR}/imagenet_2012_bounding_boxes.csv"
BOUNDING_BOX_DIR="${SCRATCH_DIR}bounding_boxes/"

# Preprocess the validation data by moving the images into the appropriate
# sub-directory based on the label (synset) of the image.
echo "Organizing the validation data into sub-directories."
PREPROCESS_VAL_SCRIPT="${WORK_DIR}/data/preprocess_imagenet_validation_data.py"
VAL_LABELS_FILE="${WORK_DIR}/data/imagenet_2012_validation_synset_labels.txt"

"${PREPROCESS_VAL_SCRIPT}" "${VALIDATION_DIRECTORY}" "${VAL_LABELS_FILE}"

# Convert the XML files for bounding box annotations into a single CSV.
echo "Extracting bounding box information from XML."
BOUNDING_BOX_SCRIPT="${WORK_DIR}/data/process_bounding_boxes.py"
BOUNDING_BOX_FILE="${SCRATCH_DIR}/imagenet_2012_bounding_boxes.csv"
BOUNDING_BOX_DIR="${SCRATCH_DIR}bounding_boxes/"
LABELS_FILE="${WORK_DIR}/data/imagenet_lsvrc_2015_synsets.txt"

"${BOUNDING_BOX_SCRIPT}" "${BOUNDING_BOX_DIR}" "${LABELS_FILE}" \
 | sort > "${BOUNDING_BOX_FILE}"
echo "Finished downloading and preprocessing the ImageNet data."

# Build the TFRecords version of the ImageNet data.
BUILD_SCRIPT="/usr/bin/python ${WORK_DIR}/data/build_imagenet_data.py"
OUTPUT_DIRECTORY="${DATA_DIR}/tfrecord"
IMAGENET_METADATA_FILE="${WORK_DIR}/data/imagenet_metadata.txt"

python $HOME/models/research/inception/inception/data/build_imagenet_data.py \
  --train_directory="${TRAIN_DIRECTORY}" \
  --validation_directory="${VALIDATION_DIRECTORY}" \
  --output_directory="${OUTPUT_DIRECTORY}" \
  --imagenet_metadata_file="${IMAGENET_METADATA_FILE}" \
  --labels_file="${LABELS_FILE}" \
  --bounding_box_file="${BOUNDING_BOX_FILE}"

이 tf_preprocess.sh는 그 속에서 build_imagenet_data.py를 불러 TFRecord로의 변환을 수행합니다.  이 script는 총 1000개의 shard에 training data를 넣는데, 이 숫자를 120으로 줄이겠습니다.  validation shard는 32개로 줄이겠습니다.

[user1@ac922 data]$ vi build_imagenet_data.py
...
#tf.app.flags.DEFINE_integer('train_shards', 1024,
tf.app.flags.DEFINE_integer('train_shards', 120,
                            'Number of shards in training TFRecord files.')
#tf.app.flags.DEFINE_integer('validation_shards', 128,
tf.app.flags.DEFINE_integer('validation_shards', 32,
                            'Number of shards in validation TFRecord files.')
...


이제 tf_preprocess.sh script에 실행 permission을 주고 실행하면 TFRecord로의 변환이 시작됩니다.

[user1@ac922 data]$ chmod a+x tf_preprocess.sh

[user1@ac922 data]$ ./tf_preprocess.sh ~/ilsvrc2012
...
2018-04-11 19:22:21.150944 [thread 2]: Wrote 2572 images to 2572 shards.
2018-04-11 19:22:21.151077 [thread 6]: Wrote 172 images to /home/user1/ilsvrc2012/tfrecord/train-00104-of-00120
2018-04-11 19:22:21.151131 [thread 6]: Wrote 2572 images to 2572 shards.
2018-04-11 19:22:21.247600 [thread 7]: Wrote 172 images to /home/user1/ilsvrc2012/tfrecord/train-00119-of-00120
2018-04-11 19:22:21.247631 [thread 7]: Wrote 2573 images to 2573 shards.
2018-04-11 19:22:21.506394: Finished writing all 20580 images in data set.

이렇게 멍멍이 사진 20580장의 변환이 완료되었습니다.

[user1@ac922 data]$ cd ~/ilsvrc2012/tfrecord/
[user1@ac922 tfrecord]$ ls train-* | wc -l
120
[user1@ac922 tfrecord]$ ls validation-* | wc -l
32
[user1@ac922 tfrecord]$ du -sm .
1475    .


이렇게 만들어진 ~/ilsvrc2012/tfrecord 디렉토리 밑의 file들을 다음 명령어로 뭉쳐서 아래 URL에 올려두었습니다.

[user1@ac922 ilsvrc2012]$ tar -zcvf tfrecord.tgz tfrecord


https://drive.google.com/open?id=1rQcxAWeNbByy0Yooj6IbROyVRsdQPn5-




2017년 12월 12일 화요일

Tensorflow로 ILSVRC2012 dataset을 이용하여 resnet101 training하기

먼저, 다음과 같이 anaconda2를 설치합니다.

b7p286za@p10login1:/gpfs/gpfs_gl4_16mb/b7p286za$ wget https://repo.continuum.io/archive/Anaconda2-5.0.0-Linux-ppc64le.sh

b7p286za@p10login1:/gpfs/gpfs_gl4_16mb/b7p286za$ chmod a+x ./Anaconda2-5.0.0-Linux-ppc64le.sh

b7p286za@p10login1:/gpfs/gpfs_gl4_16mb/b7p286za$ ./Anaconda2-5.0.0-Linux-ppc64le.sh
--> 설치 directory는 여기서는 user home directory인 /gpfs/gpfs_gl4_16mb/b7p286za/anaconda2 로 합니다만, 환경에 따라서 다른 곳에 하셔도 됩니다.

b7p286za@p10login1:/gpfs/gpfs_gl4_16mb/b7p286za$ export PATH=/gpfs/gpfs_gl4_16mb/b7p286za/anaconda2/bin:$PATH

이제 python이 OS의 기본 python이 아니라 anaconda에 딸린 python으로 설정되었는지 확인합니다.

b7p286za@p10login1:/gpfs/gpfs_gl4_16mb/b7p286za$ which python
/gpfs/gpfs_gl4_16mb/b7p286za/anaconda2/bin/python

이제 다음 명령으로 tensorflow 1.2.1을 설치합니다.

혹시 tensorflow 1.3이 꼭 필요한 경우엔 이 URL(http://hwengineer.blogspot.kr/2017/10/minsky-tensorflow-r13-source-build.html)을 참조하여 직접 build 하셔야 합니다.  빌드 및 수행은 ppc64le에서도 잘 됩니다.  다만 tensorflow 1.2.1로도 충분하므로 굳이 1.3을 build하실 필요까지는 없습니다.

b7p286za@p10login1:/gpfs/gpfs_gl4_16mb/b7p286za$ conda install tensorflow tensorflow-gpu

그 다음으로 benchmark용 resnet model 등이 들어있는 다음의 git repository를 다음과 같이 clone 하십시요.  이는 원래 https://github.com/tensorflow/models.git 에 들어 있는 내용에 일부 script를 추가한 것입니다.  원래의 script는 imagenet training dataset을 download하는 것부터 시작하는데, 그건 시간이 너무 오래 걸리므로, 이미 download 받은 dataset을 이용하여 TFrecord로 변환하는 등의 script를 추가했습니다.  이 script 작성은 IBM 이보란님께서 수고해주셨습니다.

b7p286za@p10login1:/gpfs/gpfs_gl4_16mb/b7p286za$ git clone https://github.com/brlee08/models.git

여기에서 사용할 ILSVRC2012 imagenet dataset들은 다음과 같으며, 이는 미리 download 받으두셔야 합니다.

b7p286za@p10login1:/gpfs/gpfs_gl4_16mb/b7p286za$ ls -l ILSVRC2012*
-rw-r----- 1 b7p286za IBM1     20861852 Aug 12  2012 ILSVRC2012_bbox_train_v2.tar.gz
-rw-r----- 1 b7p286za IBM1 147897477120 Nov  5 07:02 ILSVRC2012_img_train.tar
-rw-r----- 1 b7p286za IBM1   6744924160 Nov  5 07:03 ILSVRC2012_img_val.tar

이를 다음과 같이 적절한 위치에 풀어두셔야 합니다.

b7p286za@p10login1:/gpfs/gpfs_gl4_16mb/b7p286za$ mkdir -p raw-data/bounding_boxes

b7p286za@p10login1:/gpfs/gpfs_gl4_16mb/b7p286za$ mv ILSVRC2012_bbox_train_v2.tar.gz raw-data/bounding_boxes/annotations.tar.gz
b7p286za@p10login1:/gpfs/gpfs_gl4_16mb/b7p286za$ mv ILSVRC2012_img_train.tar raw-data/
b7p286za@p10login1:/gpfs/gpfs_gl4_16mb/b7p286za$ mv ILSVRC2012_img_val.tar raw-data/

b7p286za@p10login1:/gpfs/gpfs_gl4_16mb/b7p286za$ cd models/research/inception/inception/data/

b7p286za@p10login1:/gpfs/gpfs_gl4_16mb/b7p286za/models/research/inception/inception/data$  ./T2_ibm_uncompress_imagenet.sh /gpfs/gpfs_gl4_16mb/raw-data/ /gpfs/gpfs_gl4_16mb/b7p286za/models/research/inception/inception/data/imagenet_lsvrc_2015_synsets.txt

--> 여기서 앞의 directory 이름 끝에 반드시 /를 붙이셔야 합니다.  (안그러면 error 납니다.)  이 script에 의해 앞에 쓴 directory 밑에 raw image (JPEG)들이 풀리면서 label명인 sub-directory로 분산되어 들어갑니다.   뒤에 쓴 imagenet_lsvrc_2015_synsets.txt 파일은 이 ILSVRC2012 data의 label 이름입니다.

위 script가 다 수행되고 나면 다음과 같이 이 JPEG 파일들을 TFrecord 포맷으로 변환합니다.  그를 위해, models/research/inception/inception/data 밑에 있는 T2_ibm_preprocess.sh 에서 아래 부분을 수정합니다.

  #source /opt/DL/tensorflow/bin/tensorflow-activate  (맨 위의 tensorflow-activate 부분을 comment-out 처리.  PowerAI에 있는 TF 1.0 대신 conda install로 설치한 TF 1.2.1을 사용하기 위한 것임)
   WORK_DIR="<models 디렉토리가 위치한 경로>/models/research/inception/inception"
   python <models 디렉토리가 위치한 경로>/models/research/inception/inception/data/build_imagenet_data.py

여기서는 아래와 같이 고쳤습니다.

b7p286za@p10login1:/gpfs/gpfs_gl4_16mb/b7p286za/models/research/inception/inception/data$ vi ./T2_ibm_preprocess.sh
#source /opt/DL/tensorflow/bin/tensorflow-activate
...
WORK_DIR="/gpfs/gpfs_gl4_16mb/b7p286za/models/research/inception/inception"
...
python /gpfs/gpfs_gl4_16mb/b7p286za/models/research/inception/inception/data/build_imagenet_data.py \
...

수정이 끝나면 다음과 같이 수행합니다.  T2_ibm_preprocess.sh 뒤에 적어주는 directory 밑에 ilsvrc_tf라는 sub-directory가 생기면서 TFrecord 파일들이 생성됩니다.

b7p286za@p10login1:/gpfs/gpfs_gl4_16mb/b7p286za/models/research/inception/inception/data$ time ./T2_ibm_preprocess.sh /gpfs/gpfs_gl4_16mb/b7p286za/

위 script는 200GB가 넘는 파일들을 처리하므로 시간이 꽤 오래, 약 4시간 정도 걸립니다.  다 끝마치면 다음과 같이 train-xxxx과 validation-xxxx 등의 TFrecord 파일들이 생깁니다.

b7p286za@p10login1:/gpfs/gpfs_gl4_16mb/b7p286za/ilsvrc_tf$ ls -l | more
total 62635520
-rw-r----- 1 b7p286za IBM1 149402267 Dec 12 00:17 train-00000-of-01024
-rw-r----- 1 b7p286za IBM1 150240608 Dec 12 00:19 train-00001-of-01024
-rw-r----- 1 b7p286za IBM1 141760185 Dec 12 00:20 train-00002-of-01024
-rw-r----- 1 b7p286za IBM1 152134069 Dec 12 00:22 train-00003-of-01024
-rw-r----- 1 b7p286za IBM1 141508613 Dec 12 00:24 train-00004-of-01024
-rw-r----- 1 b7p286za IBM1 148320681 Dec 12 00:25 train-00005-of-01024
-rw-r----- 1 b7p286za IBM1 146087263 Dec 12 00:27 train-00006-of-01024
...

이제 다음과 같이 benchmark script들이 들어있는 git repo를 clone 합니다.  역시 이 script 작성은 IBM 이보란님께서 수고해주셨습니다.

b7p286za@p10login1:/gpfs/gpfs_gl4_16mb/b7p286za$ git clone https://github.com/brlee08/benchmark.git

b7p286za@p10login1:/gpfs/gpfs_gl4_16mb/b7p286za$ cd benchmark/tensorflow

이중 bench_ibm_single.sh을 이용하여 수행하되, 먼저 일부를 다음과 같이 수정합니다.

b7p286za@p10login1:/gpfs/gpfs_gl4_16mb/b7p286za/benchmark/tensorflow$ vi bench_ibm_single.sh
...
DATA_DIR=/gpfs/gpfs_gl4_16mb/b7p286za/ilsvrc_tf    (tfrecord 위치한 디렉토리)
LOG_DIR=/gpfs/gpfs_gl4_16mb/b7p286za/benchmark/tensorflow/output_single  (log를 쌓을 디렉토리)
...
TRAIN_DIR=/gpfs/gpfs_gl4_16mb/b7p286za/benchmark/tensorflow/train_log   (tensorboard용 log 쌓을 디렉토리)
...
NUM_EPOCHS=10
NUM_GPU=4
INPUT_BATCH=64
INPUT_MODEL="resnet101"
...
#TRAIN_LOG_DIR="${TRAIN_DIR}/googlenet-10e-128b-4G"  (쓰지 않는 것이므로 comment-out으로 막으십시요.)
...
#source /opt/DL/tensorflow/bin/tensorflow-activate  (역시 PowerAI에 있는 TF 1.0 대신 conda install로 설치한 TF 1.2.1을 사용하기 위해 comment-out)
export PATH=/gpfs/gpfs_gl4_16mb/b7p286za/anaconda2/bin:$PATH
export PYTHONPATH=/gpfs/gpfs_gl4_16mb/b7p286za/anaconda2/lib/python2.7/site-packages   (원래 source에는 anaconda3를 쓰고 있으나 여기서는 anaconda2의 site-packages를 PYTHONPATH로 설정해야 함)
...
#        --data_name=imagenet --train_dir=${TRAIN_LOG_DIR} --data_dir=${DATA_DIR} --variable_update=${VARIABLE_UPDATE} \
        --data_name=imagenet --train_dir=${TRAIN_DIR} --data_dir=${DATA_DIR} --variable_update=${VARIABLE_UPDATE} \
(원본에 오타가 있었습니다.  --train_dir=${TRAIN_LOG_DIR}를 --train_dir=${TRAIN_DIR}로 수정해야 합니다.)


이제 다음과 같이 resent training을 수행하면 됩니다.

b7p286za@p10login1:/gpfs/gpfs_gl4_16mb/b7p286za/benchmark/tensorflow$ nohup time /gpfs/gpfs_gl4_16mb/b7p284za/benchmark/tensorflow/bench_ibm_single.sh &

처음에는 몇몇 warning message와 함께 tensorflow 기동하는데 10분 정도 걸리므로 당황하지 마십시요.  대략 다음과 같은 결과가 나옵니다.

50010   images/sec: 485.7 +/- 0.1 (jitter = 3.8)        4.943
50020   images/sec: 485.7 +/- 0.1 (jitter = 3.8)        4.716
50030   images/sec: 485.7 +/- 0.1 (jitter = 3.8)        4.847
50040   images/sec: 485.6 +/- 0.1 (jitter = 3.8)        4.639
----------------------------------------------------------------
total images/sec: 485.42
----------------------------------------------------------------
Training Finish - 2017-12-12 13:59:14
Elapsed Time - 02:31:31