实际评估energy-forecasting时,我先确认它解决的具体问题:面向能源需求预测的端到端 MLOps 实战项目,覆盖数据、特征、训练、编排、监控和应用部署流程。对部署与运行环境任务来说,权限、依赖和环境差异会放大维护成本往往决定它能否落地,不能只用安装成功来判断。我建议在非生产环境复现一次安装与运行,重点记录依赖锁定、权限边界、日志、回滚和资源消耗,再与现有方案比较。对愿意维护环境并重视故障恢复的工程团队来说,这个仓库值得继续验证;只求即装即用的人则要先看维护成本。

全栈 7 步骤 MLOps 框架
通过设计、构建、部署和监控端到端 ML 批处理系统,免费学习 MLE 和 MLOps | 源代码 + Medium 上 2.5 小时的阅读和视频材料
此存储库包含 7 课的 FREE 课程,教您如何 构建可用于生产的 ML 批处理系统。其主要重点是使用 MLOps 良好实践来设计可扩展的系统。您将实施 ML 系统来预测丹麦各地的每小时能源消耗水平。
您将学习如何使用批处理架构构建、训练、服务和监控 ML 系统。我们将向您展示如何集成实验跟踪器、模型注册表、特征存储、Docker、Airflow、GitHub 操作等!
级别: 中级到高级 | 本课程针对想要构建端到端 ML 系统的 MLEs 和希望过渡到 MLE 的 SWEs。
继 GitHub 文档和 Medium 上的 [课程之后,您将获得 2.5 小时的阅读和视频材料,这将帮助您理解每一段代码!
在课程结束时,您将了解如何构建下图中的所有内容
如果某些内容对您来说没有意义,请不要担心。我们将在 Medium 课程 中详细解释所有内容。
如果您不确定本课程是否适合您,这里的 文章对您将在本系列中构建的所有组件进行了高级概述。
<strong>Check out this short video to see what you will build during the course </strong>
只要您遵守 MIT 许可证的条款和协议,您就可以随意安全地使用此代码。
<<< Using all the tools suggested in the course will be free of charge, except the ones from Lesson 7, where you will be deploying your application to GCP which will cost you ~20$. >>>
1. 你将学到什么
在这 7 节课程的课程结束时,您将知道如何:
如果这听起来很多,别担心。学完本课程后,您就会明白我们之前所说的一切。最重要的是,您会知道 WHY 我们使用了所有这些工具以及它们如何作为一个系统协同工作。
2. 课程和教程
该课程由 Medium Towards Data Science 出版物主办的 7 节课程组成。我们还提供了额外的课程,我们公开讨论可以对当前架构进行的潜在改进以及我们在课程中必须采取的权衡。该课程总计2.5 小时的阅读和视频材料。
We recommend running the code along the articles to get the best out of this course, as we provide detailed instructions to set everything up.
访问 Medium 上的分步课程
这是一篇 文章,对您将在课程中构建的所有组件进行了高级概述。
3. 费用
GitHub 中的代码是在 MIT 许可证下发布的。因此,只要您重新分发我们的LICENSE并认可我们的工作,您就可以随心所欲地使用它。
Medium 课程在 Medium 的付费墙下发布。如果您已经拥有它,那么它们是免费的。否则,您必须每月支付 5 美元的费用才能阅读这些文章。
在工具方面,我会在独立介绍每个工具时进行更深入的挖掘,但是TL/DR,将所有内容部署到GCP将花费大约20美元。
总而言之,本课程的端到端阅读和运行费用约为 25 美元-30 美元。
❔ 4.提问
如果您在课程期间有任何疑问或问题,请创建 问题。 我会尽力回应。
另外,您可以直接联系我 LinkedIn。
5.数据
我们使用开放式 API,为丹麦境内所有能源消费者类型提供每小时能源消耗值。
它们提供了直观的界面,您可以轻松查询和可视化数据。您可以在此处访问数据 here。
数据有4个主要属性:
注: 观察结果有 15 天的滞后!但对于我们的演示用例来说,这不是问题,因为我们可以模拟与实时相同的步骤。
IMPORTANT OBSERVATION
API 将在 2023 年期间过时。其最新数据点为 2023 年 6 月,API 将在 2023 年期间不可用。我们创建了 2020 年 7 月 1 日和 2023 年 6 月 30 日的数据副本来绕过此问题。因此,有 3 年的数据可供使用。对于本课程的目的来说已经足够了。该文件存储在可访问的 Google Drive 在这个链接 中。
因此,我们将通过从文件加载数据来模拟相同的行为,而不是查询 API。因此,您不必自己下载文件。该代码将下载它并从文件而不是 API 加载数据,模拟 100% 相同的行为。
----> 版权所有:www.energidataservice.dk
数据点具有每小时分辨率。例如:“2023–04–15 21:00Z”、“2023–04–15 20:00Z”、“2023–04–15 19:00Z”等。
我们将数据建模为多个时间序列。每个独特的价格区域和消费者类型元组都代表其独特的时间序列。
因此,我们将建立一个模型,独立预测每个时间序列未来 24 小时的能源消耗。
观看此视频以更好地了解数据的样子。
6. 代码结构
该代码分为两个主要部分:pipeline 和 web app。
管道由 3 个模块组成:
feature-pipelinetraining-pipelinebatch-prediction-pipeline网络应用程序 由其他 3 个模块组成:
app-apiapp-frontendapp-monitoring另外,我们有以下文件夹:
airflow:气流文件 | 编排.github :GitHub 操作文件 | CI/CDdeploy:构建和部署要遵循自然流程的结构,请按以下顺序阅读文件夹:
feature-pipelinetraining-pipelinebatch-prediction-pipelineairflowapp-apiapp-frontend & app-monitoring.github阅读 课程和教程 部分中列出的 Medium 文章,了解整个体验。
7. 设置附加工具
该代码仅在 Ubuntu 20.04 和 22.04 上使用 Python 3.9 进行了测试。
我们使用 .env 文件来存储我们的所有凭据。每个需要 .env 文件的模块在模块的主目录中都有一个 .env.default 作为模板。因此,你必须运行:
cp .env.default .env
...并完成 <...> 包围的内容。现在,什么都不要做。我们将在后面的步骤中详细解释您必须做什么。
诗歌
<< free usage >>
注意: 在课程中,我们使用了 Poetry 1.4.2。为了避免使用 Poetry 安装依赖项时出现潜在问题,我们建议您使用相同的版本(或者如果出现任何错误并且您有不同的版本,您可以删除并重新生成 poetry.lock 文件)。
安装Python系统依赖项:
sudo apt-get install -y python3-distutils
下载并安装诗歌:
curl -sSL https://install.python-poetry.org | python3 -
打开 .bashrc 文件添加 Poetry PATH:
nano ~/.bashrc
添加export PATH=~/.local/bin:$PATH
至 ~/.bashrc
检查是否安装了 Poetry:
source ~/.bashrc
poetry --version
如果需要的话,这里有官方的Poetry安装说明。
macOS M1/M2 诗歌问题
如果您在 macOS M1/M2 设备上创建 Poetry 环境时遇到问题,Hongnan 高 实现了一个脚本,该脚本将解决所有依赖性问题。只需在创建 Poetry 环境之前运行以下命令:
bash scripts/install_poetry_macos_m1_chip.sh
码头工人
<< free usage >>
在课程中我们使用了Docker version 24.0.5。
为私有 PyPi 服务器配置凭证
<< free usage >>
We 将使用 Docker 运行私有 PyPi 服务器。但它已经期望凭证 configured.
使用 passlib 创建凭证:
# Install dependencies.
sudo apt install -y apache2-utils
pip install passlib
# Create the credentials under the energy-forecasting name.
mkdir ~/.htpasswd
htpasswd -sc ~/.htpasswd/htpasswd.txt energy-forecasting
设置 poetry 以使用凭据:
poetry config repositories.my-pypi http://localhost
poetry config http-basic.my-pypi energy-forecasting <password>
检查您的诗歌 auth.toml 文件中的凭据是否设置正确:
cat ~/.config/pypoetry/auth.toml
啤酒花工厂
<< free usage >>
您将使用 Hopsworks 作为您的无服务器功能存储。因此,您必须在 Hopsworks 上创建一个帐户和一个项目。稍后我们将向您展示如何配置代码以使用您的 Hopsworks 项目。
我们在 Medium 上的第 1 课中解释了如何创建 Hopsworks API 密钥。 但长话短说,您可以转到 Hopsworks 帐户设置并从那里获取 API 密钥。之后,您必须创建一个新项目(或使用默认项目)并将这些凭据添加到 FS_ 前缀下的 .env 文件中。
!!! 请注意以不同于 energy_conspiration, 的方式命名您的项目,因为 Hopsworks 需要在其无服务器部署中使用唯一的名称。
单击此处开始使用 Hopsworks。
注意: 我们的课程将仅使用 Hopsworks 免费增值计划,从而可以免费复制该系列中的代码。
权重和偏差
<< free usage >>
您将使用权重和偏差作为无服务器 ML 平台。因此,您必须在权重和偏差上创建一个帐户和一个项目。稍后我们将向您展示如何配置代码以使用您的 W&B 项目。
在 Medium 上,我们在第 2 课中解释了如何在 W&B 上创建 API 密钥。 但长话短说,您可以转到 W&B 并创建一个实体和项目。之后,您必须导航到用户设置并从那里创建 API 密钥。最后,您必须将这些凭据添加到 WANDB_ 前缀下的 .env 文件中。
!!! 请注意以不同于 teaching-mlops 的方式命名您的实体,因为 W&B 需要在其无服务器部署中使用唯一的名称。
单击此处开始使用权重和偏差。
注意: 我们的课程将仅使用 W&B 免费增值计划,从而可以免费复制该系列中的代码。
GCP
首先,您必须在计算机上安装 gcloud GCP CLI。
按照本教程进行安装。
如果您只想在本地运行代码,请直接进入“存储”部分。
和以前一样,您必须在 GCP 上创建一个帐户和一个项目。仅使用桶作为存储空间是免费的。
当我们编写本文档时,GCS 在 5GB 之前是免费的。
存储
<< free usage >>
在这一步,你需要做5件事:
您的 bucket admin service account 应分配以下角色:Storage Object Admin
您的 bucket read-only service account 应分配以下角色:Storage Object Viewer
在 GCP 上创建存储桶的文档。
在 GCP 上创建服务帐户的文档。
用于为 GCP 服务帐户创建 JSON 密钥的文档。
NOTE: 当我们编写本文档时,GCS 在 5GB 之前是免费的。
请查看 Medium 上的 第 3 课,以更好地了解 我们如何设置 GCP 存储桶 及其在批量预测管道中的作用。。
NOTE: 不要忘记将 GCP 凭据添加到 .env 文件的 GOOGLE_CLOUD_ 前缀下:
部署
<< ~20$ >>
仅当您想要在 GCP VMs 上部署代码并使用 GitHub 操作构建 CI/CD 时,才必须完成此步骤。
请注意,此步骤可能会导致 GCP 产生一些成本。不会太多。在开发这门课程时,我们只花费了约 20 美元。
另外,如果您创建一个新的 GCP 帐户,您可以获得一些免费积分(我们创建了一个新帐户并收到了 300 美元的 GCP 积分)。请务必在完成课程后删除资源。
有关详细说明,请参阅 本文档。
8.用法
代码在 Ubuntu 20.04 和 22.04 上使用 Python 3.9 和 Poetry 1.4.2 进行了全面测试。
注意: 如果您正在研究 macOS M1/M2,请务必检查 macOS M1/M2 诗歌问题 部分。
管道
查看 Medium 上的 第 4 课,以更好地了解如何使用 Airflow 编排一切。
跑步
您将使用 Airflow (free usage) 运行管道。别害怕。 Docker 使一切设置都变得非常简单。
注意: 我们还在同一个 docker-compose.yaml 文件中使用 Airflow 连接了 私有 PyPi 服务器。因此,一切都将从一个命令开始。
重要: 如果您计划在 Airflow 之外运行管道,请务必检查 7. 开发安装和使用 部分。
运行:
# Move to the airflow directory.
cd airflow
# Make expected directories and environment variables
mkdir -p ./logs ./plugins
sudo chmod 777 ./logs ./plugins
# It will be used by Airflow to identify your user.
echo -e "AIRFLOW_UID=$(id -u)" > .env
# This shows where our project root directory is located.
echo "ML_PIPELINE_ROOT_DIR=/opt/airflow/dags" >> .env
现在从 airflow 目录移动到 dags 目录并运行:
cd ./dags
# Make a copy of the env default file.
cp .env.default .env
# Open the .env file and complete the FS_API_KEY, FS_PROJECT_NAME and WANDB_API_KEY credentials
# Create the folder where the program expects its GCP credentials.
mkdir -p credentials/gcp/energy_consumption
# Copy the GCP service credetials that gives you admin access to GCS.
cp -r /path/to/admin/gcs/credentials/admin-buckets.json credentials/gcp/energy_consumption
# NOTE that if you want everything to work outside the box your JSON file should be called admin-buckets.json.
# Otherwise, you have to manually configure the GOOGLE_CLOUD_SERVICE_ACCOUNT_JSON_PATH variable from the .env file.
现在返回 airflow 目录并运行以下命令:
cd ..
# Initialize the Airflow database
docker compose up airflow-init
# Start up all services
# Note: You should set up the private PyPi server credentials before running this command.
docker compose --env-file .env up --build -d
阅读官方使用 Docker 安装 Airflow,但是 NOTE 我们修改了他们的官方 docker-compose.yaml 文件。
等待容器构建并运行一段时间。访问127.0.0.1:8080后登录Airflow.
使用以下默认凭据登录:
airflowairflow在启动管道 DAG 之前,您必须将模块部署到专用 PyPi 服务器。返回 energy-forecasting 存储库的 root folder 并运行以下命令来构建管道模块并将其部署到您的私有 PyPi 服务器:
# Set the experimental installer of Poetry to False. For us, it crashed when it was on True.
poetry config experimental.new-installer false
# Build & deploy the pipelines modules.
sh deploy/ml-pipeline.sh
Airflow 将知道如何从私有 PyPi 服务器安装软件包。
最后一步是配置用于运行管道的参数。转到 Admin 选项卡,然后点击 Variables. ,您可以单击 blue + 按钮添加新变量。
您可以使用我们建议的值配置以下三个参数:
ml_pipeline_days_export = 30ml_pipeline_feature_group_version = 5ml_pipeline_should_run_hyperparameter_tuning = False现在,转到 DAGS/All 部分并搜索 ml_pipeline DAG。切换激活按钮。它应该会在几秒钟内自动启动。此外,您可以通过点击 ml_pipeline 窗口右上角的播放按钮来手动运行它。
就是这样。如果所有凭据均设置正确,您可以使用一个按钮运行整个管道。那有多酷?
这是 DAG 的样子
清理
docker compose down --volumes --rmi all
使用气流回填
找到您的 airflow-webserver docker 容器 ID:
docker ps
在 airflow-webserver 容器内启动 shell 并运行 airflow dags backfill,如下所示(在本例中,我们在 2023/04/11 00:00:00 和 2023/04/13 23:59:59 之间进行了回填):
docker exec -it <container-id-of-airflow-webserver> sh
airflow dags backfill --start-date "2023/04/11 00:00:00" --end-date "2023/04/13 23:59:59" ml_pipeline
如果您想清除任务并再次运行它们,请运行以下命令:
docker exec -it <container-id-of-airflow-webserver> sh
airflow tasks clear --start-date "2023/04/11 00:00:00" --end-date "2023/04/13 23:59:59" ml_pipeline
单独运行私有PyPi服务器
私有 PyPi 服务器已挂接到气流 docker compose 文件。但如果您出于某种原因想要单独运行它,您可以运行以下命令:
docker run -p 80:8080 -v ~/.htpasswd:/data/.htpasswd pypiserver/pypiserver:v1.5.2 run -P .htpasswd/htpasswd.txt --overwrite
网络应用程序
查看 Medium 上的 第 6 课,以更好地了解 Web 应用程序组件如何协同工作。
幸运的是,设置网络应用程序时一切都变得更加简单。这次,我们只需要配置一些凭据。
重要提示: 如果您计划在不使用 docker-compose 的情况下运行 Web 应用程序组件,请检查 7. 开发安装和使用 部分。
将存储桶只读 GCP 凭证复制到 energy-forecasting 项目的根目录:
# Create the folder where the program expects its GCP credentials.
mkdir -p credentials/gcp/energy_consumption
# Copy the GCP service credetials that gives you read-only access to GCS.
cp -r /path/to/admin/gcs/credentials/read-buckets.json credentials/gcp/energy_consumption
# NOTE that if you want everything to work outside the box your JSON file should be called read-buckets.json.
# Otherwise, you have to manually configure the APP_API_GCP_SERVICE_ACCOUNT_JSON_PATH variable from the .env file of the API.
转到 API 文件夹并复制 .env.default 文件:
cd ./app-api
cp .env.default .env
NOTE: 请记住使用您自己的变量完成 .env 文件。
就是这样!
返回 energy-forecasting 项目的根目录并运行以下 docker 命令,该命令将构建并运行 Web 应用程序的所有 docker 容器:
docker compose -f deploy/app-docker-compose.yml --project-directory . up --build
如果您想在开发模式下运行它,请运行以下命令:
docker compose -f deploy/app-docker-compose.yml -f deploy/app-docker-compose.local.yml --project-directory . up --build
现在您可以看到应用程序运行在:
将代码部署到GCP
查看本节。
使用 GitHub 操作设置 UP CI/CD
查看本节。
9. 开发安装及使用
所有模块都支持诗歌。因此安装非常简单。
注 1: 只需确保您安装了 Python 3.9,而不是 Python 3.8 或 Python 3.10。
注2: 在课程中,我们使用了Poetry 1.4.2。为了避免使用 Poetry 安装依赖项时出现潜在问题,我们建议您使用相同的版本(或者如果出现任何错误并且您有不同的版本,您可以删除并重新生成 poetry.lock 文件)。
注3:如果您正在研究macOS M1/M2,请务必检查macOS M1/M2诗歌问题部分。
管道
我们支持Docker运行整个管道。如果您只想整体运行它,请查看 用法 部分。
如果 Poetry 不使用 Python 3.9,您可以按照以下步骤操作:
cd /path/to/project,例如cd ./feature-pipelinewhich python3.9 查找 Python3.9 所在位置poetry env use /path/to/python3.9每个管道组件必须从 .env 文件加载其凭据。因此,您有两个选择:
ML_PIPELINE_ROOT_DIR 环境变量指向的文件夹中运行 cp .env.default .env 并填写 .env 文件的凭据。检查 下面的 [部分以了解如何设置它。cp .env.default .env 来创建副本。但请注意,采用这种方法,您将无法运行整个系统。请参阅此处如何单独安装每个项目:
设置 ML_PIPELINE_ROOT_DIR 变量
重要提示:在单独安装和运行每个模块之前,一个关键步骤是将 ML_PIPELINE_ROOT_DIR 变量设置为 energy-forecasting 项目的根目录(或任何其他目录 - 只需确保设置它):
将其导出到您的 ~/.bashrc 文件:
gedit ~/.bashrc
export ML_PIPELINE_ROOT_DIR=/path/to/root/directory/repository/energy-forecasting/
或者运行由 ML_PIPELINE_ROOT_DIR 变量处理的每个 Python 脚本。例如:
ML_PIPELINE_ROOT_DIR=/path/to/root/directory/repository/energy-forecasting/ python -m feature_pipeline.pipeline
通过这样做,所有 3 个管道项目(功能、训练、批处理)将从同一位置加载并保存以下文件:
.env配置;NOTE:此步骤关键,因为每个管道组件都需要从其他管道进程访问 JSON 元数据。通过设置 ML_PIPELINE_ROOT_DIR 变量,所有元数据 JSON 文件都将在不同进程之间从同一位置保存和访问。例如,批量预测管道将从训练管道生成的 JSON 文件中读取进行预测所需的模型版本。如果不设置 ML_PIPELINE_ROOT_DIR,训练和批处理进程将不会共享相同的输出目录。因此,他们不知道如何彼此交谈。运行Airflow内部的工程时,默认为/opt/airflow/dags;因此,只有在 Airflow 之外运行时才必须设置此变量。
网络应用程序
我们支持 Docker 来运行 Web 应用程序。如果您只想整体运行它,请查看 用法 部分。
请参阅此处如何单独安装每个项目:
您还可以使用 Docker 在开发模式下运行整个 Web 应用程序:
docker compose -f deploy/app-docker-compose.yml -f deploy/app-docker-compose.local.yml --project-directory . up --build
11.支持
Thank 你✌!