У меня есть трудная оптимизация программы, которая опирается на функцию ad
s conjugateGradientDescent
для большинства ее работ.Как получить больше производительности от автоматической дифференциации?
В основном мой код является переводом old papers code, который написан в Matlab и C. Я не измерял его, но этот код работает с несколькими итерациями в секунду. Шахта в порядке минут на каждую итерацию ...
код доступен в этом репозитории:
Код в вопросе может быть запущен следующий эти команды:
$ cd aer-utils
$ cabal sandbox init
$ cabal sandbox add-source ../aer
$ cabal run learngabors
Использование GHC ы профилирование средства я подтвердил, что спуск на самом деле та часть, которая принимает большую часть времени:
(интерактивная версия здесь: https://dl.dropboxusercontent.com/u/2359191/learngabors.svg)
-s
говорит мне, что производительность довольно низкая:
Productivity 33.6% of total user, 33.6% of total elapsed
Из того, что я собрал, есть две вещи, которые могут привести к повышению производительности:
Unboxing: В настоящее время я использую реализацию пользовательской матрицы (в
src/Data/SimpleMat.hs
). Это был единственный способ получитьad
для работы с матрицами (см .: How to do automatic differentiation on hmatrix?). Я предполагаю, что с использованием матричного типа, такого какnewtype Mat w h a = Mat (Unboxed.Vector a)
, вы достигнете лучшей производительности из-за распаковки и слияния. Я нашел some code, который имеетad
экземпляров для распакованных векторов, но до сих пор я не смог использовать их сconjugateGradientFunction
.Матричные производные: В электронной почте я просто не могу найти на данный момент Эдвард упоминает, что было бы лучше использовать
Forward
экземпляры для типов матриц вместо того матриц, заполненныхForward
экземпляров. У меня есть слабое представление о том, как этого достичь, но пока не поняли, как реализовать его в классах классовad
.
Это, вероятно, вопрос, который слишком велик, чтобы ответить на SO, так что если вы готовы помочь мне здесь, не стесняйтесь связаться со мной по Github.
Вопрос для аудитории: работает ли cabal что-то вроде runhaskell под капотом, то есть является частью проблемы, которую этот код интерпретируется вместо компиляции? –
@ JohnF.Miller 'cabal run' запускает скомпилированный код. Запуск того же самого из GHCi (т.е. использование ': main') еще медленнее. – fho