Theano: cublasSgemm не удалось (14) внутренняя операция не удалась

Иногда, через некоторое время работы нормально, я получаю такую ​​ошибку с Theano / CUDA:

RuntimeError: cublasSgemm failed (14) an internal operation failed
 unit=0 N=0, c.dims=[512 2048], a.dim=[512 493], alpha=%f, beta=%f, a=%p, b=%p, c=%p sa_0=%d, sa_1=%d, sb_0=%d, sb_1=%d, sc_0=%d, sc_1=%d
Apply node that caused the error: GpuDot22(GpuReshape{2}.0, GpuReshape{2}.0)
Inputs types: [CudaNdarrayType(float32, matrix), CudaNdarrayType(float32, matrix)]
Inputs shapes: [(512, 493), (493, 2048)]
Inputs strides: [(493, 1), (2048, 1)]
Inputs values: ['not shown', 'not shown']

Какое-то время мой код работает нормально (я тренируюсь с Neural Network, и он работает большую часть времени, и даже когда эта ошибка произошла, она уже работала нормально для>2000 мини-пакетов), мне интересно узнать причину этого, Может быть, какая-то аппаратная ошибка?

Это с CUDA 6.0 и совсем недавно Theano (вчера из Git), Ubuntu 12.04, GTX 580.

Я также получил ошибку с CUDA 6.5 на K20:

RuntimeError: cublasSgemm failed (14) an internal operation failed
 unit=0 N=0, c.dims=[2899 2000], a.dim=[2899 493], alpha=%f, beta=%f, a=%p, b=%p, c=%p sa_0=%d, sa_1=%d, sb_0=%d, sb_1=%d, sc_0=%d, sc_1=%d
Apply node that caused the error: GpuDot22(GpuReshape{2}.0, GpuReshape{2}.0)
Inputs types: [CudaNdarrayType(float32, matrix), CudaNdarrayType(float32, matrix)]
Inputs shapes: [(2899, 493), (493, 2000)]
Inputs strides: [(493, 1), (2000, 1)]
Inputs values: ['not shown', 'not shown']

(Еще одна ошибка, которую я иногда получал в прошлом, это сейчас. Не уверен, что это связано.)

Виа Markus , который получил ту же ошибку:

RuntimeError: cublasSgemm failed (14) an internal operation failed
 unit=0 N=0, c.dims=[2 100], a.dim=[2 9919], alpha=%f, beta=%f, a=%p, b=%p, c=%p sa_0=%d, sa_1=%d, sb_0=%d, sb_1=%d, sc_0=%d, sc_1=%d
Apply node that caused the error: GpuDot22(GpuFlatten{2}.0, weight_hidden_)
Inputs types: [CudaNdarrayType(float32, matrix), CudaNdarrayType(float32, matrix)]
Inputs shapes: [(2, 9919), (9919, 100)]
Inputs strides: [(9919, 1), (100, 1)]
Inputs values: ['not shown', 'not shown']

С CUDA 6.5, Windows 8.1, Python 2.7, GTX 970M.

Ошибка возникает только в моей собственной сети, если я запускаю пример LeNet из Theano, он работает нормально. Хотя сеть компилируется и работает нормально на процессоре (а также на графическом процессоре для некоторых коллег, использующих Linux). У кого-нибудь есть идея, в чем может быть проблема?

2 ответа

Решение

Просто для справки на тот случай, если кто-нибудь наткнется на это:

Это больше не происходит для меня. Я не совсем уверен, что это исправило, но я думаю, что главное отличие в том, что я избегаю многопоточности и разветвлений (без exec). Это вызвало много похожих проблем, например, ошибка Theano CUDA: обнаружен недопустимый доступ к памяти (Stackru) и ошибка Theano CUDA: обнаружен недопустимый доступ к памяти (обсуждение групп Google). Особенно это обсуждение групп Google очень полезно.

Функции Theano не являются многопоточными. Однако, это не проблема для меня, потому что я использую это только в одном потоке. Тем не менее, я все еще думаю, что другие темы могут вызвать эти проблемы. Возможно, это связано с GC Python, который освобождает некоторый Cuda_Ndarray в каком-то другом потоке, пока работает theano.function.

Я немного посмотрел на соответствующий код Theano и не уверен, охватывает ли он все такие случаи.

Обратите внимание, что вы можете даже не знать, что у вас есть некоторые фоновые темы. Некоторый код Python stdlib может порождать такие фоновые потоки. Например, multiprocessing.Queue сделает это.

Я не могу избежать нескольких потоков, и пока это не исправлено в Theano, я создаю новый подпроцесс с одним потоком, где я делаю всю работу Theano. Это также имеет ряд преимуществ, таких как: более четкое разделение кода, более быстрая в некоторых случаях, потому что все это действительно работает параллельно, и возможность использования нескольких графических процессоров.

Обратите внимание, что простое использование модуля многопроцессорной обработки не сработало для меня так хорошо, потому что есть несколько библиотек (Numpy и другие, и, возможно, Theano), которые могут плохо работать в разветвленном процессе (в зависимости от версий, ОС и условий гонки)., Таким образом, мне нужен был настоящий подпроцесс (fork + exec, а не просто fork).

Мой код здесь, на случай, если кто-то заинтересован в этом.

Существует ExecingProcess, который моделируется после многопроцессорной обработки.Process, но выполняет fork+exec. (Между прочим, в Windows многопроцессорный модуль все равно сделает это, потому что в Windows нет разветвления.) И есть AsyncTask, который добавляет к этому дуплексный канал, который работает как с ExecingProcess, так и со стандартным многопроцессорным процессом.

Смотрите также: Theano Wiki: Использование нескольких графических процессоров.

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

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