{"id":1928,"date":"2016-02-12T10:34:05","date_gmt":"2016-02-12T15:34:05","guid":{"rendered":"http:\/\/bioinfo.iric.ca\/fr\/?p=1928"},"modified":"2016-11-08T09:30:07","modified_gmt":"2016-11-08T14:30:07","slug":"plus-rapide-version-r","status":"publish","type":"post","link":"https:\/\/bioinfo.iric.ca\/fr\/plus-rapide-version-r\/","title":{"rendered":"Qu \u2019est-ce qui est le plus rapide? Version R"},"content":{"rendered":"<p>Quand j&rsquo;ai commenc\u00e9 \u00e0 utiliser R, il y a une dizaine d&rsquo;ann\u00e9es, la communaut\u00e9 d&rsquo;utilisateurs \u00e9tait beaucoup plus petite! Il n&rsquo;y avait pas de sites comme <a href=\"http:\/\/R-bloggers\">R-bloggers<\/a> pour s&rsquo;inspirer ni de ggplot2 pour faire de beaux graphiques.  Et c&rsquo;\u00e9tait les d\u00e9buts d&rsquo;une impl\u00e9mentation alternative de R (autre que celle de CRAN) connue sous le nom de Revolution R de la compagnie Revolution Analytics.  Revolution R tentait surtout de s\u00e9duire les compagnies en offrant un R plus performant et plus rapide.  Ils offraient aussi une version gratuite et accessible (<em>open source<\/em>) de leur produit appel\u00e9e RRO. <\/p>\n<p>En avril 2015, la compagnie a \u00e9t\u00e9 achet\u00e9e par Microsoft!  Qui sait, peut-\u00eatre qu&rsquo;un jour, nous pourrons utiliser R dans Excel au lieu d&rsquo;utiliser Visual Basics. On verra!<\/p>\n<p>En attendant, j&rsquo;ai d\u00e9cid\u00e9 de tester RRO, maintenant renomm\u00e9e MRO (Microsoft R Open) pour voir si j&rsquo;obtenais de meilleures performances dans le genre d&rsquo;analyses que je fais quotidiennement.  Un  <a href=\"https:\/\/mran.revolutionanalytics.com\/documents\/rro\/multithread\/\" target=\"_blank\">banc d&rsquo;essai<\/a> est disponible (r\u00e9sultats et code) sur le site de la compagnie pour montrer exactement quel type de gain peut \u00eatre obtenu en utilisant leur impl\u00e9mentation parall\u00e9lis\u00e9e.  J&rsquo;ai quand m\u00eame d\u00e9cid\u00e9 de la tester, car ces op\u00e9rations ne sont pas n\u00e9cessairement les op\u00e9rations que j&rsquo;utilise le plus.<\/p>\n<p><center><\/p>\n<div class=\"fusion-fullwidth fullwidth-box fusion-builder-row-1 hundred-percent-fullwidth non-hundred-percent-height-scrolling\" style=\"--awb-border-radius-top-left:0px;--awb-border-radius-top-right:0px;--awb-border-radius-bottom-right:0px;--awb-border-radius-bottom-left:0px;--awb-overflow:visible;--awb-flex-wrap:wrap;\" ><div class=\"fusion-builder-row fusion-row\"><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-0 fusion_builder_column_1_1 1_1 fusion-one-full fusion-column-first fusion-column-last fusion-column-no-min-height\" style=\"--awb-bg-size:cover;--awb-margin-bottom:0px;\"><div class=\"fusion-column-wrapper fusion-flex-column-wrapper-legacy\"><div id=\"attachment_1867\" style=\"width: 550px\" class=\"wp-caption aligncenter\"><img decoding=\"async\" aria-describedby=\"caption-attachment-1867\" class=\"size-full wp-image-1867\" src=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/02\/bench1.d70e631d.png\" alt=\"Provenant du site de Revolution Analytic\" width=\"540\" height=\"250\" srcset=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/02\/bench1.d70e631d-300x139.png 300w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/02\/bench1.d70e631d-768x357.png 768w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/02\/bench1.d70e631d-1024x475.png 1024w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/02\/bench1.d70e631d.png 1079w\" sizes=\"(max-width: 540px) 100vw, 540px\" \/><p id=\"caption-attachment-1867\" class=\"wp-caption-text\">From Revolution Analytic website<\/p><\/div>\n<\/center><br \/>\nJ&rsquo;ai donc cr\u00e9\u00e9 mon propre petit banc d&rsquo;essai.  J&rsquo;ai utilis\u00e9 un fichier R Markdown pour que mes r\u00e9sultats soient joliment format\u00e9s en un document HTML (sortie en pdf ou Word est aussi possible).  J&rsquo;ai roul\u00e9 mon banc d&rsquo;essai en utilisant MRO 3.2.3 et le R 3.2.2 de CRAN.  Je l&rsquo;ai roul\u00e9 sur mon ordinateur avec 4 coeurs. Les sortie html sont disponibles <a href=\"https:\/\/bioinfo.iric.ca\/~boucherg\/blog\/benchmark-RRO\/\">ici<\/a>.<\/p>\n<p>Vous vous souvenez peut-\u00eatre de <a href=\"https:\/\/bioinfo.iric.ca\/fr\/quest-ce-qui-est-le-plus-rapide\/\">l&rsquo;article que j&rsquo;avais \u00e9crit pour mesurer quel bout de code est le plus rapide en python<\/a>?  On peut faire la m\u00eame chose en R!<br \/>\nIl y a deux fonctions simples pour mesurer le temps que prend un bout de code ou une fonction : <code>proc.time()<\/code> et code>system.time()<\/code>. Vous pouvez les utiliser comme ceci :<\/p>\n<pre><code> \r\n# Principal Component Analysis \r\nm <- 10000\t \t \r\nn <- 2000\t \t \r\nA <- matrix (runif (m*n),m,n)\t \t \r\nsystem.time (P <- prcomp(A)) \t \t \r\n## or \t \t \r\nptm <- proc.time()\t \t \r\nP <- prcomp(A)\t \t \r\nproc.time() - ptm\t \t \r\n# user system elapsed \t \t \r\n# 122.594 1.122 123.583 \t \t \r\n#The \u2018user time\u2019 is the CPU time charged for the execution of user instructions of the calling process. \t \t \r\n#The \u2018system time\u2019 is the CPU time charged for execution by the system on behalf of the calling process.<\/code><\/pre>\n<p>Toutefois, nous voulons parfois r\u00e9cup\u00e9rer un peu plus de d\u00e9tails pour identifier les \u00e9tapes qui prennent le plus de temps.  Le package R <strong>timeit<\/strong> nous permet de faire cela facilement.  <code>timeit<\/code> est en fait un profileur (<em>profiler<\/em>). On l'utilise de la m\u00eame fa\u00e7on que pour <code>system.time <\/code>. <\/p>\n<pre><code> \r\nt0 <- timeit (P <- prcomp(A), replications=1, times=1)\t \r\n\t\r\n#                  self.time     self.pct total.time    total.pct mem.total replications iteration\r\n# \"La.svd\"             98.34 78.994296731      98.65 28.320032152     488.4            1         1\r\n# \"%*%\"                25.27 20.298819182      25.27  7.254406614     152.6            1         1\r\n# \"matrix\"              0.23  0.184753795       0.23  0.066027444     183.1            1         1\r\n# \"array\"               0.16  0.128524379       0.16  0.045932135     152.6            1         1\r\n# \"aperm.default\"       0.14  0.112458832       0.14  0.040190618     152.6            1         1\r\n# \"is.finite\"           0.11  0.088360511       0.11  0.031578343     152.6            1         1\r\n# \"colMeans\"            0.08  0.064262190       0.08  0.022966068       0.0            1         1\r\n# \"svd\"                 0.05  0.040163869      98.81 28.365964288     671.5            1         1\r\n# \"any\"                 0.04  0.032131095       0.04  0.011483034       0.0            1         1\r\n# \"t.default\"           0.03  0.024098321       0.03  0.008612275      30.5            1         1\r\n# \"sweep\"               0.02  0.016065547       0.32  0.091864271     305.2            1         1\r\n# \"prcomp.default\"      0.01  0.008032774     124.49 35.738071999    1159.9            1         1\r\n# \"as.matrix\"           0.01  0.008032774       0.01  0.002870758       0.0            1         1\r\n\r\n <\/code><\/pre>\n<p>Les deux premi\u00e8res colonnes sont celles qui nous int\u00e9ressent.  <code>self.time<\/code> et <code>self.pct<\/code> pr\u00e9sentent respectivement le temps en secondes et le pourcentage du temps total que prend l'ex\u00e9cution du code d\u00e9fini en rang\u00e9e.<\/p>\n<p>Dans ma sortie, vous pouvez voir toutes les \u00e9tapes requises par une analyse en composantes principles et le temps et la m\u00e9moire qu'elles utilisent.  Pour \u00e9tudier du code s'ex\u00e9cutant tr\u00e8s rapidement, les param\u00e8tres \"replications\" et \"iteration\" sont tr\u00e8s utiles.  Dans la sortie pr\u00e9sent\u00e9e plus haut, on peut voir que <code>prcomp<\/code> utilisent les fonctions <code>any<\/code> et <code>as.matrix<\/code> et qu'elles s'ex\u00e9cutent tr\u00e8s rapidement contrairement \u00e0 <code>%*%<\/code> et <code>La.svd<\/code> qui sont plus co\u00fbteuses.  Pour conna\u00eetre le temps d'ex\u00e9cution total, nous pouvons faire la somme de la colonne <code>self.time column<\/code>.<\/p>\n<pre><code> \r\nsum(t0$self.time)\r\n#123.51\r\n<\/code><\/pre>\n<p>Voici quelques r\u00e9sultats que j'ai obtenus.  J'ai d'abord utilis\u00e9 l'exemple pour la PCA fourni sur le site de Revolution Analytics; PCA sur une matrice de 2000 x 10000.  Dans ce cas-ci, MRO est clairement plus rapide (27.8 vs 129.3 secondes!!).  C'\u00e9tait un peu moins clair lorsque j'ai fait la PCA sur mes propres donn\u00e9es (66 x 137032)  qui comportaient seulement 66 rang\u00e9es au lieu de 2000 (2.02 vs 2.26 secondes).  Pour les autres op\u00e9rations, elles b\u00e9n\u00e9ficient peu d'une impl\u00e9mentation en parall\u00e8le. En fait, selon les gens de MRO, la r\u00e9gression lin\u00e9aire, le produit vectoriel tout comme le calcul du d\u00e9terminant et la d\u00e9composition de Cholesky sont des op\u00e9rations qui b\u00e9n\u00e9ficient beaucoup de l'utilisation d'op\u00e9rations parall\u00e9lis\u00e9es.  Comme on peut s'y attendre, la cr\u00e9ation\/manipulation\/transformation de matrices tout comme les boucles et la r\u00e9cursion ne profitent d'aucun gain. Ce sont des op\u00e9rations qui ne sont pas vraiment parall\u00e9lisables.<\/p>\n<p>&nbsp;<\/p>\n<table border=\"1\">\n<thead>\n<tr>\n<th>Task<\/th>\n<th>Time (seconds)<br \/>\nCRAN R<\/th>\n<th>Time (seconds)<br \/>\nMRO<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>PCA <div class=\"fusion-clearfix\"><\/div><\/div><\/div><div class=\"fusion-layout-column fusion_builder_column fusion-builder-column-1 fusion_builder_column_1_1 1_1 fusion-one-full fusion-column-first fusion-column-last fusion-column-no-min-height\" style=\"--awb-bg-size:cover;--awb-margin-bottom:0px;\"><div class=\"fusion-column-wrapper fusion-flex-column-wrapper-legacy\">[2000x10000]- MRO example-<\/td>\n<td>123.51<\/td>\n<td>19.85<\/td>\n<\/tr>\n<tr>\n<td>PCA [66x137032]<\/td>\n<td>2.26<\/td>\n<td>2.02<\/td>\n<\/tr>\n<tr>\n<td>PCA - transposed matrix<\/td>\n<td>2.94<\/td>\n<td>5.56<\/td>\n<\/tr>\n<tr>\n<td>apply(2, as.numeric)<\/td>\n<td>0.29<\/td>\n<td>0.32<\/td>\n<\/tr>\n<tr>\n<td>matrix construction (with an if statement) -rbind<\/td>\n<td>1.43<\/td>\n<td>1.64<\/td>\n<\/tr>\n<tr>\n<td>matrix construction (with an if statement) -assignment<\/td>\n<td>1.03<\/td>\n<td>1.12<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<table>\n<tbody>\n<tr>\n<td><img decoding=\"async\" class=\"size-full wp-image-1903\" src=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/02\/t5.png\" alt=\"Example from MRO benchmark\" width=\"435\" height=\"388\" \/><\/td>\n<td><img decoding=\"async\" class=\"size-full wp-image-1904\" src=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/02\/t1.png\" alt=\"PCA on a 66 x 137032 data matrix \" width=\"435\" height=\"388\" \/><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>&nbsp;<\/p>\n<p>Un fait int\u00e9ressant, avec le profileur, nous pouvons voir que construire une matrice en utilisant une boucle <code>for<\/code>, <code>rbind<\/code> et une condition (bleu pour les valeurs plus grandes que 4 par exemple, sinon noir) n'implique pas les m\u00eames fonctions internes selon l'impl\u00e9mentation utilis\u00e9e.<\/p>\n<p><img decoding=\"async\" class=\"aligncenter size-full wp-image-1919\" src=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/02\/t3-1.png\" alt=\"t3\" width=\"770\" height=\"588\" srcset=\"https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/02\/t3-1-180x138.png 180w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/02\/t3-1-300x229.png 300w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/02\/t3-1-768x586.png 768w, https:\/\/bioinfo.iric.ca\/wpbioinfo\/wp-content\/uploads\/2016\/02\/t3-1.png 770w\" sizes=\"(max-width: 770px) 100vw, 770px\" \/><div class=\"fusion-clearfix\"><\/div><\/div><\/div><\/div><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Quand j&rsquo;ai commenc\u00e9 \u00e0 utiliser R, il y a une dizaine d&rsquo;ann\u00e9es, la communaut\u00e9 d&rsquo;utilisateurs \u00e9tait beaucoup plus petite! Il n&rsquo;y avait pas de sites comme R-bloggers pour s&rsquo;inspirer ni de ggplot2 pour faire de beaux graphiques. Et c&rsquo;\u00e9tait les d\u00e9buts d&rsquo;une impl\u00e9mentation alternative de R (autre que celle de CRAN) connue sous le nom de Revolution R de la compagnie Revolution Analytics. Revolution R tentait surtout de s\u00e9duire les compagnies en offrant un R plus performant et plus rapide. <a href=\"https:\/\/bioinfo.iric.ca\/fr\/plus-rapide-version-r\/\"> [&#8230;]<\/a><\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[32,24],"tags":[],"class_list":["post-1928","post","type-post","status-publish","format-standard","hentry","category-performance-fr-2","category-langage-r"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/1928","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/comments?post=1928"}],"version-history":[{"count":10,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/1928\/revisions"}],"predecessor-version":[{"id":2713,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/posts\/1928\/revisions\/2713"}],"wp:attachment":[{"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/media?parent=1928"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/categories?post=1928"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/bioinfo.iric.ca\/fr\/wp-json\/wp\/v2\/tags?post=1928"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}