成果

这篇文章记录了我最后得以:

  • 在 Windows 环境下使用 Linux R
  • 通过浏览器使用 RStudio Server
  • 利用矩阵加速库 (blas/lapack) 为 R 提速

前情提要

我使用的命令行工具是 Windows Terminal.

按照本文设置前,请确保你安装了 WSL ,参见文档.

如果你从来没有安装过 WSL, 在管理员模式下运行:

wsl --install

我在这里安装了默认的 Ubuntu 分发(Ubuntu 20.04 LTS)。你可以选择其他 Linux 系统。

wsl --install -d Ubuntu

一系列安装后查看版本

$ wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Running         2

设置 Ubuntu

我喜欢 22.04 版本,所以升级了 Ubuntu !-d 指令会把 Ubuntu 升级到开发版。你当然可以选择不升级,不过在安装 RStudio Server 的时候,命令会有点点不一样。以下的命令均在 Linux 中运行。

sudo do-realse-upgrade
sudo apt update
sudo apt upgrade

安装 R core 并添加 CRAN 仓库

我遵循这个教程 来安装 R 和 CRAN 库。

# update indices
sudo apt update -qq

# install two helper packages we need
sudo apt install --no-install-recommends software-properties-common dirmngr

# add the signing key (by Michael Rutter) for these repos
# To verify key, run gpg --show-keys /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc 
# Fingerprint: E298A3A825C0D65DFD57CBB651716619E084DAB9
wget -qO- https://cloud.r-project.org/bin/linux/ubuntu/marutter_pubkey.asc | sudo tee -a /etc/apt/trusted.gpg.d/cran_ubuntu_key.asc

# add the R 4.0 repo from CRAN -- adjust 'focal' to 'groovy' or 'bionic' as needed
sudo add-apt-repository "deb https://cloud.r-project.org/bin/linux/ubuntu $(lsb_release -cs)-cran40/"

sudo apt install --no-install-recommends r-base

sudo add-apt-repository ppa:c2d4u.team/c2d4u4.0-

看看 R 是不是装好了:

$ R
> sessionInfo()
R version 4.2.1 (2022-06-23)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 22.04.1 LTS

安装 RStudio Server

RStudio Server 能用浏览器访问,界面一样,很酷。如果想安装 RStudio Desktop,需要配置 WSL 的 GUI。如果 Windows 版本够高(10.0.22000 以上),WSL 原生支持 GUI。但是何必呢?

这个是安装 RStudio Server 的文档,里面有不同系统版本的命令。

sudo apt install -y r-base r-base-core r-recommended r-base-dev gdebi-core build-essential libcurl4-gnutls-dev libxml2-dev libssl-dev

wget https://download2.rstudio.org/server/jammy/amd64/rstudio-server-2022.07.1-554-amd64.deb

sudo gdebi rstudio-server-2022.07.1-554-amd64.deb
TTY detected. Printing informational message about logging configuration. Logging configuration loaded from '/etc/rstudio/logging.conf'. Logging to '/var/log/rstudio/rstudio-server/rserver.log'.

出现这个消息,说明大功告成。浏览器访问localhost:8787 输入 Ubuntu的 usernamepassword 即可。

安装 BLAS 和 LAPACK 库以加速矩阵运算

BLAS and LAPACK 能够加速 R 的运算,详见此文.

在 Windows 上安装 BLAS 和 LAPACK 库

安装好麻烦。最流行的方法(https://support.microsoft.com/en-us/topic/swapping-revolution-r-optimized-mkl-blas-libraries-66ad41cd-2276-ad9a-0104-0004eabc9bfa) 是直接替换掉 R 自带的 dll 库 (Rblas.dll and Rlapack.dll). 简单粗暴,不过我后来在用一些 R 包 的时候出了一点问题,只得返工。而且每次更新 R core 都要重新操作一下。

Install BLAS and LAPACK on Linux

Linux 更直接一些,你可以通过设置 --with-blas 编译带有特定加速库的 R, 但我整不明白。也有教程 推荐用动态链接库的方式来整,我也整不明白。

这是我用的方法,自觉非常优雅。

R 无需自带运算库

我在 WSL 上装完 R 发现根本没有 libRblas.solibRblas.so

$ ls /usr/lib/R/lib/
libR.so

具体可见一个 stackoverflow 的讨论, 大佬 Dirk Eddelbuettel 说 R core 不需要自带一个加速库,他们设置为

“allows you to switch BLAS installation”

检查刚才安装的 R,可以发现

> sessionInfo()
Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.10.0
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.10.0

我们可以直接在 Linux 上安装 BLAS & LAPACK 库,使之成为系统层面的库。虽然有的人不喜欢这样,但我觉得没什么。

Intel oneAPI Math Kernel Library (oneMKL)

这里提供两个加速库的配置实例。我在我办公室电脑用了 Intel oneAPI Math Kernel Library,自己的笔记本因为是 AMD 的 CPU,所以我安装了 OpenBlas

# Install Intel MKL
sudo apt install intel-mkl
# sudo apt install intel-mkl-full
# You may use this if intel-mkl does not make libraries system-wide

# update libraries priority
sudo update-alternatives --config libblas.so.3-x86_64-linux-gnu
sudo update-alternatives --config liblapack.so.3-x86_64-linux-gnu

# each line, it will prompt
  Selection    Path                                                     Priority   Status
------------------------------------------------------------
  0            /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3   100       auto mode
  1            /usr/lib/x86_64-linux-gnu/blas/libblas.so.3               10        manual mode
  2            /usr/lib/x86_64-linux-gnu/libmkl_rt.so                    1         manual mode
* 3            /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3   100       manual mode

Press <enter> to keep the current choice[*, or type selection number:

# type the number where libmkl_rt.so at
# !remember there are two lines that you should run

回到 R,发现运算库已经更新了。

$ R
> sessionInfo()
Matrix products: default
BLAS/LAPACK: /usr/lib/x86_64-linux-gnu/libmkl_rt.so

Also, it seems that we need to run additional script according to Intel Document and many tutorials. I am not sure if it is necessary to do so. Maybe you can run it anyway:

export MKL_INTERFACE_LAYER=GNU,LP64
export MKL_THREADING_LAYER=GNU

OpenBlas

其他加速库(例如 ATALS)也是一样的——只要你能安装配置好加速库。

# Install Intel MKL
sudo apt install libopenblias-dev
# sudo apt install libopenblias-base
# You may use this, but I don't know the differences
# For details, see https://askubuntu.com/questions/1318554/why-are-there-so-many-openblas-packages-and-which-one-would-yield-fastest-result

# update libraries priority
sudo update-alternatives --config libblas.so.3-x86_64-linux-gnu
sudo update-alternatives --config liblapack.so.3-x86_64-linux-gnu

# each line, it will prompt
  Selection    Path                                                     Priority   Status
------------------------------------------------------------
* 0            /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3   100       auto mode
  1            /usr/lib/x86_64-linux-gnu/blas/libblas.so.3               10        manual mode
  2            /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3   100       manual mode

Press <enter> to keep the current choice[*, or type selection number:

# type the number where libblas.so.3 and liblapack.so.3 at
# !remember there are two lines that you should run

回到 R,发现运算库已经更新了。

$ R
> sessionInfo()
Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/openblas-pthread/libblas.so.3
LAPACK: /usr/lib/x86_64-linux-gnu/openblas-pthread/libopenblasp-r0.3.20.so

其他的方法

找资料的时候还看到一个 flexiblas 库,以及对应的 R 包 [Flexiblas](https://cran.r-project.org/package=flexiblas)。有空看看。

这是我的安装环境

Windows:

Processor:                     AMD Ryzen 5 5600H with Radeon Graphics
PSVersion                      7.2.5
PSEdition                      Core
GitCommitId                    7.2.5
OS                             Microsoft Windows 10.0.22000
Platform                       Win32NT
PSCompatibleVersions           {1.0, 2.0, 3.0, 4.0…}
PSRemotingProtocolVersion      2.3
SerializationVersion           1.1.0.1
WSManStackVersion              3.0

WSL:

WSL version: 0.65.3.0
Kernel version: 5.15.57.1
WSLg version: 1.0.41
MSRDC version: 1.2.3213
Direct3D version: 1.601.0
DXCore version: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows version: 10.0.22000.856

Ubuntu:

Distributor ID: Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:        22.04
Codename:       jammy