Free(): неверный указатель. Прервано (сброшено ядро)

Я пытаюсь запустить свою программу на 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(): неверный указатель Прервано (сброшено ядро)

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

Какая строка выдает ошибку?

ndrwnaguib 28.05.2019 18:33

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

Greg 28.05.2019 18:54

Можете ли вы предоставить лучший пример воспроизведения? (то есть что-то, что мы действительно можем запустить) и сообщите нам, какую версию pytorch вы используете, и полное сообщение об ошибке, которое вы получаете. А еще лучше опубликуйте всю эту информацию в выпуске на github.com/pytorch/pytorch.

Brennan Vincent 28.05.2019 19:05
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
7 047
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

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

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

Да, спасибо, я только что заполнил его, и кажется, что это импорт open3d и pytorch в один и тот же скрипт, я создал новый скрипт, который обрабатывает только вызовы open3d, и он отлично работает. Однако это всего лишь обходной путь, я посмотрю, есть ли у разработчиков что-нибудь сказать.

Adrián Briceño Aguilar 29.05.2019 14:05
Ответ принят как подходящий

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


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

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

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

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

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

Другие вопросы по теме