系统环境
硬件环境(Ascend/GPU/CPU): GPU
MindSpore版本: MindSpore=2.4、MindFormer=1.1.0
执行模式(PyNative/ Graph): 不限
Python版本: Python=3.8
操作系统平台: linux
报错信息
问题描述
初始化模型和加载的代码如下:
其中model=GLAForCausalLM这一句代码要执行几百秒,时间很长。
脚本信息:
import mindspore as ms
from mindnlp.transformers importAutoTokenizer, AutoConfig
from gla_mindspore.model.modeling_glaimport GLAForCausalLM
from gla_mindspore.model.configuration_glaimport GLAConfig
import json
import mindspore.numpy as mnp
from time import time
ms. set_device("Ascend")
def load_gla_config(config_path):
with open(config_path, "r") as f:
config_data = json. load(f)
return GLAConfig(**config_data)
# config = AutoConfig.from_pretrained('/home/HWHiAiUser/HUST-VL/GLA/flash-linear-attention/my_model/gla-1.3B-100B')
config = load_gla_config("/home/HwHiAiUser/HUST-VL/GLA/flash-linear-attention/my_model/gla-1. 3B-100B/config. json")
model = GLAForCausalLM(config)
根因分析
如果开静态图是mindspore.set_context(mode=0)这样。mindnlp模型静态图不是这样用的,需要对推理的代码打mindspore.jit标签;在上下文里面设置静态图,只能让mindspore.nn.Cell的子类construct方法中的计算逻辑走整个静态图,construct外部的代码无效,而mindnlp的模型实现没有使用nn.Cell类和其construct方法,construct外部的代码需要用mindspore.jit标签包起来才能走静态图;否则的话,没法把整个模型编译成静态图,框架可能会把每一次的api或者算子的调用都判断为一个独立的小图,这样会有大量的出图入图的额外开销,所以mindspore.set_context(mode=0)后,可能比默认的动态图模式慢了几十倍。
解决方案
mindnlp的静态图用法可以参考以下链接:
mindnlp的静态图
还有要注意,就算确实用起了静态图模式,也要确保模型的输入和输出shape是固定的,不然很有可能触发重编译,如果计算图重编译的话,每次推理加上编译的时间,速度也是会很慢的;
至于model=GLAForCausalLM速度很慢,如果你的模型是bin文件,通常会比较快一些,但如果是safetensor格式的话,通常比较慢;safetensor格式也分情况,要看存储介质,如果是在物理机的高性能ssd上加载,相对比较快一些。