воскресенье, 31 января 2010 г.

Gentoo tip: Ускорение numpy в 25 раз

Наткнулся на статью Is your NumPy using the right ATLAS?. Далее — творческий перевод с адаптацией к Gentoo Linux.

Выбор правильного бекенда для numpy может существенно (очень) улучшить производительность. ATLAS (Automatically Tuned Linear Algebra Software) — библиотека, которая используется в NumPy (как и в Matlab, Octave др.) для вычислений линейной алгебры. Его и попытаемся включить

Проверить, правильный ли бекенд используется можно простым умножением двух 1000х1000 матриц:

>>> from numpy import *
>>> import time
>>> A = random.random((1000,1000))
>>> B = random.random((1000,1000))
>>> t = time.time(); dot(A,B); print time.time()-t

Разочарованы результатами? Потратьте 3 минуты времени (не считая компиляции :D) и ускорьте это на порядки! На моём настольном компьютере я получил оценку 12.5 сек. После выполнения указанных операций результат уменьшился до ! И так, рецепт:

# echo "dev-python/numpy lapack" >> /etc/portage/package.use
# emerge numpy lapack-atlas # (1)
... (2) ...

(1) — важно дописать lapack-atlas, иначе будет заюзан lapack-reference для удовлетворения lapack

(2) — тут долго компилится blas-atlas (если во время компиляции падает с сегфолтом, то пересобираем libtool)

Остаётся удостовериться, что всё, что установили — работает: $ eselect lapack list и $ eselect blas list. Обе команды должны нарисовать atlas со звёздочкой напротив него. Теперь снова запускаем numpy, dot(A,B) и любуемся результатом. У меня на том же десктопе вышло в среднем 0.5с. Ускорение почти на 3 порядка! Это всё, удачной линейной алгебры :)

n.b. В Ubuntu это решается установкой пакета “libatlas3gf-sse2”, а на Mac OS X — быстро из коробки.

Комментариев нет:

Отправить комментарий