作者简介:
祝小宇,R语言中文社区专栏作者,个人公众号:大猫的R语言课堂
虽然对于大多数人来说,自己的笔记本或是PC可能就能满足大多数日常R运算的需求了,但工作中总会遇到一些特殊的情况,这时候如果我们有一台自己的远程 R Serve 就会方便很多。大家可以把 R Server 想象成一台能够运行R的远程服务器,他能够实现以下需求:
我在学校/办公室有一台很强大的服务器/PC,我希望不管在哪儿都能远程调用这一资源(这样出差只要一台Surface就够了!);
我希望自己的 R Server 不光具有常规R的所有功能,最好还有一些针对大数据开发的独门利器,例如处理数据集大小不受内存限制、原生的多线程处理等;
我不想使用TeamView之类的远程工具来链接我的计算资源,因为一旦使用这种工具,其他人就不能使用被我控制的这台电脑了;
(上面一种情况的加强版)我希望能够偷偷摸摸调用远程计算资源而不被任何人发现(屏幕上不会有任何异常)——这里应该有个滑稽表情;
(上一种情况进一步加强版)哪怕我没有公网IP,哪怕我是在校园网,哪怕公司网管封了我的80端口,老子也能连上自己的远程 R Server!
我自己的笔记本是Windows/Mac的,而服务器是Linux的,我希望可以跨平台互联;
我可以随时在自己的本地 R 进程与远程 R Server 进程之间切换,并且不用重开多个 R 窗口;
我希望我和我的远程资源之间的连接是高速并且加密的;
如果我愿意,我可以把 R Server 部署到亚马逊AWS、微软Azure或者阿里云腾讯云等云服务中;
我不光希望搭建 R Server,我还想搭建 Python Server,并且使用同一个工具管理两者!
如果我愿意,我可以同他们人分享我的远程资源,也即 R Server 可以同时为多个用户创建进程,并且每个人都拥有完全独立的 package library 和 workspace:
以上所有这些需求,都必须是免费的!!!
听起来是不是太贪心了?确实,作为开源工具,R一向对于上述这种商业需求满足的不是很好。目前就大猫所知,致力于R在商业应用的主要有RStudio和微软两家公司(如果还有欢迎留言),其推出的产品分别是 RStudio Server Pro
和Microsoft Machine Learning Server
。功能差异暂且不说,收费倒的确非常“商业”——RStudio的商业版是995刀/用户/年,RStudio Server Pro则是9995刀/用户/年。至于微软的Microsoft Machine Learning Server
,更是在官网上报价都没有,想必是一开始就认准我等肯定买不起……
但先别叹气!
在新任三哥CEO纳德拉的带领下,微软爸爸的思路转变了很多,不光成了github上最大的开源贡献者,旗下一大批商业软件也都推出了免费的开发者版本,其中就包括Machine Learning Server
。在这篇教程中,大猫将一步步教大家如何使用使用微软的Machine Learning Server
以及免费的花生壳程序搭建属于你自己可以穿透一切内网的 R 服务器!
Machine Learning Server (MLS)
口说无凭,大猫先在这向大家演示一下如何跨国、跨内网连接 R Server,让大家直观感受下 R Server 的魅力。
现在大猫的坐标是美国科州某大学的图书馆(一个内网!),分配到的内网IP地址是10.5.19.231,出去的公网地址是130.253.27.7。现在大猫想要连接自己在杭州某大学实验室(另一个内网!)的一台96G内存的服务器(公网地址 183.157.162.43)。大猫先输入如下命令:
# “v18700***k.iask.in:27436” 是使用花生壳配置的R Server动态域名,只要在世界任何地方输入这个域名就可以访问到大猫的服务器。当然,我隐去了三位,否则你们都能连我的服务器了 ╮(╯▽╰)╭
remoteLogin("http://v18700***k.iask.in:27436")
此时会弹出登陆窗口,大猫输入事先设置好的账号和密码
这时,原来R主窗口的>
符号变成了REMOTE>
,说明你在下面输入的命令都将在远程执行。此外,remoteLogin
函数会自动给出你的本地 R 环境与服务端 R 环境的对比报告,告诉你那些包缺了,那些包版本不一样等,如下图:
现在大猫在服务端建立一个对象x <- 1 + 1
。这时你看到,本地的变量列表中没有任何东西,因为x
这个object是建立在服务端的。
当然,如果我们在服务端输入REMOTE> ls()
,那么我们就可以看到对象x
。
接着,大猫运行REMOTE> pause()
这个命令,让R从服务端进程切换到本地进程。这时R主窗口的REMOTE>
也随之变成>
。接着,大猫运行命令getRemoteObject("x")
。这个命令的意思是,把服务端建立的x
的对象同步到本地,大家可以看到,本地的变量列表中出现了x
,这说明变量从服务端被同步到本地了!
整个过程大猫没有切换过任何窗口,如果想要再切换回服务端只需要键入resume()
。然后REMOTE>
光标就又出来啦。是不是特别爽?
在正式安装之前,我们需要准备好以下软件:
Microsoft Machine Learning Server
首先,需要在你的 R Server中安装 Machine Learning Server (MLS)
,它不光具有 R 的所有功能,还包括了将R在后台注册为服务的一系列工具。为了下载Machine Learning Server
,你需要注册微软的开发者身份。注册开发者身份是免费的,而且除了可以免费使用商业版的 Machine Learning Server
,还能获赠两个月的 DataCamp 订阅(最好的R在线课堂,没有之一)。至于注册的方法则非常简单,点击Visual Studio的官网 visualstudio.com/dev-essentials ,然后点击“Join or Access Now"即可。当注册完成后,进入个人账户页面(my.visualstudio.com),在“Download"标签中搜索 Machine Learning Server
下载即可。
唯一需要注意的是, Machine Learning Server
只支持64位系统(但是有Windows/Mac/Linux版本)。如果要详细教程,请猛戳大猫上几期的文章:“【快讯】微软送你两个月DataCamp订阅啦!”
Microsoft R Client
其次,为了能够连接远程 R Server,你需要安装 Microsoft R Client (MRC)
。MRC
具有 MLS
的大部分功能(包括远程并行计算以及去除内存大小限制),唯一区别就是无法用来搭建R服务,因此安装体积会比MLS
小很多。同样,MRC
可以使用微软的开发者账号免费下载。
如果你的远程机器十分幸运地拥有一个公网IP(例如是自己家里的ADSL),或者你想把你的 R Server 部署在诸如微软的Azure云服务中,那么就不需要花生壳。但是如果你的 R Server 是在公司或者学校,那么很不幸,你必须要安装花生壳内网穿透软件才能做到在世界地任何地方访问你地 R Server;否则,你只能在自己公司/学校内部(局域网)实现远程连接。
如果你想在Windows系统中安装Linux版本的 Machine Learning Server
,那么你就要安装虚拟机。可选的有很多,大猫自己用的是Win10自带的Hyper-V,毕竟是微软用在自己Azure上的技术,和Windows的兼容性有保障。然而,由于 Machine Learning Server
针对每个操作系统都开发了版本,因此如无特殊需要,一般不用安装虚拟机。
注意!
Machine Learning Server
跨平台互联不需要虚拟机!也即你的客户端可以是Windows,而服务端可以是 Linux。只有当你希望在服务端安装和其本身操作系统不一样的Machine Learning Server
版本时,虚拟机才有用。
Machine Learning Server
在这里,大猫会同时给出Linux和Windows下面的安装方法。详细流程与trouble shooting大家可以参阅微软给出的官方文档。大猫文章中所有没有涉及到的细节,官方文档都有清楚的解释。
在Windows下安装 Machine Learning Server
简直是一阵清风——解压安装包、点击安装文件、一路确定、安装成功!截图如下:
唯一需要注意的是大猫图中圈出的三个选项。如果你只想配置 R Server,那么只勾选 R 即可;如果你还想配置 Python Server,那么把 Python 的也勾上。最后一个“Pre-trained Models”的意思是Machine Learning Server
在一开始就已经内置了许多训练好的模型,如果你想直接调用,那么就选上吧!
Linux 下的安装方法稍微复杂了点,但是对于习惯了 bash 的小伙伴来说也易如反掌。这里以 Linux 为例:
获得管理员权限:sudo su
设置软件的 package repo:wget http://packages.microsoft.com/config/ubuntu/16.04/packages-microsoft-prod.deb
注册 repo:pkg -i packages-microsoft-prod.deb
下载并安装MLS
:apt-get install microsoft-mlserver-all-9.2.1
激活MLS
:/opt/microsoft/mlserver/9.2.1/bin/R/activate.sh
注:大猫在上面省略了安装后的验证步骤。关于这些步骤,请大家参阅官方文档。
Machine Learning Server
软件安装完成后,我们已经可以在本地把MLS
当作普通的 R 或者 Python 来使用了,但此时它仍旧无法具备远程提供服务的能力。在这一步中我们就要对远程服务功能进行配置。
如果是Win10,那么按下左下角的Win键,在搜索栏里输入Administration Utility
,就可以打开MLS
的配置窗口:
在弹出的命令行中,我们先选择1. Configure Server
,然后再选择A One-box
,最后输入管理员的账号和密码就完成了配置。默认条件下,管理员账号是admin
,MLS
就是通过这个账号再加上密码进行连接时的身份验证的:
如果这时命令行显示Web note start successfully
以及Compute node start successfully
,那么就说明配置完成!如果没有,可以运行Administration Utility
中的6. Run diagnostic tests
进行排查。另外,官方文档也给出了很多问题的排查方式。
首先进入安装目录:cd /opt/microsoft/mlserver/9.2.1/o16n
运行Administration Utility
:sudo dotnet Microsoft.MLServer.Utils.AdminUtil/Microsoft.MLServer.Utils.AdminUtil.dll
剩下的操作和Windows是一样的。
注1:
MLS
的配置实际上包含两部分,一部分是对web node
的配置,另一部分是对compute node
的配置。web node
的主要任务是处理网络请求,也即负责服务端和客户端的连接;compute node
的任务则是纯粹的计算。在整个MLS
的工作流程中,首先由web node
接受你发送过去的 R 代码,然后它再转交给compute node
,等computer node
计算完成之后,再由web node
把结果发送回你的客户端。如果你安装完MLS
后不进行这两个 node 的配置,那么MLS
将只能作为本地客户端使用,无法承担起 R Server的任务。
注2:我们有两种方式配置compute node
和web node
。其中最方便的方式叫做One-box
,也即大猫在上面和大家介绍的那种。one-box
的方法会在服务器中自动建立一个compute node
和一个web node
。另一种配置方法叫做Enterprise
,在这种模式下,用户可以自定义任意多个web node
和compute node
。顾名思义,这对于拥有多个计算集群的企业来说,是非常有用的。
如果你的R Server是放在学校或者公司,那么十有八九你是没有公网IP的,这时就需要使用能够穿透内网的软件。如果你的服务器在国内,那么可以选择“花生壳”这个软件,如果你的服务器在国外,那么“NO-IP”这个软件也是个不错的选择。由于大猫的服务器在杭州,所以这里选择的是花生壳。
首先点击这里进入花生壳的官网,下载花生壳。免费的版本允许映射两条线路,月流量1G,基本能满足需要。而如果你是个出差狂人,又想随时对地能access强大的远程计算资源,那么大猫建议可以考虑购买花生壳商业版。(大猫:喂花生壳我在免费给你打广告你不给我钱么?!)
注: 什么是动态域名映射?
在这里大猫简单解释什么是动态域名映射。首先大家需要知道,我们平时指的IPv4地址都是例如 127.0.0.1 这样一串数字,每个这样的地址都可以标记出一台设备在网络中唯一的位置。然而这样的地址是有限个的,排除掉预留的,一共也只有3,706,452,992个可用的公共个地址。然而,目前这37亿个地址已经被分配完了,这时怎么办呢?就只能很多机器公用一个IP地址了。以学校为例。你分到的只是学校给你的局域网IP,这个IP虽然在学校内通行,但是在公网中却是不认的。你的所有网络请求最终会被学校的网关收集,然后用学校的公网IP发送出去。也就是说,一个学校的公网IP可能对应着N个局域网IP。
在这种情况下,不论我们在 R 的客户端输入公网还是局域网IP,它都无法“找到”我们设置的 R Server。举个例子,局域网IP好比是门牌号,例如“410室”;而公网IP好比小区名称,例如“中山东路工人小区”——如果我们只知道门牌号是找不到目标的,因为工人小区可能有好多个相同的410室;而光知道小区名称同样也找不到目标,因为我们不知道几零几室。
那么有没有一种方法可以把局域网IP和公网IP给结合起来呢?这时我们就需要动态域名映射了。动态域名映射好比是电影中看到的那种追踪定位装置——只要把一个小小的部件塞到你的口袋中(当然像《王牌特工:黄金圈》里把定位器塞到不可描述的部位中的做法大猫也是很服的╮(╯▽╰)╭),那么无论你走到哪儿我都能知道你的位置。而花生壳软件就好比是这个“追踪器”,只要它在你的机器上运行着,它就能将你的局域网IP和公网IP之间“连通”起来,也即大家常说的“内网穿透”。
再说句题外话,美国由于是互联网的起源地,所以美国高校的IPv4资源特别丰富,可用地址常常是普通中国高校的几十甚至上百倍……Orz
科普了那么多动态域名的知识,下面我们直接上手配置。首先,我们需要获取自己的内网地址。在Windows的运行栏输入cmd
启动命令行,然后输入ipconfig
这个命令,就能找到我们的内网地址:
在上图中,用红线标记出来的10.0.0.83
就是我们的局域网IP了。
我们接着打开花生壳,点击“内网穿透”:
然后按照下面进行设置:
需要注意的是,内网端口号必须是12800
,这是因为MLS
的web node
的默认端口号就是这个。除非我们手动修改过web node
的端口号(不建议修改),否则只需输入12800
即可。
花生壳会分配给我们一个免费的动态域名和随机端口号,有了这两个东西,我们就可以实现内网穿透啦!在下图中小伙伴们可以看到大猫获得的这个动态域名和端口是v18700400k.iask.in:27436
。其中冒号前的是域名,后面的是端口号:
注:详细内网穿透的教程可以参考花生壳官网。
大功即将告成!这时我们只要打开本地的Microsoft R Client
,然后怀着激动的心情输入登陆函数remoteLognin("http://<你的域名:分配的端口号">
,当当当~出现下面output就说明连接成功!最牛逼的是,当你用这种方法连接远程服务器时,远程服务器的屏幕上不会有任何反应!也就是说,除非有人观察到CPU使用率异常,否则不会有人发现你在调用他们的计算资源!
往期回顾
1
还在用tm?你OUT啦!
2
【推荐】在R中无缝集成Github云端代码托管
公众号后台回复关键字即可学习
回复 爬虫 爬虫三大案例实战
回复 Python 1小时破冰入门
回复 数据挖掘 R语言入门及数据挖掘
回复 人工智能 三个月入门人工智能
回复 数据分析师 数据分析师成长之路
回复 机器学习 机器学习的商业应用
回复 数据科学 数据科学实战
回复 常用算法 常用数据挖掘算法