人工智能的實(shí)力:利用Docker簡(jiǎn)化機(jī)器學(xué)習(xí)應(yīng)用程序的部署和可擴(kuò)展性
譯文譯者 | 李睿
審校 | 重樓
近年來,機(jī)器學(xué)習(xí)的應(yīng)用出現(xiàn)了爆炸式增長(zhǎng),導(dǎo)致對(duì)健壯、可擴(kuò)展和高效部署方法的需求快速增長(zhǎng)。由于訓(xùn)練和服務(wù)環(huán)境之間的差異或擴(kuò)大規(guī)模的困難等因素,傳統(tǒng)方法通常需要幫助運(yùn)營(yíng)機(jī)器學(xué)習(xí)模型。
本文提出了一種使用Docker的技術(shù)。Docker是一個(gè)開源平臺(tái),旨在自動(dòng)化應(yīng)用程序的部署、擴(kuò)展和管理,以此來解決這些挑戰(zhàn)。所提出的方法將機(jī)器學(xué)習(xí)類型及其環(huán)境封裝到一個(gè)標(biāo)準(zhǔn)化的Docker容器單元中。Docker容器提供了許多好處,包括開發(fā)和生產(chǎn)環(huán)境之間的一致性、易于擴(kuò)展以及部署的簡(jiǎn)單性。
本文對(duì)Docker及其在機(jī)器學(xué)習(xí)模型部署中的作用進(jìn)行了深入探討,并對(duì)使用Docker部署機(jī)器學(xué)習(xí)模型進(jìn)行實(shí)際演示,從創(chuàng)建Dockerfile到使用Docker Swarm擴(kuò)展模型,所有這些都以相關(guān)代碼片段為例。此外,還介紹Docker在持續(xù)集成(CI)/持續(xù)交付(CD)管道中的集成,最終得出使用Docker進(jìn)行高效機(jī)器學(xué)習(xí)模型部署的結(jié)論和最佳實(shí)踐。
Docker是什么?
作為一個(gè)平臺(tái),Docker在輕量級(jí)、可移植的容器中自動(dòng)化軟件應(yīng)用程序的部署、擴(kuò)展和運(yùn)營(yíng)。Docker的基礎(chǔ)圍繞著“容器化”的概念。這種虛擬化方法允許將軟件及其整個(gè)運(yùn)行時(shí)環(huán)境打包成一個(gè)用于軟件開發(fā)的標(biāo)準(zhǔn)化單元。
Docker容器封裝了應(yīng)用程序運(yùn)行所需的一切(包括庫(kù)、系統(tǒng)工具、代碼和運(yùn)行時(shí)),并確保它在不同的計(jì)算環(huán)境中表現(xiàn)一致。這有助于快速可靠地構(gòu)建、測(cè)試和部署應(yīng)用程序,使Docker成為軟件開發(fā)和運(yùn)營(yíng)(DevOps)的關(guān)鍵工具。
當(dāng)談到機(jī)器學(xué)習(xí)應(yīng)用程序時(shí),Docker帶來了幾個(gè)優(yōu)勢(shì)。Docker的容器化特性確保了機(jī)器學(xué)習(xí)模型的訓(xùn)練和服務(wù)環(huán)境之間的一致性,降低了由于環(huán)境差異而遇到差異的風(fēng)險(xiǎn)。Docker還簡(jiǎn)化了擴(kuò)展過程,允許在多個(gè)服務(wù)器上輕松部署機(jī)器學(xué)習(xí)模型的多個(gè)實(shí)例。這些特性具有顯著簡(jiǎn)化機(jī)器學(xué)習(xí)模型部署和降低相關(guān)運(yùn)營(yíng)復(fù)雜性的潛力。
為什么要將機(jī)器學(xué)習(xí)應(yīng)用程序Docker化?
在機(jī)器學(xué)習(xí)應(yīng)用程序的背景下,Docker提供了許多好處,每一個(gè)都對(duì)運(yùn)營(yíng)效率和模型性能做出了重大貢獻(xiàn)。
首先,Docker容器提供的一致性環(huán)境確保了開發(fā)、測(cè)試和生產(chǎn)階段之間的差異最小化。這種一致性消除了“它工作在我的機(jī)器上”的問題,使其成為部署機(jī)器學(xué)習(xí)模型的首選,機(jī)器學(xué)習(xí)模型對(duì)其運(yùn)營(yíng)環(huán)境的變化特別敏感。
其次,Docker擅長(zhǎng)于促進(jìn)可擴(kuò)展性。機(jī)器學(xué)習(xí)應(yīng)用程序通常需要運(yùn)行同一模型的多個(gè)實(shí)例來處理大量數(shù)據(jù)或高請(qǐng)求率。Docker通過允許快速高效地部署多個(gè)容器實(shí)例來實(shí)現(xiàn)水平擴(kuò)展,使其成為擴(kuò)展機(jī)器學(xué)習(xí)模型的有效解決方案。
最后,Docker容器是獨(dú)立運(yùn)行的,這意味著它們有自己的運(yùn)行時(shí)環(huán)境,包括系統(tǒng)庫(kù)和配置文件。這種隔離提供了額外的安全層,確保每個(gè)機(jī)器學(xué)習(xí)模型在受控和安全的環(huán)境中運(yùn)行。Docker提供的一致性、可擴(kuò)展性和隔離性使其成為部署機(jī)器學(xué)習(xí)應(yīng)用程序的具有吸引力的平臺(tái)。
為機(jī)器學(xué)習(xí)設(shè)置Docker
以下重點(diǎn)介紹在機(jī)器學(xué)習(xí)應(yīng)用程序中使用Docker所需的初始設(shè)置。由于操作系統(tǒng)不同,Docker的安裝過程略有不同。對(duì)于Linux發(fā)行版,Docker通常通過命令行界面安裝,而對(duì)于Windows和MacOS, Docker Desktop版本可用。在每種情況下,Docker網(wǎng)站都提供了簡(jiǎn)單易懂的詳細(xì)安裝說明。通過從Docker Hub(一個(gè)基于云的注冊(cè)表服務(wù),允許開發(fā)人員共享應(yīng)用程序或庫(kù))中提取Docker鏡像,安裝成功。作為示例,可以使用以下命令提取最新的Python圖像以用于機(jī)器學(xué)習(xí)應(yīng)用程序:
Shell
docker pull python:3.8-slim-buster
隨后,從提取的映像運(yùn)行Docker容器涉及Docker run命令。例如,如果需要交互式Python shell,則可以使用以下命令:
Shell
docker run -it python:3.8-slim-buster /bin/bash
該命令啟動(dòng)一個(gè)帶有交互式終端(-it)的Docker容器,并在Python容器中提供一個(gè)shell (/bin/bash)。通過遵循這個(gè)過程,Docker可以有效地幫助部署機(jī)器學(xué)習(xí)模型。
為簡(jiǎn)單的機(jī)器學(xué)習(xí)模型創(chuàng)建Dockerfile
Docker操作簡(jiǎn)單性的核心是Dockerfile,它是一個(gè)文本文檔,包含了組裝Docker映像所需的所有命令。用戶可以通過Docker命令行執(zhí)行Dockerfile來自動(dòng)創(chuàng)建鏡像。
Dockerfile由一組指令和參數(shù)組成,這些指令和參數(shù)以連續(xù)的行排列。指令是Docker命令,例如FROM(指定基本鏡像)、RUN(執(zhí)行命令)、COPY(將文件從主機(jī)復(fù)制到Docker鏡像)和CMD(為執(zhí)行容器提供默認(rèn)值)。
以使用Scikit learn的線性回歸算法構(gòu)建的一個(gè)簡(jiǎn)單的機(jī)器學(xué)習(xí)模型為例。此類應(yīng)用程序的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"]
這個(gè)Dockerfile中提到的requirements.txt文件列出了機(jī)器學(xué)習(xí)模型的所有Python依賴項(xiàng),例如Scikit-learn、Pandas和Flask。另一方面,app.py腳本包含加載經(jīng)過訓(xùn)練的模型并將其用作Web應(yīng)用程序的代碼。
通過在Dockerfile中定義配置和依賴關(guān)系,可以創(chuàng)建一個(gè)映像,其中包含機(jī)器學(xué)習(xí)模型及其執(zhí)行所需的運(yùn)行時(shí)環(huán)境,從而促進(jìn)一致的部署。
構(gòu)建和測(cè)試Docker鏡像
在成功創(chuàng)建Dockerfile之后,接下來的階段包括構(gòu)建Docker映像。通過執(zhí)行Docker build命令構(gòu)建Docker鏡像,然后執(zhí)行包含Docker文件的目錄。-t標(biāo)志用指定的名稱標(biāo)記圖像。這樣一個(gè)命令的實(shí)例是:
Shell
docker build -t ml_model_image:1.0
在這里,ml_model_image:1.0是分配給圖像的名稱和版本,而“.”表示Dockerfile駐留在當(dāng)前目錄中。
在構(gòu)建Docker鏡像之后,下面的任務(wù)涉及從該鏡像啟動(dòng)Docker容器,從而允許測(cè)試機(jī)器學(xué)習(xí)模型的功能。Docker的run命令可以幫助完成這個(gè)任務(wù):
Shell
docker run -p 4000:80 ml_model_image:1.0
在這個(gè)命令中,-p標(biāo)志將主機(jī)的端口4000映射到容器的端口80(在Dockerfile中定義)。因此,機(jī)器學(xué)習(xí)模型可以通過主機(jī)的4000端口訪問。
測(cè)試模型需要向Docker容器中的Flask應(yīng)用程序公開的端點(diǎn)發(fā)送一個(gè)請(qǐng)求。例如,如果模型基于POST請(qǐng)求發(fā)送的數(shù)據(jù)提供預(yù)測(cè),curl命令可以促進(jìn)這一點(diǎn):
Shell
curl -d '{"data":[1, 2, 3, 4]}' -H 'Content-Type: application/json' http://localhost:4000/predict
該方法確保了從Dockerfile創(chuàng)建到在Docker容器中測(cè)試機(jī)器學(xué)習(xí)模型的無縫流程。
使用Docker部署機(jī)器學(xué)習(xí)模型
機(jī)器學(xué)習(xí)模型的部署通常涉及將模型公開為可通過互聯(lián)網(wǎng)訪問的服務(wù)。實(shí)現(xiàn)這一目標(biāo)的標(biāo)準(zhǔn)方法是使用Web框架(如Flask)將模型作為REST API提供服務(wù)。
考慮一個(gè)Flask應(yīng)用程序封裝機(jī)器學(xué)習(xí)模型的例子。以下的Python腳本演示了如何將模型作為REST API端點(diǎn)公開:
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)
在這個(gè)例子中,F(xiàn)lask應(yīng)用程序加載了一個(gè)預(yù)訓(xùn)練的Scikit-learn模型(保存為model.pkl),并定義了一個(gè)API端點(diǎn)/predict。當(dāng)POST請(qǐng)求與包含特性數(shù)組的JSON對(duì)象一起發(fā)送到該端點(diǎn)時(shí),模型進(jìn)行預(yù)測(cè)并將其作為響應(yīng)返回。
一旦機(jī)器學(xué)習(xí)模型被部署并在Docker容器中運(yùn)行,它就可以使用HTTP請(qǐng)求進(jìn)行通信。例如,使用curl命令,一個(gè)POST請(qǐng)求可以發(fā)送到一個(gè)特征數(shù)組的模型,它將響應(yīng)一個(gè)預(yù)測(cè):
Shell
curl -d '{"features":[1, 2, 3, 4]}' -H 'Content-Type: application/json'
http://localhost:4000/predict
這個(gè)實(shí)例演示了Docker如何將機(jī)器學(xué)習(xí)模型部署為可擴(kuò)展和可訪問的服務(wù)。
用Docker Swarm擴(kuò)展器學(xué)習(xí)模型
隨著機(jī)器學(xué)習(xí)應(yīng)用程序的范圍和用戶基礎(chǔ)的增長(zhǎng),擴(kuò)展能力變得越來越重要。Docker Swarm為Docker提供了一個(gè)本地集群和編排解決方案,允許多個(gè)Docker主機(jī)變成一個(gè)虛擬主機(jī)。因此,Docker Swarm可以用于跨多臺(tái)機(jī)器管理和擴(kuò)展部署的機(jī)器學(xué)習(xí)模型。
啟動(dòng)Docker Swarm是一個(gè)簡(jiǎn)單的過程,通過執(zhí)行“Docker Swarm init”命令開始。這個(gè)命令將當(dāng)前機(jī)器初始化為Docker Swarm管理器:
Shell
docker swarm init --advertise-addr $(hostname -i)
在這個(gè)命令中,--advertise-addr標(biāo)志指定工作節(jié)點(diǎn)可以到達(dá)Swarm管理器的地址。hostname-i命令檢索當(dāng)前機(jī)器的IP地址。
在初始化Swarm之后,機(jī)器學(xué)習(xí)模型可以使用Docker服務(wù)跨Swarm部署。該服務(wù)是用docker service create命令創(chuàng)建的,其中像-replicas這樣的標(biāo)志可以決定要運(yùn)行的容器實(shí)例的數(shù)量:
Shell
docker service create --replicas 3 -p 4000:80 --name ml_service ml_model_image:1.0
在這個(gè)命令中,--replica 3確保容器的三個(gè)實(shí)例在Swarm中運(yùn)行,-p 4000:80將Swarm的端口4000映射到容器的端口80,--name ml_service為服務(wù)分配一個(gè)名稱。
因此,通過實(shí)現(xiàn)Docker Swarm,部署的機(jī)器學(xué)習(xí)模型可以有效地跨多個(gè)Docker主機(jī)擴(kuò)展,從而增強(qiáng)其可用性和性能。
采用Docker的持續(xù)集成(CI)/持續(xù)交付(CD)
持續(xù)集成(CI)/持續(xù)交付(CD)是現(xiàn)代軟件開發(fā)的一個(gè)重要方面,促進(jìn)自動(dòng)化測(cè)試和部署,以確保軟件發(fā)布周期的一致性和速度。Docker的可移植性很適合持續(xù)集成(CI)/持續(xù)交付(CD)管道,因?yàn)镈ocker映像可以在管道中的不同階段進(jìn)行構(gòu)建、測(cè)試和部署。
一個(gè)將Docker集成到持續(xù)集成(CI)/持續(xù)交付(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'
}
}
}
}
}
在這個(gè)Jenkinsfile中,構(gòu)建(Build)階段構(gòu)建Docker鏡像,測(cè)試(Test)階段運(yùn)行Docker容器并向機(jī)器學(xué)習(xí)模型發(fā)送請(qǐng)求以驗(yàn)證其功能,部署(Deploy)階段創(chuàng)建Docker服務(wù)并跨Docker Swarm進(jìn)行擴(kuò)展。
因此,借助Docker, 持續(xù)集成(CI)/持續(xù)交付(CD)管道可以實(shí)現(xiàn)可靠高效的機(jī)器學(xué)習(xí)模型部署。
結(jié)論和最佳實(shí)踐
最后,本文強(qiáng)調(diào)了Docker在簡(jiǎn)化機(jī)器學(xué)習(xí)模型部署方面的功效。Docker能夠?qū)⒛P图捌湟蕾囮P(guān)系封裝在一個(gè)獨(dú)立的、一致的、輕量級(jí)的環(huán)境中,這使得Docker成為機(jī)器學(xué)習(xí)從業(yè)者的一個(gè)強(qiáng)大工具。通過Docker Swarm和它與持續(xù)集成(CI)/持續(xù)交付(CD)管道的無縫集成,Docker在跨多臺(tái)機(jī)器擴(kuò)展機(jī)器學(xué)習(xí)模型的潛力進(jìn)一步增強(qiáng)了它的價(jià)值。
然而,為了從Docker中獲取最大的價(jià)值,推薦以下最佳實(shí)踐:
- 最小化Docker鏡像大?。狠^小的鏡像使用更少的磁盤空間,減少構(gòu)建時(shí)間,并加快部署。這可以通過使用更小的基本映像、刪除不必要的依賴以及有效地利用Docker的層緩存來實(shí)現(xiàn)。
- 使用.dokerignore:與Git中的.gitignore類似,.dokerignORE可以防止Docker鏡像中包含不必要的文件,從而減小其大小。
- 確保Dockerfiles是可復(fù)制的:在將來構(gòu)建Docker鏡像時(shí),使用特定版本的基本鏡像和依賴可以防止意外的更改。
通過堅(jiān)持這些指南并充分利用Docker的功能,在部署機(jī)器學(xué)習(xí)模型的復(fù)雜性中導(dǎo)航變得更加可行,從而加快了從開發(fā)到生產(chǎn)的路徑。
參考文獻(xiàn)
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
原文標(biāo)題:AI Prowess: Harnessing Docker for Streamlined Deployment and Scalability of Machine Learning Applications,作者:Rudrendu Kumar PaulBidyut Sarkar