Я работаю над некоторыми экспериментами, связанными с гипотезой лотерейного билета . Это включает создание масок сокращения, чтобы обнулить определенные веса в маске веса.
Для масок сокращения я использую логические матрицы. Перед каждым прямым вызовом я применяю эти матрицы для обнуления сокращенных весов, например:
self.embed_out.data[~self.embed_out_mask] = 0
, где self
- модель, а embed_out
и embed_out_mask
- экземпляры torch.nn.Parameter
. (. embed_out
- это матрица весов, а embed_out_mask
- соответствующая логическая маска сокращения с точно таким же размером.
Это прекрасно работает во время тренировки и дает ожидаемые результаты с точки зрения сходимости, потерь и т. Д., Которыесоответствовать результатам статьи.
Однако во время оценки та же самая строка выдает следующую ошибку:
[stacktrace omitted]
File "[omitted]", line 214, in forward
self.embed_out.data[~self.embed_out_mask] = 0
RuntimeError: copy_if failed to synchronize: device-side assert triggered
Соответствующее утверждение, которое не удалось, выглядит следующим образом:
/pytorch/aten/src/THC/THCTensorIndex.cu:361: void indexSelectLargeIndex(TensorInfo<T, IndexType>, TensorInfo<T, IndexType>, TensorInfo<long, IndexType>, int, int, IndexType, IndexType, long) [with T = float, IndexType = unsigned int, DstDim = 2, SrcDim = 2, IdxDim = -2, IndexIsMajor = true]:
block: [173,0,0], thread: [127,0,0] Assertion `srcIndex < srcSelectDimSize` failed.
Это выглядит так, как будто произошла какая-то ошибка за пределами границ при использовании маски чернослива в качестве индекса, но я вручную проверил, что матрица веса и маска чернослива имеют одинаковый размер.
Что может быть причиной этой ошибки?