TensorOpt: Exploring the Tradeoffs in Distributed DNN Training with Auto-Parallelism