情感分析(Sentiment Analysis)是一种自然语言处理技术(NLP),用于识别给定文本的情感倾向性分析,如正面的、负面的。本文主要介绍一个基于高通Snapdragon Neural Processing Engine SDK和ACL 2020 MobileBERT Transformer模型的文本情绪分析Android应用程序,该应用的所有源代码都可以在https://github.com/quic/qidk/tree/master/Solutions/NLPSolution1-QuestionAnswering上获得。
使用的模型为:https://huggingface.co/alireza1044/mobilebert_sst2,MobileBERT是BERT_LARGE的精简版,同时具备了bottleneck structures和self-attentions和feed-forward networks.之间精心设计的平衡。在这个应用中,我们将展示如何在Snapdragon上高效地转换、部署和加速MobileBERT-ST2模型,以执行设备对文本的情绪分析。
相关步骤参考https://developer.qualcomm.com/sites/default/files/docs/snpe/setup.html
(上面提到的Python软件包版本和Android Studio版本只是一个建议,不是硬性要求。请在Python 3.6虚拟环境中安装SDK依赖项,在本教程的开发过程中,AI SDK推荐Python 3.6版本,可能会随着未来SDK版本的变化而变化。请参阅SDK发行说明。)
python scripts/sa_model_gen.py
source
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查看器或任何其他可视化工具通过可视化图形来检查输出层名称一次)
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构建并运行
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,其中包含输入文件的位置,这将有助于运行推理。
Usage : python batch_tf_inf.py
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
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个样本的结果
在使用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
python ../scripts/get_accuracy_score.py 871 snpe snpe_dsp_out
此脚本评估模型输出并生成准确性分数。输出将与上面提到的TF Frozen graph相同:
Accuracy = 90.35591274397244 %
在使用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而变化。
确保已设置SNPE_ROOT env变量
./scripts/fetch_snpe_assets.sh
在打开项目时,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。
如果Android Studio无法检测到设备,或者设备位于远程位置并将APK复制到当前目录:
cp ./QuestionAnswering/app/build/outputs/apk/debug/app-debug.apk ./sa-app.apk
adb install -r -t sa-app.apk
安装应用程序后,如果crash,请尝试从QIDK设备收集日志。
要收集日志,请运行以下命令。
打开应用程序时,如果未检测到未签名或已签名的DSP运行时,请使用关键字 DSP搜索logcat日志以查找FastRPC错误。由于某些Android版本中的SE Linux安全策略,可能无法检测到DSP运行时。请尝试以下命令来设置允许的SE Linux策略。
SA应用程序工作流程
以下是基本的Android情绪分析应用程序操作。
演示视频和性能细节如下所示:
作者:戴忠忠 (Zhongzhong Dai),高通工程师