全部產品
Search
文件中心

Elastic Compute Service:在七代安全增強型執行個體中部署PyTorch深度學習模型

更新時間:Jun 19, 2024

本文介紹如何基於安全增強型執行個體(Intel® SGX)部署PyTorch深度學習模型的技術架構和使用流程。

背景資訊

人工智慧模型經由大量訓練資料和算力產生,是具有商業價值的智慧財產權形式之一。PyTorch以其靈活、動態編程環境、動態圖機制、網路構建靈活等優勢,深受AI開發人員的推崇。該模型通常被部署於雲端服務供應商提供的雲端服務器如阿里雲ECS。如何確保這些部署於公用雲端上的模型不被他人竊取,確保可用不可見,是模型所有者和雲端服務供應商共同面臨的話題。

阿里雲ECS部分安全增強型執行個體基於Intel® SGX(Software Guard Extension)技術,提供了SGX加密計算能力,打造了基於硬體層級的更高安全等級的可信機密環境,保障關鍵代碼和資料的機密性與完整性不受惡意軟體的破壞。

將PyTorch深度學習模型部署在阿里雲安全增強型執行個體可信機密環境中,可以保證資料轉送的安全性、資料使用的安全性、以及PyTorch深度學習應用程式的完整性。

技術架構

圖 1. 技術架構

基於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的硬體保護,可用不可見,以保證資料轉送的安全性、資料使用的安全性。

圖 2. 使用流程

準備工作

部署PyTorch深度學習模型前,您需要準備運行該模型所需的環境。

說明

為方便驗證,本實踐將dkeyserver,dkeycache,PyTorch with SGX部署在同一台阿里雲安全增強型執行個體中。

  1. 建立安全增強型執行個體。

    具體操作,請參見建立可信執行個體。請注意以下參數:

    • 鏡像:Alibaba Cloud Linux 2.1903 LTS 64位 UEFI版

    • 公網IP:分配公網IPv4地址

  2. 構建SGX加密計算環境。

    具體操作,請參見構建SGX機密計算環境

  3. 安裝Python3並配置環境變數。

    本實踐所用的Python版本為3.6,您也可以根據需要,安裝合適的Python版本。具體操作,請參見Python官網

  4. 安裝運行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

    出現如下圖所示介面時,表示安裝成功。

    安裝所需的軟體包

  5. 安裝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

操作步驟

  1. 登入ECS執行個體。

    具體操作,請參見通過密碼或密鑰認證登入Linux執行個體

  2. 切換到工作目錄(如/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
  3. 在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安全計算運算子

  4. 在密鑰伺服器端及ECS SGX伺服器端分別編譯產生dkeyserver和dkeycache可執行檔。

    cd /home/test/pytorch/enclave_ops/deployment
    make

    編譯產生dkeyserver和dkeycache

  5. 在密鑰伺服器端啟動密鑰服務。

    cd /home/test/pytorch/enclave_ops/deployment/bin/dkeyserver
    sudo ./dkeyserver

    密鑰伺服器啟動,等待來自部署於ECS SGX伺服器的dkeycache的密鑰請求。

    啟動秘鑰服務

  6. 在ECS SGX伺服器端編譯dkeycache並啟動密鑰分發服務。

    cd /home/test/pytorch/enclave_ops/deployment/bin/dkeycache
    sudo ./dkeycache

    dkeycache啟動後,向dkeyserver申請擷取所有模型密鑰。dkeyserver在成功完成SGX遠程證明 (SGX Remote Attestation) 後,將密鑰通過遠程認證安全通道發送到dkeycache的SGX Enclave。

    啟動本地密鑰分發服務

  7. 在ECS SGX伺服器端運行基於ResNet的測試案例。

    cd /home/test/pytorch/enclave_ops/test
    sudo python whole_resnet.py

    Pytorch模型的密文參數將在SGX Enclave中解密,密鑰會向dkeycache服務擷取並加密傳輸至Enclave中。

    運行ResNet測試案例