文档首页 > > AI工程师用户指南> 训练管理> 创建训练作业> 使用常用框架训练模型

使用常用框架训练模型

分享
更新时间:2020/11/17 GMT+08:00

如果您在本地使用一些常用框架完成算法开发,如TensorFlow、MXNet等AI引擎,您可以选择常用框架,创建训练作业来构建模型。

前提条件

  • 数据已完成准备:已在ModelArts中创建可用的数据集,或者您已将用于训练的数据集上传至OBS目录。
  • 如果“算法来源”“常用框架”,请准备好训练脚本,并上传至OBS目录。
  • 已在OBS创建至少1个空的文件夹,用于存储训练输出的内容。
  • 由于训练作业运行需消耗资源,确保账户未欠费。
  • 确保您使用的OBS目录与ModelArts在同一区域。

注意事项

  • 训练作业指定的数据集目录中,用于训练的数据名称(如图片名称、音频文件名、标注文件名称等),名称长度限制为0~255英文字符。如果数据集目录下,部分数据的文件名称超过255英文字符,训练作业将不会使用此数据,使用符合要求的数据继续进行训练。如果数据集目录下,所有数据的文件名称都超过了255英文字符,导致训练作业无数据可用,则会最终导致训练作业失败。
  • 训练脚本中,“数据来源”“训练输出位置”,两个参数必须为OBS路径。当需要对OBS进行读写交互时,建议使用MoXing接口进行读写操作。

训练管理支持的AI常用框架

当前ModelArts支持的AI引擎及对应版本如下所示。

  • TensorFlow:TF-1.8.0-python3.6、TF-1.8.0-python2.7、TF-1.13.1-python3.6、TF-1.13.1-python2.7、TF-2.1.0-python3.6
  • MXNet:MXNet-1.2.1-python3.6、MXNet-1.2.1-python2.7
  • Caffe:Caffe-1.0.0-python2.7
  • Spark_MLlib:Spark-2.3.2-python2.7、Spark-2.3.2-python3.6
  • Ray:RAY-0.7.4-python3.6
  • XGBoost-Sklearn:XGBoost-0.80-Sklearn-0.18.1-python2.7、XGBoost-0.80-Sklearn-0.18.1-python3.6
  • PyTorch:PyTorch-1.0.0-python2.7、PyTorch-1.0.0-python3.6、PyTorch-1.3.0-python2.7、PyTorch-1.3.0-python3.6、PyTorch-1.4.0-python3.6
  • Ascend-Powered-Engine:MindSpore-1.0-python3.7-aarch64、TF-1.15-python3.7-aarch64
  • MoXing是ModelArts团队自研的分布式训练加速框架,它构建于开源的深度学习引擎TensorFlow、MXNet、PyTorch、Keras之上,详细说明请参见MoXing使用说明。如果您使用的是MoXing框架编写训练脚本,在创建训练作业时,请根据您选用的接口选择其对应的AI引擎和版本。
  • “efficient_ai”是华为云ModelArts团队自研的加速压缩工具,它支持对训练作业进行量化、剪枝和蒸馏来加速模型推理速度,详细说明请参见efficient_ai使用说明
  • Ascend-Powered-Engine仅在“华北-北京四”区域支持。

使用常见框架的训练代码开发

当您使用常用框架创建训练作业时,您需要实现训练代码的开发。在ModelArts中,训练代码需包含以下步骤:

图1 训练代码开发流程
  1. 解析必选参数“data_url”“train_url”

    在使用常见框架创建训练作业时,您需要在创建训练作业页面填写作业参数配置相关信息。

    “data_url”:训练数据是训练代码开发中必不可少的输入。在创建训练作业时,您需要在作业参数配置“数据来源”。训练代码中的“data_url”指代“数据来源”的路径。

    “train_url”:模型训练结束后,训练模型以及相关输出信息需保存在OBS路径。在创建训练作业时,您需要在作业参数配置“训练输出位置”。训练代码中的“train_url”指代“训练输出位置”的OBS路径

    图2 作业参数配置相关信息

    在训练代码中需解析“data_url”“train_url”,ModelArts推荐以下方式实现参数解析。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    import argparse
    # 创建解析
    parser = argparse.ArgumentParser(description="train mnist",
                                     formatter_class=argparse.ArgumentDefaultsHelpFormatter)
    # 添加参数
    parser.add_argument('--train_url', type=str, default='obs://obs-test/ckpt/mnist',
                        help='the path model saved')
    parser.add_argument('--data_url', type=str, default='obs://obs-test/data/', help='the training data')
    # 解析参数
    args, unkown = parser.parse_known_args()
    
  2. “data_url”导入训练数据

    已知训练数据路径为“data_url”,ModelArts推荐采用Moxing接口实现训练数据下载到“cache”目录。

    1
    2
    import moxing as mox 
    mox.file.copy_parallel(args.data_url, /cache)
    
  3. 训练代码正文和保存模型

    训练代码正文和保存模型涉及的代码与您使用的AI引擎密切相关。以下案例以Tensorflow框架为例,训练代码中解析参数方式采用tensorflow接口tf.flags.FLAGS接受命令行参数:

    from __future__ import absolute_import
    from __future__ import division
    from __future__ import print_function
    
    import os
    
    import tensorflow as tf
    from tensorflow.examples.tutorials.mnist import input_data
    
    # 解析参数data_url train_url max_steps
    tf.flags.DEFINE_integer('max_steps', 1000, 'number of training iterations.')
    tf.flags.DEFINE_string('data_url', '/home/jnn/nfs/mnist', 'dataset directory.')
    tf.flags.DEFINE_string('train_url', '/home/jnn/temp/delete', 'saved model directory.')
    
    FLAGS = tf.flags.FLAGS
    
    
    def main(*args):
        # Train model
        print('Training model...')
        # Import data
        mnist = input_data.read_data_sets(FLAGS.data_url, one_hot=True)
    
         # Create the model
        sess = tf.InteractiveSession()
        serialized_tf_example = tf.placeholder(tf.string, name='tf_example')
        feature_configs = {'x': tf.FixedLenFeature(shape=[784], dtype=tf.float32),}
        tf_example = tf.parse_example(serialized_tf_example, feature_configs)
        x = tf.identity(tf_example['x'], name='x')
        y_ = tf.placeholder('float', shape=[None, 10])
        w = tf.Variable(tf.zeros([784, 10]))
        b = tf.Variable(tf.zeros([10]))
        sess.run(tf.global_variables_initializer())
        y = tf.nn.softmax(tf.matmul(x, w) + b, name='y')
        cross_entropy = -tf.reduce_sum(y_ * tf.log(y))
    
        tf.summary.scalar('cross_entropy', cross_entropy)
    
        train_step = tf.train.GradientDescentOptimizer(0.01).minimize(cross_entropy)
    
        correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, 'float'))
        tf.summary.scalar('accuracy', accuracy)
        merged = tf.summary.merge_all()
        test_writer = tf.summary.FileWriter(FLAGS.train_url, flush_secs=1)
    
        # Train
        for step in range(FLAGS.max_steps):
          batch = mnist.train.next_batch(50)
          train_step.run(feed_dict={x: batch[0], y_: batch[1]})
          if step % 10 == 0:
            summary, acc = sess.run([merged, accuracy], feed_dict={x: mnist.test.images, y_: mnist.test.labels})
            test_writer.add_summary(summary, step)
            print('training accuracy is:', acc)
        print('Done training!')
    
        # Save model
        builder = tf.saved_model.builder.SavedModelBuilder(os.path.join(FLAGS.train_url, 'model'))
    
        tensor_info_x = tf.saved_model.utils.build_tensor_info(x)
        tensor_info_y = tf.saved_model.utils.build_tensor_info(y)
    
        prediction_signature = (
            tf.saved_model.signature_def_utils.build_signature_def(
                inputs={'images': tensor_info_x},
                outputs={'scores': tensor_info_y},
                method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME))
    
        builder.add_meta_graph_and_variables(
            sess, [tf.saved_model.tag_constants.SERVING],
            signature_def_map={
                'predict_images':
                    prediction_signature,
            },
            main_op=tf.tables_initializer(),
            strip_default_attrs=True)
    
        builder.save()
    
        print('Done exporting!')
    
    
    if __name__ == '__main__':
        tf.app.run(main=main)

    更多案例参见最佳实践,更多代码示例参见自定义脚本代码示例

  4. 导出训练模型至“train_url”

    已知训练输出位置为“train_url”,ModelArts推荐采用Moxing接口实现训练数据下载到“/tmp/ckpt/”目录下。

    mox.file.copy_parallel(“/tmp/ckpt/”, args.train_url)

创建训练作业

  1. 登录ModelArts管理控制台,在左侧导航栏中选择“训练管理 > 训练作业”,默认进入“训练作业”列表。
  2. 在训练作业列表中,单击左上角“创建”,进入“创建训练作业”页面。
  3. 在创建训练作业页面,填写训练作业相关参数,然后单击“下一步”
    1. 填写基本信息。基本信息包含“名称”“版本”“描述”。其中“计费模式”当前仅支持“按需计费”,不支持修改。“版本”信息由系统自动生成,按“V001”“V002”规则命名,用户无法修改。
      您可以根据实际情况填写“名称”“描述”信息。
      图3 训练作业基本信息
    2. 填写作业参数。包含数据来源、算法来源等关键信息,详情请参见表1
      图4 算法来源为常用框架
      表1 作业参数说明

      参数名称

      子参数

      说明

      一键式参数配置

      -

      如果您在ModelArts已保存作业参数,您可以根据界面提示,选择已有的作业参数,快速完成训练作业的参数配置。

      算法来源

      常用框架

      选择“AI引擎”“版本”,选择“代码目录”“启动文件”。选择的AI引擎和编写训练代码时选择的框架必须一致。例如编写训练代码使用的是TensorFlow,则在创建训练作业时也要选择TensorFlow。

      目前支持的AI引擎及其版本请参见训练管理支持的AI常用框架

      如果您的模型需要安装Python依赖包时,请按照ModelArts定义的要求将依赖包及其配置文件放置“代码目录”中,详细说明请参见模型中引用依赖包时,如何创建训练作业?

      数据来源

      数据集

      从ModelArts数据管理中选择可用的数据集及其版本。

      • “选择数据集”:从右侧下拉框中选择ModelArts系统中已有的数据集。当ModelArts无可用数据集时,此下拉框为空。
      • “选择版本”:根据“选择数据集”指定的数据集选择其版本。

      数据存储位置

      从OBS桶中选择训练数据。在“数据存储位置”右侧,单击“选择”,从弹出的对话框中,选择数据存储的OBS桶及其文件夹。

      训练输出位置

      -

      选择训练结果的存储位置。

      说明:

      为避免出现错误,建议选择一个空目录用作“训练输出位置”。请勿将数据集存储的目录作为训练输出位置。

      运行参数

      -

      代码中的命令行参数设置值,请根据您编写的算法代码逻辑进行填写,确保参数名称和代码的参数名称保持一致。

      例如:train_steps=10000,其中“train_steps”为代码中的某个传参。

      作业日志路径

      -

      选择作业运行中产生的日志文件存储路径。

    3. 选择用于训练作业的资源。
      图5 选择训练作业资源
      表2 资源参数说明

      参数名称

      说明

      资源池

      选择训练作业资源池。

      训练作业支持选择“公共资源池”“专属资源池”。公共资源池又可以选择CPU或GPU两种类型,不同类型的资源池,其收费标准不同,详情请参见价格详情说明。专属资源池的创建请参见资源池

      类型

      当选择公共资源池时,需选择资源类型。目前支持CPU和GPU两种类型。

      GPU资源性能更佳,CPU资源性价比更高。如果您选择的算法已定义使用CPU或GPU,界面将自动呈现此资源类型,请务必根据要求选择。

      不同的资源类型的数据盘容量是不同的,详细介绍参考训练环境中不同规格资源“/cache”目录的大小

      说明:

      如果您在训练代码使用的是GPU资源,则在选择资源池时只能选择GPU集群,否则会导致训练作业失败。

      规格

      针对不同的资源类型,选择资源规格。

      其中针对“已有算法”“常用框架”“自定义镜像”,ModelArts支持使用Ascend 910创建训练作业,且此资源仅在“华北-北京四”可用。

      前缀带“[限时免费] ”信息的为免费规格,您可以使用此规格免费体验ModelArts的训练作业功能。此规格的使用注意事项,请参见免费体验AI全流程开发

      计算节点个数

      选择计算节点的个数。如果节点个数设置为1,表示后台的计算模式是单机模式;如果节点个数设置大于1,表示后台的计算模式为分布式的。请根据实际编码情况选择计算模式。

      “常用框架”选择Caffe时,只支持单机模式,即“计算节点个数”必须设置为“1”。针对其他“常用框架”,您可以根据业务情况选择单机模式或分布式模式。

    4. 配置订阅消息,并设置是否将当前训练作业中的参数保存为作业参数。
      图6 配置训练作业订阅消息
      表3 订阅消息及作业参数的参数说明

      参数名称

      说明

      订阅消息

      订阅消息使用消息通知服务,在事件列表中选择需要监控的资源池状态,在事件发生时发送消息通知。

      此参数为可选参数,您可以根据实际情况设置是否打开开关。如果开启订阅消息,请根据实际情况填写如下参数。

      • “主题名”:订阅消息主题名称。您可以单击创建主题,在消息通知服务中创建主题。
      • “事件列表”:订阅事件。当前可选择“OnJobRunning”“OnJobSucceeded”“OnJobFailed”三种事件,分别代表训练运行中、运行成功、运行失败。

      保存作业参数

      勾选此参数,表示将当前训练作业设置的作业参数保存,方便后续一键复制使用。

      勾选“保存训练参数”,然后填写“作业参数名称”“作业参数描述”,即可完成当前参数配置的保存。训练作业创建成功后,您可以从ModelArts的作业参数列表中查看保存的信息,详细操作指导请参见管理作业参数

    5. 完成参数填写后,单击“下一步”
  4. “规格确认”页面,确认填写信息无误后,单击“提交”,完成训练作业的创建。训练作业一般需要运行一段时间,根据您选择的数据量和资源不同,训练时间将耗时几分钟到几十分钟不等。

    训练作业创建完成后,将立即启动,运行过程中将按照您选择的资源按需计费。

    您可以前往训练作业列表,查看训练作业的基本情况。在训练作业列表中,刚创建的训练作业“状态”“初始化”,当训练作业的“状态”变为“运行成功”时,表示训练作业运行结束,其生成的模型将存储至对应的“训练输出位置”中。当训练作业的“状态”变为“运行失败”时,您可以单击训练作业的名称,进入详情页面,通过查看日志等手段处理问题。

分享:

    相关文档

    相关产品

文档是否有解决您的问题?

提交成功!非常感谢您的反馈,我们会继续努力做到更好!
反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

智能客服提问云社区提问