独立模型卡工具包演示

此“独立”笔记本演示了在没有 TFX/MLMD 上下文的情况下使用模型卡工具包。

在 TensorFlow.org 上查看 在 Google Colab 中运行 在 GitHub 上查看 下载笔记本

目标

此笔记本演示了如何在 Jupyter/Colab 环境中使用模型卡工具包生成模型卡。您可以在 https://modelcards.withgoogle.com/about 了解有关模型卡的更多信息

我们在本演示中使用 Keras 模型。但以下逻辑也适用于其他 ML 框架。

设置

首先,我们需要 a) 安装并导入必要的软件包,以及 b) 下载数据。

升级 Pip 并安装模型卡工具包

pip install --upgrade pip
pip install 'model-card-toolkit>=1.0.0'
pip install 'tensorflow>=2.3.1'
pip install 'tensorflow-datasets>=4.8.2'

您是否重新启动了运行时?

如果您使用的是 Google Colab,则第一次运行上面的单元格时,您必须重新启动运行时(运行时 > 重新启动运行时...)。这是因为 Colab 加载软件包的方式。

导入

import tensorflow as tf
import numpy as np
import model_card_toolkit as mct
from model_card_toolkit.documentation.examples import cats_vs_dogs
from model_card_toolkit.utils.graphics import figure_to_base64str
import tempfile
import matplotlib.pyplot as plt
from IPython import display
import requests
import os
import zipfile

模型

我们将使用一个预训练模型,其架构基于 MobileNetV2,这是一个流行的 16 层图像分类模型。我们的模型经过训练,可以区分使用 猫狗 数据集的猫和狗。模型训练基于 TensorFlow 转移学习教程

URL = 'https://storage.googleapis.com/cats_vs_dogs_model/cats_vs_dogs_model.zip'
BASE_PATH = tempfile.mkdtemp()
ZIP_PATH = os.path.join(BASE_PATH, 'cats_vs_dogs_model.zip')
MODEL_PATH = os.path.join(BASE_PATH,'cats_vs_dogs_model')

r = requests.get(URL, allow_redirects=True)
open(ZIP_PATH, 'wb').write(r.content)

with zipfile.ZipFile(ZIP_PATH, 'r') as zip_ref:
    zip_ref.extractall(BASE_PATH)

model = tf.keras.models.load_model(MODEL_PATH)
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
WARNING:tensorflow:SavedModel saved prior to TF 2.5 detected when loading Keras model. Please ensure that you are saving the model with model.save() or tf.keras.models.save_model(), *NOT* tf.saved_model.save(). To confirm, there should be a file named "keras_metadata.pb" in the SavedModel directory.
2023-10-03 09:12:20.736066: W tensorflow/core/common_runtime/gpu/gpu_device.cc:1960] Cannot dlopen some GPU libraries. Please make sure the missing libraries mentioned above are installed properly if you would like to use GPU. Follow the guide at https://tensorflowcn.cn/install/gpu for how to download and setup the required libraries for your platform.
Skipping registering GPU devices...

数据集

在猫狗数据集中,标签=0 对应于猫,而标签=1 对应于狗。

def compute_accuracy(data):
  x = np.stack(data['examples'])
  y = np.asarray(data['labels'])
  _, metric = model.evaluate(x, y)
  return metric
examples = cats_vs_dogs.get_data()
print('num validation examples:', len(examples['combined']['examples']))
print('num cat examples:', len(examples['cat']['examples']))
print('num dog examples:', len(examples['dog']['examples']))
num validation examples: 320
num cat examples: 149
num dog examples: 171
2023-10-03 09:12:30.081069: W tensorflow/core/kernels/data/cache_dataset_ops.cc:854] The calling iterator did not fully read the dataset being cached. In order to avoid unexpected truncation of the dataset, the partially cached contents of the dataset  will be discarded. This can happen if you have an input pipeline similar to `dataset.cache().take(k).repeat()`. You should use `dataset.take(k).cache().repeat()` instead.
accuracy = compute_accuracy(examples['combined'])
cat_accuracy = compute_accuracy(examples['cat'])
dog_accuracy = compute_accuracy(examples['dog'])
10/10 [==============================] - 2s 77ms/step - loss: 0.0794 - binary_accuracy: 0.9812
5/5 [==============================] - 1s 74ms/step - loss: 0.0608 - binary_accuracy: 0.9933
6/6 [==============================] - 0s 65ms/step - loss: 0.0956 - binary_accuracy: 0.9708

使用模型卡工具包

初始化模型卡工具包

第一步是初始化一个 ModelCardToolkit 对象,它维护资产,包括 模型卡 JSON 文件模型卡文档。调用 ModelCardToolkit.scaffold_assets() 生成这些资产并返回一个 ModelCard 对象。

# https://github.com/tensorflow/model-card-toolkit/blob/master/model_card_toolkit/model_card_toolkit.py
model_card_dir = tempfile.mkdtemp()
toolkit = mct.ModelCardToolkit(model_card_dir)

# https://github.com/tensorflow/model-card-toolkit/blob/master/model_card_toolkit/model_card.py
model_card = toolkit.scaffold_assets()

注释模型卡

scaffold_assets() 返回的 ModelCard 对象具有许多可以直接修改的字段。这些字段在最终生成的模型卡文档中呈现。有关完整列表,请参阅 model_card.py。有关更多详细信息,请参阅 文档

文本字段

模型详细信息

model_card.model_details 包含许多基本元数据字段,例如 nameownersversion。您可以在 overview 字段中提供模型的描述。

model_card.model_details.name = 'Fine-tuned MobileNetV2 Model for Cats vs. Dogs'
model_card.model_details.overview = (
    'This model distinguishes cat and dog images. It uses the MobileNetV2 '
    'architecture (https://arxiv.org/abs/1801.04381) and is trained on the '
    'Cats vs Dogs dataset '
    '(https://tensorflowcn.cn/datasets/catalog/cats_vs_dogs). This model '
    'performed with high accuracy on both Cat and Dog images.'
)
model_card.model_details.owners = [
  mct.Owner(name='Model Cards Team', contact='[email protected]')
]
model_card.model_details.version = mct.Version(name='v1.0', date='08/28/2020')
model_card.model_details.references = [
    mct.Reference(reference='https://tensorflowcn.cn/guide/keras/transfer_learning'),
    mct.Reference(reference='https://arxiv.org/abs/1801.04381'),
]
model_card.model_details.licenses = [mct.License(identifier='Apache-2.0')]
model_card.model_details.citations = [mct.Citation(citation='https://github.com/tensorflow/model-card-toolkit/blob/master/model_card_toolkit/documentation/examples/Standalone_Model_Card_Toolkit_Demo.ipynb')]
定量分析

model_card.quantitative_analysis 包含有关模型性能指标的信息。

下面,我们为基于我们数据集的假设模型创建一些合成性能指标值。

model_card.quantitative_analysis.performance_metrics = [
  mct.PerformanceMetric(type='accuracy', value=str(accuracy)),
  mct.PerformanceMetric(type='accuracy', value=str(cat_accuracy), slice='cat'),
  mct.PerformanceMetric(type='accuracy', value=str(dog_accuracy), slice='Dog'),
]
注意事项

model_card.considerations 包含有关模型的限定信息 - 适当的用例是什么,用户应该注意哪些限制,应用的伦理考虑是什么,等等。

model_card.considerations.use_cases = [
    mct.UseCase(description='This model classifies images of cats and dogs.')
]
model_card.considerations.limitations = [
    mct.Limitation(description='This model is not able to classify images of other classes.')
]
model_card.considerations.ethical_considerations = [mct.Risk(
    name=
        'While distinguishing between cats and dogs is generally agreed to be '
        'a benign application of machine learning, harmful results can occur '
        'when the model attempts to classify images that don’t contain cats or '
        'dogs.',
    mitigation_strategy=
        'Avoid application on non-dog and non-cat images.'
)]

图形字段

通常,最好在报告中提供有关模型训练数据及其在评估数据上的性能的信息。模型卡工具包允许用户将此信息编码在可视化中,并在模型卡中呈现。

model_card 有三个用于图形的部分 - model_card.model_parameters.data.train.graphics 用于训练数据集统计信息,model_card.model_parameters.data.eval.graphics 用于评估数据集统计信息,以及 model_card.quantitative_analysis.graphics 用于模型性能的定量分析。

图形存储为 base64 字符串。如果您有 matplotlib 图形,您可以使用 model_card_toolkit.utils.graphics.figure_to_base64str() 将其转换为 base64 字符串。

# Validation Set Size Bar Chart
fig, ax = plt.subplots()
width = 0.75
rects0 = ax.bar(0, len(examples['combined']['examples']), width, label='Overall')
rects1 = ax.bar(1, len(examples['cat']['examples']), width, label='Cat')
rects2 = ax.bar(2, len(examples['dog']['examples']), width, label='Dog')
ax.set_xticks(np.arange(3))
ax.set_xticklabels(['Overall', 'Cat', 'Dog'])
ax.set_ylabel('Validation Set Size')
ax.set_xlabel('Slices')
ax.set_title('Validation Set Size for Slices')
validation_set_size_barchart = figure_to_base64str(fig)

png

# Acuracy Bar Chart
fig, ax = plt.subplots()
width = 0.75
rects0 = ax.bar(0, accuracy, width, label='Overall')
rects1 = ax.bar(1, cat_accuracy, width, label='Cat')
rects2 = ax.bar(2, dog_accuracy, width, label='Dog')
ax.set_xticks(np.arange(3))
ax.set_xticklabels(['Overall', 'Cat', 'Dog'])
ax.set_ylabel('Accuracy')
ax.set_xlabel('Slices')
ax.set_title('Accuracy on Slices')
accuracy_barchart = figure_to_base64str(fig)

png

现在,我们可以将它们添加到我们的 ModelCard 中。

model_card.model_parameters.data.append(mct.Dataset())
model_card.model_parameters.data[0].graphics.collection = [
  mct.Graphic(name='Validation Set Size', image=validation_set_size_barchart),
]
model_card.quantitative_analysis.graphics.collection = [
  mct.Graphic(name='Accuracy', image=accuracy_barchart),
]

生成模型卡

让我们生成模型卡文档。可用格式存储在 model_card_toolkit/template 中。在这里,我们将演示 HTML 和 Markdown 格式。

首先,我们需要使用最新的 ModelCard 更新 ModelCardToolkit

toolkit.update_model_card(model_card)

现在,ModelCardToolkit 可以使用 ModelCardToolkit.export_format() 生成模型卡文档。

# Generate a model card document in HTML (default)
html_doc = toolkit.export_format()

# Display the model card document in HTML
display.display(display.HTML(html_doc))

您还可以以其他格式输出模型卡,例如 Markdown。

# Generate a model card document in Markdown
md_path = os.path.join(model_card_dir, 'template/md/default_template.md.jinja')
md_doc = toolkit.export_format(template_path=md_path, output_file='model_card.md')

# Display the model card document in Markdown
display.display(display.Markdown(md_doc))

针对猫狗的微调 MobileNetV2 模型的模型卡

模型详细信息

概述

此模型区分猫和狗图像。它使用 MobileNetV2 架构 (https://arxiv.org/abs/1801.04381),并在猫狗数据集 (https://tensorflowcn.cn/datasets/catalog/cats_vs_dogs) 上进行训练。此模型在猫和狗图像上都具有很高的准确率。

版本

名称:v1.0

日期:2020 年 8 月 28 日

所有者

许可证

  • Apache-2.0

参考

引用

注意事项

用例

  • 该模型用于对猫和狗的图像进行分类。

局限性

  • 该模型无法对其他类别的图像进行分类。

伦理考量

  • 风险:虽然区分猫和狗通常被认为是机器学习的良性应用,但当模型试图对不包含猫或狗的图像进行分类时,可能会产生有害的结果。
    • 缓解策略:避免在非猫和非狗图像上应用该模型。

图形

验证集大小

准确率

指标

名称
准确率 0.981249988079071
猫的准确率 0.9932885766029358
狗的准确率 0.9707602262496948