Repository: NVIDIA-Merlin/NVTabular

Issue:
[BUG] configure_tensorflow raises TypeError: expected string or bytes-like object in Horovod
**Describe the bug**
While trying to integrate Horovod's KerasEstimator w/ NVTabular, I'm seeing this error:
```
[1,0]<stderr>:/nvtabular/nvtabular/loader/tf_utils.py:53: UserWarning: TensorFlow runtime already initialized, may not be enough memory for cudf
[1,0]<stderr>:  warnings.warn(
[1,0]<stderr>:Traceback (most recent call last):
[1,0]<stderr>:  File "/nvtabular/nvtabular/loader/tf_utils.py", line 57, in configure_tensorflow
[1,0]<stderr>:    tf.config.experimental.set_virtual_device_configuration(
[1,0]<stderr>:  File "/opt/conda/envs/rapids/lib/python3.8/site-packages/tensorflow/python/framework/config.py", line 871, in set_logical_device_configuration
[1,0]<stderr>:    context.context().set_logical_device_configuration(device, logical_devices)
[1,0]<stderr>:  File "/opt/conda/envs/rapids/lib/python3.8/site-packages/tensorflow/python/eager/context.py", line 1629, in set_logical_device_configuration
[1,0]<stderr>:    raise RuntimeError(
[1,0]<stderr>:RuntimeError: Virtual devices cannot be modified after being initialized[1,0]<stderr>:
[1,0]<stderr>:
[1,0]<stderr>:During handling of the above exception, another exception occurred:
[1,0]<stderr>:
[1,0]<stderr>:Traceback (most recent call last):
[1,0]<stderr>:  File "/opt/conda/envs/rapids/lib/python3.8/runpy.py", line 194, in _run_module_as_main
[1,0]<stderr>:    return _run_code(code, main_globals, None,
[1,0]<stderr>:  File "/opt/conda/envs/rapids/lib/python3.8/runpy.py", line 87, in _run_code
[1,0]<stderr>:    exec(code, run_globals)
[1,0]<stderr>:  File "/horovod/horovod/spark/task/mpirun_exec_fn.py", line 52, in <module>
[1,0]<stderr>:    main(codec.loads_base64(sys.argv[1]), codec.loads_base64(sys.argv[2]))
[1,0]<stderr>:  File "/horovod/horovod/spark/task/mpirun_exec_fn.py", line 45, in main
[1,0]<stderr>:    task_exec(driver_addresses, settings, 'OMPI_COMM_WORLD_RANK', 'OMPI_COMM_WORLD_LOCAL_RANK')
[1,0]<stderr>:  File "/horovod/horovod/spark/task/__init__.py", line 61, in task_exec
[1,0]<stderr>:    result = fn(*args, **kwargs)
[1,0]<stderr>:  File "/horovod/horovod/spark/keras/remote.py", line 261, in train
[1,0]<stderr>:    history = fit(model, dm, steps_per_epoch,
[1,0]<stderr>:  File "/horovod/horovod/spark/keras/util.py", line 41, in fn
[1,0]<stderr>:    train_data = data_module.train_data(train_reader)
[1,0]<stderr>:  File "/horovod/horovod/spark/keras/datamodule.py", line 110, in train_data
[1,0]<stderr>:    from nvtabular.loader.tensorflow import KerasSequenceLoader
[1,0]<stderr>:  File "/nvtabular/nvtabular/loader/tensorflow.py", line 28, in <module>
[1,0]<stderr>:    from_dlpack = configure_tensorflow()
[1,0]<stderr>:  File "/nvtabular/nvtabular/loader/tf_utils.py", line 63, in configure_tensorflow
[1,0]<stderr>:    warnings.warn(e)
[1,0]<stderr>:TypeError: expected string or bytes-like object
```

This is resulting in a fatal error instead of a non-fatal warning.  My current workaround is to just use `warnings.warn(str(e))` here, although I'm not sure why the `RuntimeError` isn't automatically cast to string (when it normally would cast to string).

**Steps/Code to reproduce bug**
Unfortunately, since this involves integration with horovod, so the setup to reproduce is non-trivial.

**Expected behavior**
A non-fatal warning, and continued execution.

**Environment details (please complete the following information):**
 - Environment location: Docker on Linux with single GPU.
 - Method of NVTabular install: custom docker image based on `nvcr.io/nvidia/merlin/merlin-tensorflow-training:22.05`  


Discussion:

Resolving patch:
diff --git a/nvtabular/loader/tf_utils.py b/nvtabular/loader/tf_utils.py
--- a/nvtabular/loader/tf_utils.py
+++ b/nvtabular/loader/tf_utils.py
@@ -60,7 +60,7 @@ def configure_tensorflow(memory_allocation=None, device=None):
             )
         except RuntimeError as e:
             # Virtual devices must be set before GPUs have been initialized
-            warnings.warn(e)
+            warnings.warn(str(e))
 
     # versions using TF earlier than 2.3.0 need to use extension
     # library for dlpack support to avoid memory leak issue


Test patch: