Add PaddlePaddle demo
This commit is contained in:
parent
79bbd2ad3e
commit
2b98e1a076
18
.github/workflows/demo_test.yml
vendored
18
.github/workflows/demo_test.yml
vendored
@ -831,3 +831,21 @@ jobs:
|
|||||||
|
|
||||||
- name: Run fio test
|
- name: Run fio test
|
||||||
run: docker exec ${{ github.job }} bash -c "cd /root/occlum/demos/benchmarks/fio && SGX_MODE=SIM ./run_fio_on_occlum.sh fio-seq-read.fio"
|
run: docker exec ${{ github.job }} bash -c "cd /root/occlum/demos/benchmarks/fio && SGX_MODE=SIM ./run_fio_on_occlum.sh fio-seq-read.fio"
|
||||||
|
|
||||||
|
PaddlePaddle_test:
|
||||||
|
runs-on: ubuntu-20.04
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
with:
|
||||||
|
submodules: true
|
||||||
|
|
||||||
|
- uses: ./.github/workflows/composite_action/sim
|
||||||
|
with:
|
||||||
|
container-name: ${{ github.job }}
|
||||||
|
build-envs: 'OCCLUM_RELEASE_BUILD=1'
|
||||||
|
|
||||||
|
- name: Build python and paddlepaddle
|
||||||
|
run: docker exec ${{ github.job }} bash -c "cd /root/occlum/demos/paddlepaddle; ./install_python_with_conda.sh"
|
||||||
|
|
||||||
|
- name: Run paddlepaddle test
|
||||||
|
run: docker exec ${{ github.job }} bash -c "cd /root/occlum/demos/paddlepaddle; SGX_MODE=SIM ./run_paddlepaddle_on_occlum.sh"
|
||||||
|
@ -24,6 +24,7 @@ This set of demos shows how real-world apps can be easily run inside SGX enclave
|
|||||||
* [mysql](mysql/): A demo of [MySQL](https://www.mysql.com/).
|
* [mysql](mysql/): A demo of [MySQL](https://www.mysql.com/).
|
||||||
* [openvino](openvino/) A benchmark of [OpenVINO Inference Engine](https://docs.openvinotoolkit.org/2019_R3/_docs_IE_DG_inference_engine_intro.html).
|
* [openvino](openvino/) A benchmark of [OpenVINO Inference Engine](https://docs.openvinotoolkit.org/2019_R3/_docs_IE_DG_inference_engine_intro.html).
|
||||||
* [pytorch](pytorch/): Demos of standalone and distributed [PyTorch](https://pytorch.org/).
|
* [pytorch](pytorch/): Demos of standalone and distributed [PyTorch](https://pytorch.org/).
|
||||||
|
* [paddlepaddle](paddlepaddle/): A demo of [PaddlePaddle](https://www.paddlepaddle.org.cn/).
|
||||||
* [redis](redis/): A demo of [Redis](https://redis.io).
|
* [redis](redis/): A demo of [Redis](https://redis.io).
|
||||||
* [sofaboot](sofaboot/): A demo of [SOFABoot](https://github.com/sofastack/sofa-boot), an open source Java development framework based on Spring Boot.
|
* [sofaboot](sofaboot/): A demo of [SOFABoot](https://github.com/sofastack/sofa-boot), an open source Java development framework based on Spring Boot.
|
||||||
* [sqlite](sqlite/) A demo of [SQLite](https://www.sqlite.org) SQL database engine.
|
* [sqlite](sqlite/) A demo of [SQLite](https://www.sqlite.org) SQL database engine.
|
||||||
|
3
demos/paddlepaddle/.gitignore
vendored
Normal file
3
demos/paddlepaddle/.gitignore
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
occlum_instance/
|
||||||
|
miniconda/
|
||||||
|
Miniconda3*
|
32
demos/paddlepaddle/README.md
Normal file
32
demos/paddlepaddle/README.md
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# Use PaddlePaddle with Python and Occlum
|
||||||
|
|
||||||
|
This project demonstrates how Occlum enables _unmodified_
|
||||||
|
[PaddlePaddle](https://www.paddlepaddle.org.cn/) programs running in SGX
|
||||||
|
enclaves, on the basis of _unmodified_ [Python](https://www.python.org). The
|
||||||
|
workload is a primary AI task from [PaddlePaddle Quick
|
||||||
|
Start](https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/beginner/quick_start_cn.html).
|
||||||
|
The source code of the workload resides in `demo.py`.
|
||||||
|
|
||||||
|
## How to Run
|
||||||
|
|
||||||
|
This tutorial is written under the assumption that you have Docker installed and use Occlum in a Docker container.
|
||||||
|
|
||||||
|
Occlum is compatible with glibc-supported Python, we employ miniconda as python installation tool. You can import paddle packages using conda. Here, miniconda is automatically installed by install_python_with_conda.sh script, the required python and paddle packages for this project are also loaded by this script.
|
||||||
|
|
||||||
|
Step 1 (on the host): Start an Occlum container
|
||||||
|
```
|
||||||
|
docker pull occlum/occlum:latest-ubuntu20.04
|
||||||
|
docker run -it --name=pythonDemo --device /dev/sgx/enclave occlum/occlum:latest-ubuntu20.04 bash
|
||||||
|
```
|
||||||
|
|
||||||
|
Step 2 (in the Occlum container): Download miniconda and install python to prefix position.
|
||||||
|
```
|
||||||
|
cd /root/demos/paddlepaddle
|
||||||
|
bash ./install_python_with_conda.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Step 3 (in the Occlum container): Run the sample code on Occlum
|
||||||
|
```
|
||||||
|
cd /root/demos/paddlepaddle
|
||||||
|
bash ./run_paddlepaddle_on_occlum.sh
|
||||||
|
```
|
31
demos/paddlepaddle/demo.py
Normal file
31
demos/paddlepaddle/demo.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
import paddle
|
||||||
|
import numpy as np
|
||||||
|
from paddle.vision.transforms import Normalize
|
||||||
|
|
||||||
|
transform = Normalize(mean=[127.5], std=[127.5], data_format='CHW')
|
||||||
|
train_dataset = paddle.vision.datasets.MNIST(image_path='mnist/train-images-idx3-ubyte.gz',
|
||||||
|
label_path='mnist/train-labels-idx1-ubyte.gz',
|
||||||
|
mode='train', transform=transform)
|
||||||
|
test_dataset = paddle.vision.datasets.MNIST(image_path='mnist/t10k-images-idx3-ubyte.gz',
|
||||||
|
label_path='mnist/t10k-labels-idx1-ubyte.gz',
|
||||||
|
mode='test', transform=transform)
|
||||||
|
|
||||||
|
lenet = paddle.vision.models.LeNet(num_classes=10)
|
||||||
|
model = paddle.Model(lenet)
|
||||||
|
|
||||||
|
model.prepare(paddle.optimizer.Adam(parameters=model.parameters()),
|
||||||
|
paddle.nn.CrossEntropyLoss(),
|
||||||
|
paddle.metric.Accuracy())
|
||||||
|
|
||||||
|
model.fit(train_dataset, epochs=5, batch_size=64, verbose=1)
|
||||||
|
model.evaluate(test_dataset, batch_size=64, verbose=1)
|
||||||
|
|
||||||
|
model.save('./output/mnist')
|
||||||
|
model.load('output/mnist')
|
||||||
|
|
||||||
|
img, label = test_dataset[0]
|
||||||
|
img_batch = np.expand_dims(img.astype('float32'), axis=0)
|
||||||
|
|
||||||
|
out = model.predict_batch(img_batch)[0]
|
||||||
|
pred_label = out.argmax()
|
||||||
|
print('true label: {}, pred label: {}'.format(label[0], pred_label))
|
36
demos/paddlepaddle/install_python_with_conda.sh
Executable file
36
demos/paddlepaddle/install_python_with_conda.sh
Executable file
@ -0,0 +1,36 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
|
||||||
|
|
||||||
|
# 1. Init occlum workspace
|
||||||
|
[ -d occlum_instance ] || occlum new occlum_instance
|
||||||
|
|
||||||
|
# 2. Install python and dependencies to specified position
|
||||||
|
[ -f Miniconda3-latest-Linux-x86_64.sh ] || wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
|
||||||
|
[ -d miniconda ] || bash ./Miniconda3-latest-Linux-x86_64.sh -b -p $script_dir/miniconda
|
||||||
|
$script_dir/miniconda/bin/conda create --prefix $script_dir/python-occlum -y matplotlib numpy python=3.8.10 paddlepaddle==2.4.2 -c paddle
|
||||||
|
|
||||||
|
CORE_PY=$script_dir/python-occlum/lib/python3.8/site-packages/paddle/fluid/core.py
|
||||||
|
IMAGE_PY=$script_dir/python-occlum/lib/python3.8/site-packages/paddle/dataset/image.py
|
||||||
|
|
||||||
|
# Adjust the source code to run in Occlum
|
||||||
|
sed -i "186 i \ elif sysstr == 'occlum':\n return True" $CORE_PY
|
||||||
|
sed -ie "37,64d" $IMAGE_PY
|
||||||
|
sed -i "37 i \try:\n import cv2\nexcept ImportError:\n cv2 = None" $IMAGE_PY
|
||||||
|
|
||||||
|
# Download the dataset
|
||||||
|
DATASET=$script_dir/mnist
|
||||||
|
|
||||||
|
[ -d $DATASET ] && exit 0
|
||||||
|
|
||||||
|
TRAIN_IMAGE=train-images-idx3-ubyte.gz
|
||||||
|
TRAIN_LABEL=train-labels-idx1-ubyte.gz
|
||||||
|
TEST_IMAGE=t10k-images-idx3-ubyte.gz
|
||||||
|
TEST_LABEL=t10k-labels-idx1-ubyte.gz
|
||||||
|
URL=http://yann.lecun.com/exdb/mnist
|
||||||
|
|
||||||
|
mkdir $DATASET
|
||||||
|
wget $URL/$TRAIN_IMAGE -P $DATASET
|
||||||
|
wget $URL/$TRAIN_LABEL -P $DATASET
|
||||||
|
wget $URL/$TEST_IMAGE -P $DATASET
|
||||||
|
wget $URL/$TEST_LABEL -P $DATASET
|
19
demos/paddlepaddle/paddlepaddle.yaml
Normal file
19
demos/paddlepaddle/paddlepaddle.yaml
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
includes:
|
||||||
|
- base.yaml
|
||||||
|
targets:
|
||||||
|
- target: /bin
|
||||||
|
createlinks:
|
||||||
|
- src: /opt/python-occlum/bin/python3
|
||||||
|
linkname: python3
|
||||||
|
# python packages
|
||||||
|
- target: /opt
|
||||||
|
copy:
|
||||||
|
- dirs:
|
||||||
|
- ../python-occlum
|
||||||
|
# python code and dataset
|
||||||
|
- target: /
|
||||||
|
copy:
|
||||||
|
- files:
|
||||||
|
- ../demo.py
|
||||||
|
- dirs:
|
||||||
|
- ../mnist
|
27
demos/paddlepaddle/run_paddlepaddle_on_occlum.sh
Executable file
27
demos/paddlepaddle/run_paddlepaddle_on_occlum.sh
Executable file
@ -0,0 +1,27 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
BLUE='\033[1;34m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
script_dir="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
|
||||||
|
python_dir="$script_dir/occlum_instance/image/opt/python-occlum"
|
||||||
|
|
||||||
|
cd occlum_instance && rm -rf image
|
||||||
|
copy_bom -f ../paddlepaddle.yaml --root image --include-dir /opt/occlum/etc/template
|
||||||
|
|
||||||
|
if [ ! -d $python_dir ];then
|
||||||
|
echo "Error: cannot stat '$python_dir' directory"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
new_json="$(jq '.resource_limits.user_space_size = "6000MB" |
|
||||||
|
.resource_limits.kernel_space_heap_size = "256MB" |
|
||||||
|
.resource_limits.max_num_of_threads = 64 |
|
||||||
|
.env.default += ["PYTHONHOME=/opt/python-occlum"]' Occlum.json)" && \
|
||||||
|
echo "${new_json}" > Occlum.json
|
||||||
|
occlum build
|
||||||
|
|
||||||
|
# Run the python demo
|
||||||
|
echo -e "${BLUE}occlum run /bin/python3 demo.py${NC}"
|
||||||
|
occlum run /bin/python3 demo.py
|
Loading…
Reference in New Issue
Block a user