R

R jest obsługiwany zarówno przez system środowisk Python Conda jak i Spack

Conda

Aby skorzystać z podstawowego środowiska R należy załadować moduł środowiskowy Anaconda:

module load anaconda

Przygotowane jest startowe środowisko R zawierające około 80 najpopularniejszych pakietów. Aby je aktywować należy wykonać polecenie:

conda activate r
Adnotacja

To środowisko jest dostępne w trybie tylko do odczytu, więc instalacja pakietów będzie bardzo nieefektywna ze względu na potrzebę ich kompilacji.

W przypadku potrzeby instalacji pakietów należy utworzyć własne środowisko.

Własne środowisko

Po załadowaniu modułu anaconda lub miniconda należy utworzyć nowe środowisko r_env zawierające R i około 80 najpopularniejszych pakietów:

conda create -n r_env r-base r-essentials

conda activate r_env

Pakiety R

Każdy pakiet R dostępy w repozytorium musi być instalowany w formie r-<nazwa pakietu R>, na przykład:

conda install r-benchmarkme

W przeciwieństwie do pakietów Spack są one zawsze dostępne w danym środowisku.

Spack

Zagrożenie

Spack jest opcją dla zaawansowanych użytkowników, którym nie wystarcza wersja dostepna przez środowisko Conda. Wymaga on dużych zasobów obliczeniowych oraz dyskowych. Instalacja pakietów musi odbywać się na węzłach obliczeniowych.

Aby użyć standardowej wersji R ze współdzielonej dystrybucji Spack należy po uprzednim jego zainstalowaniu załadować środowisko, na przykład:

source ~/spack/v0.21.2/share/spack/setup-env.sh

oraz załadować R:

spack load r

Własna instalacja

Jeśli wersja R dostępna we wspołdzielonym repozytorium jest niewystarczająca, to możliwa jest instalacja innej, na przykład:

spack install r@4.2.2

Pakiety R

Podobnie do Condy pakiety R mają formę r-<nazwa pakietu R>.

Listę dostępnych pakietów można uzyskać w standardowy sposób:

spack list r-

Instalacja pakietu:

spack install r-mass
Ważne

Pakiety R mogą być także instalowane z poziomu R. Będą one jednak wymagały pełnej kompilacji, co może zająć dużo czasu zależnie od stopnia skomplikowania zależności.

Aby ułatwić użycie podstawowych pakietów zostały one zainstalowane we współdzielonym repozytorium Spack.

Załadowanie podstawowej instalacji R:

spack load r r-mass r-lattice r-matrix r-nlme \
    r-survival r-boot r-cluster r-codetools \
    r-foreign r-kernsmooth r-rpart r-class \
    r-nnet r-spatial r-mgcv r-renv r-r-utils

Alternatywne biblioteki matematyczne

R standardowo dostarcza biblioteki matematyczne BLAS i LAPACK, ale dostępne są alternatywy. Najbardziej popularną jest Intel oneAPI MKL, która zoptymalizowana jest pod kątem instrukcji SIMD architektury x86 takich jak AVX2, AVX-512 czy AMX.

Kolejną alternatywą jest CUDA nvBLAS potrafiąca odciążyć niektóre rodzaje obliczeń za pomocą karty graficznej. Obliczenia nienadające się do tej operacji są przekazywane do kolejnej biblioteki BLAS. Możliwe jest użycie MKL w tym celu.

Zagrożenie

Zamiana biblioteki matematycznej może przynieść znaczny wzrost wydajności, ale należy także jej spadek. Aby w najlepszym stopniu wykorzystywać zasoby sprzętowe nalezy przeprowadzić testy wydajności swojego kodu na małym wycinku danych.

Intel oneAPI MKL

Zarówno Conda i Spack mogą być użyte do instalacji biblioteki MKL.

Conda

Dostępne są dwie metody użycia MKL przy pracy z R. Pierwsza z nich instaluje MKL i używa ich bezpośrednio za pomocą mechanizmu ładowania wstępnego:

conda install mkl

env LD_PRELOAD=$CONDA_PREFIX/lib/libmkl_rt.so R

Alternatywnie możliwa jest zamiana implementacji libblas na poziomie całego środowiska. Wiąże się to z użyciem kanału conda-forge zarządzanego przez społeczność co może spowodować zmiany w wersjach pakietów.

conda install -c conda-forge "libblas=*=*mkl"

Z tą metodą ładowanie wstępne nie jest wymagane i R może zostać uruchomiony bezpośrednio.

Spack

We współdzielonym repozytorium Spack zainstalowana jest biblioteka Intel oneAPI MKL, jej użycie bazuje na ładowaniu wstępnym:

spack load intel-oneapi-mkl

env LD_PRELOAD=libmkl_rt.so R

nvBLAS

Zestaw oprogramowania CUDA dostępny jest na każdym węźle z GPU, więc podczas pracy na nich możliwa jest akceleracja niektórych obliczeń za ich pomocą.

Do użycia tej metody wymagane jest utworzenie pliku konfiguracyjnego ~/nvblas.conf zawierającego między innymi ścieżkę do biblioteki BLAS (parametr NVBLAS_CPU_BLAS_LIB), która będzie używana do obliczeń nienadających się na GPU.

Adres biblioteki używanej standardowo przez R można uzyskać przez wykonanie w nim sessionInfo(). Alternatywnie można użyć libmkl_rt.so będącej częścią bibliotek Intel oneAPI MKL.

# This is the configuration file to use NVBLAS Library
# Setup the environment variable NVBLAS_CONFIG_FILE to specify your own config file.
# By default, if NVBLAS_CONFIG_FILE is not defined,
# NVBLAS Library will try to open the file "nvblas.conf" in its current directory
# Example : NVBLAS_CONFIG_FILE  /home/cuda_user/my_nvblas.conf
# The config file should have restricted write permissions accesses

# Specify which output log file (default is stderr)
NVBLAS_LOGFILE  nvblas.log

# Enable trace log of every intercepted BLAS calls
#NVBLAS_TRACE_LOG_ENABLED

#Put here the CPU BLAS fallback Library of your choice
#It is strongly advised to use full path to describe the location of the CPU Library
NVBLAS_CPU_BLAS_LIB  /work/USERNAME/miniconda3/envs/r_env/lib/libopenblasp-r0.3.21.so
#NVBLAS_CPU_BLAS_LIB  <mkl_path_installtion>/libmkl_rt.so

# List of GPU devices Id to participate to the computation
# Use ALL if you want all your GPUs to contribute
# Use ALL0, if you want all your GPUs of the same type as device 0 to contribute
# However, NVBLAS consider that all GPU have the same performance and PCI bandwidth
# By default if no GPU are listed, only device 0 will be used

#NVBLAS_GPU_LIST 0 2 4
#NVBLAS_GPU_LIST ALL
NVBLAS_GPU_LIST ALL0

# Tile Dimension
NVBLAS_TILE_DIM 2048

# Autopin Memory
NVBLAS_AUTOPIN_MEM_ENABLED

#List of BLAS routines that are prevented from running on GPU (use for debugging purpose
# The current list of BLAS routines supported by NVBLAS are
# GEMM, SYRK, HERK, TRSM, TRMM, SYMM, HEMM, SYR2K, HER2K

#NVBLAS_GPU_DISABLED_SGEMM
#NVBLAS_GPU_DISABLED_DGEMM
#NVBLAS_GPU_DISABLED_CGEMM
#NVBLAS_GPU_DISABLED_ZGEMM

# Computation can be optionally hybridized between CPU and GPU
# By default, GPU-supported BLAS routines are ran fully on GPU
# The option NVBLAS_CPU_RATIO_<BLAS_ROUTINE> give the ratio [0,1]
# of the amount of computation that should be done on CPU
# CAUTION : this option should be used wisely because it can actually
# significantly reduced the overall performance if too much work is given to CPU

#NVBLAS_CPU_RATIO_CGEMM 0.07

Aby użyć nvBLAS z R należy skorzystać z mechanizmu ładowania wstępnego:

env LD_PRELOAD=libnvblas.so R