DeployR使ってみた話

42
部屋とYシャツと私 2015/12/05 Japan.R 2015@株式会社RCO 和田 計也 (4年ぶり2回目)

Transcript of DeployR使ってみた話

Page 1: DeployR使ってみた話

部屋とYシャツと私

2015/12/05

Japan.R 2015@株式会社RCO

和田 計也

(4年ぶり2回目)

Page 2: DeployR使ってみた話

2015/12/05

いつもの

この発表は個人 の見解であり、 所属する組織の 公式見解ではありません

サイバー系

2

サイバー系

Page 3: DeployR使ってみた話

2015/12/05

自己紹介u和田 計也(@wdkz) !

!!

u静岡県袋井市出身 uサイバー系企業でデータマイニングエンジニア職

u 趣味は音楽鑑賞 u 最近は松浦亜弥ばっか聴いてます

サイバー系

3

サイバー系

Page 4: DeployR使ってみた話

2015/12/05

部屋とYシャツと私、といえばサイバー系

4

サイバー系

u 2013年12月のライブで松浦亜弥がカヴァーした曲

u それから2年経って…

u部屋 ̶> Shiny u Yシャツ ̶> rApache u私 ̶> DeployR

Page 5: DeployR使ってみた話

2015/12/05

Shinyサイバー系

u Rでweb applicationを作るためのframework !

5

サイバー系

Page 6: DeployR使ってみた話

2015/12/05

rApacheサイバー系

u RとApacheでWeb Application を作るためのFramework

u mod_perl的なmod_R 6

サイバー系

Page 7: DeployR使ってみた話

2015/12/05

DeployRサイバー系

u RでREST API作るためのFramework

7

サイバー系

Page 8: DeployR使ってみた話

2015/12/05

比較表サイバー系

8

サイバー系

shiny rApache DeployR

想定ユーザー 人 (人と)プログラム プログラム

メリット簡単にBIツールっぽのが作成できる

戻り値を柔軟に設定できる

開発&デバッグがやりやすい

デメリット同時アクセスにめっぽう弱い

開発&デバッグがやりづらい

戻り値が冗長

ライセンス・AGPL v3 ・RStudio License Agreement

・Apache License 2.0

・AGPL v3 ・Microsoft License Agreement

開発者 R Studio社 Jeffrey HornerMicrosoft(RevolutionAnalytics社)

Page 9: DeployR使ってみた話

2015/12/05

ここで一旦CMですサイバー系

9

サイバー系

u サイバー系企業ではエンジニア絶賛募集中です!! u 学会発表できます! u 論文執筆できます! u もちろん実務もバリバリやりましょう!

!

第9回SIG-DOCMAS研究会(2015) より  http://www.ai.soc.i.kyoto-u.ac.jp/docmas/ja/

Page 10: DeployR使ってみた話

2015/12/05

ここで一旦CMですサイバー系

10

サイバー系

第9回SIG-DOCMAS研究会(2015) より  http://www.ai.soc.i.kyoto-u.ac.jp/docmas/ja/

Rでword2vec やりたいじゃないですか

Page 11: DeployR使ってみた話

2015/12/05

word2vecやりましょうサイバー系

11

サイバー系

python 2.7以上がインストールされているとしてshell上でgensimをinstall

>pip install gensimbuild_mdl_w2v <- function(input_data = 'text8', #入力

size = 256, windows = 5, sg = 0, min_count = 5, model_out = 'vectors.txt' #出力 ){ library(rPython) python.assign("data", input_data) python.assign("size", size) python.assign("windows", windows) python.assign("sg", sg) python.assign("min_count", min_count) python.assign("model_out", model_out) python.exec("from gensim.models import word2vec") python.exec("sentence = word2vec.Text8Corpus(data)") python.exec("model = word2vec.Word2Vec(sentence, size=size, window=windows, sg=sg, min_count=min_count)") python.exec("model.save_word2vec_format(model_out, binary=False)") } build_mdl_w2v()

Page 12: DeployR使ってみた話

2015/12/05

word2vecやりましょうサイバー系

12

サイバー系

vectors.txtというモデルを生成(中身はテキストファイル)

Page 13: DeployR使ってみた話

2015/12/05

尚、現在はサイバー系

13

サイバー系

u 2015年11月にGithub上に公開されてたwordVectorsライブラリを使うほうが真っ当

  https://github.com/bmschmidt/wordVectors !u rPython使えば、今後も出てくるであろうpythonで書かれ

たライブラリをいち早くRでも利用できるよ!!

Page 14: DeployR使ってみた話

2015/12/05

今日やることサイバー系

14

サイバー系

u 作成したmodelを使って、結果を返すようなweb applicationをShiny, rApache, DeployRで作ってみましょう

!  

Page 15: DeployR使ってみた話

2015/12/05

準備

サイバー系

15

サイバー系

Page 16: DeployR使ってみた話

2015/12/05

まずはサイバー系

16

サイバー系

u 表現層ベクトルの演算からのコサイン類似度算出のロジックを作る

u コサイン類似度部分(速度必要なのでRcppで)

library(inline) cos.simfun = cxxfunction( signature(A="numeric", B="matrix"), body = ' NumericVector a(A); NumericMatrix xx(B); NumericVector yy(xx.nrow()); for(int i = 0; i < xx.nrow(); i++){ yy[i] = sum(a * xx(i,_))/sqrt(sum(a*a)*sum(xx(i,_)*xx(i,_))); } return( yy ); ', plugin="Rcpp")

Page 17: DeployR使ってみた話

2015/12/05

まずはサイバー系

17

サイバー系

u 表現層ベクトルの演算からのコサイン類似度算出のロジックを作る

u 表現層ベクトル演算(の単発文字列例_このままだと演算できないよ)と類似度TopN算出部分

calc_distance <- function(mdl, word = "king", topn=10 ) { mdl %>% filter(V1 == word) %>% select(-V1) %>% as.numeric -> this_vec data.frame(word = mdl$V1, cos_sim = cos.simfun(A = this_vec, B = as.matrix(mdl[,-1, with=F]) ), stringsAsFactors = F) %>% arrange(desc(cos_sim)) %>% head(topn) }

Page 18: DeployR使ってみた話

2015/12/05

まずはサイバー系

18

サイバー系

u 表現層ベクトルの演算からのコサイン類似度算出のロジックを作る

u 実行部分

run_w2v <- function(){ #build_mdl_w2v() library(data.table) mdl <- fread("vectors.txt", sep = ' ', skip = 1, header = F) mdl %>% calc_distance(word = "king - man + woman") }

Page 19: DeployR使ってみた話

2015/12/05

Shiny

サイバー系

19

サイバー系

Page 20: DeployR使ってみた話

2015/12/05

Shinyでサイバー系

20

サイバー系

u RStudioで「New Project」̶>「New Directory」̶> 「Shiny Web Application」̶>適当な名前付ける

Page 21: DeployR使ってみた話

2015/12/05

Shinyでサイバー系

21

サイバー系

u いい感じのテンプレートが生成されるので、後は適当にこのファイル2つserver.Rとui.Rを修正すれば良い

u ちなみに、生成されたままの状態で「Run App」するとこんなのが起動します→→→→→→→

Page 22: DeployR使ってみた話

2015/12/05

Shinyでサイバー系

22

サイバー系

u server.R部分修正前 u さっき作ったロジック部分のコードをそれなりの箇所に追記します

library(shiny) !shinyServer(function(input, output) { output$distPlot <- renderPlot({ x <- faithful[, 2] bins <- seq(min(x), max(x), length.out = input$bins + 1) hist(x, breaks = bins, col = 'darkgray', border = 'white') }) })

plotをtable 描写へ 変更

動的にcalc_distance関数 を呼ぶよう追記

library読み込んだり、 関数定義したりする

Page 23: DeployR使ってみた話

2015/12/05

Shinyでサイバー系

23

サイバー系

u server.R部分修正後 u こんな感じ

library(shiny); library(dplyr); library(inline) library(data.table); library(rhandsontable) cos.simfun = cxxfunction( … ) #略

calc_distance <- function(mdl, word, topn){…} #略

mdl <- fread(txt, sep = ‘ ’, skip = 1){} #略 shinyServer(function(input, output) {  select_data <- reactive({ calc_distance(mdl, word = input$word, topn = input$topn) }) output$table1 <- renderRHandsontable({ if(is.null(input$terms)){ return(NULL) }else{ select_data() %>% rhandsontable } }) })

Page 24: DeployR使ってみた話

2015/12/05

Shinyでサイバー系

24

サイバー系

u ui.R部分修正前 u Viewに合わせてそれなりに追記しますよ

library(shiny) shinyUI(fluidPage( titlePanel("Old Faithful Geyser Data"), sidebarLayout( sidebarPanel( sliderInput("bins", "Number of bins:", min = 1, max = 50, value = 30) ), mainPanel( plotOutput("distPlot") ) ) ))

plotをtable 描写へ 変更

input部分を微調整

title表記微調整

Page 25: DeployR使ってみた話

2015/12/05

Shinyでサイバー系

25

サイバー系

u ui.R部分修正後 u こんな感じ

library(shiny); library(rhandsontable) shinyUI(fluidPage( titlePanel("word2vec"), sidebarLayout( sidebarPanel( sliderInput("topn", "TopN:", min = 1, max = 50, value = 10), textInput("words", "入力", "king")

), mainPanel( rHandsontableOutput("table1", height = 1250) ) ) ))

plotをtable 描写へ 変更

input部分を微調整

title表記微調整

Page 26: DeployR使ってみた話

2015/12/05

Shinyでサイバー系

26

サイバー系

u やってみた例

Page 27: DeployR使ってみた話

2015/12/05

rApache

サイバー系

27

サイバー系

Page 28: DeployR使ってみた話

2015/12/05

rApacheでサイバー系

28

サイバー系

u まずはRookライブラリでそれっぽいの構築します

library(Rook); library(dplyr); library(inline); library(data.table); cos.simfun = cxxfunction( … ) #略

calc_distance <- function(mdl, term, topn){…} #略

run_w2v <- function(env){ mdl <- fread(txt, sep = ‘ ’, skip = 1){} #略 req <- Rook::Request$new(env); res <- Rook::Response$new() words <- NULL if(!is.null(req$GET()[['word']])){ words <- req$GET()[['word']] mdl %>% calc_distance(term=words) -> res_tbl } res$write('input term.\n') res$write('<form method="GET">\n') res$write('<input type="text" name="term">\n') res$write('<input type="submit" name="Submit"><br>\n</form>\n<br>') if(!is.null(words)) res$write(paste(‘<h1>’,terms,’</h1>\n')) if(exists(‘res_tbl’)) res$write(hwriter::hwrite(res_tbl)) res$finish() }

ここら辺の outputは HTMLベタ書き

Page 29: DeployR使ってみた話

2015/12/05

rApacheでサイバー系

29

サイバー系

u まずはRookライブラリで動作チャック

rk <- Rhttpd$new() rk$start(quiet = TRUE) rk$add(app=run_w2v, name="word2vec") rk$browse("word2vec")

一個前で定義した関数

Page 30: DeployR使ってみた話

2015/12/05

rApacheでサイバー系

30

サイバー系

u rApacheにデプロイなんだけど、その前にrApacheの準備 u Ubuntuの場合

sudo add-apt-repository ppa:opencpu/rapache sudo apt-get update sudo apt-get install libapache2-mod-r-base sudo vi /etc/apache2/mods-available/mod_R.load

LoadModule R_module /usr/lib/apache2/modules/mod_R.so 1行追記

sudo a2enmod mod_R sudo service apache2 restart

sudo vi /etc/apache2/apache2.conf

<Location /word2vec> SetHandler r-handler RFileEval /home/parallels/sandbox/w2v_rook.R:R::Server$call(run_W2v) </Location>

Rook使って書いた Rのファイル名

Rookのbrowseで 呼んでた関数名

URLの一部になる

Page 31: DeployR使ってみた話

2015/12/05

rApacheはサイバー系

31

サイバー系

やること 多くて面倒い

Page 32: DeployR使ってみた話

2015/12/05

DeployR

サイバー系

32

サイバー系

Page 33: DeployR使ってみた話

2015/12/05

deployRでサイバー系

33

サイバー系

u 起動します !u Vivaldiブラウザで以下のURLにアクセスします

/path/to/deployr/version/startAll.sh

http://<deployr server>:7400/deployr

loginします

Page 34: DeployR使ってみた話

2015/12/05

deployRでサイバー系

34

サイバー系

u ログイン後の画面

Page 35: DeployR使ってみた話

2015/12/05

deployRでサイバー系

35

サイバー系

u Repository Manager u まだ空ですね

ファイルをuploadしましょう

Page 36: DeployR使ってみた話

2015/12/05

deployRでサイバー系

36

サイバー系

u Repository Manager u ファイルupload後

ファイルがuploadできました!       & クリック

Page 37: DeployR使ってみた話

2015/12/05

deployRでサイバー系

37

サイバー系

u Repository Manager u uploadしたFileのプロパティ

ここら辺でアクセス制御設定できたり

クリック

Page 38: DeployR使ってみた話

2015/12/05

deployRでサイバー系

38

サイバー系

u Repository Manager u ブラウザ上で開発ができちゃいます!!

ここで 軽めの 開発

Page 39: DeployR使ってみた話

2015/12/05

deployRでサイバー系

39

サイバー系

③ ④

①結果をresという変数に入れるよう変更  ②APIへの入力値としてword <- “king”みたいな感じのを設定  ③resをAPIの戻り値として設定 & ④実行 ⑤実行中の標準出力 ⑥「API Response」ボタンを押して、意図する結果が返るか確認

Page 40: DeployR使ってみた話

2015/12/05

deployRでサイバー系

40

サイバー系

u APIを叩いてみよう u 何でRから叩いてるの?とか聞かない

library(RCurl) tt <- postForm(“http://xx.xx.xx.xx:7400/deployr/r/repository/script/execute”, format = "json", filename = "w2v.R", directory = "jr", author = "admin", csvinputs = "word,king", robjects = "res" ) library(jsonlite) tl <- fromJSON(tt)[[1]]$response$workspace$objects$value[[1]]$value names(tl) <- fromJSON(tt)[[1]]$response$workspace$objects$value[[1]]$name as.data.frame(tl)

ここら辺 参考に

Page 41: DeployR使ってみた話

2015/12/05

比較表サイバー系

41

サイバー系

shiny rApache DeployR

想定ユーザー 人 (人と)プログラム プログラム

メリット簡単にBIツールっぽのが作成できる

戻り値を柔軟に設定できる

開発&デバッグがやりやすい

デメリット同時アクセスにめっぽう弱い

開発&デバッグが大変面倒い

戻り値が冗長だし柔軟性なし

ライセンス・AGPL v3 ・RStudio License Agreement

・Apache License 2.0

・AGPL v3 ・Microsoft License Agreement

開発者 R Studio社 Jeffrey HornerMicrosoft(RevolutionAnalytics社)

Page 42: DeployR使ってみた話

2015/12/05

最後にサイバー系

42

サイバー系

u (主に) DeployR 使ってみたわー u 「スピーカー欲しい人、低額で譲ります!」からの1年経過。

問い合わせ2件、コンバージョン0 u 再募集します!!(アンプ持ってない方、CambridgeAudio

製Azur 350A用意できます!)これ↓の一個まえの型(GX100)左右ペア

@wdkzまでご連絡下さい!!