本文介绍如何基于安全增强型实例(Intel® SGX)部署PyTorch深度学习模型的技术架构和使用流程。

背景信息

人工智能模型经由大量训练数据和算力生成,是具有商业价值的知识产权形式之一。PyTorch以其灵活、动态的编程环境、动态图机制、网络构建灵活等优势,深受AI开发者的推崇。该模型通常被部署于云服务供应商提供的云服务器如阿里云ECS。如何确保这些部署于公有云上的模型不被他人窃取,确保可用不可见,是模型所有者和云服务提供商共同面临的话题。

阿里云ECS部分安全增强型实例基于Intel® SGX(Software Guard Extension)技术,提供了SGX加密计算能力,打造了基于硬件级别的更高安全等级的可信机密环境,保障关键代码和数据的机密性与完整性不受恶意软件的破坏。

将PyTorch深度学习模型部署在阿里云安全增强型实例可信机密环境中,可以保证数据传输的安全性、数据使用的安全性、以及PyTorch深度学习应用程序的完整性。

技术架构

图 1. 技术架构
技术架构

基于SGX加密计算环境的PyTorch全流程保护模型参数如图 1所示。该模型在部署阶段就以密文形式存储,相关的运算在SGX Enclave中进行。模型参数仅在SGX Enclave中解密,且密钥通过远程认证安全通道传输。

本实践涉及三个角色:dkeyserver,dkeycache,PyTorch with SGX,使用流程如图 2所示,具体说明如下:

  • 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的硬件保护,可用不可见,以保证数据传输的安全性、数据使用的安全性。
图 2. 使用流程
使用流程

操作步骤

为方便验证,本实践将dkeyserver,dkeycache,PyTorch with SGX部署在同一台阿里云安全增强型实例中。

  1. 创建安全增强型实例并安装运行PyTorch所需的软件包。
    1. 创建安全增强型实例。
      具体操作,请参见创建安全增强型实例
      请注意以下参数:
      • 实例规格:实例的vCPU和内存≥4 vCPU 16 GiB,本操作选用的实例规格为ecs.g7t.4xlarge
      • 镜像:Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版
      • 公网IP:分配公网IPv4地址
    2. 构建SGX加密计算环境。
      具体操作,请参见构建SGX加密计算环境
    3. 安装运行PyTorch所需的软件包。
      PyTorch对python、gcc等软件有版本要求,可通过以下命令安装指定版本。
      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
      ln -sf /opt/rh/devtoolset-7/root/bin/g++ /usr/bin/g++
      ln -sf /opt/rh/devtoolset-7/root/bin/gcc /usr/bin/gcc
      ln -sf /opt/rh/devtoolset-7/root/bin/c++ /usr/bin/c++
      ln -sf /usr/bin/python3 /usr/bin/python

      出现如下图所示界面时,表示安装成功。

      安装所需的软件包
    4. 安装PyTorch依赖库、加解密依赖库及cmake编译工具等。
      pip3 install --upgrade pip
      pip3 install astunparse numpy ninja pyyaml mkl mkl-include setuptools cmake cffi typing_extensions future six requests dataclasses setuptools_rust pycryptodomex pycryptodome torchvision
      ln -sf /usr/local/bin/cmake /usr/bin/cmake
      ln -sf /usr/local/bin/cmake /bin/cmake
  2. 登录ECS实例。
    具体操作,请参见连接方式概述
  3. 切换到工作目录(如/home/test),获取PyTorch参考代码。

    该代码中包含三部分:dkeyserver、dkeycache、PyTorch with SGX。

    cd /home/PyTorch
    git clone https://github.com/intel/sgx-pytorch -b sgx pytorch
    cd /home/Pytorch/pytorch
    git submodule sync && git submodule update --init --recursive
    如果遇到explicit_bzero相关的编译错误, 可以尝试加上以下patch并重试。
    git pull origin pull/15/head
  4. 在ECS SGX服务器中编译PyTorch with SGX。
    1. 编译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/
      编译oneDNN
    2. 编译Pytorch Enclave。

      PyTorch with SGX的Enclave提供模型参数解密及模型预测运算。

      source /opt/alibaba/teesdk/intel/sgxsdk/environment
      cd /home/test/pytorch/enclave_ops/ideep-enclave
      make
      编译Pytorch Enclave
    3. 编译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.png
    4. 编译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
      编译PyTorch安全计算运算符
  5. 在密钥服务器端及ECS SGX服务器端分别编译生成dkeyserver和dkeycache可执行文件。
    cd /home/test/pytorch/enclave_ops/deployment
    make
    编译生成dkeyserver和dkeycache
  6. 在密钥服务器端启动密钥服务。
    cd /home/test/pytorch/enclave_ops/deployment/bin/dkeyserver
    sudo ./dkeyserver

    密钥服务器启动,等待来自部署于ECS SGX服务器的dkeycache的密钥请求。

    启动秘钥服务
  7. 在ECS SGX服务器端编译dkeycache并启动密钥分发服务。
    cd /home/test/pytorch/enclave_ops/deployment/bin/dkeycache
    sudo ./dkeycache

    dkeycache启动后,向dkeyserver申请获取所有模型密钥。dkeyserver在成功完成SGX远程证明 (SGX Remote Attestation) 后,将密钥通过远程认证安全通道发送到dkeycache的SGX Enclave。

    启动本地密钥分发服务
  8. 在ECS SGX服务器端运行基于ResNet的测试用例。
    cd /home/test/pytorch/enclave_ops/test
    sudo python whole_resnet.py

    Pytorch模型的密文参数将在SGX Enclave中解密,密钥会向dkeycache服务获取并加密传输至Enclave中。

    运行ResNet测试用例