predictor.predict should be able to handle a dictionary so tf_estimator.predict({"city":"Paris", "gender":"m", "age":22}) is the correct way to send requests like you mentioned above. The predictor logic defined here needs to handle that case.
The container source code is not open sourced yet, we are planning on releasing it very soon. I will open a bug in the container side as well, to improve the logging when the prediction fails.
I have a temporary solution to unblock you until this issue is fixed. The solution is to create a instance of a RealTimePredictor that takes a tensorflow_serving.apis request as parameter instead of a dictionary:
from sagemaker.tensorflow.predictor import tf_serializer, tf_deserializer