Comments 13
Спасибо за статью!
Что дальше и можно ли что-то улучшить..:
...
"Немножко" над clean code поработать, чтобы этим кодом можно было пользоваться больше одного раза.
Знаете, что мне осталось сразу не очень понятным? Spark хорош в ситуации легкого масштабирования, например при наличии ярн кластера, ну и хотя бы сотни-тысячи ядер. У вас, как я понимаю, два узла (ядер соответственно скорее всего штук 20?), а сколько в наличии GPU вообще как-то не уловилось. В чем был смысл смешивать спарк и докер? Чтобы запуститься под windows (потому что драйверы для нужных GPU не работают в линуксе?
Драйверы для всех GPU имеются для линукса. У меня есть доступ только к виндовым машинам, линукс накатить нет возможности, а VMWare и VirtualBox не позволяют проводить такие манипуляции с GPU, остался вариант только с WSL.GPU в наличии по одному на каждой машине: 2060, 1650; с возможностью добавить на одну из машин 1080 Ti.
Вторая причина кроется в варианте использования той же DJL без Spark, но на GPU.
Третья причина (сейчас будет дилетантское суждение, так как изучил вопрос лишь поверхностно) - образ воркера для Kubernetes Operator должен содержать необходимый JVM, либы и скрипт обнаружения ресурсов, то есть все равно пришлось бы делать образ.
А так - да, Standalone кластер в докере - оверхэд и не нужно, для Yarn-Mesos слишком мало машин и ресурсов, а до кубера на винде я пока еще не дошел, и вряд ли дойду :)
Не очень представляю, как вам такое удалось :) Там конечно есть (с десяток наверное) параметров настройки, но мы как в начале их настроили, так только размеры буфера иногда крутим, когда очень широкие таблицы попадаются под руку. А вот настройка производительности, это да, это тема неисчерпаемая.
Почти все руководства, какие имеются в сети, рассчитаны исходя из того, что вы на кластере один, и можете распоряжаться ресурсами как хотите — в то время как в жизни у нас на кластере сотни и тысячи контейнеров, мы даже упирались в пределы масштабирования ярна, когда в его очереди было порядка тысяч задач, он перестает справляться. И выбор настроек в таком случае — это вообще задача без простых решений.
Обязательно вернусь с подробностями в эту ветку, как будет время, прямо сейчас не готов развернуто ответить.
Дело обстоит следующим образом:
Подключение Kryo в случае с Rapids:
.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
.set("spark.kryo.registrator", "com.nvidia.spark.rapids.GpuKryoRegistrator")
.set("spark.kryo.registrationRequired", "true")
.registerKryoClasses(new Class<?>[]{LongValue.class})
Вызываем метод http://localhost:9090/gpu_test, получаем:
org.apache.spark.SparkException: Job aborted due to stage failure: Failed to serialize task 0, not attempting to retry it. Exception during serialization: java.io.IOException: java.lang.IllegalArgumentException: Class is not registered: org.apache.spark.sql.catalyst.InternalRow
Note: To register this class use: kryo.register(org.apache.spark.sql.catalyst.InternalRow.class);
Предвидя следующую ошибку, сразу указываем InternalRow[]:
.registerKryoClasses(new Class<?>[]{InternalRow.class, InternalRow[].class, LongValue.class})
При вызове http://localhost:9090/gpu_test получаем:
Request processing failed; nested exception is org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 0.0 failed 4 times, most recent failure: Lost task 0.3 in stage 0.0 (TID 6) (172.17.0.5 executor 0): java.lang.IllegalStateException: unread block data
В логах экзекутора:
22/08/01 17:16:10 ERROR Utils: Exception encountered
org.apache.spark.SparkException: Failed to register classes with Kryo
...
Caused by: java.lang.ClassNotFoundException: com.mlwebservice.model.LongValue
at java.net.URLClassLoader.findClass(URLClassLoader.java:387)
Решение пока не нашел.
Вот только если extraClassPath попробовать, так как при старте драйвер отправляет джарник с классом на воркер, иначе бы джоба не поехала; и в логах экзекутора соответствующая запись имеется:
INFO Utils: Fetching spark://172.17.0.6:33139/jars/service.jar to /tmp/spark-cc20e07c-527f-416a-95a7-479a902201fe/executor-04e6f504-1930-43ac-a872-8a7202e64589/spark-c043a020-cc10-410c-8988-371a1c33ffe4/fetchFileTemp8189536983640938756.tmp
Вернусь с результатами так же в коменты, спасибо!
Спасибо за статью!
Варианты использования Java ML библиотек совместно со Spring, Docker, Spark, Rapids, CUDA