跳转到主要内容

用于签名和验证机器学习模型的工具

项目描述

模型签名

本项目展示了如何通过使用Sigstore(一个无需管理加密密钥材料的代码签名透明化工具)来对模型进行签名,从而保护模型完整性。

当用户下载已签名的模型版本时,他们可以验证签名是否来自已知或可信的身份,从而确保模型在训练后没有被篡改。

签名事件会被记录到Sigstore的单向透明日志中。透明日志使得签名事件可被发现:模型验证者可以通过检查包含证明(由模型签名库处理)来验证他们所查看的模型是否存在于透明日志中。此外,监控日志的模型签名者可以检查任何意外的签名事件。

模型签名者应该监控日志中其签名身份的出现。Sigstore正在积极开发一个在GitHub Actions上运行的日志监控器

Signing models with Sigstore

模型签名CLI

脚本sign.pyverify.py旨在提供对签名和验证机器学习模型所需的功能。对于签名和验证,支持以下方法:

  • 使用自己的密钥对
  • 使用自己的PKI
  • 跳过签名(仅生成哈希和创建捆绑包)

签名部分创建一个存储为JSON格式的sigstore捆绑包 protobuf。捆绑包包含检查有效载荷所需的验证材料,以及一个作为DSSE信封的有效载荷。此外,DSSE信封包含一个in-toto声明及其签名。签名格式和签名计算方法可在此处查看

最后,该声明本身包含主题,即(文件路径,摘要)对的列表,谓词类型设置为model_signing/v1/model,以及谓词的字典。想法是将来使用谓词来存储(并因此签名)模型卡片信息。

验证部分读取sigstore捆绑包文件,首先验证签名是否有效,然后重新计算模型的文件哈希,以与已签名的哈希进行比较。

注意:签名默认存储为./model.sig,可以通过设置--sig_out标志进行调整。

用法

有两个脚本可以用来创建和签名捆绑包,另一个用来验证捆绑包。此外,该功能可以直接从其他Python工具中使用。脚本sign.pyverify.py可以用作规范性的如何使用示例。

直接使用脚本的最简单方法是在虚拟环境中。

$ python3 -m venv .venv
$ source .venv/bin/activate
(.venv) $ pip install -r install/requirements.in

签名

(.venv) $ python3 sign.py --model_path ${MODEL_PATH} --sig_out ${OUTPUT_PATH} --method {private-key, pki} {additional parameters depending on method}

验证

(.venv) $ python3 verify.py --model_path ${MODEL_PATH} --method {private-key, pki} {additional parameters depending on method}

示例

使用自己的密钥

$ MODEL_PATH='/path/to/your/model'
$ openssl ecparam -name secp256k1 -genkey -noout -out ec-secp256k1-priv-key.pem
$ openssl ec -in ec-secp256k1-priv-key.pem -pubout > ec-secp256k1-pub-key.pem
$ source .venv/bin/activate
# SIGN
(.venv) $ python3 sign_model.py --model_path ${MODEL_PATH} --method private-key --private-key ec-secp256k1-priv-key.pem
...
#VERIFY
(.venv) $ python3 verify_model.py --model_path ${MODEL_PATH} --method private-key --public-key ec-secp256k1-pub-key.pem
...

使用自己的PKI

为了使用自己的PKI签名模型,您需要创建以下信息:

- The signing certificate
- The elliptic curve private key matching the signing certificate's public key
- Optionally, the certificate chain used for verification.
$ MODEL_PATH='/path/to/your/model'
$ CERT_CHAIN='/path/to/cert_chain'
$ SIGNING_CERT='/path/to/signing_certificate'
$ PRIVATE_KEY='/path/to/private_key'
# SIGN
(.venv) $ python3 sign_model.py --model_path ${MODEL_PATH} \
    --method pki \
    --private-key ${PRIVATE_KEY} \
    --signing_cert ${SIGNING_CERT} \
    [--cert_chain ${CERT_CHAIN}]
...
#VERIFY
$ ROOT_CERTS='/path/to/root/certs'
(.venv) $ python3 verify_model.py --model_path ${MODEL_PATH} \
     --method pki \
     --root_certs ${ROOT_CERTS}
...

Sigstore ID提供者

对于签名字符模型的开发者,目前可以使用以下三个身份提供者:

  • 谷歌提供者是https://#
  • GitHub的提供者是https://github.com/login/oauth
  • 微软的提供者是https://login.microsoftonline.com

对于使用工作负载身份进行自动化签名的场景,目前支持以下平台,以下列出了它们的预期身份:

  • GitHub Actions (https://github.com/octo-org/octo-automation/.github/workflows/oidc.yml@refs/heads/main)
  • GitLab CI (https://gitlab.com/my-group/my-project//path/to/.gitlab-ci.yml@refs/heads/main)
  • Google Cloud Platform (SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com)
  • Buildkite CI (https://buildkite.com/ORGANIZATION_SLUG/PIPELINE_SLUG)

支持的模型

该库支持多个模型,来自多个训练框架和模型中心。

例如,要使用TensorFlow训练的存储在TFHub中的Bertseq2seq模型进行签名和验证,请运行以下命令:

model_path=bertseq2seq
wget "https://tfhub.dev/google/bertseq2seq/bert24_en_de/1?tf-hub-format=compressed" -O "${model_path}".tgz
mkdir -p "${model_path}"
cd "${model_path}" && tar xvzf ../"${model_path}".tgz && rm ../"${model_path}".tgz && cd -
python3 main.py sign --path "${model_path}"
python3 main.py verify --path "${model_path}" \
    --identity-provider https://# \
    --identity myemail@gmail.com

对于存储在Hugging Face中的模型,我们需要通过以下方式从Git获取大文件支持:

sudo apt install git-lfs
git lfs install

之后,我们可以对 Bert 基础模型进行签名和验证

model_name=bert-base-uncased
model_path="${model_name}"
git clone --depth=1 "https://hugging-face.cn/${model_name}" && rm -rf "${model_name}"/.git
python3 main.py sign --path "${model_path}"
python3 main.py verify --path "${model_path}" \
    --identity-provider https://# \
    --identity myemail@gmail.com

同样,我们可以对 Falcon 模型进行签名和验证

model_name=tiiuae/falcon-7b
model_path=$(echo "${model_name}" | cut -d/ -f2)
git clone --depth=1 "https://hugging-face.cn/${model_name}" && rm -rf "${model_name}"/.git
python3 main.py sign --path "${model_path}"
python3 main.py verify --path "${model_path}" \
    --identity-provider https://# \
    --identity myemail@gmail.com

我们还可以支持来自 PyTorch Hub 的模型

model_name=hustvl/YOLOP
model_path=$(echo "${model_name}" | cut -d/ -f2)
wget "https://github.com/${model_name}/archive/main.zip" -O "${model_path}".zip
mkdir -p "${model_path}"
cd "${model_path}" && unzip ../"${model_path}".zip && rm ../"${model_path}".zip && shopt -s dotglob && mv YOLOP-main/* . && shopt -u dotglob && rmdir YOLOP-main/ && cd -
python3 main.py sign --path "${model_path}"
python3 main.py verify --path "${model_path}" \
    --identity-provider https://# \
    --identity myemail@gmail.com

我们还支持 ONNX 模型,例如 Roberta

model_name=roberta-base-11
model_path="${model_name}.onnx"
wget "https://github.com/onnx/models/raw/main/text/machine_comprehension/roberta/model/${model_name}.onnx"
python3 main.py sign --path "${model_path}"
python3 main.py verify --path "${model_path}" \
    --identity-provider https://# \
    --identity myemail@gmail.com

基准测试

按照使用部分进行安装。确保你有足够的磁盘空间

  • 如果传递第三个脚本参数为 true:至少 50GB
  • 否则:至少 100GB

运行基准测试

git clone git@github.com:sigstore/model-transparency.git
cd model-transparency/model_signing
bash benchmarks/run.sh https://# myemail@gmail.com [true]

执行了一次运行。

使用的哈希值

  • H1:使用目录的树表示进行哈希处理。
  • H2:使用目录的列表表示进行哈希处理。(实现并行化,vCPUs 分片大小为 1GB)。

机器 M1:Debian 6.3.11 x86_64 GNU/Linux,200GB RAM,48 vCPUs,512KB 缓存,AMD EPYC 7B12

哈希 模型 大小 签名时间 验证时间
H1 roberta-base-11 8K 0.8s 0.6s
H1 hustvl/YOLOP 215M 1.2s 0.8s
H1 bertseq2seq 2.8G 4.6s 4.4s
H1 bert-base-uncased 3.3G 5s 4.7s
H1 tiiuae/falcon-7b 14GB 12.2s 11.8s
H2 roberta-base-11 8K 1s 0.6s
H2 hustvl/YOLOP 215M 1s 1s
H2 bertseq2seq 2.8G 1.9s 1.4s
H2 bert-base-uncased 3.3G 1.6s 1.1s
H2 tiiuae/falcon-7b 14GB 2.1s 1.8s

机器 M2:Debian 5.10.1 x86_64 GNU/Linux,4GB RAM,2 vCPUs,56320 KB,Intel(R) Xeon(R) CPU @ 2.20GHz

哈希 模型 大小 签名时间 验证时间
H1 roberta-base-11 8K 1.1s 0.7s
H1 hustvl/YOLOP 215M 1.9s 1.7s
H1 bertseq2seq 2.8G 18s 23.2s
H1 bert-base-uncased 3.3G 23.4s 18.9s
H1 tiiuae/falcon-7b 14GB 2m4s 2m2s
H2 roberta-base-11 8K 1.1s 0.8s
H2 hustvl/YOLOP 215M 1.9s 1.6s
H2 bertseq2seq 2.8G 13.8s 25.9s
H2 bert-base-uncased 3.3G 22.7s 23.3s
H2 tiiuae/falcon-7b 14GB 2m.1s 2m3s

开发步骤

代码审查

model_signing 自动使用一系列工具进行代码审查和格式化

您可以通过安装 dev 依赖项在本地运行类型检查器

python3 -m venv dev_env
source dev_env/bin/activate
os=Linux # Supported: Linux, Darwin.
python3 -m pip install --require-hashes -r "install/requirements_dev_${os}".txt

然后让 pytype 指向所需的模块或包

pytype --keep-going model_signing/hashing

项目详情


下载文件

下载适用于您平台的应用程序。如果您不确定要选择哪个,请了解更多关于 安装包 的信息。

源代码分发

model_signing-0.0.2a0.tar.gz (34.1 kB 查看哈希值)

上传时间 源代码

构建分发

model_signing-0.0.2a0-py3-none-any.whl (58.4 kB 查看哈希值)

上传时间 Python 3

支持者:

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面