0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

瑞芯微(EASY EAI)RV1126B 模型转换API说明

广州灵眸科技有限公司 2026-05-14 14:35 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

1. RKLLM 初始化

在这一部分,用户需要先初始化 RKLLM 对象,这是整个工作流的第一步。在示例代码中使用 RKLLM()构造函数来初始化 RKLLM 对象。

2. 模型加载


在 RKLLM 初始化完成后,用户需要调用 rkllm.load_huggingface()函数来传入模型的具体路径,RKLLM-Toolkit 即可根据对应路径顺利加载 Hugging Face 或 GGUF 格式的大语言模型,从而顺利完成后续的转换、量化操作,具体的函数定义如下:

v2-d0579821f6c0ba4e5773ca3d6794443f_720w.webp

示例代码如下:

ret = rkllm.load_huggingface( model = './huggingface_model_dir', model_lora = './huggingface_lora_model_dir' ) if ret != 0: print('Load model failed!')

v2-2217a42edf1f702893a0a9a36e3cd614_720w.webp


示例代码如下:

ret = rkllm.load_gguf(model = './model-Q4_0.gguf') if ret != 0: print('Load model failed!')


3. 模型构建


用户在通过rkllm.load_huggingface()函数完成原始模型的加载后,下一步就是通过rkllm.build()函数实现对 RKLLM 模型的构建。构建模型时,用户可以选择是否进行量化,量化有助于减小模型的大小和提高在 Rockchip NPU 上的推理性能。rkllm.build()函数的具体定义如下:

v2-77e1474110497058eb4aeff6d8a149ac_720w.webp


示例代码如下:

ret = rkllm.build( do_quantization=True, optimization_level=1, quantized_dtype='w8a8', quantized_algorithm="normal", num_npu_core=3, extra_qparams=None, dataset="quant_data.json", hybrid_rate=0, target_platform='rk3588') if ret != 0: print('Build model failed!')


4. 模型导出


用户在通过 rkllm.build()函数构建了 RKLLM 模型后,可以通过 rkllm.export_rkllm()函数将RKNN 模型保存为一个.rkllm 文件,以便后续模型的部署。rkllm.export_rkllm()函数的具体参数定义如下:

v2-70c7eb3b03e691c00ec1f0e122a60856_720w.webp

示例代码如下:

ret = rkllm.export_rkllm(export_path = './model.rkllm') if ret != 0: print('Export model failed!')


5. GPTQ 模型转换
用户除了使用上述工具中提供的量化算法进行模型转换,也可以先使用 AutoGPTQ 开源量化工具将浮点模型量化为 4bit/8bit 权重(需保存为 Hugging Face 格式),再转换为RKLLM 模型。使用 AutoGPTQ 量化浮点模型时,需确保以下参数设置:

bits=4 sym=true group_size=32/64/128 desc_act=false bits=8 sym=true group_size=128/256/512 desc_act=false


Hugging Face 格式的 GPTQ 模型转换为 rkllm 的示例代码如下:

modelpath = '/path/to/Model-Instruct-GPTQ-Int4' llm = RKLLM() ret = llm.load_huggingface(model=modelpath, model_lora = None, device='cuda') if ret != 0: print('Load model failed!') exit(ret) # Build model dataset = None qparams = None target_platform = "RK3576" optimization_level = 1 quantized_dtype = "w4a16_g32" #w4a16_g64 or w4a16_g128 quantized_algorithm = "normal" num_npu_core = 2 ret = llm.build(do_quantization=True, optimization_level=optimization_level, quantized_dtype=quantized_dtype, quantized_algorithm=quantized_algorithm, target_platform=target_platform, num_npu_core=num_npu_core, extra_qparams=qparams, dataset=dataset) if ret != 0: print('Build model failed!') exit(ret) # Export rkllm model ret = llm.export_rkllm(f"./{os.path.basename(modelpath)}_{quantized_dtype}_{ target_platform}.rkllm") if ret != 0: print('Export model failed!') exit(ret)


6. 自定义模型转换


用户如果修改了模型结构或者名称,且修改后的整体架构如下,则可以使用自定义功能转换模型。

TOKEN_EMBD ↓ embd_scale(optional) ↓ ┌─ x │ ↓ │ ATTN_NORM │ ↓ │ attn │ ↓ │ ATTN_POST_NORM(optional) │ ↓ │ hidden_state_scale(optional) │ ↓ │ cross attn(optional) │ ↓ ┌─ └► + │ │ ↓ │ FFN_NORM │ ↓ │ MLP │ ↓ │ FFN_POST_NORM(optional) │ ↓ │ hidden_state_scale(optional) │ ↓ └───► + ...↓ OUTPUT_NORM ↓ lm_head_scale(optional) ↓ OUTPUT


以 Qwen 模型为例,将 Qwen 模型文件 modeling_qwen.py 中相应的变量名称填入自定义配置文件中,如下所示:

{ "BLOCKNAME": "QWenBlock", "TOKEN_EMBD": "wte", "ATTN_NORM": "ln_1", "ATTN_Q_NORM": "", "ATTN_K_NORM": "", "CROSS_ATTN_NORM": "", "CROSS_ATTN_Q": "", "ATTN_Q": "", "ATTN_K": "", "ATTN_V": "", "ATTN_QKV": "attn.c_attn", "ATTN_KV": "", "KV_CONTINUOUS": "true", "ATTN_OUT": "attn.c_proj", "CROSS_ATTN_OUT": "", "ATTN_POST_NORM": "", "FFN_NORM": "ln_2", "FFN_UP": "mlp.w1", "FFN_GATE": "mlp.w2", "ACT_TYPE": "silu", "FFN_DOWN": "mlp.c_proj", "FFN_POST_NORM": "", "OUTPUT_NORM": "ln_f", "OUTPUT": "lm_head" }


其中,ACT_TYPE 可选项为["silu", "gelu", "relu", "fatrelu", "squarerelu", "swiglu"]共六种,ATTN_NORM 和 FFN_NORM 只支持 RMSNorm;
如果使用了 ATTN_QKV 或者 ATTN_KV,则必须确认权重是否可以拆分为连续的 K|V,如果连续则 KV_CONTINUOUS 设置为 true,例如 Qwen 模型的 c_attn 权重是连续存储,它可以按Q,K,V 大小进行顺序切分,而 InternLM2 模型的 wqkv 权重是不连续存储,它的 Q,K,V 是按head_dim 交错排布。
Qwen 1.8B 模型的 modeling_qwen.py 文件定义如下:

class QWenLMHeadModel(QWenPreTrainedModel): def __init__(self, config): super().__init__(config) self.transformer = QWenModel(config) self.lm_head = nn.Linear(config.hidden_size, config.vocab_size, bias=False) class QWenModel(QWenPreTrainedModel): _keys_to_ignore_on_load_missing = ["attn.masked_bias"] def __init__(self, config): super().__init__(config) self.wte = nn.Embedding(self.vocab_size, self.embed_dim) self.ln_f = RMSNorm( self.embed_dim, eps=config.layer_norm_epsilon, ) class QWenBlock(nn.Module): def __init__(self, config): super().__init__() hidden_size = config.hidden_size self.bf16 = config.bf16 self.ln_1 = RMSNorm( hidden_size, eps=config.layer_norm_epsilon, ) self.attn = QWenAttention(config) self.ln_2 = RMSNorm( hidden_size, eps=config.layer_norm_epsilon, ) self.mlp = QWenMLP(config) class QWenAttention(nn.Module): def __init__(self, config): super().__init__() self.c_attn = nn.Linear(config.hidden_size, 3 * self.projection_size) self.c_proj = nn.Linear( config.hidden_size, self.projection_size, bias=not config.no_bias ) class QWenMLP(nn.Module): def __init__(self, config): super().__init__() self.w1 = nn.Linear( config.hidden_size, config.intermediate_size // 2, bias=not config.no_bias) self.w2 = nn.Linear( config.hidden_size, config.intermediate_size // 2, bias=not config.no_bias) ff_dim_in = config.intermediate_size // 2 self.c_proj = nn.Linear(ff_dim_in, config.hidden_size, bias=not config.no_bias)


自定义模型的转换,包括支持 cross attention 的模型,我们提供了一个 huggingface 模型结构供参考,自定义的配置文件如下:

{ "BLOCKNAME": "CustomDecoderLayer", "TOKEN_EMBD": "embed_tokens", "ATTN_NORM": "input_layernorm", "ATTN_Q_NORM": "", "ATTN_K_NORM": "", "CROSS_ATTN_NORM": "cross_layernorm", "CROSS_ATTN_Q": "cross_attn.cross_q_proj", "ATTN_Q": "", "ATTN_K": "", "ATTN_V": "", "ATTN_QKV": "self_attn.qkv_proj", "ATTN_KV": "", "KV_CONTINUOUS": "true", "ATTN_OUT": "self_attn.o_proj", "CROSS_ATTN_OUT": "cross_attn.cross_o_proj", "ATTN_POST_NORM": "", "FFN_NORM": "post_attention_layernorm", "FFN_UP": "mlp.up_proj", "FFN_GATE": "mlp.gate_proj", "ACT_TYPE": "silu", "FFN_DOWN": "mlp.down_proj", "FFN_POST_NORM": "", "OUTPUT_NORM": "norm", "OUTPUT": "lm_head"

7. 旧版本模型更新


由于 1.0.2 版本与 1.1 及之后版本差异较大,因此提供了 rkllm.update_rkllm()函数将 1.0.2 版本模型更新为最新版本,更新模型时无需执行上述模型加载和构建步骤,直接调用此接口进行更新,更新后模型量化类型等参数均未改变。rkllm.update_rkllm()函数的具体参数定义如下:

v2-eec4e4a9f25f70ac613671d3447a59ab_720w.webp

示例代码如下:

ret = llm.update_rkllm(model = "./model_1.0.2version.rkllm") if ret != 0: print('Load model failed!') exit(ret)

8. 仿真精度评估


用户在通过 rkllm.build()函数构建了 RKLLM 模型后,可以通过 rkllm.get_logits()函数在 PC端进行仿真精度评估,rkllm.get_logits()函数的具体参数定义如下:

v2-7c3ac0b8d4f5a7cb64c92cb89bd6b945_720w.webp

使用此函数进行 wikitext 数据集 ppl 测试示例代码如下:

def eval_wikitext(llm): seqlen = 512 tokenizer = AutoTokenizer.from_pretrained( modelpath, trust_remote_code=True ) #Dataset download link: #https://huggingface.co/datasets/Salesforce/wikitext/tree/main/wikitext-2-raw-v1 testenc = load_dataset("parquet", data_files='./wikitext/wikitext-2-raw-1/test-00000-of-00001.parquet', split='train') testenc = tokenizer( "\n\n".join(testenc['text']), return_tensors="pt").input_ids nsamples = testenc.numel() // seqlen nlls = [] for i in tqdm(range(nsamples), desc="eval_wikitext: "): batch = testenc[:, (i * seqlen): ((i + 1) * seqlen)] inputs = {"input_ids": batch} lm_logits = llm.get_logits(inputs) if lm_logits is None: print("get logits failed!") return shift_logits = lm_logits[:, :-1, :] shift_labels = batch[:, 1:].to(lm_logits.device) loss_fct = nn.CrossEntropyLoss().to(lm_logits.device) loss = loss_fct(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1)) neg_log_likelihood = loss.float() * seqlen nlls.append(neg_log_likelihood) ppl = torch.exp(torch.stack(nlls).sum() / (nsamples * seqlen)) print(f'wikitext-2-raw-1-test ppl: {round(ppl.item(), 2)}')


9. 仿真模型推理


用户在通过 rkllm.build()函数构建了 RKLLM 模型后,可以通过 rkllm.chat_model()函数在 PC端进行仿真推理,rkllm.chat_model()函数的具体参数定义如下:

v2-23f603b7fa47592b2043bb146d407cf9_720w.webp


示例代码如下:

args ={ "max_length":128, "top_k":1, "temperature":0.8, "do_sample":True, "repetition_penalty":1.1 } mesg = "Human: 今天天气怎么样?\nAssistant:" print(llm.chat_model(mesg, args))


以上的这些操作涵盖了 RKLLM-Toolkit 模型转换、量化的全部步骤,根据不同的需求和应用场景,用户可以选择不同的配置选项和量化方式进行自定义设置,方便后续进行部署。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 人工智能
    +关注

    关注

    1821

    文章

    50523

    浏览量

    267772
  • 开发板
    +关注

    关注

    26

    文章

    6513

    浏览量

    121364
  • 瑞芯微
    +关注

    关注

    27

    文章

    906

    浏览量

    54737
  • EASY-EAI灵眸科技

    关注

    4

    文章

    140

    浏览量

    3753
  • RV1126B
    +关注

    关注

    0

    文章

    134

    浏览量

    283
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    (EASY EAI)RV1126B 音频输入

    1.声卡资源介绍EASY-EAI-Nano-TB仅有一块由RV1126B主控输出的声卡。通过串口调试或ssh调试,可以进入开发板终端。执行aplay命令查看声卡相关的详细信息,如下所示
    的头像 发表于 12-18 13:41 2702次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>芯</b><b class='flag-5'>微</b>(<b class='flag-5'>EASY</b> <b class='flag-5'>EAI</b>)<b class='flag-5'>RV1126B</b> 音频输入

    (EASY EAI)RV1126B PWM使用

    1.PWM简介1.1开发板PWM资源1.2查找PWM节点rv1126b的pwm资源表如下:【PWM1CH0】对应的是pwm1_4ch_0,寄存地址为20700000。【PWM1CH1】对应
    的头像 发表于 01-06 10:49 8962次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>芯</b><b class='flag-5'>微</b>(<b class='flag-5'>EASY</b> <b class='flag-5'>EAI</b>)<b class='flag-5'>RV1126B</b> PWM使用

    (EASY EAI)RV1126B 音频输出

    1.声卡资源介绍EASY-EAI-Nano-TB仅有一块由RV1126B主控输出的声卡。通过串口调试或ssh调试,可以进入开发板终端。执行aplay命令查看声卡相关的详细信息,如下所示
    的头像 发表于 04-01 17:13 8725次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>芯</b><b class='flag-5'>微</b>(<b class='flag-5'>EASY</b> <b class='flag-5'>EAI</b>)<b class='flag-5'>RV1126B</b> 音频输出

    EASY EAI Nano-TB(RV1126B)开发板试用】+初识篇

    Nano-TB是灵眸科技研发的一款应用于AIoT领域的开发板,它基于RV1126B处理器,集成了4个Cortex-A53及独立的NEON协处理器,它支持4K@30fps的H.
    发表于 10-25 22:06

    EASY EAI Nano-TB(RV1126B)开发板试用】+1、开箱上电

    ,避免因接触不良导致显示或采集异常。 2 硬件解析:强劲AI核心与丰富接口 2.1 核心处理器性能 EASY EAI Nano-TB开发板的核心基于
    发表于 11-19 21:39

    EASY EAI Nano-TB(RV1126B)开发板试用】介绍、系统安装

    ,并介绍了系统镜像安装部署的相关流程。 介绍 EASY-EAI-Nano-TB是灵眸科技研发的一款应用于AIoT领域的AIOT主板。 核心板基于
    发表于 12-23 18:05

    【免费试用】EASY EAI Nano-TB(RV1126B)开发套件评测

    EASY-EAI-Nano-TB是灵眸科技研发的一款应用于AIoT领域的AIOT主板。核心板基于RV1126B处理器设计,并引入了新
    的头像 发表于 09-23 08:09 1401次阅读
    【免费试用】<b class='flag-5'>EASY</b> <b class='flag-5'>EAI</b> Nano-TB(<b class='flag-5'>RV1126B</b>)开发套件评测

    RV1126B特性概述

    RV1126BRockchip在2025年第二季度全新推出的Arm架构AI视觉芯片,搭载4核Cortex-A53与自研3Tops算力NPU。全面替代上一代的
    的头像 发表于 10-09 11:22 2400次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>芯</b><b class='flag-5'>微</b><b class='flag-5'>RV1126B</b>特性概述

    (EASY EAI)RV1126B 人体关键点识别

    的特点。本人员检测算法在数据集表现如下所示:基于EASY-EAI-Nano-TB(RV1126B)硬件主板的运行效率:17个人体关键点索引定义:2.快速上手2.1开发
    的头像 发表于 01-23 10:13 4195次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>芯</b><b class='flag-5'>微</b>(<b class='flag-5'>EASY</b> <b class='flag-5'>EAI</b>)<b class='flag-5'>RV1126B</b> 人体关键点识别

    (EASY EAI)RV1126B rknn-toolkit-lite2使用方法

    1.rknn-toolkit-lite2介绍RKNN-Toolkit-Lite2是(Rockchip)专为旗下RK系列芯片(如RV1126B、RK3576、RK3588等)打造的
    的头像 发表于 04-22 17:38 1050次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>芯</b><b class='flag-5'>微</b>(<b class='flag-5'>EASY</b> <b class='flag-5'>EAI</b>)<b class='flag-5'>RV1126B</b> rknn-toolkit-lite2使用方法

    (EASY EAI)RV1126B 模型转换API说明

    1.API详细说明1.1RKNN初始化及释放在使用RKNN-Toolkit2的所有API接口时,都需要先调用RKNN()方法初始化RKNN对象,不再使用该对象时通过调用该对象的release()方法
    的头像 发表于 05-06 11:23 429次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>芯</b><b class='flag-5'>微</b>(<b class='flag-5'>EASY</b> <b class='flag-5'>EAI</b>)<b class='flag-5'>RV1126B</b> <b class='flag-5'>模型</b><b class='flag-5'>转换</b><b class='flag-5'>API</b><b class='flag-5'>说明</b>

    (EASY EAI)RV1126B yolov11训练部署教程

    、使用最广泛的YOLO变体。YOLO11将延续YOLO系列的传奇。本教程针对目标检测算法yolo11的训练和部署到EASY-EAI-Nano-TB(RV1126B)进行
    的头像 发表于 05-09 16:59 892次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>芯</b><b class='flag-5'>微</b>(<b class='flag-5'>EASY</b> <b class='flag-5'>EAI</b>)<b class='flag-5'>RV1126B</b> yolov11训练部署教程

    RV1126B 方案特性

    RV1126B是面向边缘视觉场景的专用处理芯片,凭借低功耗、内置AI-ISP、双路MIPI-CSI接口以及端侧AI算力,可支撑常规监控、双光谱、多目视觉等多类相机产品开发,配合定
    的头像 发表于 05-11 14:27 1430次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>芯</b><b class='flag-5'>微</b><b class='flag-5'>RV1126B</b> 方案特性

    (EASY EAI)RV1126B ubuntu系统SDK源码获取

    1.源代码获取RV1126B的ubuntu系统SDK基于ubuntu22.04进行适配移植,所以建议同样在ubuntu22.04的环境(如EASY-EAI编译环境)下编译开发,并且源码部署在服务器
    的头像 发表于 05-23 16:32 45次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>芯</b><b class='flag-5'>微</b>(<b class='flag-5'>EASY</b> <b class='flag-5'>EAI</b>)<b class='flag-5'>RV1126B</b> ubuntu系统SDK源码获取

    (EASY EAI)RV1126B kernel

    把烧录工具放进虚拟机任意位置(以~/rv1126b_sdk为例)。如下图所示。然后定位到工具的位置(以~/rv1126b_sdk为例),并修改可执行权限:cd~/rv1126b_sdk
    的头像 发表于 05-25 10:26 42次阅读
    <b class='flag-5'>瑞</b><b class='flag-5'>芯</b><b class='flag-5'>微</b>(<b class='flag-5'>EASY</b> <b class='flag-5'>EAI</b>)<b class='flag-5'>RV1126B</b> kernel