ホーム » MNIST » TensorFlowOnSpark GetStarted EC2 (翻訳・解説)

TensorFlowOnSpark GetStarted EC2 (翻訳・解説)

TensorFlowOnSpark GetStarted EC2 (翻訳/解説)
翻訳 : (株)クラスキャット セールスインフォメーション
日時 : 02/17/2017

* 本ページは、github TensorFlowOnSpark の GetStarted_EC2 : Running TensorFlowOnSpark on EC2 をベースに実際に実験した上で翻訳して解説を加えたものです :
    https://github.com/yahoo/TensorFlowOnSpark/wiki/GetStarted_EC2

 

EC2 上で TensorFlowOnSpark を実行する

このガイドは 既存の AMI イメージを us-west-2 リージョンで使用して TensorFlowOnSpark を適用するための基本ステップの概要を説明します。

1. standalone Spark クラスタを EC2 上でセットアップ

TFoS AMI で p2.xlarge (1 GPU, 4 vCPUs) 上、 3 スレーブで Spark クラスタを起動するために scripts/spark-ec2 を実行します。TFoS _HOME は TensorFlowOnSpark ソースコードのホームディレクトリを参照することを仮定しています。

* 以下のスクリプトを実行する前に TFoS_HOME の他にも、EC2_KEY(キー名)と EC2_PEM_FILE 変数を設定して export しておきましょう。

export AMI_IMAGE=ami-f6d25596
export EC2_REGION=us-west-2
export EC2_ZONE=us-west-2a
export SPARK_WORKER_INSTANCES=3
export EC2_INSTANCE_TYPE=p2.xlarge  
export EC2_MAX_PRICE=0.8
${TFoS_HOME}/scripts/spark-ec2 \
    --key-pair=${EC2_KEY} --identity-file=${EC2_PEM_FILE} \
        --region=${EC2_REGION} --zone=${EC2_ZONE} \
        --ebs-vol-size=50 \
        --instance-type=${EC2_INSTANCE_TYPE} \
        --master-instance-type=${EC2_INSTANCE_TYPE} \
        --ami=${AMI_IMAGE}  -s ${SPARK_WORKER_INSTANCES} \
        --spot-price ${EC2_MAX_PRICE} \
        --copy-aws-credentials \
        --hadoop-major-version=yarn --spark-version 1.6.0 \
        --no-ganglia \
        --user-data ${TFoS_HOME}/scripts/ec2-cloud-config.txt \
        launch TFoSdemo

上のスクリプトを実行すると、以下のように直ちにクラスタの構築が開始されます :

Warning: Unrecognized EC2 instance type for instance-type: p2.xlarge
Warning: Unrecognized EC2 instance type for master-instance-type: p2.xlarge
Setting up security groups...
Searching for existing cluster TFoSdemo in region us-west-2...
Launching instances...
Requesting 3 slaves as spot instances with price $0.800
Waiting for spot instances to be granted...
All 3 slaves granted
Launched master in us-west-2a, regid = r-0963a9d66d2d84831
Waiting for AWS to propagate instance metadata...
Waiting for cluster to enter 'ssh-ready' state....

* p2.xlarge を Unrecognized EC2 instance type とする警告が出ますが、実際には問題なく p2.xlarge インスタンスが起動されました。
* ssh-ready ステート待ちで 5 分ほど時間がかかります。最終的に 10 分ほどで作業が完了しました。

最後に次の例のような行が見られます、これは Spark マスタのホスト名を含みます。

Spark standalone cluster started at http://ec2-52-49-81-151.us-west-2.compute.amazonaws.com:8080
Done!

2. Spark マスタ上への ssh

ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i ${EC2_PEM_FILE} root@<SPARK_MASTER_HOST>

実際にログインして OS を確認してみたところ、Ubuntu 16.04.1 LTS が使用されていました :

# cat /etc/os-release 
NAME="Ubuntu"
VERSION="16.04.1 LTS (Xenial Xerus)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 16.04.1 LTS"
VERSION_ID="16.04"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"
VERSION_CODENAME=xenial
UBUNTU_CODENAME=xenial

3. MNIST ファイルを TensorFlow Record フォーマットに変換する

次の Spark コマンドを、MNIST データファイルを TensorFlow Record フォーマットに変換して HDFS ファイルシステムにストアするために実行します。
* ${TFoS_HOME} は “/root/TensorFlowOnSpark” に設定されています。

pushd ${TFoS_HOME}
spark-submit --master local[4] \
--jars ${TFoS_HOME}/tensorflow-hadoop-1.0-SNAPSHOT.jar \
--conf spark.executorEnv.LD_LIBRARY_PATH="/usr/local/cuda/lib64" \
--driver-library-path="/usr/local/cuda/lib64" \
${TFoS_HOME}/examples/mnist/mnist_data_setup.py \
--output mnist/tfr \
--format tfr
popd
hadoop fs -ls mnist/tfr

3m40.774s で変換完了しました、HDFS 上のファイルを確認しておきましょう :

# hadoop fs -ls mnist/tfr
Found 2 items
drwxr-xr-x   - root supergroup          0 2017-02-16 16:55 mnist/tfr/test
drwxr-xr-x   - root supergroup          0 2017-02-16 16:54 mnist/tfr/train

# hadoop fs -ls mnist/tfr/train
Found 11 items
-rw-r--r--   3 root supergroup          0 2017-02-16 16:54 mnist/tfr/train/_SUCCESS
-rw-r--r--   3 root supergroup    4865957 2017-02-16 16:53 mnist/tfr/train/part-r-00000
-rw-r--r--   3 root supergroup    5853920 2017-02-16 16:53 mnist/tfr/train/part-r-00001
-rw-r--r--   3 root supergroup    5844694 2017-02-16 16:53 mnist/tfr/train/part-r-00002
-rw-r--r--   3 root supergroup    5851485 2017-02-16 16:53 mnist/tfr/train/part-r-00003
-rw-r--r--   3 root supergroup    5844411 2017-02-16 16:54 mnist/tfr/train/part-r-00004
-rw-r--r--   3 root supergroup    5824177 2017-02-16 16:54 mnist/tfr/train/part-r-00005
-rw-r--r--   3 root supergroup    5843674 2017-02-16 16:54 mnist/tfr/train/part-r-00006
-rw-r--r--   3 root supergroup    5835612 2017-02-16 16:54 mnist/tfr/train/part-r-00007
-rw-r--r--   3 root supergroup    5833012 2017-02-16 16:54 mnist/tfr/train/part-r-00008
-rw-r--r--   3 root supergroup    5444489 2017-02-16 16:54 mnist/tfr/train/part-r-00009

# hadoop fs -ls mnist/tfr/test
Found 11 items
-rw-r--r--   3 root supergroup          0 2017-02-16 16:55 mnist/tfr/test/_SUCCESS
-rw-r--r--   3 root supergroup     944145 2017-02-16 16:55 mnist/tfr/test/part-r-00000
-rw-r--r--   3 root supergroup     941762 2017-02-16 16:55 mnist/tfr/test/part-r-00001
-rw-r--r--   3 root supergroup     944395 2017-02-16 16:55 mnist/tfr/test/part-r-00002
-rw-r--r--   3 root supergroup     944966 2017-02-16 16:55 mnist/tfr/test/part-r-00003
-rw-r--r--   3 root supergroup     944537 2017-02-16 16:55 mnist/tfr/test/part-r-00004
-rw-r--r--   3 root supergroup     956450 2017-02-16 16:55 mnist/tfr/test/part-r-00005
-rw-r--r--   3 root supergroup     961667 2017-02-16 16:55 mnist/tfr/test/part-r-00006
-rw-r--r--   3 root supergroup     964471 2017-02-16 16:55 mnist/tfr/test/part-r-00007
-rw-r--r--   3 root supergroup     964857 2017-02-16 16:55 mnist/tfr/test/part-r-00008
-rw-r--r--   3 root supergroup     955109 2017-02-16 16:55 mnist/tfr/test/part-r-00009

4. MNIST モデルをトレーニングする

HDFS フォルダ /user/root/mnist/tfr/train にある mnist データセットを使用して DNN モデルをトレーニングしてテストします。

pushd ${TFoS_HOME}/src
zip -r ${TFoS_HOME}/tfspark.zip *
popd

#adjust these setting per instance types
#Instance type: p2.8xlarge
#export NUM_GPU=8
#export CORES_PER_WORKER=32
#Instance type: p2.xlarge
export NUM_GPU=1
export CORES_PER_WORKER=4

export SPARK_WORKER_INSTANCES=3
export TOTAL_CORES=$((${CORES_PER_WORKER}*${SPARK_WORKER_INSTANCES}))
export MASTER=spark://$(hostname):7077

spark-submit --master ${MASTER} \
--conf spark.cores.max=${TOTAL_CORES} \
--conf spark.task.cpus=${CORES_PER_WORKER} \
--py-files ${TFoS_HOME}/tfspark.zip,${TFoS_HOME}/examples/mnist/tf/mnist_dist.py \
--conf spark.executorEnv.LD_LIBRARY_PATH="/usr/local/cuda/lib64:$JAVA_HOME/jre/lib/amd64/server:$HADOOP_HOME/lib/native" \
--conf spark.executorEnv.JAVA_HOME="$JAVA_HOME" \
--conf spark.executorEnv.HADOOP_HDFS_HOME=”$HADOOP_HOME” \
--conf spark.executorEnv.CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath --glob) \
--driver-library-path="/usr/local/cuda/lib64" \
${TFoS_HOME}/examples/mnist/tf/mnist_spark.py \
--cluster_size ${SPARK_WORKER_INSTANCES} \
--images mnist/tfr/train --format tfr \
--mode train --model mnist_model --tensorboard

トレーニングされたモデルとそのチェックポイントは HDFS 上に置かれます。

4m22.633s でトレーニングが完了しました。他のクラスタ環境と比較してみないと妥当な数字かは判断つきませんが、チェックポイントは作成されています :

# hadoop fs -ls /user/root/mnist_model
Found 17 items
-rw-r--r--   3 root supergroup        265 2017-02-16 17:02 /user/root/mnist_model/checkpoint
-rw-r--r--   3 root supergroup     142712 2017-02-16 17:00 /user/root/mnist_model/graph.pbtxt
-rw-r--r--   3 root supergroup     814164 2017-02-16 17:02 /user/root/mnist_model/model.ckpt-385.data-00000-of-00001
-rw-r--r--   3 root supergroup        372 2017-02-16 17:02 /user/root/mnist_model/model.ckpt-385.index
-rw-r--r--   3 root supergroup      56854 2017-02-16 17:02 /user/root/mnist_model/model.ckpt-385.meta
-rw-r--r--   3 root supergroup     814164 2017-02-16 17:02 /user/root/mnist_model/model.ckpt-512.data-00000-of-00001
-rw-r--r--   3 root supergroup        372 2017-02-16 17:02 /user/root/mnist_model/model.ckpt-512.index
-rw-r--r--   3 root supergroup      56854 2017-02-16 17:02 /user/root/mnist_model/model.ckpt-512.meta
-rw-r--r--   3 root supergroup     814164 2017-02-16 17:02 /user/root/mnist_model/model.ckpt-634.data-00000-of-00001
-rw-r--r--   3 root supergroup        372 2017-02-16 17:02 /user/root/mnist_model/model.ckpt-634.index
-rw-r--r--   3 root supergroup      56854 2017-02-16 17:02 /user/root/mnist_model/model.ckpt-634.meta
-rw-r--r--   3 root supergroup     814164 2017-02-16 17:02 /user/root/mnist_model/model.ckpt-762.data-00000-of-00001
-rw-r--r--   3 root supergroup        372 2017-02-16 17:02 /user/root/mnist_model/model.ckpt-762.index
-rw-r--r--   3 root supergroup      56854 2017-02-16 17:02 /user/root/mnist_model/model.ckpt-762.meta
-rw-r--r--   3 root supergroup     814164 2017-02-16 17:02 /user/root/mnist_model/model.ckpt-889.data-00000-of-00001
-rw-r--r--   3 root supergroup        372 2017-02-16 17:02 /user/root/mnist_model/model.ckpt-889.index
-rw-r--r--   3 root supergroup      56854 2017-02-16 17:02 /user/root/mnist_model/model.ckpt-889.meta

Spark の UI ももちろん確認できます :

4. MNIST モデルを使用して Image 推論を実行する

次のコマンドを実行するだけです、環境変数はトレーニング時と同じです。

spark-submit --master ${MASTER} \
--conf spark.cores.max=${TOTAL_CORES} \
--conf spark.task.cpus=${CORES_PER_WORKER} \
--py-files ${TFoS_HOME}/tfspark.zip,${TFoS_HOME}/examples/mnist/tf/mnist_dist.py \
--conf spark.executorEnv.LD_LIBRARY_PATH="/usr/local/cuda/lib64:$JAVA_HOME/jre/lib/amd64/server:$HADOOP_HOME/lib/native" \
--conf spark.executorEnv.JAVA_HOME="$JAVA_HOME" \
--conf spark.executorEnv.HADOOP_HDFS_HOME=”$HADOOP_HOME” \
--conf spark.executorEnv.CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath --glob) \
--driver-library-path="/usr/local/cuda/lib64" \
${TFoS_HOME}/examples/mnist/tf/mnist_spark.py \
--cluster_size ${SPARK_WORKER_INSTANCES} \
--images mnist/tfr/test \
--mode inference \
--model mnist_model \
--output predictions

1m10.731s で完了です。
ここで予測結果を吟味できます: 元のラベル vs. 予測です。

# hadoop fs -ls  /user/root/predictions/
Found 2 items
-rw-r--r--   3 root supergroup      20000 2017-02-16 17:11 /user/root/predictions/part-00001
-rw-r--r--   3 root supergroup      20000 2017-02-16 17:11 /user/root/predictions/part-00002

# hadoop fs -cat  /user/root/predictions/* | head -n 20
7 7
2 2
1 1
0 0
4 4
1 1
4 4
9 9
5 6
9 9
0 0
6 6
9 9
0 0
1 1
5 5
9 9
7 7
3 3
4 4

5. Jupyter Notebook による対話的な学習

IPython Notebook に必要な追加のソフトウェアをインストールします。

pip install jupyter jupyter[notebook] 

マスター・ノードで IPython notebook を起動します。

pushd ${TFoS_HOME}/examples/mnist
PYSPARK_DRIVER_PYTHON="jupyter" \
PYSPARK_DRIVER_PYTHON_OPTS="notebook --no-browser --ip=`hostname`" \
pyspark  --master ${MASTER} \
--conf spark.cores.max=${TOTAL_CORES} \
--conf spark.task.cpus=${CORES_PER_WORKER} \
--py-files ${TFoS_HOME}/tfspark.zip,${TFoS_HOME}/examples/mnist/tf/mnist_dist.py \
--conf spark.executorEnv.LD_LIBRARY_PATH="/usr/local/cuda/lib64:$JAVA_HOME/jre/lib/amd64/server:$HADOOP_HOME/lib/native" \
--conf spark.executorEnv.JAVA_HOME="$JAVA_HOME" \
--conf spark.executorEnv.HADOOP_HDFS_HOME=”$HADOOP_HOME” \
--conf spark.executorEnv.CLASSPATH=$($HADOOP_HOME/bin/hadoop classpath --glob) \
--driver-library-path="/usr/local/cuda/lib64" 

サンプルノートブックを上の pyspark コマンドで与えられたセキュリティトークンと一緒に起動します :

http://<MASTER_HOST>:8888/notebooks/TFOS_demo.ipynb

以下は実際に接続した Jupyter notebook の画面です。
一応全部のセルを通して実行してみましたが、特に問題なく完了しました。
 

 
以下は全体画面です :

6. Spark クラスタを Destroy する

以下のコマンドでクラスタは terminate されます。

${TFoS_HOME}/scripts/spark-ec2 \
        --key-pair=${EC2_KEY} --identity-file=${EC2_PEM_FILE} \
        --region=${EC2_REGION} --zone=${EC2_ZONE} \
        destroy TFoSdemo
 

以上

AI導入支援 #2 ウェビナー

スモールスタートを可能としたAI導入支援   Vol.2
[無料 WEB セミナー] [詳細]
「画像認識 AI PoC スターターパック」の紹介
既に AI 技術を実ビジネスで活用し、成果を上げている日本企業も多く存在しており、競争優位なビジネスを展開しております。
しかしながら AI を導入したくとも PoC (概念実証) だけでも高額な費用がかかり取組めていない企業も少なくないようです。A I導入時には欠かせない PoC を手軽にしかも短期間で認知度を確認可能とするサービの紹介と共に、AI 技術の特性と具体的な導入プロセスに加え運用時のポイントについても解説いたします。
日時:2021年10月13日(水)
会場:WEBセミナー
共催:クラスキャット、日本FLOW(株)
後援:働き方改革推進コンソーシアム
参加費: 無料 (事前登録制)
人工知能開発支援
◆ クラスキャットは 人工知能研究開発支援 サービスを提供しています :
  • テクニカルコンサルティングサービス
  • 実証実験 (プロトタイプ構築)
  • アプリケーションへの実装
  • 人工知能研修サービス
◆ お問合せ先 ◆
(株)クラスキャット
セールス・インフォメーション
E-Mail:sales-info@classcat.com