Nano Hash - криптовалюты, майнинг, программирование

Как улучшить скорость odeint в Python?

Я использую Python и odeint из пакета scipy для решения большого количества (~ 10e6) связанных ODE. Систему уравнений можно сформулировать как сумму некоторых матричных умножений, и я использую для этого numpy с поддержкой blas. Моя проблема в том, что это занимает очень много времени. Когда я профилирую код, я вижу, что большая часть времени уходит на то, чтобы odeint делал что-то еще, кроме оценки rhs. Это пять самых трудоемких вызовов от профилировщика:

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
5       1547.915  309.583 1588.170  317.634 {scipy.integrate._odepack.odeint}
60597   11.535    0.000   23.751    0.000   terms3D.py:5(two_body_evolution)
121194  11.242    0.000   11.242    0.000   {numpy.core._dotblas.dot}
60597   10.145    0.000   15.460    0.000   generator.py:13(Gs2)
121203   3.615    0.000   3.615     0.000   {method 'repeat' of 'numpy.ndarray' objects}

RHS состоит в основном из two_body_evolution и Gs2. Этот профиль предназначен для ~7000 связанных ODE, а вот то же самое для ~4000:

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
5        259.427  51.885   273.316  54.663 {scipy.integrate._odepack.odeint}
30832    3.809    0.000    7.864    0.000  terms3D.py:5(two_body_evolution)
61664    3.650    0.000    3.650    0.000  {numpy.core._dotblas.dot}
30832    3.464    0.000    5.637    0.000  generator.py:13(Gs2)
61673    1.280    0.000    1.280    0.000  {method 'repeat' of 'numpy.ndarray' objects}

Итак, моя главная проблема здесь в том, что «скрытое» время в odeint ужасно масштабируется с количеством уравнений. Есть ли у вас какие-либо идеи, почему это так и как улучшить производительность?

Спасибо за ваше время

Оскар Окерлунд

10.06.2011

Ответы:


1

Это как минимум один из возможных источников количества времени:

Если вы не предоставите якобиан для odeint (т. е. LSODA), он попытается вычислить его через конечные разности. Более того, он может попытаться инвертировать якобиан, который масштабируется как O(m^3), если он считает, что проблема является жесткой. Оба эти шага являются дорогостоящими, когда количество переменных велико.

Вы можете попытаться сократить время, затрачиваемое на эти операции, заставив odeint использовать полосовой якобиан, передав в подпрограмму подходящие значения для параметров ml и mu. Вам не нужно указывать Dfun, эти параметры также применяются к якобиану, вычисленному дифференцированием.

10.06.2011
  • +1. Судя по моему ограниченному опыту в таких вещах, даже не думайте об использовании каких-либо интеграторов ODEPACK для нетривиальных вычислений без предоставления якобианов. 14.06.2011

  • 2

    Десять миллионов уравнений — нетривиальное число.

    Почему вы говорите, что это «ужасно масштабируется»? Сложение матриц равно O(m^2) для матриц m x m, а умножение равно O(m^3). Вы цитируете две точки времени стены по сравнению с количеством уравнений / степеней свободы, но это может описать только прямую линию. Я бы выбрал пару промежуточных точек между 4K и 10M и посмотрел, покажет ли обозначение Big-Oh, как оно масштабируется. Соответствуйте результатам полиному 3-го порядка времени стены по сравнению с DOF; это скажет вам, как все масштабируется.

    Ваши уравнения линейные или нелинейные? Статическая или переходная? В зависимости от типа проблемы вы можете поиграть с некоторыми другими параметрами, такими как размер временного шага, критерии сходимости, выбор схемы интеграции и т. д.

    10.06.2011
  • Я подогнал время к m (матрица mxm), и оно масштабируется немного хуже, чем m ^ 6, и я ожидал что-то в строке m ^ 3 или, может быть, m ^ 4 из-за умножения matirx. 12.06.2011
  • Уравнения линейные и нестационарные, я также пытался снизить допуски сходимости, и это не оказывает существенного влияния. 12.06.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..