Я борюсь с реализацией производительной версии алгоритма SOM Batch в Spark / Pyspark для огромного набора данных с> 100 функциями.У меня такое ощущение, что я могу либо использовать RDD, где я могу / должен сам определять параллизацию, либо использовать Dataframe, который должен быть более производительным, но я не вижу способа использовать что-то вроде локальной переменной накопления для каждого работника при использованииdataframes.
Идеи:
- Использование аккумуляторов.Распараллелить вычисления, создав UDF, который принимает наблюдения в качестве входных данных, вычисляет воздействия на сеть и отправляет воздействия на накопитель в драйвере.(Реализовал эту версию уже, но, кажется, довольно медленно (я думаю, обновления аккумулятора занимают много времени))
- Сохраните результаты в новом столбце Dataframe, а затем суммируйте его вместе в конце.(Придется хранить целую нейронную сеть в каждой строке (например, 20 * 20 * 130), хотя) Осознают ли алгоритмы искровой оптимизации, что не нужно сохранять каждую сеть, а только суммировать их вместе?
- Создайте пользовательские парализованные алгоритмы, используя RDD, подобные следующим: https://machinelearningnepal.com/2018/01/22/apache-spark-implementation-of-som-batch-algorithm/ (но с более производительными алгоритмами вычисления).Но мне нужно было бы использовать какой-то цикл для циклического перебора каждой строки и обновления сети -> звучит так, что это будет довольно бесполезно.)
Есть какие-нибудь мысли по поводу различных вариантов?Есть ли еще лучший вариант?
Или все идеи не так уж хороши, и я должен просто предварительно выбрать подмножество максимального разнообразия своего набора данных и обучить SOM локально на этом.Спасибо!