Kneron AI-KL730

您好,

我的KL730设备按照Leipzig_SDK_Multimedia_Framework_Programming_Guide.pdf和Leipzig_SDK_Examples_User_Guide.pdf已经驱动成USB AI设备,当我利用 kneron plus接口按照开发流程https://doc.kneron.com/docs/#plus_c/feature_guide/customized_api/create_kl730_single_model_example/

创建KL730单一模型示例,此示例需要kp_firmware.tar,models_730.nef,pic.bmp图片,

kp_firmware.tar我在未修改sdk1.0前提下进入vmf_nnm模块执行build.sh进行编译得出,

models_730.nef 由 kneron plus给出,是YoloV5s_640_640_3类型,

pic.bmp则是我想进行推理的图片,

当一切准备就绪之后,我在windows安装好环境进行推理,执行结果是完全没有问题的,如下

但当我从Kneron AI开发中https://doc.kneron.com/docs/#model_training/OpenMMLab/YoloX/按照流程经历千辛万苦之后编译出所需的模型文件models_730.nfe对以上模型文件进行替换再次推理,则发生了如下,根据头文件宏定义错误码为KP_ERROR_USB_TIMEOUT_N7 = -7,

以及arm板端报错日志如下

我初步怀疑是我编译出来的YOLOX模型与创建KL730单一模型示例图像格式不匹配?

但在我编译YoxoX模型时,在进行量化的时候我有更改过图像维度顺序,如下

# 转换维度顺序为 NCHW

  img_data = img_data.transpose(2, 0, 1) # 从 HWC 转为 CHW

  img_data = np.expand_dims(img_data, axis=0) # 添加 batch 维度 → (1, 3, 1600, 1600)

   img_list.append(img_data)

bie_model_path = km.analysis({"input": img_list})

我怀疑使用自编出来的YOLOX模型作为目标模型推理出错在此处,问题有些复杂,但希望能得到您的指导😀

Comments

  • 您好,

    不好意思回覆晚了,因為error code -7可能源於各種原因,我們會需要先確認模型沒有問題,然後再復現error和確認code,可以請您提供以下的資訊嗎? 謝謝您!

    -NEF model

    -Onnx model (確認有沒有不支持的operators)

    -firmware.tar

    -Kneron PLUS的code


    如果是用自己的model + 未修改的firmware + Kneron PLUS single model example很有可能會出現error (firmware有可能需要修改),所以建議您先用自己的model + 未修改的firmware + Kneron PLUS kl730_demo_generic_image_inference跑看看會不會成功喔

  • 您好,

    我按照您的回复将给你提供所需的文件,以及我的操作过程。

    1、我从 wget https://github.com/kneron/Model_Zoo/raw/main/mmdetection/yolox_s/latest.zip下载的预训练YOLOX pytorch(.pth文件)模型,经过https://doc.kneron.com/docs/#model_training/OpenMMLab/YoloX/ Step 3: Export onnx,步骤三后转成了 .onnx 模型文件,如下latest.zip。

    经我使用Netron工具查看该模型结构包含的operators,KL730完全支持。

    后我按https://doc.kneron.com/docs/#model_training/OpenMMLab/YoloX/ 全部步骤转为 .nef 文件,文件如下。

    2、以下是我未经过修改的firmware.tar

    3、以下是我使用的 single model example

    我自己总结:

    为了验证模型是否有问题,我使用了两种方法,

    1、推理预训练 .pth文件,使过 inference_detector 函数进行过推理,关键步骤如下,

    from mmdet.apis import inference_detector

    result = inference_detector(model, user_img_path)

    show_result_pyplot(model, user_img_path, result, score_thr = 0.9, out_file=output_file)

    得出结果以证明pth模型没有问题

    2、推理 pth->onnx->nef 转换成功的 nef 文件,使用 e2e模拟硬件推理 ktc.kneron_inference函数,结果如下图。

    您给出的猜测:

    1、自己的model + 未修改的firmware + Kneron PLUS single model example很有可能會出現error (firmware有可能需要修改),

    如果已经证明了我的model没有问题,现在的难点就是修改我的plus mode + firmware,我不知道如何修改以适配我的 model?

    2、建議您先用自己的model + 未修改的firmware + Kneron PLUS kl730_demo_generic_image_inference跑看看會不會成功,

    经测试也会出现error = -7的错误码

    经过以上问题,我初步得预训练的 pytorch模型(.pth)文件是没有问题的,只是经pth->onnx->bie->nef转换步骤得出的.nef文件,如我以上总结的验证步骤无错,nef文件已无问题,只是如何修改 plus接口或则 firmware以适配我的 model ,或如何修改的我 model 以适配我的 firmware成为我的难点,希望能得到您的解答,谢谢。

  • 您好,能回答一下我最新的问题嘛,谢谢

  • 您好,

    我也有轉換您的onnx模型,雖然可以成功轉換成nef模型,跑KL730 generic inference卻也會失敗 (這個generic inference,用任何nef模型應該都要成功)。我認為可能是因為您之前說過的"编译出来的YOLOX模型与创建KL730单一模型示例图像格式不匹配",因為模型訓練和轉換時的圖像格式和大小(preprocess)都要是一樣的,可以請您都用一樣的格式再轉換看看嗎? 謝謝!

  • 您好,

    回答您最新的問題: 雖然nef model看起來沒有問題,但是KL730 generic inference應該要可以跑,但是會失敗。

    YoloX當時是給KL720的範例,而且是Kneron PLUS 1.x的時候的文檔,目前沒有人在維護,那時候還沒有KL730。現在的Pytorch版本也一直在更新,導致model架構可能也不一樣,所以有很高的機率會出現問題。

  • 谢谢您的解答,这和我认知的一样,在等待你回复期间,我已经在着手改动 kp_firmware.tar 的 preprocess 配置以及处理模块了(还未改动完成)。

    结合你的回答,我可能明白我失败的原因在哪里,我在使用预训练的模型文件 .pth 转换成 onnx 格式文件时候,我是用的是

    git clone https://github.com/kneron/kneron-mmdetection

    cd kneron-mmdetection

    python tools/deployment/pytorch2onnx_kneron.py configs/my_custom_config.py work_dirs/my_custom_config/latest.pth --output-file work_dirs/latest.onnx --skip-postprocess --shape 640 640

    这个脚本转换出的 onnx 文件已经把输入形状 input 定制成 NCHW(1x3x640x640),我用Netron查看,结果亦是如此,看下图。

    所以导致我的后续处理 模型转换(onnx->nef)、模型测试(kneron_inference) 图像输入要求都要按照NCHW格式,虽然在代码端得以验证.nef模型完全没有问题,但是配合上 kp_firmware 端,其pre_proc_config、pre_proc_func是置空状态(如下图),我不知道它的默认处理是怎么样的,但从推断失败的结果来说,应该是和模型格式匹配不上的。


    以下修改想法:

    1、从模型端修改(修改pytorch2onnx_kneron.py ),以适配firmware端preprocess。

    2、从firmware端修改,以适配模型端的preprocess(正在改动)。

    问题:

    1、修改pytorch2onnx_kneron.py改变input_shape是否能通过传入参数修改,或是修改其中代码?

    2、以上我提到kp_firmware 端其pre_proc_config、pre_proc_func是留空状态,我该怎么修改input_shape以适配它?

    3、上面您提到有转换我的onnx模型,我猜您说的是我提供的 .pth文件(pytorch模型文件),您从 .pth 转换到 .onnx 是怎样的呢,后续转换 .nef 途中量化analysis的输入图片不需要进行维度和大小转换吗?

  • edited March 26

    是的,此提示提供的mmdet版本过低,以至于我降了好几次pytorch、cuda、cudnn、mmcv版本才得以运行,那我还该继续执行下去吗。如果我跳出此示例,后续我训练得出的各模型文件(pytorch、tensorflow/lite、caffe、keras)其一,在kneron/toolchain:latest工具链中/workspace/libs/ONNX_Convertor/转换工具都是可以转换的吗?或则你能给我一下提议吗,我想做730自定义物体识别的AI模型程序。

  • edited March 26

    您好,

    不好意思,我們找到原因了! 因為在Kneron Toolchain轉換模型時,會自動將input format設定成1W16C8B,所以您的model input format是1W16C8B:

    一般的input format是4W4C8B,而1W16C8B也可以支援,但是現在的firmware裡的"將輸入檔案轉換成1W16C8B format"的部分有點壞了,所以才會有error。

    (Update: Input layout format的詳細資訊,請參考 Supported NPU Data Layout Format (KL520, KL720 and KL630) - Document Center)

    目前,Toolchain還沒有手動設定input的方法,然後我們正在看firmware的問題。現在的替代方法,會需要請您用kl730_demo_generic_data_inference,這個example會先在host端轉換輸入檔案成1W16C8B format,然後再將這個轉換後的input直接送到firmware裡面去做inference:

    至於要如何改KL730的firmware,這個連結有範例,您可以將剛剛的轉換format的放在PLUS端: Create Single Model Example for KL730 - Document Center

  • 您好,

    關於這些問題:

    1 問題是因為toolchain轉換的過程會自動將input format設定成1W16C8B,所以pytorch2onnx_kneron.py不用修改喔。

    2 現在,因為firmware的preprocess有出現問題,所以pre_proc_config和pre_proc_func可以是空白的,不用填。

    3 您提供的latest.zip裡面,有一個latest.onnx檔案,我是用這個檔案在toolchain轉換模型的。量化的km.analysis的輸入圖片,有進行維度和大小轉換。可以麻煩您提供轉換模型時用的完整的Python script嗎? 謝謝!

  • 您好,

    用onnx_convertor轉換工具來轉換pytorch等的模型成onnx,應該是可行的: 3. Floating-Point Model Preparation - Document Center

    如果會失敗的話,可以試著在Kneron Toolchain (docker)裡用指令"conda activate base"來切換環境。

    關於修改KL730的fimware,可能會需要請您詢問您的技術窗口,他們對KL730的firmware比較熟悉,謝謝!

  • 感谢你以上的回答,对我非常有用!结合您给的提示,我用plus接口输出了两个模型文件的详细信息,输出文件如下。

    SDK提供的.nef模型文件详细信息:

    使用预训练.pth(pytorch模型文件)转换成.nef模型文件详细信息:

    经我比对,主要区别有:

    1、输出、输出节点数

    2、节点 名称

    2、节点 NPU内存布局=您说的input format

    3、节点 npu形状 BxCxHxW

    但我有了以下问题:

    如我按照https://doc.kneron.com/docs/#model_training/OpenMMLab/YoloX/示例流程执行。

    1、在我训练以及转换模型过程中,如果修改决定它的 输入/输出节点数量、以及它们的名称、NPU内存布局、NPU形状等信息。

    2、我是否能根据https://doc.kneron.com/docs/#toolchain/manual_3_onnx/ 7、ONNX Editor 或 https://doc.kneron.com/docs/#toolchain/appendix/converters/ 7、Model Editor来 修改模型节点。

  • 您好,

    那個文檔用的toolchain是比較舊的版本。用最新的toolchain版本修改模型的話,如果opset是11或12,可以在base環境使用ONNX editor。如果是opset 13到18,可以在onnx1.13環境使用onnx.utils.extract_model (https://onnx.ai/onnx/api/utils.html)。

Sign In or Register to comment.