Esta é a mensagem recebida da execução de um script para verificar se o Tensorflow está funcionando:
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcublas.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcudnn.so.5 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcufft.so.8.0 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcuda.so.1 locally
I tensorflow/stream_executor/dso_loader.cc:125] successfully opened CUDA library libcurand.so.8.0 locally
W tensorflow/core/platform/cpu_feature_guard.cc:95] The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
W tensorflow/core/platform/cpu_feature_guard.cc:95] The TensorFlow library wasn't compiled to use AVX instructions, but these are available on your machine and could speed up CPU computations.
I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:910] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
Notei que ele mencionou SSE4.2 e AVX,
- O que são SSE4.2 e AVX?
- Como esses SSE4.2 e AVX melhoram os cálculos da CPU para tarefas do Tensorflow.
- Como fazer o Tensorflow compilar usando as duas bibliotecas?
tensorflow
x86
compiler-optimization
simd
compiler-options
GabrielChu
fonte
fonte
bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --config=cuda -k //tensorflow/tools/pip_package:build_pip_package
Em Xeon E5 v3 que me dá 3x melhoria na 8k velocidade da CPU matmul comparação com o lançamento oficial (0,35 -> 1,05 T ops / seg)NOTE on gcc 5 or later: the binary pip packages available on the TensorFlow website are built with gcc 4, which uses the older ABI. To make your build compatible with the older ABI, you need to add --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" to your bazel build command. ABI compatibility allows custom ops built against the TensorFlow pip package to continue to work against your built package.
de aqui tensorflow.org/install/install_sourcesRespostas:
Acabei de encontrar o mesmo problema, parece que a sugestão de Yaroslav Bulatov não cobre o suporte ao SSE4.2, a adição
--copt=-msse4.2
seria suficiente. No final, eu construí com sucesso comsem receber nenhum aviso ou erro.
Provavelmente, a melhor opção para qualquer sistema é:
( Atualização: os scripts de construção podem estar comendo
-march=native
, possivelmente porque contém um=
.)-mfpmath=both
só funciona com gcc, não clang.-mfpmath=sse
provavelmente é tão bom, se não melhor, e é o padrão para x86-64. As versões de 32 bits são padrão para-mfpmath=387
, portanto, alterar isso ajudará as de 32 bits. (Mas se você deseja alto desempenho para trituração de números, crie binários de 64 bits.)Eu não tenho certeza do que padrão de TensorFlow para
-O2
ou-O3
é.gcc -O3
permite otimização completa, incluindo a vetorização automática, mas que às vezes pode tornar o código mais lento.O que isso faz:
--copt
forbazel build
passa uma opção diretamente para o gcc para compilar arquivos C e C ++ (mas não vincula, portanto, você precisa de uma opção diferente para otimização do tempo de link entre arquivos)O x86-64 gcc usa como padrão apenas SSE2 ou instruções SIMD mais antigas, para que você possa executar os binários em qualquer sistema x86-64. (Consulte https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html ). Não é isso que você quer. Você quer criar um binário que tire proveito de todas as instruções que sua CPU pode executar, porque você só está executando esse binário no sistema em que o construiu.
-march=native
ativa todas as opções que sua CPU suporta, tornando-se-mavx512f -mavx2 -mavx -mfma -msse4.2
redundante. (Além disso,-mavx2
já habilita-mavx
e-msse4.2
, portanto, o comando de Yaroslav deveria estar bem). Além disso, se você estiver usando uma CPU que não suporta uma dessas opções (como FMA), o uso de-mfma
um binário falha com instruções ilegais.O
./configure
padrão do TensorFlow é ativar-march=native
, portanto, isso deve evitar a necessidade de especificar as opções do compilador manualmente.-march=native
habilita-mtune=native
, otimizando sua CPU para coisas como qual sequência de instruções do AVX é melhor para cargas desalinhadas.Isso tudo se aplica ao gcc, clang ou ICC. (Para ICC, você pode usar em
-xHOST
vez de-march=native
.)fonte
-march=native
que não funciona. Além disso, soltar o--config=cuda
(se o suporte CUDA não for necessário) e o-k
(já que nenhum erro ocorreu durante a compilação) também funciona.--copt=-mfpmath=both
para fazê-lo funcionarclang
no macOS. Isso afeta o binário resultante?Vamos começar com a explicação de por que você vê esses avisos em primeiro lugar .
Provavelmente você não instalou o TF a partir da fonte e, em vez disso, usou algo parecido
pip install tensorflow
. Isso significa que você instalou binários pré-criados (por outra pessoa) que não foram otimizados para sua arquitetura. E esses avisos dizem exatamente isso: algo está disponível em sua arquitetura, mas não será usado porque o binário não foi compilado com ele. Aqui está a parte da documentação .O bom é que provavelmente você só quer aprender / experimentar o TF, para que tudo funcione corretamente e você não deve se preocupar com isso.
O que são SSE4.2 e AVX?
A Wikipedia tem uma boa explicação sobre SSE4.2 e AVX . Esse conhecimento não é necessário para ser bom em aprendizado de máquina. Você pode pensar nelas como um conjunto de instruções adicionais para um computador usar vários pontos de dados em uma única instrução para executar operações que podem ser naturalmente paralelizadas (por exemplo, adicionando duas matrizes).
O SSE e o AVX são a implementação de uma idéia abstrata de SIMD (instrução única, vários dados), que é
Isso é suficiente para responder à sua próxima pergunta.
Como esses SSE4.2 e AVX melhoram os cálculos da CPU para tarefas de TF
Eles permitem um cálculo mais eficiente de várias operações de vetores (matriz / tensor). Você pode ler mais nesses slides
Como fazer o Tensorflow compilar usando as duas bibliotecas?
Você precisa ter um binário que foi compilado para tirar proveito dessas instruções. A maneira mais fácil é compilar você mesmo . Como Mike e Yaroslav sugeriram, você pode usar o seguinte comando bazel
bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --config=cuda -k //tensorflow/tools/pip_package:build_pip_package
fonte
bazel
neste caso?FAILED: Build did NOT complete successfully
. Não é tão simples compilá-lo você mesmo.Deixe-me responder sua terceira pergunta primeiro:
Se você deseja executar uma versão auto-compilada dentro de um condda-env, é possível. Estas são as instruções gerais que eu corro para que o tensorflow seja instalado no meu sistema com instruções adicionais. Nota: Esta versão foi para uma versão AMD A10-7850 (verifique na sua CPU quais instruções são suportadas ... podem ser diferentes) executando o Ubuntu 16.04 LTS. Eu uso o Python 3.5 dentro do meu conda-env. O crédito vai para a página de instalação da fonte tensorflow e as respostas fornecidas acima.
Quanto à sua segunda pergunta:
Uma versão auto-compilada com otimizações vale bem o esforço, na minha opinião. Na minha configuração específica, os cálculos que costumavam levar de 560 a 600 segundos agora levam apenas cerca de 300 segundos! Embora os números exatos variem, acho que você pode esperar um aumento de velocidade de 35 a 50% em geral em sua configuração específica.
Por fim, sua 1ª pergunta:
Muitas das respostas já foram fornecidas acima. Para resumir: AVX , SSE4.1, SSE4.2 , MFA são tipos diferentes de conjuntos de instruções estendidos em CPUs X86. Muitos contêm instruções otimizadas para o processamento de operações com matriz ou vetor.
Destacarei meu próprio conceito errôneo para poupar algum tempo: não é que o SSE4.2 seja uma versão mais recente das instruções que substituem o SSE4.1. SSE4 = SSE4.1 (um conjunto de 47 instruções) + SSE4.2 (um conjunto de 7 instruções).
No contexto da compilação do tensorflow, se o seu computador oferecer suporte ao AVX2 e AVX e SSE4.1 e SSE4.2, você deverá colocar esses sinalizadores de otimização para todos. Não faça como eu fiz e siga o SSE4.2 pensando que é mais novo e deve substituir o SSE4.1. Isso está claramente errado! Eu tive que recompilar por causa daquilo que me custou uns bons 40 minutos.
fonte
Estes são conjuntos de instruções de processamento de vetor SIMD .
O uso de instruções vetoriais é mais rápido para muitas tarefas; o aprendizado de máquina é uma tarefa dessas.
Citando os documentos de instalação do tensorflow :
fonte
Graças a todas essas respostas + algumas tentativas e erros, consegui instalá-lo em um Mac com
clang
. Então, basta compartilhar minha solução, caso seja útil para alguém.Siga as instruções em Documentação - Instalando o TensorFlow a partir de fontes
Quando solicitado
Especifique sinalizadores de otimização para usar durante a compilação quando a opção bazel "--config = opt" for especificada [O padrão é -march = native]
copie e cole esta sequência:
(A opção padrão causou erros, o mesmo ocorreu com alguns dos outros sinalizadores. Não obtive erros com os sinalizadores acima. BTW, respondi
n
a todas as outras perguntas)Após a instalação, verifico uma aceleração de ~ 2x a 2,5x ao treinar modelos profundos em relação a outra instalação baseada nas rodas padrão - Instalação do TensorFlow no macOS
Espero que ajude
fonte
-march=native
deve ser ainda melhor se o seu compilador o suportar corretamente. Também define-mtune=native
para fazer boas escolhas de instruções para sua CPU. por exemplo, no Haswell e mais tarde, ele desativa-mavx256-split-unaligned-store
e-mavx256-split-unaligned-load
, que está ativado por padrão-mtune=generic
e prejudica o desempenho quando os dados não são conhecidos por estarem alinhados, mas acabam sendo em tempo de execução.-march=native
causou um erro, enquanto as outras opções não. Talvez seja o compilador específico. Eu estava compartilhando isso precisamente no caso de outras pessoas terem o mesmo obstáculo.=
, ou você não esteja usandogcc
ouclang
, ele deve funcionar. E-mtune=native -mavx2 -mfma
funciona para você? Ou-mtune=skylake
? (Ou qualquer CPU que você tenha). Entre,-mavx2
implica-mavx
e-msse4.2
. Ela não ferir a incluí-los todos em uma receita, e eu acho que torna mais fácil para as pessoas a deixar de fora aqueles sua CPU não suporta.-march=native
o sistema de compilação, eu gostaria de saber. (E / ou você deve relatá-lo a montante, para que possam corrigir seus scripts de construção).-march=native
e este é o erro: / Users / jose / Documents / code / tmptensorflow / tensorflow / tensorflow / core / BUILD: 1442: 1: compilação C ++ de regra '// tensorflow / core: lib_internal_impl' falhou (Saída 1). No arquivo incluído no tensorflow / core / platform / denormal.cc: 37: /Library/Developer/CommandLineTools/usr/bin/../lib/clang/7.0.2/include/pmmintrin.h:28:2: erro: "Conjunto de instruções SSE3 não ativado" #erro "Conjunto de instruções SSE3 não ativado" usando o Apple LLVM versão 7.0.2 (clang-700.1.81)Eu o instalei recentemente a partir da fonte e abaixo estão todas as etapas necessárias para instalá-lo da fonte com as instruções mencionadas disponíveis.
Outras respostas já descrevem por que essas mensagens são mostradas. Minha resposta fornece um passo a passo de como instalar a instalação, o que pode ajudar as pessoas a se esforçarem na instalação real, como eu fiz.
Faça o download de um de seus lançamentos disponíveis , por exemplo, 0.5.2 . Extraí-lo, vá para o diretório e configurá-lo:
bash ./compile.sh
. Copie o executável para/usr/local/bin
:sudo cp ./output/bazel /usr/local/bin
Clone tensorflow:
git clone https://github.com/tensorflow/tensorflow.git
Vá para o diretório clonado para configurá-lo:./configure
Irá solicitar várias perguntas, abaixo eu sugeri a resposta para cada uma das perguntas, é claro que você pode escolher suas próprias respostas conforme preferir:
Crie script pip:
bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.1 --copt=-msse4.2 -k //tensorflow/tools/pip_package:build_pip_package
Crie o pacote pip:
bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
Instale o pacote pip Tensorflow que você acabou de criar:
sudo pip install /tmp/tensorflow_pkg/tensorflow-1.2.1-cp27-cp27mu-linux_x86_64.whl
Agora, da próxima vez que você iniciar o Tensorflow, ele não reclamará mais por falta de instruções.
fonte
-c opt --copt=-march=native
deve ser pelo menos tão bom quanto--copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-msse4.1 --copt=-msse4.2
. (Ambos silenciarão o aviso, mas-march=native
podem tornar o código ainda mais rápido, ajustando especificamente a CPU no sistema em que você está construindo). Observe também que isso--copt=-mavx2 --copt=-mfma
implica todas as opções anteriores do AVX e SSE; portanto, essa longa sequência de opções foi claramente escrita por alguém que não entende as opções do gcc.--copt=-mavx2
não funcionaram. Se--copt=-mfma
funcionar,--copt=-march=native
deve funcionar, a menos que a análise do=
seja um problema. Para o gcc / clang / icc, você definitivamente quer que o script de construção passe-march=native
para o compilador. Fazer isso acontecer através de scripts de construção se torna o truque.Este é o método mais simples. Apenas um passo.
Tem um impacto significativo na velocidade. No meu caso, o tempo necessário para uma etapa de treinamento quase caiu pela metade.
Consulte construções personalizadas do fluxo tensor
fonte
TensFlow
versão do @SreeraghAR é 1.10.0 e está em usoMacOS Sierra
. Ajude-me a encontrar o arquivo.Compilei um pequeno script Bash para Mac (facilmente pode ser portado para Linux) para recuperar todos os recursos da CPU e aplicar alguns deles para construir o TF. Estou no mestre do TF e uso meio frequentemente (algumas vezes em um mês).
https://gist.github.com/venik/9ba962c8b301b0e21f99884cbd35082f
fonte
Para compilar o TensorFlow com SSE4.2 e AVX, você pode usar diretamente
Fonte: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/tools/docker/Dockerfile.devel-cpu-mkl
fonte
--copt="-march=native"
foi comer o=
. (E BTW, essas aspas não fazem nada, eles vão ser removido pelo shell antes debazel
vê sua linha de comando.)2.0 SOLUÇÃO COMPATÍVEL:
Execute os comandos abaixo no Terminal (Linux / MacOS) ou no Prompt de Comando (Windows) para instalar o Tensorflow 2.0 usando o Bazel :
fonte
-march=native
ou outras opções de GCC / clang? Não vejo nenhuma menção a AVX, FMA ou SSE4.2 nisso. (E é script de construção de Bazel ou Tensorflow ainda quebrado de uma forma que apenas opções como-mavx
trabalho, não-march=native
se é isso que o problema era realmente na resposta superior sobre esta questão?)Ao criar o TensorFlow a partir da fonte, você executará o
configure
script. Uma das perguntas que oconfigure
script faz é a seguinte:O
configure
script anexará os sinalizadores que você especificar ao comando bazel que cria o pacote pip do TensorFlow. Em termos gerais, você pode responder a esse prompt de duas maneiras:-march=native
). Esta opção otimizará o código gerado para o tipo de CPU da sua máquina.Após configurar o TensorFlow conforme descrito na lista com marcadores anterior, você poderá criar o TensorFlow totalmente otimizado para a CPU de destino apenas adicionando o
--config=opt
sinalizador a qualquer comando bazel em execução.fonte
Para ocultar esses avisos, você pode fazer isso antes do seu código real.
fonte