ONNX模型转换CANN模型
==============

开发者需利用CANN提供的tools工具完成从ONNX模型到CANN模型的转换，模型转换完成后，即可开始集成。

#### 配置CANN LLM模型NPU亲和适配文件

NPU亲和改造的脚本文件已默认在/CANN\_LLM\_Engine\_Model/npu\_tuned\_export/npu\_tuned\_model下各个模型文件夹中，如果需要定制，请参见[CANN LLM模型NPU亲和适配说明](https://gitcode.com/HarmonyOS_Samples/cannkit_samplecode_lm_engine_cpp/blob/master/CANN_LLM/CANN_LLM_Engine_Model/npu_tuned_export/npu_tuned_model/qwen2/README.md)。

开发者只需要按照下文模型转换流程执行对应的脚本，即可完成亲和化改造。

#### 环境准备

模型转换需要使用tools/tools\_omg/omg工具，继承量化环节的[DDK工具环境](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cannkit-llm-usage-environmental-preparation)。

#### 模型转换

1.  修改CANN\_LLM/CANN\_LLM\_Engine\_Model/scripts\_for\_omc/to\_omc.sh脚本，配置相应的omg\_type、模型文件路径modelpath和量化文件路径compress\_path，示例：
    
    omg\_type=xxxxxx
    modelpath=./model.onnx
    compress\_path=./quant\_params\_file
    outputpath=xxx  omgtoolpath=./tools/tools\_omg/omg
    echo $PWDchmod 777 ./tools/tools\_omg/omg export LD\_LIBRARY\_PATH=./tools/tools\_omg/master/lib64
    if \[ "$omg\_type"=="Qwen25\_1b5" \]; then
        echo ${omg\_type} "trans start"
        ${omgtoolpath} --model ${modelpath} --framework 5 \\
            --output ${outputpath} \\
    --input\_shape=
    "input\_embed:1,-1,1536;attention\_mask:1,1,-1,2048;position\_ids:1,-1;past\_key\_in0:2048,2,1,128;past\_value\_in0:2048,2,1,128;past\_key\_in1:2048,2,1,128;past\_value\_in1:2048,2,1,128;past\_key\_in2:2048,2,1,128;past\_value\_in2:2048,2,1,128;past\_key\_in3:2048,2,1,128;past\_value\_in3:2048,2,1,128;past\_key\_in4:2048,2,1,128;past\_value\_in4:2048,2,1,128;past\_key\_in5:2048,2,1,128;past\_value\_in5:2048,2,1,128;past\_key\_in6:2048,2,1,128;past\_value\_in6:2048,2,1,128;past\_key\_in7:2048,2,1,128;past\_value\_in7:2048,2,1,128;past\_key\_in8:2048,2,1,128;past\_value\_in8:2048,2,1,128;past\_key\_in9:2048,2,1,128;past\_value\_in9:2048,2,1,128;past\_key\_in10:2048,2,1,128;past\_value\_in10:2048,2,1,128;past\_key\_in11:2048,2,1,128;past\_value\_in11:2048,2,1,128;past\_key\_in12:2048,2,1,128;past\_value\_in12:2048,2,1,128;past\_key\_in13:2048,2,1,128;past\_value\_in13:2048,2,1,128;past\_key\_in14:2048,2,1,128;past\_value\_in14:2048,2,1,128;past\_key\_in15:2048,2,1,128;past\_value\_in15:2048,2,1,128;past\_key\_in16:2048,2,1,128;past\_value\_in16:2048,2,1,128;past\_key\_in17:2048,2,1,128;past\_value\_in17:2048,2,1,128;past\_key\_in18:2048,2,1,128;past\_value\_in18:2048,2,1,128;past\_key\_in19:2048,2,1,128;past\_value\_in19:2048,2,1,128;past\_key\_in20:2048,2,1,128;past\_value\_in20:2048,2,1,128;past\_key\_in21:2048,2,1,128;past\_value\_in21:2048,2,1,128;past\_key\_in22:2048,2,1,128;past\_value\_in22:2048,2,1,128;past\_key\_in23:2048,2,1,128;past\_value\_in23:2048,2,1,128;past\_key\_in24:2048,2,1,128;past\_value\_in24:2048,2,1,128;past\_key\_in25:2048,2,1,128;past\_value\_in25:2048,2,1,128;past\_key\_in26:2048,2,1,128;past\_value\_in26:2048,2,1,128;past\_key\_in27:2048,2,1,128;past\_value\_in27:2048,2,1,128;new\_kv\_cache\_pos:-1;embed\_scales:1,-1,1" \\
            --dynamic\_dims="1,1,1,1,1;64,64,64,64,64" \\
            --input\_type=
    "past\_key\_in0:FP16;past\_value\_in0:FP16;past\_key\_in1:FP16;past\_value\_in1:FP16;past\_key\_in2:FP16;past\_value\_in2:FP16;past\_key\_in3:FP16;past\_value\_in3:FP16;past\_key\_in4:FP16;past\_value\_in4:FP16;past\_key\_in5:FP16;past\_value\_in5:FP16;past\_key\_in6:FP16;past\_value\_in6:FP16;past\_key\_in7:FP16;past\_value\_in7:FP16;past\_key\_in8:FP16;past\_value\_in8:FP16;past\_key\_in9:FP16;past\_value\_in9:FP16;past\_key\_in10:FP16;past\_value\_in10:FP16;past\_key\_in11:FP16;past\_value\_in11:FP16;past\_key\_in12:FP16;past\_value\_in12:FP16;past\_key\_in13:FP16;past\_value\_in13:FP16;past\_key\_in14:FP16;past\_value\_in14:FP16;past\_key\_in15:FP16;past\_value\_in15:FP16;past\_key\_in16:FP16;past\_value\_in16:FP16;past\_key\_in17:FP16;past\_value\_in17:FP16;past\_key\_in18:FP16;past\_value\_in18:FP16;past\_key\_in19:FP16;past\_value\_in19:FP16;past\_key\_in20:FP16;past\_value\_in20:FP16;past\_key\_in21:FP16;past\_value\_in21:FP16;past\_key\_in22:FP16;past\_value\_in22:FP16;past\_key\_in23:FP16;past\_value\_in23:FP16;past\_key\_in24:FP16;past\_value\_in24:FP16;past\_key\_in25:FP16;past\_value\_in25:FP16;past\_key\_in26:FP16;past\_value\_in26:FP16;past\_key\_in27:FP16;past\_value\_in27:FP16" \\
            --output\_type=
    "lm\_logits:FP32;past\_key0:FP16;past\_value0:FP16;past\_key1:FP16;past\_value1:FP16;past\_key2:FP16;past\_value2:FP16;past\_key3:FP16;past\_value3:FP16;past\_key4:FP16;past\_value4:FP16;past\_key5:FP16;past\_value5:FP16;past\_key6:FP16;past\_value6:FP16;past\_key7:FP16;past\_value7:FP16;past\_key8:FP16;past\_value8:FP16;past\_key9:FP16;past\_value9:FP16;past\_key10:FP16;past\_value10:FP16;past\_key11:FP16;past\_value11:FP16;past\_key12:FP16;past\_value12:FP16;past\_key13:FP16;past\_value13:FP16;past\_key14:FP16;past\_value14:FP16;past\_key15:FP16;past\_value15:FP16;past\_key16:FP16;past\_value16:FP16;past\_key17:FP16;past\_value17:FP16;past\_key18:FP16;past\_value18:FP16;past\_key19:FP16;past\_value19:FP16;past\_key20:FP16;past\_value20:FP16;past\_key21:FP16;past\_value21:FP16;past\_key22:FP16;past\_value22:FP16;past\_key23:FP16;past\_value23:FP16;past\_key24:FP16;past\_value24:FP16;past\_key25:FP16;past\_value25:FP16;past\_key26:FP16;past\_value26:FP16;past\_key27:FP16;past\_value27:FP16"  \\
            --compress\_conf ${compress\_path}  \\
            --save\_weights\_as\_external\_data=true \\
            --platform=xxxxxx \\
            --target=omc
    
    脚本中的转换模型命令中的参数含义可参考[CANN Kit工具链文档说明](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/cannkit-overall-parameter)。
    
2.  执行to\_omc.sh脚本即可转换出对应的CANN格式的模型。
    
    脚本的输入/输出说明：
    
    输入：ONNX模型和量化配置文件。
    
    输出：CANN格式的模型。
    
    模型转换完成后，即可开始集成。