在机器学习的动态世界中,从开发模型到将其投入生产的过程通常被认为是复杂且多方面的。 然而,随着 Docker、Kubernetes 等工具以及 FastAPI、Streamlit 和 Gradio 等用户友好的 Web 框架的出现,这一过程变得比以往更加简化。 再加上 GitHub Actions 持续集成和部署的强大功能,我们现在拥有一个支持快速、高效和可扩展的机器学习应用程序的生态系统。 本文提供了有关这些工具的基本命令的简明指南,旨在弥合模型开发和无缝部署之间的差距。 无论您是一位想要涉足部署领域的经验丰富的数据科学家,还是一位渴望将机器学习集成到 Web 应用程序中的新手开发人员,本指南都提供了基础知识来推动您的努力。
定义:Docker是一个允许开发人员将应用程序及其依赖项打包到容器中的平台。
容器化:与传统虚拟化不同,Docker容器共享主机系统的操作系统内核,而不是包含自己的操作系统。 这使得它们轻便且快速。
可移植性:容器确保应用程序在多个环境中一致运行,从开发人员的本地计算机到各种生产设置。
环境一致性:确保模型在开发、测试和生产中使用相同的依赖项和库运行。
减少“它可以在我的机器上运行”问题。
可扩展性:Docker 容器可以根据应用程序的需求轻松扩展或缩小。
隔离:ML 模型,尤其是微服务架构中的模型,可能具有不同的依赖关系。 Docker 隔离了这些依赖关系以避免冲突。
环境的版本控制:就像代码一样,Docker 允许对环境进行版本控制。 如果较新的库版本破坏了模型,人们可以轻松恢复到旧的工作容器版本。
高效的资源利用:Docker 容器是轻量级的,可以高效地使用资源,这对于在同一基础设施上部署多个 ML 模型至关重要。
与现代部署管道集成:Docker 与 CI/CD 工具和编排系统(如 Kubernetes)无缝集成,促进自动化测试和部署。
协作:数据科学家、机器学习工程师和开发人员可以共享 Docker 容器,确保每个人都在一致的环境中工作。
$ docker --version
Dockerfile 定义了容器中的内容。 以下是 Python 机器学习环境的 Dockerfile 示例:
# Use an official Python runtime as base image
FROM python:3.8-slim
# Set the working directory inside the container
WORKDIR /usr/src/app
# Install essential libraries and tools
RUN apt-get update && \
apt-get install -y build-essential
# Copy the requirements.txt into the container
COPY requirements.txt .
# Install Python dependencies
RUN pip install --no-cache-dir -r requirements.txt
# Command to run when the container starts
CMD ["python", "your_script.py"]
Dockerfile Breakdown:
FROM python:3.8-slim
设置工作目录:
WORKDIR /usr/src/app
安装必要的库:
RUN apt-get update && \
apt-get install -y build-essential
复印要求:
COPY requirements.txt .
安装 Python 依赖项:
RUN pip install --no-cache-dir -r requirements.txt
启动命令:
CMD ["python", "your_script.py"]
需求文件:
对于机器学习项目,您的 requests.txt 可能如下所示:
numpy==1.19.5
pandas==1.1.5
tensorflow==2.4.1
scikit-learn==0.24.1
要从 Dockerfile 创建 Docker 映像:
$ docker build -t ml-python-image .
-t 标志为图像分配标签或名称,而 . 指定包含 Dockerfile 的目录。
要从您的映像启动容器:
$ docker run --name ml-python-container ml-python-image
要查看所有正在运行的容器的列表:
$ docker ps
对于所有容器,包括那些未运行的容器:
$ docker ps -a
要停止正在运行的容器:
$ docker stop ml-python-container
要删除已停止的容器:
$ docker rm ml-python-container
您可以使用 Docker Hub(一种用于共享容器映像的云服务)来共享 Docker 映像。 首先,登录:
$ docker login
然后,标记您的图像:
$ docker tag ml-python-image:latest username/ml-python-image:latest
$ docker push username/ml-python-image:latest
然后您或其他人可以拉取该image:
$ docker pull username/ml-python-image:latest
运行它:
$ docker run --name new-ml-python-container username/ml-python-image:latest
All in one
# General
docker --version # Version Information
docker info # Docker Configuration Info
# Images
docker images # List Images
docker build -t [image-name]:[tag] . # Build an Image
docker rmi [image-name]:[tag] # Remove an Image
docker pull [image-name] # Pull an Image
# Containers
docker ps # List Running Containers
docker ps -a # List All Containers
docker run -d -p [host-port]:[container-port] [image-name] # Start a Container
docker stop [container-id] # Stop a Container
docker rm [container-id] # Remove a Container
docker logs [container-id] # View Container Logs
# Docker Compose (if you're using it)
docker-compose up # Start Services
docker-compose down # Stop Services
# Maintenance
docker system prune # Remove All Unused Containers, Networks, and Images
docker volume prune # Remove All Unused Volumes
docker system df # Check Docker Disk Usage
# Dockerfile Basics (For reference, not executable as commands)
# FROM [base-image] # Base Image
# WORKDIR /path/to/directory # Set Working Directory
# RUN command # Run Commands
# COPY source destination # Copy Files
# EXPOSE port # Expose Port
# CMD ["executable", "param1", "param2"] # Default Command
1. 节点和集群:节点是机器、虚拟机或云实例,集群是 Kubernetes 管理的一组节点。 主节点管理集群,而工作节点运行应用程序。
2. Pod:Kubernetes 中最小的可部署单元是 Pod。 一个 Pod 可以托管多个容器,这些容器形成一个部署单元。
3. 服务:Kubernetes 服务是公开在一组 Pod 上运行的应用程序的抽象方式。
4. 部署:这是一个更高级别的概念,用于管理 Pod 和副本集的所需状态。
Kubernetes 可以使用 Minikube 在本地计算机上设置,也可以在云平台上设置。 AWS、GCP 和 Azure 等云提供商分别提供 EKS、GKE 和 AKS 等托管 Kubernetes 服务。
1. 容器化您的模型:在 Kubernetes 上部署之前,您的模型需要容器化。 Docker 通常用于此目的:
FROM python:3.8-slim
WORKDIR /appCOPY requirements.txt .RUN pip install --no-cache-dir -r requirements.txtCOPY . /appCMD ["python", "app.py"]
此 Dockerfile 假设您有一个为您的模型提供服务的 app.py,可能使用 Flask 或 FastAPI 等框架。
构建并推送您的 Docker 镜像:
$ docker build -t username/ml-model:v1 .
$ docker push username/ml-model:v1
2.创建部署配置:为Kubernetes定义一个deployment.yaml:
apiVersion: apps/v1
kind: Deployment
metadata:
name: ml-model-deployment
spec:
replicas: 3
selector:
matchLabels:
app: ml-model
template:
metadata:
labels:
app: ml-model
spec:
containers:
- name: ml-model
image: username/ml-model:v1
ports:
- containerPort: 5000
应用部署:
$ kubectl apply -f deployment.yaml
要访问您的模型,请使用服务公开它:
$ kubectl expose deployment ml-model-deployment --type=LoadBalancer --port=80 --target-port=5000
expose:
这告诉 kubectl 您想要将资源(在本例中为部署)公开为网络服务。
deployment ml-model-deployment:
指定要公开的资源(部署)的类型和该资源的名称(ml-model-deployment)。
--type=LoadBalancer:
这指定了您要创建的服务的类型。 在这种情况下,正在请求 LoadBalancer 服务。 当在云环境(如 AWS、GCP 或 Azure)中使用时,通常会配置一个云负载均衡器来将网络流量分发到与该服务关联的所有 Pod。
--port=80:
定义服务将侦听的端口。 这意味着外部流量将进入该端口的服务。
--target-port=5000:
指定 pod 上服务应将流量转发到的端口。 在早期部署的上下文中,容器内的应用程序侦听端口 5000。因此,端口 80(由 --port 指定)传入的外部流量将转发到 Pod 上的端口 5000。
检索服务 URL:
$ kubectl get services
然后,您可以通过提供的 URL 访问您的机器学习模型。
5. 扩展您的部署:
Kubernetes 让您可以轻松扩展部署:
$ kubectl scale deployment ml-model-deployment --replicas=5
scale:
这告诉 kubectl 您打算更改特定资源(在本例中为部署)的副本数量(即调整规模)。
deployment ml-model-deployment:
指定要扩展的资源(部署)的类型和该资源的名称(ml-model-deployment)。
--replicas=5:
指定您希望部署所需的副本数量。 这意味着 Kubernetes 将确保有 5 个相同的 pod(副本)为 ml-model-deployment 运行。
Kubernetes 为部署机器学习模型提供了一个强大的环境,确保它们具有高可用性和可扩展性。
All in one:
# Cluster Info
kubectl cluster-info
# Get resources
kubectl get nodes
kubectl get pods
kubectl get services
kubectl get deployments
# Describe resources
kubectl describe node
kubectl describe pod
kubectl describe service
kubectl describe deployment
# Create resources
kubectl create -f
kubectl apply -f # idempotent version of 'create'
# Delete resources
kubectl delete -f
kubectl delete pod
kubectl delete service
kubectl delete deployment
# Logs & Debugging
kubectl logs
kubectl exec -it -- /bin/bash
# Scale deployments
kubectl scale deployment --replicas=
# Rolling updates and rollbacks
kubectl set image deployment/ =
kubectl rollout history deployment/
kubectl rollout undo deployment/
# Configuration
kubectl config view
kubectl config use-context
# Namespace operations
kubectl get namespaces
kubectl create namespace
kubectl delete namespace
kubectl get pods --namespace=
# Port forward
kubectl port-forward :
Helm 通常被称为 Kubernetes 的包管理器。 随着机器学习模型变得越来越复杂,周围的基础设施也越来越大,Helm 简化了部署过程。
图表:Helm 使用“图表”,它是预先配置的 Kubernetes 资源的包。 将它们想象成一个打包的应用程序。
发布:当图表部署在 Kubernetes 上时,称为发布。
简单性:您无需处理多个不同的 Kubernetes 清单文件,只需管理单个 Helm 图表。
在开始使用 Helm 部署 ML 模型之前,您需要对其进行设置。
安装Helm:从官方网站下载并安装Helm或使用brew等包管理器。
初始化 Helm:安装后,运行 helm init 以设置 Helm 环境。
添加存储库:Helm 图表存储在存储库中。 使用 helm repo add 添加所需的存储库。
搜索图表:helm search repo 可让您在添加的存储库中查找图表。
安装图表:helm install [chart-name] 会将图表部署到您的 Kubernetes 集群上。
升级和回滚:更改了您的 ML 模型中的某些内容? helm Upgrade 允许您使用较新的图表升级您的版本。 犯了一个错误? helm 回滚将恢复到以前的版本。
删除版本:helm delete [release-name] 将从 Kubernetes 中删除该版本。
使用 Helm 部署 ML 模型
让我们假设一个场景,您有一个用于图像识别的 ML 模型:
准备模型:训练模型并将其公开为 API(使用 Flask、FastAPI、Streamlit 等)。
Docker 化模型:创建 ML 应用程序的 Docker 映像。
创建 Helm 图表:为您的 ML 模型构建 Helm 图表,确保定义必要的资源,例如部署、服务以及任何 ConfigMap 或 Secret(如果需要)。
部署:使用 helm install [chart-name] 部署您的 ML 模型。 Kubernetes 将创建图表中定义的资源。
版本控制:Helm 图表具有版本控制,确保您可以无缝管理 ML 应用程序的不同版本。
原子部署:Helm 确保发布是原子的。 这意味着要么所有资源都已成功部署,要么没有,从而确保状态一致。
可重用性和共享:您可以轻松打包和共享 Helm 图表。 如果您在不同的 ML 模型或团队中具有类似的部署结构,这将非常有用。
简化复杂部署:机器学习工作流程可能很复杂,尤其是与数据管道结合使用时。 Helm 允许以可维护的方式定义复杂的工作流程。
以下是一些基本 Helm 命令的指南:
设置和安装:
安装Helm:
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 chmod 700 get_helm.sh ./get_helm.sh
添加 Helm 存储库:
helm repo add [repo_name] [repo_url]
更新存储库信息:
helm repo update
搜索 Helm 图表:
helm search repo [search_term]
helm install [release_name] [repo_name]/[chart_name]
helm list
helm status [release_name]
升级已安装的版本:
helm upgrade [release_name] [repo_name]/[chart_name]
helm rollback [release_name] [revision_number]
卸载版本:
helm uninstall [release_name]
helm repo remove [repo_name]
创建新的 Helm 图表:
helm create [chart_name]
helm lint [chart_directory]
helm package [chart_directory]
列出添加的 Helm 存储库:
helm repo list
helm plugin install [plugin_url]
一次性完成所有基本命令:
# Initialize Helm and install Tiller (for Helm 2)
helm init
# Helm version
helm version
# Add a new Helm chart repository
helm repo add
# Update Helm chart repository list
helm repo update
# Search for Helm charts
helm search repo
# Install a Helm chart
helm install
# For Helm v3 and above, use:
helm install --generate-name
# List all releases
helm list
# For Helm v3 and above, you might need:
helm list --all-namespaces
# Get information about a release
helm status
# Upgrade a release
helm upgrade
# Rollback a release to a previous revision
helm rollback
# Uninstall a release
helm uninstall
# View the values of a release
helm get values
# Lint a Helm chart
helm lint
# Package a Helm chart into a versioned chart archive
helm package
# View Helm history
helm history
# Create a new Helm chart
helm create
# Render Helm chart templates locally (dry-run)
helm template
# Pull a chart from a repository and download it to your machine
helm pull
GitHub Actions 提供强大的集成 CI/CD 解决方案,允许开发人员直接在其 GitHub 存储库中自动化、自定义和执行软件开发工作流程。 对于使用 Python 的机器学习开发人员来说,它提供了一个无缝环境来自动执行测试、构建和部署模型等任务。
1. 工作流程:这些是您可以在存储库中设置的自动化过程,用于在 GitHub 上构建、测试、打包、发布或部署任何代码项目。
2. 事件:工作流程由事件触发。 常见事件包括push和pull_request,但还有许多其他事件,例如计划事件或手动触发器。
3. 作业:作业是在同一运行器上执行的一组步骤。 作业可以并行运行,也可以依赖于另一个作业的成功。
4. 步骤:这些是可以运行命令或操作的单独任务。
5. 操作:这些是独立命令,组合成步骤来创建作业。 操作可以由 GitHub、社区驱动或自定义到您的存储库提供。
1. 创建工作流:在您的存储库中,创建一个名为 .github/workflows 的目录。 添加新文件(例如 ml_cicd.yml)来定义您的工作流程。
2. 定义工作流触发器:您可以指定何时触发工作流。 对于 CI/CD,通常使用推送:
on: [push]
3. 定义测试和部署作业:设置一个作业以在每次出现推送事件时测试机器学习代码:
jobs:
build_and_test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: 3.8
- name: Install dependencies
run: |
pip install -r requirements.txt
- name: Run tests
run: pytest
4. 部署模型:测试后,您可以添加步骤来部署模型:
- name: Deploy model
run: |
# Your deployment script here, for example:
python deploy_model.py
5. 缓存和矩阵构建:要加快构建速度,请使用缓存:
- name: Cache dependencies
uses: actions/cache@v2
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-
要跨多个 Python 版本进行测试,请使用矩阵构建:
strategy:
matrix:
python-version: [3.7, 3.8, 3.9]
6. 持续部署:如果您正在使用云平台或容器编排系统(例如 Kubernetes),则可以在测试通过后整合步骤来部署 ML 模型。
- name: Deploy to Kubernetes
run: |
kubectl apply -f k8s-deployment.yaml
一些基本动作:
# Name of the workflow
name: CI/CD Workflow
# Event that triggers the workflow
on:
push:
branches:
- main
pull_request:
branches:
- main
jobs:
build:
name: Build Job
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: 3.8
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run tests
run: pytest
deploy:
name: Deploy Job
needs: build
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Deploy to server
run: ./deploy_script.sh
#sample file
以下是其他流行的 CI/CD 工具的列表:
Streamlit 是专为机器学习和数据科学项目打造的开源应用程序框架。 只需几行 Python 代码,您就可以快速将数据脚本转换为交互式 Web 应用程序,而无需任何 HTML、CSS 或 JavaScript 知识。 Streamlit 简单的语法和快速的开发周期使其成为希望展示其项目的数据科学家的诱人选择。
安装 Streamlit 非常简单:
pip install streamlit
要检查它是否已正确安装:
streamlit hello
此命令在 Web 浏览器中启动示例 Streamlit 应用程序。
让我们创建一个机器学习模型,使用 TextBlob 库预测输入文本是正数还是负数。 然后我们将使用 Streamlit 进行交互。
首先,确保您拥有必要的库:
pip install streamlit textblob
接下来,创建一个 Python 脚本 (app.py):
import streamlit as st
from textblob import TextBlob
st.title('Sentiment Analysis Using Streamlit')
user_input = st.text_area("Enter Text:", "Type Here...")
if st.button("Analyze"):
blob = TextBlob(user_input)
result = blob.sentiment.polarity
if result > 0:
st.write("Positive Sentiment")
elif result < 0:
st.write("Negative Sentiment")
else:
st.write("Neutral Sentiment")
运行您的 Streamlit 应用程序:
streamlit run app.py
这将在您的浏览器中启动该应用程序,您可以在其中输入文本并获取其情绪。
为了实现跨平台的生产部署和一致性,您可能希望对 Streamlit 应用程序进行容器化。
Streamlit 的 Dockerfile:
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt ./requirements.txt
RUN pip install -r requirements.txt
COPY . .
EXPOSE 8501
CMD ["streamlit", "run", "app.py"]
在这里,requirements.txt 将包含:
streamlit
textblob
构建并运行 Docker 容器:
docker build -t ml-streamlit-app:latest .
docker run -p 8501:8501 ml-streamlit-app:latest
一气呵成:
##########################
### Streamlit Commands ###
##########################
# 1. Install Streamlit
pip install streamlit
# 2. Create a new Streamlit script
echo 'import streamlit as st\n\nst.write("Hello, world!")' > app.py
# 3. Run a Streamlit app
streamlit run app.py
# 4. Secure your Streamlit app (you can set tokens, passwords, etc.)
# Use third-party tools or services for this.
streamlit run app.py --secure-mode
# 5. Set the Streamlit server port (e.g., to 9999)
streamlit run app.py --server.port 9999
# 6. Disable the Streamlit welcome page
streamlit run app.py --server.headless true
# 7. Cache data to speed up your Streamlit app
# In your app.py script, you can use the @st.cache decorator for functions you want to cache.
# Example:
# @st.cache
# def fetch_data():
# return download_your_data_here()
# 8. Deploying Streamlit app with Streamlit sharing
# - First, push your app to a public GitHub repository.
# - Then use Streamlit sharing (a service by Streamlit) to deploy directly from the repository.
# Check the Streamlit documentation for more on this.
############################
### Streamlit Components ###
############################
# Streamlit offers various components like buttons, sliders, file uploaders, etc.
# Here are examples of a few:
# In your app.py:
# st.button('Click me!')
# st.slider('Select a range', 0.0, 100.0)
# st.file_uploader('Upload a file here')
# st.selectbox('Choose an option', ['Option 1', 'Option 2', 'Option 3'])
Flask 是 Python 中的一个轻量级 Web 服务器框架。 其微框架性质使其非常适合快速创建中小型 Web 应用程序。 它特别适合部署机器学习模型,因为它具有灵活性并提供从 Python 代码到 Web 服务的直接路径。
首先使用 pip 安装 Flask:
pip install Flask
要检查它是否已正确安装,您可以创建一个基本的 Flask 应用程序:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
将其保存为 app.py 并运行:
export FLASK_APP=app.py
flask run
此命令启动您的 Flask 应用程序,您应该看到 Hello, World! 当您在浏览器中导航到 http://127.0.0.1:5000/ 时。
想象一下,我们有一个机器学习模型,可以使用 TextBlob 库预测输入文本是正面还是负面。 我们将使用 Flask 为该模型创建一个简单的 API。
首先,确保您拥有必要的库:
pip install Flask textblob
接下来,更新app.py:
from flask import Flask, request, jsonify
from textblob import TextBlob
app = Flask(__name__)
@app.route('/analyze', methods=['POST'])
def analyze_sentiment():
data = request.get_json()
text = data['text']
blob = TextBlob(text)
result = blob.sentiment.polarity
sentiment = ""
if result > 0:
sentiment = "Positive"
elif result < 0:
sentiment = "Negative"
else:
sentiment = "Neutral"
return jsonify(sentiment=sentiment)
if __name__ == "__main__":
app.run(debug=True)
这个 Flask 应用程序公开了一个 POST 端点 /analyze,它需要一个带有关键文本的 JSON 对象,并返回所提供文本的情绪。
为了便于部署并确保不同环境之间的一致性,对 Flask 应用程序进行容器化非常有用。
Flask 的 Dockerfile:
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt ./requirements.txt
RUN pip install -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
您的requirements.txt 应包含:
Flask
textblob
构建并运行 Docker 容器:
docker build -t ml-flask-app:latest .
docker run -p 5000:5000 ml-flask-app:latest
一气呵成:
# ---- SETTING UP A VIRTUAL ENVIRONMENT AND INSTALLING FLASK ----
# Create a virtual environment
python -m venv myenv
# Activate the virtual environment
# On Windows:
myenv\Scripts\activate
# On macOS and Linux:
source myenv/bin/activate
# Install Flask
pip install Flask
# ---- BASIC FLASK APP STRUCTURE ----
# Use this structure in your Python script (e.g., app.py)
"""
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
"""
# ---- RUNNING A FLASK APPLICATION ----
# Set the FLASK_APP environment variable
# On Windows:
set FLASK_APP=your_flask_app_filename.py
# On macOS and Linux:
export FLASK_APP=your_flask_app_filename.py
# Run the app
flask run
# ---- DEVELOPMENT MODE ----
# Activate the development environment
# On Windows:
set FLASK_ENV=development
# On macOS and Linux:
export FLASK_ENV=development
# Now run the app
flask run
# ---- SPECIFY HOST AND PORT ----
flask run --host=0.0.0.0 --port=8080
# ---- USING FLASK EXTENSIONS (example: Flask-SQLAlchemy) ----
# Install Flask-SQLAlchemy
pip install Flask-SQLAlchemy
# Use in your Flask app:
"""
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///your_database_name.db'
db = SQLAlchemy(app)
"""
# ---- DEACTIVATE VIRTUAL ENVIRONMENT ----
deactivate
Gradio 是一个开源 Python 库,它提供了一种简单的方法来为机器学习模型创建用户友好的基于 Web 的界面。 它的设计简单明了,允许机器学习从业者快速部署并与非技术用户共享他们的模型。
使用 pip 安装 Gradio 很简单:
pip install gradio
安装 Gradio 后,您可以快速为模型创建界面,而无需广泛的 Web 开发专业知识。
假设我们有一个机器学习模型,可以对 MNIST 数据集中的手写数字进行分类。 我们将使用 Gradio 为该模型创建一个简单的 UI。
首先,确保您拥有必要的库:
pip install gradio tensorflow
接下来,使用 TensorFlow 构建一个简单的模型并将其与 Gradio 集成:
import gradio as gr
import numpy as np
import tensorflow as tf
# Load MNIST dataset
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0 # Normalize data
# Build a simple model
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(512, activation='relu'),
tf.keras.layers.Dropout(0.2),
tf.keras.layers.Dense(10)
])
model.compile(optimizer='adam',
loss=tf.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=5)
def classify_digit(img):
img = img.reshape(1, 28, 28)
prediction = model.predict(img).tolist()[0]
return {str(i): prediction[i] for i in range(10)}
# Gradio UI
interface = gr.Interface(fn=classify_digit,
inputs="sketchpad",
outputs="label")
interface.launch()
运行此脚本将在 MNIST 数据集上训练模型,然后启动 Gradio 界面,您可以在其中绘制数字,模型将对它们进行分类。
为了确保我们的应用程序在各种环境中保持一致并简化部署,将 Gradio 应用程序容器化很有帮助。
广播电台的 Dockerfile:
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt ./requirements.txt
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["python", "app.py"]
您的requirements.txt 应包含:
gradio
tensorflow
构建并运行 Docker 容器:
docker build -t ml-gradio-app:latest .
docker run -p 7860:7860 ml-gradio-app:latest
此命令将在 Docker 容器中启动 Gradio 应用程序并使其在端口 7860 上可用。
FastAPI 是一个现代、快速的 Web 框架,用于基于标准 Python 类型提示,使用 Python 构建 API。 它提供自动交互式 API 文档,构建在用于 Web 部分的 Starlette 和用于数据部分的 Pydantic 之上,并因其性能而受到认可,甚至可以与 NodeJS 和 Go 相媲美。
Docker 允许您将应用程序及其所有依赖项打包到一个标准化单元中以进行软件开发。 这可以确保无论 Docker 容器在何处运行,您的应用程序都会以相同的方式运行。 对于机器学习来说,这一点至关重要,因为您经常有大量的依赖项可能会导致冲突或版本控制问题。
FastAPI 可以像任何其他 Web 应用程序一样进行 Docker 化。 鉴于 FastAPI 的快速性能,它非常适合作为机器学习模型的服务器,特别是与 Docker 的一致性和隔离性结合使用时。
创建 FastAPI 应用程序:让我们创建一个简单的 FastAPI 应用程序来为机器学习模型提供服务。 在本指南中,为了简单起见,我们将使用预先训练的模型。
# main.py
from fastapi import FastAPI
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
app = FastAPI()
# Load dataset and train a simple model
X, y = load_iris(return_X_y=True)
clf = LogisticRegression().fit(X, y)
@app.get("/predict/")
def predict(sepal_length: float, sepal_width: float, petal_length: float, petal_width: float):
prediction = clf.predict([[sepal_length, sepal_width, petal_length, petal_width]])
return {"prediction": int(prediction[0])}
创建 Dockerfile:现在,让我们对 FastAPI 应用程序进行 Docker 化。
# Use an official Python runtime as a base image
FROM python:3.8-slim
# Set the working directory
WORKDIR /app
# Install dependencies
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
# Copy the current directory contents into the container at /app
COPY . .
# Expose port 8000 for FastAPI
EXPOSE 8000
# Run main.py when the container launches
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
每条指令都会在 Docker 镜像中创建一个新层,并按顺序执行它们以构建最终镜像。 此 Dockerfile 设置为在容器化环境中运行 FastAPI 应用程序。
你的requirements.txt应该有:
fastapi
uvicorn
scikit-learn
c. 使用 Docker 构建并运行:安装 Docker 后,导航到项目的根目录并运行:
$ docker build -t fastapi_ml_app .
$ docker run -p 8000:8000 fastapi_ml_app
在浏览器中访问
http://localhost:8000/predict/?sepal_length=5.1&sepal_width=3.5&petal_length=1.4&petal_width=0.2。 您应该看到预测输出。
项目流程如下:
机器学习模型部署流程:
数据采集
数据预处理
模型训练
模型评估
模型导出(例如 TensorFlow SavedModel 或 PyTorch state_dict)
使用 Streamlit 编写应用程序脚本,使用 ML 模型进行推理
在本地测试应用程序
创建包含所有必要说明的 Dockerfile
构建 Docker 镜像
本地测试 Docker 容器
将构建的 Docker 镜像推送到容器注册中心(例如 Docker Hub、Google 容器注册中心等)
使用声明性配置文件编写 Terraform 配置来定义和提供数据中心基础设施
初始化 Terraform,应用配置来配置 Google Kubernetes Engine (GKE) 集群以及 GCP 中的其他所需资源
为您的 Streamlit 应用程序创建 Helm 图表,其中包括 Kubernetes 清单模板和值
打包 Helm 图表
使用 Helm 将应用程序部署到 Kubernetes 集群(例如 GKE)
Helm将使用打包好的chart来部署和管理Kubernetes资源
使用 GitHub Actions 自动化模型训练、测试、Docker 构建、Terraform 应用程序和 Helm 部署
配置 GitHub Actions 工作流程和触发器
使用监控解决方案(如 Prometheus、Grafana)监控应用程序和模型性能
使用 Kubernetes 自动缩放或手动命令根据流量向上/向下扩展
import tensorflow as tf
import tensorflow_hub as hub
model_url = "https://tfhub.dev/google/imagenet/mobilenet_v2_100_224/classification/4"
model = tf.keras.Sequential([
hub.KerasLayer(model_url)
])
def classify_image(image_path):
img = tf.keras.preprocessing.image.load_img(image_path, target_size=(224, 224))
img_array = tf.keras.preprocessing.image.img_to_array(img)
img_array = tf.expand_dims(img_array, 0)
predictions = model.predict(img_array)
top_prediction = tf.keras.applications.mobilenet_v2.decode_predictions(predictions.numpy())[0][0]
return top_prediction[1], top_prediction[2]
Python代码(app.py):
import streamlit as st
from model import classify_image
st.title("Image Classifier")
uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "png", "jpeg"])
if uploaded_file:
st.image(uploaded_file, caption='Uploaded Image.', use_column_width=True)
st.write("")
st.write("Classifying...")
label, probability = classify_image(uploaded_file)
st.write(f"Class: {label}, Confidence: {probability:.2f}%")
Dockerfile:
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY . .
CMD ["streamlit", "run", "app.py"]
requirements.txt:
streamlit
tensorflow
tensorflow_hub
构建并推送到 Docker Hub:
docker build -t username/image-classifier .
docker push username/image-classifier
为我们的部署创建 Helm 图表。
图表结构(简化):
image-classifier-chart/
|-- templates/
| |-- deployment.yaml
| |-- service.yaml
|-- values.yaml
|-- Chart.yaml
在deployment.yaml和service.yaml中,定义Kubernetes部署和服务结构,相应地引用Docker镜像和端口。
deployment.yaml:
该文件定义了 Kubernetes 部署,它确保在任何给定时间都有一定数量的 pod 副本正在运行。
apiVersion: apps/v1
kind: Deployment
metadata:
name: image-classifier-deployment
spec:
replicas: 2
selector:
matchLabels:
app: image-classifier
template:
metadata:
labels:
app: image-classifier
spec:
containers:
- name: image-classifier-container
image: username/image-classifier:latest
ports:
- containerPort: 8501 # Streamlit's default port
service.yaml:
apiVersion: v1
kind: Service
metadata:
name: image-classifier-service
spec:
selector:
app: image-classifier
ports:
- protocol: TCP
port: 80
targetPort: 8501
type: LoadBalancer
values.yaml:
replicaCount: 2
image:
repository: username/image-classifier
tag: latest
pullPolicy: IfNotPresent
service:
type: LoadBalancer
port: 80
这是 Helm 图表的默认配置文件。 部署 Helm 图表时,您可以覆盖这些默认值。
Chart.yaml:
apiVersion: v2
name: image-classifier-chart
description: A Helm chart to deploy the image classifier app on Kubernetes
version: 0.1.0
appVersion: 1.0.0
设置 CI/CD 管道来构建 Docker 映像,并在提交代码时将其推送到 Docker Hub。
.github/workflows/main.yml:
name: Build and Push Docker Image
on:
push:
branches:
- master
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Login to Docker Hub
run: echo "${{ secrets.DOCKER_PASSWORD }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin
- name: Build and Push Docker Image
run: |
docker build -t username/image-classifier .
docker push username/image-classifier
一旦 GitHub Action 成功构建并推送 Docker 镜像,您就可以使用 Helm 将图表部署到 Kubernetes 集群。
要使用 Helm 部署 Streamlit 应用程序:
打包 Helm 图表:
helm package image-classifier-chart
将图表安装到您的 Kubernetes 集群上:
helm install image-classifier-release image-classifier-chart-0.1.0.tgz
部署完成后,您将从 LoadBalancer 获得外部 IP 地址。 在浏览器上访问此 IP 将带您进入 Streamlit 应用程序。
Terraform 是由 HashiCorp 开发的开源基础设施即代码 (IAC) 软件工具。 它允许用户使用声明性配置语言定义和配置数据中心基础设施。 借助 Terraform,您可以跨多个云提供商管理和自动化基础设施,使其成为现代基于云的应用程序(包括机器学习部署)的重要工具。
为什么选择 Terraform 进行机器学习部署?
不可变的基础设施:定义一次 ML 基础设施并跨阶段一致部署。
与提供商无关:无论您使用 AWS、Google Cloud、Azure 还是组合,Terraform 都能满足您的需求。
可扩展性:根据需求轻松扩展或缩小 ML 资源。
版本控制:基础设施作为代码存储,使版本控制和回滚无缝。
安装 Terraform:遵循为您的操作系统量身定制的官方安装指南。
初始化新的 Terraform 配置:使用 terraform init 开始新项目。
配置云提供商:为您选择的云提供商设置身份验证。
定义基础设施:在 .tf 文件中描述 ML 模型所需的资源,例如虚拟机、存储和网络。
规划部署:使用 terraform plan,在应用更改之前检查更改。
应用更改:terraform apply 将提供定义的资源。
集成 ML 组件:基础设施准备就绪后,部署 ML 模型、必要的服务和其他组件。
自动化工作流程:将 Terraform 与 Jenkins、GitHub Actions 或 GitLab CI 等 CI/CD 工具集成。
自动化测试:通过自动化基础设施测试确保机器学习部署的完整性。
回滚功能:借助版本控制的基础设施,回滚更加顺畅且更易于管理。
协作:使用 Terraform Cloud 或 Terraform Enterprise 实现协作功能和远程状态管理。
模块化配置:将配置分解为模块,以实现更好的组织和可重用性。
保护敏感数据:使用机密管理工具并避免对凭据进行硬编码。
定期更新:确保您始终使用最新版本的 Terraform 和提供程序插件。
文档:就像代码一样,注释和记录 Terraform 配置至关重要。
初始化一个新的 Terraform 工作目录:
terraform init
规划和预览基础设施变更:
terraform plan
terraform apply
terraform destroy
显示当前状态:
terraform show
获取模块:
terraform get
工作区允许您为同一配置维护多个不同的状态。
列出工作空间:
terraform workspace list
terraform workspace select [workspace_name]
terraform workspace new [workspace_name]
格式配置:
terraform fmt
验证配置:
terraform validate
导入资源:
terraform import [address] [resource_id]
显示输出:
terraform output
请记住,Terraform 配置写入扩展名为 .tf 的文件中。 当运行 plan 和 apply 等命令时,Terraform 使用当前目录中的配置文件。
Spinnaker 是一个开源、多云持续交付平台,可帮助开发人员自动化、管理和监控应用程序的部署。 它由 Netflix 创建,现在得到了 Google 的支持,使其成为现代软件交付的可靠选择。
可扩展性:随着机器学习模型变得越来越复杂且对资源的需求越来越大,Spinnaker 的云原生方法可确保无缝扩展。
版本控制:ML 模型通常需要频繁更新。 Spinnaker 允许对已部署模型进行平滑版本控制。
回滚:如果 ML 模型未按预期执行,Spinnaker 提供简单的回滚选项。
多云:如果您的机器学习部署需要利用多个云提供商的资源,Spinnaker 可以满足您的需求。
以下是帮助您入门的简化流程:
打包您的 ML 模型:您的模型、预训练权重和推理代码应使用 Docker 等工具进行容器化。
与 CI 工具集成:确保使用 Jenkins 或 Travis CI 等 CI 工具自动构建模型容器。
创建 Spinnaker 应用程序:这是部署管道的逻辑分组。
定义部署管道:定义“获取最新模型”、“部署到暂存”、“运行测试”和“部署到生产”等阶段。
自动化:每次 ML 模型更新时自动触发部署管道。
自动化模型测试:将模型验证测试集成到部署管道中。
蓝/绿部署:将新版本与旧版本一起部署,将一部分流量引导至新版本。 对于模型的 A/B 测试很有用。
监控和日志记录:与 Prometheus 和 Grafana 等监控工具集成,以密切关注模型性能和资源利用率。
反馈循环:根据现实世界的反馈和性能指标快速迭代模型更新。
一些基本命令:
##########################
### Spinnaker Commands ###
##########################
# 1. Install `hal` (Halyard), the command-line tool for configuring and managing Spinnaker
curl -O https://raw.githubusercontent.com/spinnaker/halyard/master/install/debian/InstallHalyard.sh
sudo bash InstallHalyard.sh
sudo update-hal
# 2. Choose cloud providers (e.g., AWS, GCP, Kubernetes)
hal config provider [provider name] enable
# 3. For Kubernetes (as an example cloud provider)
# Assuming you have a kubeconfig file already set up
hal config provider kubernetes account add my-k8s-account --provider-version v2 \
--kubeconfig-file ~/.kube/config
# 4. Set the deployment environment
hal config deploy edit --type distributed --account-name my-k8s-account
# 5. Choose storage for Spinnaker's persistent data
# Example with GCS (Google Cloud Storage)
hal config storage gcs edit --project [YOUR_PROJECT_ID] --bucket-location [BUCKET_LOCATION] --json-path [PATH_TO_SERVICE_ACCOUNT_JSON]
hal config storage edit --type gcs
# 6. Choose the version of Spinnaker you want to run
hal version list
hal config version edit --version [desired version]
# 7. Deploy Spinnaker using Halyard
hal deploy apply
# 8. Connect to the Spinnaker UI
# Assuming you are using Kubernetes, set up port forwarding:
kubectl port-forward -n spinnaker svc/spin-deck 9000:9000 & kubectl port-forward -n spinnaker svc/spin-gate 8084:8084
# Now, you can access Spinnaker at http://localhost:9000
# 9. Update Spinnaker (after choosing a new version with `hal version edit`)
hal deploy apply
# 10. Backup Halyard's configuration
tar -czf hal-backup.tgz ~/.hal/
Crossplane 是一个开源基础设施即代码 (IAC) 平台,可扩展 Kubernetes 以包含云基础设施编排。 它直接与 Kubernetes 集成,允许您使用熟悉的 K8s 工具和实践来声明、自动化和管理外部基础设施。
统一工作流程:借助 Crossplane,使用 kubectl 管理 Kubernetes 原生和云原生资源。
提供商多样性:对多个云提供商的支持确保机器学习部署可以与提供商无关。
动态扩展:ML 资源可以根据需求进行扩展,完全自动化。
安全配置:无缝管理敏感配置和机密。
声明性语言:用户使用 Puppet 的声明性语言定义基础设施的所需状态(您希望系统是什么样子、应具有哪些软件包等),Puppet 将强制执行此所需状态。
基础设施即代码:使用 Puppet,基础设施作为代码进行管理。 这允许版本控制、同行评审和自动化测试,就像任何其他软件代码库一样。
幂等性:Puppet 的关键特征之一是其幂等性,这意味着无论初始条件如何,它都能确保每次运行的最终状态保持一致。 如果已经满足所需的状态,Puppet 将不会进行任何更改。
代理/服务器模型:通常,Puppet 遵循主代理设置。 主节点包含由 Puppet 代码定义的配置,代理会定期与主节点进行检查以获取配置指令。
模块和 Forge:模块是可重用、可共享的代码块,用于在 Puppet 中执行特定任务。 Puppet Forge 是一个社区成员可以共享这些模块的市场。
灵活性:Puppet 可以管理各种基础设施,从裸机到容器,以及跨不同平台和云环境。
报告:Puppet 提供详细的报告,显示已进行哪些更改以及谁进行了更改。
集成:Puppet 与其他 DevOps 工具集成良好,使用户能够构建完整的持续集成/持续部署 (CI/CD) 管道。
开源版和企业版:Puppet 提供开源版和企业版。 企业版提供了附加功能,包括图形界面、分析和专业支持。
无缝高效地部署机器学习模型需要采用整体方法,结合针对不同任务定制的各种工具的强大功能。 从使用 Streamlit、Gradio、Flask 或 FastAPI 制作交互式前端应用程序,到使用 Docker 进行容器化、使用 Kubernetes 和 Helm 进行编排,以及使用 Terraform 实现基础设施自动化,当代的 ML 部署环境是丰富多样的。 利用这些工具不仅可以确保稳健且可扩展的部署,还可以加速从模型开发到现实世界影响的过程。 随着技术生态系统的发展,这些集成工具为简化机器学习部署的时代铺平了道路。