AWSにRStudio Serverを構築してみた

[RStudio Server](https://www.rstudio.com/products/RStudio/#Server)をAWSに立ててみたので手順など残しておこうかと思いました。個人メモですので。。

## 前提
- OSは[Amazon Linux](https://aws.amazon.com/jp/amazon-linux-ami/)です。
- Instance Typeは m4.2xlargeです。（性能のことを後述します。）

## R, RStudioのインストール
まずはRから、と言ってもこれだけですが。

```
$ sudo yum -y install R
```

次にRStusion Server

```
$ wget https://download2.rstudio.org/rstudio-server-rhel-1.0.143-x86_64.rpm
$ sudo yum -y install --nogpgcheck rstudio-server-rhel-1.0.143-x86_64.rpm
```

### RStudio Server用にユーザーを作成。
OSにユーザーを作ります。 （ここでは **rstudio** というユーザー）
SSHはこの後も使います。

```
$ sudo useradd rstudio
$ sudo passwd rstudio
```

### セキュリティの設定

- Inbound

| Type | Protocol | Port Range | Source |
|------|----------|------------|--------|
| Custom TCP Rule | TCP | 8787 | 0.0.0.0/0|

### ブラウザからアクセス
IPは Elastic IP、Public IPやDNSなどをみます。

```
http://xxx.xxx.xxx.xxx:8787/
```

## パッケージのインストール
Rのパッケージの前にOSにこれくらい入れておきます。過不足あるかもしれませんが。
Linuxの場合Rのパッケージインストール前にOSのパッケージが入っていないためエラーになることがあります。特に以下の *-devel系。
R側でエラーするとメッセージをよく見るとOSの必要なパッケージが書かれていますのでご注意ください。

```
$ sudo yum -y groupinstall "Development Tools"
$ sudo yum -y install libcurl libcurl-devel
$ sudo yum -y install libpng-devel
$ sudo yum -y install openssl-devel
$ sudo yum -y install libxml2-devel
$ sudo yum -y install libssh2-devel
```

### 日本語フォントインストール
Plotなどに日本語を表示させるためにIPAフォントをインストールします。
まずはOSに。

```
# yum install ipa-gothic-fonts ipa-mincho-fonts ipa-pgothic-fonts ipa-pmincho-fonts
```

もしくはフォントファイルをDLする。
（ファイル名なバージョンによるものらしいのでその時に応じて確認が必要）

```
# cd /usr/share/fonts
# wget http://dl.ipafont.ipa.go.jp/IPAexfont/ipaexg00301.zip
# unzip ipaexg00301.zip 
# fc-cache -fv
```

R側で確認する。６，７番が該当。

```
> fonts()
[1] "DejaVu Sans"            "DejaVu Sans Light"      "DejaVu Sans Condensed" 
[4] "DejaVu Serif"           "DejaVu Serif Condensed" "IPAexGothic"           
[7] "IPAMincho"
```

出てこなければ、[Symfowareについての考察blog](http://symfoware.blog68.fc2.com/blog-entry-1506.html)さまを参考に。

```
install.packages("extrafont")
library(extrafont)
font_import()
```

RStudioの再起動も必要かもしれません。

```
$ sudo rstudio-server stop
$ sudo rstudio-server start
```


### Stanパッケージインストール
Stanを入れる前にパッケージの依存関係を確認しましょう。
そのために `miniCRAN` をインストールします。

```
> install.packages("miniCRAN")
> library("miniCRAN")
```

Stanの依存関係を見る。いっぱいありますね。
これはパッケージのインストールに失敗した際に何を入れなければいけないかわかるのに便利です。

```
> pkgDep(pkg = "rstan")
 [1] "rstan"        "ggplot2"      "StanHeaders"  "inline"       "gridExtra"    "Rcpp"        
 [7] "RcppEigen"    "BH"           "digest"       "gtable"       "MASS"         "plyr"        
[13] "reshape2"     "scales"       "tibble"       "lazyeval"     "Matrix"       "lattice"     
[19] "stringr"      "RColorBrewer" "dichromat"    "munsell"      "labeling"     "rlang"       
[25] "colorspace"   "stringi"      "magrittr"     "matrixStats"  "shiny"        "bayesplot"   
[31] "colourpicker" "DT"           "dygraphs"     "gtools"       "markdown"     "rsconnect"   
[37] "shinyjs"      "shinythemes"  "threejs"      "xtable"       "xts"          "dplyr"       
[43] "htmltools"    "htmlwidgets"  "miniUI"       "zoo"          "mime"         "PKI"         
[49] "RCurl"        "RJSONIO"      "packrat"      "yaml"         "rstudioapi"   "httpuv"      
[55] "jsonlite"     "R6"           "sourcetools"  "base64enc"    "assertthat"   "bindrcpp"    
[61] "glue"         "pkgconfig"    "plogr"        "bitops"       "bindr"        "evaluate"    
[67] "highr"        "RUnit"        "KernSmooth"   "loo"          "shinystan"    "rstantools"  
[73] "knitr"
```

では `rstan` をインストール

```
> install.packages("rstan")
> library("rstan")
```

## 分析してみる
Logics of Blueさまの[”慣れ”の統計モデリング](http://logics-of-blue.com/%E6%85%A3%E3%82%8C%E3%81%AE%E7%B5%B1%E8%A8%88%E3%83%A2%E3%83%87%E3%83%AA%E3%83%B3%E3%82%B0%EF%BC%9Astan%E3%81%A7%E6%8E%A8%E5%AE%9A%E3%81%99%E3%82%8B%E6%99%82%E5%A4%89%E4%BF%82/) を動かしてみようかと思います。

[Rのコードはこちら](http://logics-of-blue.com/wp-content/uploads/2015/12/stan_time_variant_coefficients.txt)

ブログにもありますが2時間程かかります。

### パフォーマンス
前提でインスタンスタイプを書きましたが、少し高額なものを使っています。なぜか？
最初はRがどれほどリソースを使うのか分からず、1core、500MB程度のVPSで構築しました。（非AWS）
ところが、 `Rcpp` パッケージを入れるのにSWAPが発生しまくったりしたため、AWSのt2.largeに引っ越し。
そしてこのコードをお借りしたところ以下のような状況に。。

<img width="917" alt="aws_cpu_1.png" src="https://qiita-image-store.s3.amazonaws.com/0/83426/a5866da5-c75e-fa95-c5a5-7c8e0fb9e08b.png">

この絵が示しているのは6時前に実行し、1時間ほど100%張り付きで処理していましたが、7時を過ぎたところで30%程度の性能で稼働を続けていました。
その後4時間近く経過しましたが終わらなかったため中断しました。
多分ですが、このインスタンスには1時間分くらいのCPUクレジットが溜まっていたのでしょう。
それを使い切り、T2の通常？の性能に戻ったと推測しています。
[バースト可能パフォーマンスインスタンス](https://aws.amazon.com/jp/ec2/instance-types/)

## もう一度動かしてみる
今度はm4.2xlargeで構築しました。もちろん手順は上述の通り。
性能はこちら。
<img width="916" alt="aws_cpu_3.png" src="https://qiita-image-store.s3.amazonaws.com/0/83426/d75b8bb6-ae7c-0591-8f6e-af36ddf8807a.png">
14時前に動かして、1時間程で一段落？、その後16時ころには終わり、合計2時間程度です。

Rにはバーストしないタイプの方が向いているかもしれませんね。

### 少し疑問が。
処理中にTOPを取っています。
マルチCPUなので topコマンドの後、 `1` を押します。
8coreなのですが、Cpu0,2,5の3つしかつかていませんでした。（処理中ずっとです。）
願わくば全部使ってほしいのですが。。

<img width="645" alt="aws_rstan_top_cmd.png" src="https://qiita-image-store.s3.amazonaws.com/0/83426/460caa17-8a73-fe66-58e1-11d0fda874a5.png">

8core認識しているのですが。

```
> parallel::detectCores()
[1] 8
```

何かわかれば更新します。