如何提升训练效率,同时减少与OBS的交互?
场景描述
在使用ModelArts进行自定义深度学习训练时,训练数据通常存储在对象存储服务(OBS)中,且训练数据较大时(如200GB以上),每次都需要使用GPU资源池进行训练,且训练效率低。
希望提升训练效率,同时减少与对象存储OBS的交互。可通过如下方式进行调整优化。
优化原理
对于ModelArts提供的GPU资源池,每个训练节点会挂载500GB的NVMe类型SSD提供给用户免费使用。此SSD挂载到“/cache”目录,“/cache”目录下的数据生命周期与训练作业生命周期相同,当训练作业运行结束以后“/cache”目录下面所有内容会被清空,腾出空间,供下一次训练作业使用。因此,可以在训练过程中将数据从OBS复制到“/cache”目录,然后每次从“/cache”目录读取数据,直到训练结束。训练结束以后“/cache”目录的内容会自动被清空。
优化方式
以TensorFlow代码为例。
优化前代码如下所示:
1 2 3 4 |
... tf.flags.DEFINE_string('data_url', '', 'dataset directory.') FLAGS = tf.flags.FLAGS mnist = input_data.read_data_sets(FLAGS.data_url, one_hot=True) |
优化后的代码示例如下,将数据复制至“/cache”目录。
1 2 3 4 5 6 7 |
... tf.flags.DEFINE_string('data_url', '', 'dataset directory.') FLAGS = tf.flags.FLAGS import moxing as mox TMP_CACHE_PATH = '/cache/data' mox.file.copy_parallel('FLAGS.data_url', TMP_CACHE_PATH) mnist = input_data.read_data_sets(TMP_CACHE_PATH, one_hot=True) |