维护生产环境中高效的 AI
使用 Intel® AI 分析工具包、MLflow 和 AWS 构建 MLOps 环境
严格来说,将机器学习 (ML) 应用程序从研发阶段带入生产阶段时,MLOps 是一个关键组件,但它常常被忽视。解决这个问题的方案通常最好根据具体情况来确定。在本文中,我将提供一个通用蓝图,用于在云中使用开源工具构建 MLOps 环境,以确保我们开发和部署高性能模型(图 1)。作为 ML 组件的骨干,我将利用 Intel® AI 分析工具包,特别是 Intel® Distribution for Python* 和 Intel® Extension for PyTorch*,以在训练和推理期间实现更高的性能。阅读本文后,您将掌握在无服务器云环境中进行快速模型实验、模型管理和服务的机制。
MLOps — 模型如何达到逃逸速度
MLOps 将 ML 与 DevOps 的敏捷性和弹性相结合——将 ML 资产与您的 CI/CD 管道绑定,以实现稳定部署到生产环境。这创建了一个统一的发布过程,解决了模型新鲜度和漂移问题。如果没有适当的 MLOps 管道,ML 应用程序工程师就无法向业务部门交付高质量的 ML 资产。它只会成为研发内部的一个大型科学实验。
缺乏对 MLOps 投资的主要原因源于对模型/数据漂移的影响以及它们如何影响生产环境中的应用程序的理解不足。模型漂移是指由于数据变化以及输入和输出变量之间的关系变化导致模型性能下降。数据漂移是一种模型漂移,其中自变量的属性发生变化。数据漂移的例子包括由于季节性导致的数据变化、消费者偏好的变化、新产品的添加等。完善的 MLOps 管道可以通过部署与数据环境最相关的模型来减轻这些影响。归根结底,目标始终是在生产环境中拥有性能最好的模型。
MLOps 解决方案 — MLflow* ML 生命周期管理开源工具
MLflow* 是一个开源的 ML 生命周期管理平台(图 2)。MLflow 适用于任何在云中运行的 ML 库。它易于扩展以处理大数据工作流。MLflow 由四个部分组成:
- MLflow Tracking 允许您记录和查询模型训练过程中的代码、数据、配置和结果。
- MLflow Projects 允许您打包和重新部署数据科学代码,以实现在任何平台上的可重现性。
- MLflow Models 是一个 API,用于轻松将模型部署到各种环境中。
- MLflow Model Registry 允许您在中央存储库中存储、注释和管理模型。
我将介绍如何为整个团队设置一个受密码保护的 MLflow 服务器。
MLflow 服务器 — AWS* 解决方案基础设施设计
我们的 MLOps 环境的云组件非常简单。我需要基础设施来训练、跟踪、注册和部署 ML 模型。下图描绘了我们的云解决方案,它由一个本地主机(或另一个远程主机)组成,该本地主机使用各种 MLflow API 与远程主机中的资源进行通信(图 3)。远程主机负责托管我们的跟踪服务器并与我们的数据库和对象存储进行通信。
本文包含设置此架构的分步说明。您会发现我利用的是免费的 AWS 服务。如果您要建立生产级环境,则不建议这样做。
表 1 展示了用于设置产品演示的资源。欢迎您将其用作蓝图并根据您的需求进行调整。所选实例均为第 3 代 Intel® Xeon® 可扩展处理器,具有不同的 vCPU 和 GiB 容量。
机器学习框架 — Intel® AI 分析工具包
我们的 MLOps 环境需要一套高性能的 ML 框架来构建模型。Intel AI 分析工具包提供了使用 oneAPI 库构建的 Python 工具和框架,用于底层计算优化。通过利用此工具包,我可以为我们的 MLOps 环境提供在 Intel® XPU 上进行高性能深度学习训练以及将快速推理集成到我们的工作流中的能力。
表 2 展示了一个端到端的 ML 生命周期,以及每个组件如何在我们的 MLOps 蓝图中得到解决。Intel AI 分析工具包有助于提高性能并降低计算成本的工作流组件已用粗体突出显示。
本文不涉及 conda 环境的设置,但我提供了一个环境配置脚本 (aikit_ipex.yml
) 供您参考。您可以使用以下命令创建相应的 conda 环境
conda env create -f aikit_ipex.yml
name: aikit_ipex
channels:
- conda-forge
- intel
- defaults
dependencies:
- cpuonly
- intelpython
- intelpython3_core
- ipykernel
- jupyterlab
- numpy
- pandas
- pip
- python
- scikit-learn
- scipy
- pip:
- boto3==1.24.59
- mlflow==1.28.0
- seaborn==0.11.2
- torch==1.12.1
- torchvision==0.13.1
设置 MLflow 远程主机
使用 AWS EC2 设置主机
- 前往您的 AWS 管理控制台,启动一个新的 EC2 实例。我选择了一个 Amazon Linux OS*,但欢迎您从列表中选择其他 Linux 和 Windows OS*。
- 如果您还没有密钥对,请创建一个新的。您将需要它来通过 SSH 登录您的实例并配置服务器的各个方面。
- 创建一个新的安全组,并允许来自任何地方 (0.0.0.0/0) 的 SSH、HTTPS 和 HTTP 流量。但是,为了最大程度的安全,建议您将应有权访问服务器的特定 IP 列入白名单,而不是开放到整个互联网的连接。
- 除非您打算将此实例用于其他目的,否则您的服务器的 EC2 存储卷无需大于 8-16 GB。我的建议是,您将此实例保留为专用的 MLflow 服务器。
设置 S3 对象存储
您的 S3 存储桶可用于存储模型工件、环境配置、代码版本和数据版本。它包含您 MLflow ML 管理管道的所有重要组成部分。
- 从 AWS 管理控制台创建一个新的存储桶。
- 启用 ACL 并保持所有公共访问被阻止。ACL 将允许其他具有适当凭据的 AWS 账户访问存储桶中的对象。
设置 AWS RDS Postgres 数据库
MLflow 工作流的这个组件将负责存储运行、参数、指标、标签、备注、对象存储路径和其他元数据。
- 从 AWS 管理控制台创建数据库。我将使用 PostgreSQL 数据库。选择免费套餐。
- 为您的数据库命名,分配一个主用户名,并为此账户提供一个密码。您将使用这些信息来启动您的 MLflow 服务器。
- 选择实例类型。根据您打算通过 MLflow 服务器传输的流量(即,您将查询模型和数据的次数),您可能需要提供一个更强大的实例。
- 您还需要指定存储。同样,这将取决于您需要跟踪多少元数据。请记住,模型和工件不会存储在此处,因此不要期望需要过多的空间。
- 公共访问对于允许您的虚拟私有集群之外的人员写入/读取数据库至关重要。接下来,您可以使用安全组指定白名单 IP。
- 您必须创建一个安全组,其中包含一个入站规则,允许来自任何地方 (0.0.0.0/0) 或特定 IP 的所有 TCP 流量。
- 启动 RDS。
安装 AWS CLI 并通过 SSH 访问实例
AWS CLI 是一个允许您从命令行控制 AWS 资源的工具。请点击此链接从 AWS 网站安装 CLI。安装 AWS CLI 后,您可以将 AWS 凭证配置到您的机器上,以允许您写入 S3 对象存储。在将 MLflow 集成到脚本、笔记本或 API 中时,您将需要此操作。
- 从您的 EC2 实例仪表板中,选择您的 MLflow EC2 实例并点击连接。
- 导航到 SSH 客户端选项卡,并从提示底部复制 SSH 示例到剪贴板。
- 将 SSH 命令粘贴到您的提示符中。我正在使用 Git Bash,并从我存储 .pem 文件的文件夹中操作。
- 安装以下依赖项
sudo pip3 install mlflow[extras] psycopg2-binary boto3
sudo yum install httpd-tools
sudo amazon-Linux-extras install nginx1
- 创建一个 nginx 用户并设置密码
sudo htpasswd -c /etc/nginx/.htpasswd testuser
- 最后,我将配置 nginx 反向代理到端口 5000
sudo nano /etc/nginx/nginx.conf
使用 nano,我可以编辑 nginx 配置文件以添加有关反向代理的以下信息
location / {
proxy_ass https://:5000/;
auth_basic "Restricted Content";
auth_basic_user_file /etc/nginx/.htpasswd;
}
您的最终脚本应该看起来像图 4 中控制台 nano 的输出。
启动 Nginx 和 MLflow 服务器
现在您可以启动您的 nginx 反向代理服务器并运行您的 MLflow 远程服务器。这一部分需要您从 AWS 管理控制台检索一些信息。
- 启动我们的 nginx 服务器
sudo service nginx start
- 启动您的 MLflow 服务器并配置对象存储 (S3) 和后端存储 (RDS) 的所有组件
mlflow server --backend-store-uri
postgresql://MASTERUSERNAME:YOURPASSWORD@YOUR-DATABASE-
ENDPOINT:5432/postgres --default-artifact-root s3://BUCKETNAME --
host 0.0.0.0
在哪里可以找到这些信息?
- MASTERUSERNAME — 您为 PostgreSQL RDS DB 设置的用户名。
- YOURPASSWORD — 您为 PostgreSQL RDS DB 设置的密码。
- YOUR-DATABASE-ENDPOINT — 可以在 AWS 管理控制台中的 RDS DB 信息中找到。
- BUCKETNAME — 您的 S3 存储桶的名称。
执行此命令后,您应该会看到大量的输出和有关您的 worker 和 pid ID 的信息
关闭您的 MLflow 服务器或在后台运行
如果您想随时关闭 MLflow 服务器,可以使用以下命令:
sudo fuser -k <端口>/tcp
如果您想在后台运行它,以便您可以关闭终端并继续运行服务器,请在您的 MLflow 服务器启动命令中添加 nohup 和 &。
nohup mlflow serer --backend-store-uri
postgresql://MASTERUSERNAME:YOURPASSWORD@YOUR-DATABASE-
ENDPOINT:5432/postgres --default-artifact-root s3://BUCKETNAME --
host 0.0.0.0 &
从浏览器访问 MLflow UI
现在您已经设置了整个 MLflow 服务器基础设施,您可以开始从命令行、脚本等与它交互。要访问 MLflow UI,您需要您的 EC2 实例的 IPV4 公共 IP 地址。
- 复制并粘贴您的 IPV4 公共 IP。(这可以在您的 EC2 管理控制台中找到。)请确保在 IP 地址前添加 http://。
- 系统将提示您输入 nginx 用户名和密码。
- 瞧!您现在可以从 MLflow UI 访问和管理您的实验和模型了
将 MLflow 添加到您的代码和 Intel® AI 参考工具包示例
MLflow 跟踪服务器
您需要做的第一件事是添加 MLflow 凭据并在您的开发环境中配置跟踪 URI
import mlflow
# setting up tracking server uri
# this is your remote server EC2 instance IPV4 Public IP
tracking_uri =''
client = mlflow.tracking.MlflowClient(tracking_uri=tracking_uri)
# nginx credentials
# these are the same credentials that you created during your nginx config step
os.environ['MLFLOW_TRACKING_USERNAME'] = 'testuser'
os.environ['MLFLOW_TRACKING_PASSWORD'] = 'password'
os.environ['MLFLOW_TRACKING_URI'] = traking_uri
现在让我们训练一个模型,使用 VGG16 模型对图像进行分类(请访问 Intel® AI Reference Kit 视觉质量检查存储库以查看其余源代码)
# mlflow training stuff
experiment_name = 'Team A'
mlflow.set_experiment(experiment_name) # creation of a new experiment
mlflow_artifact_path='artifacts' # this is the folder name within your S3 bucket where model will
run_id = 'run 1' # name for current mlflow training run
# initializing an mlflow run
with mlflow.start_run(run_name=run_id) as run:
# Initialization of DL architecture along with optimizer and loss function
model = CustomVGG()
class_weight = torch.tensor(class_weight).type(torch.FloatTensor).to(DEVICE)
criterion = nn.CrossEntropyLoss(weight=class_weight)
optimizer = optim.Adam(model.parameters(), lr=LR)
# intel extension for PyTorch Optimization
model, optimizer = ipex.optimize(model=model, optimizer, dtype=torch.float32)
# Training section
start_time = time.time()
trained_model = train(data_loader=train_loader, model=model, optimizer=optimizer, criterion=criterion, device=DEVICE, target_accuracy=TARGET_TRAINING_ACCURACY, data_aug=data_aug)
train_time = time.time()-start_time
mlflow.pytorch.log_model(pytorch_model=trained_model, artifact_path=mlflow_artifact_path)
mlflow.log_metrics('Training Time', train_time)
latest_run_id = run.info.run_id
# ending the mlflow run
mlflow.end_run()
MLflow 模型注册表
在进行 ML 实验并确定一些值得投入生产的模型后,您可以注册它们并为部署进行分阶段。在下面的代码块中,我使用模型的运行 ID 和实验名称将模型添加到 MLflow 模型注册表。然后,我将此模型移动到“生产”阶段,加载它,并将其用作识别异常药丸的预测服务。
import mlflow.pyfunc
# adding a model to the model registry
model_uri=f"runs:/{current_run_id}/{mlflow_artifact_path}"
name='Team A'
await_registration_for=5
mlflow.register_model(model_uri, name, await_registration_for)
# move a model to archived, staging, and production
client.transition_model_version_stage(name="Team A", version=8, stage="Production")
# Loading latest production version of a model
model_name = 'Team A'
stage = 'Production'
model_uri= f"models:/{model_name}/{stage}"
mlflow_model = mlflow.pytorch.load_model(model_uri)
# predicting with latest production version of a model
predict_localize(mlflow_model, test_loader, DEVICE, thres=HEATMAP_THRESH, n_samples=3, show_heatmap)
我部署到生产环境中的模型运行良好(图 5)!
结论
本文探讨了一个基于云的通用 MLOps 环境,该环境利用英特尔的 AI 分析工具包构建了一个加速的端到端 ML 管道。这个管道是确保您始终在生产环境中提供性能最佳模型的重要第一步。本文的目的不是提出一个一刀切的环境。作为实施该管道的读者和工程师,识别需要进行哪些更改以考虑您的计算、安全和一般应用要求至关重要。
相关内容
技术文章
- 深度学习模型优化变得简单(或至少更容易)
- 使用 Intel Extension for PyTorch 加速 PyTorch
- 优化端到端人工智能管道
- 利用英特尔优化库加速 Databricks Runtime for ML
- 优化人工智能应用程序
博客
点播网络研讨会和工作坊
获取软件
Intel® AI Analytics Toolkit
通过优化的深度学习框架和高性能 Python* 库加速端到端的机器学习和数据科学管道。
立即获取
查看所有工具