譯者 | 李睿
審校 | 重樓
近年來,機器學習的應用出現了爆炸式增長,導致對健壯、可擴展和高效部署方法的需求快速增長。由于訓練和服務環境之間的差異或擴大規模的困難等因素,傳統方法通常需要幫助運營機器學習模型。
本文提出了一種使用Docker的技術。Docker是一個開源平臺,旨在自動化應用程序的部署、擴展和管理,以此來解決這些挑戰。所提出的方法將機器學習類型及其環境封裝到一個標準化的Docker容器單元中。Docker容器提供了許多好處,包括開發和生產環境之間的一致性、易于擴展以及部署的簡單性。
本文對Docker及其在機器學習模型部署中的作用進行了深入探討,并對使用Docker部署機器學習模型進行實際演示,從創建Dockerfile到使用Docker Swarm擴展模型,所有這些都以相關代碼片段為例。此外,還介紹Docker在持續集成(CI)/持續交付(CD)管道中的集成,最終得出使用Docker進行高效機器學習模型部署的結論和最佳實踐。
Docker是什么?
作為一個平臺,Docker在輕量級、可移植的容器中自動化軟件應用程序的部署、擴展和運營。Docker的基礎圍繞著“容器化”的概念。這種虛擬化方法允許將軟件及其整個運行時環境打包成一個用于軟件開發的標準化單元。
Docker容器封裝了應用程序運行所需的一切(包括庫、系統工具、代碼和運行時),并確保它在不同的計算環境中表現一致。這有助于快速可靠地構建、測試和部署應用程序,使Docker成為軟件開發和運營(DevOps)的關鍵工具。
當談到機器學習應用程序時,Docker帶來了幾個優勢。Docker的容器化特性確保了機器學習模型的訓練和服務環境之間的一致性,降低了由于環境差異而遇到差異的風險。Docker還簡化了擴展過程,允許在多個服務器上輕松部署機器學習模型的多個實例。這些特性具有顯著簡化機器學習模型部署和降低相關運營復雜性的潛力。
為什么要將機器學習應用程序Docker化?
在機器學習應用程序的背景下,Docker提供了許多好處,每一個都對運營效率和模型性能做出了重大貢獻。
首先,Docker容器提供的一致性環境確保了開發、測試和生產階段之間的差異最小化。這種一致性消除了“它工作在我的機器上”的問題,使其成為部署機器學習模型的首選,機器學習模型對其運營環境的變化特別敏感。
其次,Docker擅長于促進可擴展性。機器學習應用程序通常需要運行同一模型的多個實例來處理大量數據或高請求率。Docker通過允許快速高效地部署多個容器實例來實現水平擴展,使其成為擴展機器學習模型的有效解決方案。
最后,Docker容器是獨立運行的,這意味著它們有自己的運行時環境,包括系統庫和配置文件。這種隔離提供了額外的安全層,確保每個機器學習模型在受控和安全的環境中運行。Docker提供的一致性、可擴展性和隔離性使其成為部署機器學習應用程序的具有吸引力的平臺。
為機器學習設置Docker
以下重點介紹在機器學習應用程序中使用Docker所需的初始設置。由于操作系統不同,Docker的安裝過程略有不同。對于linux發行版,Docker通常通過命令行界面安裝,而對于windows和macOS, Docker Desktop版本可用。在每種情況下,Docker網站都提供了簡單易懂的詳細安裝說明。通過從Docker Hub(一個基于云的注冊表服務,允許開發人員共享應用程序或庫)中提取Docker鏡像,安裝成功。作為示例,可以使用以下命令提取最新的Python/ target=_blank class=infotextkey>Python圖像以用于機器學習應用程序:
Shell
docker pull python:3.8-slim-buster
隨后,從提取的映像運行Docker容器涉及Docker run命令。例如,如果需要交互式Python shell,則可以使用以下命令:
Shell
docker run -it python:3.8-slim-buster /bin/bash
該命令啟動一個帶有交互式終端(-it)的Docker容器,并在Python容器中提供一個shell (/bin/bash)。通過遵循這個過程,Docker可以有效地幫助部署機器學習模型。
為簡單的機器學習模型創建Dockerfile
Docker操作簡單性的核心是Dockerfile,它是一個文本文檔,包含了組裝Docker映像所需的所有命令。用戶可以通過Docker命令行執行Dockerfile來自動創建鏡像。
Dockerfile由一組指令和參數組成,這些指令和參數以連續的行排列。指令是Docker命令,例如FROM(指定基本鏡像)、RUN(執行命令)、COPY(將文件從主機復制到Docker鏡像)和CMD(為執行容器提供默認值)。
以使用Scikit learn的線性回歸算法構建的一個簡單的機器學習模型為例。此類應用程序的Dockerfile可能如下所示:
Dockerfile
# Use an official Python runtime as a parent image
FROM python:3.8-slim-buster
# Set the working directory in the contAIner to /App
WORKDIR /app
# Copy the current directory contents into the container at /app
ADD . /app
# Install any needed packages specified in requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
# Make port 80 available to the world outside this container
EXPOSE 80
# Run app.py when the container launches
CMD ["python", "app.py"]
這個Dockerfile中提到的requirements.txt文件列出了機器學習模型的所有Python依賴項,例如Scikit-learn、Pandas和Flask。另一方面,app.py腳本包含加載經過訓練的模型并將其用作Web應用程序的代碼。
通過在Dockerfile中定義配置和依賴關系,可以創建一個映像,其中包含機器學習模型及其執行所需的運行時環境,從而促進一致的部署。
構建和測試Docker鏡像
在成功創建Dockerfile之后,接下來的階段包括構建Docker映像。通過執行Docker build命令構建Docker鏡像,然后執行包含Docker文件的目錄。-t標志用指定的名稱標記圖像。這樣一個命令的實例是:
Shell
docker build -t ml_model_image:1.0
在這里,ml_model_image:1.0是分配給圖像的名稱和版本,而“.”表示Dockerfile駐留在當前目錄中。
在構建Docker鏡像之后,下面的任務涉及從該鏡像啟動Docker容器,從而允許測試機器學習模型的功能。Docker的run命令可以幫助完成這個任務:
Shell
docker run -p 4000:80 ml_model_image:1.0
在這個命令中,-p標志將主機的端口4000映射到容器的端口80(在Dockerfile中定義)。因此,機器學習模型可以通過主機的4000端口訪問。
測試模型需要向Docker容器中的Flask應用程序公開的端點發送一個請求。例如,如果模型基于POST請求發送的數據提供預測,curl命令可以促進這一點:
Shell
curl -d '{"data":[1, 2, 3, 4]}' -H 'Content-Type: application/json' http://localhost:4000/predict
該方法確保了從Dockerfile創建到在Docker容器中測試機器學習模型的無縫流程。
使用Docker部署機器學習模型
機器學習模型的部署通常涉及將模型公開為可通過互聯網訪問的服務。實現這一目標的標準方法是使用Web框架(如Flask)將模型作為REST API提供服務。
考慮一個Flask應用程序封裝機器學習模型的例子。以下的Python腳本演示了如何將模型作為REST API端點公開:
Python
from flask import Flask, request
from sklearn.externals import joblib
app = Flask(__name__)
model = joblib.load('model.pkl')
@app.route('/predict', methods=['POST'])
def predict():
data = request.get_json(force=True)
prediction = model.predict([data['features']])
return {'prediction': prediction.tolist()}
if __name__ == '__main__':
app.run(host='0.0.0.0', port=80)
在這個例子中,Flask應用程序加載了一個預訓練的Scikit-learn模型(保存為model.pkl),并定義了一個API端點/predict。當POST請求與包含特性數組的JSON對象一起發送到該端點時,模型進行預測并將其作為響應返回。
一旦機器學習模型被部署并在Docker容器中運行,它就可以使用HTTP請求進行通信。例如,使用curl命令,一個POST請求可以發送到一個特征數組的模型,它將響應一個預測:
Shell
curl -d '{"features":[1, 2, 3, 4]}' -H 'Content-Type: application/json'
http://localhost:4000/predict
這個實例演示了Docker如何將機器學習模型部署為可擴展和可訪問的服務。
用Docker Swarm擴展器學習模型
隨著機器學習應用程序的范圍和用戶基礎的增長,擴展能力變得越來越重要。Docker Swarm為Docker提供了一個本地集群和編排解決方案,允許多個Docker主機變成一個虛擬主機。因此,Docker Swarm可以用于跨多臺機器管理和擴展部署的機器學習模型。
啟動Docker Swarm是一個簡單的過程,通過執行“Docker Swarm init”命令開始。這個命令將當前機器初始化為Docker Swarm管理器:
Shell
docker swarm init --advertise-addr $(hostname -i)
在這個命令中,--advertise-addr標志指定工作節點可以到達Swarm管理器的地址。hostname-i命令檢索當前機器的IP地址。
在初始化Swarm之后,機器學習模型可以使用Docker服務跨Swarm部署。該服務是用docker service create命令創建的,其中像-replicas這樣的標志可以決定要運行的容器實例的數量:
Shell
docker service create --replicas 3 -p 4000:80 --name ml_service ml_model_image:1.0
在這個命令中,--replica 3確保容器的三個實例在Swarm中運行,-p 4000:80將Swarm的端口4000映射到容器的端口80,--name ml_service為服務分配一個名稱。
因此,通過實現Docker Swarm,部署的機器學習模型可以有效地跨多個Docker主機擴展,從而增強其可用性和性能。
采用Docker的持續集成(CI)/持續交付(CD)
持續集成(CI)/持續交付(CD)是現代軟件開發的一個重要方面,促進自動化測試和部署,以確保軟件發布周期的一致性和速度。Docker的可移植性很適合持續集成(CI)/持續交付(CD)管道,因為Docker映像可以在管道中的不同階段進行構建、測試和部署。
一個將Docker集成到持續集成(CI)/持續交付(CD)管道中的例子可以用Jenkins管道來說明。管道在Jenkinsfile中定義,看起來像這樣:
Groovy
pipeline {
agent any
stages {
stage('Build') {
steps {
script {
sh 'docker build -t ml_model_image:1.0 .'
}
}
}
stage('Test') {
steps {
script {
sh 'docker run -p 4000:80 ml_model_image:1.0'
sh 'curl -d '{"features":[1, 2, 3, 4]}' -H 'Content-Type: application/json' http://localhost:4000/predict'
}
}
}
stage('Deploy') {
steps {
script {
sh 'docker service create --replicas 3 -p 4000:80 --name ml_service ml_model_image:1.0'
}
}
}
}
}
在這個Jenkinsfile中,構建(Build)階段構建Docker鏡像,測試(Test)階段運行Docker容器并向機器學習模型發送請求以驗證其功能,部署(Deploy)階段創建Docker服務并跨Docker Swarm進行擴展。
因此,借助Docker, 持續集成(CI)/持續交付(CD)管道可以實現可靠高效的機器學習模型部署。
結論和最佳實踐
最后,本文強調了Docker在簡化機器學習模型部署方面的功效。Docker能夠將模型及其依賴關系封裝在一個獨立的、一致的、輕量級的環境中,這使得Docker成為機器學習從業者的一個強大工具。通過Docker Swarm和它與持續集成(CI)/持續交付(CD)管道的無縫集成,Docker在跨多臺機器擴展機器學習模型的潛力進一步增強了它的價值。
然而,為了從Docker中獲取最大的價值,推薦以下最佳實踐:
- 最小化Docker鏡像大小:較小的鏡像使用更少的磁盤空間,減少構建時間,并加快部署。這可以通過使用更小的基本映像、刪除不必要的依賴以及有效地利用Docker的層緩存來實現。
- 使用.dokerignore:與Git中的.gitignore類似,.dokerignORE可以防止Docker鏡像中包含不必要的文件,從而減小其大小。
- 確保Dockerfiles是可復制的:在將來構建Docker鏡像時,使用特定版本的基本鏡像和依賴可以防止意外的更改。
通過堅持這些指南并充分利用Docker的功能,在部署機器學習模型的復雜性中導航變得更加可行,從而加快了從開發到生產的路徑。
參考文獻
1.Docker Official Documentation. Docker, Inc.
2.Docker for Machine Learning. O'Reilly Media, Inc.
3. Continuous Integration with Docker. Jenkins Documentation.
4.Scikit-learn: Machine Learning in Python. Scikit-learn Developers.
5.Kalade, S., Crockett, L. H., & Stewart, R. (2018). Using Sequence to Sequence Learning for Digital BPSK and QPSK Demodulation.
6.Blog — Page 3 — Liran Tal.
7.Introduction to the Dockerfile Part II | by Hakim | Medium.
8.Spring Boot 2.2 with JAVA 13 CRUD REST API Tutorial: Using JPA Hibernate & MySQL | Techiediaries
原文標題:AI Prowess: Harnessing Docker for Streamlined Deployment and Scalability of Machine Learning Applications,作者:Rudrendu Kumar PaulBidyut Sarkar