BigDLをApache Sparkで分散型ディープディープ学習する為の環境設定

分散して学習時間を減らすのは熱いと感じ勉強開始。
途中までやって見たが、結局bigdlを勉強しないといけない。
yahooの出したspark on tfの方がいいのではないかという気もした。
bigdlを動かそうとしてもエラーも出ていて
バージョンなどの問題もあるのかもしれない。

#sparkのインストール

JDKのインストール

```
sudo apt-get install -y openjdk-8-jdk
```

/usr/local/spark を SPARK_HOME とする。任意のバージョンを選択。
http://ftp.riken.jp/net/apache/spark/

```
wget http://ftp.riken.jp/net/apache/spark/spark-1.6.2/spark-1.6.2-bin-hadoop2.6.tgz
$ tar zxvf spark-1.6.2-bin-hadoop2.6.tgz
$ sudo mv spark-1.6.2-bin-hadoop2.6 /usr/local/
$ sudo ln -s /usr/local/spark-1.6.2-bin-hadoop2.6 /usr/local/spark
```

.bashrc に以下を追記

```
export SPARK_HOME=/usr/local/spark
export PATH=$PATH:$SPARK_HOME/bin
```

ログレベルの設定

```
cd $SPARK_HOME/conf
cp log4j.properties.template log4j.properties

log4j.rootCategory=INFO, console
↓
log4j.rootCategory=WARN, console #ログが大量に出るのを防ぐ
```

spark-shell実行

```
$ spark-shell --master local[*]
(中略)
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 1.6.1
      /_/

Using Scala version 2.10.5 (OpenJDK 64-Bit Server VM, Java 1.8.0_91)
Type in expressions to have them evaluated.
Type :help for more information.
(中略)

scala> val textFile = sc.textFile("/usr/local/spark/README.md")
textFile: org.apache.spark.rdd.RDD[String] = /usr/local/spark/README.md MapPartitionsRDD[1] at textFile at <console>:27

scala> val wordCounts = textFile.flatMap(line => line.split(" ")).map(word => (word, 1)).reduceByKey((a, b) => a + b)
wordCounts: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[4] at reduceByKey at <console>:29

scala> wordCounts.collect()
res0: Array[(String, Int)] = Array((package,1), (For,2), (Programs,1), (processing.,1), ...(中略)...,  (>>>,1), (programming,1), (T...
scala>
```



#基本情報
##BigDLとは

BigDLはApache Sparkのための分散型の深層学習ライブラリです。 BigDLでは、既存のSparkまたはHadoopクラスタの上で直接実行できる標準のSparkプログラムとして、深層学習アプリケーションを作成できます。

###豊かな深層学習支援。 
TorchをモデルにしたBigDLは、数値計算（Tensor経由）や高レベルのニューラルネットワークを含む深層学習を包括的にサポートしています。さらに、ユーザーはBigDLを使用してSparkプログラムに事前にトレーニングされたCaffeまたはTorchモデルを読み込むことができます。

###非常に高いパフォーマンス。
高性能を実現するために、BigDLは各SparkタスクでインテルMKLとマルチスレッドプログラミングを使用します。その結果、単一ノードXeon（すなわち、メインストリームGPUに匹敵する）上のすぐに使えるオープンソースのCaffe、TorchまたはTensorFlowよりも数桁高速です。

###効率的なスケールアウト。 
BigDriveは、Apache Spark（高速分散データ処理フレームワーク）を活用し、同期SGDを効率的に実装し、Sparkですべての通信を削減することで、「Big Data scale」でデータ分析を効率的にスケールアウトすることができます。


##なぜBigDL？

次の場合、BigDLを使って深層学習プログラムを書くことができます：

データが格納されているBig Data（Hadoop / Spark）クラスタ（HDFS、HBase、Hiveなど）上の大量のデータを分析する必要があります。

Big Data（Spark）プログラムやワークフローに深層学習機能（トレーニングまたは予測のいずれか）を追加したいと考えています。

既存のHadoop / Sparkクラスタを活用して、ETL、データウェアハウス、フィーチャ・エンジニアリング、古典的な機械学習、グラフ解析などの他のワークロードと動的に共有できるディープ・ラーニング・アプリケーションを実行する必要があります。

##BigDLの使い方

BigDLをインストールしてビルドする方法（LinuxとmacOSの両方）を学ぶには、ビルドページをチェックしてください
BigDLプログラム（ローカルJavaプログラムまたはSparkプログラムのいずれか）を実行する方法については、「Getting Started」ページを参照してください
EC2でBigDLを試すには、EC2で実行するページをチェックしてください
BigDLを使って数分で実用的なニューラルネットワークを作成する方法を知るには、チュートリアルページ
詳細については、ドキュメントページ（チュートリアル、サンプル、プログラミングガイドなどを参照）

##サポート

BigDL Googleグループに参加する（またはメールリストに登録する）ことで、BigDLに関するその他の質問や議論ができます
問題ページにバグレポートや機能リクエストを投稿できます



#BigDLのインストール
##BigDLプログラムを実行する前に

BigDLプログラムを実行する前に、まず適切な環境変数を設定する必要があります。

###環境変数の設定。

高性能を実現するために、BigDLはIntel MKLとマルチスレッドプログラミングを使用します。 したがって、PATH_To_BigDL / scripts / bigdl.shで提供されているスクリプトを次のように実行して、環境変数を最初に設定する必要があります。

```
git clone https://github.com/intel-analytics/BigDL.git
cd BigDL
source scripts/bigdl.sh
```

また、PATH_To_BigDL / scripts / bigdl.shスクリプトを使用してBigDLプログラムを起動することもできます。 以下の詳細を参照してください。

#ビルド

```
bash make-dist.sh
```

##インタラクティブスパークシェル

対話型のSparkシェルを使用して、SparkプログラムとしてBigDLコードを簡単に試すことができます：

```
source scripts/bigdl.sh
SPARK_HOME/bin/spark-shell --jars bigdl-0.1.0-SNAPSHOT-jar-with-dependencies.jar

#こんなのが表示される
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /___/ .__/\_,_/_/ /_/\_\   version 1.6.0
      /_/

Using Scala version 2.10.5 (Java HotSpot(TM) 64-Bit Server VM, Java 1.7.0_79)
Spark context available as sc.
scala> 

#これらが入力できればOK
import com.intel.analytics.bigdl.tensor.Tensor
Tensor[Double](2,2).fill(1.0)
```






#参考
http://qiita.com/chrysocome/items/0680a537838233fce323
https://github.com/intel-analytics/BigDL/wiki/Getting-Started