如何在Google Cloud上搭建一个免费的数据科学环境
无论你是想在本地机器上榨干内存,还是只希望代码在更强大的机器上运行得更快,在云服务器上进行数据科学研究都有很多优势。云服务器实际上就相当于一台电脑,就跟你现在使用的电脑一样,只不过它位于别处罢了。
在本文中,我们将介绍如何在 Google Cloud Platform(GCP)上搭建一个数据科学环境。Google 采购了数十万台个人计算机,使用定制软件在世界各地数据中心管理它们,并提供这些计算机的租用业务。由于云托管公司提供的经济规模,个人或团队可以按需访问具有大量 CPU 和内存的强大的计算机。
当你决定将设置从笔记本或台式机迁移到云数据科学环境时,重要的是,要考虑哪些标准对你来说最重要。比如,如果要在 pandas 中处理更大的数据集,那么拥有大量内存就非常重要。为了能够配合 Spark 处理大型数据集,我们就需要租用具有大量内存的计算机池来共享负载。
与其他云服务提供商(如 Amazon AWS、Microsoft Azure、DigitalOcean Droplet)一样,GCP 也包含许多不同的产品和服务。
为了能够自由地安装任何我们想要的库或工具,我们需要访问 GCP 上的虚拟计算机。这称为虚拟机实例。租用虚拟机实例并不能让我们访问自己的专用计算机(向云服务提供商租用专用计算机的费用要高得多),而只能访问我们想要的 CPU 和内存:
启动 Google Compute Engine 实例
导航到 VM 实例页面:
https://console.cloud.google.com/projectselector/compute/instances系统会要求你使用 Google 凭据登陆并创建一个项目。完成后,你将进入 VM 实例页面。
要创建新的虚拟实例,单击 CREATE INSTANCE,你将进入一个页面,你可以在其中定制你想租用的实例的不同属性:
Name: 命名你的实例,我们只使用了缺省名称。
Zone: 服务器所在的地理区域。我们选择了 us-east1-b,但你可以随意选择离你最近的实例:https://cloud.google.com/compute/docs/regions-zones/
Machine Type: 你想让租用的机器有多强大。回想一下,你可以在此页面(https://cloud.google.com/compute/pricing)了解不同的机器类型,在每月预算中进行选择。
Boot Disk: 选择你希望虚拟实例启动哪种操作系统。我们选择了 Ubuntu 16.04 LTS,一款流行的 Linux 分发版。
Firewall: 设置允许哪些网络流量。我们使用默认设置保留此流量。
当你就绪后,点击 Create 按钮。
启动 Google Compute Engine 实例之后,可以直接从 Google Compute Engine 页面来启动控制台:
我们将使用此控制台设置数据科学环境的其余部分。如果你不熟悉命令行,我建议你查看我们的课程:
Command Line:Beginner:https://www.dataquest.io/course/command-line-beginner
Command Line:Intermediate:https://www.dataquest.io/course/command-line-intermediate首先,安装 anaconda(参见https://conda.io/docs/user-guide/tasks/manage-pkgs.html)。在命令行中,最简单的方法是使用 curl 下载二进制安装文件。unix 工具 curl 从指定的 URL 下载文件,并使用 -O 标记写入文件(而不是立即显示下载内容):
在安装过程中,你将会有几次需要输入 yes 来接受许可证。安装完成后,你还需要将 conda 程序添加到你的 PATH(可参见https://kb.iu.edu/d/acar)中。这个 PATH 允许你指定希望操作系统搜索程序的目录。
现在已经安装好 anaconda,我们就可以创建一个新的 anaconda 环境(详见https://conda.io/docs/user-guide/tasks/manage-environments.html)。由于我们在 Dataquest 上使用 Python 3.5 授课,因此在本文我们仍然使用这个版本:
现在,我们在此实例中运行的 Jupyter Notebook 服务器无法通过本地计算机上的 Web 浏览器访问。要理解为什么会这样子,让我们想一想在自己的计算机本地上运行 Jupyter Notebook 会发生什么事情:只有本地计算机才能通过 Web 浏览器访问 Jupyter Notebook 服务器(通常访问地址是 localhost:8888)。
但如果在局域网(WiFi 或以太网)上的其他人知道你的 IP 地址和运行 Jupyter Notebook 的端口(通常是 8888),那他们可以通过 Web 浏览器访问它:http://OUR_IP_ADDRESS:8888。
通过这两个主要调整,我们也可以为云实例复制这种访问功能。缺省情况下,云实例的防火墙设置为阻止传入的网络访问。此外,大多数云服务提供商经常更改实例的 IP 地址(实际上,只要他们愿意,随时都可以更改!)这就意味着,如果我们的实例当前 IP 地址是 35.227.18.17,它只能保持一阵,不能长期依赖这个 IP 地址。
然而,我们也可以把动态 IP 地址更改为静态 IP 地址。
要把实例的 IP 地址更改为静态 IP 地址,请在 Google Cloud Platform 的左侧依次展开 Networking→VPC networ→External IP address。
你还可以直接通过这个 URL:https://console.cloud.google.com/networking/addresses 直接跳到这个页面。
请注意:如果你声明了一个静态 IP 地址,正在运行的机器没有与静态 IP 地址关联,Google 将会收取少量费用。在 Iowa 州,截止 2017 年 12 月,这个收取少量费用的成本是每小时 1 美分,如下图所示:
Static IP Cost
你可以通过访问这个页面https://cloud.google.com/compute/pricing 并向下滚动到未使用的 IP 地址价格,了解未使用的静态 IP 地址价格更多的信息。
现在我们有了一个静态 IP 地址,本地计算机就可以与云实例通信了。不幸的是,大多数云提供商都有防火墙,阻止了对大多数端口的传入访问。值得庆幸的是,我们可以手动为端口 8000 添加一个例外,Jupyter Notebook 服务器使用这个例外来接收传入的请求。
现在让我们使用自定义防火墙规则,以便传入的网络数据包可以访问特定端口上的服务器。导航到防火墙规则的页面:https://console.cloud.google.com/networking/firewalls,点击左侧的 Firewall Rule 然后在右侧底部点击“Create”按钮。
Create Firewall
在生成的页面上,填写以下字段:
Name: 为此防火墙规则添加名称;
Source IP ranges: 0.0.0.0/0
Allowed protocols and ports: tcp:8000
最后,我们需要配置 Jupyter Notebook 来使用前面为防火墙指定的 TCP 端口。
为生成配置文件,需运行如下命令:
至此,我们已经完成了所有的设置,让我们使用以下的标记来启动 Jupyter Notebook:
在本地计算机上,导航到 URLhttp://YOUR_STATIC_IP_ADDRESS:8000,你将会看到 Jupyter Notebook 的欢迎登录页面!