Como programador, os kernels do datacenter escreveram


Poucas pessoas acreditam que a pilha moderna de ciência de dados pode ser construída não no Python, mas existem esses precedentes :). A pilha Odnoklassniki foi formada por muitos anos, principalmente por programadores que mudaram para a ciência de dados, mas ainda permaneciam próximos do produto, por isso é baseada nas tecnologias abertas da pilha JVM: Hadoop, Spark, Kafka, Cassandra, etc. Isso nos ajuda a reduzir o tempo e o custo de colocar modelos em operação, mas às vezes cria dificuldades. Por exemplo, ao preparar soluções básicas para os participantes do SNA Hackathon 2019 , eles tiveram que comprimir sua força de vontade e mergulhar no mundo da digitação dinâmica. Detalhes (e fácil trolling) sob o corte :)


Instalação



Existe algum tipo de python em quase qualquer máquina de desenvolvimento. Ele foi encontrado no meu, já em duplicado - 2.7 e 3.4. Tendo vasculhado os compartimentos da memória, lembrei-me de que instalei a versão 3.4 há três anos, depois que os participantes enfrentaram problemas épicos no SNA Hackathon 2016, tentando expandir um gráfico de meio gigabyte na memória (como resultado de um pequeno vídeo de treinamento e uma competição separada ), mas hoje é a economia já é moralmente obsoleta e precisa ser atualizada.


No mundo Java, cada projeto durante a montagem indica tudo o que deseja incorporar em si mesmo, e continua com isso. Em teoria, tudo é simples e bonito, mas na prática, quando você precisa da biblioteca A e da biblioteca B, certamente descobrirá que ambos precisam da biblioteca C, com duas versões incompatíveis diferentes :). Em tentativas vãs de romper esse círculo vicioso, algumas bibliotecas empacotam todas as suas dependências em si mesmas e se escondem do resto, enquanto as demais giram como podem.


O que há com isso em python? Não existe um projeto como tal, mas existe um "ambiente" e, em cada ambiente, um ecossistema independente pode ser formado a partir de pacotes de determinadas versões. Ao mesmo tempo, existem ferramentas para os preguiçosos , com a ajuda da qual não é mais difícil gerenciar o ambiente Python local, do que um cluster heterogêneo distribuído de Clauder ou Horton. Mas os conflitos mútuos entre as versões dos pacotes não vão a lugar algum.Eu imediatamente enfrentei o fato de que o lançamento do Pandas 0.24 transferiu o método privado _maybe_box_datetimelike para a API pública e, de repente, verificou-se que muitas pessoas o usaram em sua forma anterior e agora caíram :) (e sim, em O mundo Java é o mesmo ). Mas, no final, tudo foi consertado, além dos terríveis avisos sobre a nova depriycheyshin, funcionou.


Linha de base colaborativa


imagem

As tarefas do SNA Hackathon 2019 são divididas em três áreas - recomendações sobre logs, textos e imagens. Vamos começar com os logs (spoiler - megapattern Cmd + C / Cmd + V com stackoverflow também funciona com python). Os dados foram coletados a partir de uma produção ao vivo - cada usuário, aleatoriamente, sem pesar, mostrou alguns alimentos de seu ambiente, após o qual todos os sinais no momento do show e a reação final foram registrados no log. A tarefa do pedaço de bolo: pegamos sinais, empurramos um logg , lucro!


Mas o plano brilhou na primeira etapa, na leitura de dados. Em teoria, existe um maravilhoso pacote Apache Arrow , que deveria unificar o trabalho com dados em diferentes ecossistemas e, em particular, permitir ler arquivos "parquet" de python sem faíscas. Na prática, acabou. que mesmo lendo estruturas simples e aninhadas, ele tem problemas , e nossa bela hierarquia se transformou em uma miséria plana :(.


Mas havia aspectos positivos. Jupyter , em geral, ficou satisfeito, é quase tão confortável, embora não tão bonito quanto o Zeppelin . Existe até um núcleo de rock ! Bem, a velocidade da regressão logística em um pequeno pedaço de dados na memória agradou - não atinge o poder da opção distribuída, mas aprende instantaneamente em quatro sinais e algumas centenas de milhares de exemplos.


Entretanto, o entusiasmo que surgiu foi duramente atingido: se a transformação de dados necessária (agrupar por chave e agrupar em uma lista) não estiver na lista padrão e aplicar ou mapa aparecer, a velocidade cairá em ordens de magnitude. Como resultado, 80% do tempo da linha de base não é a leitura de dados, associações, treinamento e classificação de modelos, mas a compilação banal da lista.


A propósito, é precisamente por causa desse recurso que eu sempre fico surpreso com os usuários do pySpark - afinal, quase todas as funcionalidades padrão estão disponíveis na forma de Spark SQL, que é a mesma em python e rock, e depois do primeiro yudf-in tipo python com algo pessoal de dez núcleos o cluster se transforma em uma abóbora ...


Mas, no final, todos os obstáculos foram superados e nove pontos foram suficientes para marcar 0,65!


Linha de base do texto



Bem, agora nossa tarefa é mais complicada - se o logreg puder ser encontrado em centenas de implementações para todas as plataformas, haverá mais variedade de ferramentas para trabalhar com textos em python. Felizmente, os textos já estão sendo enviados não apenas na forma bruta, mas também processados ​​pelo nosso sistema regular de pré-processamento baseado no Spark e Lucene . Portanto, você pode pegar imediatamente a lista de tokens e não se preocupar com tokenização / lematização / stemming.


Por algum tempo, duvidei do que levar: BigARTM doméstico ou Gensim importado. Como resultado, decidi pelo segundo e copiei o tutorial doc2vec :). Espero que os colegas da equipe BigARTM não deixem de aproveitar a oportunidade e mostrem as vantagens de sua biblioteca na competição.


Novamente, temos um plano simples: pegamos todos os textos do teste, treinamos o modelo Doc2Vec, depois o inferimos no trem e aprendemos o registro dos resultados (o empilhamento é tudo!). Mas, como sempre, os problemas começaram imediatamente. Apesar da quantidade relativamente modesta de textos na amostra de treinamento (apenas um gigabyte e meio), ao tentar arrastá-los para a rampa, o python comeu 20 (20 Karl!) Gigabytes de memória, trocou e não voltou. Eu tive que comer um elefante em partes.


Ao ler, sempre indicamos quais colunas levantar do chão, o que nos permite não ler o texto bruto na memória. Isso economiza seu uso pela metade, os documentos do conjunto de testes são carregados na memória para treinamento sem problemas. Com um conjunto de treinamento desse tipo, não é suficiente; portanto, em um momento, não fazemos upload de mais de um arquivo "parquet". Além disso, no arquivo baixado, deixamos apenas o ID dos dias que queremos usar para o treinamento e já os inferimos sobre eles.


Entrar em cima disso funciona tão rápido quanto, e no final obtemos 14 parágrafos e obtemos 0,54 :)


Linha de base da imagem



O que poderia ser mais popular que o aprendizado profundo? Apenas gatos! Portanto, para a imagem de linha de base, fizemos um plano brilhantemente simples: execute um detector de gato nas imagens do conjunto de teste e depois classifique o conteúdo de acordo com a pontuação :)


E, novamente, há muito por onde escolher. Classificação ou detecção? pyTorch ou Tensorflow? O principal critério é a facilidade de implementação pelo método copiar e colar. E o vencedor é ... YOLOv3 na MXNet :). A concisão de sua demo cativou à primeira vista, mas depois, como sempre, começaram os problemas.


O que geralmente funciona com big data começa? Com estimativas de desempenho e o tempo necessário da máquina! Eu queria tornar a linha de base o mais autônoma possível, então eles a ensinaram a trabalhar diretamente com o arquivo tar e rapidamente perceberam que a uma velocidade de extrair 200 fotos por segundo do tar para o tmpfs, levaria cerca de meia hora, normas para processar 352.758 imagens. Adicione carregamento e pré-processamento de fotos - 100 por segundo, cerca de uma hora para tudo, normas. Adicione o cálculo da rede neural - 20 fotos por segundo, 5 horas, bem ... Ok. Adicione a extração do resultado - 1 foto por segundo, semana, WTF?


Depois de algumas horas dançando com pandeiros, o entendimento é de que o NDArray que observamos nunca fica entorpecido e a estrutura interna do MXNet, que faz todos os cálculos preguiçosamente. Bingo! O que fazer? Qualquer diplomacia novato sabe que é tudo sobre o tamanho do lote! Se o MXNet calcula a pontuação preguiçosamente, se primeiro solicitarmos algumas dúzias de fotos e começarmos a extraí-las, talvez o processamento das fotos seja em lotes? E sim, depois de adicionar o lote a uma velocidade de 10 fotos por segundo, consegui encontrar todos os gatos :).


Em seguida, aplicamos a engenharia bem conhecida e, em 10 parágrafos , obtemos pontuação 0,504 :).


Conclusões



Quando um sensei sábio foi perguntado: “Quem vencerá, mestre de Aikido ou karatê?”, Ele respondeu: “Mestre vencerá”. Fomos levados a aproximadamente as mesmas conclusões por esse experimento: não existe e não pode ser uma linguagem ideal para todas as ocasiões. Com o Python, você pode montar rapidamente uma solução a partir de blocos prontos, mas tentar se afastar deles com quantidades de dados suficientemente grandes trará muita dor. Em Java e Scala, você também pode encontrar muitas ferramentas prontas e implementar facilmente suas próprias idéias, mas as próprias linguagens serão mais exigentes quanto à qualidade do código.


E, claro, boa sorte a todos os membros do SNA Hackathon 2019 !

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


All Articles