Skip to content

Commit 704fb69

Browse files
authored
[Android] Update ERNIE 3.0 Tiny Android deploy demo (#4437)
1 parent 98d311e commit 704fb69

File tree

6 files changed

+86
-73
lines changed

6 files changed

+86
-73
lines changed

model_zoo/ernie-tiny/deploy/android/README.md

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,21 @@
3636
3737

3838
4. 点击 Run 按钮,自动编译 APP 并安装到手机。(该过程会自动下载预编译的 FastDeploy Android 库 以及 模型文件,需要联网)
39-
成功后效果如下,图一:APP 安装到手机;图二: APP 打开后的效果,输入文本后点击"开始分析意图"后即会自动进行意图识别和槽位分析;图三:APP设置选项,点击右上角的设置图片,可以设置不同选项进行体验。
39+
成功后效果如下,图一:APP 安装到手机;图二: APP 打开后的效果,输入文本后点击"开始分析意图"后即会自动进行意图识别和槽位分析;图三:APP 设置选项,点击右上角的设置图片,可以设置不同选项进行体验。
4040

4141
| APP 效果 | APP 演示 | APP设置项 |
4242
| --- | --- | --- |
43-
| <img width="300" height="500" alt="image" src="https://user-images.githubusercontent.com/31974251/210737269-0fe175c9-7b87-40b3-8249-1c6378e4a5e9.jpg"> | <img width="300" height="500" alt="image" src="https://user-images.githubusercontent.com/31974251/210737041-0e79bd6b-90a8-42b0-8f66-97868386d9f3.gif"> | <img width="300" height="500" alt="image" src="https://user-images.githubusercontent.com/31974251/210774693-b199734c-442c-48ef-90ea-4d2e72ff7304.jpg"> |
43+
| <img width="300" height="500" alt="image" src="https://user-images.githubusercontent.com/31974251/210737269-0fe175c9-7b87-40b3-8249-1c6378e4a5e9.jpg"> | <img width="300" height="500" alt="image" src="https://user-images.githubusercontent.com/31974251/211800602-2790c799-0823-4f91-8ce3-7b4a45896b41.gif"> | <img width="300" height="500" alt="image" src="https://user-images.githubusercontent.com/31974251/211800645-bc274593-26a4-4ed0-a258-c0615fcafce1.jpg"> |
44+
45+
5. 点击 APP 右上角的设置选项,可以跳转到设置页。在设置页,您可以选择不同的模型和不同的推理精度,即是否开启 FP16 和 Int8 推理,两种推理精度只能二选一。FP32各模型都支持的,只要设置项中的 FP16 和 Int8 选项都为 false 时,即使用FP32进行推理。各模型FP16和Int8推理的支持情况为:
46+
47+
|模型选项|模型名称|FP16|Int8|
48+
|---|---|---|---|
49+
|models/ernie-tiny|原模型||-|
50+
|models/ernie-tiny-clip|原模型+裁剪(词表+模型宽度)||-|
51+
|models/ernie-tiny-clip-qat|原模型+裁剪(词表+模型宽度)+量化(矩阵乘)|-||
52+
|models/ernie-tiny-clip-qat-embedding-int8|原模型+裁剪(词表+模型宽度)+量化(矩阵乘+Embedding)|-||
53+
4454

4555
## ERNIE Tiny Java SDK 说明和使用
4656

@@ -216,13 +226,13 @@ class TestERNIETiny extends Activity {
216226

217227
## 替换 App 示例中的 ERNIE 3.0 Tiny 模型
218228

219-
替换 App 示例中的模型的步骤非常简单,模型所在的位置为 `app/src/main/assets/models`。替换模型之前请确保您的模型目录中包含 vocab.txt、slots_label.txt、intent_label.txt以及added_token.json 等意图识别和槽位分析所需要的词表和标签文件。替换模型的步骤为:
229+
替换 App 示例中的模型的步骤非常简单,模型所在的位置为 `app/src/main/assets/models`。替换模型之前请确保您的模型目录中包含 vocab.txt、slots_label.txt、intent_label.txt 以及 added_token.json 等意图识别和槽位分析所需要的词表和标签文件。替换模型的步骤为:
220230
- 将您的 ERNIE 3.0 Tiny 模型放在 `app/src/main/assets/models` 目录下;
221231
- 修改 `app/src/main/res/values/strings.xml` 中模型路径的默认值,如:
222232

223233
```xml
224-
<!-- 将这个路径指修改成您的模型,如 models/ernie-tiny -->
225-
<string name="ERNIE_TINY_MODEL_DIR_DEFAULT">models/ernie-tiny</string>
234+
<!-- 将这个路径指修改成您的模型,如 models/ernie-tiny-clip-qat-embedding-int8 -->
235+
<string name="ERNIE_TINY_MODEL_DIR_DEFAULT">models/ernie-tiny-clip-qat-embedding-int8</string>
226236
```
227237

228238
## 关于 ERNIE 3.0 Tiny JNI 的封装

model_zoo/ernie-tiny/deploy/android/app/src/main/java/com/baidu/paddle/paddlenlp/app/ernie_tiny/ERNIETinyMainActivity.java

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import android.support.annotation.Nullable;
1515
import android.support.v4.app.ActivityCompat;
1616
import android.support.v4.content.ContextCompat;
17+
import android.util.Log;
1718
import android.view.View;
1819
import android.widget.Button;
1920
import android.widget.EditText;
@@ -28,8 +29,7 @@
2829

2930

3031
public class ERNIETinyMainActivity extends Activity implements View.OnClickListener {
31-
private static final String TAG = ERNIETinyMainActivity.class.getSimpleName()
32-
+ "[FastDeploy][ERNIE][Java]";
32+
private static final String TAG = ERNIETinyMainActivity.class.getSimpleName();
3333
private ImageView back;
3434
private ImageButton btnSettings;
3535
private EditText etERNIETinyInput;
@@ -179,6 +179,10 @@ public void initSettings() {
179179

180180
public void checkAndUpdateSettings() {
181181
if (ERNIETinySettingsActivity.checkAndUpdateSettings(this)) {
182+
// Clear output text first
183+
etERNIETinyOutput.setText("");
184+
185+
// Update predictor
182186
String realModelDir = getCacheDir() + "/" + ERNIETinySettingsActivity.modelDir;
183187
Utils.copyDirectoryFromAssets(this, ERNIETinySettingsActivity.modelDir, realModelDir);
184188

@@ -191,10 +195,14 @@ public void checkAndUpdateSettings() {
191195
RuntimeOption option = new RuntimeOption();
192196
option.setCpuThreadNum(ERNIETinySettingsActivity.cpuThreadNum);
193197
option.setLitePowerMode(ERNIETinySettingsActivity.cpuPowerMode);
194-
if (Boolean.parseBoolean(ERNIETinySettingsActivity.enableLiteFp16)) {
195-
option.enableLiteFp16();
198+
if (Boolean.parseBoolean(ERNIETinySettingsActivity.enableLiteInt8)) {
199+
option.enableLiteInt8(); // For quantized models
200+
} else {
201+
// Enable FP16 if Int8 option is not ON.
202+
if (Boolean.parseBoolean(ERNIETinySettingsActivity.enableLiteFp16)) {
203+
option.enableLiteFp16();
204+
}
196205
}
197-
// option.enableLiteInt8(); // For quantized models
198206
predictor.init(modelFile, paramsFile, vocabFile, slotLabelsFile,
199207
intentLabelsFile, addedTokensFile, option, 16);
200208
}

model_zoo/ernie-tiny/deploy/android/app/src/main/java/com/baidu/paddle/paddlenlp/app/ernie_tiny/ERNIETinySettingsActivity.java

Lines changed: 21 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -4,38 +4,28 @@
44
import android.content.Context;
55
import android.content.SharedPreferences;
66
import android.os.Bundle;
7-
import android.preference.EditTextPreference;
87
import android.preference.ListPreference;
98
import android.preference.PreferenceManager;
109
import android.support.v7.app.ActionBar;
1110

1211
import com.baidu.paddle.paddlenlp.app.R;
13-
import com.baidu.paddle.paddlenlp.ui.Utils;
1412
import com.baidu.paddle.paddlenlp.ui.view.AppCompatPreferenceActivity;
1513

16-
import java.util.ArrayList;
17-
import java.util.List;
18-
1914

2015
public class ERNIETinySettingsActivity extends AppCompatPreferenceActivity implements
2116
SharedPreferences.OnSharedPreferenceChangeListener {
2217
private static final String TAG = ERNIETinySettingsActivity.class.getSimpleName();
23-
static public int selectedModelIdx = -1;
2418
static public String modelDir = "";
2519
static public int cpuThreadNum = 2;
2620
static public String cpuPowerMode = "";
27-
static public String enableLiteFp16 = "true";
21+
static public String enableLiteFp16 = "false";
22+
static public String enableLiteInt8 = "true";
2823

2924
ListPreference lpChoosePreInstalledModel = null;
30-
EditTextPreference etModelDir = null;
3125
ListPreference lpCPUThreadNum = null;
3226
ListPreference lpCPUPowerMode = null;
3327
ListPreference lpEnableLiteFp16 = null;
34-
35-
List<String> preInstalledModelDirs = null;
36-
List<String> preInstalledCPUThreadNums = null;
37-
List<String> preInstalledCPUPowerModes = null;
38-
List<String> preInstalledEnableLiteFp16s = null;
28+
ListPreference lpEnableLiteInt8 = null;
3929

4030
@Override
4131
public void onCreate(Bundle savedInstanceState) {
@@ -46,75 +36,49 @@ public void onCreate(Bundle savedInstanceState) {
4636
supportActionBar.setDisplayHomeAsUpEnabled(true);
4737
}
4838

49-
// Initialize pre-installed models
50-
preInstalledModelDirs = new ArrayList<String>();
51-
preInstalledCPUThreadNums = new ArrayList<String>();
52-
preInstalledCPUPowerModes = new ArrayList<String>();
53-
preInstalledEnableLiteFp16s = new ArrayList<String>();
54-
preInstalledModelDirs.add(getString(R.string.ERNIE_TINY_MODEL_DIR_DEFAULT));
55-
preInstalledCPUThreadNums.add(getString(R.string.CPU_THREAD_NUM_DEFAULT));
56-
preInstalledCPUPowerModes.add(getString(R.string.CPU_POWER_MODE_DEFAULT));
57-
preInstalledEnableLiteFp16s.add(getString(R.string.ENABLE_LITE_FP16_MODE_DEFAULT));
58-
5939
// Setup UI components
6040
lpChoosePreInstalledModel =
6141
(ListPreference) findPreference(getString(R.string.CHOOSE_PRE_INSTALLED_MODEL_KEY));
62-
String[] preInstalledModelNames = new String[preInstalledModelDirs.size()];
63-
for (int i = 0; i < preInstalledModelDirs.size(); i++) {
64-
preInstalledModelNames[i] = preInstalledModelDirs.get(i).substring(preInstalledModelDirs.get(i).lastIndexOf("/") + 1);
65-
}
66-
lpChoosePreInstalledModel.setEntries(preInstalledModelNames);
67-
lpChoosePreInstalledModel.setEntryValues(preInstalledModelDirs.toArray(new String[preInstalledModelDirs.size()]));
6842
lpCPUThreadNum = (ListPreference) findPreference(getString(R.string.CPU_THREAD_NUM_KEY));
6943
lpCPUPowerMode = (ListPreference) findPreference(getString(R.string.CPU_POWER_MODE_KEY));
70-
etModelDir = (EditTextPreference) findPreference(getString(R.string.MODEL_DIR_KEY));
71-
etModelDir.setTitle("Model dir (SDCard: " + Utils.getSDCardDirectory() + ")");
7244
lpEnableLiteFp16 = (ListPreference) findPreference(getString(R.string.ENABLE_LITE_FP16_MODE_KEY));
45+
lpEnableLiteInt8 = (ListPreference) findPreference(getString(R.string.ENABLE_LITE_INT8_MODE_KEY));
7346
}
7447

7548
@SuppressLint("ApplySharedPref")
7649
private void reloadSettingsAndUpdateUI() {
7750
SharedPreferences sharedPreferences = getPreferenceScreen().getSharedPreferences();
7851

79-
String selected_model_dir = sharedPreferences.getString(getString(R.string.CHOOSE_PRE_INSTALLED_MODEL_KEY),
80-
getString(R.string.ERNIE_TINY_MODEL_DIR_DEFAULT));
81-
int selected_model_idx = lpChoosePreInstalledModel.findIndexOfValue(selected_model_dir);
82-
if (selected_model_idx >= 0 && selected_model_idx < preInstalledModelDirs.size() && selected_model_idx != selectedModelIdx) {
83-
SharedPreferences.Editor editor = sharedPreferences.edit();
84-
editor.putString(getString(R.string.MODEL_DIR_KEY), preInstalledModelDirs.get(selected_model_idx));
85-
editor.putString(getString(R.string.CPU_THREAD_NUM_KEY), preInstalledCPUThreadNums.get(selected_model_idx));
86-
editor.putString(getString(R.string.CPU_POWER_MODE_KEY), preInstalledCPUPowerModes.get(selected_model_idx));
87-
editor.putString(getString(R.string.ENABLE_LITE_FP16_MODE_DEFAULT), preInstalledEnableLiteFp16s.get(selected_model_idx));
88-
editor.commit();
89-
lpChoosePreInstalledModel.setSummary(selected_model_dir);
90-
selectedModelIdx = selected_model_idx;
91-
}
52+
String model_dir = sharedPreferences.getString(getString(R.string.CHOOSE_PRE_INSTALLED_MODEL_KEY),
53+
getString(R.string.CHOOSE_PRE_INSTALLED_MODEL_DEFAULT));
9254

93-
String model_dir = sharedPreferences.getString(getString(R.string.MODEL_DIR_KEY),
94-
getString(R.string.ERNIE_TINY_MODEL_DIR_DEFAULT));
9555
String cpu_thread_num = sharedPreferences.getString(getString(R.string.CPU_THREAD_NUM_KEY),
9656
getString(R.string.CPU_THREAD_NUM_DEFAULT));
9757
String cpu_power_mode = sharedPreferences.getString(getString(R.string.CPU_POWER_MODE_KEY),
9858
getString(R.string.CPU_POWER_MODE_DEFAULT));
9959
String enable_lite_fp16 = sharedPreferences.getString(getString(R.string.ENABLE_LITE_FP16_MODE_KEY),
10060
getString(R.string.ENABLE_LITE_FP16_MODE_DEFAULT));
61+
String enable_lite_int8 = sharedPreferences.getString(getString(R.string.ENABLE_LITE_INT8_MODE_KEY),
62+
getString(R.string.ENABLE_LITE_FP16_MODE_DEFAULT));
10163

102-
etModelDir.setSummary(model_dir);
64+
lpChoosePreInstalledModel.setSummary(model_dir);
65+
lpChoosePreInstalledModel.setValue(model_dir);
10366
lpCPUThreadNum.setValue(cpu_thread_num);
10467
lpCPUThreadNum.setSummary(cpu_thread_num);
10568
lpCPUPowerMode.setValue(cpu_power_mode);
10669
lpCPUPowerMode.setSummary(cpu_power_mode);
10770
lpEnableLiteFp16.setValue(enable_lite_fp16);
10871
lpEnableLiteFp16.setSummary(enable_lite_fp16);
109-
72+
lpEnableLiteInt8.setValue(enable_lite_int8);
73+
lpEnableLiteInt8.setSummary(enable_lite_int8);
11074
}
11175

11276
static boolean checkAndUpdateSettings(Context ctx) {
11377
boolean settingsChanged = false;
11478
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(ctx);
11579

116-
String model_dir = sharedPreferences.getString(ctx.getString(R.string.MODEL_DIR_KEY),
117-
ctx.getString(R.string.ERNIE_TINY_MODEL_DIR_DEFAULT));
80+
String model_dir = sharedPreferences.getString(ctx.getString(R.string.CHOOSE_PRE_INSTALLED_MODEL_KEY),
81+
ctx.getString(R.string.CHOOSE_PRE_INSTALLED_MODEL_DEFAULT));
11882
settingsChanged |= !modelDir.equalsIgnoreCase(model_dir);
11983
modelDir = model_dir;
12084

@@ -133,15 +97,20 @@ static boolean checkAndUpdateSettings(Context ctx) {
13397
settingsChanged |= !enableLiteFp16.equalsIgnoreCase(enable_lite_fp16);
13498
enableLiteFp16 = enable_lite_fp16;
13599

100+
String enable_lite_int8 = sharedPreferences.getString(ctx.getString(R.string.ENABLE_LITE_INT8_MODE_KEY),
101+
ctx.getString(R.string.ENABLE_LITE_INT8_MODE_DEFAULT));
102+
settingsChanged |= !enableLiteInt8.equalsIgnoreCase(enable_lite_int8);
103+
enableLiteInt8 = enable_lite_int8;
104+
136105
return settingsChanged;
137106
}
138107

139108
static void resetSettings() {
140-
selectedModelIdx = -1;
141109
modelDir = "";
142110
cpuThreadNum = 2;
143111
cpuPowerMode = "";
144-
enableLiteFp16 = "true";
112+
enableLiteFp16 = "false";
113+
enableLiteInt8 = "true";
145114
}
146115

147116
@Override
@@ -161,5 +130,4 @@ protected void onPause() {
161130
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
162131
reloadSettingsAndUpdateUI();
163132
}
164-
165133
}

model_zoo/ernie-tiny/deploy/android/app/src/main/res/values/arrays.xml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,25 @@
3636
<item>true</item>
3737
<item>false</item>
3838
</string-array>
39+
<string-array name="enable_lite_int8_mode_entries">
40+
<item>true</item>
41+
<item>false</item>
42+
</string-array>
43+
<string-array name="enable_lite_int8_mode_values">
44+
<item>true</item>
45+
<item>false</item>
46+
</string-array>
47+
<string-array name="preinstalled_models_entries">
48+
<item>models/ernie-tiny</item>
49+
<item>models/ernie-tiny-clip</item>
50+
<item>models/ernie-tiny-clip-qat</item>
51+
<item>models/ernie-tiny-clip-qat-embedding-int8</item>
52+
</string-array>
53+
54+
<string-array name="preinstalled_models_values">
55+
<item>models/ernie-tiny</item>
56+
<item>models/ernie-tiny-clip</item>
57+
<item>models/ernie-tiny-clip-qat</item>
58+
<item>models/ernie-tiny-clip-qat-embedding-int8</item>
59+
</string-array>
3960
</resources>

model_zoo/ernie-tiny/deploy/android/app/src/main/res/values/strings.xml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,19 @@
55
<string name="start_ui_activity">开始使用</string>
66
<!-- Keys for PreferenceScreen -->
77
<string name="CHOOSE_PRE_INSTALLED_MODEL_KEY">CHOOSE_INSTALLED_MODEL_KEY</string>
8-
<string name="MODEL_DIR_KEY">MODEL_DIR_KEY</string>
98
<string name="LABEL_PATH_KEY">LABEL_PATH_KEY</string>
109
<string name="CPU_THREAD_NUM_KEY">CPU_THREAD_NUM_KEY</string>
1110
<string name="CPU_POWER_MODE_KEY">CPU_POWER_MODE_KEY</string>
1211
<string name="SCORE_THRESHOLD_KEY">SCORE_THRESHOLD_KEY</string>
1312
<string name="ENABLE_LITE_FP16_MODE_KEY">ENABLE_LITE_FP16_MODE_KEY</string>
13+
<string name="ENABLE_LITE_INT8_MODE_KEY">ENABLE_LITE_INT8_MODE_KEY</string>
1414
<!-- Common default values ... -->
1515
<string name="CPU_THREAD_NUM_DEFAULT">2</string>
16-
<string name="CPU_POWER_MODE_DEFAULT">LITE_POWER_HIGH</string>
17-
<string name="SCORE_THRESHOLD_DEFAULT">0.4</string>
18-
<string name="ENABLE_LITE_FP16_MODE_DEFAULT">true</string>
16+
<string name="CPU_POWER_MODE_DEFAULT">LITE_POWER _HIGH</string>
17+
<string name="ENABLE_LITE_FP16_MODE_DEFAULT">false</string>
18+
<string name="ENABLE_LITE_INT8_MODE_DEFAULT">true</string>
19+
<string name="CHOOSE_PRE_INSTALLED_MODEL_DEFAULT">models/ernie-tiny-clip-qat-embedding-int8</string>
1920
<!-- ERNIE Tiny values -->
20-
<string name="ERNIE_TINY_MODEL_DIR_DEFAULT">models/ernie-tiny</string>
2121
<string name="ERNIE_TINY_INPUT_TEXTS_HINT">请输入需要分析的文本,如:来一首周华健的花心</string>
2222
<string name="ERNIE_TINY_INPUT_TEXTS_DEFAULT">来一首周华健的花心;播放我们都一样;到信阳市汽车配件城</string>
2323
</resources>

model_zoo/ernie-tiny/deploy/android/app/src/main/res/xml/ernie_tiny_settings.xml

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
<?xml version="1.0" encoding="utf-8"?>
22
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android">
33
<ListPreference
4-
android:defaultValue="@string/ERNIE_TINY_MODEL_DIR_DEFAULT"
4+
android:defaultValue="@string/CHOOSE_PRE_INSTALLED_MODEL_DEFAULT"
55
android:key="@string/CHOOSE_PRE_INSTALLED_MODEL_KEY"
6+
android:entries="@array/preinstalled_models_entries"
7+
android:entryValues="@array/preinstalled_models_values"
68
android:negativeButtonText="@null"
79
android:positiveButtonText="@null"
810
android:title="Choose Pre-Installed Models" />
9-
<EditTextPreference
10-
android:defaultValue="@string/ERNIE_TINY_MODEL_DIR_DEFAULT"
11-
android:key="@string/MODEL_DIR_KEY"
12-
android:title="Model Dir" />
1311
<ListPreference
1412
android:defaultValue="@string/CPU_THREAD_NUM_DEFAULT"
1513
android:entries="@array/cpu_thread_num_entries"
@@ -34,4 +32,12 @@
3432
android:negativeButtonText="@null"
3533
android:positiveButtonText="@null"
3634
android:title="Enable Lite FP16" />
35+
<ListPreference
36+
android:defaultValue="@string/ENABLE_LITE_INT8_MODE_DEFAULT"
37+
android:entries="@array/enable_lite_int8_mode_entries"
38+
android:entryValues="@array/enable_lite_int8_mode_values"
39+
android:key="@string/ENABLE_LITE_INT8_MODE_KEY"
40+
android:negativeButtonText="@null"
41+
android:positiveButtonText="@null"
42+
android:title="Enable Lite Int8" />
3743
</PreferenceScreen>

0 commit comments

Comments
 (0)