1、使用 GitHub Actions 对一个 GitHub 项目进行两个或更多 Python 版本的测试。
可以在 GitHub Actions 的配置文件(如
)中进行如下修改来实现对多个 Python 版本的测试。示例配置如下:
.github/workflows/<yourfilename>.yml
name: Multiple Python Versions Test
on: [push]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: [3.5.10, 3.8.3]
steps:
- uses: actions/checkout@v2
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v1
with:
python-version: ${{ matrix.python-version }}
- name: Install dependencies
run: |
make install
- name: Lint
run: |
make lint
- name: Test
run: |
make test
上述配置中,使用
定义了多个 Python 版本(这里是
strategy.matrix
和
3.5.10
),GitHub Actions 会针对每个 Python 版本依次执行安装依赖、代码检查和测试的步骤。
3.8.3
2、使用云原生构建服务器(AWS Code Build、GCP CloudBuild 或 Azure DevOps Pipelines)为项目执行持续集成,以 GCP 为例说明如何操作。
GCP 持续集成选项
对于 GCP,有两种主要的持续集成选项:
使用像 GitHub Actions 这样的 SaaS 产品 使用云原生解决方案 Cloud Build
Cloud Build 示例
以 Google Cloud Build 为例,其配置文件
示例如下:
cloudbuild.yaml
steps:
- name: python:3.7
id: INSTALL
entrypoint: python3
args:
- '-m'
- 'pip'
- 'install'
- '-t'
- '.'
- '-r'
- 'requirements.txt'
- name: python:3.7
entrypoint: ./pylint_runner
id: LINT
集成远程构建服务器
当在本地完成配置后,将相同的流程与远程 SaaS 构建服务器集成很简单。可选择的云原生构建服务器包括:
AWS Code Build GCP CloudBuild Azure DevOps Pipelines
3、深度学习如何从云端获益?没有云计算,深度学习是否可行?
云计算与深度学习的关系
云计算具有近乎无限资源的概念,能提供近乎无限的计算和存储能力,并可直接处理数据而无需移动数据。
对于深度学习而言,使用云端的加速优化实例可利用 NVIDIA GPU 额外的大规模并行计算能力。
没有云计算,许多机器学习模型,尤其是模型的运营化将无法实现,因此没有云计算,深度学习不可行。
4、解释什么是MLOps以及它如何提升机器学习工程项目。
MLOps 简介
MLOps 是指使用 DevOps 方法自动化机器学习的过程,是一种行为。机器学习工程师应使用 MLOps 最佳实践来创建机器学习系统。
为什么需要 MLOps?
当前构建机器学习系统存在诸多问题:
过于关注“代码”和技术细节 缺乏自动化 受 HiPPO 文化影响 很多机器学习并非云原生 使用的学术数据集和软件包无法处理大规模问题
MLOps 能有效提升机器学习工程项目。
MLOps 与 DevOps 的关系
MLOps 与 DevOps 类似,强调自动化,避免系统组件依赖人工操作,促进开发者、模型和运营之间通过透明的团队合作和健康的协作进行协调。
MLOps 的优势:
能加快反馈循环 让团队有更多时间专注于业务问题 推动模型投入生产 最终实现一个有效的机器学习系统
5、Fork this repository that contains a Flask machine learning application and deploy it with continuous delivery on Azure using Azure App Services and Azure DevOps Pipelines.
部署 Flask 机器学习应用程序到 Azure
操作步骤 : 分叉包含 Flask 机器学习应用程序的存储库。 利用 Azure 应用服务 和 Azure DevOps 管道 ,在 Azure 上实现持续交付部署。
6、一家专门从事GPU数据库的公司有一位关键技术成员主张停止使用云服务,因为购买他们自己的GPU硬件会更实用,因为他们全天候运行这些硬件。这一步骤还能让他们比使用云服务更快地获得专用GPU。另一方面,另一位拥有所有AWS认证的关键技术成员承诺,如果前者敢尝试,就会让他被解雇。这位AWS认证成员声称他们已经在AWS上投入了太多。请对这一提议进行支持或反对的论证。
支持与反对购买GPU硬件的理由
支持购买GPU硬件的理由
全天候运行GPU硬件
购买硬件长期来看可能更具成本效益,避免持续的云服务费用。
能更快获取专用GPU
满足业务对特定GPU的需求,提升业务响应速度和效率。
反对购买GPU硬件的理由
公司已在AWS上有大量投资
更换方案意味着之前的投资可能无法充分利用,造成资源浪费。
使用云服务可避免硬件维护、更新等管理工作
将精力集中在核心业务上。
云服务通常具有高可用性和弹性扩展能力
能更好应对业务量的波动。
7、一名“红帽认证工程师”为一家仅有100名员工的东南部电子商务公司打造了最成功的数据中心之一,他声称这为公司带来了巨大优势,请问该数据中心可能为公司带来哪些优势?
该数据中心能在数据处理、存储、管理等方面为电商公司提供高效支持,优化业务流程,提升客户体验,增强竞争力,从而带来巨大优势。
8、从TFHub重新编译一个模型,使其能与Coral Edge TPU配合使用。
若要重新编译模型使其能与Coral Edge TPU配合使用,可按以下步骤操作:
可从TFHub查找预训练模型,点击Coral模型格式获取适用于TPU的模型,选择如MobileNet Quantized V2模型进行下载,并确保下载标签和模型。同时要仔细核对模型格式,保证其与Coral设备兼容。
若所需模型未针对TPU设备编译,可使用Coral Edge TPU编译器进行编译。若编译器无法在当前平台安装(如苹果电脑),可创建基于Debian的容器来解决。
具体步骤为:创建一个新的Dockerfile来构建用于编译器的容器镜像,内容如下:
FROM debian:stable
RUN apt-get update && apt install -yq curl build-essential gnupg
RUN curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
RUN echo "deb https://packages.cloud.google.com/apt coral-edgetpu-stable main" | tee /etc/apt/sources.list.d/coral-edgetpu.list
RUN apt-get update && apt-get install -yq edgetpu-compiler
CMD ["/bin/bash"]
使用新创建的Dockerfile创建一个新的镜像来运行编译器:
$ docker build -t tpu-compiler .
9、将新创建的镜像发布到像 Docker Hub 这样的容器注册表,应该怎么做?
首先,使用
命令构建镜像并添加标签,例如:
docker build
$ docker build -t localbuild:removeme .
若要将镜像推送到 Docker Hub,需要先使用
命令重新标记镜像,引用原标签并使用自己在注册表的账户和目标仓库,如:
docker tag
$ docker tag localbuild:removeme alfredodeza/removeme
最后使用
命令推送镜像:
docker push
$ docker push alfredodeza/removeme
10、什么是容器运行时,它与 Docker 有什么关系?
容器运行时是在系统中运行容器所需的软件。Docker 公司最初开发了创建、管理和运行容器的工具,其开发的运行时也被广泛使用。几年后,Red Hat 贡献了一种不同的运行容器的方式,带来了新的运行时环境和一套操作容器的新工具,且与 Docker 提供的工具有一定兼容性。也就是说,容器运行时不止一种,Docker 运行时是其中之一。
11、创建 Dockerfile 时的三个最佳实践是什么?
使用 linter 检查 Dockerfile,如使用 hadolint 并根据其建议操作,例如固定 pip 安装包的版本; 减少 Dockerfile 中
指令的使用,用单个命令行安装多个依赖以减少容器层数量,从而减小容器大小; 寻找机会自动化 linting 过程,专注于关键环节。
RUN
12、DevOps的两个关键概念是什么?它们为何有用?
两个关键概念是 持续集成 (CI)和 持续交付 (CD)。
持续集成 (CI)是持续测试软件项目并根据测试结果提高质量的过程。 通过使用开源和SaaS构建服务器或云原生构建系统实现自动化测试。
有助于提高软件质量。
持续交付 (CD)是自动将代码部署到新环境的过程。
通常通过 基础设施即代码 (IaC)实现。 可提高软件发布的速度和可靠性。
13、用你自己的话定义“边缘”是什么,并给出一些可以应用的机器学习示例。
边缘计算与机器学习
“边缘”指的是不在数据中心内,与大量其他服务器分离的计算设备。像手机、树莓派和智能家居设备等都属于“边缘设备”。
在技术领域,“部署到边缘”就是将计算资源置于这类设备上。随着成本降低和更强大芯片的出现,边缘设备能够进行机器学习推理任务。
未来,会有更多之前被认为无法处理机器学习任务的设备参与到边缘计算中。
机器学习在边缘的应用示例包括在移动设备上运行的口罩检测、车牌检测和垃圾分拣应用等。
14、对ONNX容器进行修改,使其推送到Docker Hub而不是GitHub Packages。
首先,在项目根目录下创建 `.github/workflows/` 目录,并添加 `main.yml` 文件,定义工作流名称和触发条件。
然后,在 `main.yml` 文件中定义构建作业,包含一系列步骤,如签出代码、认证 Azure、设置扩展自动安装、附加工作区、检索模型、构建 Flask 应用容器等。
接着,添加向 Docker Hub 认证的步骤:
```yaml
- name: Authenticate to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKER_HUB_USERNAME }}
password: ${{ secrets.DOCKER_HUB_ACCESS_TOKEN }}
最后,将构建步骤中的
参数更新为
push
,即修改
true
步骤中的
build flask-app container
为
push: false
。
push: true
##15、打包容器意味着什么?为什么它有用?
# 打包容器的作用与优势
打包容器指将模型放入容器中,利用容器化进程来实现模型的共享、分发和轻松部署。其作用包括:
- 只要安装容器运行时,就可以轻松在本地运行容器;
- 有很多在云端部署容器的选项,且能按需扩展或缩减;
- 他人可以轻松快速地试用并与容器交互。
这些特性使模型更易维护,调试性能不佳的模型也更简单。
此外,在将机器学习货币化时,容器是向客户交付模型和算法的理想方式;对于 MLOps,容器有助于交付商业价值,还能提高整个 ML 架构的质量,减少复杂性,让人力可投入到其他问题上。
##16、使用 ELI5 解释一个机器学习模型。
# ELI5 简介
ELI5 全称为 **“explain like I am five”**,它是一个用于**可视化和调试机器学习模型**的工具。ELI5 支持包括 **sklearn** 在内的多个框架。
通过 ELI5,可以:
- 解释机器学习模型的工作机制
- 分析模型的预测结果
在实际操作中,可以根据具体的模型和数据,利用 ELI5 提供的功能来实现对模型的解释。
##17、为什么在现代机器学习中,自动机器学习(AutoML)只是自动化的一部分?
在现实世界中并非所有问题都很简单,机器学习的所有环节都可进行自动化。建模自动化即AutoML只是KaizenML或持续改进的一部分,在实际的机器学习系统中,从数据摄取到特征存储、建模、训练、部署以及对生产中模型的评估等所有环节都可进行全面自动化,AutoML只是其中建模环节的自动化,所以它只是自动化的一部分。
##18、在机器学习中,以数据为中心的方法与以模型为中心的方法有何不同?在KaizenML方法中,数据、软件和建模都被视为同等重要,这种方法又有何特点?
## 机器学习方法论
机器学习专家认为,**以数据为中心的方法**优于**以模型为中心的方法**,但未详细说明二者之间的差异。
### KaizenML 方法
KaizenML 方法意味着对机器学习系统的各个方面进行持续改进,包括:
- **数据质量**
- **软件质量**
- **模型质量**
该方法强调从数据到软件、模型以及客户反馈循环的**整个系统的持续改进**。
##19、在一个脚本中添加 Python 日志记录功能,将错误信息记录到标准错误输出(STDERR),信息语句记录到标准输出(STDOUT),并将所有日志级别记录到一个文件中。
以下是一个示例代码,展示了如何在 Python 脚本中实现将错误信息记录到 STDERR,信息语句记录到 STDOUT,并将所有日志级别记录到一个文件中:
```python
import logging
import sys
# 创建一个日志记录器
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# 创建一个将信息记录到 STDOUT 的处理器
stdout_handler = logging.StreamHandler(sys.stdout)
stdout_handler.setLevel(logging.INFO)
stdout_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
stdout_handler.setFormatter(stdout_formatter)
# 创建一个将错误信息记录到 STDERR 的处理器
stderr_handler = logging.StreamHandler(sys.stderr)
stderr_handler.setLevel(logging.ERROR)
stderr_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
stderr_handler.setFormatter(stderr_formatter)
# 创建一个将所有日志记录到文件的处理器
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.DEBUG)
file_formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(file_formatter)
# 将处理器添加到日志记录器
logger.addHandler(stdout_handler)
logger.addHandler(stderr_handler)
logger.addHandler(file_handler)
# 测试日志记录
logger.debug('这是一个调试信息')
logger.info('这是一个信息语句')
logger.error('这是一个错误信息')
上述代码创建了三个日志处理器,分别用于将不同级别的日志信息输出到 STDOUT、STDERR 和文件中。然后将这些处理器添加到日志记录器中,并进行了简单的日志测试。
20、为什么监控数据漂移至关重要?
监控与日志的重要性
日志记录、监控和指标非常关键,任何投入生产的模型都必须实施这些操作,否则可能会遭遇难以恢复的灾难性故障。
对可重现结果的可靠流程有高度信心需要这些组件。必须依据准确数据做决策,以判断准确性是否依旧很高,或者错误数量是否显著增加。
21、列举使用日志记录工具相对于 print() 或 echo 语句的三个优点。
不会在运行时破坏应用程序,而
容易破坏生产应用程序; 可以控制详细程度,而
print()
难以控制详细程度; 可以提供错误的回溯信息,而
print()
无法做到。
print()
22、列出五个最常见的日志级别,从最少详细到最多详细。
以下是给定【文本内容】的 Markdown 格式版本:
关键(critical) 错误(error) 警告(warning) 信息(info) 调试(debug)
23、在指标捕获系统中常见的三种指标类型是什么?
计数器(Counter)、计时器(Timer)和值(Value)
24、以这个GitHub仓库为起点,构建一个无服务器数据工程原型。
项目概述
重现一个示例无服务器数据工程项目架构,并通过扩展自然语言处理(NLP)分析功能来增强该项目。可以考虑添加的功能包括但不限于:
实体提取 关键短语提取 其他NLP特性
资源链接
相关的代码和资源可以从以下GitHub仓库获取,以构建无服务器数据工程原型:
GitHub仓库地址
25、为什么进行机器学习的组织会使用数据湖?它们解决的核心问题是什么?
组织使用数据湖的核心原因
组织使用数据湖的核心原因如下:
能够处理结构化和非结构化数据 支持分析和机器学习工作负载 可以在不移动数据的情况下对其进行处理,这在处理大数据时至关重要 成本低
核心问题是解决数据处理、存储和使用的效率与成本问题,使组织能够更有效地进行机器学习等相关工作。
26、容器化机器学习模型部署过程的优势有哪些?
只要安装了容器运行时,在本地运行容器很轻松。 有很多选择可以将容器部署到云端,并且能够根据需要进行扩展或缩减。 其他人可以轻松快速地试用并与容器进行交互。
这些特性的好处是可维护性变得更简单,在本地(甚至在云服务中)调试性能不佳的模型就像在终端中输入几个命令一样简单。
27、一位同事表示,由于AWS提供了各种各样的服务,他们不知道从哪里开始进行机器学习。你会建议他们如何进行搜索?
可以按以下方式开展搜索:
考取AWS认证,从AWS解决方案架构师或云从业者考试以及AWS认证机器学习专业考试开始; 使用AI API(如AWS Comprehend、AWS Rekognition)和高级PaaS服务(如AWS App Runner或AWS Lambda)获取快速成果; 专注于自动化,尽可能自动化从数据摄取、特征存储到模型构建和部署的所有环节; 将SageMaker作为MLOps的长期投资,与更易上手的解决方案一起用于长期或更复杂的项目; 完成一些练习,如使用Elastic Beanstalk为Flask Web服务构建机器学习持续交付管道等; 思考一些批判性思维讨论问题,如组织使用数据湖的原因等。
28、从公共源获取一个 ONNX 模型,并使用 Python SDK 将其注册到 Azure 中。
可以从 ONNX Model Zoo 这个公共源获取 ONNX 模型,它是 GitHub 上的一个信息库,有社区贡献并整理的多个预训练模型的链接,模型分为视觉、语言和其他三类。
使用 Python SDK 将模型注册到 Azure 的示例代码如下:
# 假设 `models/` 是包含未压缩 ONNX 模型的相对目录
model = Model.register(
workspace=ws,
model_path="models/world_wines.onnx",
model_name="world_wines",
tags={"onnx": "world - wines"},
description="Image classification of world - wide wine labels"
)
其中
代表工作区,需要根据实际情况进行定义。
ws
29、使用Azure的Python SDK在本地部署一个容器,并生成一些用于实时推理的HTTP请求。
以下是使用Azure的Python SDK在本地部署容器并进行实时推理的步骤:
注册模型到当前目录:
from azureml.core.model import Model
model = Model.register(model_path="roberta - base - 11.onnx",
model_name="roberta - base",
description="Transformer - based language model for text generation.",
workspace=ws)
创建环境,安装模型在容器中运行所需的所有依赖:
from azureml.core.environment import Environment
environment = Environment("LocalDeploy")
environment.python.conda_dependencies.add_pip_package("onnx")
创建评分文件(通常命名为
),该脚本负责加载模型、定义模型输入和对数据进行评分,脚本需要包含
score.py
和
init()
两个函数。
run()
创建推理配置,将评分脚本和环境结合起来:
from azureml.core.model import InferenceConfig
inference_config = InferenceConfig(entry_script="score.py", environment=environment)
使用Python SDK的
类将模型部署到本地容器:
LocalWebservice
from azureml.core.model import InferenceConfig, Model
from azureml.core.webservice import LocalWebservice
# inference with previously created environment
inference_config = InferenceConfig(entry_script="score.py", environment=environment)
# Create the config, assigning port 9000 for the HTTP API
deployment_config = LocalWebservice.deploy_configuration(port=9000)
# Deploy the service
service = Model.deploy(ws, "roberta - base",[model], inference_config, deployment_config)
service.wait_for_deployment(True)
部署后,模型会在后台使用一个容器运行,并在端口9000暴露HTTP API。可以直接向
发送HTTP请求进行实时推理。
localhost:9000