無(wú)論你是想在本地機(jī)器上榨干內(nèi)存,還是只希望代碼在更強(qiáng)大的機(jī)器上運(yùn)行得更快,在云服務(wù)器上進(jìn)行數(shù)據(jù)科學(xué)研究都有很多優(yōu)勢(shì)。云服務(wù)器實(shí)際上就相當(dāng)于一臺(tái)電腦,就跟你現(xiàn)在使用的電腦一樣,只不過(guò)它位于別處罷了。
在本文中,我們將介紹如何在 Google Cloud Platform(GCP)上搭建一個(gè)數(shù)據(jù)科學(xué)環(huán)境。Google 采購(gòu)了數(shù)十萬(wàn)臺(tái)個(gè)人計(jì)算機(jī),使用定制軟件在世界各地?cái)?shù)據(jù)中心管理它們,并提供這些計(jì)算機(jī)的租用業(yè)務(wù)。由于云托管公司提供的經(jīng)濟(jì)規(guī)模,個(gè)人或團(tuán)隊(duì)可以按需訪(fǎng)問(wèn)具有大量 CPU 和內(nèi)存的強(qiáng)大的計(jì)算機(jī)。
當(dāng)你決定將設(shè)置從筆記本或臺(tái)式機(jī)遷移到云數(shù)據(jù)科學(xué)環(huán)境時(shí),重要的是,要考慮哪些標(biāo)準(zhǔn)對(duì)你來(lái)說(shuō)最重要。比如,如果要在 pandas 中處理更大的數(shù)據(jù)集,那么擁有大量?jī)?nèi)存就非常重要。為了能夠配合 Spark 處理大型數(shù)據(jù)集,我們就需要租用具有大量?jī)?nèi)存的計(jì)算機(jī)池來(lái)共享負(fù)載。
與其他云服務(wù)提供商(如 Amazon AWS、Microsoft Azure、DigitalOcean Droplet)一樣,GCP 也包含許多不同的產(chǎn)品和服務(wù)。
為了能夠自由地安裝任何我們想要的庫(kù)或工具,我們需要訪(fǎng)問(wèn) GCP 上的虛擬計(jì)算機(jī)。這稱(chēng)為虛擬機(jī)實(shí)例。租用虛擬機(jī)實(shí)例并不能讓我們?cè)L問(wèn)自己的專(zhuān)用計(jì)算機(jī)(向云服務(wù)提供商租用專(zhuān)用計(jì)算機(jī)的費(fèi)用要高得多),而只能訪(fǎng)問(wèn)我們想要的 CPU 和內(nèi)存:
啟動(dòng) Google Compute Engine 實(shí)例
導(dǎo)航到 VM 實(shí)例頁(yè)面:
https://console.cloud.google.com/projectselector/compute/instances系統(tǒng)會(huì)要求你使用 Google 憑據(jù)登陸并創(chuàng)建一個(gè)項(xiàng)目。完成后,你將進(jìn)入 VM 實(shí)例頁(yè)面。
要?jiǎng)?chuàng)建新的虛擬實(shí)例,單擊 CREATE INSTANCE,你將進(jìn)入一個(gè)頁(yè)面,你可以在其中定制你想租用的實(shí)例的不同屬性:
Name: 命名你的實(shí)例,我們只使用了缺省名稱(chēng)。
Zone: 服務(wù)器所在的地理區(qū)域。我們選擇了 us-east1-b,但你可以隨意選擇離你最近的實(shí)例:https://cloud.google.com/compute/docs/regions-zones/
Machine Type: 你想讓租用的機(jī)器有多強(qiáng)大?;叵胍幌拢憧梢栽诖隧?yè)面(https://cloud.google.com/compute/pricing)了解不同的機(jī)器類(lèi)型,在每月預(yù)算中進(jìn)行選擇。
Boot Disk: 選擇你希望虛擬實(shí)例啟動(dòng)哪種操作系統(tǒng)。我們選擇了 Ubuntu 16.04 LTS,一款流行的 Linux 分發(fā)版。
Firewall: 設(shè)置允許哪些網(wǎng)絡(luò)流量。我們使用默認(rèn)設(shè)置保留此流量。
當(dāng)你就緒后,點(diǎn)擊 Create 按鈕。
啟動(dòng) Google Compute Engine 實(shí)例之后,可以直接從 Google Compute Engine 頁(yè)面來(lái)啟動(dòng)控制臺(tái):
我們將使用此控制臺(tái)設(shè)置數(shù)據(jù)科學(xué)環(huán)境的其余部分。如果你不熟悉命令行,我建議你查看我們的課程:
Command Line:Beginner:https://www.dataquest.io/course/command-line-beginner
Command Line:Intermediate:https://www.dataquest.io/course/command-line-intermediate首先,安裝 anaconda(參見(jiàn)https://conda.io/docs/user-guide/tasks/manage-pkgs.html)。在命令行中,最簡(jiǎn)單的方法是使用 curl 下載二進(jìn)制安裝文件。unix 工具 curl 從指定的 URL 下載文件,并使用 -O 標(biāo)記寫(xiě)入文件(而不是立即顯示下載內(nèi)容):
在安裝過(guò)程中,你將會(huì)有幾次需要輸入 yes 來(lái)接受許可證。安裝完成后,你還需要將 conda 程序添加到你的 PATH(可參見(jiàn)https://kb.iu.edu/d/acar)中。這個(gè) PATH 允許你指定希望操作系統(tǒng)搜索程序的目錄。
現(xiàn)在已經(jīng)安裝好 anaconda,我們就可以創(chuàng)建一個(gè)新的 anaconda 環(huán)境(詳見(jiàn)https://conda.io/docs/user-guide/tasks/manage-environments.html)。由于我們?cè)?Dataquest 上使用 Python 3.5 授課,因此在本文我們?nèi)匀皇褂眠@個(gè)版本:
現(xiàn)在,我們?cè)诖藢?shí)例中運(yùn)行的 Jupyter Notebook 服務(wù)器無(wú)法通過(guò)本地計(jì)算機(jī)上的 Web 瀏覽器訪(fǎng)問(wèn)。要理解為什么會(huì)這樣子,讓我們想一想在自己的計(jì)算機(jī)本地上運(yùn)行 Jupyter Notebook 會(huì)發(fā)生什么事情:只有本地計(jì)算機(jī)才能通過(guò) Web 瀏覽器訪(fǎng)問(wèn) Jupyter Notebook 服務(wù)器(通常訪(fǎng)問(wèn)地址是 localhost:8888)。
但如果在局域網(wǎng)(WiFi 或以太網(wǎng))上的其他人知道你的 IP 地址和運(yùn)行 Jupyter Notebook 的端口(通常是 8888),那他們可以通過(guò) Web 瀏覽器訪(fǎng)問(wèn)它:http://OUR_IP_ADDRESS:8888。
通過(guò)這兩個(gè)主要調(diào)整,我們也可以為云實(shí)例復(fù)制這種訪(fǎng)問(wèn)功能。缺省情況下,云實(shí)例的防火墻設(shè)置為阻止傳入的網(wǎng)絡(luò)訪(fǎng)問(wèn)。此外,大多數(shù)云服務(wù)提供商經(jīng)常更改實(shí)例的 IP 地址(實(shí)際上,只要他們?cè)敢?,隨時(shí)都可以更改!)這就意味著,如果我們的實(shí)例當(dāng)前 IP 地址是 35.227.18.17,它只能保持一陣,不能長(zhǎng)期依賴(lài)這個(gè) IP 地址。
然而,我們也可以把動(dòng)態(tài) IP 地址更改為靜態(tài) IP 地址。
要把實(shí)例的 IP 地址更改為靜態(tài) IP 地址,請(qǐng)?jiān)?Google Cloud Platform 的左側(cè)依次展開(kāi) Networking→VPC networ→External IP address。
你還可以直接通過(guò)這個(gè) URL:https://console.cloud.google.com/networking/addresses 直接跳到這個(gè)頁(yè)面。
請(qǐng)注意:如果你聲明了一個(gè)靜態(tài) IP 地址,正在運(yùn)行的機(jī)器沒(méi)有與靜態(tài) IP 地址關(guān)聯(lián),Google 將會(huì)收取少量費(fèi)用。在 Iowa 州,截止 2017 年 12 月,這個(gè)收取少量費(fèi)用的成本是每小時(shí) 1 美分,如下圖所示:
Static IP Cost
你可以通過(guò)訪(fǎng)問(wèn)這個(gè)頁(yè)面https://cloud.google.com/compute/pricing 并向下滾動(dòng)到未使用的 IP 地址價(jià)格,了解未使用的靜態(tài) IP 地址價(jià)格更多的信息。
現(xiàn)在我們有了一個(gè)靜態(tài) IP 地址,本地計(jì)算機(jī)就可以與云實(shí)例通信了。不幸的是,大多數(shù)云提供商都有防火墻,阻止了對(duì)大多數(shù)端口的傳入訪(fǎng)問(wèn)。值得慶幸的是,我們可以手動(dòng)為端口 8000 添加一個(gè)例外,Jupyter Notebook 服務(wù)器使用這個(gè)例外來(lái)接收傳入的請(qǐng)求。
現(xiàn)在讓我們使用自定義防火墻規(guī)則,以便傳入的網(wǎng)絡(luò)數(shù)據(jù)包可以訪(fǎng)問(wèn)特定端口上的服務(wù)器。導(dǎo)航到防火墻規(guī)則的頁(yè)面:https://console.cloud.google.com/networking/firewalls,點(diǎn)擊左側(cè)的 Firewall Rule 然后在右側(cè)底部點(diǎn)擊“Create”按鈕。
Create Firewall
在生成的頁(yè)面上,填寫(xiě)以下字段:
Name: 為此防火墻規(guī)則添加名稱(chēng);
Source IP ranges: 0.0.0.0/0
Allowed protocols and ports: tcp:8000
最后,我們需要配置 Jupyter Notebook 來(lái)使用前面為防火墻指定的 TCP 端口。
為生成配置文件,需運(yùn)行如下命令:
至此,我們已經(jīng)完成了所有的設(shè)置,讓我們使用以下的標(biāo)記來(lái)啟動(dòng) Jupyter Notebook:
在本地計(jì)算機(jī)上,導(dǎo)航到 URLhttp://YOUR_STATIC_IP_ADDRESS:8000,你將會(huì)看到 Jupyter Notebook 的歡迎登錄頁(yè)面!