Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Tokyo.R 62 Session 3

eriver
June 24, 2017

Tokyo.R 62 Session 3

eriver

June 24, 2017
Tweet

More Decks by eriver

Other Decks in Technology

Transcript

  1. だれ? • えりばー (@eriver_jpn) • TokyoRは#55から参加。 • じゃんけん大会で2回商品ゲット。 • データ活用系ソリューション相談おじさん@クラウド業者

    • ど文系→国内SI会社(エンジニア)→統計ソフト販売(コンサル)→現職 • エンタープライズ向け総合的なデータ活用支援案件の提案と推進 • 企画支援 / PMO / 技術調査 / 社内ヒアリング支援 / ユーザー教育 / 分析PoC実施 • 仕事上での興味/フォーカスエリア • 可視化や機械学習等のデータ活用手法を一般のレベルに広める方法 • 新しくデータサイエンスに触れる既存のIT技術者の教育・モチベーション向上 • 若手のデータサイエンティスト(本物)の価値向上 R Studioステッカー 献本 2
  2. 課題設定(実話) • 大量の変数の組み合わせによる反復計算要件 • 大量の時系列変数を相互に組み合わせ、類似度の計算とhtmlレポート 出力。 • 組み合わせ数:約80,000 • 組み合わせ毎に類似度計算と{hwriter}

    {ggplot2}によるhtmlレポートの出力 • 微妙に解像度上げたグラフのggsave()が実行に1秒程度かかる。 • ノートPCで17時間かかった・・・ • しかもミスってやり直し・・・(死) • 組み合わせごとに独立した処理なので、並列処理が有効 • 悩んでた所に神が降臨し、32coreサーバーを貸してくれた • {doSNOW}で並列化。なんと35分で終わった。 • でも、いつも神が降臨するわけじゃない・・・なにかいい手は? 3
  3. 処理イメージ(雑) 4 80,000回ループ ・結果1行 ・グラフ2枚 元データ 80,000行の表 160,000枚のグラフ 2,500回 ループ

    元データ 80,000行の表 160,000枚のグラフ 2,500回 ループ 2,500回 ループ x30 ...... 結果あつめ 基本1スレッドなので CPUは暇なのにおそい 各ループを別のCPUに 割り当てるとCPUの暇が なくなって効率化 普通にfor文で書くと {doSNOW}{foreach}を使って並列に分散させる foreach内
  4. そこで{doAzureParallel}ですよ • {doSNOW}との呼び方比較図 registerdoSnow() foreach () %dopar% {} stopCluster() makeCluster()

    registerdoAzureParallel() setCredential() Azureサービスの APIキーを読む 設定ファイルに基いて Azure BatchのVMが準備 される。準備されるノー ドはData Science VM 並列用CPUが準 備される 並列バックエンドとして AzureBatchのVMが登録 される。 並列バックエンドとして CPUが登録される Azure Batchのジョブにて 分散処理 CPUで分散処理 Azure Batchのジョブ を削除 CPU登録解除 上段:{doSNOW} 下段:{doAzureParallel} 6
  5. 利用手順サマリ • Azure側はBatchアカウントを作るだけ。すごく簡単。 8 (1)Azure Batch アカウントの設定 (2){doAzureParallel} のインストール (3)設定ファイルの

    書き出しと修正 (4)プログラム作成 実行 結果受領 Batchプール作成 (Linux DSVM) ジョブ作成・実行 Batchプール削除 Azure PC 自動で処理される
  6. (2) {doAzureParallel} インストール • PC上で実施。Rのバージョンは3.3.1以上。 • {devtools}→install_github() • 私の場合は1つパッケージ(bitops)がこぼれたがすぐ拾ってOK。(?) >

    # install the package devtools > install.packages("devtools") ..... > library(devtools) > > # install the doAzureParallel and rAzureBatch package > install_github(c("Azure/rAzureBatch", "Azure/doAzureParallel")) .... ** testing if installed package can be loaded * DONE (doAzureParallel) 12
  7. (3) 設定ファイルの書き出しと修正 • Rから以下のコマンドを叩くと雛形ができるのでそれを修正する • Azure Batch設定 ( cluster.json )

    • クレデンシャル設定 ( credential.json ) > generateClusterConfig("cluster.json") [1] "A cluster settings has been generated c:/Users/User/desktop/cluster.json. Please enter your cluster specification." [1] "Note: To maximize all CPU cores, set the maxTasksPerNode property up to 4x the number of cores for the VM size." > generateCredentialsConfig("credentials.json") [1] "A config file has been generated c:/Users/User/desktop/credentials.json. Please enter your Batch credentials." 13
  8. (3) 設定ファイルの書き出しと修正 • Azure Batch設定。そのままでも良いが、 maxTasksPerNode = 2にするほうが良い • クレデンシャル。

    BatchとストレージのKeyなどを設定 低優先VM数 優先VM数 VMクラスと ノードあたりのタスク 各ノードに 読ませるパッケージ Azure Batchの アカウントとKeyとURL Azure Storageの アカウントとKey 14
  9. (4) プログラム作成・実行 # Azureクレデンシャルをセット setCredentials("credentials.json") # Azure Batchプールを登録。存在しない場合はこの操作で新しいプールが作成される。 cluster <-

    makeCluster("cluster.json") # Azure BatchプールをParallelバックエンドとして登録 registerDoAzureParallel(cluster) # Parallelバックエンドのワーカー数を表示(コア数相当) getDoParWorkers() # Azure Batchプールを削除 stopCluster(cluster) 15
  10. サンプル処理の比較 • サンプル処理 • モンテカルロっぽい • 1825日分をランダムウォーク • 10万件計算x50セット実施 •

    50セットが並列処理対象 16 100円スタートで ちょっと上昇気味の ランダムウォーク 1825日後の値を ベクトルに取得 x100,000件 を50セット 左図の作成 (30系列だけ) 上記と同じ動きで 1825日目だけ 返す関数 foreachで50回呼び出し 500万件のベクトルを返す シミュレーション パラメータ
  11. サンプル処理の比較 • とりあえず設定ファイルをいじっていろいろ試してみた 17 # 処理条件 クラス(コア) maxTasks PerNode ノード

    実施時間(sec.) 専有 低優先 準備 計算実施 合計 1 比較用(PC) i7-6700HQ(4core) 1 4 (100%) (100%) 2 設定ファイル(Default) ※Tasks/Nodeだけ倍 Standard D2 V2(2core) 2 3 3 (40.94%) (22.46%) (63.4%) 3 ノード倍 Standard D2 V2(2core) 2 6 6 (40.94%) (14.89%) (55.8%) 4 ノードあたりタスク倍 Standard D2 V2(2core) 4 6 6 (40.94%) (14.76%) (55.7%) 5 VMクラスアップ 低優先コア48利用 Standard D4 V2(8core) 8 0 6 (37.47%) (10.92%) (48.3%) 6 初期クォータ限界 専有20 / 低優先50 Standard D2 V2(2core) 2 10 25 (45.16%) (8.81%) (53.9%)
  12. サンプル処理の比較に関する考察 • 使うことで反復処理は速くなるが、ノード準備の時間がかかる。 そのオーバーヘッドを勘案しても効果が見込める場合に使うべき • ノード準備は専有コア→低優先コアを順番に準備する様子・・・ 片側に寄せるとノード準備時間が短い?? • ワーカー数を倍にしても倍のパフォーマンスがでるわけではない。 •

    マシンクラス(=ノードあたりのコア数)を上げないと、 1ノードあたりのタスク数を増やしても効果がない。 • 元が50ループなので、25コア以上にした時は効果が薄い? • やみくもにVMクラスを上げたりコアを増やすのではなく、 処理を勘案して分散処理環境を設定したほうが良い感じ。 • 大きくプログラムを変更せずに大規模並列処理にできるのは助かる (しかも安い) 19 ※個人の感想です。
  13. Microsoft R Serverの謎を解く・・・ 解きたい・・・解けるのか・・・ • 潜在能力高そうなのに知られてないMicrosoft R製品。 • SQL Server

    2016 EnterpriseにR Servicesが付属 • 知らずに持っているお客さんがいるかも?活用促進シナリオが必要 • 予測モデルの展開のためのモジュール({mrsdeploy}) • Rのモデル展開環境ってあまり聞いたこと無いんですが・・・ • Azure HDInsightでR Serverを建てて、すぐさま Spark/Hadoop連携させることが出来る • オンプレで環境を作るの大変そうなので、HDInsight連携は便利そう。 • よさそうな導入シナリオを考えてから紹介したい • ドキュメントが薄かった→3月あたりから突然充実し始める(英語) • 鋭意調査中・・・ 21