Opções de E / S paralela, em particular HDF5 paralela


20

Eu tenho um aplicativo que pode ser trivialmente paralelizado, mas seu desempenho é em grande parte limitado a E / S. O aplicativo lê uma única matriz de entrada armazenada em um arquivo com tamanho geralmente de 2 a 5 GB (mas espero que esse número aumente no futuro). Um cálculo típico aplica a mesma operação a cada linha ou coluna dessa matriz. Para operações pesadas na CPU, eu tenho um dimensionamento muito bom de cerca de 100 processadores, mas para operações mais lentas, a E / S e a comunicação relacionada (acesso NFS) dominam e não posso usar mais do que alguns processadores com eficiência.

Quais são as opções eficientes e portáteis (idealmente eficientes em termos portáteis) para essa situação? HDF5 paralelo parece promissor. Alguém tem experiência na vida real com isso?

MPI-I / O seria algo que vale a pena examinar? Ele pode funcionar eficientemente com um determinado layout de arquivo ou eu tenho que adaptar tudo?


4
Ótima pergunta. Temos o mesmo problema, e nossa solução básica é gravar / ler a matriz decomposta do domínio de / para N arquivos, para N processadores. Eu realmente não gosto disso, mas é simples. Eu estaria interessado em ver respostas que também abordar a complexidade das diversas interfaces de biblioteca ....
Yann

Como você está distribuindo a matriz pelos processadores? O que você está usando para paralelismo agora? Você está gravando em arquivos pelo NFS como forma de comunicação?
Dan

2
Talvez você não precise refazer muito o seu código; Tive um problema como esse uma vez e consegui uma velocidade melhor evitando E / S do que otimizando.
Dan

1
Você está usando um sistema de filas como PBS ou Torque? Nesse caso, existem comandos para "colocar um arquivo" em um diretório em algum diretório quando um trabalho é iniciado. Não sei se isso aceleraria as coisas visivelmente, mas pode valer a pena tentar.
Dan

1
@ Dan: sim, eu uso o PBS, e posso usá-lo para colocar meu arquivo onde quiser. Mas como meu cluster não possui discos locais de nó, não há nada melhor que um volume NFS compartilhado.
khinsen

Respostas:


6

A E / S paralela pode ajudá-lo nesse caso, mas se você estiver usando o NFS (inerentemente bastante serial) para servir seus arquivos, ele não terá o efeito total que você deseja - haverá um gargalo serial no O servidor de arquivos e ter centenas de processos fazendo solicitações ao servidor único não fornecerão fatores de centenas de acelerações ao fazê-lo através de um único processo. Ainda assim, isso pode ajudar até certo ponto, especialmente porque parece que o gargalo está lendo e não escrevendo, e será uma grande melhoria se o sistema for atualizado para um sistema de arquivos totalmente paralelo.

MPI-IO é de nível muito baixo; vale a pena entender algo sobre o assunto para saber o que está acontecendo " oculto " com o HDF5, NetCDF4 ou ADIOS paralelo , mas usá-lo é realmente adequado apenas para dados binários brutos, nos quais a estrutura é bem conhecida em tempo de compilação. HDF5 e NetCDF4 são muito mais flexíveis.

Observe que, se seus dados forem relativamente simples - por exemplo, as estruturas de big data são principalmente matrizes ou vetores n-dimensionais - eu recomendo o NetCDF4 (que também é paralelo e baseado no HDF5) em vez do HDF5; é significativamente mais fácil de usar. O HDF5 é mais complicado e, em troca dessa complexidade, permite modelos de dados muito complicados. Mas se esse é um recurso que você não precisa, é mais rápido começar no NetCDF4.

Em nosso centro, temos uma aula de E / S paralela, de uma tarde e outra, onde falamos sobre os conceitos básicos, MPI-IO, HDF5 e NetCDF4; os slides podem ser encontrados aqui .


5

Temos uma boa escala para todo o XT6 no ORNL usando MPI / IO para gerar vetores. Aqui está o código . Os subsistemas de E / S para muitas máquinas não são projetados para um paralelismo massivo; portanto, acho que o @Dan está certo em tentar minimizar a IO escrevendo apenas algumas etapas ou alguma outra estratégia de aglomeração.

No que diz respeito à gravação flexível de saída de forma escalável, tenho experiência com o XDMF , que pode ser efetuado por grandes gravações binárias paralelas usando HDF5 (como o PETSc VecView ) juntamente com uma pequena quantidade de código XML escrito em série para descrever o layout. Isso pode ser lido por pacotes de visualização como Paraview ou MayaVi2 . Outra maneira de fazer isso é usar o formato VTK com dados binários anexados, no entanto, isso exige que você saiba tudo o que deseja escrever com antecedência.


O XDMF parece interessante, mas trata-se de organizar dados em vez de acessar com eficiência o que o XDMF chama de dados "pesados". O que você usa para esse aspecto?
khinsen

Nós apenas usamos o XDMF para apontar para o HDF5. Dessa forma, você pode escrever todo o HDF5 binário, mas lê-lo pela maioria dos mecanismos de visualização.
precisa saber é o seguinte

1

Presumo que seu problema de escalabilidade esteja relacionado à saída e não à entrada. A entrada paralela é bastante simples - o que eu faço é que cada CPU abre o arquivo NetCDF de entrada e lê a parte da matriz que pertence ao seu bloco (pode haver um limite para quantos leitores podem abrir o mesmo arquivo NetCDF, mas não tenho certeza ) A saída paralela é mais problemática.

O que estou fazendo atualmente não é o ideal, mas funciona por enquanto. Eu recolho tudo em uma CPU e faço a saída serial. Enquanto isso, outros jogadores esperam o escritor terminar. Isso funcionou bem para mim, porque eu consegui manter a taxa de computação sobre a saída bastante alta - então a escalabilidade seria boa para mais de 200 CPUs. Mas essa não é a solução que você está procurando.

Outra solução é o que Yann sugeriu - escreva serialmente em arquivos N e faça com que uma CPU drone monte os blocos em uma única peça - se houver RAM permitindo.

Além das bibliotecas de E / S paralelas sugeridas nas respostas anteriores, você também pode consultar o Parallel NetCDF http://trac.mcs.anl.gov/projects/parallel-netcdf , já que você já está familiarizado com o NetCDF e o MPI. Não o usei na prática, mas pretendo ir nessa direção quando eu atingir a parede com a coleta de E / S serial +.


É a entrada que cria meu problema de escalabilidade. Suponho que todas as solicitações recebidas de muitos nós sobrecarreguem o servidor NFS, mas não tenho idéia de como verificar essa hipótese.
khinsen

@khinsen O que você poderia fazer para testar sua hipótese é ler o arquivo com um pequeno número de CPUs, digamos entre 1 e 8, e espalhar os dados para o resto. Faça o perfil, veja quanto tempo você gasta em E / S e quanto em dispersão. Varie o número de leitores de CPU e veja o que oferece melhor desempenho.
milancurcic

Boa sugestão! Isso vai dar algum trabalho, porque significa reescrever o código, mas provavelmente vale a pena.
khinsen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.