Pull to refresh
409
0
Роман @Ariman

ML-исследователь

Send message

Я бы не назвал это революцией, потому что это уже делают. Но это точно повысит привлекательность этого кода до коммерческой)


Ну, я на это уже отвечал. "Таких винтовок много, но эта - моя")
Хотя на самом деле - не то чтобы много. Даже если опустить тот момент, что мне захотелось разработать эту штуку самому, она еще и на других технологиях. Этот симулятор полностью на питоне, что позволяет его очень легко стыковать с пайплайном машинного обучения. Я его сделал для не для исследований химических реакций, а для исследований в области машинного обучения, прежде всего.
И мне копаться в своем питоновском коде (зная каждую его строку, каждый компромисс, каждую оптимизацию) куда проще, чем прикручивать к питоновскому пайплайну с пайторчем эту махину на C++ и перекомпилять ее каждый раз, когда мне потребуется там что-то отрезать или прикрутить)

Оверхед от питона очень незначительный, большую часть времени идут расчеты сил. На втором месте рендер, но он дергается намного реже.

Примерно так это выглядит)

Ну вот пример из заголовка, с достаточно высокоэнергетическим столкновением при 10 под-шагах выдает у меня около 50 FPS, реалтайм. При ~30к частиц. У моей подруги на 2060 дает 60 FPS на тех же настройках. Все зависит от количества под-шагов, а оно зависит от предельной энергии, которую может выдержать симуляция, не развалившись) В этом случае 10 хватает, чтобы не бомбануло.

В более затратных, типа дистилляции, конечно, либо сам процесс будет идти медленно - у меня тоже примерно 40 FPS выдает, но сама дистилляция длится 10 минут (в видео ускорено в 10 раз) - либо надо повышать энергию частиц вместе с количеством под-шагов.
65к частиц примера vortex, где они с большими энергиями крутятся, у меня идет на 15 фпс примерно, на ноуте.

Нет, 3д я пока не планирую, там нужно много чего менять будет прямо в самом сердце алгоритма, в расчете сил. Сейчас он базируется на 2д hash-grid (или, как я это зову, "поле индексов"), и этот код я достаточно долго оптимизировал - собственно, эти графики - это как раз и есть процесс оптимизации, я пробовал разные штуки и замерял скорость. В 3д нужно уже что-то другое придумывать и снова оптимизировать.
Я, скорее, вместо 3д буду пытаться 2д ускорить, очень уж хочу дистилляцию быструю и в реалтайме.

Спасибо на добром слове) У меня на этот год намечены несколько проектов, если никакой очередной пиздец не наступит, попробую их довести до значимых майлстоунов. Один проект прямо сильно на базе его кода, другой - скажем так, на опыте, который я получил из реализации симулятора, с некоторым заимствованием кода из него, и третий - это вот исследования, связанные с обучением нейросети этой динамике.

Если я правильно помню, то волновая функция еще и растет размерностью вместе с количеством частиц, то есть если одна частица может двигаться в трех измерениях, ее волновая функция будет трехмерная, а если таких частиц две - то уже в шести)
В смысле, пространство-то и остается трехмерным, но именно изменения в конфигурации волновой функции путешествуют уже в их совместных шести.

Нет, в сторону квантовых симуляций я пока не смотрел. Это тоже, конечно, интересно) Но я все-таки хотел бы сначала попробовать ускорить расчеты в 2д при помощи нейросетки. Не знаю, получится или нет, я пока только в самом начале исследований.

А зачем? Чтобы узнать силу взаимодействия и увидеть, что она меньше, чем эпсилон, надо сначала ее посчитать, то есть посчитать взаимодействие со всеми частицами из окружения, что сводит на нет смысл такой "оптимизации".

Другое дело, что я сходу не считаю взаимодействия на расстоянии больше некоторого предельного радиуса - это получается само собой за счёт того, что все взаимодействия тут локальные, частица взаимодействует только со своим непосредственным окружением как раз в этом предельном радиусе. Это автоматически ведёт к тому, что она не взаимодействует с частицами на расстояниях, на которых сила пренебрежимо мала.

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

Поэтому тамошние частички очень упрощённо взаимодействуют друг с другом и не образуют макро-структур. Вы не увидите в Нойте результатов столкновений типа того, что в заголовке поста, не будет слипающихся друг с другом "осколков", не будет настоящего кипения и т.п. Это я не к тому, что "а-ха-ха, смотрите, а у меня лучше", а к тому, что это разные модели для разных задач.

Если у меня получится ускорить вычисления при помощи нейросети, попробую собрать на этом какой-нибудь интерактив)

Кстати, то количество частиц, что в примере impact, в целом, более-менее реалтаймово тянется. ФПС на 20 вместо 50, но всё-таки. Но все красивые штуки, в основном, требуют большую плотность энергии, а значит - увеличение количества под-шагов интегрирования. Дистилляция, например, тоже даёт примерно 30 ФПС, но она при этом в 10 раз медленнее идёт, чем в гифке и на видео - в игре это не особо прикольно было бы, ждать 10 минут, пока у тебя зелье сварится.

Да, ведут, вон я их кипячу и дистиллирую)

Модели, которые описывают усреднённую динамику частиц я пока не использовал - собственно, это и есть одна из причин, по которым я начал этот проект - мне интересно, можно ли получить нейросеть, которая будет повторять динамику этих моделей (типа того же Навье-Стокса), но при этом выведет ее сама из данных, полученных при симуляции жидкостей на уровне частиц.

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

По поводу второго тезиса - ну, "вселенная как нейросеть" это, конечно, может быть чересчур, но сам подход "мы ищем модель, которая будет согласоваться с наблюдениями и при этом минимизировать вычислительные затраты", как мне кажется, может оказаться полезным.

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

Разумеется, я отдаю себе отчёт в том, что настоящие физические модели, которые описывают квантовые поля - это совсем не то же самое, что точечные частички в потенциале) Но принципы, которые я упомянул, мне кажется, в той или иной мере могут быть экстраполированы.

Ну, конечно не учитывается - это же нужно, получается, параллельно моделировать электромагнитные эффекты - совсем другая задача. Максимум, что я в этом плане делал - "подкладывал" под симулируемые частицы вторую симуляцию, распространения волн в плоскости - это не особо "физично" было, в том смысле, что я не стремился этим промоделировать какие-то реальные эффекты, скорее было просто интересно, что из этого получится (я так симулировал звук от своего парового двигателя на этих частичках) - ну вот можно в это поле энергию сливать) Будет poor man's "излучение")

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

и обучение производится не на симуляциях, а на эмпирических данных, что логичнее

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

Да, я в курсе, что такие исследования проводятся и это теоретически возможно на самых разных уровнях реализации. Но, как в том фильме - "Винтовок много, но эта - моя") как правило в таких задачах огромное количество "подвижных частей", столько всего можно реализовать по-разному, столько тонкостей, которые влияют на результат и которые в статьях обычно опускаются.

Мне интересно именно посмотреть, что получится на практике конкретно у меня, с моими ресурсами, конкретно на тех задачах, которые интересуют меня.

Про Ванчурина не слышал, спасибо, ознакомлюсь. Да-да, мне тоже кажется, что такие модели и исследования ещё внесут масштабный вклад в наше понимание мира, рад, что есть люди, которые этим занимаются на таком уровне, целыми НИИ.

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

Я подбирал лосс-функцию исходя чисто из желания "чтобы симуляция не бомбила и выглядела более-мне правдоподобно", и пришел к тому, что надо оптимизировать дельту энергий состояний, помноженную на дельту времени - в смысле, что на практике было бы идеально совершать максимально длинные шаги, при этом вызывающие минимальное отклонение в энергии. Ну, или если шаг фиксированный, то просто минимизировать эту величину. Величина получается в джоуль-секундах. "Где-то я это видел", подумал я) И вспомнил, что это, вообще говоря, action, который в The Principle Of Stationary Action, фундаментальнейшем принципе физики)

Добавим сюда же следующее наблюдение: в идеале надо бы шаг интегрирования сделать не общим для всех частиц, а локальным - ну то есть, вот в этой симуляции столкновения, допустим, приходится делать достаточно много под-шагов, чтобы не "бомбануло", из-за высокой энергии столкновения. Но ведь вдали от точки столкновения в течение долгого времени частицы весьма "холодные", они себя нормально ведут даже при очень маленьком количестве шагов интегрирования! Если бы удалось реализовать увеличение количества под-шагов (уменьшения шага интегрирования) в зависимости от плотности энергии... Но опять я это где-то видел - это же time dilation!)

Вообще, если уж так фантазировать, то это выглядит так, будто вселенная старается оптимизировать вычислительные ресурсы при помощи принципа стационарного действия, замедления времени и второго закона термодинамики (стараясь максимально рассеять энергию в пространстве, повышая энтропию и снижая плотность энергии, а значит, и количество необходимых вычислительных мощностей) - все ресурсы идут на вычисление всяких крутых высокоэнергетичных штук типа нейтронных звёзд и черных дыр, а остальное достается менее вычислительно-затратная областям)

Но, конечно, это запросто может быть "поиск глубинного смысла" там, где его нет. В любом случае, у меня пока даже не получилось сделать шаг локальным - симуляция взрывается при взаимодействии двух областей с разными шагом интегрирования) Возможно, с этим можно что-то сделать, но пока я этот вопрос отложил. В любом случае, это все очень интересно)

Ну я же выше писал... И в самой статье. В зарубежной литературе это зовут hash grid.

Я использую что-то вроде hash grid, чтобы обеспечить локальность взаимодействий - в 2д массив записываю индексы частиц в соответствии с их координатами (я это зову полем индексов),

Да, там может быть несколько частиц, считайте, что на каждой клеточке стоит колонка, в которой может вообще не быть частиц, а может быть одна или несколько, тред этой клеточки по ним последовательно проходит, просто пока не встретит невалидный индекс.

Так как r_{min} я задаю около 1.0 (в редких случаях, типа симуляции химии с молекулами может быть что-то типа 0.7), система естественным образом стремиться частицы раскидать так, чтоб в клеточке больше одной не было. Они могут туда влететь на короткое время, за счет своей энергии, но ненадолго, и редко когда их там больше штук 3-5.
Да, если по каким-то причинам в симуляции бешеная плотность частиц, то этот "столбик" может заполниться, наверное - для этого у меня там даже есть print, который об этом скажет, но до сих пор такого не было, потому что это все раньше отвалится из-за недостаточного шага интегрирования, либо вовсе до этого не дойдет, если шаг будет достаточным (тогда частицы просто успеют провзаимодействовать раньше и разлететься).

Я почему это все зову по-своему - во-первых, я это дело писал сам, в смысле, чисто решал эту задачу, как мне казалось правильно и эффективно, и только потом узнал, что у этого есть какое-то свое название, а во-вторых - я же это все в машинном обучении использовал, а там все эти индексы пропадают, сетка видит только окружение частиц, как картинку. Для нее это - как будто обсчет небольшого кусочка поля, она выполняет локальный расчет на своем квадратике. Поэтому, по аналогии и "поле индексов" - такое фейковое поле, которое обеспечивает локальность расчетов, когда их производит не сетка, а написанный ручками код.

Список и не надо, каждая клетка квадрата - это отдельный поток. Все, что ему нужно сделать - это обратиться к "полю индексов" в соответствии со своей позицией, и посмотреть, есть ли в этом месте частица. Если есть - посчитать, какое от нее будет воздействие на ту, к которой он принадлежит, и добавить результат к переменной-аккумулятору сил. Это же на видюхе все считается, каждая клетка каждого квадратика обсчитывается отдельным тредом.

Да, я подписан на этого товарища. Но мое видео вышло раньше) Впрочем, я думаю, что у любого, кто закодил физику частиц, независимо ни от кого возникает желание заставить их падать, складываясь в картинку)

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

Ну, one step at a time. Как я упоминал в статье, практическая сторона этого вопроса мне тоже очень интересна, поэтому я, собственно, и начал эксперименты - но не стал сразу замахиваться на сверхсложные модели, нужно сначала отработать технологию в 2д) А так - да, очень может быть, это одно из направлений, в котором сетки активно применяют. Я точно знаю, что Дисней разрабатывал технологию, ускоряющую расчет рассеивания света в облаках за счет обученной нейросетки - там как раз такой же принцип - учим на медленной симуляции, потом используем быструю сетку.

Но такое применение довольно очевидно любому, кто хоть чуть-чуть сталкивался с нейросетями. Проблемы начинаются именно в реализации, там хренова тонна вещей, которые можно реализовать по-разному, и, вообще говоря, никто не скажет заранее, какой из вариантов лучше, какой хуже, а какой вообще не заработает. Я вот совсем не сразу подобрал подходящий энкодинг, архитектуру, да и вообще задолбался этот пайплайн строить и отлаживать) Но все-таки сетка обучилась, хотя пока, конечно, медленнее чем мой, довольно оптимизированный, код расчета. Сейчас вот отдохну немного от релиза, и продолжу эксперименты. Мне очень хочется реалтайм дистилляцию получить) Хочу алхимию)

А почему, кстати, не запустить в коллабе? Я этот код удаленно на своей линуксовой машине стартовал вообще без проблем. Только рендер надо отрубить - ну, точнее, не надо врубать, он отдельно от симулятора. И мне кажется должно стартануть.

Это и есть "Метод Вереле", все целиком. Тут нет двойного интегрирования, в смысле, это не то что мы сначала применяем этот интегратор к x'' получая x', а потом к x' получая x. Вместо этого позиция считается напрямую, как если бы тело двигалось под действием постоянной силы. Мы сразу получаем точное (ну, в пределах точности метода) приращение координат.

Не очень понял вопрос - в каком смысле, что происходит с энергией? Частицы обладают потенциальной энергией из-за своей позиции в потенциале Леннарда-Джонса, она меняется вместе с изменением их координат. Еще они обладают кинетической энергией, которая половина квадрата скорости помноженная на массу. Она меняется вместе с изменением скорости при движении частицы в направлении минус градиента потенциала - как и положено, они друг в друга перетекают и их сумма для всей системы даже более-менее остается постоянной, за вычетом дрифта из-за неточности интегрирования. Если шагов интегрирования мало, а энергии столкновений большие, то этот дрифт становится больше. Если очень большие, то он начинает расти с каждым отсчетом и симуляция "взрывается".

Нет, только свою. На каждую частицу порождается NxN тредов, смотрящих ее окружение.

А в чем разница? В том, что тут дергается нумба, которая из части этого питона собирает код для GPU?

Ну, я подходил с практической точки зрения - "чистый питон" в том смысле, этот код можно сразу пристыковать к любому питоновскому ML-пайплайну, не городя никаких "переходников", ничего не перекомпиляя и т.п.

Нет-нет, масса есть, конечно. Потенциал отвечает за действующие силы, а ускорение из этих сил считается, как обычно, a = F / m.

А 0.5 там потому что так устроено это интегрирование Вереле - по сути этот интегратор говорит "Между дискретными отсчётами будем считать, что всё происходит равноускоренно/равнозамедленно", то есть, под действием постоянной силы. В качестве этого ускорения берется средняя величина между ускорением в прошлом отсчёте и новым, посчитанным из сил на этом шаге. Отсюда и 0.5)

dt - это время между отсчётами, да. Но это не совсем время между кадрами, на каждый кадр идёт N под-шагов. Величина N зависит от энергий в симулируемой системе. Это одна из поразительных вещей, вроде и простая, но не сразу очевидная: виртуальная энергия не "бесплатная", нельзя просто так взять и добавить энергию в столкновение, например - за нее придется платить возросшими затратами реальной энергии, идущей на вычисления, потому что придется делать больше шагов интегрирования. Иначе "бомбанет")

Information

Rating
Does not participate
Location
Москва, Москва и Московская обл., Россия
Date of birth
Registered
Activity