在第一章中,我们介绍了人工智能(AI)和机器学习(ML)的核心概念,以帮助奠定使用对抗性AI的基础。在本章中,我们将提供ML开发的实际操作演练,展示如何创建和管理您的开发环境,使用算法,并导航我们描述的生命周期。我们将构建模型并将神经网络(NN)模型部署为REST预测服务。这将是我们的对抗游乐场,对抗性AI攻击的目标。
到本章结束时,您将学会以下内容:
- 安装Python并创建Python虚拟环境以管理您的依赖项和工作。
- 安装数据分析和ML所需的Python包。
- 将我们的虚拟环境注册为Jupyter Notebook内核。
- 使用Jupyter Notebook探索基线ML算法和用于分类葡萄酒样本的简单Keras神经网络。我们将演示探索和预处理数据以及训练、测试和评估模型的基本技术。
- 使用Keras构建卷积神经网络(CNN)用于图像分类,并将其部署为用于预测的推理REST服务。这将是我们对抗攻击的初始目标。
- 了解大规模ML的选项,以应对高需求的工作负载,包括Google的Colaboratory(Colab)、Lambda Labs Cloud、Amazon的Amazon Web Service(AWS)和Microsoft的Azure。
本章涵盖以下主题:
- 设置您的开发环境
- 基本基线ML的实际操作
- 使用CNN开发我们的目标AI服务
- 大规模ML开发
技术要求
为了跟随本章的内容,您需要一台运行Windows 10或11、macOS或Linux的计算机,至少配备8GB的内存。对于Windows用户,我强烈推荐使用Windows子系统Linux 2(WSL2)和Ubuntu 20.04。有关WSL2的更多信息,请参见:learn.microsoft.com/en-us/windo…。在ubuntu.com上有一些优秀的逐步指南,介绍如何在WSL2上安装和使用Ubuntu。有关更多信息,请参见:ubuntu.com/tutorials/i…。
在本章中,我们还需要安装一些软件包;我们将在章节中对此进行解释。
要编辑或运行示例,您必须拥有支持Jupyter Notebook的浏览器或IDE,例如Visual Studio Code或IntelliJ PyCharm。两者都是免费的,可以在code.visualstudio.com和www.jetbrains.com/pycharm找到。对于本章的示例,浏览器就已经足够了。]()
您可以在这个代码库中找到本书的完整代码:github.com/PacktPublis…。 代码库按章节组织,例如,本章对应的是ch2。
您可能需要使用云服务。我们将在本章末尾讨论这些内容。这些服务为ML环境提供了一个可扩展、简化的界面,但底层模块保持不变。即使您使用云服务,我们也鼓励您完成本地开发环境的设置。这样做,您将更好地理解和排除云ML环境的故障。
设置您的开发环境
在本节中,我们将逐步演示如何设置基于Python的开发环境,如何使用环境来管理库依赖项,并如何将它们作为内核提供给您的Jupyter Notebook。这将帮助您创建可重复的环境,避免由于库版本不匹配而浪费时间排查错误。
Python安装
Python适用于所有主流操作系统,您可以按照说明进行安装。
- Windows用户可以访问Python官方网站并下载Python安装程序。运行安装程序,确保勾选“Add Python to PATH”选项,然后按照提示安装Python。更多信息请参见:www.python.org/downloads/。
- Linux用户(包括Windows中的WSL2)会发现最近版本的Ubuntu和Debian预装了Python 3。否则,您可以使用发行版的包管理器(如apt-get、dnf等)安装Python。更多信息请参见:docs.python-guide.org/starting/in…。
- macOS(以前称为Mac OS X)预装了Python,但可能是过时的版本。我们建议您使用Homebrew安装Python 3。您需要预先安装Xcode命令行工具。详细指南请参见:docs.python-guide.org/starting/in…。
创建您的虚拟环境
虚拟环境允许您为不同的项目管理独立的包安装。正如在第一章中讨论的那样,有多种创建和管理Python虚拟环境的选项。我们将使用Python内置的venv,因为它与Python捆绑在一起,不需要额外的安装。要使用venv创建虚拟环境,请执行以下操作:
- 打开您的终端或命令提示符。
- 导航到您要创建虚拟环境的目录。通常,这将在您的项目目录中,例如adversarial-ai。
- 要创建名为.venv的虚拟环境,请运行以下命令:
python3 -m venv .venv
- 在Linux或macOS上使用以下命令激活环境:
source .venv/bin/activate
对于Windows,请使用以下命令:
.venv\Scripts\activate
这些命令创建并激活了一个新的Python环境,与您的主安装隔离且没有安装包。您可以通过运行以下命令进行验证:
pip list
该命令将显示您虚拟环境中安装的内容:
由于我们尚未安装任何包,列表中只有包安装工具(即pip本身)和帮助打包类的设置工具,这些工具在pip的底层被使用。
安装包
您可以使用pip单独或成组安装所需的包作为命令行参数,例如:
pip install pandas matplotlib
或者,您可以使用requirements.txt文件来指定项目所需的库和版本。在项目目录中创建一个requirements.txt文件,内容如下:
numpy==1.22.4
matplotlib==3.5.2
pandas==1.4.3
scikit-learn==1.1.2
Pillow==9.2.0
tensorflow==2.9.1
ipykernel
flask
要安装requirements文件中包含的包(以及指定的版本),您需要运行一个稍微不同形式的pip命令:
pip install -r ch2/requirements.txt
将虚拟环境注册到Jupyter Notebook中
我们将在Jupyter Notebook中使用虚拟环境,而不是在激活后使用传统的命令提示符。换句话说,我们希望将新的虚拟环境列为IPython内核。为此,我们需要在激活的虚拟环境中运行以下命令:
python -m ipykernel install --user --name=secure-ai --display-name="Secure AI"
验证安装
要验证您的安装,请使用以下命令停用虚拟环境:
deactivate
在终端中运行以下命令启动Jupyter Notebook服务器:
jupyter notebook
您必须在主Python安装中(不包括您创建的虚拟环境)安装Jupyter Notebook。如果收到安装错误,您可以使用pip安装它:
pip install jupyter
一旦Jupyter运行起来,打开verify-environment.ipynb笔记本并选择Secure AI内核:
依次运行每个单元格,以验证您已成功创建环境。
我们已经介绍了如何安装Python、创建环境以及安装我们ML开发所需的库和框架包。然后,我们将此环境添加到我们的Jupyter Notebook环境中,将其设置为我们的内核,并验证了我们的安装。
现在,我们将使用这个环境来实现我们的ML解决方案,并创建一个我们将用于攻击的服务。
基本基线ML的实际操作
现在我们有了一个工作环境,让我们创建并逐步通过一个Jupyter Notebook,实施和演示我们在上一章中学到的基础概念。这个Notebook名为basic-ml.ipynb,并使用了scikit-learn附带的一个示例数据集——Wine数据集。Wine数据集有13个不同的葡萄酒样本属性和相关的分类(Class_1, Class_2, Class_3)。我们将首先使用示例数据集展示一些基本的数据探索技术,例如打印特征名称、目标标签、目标名称和数据预览:
from sklearn import datasets
import numpy as np
import pandas as pd
# 加载葡萄酒数据集
wine = datasets.load_wine()
# 转换为pandas DataFrame
df = pd.DataFrame(data=np.c_[wine['data'], wine['target']], columns=wine['feature_names'] + ['target'])
print("Features:", df.columns.tolist()[::-1])
print("Targets:", df.target.unique())
print("Target Names:", wine.target_names)
print("\nData Preview")
df.head()
我们使用sklearn将数据分为训练集和测试集,通过随机提取20%的数据作为测试数据。random_state参数允许我们重现拆分:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(wine.data, wine.target, test_size=0.2, random_state=42)
这种技术适用于所有监督学习(SL)算法。在这个例子中,我们将使用我们在上一章中讨论的两种算法(即决策树及其集成版本的随机森林),通过使用多个决策树来避免过拟合并提高性能。
如我们在上一章讨论的那样,过拟合使模型在训练期间记住了训练数据的特征,从而在训练时表现良好,但泛化效果差,即在未见过的数据上表现不佳。随机森林通过引入具有随机选择特征和样本的多个树,并平均它们的预测来帮助模型更好地泛化并在未见过的数据上表现更好。
请注意它们的使用有多么相似,除了分类器类和初始化参数外:
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
# 创建并训练决策树
tree = DecisionTreeClassifier()
tree.fit(X_train, y_train)
# 对测试集进行预测并计算准确率
y_pred_tree = tree.predict(X_test)
accuracy_tree = accuracy_score(y_test, y_pred_tree)
print(f"Decision Tree Accuracy: {accuracy_tree:.2f}")
随机森林使用集成学习,可以防止过拟合并提供更好的准确性:
# 现在,让我们创建并训练随机森林分类器
from sklearn.ensemble import RandomForestClassifier
forest = RandomForestClassifier(n_estimators=100, random_state=42)
forest.fit(X_train, y_train)
# 对测试集进行预测并计算准确率
y_pred_forest = forest.predict(X_test)
accuracy_forest = accuracy_score(y_test, y_pred_forest)
print(f"Random Forest Accuracy: {accuracy_forest:.2f}")
正如预期的那样,随机森林提供了100%的性能(准确率为1),而决策树为94%(准确率为0.94)。Wine是一个小数据集,这里仅用于展示接口如何训练和测试分类器。该Notebook还包含展示混淆矩阵的代码,帮助您评估模型性能。混淆矩阵是实际标签与预测标签的交叉参考,如下所示:
当我们查看混淆矩阵时,可以看到某个类别有多少误报,即错误地预测为属于该类别的实例数。这有助于我们衡量模型的准确率(Accuracy = 所有类别的真正例总和 / 观测总数)。 同样,通过查看错误预测为不同类别的实例,我们可以识别某个类别的漏报。
现在我们来看如何使用更高级的算法来实现同样的解决方案,即一个简单的神经网络(NN)。
简单的神经网络
我们还可以使用一个简单的前馈神经网络(FNN)解决葡萄酒分类问题,该网络有一个隐藏层。这种类型的神经网络称为多层感知器(MLP)。
代码展示了数据的标准预处理代码,将数据归一化以使其具有相同的范围,避免特征重要性的失真:
# 将特征标准化,使其均值为0,方差为1
scaler = StandardScaler()
data = scaler.fit_transform(wine.data)
我们还对目标变量应用了一键编码(one-hot encoding)。这确保目标标签(0、1、2)被表示为分类类别,而不是数值序列。one-hot编码通过为每个类别使用二进制向量来实现这一点,位置上的1标记类别;例如,0为100,1为010,2为001:
# 将目标转换为分类(one-hot编码)
targets = to_categorical(wine.target)
代码使用Keras构建了一个具有13个输入、一个隐藏层和一个3输出层的MLP(因为有三个类别)。它还添加了激活函数和超参数,如批处理大小和训练周期:
# 创建一个顺序模型
model = Sequential()
model.add(Dense(13, activation='relu', input_shape=(13,)))
model.add(Dense(3, activation='softmax'))
# 使用'categorical_crossentropy'损失函数和'adam'优化器编译模型
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
# 训练模型20个周期
model.fit(X_train, y_train, epochs=20, batch_size=1, verbose=1)
一旦训练完成,我们可以使用predict方法来评估模型,模型的准确率似乎达到了100%。我们使用np.argmax对one-hot编码的值进行操作,以获取实际类别。
# 预测并评估模型
y_pred = model.predict(X_test)
accuracy_nn = accuracy_score(np.argmax(y_test, axis=1), np.argmax(y_pred, axis=1))
print(f"Neural Network Accuracy: {accuracy_nn:.2f}")
我们已经通过编码基本和更高级的机器学习算法实现了分类解决方案。这使我们能够实际展示第一章中讨论的关键概念,并在整个书中使用它们。现在我们已经准备好开发我们将用于对抗攻击的简单AI服务。
使用CNN开发我们的目标AI服务
MLP(多层感知器)相对简单。在我们的游乐场中,主要的神经网络将是CNN(卷积神经网络),这是一种在图像和物体识别任务中流行的深度神经网络(DNN)。我们将使用CIFAR-10,这是一个与Keras捆绑的公共数据集,来创建一个示例CNN,保存它,然后将其部署用于预测。
CIFAR-10包含10类的60,000张32 x 32的图像。更多信息请参见:keras.io/api/dataset…。
我们提供了步骤的详细说明,作为每个步骤如何工作的指南。我们将在此描述这些步骤,但建议您通过Jupyter Notebook进行操作,并阅读注释以更好地理解每个步骤的工作原理。您可以在我们的GitHub代码库中找到该Notebook:github.com/PacktPublis…。
我们还添加了部署功能和代码,以REST服务的形式运行预测(推理),并使用来自互联网的随机图像(不在CIFAR-10数据集中)进行测试。这将为您提供一个简化的端到端开发和部署我们的目标AI服务的过程。
让我们深入了解使用ML和CIFAR-10数据集开发AI服务的步骤。
设置和数据收集
我们首先导入所需的库,并测试是否有GPU环境,如果您在多GPU环境中进行训练,可以避免内存错误。数据收集很简单。Keras提供了一个方法来检索CIFAR-10数据集,并将其分为50,000张训练图像和10,000张测试图像。我们进一步将训练数据集拆分为训练和验证集,以便在不使用模型在训练期间看到的任何数据(即使是间接看到的)的情况下进行测试:
# 加载CIFAR-10数据集
from keras.datasets import cifar10
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
cifar10_class_names = ["airplane", "automobile", "bird", "cat", "deer","dog", "frog", "horse", "ship", "truck"]
num_classes = len(cifar10_class_names)
print(x_train.shape, x_train.shape)
数据探索
Notebook中包含了解释数据表示的代码。每个数据集都是一个图像数组。每张图像依次表示为32 x 32的像素位置,对于每个像素位置,我们有三个RGB值来捕捉像素强度(颜色)。这三个值是0到255之间的8位整数。我们可以使用x_train[0][1][2]查看训练数据集中第一张图像第一个像素的RGB值,返回一个RGB数组:[190, 194, 193]。
我们还看到有10个类,表示为0到9。Notebook中还包含了使用matplotlib可视化和显示图像及其类别的代码:
import matplotlib.pyplot as plt
# 显示前几个训练图像及其标签
fig, axes = plt.subplots(1, 5, figsize=(15, 3))
for i in range(5):
axes[i].imshow(x_train[i])
axes[i].set_title(cifar10_class_names[y_train[i][0]])
axes[i].axis('off')
plt.show()
这些代码片段帮助我们更好地理解数据的结构和表示,并为接下来的模型开发和训练奠定基础。
让我们继续进行数据预处理。
数据预处理
我们应用两种预处理类型:
-
归一化:通过将训练和测试图像数据缩放到0到1的范围内,而不改变分布。这个范围适合神经网络的激活函数。我们通过将RGB值除以它们的最大值来实现这一点。我们使用浮点除法来保持精度,而不是通过整数除法将值变为0和1:
x_train_norm, x_val_norm, x_test_norm = x_train.astype("float32") / 255.0, x_val.astype("float32") / 255.0, x_test.astype("float32") / 255.0 -
目标标签的独热编码:将数字转换为二进制向量,类别号用作索引;例如,6变为0000010000:
y_train_encoded = keras.utils.to_categorical(y_train, num_classes) y_val_encoded = keras.utils.to_categorical(y_val, num_classes) y_test_encoded = keras.utils.to_categorical(y_test, num_classes)
我们这样做是为了确保数字被理解为分类数据而不是顺序数据,防止由于数值关系(例如顺序关系)导致数据的潜在误解。
算法选择和模型构建
我们将使用CNN模型,因为这种模型非常适合图像识别。CNN依赖于卷积,就像放大镜(称为滤波器或核)在输入数据上滑动以提取和学习空间层次和模式。
在我们的示例中,我们使用Keras API构建一个具有多个卷积层的CNN,并添加一些有用的实用层。这包括池化层、批量归一化层和Dropout层。池化层(MaxPooling2D)减少图像质量并消除噪声,以突出特征并避免过拟合。批量归一化层通过在一个批次内归一化每一层的输入以使其均值为0,方差为1来提高性能和稳定性。这减少了内部协变量偏移,并有助于更快的收敛。Dropout层在训练期间随机省略神经元,以应用正则化防止过拟合,这有助于模型在未见过的数据上更好地泛化。
最后,我们将卷积的3D输出展平,以便将其输入更通用的全连接(dense)层。这些层将使用softmax激活函数进行分类。
一旦我们定义了模型架构,就使用流行的优化器和损失函数选择,并设置训练模型的度量标准。我们将其作为编译模型的一部分:
model.compile(optimizer='adam', loss=keras.losses.categorical_crossentropy, metrics=['accuracy'])
模型训练
现在我们已经将模型作为一个对象,可以调用其fit方法进行训练。在训练模型时,我们定义超参数。这些是外部配置,定义了模型的结构及其学习方式,例如学习率、层数和批处理大小,影响其性能和效率。在我们的示例中,我们在调用训练方法时定义了两个超参数:batch_size是一次模型训练迭代中使用的训练示例数,epochs是训练过程中完整遍历整个训练数据集的次数:
history = model.fit(x_train_norm, y_train_encoded, batch_size=64, epochs=100, validation_data=(x_test_norm, y_test_encoded))
我们使用了较高的epochs数量(100),这是通过实验确定的,使验证准确率稳定的最佳epochs数。
Notebook中包含了使用history对象可视化训练期间准确率曲线的代码:
import matplotlib.pyplot as plt
# 可视化训练和验证准确率
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Validation'], loc='upper left')
plt.show()
这些步骤帮助我们构建了一个基于CIFAR-10数据集的CNN模型,并展示了如何对其进行训练和验证。我们现在准备开发我们的简单AI服务,用于对抗攻击。
在第100个训练周期时,进一步训练并未显著提高模型的性能。我们称之为收敛,这表明模型的权重和偏差已经稳定,达到了最佳学习效果。一旦模型训练收敛,我们将模型保存为文件以便进一步评估:
model.save(model_filename)
模型评估
我们使用训练好的模型或从文件加载模型,查看其在测试数据上的准确率,并查看其混淆矩阵以检测任何异常。如预期的那样,准确率约为87%,但我们注意到狗和猫是最主要的误分类来源:
# 加载模型
model = keras.models.load_model(model_filename)
# 在测试集上评估模型
loss, accuracy = model.evaluate(x_test_norm, y_test_encoded, verbose=0)
print(f"Test accuracy: {accuracy:.2f}")
# 生成混淆矩阵
from sklearn.metrics import confusion_matrix
import seaborn as sns
y_pred = model.predict(x_test_norm)
y_pred_classes = np.argmax(y_pred, axis=1)
y_true = np.argmax(y_test_encoded, axis=1)
conf_matrix = confusion_matrix(y_true, y_pred_classes)
plt.figure(figsize=(10, 8))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues', xticklabels=cifar10_class_names, yticklabels=cifar10_class_names)
plt.ylabel('Actual')
plt.xlabel('Predicted')
plt.title('Confusion Matrix')
plt.show()
通过这些步骤,我们可以评估模型的性能,识别分类错误的来源,并确保模型在不同类别上的表现。
模型部署
最后,Notebook包含了将模型部署的代码,以便预测REST服务可以使用它。代码非常简单,将模型复制到部署目录,并通过在文件名中添加版本来重命名现有模型。这使我们能够跟踪更改并进行备份。该代码仅用于教育目的。生产级系统将使用MLOps模型注册表和流水线。MLOps代表机器学习操作,超出了本章的范围。您可以在以下链接找到关于MLOps中使用模型注册表的全面信息:docs.aws.amazon.com/sagemaker/l…。
推理服务
一旦模型部署完毕,您可以使用一个名为inference_service.py的示例REST预测服务进行测试。该服务是一个简单的Flask REST服务,它调整上传图像的大小,并使用部署的模型预测其类别。
要从终端窗口使用该服务,激活我们的虚拟环境,命令如下:
source <src base dir>/.venv/activate
然后,导航到ch2文件夹并运行以下命令:
python inference_service.py
该服务将运行在端口5000上(您可以在代码中更改该端口):
from flask import Flask, request, jsonify
from tensorflow.keras.models import load_model
from PIL import Image
import numpy as np
app = Flask(__name__)
# 加载模型
model = load_model('deployment_dir/model.h5')
def prepare_image(image, target):
# 如果需要,可以在此处进行图像预处理
image = image.resize(target)
image = np.array(image) / 255.0
image = np.expand_dims(image, axis=0)
return image
@app.route('/predict', methods=['POST'])
def predict():
if 'file' not in request.files:
return jsonify(error='No file part'), 400
file = request.files['file']
if file.filename == '':
return jsonify(error='No selected file'), 400
image = Image.open(file.stream)
image = prepare_image(image, target=(32, 32))
preds = model.predict(image)
results = {
'predictions': preds.tolist()
}
return jsonify(results)
if __name__ == '__main__':
app.run(port=5000)
该代码将设置一个Flask REST服务,允许您上传图像并返回模型的预测结果。通过这些步骤,您可以开发、训练、评估和部署一个简单的AI服务。
从另一个终端窗口,导航到 <src base dir>/ch2 目录,并使用 test_client.py 示例测试服务。我们收集了一些来自网络的随机图像来测试该服务。你可以在 ch2/images 目录下找到它们。你可以通过键入以下命令来测试该服务:
python test_client.py <full image path>
例如,你可以尝试以下命令:
python test_client.py images/dog.jpg
该服务将返回一个包含数值类和类名的预测JSON;例如,{'prediction': {'class_name': 'automobile', 'label': 1}}:
import requests
import sys
if len(sys.argv) != 2:
print("Usage: python test_client.py <full image path>")
sys.exit(1)
image_path = sys.argv[1]
url = "http://localhost:5000/predict"
with open(image_path, 'rb') as image_file:
files = {'file': image_file}
response = requests.post(url, files=files)
print(response.json())
通过这些步骤,你可以使用终端命令测试你的AI服务,并查看其预测结果。
要停止推理服务,请返回启动服务的终端窗口并按下 Ctrl + C。 我们已经学习了如何从训练到部署创建一个简单的AI服务。有时,训练可能需要比我们的开发工作站更强大的资源。在下一节中,我们将探索一些经济实惠的选择来帮助我们解决这个问题。
大规模ML开发
模型可能需要GPU资源才能在合理的时间内完成训练。GPU使用专门设计用于并行处理和简单数学运算的硬件,与AI中使用的类似。因此,由于它们能够同时处理多个计算,因此在训练大数据集ML模型时,GPU优于CPU。这显著加快了训练过程。例如,我们的简单CIFAR-10数据集,在没有GPU的计算机上训练需要90分钟,而使用NVIDIA RTX 4090只需不到5分钟。GPU昂贵且功耗高。一个替代方案是使用云供应商提供的按需CPU和GPU计算。
Google Colab
Google Colab是Google提供的免费基于云的服务,为ML开发提供了一个交互环境。它支持Python,并提供了一个创建和执行存储在Google Drive或从GitHub导入的Jupyter笔记本的平台。 它的重点是协作和易用性,可能缺少一些现成的功能。免费版本允许使用NVIDIA T4 GPU。其他GPU需要升级到付费模式。使用免费版和T4训练我们的简单模型大约需要20分钟。 更多信息,请参见:colab.research.google.com 和 colab.research.google.com/notebooks/g…。
AWS SageMaker
AWS是一个云平台,提供SageMaker,适用于ML开发。它包括SageMaker笔记本实例、易于使用的AWS实例,提供库和托管的Jupyter笔记本。它还与GitHub存储库和AWS生态系统(例如,简单存储服务(S3)桶)集成。有关详细信息以及如何使用其Jupyter功能创建和实例化笔记本实例,请参见:docs.aws.amazon.com/sagemaker/l…。AWS提供一个免费层,但没有任何层包括GPU。最便宜的GPU实例是g4dn.xlarge,配有一个NVIDIA T4 GPU。您可能需要请求AWS允许使用这些实例,因为默认情况下,这种实例类型的服务配额为0。有关最新的定价和规格,请参见:aws.amazon.com/ec2/instanc…。SageMaker提供了一个复杂且安全的ML开发和操作环境。如果您已经在使用AWS,使用SageMaker笔记本实例作为您的环境是明智的选择。
Azure机器学习服务
作为Microsoft Azure云平台的一部分,Azure机器学习服务提供集成的ML Studio服务,支持Jupyter笔记本、定制虚拟环境、与MLOps和Azure功能的集成等。有关在Azure机器学习服务上使用Jupyter笔记本的更多信息,请参见:learn.microsoft.com/en-GB/azure…。在撰写本文时,Azure上最便宜的GPU支持的VM是NC6,配有一个Tesla K80 GPU。成本因地区而异。有关最新的定价和规格,请参见:azure.microsoft.com/en-us/prici…。 Azure还提供30天的免费试用期,您可以用来学习。
Lambda Labs Cloud
Lambda Labs Cloud是一个专门的ML平台,提供按需GPU服务器,预配置了最流行的ML框架。虽然该平台不提供其他云供应商的广泛功能,但它以非常低的成本提供高端GPU,比所有其他供应商都便宜。
它们易于设置并通过SSH或其Web云IDE(预安装的Jupyter Labs版本)访问。它们还提供持久存储功能,在启动新实例时挂载。该功能允许存储数据和配置(例如,虚拟环境)、代码等。该平台有一个API,但SSH是持续配置和使用该平台的关键。总体而言,由于缺乏内置服务,该平台更接近于使用您自己的计算机。
我们使用了一台NVIDIA A100实例,收费为每小时0.80美元,训练我们的模型在8分钟内完成,成本不到20美分。有关使用Lambda Labs Cloud的更多信息,请参见:lambdalabs.com/service/gpu…。我们已经介绍了在大规模使用ML的选项。当开发和测试一些对抗性攻击和缓解措施时,这将是必要的。
总结
恭喜你!你已经开发了你的第一个端到端图像识别AI服务。
我们还学习了如何创建Python ML开发环境,并使用pip和虚拟环境来安装和管理依赖项。我们看到如何在Jupyter笔记本中注册这些虚拟环境。我们通过两个笔记本开发了基线ML模型,一个简单的神经网络(NN)和一个更高级的用于图像分类的CNN。我们研究了如何评估和部署模型,并使用一个简单的REST服务来托管模型并响应预测请求。我们使用一个示例Python客户端和一些随机图像测试了该服务。 在接下来的章节中,当我们描述对抗性攻击和防御时,这个服务将是我们的主要目标。
下一章中,我们将讨论传统安全如何应用于我们的新服务,并进行我们的第一次对抗性攻击,以展示为什么传统安全不足以阻止对抗性AI攻击。