XiaoMi / StableDiffusionOnDevice

本项目是一个通过文字生成图片的项目,基于开源模型Stable Diffusion V1.5生成可以在手机的CPU和NPU上运行的模型,包括其配套的模型运行框架。
MIT License
63 stars 11 forks source link

小米手机需要root吗? #7

Open zhouwg opened 3 months ago

zhouwg commented 3 months ago

您好,

冒昧打扰您了。

我是一个AI领域的小白,对贵公司的这个开源项目很感兴趣(打算移植到个人AI学习/研究开源项目中)。

昨天半夜下载了这个代码。今天上午在市场上购买的小米14上花了半天(4个小时)测试,目前遇到如下问题:

(1)总是提示无法加载模型

看了下c++代码,发现找不到模型文件与高通库(代码里dump出来的路径如果没有root权限,无法访问)。

adb push libQnnSystem.so /data/user/0/com.xiaomi.stablediffusion/files/ adb: error: stat failed when trying to push to /data/user/0/com.xiaomi.stablediffusion/files/: Permission denied

将C++层代码里的所有模型路径全部改到/sdcard/路径(便于用demo的人用adb上传模型文件),将所有高通库路径改到apk 包名路径/data/data/com.xiaomi.stablediffusion/上(apk上层用代码将高通库从asset目录里拷贝到这个目录即可,无需在native层里调用setenv),才解决这一步。(btw,这些使用高通QNN SDK遇到的坑在使用最新QNN SDK的个人项目里都踩过,已经都解决了)。

(2)无法加载高通库

04-04 13:11:19.056 5404 5450 I KANTV : [makeup_jni.cpp, Java_com_xiaomi_stablediffusion_StableDiffusion_Init, 55]: path:/data/data/com.xiaomi.stablediffusion/ 04-04 13:11:19.056 5404 5450 I KANTV : 04-04 13:11:19.056 5404 5450 I KANTV : 04-04 13:11:19.056 5404 5450 I KANTV : [makeup_jni.cpp, Java_com_xiaomi_stablediffusion_StableDiffusion_Init, 59]: setenv finished 04-04 13:11:19.056 5404 5450 I KANTV : 04-04 13:11:19.056 5404 5450 I KANTV : [makeup_jni.cpp, Java_com_xiaomi_stablediffusion_StableDiffusion_Init, 68]: setenv finished 04-04 13:11:19.056 5404 5450 I KANTV : 04-04 13:11:19.056 5404 5450 I KANTV : [makeup_jni.cpp, Java_com_xiaomi_stablediffusion_StableDiffusion_Init, 74]: path:/data/data/com.xiaomi.stablediffusion/ 04-04 13:11:19.056 5404 5450 I KANTV : 04-04 13:11:19.056 5404 5450 I KANTV : 04-04 13:11:19.056 5404 5450 I KANTV : [QCOMModel.cpp, load, 27]: TextEncoderModel=== , /sdcard/kantv/text_encoder_quantized.serialized.bin 04-04 13:11:19.056 5404 5450 I KANTV : 04-04 13:11:19.057 5404 5450 I KANTV : [QCOMModel.cpp, load, 74]: Model: 04-04 13:11:19.057 5404 5450 I KANTV : 04-04 13:11:19.057 5404 5450 I KANTV : [QCOMModel.cpp, load, 75]: Backend: /data/data/com.xiaomi.stablediffusion/libQnnHtp.so 04-04 13:11:19.057 5404 5450 I KANTV : 04-04 13:11:19.058 5404 5450 I KANTV : [QCOMModel.cpp, load, 96]: initializing QNN Function Pointers: could not load backend:/data/data/com.xiaomi.stablediffusion/libQnnHtp.so ok 04-04 13:11:19.058 5404 5450 I KANTV : 04-04 13:11:19.058 5404 5450 I KANTV : 04-04 13:11:19.059 5404 5450 I KANTV : [QCOMModel.cpp, load, 104]: Error initializing QNN System Function Pointers /data/data/com.xiaomi.stablediffusion/libQnnSystem.so, error Inappropriate ioctl for device 04-04 13:11:19.059 5404 5450 I KANTV : 04-04 13:11:19.059 5404 5450 E KANTV : [makeup_jni.cpp, Java_com_xiaomi_stablediffusion_StableDiffusion_Init, 76]: prompt_solver load failed! 04-04 13:11:19.059 5404 5450 E KANTV : 04-04 13:11:19.059 5404 5450 D Text2GraphActivity$InitThread: [KANTV][com.xiaomi.stablediffusion.Text2GraphActivity$InitThread.java:114,startLoad()] startLoad: 5.通知主线程,此时Init线程加载模型完成-3 04-04 13:11:19.068 5404 5450 E Text2GraphActivity$2: [KANTV][com.xiaomi.stablediffusion.Text2GraphActivity$2.java:357,handleMessage()] SD Init failed

通过diff对比,发现这个工程里附带的高通专门提供的QNN lib与我在高通官网下载的QNN SDK里的lib不一致。

在这个工程的repo issue list里看到别的人已经跑起来了,不知道问题出在哪里?如果方便的话,还请百忙之中指点一下。

谢谢您的时间并致以真诚的感谢。

GainLee commented 3 months ago

https://github.com/XiaoMi/StableDiffusionOnDevice/issues/1

不需要root。8650的适配看来有点问题

zhouwg commented 3 months ago

1

不需要root。8650的适配看来有点问题

谢谢!这些适配的问题如果没有项目维护人的指点,靠项目用户自己一点点摸索,可能有点困难。

btw,贵公司的这个项目中部分如何使用QNN的代码(这些代码在高通公开的资料里看不到)对我一个个人项目帮助很大,跨越了一个block了几天的问题。在此谢谢了。

GainLee commented 3 months ago

1

不需要root。8650的适配看来有点问题

谢谢!这些适配的问题如果没有项目维护人的指点,靠项目用户自己一点点摸索,可能有点困难。

btw,贵公司的这个项目中部分如何使用QNN的代码(这些代码在高通公开的资料里看不到)对我一个个人项目帮助很大,跨越了一个block了几天的问题。在此谢谢了。

哈哈,别误会了,我不是雷总的部下,看到这个repo对于端侧AI的探索做出了不小贡献,刚好我了解一点这块就扫了一眼issues。

QNN的资料是公开的,SDK里面有个sample可以参考

zhouwg commented 3 months ago

1

不需要root。8650的适配看来有点问题

谢谢!这些适配的问题如果没有项目维护人的指点,靠项目用户自己一点点摸索,可能有点困难。 btw,贵公司的这个项目中部分如何使用QNN的代码(这些代码在高通公开的资料里看不到)对我一个个人项目帮助很大,跨越了一个block了几天的问题。在此谢谢了。

哈哈,别误会了,我不是雷总的部下,看到这个repo对于端侧AI的探索做出了不小贡献,刚好我了解一点这块就扫了一眼issues。

QNN的资料是公开的,SDK里面有个sample可以参考

喔。

谢谢。高通官网上下载的QNN SDK sample里的代码看过了。

caofx0418 commented 2 months ago

1

不需要root。8650的适配看来有点问题

谢谢!这些适配的问题如果没有项目维护人的指点,靠项目用户自己一点点摸索,可能有点困难。 btw,贵公司的这个项目中部分如何使用QNN的代码(这些代码在高通公开的资料里看不到)对我一个个人项目帮助很大,跨越了一个block了几天的问题。在此谢谢了。

哈哈,别误会了,我不是雷总的部下,看到这个repo对于端侧AI的探索做出了不小贡献,刚好我了解一点这块就扫了一眼issues。 QNN的资料是公开的,SDK里面有个sample可以参考

喔。

谢谢。高通官网上下载的QNN SDK sample里的代码看过了。

问题已定位,高通接口 二进制不兼容,导致失败。

详细原因:

K70 Pro手机系统版本高,必须使用新的SDK,否则在读取so符号表正确,但进行调用qnn_net->getBackendBuildId()函数指针时错误,从而crash; deviceCreate,参数设置和初始化设备,也会失败。 如下2个重要结构体失败: typedef struct { // 新增函数指针xxx } QNN_INTERFACE_VER_TYPE;

typedef struct { // 新增成员 const char const enableGraphs; /// Used with QNN_CONTEXT_CONFIG_MEMORY_LIMIT_HINT uint64_t memoryLimitHint; /// Used with QNN_CONTEXT_CONFIG_PERSISTENT_BINARY uint8_t isPersistentBinary; /// Used with QNN_CONTEXT_CONFIG_BINARY_COMPATIBILITY QnnContext_BinaryCompatibilityType_t binaryCompatibilityType; }; } QnnContext_Config_t;