# AlexNet-TEE **Repository Path**: PaintZero/alexnet-tee ## Basic Information - **Project Name**: AlexNet-TEE - **Description**: Alexnet在TEE中的实现 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 4 - **Forks**: 2 - **Created**: 2021-05-09 - **Last Updated**: 2025-06-24 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AlexNet在TEE中的实现与优化 (Liu Zhuang, frdm@foxmail.com, 2021/05/09) 此分支中所有代码均参考本人的本科毕业论文《面向TrustZone的DNN模型分级隔离策略与性能优化研究》实现 ## 源码目录说明 - ree:REE环境中运行的AlexNet,在ree分支代码的基础上使用了动态模型分割,使其运行过程更接近TEE,从而减少对比时其他因素对模型性能的影响。 - tee:基础的AlexNet安全应用,完整地实现了DNN模型的分级隔离策略,运行效率较差。 - tee-*:在基础AlexNet安全应用的基础上进行优化,其中: 1. 包含pw的文件夹使用了“明文存储权重文件”的优化方法 2. 包含div的文件夹使用了“敏感度分割”的优化方法 3. 包含qtl的文件夹使用了“量化压缩”的优化方法。 4. 包含qtl_all的文件夹尝试了在量化参数的同时也将所有节点量化,但是没有取得优化效果,因此其中的一些bug没有修复,仅能在1MB缓冲区条件下运行 - fdlibm:fdlibm的源文件,用于生成静态编译库libm.a为TEE提供数学函数 - out-tee:存储了编译好的安全应用镜像,以及实验中得到的真实数据 - tools:处理输入图像列表和权重文件需要的一些工具: 1. auto_gen_list用于读取某个数据集文件夹下的图像路径及其标签 2. shuffle_list.py用于打乱输入列表的顺序 3. prepare_tee_images_list.py用于更改输入列表的路径 4. parse_npy.py用于解析npy类型的预训练权重文件,并将其转换为符合本论文规则的二进制文件 5. quantilize_weights.c用于将权重进行二值量化 ## 实验环境配置 ##### 运行环境 - 开发板:Raspberry pi 3 B+ (ARM Cortex A53 * 4,1GB RAM) - REE系统:Linux-for-arm 4.14.56 - TEE系统:OP-TEE 3.8.0 - 模拟器:qemu_v8(在上板验证之前,一般会使用qemu调试程序中的bug) ##### 编译环境 - 主机系统:Ubuntu-18.04,64位,x86_64 - GCC版本:7.5.0 - 交叉编译工具:gcc-arm-aarch64-linux-gnu 8.3.0 ## 编译过程 #### Qemu_v8 1. 从OP-TEE远程仓库拉取qemu版本代码: ```bash $ repo init -u https://github.com/OP-TEE/manifest.git -m qemu_v8.xml $ repo sync $ cd build $ make toolchains $ make run ``` 2. 项目编译完成后,将本文编写的安全应用放在optee-examples文件夹下,然后在build文件夹下重新执行 make run,如无错误即可成功运行。 3. 如果需要把一些数据文件上传至qemu(例如图像数据集),需要对makefile文件做出一些修改,修改方法可以参考https://github.com/FainBleeze/Lenet5_in_OPTEE 项目中readme.md文件最下面的描述 #### 开发板 1. **移植**:参考官方指引https://optee.readthedocs.io/en/latest/building/gits/build.html ,下载相关硬件版本(例如rpi3)的源码,并编译移植到开发板上。如果使用受到官方支持的开发板,移植中遇到困难一般可以在https://github.com/OP-TEE/build 的issue中找到相关的解决方案。 2. 将安全应用放在optee-examples文件夹下,然后在build文件夹下执行: ~~~bash make optee-examples-common ~~~ 即可生成ree客户程序和tee程序的二进制文件。 > (注意:由于OP-TEE版本更新导致的目录变化,有可能需要先执行make optee-client-common,生成库文件,然后将生成的../optee_client/out/export/user/文件夹下的内容移动到../optee_client/out/export/,才能成功编译) 3. 将二进制文件转移到开发板上(目前已知的途径是使用U盘或有线网络),将${UUID}.ta文件复制到开发板中的/lib/optee_armtz/文件夹下,即可运行安全应用 ## 运行方式 本文实现的安全应用在使用方式上可分为两种: 1. 涉及到明文存储参数方法的安全应用:使用以下指令即可直接运行 ~~~bash optee_example_alexnet -input [images_path-label list path] -load [weights file path] -times [inference numbers] -buf_mb [parameter buffer in MB] -buf_kb [parameter buffer in KB] ~~~ 2. 没有使用明文存储参数的安全应用,首先需要上传参数文件,由TEE进行安全加密存储: ~~~bash optee_example_alexnet upload -file [weights file path] -buf_mb [parameter buffer in MB] -buf_kb [parameter buffer in KB] ~~~ 上传完毕以后,即可使用安全应用进行推理: ~~~bash optee_example_alexnet inference -input [images_path-label list path] -times [inference numbers] -buf_mb [parameter buffer in MB] -buf_kb [parameter buffer in KB] ~~~ 注意目前的实现中,两步指定的缓冲区大小必须相同。 ## 实验结果 | IO时间/总耗时(秒) | 0.5Mb | 1.0Mb | 1.5Mb | 2.0Mb | | :---------------: | :-----------: | :-----------: | :-----------: | :--------: | | REE | 0.38/38.42 | 0.40/38.47 | 0.41/38.50 | 0.42/38.49 | | TEE | 679.25/723.89 | 253.08/297.68 | 174.27/218.87 | - | | TEE-pw | 5.33/67.88 | 5.07/67.61 | 4.99/67.55 | 4.94/67.42 | | TEE-qtl | 16.72/58.73 | 10.54/52.56 | 7.93/49.95 | - | | TEE-div | 33.11/75.13 | 14.34/56.37 | 10.65/52.69 | - | | pw-qtl | 0.20/58.96 | 0.17/58.94 | 0.17/58.87 | 0.17/58.89 | | pw-qtl-div | 0.02/58.94 | 0.04/58.93 | 0.05/58.95 | 0.06/58.95 |