Comment puis-je optimiser l'efficacité de calcul lors de l'adaptation répétée d'un modèle complexe à un grand ensemble de données?

12

J'ai des problèmes de performances en utilisant le MCMCglmmpackage dans R pour exécuter un modèle d'effets mixtes. Le code ressemble à ceci:

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)

Il y a environ 20 000 observations dans les données et elles sont regroupées dans environ 200 écoles. J'ai supprimé toutes les variables inutilisées de la trame de données et supprimé tous les autres objets de la mémoire, avant d'exécuter. Le problème que j'ai, c'est qu'il faut beaucoup de temps pour s'exécuter, à moins que je ne réduise les itérations à un nombre inacceptable. Avec 50 000 itérations, cela prend 5 heures et j'ai de nombreux modèles différents à exécuter. Je voudrais donc savoir s'il existe des moyens d'accélérer l'exécution du code ou d'autres packages que je pourrais utiliser. J'utilise MCMCglmmparce que je veux des intervalles de confiance pour les effets aléatoires.

D'un autre côté, j'espérais obtenir un nouveau PC plus tard cette année, mais avec un peu de chance, je pourrai peut-être le présenter, alors je me demandais comment dépenser au mieux un montant limité d'argent sur du nouveau matériel - plus de RAM , CPU plus rapide, etc. En regardant le gestionnaire de tâches, je ne pense pas que la RAM soit le problème (elle ne dépasse jamais 50% de la consommation physique), mais l'utilisation du CPU ne dépasse pas non plus 50%, ce qui me semble étrange . Ma configuration actuelle est un Intel Core i5 à 2,66 GHz, 4 Go de RAM, un disque dur à 7 200 tr / min. Est-il raisonnable d'obtenir le processeur le plus rapide possible, au détriment de la RAM supplémentaire? Je me suis également interrogé sur l'effet de la taille du cache du processeur de niveau 3 sur des problèmes de calcul statistique comme celui-ci?

Mise à jour: Après avoir demandé sur méta SO, on m'a conseillé de reformuler la question et de poster sur Superuser. Pour ce faire, je dois donner plus de détails sur ce qui se passe "sous le capot" dans MCMCglmm. Ai-je raison de penser que la majeure partie du temps de calcul est consacrée à l'optimisation - je veux dire trouver le maximum d'une fonction compliquée? L'inversion de matrice et / ou d'autres opérations d'algèbre linéaire sont-elles également une opération courante qui pourrait provoquer des goulots d'étranglement? Toute autre information que je pourrais donner à la communauté des super-utilisateurs serait très appréciée.

Joe King
la source
Je ne pense pas que cela devrait être une surprise que MCMC prenne beaucoup de temps sur de tels problèmes. Je suis sûr qu'il existe probablement des moyens de le faire fonctionner plus rapidement. Mais pour obtenir une réponse correcte, il faudra encore du temps.
Michael R. Chernick
@Michael Chernick, merci - je suis conscient que cela prendra encore du temps. Je voudrais juste le minimiser autant que possible, c'est tout. Mon père a un Oracle SPARC T4 à son travail et qui exécute MCMC assez rapidement;)
Joe King
3
@JoeKing, j'ai modifié votre titre pour qu'il soit plus descriptif et attire peut-être plus d'utilisateurs qui peuvent vous aider. J'ai également constaté que l'ajustement de lmer()modèles à de grands ensembles de données peut prendre un certain temps, surtout si vous devez le faire plusieurs fois. Une réponse à votre question peut résider dans le calcul parallèle, bien que d'autres utilisateurs (par exemple @DirkEddelbuettel) seraient beaucoup plus utiles que moi avec cela. Il est également possible que vous obteniez de meilleures réponses sur stackoverflow.
Macro
Macro, merci pour la modification utile. J'ai également utilisé glmer(comme vous le savez dans mes autres messages) et cela prend environ 20 secondes, mais le problème est qu'il ne donne pas d'intervalle de confiance ou d'erreurs standard, et d'après ce que j'ai lu sur une archive de liste de diffusion, l'auteur du lme4indique que la distribution d'échantillonnage des effets aléatoires peut être très biaisée, de sorte que ces statistiques ne sont pas déclarées. En fait, j'ai trouvé de MCMCglmmsi loin que dans mon cas, ils approchent de la normale (pas que cela aide beaucoup - je dis juste). Serait-il préférable que je demande de le migrer vers SO?
Joe King
1
Je ne connais pas les spécificités de mcmcglmm, mais j'ai beaucoup utilisé les méthodes MCMC. La bonne chose à propos de MCMC est qu'il est parallélisable de façon embarrassante (c'est un terme technique!). Si vous avez plusieurs cœurs, vous exécutez des chaînes indépendantes sur chacun, puis regroupez les résultats. C'est ainsi que j'exécute MCMC, mais j'ai écrit mes propres codes C ++ parallèles (en utilisant MPI) pour le faire. En termes de conseils matériels, optez pour quelque chose avec autant de cœurs que possible. Cela suppose que l'outil que vous utilisez peut tirer parti des multiples cœurs. En termes d'informations à donner à SU dans votre question, découvrez si vous pouvez utiliser des cœurs.
Bogdanovist

Réponses:

3

Pourquoi ne pas l'exécuter sur le service de cloud computing EC2 d'Amazon ou un service similaire? MCMCpackest, si je me souviens bien, principalement implémenté en C, donc ça ne va pas aller beaucoup plus vite à moins que vous ne réduisiez la complexité de votre modèle, les itérations, etc. Avec EC2, ou des services de cloud computing similaires, vous pouvez avoir plusieurs instances à tout spécifications que vous désirez et exécutez tous vos modèles à la fois.

Zach
la source
Une modification à cela: l'exécution sur m2.4xlarge (l'option 68,7 Go de RAM) est un seul moyen de garantir que vous obtenez la machine complète, de sorte que vous ne rencontrez pas nécessairement les problèmes de mise en cache de la RAM qui peuvent survenir sur les machines virtuelles (machines virtuelles / AMI) qui s'exécutent sur une fraction de la machine.
Iterator