9 ms·
Faster R with FastR
- shelajev 8y agoThe last graph is a bit hard to read with the log scale. It's 10x improvement from GNU-R to FastR+rJava and another 10x with the native GraalVM interop.
- claytonjy 8y agoMaybe 3-4 years ago there was a big push to speedup R by replacing the runtime; at least 3 competing replacements were talked about pretty actively. None of them achieved much mindshare. R trades runtime speed for dev speed, and we juice performance by writing slow stuff in C++ and linking Intel's MKL. The RStudio folks are also making the low-level stuff faster and more consistent through the r-lib family of packages, which are awesome. Big barriers to adoption here: not a truly drop-in replacement, R people have an aversion to Java (we've all spent hours debugging rJava; luckily most of those packages have been rewritten in C++ now), and nobody likes Oracle. I think the best-case scenario here is that progress on FastR pushes the R-Core team to improve GNU-R.
- truculent 8y agoI never fail to be amazed at all the work the RStudio et al. team do to push R towards the wonderful programming language/environment it could be, rather than what it has been.
- claytonjy 8y agoI'm in the same boat, and would have gladly left R years ago if not for all their efforts
- digitalzombie 8y agoThey recently added terminal to RStudio. I'm so happy not switching between two app Iterm2 and RStudio.
- truculent 8y agoYep. The python support is starting to get pretty decent as well. I much prefer Rmarkdown for R and python (or both at the same time!) for e.g.
- WorkLifeBalance 8y agoThere's also microsoft's R-Open (https://mran.microsoft.com/download https://mran.microsoft.com/download) which I've found is faster than the out of the box R since it supports better multi-threading of commands.
- claytonjy 8y agoIIRC most of that is because they use Intel's MKL and a better BLAS; if you like docker, using the Rocker containers uses the better BLAS, and I think adding MKL isn't too hard either.
- gameswithgo 8y ago> R trades runtime speed for dev speed This claim is made about a lot of things, Ruby, Python etc. I think the important point is it that there is no trade going on. It just that these things are all slower / less efficient than they need to be.
- claytonjy 8y agoMaybe that's true, but I think Julia is the first effort to prove that out in the numerical/statistical world, and while lovely the ecosystem is far behind because of how much newer it is.
- gameswithgo 8y agojavascript showed that dynamically typed languages can be jitted well. It is just hard, and we spread our efforts over so many languages they don't all have the resources to do it.
- pjmlp 8y agoSELF and Dylan were there first.
- claytonjy 8y agosure, but there's plenty of other reasons why JS isn't a contender in this interactive-data-analysis space
- gameswithgo 8y agooh for sure, but for Python/R the barrier to speed isn't any of their important productivity features (as far as I know) but just a high quality compiler/JIT If I was Lord Of Computing I wouldn't let languages out of beta until they had a high quality compiler or JIT. Turns out I am not though.
- greenshackle2 8y ago
- lottin 8y agoI recommend watching this video - Making R run fast https://www.youtube.com/watch?v=HStF1RJOyxI https://www.youtube.com/watch?v=HStF1RJOyxI It's a little disappointing, because the conclusion is that R will probably never "run fast", but very interesting nonetheless.
- nerdponx 8y agoGreat talk, thank you.
- truculent 8y agoAt this point, the tidyverse packages probably cover >90% of my data analysis workflow, so it'd be great to see all of those compatible with FastR. I'd guess tidyr and dplyr would be the trickiest, and dplyr is already being being worked on! Great work, thank you for sharing.
- steve_s 8y agoFastR can actually run all tests of the development version of dplyr with a simple patch. We're working on removing the need for that patch altogether. data.table is a different beast and we will probably provide and maintain patched version for FastR. They do things like casting data of internal R structure to byte array and then memcopy it to another R structure. This is very tricky to emulate if your data structures actually live on Java side and you're handing out only some handles to the native code.
- truculent 8y agoThat's awesome! Personally, I don't use data.table much/at all, so (selfishly) that's not an issue for me.
- WhompingWindows 8y ago"Moreover, support for dplyr and data.table are on the way. " Well, I can't really use it in my day to day work, since that almost always involves cleaning and munging via one of those two packages. And it's not like ggplot2 is where my R code is most delayed, usually I'm working on aggregate data or perhaps a very much smaller analytical dataset which requires much less speed for plotting. My hang-ups are in initial munging phases where the data is still very large, which often calls for data.table over dplyr due to the latter's much slower performance.
- ekianjo 8y agoYeah, data.table provides already significant speedup vs dplyr - so much that the "better" syntax of dplyr makes no sense anymore when you have to deal with very large datasets. But maybe FastR can somewhat change that?
- jsmith99 8y agoYou can use dplyr syntax on data tables, usually with data table speed, especially if you load dtplyr.
- tfehring 8y agoHow large are we talking? I haven't had any problems with dplyr performance as long as my data fits in main memory. (I have 16GB, so that means single digit GB data frames at most - I realize that doesn't qualify as "very large".) It does slow down considerably for larger data sets, but I assumed that that was because it was hitting the pagefile.
- nerdponx 8y agoIt'd be great to have something like Numba for R, where you can write a restricted subset of R and have it JIT compiled to native code. That, or something like Cython where, instead of writing inline C++, you translate a restricted subset of R to C, which is then compiled.
- thanatropism 8y agoThat R is still around while not enjoying the wide array of benefits of general-purpose programming languages is impressive. It must truly have pluses that Python users don't even dream about. E.g. can you quickly spin up a REST-like HTTP interface for your goods?
- ChrisRackauckas 8y agoRStudio is pretty amazing for interactive statistical work. Also, A lot of open source developers tend to ignore Windows, but the less technical users are on Windows, and so proper Windows support is a key win. R's CRAN has a very clean documentation system and the setup for packages ensures that most things work on Windows (Windows CI is required). Also, its non-standard evaluation and associated metaprogramming is very integrated into the language, so you can build very intuitive APIs. Most users wouldn't know how to program what you just did, but that doesn't matter since the workflow for the average R user is "package-user" not "package-developer". So while R does have quite a few downsides, there's a lot that other general-purpose programming languages can pull from it.
- RosanaAnaDana 8y agoThe big pluses are the huge range of libraries that make developing analyses easier, faster, and more reproducible. Python has some fine libraries, but its leagues behind whats available in R.
- claytonjy 8y agoYes, R has the now-RStudio-supported plumber package (https://github.com/trestletech/plumber https://github.com/trestletech/plumber), roughly flask for R. There's also opencpu (https://github.com/opencpu/opencpu https://github.com/opencpu/opencpu), though the pros/cons of one vs the other has never been clear to me.
- droelf 8y agoThere is also the xtensor initiative which aims to provide a unified backend for array / statistical computations in C++ and then makes it pretty easy to create bindings to all the data science languages (R, Julia and of course Python). Usually, going to C++ provides a pretty sizeable speedup. https://github.com/QuantStack/xtensor-r https://github.com/QuantStack/xtensor-r https://github.com/QuantStack/xtensor https://github.com/QuantStack/xtensor Disclaimer: I'm one of the core devs.
- claytonjy 8y agoThis is very interesting! Have you gotten any buy-in from the wider R community, is anyone rewriting their packages atop xtensor? Does R 3.5 and ALTREP make such a transition any easier?
- droelf 8y agoI actually can't tell, but it has not yet been significant. It takes quite a bit of time to really get a library like this started. So far we've mostly dealt with people who are using xtensor from C++ or bind it to Python. We've mainly gone through RCpp for the R language, and that has been working great. I don't know about changes in R 3.5 or ALTREP. Is there something we should know/change for it?
- ubiyubix 8y agoThe thing I miss most in R are 64 bit integers. I am aware of the bit64 package, but I would prefer native support.
- ajay-d 8y agoThis is true. Even if you manage to build 2 billion + matrices, with bit64, I don't know any modeling packages that can handle those objects.
- amelius 8y agoCan't you use floats with a large mantissa instead?
- chrisseaton 8y agoThat's going to be less than 64 bits of usable space isn't it? I think the largest integer you can fit in a float precisely is 56 bits.
- amelius 8y agoYeah, but it's still better than a 32 bit integer, I suppose.
- ellisv 8y agoThis article compares FastR to GNU-R v3.4.0 -- but there were some important changes in v3.5.0 (see http://blog.revolutionanalytics.com/2018/04/r-350.html http://blog.revolutionanalytics.com/2018/04/r-350.html). I'm not even sure GNU-R is the most important comparison (although it is an important comparison). How does it compare to R with Intel MKL? How does it compare to other (faster) languages?
- steve_s 8y agoFastR also uses native BLAS and LAPACK libraries. It should be possible to link it with Intel MKL as well. We didn't want to include comparison to R-3.5.X, because FastR itself is based on the base library of 3.4.0, but the results for GNU-R 3.5.1 almost the same as for R-3.4.0. AFAIK ALTREP is not used that much yet inside GNU-R itself. They can now do efficient integer sequences (i.e. 1:1000 does not allocate 1000 integers unless necessary), which would save a little bit of memory in this example, but that's about it. FastR also plans to implement the ALTREP interface for packages. Internally, we've been already using things like compact sequences.
- ellisv 8y agoThis post does a comparison to 3.5.x (and Julia). https://nextjournal.com/sdanisch/fastr-benchmark https://nextjournal.com/sdanisch/fastr-benchmark
- ufo 8y agoIIs there any information about how Graal+FastR are right now with respect to memory usage and warmup speeds? Are these benchmarks for total wall time or just the post-warmup speed?
- steve_s 8y agoThere is a plot of warm-up curves for this specific example. Search for "To make the analysis of that benchmark complete, here is a plot with warm-up curves". However, it is true that the warm-up and memory usage are something we need to improve. We're working on providing native image [1] of FastR. With that, both the warm-up and memory usage shold get close to GNU-R. [1] https://www.graalvm.org/docs/reference-manual/aot-compilation/ https://www.graalvm.org/docs/reference-manual/aot-compilatio...
- lliamander 8y agoI've actually tried porting some existing R applications that are currently run with RApache to Graal to try and get simpler deployment and better/more consistent operational support. Unfortunately at the time the gsub() function was broken, and that broke some of our core logic. Hm... looks like the issue may have been fixed. I'll have to try again.
- steve_s 8y agoPlese open an issue on GitHub if you encounter any more problems with gsub or anything else.
- lliamander 8y agoNext time I try it, if it's still an issue then I will report. Thanks!
- tofflos 8y agoContext ctx = Context.newBuilder("R").allowAllAccess(true).build(); Value rFunction = context.eval("R", "function(table) { " + " table <- as.data.frame(table);" + " cat('The whole data frame printed in R:\n');" + " print(table);" + " cat('---------\n\n');" + " cat('Filter out users with ID>2:\n');" + " print(table[table$id > 2,]);" + "}"); User[] data = getUsers(); rFunction.execute(new UsersTable(data)); The example above combined with "JEP 326: Raw String Literals" and an IDE that understands Java with embedded R code would be cool to play with.
- simondanisch 8y agoIf anyone wants to reproduce the benchmarks, I put them into a reproducible article and added a Julia baseline: https://nextjournal.com/sdanisch/fastr-benchmark https://nextjournal.com/sdanisch/fastr-benchmark