问题描述:
【问题背景】
推理时,我需要写一个自回归的过程,循环调用我的model,如
x=init()
for i in range(200):
x=model(x)
我希望把这个过程放在一个nn.Cell类的construct方法里,这样可以在Graph Mode的时候速度快很多(否则就是在静态图之外,用python的过程来做这个循环)。
【问题】
当这个循环数量小的时候,我启动程序,还挺快的;但是一旦这个循环次数增加,启动程序时,程序会卡在编译阶段特别特别慢,难以忍受的慢(数小时)。
请问应该如何把这种循环放在静态图的遍历过程中,感觉太慢了啊,而且好像很吃显存
解答:
循环200次就相当于构造了相当于原始的模型200倍的model,显存和速度降低也是合理的,可以缩小下模型看下
主要问题在于循环展开导致编译时间较长,可以试试下面的code
'''
@constexpr
def get_range_start():
return Tensor(0, dtype=dtype.int32)
@constexpr
def get_range_end(end):
return Tensor(end, dtype=dtype.int32)
@ms_function
def construct(x):
i = get_range_start()
while i < get_range_end(200):
x = model(x)
i += 1
return x
'''
可以试试这么写能不能关掉循环展开