mirror of
https://github.com/clearlinux/graphene.git
synced 2026-09-05 21:31:36 +00:00
Supporting these options complicates the design of Graphene and loading
logic significantly, providing little useful functionality:
- loader.exec:
- the main user of it were our tests
- worked only for the first process spawned inside Graphene, as it
was a unidirectional manifest->binary mapping, so the child
process didn't know about the corresponding manifest.
- sgx.sigfile:
- probably all existing usages of it were completely redundant
- was resolved relatively to CWD instead of the executable location,
which made it mostly useless
From now on, the correct location of the files is:
- either place the manifest and sigfile next to the binary, with a
matching name, or
- create a symlink to the binary in the folder where manifests are
stored and launch it through this symlink
178 lines
7.8 KiB
Plaintext
178 lines
7.8 KiB
Plaintext
# PyTorch manifest template
|
|
#
|
|
# This manifest was tested on Ubuntu 16.04 and 18.04.
|
|
|
|
loader.argv0_override = python3
|
|
|
|
# Graphene environment, including the path to the library OS and the debug
|
|
# option (inline/none)
|
|
loader.preload = file:$(GRAPHENEDIR)/Runtime/libsysdb.so
|
|
loader.debug_type = $(GRAPHENEDEBUG)
|
|
|
|
# Read application arguments directly from the command line. Don't use this on production!
|
|
loader.insecure__use_cmdline_argv = 1
|
|
|
|
# Propagate environment variables from the host. Don't use this on production!
|
|
loader.insecure__use_host_env = 1
|
|
|
|
# Overwrite some environment variables
|
|
loader.env.LD_LIBRARY_PATH = /lib:/usr/lib:$(ARCH_LIBDIR):/usr/$(ARCH_LIBDIR)
|
|
|
|
# Default glibc files, mounted from the Runtime directory in GRAPHENEDIR
|
|
fs.mount.lib.type = chroot
|
|
fs.mount.lib.path = /lib
|
|
fs.mount.lib.uri = file:$(GRAPHENEDIR)/Runtime/
|
|
|
|
# More libraries required by PyTorch
|
|
fs.mount.lib2.type = chroot
|
|
fs.mount.lib2.path = $(ARCH_LIBDIR)
|
|
fs.mount.lib2.uri = file:$(ARCH_LIBDIR)
|
|
|
|
fs.mount.usr.type = chroot
|
|
fs.mount.usr.path = /usr
|
|
fs.mount.usr.uri = file:/usr
|
|
|
|
# Host-level directory to NSS files required by Glibc + NSS libs
|
|
fs.mount.etc.type = chroot
|
|
fs.mount.etc.path = /etc
|
|
fs.mount.etc.uri = file:/etc
|
|
|
|
# Workload needs to create temporary files
|
|
fs.mount.tmp.type = chroot
|
|
fs.mount.tmp.path = /tmp
|
|
fs.mount.tmp.uri = file:/tmp
|
|
|
|
# PyTorch loads its pre-trained models from here
|
|
# Uncomment lines below if you want to use torchvision.model.alexnet(pretrained=True)
|
|
# fs.mount.torch.type = chroot
|
|
# fs.mount.torch.path = $(HOME)/.cache/torch
|
|
# fs.mount.torch.uri = file:$(HOME)/.cache/torch
|
|
|
|
# When run as `pip install --user ...`, pip installs Python packages here
|
|
fs.mount.pip.type = chroot
|
|
fs.mount.pip.path = $(HOME)/.local/lib
|
|
fs.mount.pip.uri = file:$(HOME)/.local/lib
|
|
|
|
# SGX general options
|
|
|
|
# Set the virtual memory size of the SGX enclave. For SGX v1, the enclave
|
|
# size must be specified during signing. If the workload needs more virtual memory
|
|
# than the enclave size, Graphene will not be able to allocate it.
|
|
#
|
|
# In particular, libtorch*.so is more than 1G, thus 4G is the minimum to make this run.
|
|
sgx.enclave_size = 4G
|
|
|
|
# Set the maximum number of enclave threads. For SGX v1, the number of enclave
|
|
# TCSes must be specified during signing, so the application cannot use more
|
|
# threads than the number of TCSes. Note that Graphene also creates an internal
|
|
# thread for handling inter-process communication (IPC), and potentially another
|
|
# thread for asynchronous events. Therefore, the actual number of threads that
|
|
# the application can create is (sgx.thread_num - 2).
|
|
#
|
|
# We (somewhat arbitrarily) specify 128 threads for this workload.
|
|
sgx.thread_num = 128
|
|
|
|
# SGX trusted libraries
|
|
|
|
sgx.trusted_files.ld = file:$(GRAPHENEDIR)/Runtime/ld-linux-x86-64.so.2
|
|
sgx.trusted_files.libc = file:$(GRAPHENEDIR)/Runtime/libc.so.6
|
|
sgx.trusted_files.libdl = file:$(GRAPHENEDIR)/Runtime/libdl.so.2
|
|
sgx.trusted_files.libm = file:$(GRAPHENEDIR)/Runtime/libm.so.6
|
|
sgx.trusted_files.libpthread = file:$(GRAPHENEDIR)/Runtime/libpthread.so.0
|
|
sgx.trusted_files.libresolv = file:$(GRAPHENEDIR)/Runtime/libresolv.so.2
|
|
sgx.trusted_files.librt = file:$(GRAPHENEDIR)/Runtime/librt.so.1
|
|
sgx.trusted_files.libutil = file:$(GRAPHENEDIR)/Runtime/libutil.so.1
|
|
sgx.trusted_files.libnssdns = file:$(GRAPHENEDIR)/Runtime/libnss_dns.so.2
|
|
|
|
sgx.trusted_files.libstdc = file:/usr/$(ARCH_LIBDIR)/libstdc++.so.6
|
|
sgx.trusted_files.libgccs = file:$(ARCH_LIBDIR)/libgcc_s.so.1
|
|
sgx.trusted_files.libaptpkg = file:/usr/$(ARCH_LIBDIR)/libapt-pkg.so.5.0
|
|
sgx.trusted_files.liblz4 = file:/usr/$(ARCH_LIBDIR)/liblz4.so.1
|
|
sgx.trusted_files.libsystemd = file:$(ARCH_LIBDIR)/libsystemd.so.0
|
|
sgx.trusted_files.libselinux = file:$(ARCH_LIBDIR)/libselinux.so.1
|
|
sgx.trusted_files.libgcrypt = file:$(ARCH_LIBDIR)/libgcrypt.so.20
|
|
sgx.trusted_files.libpcre = file:$(ARCH_LIBDIR)/libpcre.so.3
|
|
sgx.trusted_files.libgpgerror = file:$(ARCH_LIBDIR)/libgpg-error.so.0
|
|
sgx.trusted_files.libexpat = file:$(ARCH_LIBDIR)/libexpat.so.1
|
|
sgx.trusted_files.libz = file:$(ARCH_LIBDIR)/libz.so.1
|
|
sgx.trusted_files.libz2 = file:$(ARCH_LIBDIR)/libbz2.so.1.0
|
|
sgx.trusted_files.liblzma = file:$(ARCH_LIBDIR)/liblzma.so.5
|
|
sgx.trusted_files.libmpdec = file:/usr/$(ARCH_LIBDIR)/libmpdec.so.2
|
|
|
|
# Ubuntu16.04 sgx.trusted_files.libcrypto = file:$(ARCH_LIBDIR)/libcrypto.so.1.0.0
|
|
# Ubuntu16.04 sgx.trusted_files.libssl = file:$(ARCH_LIBDIR)/libssl.so.1.0.0
|
|
# Ubuntu18.04 sgx.trusted_files.libcrypto = file:/usr/$(ARCH_LIBDIR)/libcrypto.so.1.1
|
|
# Ubuntu18.04 sgx.trusted_files.libssl = file:/usr/$(ARCH_LIBDIR)/libssl.so.1.1
|
|
|
|
# Name Service Switch (NSS) libraries (Glibc dependencies)
|
|
sgx.trusted_files.libnssfiles = file:$(ARCH_LIBDIR)/libnss_files.so.2
|
|
sgx.trusted_files.libnsscompat = file:$(ARCH_LIBDIR)/libnss_compat.so.2
|
|
sgx.trusted_files.libnssnis = file:$(ARCH_LIBDIR)/libnss_nis.so.2
|
|
sgx.trusted_files.libnsl = file:$(ARCH_LIBDIR)/libnsl.so.1
|
|
sgx.trusted_files.libnssmyhostname = file:$(ARCH_LIBDIR)/libnss_myhostname.so.2
|
|
sgx.trusted_files.libnssmdns = file:$(ARCH_LIBDIR)/libnss_mdns4_minimal.so.2
|
|
|
|
# The script to run
|
|
sgx.trusted_files.script = file:pytorchexample.py
|
|
|
|
# required by Python package ctypes (lib/python3.6/lib-dynload/ctypes.cpython-36m-x86_64-linux-gnu.so)
|
|
# Ubuntu18.04 sgx.trusted_files.libffi = file:/usr/$(ARCH_LIBDIR)/libffi.so.6
|
|
|
|
# File containing the classes, i.e., things the classifier has been trained to distinguish between
|
|
sgx.trusted_files.classes = file:classes.txt
|
|
|
|
# Input image
|
|
sgx.trusted_files.image = file:input.jpg
|
|
|
|
# File containing the pre-trained model
|
|
# Uncomment lines below if you want to use torchvision.model.alexnet(pretrained=True)
|
|
# sgx.trusted_files.torch = file:$(HOME)/.cache/torch/checkpoints/alexnet-owt-4df8aa71.pth
|
|
|
|
# Pre-trained model saved as a file
|
|
sgx.trusted_files.model = file:alexnet-pretrained.pt
|
|
|
|
# Scratch space
|
|
sgx.allowed_files.tmp = file:/tmp
|
|
|
|
# The workload needs to fork/execve; this allows it to do so
|
|
sgx.trusted_children.fork = file:python3_child.sig
|
|
|
|
# Various locations where Python dependencies are found
|
|
sgx.allowed_files.python3 = file:/usr/lib/python3
|
|
sgx.allowed_files.pythonhome = file:$(HOME)/.local/lib
|
|
# Ubuntu16.04 sgx.allowed_files.python35 = file:/usr/lib/python3.5
|
|
# Ubuntu18.04 sgx.allowed_files.python36 = file:/usr/lib/python3.6
|
|
# Ubuntu16.04 sgx.allowed_files.python35local = file:/usr/local/lib/python3.5
|
|
# Ubuntu18.04 sgx.allowed_files.python36local = file:/usr/local/lib/python3.6
|
|
|
|
# APT config files
|
|
sgx.allowed_files.aptconfd = file:/etc/apt/apt.conf.d
|
|
sgx.allowed_files.aptconf = file:/etc/apt/apt.conf
|
|
sgx.allowed_files.apport = file:/etc/default/apport
|
|
|
|
# Name Service Switch (NSS) files (Glibc reads these files)
|
|
sgx.allowed_files.nsswitch = file:/etc/nsswitch.conf
|
|
sgx.allowed_files.group = file:/etc/group
|
|
sgx.allowed_files.passwd = file:/etc/passwd
|
|
|
|
# DNS hostname resolution files (Glibc reads these files)
|
|
sgx.allowed_files.hostconf = file:/etc/host.conf
|
|
sgx.allowed_files.hosts = file:/etc/hosts
|
|
sgx.allowed_files.gaiconf = file:/etc/gai.conf
|
|
sgx.allowed_files.resolv = file:/etc/resolv.conf
|
|
|
|
# System's file system table
|
|
sgx.allowed_files.fstab = file:/etc/fstab
|
|
|
|
# Graphene optionally provides patched OpenMP runtime library that runs faster
|
|
# inside SGX enclaves (execute `make -C LibOS gcc` to generate it). Uncomment
|
|
# the lines below to use the patched library. PyTorch's SGX perf overhead
|
|
# decreases on some workloads from 25% to 8% with this patched library. Note
|
|
# that we need to preload the library because PyTorch's distribution renames
|
|
# libgomp.so to smth like libgomp-7c85b1e2.so.1, so it's not just a matter of
|
|
# searching in the Graphene's Runtime path first, but a matter of intercepting
|
|
# OpenMP functions.
|
|
|
|
# loader.env.LD_PRELOAD = /lib/libgomp.so.1
|
|
# sgx.trusted_files.libgomp = file:$(GRAPHENEDIR)/Runtime/libgomp.so.1
|