<SOURCE_TEXT>
课程
学习如何将机器学习与软件工程相结合,以设计、开发、部署和迭代生产级别的机器学习应用程序。
- 课程链接: https://madewithml.com/
- 代码链接: GokuMohandas/Made-With-ML
概述
在本课程中,我们将从实验(设计 + 开发)到生产(部署 + 迭代),通过迭代的方式构建一个可靠的生产系统。
请务必观看下面的视频,了解我们将要构建的内容的简要概述。
- 💡 基础原理: 在直接进入代码之前,我们会为每一个机器学习概念建立基础原理的理解。
- 💻 最佳实践: 在开发和部署机器学习模型的过程中,实施软件工程的最佳实践。
- 📈 扩展: 在Python中轻松扩展机器学习工作负载(数据、训练、调优、服务)而无需学习全新的语言。
- ⚙️ MLOps: 在构建端到端的机器学习系统时,连接MLOps组件(追踪、测试、服务、编排等)。
- 🚀 从开发到生产: 学习如何快速且可靠地从开发阶段进入生产阶段,而无需更改代码或基础设施管理。
- 🐙 CI/CD: 学习如何创建成熟的CI/CD工作流,以模块化的方式不断训练和部署更好的模型,且能集成到任何技术栈中。
受众
机器学习并非一个独立的行业,它是一种强大的数据思维方式,不仅仅局限于某一类人。
- 👩💻 所有开发者: 无论是软件/基础设施工程师还是数据科学家,机器学习正日益成为你将开发的产品中的关键部分。
- 👩🎓 大学毕业生: 学习行业所需的实践技能,弥合大学课程与行业期望之间的差距。
- 👩💼 产品/领导层: 希望建立技术基础,以便能够构建由机器学习驱动的出色(且可靠)的产品。
设置
确保通过 课程 详细了解此资源库中的内容。我们将在以下部分提供本地笔记本和Anyscale集群的设置指南,因此请根据使用情况切换►下拉菜单(默认会显示Anyscale的说明)。如果你希望在Anyscale上运行此课程,我们将在一天内提供结构、计算资源(GPU)和社区,让你学习所有内容,加入我们的下一个现场学习群组 → 在此报名!
集群
我们将首先设置我们的集群,包括环境和计算配置。
本地
你的个人笔记本电脑(单机)将作为集群,其中一个CPU将作为主节点,剩余的一些CPU将作为工作节点。课程中的所有代码都可以在任何个人笔记本电脑上运行,尽管在较大的集群上执行相同的工作负载会更快。
Anyscale
我们可以使用[网页UI](https://console.anyscale.com/o/madewithml/workspaces/add/blank)创建一个[Anyscale Workspace](https://docs.anyscale.com/develop/workspaces/get-started)。
- 工作区名称: `madewithml`
- 项目: `madewithml`
- 集群环境名称: `madewithml-cluster-env`
# 切换 `Select from saved configurations`
- 计算配置: `madewithml-cluster-compute-g5.4xlarge`
或者,我们可以使用CLI通过
anyscale workspace create ...
创建工作区
其他(云平台、K8s、本地部署)
如果你不想在本地或通过Anyscale进行此课程,你可以选择以下选项:
- 在AWS和GCP上。社区支持的Azure和阿里云集成也存在。
- 在Kubernetes上,通过官方支持的KubeRay项目。
- 手动在本地或未列出的其他平台上部署Ray。
Git 设置
按照这些说明创建一个代码库: 创建新代码库 → 将其命名为 Made-With-ML
→ 切换 添加README文件
(非常重要,因为这会创建一个main
分支) → 点击 创建代码库
(向下滚动)
现在我们准备好克隆包含所有代码的代码库:
git clone https://github.com/GokuMohandas/Made-With-ML.git .
凭证
touch .env
# 在 .env 文件中
GITHUB_USERNAME="改为你的用户名" # ← 请更改此处
source .env
虚拟环境
本地
export PYTHONPATH=$PYTHONPATH:$PWD
python3 -m venv venv # 推荐使用Python 3.10
source venv/bin/activate # 在Windows上: venv\Scripts\activate
python3 -m pip install --upgrade pip setuptools wheel
python3 -m pip install -r requirements.txt
pre-commit install
pre-commit autoupdate
Anyscale
通过我们在设置Anyscale Workspace时使用的集群环境,我们的环境已经配置了适当的Python版本和库。因此我们只需要运行以下命令:
export PYTHONPATH=$PYTHONPATH:$PWD
pre-commit install
pre-commit autoupdate
export ANYSCALE_HOST=https://console.anyscale.com
export ANYSCALE_CLI_TOKEN=$YOUR_CLI_TOKEN # 从 Anyscale 凭证页面获取
集群环境
集群环境决定了我们的工作负载将在哪些地方(操作系统、依赖等)执行。我们已经为我们创建了这个集群环境,但这是我们如何自行创建/更新一个环境的方法。
export CLUSTER_ENV_NAME="madewithml-cluster-env"
anyscale cluster-env build deploy/cluster_env.yaml --name $CLUSTER_ENV_NAME
计算配置
计算配置决定了我们的工作负载将在什么资源上执行。我们已经为我们创建了这个计算配置,但这是我们如何自行创建的方法。
export CLUSTER_COMPUTE_NAME="madewithml-cluster-compute-g5.4xlarge"
anyscale cluster-compute create deploy/cluster_compute.yaml --name $CLUSTER_COMPUTE_NAME
Anyscale 作业
现在我们准备好执行我们的机器学习工作负载。我们决定将它们全部组合成一个作业,但我们也可以为每个工作负载(训练、评估等)创建单独的作业。我们将从编辑 $GITHUB_USERNAME
槽位中的 workloads.yaml
文件开始:
runtime_env:
working_dir: .
upload_path: s3://madewithml/$GITHUB_USERNAME/jobs # <--- 更改用户名(区分大小写)
env_vars:
GITHUB_USERNAME: $GITHUB_USERNAME # <--- 更改用户名(区分大小写)
这里的 runtime_env
指定我们应该将当前的 working_dir
上传到一个 S3 存储桶中,以便当我们执行 Anyscale 作业时,所有的工作人员都可以访问代码以供使用。GITHUB_USERNAME
稍后将用于将工作负载的结果保存到 S3,以便我们可以在以后检索它们(例如,用于服务)。
现在我们准备提交我们的作业来执行我们的机器学习工作负载:
anyscale job submit deploy/jobs/workloads.yaml
Anyscale 服务
在我们的机器学习工作负载执行完毕后,我们准备将我们的模型部署到生产环境中。与我们的 Anyscale 作业配置类似,请确保在 serve_model.yaml
中更改 $GITHUB_USERNAME
。
ray_serve_config:
import_path: deploy.services.serve_model:entrypoint
runtime_env:
working_dir: .
upload_path: s3://madewithml/$GITHUB_USERNAME/services # <--- 更改用户名(区分大小写)
env_vars:
GITHUB_USERNAME: $GITHUB_USERNAME # <--- 更改用户名(区分大小写)
现在我们准备启动我们的服务:
# 推出服务
anyscale service rollout -f deploy/services/serve_model.yaml
# 查询
curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $SECRET_TOKEN" -d '{
"title": "使用 Transformer 进行迁移学习",
"description": "使用 Transformer 在文本分类任务上进行迁移学习。"
}' $SERVICE_ENDPOINT/predict/
# 回滚(到服务的先前版本)
anyscale service rollback -f $SERVICE_CONFIG --name $SERVICE_NAME
# 终止
anyscale service terminate --name $SERVICE_NAME
CI/CD
我们不会在每次更改时手动部署应用程序。相反,我们将使用 GitHub Actions 来自动化这个过程!
- 创建一个新的 GitHub 分支来保存我们的更改并执行 CI/CD 工作负载:
git remote set-url origin https://github.com/$GITHUB_USERNAME/Made-With-ML.git # <-- 更改为您的用户名
git checkout -b dev
- 我们将从向 GitHub 仓库的
/settings/secrets/actions
页面添加必要的凭证开始。
export ANYSCALE_HOST=https://console.anyscale.com
export ANYSCALE_CLI_TOKEN=$YOUR_CLI_TOKEN # 从 https://console.anyscale.com/o/madewithml/credentials 获取
- 现在我们可以更改代码(不在
main
分支上)并将其推送到 GitHub。但为了将代码推送到 GitHub,我们首先需要使用凭证进行身份验证,然后才能将代码推送到我们的仓库:
git config --global user.name $GITHUB_USERNAME # <-- 更改为您的用户名
git config --global user.email you@example.com # <-- 更改为您的邮箱
git add .
git commit -m "" # <-- 更改为您的提交信息
git push origin dev
现在系统会提示您输入用户名和密码(个人访问令牌)。按照这些步骤获取个人访问令牌:新建 GitHub 个人访问令牌 → 添加名称 → 切换 repo
和 workflow
→ 点击 Generate token
(向下滚动)→ 复制令牌并在提示输入密码时粘贴。
- 现在我们可以从这个分支开始创建一个 PR 到我们的
main
分支,这将触发工作负载工作流。如果工作流(Anyscale 作业)成功,这将在 PR 上直接产生包含训练和评估结果的评论。
- 如果我们喜欢这些结果,我们可以将 PR 合并到
main
分支。这将触发服务工作流,该工作流将我们的新服务推出到生产环境中!
持续学习
有了我们的 CI/CD 工作流来部署我们的应用程序,我们现在可以专注于持续改进我们的模型。在这个基础上扩展变得非常容易,可以连接到计划任务(cron)、数据管道、通过监控检测到的漂移、在线评估等。而且我们可以轻松添加其他上下文,例如直接在 PR 中比较任何实验与当前生产环境中的情况等。
常见问题
Jupyter notebook 内核
配置 notebook 与 jupyter 相关问题?默认情况下,jupyter 将使用我们的虚拟环境内核,但我们也可以手动将其添加到 jupyter:
python3 -m ipykernel install --user --name=venv
现在我们可以打开一个 notebook → 内核(顶部菜单栏)→ 更改内核 → venv
。如果想删除此内核,我们可以执行以下操作:
jupyter kernelspec list
jupyter kernelspec uninstall venv