MobileSAM

28 downloads 0 likes on ModelScope updated

Model card

MobileSAM

version author
metrics speed
FPGA_ops
OS

本tag版本的模型文件与 icraft3.30.0 版本适配,部署时对应使用 24102404 版本位流。

0. 文件结构说明

1. 模型原始文件

  1. 模型原始工程文件直接存放于MobileSAM_icraft文件夹下,来源如下:

    • code:https://github.com/ChaoningZhang/MobileSAM

    • branch:master

    • commit_id:21d7850

  2. 权重文件根据原模型工程要求存放,若无特别要求,则存放在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格式),不支持框架原生网络模型文件

    保存模型时的修改点:

    1. 将原模型声明的LayerNorm替换为icraft3.30兼容的LayerNorm
    2. 将权重文件的键替换为经过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硬件上 执行模型前向推理。

注:

  1. 如需 在AI硬件上 执行模型前向推理,请先参考3. 上板环境和4.2 Icraft安装-Ubuntu20.04-aarch64准备AI硬件并安装Icraft。
  2. 在AI硬件上的运行模式说明:
    • axi模式:使用串口或ssh连接AI硬件,将运行时所需文件均复制到AI硬件上后,使用PSoC方式进行推理。
    • socket模式:以上位机作为主控操作系统(下文示例中上位机操作系统为Windows),使用网口连接AI硬件,运行时输入数据会通过上位机经由网口传到AI硬件上进行推理。

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