機器學習即服務将Python機器學習創意快速轉變為雲端Web應用程式
Monetizing Machine Learning: Quickly Turn Python ML Ideas into Web Applications on the Serverless Cloud

曼紐爾·阿米納特吉(Manuel Amunategui)
邁赫迪·洛佩伊(Mehdi Roopaei)
劉世民 山金孝 史天 肖力 譯
第1章
無伺服器計算介紹
本章中,我們将建立一個非常簡單的Flask Web應用程式(圖1-1)。在後面章節中,當我們在亞馬遜AWS、谷歌雲、微軟Azure和PythonAnywhere上探索基于公有雲的Web服務時,會不斷地用到這個應用程式。
在開始雲端之旅之前,最好先在本地計算機上使用本地版本的網站。
提示:請通路www.apress.com/9781484238721 ,單擊“Download source code”按鈕,跳轉至GitHub網站,下載下傳第1章所需檔案。推薦使用Jupyter Notebook打開chapter1.ipynb檔案,以配合閱讀本章内容。
1.1 一個簡單的本地Flask應用程式
本節中的代碼非常簡單,你可以從頭開始編寫代碼,也可以使用simple-local-flask-application檔案夾中的檔案。
第1步:基本的“Hello World!”示例
讓我們直接從官方的Flask幫助文檔建立一個非常簡單的Flask腳本(代碼清單1-1)。
就是這樣子!盡管這并沒有太多内容,但它代表了使Flask網站啟動和運作所需的最低要求,實際上這是一個真正的Web應用程式。将腳本儲存為本地計算機上的main.py(你可以将其命名為任何名稱)。
第2步:啟動虛拟環境
使用虛拟環境來隔離開發工作總是一個好主意(這在建構requirements.txt檔案時也很友善—請參閱“前言”中的“建立requirements.txt檔案”)。讓我們啟動一個虛拟環境(代碼清單1-2)。
第3步:安裝Flask
這裡假設你可以運作“pip3”來安裝庫檔案,或者使用你通常用于Python 3.x的任何安裝工具或檢視官方Flask文檔,參見代碼清單1-3。
第4步:運作Web應用程式
打開指令/終端視窗并在Mac或Windows上輸入以下指令(代碼清單1-4和代碼清單1-5)。
第5步:在浏覽器中檢視
你應該在指令視窗中看到以下消息,提供要運作的本地HTTP位址。複制它并将其放入浏覽器的位址欄中(代碼清單1-6)。
然後打開浏覽器并複制/粘貼(或輸入)列出的本地位址(圖1-2)。
第6步:更快一點的方式
這就是由伺服器生成網頁。通過在main.py腳本的末尾添加以下兩行,你就可更輕松地在本地啟動Flask應用程式。這僅适用于本地模式,但允許腳本本身運作執行個體化的Flask應用程式,并允許你跳過設定環境變量的步驟(代碼清單1-7)。
儲存添加了新代碼的main.py腳本,現在它是代碼清單1-8的樣子了。
傳回指向修改後腳本的指令/終端視窗,并輸入以下簡化指令(代碼清單1-9)。
第7步:全部應用程式
要停止Web應用程式提供“Hello World!”頁面,請在終端視窗中輸入ctrl-c。
我們在腳本的最後一行設定debug标志為true。這會使腳本将任何Flask錯誤直接列印到浏覽器中。這是快速開發和調試腳本的一個很好特征,但請記住在移至雲之前将其變為false。
最後,終止你的虛拟環境(代碼清單1-10)。
1.2 在微軟Azure上使用無伺服器計算
Azure雲為Web應用程式提供了易于使用的、支援無伺服器計算的、完全托管的平台,以及大量可自定義的選項,涉及從存儲到資料庫、監控和分析(圖1-3)。
讓我們看看如何在微軟Azure的無伺服器計算Web應用程式上運作基本Flask應用程式。在這裡,我們将盡可能簡化步驟,因為後續章節中将深入探讨此程式。
提示:請通路www.apress.com/9781484238721 ,單擊“Download source code”按鈕,請下載下傳第1章所需檔案,然後打開serverless-hosting-on-microsoft-azure檔案夾。
1.2.1 操作步驟
第1步:擷取微軟Azure上的賬戶
你需要一個微軟Azure賬戶。在撰寫本書時,微軟針對所有服務提供了價值200美元為期30天的試用,并可以在接下來的12個月中免費通路這些服務。有關詳細資訊,請參閱
https://azure.microsoft.com/en-us/free/。
第2步:下載下傳源檔案
将本章所需檔案下載下傳到本地計算機上,然後切換到名為serverless-hosting-on-microsoft-azure的檔案夾。你的本地檔案夾結構應如下所示(請注意Flask腳本的名稱main.py,這是Azure上的預設設定,見代碼清單1-11)。
支援性檔案
requirements.txt檔案包含Web應用程式所需的Python庫名稱,并在應用程式部署期間被無伺服器計算使用。你可以建立自己的requirements.txt,并将其存放在與Flask腳本main.py相同的檔案夾中。在這種情況下,它隻包含一個庫和一個版本要求(代碼清單1-12)。
web.3.4.config是Web伺服器的配置檔案。我們将使用Python 3.4版本并使用預設值。如果你決定進一步探索此雲提供商,那麼一定要打開它并檢視其中的内容。
第3步:安裝Git
對于此項目,你需要在本地計算機上安裝Git(可以在www.git-scm.com/downloads 上找到二進制安裝檔案)。如前所述,Git是一個源代碼版本控制工具,是一個完全就緒的Git包,支援将代碼推送到微軟Azure上(參見“前言”中關于Git的簡介)。在大多數章節中,我們将建立一個虛拟環境來運作以下步驟,但由于這已經是一個大項目,為簡單起見我們跳過它。
打開終端/指令行視窗,并将其指向本章的serverless-hosting-on-microsoft-azure檔案夾,初始化Git會話(代碼清單1-13)。
接下來,添加serverless-hosting-on-microsoft-azure檔案夾中的所有Web應用程式檔案并檢查其狀态(代碼清單1-14和圖1-4)。
建構一個本地Git送出并添加一個有意義的注釋,以防将來需要重新通路過去的操作(代碼清單1-15)。
所需檔案都在本地存儲庫中。有關Git部署到Azure應用服務的更多資訊,請通路
https://docs.microsoft.com/en-us/azure/app-service/app-service-deploy-local-git第4步:打開Azure雲Shell
登入微軟Azure儀表闆,單擊“>_”打開Azure雲Shell(圖1-5)。
系統将提示你建立Linux或Power Shell視窗,這裡選擇Linux,因為這些指令将與你在本地終端視窗中使用的指令類似(圖1-6)。
它還會提示你建立存儲庫,以便托管應用程式(圖1-7)。如果這是你第一次操作,可能會在下拉清單中看到“Free Trial”選項。無論哪種方式,請使用它并建立存儲庫。
第5步:建立部署使用者
你現在應該在Azure雲Shell中了。該使用者将擁有使用FTP和本地Git的适當權限。這裡,将使用者名設定為“flaskuser11”,密碼設定為“flask123”。建立你自己的使用者名并記住它,因為将來會用到它(代碼清單1-16)。
該指令和大多數後續指令的輸出都将與下面的螢幕截圖類似。仔細檢視任何錯誤或問題并進行針對性修複(代碼清單1-17)。
你的輸出JSON應該是空的。如果你看到“conflict”(沖突),說明你所輸入的“user-name”與已有使用者名沖突了;如果你看到“bad request”(錯誤的請求),說明你的密碼不符合規範(它最少需包含8個字元,由多個字元、數字和符号組成)。
第6步:建立資源組
這一步需要在靠近你所在位置的某個區域中建立一個資源組—在這裡的例子中為“West US”(有關區域,請參閱
https://azure.microsoft.com/en-us/regions/或使用指令“az appservice list-location --sku FREE”—參見代碼清單1-18)。
第7步:建立Azure服務計劃
建立Azure服務計劃,并将其名稱設定為“myAppServicePlan”(你可以任意設定,見代碼清單1-19)。
第8步:建立Web應用程式
接下來,建立一個Web應用程式并設定其名稱(它必須是唯一的)。這裡通過name參數将應用程式名稱設定為AmunateguiIntroWebApp,并通過deployment參數設定代碼部署方式為通過本地Git部署代碼(代碼清單1-20)。
檢視“az webapp create”指令傳回的長字元串,複制“Local git is configured with url of…”後的連結,或者直接使用“deploymentLocalGitUrl”,因為兩者是相同的,你可以任選其一。将Flask檔案推送到Azure時,将需要這個連結(代碼清單1-21)。
提取Azure項目的本地Git配置URL(代碼清單1-22和代碼清單1-23)。
檢查你的網站
如果一切正常,現在你應該可以通路網站了。使用你在az webapp create指令中所設定的應用程式名稱來替換<>部分,并将其複制到浏覽器中(代碼清單1-24和圖1-8)。
如果你看到的不是這樣子,就需要再次檢查每個步驟,確定你沒有錯過任何一個錯誤。
第9步:釋出Web應用程式
現在我們回到本地計算機上的本地終端/指令視窗,确認它指向正确的目錄,以及Git會話已經被初始化了。将我們之前儲存的URL與Git存儲庫的位置附加到“add azure”指令(代碼清單1-25)。
它可能會提示你輸入密碼,使用你在“az webapp development user”步驟中所建立的密碼(這裡的例子中是“flask123”,見代碼清單1-26)。
第10步:在浏覽器中檢視
現在是最後一步了!傳回浏覽器視窗并點選重新整理(或打開新的浏覽器視窗并輸入
http://<>.azurewebsites.net),你将看到“Hello World!”(圖1-9)。
如果沒有看到“Hello World!”,你可以直接在指令視窗中檢視日志—隻需更換網站名稱(這裡的例子中為amunateguiintroapp)群組(這裡的例子中為myResourceGroup),參見代碼清單1-27。
第11步:不要忘記删除你的Web應用程式!
如果你不再使用Web應用程式,請不要忘記删除它。如果不這麼做,計費将一直持續。删除所有内容的最簡單方法是登入Azure儀表闆并在搜尋欄中輸入“All resources”,然後删除你建立的所有内容(圖1-10)。
1.2.2 結論和附加資訊
微軟Azure是一個功能強大的雲提供商,提供豐富多彩的雲産品。它可以運作簡單的Flask應用程式并快速部署。如果需要加載更複雜的庫,需要Python wheels的支援(
https://pythonwheels.com/)。
有關其他資訊,請參閱微軟Azure文檔上标題為“Create a Python web app in Azure”的優秀文章,本節參考了此文章:
https://docs.microsoft.com/en-us/azure/app-service/app-service-web-get-started-python 。
1.3 在谷歌雲上使用無伺服器計算
谷歌雲是一個用于建構、管理和部署Web應用程式的強大平台。它可以與TensorFlow及其分布式圖機制無縫內建(圖1-11)。
我們看看如何在谷歌雲的無伺服器計算App Engine上運作基本Flask應用程式。這裡盡可能簡化步驟,因為後續章節中将進行深入探讨。
提示:請通路www.apress.com/9781484238721 ,單擊“Download source code”按鈕,下載下傳第1章所需檔案,然後打開serverless-hosting-on-google-cloud檔案夾。
1.3.1 操作步驟
第1步:擷取谷歌雲賬戶
在撰寫本書時,Google正提供一個為期12個月價值300美元的免費試用配額,以幫助你入門。有關詳細資訊,請參閱
https://console.cloud.google.com/start你可以選擇兩種類型的App Engine:标準環境(Standard Environment),它簡單但定制性不強;靈活環境(Flexible Environment),可以處理或多或少的任意内容。在本節我們将使用更簡單的引擎,即标準環境。
将本章的檔案下載下傳到本地計算機上,然後切換到名為serverless-hosting-on-google-cloud的檔案夾(代碼清單1-28)。
app.yaml聲明Flask Python應用程式(在本例中為main)與static和templates在相同的檔案夾下(代碼清單1-29)。
appengine_config.py指向lib檔案夾,以在部署期間儲存其他Python庫(代碼清單1-30)。
requirements.txt檔案包含将被安裝和添加到lib檔案夾的Python庫的名稱和版本(代碼清單1-31)。
main.py是控制Flask Python應用的“大腦”,它包含每個HTML頁面的所有Python代碼和指令(代碼清單1-32)。
第3步:打開谷歌雲Shell
登入你的谷歌雲執行個體,然後選擇App Engine所在的項目(如果還沒有,請參閱建立和管理項目文檔:
https://cloud.google.com/resource-manager/docs/creating-managing-projects)。單擊右上角的按鈕來啟動雲Shell指令行工具,這将在GCP儀表闆的下半部分打開一個熟悉的指令行視窗(圖1-12)。
在GCP儀表闆終端中,建立一個名為GoogleCloudFlaskIntro的新檔案夾(代碼清單1-33)。
第4步:将Flask檔案上傳到谷歌雲
上傳有很多方法,可以逐個上傳檔案,或克隆GitHub存儲庫,或将它們壓縮到一個存檔檔案中再一次性上傳所有檔案。我們選擇最後一種方法。将app.yaml、appengine_config.py、main.py和requirements.txt這四個檔案壓縮到一個存檔檔案中(圖1-13)。
使用Upload file選項上傳它(可在Shell視窗的右上角找到三個垂直點,圖1-14)。
它會将檔案(這裡的例子中為Archive.zip)上傳到根目錄,是以你需要将其移動到GoogleCloudFlaskIntro檔案夾并解壓縮(代碼清單1-34)。
運作pip install -t lib指令,以安裝在requirements. txt檔案中所定義的所有庫(代碼清單1-35)。這将建立必要的lib檔案夾,其中包含任何所需的Python庫。(如果不使用sudo,可能會收到一些提示,sudo會給你root權限,但請不要濫用它!)
此時,若運作“ls”指令,則雲中的檔案夾目錄應如下所示(代碼清單1-36)。
第5步:将Web應用程式部署到谷歌雲上
現在我們來部署Hello World站點。在儀表闆Shell視窗中的GoogleCloudFlaskIntro檔案夾下,運作gcloud app deploy指令。它會要求你進行确認,我們選擇“Y”(代碼清單1-37)。
如果一切順利,你可以友善地運作gcloud app browse指令來擷取網站的完整URL(代碼清單1-38)。
點選谷歌雲Shell中的連結或将其粘貼到浏覽器中(圖1-15)。
第6步:不要忘記删除你的Web應用程式!
如果你不再使用Web應用程式,請不要忘記删除它。如果不這樣做,費用将持續增加。如果它是你唯一的應用程式(你需要有預設應用程式),則不能僅僅删除App Engine應用程式,而是将流量重定向到空白應用程式。
在谷歌雲Shell中,使用“vi”指令啟動Linux文本編輯器(代碼清單1-39)。
這将打開一個小型指令行編輯器,然後按下“i”鍵插入或編輯檔案(代碼清單1-40和代碼清單1-41)。
你需要将app.yaml檔案的url句柄指向blank.app。因為blank.app是不存在的,是以應用不會提供任何服務,而且計費将被停止(代碼清單1-42)。
按下Esc鍵退出插入模式,輸入“wq”進行寫入并退出。然後重新部署Web應用程式(代碼清單1-43)。
部署操作在App Engine上生效後,URL應該顯示錯誤而不再是“Hello World”了(圖1-16)。
1.3.2 結論和附加資訊
GCP提供了許多特征,并與其他Google産品(如
https://cloud.google.com/apis/上的雲API)和TensorFlow緊密內建。如果你需要使用更強大的Python庫,則可以從标準App Engine切換到Flexible引擎。
有關其他資訊,請參閱谷歌雲文檔上标題為“Quickstart for Python App Engine Standard Environment”的文章:
https://cloud.google.com/appengine/docs/standard/python/quickstart順便說一句,如果你的谷歌雲App Engine出現任何問題,可以使用以下指令檢視日志(代碼清單1-44)。
1.4 在Amazon AWS上使用無伺服器計算
AWS Elastic Beanstalk是一個用于部署Web應用程式的簡單而強大的平台。它具有縮放、負載均衡、監控等所有功能,并且隻對所使用的資源收費(圖1-17)。
讓我們看看如何在Amazon AWS Elastic Beanstalk上運作基本Flask應用程式。我們将盡可能簡化步驟,因為後續章節中将深入探讨此程式。
提示: 請通路www.apress.com/9781484238721 ,單擊Download source code按鈕,下載下傳第1章所需檔案,然後打開serverless-hosting-on-amazon-aws檔案夾。
1.4.1 操作步驟
第1步:擷取Amazon AWS賬戶
Amazon AWS提供AWS Free Tier (免費套餐)賬戶,允許你免費試用某些服務。有關建立賬戶的更多資訊,請通路
https://aws.amazon.com/free/。
将本章的檔案下載下傳到本地計算機上,然後切換到名為serverless-hosting-on-amazon-aws的檔案夾。檔案夾結構應如代碼清單1-45所示。
第3步:為Elastic Beanstalk建立一個通路賬戶
登入AWS Web控制台并轉至Identity and Access Management(IAM)控制台。一種快速方法是在登入頁面的AWS服務搜尋框中輸入“IAM”。在導航部分選擇“Users”,然後單擊“Add user”按鈕(圖1-18)。
選擇一個使用者名,在這裡我們輸入“ebuser”,并選中“Access type: Programmatic access”(圖1-19)。
單擊“Next: Permissions”按鈕,這将帶你進入“Set permissions”頁面。單擊“Add user to group”菜單按鈕,然後單擊“Create group”。在目前例子中,建立組“ebadmins”,并為其配置設定政策“WSElasticBeanstalkFullAccess”,然後單擊“Create group”按鈕以完成操作(圖1-20)。
單擊“Next: review”按鈕,然後在下一頁上單擊“Create user”按鈕(圖1-21)。
一旦看到“Success”消息,就意味着你已成功建立ebuser賬戶。單擊“Download .csv”按鈕将.csv檔案下載下傳到本地計算機。此檔案很重要,因為它包含你的密鑰和密碼。将它存儲在本地計算機上的某個位置并記住它,因為當你上傳Web應用程式代碼以及通過Secure Shell(SSH)登入到你的EB中時你将需要這些資訊(我們在本節中不需要SSH,但在後續部分會用到)。
第4步:安裝Elastic Beanstalk(EB)
首先建立一個虛拟環境來隔離安裝,這不是必需的,但它可以幫助你通過将此環境與計算機的其餘部分分離來保持整潔(如果尚未安裝它,請參閱前面的“虛拟環境”部分)。參見代碼清單1-46。
安裝awsebcli庫以在AWS上互動和管理我們的EB服務(代碼清單1-47和代碼清單1-48)。
第5步:EB指令行界面
接下來初始化Elastic Beanstalk界面(代碼清單1-49)。
這将詢問你一系列問題,大多數情況下都可以選擇預設值。在“Enter Application Name”下,輸入“AWSBeanstalkIntroduction”(圖1-22)。
如果這是你第一次在計算機上運作AWS,它将要求你提供憑據。打開建立使用者時在計算機上下載下傳的credentials.csv,然後輸入所需的兩個字段(圖1-23)。
使用Python預設值(需要3.x版本),忽略警告。對SSH說“yes”(圖1-24)。
你可以建立新密鑰對,或繼續使用預設的現有密鑰對。如果建立一個新密鑰對,它會将其儲存在一個檔案夾中并告訴你位置(圖1-25)。
接下來,需要建立你的EB(該名稱必須唯一)。此指令将自動壓縮檔案夾中的資料并将其上傳到AWS雲(代碼清單1-50和代碼清單1-51)。這可能需要幾分鐘,是以請耐心等待。
第6步:等待運作
這需要幾分鐘,如果一切順利,你應該得到一條成功消息。然後,隻需使用“eb open”指令即可實時檢視Web應用程式(代碼清單1-52)。
第一次運作應用程式可能需要一些時間,甚至可能會逾時。如果逾時則再次運作“eb open”指令即可(圖1-26)。
如果結果不是所期望的,請檢視日志以擷取全部錯誤消息(代碼清單1-53)。
第7步:别忘了關掉它!
最後,我們需要終止Beanstalk執行個體,以免産生額外費用。這是一個重要提醒,大多數雲服務都不是免費的。它會要求你輸入環境名稱,在這裡的例子中,它是“AWSBeanstalkIntroduction”(代碼清單1-54)。
這需要幾分鐘時間來關閉網站,你最好在AWS儀表闆上仔細檢查所有服務确實已被關閉。這很簡單,隻需通過
https://aws.amazon.com/登入你的AWS賬戶,并確定你的EC2和Elastic Beanstalk賬戶中沒有任何未計劃的服務(圖1-27)。如果你在每次“terminate”(終止)後看到一個似乎不斷恢複的執行個體,請在EC2“Load Balancers”下檢查并終止這些執行個體,然後再次終止執行個體。
1.4.2 結論和附加資訊
毫無疑問,AWS是雲計算領域的上司者,它可能不是最簡單或最便宜的,但很可能有你需要的全部功能。
有關其他資訊,請參閱Amazon AWS Docs上标題為“Deploying a Flask Application to AWS Elastic Beanstalk”的文章:
https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-flask.html1.5 在PythonAnywhere上托管應用程式
PythonAnywhere是在網際網路上快速建構Python互動式創意和模型的好方法。它高度內建,并被設計為能用于任何Python!它不是傳統意義上的無伺服器計算,而是一個專用的Python架構,而且不需要信用卡注冊,即可快速建構概念驗證(圖1-28)。
事實勝于雄辯。這個項目不需要任何代碼,因為PythonAnywhere在啟動執行個體時已經預設為“Hello World”示例。
1.5.1 操作步驟
第1步:擷取一個PythonAnywhere賬戶
注冊PythonAnywhere.com上的免費賬戶并登入(需确認你的電子郵件位址)。
第2步:設定Flask Web架構
我們在PythonAnywhere上建立一個Flask Web伺服器。這非常容易,在“Web”頁籤下,單擊“Add a new web app”按鈕。一直使用預設值,直到進入“Select a Python Web framework”,單擊“Flask”項,然後單擊最新的Python架構(圖1-29)。
你将進入配置頁面,單擊“Reload your account.pythonanywhere.com”按鈕,将加載你的新URL(圖1-30)。
你應該看到一個簡單但真實的網頁,其中寫着“Hello from Flask!”。這真是開箱即用(圖1-31)。
1.5.2 結論和附加資訊
PythonAnywhere可能不是100%無伺服器計算的雲提供商,但它能提供免費的基本服務托管。它易于使用,可以直接從其線上儀表闆運作。
有關幫助文檔和分步指南,請參閱
https://help.pythonanywhere.com/pages/1.6 本章小結
如果你堅持到了現在,那真是太棒了!我們使用Flask介紹了一個非常簡單而獨立的Web應用程式,并将其部署在4個不同的公有雲上。請注意,将Web應用程式上傳到每個雲提供商的方法存在一些差異,因為它們會不時地對平台服務進行更新和調整,是以密切關注各個提供商的參考文檔是至關重要的。
現在是時候撸起袖子,開始編寫一些更有趣、更複雜的Web應用程式了!