Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

DeployR使ってみた話

15,081 views

Published on

Japan.R 2015での発表資料です。ShinyとrApacheとDeployRとのお話

Published in: Data & Analytics
  • Hello! Get Your Professional Job-Winning Resume Here - Check our website! https://vk.cc/818RFv
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

DeployR使ってみた話

  1. 1. 部屋とYシャツと私 2015/12/05 Japan.R 2015@株式会社RCO 和田 計也 (4年ぶり2回目)
  2. 2. 2015/12/05 いつもの この発表は個人 の見解であり、 所属する組織の 公式見解ではあ りません サイバー系 2 サイバー系
  3. 3. 2015/12/05 自己紹介 u和田 計也(@wdkz) ! ! ! u静岡県袋井市出身 uサイバー系企業でデータマイニングエンジニア職 u 趣味は音楽鑑賞 u 最近は松浦亜弥ばっか聴いてます サイバー系 3 サイバー系
  4. 4. 2015/12/05 部屋とYシャツと私、といえば サイバー系 4 サイバー系 u 2013年12月のライブで松浦亜弥がカヴァーした曲 u それから2年経って… u 部屋 ̶> Shiny u Yシャツ ̶> rApache u 私 ̶> DeployR
  5. 5. 2015/12/05 Shiny サイバー系 u Rでweb applicationを作るためのframework ! 5 サイバー系
  6. 6. 2015/12/05 rApache サイバー系 u RとApacheでWeb Application を作るための Framework u mod_perl的なmod_R 6 サイバー系
  7. 7. 2015/12/05 DeployR サイバー系 u RでREST API作るためのFramework 7 サイバー系
  8. 8. 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 Horner Microsoft(Revolutio nAnalytics社)
  9. 9. 2015/12/05 ここで一旦CMです サイバー系 9 サイバー系 u サイバー系企業ではエンジニア絶賛募集中です!! u 学会発表できます! u 論文執筆できます! u もちろん実務もバリバリやりましょう! ! 第9回SIG-DOCMAS研究会(2015) より  http://www.ai.soc.i.kyoto-u.ac.jp/docmas/ja/
  10. 10. 2015/12/05 ここで一旦CMです サイバー系 10 サイバー系 第9回SIG-DOCMAS研究会(2015) より  http://www.ai.soc.i.kyoto-u.ac.jp/docmas/ja/ Rでword2vec やりたいじゃないですか
  11. 11. 2015/12/05 word2vecやりましょう サイバー系 11 サイバー系 python 2.7以上がインストールされているとしてshell上でgensimをinstall >pip install gensim build_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()
  12. 12. 2015/12/05 word2vecやりましょう サイバー系 12 サイバー系 vectors.txtというモデルを生成(中身はテキストファイル)
  13. 13. 2015/12/05 尚、現在は サイバー系 13 サイバー系 u 2015年11月にGithub上に公開されてたwordVectors ライブラリを使うほうが真っ当   https://github.com/bmschmidt/wordVectors ! u rPython使えば、今後も出てくるであろうpythonで書かれ たライブラリをいち早くRでも利用できるよ!!
  14. 14. 2015/12/05 今日やること サイバー系 14 サイバー系 u 作成したmodelを使って、結果を返すようなweb applicationをShiny, rApache, DeployRで作ってみま しょう !   
  15. 15. 2015/12/05 準備 サイバー系 15 サイバー系
  16. 16. 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")
  17. 17. 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) }
  18. 18. 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") }
  19. 19. 2015/12/05 Shiny サイバー系 19 サイバー系
  20. 20. 2015/12/05 Shinyで サイバー系 20 サイバー系 u RStudioで「New Project」̶>「New Directory」 ̶> 「Shiny Web Application」̶>適当な名前付ける
  21. 21. 2015/12/05 Shinyで サイバー系 21 サイバー系 u いい感じのテンプレートが生成されるので、後は適当にこの ファイル2つserver.Rとui.Rを修正すれば良い u ちなみに、生成されたままの状態で「Run App」するとこ んなのが起動します→→→→→→→
  22. 22. 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読み込んだり、 関数定義したりする
  23. 23. 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 } }) })
  24. 24. 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表記微調整
  25. 25. 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表記微調整
  26. 26. 2015/12/05 Shinyで サイバー系 26 サイバー系 u やってみた例
  27. 27. 2015/12/05 rApache サイバー系 27 サイバー系
  28. 28. 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ベタ書き
  29. 29. 2015/12/05 rApacheで サイバー系 29 サイバー系 u まずはRookライブラリで動作チャック rk <- Rhttpd$new() rk$start(quiet = TRUE) rk$add(app=run_w2v, name="word2vec") rk$browse("word2vec") 一個前で定義した関数
  30. 30. 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の一部になる
  31. 31. 2015/12/05 rApacheは サイバー系 31 サイバー系 やること 多くて面倒い
  32. 32. 2015/12/05 DeployR サイバー系 32 サイバー系
  33. 33. 2015/12/05 deployRで サイバー系 33 サイバー系 u 起動します ! u Vivaldiブラウザで以下のURLにアクセスします /path/to/deployr/version/startAll.sh http://<deployr server>:7400/deployr loginします
  34. 34. 2015/12/05 deployRで サイバー系 34 サイバー系 u ログイン後の画面
  35. 35. 2015/12/05 deployRで サイバー系 35 サイバー系 u Repository Manager u まだ空ですね ファイルをuploadしましょう
  36. 36. 2015/12/05 deployRで サイバー系 36 サイバー系 u Repository Manager u ファイルupload後 ファイルがuploadできました!       & クリック
  37. 37. 2015/12/05 deployRで サイバー系 37 サイバー系 u Repository Manager u uploadしたFileのプロパティ ここら辺でアクセス制御設定できたり クリック
  38. 38. 2015/12/05 deployRで サイバー系 38 サイバー系 u Repository Manager u ブラウザ上で開発ができちゃいます!! ここで 軽めの 開発
  39. 39. 2015/12/05 deployRで サイバー系 39 サイバー系 ① ② ③ ④ ⑤ ⑥ ①結果をresという変数に入れるよう変更  ②APIへの入力値としてword <- king みたいな感じのを設定  ③resをAPIの戻り値として設定 & ④実行 ⑤実行中の標準出力 ⑥「API Response」ボタンを押して、意図する結果が返るか確認
  40. 40. 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) ここら辺 参考に
  41. 41. 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 Horner Microsoft(Revolutio nAnalytics社)
  42. 42. 2015/12/05 最後に サイバー系 42 サイバー系 u (主に) DeployR 使ってみたわー u 「スピーカー欲しい人、低額で譲ります!」からの1年経過。 問い合わせ2件、コンバージョン0 u 再募集します!!(アンプ持ってない方、CambridgeAudio 製Azur 350A用意できます!) これ↓の一個まえの型(GX100)左右ペア @wdkzまでご連絡下さい!!

×