diff --git a/examples/demo-apps/android/LlamaDemo/app/src/main/AndroidManifest.xml b/examples/demo-apps/android/LlamaDemo/app/src/main/AndroidManifest.xml index 836c7f7f8be..7096a7d4e76 100644 --- a/examples/demo-apps/android/LlamaDemo/app/src/main/AndroidManifest.xml +++ b/examples/demo-apps/android/LlamaDemo/app/src/main/AndroidManifest.xml @@ -36,6 +36,30 @@ android:name="libcdsprpc.so" android:required="false" /> + + + + + + + + + + + + { + setupBackendSelectorDialog(); + }); modelImageButton.setOnClickListener( view -> { setupModelSelectorDialog(); @@ -104,6 +113,12 @@ private void setupSettings() { if (mModelType != null) { mModelTypeTextView.setText(mModelType.toString()); } + mBackendType = mSettingsFields.getBackendType(); + ETLogging.getInstance().log("mBackendType from settings " + mBackendType); + if (mBackendType != null) { + mBackendTextView.setText(mBackendType.toString()); + setBackendSettingMode(); + } setupParameterSettings(); setupPromptSettings(); @@ -285,6 +300,29 @@ private void showInvalidPromptDialog() { .show(); } + private void setupBackendSelectorDialog() { + // Convert enum to list + List backendTypesList = new ArrayList<>(); + for (BackendType backendType : BackendType.values()) { + backendTypesList.add(backendType.toString()); + } + // Alert dialog builder takes in arr of string instead of list + String[] backendTypes = backendTypesList.toArray(new String[0]); + AlertDialog.Builder backendTypeBuilder = new AlertDialog.Builder(this); + backendTypeBuilder.setTitle("Select backend type"); + backendTypeBuilder.setSingleChoiceItems( + backendTypes, + -1, + (dialog, item) -> { + mBackendTextView.setText(backendTypes[item]); + mBackendType = BackendType.valueOf(backendTypes[item]); + setBackendSettingMode(); + dialog.dismiss(); + }); + + backendTypeBuilder.create().show(); + } + private void setupModelSelectorDialog() { String[] pteFiles = listLocalFile("/data/local/tmp/llama/", ".pte"); AlertDialog.Builder modelPathBuilder = new AlertDialog.Builder(this); @@ -370,6 +408,32 @@ private String getFilenameFromPath(String uriFilePath) { return ""; } + private void setBackendSettingMode() { + if (mBackendType.equals(BackendType.XNNPACK) || mBackendType.equals(BackendType.QUALCOMM)) { + setXNNPACKSettingMode(); + } else if (mBackendType.equals(BackendType.MEDIATEK)) { + setMediaTekSettingMode(); + } + } + + private void setXNNPACKSettingMode() { + requireViewById(R.id.modelLayout).setVisibility(View.VISIBLE); + requireViewById(R.id.tokenizerLayout).setVisibility(View.VISIBLE); + requireViewById(R.id.parametersView).setVisibility(View.VISIBLE); + requireViewById(R.id.temperatureLayout).setVisibility(View.VISIBLE); + mModelFilePath = ""; + mTokenizerFilePath = ""; + } + + private void setMediaTekSettingMode() { + requireViewById(R.id.modelLayout).setVisibility(View.GONE); + requireViewById(R.id.tokenizerLayout).setVisibility(View.GONE); + requireViewById(R.id.parametersView).setVisibility(View.GONE); + requireViewById(R.id.temperatureLayout).setVisibility(View.GONE); + mModelFilePath = "/in/mtk/llama/runner"; + mTokenizerFilePath = "/in/mtk/llama/runner"; + } + private void loadSettings() { Gson gson = new Gson(); String settingsFieldsJSON = mDemoSharedPreferences.getSettings(); @@ -384,6 +448,7 @@ private void saveSettings() { mSettingsFields.saveParameters(mSetTemperature); mSettingsFields.savePrompts(mSystemPrompt, mUserPrompt); mSettingsFields.saveModelType(mModelType); + mSettingsFields.saveBackendType(mBackendType); mDemoSharedPreferences.addSettings(mSettingsFields); } diff --git a/examples/demo-apps/android/LlamaDemo/app/src/main/java/com/example/executorchllamademo/SettingsFields.java b/examples/demo-apps/android/LlamaDemo/app/src/main/java/com/example/executorchllamademo/SettingsFields.java index b71799981b2..3adadf574da 100644 --- a/examples/demo-apps/android/LlamaDemo/app/src/main/java/com/example/executorchllamademo/SettingsFields.java +++ b/examples/demo-apps/android/LlamaDemo/app/src/main/java/com/example/executorchllamademo/SettingsFields.java @@ -30,6 +30,10 @@ public ModelType getModelType() { return modelType; } + public BackendType getBackendType() { + return backendType; + } + public String getUserPrompt() { return userPrompt; } @@ -63,9 +67,11 @@ public boolean getIsLoadModel() { private boolean isClearChatHistory; private boolean isLoadModel; private ModelType modelType; + private BackendType backendType; public SettingsFields() { ModelType DEFAULT_MODEL = ModelType.LLAMA_3; + BackendType DEFAULT_BACKEND = BackendType.XNNPACK; modelFilePath = ""; tokenizerFilePath = ""; @@ -75,6 +81,7 @@ public SettingsFields() { isClearChatHistory = false; isLoadModel = false; modelType = DEFAULT_MODEL; + backendType = DEFAULT_BACKEND; } public SettingsFields(SettingsFields settingsFields) { @@ -86,6 +93,7 @@ public SettingsFields(SettingsFields settingsFields) { this.isClearChatHistory = settingsFields.getIsClearChatHistory(); this.isLoadModel = settingsFields.getIsLoadModel(); this.modelType = settingsFields.modelType; + this.backendType = settingsFields.backendType; } public void saveModelPath(String modelFilePath) { @@ -100,6 +108,10 @@ public void saveModelType(ModelType modelType) { this.modelType = modelType; } + public void saveBackendType(BackendType backendType) { + this.backendType = backendType; + } + public void saveParameters(Double temperature) { this.temperature = temperature; } @@ -126,6 +138,7 @@ public boolean equals(SettingsFields anotherSettingsFields) { && userPrompt.equals(anotherSettingsFields.userPrompt) && isClearChatHistory == anotherSettingsFields.isClearChatHistory && isLoadModel == anotherSettingsFields.isLoadModel - && modelType == anotherSettingsFields.modelType; + && modelType == anotherSettingsFields.modelType + && backendType == anotherSettingsFields.backendType; } } diff --git a/examples/demo-apps/android/LlamaDemo/app/src/main/res/layout/activity_settings.xml b/examples/demo-apps/android/LlamaDemo/app/src/main/res/layout/activity_settings.xml index 7d5c3b1b6df..0ec551ae364 100644 --- a/examples/demo-apps/android/LlamaDemo/app/src/main/res/layout/activity_settings.xml +++ b/examples/demo-apps/android/LlamaDemo/app/src/main/res/layout/activity_settings.xml @@ -28,11 +28,51 @@ android:translationY="5dp" /> + + + + + + + + + +