用于签名和验证机器学习模型的工具
项目描述
模型签名
本项目展示了如何通过使用Sigstore(一个无需管理加密密钥材料的代码签名透明化工具)来对模型进行签名,从而保护模型完整性。
当用户下载已签名的模型版本时,他们可以验证签名是否来自已知或可信的身份,从而确保模型在训练后没有被篡改。
签名事件会被记录到Sigstore的单向透明日志中。透明日志使得签名事件可被发现:模型验证者可以通过检查包含证明(由模型签名库处理)来验证他们所查看的模型是否存在于透明日志中。此外,监控日志的模型签名者可以检查任何意外的签名事件。
模型签名者应该监控日志中其签名身份的出现。Sigstore正在积极开发一个在GitHub Actions上运行的日志监控器。
模型签名CLI
脚本sign.py
和verify.py
旨在提供对签名和验证机器学习模型所需的功能。对于签名和验证,支持以下方法:
- 使用自己的密钥对
- 使用自己的PKI
- 跳过签名(仅生成哈希和创建捆绑包)
签名部分创建一个存储为JSON格式的sigstore捆绑包 protobuf。捆绑包包含检查有效载荷所需的验证材料,以及一个作为DSSE信封的有效载荷。此外,DSSE信封包含一个in-toto声明及其签名。签名格式和签名计算方法可在此处查看。
最后,该声明本身包含主题,即(文件路径,摘要)对的列表,谓词类型设置为model_signing/v1/model
,以及谓词的字典。想法是将来使用谓词来存储(并因此签名)模型卡片信息。
验证部分读取sigstore捆绑包文件,首先验证签名是否有效,然后重新计算模型的文件哈希,以与已签名的哈希进行比较。
注意:签名默认存储为./model.sig
,可以通过设置--sig_out
标志进行调整。
用法
有两个脚本可以用来创建和签名捆绑包,另一个用来验证捆绑包。此外,该功能可以直接从其他Python工具中使用。脚本sign.py
和verify.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
项目详情
下载文件
下载适用于您平台的应用程序。如果您不确定要选择哪个,请了解更多关于 安装包 的信息。