Tensorflow packages often assume the processor supports avx2. Our Xeon process does not, and requires tensorflow to be compiled without this flag.
Verify dependencies
sudo apt install python3-dev python3-pip
Install Dependencies
sudo pip3 install numpy
Install Bazel using Bazelisk
sudo npm install -g @bazel/bazelisk
Checkout Tensorflow
git clone https://github.com/tensorflow/tensorflow.git cd tensorflow
Configure
Keep all defaults
./configure
Compile
The jobs parameter may be needed to reduce memory dependencies on some servers
bazel build --jobs 2 //tensorflow/tools/pip_package:build_pip_package
I got compilation errors at one point and some guidance said to add the following to the command to reduce memory consumption:
--local_ram_resources 2048
or
bazel build --jobs 2 --local_ram_resources 2048 //tensorflow/tools/pip_package:build_pip_package
Almost at the end, I got a compile error. I fixed it with this suggestion:
from tensorflow/core/kernels/pad_op.cc:20: external/eigen_archive/unsupported/Eigen/CXX11/src/Tensor/TensorPadding.h: In member function 'Eigen::TensorEvaluator<const Eigen::TensorPaddingOp<PaddingDimensions, XprType>, Device>::PacketReturnType Eigen::TensorEvaluator<const Eigen::TensorPaddingOp<PaddingDimensions, XprType>, Device>::packetRowMajor(Eigen::TensorEvaluator<const Eigen::TensorPaddingOp<PaddingDimensions, XprType>, Device>::Index) const [with PaddingDimensions = const Eigen::array<Eigen::IndexPair<long int>, 2ul>; ArgType = const Eigen::TensorMap<Eigen::Tensor<const std::complex<float>, 2, 1, long int>, 16, Eigen::MakePointer>; Device = Eigen::ThreadPoolDevice]': external/eigen_archive/unsupported/Eigen/CXX11/src/Tensor/TensorPadding.h:688:7:internal compiler error: in emit_move_insn, at expr.c:3547values[i] = coeff(index+i);
With this workaround, you can compile tensorflow with gcc 6.3 In external/eigen_archive/unsupported/Eigen/CXX11/src/Tensor/TensorReduction.h:801 (you can find the file in a subdirectory of ~/.cache/bazel ) replace values[i] = internal::InnerMostDimReducer<Self, Op>::reduce(*this, firstIndex + i * num_values_to_reduce, num_values_to_reduce, reducer); by two instructions instead Self::CoeffReturnType a = internal::InnerMostDimReducer<Self, Op>::reduce(*this, firstIndex + i * num_values_to_reduce, num_values_to_reduce, reducer); values[i] = a;