文章介绍
情感分析(Sentiment Analysis)是一种自然语言处理技术(NLP),用于识别给定文本的情感倾向性分析,如正面的、负面的。本文主要介绍一个基于高通Snapdragon Neural Processing Engine SDK和ACL 2020 MobileBERT Transformer模型的文本情绪分析Android应用程序,该应用的所有源代码都可以在https://github.com/quic/qidk/tree/master/Solutions/NLPSolution2-SentimentAnalysis上获得。
使用的模型为:https://huggingface.co/alireza1044/mobilebert_sst2,MobileBERT是BERT_LARGE的精简版,同时具备了bottleneck structures和self-attentions和feed-forward networks.之间精心设计的平衡。在这个应用中,我们将展示如何在Snapdragon上高效地转换、部署和加速MobileBERT-ST2模型,以执行设备对文本的情绪分析。
前置条件
- 高通Snapdragon 安卓手机,推荐Snapdragon 8 Gen 2系列手机
- 在PC上下载并设置好Qualcomm Neural Processing SDK
相关步骤参考https://developer.qualcomm.com/sites/default/files/docs/snpe/setup.html
- Android Studio导入示例项目
- Android NDK “r19c”或“r21e”在Android Studio中构建本地代码
- 一台Linux机器
- Python 3.6、PyTorch 1.10.1、Tensorflow 2.6.2、Transformers 4.18.0、Datasets 2.4.0,用于准备和验证模型
(上面提到的Python软件包版本和Android Studio版本只是一个建议,不是硬性要求。请在Python 3.6虚拟环境中安装SDK依赖项,在本教程的开发过程中,AI SDK推荐Python 3.6版本,可能会随着未来SDK版本的变化而变化。请参阅SDK发行说明。)
操作步骤
1. 生成模型
1.1) 生成MobileBERT-SST2作为Tensorflow Frozen Graph
python scripts/sa_model_gen.py
1.2) 设置Qualcomm Neural Processing SDK环境
source <snpe-sdk-location>/bin/envsetup.sh -t $TENSORFLOW_DIR
1.3) 将生成的frozen graph转换为DLC(Deep Learning Container)
snpe-tensorflow-to-dlc -i frozen_models/mobilebert_sst2.pb -d input_ids 1,128 -d attention_mask 1,128 --out_node Identity -o frozen_models/mobilebert_sst2.dlc
其中“input_ids,attention\ymask”是模型的输入,“Identity”是其输出。
该命令将Tensorflow Frozen Graph转换为DLC格式,DSP、GPU和CPU加速器可以理解该格式以进行推理。DLC将保存在“frozen_models”目录中,名称为mobilebert_st2.DLC。
(如果您使用不同的Tensorflow版本来生成PB文件,则可能是输出层名称发生了更改。请使用Netron查看器或任何其他可视化工具通过可视化图形来检查输出层名称一次)
1.4) DLC的本地资源(用于优化DSP加速器上的模型加载时间)
snpe-dlc-graph-prepare --input_dlc frozen_models/mobilebert_sst2.dlc --use_float_io --htp_archs v73
生成的DLC将保存在frozen_models目录中,名称为mobilebert_st2_cached.DLC。
如果您想跳过以下可选的第2节和第3节的性能评测,那么,可以跳到第4节。直接使用Android Studio构建并运行
2. 模型和DLC验证
2.1) 创建“validation_set”目录并执行以下脚本
mkdir -p validation_set
cd validation_set/
python ../scripts/sst2_gen_dataset.py
该脚本使用Golden Answers从SST2验证数据集中保存871个样本,其中每个输入的序列长度为128
python ../scripts/gen_raw_list.py 871
该脚本生成两个文本文件tf_raw_list.txt和snpe_raw_list.txt,其中包含输入文件的位置,这将有助于运行推理。
2.2) 验证生成的MobileBert-SST2 TF Frozen graph
Usage : python batch_tf_inf.py <Frozen_pb_file_name> <Input_raw_img_list.txt> <Input_layer_name> <Output_layer_name>
python ../scripts/batch_tf_inf.py ../frozen_models/mobilebert_sst2.pb tf_raw_list.txt input_ids:0,attention_mask:0 Identity:0
此脚本在“mobilebert_st2.pb”上运行推理,并将结果存储在tf_out目录中。请仅从validation_set目录运行此推理脚本,因为tf_raw_list.txt包含相对路径。
Usage : python qc_verify_accuracy_pred.py <K-samples> <tf | snpe> <logits_dir>
python ../scripts/get_accuracy_score.py 871 tf tf_out
此脚本评估模型输出并生成F1和EM(Exact Match score)。输出如下:
Accuracy = 90.35591274397244 %
注:这是使用“generate_erepresentative _dataset_squadv2.py”脚本生成的SQUAD-V2数据集的871个样本的结果
2.3) 验证在DSP运行时生成的MobileBert-SST2 DLC
在使用dsp_accuracy_test.json之前,请根据QIDK更改“Devices”值。将QIDK连接到linux机器后,在其上运行“adb devices”也可以找到相同的结果。
python $SNPE_ROOT/benchmarks/snpe_bench.py -c dsp_accuracy_test.json -t android-aarch64 -p burst -z
该命令将在连接的设备上推送DLC、SDK assets和Input artifacts,并在DSP运行时自动运行推理。
adb pull /data/local/tmp/8550snpeSA/dOut/output snpe_dsp_out
此命令将提取snpe_dsp_out目录中的所有推理输出。
tree snpe_dsp_out
snpe_dsp_out/Result_0/Identity:0.raw
snpe_dsp_out/Result_1/Identity:0.raw
...
Usage : python qc_verify_accuracy_pred.py <K-samples> <tf | snpe> <logits_dir>
python ../scripts/get_accuracy_score.py 871 snpe snpe_dsp_out
此脚本评估模型输出并生成准确性分数。输出将与上面提到的TF Frozen graph相同:
Accuracy = 90.35591274397244 %
3. OnDevice性能评测
在使用ondevice_perf_test.json之前,请根据QIDK更改“Devices”值。将QIDK连接到linux机器后,在其上运行“adb devices”也可以找到相同的结果。
python $SNPE_ROOT/benchmarks/snpe_bench.py -c ondevice_perf_test.json -t android-aarch64 -p burst -z
该命令将在连接的设备上推送DLC、SDK assets和Input artifacts,并在DSP、GPU_FP16和CPU运行时自动运行推理。
完成后,基准测试结果将存储在:dOut/results/latest_results/beachmark_stats_dOut.csv
请参阅CSV文件中的“总推断时间”字段,该字段显示模型执行时间(以微秒(us)为单位)
性能结果(越低越好):
DSP_FP16 | CPU_FP32 | |
Inference time (ms) | 13.994 ms | 207.361 ms |
注意:性能可能会根据SDK版本和device meta build而变化。
4. 编译生成APK
4.1) 将AI SDK库和生成的DLC添加到app assets、jniLibs和cmakeLibs目录中
确保已设置SNPE_ROOT env变量
./scripts/fetch_snpe_assets.sh
4.2) 使用Android Studio中打开SentimentAnalysis目录并build project
在打开项目时,Android Studio可能会要求您下载构建AI SDK C++Native API所需的Android NDK。成功完成项目同步和构建过程后,按播放图标在连接的设备上安装并运行应用程序。
如果构建过程因libSNPE.so而失败,则出现重复错误,请将其路径从“jniLibs”更改为“cmakeLibs”,如下所示:在SentimentAnalysis/bert/src/main/cpp/CMakeList.txt中的target_link_libraries开启${CMAKE_CURRENT_SOURCE_DIR}//cmakeLibs/arm64-v8a/libSNPE.so,并注释“jniLibs”目录中的libSNPE.so。
4.3) 手动安装APK
如果Android Studio无法检测到设备,或者设备位于远程位置并将APK复制到当前目录:
cp ./QuestionAnswering/app/build/outputs/apk/debug/app-debug.apk ./sa-app.apk
adb install -r -t sa-app.apk
4.4) 调试提示
安装应用程序后,如果crash,请尝试从QIDK设备收集日志。
要收集日志,请运行以下命令。
- adb logcat-c
- adb logcat>log.txt
- 运行应用程序。一旦应用程序崩溃,请按Ctrl+C来日志收集。
- log.txt将在当前文件夹中生成。
- 搜索关键字“crash”来分析错误。
打开应用程序时,如果未检测到未签名或已签名的DSP运行时,请使用关键字 DSP搜索logcat日志以查找FastRPC错误。由于某些Android版本中的SE Linux安全策略,可能无法检测到DSP运行时。请尝试以下命令来设置允许的SE Linux策略。
- adb disable-verity
- adb reboot
- adb root
- adb remount
- adb shell setenforce 0
- // launch the application
SA应用程序工作流程
以下是基本的Android情绪分析应用程序操作。
- 从下拉菜单中选择所需的运行时(例如,DSP、GPU、CPU)
- 在文本框中键入句子
- 对于键入的每个字母,调用SDK Execute方法来运行推理
- 后处理推理输出并更新UI中的Postive Negative情绪字段
演示视频和性能细节如下所示:
作者:戴忠忠 (Zhongzhong Dai),高通工程师