django settings 定义的变量不存在_使用Django部署机器学习模型(1)
介紹
機器學習(ML)應用的需求正在不斷增長。許多資料顯示了如何訓練ML算法。然而,ML算法分為兩個階段:
訓練階段——在這個階段,基于歷史數據訓練ML算法,
推理階段——ML算法被用于計算對未知結果的新數據的預測。
商業利益就處于推理階段,ML算法會在信息已知之前就提供它。如何為生產系統提供用于推理的ML算法是一個技術挑戰。有許多需要滿足的要求:
ML算法部署自動化,
持續集成,
算法和預測的再現性,
生產中算法的診斷和監控,
管理和法規符合性,
可伸縮性,
用戶協作。
ML算法有很多使用方法:
最簡單的方法是在本地運行ML算法,對準備好的測試數據進行預測,并與他人共享預測結果。該方法實現簡單、快速。然而,它有很多缺點。管理、監控、擴展和協作是很困難的。
第二種類似的方法是在系統代碼中硬編碼ML算法。這個解決方案更適合于簡單的ML算法,比如決策樹或線性回歸(這些算法很容易獨立于編程語言實現)。此解決方案的行為類似于第一種方法——它易于實現,但有許多缺點。
第三個解決方案是通過REST API、RPC或WebSockets使ML算法可用。此方法需要實現一個能處理請求并將其轉發給ML算法的服務器。在這種方法中,ML生產系統的所有需求都可以得到滿足。
最后一個解決方案是使用商業供應商來部署ML算法——它可以是在云中,也可以是在本地。有時候,這是一個很好的解決方案。當您有一個標準的ML算法時,那么供應商就可以處理它,并且您有錢支付給供應商(它可能有點昂貴)。
本教程提供了有關如何使用REST API構建您的ML系統的代碼示例。在本書中,為了構建ML服務,我將使用Python 3.6和Django 2.2.4。這本書是第一部分,涵蓋的基礎應該足以構建您的ML系統,該系統:
可以處理多個API端點,
每個API端點可以有幾個不同版本的ML算法,
ML代碼和工件(帶有ML參數的文件)被存儲在代碼存儲庫(git)中,
支持快速部署和持續集成(服務器和ML代碼測試),
支持監控和算法診斷(支持A/B測試),
可擴展(與容器一起部署),
具有用戶界面。
本教程可以通過多種方式進行擴展,例如:
用Celery運行長時間的批量預測或算法訓練任務,
用Celery運行預定的任務,
用于物聯網應用程序的WebSocket接口(帶有Django通道),
身份驗證和用戶管理。
目前,本教程不涉及上述主題。我以后會根據讀者的反饋來寫它們。您可以使用這個表格給我進行反饋。
在我看來,構建ML系統有一個很大的優勢——它是根據您的需要定制的。它具有ML系統中所需的所有特性,并且可以根據您的需要調整復雜性。。
本教程是為那些熟悉ML并希望了解如何構建ML web服務的讀者準備的。需要基本的Python知識。本教程的完整代碼在這里:https://github.com/pplonski/my_ml_service ?。
開始
您將在這一章學到什么:
如何設置git存儲庫,
安裝開發環境(我將使用Ubuntu 16.04),
安裝所需要的包,
啟動Django項目。
設置git存儲庫
為了建立一個git倉庫,我使用了GitHub(它對公共和私有項目都是免費的)。如果您在那里有一個帳戶,請訪問https://github.com/new ?并設置存儲庫,如圖(1)所示。
圖1:在github中設置一個新項目
本教程的完整代碼在這里:https://github.com/pplonski/my_ml_service ?。
然后進入您的終端并設置存儲庫:
在我的例子中,存儲庫中有兩個文件,即LICENSE和README.md。
安裝
讓我們設置并激活開發環境(我使用的是Ubuntu 16.04)。我將使用virtualenv:
您每次在新終端開始項目工作時,都需要激活環境。
我將使用pip3來安裝所需的軟件包:
我安裝的Django版本是2.2.4。
啟動Django項目
我將在backend目錄中設置Django項目。Django項目名被設置為server。
您可以使用以下命令來啟動您的初始化的服務器:
當您在您喜歡的web瀏覽器中輸入127.0.0.1:8000時,您應該會看到默認的Django歡迎站點(2)。
圖2:Django默認歡迎站點
恭喜您! ! !您已經成功地設置了環境。
>>> 今日簽到口令:vb7o <<<
將源文件添加到存儲庫中
在進入下一章之前,讓我們先提交新文件。
以下文件應該會被添加到您的項目中:
在您的目錄中,還有其他文件沒有被添加到存儲庫中,因為.gitignore文件中排除了這些文件。
構建ML算法
在這一章您將學到:
如何安裝Jupyter notebook,
如何構建兩個ML算法,
保存預處理細節和算法。
安裝Jupyter notebook
為了構建ML算法,我使用了Jupyter notebook。您可以輕松安裝它:
要設置Jupyter notebook使用本地virtualenv環境,您可以運行運行:
我將創建一個research目錄用于存放Jupiter文件。要啟動Jupyter notebook ,請運行:
啟動一個新notebook時,請確保您選擇了正確的內核,在我們的示例中是venv(圖3)。
圖 3: 啟動新的jupyter notebook
訓練ML 算法
在構建ML算法之前,我們需要安裝所需包:
numpy和pandas包用于數據操作。joblib用于ML對象的保存。然而,sklearn包提供了廣泛的ML算法。在安裝這些包之后,我們需要重新加載Jupyter。
我們代碼的第一步是加載包:
加載數據
在本教程中,我將使用Adult Income數據集。在這個數據集中,ML將被用來根據人口普查數據預測收入是否超過每年5萬美元。我將從我的公共存儲庫中加載數據,這些數據集適用于ML入門。
加載數據并顯示第一行數據的代碼(圖4):
圖4:我們數據集的第一行
X矩陣有32,561行14列。這是我們算法的輸入數據,每一行描述一個人。y向量有32,561個值,表示年收入是否超過5萬每年。
在開始數據預處理之前,我們將把數據分成訓練和測試子集。我們將使用30%的數據進行測試。
數據預處理
在我們的數據集中,有缺失的值和分類列。對于ML算法訓練,我將使用sklearn包中的隨機森林(Random Forest)算法。在當前的實現中,它不能處理缺失值和分類列,這就是為什么我們需要應用預處理算法。
為了填充缺失的值,我們將在每一列中使用最頻繁的值(當然還有許多其他的填充方法,我選擇的只是作為示例)。
train_mode值看起來像這樣:
從train_mode中您可以看到,例如在age列中最常見的值是31.0。
讓我們把范疇轉換成數字。我將使用來自sklearn包的LabelEncoder:
算法訓練
數據已經準備好了,所以我們就可以訓練我們的隨機森林算法。
我們還將訓練極端隨機樹(Extra Tree)算法:
正如您所看到的,訓練算法很簡單,只需兩行代碼—比數據讀取和預處理要少得多。現在,讓我們保存我們創建的算法。需要注意的重要一點是,ML算法不僅是rf和et變量(帶有模型權值),而且我們還需要保存預處理變量train_mode和encoders。為了保存,我將使用joblib包。
將ML代碼和部件添加到存儲庫中
在繼續下一章之前,讓我們將我們的notebook和文件添加到存儲庫中。
每個帶有預處理對象和算法的文件都小于100 MB,這是GitHub的文件限制。對于較大的文件,最好使用單獨的版本控制系統,如DVC——然而,這是一個更高級的主題。
Django模型
您已經實現了什么:
您已經初始化了默認的Django項目,
您已經訓練了兩個ML算法并準備好進行推理。
您將在這一章學到什么:
構建Django模型來在數據庫中存儲關于ML算法和請求的信息,
使用Django REST框架為ML算法編寫REST API。
創建Django 模型
為了創建Django模型,我們需要創建一個新的應用程序:
使用上述命令,我們創建了endpoints應用程序并將其移動到apps目錄。我已經添加了apps目錄來保持項目的整潔。
讓我們進入apps/endpoints/models.py文件并定義數據庫模型(Django提供對象關系映射層(ORM))。
我們定義了三個模型:
Endpoint——保存關于端點的信息,
MLAlgorithm——保存服務中使用的ML算法的信息,
MLAlgorithmStatus——保存關于ML算法狀態的信息。狀態可以隨時間變化,例如,我們可以將測試設置為初始狀態,然后在測試期間切換到生產狀態。
MLRequest——保存所有到ML算法的請求的信息。監控ML算法和運行A/B測試需要用到它。
我們需要將我們的應用程序添加到backend/server/server/settings.py中的INSTALLED_APPS,它應該是這樣的:
要將我們的模型應用到數據庫,我們需要運行遷移:
上面的命令將在數據庫中創建表。默認情況下,Django使用SQLite作為數據庫。對于本教程,我們可以保留這個簡單的數據庫,對于更高級的項目,您可以將Postgres或MySQL設置為數據庫(您可以通過在backend/server/server/settings.py中設置DATABASES變量來配置這一點)。
為模型創建REST API
到目前為止,我們已經定義了數據庫模型,但是在運行web服務器時我們不會看到任何新內容。我們需要為我們的對象指定REST API。實現此目的的最簡單和最干凈的方法是使用Django REST框架(DRF)。要安裝DRF,我們需要運行:
并將其添加到backend/server/server/settings.py中的INSTALLED_APPS:
要在瀏覽器中看到一些東西,我們需要定義:
序列化器——它們將定義數據庫對象如何在請求中進行映射,
視圖——我們的模型如何在REST API中被訪問,
url——為我們的模型定義REST API URL地址。
DRF序列化器
請將serializers.py文件添加到server/apps/endpoints目錄:
序列化器將有助于將數據庫對象打包和解包成JSON對象。在Endpoints和MLAlgorithm序列化器中,我們定義了所有只讀字段。這是因為,我們將只在服務器端創建和修改對象。對于MLAlgorithmStatus,字段 status、 created_by、 created_at 和 parent_mlalgorithm處于讀寫模式,我們將使用它們通過REST API來設置算法狀態。對于MLRequest序列化器,有一個處于讀寫模式的feedback字段——我們需要它來向服務器提供關于預測的反饋。
MLAlgorithmSerializer比其他的更復雜。它有一個current_status字段,代表MLAlgorithmStatus的最新狀態。
視圖
要添加視圖,請打開backend/server/endpoints/views.py文件并添加以下代碼:
對于每個模型,我們都創建了一個視圖,該視圖允許檢索單個對象或對象列表。我們將不允許通過REST API創建或修改Endpoints、 MLAlgorithms。處理新ML相關對象創建的代碼將位于服務器端,我將在下一章中討論它。
我們將允許通過REST API創建MLAlgorithmStatus對象。我們不允許編輯ML算法的狀態,因為我們想要保留所有的狀態歷史。
我們允許編輯MLRequest對象,但是只有feedback字段(請查看序列化器定義)。
URL
最后一步是添加URL來訪問我們的模型。請在backend/server/apps/endpoints中的urls.py文件中添加以下代碼:
上面的代碼將創建到我們數據庫模型的REST API路由器。我們的模型將按照以下URL模式被訪問:
您可能注意到,我們在API地址中包含了v1。這可能在以后的API版本控制中會需要。
我們需要將端點url添加到服務器的主urls.py文件(文件backend/server/server/urls.py):
運行服務器
我們添加了很多新東西,讓我們檢查一下它們是否都可以運行。
請運行服務器:
并在web瀏覽器中打開http://127.0.0.1:8000/api/v1/。您應該會看到DRF視圖(圖5)。
圖5:默認的Django REST框架視圖
DRF提供了很好的接口,因此您可以單擊任何URL并檢查其對象(例如在http://127.0.0.1:8000/api/v1/endpoints上)。您應該會看到所有對象的空列表,因為我們還沒有添加任何東西。我們將在下一章中添加ML算法和端點。
向存儲庫添加代碼
本章的最后一步是向存儲庫添加新代碼。
將ML算法添加到服務器代碼中
到目前為止,您已經完成了:
訓練兩個ML算法,
使用數據庫模型和REST API端點創建了Django服務器,這些端點將表示ML端點、模型和請求。
您將在這一章學到什么:
在服務器中創建ML代碼,
寫ML算法注冊表,
向服務器添加ML算法。
服務器中的ML代碼
在第3章中,我們創建了兩個ML算法(隨機森林和極端隨機樹)。它們是在Jupyter notebook中實現的。現在,我們將在服務器端編寫使用以前訓練過的算法的代碼。在本章中,我們將只在服務器端包含隨機森林算法(為了簡單起見)。
我們來在 backend/server/apps目錄中創建新目錄ml來保存所有ML相關的代碼,和income_classifier目錄來保存我們的輸入分類器。
讓我們在income_classifier目錄中添加新文件random_forest.py和空文件 __init__.py。
我們將在random_forest.py文件中實現ML算法。
RandomForestClassifier算法有五個方法:
__init__ -加載預處理對象和隨機森林對象的構造函數(使用Jupyter notebook創建),
preprocessing - 該方法接受輸入的JSON數據,將其轉換為Pandas DataFrame并對其應用預處理,
predict - 該方法會調用ML對準備的數據進行計算預測,
postprocessing - 該方法會對預測值應用后處理,
compute_prediction - 該方法結合了 preprocessing、 predict 和 postprocessing,并返回帶有響應的 JSON 對象。
要在Django中啟用我們的代碼,我們需要將ml應用程序添加到backend/server/server/settings.py中的INSTALLED_APPS:
ML代碼測試
讓我們編寫一個測試用例來檢查我們的隨機森林算法是否按預期工作。為了進行測試,我將使用來自訓練數據中的一行,并檢查預測是否正確。
請使用以下代碼將空的__init__.py和tests.py兩個文件添加到ml目錄中:
以上測試是:
構造一個輸入JSON數據對象,
初始化ML算法,
計算ML預測并檢查預測結果。
要運行Django測試,請運行以下命令:
您應該看到1個測試運行了。
算法注冊表
我們已經準備好并測試了ML代碼。我們需要將它與服務器代碼連接起來。為此,我將創建ML 注冊表對象,它將保存有關可用算法和相應端點的信息。
讓我們在backend/server/apps/ml/目錄中添加registry.py文件。
該注冊表通過一個算法id到算法對象映射來保存簡單的dict對象。
要檢查代碼是否按預期工作,我們可以在backend/server/apps/ml/tests.py文件中添加測試用例:
這個簡單的測試向注冊表添加了一個ML算法。運行測試:
測試輸出:
將ML算法添加到注冊表
注冊表代碼已經準備好了,我們需要在服務器代碼中指定一個位置,在服務器啟動時將ML算法添加到注冊表中。最好的地方是backend/server/server/wsgi.py文件。請在該文件中設置以下代碼:
使用以下命令啟動服務器后:
您可以在瀏覽器中檢查端點和ML算法。在URL:http://127.0.0.1:8000/api/v1/endpoints,您可以檢查端點(圖6),而在http://127.0.0.1:8000/api/v1/mlalgorithms,您可以檢查算法(圖7)。
圖6:服務中定義的端點列表
圖7:服務中定義的ML算法列表
向存儲庫添加代碼
我們需要向存儲庫提交新代碼。
接下來是什么?
我們已經將ML算法存儲在數據庫中,我們可以使用REST API訪問關于它的信息,但是如何進行預測呢?這將是下一章的主題。
進行預測
您已經學習了什么:
您已經在Jupyter notebook中創建了兩個ML算法,
您已經創建了帶有數據庫模型和REST API的Django應用程序,
您已經將ML代碼添加到服務器代碼并創建了一個ML注冊表。
您將在這一章學到什么:
您將添加一個視圖來處理服務器中的請求并將其轉發到ML代碼,
您將向視圖添加API URL,
您將為預測編寫測試。
譯者:浣熊君( ・??・? ) 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的django settings 定义的变量不存在_使用Django部署机器学习模型(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 圣地安列斯设置中文(圣安地列斯中文设置图
 - 下一篇: 中国二十四节气的意义(二十四节气的具体内