常见问题
- 模型转换失败怎么办?
常见的模型转换失败原因可以通过查询转换失败错误码来确认具体导失败的原因,Stable Diffusion新推出的模型在转换中可能会遇到算子不支持的问题,可以到华为云管理页面上提交工单来寻求帮助。
- 图片大Shape性能劣化严重怎么办?
在昇腾设备上,可能由于GPU内存墙导致在大shape下遇到性能问题,MindSporeLite提供了Flash Attention编译优化机制,可以考虑升级最新版本的MindSporeLite Convertor来进行编译期的算子优化,在大Shape场景下会有明显的改善。
- 同样功能的PyTorch Pipeline,因为指导要求适配onnx pipeline,两个pipeline本身功能就有差别,如何适配?
由于Diffusers社区的“single model file policy”设计原则,不同的pipeline是不同路径在独立演进的。先确保应用输出符合预期后,再进入到MindSpore Lite模型转换的过程,否则迁移昇腾后还是会遇到同样的问题。
- AOE的自动性能调优使用上完全没有效果怎么办?
在MindSpore Lite Convertor2.1版本之前可能出现的调优不生效的场景,建议直接使用MindSpore Lite Convertor2.1及以后的版本。配置文件指定选项进行AOE调优。使用转换工具配置config参数,具体如下所示,其中“subgraph tuning”表示子图调优,“operator tuning”表示算子调优。
其中,“ge.op_compiler_cache_mode”在该场景下必须设置为“force”,表示该场景下要强制刷新缓存,保证AOE调优后的知识库能够命中,实现模型调优。示例如下:
# config.ini [ascend_context] aoe_mode="subgraph tuning, operator tuning" [acl_init_options] ge.op_compiler_cache_mode="force"
- 迁移后应用出图效果相比GPU无法对齐怎么办?
扩散模型在噪音和随机数上的生成,本身就有一定的随机性,GPU和NPU(Ascend)硬件由于存在一定细小的差别,很难确保完全一致,较难达成生成图片100%匹配,建议通过盲测的方式对效果进行验证。
- 模型精度有问题怎么办?
首先考虑通过FP16的方式进行转换和执行,再通过精度诊断工具来进行分析,更进一步可以到华为云官网上提交工单处理。
- 模型转换失败时如何查看日志和定位原因?
在模型转换的过程,如果出现模型转换失败,可以参考以下步骤查看日志并定位原因:
- 设置DEBUG日志。
- 设置MindSpore日志环境变量。
#shell export GLOG_v=0 # 0-DEBUG、1-INFO、2-WARNING、3-ERROR
- 设置CANN日志环境变量。
#shell export ASCEND_GLOBAL_LOG_LEVEL=1 # 0:表示DEBUG、1:表示INFO、2:表示WARNING、3:表示ERROR 4: 表示NONE export ASCEND_SLOG_PRINT_TO_STDOUT=1 # 表示日志打印
- 设置DUMP模型转换中间图。
- 设置DUMP中间图环境变量。
#shell export DUMP_GE_GRAPH=2 # 1:表示dump图全量内容、 2:表示不dump权重数据的基础图、 3:表示只dump节点关系的精简图 export DUMP_GRAPH_LEVEL=2 # 1:表示dump图所有图、 2:表示dump除子图外的所有图、 3:表示只dump最后一张图
- 问题分析。
- 配置以上的环境变量之后,再重新转换模型,导出对应的日志和dump图进行分析:
- 报错日志中搜到“not support onnx data type”,表示MindSpore暂不支持该算子。
- 报错日志中搜到“Convert graph to om failed”,表示CANN模块进行图编译存在保存,需要结合CANN的报错日志和dump图进行具体分析。
- Stable Diffusion WebUI如何适配?
WebUI一般可以分为前端和后端实现两部分,后端的实现模式种类多样,并且依赖了多个的第三方库,当前在WebUI适配时,并没有特别好的方式。在对后端实现比较理解的情况下,建议针对具体的功能进行Diffusers模块的适配与替换,然后针对替换上去的Diffusers,对其pipeline进行昇腾迁移适配,进而替代原有WebUI的功能。针对很多参数以及三方加速库(如xformers)的适配,当前没有特别好的处理方案。
- LoRA适配流是怎么样的?
因为现在pytorch-npu推理速度比较慢(固定shape比mindir慢4倍),在现在pth-onnx-mindir的模型转换方式下,暂时只能把lora合并到unet主模型内,在每次加载模型前lora特性就被固定了(无法做到pytorch每次推理都可以动态配置的能力)。
目前临时的静态方案可参考sd-scripts, 使用其中的“networks/merge_lora.py”把lora模型合入unet和text-encoder模型。
- 数据类型不匹配问题如何处理?
报错“data type not equal”时,按照堆栈信息,将对应的行数的数据类型修改为匹配的类型。
图1 报错信息
处理该问题时,pipeline_onnx_stable_diffusion_img2img_mslite.py文件的第454行修改如下:
图2 修改内容