ebitengine / purego

Apache License 2.0
1.95k stars 63 forks source link

Microchip Micro 3588 rknn_ Npu2 problem #186

Open corner4world opened 6 months ago

corner4world commented 6 months ago

I am using Purego to call Microchip Micro 3588 rknn_ Npu2, after registering the corresponding function, use rknn_query function returns an error in uint32 when querying model input:

Expected: Model input num: 1, output num: 1

Result: Model input num: 508, output num: 4294967295

The code is as follows: package main

import ( "fmt" "github.com/ebitengine/purego" "io" "os" "unsafe" )

func openLibrary(name string) (uintptr, error) { return purego.Dlopen(name, purego.RTLD_NOW|purego.RTLD_GLOBAL) }

func load_model(model_path string) (model []byte, model_len int64, err error) { file, err := os.Open(model_path) if err != nil { panic(err) }

defer file.Close()

model_len, err = file.Seek(0, io.SeekEnd)
if err != nil {
    panic(err)
}

file.Seek(0, io.SeekStart)

buf := make([]byte, model_len)
file.Read(buf)

return buf, model_len, err

}

func main() { var ctx rknn_context librknn, err := openLibrary("/userdata/rknpu2/runtime/RK3588/Linux/librknn_api/aarch64/librknn_api.so") if err != nil { panic(err) }

var rknn_init func(*rknn_context, []byte, int64, uint32, uint8) int
purego.RegisterLibFunc(&rknn_init, librknn, "rknn_init")

var rknn_query func(*rknn_context, rknn_query_cmd, unsafe.Pointer, uintptr) int
purego.RegisterLibFunc(&rknn_query, librknn, "rknn_query")

model, model_len, err := load_model("/userdata/rknpu2/examples/rknn_api_demo/model/RK3588/mobilenet_v1.rknn")
if err != nil {
    panic(err)
}

ret := rknn_init(&ctx, model, model_len, 0, 0)
if ret < 0 {
    fmt.Printf("rknn_init fail! ret=%d\n", ret)
}

var version rknn_sdk_version
fmt.Printf("rknn RKNN_QUERY_SDK_VERSION=%d\n", RKNN_QUERY_SDK_VERSION)
ret = rknn_query(&ctx, RKNN_QUERY_SDK_VERSION, unsafe.Pointer(&version), uintptr(unsafe.Sizeof(version)))
if ret != RKNN_SUCC {
    fmt.Printf("rknn_query fail! ret=%d\n", ret)
}

fmt.Printf("rknn_api/rknnrt version: %s, driver version: %s\n", string(version.api_version[:]), string(version.drv_version[:]))
fmt.Println("rknn_input_output_num:")

fmt.Printf("rknn RKNN_QUERY_IN_OUT_NUM=%d\n", RKNN_QUERY_IN_OUT_NUM)
io_num := rknn_input_output_num{0, 0}
fmt.Printf("nsafe.Sizeof(io_num): %d\n", uint32(unsafe.Sizeof(io_num)))
fmt.Printf("model input num: %d, output num: %d\n", io_num.n_input, io_num.n_output)
ret = rknn_query(&ctx, RKNN_QUERY_IN_OUT_NUM, unsafe.Pointer(&io_num), uintptr(unsafe.Sizeof(io_num)))
if ret != RKNN_SUCC {
    fmt.Printf("rknn_query fail! ret=%d\n", ret)
}
fmt.Printf("model input num: %d, output num: %d\n", io_num.n_input, io_num.n_output)

}

corner4world commented 6 months ago

https://github.com/rockchip-linux/rknpu2

TotallyGamerJet commented 6 months ago

You linked an unmaintained project. Also it looks like the function you are calling returns an int32 not a uint32. https://github.com/airockchip/rknn-toolkit2/blob/b25dadacc24b88eb7dfcaa47c9c525ecca89b319/rknpu2/examples/rknn_yolov5_android_apk_demo/app/src/main/cpp/rknn_api.h#L460 int in C is 32bit signed not unsigned. Using int in Go for this is not correct. Use int32

corner4world commented 6 months ago

rknn_query The return value only proves that the execution was successful. A pointer was passed in the parameter, and the function changed the value of the pointer, which is also required by the program. The function was executed twice, with the first execution result being correct and the second failure to obtain the correct io_num

TotallyGamerJet commented 6 months ago

@corner4world is this still happening with the latest commit?

corner4world commented 6 months ago

@corner4world is this still happening with the latest commit?

Hello, I am using v0.5.1image @TotallyGamerJet

TotallyGamerJet commented 6 months ago

Are you saying it's still happening? If so, can you try the latest commit? https://github.com/ebitengine/purego/commit/33b97fd6a58bb9b0a49975db60adc78b4619047e

corner4world commented 6 months ago

Yes, it's not the expected outcome either

image

This is my project code: rknn.zip @TotallyGamerJet