使用DC/OS為企業(yè)數(shù)據(jù)科學(xué)加速!
譯文【51CTO.com快譯】作為一名專注于構(gòu)建和交付新產(chǎn)品的全棧機(jī)器學(xué)習(xí)顧問,我常發(fā)現(xiàn)自己處于數(shù)據(jù)科學(xué)、數(shù)據(jù)工程和開發(fā)運(yùn)維的交匯點(diǎn)。因此,我一直非常關(guān)注數(shù)據(jù)科學(xué)平臺即服務(wù)(PaaS)的興起。我最近著手評估不同的平臺即服務(wù)(PaaS)及其使數(shù)據(jù)科學(xué)操作實(shí)現(xiàn)自動化的潛力。我在探究它們的功能,然后使用一個或多個PaaS使代碼的設(shè)置和執(zhí)行實(shí)現(xiàn)自動化。
為什么是DC/OS Data Science Engine?
在任何一個給定的云環(huán)境,比如亞馬遜網(wǎng)絡(luò)服務(wù)(AWS)、谷歌云平臺(GCP)和微軟Azure,設(shè)置Jupyter筆記本(notebook)變得很容易,以便數(shù)據(jù)科學(xué)家個人能夠工作。對于初創(chuàng)公司和小型數(shù)據(jù)科學(xué)團(tuán)隊(duì)來說,這是一個很好的解決方案。什么都不需要維護(hù),筆記本可以保存在Github中以實(shí)現(xiàn)持久性和共享。
對于大型企業(yè)來說,事情可沒有這么簡單。在這種規(guī)模下,由于環(huán)境和建模變得不可重現(xiàn),跨多云的短暫資產(chǎn)上的臨時(shí)環(huán)境會帶來混亂而不是有序。企業(yè)跨多云和在本地運(yùn)作,有特定的訪問控制和驗(yàn)證要求,需要能夠訪問內(nèi)部資源,用于數(shù)據(jù)、源控制、數(shù)據(jù)流及其他服務(wù)。
對于這些組織而言,DC/OS Data Science Engine提供了統(tǒng)一的系統(tǒng),該系統(tǒng)提供Python機(jī)器學(xué)習(xí)堆棧、Spark、Tensorflow及其他深度學(xué)習(xí)框架,包括TensorFlowOnSpark,以實(shí)現(xiàn)分布式多節(jié)點(diǎn)多GPU模型訓(xùn)練。這是非常引人注目的方案,設(shè)置后直接可以使用,為大型的數(shù)據(jù)科學(xué)團(tuán)隊(duì)和公司大大消除了沮喪和復(fù)雜性。
AWS上的Data Science Engine
DC/OS Universal Installer是一個terraform模塊,可輕松啟動DC/OS集群,帶有用于訓(xùn)練神經(jīng)網(wǎng)絡(luò)的GPU實(shí)例。這里有個地方要注意:你擁有足夠多的通過亞馬遜的服務(wù)限制授權(quán)的GPU實(shí)例。AWS Service Limits定義了你可以在任何給定區(qū)域使用多少AWS資源。默認(rèn)分配的GPU實(shí)例為零,可能需要一兩天才能授權(quán)更多實(shí)例。如果你需要加快速度,可以進(jìn)入到AWS支持中心,請求與專員聯(lián)系。他們通常可以大大加快進(jìn)程。
想使用Terraform引導(dǎo)集群,我們只需要在paas_blog/dcos/terraform/desired_cluster_profile.tfvars中編輯下列變量:
- cluster_owner = "rjurney"
- dcos_superuser_password_hash = "${file("dcos_superuser_password_hash")}"
- dcos_superuser_username = "rjurney"
- dcos_license_key_contents = ""
- dcos_license_key_file = "./license.txt"
- dcos_version = "1.13.4"
- dcos_variant = "open"
- bootstrap_instance_type = "m5.xlarge"
- gpu_agent_instance_type = "p3.2xlarge"
- num_gpu_agents = "5"
- ssh_public_key_file = "./my_key.pub"
并運(yùn)行下列命令:
- bash
- terraform init -upgrade
- terraform plan -var-file desired_cluster_profile.tfvars -out plan.out
- terraform apply "plan.out"
apply命令的輸出將包括一個或多個主節(jié)點(diǎn)的IP,這只對你的IP開放。打開master url會顯示登錄屏幕,你可以使用Google、Github、微軟或預(yù)先配置的密碼來驗(yàn)證身份。
一旦你完成這步,想拆除集群,請運(yùn)行:
- bash
- terraform destroy --auto-approve --var-file desired_cluster_profile.tfvars
可以從DC/OS Web控制臺找到Data Science Engine以及Catalog菜單上的其他諸多服務(wù),比如Kafka、Spark和Cassandra。我們只需要選擇“data-science-engine”軟件包,配置提供服務(wù)的資源:CPU、RAM和GPU。如果需要,還有許多其他選項(xiàng),但它們不是必需的。
一旦我們點(diǎn)擊了Review & Run并確認(rèn),將進(jìn)入到服務(wù)頁面。幾秒鐘內(nèi)完成部署后,我們只需點(diǎn)擊服務(wù)名稱上的箭頭,便進(jìn)入到JupyterLab實(shí)例。
JupyterLab的Github模塊很出色,已預(yù)先安裝,可以輕松加載我為了測試系統(tǒng)而創(chuàng)建的教程筆記本。點(diǎn)擊Github圖標(biāo),輸入rjurney,其中顯示可調(diào)出我的公共存儲庫列表。選擇paas_blog,然后雙擊DCOS_Data_Science_Engine.ipynb Jupyter筆記本即可打開它。它使用S3上的數(shù)據(jù),因此不必下載任何數(shù)據(jù)。
本教程基于一個名為Kim-CNN的卷積神經(jīng)網(wǎng)絡(luò)文檔分類器模型,為786個最頻繁的標(biāo)簽創(chuàng)建了一個Stack Overflow標(biāo)記器(tagger)。筆記本是深度網(wǎng)絡(luò)和自然語言處理(NLP)所常見的。我們先驗(yàn)證GPU支持在Tensorflow中適用,我們還遵循為所有模型參數(shù)定義變量的最佳做法,以方便搜索超參數(shù)。然后,在執(zhí)行測試/訓(xùn)練拆分之前,我們對標(biāo)簽進(jìn)行標(biāo)記化、填充并轉(zhuǎn)換成矩陣,以便一旦訓(xùn)練完畢,我們就能獨(dú)立驗(yàn)證模型的性能。
- python
- tokenizer = Tokenizer(
- num_words=TOKEN_COUNT,
- oov_token='__PAD__'
- )
- tokenizer.fit_on_texts(documents)
- sequences = tokenizer.texts_to_sequences(documents)
- padded_sequences = pad_sequences(
- sequences,
- maxlen=MAX_LEN,
- dtype='int32',
- padding='post',
- truncating='post',
- value=1
- )
Kim-CN使用不同長度的一維卷積和max-over-time pooling方法,連接結(jié)果,這些結(jié)果進(jìn)入到較低維度的密集層,然后最終的sigmoid函數(shù)激活與標(biāo)簽對應(yīng)的密集層。模型的核心已在下面實(shí)現(xiàn),作了幾處改動。 來源:Yoon Kim所著的《用于句子分類的卷積神經(jīng)網(wǎng)絡(luò)》
- python
- # Create convlutions of different sizes
- convs = []
- for filter_size in FILTER_SIZE:
- f_conv = Conv1D(
- filters=FILTER_COUNT,
- kernel_size=filter_size,
- padding=CONV_PADDING,
- activation=ACTIVATION
- )(drp)
- f_shape = Reshape((MAX_LEN * EMBED_SIZE, 1))(f_conv)
- f_pool = MaxPool1D(filter_size)(f_conv)
- convs.append(f_pool)
- l_merge = concatenate(convs, axis=1)
- l_conv = Conv1D(
- 128,
- 5,
- activation=ACTIVATION
- )(l_merge)
- l_pool = GlobalMaxPool1D()(l_conv)
- l_flat = Flatten()(l_pool)
- l_drp = Dropout(CONV_DROPOUT_RATIO)(l_flat)
- l_dense = Dense(
- 60,
- activation=ACTIVATION
- )(l_drp)
- out_dense = Dense(
- y_train.shape[1],
- activation='sigmoid'
- )(l_dense)
雖然數(shù)據(jù)經(jīng)過上采樣(upsampled)以平衡類,仍存在足夠的不平衡,我們需要計(jì)算類權(quán)重,幫助模型學(xué)會預(yù)測常見標(biāo)簽和不常見標(biāo)簽。若沒有類權(quán)重,損失函數(shù)(loss function)對常見標(biāo)簽和不常見標(biāo)簽同等處理,導(dǎo)致模型不可能預(yù)測不常見標(biāo)簽。
Python
- train_weight_vec = list(np.max(np.sum(y_train, axis=0)) / np.sum(y_train, axis=0))
- train_class_weights = {i: train_weight_vec[i] for i in range(y_train.shape[1])}
我們關(guān)注的主要度量標(biāo)準(zhǔn)是類別準(zhǔn)確性,因?yàn)榧词?86個標(biāo)簽中有一個預(yù)測不正確,二進(jìn)制準(zhǔn)確性也無法通過預(yù)測。
為了便于進(jìn)行可重復(fù)的實(shí)驗(yàn),我們將最終的度量標(biāo)準(zhǔn)名稱調(diào)整為可重復(fù)的(即val_precision_66變?yōu)関al_precision,然后將我們跟蹤的度量標(biāo)準(zhǔn)附加到pandas DataFrame日志末尾,我們既可以直觀顯示當(dāng)前和先前運(yùn)行的結(jié)果,還可以直觀顯示作出變更后兩次運(yùn)行之間的性能變化。
我們還想知道每次epoch的性能,那樣我們不用訓(xùn)練數(shù)量過多的epoch。我們使用matplotlib繪制幾個度量標(biāo)準(zhǔn)以及每次epoch的測試/訓(xùn)練損失。
最后,光了解理論性能還不夠。我們需要在不同的置信度閾值下查看標(biāo)記器的實(shí)際輸出。我們?yōu)镾tack Overflow問題、它們的實(shí)際標(biāo)簽以及我們預(yù)測的標(biāo)準(zhǔn)創(chuàng)建了一個DataFrame,以便我們直接演示模型及其實(shí)際性能。
該平臺完美地運(yùn)行本教程,我是指雖然它是新的,但已經(jīng)適合實(shí)際的數(shù)據(jù)科學(xué)工作負(fù)載。
使DC/OSData Science Engine的設(shè)置實(shí)現(xiàn)自動化
這包括你如何手動使用平臺,但本文關(guān)注的是PaaS自動化。那么我們?nèi)绾渭涌焖俣饶?
DC/OS的圖形用戶界面和CLI共同使所有類型的用戶都可以通過Data Science Engine輕松訪問JupyterLab:非技術(shù)管理人員想在筆記本中查看報(bào)告,開發(fā)運(yùn)維人員/數(shù)據(jù)工程師希望使流程實(shí)現(xiàn)自動化。如果手動GUI流程似乎很復(fù)雜,一旦我們擁有作為JSON文件的服務(wù)配置,僅用幾行代碼就可以使它實(shí)現(xiàn)自動化,為此通過Terraform命令啟動DC/OS集群,從Terraform獲得集群地址,然后使用DC/OS CLI對集群進(jìn)行身份驗(yàn)證并運(yùn)行服務(wù)。
DC/OS GUI提供了粘貼到外殼中的命令,以安裝和配置CLI,我們使用CLI使集群和服務(wù)的設(shè)置實(shí)現(xiàn)自動化。
你可以使用GUI通過導(dǎo)出服務(wù)配置使設(shè)置實(shí)現(xiàn)自動化。
服務(wù)配置本身非常簡單:
- json
- {
- "service": {
- "name": "data-science-engine",
- "cpus": 8,
- "mem": 51200,
- "gpu": {
- "enabled": true,
- "gpus": 1
- }
- }
- }
然后你只用一個命令即可安裝服務(wù):
- bash
- dcos package install data-science-engine --options=data-science-engine-options.json
如果光使用CLI實(shí)現(xiàn)全面的自動化,你可以創(chuàng)建集群,并啟動Data Science Engine,僅用6個命令即可:
- bash
- # Boot DC/OS Cluster
- terraform init -upgrade
- terraform plan -var-file desired_cluster_profile.tfvars -out plan.out
- terraform apply plan.out
- # Get the cluster address from Terraform's JSON output
- export CLUSTER_ADDRESS = `terraform output -json | jq -r '.["masters-ips"].value[0]'`
- # Authenticate CLI to Cluster using its address and Install the Data Science Engine Package
- dcos cluster setup http://$CLUSTER_ADDRESS # add whatever arguments you need for automated authentication
- dcos package install data-science-engine --options=data-science-engine-options.json
這六個命令用于設(shè)置DC/OS集群,眾多可用服務(wù)只需點(diǎn)擊一下即可獲得,包括可以運(yùn)行Spark任務(wù),并執(zhí)行分布式Tensorflo訓(xùn)練的JupyterLab實(shí)例。這不賴!
結(jié)束語
總之,DC/OS Data Science Engine給我留下了深刻的印象。手動設(shè)置很容易,環(huán)境適合實(shí)際使用,結(jié)果證明自動化很容易。如果你想了解更多信息,請?jiān)诖颂?a >查看全文,相應(yīng)代碼詳見此處:github.com/rjurney/paas_blog。
原文標(biāo)題:Using DC/OS to Accelerate Data Science in the Enterprise,作者:Russell Jurney
【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請注明原文譯者和出處為51CTO.com】