Floresta aleatória R no Amazon ec2 Erro: não é possível alocar vetor de tamanho 5,4 Gb

9

Estou treinando modelos de floresta aleatórios em R usando randomForest()com 1000 árvores e quadros de dados com cerca de 20 preditores e linhas de 600 mil. No meu laptop, tudo funciona bem, mas quando passo para o amazon ec2, para executar a mesma coisa, recebo o erro:

Error: cannot allocate vector of size 5.4 Gb
Execution halted

Estou usando o c3.4xlargetipo de instância, por isso é bastante robusto. Alguém conhece uma solução alternativa para fazê-lo funcionar nesta instância? Gostaria de saber as nuances de memória que causam esse problema apenas na instância ec2 e não no meu laptop (processador OS X 10.9.5 de 2.7 GHz Intel Core i7; memória 16 GB 1600 MHz DDR3)

Obrigado.

Ethan
fonte

Respostas:

5

Aqui estão alguns conselhos (use por seu próprio risco!):

Se as medidas mais simples mencionadas acima não ajudarem OU você deseja obter mais escalabilidade e / ou desempenho , incluindo a capacidade de paralelizar o processo em uma única máquina ou em várias máquinas, considere usar o bigrfpacote R: http: // cran. r-project.org/web/packages/bigrf . Consulte também esta discussão: https://stackoverflow.com/q/1358003/2872891 .

Aleksandr Blekh
fonte
2

Adicional a outras idéias: reduza seus dados até descobrir o que pode executado na instância da Amazon. Se ele não puder executar 100 mil linhas, algo estará muito errado; se falhar em 590 mil linhas, será marginal.

A instância c3.4xlarge possui 30 GB de RAM, portanto, sim, deve ser suficiente.

Spacedman
fonte
2

É sempre útil apenas pesquisar no Google o erro exato que você está vendo, excluindo detalhes como a memória real do vetor. Para mim, o primeiro hit foi uma documentação interessante chamada " R: Limites de memória de R ", onde, em "Unix", pode-se ler:

O limite do espaço de endereço é específico do sistema: os sistemas operacionais de 32 bits impõem um limite não superior a 4Gb: geralmente é 3Gb. A execução de executáveis ​​de 32 bits em um sistema operacional de 64 bits terá limites semelhantes: os executáveis ​​de 64 bits terão um limite específico do sistema essencialmente infinito (por exemplo, 128 TB para Linux em x86_64 cpus).

Consulte a ajuda do SO / shell em comandos como limite ou ulimit para saber como impor limitações aos recursos disponíveis para um único processo. Por exemplo, um usuário do bash poderia usar

ulimit -t 600 -v 4000000

enquanto um usuário csh pode usar

limit cputime 10m limit vmemoryuse 4096m

limitar um processo a 10 minutos de tempo da CPU e (em torno de) 4Gb de memória virtual. (Existem outras opções para configurar a RAM em uso, mas elas geralmente não são respeitadas.)

Então, você deve verificar

  1. Que tipo de sistema operacional você está executando na sua instância do EC2
  2. Que tipo de versão R você está executando nesse sistema operacional e certifique-se de executar uma versão de 64 bits
  3. Se os dois já tiverem 64 bits, use ulimitpara definir a memória como, por exemplo, 8 GB:ulimit -v 8000000
logc
fonte