ASC'18: Persistência e treinamento regular como forma de atingir a meta

As competições de supercomputadores para estudantes são realizadas anualmente em várias partes do mundo e visam atrair jovens talentos para o campo da computação de alto desempenho na indústria e na ciência. Este ano, nossa equipe participou de competições asiáticas e este artigo discutirá a experiência e as impressões obtidas neste evento.


img


Tarefas e progresso da fase de qualificação


Este ano, pela primeira vez, não havia tarefas que precisassem ser resolvidas usando o equipamento fornecido pelos organizadores: todas as tarefas tinham que ser executadas em seu próprio hardware. Graças à perseverança e perseverança dos professores, pouco antes do início da fase de qualificação, nossa equipe ganhou acesso a vários nós com as placas de vídeo NVIDIA P100 e P6000, o que nos ajudou muito na preparação. As tarefas não diferiram muito do ano passado . Eles são descritos abaixo.


  1. Monte a configuração do cluster e descreva por que determinados componentes foram selecionados.
  2. Avalie o desempenho do cluster com Lynpak e HPCG. A diferença em relação ao ano passado foi apenas no fato de que no ano passado o Linpak teve que ser otimizado para o cluster fornecido pelos organizadores com os processadores Intel Xeon Phi, e neste - para qualquer cluster disponível.
  3. Optimize Relion (software para reconhecimento de imagens de um microscópio crioeletrônico) para placas de vídeo.
  4. Crie uma rede neural para responder às pesquisas de usuários usando a estrutura CNTK e o conjunto de dados MS MARCO .

Lynpack e HPCG. Graças ao surgimento de novos nós com placas de vídeo e Vadim, que se envolveu apenas em testes de desempenho, avançamos significativamente na primeira e na segunda tarefas. Vadim foi capaz de fazer o número de execuções necessárias para ajustar os parâmetros com confiança a um sistema específico. Além disso, tornou-se possível regular o consumo de energia nos novos nós, o que possibilitou selecionar a configuração do cluster, levando em consideração as alterações na frequência do processador e do chip gráfico. O surgimento de novos nós foi o maior evento para a equipe.


Relion. O código escrito por químicos químicos não se distinguia por uma arquitetura bem pensada e continha arquivos difíceis de ler de vários milhares de linhas de código. A sincronização foi fornecida pela chamada do sistema sleep() . Havia dezenas de gigabytes de entrada, ainda mais saída, uma iteração demorou em média quarenta minutos e era impossível entender imediatamente como otimizar tudo isso. Após duas semanas de pesquisa, meu próprio alocador de memória para a placa de vídeo foi gravado; A transformação de Fourier e algumas outras rotinas foram portadas para placas de vídeo. Devido à complexidade do código e ao tempo limitado, outras otimizações foram feitas após o estágio preliminar.


CNTK. Como sempre, no problema do aprendizado de máquina, foi dada a configuração básica da rede neural, a partir da qual vale a pena começar. A estrutura e a própria rede não funcionaram imediatamente. O CNTK exigia uma versão especial do OpenMP, no utilitário para verificar o resultado, as funções tinham tipos incompatíveis de parâmetros e seu número não correspondia. Quando tudo finalmente começou, eles começaram a lidar com a arquitetura da rede. Infelizmente, as redes neurais ainda são o ponto fraco da nossa equipe, por isso não fizemos alterações muito complexas. Alteramos a porcentagem de neurônios descartados, a velocidade de aprendizado, o valor inicial e experimentamos usando GRU em vez de LSTM na parte de recorrência.


Preparando-se para as finais e encontrando um patrocinador


Então, parabéns, fomos para a final!


Dessa vez, escrevemos imediatamente para o patrocinador do ano passado e começamos a nos preparar. Logo dois eventos aconteceram: o patrocinador do ano passado nos recusou e a universidade alocou fundos para cobrir parte do custo do voo. Em seguida, foi a geração de idéias para encontrar o restante dos fundos. Como resultado, a empresa Devexperts , que desenvolve software financeiro para bolsas, corretoras e empresas de investimento, se ofereceu para nos ajudar. Na rodada de qualificação, a equipe resolve problemas no equipamento disponível. Às vezes, parte das tarefas é resolvida em equipamentos fornecidos pelos organizadores. Nas finais, tudo é exatamente o mesmo, exceto por um, mas ... a equipe ainda não montou esse cluster!


img


No ano passado, nenhum dos membros da equipe teve experiência na criação de um cluster, e é por isso que tivemos pouco tempo para iniciar tarefas competitivas; portanto, este ano realizamos uma série de sessões de treinamento no cluster de treinamento. Em cada sessão de treinamento, criamos cópias de backup dos nós, configuramos completamente um nó e copiamos sua imagem pela rede para outros nós. Como a prática demonstrou, esta é a maneira mais rápida e simples de configurar um cluster a partir do zero, o que não requer conhecimento aprofundado de tecnologias de baixo nível. Alguns exercícios foram suficientes para depurar completamente e automatizar o processo.


img


Final: dia um e dois


Nos dois primeiros dias da competição, as equipes montam e montam um cluster no qual todos os aplicativos serão lançados posteriormente. Como regra, quanto mais placas de vídeo em seu sistema, mais você pode obter desempenho na maioria das tarefas e menos nós pode instalar em um rack devido a limitações de energia (a energia não deve exceder 3 kW, caso contrário, os resultados da tarefa não contam). No entanto, existem aplicativos em que as placas de vídeo não são usadas de forma alguma e a presença de um grande número de nós pode ser benéfica.


Este ano, os patrocinadores da competição forneceram quatro NVIDIA V100s para cada equipe. Os primeiros a encontrar a pessoa certa e a receber os preciosos aceleradores, iniciamos a instalação. Ninguém na equipe (incluindo o treinador) tinha experiência em instalar placas de vídeo no servidor antes. Depois de estudar as instruções gentilmente fornecidas pelos organizadores, lidamos com a tarefa e nem precisamos desmontar e desmontar completamente o servidor, como a maioria das equipes (veja o vídeo).



Em seguida, foi necessário instalar e configurar o sistema operacional. Como regra, os alunos têm menos confiança nessa área, pois ela usa tecnologias de nicho que não são úteis em outras áreas; portanto, anteriormente realizamos vários treinamentos para configurar totalmente um sistema de cinco nós do zero no cluster de treinamento usando o Clonzilla.


Os scripts de configuração foram depurados em um cluster virtual usando o Wagrant, porque somente nele é fácil gerar várias máquinas virtuais idênticas. Devido ao baixo nível de software que usamos, o Docker e outras tecnologias baseadas nos namespaces do Linux não são adequadas para nós. Os scripts de configuração simplesmente não funcionam neles.



Munidos da experiência adquirida em treinamento, implantamos o sistema operacional e outros pacotes ainda mais rapidamente do que em treinamento - o desempenho do servidor não pode ser comparado ao nosso cluster de treinamento. Uma das características do concurso é a falta de acesso à Internet pelos servidores; portanto, baixamos o repositório com pacotes com antecedência e gravamos em dois drives USB que levamos conosco.


Depois de configurar o cluster, cada membro da equipe começou a configurar e testar seu aplicativo para o novo sistema, e aqui tivemos uma surpresa desagradável. A versão do Linpak, que permanece desde o último ano da competição, se recusou a funcionar corretamente no novo sistema. Instalar várias versões do CUDA, classificar através de várias opções e configurações do kernel não deu o efeito desejado. Como resultado, decidimos lançar a versão não otimizada usual para não perder pontos para a tarefa. (Isso se deve ao novo sistema de pontuação deste ano: mesmo que seu resultado seja o melhor em velocidade ou desempenho, mas a saída esteja incorreta, você receberá apenas metade do máximo de pontos possíveis. A segunda metade dos pontos é pontuada para a conclusão correta.)


Para entender a essência do problema, vale a pena dizer o que é o Lynpack. O Lynpack é usado para medir o desempenho dos supercomputadores e compilar uma lista dos supercomputadores TOP500 mais poderosos do mundo. A maneira mais fácil de ocupar um lugar de destaque nesta lista é comprar um cluster com um grande número de placas de vídeo (o número de processadores não é tão importante, porque 99% da tarefa é atribuída à placa de vídeo). Para cada acelerador, há uma versão otimizada do Lynpak, cujo código, em regra, está fechado. O binário pode ser obtido apenas se você tiver um supercomputador que possa figurar na lista TOP500 ou se você participar de uma competição de supercomputadores. Apesar disso, os organizadores da competição não forneceram um binário, a filial russa da NVIDIA também se recusou a fazer isso. Na Rússia, não há clusters com V100 que pudessem ser incluídos na lista TOP500; portanto, as pesquisas de colegas conhecidos também não tiveram êxito. A situação também é incompreensível pelo fato de o Linpak não ser usado em lugar algum, exceto nos testes de desempenho: nem na ciência nem na tecnologia. Se você quiser ajudar a equipe e saber como obter o programa precioso, seja bem-vindo ao PM. Bem, nós, com nossa espontaneidade imediata, marcamos essa história com um slide na apresentação final, que poderíamos agradar aos membros do júri.


img


Final: dia três


No terceiro dia da competição, Linpak, HPCG, Relion e o aplicativo secreto estavam esperando por nós, e este dia foi o mais difícil para a equipe. Depois de lidar rapidamente com o Lynpak (consulte a seção anterior) e o HPCG, obtivemos tarefas de trabalho (dados de entrada) para um aplicativo secreto. Acabou sendo um programa para calcular a dinâmica molecular do Siesta . A primeira decepção foi que, em parte das tarefas, o Siesta cometeu um erro no endereço (apesar do fato de ter sido escrito em Fortran, no qual não era tão fácil obter esse erro), e não foi possível depurá-lo. No entanto, as tarefas restantes foram conquistadas e, no final do dia, passamos com êxito.


Paralelamente ao Siesta, tivemos que lançar uma Relion previamente preparada. Todos os nós sem placas de vídeo foram entregues à Siesta e os nós com placas de vídeo foram entregues à Relion, para que os programas não interferissem entre si.


Na fase preliminar, alteramos fortemente o código da Relion para que funcione efetivamente nas placas de vídeo. Entre outras coisas, paralelizamos muitas funções, reescrevemos o alocador de memória na placa de vídeo, transferimos as rotinas com mais recursos para a placa de vídeo e adicionamos a capacidade de usar nós com e sem placas de vídeo simultaneamente. Isso acelerou bastante o programa e funcionou muito bem em tecnologia universitária. No entanto, na competição, temos placas de vídeo com menos memória, e é por isso que a Relion sofreu um erro. Uma análise mais profunda do erro mostrou que o código funcionará apenas se for reescrito para o novo sistema. Não tivemos tempo para isso, e essa foi a segunda decepção do terceiro dia.


Final: quarto dia


No quarto dia da competição, CFL3D e MSMARCO permaneceram, e este dia foi muito mais calmo. Liberados dos aplicativos a eles atribuídos, os membros da equipe começaram a se ajudar. Para o CFL3D, que possui um formato de arquivo de entrada muito complexo, Ruslan escreveu um script que o gera. Como tínhamos muitos nós em comparação com equipes com um grande número de placas de vídeo, lançamos várias tarefas em paralelo e, após várias partidas de cada tarefa, pudemos selecionar os parâmetros ideais.


O lançamento do MSMARCO pré-preparado também não causou problemas sérios. O pré-processamento dos dados levou várias horas, pelo que não havia tempo para treinamento prolongado, mas graças às placas de vídeo mais poderosas, foi possível concluí-lo, embora com menos épocas. Ainda temos um modelo treinado em mais épocas desde a etapa de qualificação (na final, os dados de entrada foram alterados, mas não havia um novo arquivo para verificação), mas de acordo com as regras, precisávamos de um modelo treinado durante a final e decidimos aprovar um modelo treinado honestamente. Apesar do trabalho bem coordenado e da falta de surpresas, usamos todo o tempo previsto e terminamos no final da noite.


Final: quinto dia


No dia seguinte, uma apresentação estava esperando por nós. Na noite do quarto dia, inserimos os resultados obtidos em um modelo preparado e escrevemos um discurso. A apresentação foi fácil, não foram feitas perguntas interessantes, mas, por algum motivo, apenas o palestrante e os slides foram autorizados a filmar.


Poucas horas depois, a cerimônia de premiação começou. Os sentimentos foram confusos: por um lado, tivemos um desempenho muito melhor do que no ano passado, por outro - poderíamos ter um desempenho ainda melhor se não fosse pelos erros irritantes nas aplicações. Como resultado, apesar do nosso cluster não diferir em um grande número de placas de vídeo, devido ao maior número de nós e perseverança, vencemos outras equipes no CFL3D, pelas quais recebemos um prêmio separado na competição. Na classificação geral, ocupamos o décimo primeiro lugar em vinte equipes que chegaram à final (e em trezentas equipes que participaram da fase preliminar). O campeão na classificação geral, como no ano passado, foi a Universidade Xinhua. Para nossa equipe, foi uma vitória sobre nós mesmos: tivemos um desempenho melhor do que da última vez, obtivemos uma experiência inestimável, que usaremos no próximo ano, e vencemos outros em uma das tarefas.


img


Conclusões e impressões gerais


Uma configuração de cluster na qual há muito mais placas de vídeo do que processadores é vantajosa na maioria dos casos, mas não universal. Existem menos nós e nem todos os aplicativos podem, em princípio, rodar em uma placa de vídeo. Esses aplicativos incluem os programas Fortran, que, devido à sua idade respeitável, não podem ser reescritos para uma placa de vídeo e, na maioria das vezes, nem usam todos os núcleos do processador. Para tais aplicativos, a presença de um grande número de nós permite executar mais tarefas paralelas, o que significa otimizar aplicativos.


A equipe pode não conhecer todos os meandros da instalação de sistemas operacionais e transmissão de imagens, mas essa lacuna é facilmente substituída pelo treinamento. Obviamente, os participantes não reconhecerão todas as sutilezas, mas executarão a instalação ponto a ponto com confiança. Os scripts para instalação são facilmente depurados em máquinas virtuais.


Durante a competição, você pode conhecer os mais maravilhosos programas de código aberto. Programas que são coletados por scripts escritos ilegíveis, programas que usam funções de biblioteca reescritas com erros, programas escritos no Fortran com inserções C, programas com dependências codificadas e sinalizadores de compilação. Não me lembro de um único programa que teria sido montado pela primeira vez ou que produziu um erro compreensível durante a montagem. (Um novo exemplo: uma versão antiga do OpenMPI em novos sistemas tenta conectar uma biblioteca com um nome vazio. O problema só pode ser resolvido com segurança pela substituição automática nos arquivos de criação gerados.) A competição nos ensina a não nos surpreender com nada e superar as dificuldades. Quero acreditar que uma pessoa que trabalhou com esse software nunca criará algo assim em sua vida.


Na competição, você nunca deixa de se surpreender com a engenhosidade chinesa. Este ano, os chineses redesenharam uma sala de conferências quadrada com cantos cortados para se adequar ao local da competição. Trouxe racks com servidores e um sistema de refrigeração com saída de líquido para o banheiro mais próximo (não sou especialista neste assunto e não sei o nome exato do equipamento). Quando perceberam que a temperatura na sala não caía abaixo de trinta graus Celsius, trouxeram enormes blocos de gelo nas bacias. Obviamente, isso não mudou a situação, mas forneceu à equipe bebidas geladas.


img


Agradecimentos


A participação na competição não seria possível sem o nosso patrocinador, Devexperts ( http://devexperts.com/ ). A empresa incorreu no custo das viagens aéreas para a China.


img


Impressões da China


Alguns membros da equipe estiveram na China pela primeira vez, o que causou um leve choque cultural. Diz a Anton.


O conhecimento da terra do sol nascente começou com o fato de que alguns de nós tiveram suas baterias retiradas para carregar, porque não tinham uma marca de poder. Além dessa conspiração, tudo correu amigavelmente. Fomos recebidos por dois voluntários com um sinal da nossa universidade, após o que fomos levados ao hotel de ônibus. Vale a pena notar que, depois de Pedro, onde a neve estava prestes a derreter, na China estava bastante quente (embora os verdadeiros habitantes de Volgogrado, é claro, nem sentissem isso). Na chegada, fomos acomodados em quartos. Depois dos vôos diários, decidi me deitar em um colchão enorme com fadiga.


Duro era um colchão.
Samurai deprimido.


Naquela época, eram cerca de dez horas da manhã, então uma hora depois fomos visitar uma universidade local. Dizer que ele é grande é não dizer nada. Se compararmos o território do campus local e da Universidade Estadual de São Petersburgo, a Universidade Nanchang é cinco vezes mais. Foi-nos mostrado a sala de jantar local, onde durante os próximos cinco dias comemos macarrão e arroz. Na maior parte, a primeira comunicação com o chinês comum, cujo conhecimento de inglês não é tão bom, começou aqui.


A sala de jantar é organizada de tal maneira que cada janela é um mini ponto de venda onde você pode comprar algo. O pagamento é feito por um cartão especial, que você, como os cartões NFC, simplesmente anexa ao leitor. Tudo acontece rapidamente, e não há necessidade de ficar na fila por um longo tempo. Compreender exatamente o que você toma é problemático. Você tem que usar os métodos do velho avô e apontar o dedo para o prato desejado. No terceiro dia em uma prateleira de macarrão, eles começaram a nos reconhecer, o que simplificou bastante nossas vidas. Alguns até aprenderam a contar até dez para não apontar o dedo e mostrar respeito pelos habitantes. Se falamos sobre a comida em si, havia bolinhos bons e saudáveis. Com a ajuda de um voluntário, consegui uma sopa deliciosa, mas como isso requer interação verbal com o vendedor, foi apenas uma vez. Devido aos temperos, toda a carne é muito picante, com um sabor específico.


No segundo dia, nos encontramos com o terceiro voluntário, cujo nome era Ksenia. (Os chineses, em regra, inventam nomes de pronúncia fácil para se comunicar com estrangeiros.) Ela estuda russo há dois anos, por isso foi designada para nós, uma espécie de experiência útil.


img


A competição em si já foi descrita em detalhes em outras seções, mas eu gostaria de observar que havia apenas duas cadeiras para a equipe, então tive que me sentar no chão, após o que minhas pernas pediram apenas piedade, porque tive que ficar assim por dez horas nos quatro dias da competição .

Source: https://habr.com/ru/post/pt417917/


All Articles