数据科学家在云端工作。作为学生如何练习这一点(第二部分:Python)
由 Luke Chesser 在 Unsplash 上的图片
如果你想要成为一名数据科学家,仅仅知道如何编码是不够的——你还需要知道如何在云端运行你的代码。
当我申请我的第一份数据科学工作时,这是一个真正的问题。
职位描述中经常包含像“AWS”或“GCP”这样的要求,但我所参加的编码课程专注于如何编写正确的语法,并没有教我很多关于在云环境中实际运行代码所需的系统。
在这个系列中,我提供了一些关于如何练习数据科学云编码的建议。这个系列针对两种类型的人:
-
有志成为数据科学家的人——如果你是有一点数据经验的人(例如,你已经在本地 Anaconda 环境或 Jupyter 笔记本中使用过 Python,或者你在 Udemy 或 DataCamp 上的沙盒中运行过 SQL 查询),这将帮助你填补你技能组合中的一个重要空白,当你准备获得行业数据科学职位时。
-
想要摆脱本地 Jupyter 笔记本的数据科学家——用 Pau Labarta Bajo 的话说,“Jupyter 笔记本中的 ML 模型商业价值为 $0.00。”这个系列将帮助你摆脱笔记本,增加你可以为公司提供的价值。
目录
我的第一篇文章探讨了如何通过 BigQuery 的免费沙盒在云端练习 SQL:
这篇文章转向 Python。
我们将介绍两种免费在“真实世界”云平台环境中运行 Python 的方法:
-
使用 Google Colab 和 BigQuery API 运行 Jupyter Notebooks
-
通过 GitHub Actions 运行 Python 脚本和 ML 模型
我选择这些平台是因为它们免费、适合初学者,并且在工业界广泛使用。
为了避免疑问,我既不是他们的合作伙伴——我只是个粉丝
让我们深入探讨吧!
运行 Python 代码的 3 种方法(但只有 2 种是重要的)
当我说“在云端运行 Python 代码”时,我指的是什么?
技术上,有三种不同的方法来运行 Python 代码:
- 在命令行的交互式 shell 环境中(适用于快速计算和检查,但其他用途不多):
图片由作者提供
- 在 IPython 环境或 Jupyter Notebook 中,它由可运行的 “单元” 和内联输出/可视化组成:
图片由作者提供
- 作为独立的
.py脚本,例如main.py或your_script.py(通常在命令行中使用类似python your_script.py的命令执行):
图片由作者提供
在行业数据科学中,这三种方法中最重要的(1)是 Jupyter notebooks,以及(2)运行 Python 脚本。让我们看看如何在云端练习这些方法。
1. 在 Google Colab(或 IBM Watson Studio、AWS SageMaker Studio Lab 等)中运行 Jupyter Notebooks
笔记本是数据科学家的一个奇妙工具。
在我的硕士学位期间,我主要使用通过 Anaconda 安装/运行的本地 Jupyter notebooks。现在,作为一名全职数据科学家,我主要在云端(例如,在基于浏览器的环境如 GCP 的 Vertex AI 或 AWS 的 SageMaker Studio)运行我的 notebooks。
幸运的是,大型云服务提供商都允许你免费在其平台上使用笔记本来:
-
IBM:通过 Watson Studio
-
AWS:通过 SageMaker Studio Lab
-
GCP:通过 Vertex AI 或 Google Colab
-
Azure:通过 Azure Machine Learning studio
如果你正在申请使用特定堆栈的公司,我建议你尝试在那个特定环境中使用笔记本来。
如果你的目标公司使用 AWS,例如,你可以尝试使用 SageMaker Studio Lab。
然而,为了这个教程的目的,我将使用 Google Colaboratory,“一个无需设置且完全在云端运行的免费 Jupyter notebook 环境。” 我喜欢 Colab 的主要原因有(1)与一些其他工具不同,它不需要信用卡即可设置,并且(2)它将很好地延续我之前的教程,该教程专注于 BigQuery。
要设置环境,你可以遵循这个 设置教程,其中包含如何自定义环境的说明,例如添加更多 GPU。
当你在 Colab 中打开一个新的笔记本时,你会在sample_data文件夹中看到一些起始数据。它还附带了许多预安装的包,因此你可以运行像import pandas as pd这样的语句而不需要使用 pip 安装 pandas。这在许多云平台上很常见——通常,你的公司的云工程师会为整个公司预先配置编码环境(例如,以确保所有笔记本遵循安全最佳实践),因此许多包会预先安装。
一旦你进入 Colab,你可以像在本地笔记本中一样从文件系统加载数据。例如,这就是我们加载sample_data/california_housing_train.csv数据集的方式:
图片由作者提供
除了sample_data/中的数据之外,你还有几种选择来加载外部数据以练习 Python(这篇文章提供了 7 种不同数据加载器的良好概述)。
示例:从 BigQuery 加载数据
让我们看看如何从另一个云源加载数据的示例。
如果你正在 BigQuery 中使用 SQL 数据,你可以通过%%bigquery 单元格魔法使用 BigQuery API 直接将这些数据加载到 Colab 中。以下是一个示例查询,它基于我之前的教程使用 StackOverflow 数据集:
%%bigquery df
SELECT
EXTRACT(YEAR FROM creation_date) AS Year,
COUNT(*) AS Number_of_Questions,
ROUND(100 * SUM(IF(answer_count > 0, 1, 0)) / COUNT(*), 1) AS Percent_Questions_with_Answers
FROM
`bigquery-public-data.stackoverflow.posts_questions`
GROUP BY
Year
HAVING
Year = 2015
ORDER BY
Year
如果你在你 Colab 笔记本的单元格中运行该查询,该查询生成的数据(从SELECT开始)将被保存为名为df的本地 pandas DataFrame(我们在第一行指定的名称),然后你可以使用笔记本中的其余部分。
2. 通过 GitHub Actions 运行 Python 脚本
数据科学家经常因为过于痴迷于 Jupyter 笔记本而受到批评:
Jupyter 笔记本中的 ML 模型具有$𝟬.𝟬𝟬 (Pau Labarta Bajo)的商业价值
这对我来说有点夸张!(模型也可以作为一次性分析的一部分使用,对于这种情况,笔记本是完美的。)但 Pau 的观点在许多情况下仍然适用:对于许多 Python 脚本/模型来说,要具有价值,它们需要作为可以按需调用(实时推理)或定期批量运行的管道在云中部署和运行(批量推理)。
让我们看看如何在云中通过 GitHub Actions 运行 Python 脚本的一个简单示例。
训练模型(.ipynb)和创建评分脚本(.py)
首先,创建一个新的目录并创建一个新的名为train.ipynb的笔记本,这是我们将在其中训练我们的 ML 模型的地方:
mkdir ml-github-actions
cd ml-github-actions
touch train.ipynb
由于本文重点介绍如何在云中 运行 Python 代码(而不是训练复杂模型),我们将仅使用一个 DummyClassifier,该分类器总是预测在训练期间观察到的最频繁的类别:
import numpy as np
from sklearn.dummy import DummyClassifier
import joblib
X = np.array([-1, 1, 1, 1]) # 4 random records for model training, each with one input feature (which has a value of 1 or -1)
y = np.array([0, 1, 1, 1]) # Target can be either 0 or 1
dummy_clf = DummyClassifier(strategy="most_frequent")
dummy_clf.fit(X, y)
joblib.dump(dummy_clf, 'dummy_clf.joblib')
当你运行它时,将创建一个名为 dummy_clf.joblib 的新文件。
接下来,让我们创建一个名为 scoring_data.csv 的文件,该文件包含了一组(虚假的)输入数据,我们希望为这些数据生成模型分数:
图片由作者提供。我在 Excel 中创建了数据,保存为 csv 格式,并上传到我的 ml-github-actions 目录。
接下来,我们创建一个名为 score.py 的 Python 脚本,该脚本加载模型、加载数据并生成预测。我们将使用 Python 的 logging 库将分数记录到名为 scores.log 的文件中:
touch score.py
import pandas as pd
import joblib
import logging
def main():
"""
Loads data and model, generates predictions, and logs
to scores.log
"""
# Load data to be scored
scoring_data = pd.read_csv('scoring_data.csv')
# Load model
dummy_clf = joblib.load('dummy_clf.joblib')
# Generate scores
scores = dummy_clf.predict(scoring_data)
# Log scores
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
f_handler = logging.FileHandler('scores.log')
f_format = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
f_handler.setFormatter(f_format)
logger.addHandler(f_handler)
logger.info(f'Scores: {scores}')
if __name__ == '__main__':
main()
最后,将你的包版本记录保存到 requirements.txt 文件中:
pip freeze > requirements.txt
这应该是你的最终目录结构:
ml-github-actions
├── train.ipynb
├── dummy_clf.joblib
├── scoring_data.csv
├── score.py
└── requirements.txt
上传到 GitHub
接下来,我们将跳转到 GitHub 并创建一个新的私有仓库(不需要模板),然后我们将把我们的代码推送到 GitHub:
echo "# ml-github-actions" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/mattschapman/ml-github-actions.git
git push -u origin main
创建一个 GitHub Action 以定期运行你的 score.py 脚本
一旦你的代码上传到 GitHub,你将需要创建一个名为 .github/workflows/actions.yml 的附加文件(这是配置我们的 GitHub Action(s) 的地方,并安排它定期运行)。
在 GitHub 中完成此操作,请点击“添加文件”>“+ 创建新文件”,然后在文件名中输入 .github/workflows/actions.yml,并复制下面的代码,这将使 Action 每隔 5 分钟运行一次:
name: run score.py
on:
schedule:
- cron: "*/5 * * * *" # Run every 5 minutes
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: checkout repo content
uses: actions/checkout@v4 # Checkout the repo content to GitHub runner
- name: setup python
uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: install python packages
run:
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: execute py script
run: python score.py
- name: commit files
run: |
git config --local user.email "[[email protected]](/cdn-cgi/l/email-protection)"
git config --local user.name "GitHub Actions"
git add -A
git diff-index --quiet HEAD || (git commit -a -m "updated logs" --allow-empty)
- name: push changes
uses: ad-m/github-push-action@master
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
branch: ${{ github.ref }}
最后,转到 设置 > 操作 > 常规,将 工作流程权限 更改为 读取和写入(而不是仅 读取),勾选 允许 GitHub Actions 创建和批准拉取请求 的框,然后点击 保存。
哇!
我们现在已经设置了一个基于云的评分管道,该管道将每隔 5 分钟运行一次你的 score.py 脚本,并将预测保存到日志文件中。
https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/608252652474c04e33d140ac717f3a76.pnghttps://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/17ad69b2a32016af5b281ee7d79da1ec.png
作者提供的图片。注意:运行可能有点不规则(即,不一定总是正好相隔 5 分钟),第一次运行可能需要 15 分钟才能启动。
接下来是什么?
我们现在已经设置了一个在云中定期运行 Python 代码的自动化管道。
真的很棒,对吧?
要将此提升到下一个层次并使其在现实世界场景中有用,你需要:
-
训练一个不错的模型(而不是使用
DummyClassifier),并且 -
定期更新
scoring_data.csv文件,或从实时 API 拉取数据。这样,模型就会在每次运行时对新的数据进行评分。
获取代码
感谢阅读。希望您觉得这很有帮助!
您可以在 GitHub 上查看代码。
还有件事 –
欢迎在 X 或 LinkedIn 上与我联系,或者通过 AI in Five 将我的数据科学/AI 文章发送到您的邮箱!
下次再见 😃
823

被折叠的 条评论
为什么被折叠?



