free (): неверный указатель прерван (ядро сброшено) - PullRequest
1 голос
/ 28 мая 2019

Я пытаюсь запустить свою программу на python, кажется, что она должна работать без сбоев, но я сталкиваюсь с ошибкой, которую не видел прежде, чем она говорит:

free(): invalid pointer
Aborted (core dumped)

Однако я не уверен, как попробоватьи исправить ошибку, так как она не дает мне слишком много информации о самой проблеме.

Сначала я подумал, что это должно быть проблемой с размерами тензора в моей сети, но они вполне в порядке.Я немного погуглил проблему и обнаружил, что вижу проблему с выделением памяти там, где не должен, но я не знаю, как решить эту проблему

Мой код разделен на две части.разные файлы, и я использую две библиотеки, чтобы иметь возможность использовать функцию потерь Синкхорна и сделать выборку случайным образом сеткой.

import argparse
import point_cloud_utils as pcu
import time

import numpy as np
import torch
import torch.nn as nn
from fml.nn import SinkhornLoss

import common
def main():
    # x is a tensor of shape [n, 3] containing the positions of the vertices that
    x = torch._C.from_numpy(common.loadpointcloud("sphere.txt"))
    # t is a tensor of shape [n, 3] containing a set of nicely distributed samples in the unit cube
    v, f = common.unit_cube()
    t = torch._C.sample_mesh_lloyd(pcu.lloyd(v,f,x.shape[0]).astype(np.float32)) # sample randomly a point cloud (cube for now?)

    # The model is a simple fully connected network mapping a 3D parameter point to 3D
    phi = common.MLP(in_dim=3, out_dim=3)

    # Eps is 1/lambda and max_iters is the maximum number of Sinkhorn iterations to do
    emd_loss_fun = SinkhornLoss(eps=1e-3, max_iters=20,
                                stop_thresh=1e-3, return_transport_matrix=True)

    mse_loss_fun = torch.nn.MSELoss()

    # Adam optimizer at first
    optimizer = torch.optim.Adam(phi.parameters(), lr= 10e-3)

    fit_start_time = time.time()

    for epoch in range(100):
        optimizer.zero_grad()

        # Do the forward pass of the neural net, evaluating the function at the parametric points
        y = phi(t)

        # Compute the Sinkhorn divergence between the reconstruction*(using the francis library) and the target
        # NOTE: The Sinkhorn function expects a batch of b point sets (i.e. tensors of shape [b, n, 3])
        # since we only have 1, we unsqueeze so x and y have dimension [1, n, 3]
        with torch.no_grad():
            _, P = emd_loss_fun(phi(t).unsqueeze(0), x.unsqueeze(0))

        # Project the transport matrix onto the space of permutation matrices and compute the L-2 loss
        # between the permuted points
        loss = mse_loss_fun(y[P.squeeze().max(0)[1], :], x)
        # loss = mse_loss_fun(P.squeeze() @ y,  x)  # Use the transport matrix directly

        # Take an optimizer step
        loss.backward()
        optimizer.step()

        print("Epoch %d, loss = %f" % (epoch, loss.item()))

    fit_end_time = time.time()

    print("Total time = %f" % (fit_end_time - fit_start_time))
    # Plot the ground truth, reconstructed points, and a mesh representing the fitted function, phi
    common.visualitation(x,t,phi)



if __name__ == "__main__":
    main()

Сообщение об ошибке: free (): неверный указатель прерван (ядро сброшено)

Это опять-таки не очень мне помогает.Я буду очень признателен, если кто-нибудь поймет, что происходит, или если вы знаете больше об этой ошибке.

Ответы [ 2 ]

1 голос
/ 28 мая 2019

Примечание для будущих читателей: эта ошибка была зарегистрирована как выпуск # 21018 .

Это не проблема в вашем коде Python.Это ошибка в PyTorch (вероятно) или в самом Python (маловероятно, но возможно).

free(3) - это функция C, которая освобождает динамически выделенную память, когда она больше не нужна,Вы не можете (легко) вызвать его из Python, потому что управление памятью - это низкоуровневая деталь реализации, обычно обрабатываемая интерпретатором Python.Тем не менее, вы также используете PyTorch, который написан на C ++ и C, и имеет возможность напрямую выделять и освобождать память.

В этом случае некоторый код на C попытался освободить блок памяти,но блок памяти, который он пытался освободить, не был изначально выделен динамически, что является ошибкой.Вы должны сообщить об этом поведении разработчикам PyTorch .Включите как можно больше подробностей, включая самый короткий код, который вы можете найти, чтобы воспроизвести проблему, и полный вывод этой программы.

0 голосов
/ 29 мая 2019

Редактировать: Причина на самом деле известна.Рекомендуемое решение - собрать оба пакета из исходного кода.


Существует известная проблема с импортом как open3d, так и PyTorch.Причина неизвестна.https://github.com/pytorch/pytorch/issues/19739

Существует несколько возможных обходных путей:

(1) Некоторые люди обнаружили, что изменение порядка, в котором вы импортируете два пакета, может решить проблему, хотя в моем личном тестировании обасбои в работе.

(2) Другие люди обнаружили, что компиляция обоих пакетов из исходного кода помогло.

(3) Третьи обнаружили, что перемещение open3d и PyTorch, вызываемых из отдельных скриптов, разрешаетвыпуск.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...