¿Alguna sugerencia para hacer que el código R use múltiples procesadores?

28

Tengo scripts R para leer grandes cantidades de datos csv de diferentes archivos y luego realizar tareas de aprendizaje automático como svm para la clasificación.
¿Hay alguna biblioteca para hacer uso de múltiples núcleos en el servidor para R.
o
cuál es la forma más adecuada de lograrlo?

mohans
fuente
Simplemente no veo cómo el hecho de importar datos y ejecutar SVM tiene alguna relevancia para la pregunta. Es por eso que creo que es más una pregunta SO. Pero podría ver a Xrefs como una buena solución a largo plazo ya que es R ...
Shane
3
No tengo ningún problema con este tipo de preguntas y respuestas aquí. R no es un lenguaje tan común (como Python o Java) que una cantidad diría naturalmente: "Oh, esta es una pregunta de programación general, así que debería ir a StackOverflow o similar y preguntar o buscar soluciones". En realidad, es más una pregunta para una lista de correo R o un sitio grupal. Para servir a aquellos analistas en ciernes que desean aprender R, también deberíamos tener una respuesta aquí.
Paul
2
Vote para mantenerse abierto; muy relevante para los estadísticos porque las formas en que nuestros problemas pueden o no dividirse en flujos paralelos es relevante para la pregunta que se hace.
russellpierce
@chl: Gracias por aumentar esto. De hecho, revisé todas las referencias no comerciales de este hilo poco después de que apareció, pero no pude encontrar nada que funcione en Win 7 x64.
whuber
1
Mientras tanto, la solución que presento funciona con win 7 y no es comercial (lea la publicación a la que me vinculé para obtener más detalles). Se incluye con un entorno comercial, pero se puede separar de él (como mi publicación muestra cómo). Y el código en sí es GPL ...
Tal Galili

Respuestas:

16

Si está en Linux, entonces lo más directo es multinúcleo . Más allá de eso, sugiero echar un vistazo a MPI (especialmente con el paquete de nieve ).

Más en general, eche un vistazo a:

  1. La vista de computación de alto rendimiento en CRAN.
  2. "Estado del arte en computación paralela con R"

Por último, recomiendo usar el paquete foreach para abstraer el backend paralelo en su código. Eso lo hará más útil a largo plazo.

Shane
fuente
Principalmente uso multinúcleo, aún me gusta la nieve más que la nieve y Rmpi ​​por su tolerancia a fallas y su interfaz limpia.
@mbq +1 para nevadas: abstrae la nieve aún más y hace que la computación paralela con R sea bastante simple.
Sharpie
6

Si está utilizando GNU / Linux, las respuestas anteriores de Shane y Dirk son geniales.

Si necesita una solución para Windows, hay una en esta publicación:

Procesamiento paralelo multinúcleo con R (en Windows)

Aunque el paquete aún no está en CRAN. se puede descargar desde ese enlace.

Tal Galili
fuente
5

Shane tiene razón. Tanto multinúcleo como Rmpi son ganadores.

Una cobertura ligeramente más amplia del tema se encuentra en la vista de tareas CRAN sobre computación de alto rendimiento . Esto también enlaza con un artículo de encuesta bastante reciente sobre computación paralela con R de JSS.

Por último, algunos ejemplos prácticos y consejos se encuentran en el tutorial Introducción a HPC con R que doy de vez en cuando; vea la página de presentaciones para obtener la copia más reciente de la semana pasada en useR.

Dirk Eddelbuettel
fuente
Bueno, se necesitan mutexes. Cuando comenté su respuesta, solo vi la primera versión (en bruto) y pensé bien, puedo ampliar en mc y Rmpi. Y luego lo hiciste y me veo como un imitador. Así es la vida.
Dirk Eddelbuettel
Por otro lado, mi respuesta se deriva de leer su trabajo / presentación en el pasado. Así que supongo que también te estoy copiando.
Shane
5

Noté que las respuestas anteriores carecen de algunas consideraciones generales de HPC.
En primer lugar, ninguno de esos paquetes le permitirá ejecutar un SVM en paralelo. Entonces, lo que puede acelerar es la optimización de parámetros o la validación cruzada, aún así debe escribir sus propias funciones para eso. O, por supuesto, puede ejecutar el trabajo para diferentes conjuntos de datos en paralelo, si es un caso.
El segundo problema es la memoria; si desea distribuir el cálculo en unas pocas computadoras físicas, no hay almuerzo gratis y debe copiar los datos; aquí debe considerar si tiene sentido predistribuir una copia de los datos en las computadoras para guardar alguna comunicación. Por otro lado, si desea utilizar múltiples núcleos en una computadora, entonces el multinúcleo es especialmente apropiado porque permite que todos los procesos secundarios accedan a la memoria del proceso primario, por lo que puede ahorrar algo de tiempo y mucho espacio en la memoria.


fuente
1
+1 Gran punto sobre cómo esto no se trata de dividir la validación cruzada.
Shane
Por cierto, ha habido un trabajo reciente (2013) para habilitar HPC para SVM individuales por dCSE ( hector.ac.uk/cse/distributedcse/reports/sprint03/… ). Hay un paquete sprintpara R con una función psvm, pero están un poco atrasados ​​en mantenerse al día con los cambios de R 3.0 y las nuevas pautas de envío de CRAN, por lo que la descarga actual no está disponible en CRAN ni es totalmente compatible con R 3.0. Su experiencia puede ser diferente.
estrella brillante
3

Las respuestas de Shane y Dirk son acertadas.

Sin embargo, es posible que desee echar un vistazo a una versión comercial de R, llamada Revolution R, que está diseñada para manejar grandes conjuntos de datos y ejecutarse en múltiples núcleos. Este software es gratuito para académicos (que podría ser su caso, no lo sé)

Dave Kellen
fuente
55
Estoy en desacuerdo un poco. Revolution hace un gran trabajo de ventas al obtener el reparto mental (como lo demuestra su publicación), pero a partir de ahora hay muy poco en el producto que no obtendría con la R normal (al menos en Linux). Intel MKL, claro, pero puedes obtener Goto Blas. En Windows, ofrecen doSMP que ayuda, ya que no se puede construir multinúcleo allí.
Dirk Eddelbuettel
2
Pero, por supuesto, doSMP es exactamente lo que el OP estaría buscando si estuvieran trabajando en un entorno Windows.
russellpierce