想象一下,你用 Linux 版本的 Tensorflow 建立了一个美妙的 RNN 模型,然后无缝切换到 Windows 用 Excel 直接编辑结果,画了一幅 fancy 的图给你的老板。在此期间,你的所有模型文件已经被自动同步到了 Onedrive/百度云/Dropbox 上了!整个过程丝毫没有使用虚拟机的“膈应”感!
相信在Windows中使用 Python 和 R 小伙伴为数不少,虽然 Python 和 R 并不挑平台,但是总还有一些情况 Linux 版本更有优势,这些情况包括:
R 在 Linux 中使用并行计算包 Parallel 更快,因为 R 可以直接调用 Linux 内核中的 fork 功能复制 N 个“一摸一样”的线程,但是在 Window 中,fork 并不被支持,想要创建多线程,就必须先创建一个主线程,然后再创建从线程,比较麻烦。体现在使用过程中,我们可以在 Linux 中直接使用 mcapply 进行多线程操作,但是在 Windows 中,我们必须提前创建 worker,然后再初始化,然后才能调用多线程函数。
有些包没有 Windows 版本。 对于 Python 和 R 双修的同学,一个迫切的需求就是能够在同一个 jupyter 笔记本中调用两种语言,但是很可惜,完成两种语言互相调用的神包rpy2 并没有官方的 Windows 版本。此外,R 中最好的数据处理包 data.table,也只有在 Linux 中才有对应的 Python 版本。
有些软件没有 Windows 版本。 比如使用最广泛的基于内存的键值数据库 Redis,以及 Jupyterhub。
然而,除非是职业开发者,将主力操作系统完全转移到 Linux 可能是一件得不偿失的事。此时一个常见的折衷办法是使用虚拟机,不过虚拟机本身也很有很多问题
虚拟机资源开销巨大。原来就捉襟见肘的内存和硬盘,开了虚拟机后可能就没多少留给 R 了(别忘了 R 和 Python 需要把所有数据都加载到内存中!)此外,虚拟机还会挤占 CPU 资源 (用 MacOS的同学一定深有体会)。本来我们期望的是 Linux 中的 R 能带来更好的并行运算效率,但是虚拟机不光吃掉了 Linux 带来的效率优势,性能更可能还不如在 Windows 版本。
虚拟机访问宿主系统资源比较麻烦。举个例子,假如我们在虚拟机中创建了很多数据集,但是突然有一天我们想要用 Office 打开,这时我们只能把这些数据从虚拟机中复制到宿主机中。明明只是想查看一个文件,结果却不得不在两个系统中复制一遍。可以说,虚拟机最大的缺点在于 虚拟机和宿主机无法操作“同一个”文件。 背后的原因在于,虚拟机对于宿主系统来说是个外来者,因此虚拟机中的系统想要访问 Internet 或者宿主系统中的文件,就必须使用某种技巧“在宿主系统的防火墙中打一个洞”。
那么有没有什么办法可以让我们同时享受 Linux 带来的效率和 Window 给我们带来的便捷呢?答案就是微软在 Win10 中推出的 Linux 子系统 WSL(Windows Subsystem for Linux)!Win10 中的这个 Linux 子系统并不是虚拟机,而是和 Win10 并行的子系统,你可以用它可以完成 Linux 能做的“几乎”所有事,包括 bash。
根据官方文档,相对于虚拟机,WSL 的优点是:
……WSL 需要更少的资源(CPU, 内存,硬盘)。WSL 能够让你在 Windows 命令行中直接运行 Linux 命令,并且直接访问你在 Windows 中的资源。因此,你能同时使用 Linux 和 Windows 中的工具对同一组文件进行操作!
温馨提醒:本教程适合对于 Linux 有基本了解的读者(比如知道什么是 bash,什么是 curl 命令等)。当然 Linux 零基础的读者按照教程也可以顺利安装,但由于 WSL 没有图形界面,只能通过命令行运行,因此第一次使用可能会比较陌生。
Okay,那就让我们直接进入正题:和在Win10中使用Linux版本的R和Python
启用 Linux 子系统
1. 在微软商店下载 Linux 子系统
打开 Win10 的微软商店,搜索“Linux”,我们会发现微软已经为我们提供了众多的 Linux 发行版本。选择你需要的版本,如果你不知道选哪个,就选 Ubuntu 吧。选好后点击安装。
2. 在 Win10 中开启 Linux 子系统
在 Win10 的搜索栏中(也可以通过按 Win 键调出)输入“windows 功能”。
勾选“Linux子系统”这栏。顺带一提,列表中的“Hyper-V”是 Win10 自带的虚拟机,微软的 Azure 就是基于自家 Hyper-V 技术。
成功安装完之后,我们可以在开始菜单中看到“Ubuntu”(假如我们安装的是Ubuntu)
安装 Jupyter 和 Python
如果你的任务是科研或者数据科学,那么大猫强烈推荐 Jupyter + R/Python 的组合。在这里我们采用如下安装策略:先安装 Linux 版的Anconda,期间 Python 和 Jupyter 会自动安装。然后我们再单独安装 R。
首先我们在开始菜单中点击 Ubuntu,调出 Linux 命令行。如果我们是第一次运行 WSL,那么会被提示建立一个新的账号:
成功建立账号后,我们运行一下程序把 Linux 里的包更新到最新版本:
sudo apt update &&
sudo apt upgrade ```
更新完之后,我们开始下载 Anaconda。首先去 Anaconda 的官网找到最新版本的网址(repo.continuum.io/archive/)。
大多数情况下,我们会安装 Python3 64位 版本,也就是图中框出来的那个。复制下他的地址,这里为 https://repo.continuum.io/archive/Anaconda3-2018.12-Linux-x86_64.sh
运行以下wget命令,下载安装文件:
wget https://repo.continuum.io/archive/Anaconda3-2018.12-Linux-x86_64.sh
Linux 会把安装文件默认下载到当前文件夹,如果要改变文件夹,请自行调整。
运行以下命令,进行安装:
bash Anaconda3-2018.12-Linux-x86_64.sh
测试是否安装成功。在 Linux 命令行中输入 jupyter lab,然后在 Windows 中使用浏览器打开 locolhost:8888(默认端口为8888)。如果你的 Linux 命令行出现类似信息:
并且浏览器返回:
恭喜你!你已经成功在 Linux 子系统中创建了一个 Jupyter 服务器并且在 Windows 中直接访问了!
安装 R (Linux)
大猫强烈推荐使用微软的 Microsoft R Open。MRO不仅和原生R百分之百兼容,更增加了英特尔多线程库,大幅提升了计算能力。我们打开这个(mran.microsoft.com/download)网址,找到 MRO 的下载链接:
使用以下命令下载:
wget https://mran.blob.core.windows.net/install/mro/3.5.1/microsoft-r-open-3.5.1.tar.gz
进入下载文件所在目录,运行以下命令解压安装包:
tar -xf microsoft-r-open-3.5.1.tar.gz
解压完成后,会出现一个 microsoft-r-open 文件夹,通过以下命令进入这个文件夹:
cd microsoft-r-open/
使用以下命令安装:
sudo ./install.sh
如果你使用的是 Ubuntu 18.04 版本,那么你还需要安装 libpng12 这个包,运行以下命令:
wget https://mirrors.kernel.org/ubuntu/pool/main/libp/libpng/libpng12-0_1.2.54-1ubuntu1_amd64.debdpkg -i libpng12-01_1.2.54-1ubuntu1_amd64.deb
恭喜你,MRO 安装成功!这时如果你在命令行中直接键入 R,你就会看到如下启动画面:
在 Jupyter 中配置 R(Linux)
最后一步,我们需要把 R 配置到 Jupyter 中。
1. 安装 devtools
继续上一步,在 Linux 命令行中打开 R 后,运行我们熟悉的 install.packages('devtools')来安装包。
2. 安装 IRKernel
运行以下命令安装:
library(devtools) options(unzip = "internal") devtools::install_github('IRKernel/IRkernel')
3. 在 Jupyter 中配置 IRKernel
在 R 的命令行中,运行以下命令:
IRkernel::installspec(name = 'ir35', displayname = 'MRO-3.5.1')
这里 displayname 设置为你容易识别的名字即可。
最后来看一下成果吧!
经历了那么多,现在我们终于可以自豪的宣布:老纸在 Windows 中不依赖虚拟机就搭建了一个 R 和 Python 的 Linux-Jupyter 服务器! 别忘了,在windows系统中你还能搭建另一个 Jupyter 服务器,也就是说,你现在已经左拥右抱,走向人生巅峰了!
双倍的系统,是否给你双倍的快乐呢?