Python/ target=_blank class=infotextkey>Python以及pandas和scikit-learn等Python數據分析和機器學習庫套件可以幫助你輕松開發數據科學應用程序。然而,Python中的依賴性管理是一項挑戰。在進行數據科學項目時,需要花費大量時間安裝各種庫,并跟蹤正在使用的庫的版本。
如果其他開發人員想要運行您的代碼并為項目做出貢獻,他們首先需要在他們的機器上設置項目環境,然后才能繼續運行代碼。即使是如不同的庫版本之間的微小差異也可能對代碼產生破壞性的影響。這時就可以使用Docker。Docker簡化了開發過程,并促進了無縫的協作。
本指南將介紹Docker的基礎知識,并教你如何使用Docker對數據科學應用程序進行容器化。
什么是Docker?
【Docker】:https://www.docker.com/
Docker是一個容器化工具,可讓你構建和共享稱為鏡像的可移植應用程序。
除了源代碼,你的應用程序還將包含一系列依賴項、所需配置、系統工具等。例如,在數據科學項目中,你需要在開發環境(最好是虛擬環境)中安裝所有必需的庫。還需要確保使用的Python是庫支持的最新版本。
然而,當嘗試在另一臺機器上運行應用程序時,可能仍會遇到問題。這些問題通常源于兩臺機器之間開發環境中配置和庫版本不匹配。
使用Docker,可以打包應用程序及其依賴項和配置。因此,可以為應用程序在各種主機機器上定義一個隔離的、可復現的和一致的環境。
Docker基礎知識:鏡像、容器和注冊表
首先簡要介紹一些概念和術語:
Docker鏡像
Docker鏡像是應用程序的可移植構件。
Docker容器
當運行一個鏡像時,實際上是在容器環境中運行該應用程序。因此,一個正在運行鏡像的實例就是一個容器。
Docker注冊表
Docker注冊表是用于存儲和分發Docker鏡像的系統。將應用程序容器化為Docker鏡像后,可以通過將其推送到鏡像注冊表來向開發者社區提供它們。DockerHub是最大的公共注冊表,默認情況下,所有鏡像都從DockerHub拉取。
Docker如何簡化開發?
由于容器為應用程序提供了一個隔離的環境,其他開發人員現在只需要在自己的機器上安裝Docker。他們可以通過一個命令在遠程機器上拉取Docker鏡像并啟動容器,而無需擔心復雜的安裝過程。
在開發應用程序時,通常會構建和測試同一應用程序的多個版本。如果使用Docker,就可以在同一環境中的不同容器中運行多個版本的同一應用程序,而不會出現任何沖突。
除了簡化開發,Docker還簡化了部署,并有助于開發和運維團隊有效地進行協作。在服務器端,運維團隊不需要花時間解決復雜的版本和依賴沖突。他們只需使用Docker鏡像來部署應用程序,確保在生產環境中使用與開發環境相同的容器。
基本的Docker命令
接下來快速瀏覽一些基本的Docker命令,其中大部分將在本教程中使用。
命令 | 功能 |
---|---|
docker ps |
列出所有正在運行的容器 |
docker pull |
image-name 從DockerHub默認拉取image-name |
docker images |
列出所有可用的鏡像 |
docker run image-name |
從鏡像啟動容器 |
docker start contAIner-id |
重新啟動已停止的容器 |
docker stop container-id |
停止正在運行的容器 |
docker build path |
使用Dockerfile中的指令在指定路徑上構建一個鏡像 |
注意:如果尚未為用戶創建docker
組,請在運行所有命令時都要加上sudo
前綴。
如何使用Docker將數據科學應用程序容器化?
現在已經學習了Docker的基礎知識,那么是應用所學知識的時候了。在本節中,我們將使用Docker將一個簡單的數據科學應用程序進行容器化。
房價預測模型
下面是一個線性回歸模型,它可以根據輸入特征預測目標值:房價中位數。該模型使用加利福尼亞州(California)住房數據集建立:
【加利福尼亞州住房數據集】:https://scikit-learn.org/stable/modules/generated/sklearn.datasets.fetch_california_housing.html
# house_price_prediction.py
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 加載加利福尼亞州住房數據集
data = fetch_california_housing(as_frame=True)
X = data.data
y = data.target
# 將數據集拆分為訓練集和測試集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 標準化特征
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# 訓練模型
model = LinearRegression()
model.fit(X_train, y_train)
# 對測試集進行預測
y_pred = model.predict(X_test)
# 評估模型
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"Mean Squared Error: {mse:.2f}")
print(f"R-squared Score: {r2:.2f}")
我們知道scikit-learn
是必需的依賴項。如果仔細查看代碼,在加載數據集時,我們將as_frame
設置為True
。因此還需要pandas
。requirements.txt
文件如下所示:
pandas==2.0
scikit-learn==1.2.2
創建Dockerfile
到目前為止,已經有了源代碼文件house_price_prediction.py
和requirements.txt
文件。現在應該定義如何從應用程序中構建鏡像。Dockerfile用于創建從應用程序源代碼文件構建鏡像的定義。
那么什么是Dockerfile呢?它是一份文本文件,其中包含構建Docker鏡像的逐步說明。
如下是示例的Dockerfile:
# 使用Python官方鏡像作為基礎鏡像
FROM python:3.9-slim
# 設置容器中的工作目錄
WORKDIR /App
# 將`requirements.txt`文件復制到容器中
COPY requirements.txt .
# 安裝依賴項
RUN pip install --no-cache-dir -r requirements.txt
# 將腳本文件復制到容器中
COPY house_price_prediction.py .
# 設置運行Python腳本的命令
CMD ["python", "house_price_prediction.py"]
接下來分析一下Dockerfile的內容:
-
所有Dockerfile都以指定基礎鏡像的
FROM
指令開始。基礎鏡像就是你的鏡像所基于的鏡像。這里示例使用的是Python 3.9的可用鏡像。FROM
指令告訴Docker從指定的基礎鏡像構建當前鏡像。 -
WORKDIR
命令用于設置所有后續命令(本例中為app
)的工作目錄。 -
然后將
requirements.txt
文件復制到容器的文件系統中。 -
RUN指令將在容器內的shell中執行指定的命令。示例在這里使用
pip
安裝所有需要的依賴項。 -
然后將源代碼文件(Python腳本
house_price_prediction.py
)復制到容器的文件系統中。 -
最后,
CMD
指的是容器啟動時要執行的指令。在這里示例需要運行house_price_prediction.py
腳本。Dockerfile應該只包含一條CMD
指令。
構建鏡像
既然已經定義了Dockerfile,就可以通過運行docker build
來構建Docker鏡像了:
docker build -t ml-app .
選項-t
允許用戶為鏡像指定名稱和標簽,格式為name:tag
。默認標簽為latest
。
生成過程大約需要幾分鐘:
Sending build context to Docker daemon 4.608kB
Step 1/6 : FROM python:3.9-slim
3.9-slim: Pulling from library/python
5b5fe70539cd: Pull complete
f4b0e4004dc0: Pull complete
ec1650096fae: Pull complete
2ee3c5a347ae: Pull complete
d854e82593a7: Pull complete
Digest: sha256:0074c6241f2ff175532c72fb0fb37264e8a1ac68f9790f9ee6da7e9fdfb67a0e
Status: Downloaded newer image for python:3.9-slim
---> 326a3a036ed2
Step 2/6 : WORKDIR /app
...
...
...
Step 6/6 : CMD ["python", "house_price_prediction.py"]
---> Running in 7fcef6a2ab2c
Removing intermediate container 7fcef6a2ab2c
---> 2607aa43c61a
Successfully built 2607aa43c61a
Successfully tagged ml-app:latest
生成Docker鏡像后,運行docker images
命令。用戶應該會看到ml-app
鏡像也在其中。
docker images
可以使用docker run
命令運行Docker鏡像ml-app
:
docker run ml-app
你現在實現了第一個數據科學應用程序的docker
化。通過創建一個DockerHub賬戶,可以將鏡像推送到該賬戶(或組織內的私有存儲庫)。
結論
希望本Docker入門教程對你有所幫助。可以在Github代碼庫中找到本教程使用的代碼。下一步,請在計算機上安裝Docker并嘗試這個示例。或者對你選擇的應用程序進行Docker化。
在計算機上安裝Docker的最簡單方法是使用Docker Desktop:可以同時獲得Docker CLI客戶端和GUI界面來輕松管理容器。因此,設置好Docker,就可以開始編碼了!
【GitHub代碼庫】:https://github.com/balapriyac/docker-data-science
【Docker Desktop】:https://www.docker.com/products/docker-desktop/