Como otimizar a eficiência computacional ao ajustar um modelo complexo a um grande conjunto de dados repetidamente?

12

Estou tendo problemas de desempenho usando o MCMCglmmpacote no R para executar um modelo de efeitos mistos. O código fica assim:

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)

Existem cerca de 20.000 observações nos dados e elas estão agrupadas em cerca de 200 escolas. Soltei todas as variáveis ​​não utilizadas do quadro de dados e removi todos os outros objetos da memória, antes da execução. O problema que tenho é que leva muito tempo para ser executado, a menos que eu reduza as iterações para um número inaceitavelmente pequeno. Com 50.000 iterações, leva 5 horas e eu tenho muitos modelos diferentes para executar. Então, eu gostaria de saber se existem maneiras de acelerar a execução do código ou outros pacotes que eu poderia usar. estou usandoMCMCglmm porque quero intervalos de confiança para os efeitos aleatórios.

Por outro lado, eu esperava adquirir um novo PC ainda este ano, mas com um pouco de sorte, talvez eu possa trazê-lo adiante, então fiquei pensando em como gastar melhor uma quantia limitada de dinheiro em hardware novo - mais RAM , CPU mais rápida etc. Observando o gerenciador de tarefas, não acredito que a RAM seja o problema (ela nunca fica acima de 50% do uso físico), mas o uso da CPU também não fica muito acima de 50%, o que me parece estranho . Minha configuração atual é um intel core i5 2.66GHz, 4GB RAM, 7200rpm HDD. É razoável obter a CPU mais rápida possível, à custa de RAM adicional? Também me perguntei sobre o efeito do tamanho do cache da CPU do nível 3 em problemas estatísticos de computação como este?

Atualização: Após ter solicitado a meta SO , fui aconselhado a reformular a pergunta e publicar no Superusuário. Para fazer isso, preciso fornecer mais detalhes sobre o que está acontecendo "sob o capô" no MCMCglmm. Estou certo ao pensar que a maior parte do tempo de computação é gasta na otimização - quero dizer, encontrar o máximo de alguma função complicada? A inversão de matriz e / ou outras operações de álgebra linear também são uma operação comum que pode estar causando gargalos? Qualquer outra informação que eu pudesse fornecer à comunidade de Superusuários seria recebida com gratidão.

Joe King
fonte
Não acho que seja uma surpresa que o MCMC demore muito tempo com esses problemas. Estou certo de que provavelmente existem maneiras de fazê-lo funcionar mais rápido. Mas encontrar uma resposta correta ainda levará tempo.
Michael R. Chernick
@ Michael Chernick, obrigado - sei que ainda levará tempo. Eu gostaria de minimizar o máximo possível, só isso. Meu pai tem um Oracle SPARC T4 em seu trabalho e que corre MCMC bastante rápido;)
Joe King
3
@JoeKing, editei seu título para ser mais descritivo e talvez atrair mais usuários que possam ajudá-lo. Também descobri que a adaptação de lmer()modelos a grandes conjuntos de dados pode demorar um pouco, principalmente se você precisar fazer isso várias vezes. Uma resposta para sua pergunta pode estar na computação paralela, embora outros usuários (por exemplo, @DirkEddelbuettel) sejam muito mais úteis do que eu com isso. Também há uma chance de você obter melhores respostas no stackoverflow.
Macro
Macro, obrigado pela edição útil. Eu também usei glmer(como você sabe nas minhas outras postagens) e isso leva cerca de 20 segundos, mas o problema é que ele não fornece intervalos de confiança ou erros padrão e, pelo que li em um arquivo de listas de discussão, o autor do lme4O pacote diz que a distribuição amostral dos efeitos aleatórios pode ser muito distorcida, portanto essas estatísticas não são relatadas. Na verdade, descobri de MCMCglmmtão longe que, no meu caso, elas estão se aproximando do normal (não que isso ajude muito - só estou dizendo). Seria melhor se eu solicitasse a migração para o SO?
22612 Joe King
1
Não sei as especificidades do mcmcglmm, mas usei muito os métodos MCMC. O bom do MCMC é que ele é embaraçosamente paralelizável (esse é um termo técnico!). Se você tiver vários núcleos, execute cadeias independentes em cada um e agrupe os resultados. É assim que executo o MCMC, mas escrevi meus próprios códigos C ++ paralelos (usando MPI) para fazer isso. Em termos de conselhos de hardware, opte por algo com o maior número possível de núcleos. Isso pressupõe que qualquer ferramenta que você esteja usando possa tirar proveito dos múltiplos núcleos. Em termos de informações para fornecer SU em sua pergunta, descubra se você pode utilizar núcleos.
Bogdanovist

Respostas:

3

Por que não executá-lo no serviço de computação em nuvem EC2 da Amazon ou em um serviço semelhante? MCMCpacké, se bem me lembro, implementado principalmente em C, por isso não será muito mais rápido, a menos que você diminua a complexidade do modelo, as iterações etc. Com o EC2 ou serviços similares de computação em nuvem, você pode ter várias instâncias a qualquer momento especificações desejadas e execute todos os seus modelos de uma só vez.

Zach
fonte
Uma modificação para isso: rodar em m2.4xlarge (a opção de 68,7 GB de RAM) é uma única maneira de garantir que você esteja recebendo a máquina completa, para que você não atinja necessariamente os problemas de cache de RAM que podem ocorrer nas VMs (máquinas virtuais) / AMIs) que são executados em uma fração da máquina.
Iterator