MobileSAM
本tag版本的模型文件与 icraft3.30.0 版本适配,部署时对应使用 24102404 版本位流。
0. 文件结构说明
1. 模型原始文件
-
模型原始工程文件直接存放于
MobileSAM_icraft文件夹下,来源如下:-
code:https://github.com/ChaoningZhang/MobileSAM
-
branch:master
-
commit_id:21d7850
-
-
权重文件根据原模型工程要求存放,若无特别要求,则存放在
MobileSAM_icraft/weights文件夹下,文件来源:https://github.com/ChaoningZhang/MobileSAM/tree/master/weights/mobile_sam.pt
2. AI部署所需文件
AI部署模型所需文件均存放于下MobileSAM_icraft文件夹下,具体内容如下:
1_scripts:若干脚本,用于保存Icraft编译器需要的模型等功能2_compile:Icraft编译器编译模型时所需要的文件3_deploy:将Icraft编译器编译出的模型仿真&部署到硬件时需要的python/c++工程
1. 保存框架模型
目的:将模型保存成可以被Icraft编译器编译的形态
MobileSAM_icraft/1_scripts下提供用于保存模型并验证其正确性的脚本:
-
0_infer.py:使用模型原始权重推理一张图并得到最终结果 -
1_save.py:保存模型,MobileSAM_icraft/2_compile/fmodel下已提供对应权重文件的框架模型,可根据需求修改脚本内配置后另行保存环境要求:Icraft编译器对导出框架模型时使用的框架版本有要求,即导出模型的脚本必须在要求的框架版本下执行,要求的版本:
- pytorch:支持pytorch1.9.0、pytorch2.0.1两个版本的原生网络模型文件(.pt格式),以及pytorch框架保存为onnx(opset=11/14/17)格式的模型文件(.onnx格式)
- paddle:仅支持PaddlePaddle框架保存为onnx(opset=11/14/17)格式的模型文件(.onnx格式),不支持框架原生网络模型文件
- tensorflow:仅支持TensorFlow框架保存为onnx(opset=11/14/17)格式的模型文件(.onnx格式),不支持框架原生网络模型文件
保存模型时的修改点:
- 将原模型声明的LayerNorm替换为icraft3.30兼容的LayerNorm
- 将权重文件的键替换为经过1更改后的键
-
2_save_infer.py:用修改后保存的模型做前向推理,验证保存的模型与原模型是否一致
进入MobileSAM_icraft/1_scripts后,即可执行上述脚本:
-
如果已安装uv,可跳过此步,否则请先使用以下命令安装(更多uv的安装和基础使用说明可参考1.1.2 Python环境管理工具uv的安装和使用):
# 推荐使用官网源码安装 powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" # 也可pip安装 pip install uv
-
运行脚本:(首次在项目目录下使用uv命令运行脚本时,会自动加载配置项目环境,用时可能稍长)
# 在此模型根目录 cd MobileSAM_icraft/1_scripts uv run 1_save.py
2. 使用Icraft编译器编译模型
目的:使用Icraft编译器将上一步保存好的框架模型转化为硬件可部署模型
1. 相关命名说明
- fmodel:frame model > 用于Icraft编译器的框架模型
- imodel:icraft model > 用Icraft编译器编译出的模型
- qtset:Quantitative Calibration Set > Icraft编译器所需的量化校准集
2. 确认已安装正确的icraft版本
参考4. Icraft安装,根据系统架构选择相应的Icraft安装包,安装并检查:打开cmd运行:icraft --version
若已正常安装则会显示当前icraft版本,例如:
Icraft 版本:
* 3.30.0
CLI 版本:
3.30.0.0-4be6386(2503281652)
3. 准备量化集
MobileSAM_icraft/2_compile/qtset中已提供量化集及对应列表文件,如需使用其它文件,请根据使用文件名修改列表文件内容。
4. 配置toml
toml 即 MobileSAM_icraft/2_compile/config/TARGET/xxmodel.toml,可根据需要修改该文件中的参数。
此处仅介绍一些参数配置,如需更详细深入的介绍,请参考 icraft docs(在终端中输入icraft docs打开)。
-
parse步net_name:网络名称,编译时按此设置生成模型文件(如:配置为MobileSAM,生成文件为MobileSAM_parsed.json&MobileSAM_parsed.raw);network:用于编译的fmodel文件存放路径;inputs:对应network模型的输入尺寸;jr_path:模型parse编译后生成文件的存放路径;target:运行模型时所用的后端,已配置为对应文件路径中TARGET的参数;- 其它参数:若对模型预处理有其它需求可相应修改,否则无需更改。
-
quantize步bits/qdtype:量化精度,已配置为对应文件路径中TARGET的参数;saturation:量化饱和方式,已配置为最优方式;per:按tensor或channel为单位量化,已配置为最优方式;forward_dir:量化集的存放路径,已对应MobileSAM_icraft/2_compile/qtset中提供的数据;forward_list:量化集列表的文件路径,已对应MobileSAM_icraft/2_compile/qtset中提供的数据;json:quantize前一步即optimize步编译生成的json文件路径;raw:quantize前一步即optimize步编译生成的raw文件路径;jr_path:模型quantize编译后生成文件的存放路径。
-
optimize/adapt/generate步:其
json、raw、jr_path参数配置均类似quantize步,前两者(json、raw)为上一步编译生成的模型文件路径,末者(jr_path)为当前步编译后生成文件的存放路径。
5. 执行编译
在 MobileSAM_icraft/2_compile目录下执行编译:
icraft compile config/BY/MobileSAM.toml
如果过程顺利,将得到 icraft model(以 .json (graph).raw(param)的格式保存)
其中包括编译各阶段产生的中间结果模型和最终用于片上部署的BY/ZG模型,(若未修改toml中jr_path参数配置)直接被保存到: MobileSAM_icraft/3_deploy/imodel
3. 运行模型
目的:使用运行时程序加载上一步编译所得的模型文件,仿真 或 在AI硬件上 执行模型前向推理。
注:
- 如需 在AI硬件上 执行模型前向推理,请先参考3. 上板环境和4.2 Icraft安装-Ubuntu20.04-aarch64准备AI硬件并安装Icraft。
- 在AI硬件上的运行模式说明:
- axi模式:使用串口或ssh连接AI硬件,将运行时所需文件均复制到AI硬件上后,使用PSoC方式进行推理。
- socket模式:以上位机作为主控操作系统(下文示例中上位机操作系统为Windows),使用网口连接AI硬件,运行时输入数据会通过上位机经由网口传到AI硬件上进行推理。
- axi模式:使用串口或ssh连接AI硬件,将运行时所需文件均复制到AI硬件上后,使用PSoC方式进行推理。
1. 准备运行时程序
-
普通测试:使用
MobileSAM_icraft/3_deploy/pyrt/MobileSAM_psin.py -
精度测试:使用
MobileSAM_icraft/3_deploy/pyrt/MobileSAM_psin.py
python runtime
- python版本:3.8(否则无法使用icraft的python API)
2. 准备测试数据
-
MobileSAM_icraft/3_deploy/io中已提供工程运行所需的示例测试数据 -
精度测试数据集下载:None,精度测试使用数据集的Val部分。
3. 修改配置文件
运行时需要配置一些模型路径,输入数据,后处理参数等,其配置文件在 MobileSAM_icraft/3_deploy/cfg,可修改:
imodel中参数:dir:测试所用模型文件所在目录路径stage:测试所用模型文件的编译阶段run_backend:运行所用后端host:Host,用于 仿真 运行buyi:布衣后端 (若设为buyi,则不论stage为何配置,运行时均使用BY阶段模型文件)zg330:诸葛后端 (若设为zg330,则不论stage为何配置,运行时均使用ZG阶段模型文件)
cudamode:是否使用Cuda进行仿真mmuMode:是否在模型编译的generate步配置了合并算子和内存优化 (仅当run_backend配置为buyi时,该参数配置生效,默认为true)speedmode:是否在运行时合并算子 (仅当模型编译时未配置合并算子和内存优化时,,该参数配置生效,默认为false)compressFtmp:是否在运行时进行内存优化 (仅当模型编译时未配置合并算子和内存优化时,,该参数配置生效,默认为false)ocm_option:OCM分配方案 (仅当run_backend配置为zg330时,该参数配置生效,默认为4,支持0/1/2/3/4)ip:所用板子ip (若仿真运行,可忽略此配置)show:是否显示测试结果save:是否保存测试结果dump_output:是否dump网络的输出特征图 (与icraft run命令参数相同)dump_format:dump特征图使用的格式,支持SFB/SFT/SQB/SQT/HQB/HQT等 (与icraft run命令参数相同)log_path:dump特征图文件存放路径(保存文件名与输出顺序相同,即:0.ftmp,1.ftmp,2.ftmp……)
dataset中参数:dir:测试数据存放路径list:测试数据列表的文件路径res:测试结果保存路径
param中参数:如果模型没有重训,则无需更改,若重训则需要修改对应部分参数。
根据不同测试需求,可使用不同的配置文件:
-
普通测试:使用
MobileSAM.yaml,其中dataset参数配置已对应MobileSAM_icraft/3_deploy/io中提供的示例测试数据 -
精度测试:使用
MobileSAM.yaml,精度测试数据实际存放位置需与其中dataset参数配置相匹配。
4. 执行程序
如果运行 socket模式 ,需先在AI硬件上开启server:
# 以root账户在任意路径下运行:
icraft-serve
开启成功后会显示:
root@U:~# icraft-serve
[02/22/24 02:02:00.388] [I] Using port : 9981
[02/22/24 02:02:00.388] [I] synchronous mode
[02/22/24 02:02:00.388] [I] [irpc::port::tcp::_waitNewConn] wait for new connection
python runtime
-
仿真 或 socket模式:
在
MobileSAM_icraft/3_deploy/pyrt目录下运行:uv run ./MobileSAM_psin.py ../cfg/MobileSAM.yaml
若在配置文件中配置
save为true,则可在其对应res配置的目录下查看输出。
4. 计算精度指标
运行精度测试命令uv run ./MobileSAM_psin.py ../cfg/MobileSAM.yaml后,使用metrics测试脚本,根据保存的测试结果计算出精度指标。
-
metrics测试脚本存放于:
MobileSAM_icraft/3_deploy/metrics/evaluate,使用与配置方法请详见目录下内容; -
使用
uv run替代python命令运行测试脚本; -
精度指标结果保存在
MobileSAM_icraft/3_deploy/metrics/logs目录下。
5. 模型性能记录
| MobileSAM | input shape | hard time | post time | qt_strategy | Dice | IoU |
|---|---|---|---|---|---|---|
| float | [1, 3, 1024, 1024] | - | - | - | None | None |
| BY_int8 | [1, 3, 1024, 1024] | 398.3928ms | 1ms | kld-pc | None | None |
| BY_int16 | [1, 3, 1024, 1024] | 731.5614ms | 1ms | kld-pc | None | None |