Speed up the initial TensorFlow startup

Viewed 510

Each time I run a Python code using TensorFlow (CPU), such as:

import keras

I see this:

2020-10-30 15:27:20.518894: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'cudart64_101.dll'; dlerror: cudart64_101.dll not found
2020-10-30 15:27:20.518894: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
2020-10-30 15:27:23.713077: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'nvcuda.dll'; dlerror: nvcuda.dll not found
2020-10-30 15:27:23.713077: E tensorflow/stream_executor/cuda/cuda_driver.cc:313] failed call to cuInit: UNKNOWN ERROR (303)
2020-10-30 15:27:23.716077: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:169] retrieving CUDA diagnostic information for host: User1-PC
2020-10-30 15:27:23.716077: I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:176] hostname: User1-PC
2020-10-30 15:27:23.729078: I tensorflow/compiler/xla/service/service.cc:168] XLA service 0x10cad0c0 initialized for platform Host (this does not guarantee that XLA will be used). Devices:
2020-10-30 15:27:23.729078: I tensorflow/compiler/xla/service/service.cc:176]   StreamExecutor device (0): Host, Default Version
Using TensorFlow backend.

If I sum all the waiting time, there is ~ 10 seconds of waiting time.

Is there a way to speed up this process? Especially if I'm using TensorFlow for inference (and not training), I don't want to have to wait 10 seconds on each startup of the engine.


NB: Of course, when my code will be ready, I'll keep the process using TensorFlow constantly running, and I'll use some sort of inter-process communication, to avoid restart the whole program.

My question here is mostly for the prototyping stages, when you often need to restart the program: when prototyping, having to wait 10 or 15 seconds on each script start is highly unconvenient.

1 Answers

For your inference problem, you'll probably want a longer-lived process that you can request inference results from, maybe over HTTP, gRPC, XML-RPC, named pipes, reading files from a directory...?

Failing that, get a faster machine or disk. On my machine, starting a new Python process and importing Keras takes about 2 seconds:

$ pip install tensorflow
Collecting tensorflow
  Downloading tensorflow-2.3.1-cp38-cp38-macosx_10_14_x86_64.whl (165.2 MB)
[...]
Successfully installed absl-py-0.11.0 astunparse-1.6.3 cachetools-4.1.1 chardet-3.0.4 gast-0.3.3 google-auth-1.23.0 google-auth-oauthlib-0.4.2 google-pasta-0.2.0 grpcio-1.33.2 h5py-2.10.0 idna-2.10 keras-preprocessing-1.1.2 markdown-3.3.3 numpy-1.18.5 oauthlib-3.1.0 opt-einsum-3.3.0 packaging-20.4 protobuf-3.13.0 pyasn1-0.4.8 pyasn1-modules-0.2.8 requests-2.24.0 requests-oauthlib-1.3.0 rsa-4.6 tensorboard-2.3.0 tensorboard-plugin-wit-1.7.0 tensorflow-2.3.1 tensorflow-estimator-2.3.0 termcolor-1.1.0 werkzeug-1.0.1 wrapt-1.12.1
$ time python -c 'import tensorflow.keras as keras'

________________________________________________________
Executed in    2.02 secs   fish           external
   usr time    2.85 secs  118.00 micros    2.85 secs
   sys time    0.62 secs  946.00 micros    0.62 secs
Related