¿Cómo puedo optimizar la eficiencia computacional al ajustar un modelo complejo a un gran conjunto de datos repetidamente?

12

Tengo problemas de rendimiento al usar el MCMCglmmpaquete en R para ejecutar un modelo de efectos mixtos. El código se ve así:

MC1<-MCMCglmm(bull~1,random=~school,data=dt,family="categorical"
, prior=list(R=list(V=1,fix=1), G=list(G1=list(V=1, nu=0)))
, slice=T, nitt=iter, ,burnin=burn, verbose=F)

Hay alrededor de 20,000 observaciones en los datos y están agrupadas en alrededor de 200 escuelas. Eliminé todas las variables no utilizadas del marco de datos y eliminé todos los demás objetos de la memoria, antes de ejecutarlos. El problema que tengo es que lleva mucho tiempo ejecutarlo, a menos que reduzca las iteraciones a un número inaceptablemente pequeño. Con 50,000 iteraciones, toma 5 horas y tengo muchos modelos diferentes para ejecutar. Por lo tanto, me gustaría saber si hay formas de acelerar la ejecución del código u otros paquetes que pueda usar. Estoy usando MCMCglmmporque quiero intervalos de confianza para los efectos aleatorios.

Por otro lado, esperaba obtener una nueva PC más adelante este año, pero con un poco de suerte podría presentarla, así que me he estado preguntando cómo gastar mejor una cantidad limitada de dinero en hardware nuevo: más RAM , CPU más rápida, etc. Al mirar el administrador de tareas no creo que la RAM sea el problema (nunca supera el 50% del uso físico), pero el uso de la CPU tampoco supera el 50%, lo que me parece extraño . Mi configuración actual es un Intel Core i5 2.66GHz, 4GB RAM, 7200rpm HDD. ¿Es razonable obtener la CPU más rápida posible, a expensas de RAM adicional? También me preguntaba sobre el efecto del tamaño de caché de CPU de nivel 3 en problemas informáticos estadísticos como este.

Actualización: Después de haber preguntado en meta SO, me han aconsejado que reformule la pregunta y publique en Superuser. Para hacerlo, necesito dar más detalles sobre lo que está sucediendo "debajo del capó" en MCMCglmm. ¿Estoy en lo cierto al pensar que la mayor parte del tiempo de cálculo se dedica a la optimización, es decir, encontrar el máximo de alguna función complicada? ¿La inversión matricial y / u otras operaciones de álgebra lineal también es una operación común que podría estar causando cuellos de botella? Cualquier otra información que pueda dar a la comunidad de Superusuarios sería muy agradecida.

Joe King
fuente
No creo que deba sorprendernos que MCMC tarde mucho tiempo en tales problemas. Estoy seguro de que probablemente haya formas de hacerlo correr más rápido. Pero dar una respuesta correcta todavía va a tomar tiempo.
Michael R. Chernick
@Michael Chernick, gracias. Sé que aún llevará tiempo. Me gustaría minimizarlo tanto como sea posible, eso es todo. Mi padre tiene un Oracle SPARC T4 en su trabajo y que ejecuta MCMC bastante rápido;)
Joe King
3
@JoeKing, he editado tu título para que sea más descriptivo y quizás atraiga a más usuarios que puedan ayudarte. También descubrí que adaptar lmer()modelos a grandes conjuntos de datos puede llevar bastante tiempo, especialmente si necesita hacerlo muchas veces. Una respuesta a su pregunta puede estar en la computación paralela, aunque otros usuarios (por ejemplo, @DirkEddelbuettel) serían mucho más útiles que yo con esto. También existe la posibilidad de que obtenga mejores respuestas en stackoverflow.
Macro
Macro, gracias por la útil edición. También lo he usado glmer(como saben por mis otras publicaciones) y eso toma alrededor de 20 segundos, pero el problema es que no da intervalos de confianza o errores estándar, y por lo que leí en una lista de correo, archivé al autor del lme4El paquete dice que la distribución de muestreo de los efectos aleatorios puede ser muy sesgada, por lo que esas estadísticas no se informan. En realidad, descubrí desde MCMCglmmahora que en mi caso se están acercando a la normalidad (no es que esto ayude mucho, solo digo). ¿Sería mejor si solicito migrarlo a SO?
Joe King
1
No conozco los detalles de mcmcglmm, pero he usado mucho los métodos MCMC. Lo bueno de MCMC es que es vergonzosamente paralelizable (¡es un término técnico!). Si tiene varios núcleos, ejecuta cadenas independientes en cada uno y luego agrupa los resultados. Así es como ejecuto MCMC, pero he escrito mis propios códigos C ++ paralelos (usando MPI) para hacerlo. En términos de consejos de hardware, busque algo con la mayor cantidad de núcleos posible. Eso supone que cualquier herramienta que esté utilizando puede aprovechar los múltiples núcleos. En términos de información para dar SU en su pregunta, averigüe si puede utilizar núcleos.
Bogdanovist

Respuestas:

3

¿Por qué no ejecutarlo en el servicio de computación en la nube EC2 de Amazon o un servicio similar? MCMCpackes, si no recuerdo mal, mayormente implementado en C, por lo que no será mucho más rápido a menos que disminuya la complejidad de su modelo, las iteraciones, etc. Con EC2 o servicios similares de computación en la nube, puede tener múltiples instancias en cualquier especificaciones que desee y ejecute todos sus modelos a la vez.

Zach
fuente
Una modificación a esto: ejecutar en m2.4xlarge (la opción de RAM de 68.7GB) es una única forma de garantizar que está obteniendo la máquina completa, de modo que no necesariamente tenga problemas de almacenamiento en caché de RAM que pueden ocurrir en máquinas virtuales (máquinas virtuales) / AMI) que se ejecutan en una fracción de la máquina.
Iterator