from rknn.api import RKNN import numpy as np import os import argparse argparse = argparse.ArgumentParser() argparse.add_argument('--path', type=str, default='./onnx/qwen2_5-vl-3b_vision.onnx', help='model path', required=False) argparse.add_argument('--model_name', type=str, default='qwen2_5-vl-3b', help='model name', required=False) argparse.add_argument('--target-platform', type=str, default='rk3588', help='target platform', required=False) argparse.add_argument('--batch_size', type=int, default=1, help='batch size', required=False) argparse.add_argument('--height', type=int, default=448, help='image height', required=False) argparse.add_argument('--width', type=int, default=448, help='image width', required=False) args = argparse.parse_args() model_path = args.path target_platform = args.target_platform modelname = args.model_name if 'qwen2' in model_path.lower(): mean_value = [[0.48145466 * 255, 0.4578275 * 255, 0.40821073 * 255]] std_value = [[0.26862954 * 255, 0.26130258 * 255, 0.27577711 * 255]] elif 'internvl3' in model_path.lower(): mean_value = [[0.485 * 255, 0.456 * 255, 0.406 * 255]] std_value = [[0.229 * 255, 0.224 * 255, 0.225 * 255]] else: mean_value = [[0.5 * 255, 0.5 * 255, 0.5 * 255]] std_value = [[0.5 * 255, 0.5 * 255, 0.5 * 255]] if modelname == 'qwen2_5-vl-3b': inputs = ['pixel', 'grid_thw'] input_size_list = [[args.batch_size, 3, args.height, args.width], [1,3]] grid_t = args.batch_size//2 if args.batch_size % 2 == 0 else (args.batch_size + 1)//2 input_initial_val = [None, np.array([[grid_t, args.height//14, args.width//14]], dtype=np.int64)] op_target = {"/vpm/patch_embed/proj/Conv_output_0_conv_tp_sw": 'cpu'} elif modelname == 'qwen3-vl': inputs = ['pixel', 'grid_thw'] input_size_list = [[args.batch_size, 3, args.height, args.width], [1,3]] grid_t = args.batch_size//2 if args.batch_size % 2 == 0 else (args.batch_size + 1)//2 input_initial_val = [None, np.array([[grid_t, args.height//16, args.width//16]], dtype=np.int64)] op_target = None else: inputs = ['pixel'] input_size_list = [[args.batch_size, 3, args.height, args.width]] input_initial_val = None op_target = None if modelname == 'deepseekocr': disable_rules=['convert_rs_add_rs_to_rs_gather_elements'] else: disable_rules=[] rknn = RKNN(verbose=False) rknn.config(disable_rules=disable_rules, target_platform=target_platform, mean_values=mean_value, std_values=std_value, op_target=op_target) rknn.load_onnx(model_path, inputs=inputs, input_size_list=input_size_list, input_initial_val=input_initial_val) rknn.build(do_quantization=False, dataset=None) os.makedirs("rknn", exist_ok=True) rknn.export_rknn("./rknn/" + os.path.splitext(os.path.basename(model_path))[0] + "_{}.rknn".format(target_platform))