# HG changeset patch # User paugier <pierre.augier@univ-grenoble-alpes.fr> # Date 1612366169 -3600 # Wed Feb 03 16:29:29 2021 +0100 # Node ID fe740f102e65dd610fba565f4c34e3e71b4588f1 # Parent 43776bbcaf5bf08a9c7902072f1f88cf46b14263 First version correspondence.md diff --git a/.hgignore b/.hgignore --- a/.hgignore +++ b/.hgignore @@ -48,3 +48,4 @@ fluidfft_final/Pyfig/fig_classes.svg reply_Zwart2020/paper.tex +reply_Zwart2020/correspondence.tex \ No newline at end of file diff --git a/reply_Zwart2020/Makefile b/reply_Zwart2020/Makefile --- a/reply_Zwart2020/Makefile +++ b/reply_Zwart2020/Makefile @@ -16,4 +16,10 @@ rm -f $(name).pdf letter_contact_NatureAstronomy.pdf: letter_contact_NatureAstronomy.md figs/fig_bench_nbabel_parallel.png header.tex - pandoc -V fontsize=12pt -s letter_contact_NatureAstronomy.md -o letter_contact_NatureAstronomy.pdf \ No newline at end of file + pandoc -V fontsize=12pt -s letter_contact_NatureAstronomy.md -o letter_contact_NatureAstronomy.pdf + +correspondence.tex: correspondence.md figs/fig_bench_nbabel_parallel.png header.tex + pandoc -V fontsize=12pt --natbib -s correspondence.md -o correspondence.tex + +correspondence.pdf: correspondence.tex + $(LATEXMK) correspondence.tex \ No newline at end of file diff --git a/reply_Zwart2020/correspondence.md b/reply_Zwart2020/correspondence.md new file mode 100644 --- /dev/null +++ b/reply_Zwart2020/correspondence.md @@ -0,0 +1,129 @@ +--- +title: "Ecological impact of computing with Python: + education is more important than languages" +bibliography: ./pubs.bib +link-citations: true +lang: en +documentclass: article +numbersections: true +header-includes: + - \include{header} +--- + +\cite{Zwart2020} recently published in Nature Astronomy a comment on **The +ecological impact of high-performance computing in astrophysics**. His main +claim is that the Python programming language represents an issue for the +climate and should be avoided. We will show that scientific programs written in +Python can be very efficient and energy friendly. We argue that human factors +and education are much more important than the choice of languages. + +To support his idea, Zwart presents a benchmark on the N-Body problem with a +very bad and inefficient implementation in Python, running 50 times slower than +a C++ implementation! As Python users concerned about our ecological impact, we +worked on similar benchmarks on the same problem[^1]. In contrast to Zwart, we +(i) also consider efficient implementations in Python and Julia and (ii) +properly measure the energy consumption with dedicated hardware equipped with +wattmeters[^2]. + +[^1]: Our code is available here: <https://github.com/paugier/nbabel>. + +[^2]: The measurements were carried out on Grid'5000 clusters +(<https://www.grid5000.fr>). + +Before focusing on the N-Body problem, let's put it in perspective and recall +what is "Python" and why it is so successful. Indeed, all indicators show that +Python is one of the most used and loved languages for science and data +analysis[^3]. Python is a generalist programming language (quite good for most +tasks) oriented towards communication between humans and fast prototyping. +Reading and writing Python is very accessible and do not require a long +training. There are strong open-source communities using Python and a rich +scientific ecosystem of several efficient libraries. + +[^3]: TODO. References. + +It is worth to understand that in 2020, it is no longer meaningful to separate +languages as being "compiled" or "interpreted". More precisely, many +"interpreted" dynamic languages (for example Julia or Matlab) are actually +partly compiled. Let's recall that compiling code to machine instructions can +be done ahead-of-time (AOT, before the execution) or just-in-time (JIT, during +the execution). Python also has AOT and JIT compilers. However, the most +standard way to execute Python code is to interpret it with a program called +CPython. It is the reference implementation of the language and in 2021, it +still does not have a builtin JIT compiler. Therefore, CPython is relatively +slow which explains Zwart results. However, it is important to realize that +this inefficiency of the interpreter has a weak effect on the overall +performance of most programs. The total elapsed time and the energy consumption +are dominated by hard work done in optimized and efficient libraries. This is +the basic principle of all the scientific Python ecosystem using Numpy. + +This is a very usual situation for which only very few lines of code dominate +the total computation. It is usually known as the 80/20 rule and associated +with two principles: (i) "premature optimization is the root of all evil" and +(ii) "measure, don't guess". These principles also apply for energy efficiency. +For most Python programs, it would be very inefficient and expensive to turn +them fully in C++, with a small gain/cost ratio. + +However, there are also algorithms requiring low-level code. For example, for +the N-Body problem, the computation of the accelerations involves for each +particle a loop on all other particles. Few lines of code are repeated $N^2/2$ +times per timestep. For Zwart benchmark, there are 10000 timesteps and +$N=16384$, so the program is dominated by 1,342,177,280,000 executions of a +simple and inexpensive computation. Using CPython for this very hot loop makes +the whole program very inefficient. Good news for Python, it's very easy to use +efficient alternatives. For this benchmark, we use 3 tools: (i) Pythran, a +Python-Numpy AOT compiler transpiling to C++, (ii) Numba, a Python-Numpy JIT +compiler based on LLVM and (iii) PyPy, an alternative Python interpreter with a +JIT. + +\begin{figure}[ht] +\centerline{\includegraphics[width=0.65\textwidth]{figs/fig_bench_nbabel_parallel}} + +\cprotect\caption{Efficiency in terms of CO$_2$ production and elapsed time for +10 implementations in Python, Julia, C++ and Fortran. Energy consumption +measurements were carried out on Grid'5000 clusters with 2.30 GHz Intel Xeon +E5-2630 processors and converted from kWh to CO$_2$ using 283 g CO$_2$ / kWh. +Optimizations were activated for all implementations with flags like +\verb!-OFast!, \verb!-march=native! and \verb!--check-bounds=no!.} + +\end{figure} + +Figure 1 is equivalent to Figure 3 in Zwart (2020). The CO$_2$ production is +ploted as a function of the elapsed time for 10 implementations. The C++ and +Fortran implementations (green stars) are taken from the website +<http://www.nbabel.org/> and were used by Zwart (2020). Note that these +implementations could have been further optimized. However, we think they are +representative of what many scientists using C++ or Fortran could have +obtained. We consider 3 implementations in Julia (blue circles): "Julia +nbabel.org" is taken from the NBabel website. "Julia optimized" and "Julia +parallel" have been proposed by Julia users after a long discussion[^4] on +Julia's forum. Finally, we consider 5 implementations in Python (red markers). +We would like to emphasize few points: (1) These implementations are fully +written in Python. The core of the algorithm is written in "low level" code. +The implementation using Pythran and Numba are written in Python-Numpy but +Numpy is only used for its arrays as a data-structure and not for advanced +high-level functions. (2) Four implementations in Python are fastest than the +C++ implementation. The simple implementation labelled "Pythran naive" (simple +Numpy code accelerated only by decorating one function with `@transonic.jit`) +is only 5.7 times slower than the optimized version in Julia. (3) All Python +implementations are simpler to reason, read and write than the C++ and Fortran +implementations. + +[^4]: https://discourse.julialang.org/t/nbabel-nbody-integrator-speed-up/ + +The 4 points close to the bottom-left corner correspond to 2 parallel +implementations using Pythran+OpenMP and Julia for 6 and 12 cores. We consider +in Figure 1 the energy consumption of the cores used (6 or 12 for these runs +and 1 for the sequential jobs), which make sense on shared clusters in which +one can reserve only the needed cores. We see that parallelism with threads +speedup the computation but does not decrease too much energy consumption. + +We think that minimizing the ecological impact of scientific computing is +limited by human factors: time, work, knowledge and skills. For example, +scientists have to be able to run heavy computations on shared clusters +optimized in terms of energy consumption. They should also know how to profile +their codes to discover which parts can potentially be optimized. Therefore, +money and time should be invested on educating students and scientists. Our +measurements demonstrate that Python is actually a good solution to easily +obtain good performance with simple and readable codes. Therefore, teaching +efficient Python to scientists and engineers can be profitable to minimize the +overall ecological impact of computing. diff --git a/reply_Zwart2020/figs/fig_bench_nbabel_parallel.png b/reply_Zwart2020/figs/fig_bench_nbabel_parallel.png index edf90ef07fc3c0d91201d1274609c8401845dcab..47c2786a2d752abffa7da0bdda8f9599b86f0416 GIT binary patch literal 47984 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 diff --git a/reply_Zwart2020/header.tex b/reply_Zwart2020/header.tex --- a/reply_Zwart2020/header.tex +++ b/reply_Zwart2020/header.tex @@ -46,3 +46,5 @@ \usepackage{titling} \setlength{\droptitle}{-10mm} + +\usepackage{cprotect} \ No newline at end of file diff --git a/reply_Zwart2020/letter_contact_NatureAstronomy.md b/reply_Zwart2020/letter_contact_NatureAstronomy.md --- a/reply_Zwart2020/letter_contact_NatureAstronomy.md +++ b/reply_Zwart2020/letter_contact_NatureAstronomy.md @@ -70,7 +70,7 @@ - There is no drastically inefficient implementation. Even the simple implementation labelled "Pythran naive" (simple Numpy code accelerated only by decorating one function with `@jit`) is only 5.7 times slower than the -optimized version in Julia, and not by several orders of magnitude. +optimized version in Julia, and not by orders of magnitude. - All Python implementations considered in this benchmark are simpler to reason, read and write than the C++ and Fortran implementations. These diff --git a/reply_Zwart2020/paper.md b/reply_Zwart2020/paper.md --- a/reply_Zwart2020/paper.md +++ b/reply_Zwart2020/paper.md @@ -77,7 +77,7 @@ First, one can note that the article is based on only one particular problem (N-Body). Most of the time spent in one function of few lines (two loops). It -is the case in most real codes but one need to keep this in mind when +is the case in most real codes but one needs to keep this in mind when interpreting the results. The benchmark seems tailored to give a bad result for Python. @@ -99,9 +99,20 @@ because of 2 differences in the codes. There is an algorithm problem in the C++ code and big floats are used in the Fortran code. -We now turn to the presentation of 4 other implementations written only in +We now turn to the presentation of 5 other implementations written only in Python. +- **nbabel/py/bench_pypy_Point.py** contains a pure Python implementation +running the 1024 particles case with PyPy in 151 s, i.e. only 3 times slower +than the C++ implementation (compared to ~50 times slower as shown in the +figure taken from Zwart, 2020). + +What is PyPy. PyPy is very promissing. However, PyPy is slow for codes using +Python extensions using the CPython C-API (in particular Numpy). And pure +Python as a language is not well adapted for very high performance computing. +Classes and objects defined in pure Python are too dynamical. There is no +homogeneous container. + - **nbabel/py/bench_numba.py** is a quite simple Numpy-Numba implementation. We measure it to be 20% faster than the C++ implementation. Therefore, we think there is a problem with the point in figure 3 of \cite{Zwart2020} which show @@ -139,16 +150,7 @@ Just with these small modifications, we obtained very high performance (see figure). ... -- **nbabel/py/bench_pypy_Point.py** contains a pure Python implementation -running the 1024 particles case with PyPy in 151 s, i.e. only 3 times slower -than the C++ implementation (compared to ~50 times slower as shown in the -figure taken from Zwart, 2020). - -What is PyPy. PyPy is very promissing. However, PyPy is slow for codes using -Python extensions using the CPython C-API (in particular Numpy). And pure -Python as a language is not well adapted for very high performance computing. -Classes and objects defined in pure Python are too dynamical. There is no -homogeneous container. +- **nbabel/py/bench_omp.py** ## What is "Python used for science and data"?