前言
yaml文件是一种常用的配置文件,经常用于配置模型的参数。而当一个文件有多个数据集时,为了适应不同的数据集,我们会对模型设置不同的超参,因此可能会有多个yaml文件。在线下机进行使用的时候,我们其实很好找到yaml文件所路径,从而很好根据所需条件来设置当前模型使用的是哪个yaml文件,但当我们使用华为云ModelArts进行线上训练或者预测时,由于不能直接读取obs桶里的文件,需要读取拷贝过来的文件。而我们在进行线上模型的训练时,使用了华为官方mindspore/modesl仓库里offical文件夹下的config.py+yaml文件进行模型的配置时的就遇到了找不到yaml文件的问题。我们尝试了设置cogfig_path为yaml文件所在的绝对路径以及相对路径,发现都不行,我们又上models仓库里查看了里面多yaml文件的模型的云上适配的设置,发现都讲的不明确,所以在通过一点小技巧解决了这个问题后,决定写一篇文章来和大家分享。
一yaml文件的作用
YAML 是专门用来写配置文件的语言,非常简洁和强大, 而且可读性很高。使用yaml文件,可以很方便我们配置模型以及文件的参数。
二、官方的config.py文件
华为官方有在mindspore/models仓库下提供开源的cofig.py文件用来读取并处理yaml文件中的配置信息。
这里以models中的lenet里的config.py文件为例
def get_config():
"""
Get Config according to the yaml file and cli arguments.
"""
parser = argparse.ArgumentParser(description="default name", add_help=False)
current_dir = os.path.dirname(os.path.abspath(__file__))
parser.add_argument("--config_path", type=str, default=os.path.join(current_dir, "../../default_config.yaml"),
help="Config file path")
path_args, _ = parser.parse_known_args()
default, helper, choices = parse_yaml(path_args.config_path)
args = parse_cli_to_yaml(parser=parser, cfg=default, helper=helper, choices=choices, cfg_path=path_args.config_path)
final_config = merge(args, default)
pprint(final_config)
print("Please check the above information for the configurations", flush=True)
return Config(final_config)
config = get_config()
这里我们可以看到代码找到yaml文件,可以直接通过把默认的yaml文件设置为default_config.yaml并放在config.py文件所处的文件夹两层之外,或者使用其绝对路径或相对路径。但这在线下机使用的时候是可以正常找到的,放到云上反而无法找到了。我们在网上设置了config_path为需要的yaml文件的相对路径,发现无法找到,而我们对拷贝过去的yaml文件所处的绝对路径也不是很清楚,我们通过打印当前文件所在路径发现云上拷贝过去的yaml文件位于/cache/user-job-dir,虽然这个很奇怪,但是我们还是尝试在网页上设置config_path为/cache/user-job-dir+yaml文件名,显然最后还是找不到yaml文件。
二、我们修改的config.py文件
我们发现使用官方的config.py文件在云上是可以很好的读取默认的yaml文件的,所以如果使用官方的config.py文件,在我们只有一个yaml文件的情况下还是很好用的,但由于我们搭建的模型有多个数据集,并且对于不同的数据集模型的超参等还是有很大的不同,所以我们需要配置多个yaml文件。
与此同时,鉴于官方的config.py文件在线上训练的时候还是可以很好的找到默认的yaml文件的,也就是说os.path.join(current_dir, “…/…/default_config.yaml”)这个方法所拼接出来的路径在云上也是能很好的找到的,所以我们对config.py文件进行了一点小修改,把config_path这个参数设置为yaml文件相对config.py的绝对路径,在寻找yaml文件时,找yaml文件的路径为os.path.join(current_dir, path_args.config_path),具体代码如下:
def get_config():
"""
Get Config according to the yaml file and cli arguments.
"""
parser = argparse.ArgumentParser(description="default name", add_help=False)
current_dir = os.path.dirname(os.path.abspath(__file__))
parser.add_argument("--config_path", type=str, default="../../default_config.yaml",
help="Config file path")
path_args, _ = parser.parse_known_args()
config_path = os.path.join(current_dir, path_args.config_path)
default, helper, choices = parse_yaml(config_path)
args = parse_cli_to_yaml(parser=parser, cfg=default, helper=helper, choices=choices, cfg_path=config_path)
final_config = merge(args, default)
return Config(final_config)
config = get_config()
所以这样我们在线上适配的时候只要简单的把config_path设置为yaml文件相对的config.py文件的相对路径即可。
总结
以上就是今天要分享的内容,本文仅仅简单介绍了一个多yaml文件的模型在云上适配的时候便于找到yaml文件的小技巧,谢谢大家的观看。