0

我正在尝试在with as 存储后端pytorch上构建一个项目。IterableDatasetzarr

class Data(IterableDataset):
    def __init__(self, path, start=None, end=None):
        super(Data, self).__init__()
        store = zarr.DirectoryStore(path)
        self.array = zarr.open(store, mode='r')

        if start is None:
            start = 0
        if end is None:
            end = self.array.shape[0]

        assert end > start

        self.start = start
        self.end = end

    def __iter__(self):
        return islice(self.array, self.start, self.end)

这适用于小型测试数据集,但是一旦我移动到我的实际数据集(480 000 000 x 290),我就会遇到内存泄漏。我已经尝试定期注销 python 堆,因为一切都慢了下来,但我看不到任何异常增加的大小,所以我使用的库 ( pympler) 实际上并没有捕获内存泄漏。

我有点不知所措,所以如果有人知道如何进一步调试它,将不胜感激。

在PyTorch 论坛上交叉发布。

4

1 回答 1

1

原来我的验证程序有问题:

with torch.no_grad():
    for batch in tqdm(testloader, **params):
        x = batch[:, 1:].to(device)
        y = batch[:, 0].unsqueeze(0).T
        y_test_pred = torch.sigmoid(sxnet(x))
        y_pred_tag = torch.round(y_test_pred)
        y_pred_list.append(y_pred_tag.cpu().numpy())
        y_list.append(y.numpy())

我最初认为我很清楚将结果附加到列表时会遇到麻烦,但问题是结果.numpy是数组数组(因为原始数据类型是 1xn 张量)。

添加.flatten()numpy 数组已解决此问题,并且 RAM 消耗现在与我最初配置的一样。

于 2020-09-11T10:02:15.550 回答