refactoring: set the default qnn lib search path at CMakeLists.txt by GGML_QNN_DEFAULT_LIB_SEARCH_PATH

This commit is contained in:
hongruichen 2024-07-29 15:51:54 +08:00
parent 5ecbeb5842
commit 6da82947df
5 changed files with 28 additions and 40 deletions

View file

@ -20,13 +20,11 @@ enum QNNBackend {
/** /**
* *
* @param device 0: QNN_BACKEND_CPU 1: QNN_BACKEND_GPU 2: * @param device 0: QNN_BACKEND_CPU 1: QNN_BACKEND_GPU 2:QNN_BACKEND_NPU
* QNN_BACKEND_NPU * @param extend_lib_search_path extened lib search path for searching QNN backend dynamic libs
* @param qnn_lib_path qnn library path, such as "/data/local/tmp/" on
* Android or specified in JNI layer
* @return * @return
*/ */
GGML_API ggml_backend_t ggml_backend_qnn_init(size_t dev_num, const char *qnn_lib_path); GGML_API ggml_backend_t ggml_backend_qnn_init(size_t dev_num, const char *extend_lib_search_path);
GGML_API bool ggml_backend_is_qnn(ggml_backend_t backend); GGML_API bool ggml_backend_is_qnn(ggml_backend_t backend);

View file

@ -889,10 +889,12 @@ if (GGML_QNN)
find_library(LOG_LIB log) find_library(LOG_LIB log)
find_library(ANDROID_LIB android) find_library(ANDROID_LIB android)
set(GGML_EXTRA_LIBS ${GGML_EXTRA_LIBS} ${LOG_LIB} ${ANDROID_LIB}) set(GGML_EXTRA_LIBS ${GGML_EXTRA_LIBS} ${LOG_LIB} ${ANDROID_LIB})
set(GGML_QNN_DEFAULT_LIB_SEARCH_PATH "\"/data/local/tmp/\"")
else() else()
message(FATAL_ERROR "QNN now only available on Android") message(FATAL_ERROR "QNN now only available on Android")
endif() endif()
add_compile_definitions(GGML_QNN_DEFAULT_LIB_SEARCH_PATH=${GGML_QNN_DEFAULT_LIB_SEARCH_PATH})
if (NOT DEFINED GGML_QNN_SDK_PATH) if (NOT DEFINED GGML_QNN_SDK_PATH)
# try read from environment variable # try read from environment variable
if (DEFINED ENV{QNN_SDK_PATH}) if (DEFINED ENV{QNN_SDK_PATH})

View file

@ -319,15 +319,8 @@ static ggml_guid_t ggml_backend_qnn_guid() {
return &guid; return &guid;
} }
static ggml_backend_t ggml_backend_qnn_reg_init(const char *params, void *user_data) { static ggml_backend_t ggml_backend_qnn_reg_init(const char *extend_lib_search_path, void *user_data) {
if (nullptr == params) { ggml_backend_t qnn_backend = ggml_backend_qnn_init((int)(intptr_t)user_data, extend_lib_search_path);
// QNN library path
// can be hardcoded to "/data/local/tmp/" for Android command line application
// or specified in JNI layer for Android APK
params = "/data/local/tmp/";
}
ggml_backend_t qnn_backend = ggml_backend_qnn_init((int)(intptr_t)user_data, params);
return qnn_backend; return qnn_backend;
} }
@ -390,28 +383,25 @@ ggml_backend_buffer_type_t ggml_backend_qnn_buffer_type(size_t device) {
return &ggml_backend_qnn_buffer_types[device]; return &ggml_backend_qnn_buffer_types[device];
} }
/** ggml_backend_t ggml_backend_qnn_init(size_t device, const char *extend_lib_search_path) {
*
* @param device 0: QNN_BACKEND_CPU 1: QNN_BACKEND_GPU 2: QNN_BACKEND_NPU
* @param qnn_lib_path qnn library path, such as "/data/local/tmp/" on Android or specified in JNI layer
* @return
*/
ggml_backend_t ggml_backend_qnn_init(size_t device, const char *qnn_lib_path) {
int result = 0; int result = 0;
if (nullptr == qnn_lib_path) { if (!extend_lib_search_path) {
QNN_LOG_ERROR("invalid qnn lib path\n"); extend_lib_search_path = GGML_QNN_DEFAULT_LIB_SEARCH_PATH;
return nullptr; QNN_LOG_WARN("extend_lib_search_path is nullptr, will use " GGML_QNN_DEFAULT_LIB_SEARCH_PATH " as default");
} }
QNN_LOG_DEBUG("device %d", device); QNN_LOG_DEBUG("device %d", device);
QNN_LOG_DEBUG("qnn_lib_path %s", qnn_lib_path); QNN_LOG_DEBUG("extend_lib_search_path %s", extend_lib_search_path);
if (device >= GGML_QNN_MAX_DEVICES) { if (device >= GGML_QNN_MAX_DEVICES) {
QNN_LOG_ERROR("invalid device %d", device); QNN_LOG_ERROR("invalid device %d", device);
return nullptr; return nullptr;
} }
std::string path = qnn_lib_path; std::string path = extend_lib_search_path;
// TODO: Fix this for other platforms
#if defined(__ANDROID__) || defined(ANDROID)
if (QNN_BACKEND_NPU == device) { if (QNN_BACKEND_NPU == device) {
if (0 == setenv("LD_LIBRARY_PATH", if (0 == setenv("LD_LIBRARY_PATH",
(path + ":/vendor/dsp/cdsp:/vendor/lib64:/vendor/dsp/" (path + ":/vendor/dsp/cdsp:/vendor/lib64:/vendor/dsp/"
@ -438,8 +428,9 @@ ggml_backend_t ggml_backend_qnn_init(size_t device, const char *qnn_lib_path) {
QNN_LOG_ERROR("%s backend setenv failure\n", qnn::get_backend_name(device)); QNN_LOG_ERROR("%s backend setenv failure\n", qnn::get_backend_name(device));
} }
} }
#endif
auto instance = std::make_shared<qnn::qnn_instance>(qnn_lib_path, g_qnn_mgr[device].lib, ""); auto instance = std::make_shared<qnn::qnn_instance>(extend_lib_search_path, g_qnn_mgr[device].lib, "");
result = instance->qnn_init(nullptr); result = instance->qnn_init(nullptr);
if (result != 0) { if (result != 0) {
QNN_LOG_WARN("init qnn subsystem failed with qnn backend %s, pls check why\n", qnn::get_backend_name(device)); QNN_LOG_WARN("init qnn subsystem failed with qnn backend %s, pls check why\n", qnn::get_backend_name(device));

View file

@ -5,7 +5,7 @@
#include <mutex> #include <mutex>
#if (defined __ANDROID__) || (defined ANDROID) #if defined(__ANDROID__) || defined(ANDROID)
#include <android/log.h> #include <android/log.h>
#endif #endif
@ -22,7 +22,7 @@ void qnn::internal_log(ggml_log_level level, const char * /*file*/, const char *
int len_prefix = snprintf(s_qnn_internal_log_buf, QNN_LOGBUF_LEN, "[%s, %d]: ", func, line); int len_prefix = snprintf(s_qnn_internal_log_buf, QNN_LOGBUF_LEN, "[%s, %d]: ", func, line);
int len = vsnprintf(s_qnn_internal_log_buf + len_prefix, QNN_LOGBUF_LEN - len_prefix, format, args); int len = vsnprintf(s_qnn_internal_log_buf + len_prefix, QNN_LOGBUF_LEN - len_prefix, format, args);
if (len < (QNN_LOGBUF_LEN - len_prefix)) { if (len < (QNN_LOGBUF_LEN - len_prefix)) {
#if (defined __ANDROID__) || (defined ANDROID) #if defined(__ANDROID__) || defined(ANDROID)
// for Android APK // for Android APK
__android_log_print(level, "ggml-qnn", "%s\n", s_qnn_internal_log_buf); __android_log_print(level, "ggml-qnn", "%s\n", s_qnn_internal_log_buf);
#endif #endif

View file

@ -16706,18 +16706,15 @@ struct llama_context * llama_new_context_with_model(
} }
} }
#elif defined(GGML_USE_QNN) #elif defined(GGML_USE_QNN)
if (model->n_gpu_layers > 0) { if (model->n_gpu_layers > 0) {
//the second param is data path of prebuit QNN libs provided by Qualcomm ggml_backend_t backend = ggml_backend_qnn_init(model->main_gpu, nullptr);
//can be hardcoded to "/data/local/tmp/" for Android command line application if (nullptr == backend) {
//or specified in JNI layer for Android APK application LLAMA_LOG_ERROR("%s: failed to initialize QNN backend\n", __func__);
ggml_backend_t backend = ggml_backend_qnn_init(model->main_gpu, "/data/local/tmp/"); llama_free(ctx);
if (nullptr == backend) { return nullptr;
LLAMA_LOG_ERROR("%s: failed to initialize QNN backend\n", __func__);
llama_free(ctx);
return nullptr;
}
ctx->backends.push_back(backend);
} }
ctx->backends.push_back(backend);
}
#endif #endif
#ifdef GGML_USE_BLAS #ifdef GGML_USE_BLAS