专栏算法工具链模型编译的时候遇到key丢失

模型编译的时候遇到key丢失

已解决
beyondaa2024-12-13
86
11

您好,我再compile_perf.py编译模型的时候遇到model中的key丢失问题,具体如附件中的附图所示,

我的deploy model 和int_infer_trainer如下所示:

deploy_model = copy.deepcopy(model)

deploy_model["compile_model"] = True
deploy_model["decoders"][0]["losses"] = None
deploy_model["decoders"][0]["postprocess"] = None
deploy_model["decoders"][1]["target"] = None
deploy_model["decoders"][1]["loss"] = None
deploy_model["decoders"][1]["decoder"] = None
deploy_model["decoders"][2]["target"] = None
deploy_model["decoders"][2]["loss"] = None
deploy_model["decoders"][2]["decoder"] = None
deploy_model["decoders"][3]["target"] = None
deploy_model["decoders"][3]["loss_cls"] = None
deploy_model["decoders"][3]["loss_reg"] = None
deploy_model["decoders"][3]["decoder"] = None

 

int_infer_trainer = dict(

    type="Trainer",

    model=deploy_model,

    model_convert_pipeline=dict(

        type="ModelConvertPipeline",
        qat_mode="fuse_bn",

        converters=[

            dict(type="Float2QAT", convert_mode=convert_mode),

            dict(

                type="LoadCheckpoint",
                checkpoint_path="./tmp_models/multi_task/qat-checkpoint-epoch-0000-4bce8b75.pth.tar",
                allow_miss=True,
                ignore_extra=True,

            ),

            dict(type="QAT2Quantize", convert_mode=convert_mode),

        ],

    ),

    data_loader=None,
    optimizer=None,

    batch_processor=batch_processor,

    num_epochs=0,
    device=None,

    callbacks=[ckpt_callback],

)

我在deploy model的时候把模型decode出目标和loss部分去掉了,这部分是没有参数的。我不明白附件中图的丢失情况是否正常,如果不正常丢失的是我置为None部分的参数吗?

但是那部分就是一些解码模型输出的python代码,并没有参数。我该如何解决这个问题呢?

附件:
算法工具链
征程5
评论3
0/1000
  • Huanghui
    Lv.5

    收到。具体情况我们需要看看,话说为什么要移除呢,output中的无用项如果不需要,不解析不就行了吗?

    2024-12-13
    0
    1
    • beyondaa回复Huanghui:

      您好,如上面两张图所示我看你们在工具链中的实例中,model里中的loss和target这些在deploy_model中都是去掉的
      2024-12-13
      0
  • beyondaa
    Lv.1

    如图所示,在qat trainer的时候加载float的权重同样的丢失keys,这个是什么问题导致的
    2024-12-13
    0
    0
  • beyondaa
    Lv.1

    问题找到了,为什么我们是model里面只有4645个key,所以训练完保存的权重里面只有4645个key,但是经过 Float2QAT的convert之后我的key变成了14319个变多了,所以会出现miss_key的问题,那这个问题是正常的吗,如果不正常请问这个问题该怎么解决?
    2024-12-13
    0
    7
    • Huanghui回复beyondaa:

      Float2QAT后得到的是QAT模型, 里面会多出来一些伪量化节点, 另外这个过程还会进行一些节点的融合也会带来key的变动,所以目前判断 key 存在变动以及 miss_key 的出现是正常的。

      2024-12-13
      0
    • beyondaa回复Huanghui:

      之前别的model没有出现这个问题,如果我想消除这个问题,在model的每个模块中具体应该怎么做呢?

      2024-12-13
      0
    • beyondaa回复Huanghui:
      您好,我还是有一些疑问:
      1,我理解 Float2QAT 会插入伪量化节点,就是在进入一层之前会量化为int型然后在该层结束后会反量化为float型。中间则个量化和反量化的节点就是伪量化节点。我这个理解对吗?
      2,这个伪量化节点是自动插入的还是手动插入的,我在子module中都会写下面两个函数:
      def fuse_model(self): 和 def set_qconfig(self): 这两个函数。 set_qconfig 是来对这个子模块进行量化设置, fuse_model 是对这个模块中那些层可以融合计算进行配置
      3,我整个model的搭建都遵从这样的规则,之前没有出现过这种miss_key的问题,我现在怎么做可以消除这个miss_key的问题呢?
      2024-12-13
      0
    • Huanghui回复beyondaa:
      1.伪量化就是 float ->int->float,一方面让forward过程感受来自量化带来的误差以修正weigh和量化参数,另一方面,qat本身还是训练的过程,backward的过程还是一样,还是在 float 数据上进行的。这个过程类似下面这个图2.伪量化节点是自动插入的,工具链会自动分析哪些节点需要量化。从工具链逻辑看, fuse_model 是在“eager”mode时才会使用的,“fx”mode下会自动融合可以融合的节点。当然量化config都是需要的。
      3. 其实我理解miss_key没必要非要消除,你可以看一下使用的 load_state_dict 具体是从哪个阶段的ckpt load到哪个模型中,不同阶段的 state_dict 的keys是可能存在差异的,建议是先忽略看看结果
      2024-12-16
      0
    • beyondaa回复Huanghui:

      您好问题的原因我知道了,是因为为了快速验证我搭建的模型能否编译hbm。所以我没有float训练直接进行qat训练进而运行compile来编译hbm导致的。中间丢失的key我理解应该就是那些伪量化节点?另外我采用了eager模式的convert而没有采用fx,按照工具链eager是调用我再每个子module中fuse_model函数中定义的融合层对吧
      2024-12-16
      0
    • Huanghui回复beyondaa:

      YES, 没错,子module 的融合就是通过 model 中的 fuse_model函数进行的,框架判断 eager模式 后会自动调用。你的 miss_key 也解释通了,通常qat load的是cali阶段的ckpt,他们两个的key是一致的,不会有miss_key。

      2024-12-16
      0
    • beyondaa回复Huanghui:

      非常感谢

      2024-12-16
      0