Я пытаюсь запустить свою программу на 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(): неверный указатель Прервано (сброшено ядро)
Это опять же не очень мне помогает. Я буду очень признателен, если кто-то знает, что происходит, или если вы знаете больше об этой ошибке.
Похоже на ошибку в pytorch. Я бы порекомендовал создать для этого новую проблему на github, где она привлечет внимание разработчиков.
Можете ли вы предоставить лучший пример воспроизведения? (то есть что-то, что мы действительно можем запустить) и сообщите нам, какую версию pytorch вы используете, и полное сообщение об ошибке, которое вы получаете. А еще лучше опубликуйте всю эту информацию в выпуске на github.com/pytorch/pytorch.
Примечание для будущих читателей: эта ошибка зарегистрирована как выпуск №21018.
Это не проблема в вашем коде Python. Это ошибка в PyTorch (вероятно) или в самом Python (маловероятно, но возможно).
free(3)
— это функция C, которая освобождает динамически выделенную память, когда она больше не нужна. Вы не можете (легко) вызвать его из Python, потому что управление памятью — это низкоуровневая деталь реализации, обычно обрабатываемая интерпретатором Python. Однако вы также используете PyTorch, который написан на C++ и C и имеет возможность напрямую выделять и освобождать память.
В этом случае какой-то код C попытался освободить блок памяти, но этот блок памяти, который он пытался освободить, не был изначально выделен динамически, что является ошибкой. Вы должны сообщить об этом поведении разработчикам PyTorch. Включите как можно больше подробностей, включая самый короткий код, который вы можете найти, который воспроизводит проблему, и полный вывод этой программы.
Да, спасибо, я только что заполнил его, и кажется, что это импорт open3d и pytorch в один и тот же скрипт, я создал новый скрипт, который обрабатывает только вызовы open3d, и он отлично работает. Однако это всего лишь обходной путь, я посмотрю, есть ли у разработчиков что-нибудь сказать.
Редактировать: Причина действительно известна. Рекомендуемое решение — собрать оба пакета из исходного кода.
Существует известная проблема с импортом как open3d, так и PyTorch. Причина неизвестна. https://github.com/pytorch/pytorch/issues/19739
Существует несколько возможных обходных путей:
(1) Некоторые люди обнаружили, что изменение порядка импорта двух пакетов может решить проблему, хотя в моем личном тестировании оба способа дают сбой.
(2) Другие люди обнаружили, что компиляция обоих пакетов из исходного кода помогает.
(3) Третьи обнаружили, что перемещение open3d и PyTorch для вызова из отдельных сценариев решает проблему.
Какая строка выдает ошибку?