本文介绍如何基于安全增强型实例(Intel® SGX)部署PyTorch深度学习模型的技术架构和使用流程。
背景信息
人工智能模型经由大量训练数据和算力生成,是具有商业价值的知识产权形式之一。PyTorch以其灵活、动态的编程环境、动态图机制、网络构建灵活等优势,深受AI开发者的推崇。该模型通常被部署于云服务供应商提供的云服务器如阿里云ECS。如何确保这些部署于公有云上的模型不被他人窃取,确保可用不可见,是模型所有者和云服务提供商共同面临的话题。
阿里云ECS部分安全增强型实例基于Intel® SGX(Software Guard Extension)技术,提供了SGX加密计算能力,打造了基于硬件级别的更高安全等级的可信机密环境,保障关键代码和数据的机密性与完整性不受恶意软件的破坏。
将PyTorch深度学习模型部署在阿里云安全增强型实例可信机密环境中,可以保证数据传输的安全性、数据使用的安全性、以及PyTorch深度学习应用程序的完整性。
技术架构
基于SGX加密计算环境的PyTorch全流程保护模型参数如技术架构所示。该模型在部署阶段就以密文形式存储,相关的运算在SGX Enclave中进行。模型参数仅在SGX Enclave中解密,且密钥通过远程认证安全通道传输。
本实践涉及三个角色:dkeyserver,dkeycache,PyTorch with SGX,使用流程如使用流程所示,具体说明如下:
dkeyserver:密钥服务器,部署于模型使用者本地。模型所有者首先使用PyTorch with SGX提供的工具在本地将模型参数加密,并在本地搭建密钥服务器(dkeyserver)。然后将加密后的模型传输并部署于阿里云ECS SGX服务器。密钥服务器管理所有模型密钥和模型ID,并接收来自ECS SGX服务器密钥分发服务的密钥请求。
dkeycache:密钥分发服务,部署于阿里云ECS SGX服务器。ECS SGX服务器的密钥分发服务首先向密钥服务器申请获取所有模型密钥。密钥服务器在成功完成SGX远程证明后,将密钥通过远程认证安全通道发送到ECS SGX服务器密钥分发的SGX Enclave。这部分将在密钥分发服务器启动后自动完成,无需模型所有者操作。
PyTorch with SGX:运行PyTorch的ECS SGX服务器,与dkeycache部署于同一台服务器。当阿里云的PyTorch实例使用模型做预测或分类任务进行模型推测时,会自动向密钥分发服务请求模型密钥。 密钥会被加密,并经SGX安全通道发送至PyTorch实例的SGX Enclave中。PyTorch with SGX启动的Enclave使用该密钥解密模型参数,并进行计算。模型参数全程享受基于SGX的硬件保护,可用不可见,以保证数据传输的安全性、数据使用的安全性。
准备工作
部署PyTorch深度学习模型前,您需要准备运行该模型所需的环境。
为方便验证,本实践将dkeyserver,dkeycache,PyTorch with SGX部署在同一台阿里云安全增强型实例中。
创建安全增强型实例。
具体操作,请参见创建可信实例。请注意以下参数:
镜像:Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版
公网IP:分配公网IPv4地址
构建SGX加密计算环境。
具体操作,请参见构建SGX加密计算环境。
安装Python3并配置环境变量。
本实践所用的Python版本为3.6,您也可以根据需要,安装合适的Python版本。具体操作,请参见Python官网。
安装运行PyTorch所需的软件包。
PyTorch对python、gcc等软件有版本要求,可通过以下命令安装指定版本。
sudo yum update --skip-broken sudo yum install -y teesdk git gcc-c++ scl-utils alinux-release-experimentals python36-devel libbsd-devel sudo yum install -y devtoolset-7-gcc devtoolset-7-gdb devtoolset-7-binutils devtoolset-7-make devtoolset-7-gcc devtoolset-7-gcc-c++ scl -l devtoolset-7 sudo ln -sf /opt/rh/devtoolset-7/root/bin/g++ /usr/bin/g++ sudo ln -sf /opt/rh/devtoolset-7/root/bin/gcc /usr/bin/gcc sudo ln -sf /opt/rh/devtoolset-7/root/bin/c++ /usr/bin/c++ sudo ln -sf /usr/bin/python3 /usr/bin/python
出现如下图所示界面时,表示安装成功。
安装PyTorch依赖库、加解密依赖库及cmake编译工具等。
sudo pip3 install --upgrade pip sudo pip3 install astunparse numpy ninja pyyaml mkl mkl-include setuptools cmake cffi typing_extensions future six requests dataclasses setuptools_rust pycryptodomex pycryptodome torchvision sudo ln -sf /usr/local/bin/cmake /usr/bin/cmake sudo ln -sf /usr/local/bin/cmake /bin/cmake
操作步骤
登录ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
切换到工作目录(如/home/test),获取PyTorch参考代码。
该代码中包含三部分:dkeyserver、dkeycache、PyTorch with SGX。
cd /home/test git clone https://github.com/intel/sgx-pytorch -b sgx pytorch cd /home/test/pytorch git submodule sync && git submodule update --init --recursive
如果遇到
explicit_bzero
相关的编译错误, 可以尝试加上以下patch并重试。git pull origin pull/15/head
在ECS SGX服务器中编译PyTorch with SGX。
编译oneDNN。
oneAPI深度神经网络库(oneDNN)是用于深度学习应用程序的基本构建基块的开源跨平台性能库,该库针对英特尔体系结构处理器、英特尔处理器图形和Xe体系图形进行了优化。主要面向对提高Intel CPU和GPU上的应用程序性能感兴趣的深度学习应用程序和框架开发人员。
source /opt/alibaba/teesdk/intel/sgxsdk/environment cd /home/test/pytorch/third_party/sgx/linux-sgx git am ../0001* cd external/dnnl make sudo cp sgx_dnnl/lib/libsgx_dnnl.a /opt/alibaba/teesdk/intel/sgxsdk/lib64/libsgx_dnnl2.a sudo cp sgx_dnnl/include/* /opt/alibaba/teesdk/intel/sgxsdk/include/
编译PyTorch Enclave。
PyTorch with SGX的Enclave提供模型参数解密及模型预测运算。
source /opt/alibaba/teesdk/intel/sgxsdk/environment cd /home/test/pytorch/enclave_ops/ideep-enclave make
编译PyTorch。
cd /home/test/pytorch pip3 uninstall torch #卸载系统已安装的Pytorch,将安装自编译的Pytorch source /opt/alibaba/teesdk/intel/sgxsdk/environment python setup.py develop --cmake-only sudo python setup.py develop && python -c "import torch"
编译PyTorch安全计算运算符。
source /opt/alibaba/teesdk/intel/sgxsdk/environment cd /home/test/pytorch/enclave_ops/secure_op && mkdir build && cd build cmake -DCMAKE_PREFIX_PATH="$(python -c 'import torch.utils; print(torch.utils.cmake_prefix_path)')" .. make
在密钥服务器端及ECS SGX服务器端分别编译生成dkeyserver和dkeycache可执行文件。
cd /home/test/pytorch/enclave_ops/deployment make
在密钥服务器端启动密钥服务。
cd /home/test/pytorch/enclave_ops/deployment/bin/dkeyserver sudo ./dkeyserver
密钥服务器启动,等待来自部署于ECS SGX服务器的dkeycache的密钥请求。
在ECS SGX服务器端编译dkeycache并启动密钥分发服务。
cd /home/test/pytorch/enclave_ops/deployment/bin/dkeycache sudo ./dkeycache
dkeycache启动后,向dkeyserver申请获取所有模型密钥。dkeyserver在成功完成SGX远程证明 (SGX Remote Attestation) 后,将密钥通过远程认证安全通道发送到dkeycache的SGX Enclave。
在ECS SGX服务器端运行基于ResNet的测试用例。
cd /home/test/pytorch/enclave_ops/test sudo python whole_resnet.py
Pytorch模型的密文参数将在SGX Enclave中解密,密钥会向dkeycache服务获取并加密传输至Enclave中。