Installation guide

This page is a guide for installing and executing FEW tests on most platforms and some clusters available to members of the user community.

Last updated in March 2025 just after the release of FastEMRIWaveforms v2.0.0rc1. If you read this page at a significantly latter date, note that these instructions might be outdated.

Note that most instructions are common for both package installations (using the wheels available on PyPI) and from-source installations (using a local copy of sources). In following instructions, from-source installations are always made in editable mode where you can modify sources on the fly and these changes are taken into account in the python environment. To disable this editable mode (and thus be able to delete the source directory whilst keeping access to FEW in python), simply remove the -e option from the pip install commands in the from-source installation instructions.

If the from-source installation instructions do not work in your environment, retry by adding the options -v -Cbuild.verbose=true -Clogging.level=INFO to the pip install -e . command to obtain detailed information about the cause of failure.

On Mac OS with Apple Silicon CPU (M1 to M4)

The preferred way to install FastEMRIWaveforms on a Mac OSX workstation is by using a conda environment. Following instructions were tested with a MacBook Pro with a Apple M4 Pro CPU on macOS Sequoia 15.3. conda was installed using brew install miniconda.

Preliminary steps

Create a new conda environment few2.0rc1 and activate it:

$ conda create -n few2.0rc1 python=3.12 --channel conda-forge --override-channels
$ conda activate few2.0rc1
(few2.0rc1) $ conda config --env --add channels conda-forge

Note that, to ensure having up-to-date compilers, we force the use of the conda-forge channel.

Perform a from-source install

Clone FEW and checkout the v2.0.0rc1 tag:

(few2.0rc1) $ git clone https://github.com/BlackHolePerturbationToolkit/FastEMRIWaveforms.git
(few2.0rc1) $ cd FastEMRIWaveforms
(few2.0rc1) $ git checkout v2.0.0rc1

With automatic LAPACK(E) fetching

This first method will automatically download the sources of LAPACK and LAPACKE, and compile them along with FEW. For that, you will need a Fortran compiler as well as a C++ compiler:

(few2.0rc1) $ conda install cxx-compiler fortran-compiler

By default, the FEW installation process will try to detect LAPACK in your environment using the CMake FindLapack feature which, on macOS, can link to the XCode Accelerated framework. This results in a non-working FEW installation. To prevent that, disable completely LAPACK detection:

(few2.0rc1) $ pip install -e '.[testing]' -Ccmake.define.FEW_LAPACKE_DETECT_WITH=NONE
Successfully installed [...] fastemriwaveforms-2.0.0rc1 [...]

With conda-installed LAPACK

As of March 2025, the default conda-forge::lapack package has version v3.9.0 and does not install the development files required for FEW compilation. We will instead use the lapack_rc package, in version v3.11.0 which does work as expected.

First, install a C++ compiler and the LAPACK package:

(few2.0rc1) $ conda install cxx-compiler pkgconfig conda-forge/label/lapack_rc::liblapacke

Then run FEW installation from source:

(few2.0rc1) $ pip install -e '.[testing]'
Successfully installed [...] fastemriwaveforms-2.0.0rc1 [...]

Perform a package install

To install the package directly from PyPI, simply run:

(few2.0rc1) $ pip install --pre fastemriwaveforms==2.0.0rc1
...
Successfully installed [...] fastemriwaveforms-2.0.0rc1 [...]

Configure file storage

Execute the following command to write a configuration file in ~/Library/Application Support/few.ini which specifies that FEW files must be downloaded in ~/few:

(few2.0rc1) $ cat << EOC > ~/Library/Application\ Support/few.ini
[few]
file-storage-dir=/Users/${USER}/few
file-extra-paths=/Users/${USER}/few;/Users/${USER}/few/download
EOC

Now, you may run the folowwing command to pre-download all files required for test execution. If you don’t run this command, files will still be downloaded during test execution:

(few2.0rc1) $ few_files fetch --tag testfile
Downloading all missing files tagged 'testfile' into '/Users/my_user_name/few/download'
Downloading 'AmplitudeVectorNorm.dat'... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
Downloading 'FluxNewMinusPNScaled_fixed_y_order.dat'... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
...
Downloading 'ZNAmps_l10_m10_n55_DS2Outer.h5'... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00

Run tests

Execute the package tests suite to ensure that everything works as expected:

(few2.0rc1) $ python -m few.tests
AAKWaveform test is running with backend 'cpu'
[...]
.......
----------------------------------------------------------------------
Ran 27 tests in 87.305s

OK

On Windows

Attention

For now, only from-source installations are possible on Microsoft Windows. The compilation of backends on Windows is less stable than on other platforms. Try at your own risk!

Preliminary steps

Ensure you have a recent Microsoft Visual Studio release installed locally. Tests were performed with Visual Studio 2022 Community Edition.

Create a new conda environment few2.0rc1 and activate it:

$ conda create -n few2.0rc1 python=3.12 --channel conda-forge --override-channels
$ conda activate few2.0rc1
(few2.0rc1) $ conda config --env --add channels conda-forge

Like for Mac OS, we force here the use of the conda-forge channel.

Install the required dependencies in the conda environment:

(few2.0rc1) $ conda install cxx-compiler conda-forge/label/lapack_rc::liblapacke pkgconfig

Perform a from-source install

Clone FEW and checkout the Kerr_Equatorial_Eccentric branch (Windows installation using MSVC was not working at the time v2.0.0rc1 was released):

(few2.0rc1) $ git clone https://github.com/BlackHolePerturbationToolkit/FastEMRIWaveforms.git
(few2.0rc1) $ cd FastEMRIWaveforms
(few2.0rc1) $ git checkout Kerr_Equatorial_Eccentric

Then run FEW installation from source:

(few2.0rc1) $ pip install -e '.[testing]'
Successfully installed [...] fastemriwaveforms-2.0.0rc1.post1.dev1+ge0c124b.d20250304 [...]

Run tests

Execute the package tests suite to ensure that everything works as expected:

(few2.0rc1) $ python -m few.tests
AAKWaveform test is running with backend 'cpu'
[...]
.......
----------------------------------------------------------------------
Ran 27 tests in 87.305s

OK

On CNES cluster, with GPU and jupyter hub supports

Preliminary steps

First, log into the TREX cluster and request an interactive session on a GPU node:

# Here with the "lisa" project and a session of 1h
$ sinter -A lisa -p gpu_std -q gpu_all --gpus 1 --time=01:00:00 --pty bash

On the GPU node, load the conda module and create a new conda environment named few2.0rc1, then activate it:

$ module load conda/24.3.0
$ conda create -n few2.0rc1 python=3.12
$ conda activate few2.0rc1

Perform a from-source install

Clone FEW and checkout the v2.0.0rc1 tag:

(few2.0rc1) $ git clone https://github.com/BlackHolePerturbationToolkit/FastEMRIWaveforms.git
(few2.0rc1) $ cd FastEMRIWaveforms
(few2.0rc1) $ git checkout v2.0.0rc1

Load the nvhpc modules access the CUDA compiler, as well as the cuda module:

(few2.0rc1) $ module load cuda/12.4.1
(few2.0rc1) $ module load nvhpc/22.9

Install FEW and force the CUDA backend compilation with the option FEW_WITH_GPU=ON:

(few2.0rc1) $ CXX=g++ CC=gcc pip install -e '.[testing]' --config-settings=cmake.define.FEW_WITH_GPU=ON
...
Successfully installed fastemriwaveforms-2.0.0rc1
(few2.0rc1) $ pip install cupy-cuda12x nvidia-cuda-runtime-cu12==12.4.* # Must be installed manually when installed from source

Perform a package install

To install the package directly from PyPI, simply run:

(few2.0rc1) $ pip install --pre fastemriwaveforms-cuda12x==2.0.0rc1
(few2.0rc1) $ pip install nvidia-cuda-runtime-cu12==12.4.*

Test FEW is working correctly

Check that the code is properly installed and working by running the tests. Note that the tests will automatically download required files. It is then advised create a configuration file to specify where the files should be downloaded. It is strongly advised to use a high-volumetry storage space for that purpose, like project shared-spaces on /work/ If you have access to the LISA project, you can for example use the following:

$ mkdir /work/LISA/${USER}/few_files
# Write FEW configuration into ~/.config/few.ini
$ cat << EOC > ~/.config/few.ini
[few]
file-storage-dir=/work/LISA/${USER}/few_files
EOC

Then actually run the tests:

(few2.0rc1) $ python -m few.tests
AAKWaveform test is running with backend 'cuda12x'
DetectorWave test is running with backend 'cuda12x'
...
----------------------------------------------------------------------
Ran 20 tests in 198.041s

The messages should indicate that they use the cuda12x backend. If that’s not the case, but instead use the cpu backend. Run the following command to get the reason why the cuda12x backend cannot be loaded:

$ python
>>> import few
>>> few.get_backend("cuda12x")
# Example of possible output:
Traceback (most recent call last):
...
cupy_backends.cuda.libs.nvrtc.NVRTCError: NVRTC_ERROR_COMPILATION (6)

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
...
cupy.cuda.compiler.CompileException: /work/scratch/.../few2.0rc1/lib/python3.12/site-packages/cupy/_core/include/cupy/_cuda/cuda-12.4/cuda_fp16.h(129): catastrophic error: cannot open source file "vector_types.h"
  #include "vector_types.h"
                           ^

1 catastrophic error detected in the compilation of "/tmp/slurm-33342263/tmpq7dhwrdi/359445603dea8ee27f67d9bc57b875940bbb321b.cubin.cu".
Compilation terminated.


The above exception was the direct cause of the following exception:

Traceback (most recent call last):
                                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
...
few.cutils.MissingDependencies: CuPy fails to run due to missing CUDA Runtime.
    If you are using few in an environment managed using pip, run:
        $ pip install nvidia-cuda-runtime-cu12

Note that you can also pre-download the files before running the tests with:

# Predownload the files requires by tests (not necessary, they will be pulled during tests in all cases)
$ few_files fetch --tag testfile
Downloading all missing files tagged 'testfile' into '/work/LISA/my_user_name/few_files/download'

Downloading 'AmplitudeVectorNorm.dat'... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
Downloading 'FluxNewMinusPNScaled_fixed_y_order.dat'... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
Downloading 'SchwarzschildEccentricInput.hdf5'... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:03
Downloading 'Teuk_amps_a0.0_lmax_10_nmax_30_new.h5'... ━━━━━━╸━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━  17% 0:00:24
...

You may also restrict FEW to the cpu backend with:

(few2.0rc1) $ FEW_ENABLED_BACKENDS="cpu" python -m few.tests
AAKWaveform test is running with backend 'cpu'
DetectorWave test is running with backend 'cpu'
...
----------------------------------------------------------------------
Ran 27 tests in 405.23s

Make the conda environment available as a Jupyter Hub kernel

Now that few is working as expected, let’s enable support for Jupyter Hub. First install ipykernel and declare a new kernel named few2.0rc1:

(few2.0rc1) $ conda install ipykernel
(few2.0rc1) $ python -m ipykernel install --user --name few2.0rc1
Installed kernelspec few2.0rc1 in ~/.local/share/jupyter/kernels/few2.0rc1

Next, we need to create a python wrapper to preload the modules in the Python context:

(few2.0rc1) $ python_wrapper_path=$(dirname $(which python))/wpython
(few2.0rc1)$ cat << EOC > ${python_wrapper_path}
#!/bin/bash

# Load the necessary modules
module load cuda/12.4.1
module load nvhpc/22.9

# Run the python command
$(which python) \$@
EOC

$ chmod +x ${python_wrapper_path}

And change the kernel start command to use this wrapper: edit the file ~/.local/share/jupyter/kernels/few2.0rc1/kernel.json and replace the first item in the argv field by replacing .../bin/python with .../bin/wpython.

Now, when connected to the CNES Jupyter Hub, you should have access to the few2.0rc1 kernel and FEW should work correctly in it.

On the CC-IN2P3 cluster with GPU support

Preliminary steps

First log into the CC-IN2P3 cluster and request an interactive session on a GPU node:

# Here a 2h session with 64GB of RAM
$ srun -p gpu_interactive -t 0-02:00 --mem 64G --gres=gpu:v100:1 --pty bash -i

On the GPU node, load the python module and create a virtual environment named few2.0rc1, then activate it:

$ module load Programming_Languages/python/3.12.2
$ python -m venv few2.0rc1
$ source ./few2.0rc1/bin/activate

Perform a from-source install

Clone FEW and checkout the v2.0.0rc1 tag:

(few2.0rc1) $ git clone https://github.com/BlackHolePerturbationToolkit/FastEMRIWaveforms.git
(few2.0rc1) $ cd FastEMRIWaveforms
(few2.0rc1) $ git checkout v2.0.0rc1

Load the nvhpc module to get access to CUDA compilers:

(few2.0rc1) $ module load HPC_GPU/nvhpc/24.5

Install FEW and force the CUDA backend compilation with the option FEW_WITH_GPU=ON. We also force fetching and compiling LAPACK(E), otherwise CMake will detect the system LAPACK library (/lib64/liblapack.so.3) which makes somes tests fails with a segmentation fault error. The installation command line is thus:

(few2.0rc1) $ CXX=g++ CC=gcc FC=gfortran pip install -e '.[testing]' \
                --config-settings=cmake.define.FEW_WITH_GPU=ON \
                --config-settings=cmake.define.FEW_LAPACKE_FETCH=ON
...
Successfully installed fastemriwaveforms-2.0.0rc1
(few2.0rc1) $ pip install cupy-cuda12x nvidia-cuda-runtime-cu12==12.4.* # Must be installed manually when installed from source

Perform a package install

To install the package directly from PyPI, simply run:

(few2.0rc1) $ pip install --pre fastemriwaveforms-cuda12x==2.0.0rc1

Configure file storage

Execute the following command to write a configuration file in ~/.config/few.ini which specifies that FEW files must be downloaded in /sps/lisaf/${USER}}/few_files (adapt to any large storage volume you have access to):

(few2.0rc1) $ cat << EOC > ~/.config/few.ini
[few]
file-storage-dir=/sps/lisaf/${USER}/few_files
file-download-dir=/sps/lisaf/${USER}/few_files
EOC
(few2.0rc1) $ mkdir /sps/lisaf/${USER}/few_files

Now, you may run the folowwing command to pre-download all files required for test execution. If you don’t run this command, files will still be downloaded during test execution:

(few2.0rc1) $ few_files fetch --tag testfile
Downloading all missing files tagged 'testfile' into '/sps/lisaf/your_username/few_files'
Downloading 'AmplitudeVectorNorm.dat'... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
Downloading 'FluxNewMinusPNScaled_fixed_y_order.dat'... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00
...
Downloading 'ZNAmps_l10_m10_n55_DS2Outer.h5'... ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 100% 0:00:00

Run tests

Execute the package tests suite to ensure that everything works as expected:

(few2.0rc1) $ python -m few.tests
AAKWaveform test is running with backend 'cuda12x'
[...]
.......
----------------------------------------------------------------------
Ran 27 tests in 231.381s

OK

You may also force FEW to run only on the cpu backend with:

(few2.0rc1) $ FEW_ENABLED_BACKENDS="cpu" python -m few.tests
AAKWaveform test is running with backend 'cpu'
[...]
.......
----------------------------------------------------------------------
Ran 27 tests in 512.101s

OK