本文介紹如何基於安全增強型執行個體(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中。