WHULuoJiaTeam / luojianet

http://58.48.42.237/luojiaNet/
Apache License 2.0
187 stars 36 forks source link

[BUG]数据集迭代器的内存泄露问题 #8

Closed slngen closed 2 years ago

slngen commented 2 years ago

数据集的迭代器不能在For循环中创建,否则会带来不正常的内存回收问题,导致主存占用持续增加。 问题发现于LuojiaNet modelzoo中rs_semantic_segmentation/DeepLabv3_ISPRS_Vaihingen。代码中没有使用model.train()封装方式,而是自己编写epoch循环,使用TrainOneStepCell方式来训练网络,这时就需要手动创建数据集的迭代器来读取数据。 但如果在Epoch的For循环中每次创建迭代器,如下所示,则会有内存泄漏问题,主存会随着Epoch的增加而增长。

for epoch in range(epochs):
    for batch_samples in train_loader.create_dict_iterator():
        pass

暂时是通过在For循环外定义迭代器解决此问题,如下所示。

train_iterator = train_loader.create_dict_iterator()
for epoch in range(epochs):
    for batch_samples in train_iterator :
        pass
LuoJiaTeam commented 2 years ago

感谢您对代码的测试和反馈,我们将进一步去优化代码调用方式。 第二种调用方式是正确的,避免了迭代器在内存中累加的问题。