Closed slngen closed 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
感谢您对代码的测试和反馈,我们将进一步去优化代码调用方式。 第二种调用方式是正确的,避免了迭代器在内存中累加的问题。
数据集的迭代器不能在For循环中创建,否则会带来不正常的内存回收问题,导致主存占用持续增加。 问题发现于LuojiaNet modelzoo中rs_semantic_segmentation/DeepLabv3_ISPRS_Vaihingen。代码中没有使用model.train()封装方式,而是自己编写epoch循环,使用TrainOneStepCell方式来训练网络,这时就需要手动创建数据集的迭代器来读取数据。 但如果在Epoch的For循环中每次创建迭代器,如下所示,则会有内存泄漏问题,主存会随着Epoch的增加而增长。
暂时是通过在For循环外定义迭代器解决此问题,如下所示。