文档首页/ AI开发平台ModelArts/ 常见问题/ Standard训练作业/ 训练过程读取数据/ 如何提升训练效率,同时减少与OBS的交互?
更新时间:2024-10-28 GMT+08:00

如何提升训练效率,同时减少与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)