A Framework For Managing Heterogeneous Memory For Large Scale Machine Learning Workloads