Estamos bastante perplexos com esse problema de travamento, pois não recebemos nenhum rastreamento ou outras mensagens sobre o que realmente está errado, por isso tem sido difícil depurar. De qualquer forma, aqui vai.
Temos uma estação de trabalho para executar nosso trabalho de análise em Python. A essência do problema é que quando trabalhamos em notebooks (ou executamos o script de teste mostrado abaixo), o sistema trava. A falha consiste no congelamento do sistema operacional e, em seguida, na reinicialização. Não há nada que nos diga o que aconteceu, apenas que a máquina congela e reinicia.
Os travamentos ocorrem com mais frequência quando executamos um notebook e pedimos que ele faça plotagens demais. É impossível definirmos exatamente “conspiração demais”, mas o exemplo abaixo é um caso extremo para forçar a questão. O script às vezes causa uma falha rápida e às vezes leva um pouco de tempo. Mas, inevitavelmente, isso causará um acidente.
Aqui estão algumas das coisas que estamos executando que parecem, com base em nossa pesquisa até agora, fazer parte do problema:
- Ubuntu 18.04
- Anaconda 5.2.0 com MKL
- Numpy 1.16.2
- Matplotlib3.0.3
- Júpiter 1.0.0
O resumo das descobertas é:
- A instalação básica do Anaconda usa Numpy com MKL e tem Matplotlib vinculado às suas dependências dentro da distribuição Anaconda. Executar o script de teste abaixo com Python sempre causa travamento. ETA: Tentamos back-ends diferentes para Matplotlib, mas não fez diferença.
- Se executarmos o script de teste de uma distribuição Anaconda onde o Numpy foi instalado pelo Conda, masnãocom MKL e Matplotlib foi instalado via pip enãovia Conda, então o script funciona bem. Se usarmos MKLouConda em vez de pip para instalar o Matplotlib, obtemos o travamento. Também podemos executar o script perfeitamente com uma distribuição não-Anaconda com tudo instalado via pip (e nenhum outro link MKL).
- Se criarmos uma versão do script em notebook Jupyter (um gráfico por célula) e executarmos todas as células, o notebook causará o travamento. Portanto, todos os nossos ganhos no ponto 2 são eliminados apenas com o uso do Jupyter.
- Normalmente executamos o Jupyter em um contêiner Docker e atrás de um proxy reverso Nginx. Descartamos isso como causa porque as imagens do Docker também são Ubuntu 18.04 e executamos os testes diretamente na máquina host para descartar quaisquer problemas do Docker.
- Quando rastreamos o uso de recursos, descobrimos naturalmente que com MKL, o uso da CPU fica na faixa de 300-400%. Temos uma CPU de 12 núcleos e atingimos rotineiramente valores% mais altos. Quase não usamos um giga de memória ao executar o script de teste, embora tenhamos 128 GB de capacidade e executamos rotineiramente análises de dados que nos levam muito além de 1 GB.
Isso cobre o que conseguimos descobrir. Como as falhas estavam muito ligadas à plotagem, parecia bastante óbvio que os ajustes no Matplotlib criaram pelo menos uma correção parcial. O problema do MKL adicionou um fator de confusão intrigante, mas pensamos que tínhamos uma solução alternativa. Mas então, quando voltamos para testá-lo no Jupyter, descobrimos que, embora tenhamos o script em execução, o ponto 4 ainda mostra que não consertamos tudo totalmente.
E isso nos leva a este post. Nada do que vi online chega remotamente perto de corresponder ao que estamos observando e nunca vi nada parecido. Estou completamente sem ideias e não comecei a me perguntar se é realmente um problema de hardware.
Qualquer ajuda para quebrar esta noz seria muito apreciada. Estou pensando em testar isso em nossa estação de trabalho com uma distribuição Linux diferente do Ubuntu.
# Test Script
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# None of the dataframe stuff seems to matter nor the figure size, just
# that we're trying to plot a bunch
n = 100000
figsize = (8, 6)
df = pd.DataFrame(
{
'A': np.cumsum(np.random.rand(n)) / np.arange(1, n+1, 1),
'B': np.cumsum(np.random.rand(n)) / np.arange(1, n+1, 1),
'C': np.cumsum(np.random.rand(n)) / np.arange(1, n+1, 1)
},
index=pd.date_range('2001-01-01 12:00:00', freq='S', periods=n)
)
df.plot(figsize=figsize)
# closing the figures just in case, but doesn't make a difference
plt.close(plt.gcf())
...
# Repeat the dataframe and plotting snippet a lot, like ~100x
...
ADICIONADO: Meu colega encontrou esta postagem esta manhã. Apresentando um caso mais forte para o problema de hardware.https://forum.manjaro.org/t/python-matplotlib-script-crashes-system/44052/10
ATUALIZAÇÃO REVISADA: Desativar o hyperthreading no BIOS não funcionou. Mas seguindo as sugestões de inicialização daquela postagem em manjaro.orgfezajuda, desde que não tenham sido feitas em conjunto com a desativação do hyperthreading no BIOS.
Responder1
AGambiarraé usar a configuração de inicialização apci=off
mencionada nesta postagem do fórum: https://forum.manjaro.org/t/python-matplotlib-script-crashes-system/44052/10
Isso é aceitável para nós, mas se alguém tiver uma solução ou explicação real ou algo a acrescentar a isso, sou todo ouvidos.
Responder2
Eu tive exatamente os mesmos problemas com um novo sistema Ubuntu 18.04.2 LTS e a instalação mais recente do Anaconda. Curiosamente, tive exatamente o mesmo comportamento (congelamento + falha do sistema) no Windows 10 Pro (completamente atualizado).
AFAIK, o Windows não permite a inicialização sem ACPI. No entanto, o Ubuntu faz isso, e alterar as configurações de inicialização do grub adicionando acpi=off
resolveu o problema.
No entanto, isso não resolveu o problema da partição do Windows, já que ACPI é algo que o Windows espera. Meu colega argentino (que é realmente incrível) sugeriu tentar uma versão anterior do matplotlib. Então, usei o comando conda install matplotlib=2.2.3
para fazer downgrade para a versão 2.2.3.
O downgrade resolveu imediatamente o problema no Ubuntu e no Windows! Portanto, sugiro fazer o downgrade por enquanto até que os desenvolvedores do matplotlib resolvam esse problema. Isso também significa que você não precisa desabilitar a ACPI ou quaisquer outras opções que (na estimativa deste novato) provavelmente estejam fazendo coisas boas em segundo plano e, portanto, são melhores para continuar.
Na verdade, isso funcionou para o primeiro exemplo na galeria do matplotlib. Mas depois de tentar mais exemplos por meio de scripts e no notebook Jupyter, ele ainda trava com 2.2.3. Então, atualizei de volta para o matplotlib mais recente e adicionei back acpi=off
, mas isso ainda resultou em congelamento + travamento ao traçar um histograma no notebook Jupyter. Então, adicionei intel_pstate=disable
e mantive a versão mais recente do matplotlib, que foi capaz de rodar em um notebook jupyter.
ATUALIZAÇÃO: Uma desvantagem disso é que o sistema não desliga corretamente:/O Ubuntu irá travar no final do desligamento com essas configurações e eu tenho que desligar a máquina manualmente. Não tenho certeza se é tecnicamente ótimo para o hardware.