This S2I respository has template files used for building tensorflow wheel files for:
Centos7Fedora27Fedora28RHEL7.5
NOTE: for RHEL7.5 you need a system with RHEL Subscription enabled.
Building Tensorflow from source on Linux can give better performance. This is because
...the default TensorFlow wheel files target the broadest range of hardware to make TensorFlow accessible to everyone. If you are using CPUs for training or inference, it is recommended to compile TensorFlow with all of the optimizations available for the CPU in use. To install the most optimized version of TensorFlow, build and install from source. If there is a need to build TensorFlow on a platform that has different hardware than the target, then cross-compile with the highest optimizations for the target platform....
For example:
--copt=-mavx --copt=-mavx2 --copt=-mavx512f --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2
using above options in CUSTOM_BUILD will build the package with optimizations for FMA, AVX and SSE.
Build and install from source is fraught with errors due to gcc compatability issues, mismatch between CUDA platform and cuDNN libraries with TensorFlow, python versions, bazel versions , unsupported optimizations on the target CPU etc.
The templates and Dockerfiles available here provide a flexible approach to create wheel files for different combinations of OS, python version, bazel version etc by specifying them as PARAMS(--param=) in the templates.
The wheel files created from these templates are available at AICoE/tensorflow-wheels.
And the instructions to use with pipfile are given here AICoE's TensorFlow Artifacts.
TF_NEED_JEMALLOC: = 1TF_NEED_GCP: = 0TF_NEED_VERBS: = 0TF_NEED_HDFS: = 0TF_ENABLE_XLA: = 0TF_NEED_OPENCL: = 0TF_NEED_CUDA: = 1TF_NEED_MPI: = 0TF_NEED_GDR: = 0TF_NEED_S3: = 0TF_CUDA_VERSION: = 9.0TF_CUDA_COMPUTE_CAPABILITIES: = 3.0,3.5,5.2,6.0,6.1,7.0TF_CUDNN_VERSION: = 7TF_NEED_OPENCL_SYCL:= 0TF_NEED_TENSORRT:= 0TF_CUDA_CLANG:= 0GCC_HOST_COMPILER_PATH:= /usr/bin/gccCUDA_TOOLKIT_PATH:= /usr/lib/cudaCUDNN_INSTALL_PATH:= /usr/lib/cudaTF_NEED_KAFKA:=0TF_NEED_OPENCL_SYCL:=0TF_DOWNLOAD_CLANG:=0TF_SET_ANDROID_WORKSPACE:=0TF_NEED_IGNITE:=0TF_NEED_ROCM:=0
Here is the default build command used to build tensorflow.
CUSTOM_BUILD:=bazel build --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --cxxopt='-D_GLIBCXX_USE_CXX11_ABI=0' --cxxopt='-D_GLIBCXX_USE_CXX11_ABI=0' --local_resources 2048,2.0,1.0 --verbose_failures //tensorflow/tools/pip_package:build_pip_package
Following should be left blank for a build job.
TEST_LOOP:=BUILD_OPTS:=
docker build --build-arg BAZEL_VERSION=0.24.1 --build-arg DEV_TOOLSET_VERSION=8 \
--build-arg PIP_LIST="wheel==0.31.1 setuptools==39.1.0 six==1.12.0 absl-py protobuf==3.6.1 enum34 futures mock numpy pixiedust pillow pyaml keras_applications==1.0.8 keras_preprocessing==1.0.5 tf-estimator-nightly"
--build-arg PYTHON_VERSION=3.6 -t submod/manylinux_tf_environment -f Dockerfile.centos6 .
vim .tf_build_env
docker run -it -u 0 --env-file ./.tf_build_env -v $(pwd):/tmp/build_pip_package:Z submod/manylinux_tf_environment /usr/libexec/s2i/manylinux2010
set some environment values for convenience
# valid values are 2.7,3.6,3.5
PYTHON_VERSION=3.6
# git token and repo
export GIT_TOKEN=
export GIT_RELEASE_REPO=
oc create -f tensorflow-build-image.json
oc create -f tensorflow-build-job.json
oc create -f tensorflow-build-dc.json
oc new-app --template=tensorflow-build-image \
--param=APPLICATION_NAME=tf-rhel75-build-image-${PYTHON_VERSION//.} \
--param=S2I_IMAGE=registry.access.redhat.com/rhscl/s2i-core-rhel7 \
--param=DOCKER_FILE_PATH=Dockerfile.rhel75 \
--param=PYTHON_VERSION=$PYTHON_VERSION \
--param=BUILD_VERSION=2 \
--param=BAZEL_VERSION=0.22.0
The above command creates a tensorflow builder image APPLICATION_NAME:BUILD_VERSION for specific OS.
The values for S2I_IMAGE are :
- Fedora26-
registry.fedoraproject.org/f26/s2i-core - Fedora27-
registry.fedoraproject.org/f27/s2i-core - Fedora28-
registry.fedoraproject.org/f28/s2i-core - RHEL7.5-
registry.access.redhat.com/rhscl/s2i-core-rhel7 - Centos7-
openshift/base-centos7
The values for DOCKER_FILE_PATH are :
- Fedora26-
Dockerfile.fedora26 - Fedora27-
Dockerfile.fedora27 - Fedora28-
Dockerfile.fedora28 - RHEL7.5-
Dockerfile.rhel75 - Centos7-
Dockerfile.centos7
OR
Import the template tensorflow-build-image.json into your namespace from Openshift UI.
And then deploy from UI with appropriate values.
oc new-app --template=tensorflow-build-job \
--param=APPLICATION_NAME=tf-rhel75-build-job-${PYTHON_VERSION//.} \
--param=BUILDER_IMAGESTREAM=tf-rhel75-build-image-${PYTHON_VERSION//.}:2 \
--param=PYTHON_VERSION=$PYTHON_VERSION \
--param=BAZEL_VERSION=0.22.0 \
--param=GIT_RELEASE_REPO=$GIT_RELEASE_REPO \
--param=GIT_TOKEN=$GIT_TOKEN
NOTE: BUILDER_IMAGESTREAM = APPLICATION_NAME:BUILD_VERSION from step 2.
OR
Import the template tensorflow-build-job.json into your namespace from Openshift UI.
And then deploy from UI with appropriate values.
Tensorflow wheel files will be pushed to $GIT_RELEASE_REPO using the token $GIT_TOKEN.
(NOTE: This will ONLY work if the oauth token has scope of "repo".
You can generate Personal API access token at https://github.com/settings/tokens. Minimal token scope is "repo".)
oc new-app --template=tensorflow-build-dc \
--param=APPLICATION_NAME=tf-rhel75-build-dc-${PYTHON_VERSION//.} \
--param=BUILDER_IMAGESTREAM=tf-rhel75-build-image-${PYTHON_VERSION//.}:2 \
--param=PYTHON_VERSION=$PYTHON_VERSION \
--param=TEST_LOOP=y
NOTE: BUILDER_IMAGESTREAM = APPLICATION_NAME:BUILD_VERSION from step 2.
See Usage example
Build the cuda images using cuda-build-chain Template.
oc new-app --template=tensorflow-build-image \
--param=APPLICATION_NAME=tf-rhel7gpu-build-image-${PYTHON_VERSION//.} \
--param=S2I_IMAGE=cuda:10.0-cudnn7-devel-rhel7 \
--param=S2I_IMAGE_KIND=ImageStreamTag \
--param=DOCKER_FILE_PATH=Dockerfile.rhel7gpu \
--param=PYTHON_VERSION=$PYTHON_VERSION \
--param=BUILD_VERSION=1 \
--param=BAZEL_VERSION=0.21.0
oc new-app --template=tensorflow-build-job \
--param=APPLICATION_NAME=tf-rhel7gpu-build-job-${PYTHON_VERSION//.}-1 --param=BUILDER_IMAGESTREAM=tf-rhel7gpu-build-image-${PYTHON_VERSION//.}:1 \
--param=BAZEL_VERSION=0.21.0 \
--param=TF_GIT_BRANCH=r1.13 \
--param=TF_NEED_CUDA=1 \
--param=TF_CUDA_VERSION=10.0 \
--param=PYTHON_VERSION=$PYTHON_VERSION \
--param=GIT_TOKEN=$GIT_TOKEN \
--param=CPU_LIMIT=32 --param=CPU_REQUESTS=32 --param=MEMORY_LIMIT=70Gi --param=MEMORY_REQUESTS=70Gi \
--param=CUSTOM_BUILD="bazel build -c opt --copt=-mavx --copt=-mavx2 --copt=-mfma --copt=-mfpmath=both --copt=-msse4.2 --config=cuda --config=nonccl --cxxopt='-D_GLIBCXX_USE_CXX11_ABI=0' --action_env=LD_LIBRARY_PATH=${LD_LIBRARY_PATH} --verbose_failures //tensorflow/tools/pip_package:build_pip_package"