Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.

DeployR使ってみた話

14.957 visualizaciones

Publicado el

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

Publicado en: Datos y análisis
  • Hello! Get Your Professional Job-Winning Resume Here - Check our website! https://vk.cc/818RFv
       Responder 
    ¿Estás seguro?    No
    Tu mensaje aparecerá aquí

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までご連絡下さい!!

×