Olá Habr! Continuamos uma série de artigos sobre a participação de uma equipe da Universidade Estadual de São Petersburgo (nos denominamos EnterTildeDot) nas maiores competições de supercomputadores para estudantes do mundo.

Neste artigo, consideraremos o caminho para o ASC'18 usando o exemplo de um membro da equipe, prestando atenção especial ao cartão de visitas de competições e aos supercomputadores modernos em geral - Linpack. Bem, vejamos o segredo para obter um desempenho recorde e anti-registro de um sistema de computação.
Um breve tour pelas competições de supercomputadores
Informações gerais sobre que tipo de competição podem ser encontradas em nossos artigos anteriores, incluindo o longo post sobre a competição deste ano. No entanto, para completar, algumas informações sobre a competição como um todo, ainda damos aqui.
O Asian Supercomputer Challenge é um dos três principais eventos de equipes de computação de alto desempenho que atraem anualmente mais e mais equipes de estudantes de todo o mundo. A ASC, como outras competições similares, assume a existência de uma rodada de qualificação e final com as seguintes disposições:
- Atividade primária: solução de problemas de HPC;
- Equipe: 5 alunos + treinador;
- Fase de qualificação: uma descrição ausente da proposta com uma descrição da solução dos problemas apresentados, com base nos quais é determinada uma lista de 20 finalistas.
- A etapa final: competição em tempo integral para 20 equipes com duração de aproximadamente 5 dias competitivos, incluindo a montagem e configuração completas do cluster de computação, resolução de problemas e apresentação. O cluster é montado com base em restrições de potência de 3 kW, a partir do ferro fornecido pelos organizadores ou por conta própria. O cluster não tem acesso à Internet. As tarefas coincidem parcialmente com as tarefas da fase de qualificação, mas também há uma tarefa desconhecida - Aplicação Misteriosa.
Bem, agora em ordem com retiros para o programa educacional. Ao contrário de outros membros da equipe que já chegaram à final do ASC'17, entrei para o movimento competitivo apenas este ano. Entrei para a equipe em setembro, as atribuições da fase de qualificação são enviadas apenas em janeiro; portanto, tive tempo suficiente para estudar os conceitos básicos da competição, bem como para estudar a única tarefa conhecida - HPL & HPCG. Uma tarefa, de uma forma ou de outra, ocorre quase todos os anos; no entanto, nem sempre é conhecido antecipadamente em quais equipamentos a tarefa precisa ser executada (às vezes os organizadores fornecem acesso remoto a seus próprios recursos).
HPL
O HPL (Benchmark Linpack para computação de alto desempenho) é um teste do desempenho de um sistema de computação, com base no qual é formada uma lista moderna dos melhores supercomputadores do mundo. A essência do teste é resolver sistemas densos de equações algébricas lineares. A aparência desse benchmark introduziu uma métrica que permite classificar os supercomputadores e, ao mesmo tempo, fornecer algum "serviço de suporte" para a comunidade HPC. Se você olhar a lista dos melhores supercomputadores, poderá entender que o segredo de Lynpak foi resolvido rapidamente - use o maior número possível de aceleradores gráficos e estará no topo. Obviamente, há exceções, mas são os supercomputadores com aceleradores gráficos que ocupam os primeiros lugares. O que é o "serviço de apoio"? O fato é que, além de medir o desempenho, o Lynpak não é usado em nenhum outro lugar e não tem nada a ver com tarefas de computação reais. Como resultado, a corrida dos supercomputadores foi para obter o máximo de eficiência do Linpak, e não cargas de trabalho reais, como resolver tarefas típicas do USE em vez de dominar o currículo escolar.
Os desenvolvedores de HPL também criaram outro pacote - HPCG, com base no qual a classificação de supercomputadores também é formada. É geralmente aceito que esse benchmark está mais próximo de tarefas reais do que o HPL e, de certa forma, a discrepância significativa entre as posições do supercomputador nessas duas listas reflete a situação real. No entanto, as classificações mais recentes (junho de 2018) foram uma exceção agradável e, finalmente, as primeiras posições das listas coincidiram.
E agora sobre o verdadeiro HPL
Voltamos aos momentos mais práticos da história e da competição. O Linkpak é de código aberto, disponível para download no site oficial, no entanto, dificilmente existe um supercomputador no topo do mundo cujo desempenho foi medido por esta versão específica do benchmark. Os fabricantes de aceleradores lançam sua própria versão do HPL, otimizada para dispositivos específicos, o que permite obter ganhos significativos de desempenho. Obviamente, as versões personalizadas do HPL devem atender a certos critérios e passar em testes especiais com êxito.
Cada fornecedor tem sua própria versão do HPL para cada acelerador, no entanto, ao contrário do benchmark original, não há nenhuma questão de fonte aberta aqui. A Nvidia lança versões HPL otimizadas para cada um dos cartões, enquanto o código não é mais entregue no formato de origem, mas em binários. Além disso, existem apenas duas maneiras de acessá-los:
- Você tem um supercomputador com placas Nvidia que podem entrar no topo - a Nvidia encontrará você por conta própria. Infelizmente, você provavelmente não receberá binários, assim como não haverá oportunidade de participar da otimização dos parâmetros da HPL. De uma forma ou de outra, você obterá um valor de desempenho adequado obtido no benchmark otimizado.
- Você é participante de uma das três competições de supercomputadores para estudantes. Mas retornaremos a esta parte.
Então, qual é a essência da tarefa, especialmente se tios inteligentes de grandes empresas já otimizaram a referência para o seu equipamento?
No caso da fase de qualificação da competição, descreva as possíveis ações para aumentar o desempenho do sistema. Nesse caso, não é necessário perseguir números de desempenho absolutos, pois algumas equipes podem ter acesso a um cluster grande e elegante de 226 nós com aceleradores modernos, enquanto outros só podem acessar o número de classe de computador da universidade 226, que chamamos de cluster.

No caso da etapa final, já faz sentido comparar os valores absolutos de desempenho. Para não dizer que aqui todos estão em pé de igualdade, mas pelo menos há uma restrição à potência máxima permitida do sistema.
O resultado da execução do benchmark depende principalmente de dois componentes: a configuração do cluster e a definição direta dos parâmetros do benchmark. Também vale a pena notar a influência da escolha de compiladores e bibliotecas para computação matricial e vetorial, mas aqui tudo é muito chato, todo mundo usa um compilador da Intel + MKL. E no caso de binários, você não precisa escolher, pois eles já estão montados. O resultado da HPL é um valor numérico que mostra quantas operações de ponto flutuante por segundo são executadas por este sistema de computação. A principal unidade de medida é FLOPS (operações de ponto flutuante por segundo) com os prefixos correspondentes. No caso da fase final da competição, quase sempre estamos falando de sistemas em escala Tera.
Otimização de resultados
A configuração dos parâmetros de benchmark consiste em uma seleção significativa dos dados de entrada da tarefa calculada pelo Lynpak (arquivo HPL.dat). Nesse caso, a dimensão desse problema tem maior influência - o tamanho da matriz, o tamanho dos blocos nos quais a matriz está dividida, em que relação distribuir os blocos, etc. ... No total, existem várias dezenas de parâmetros, milhares de valores possíveis. O Bruteforce não é a melhor opção, especialmente se o teste em sistemas relativamente pequenos for realizado de alguns minutos a algumas horas, dependendo da configuração (para a GPU, o teste é muito mais rápido).
Tive tempo suficiente para estudar como os padrões já descritos em outras fontes contribuem para otimizar os resultados do benchmark e identificar novos. Comecei a executar testes inúmeras vezes, iniciei muitas tags do Google, tentei acessar sistemas com uma configuração previamente não testada para executar a referência neles também. Como resultado, mesmo antes do início da etapa de qualificação, vários sistemas foram testados, tanto CPU quanto GPU, incluindo até a Nvidia Quadro P5000 completamente inadequada. Quando a etapa de qualificação começou, tínhamos acesso a vários nós com o P100 e o P6000, o que nos ajudou bastante na preparação. A configuração deste sistema era de muitas maneiras semelhante à que planejamos montar como parte da etapa final da competição e, finalmente, tivemos acesso a configurações de baixo nível, incluindo a alteração da frequência.
Quanto à configuração, a presença e o número de aceleradores têm o maior impacto. No caso de testar um sistema com uma GPU, a opção mais ideal é quando a parte principal da tarefa da computação é delegada ao componente da GPU. O componente da CPU também será carregado com tarefas auxiliares, no entanto, não contribuirá para o desempenho do sistema. Mas, ao mesmo tempo, o desempenho máximo da CPU deve ser levado em consideração no desempenho máximo do sistema como um todo, o que pode parecer extremamente desvantajoso em termos da proporção entre desempenho máximo e pico (teórico). Ao executar o HPL em uma GPU, um sistema com 2 aceleradores de GPU e dois processadores não será pelo menos inferior a um sistema com 2 GPUs e 20 CPUs.
Tendo descrito as propostas para a possível otimização dos resultados da HPL, terminei com minha parte da proposta para a fase de qualificação e, passando para a final da competição, uma nova etapa da competição começou - a busca por patrocinadores. Por um lado, precisávamos de um patrocinador que pagasse os custos do voo da equipe para a China e, por outro lado, de um patrocinador que concordaria em fornecer aceleradores gráficos à equipe. Com o primeiro, tivemos sorte, uma universidade alocou parte do dinheiro e os Devexperts ajudaram a cobrir completamente os ingressos. Com os patrocinadores, com quem planejamos emprestar cartões, tivemos menos sorte e agora voamos novamente para a final com a configuração básica do cluster, sem nenhuma chance de competitividade no HPL. Bem, nada, extraia o máximo do que eles dão, pensamos.
ASC'18 final
E aqui estamos na China, na pequena cidade para os padrões chineses - Nanchang, na final. Montamos o cluster por dois dias e depois as tarefas.

Este ano, todas as equipes receberam 4 placas Nvidia V100, o que não nos deu vantagens em relação a outras equipes, mas possibilitou o lançamento do HPL não na CPU. Os nós dão inicialmente a todos 10, mas os extras (lembre-se do limite de 3 kW) devem ser retornados antes do início das principais tarefas competitivas. Há algum truque aqui - reduzindo a frequência da CPU e da GPU, o desempenho diminui; no entanto, você pode escolher esses valores para a frequência, obtendo mais desempenho por unidade de energia consumida. Ao diminuir a frequência, temos a oportunidade de adicionar ainda mais aceleradores, o que afetará o desempenho para melhor. Infelizmente, esse truque seria muito mais útil para nós se viéssemos à competição com uma mala de aceleradores, como outros participantes. No entanto, fomos capazes de deixar o número máximo de CPUs. Como nem todas as tarefas da competição exigem uma GPU, havia uma suspeita de que, de alguma forma, isso poderia estar em nossas mãos.
Portanto, a configuração de cluster mais comum na final da competição é um mínimo de nós, um máximo de cartões.

Linkpack final e um pouco sobre registros
As tarefas da competição estavam ligadas a determinados dias competitivos, e a HPL foi a primeira delas, é claro, depois que o cluster foi montado. O prazo final para envio de resultados da HPL é o almoço do terceiro dia competitivo, além disso, o acesso às tarefas restantes deste dia competitivo é aberto imediatamente após a conclusão do Linpak. No entanto, Lynpak começa a dirigir nos primeiros dias. Primeiro, para garantir que o cluster esteja montado corretamente e, em segundo lugar, a configuração do Linpak não é rápida e, como não é necessária nenhuma entrada adicional, por que não?
Montamos nosso cluster rapidamente e começamos a incluir o Lynpak. Para nossa configuração, obtivemos valores bastante adequados - da ordem de 20 TFlops, e tudo ficaria bem, mas depois que o resultado foi exibido, houve uma linha com um erro. Anteriormente, recebi esses erros apenas quando indiquei deliberadamente tamanhos de bloco incorretos nos quais a matriz de tarefas está dividida. Uma surpresa muito desagradável nos esperava aqui. Anteriormente, eu lhe disse que recebemos 4 cartões V100, bem, então ... não recebemos binários de HPL para eles e ninguém poderia nos ajudar com isso. Já se passaram vários meses, mas para mim ainda é um mistério o que aconteceu naquele final com nosso Linpak. Alteramos as versões dos compiladores e outras bibliotecas na esperança de nos livrarmos do erro, verificamos repetidamente se instalamos os aceleradores corretamente (desde que o fizemos pela primeira vez), mas ainda assim não conseguimos corrigir o erro.

Na noite anterior à rendição de Linpak, examinamos novamente cuidadosamente os critérios para avaliar tarefas e, portanto, para Linpak, a fórmula consistia em dois componentes - um certo valor dependendo do resultado da equipe que venceu Linpak e o coeficiente para a conclusão bem-sucedida da tarefa. Verificou-se que esse coeficiente é tão grande que é completamente desvantajoso passar um valor adequado de Lynpak, mas com um erro incompreensível, em comparação com a passagem de qualquer valor, mas sem erro. Tendo considerado cuidadosamente tudo, considerando que gastamos muito tempo procurando uma solução para o erro e que a obtenção de conjuntos de dados das tarefas a seguir depende completamente do tempo de conclusão do Linpak, decidimos mesclar taticamente essa tarefa. Portanto, um recorde absoluto foi estabelecido na história das competições de supercomputadores entre os valores corretos. Nosso Lynpak estourou com um valor de 0,01 TFlops. Obviamente, otimizando o benchmark para as CPUs existentes, obteríamos um valor de desempenho um pouco mais alto; no entanto, isso não afetaria muito os pontos e o tempo seria gasto significativamente mais. Lembre-se de que o Lynpak trabalha há muito mais tempo na CPU. O melhor resultado foi mostrado pela Universidade Nacional Tsing Hua - 43 TFlops. Depois de um dia ou dois, Jack Dongarra (o criador do Lynpac), membro do comitê organizador da competição, perguntou-nos casualmente: como está o caminho de Lynpak? Aparentemente, naquele momento, ele ainda não tinha visto o quadro de resultados: sua reação ao WHAAAT valia cada hora que passávamos em HPL.

Aplicação mistério
Depois de entregar os benchmarks, de acordo com o plano preparado com antecedência, entrei para a parte da equipe que deveria lidar com o Pedido de Mistério. Ninguém sabia com antecedência qual seria essa tarefa; portanto, eles estavam se preparando para o pior - já haviam instalado tudo o que poderia ser útil a partir de uma unidade flash em um cluster. Como regra, a principal dificuldade das tarefas desta seção é coletá-las. Desta vez, tudo acabou sendo um pouco diferente. O aplicativo foi coletado quase na primeira vez, sem problemas. Os problemas começaram quando recebemos um erro na maioria dos conjuntos de dados apresentados no endereço, apesar de ser um aplicativo fortran. A julgar pelo quadro de resultados, não apenas essa tarefa causou problemas para nós.
Arma secreta: CPU
Bem, a última tarefa da qual participei foi planejada para o próximo dia de competição. Ao contrário do Mystery Application, já vimos um pacote com o qual tínhamos que trabalhar - era o cfl3d. Quando descobrimos que este é um produto da NASA, por algum motivo todos ficaram encantados, pensando que tudo ficaria bem lá, tanto na montagem quanto na otimização. Quando testamos o pacote em casa, não havia problemas com a montagem, mas os casos de uso eram muito interessantes. A maioria dos exemplos dependia da instalação de ferramentas adicionais e, na tentativa de pesquisar uma dessas ferramentas - ferramenta XX, encontramos um artigo do ano de 1995 em que se dizia que agora a ferramenta XX está desatualizada e usa YY. O site do produto é do mesmo tempo - a documentação geralmente enviava o usuário para as páginas do site, mas apenas o site em frames e além da página principal não funciona. A relevância dos exemplos deixou muito a desejar.
Se for bem simples, a essência da tarefa será uma divisão complicada de uma grade de vários níveis, mantendo um determinado nível de precisão. Obviamente, a principal métrica aqui era o tempo. De alguma forma, aconteceu que neste dia estávamos o mais relaxado possível e fizemos o que tínhamos que fazer. A tarefa era para a CPU, e é exatamente isso que tínhamos muito. Os arquivos de entrada da tarefa tinham uma forma muito específica e, geralmente, um tamanho grande - até centenas de linhas. Um membro de nossa equipe escreveu um script que automatizou o processo de geração do arquivo de entrada, o que acelerou o processo, provavelmente centenas de vezes. Por fim, todos os conjuntos de dados foram concluídos e otimizados com sucesso, houve tempo para tentar reconstruir o pacote com algumas opções interessantes, mas não tivemos muita aceleração. Concluímos esta tarefa melhor do que outras, tendo recebido um prêmio especial de Inovação em Aplicações, além do 11º lugar no evento de equipe (de 20 na final, de mais de 300 entre todos os participantes da competição).

A tabela com as configurações dos sistemas de computador, bem como a foto principal, são tiradas do site http://www.hpcwire.com/ .