更新时间:2023-10-30 GMT+08:00
分享

常用框架

本章详细介绍ModelArts支持的常用AI框架以及使用AI框架编写创建训练作业的训练代码。

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

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

表1 旧版训练作业支持的AI引擎

工作环境

适配芯片

系统架构

系统版本

AI引擎与版本

支持的cuda或Ascend版本

TensorFlow

CPU/GPU

x86_64

Ubuntu16.04

TF-1.8.0-python3.6

-

TF-1.13.1-python3.6

-

tensorflow_2.1.0-cuda_10.1-py_3.7-ubuntu_18.04-x86_64

cuda10.1

MXNet

CPU/GPU

x86_64

Ubuntu16.04

MXNet-1.2.1-python3.6

-

Spark_MLlib

CPU

x86_64

Ubuntu16.04

Spark-2.3.2-python3.6

-

Ray

CPU/GPU

x86_64

Ubuntu16.04

RAY-0.7.4-python3.6

-

XGBoost-Sklearn

CPU

x86_64

Ubuntu16.04

XGBoost-0.80-Sklearn-0.18.1-python2.7

-

XGBoost-0.80-Sklearn-0.18.1-python3.6

-

PyTorch

CPU/GPU

x86_64

Ubuntu16.04

PyTorch-1.0.0-python3.6

-

PyTorch-1.3.0-python3.6

-

PyTorch-1.4.0-python3.6

-

pytorch_1.8.0-cuda_10.2-py_3.7-ubuntu_18.04-x86_64

cuda10.2

Ascend-Powered-Engine

Ascend

aarch64

Euler2.8

mindspore_1.7.0-cann_5.1.0-py_3.7-euler_2.8.3-aarch64

5.1.0

tensorflow_1.15-cann_5.1.0-py_3.7-euler_2.8.3-aarch64

5.1.0

MPI

CPU/GPU

x86_64

Ubuntu18.04

mindspore_1.3.0-cuda_10.1-py_3.7-ubuntu_1804-x86_64

cuda10.1

Caffe

CPU/GPU

x86_64

Ubuntu16.04

Caffe-1.0.0-python2.7

cuda8.0

  • MoXing是ModelArts团队自研的分布式训练加速框架,它构建于开源的深度学习引擎TensorFlow、MXNet、PyTorch、Keras之上,详细说明请参见MoXing使用说明。如果您使用的是MoXing框架编写训练脚本,在创建训练作业时,请根据您选用的接口选择其对应的AI引擎和版本。
  • “efficient_ai”是华为云ModelArts团队自研的加速压缩工具,它支持对训练作业进行量化、剪枝和蒸馏来加速模型推理速度,详细说明请参见efficient_ai使用说明
  • Ascend-Powered-Engine仅在“华北-北京四”区域支持。

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

当您使用常用框架创建训练作业时,您需要在创建页面提供代码目录路径、代码目录路径中的启动文件、训练数据路径以及训练输出路径。这四种路径搭建了用户和ModelArts后台交互的桥梁。

  • 代码目录路径

    您需要在OBS桶中指定代码目录,并将训练代码、依赖安装包或者预生成模型等训练所需文件上载至该代码目录下。训练作业创建完成后,ModelArts会将代码目录及其子目录下载至后台容器中。

  • 代码目录路径中的启动文件

    代码目录路径中的启动文件作为训练启动的入口,当前只支持python格式。

  • 训练数据路径

    请注意不要将训练数据路径放在代码目录路径下。训练数据比较大,训练代码目录在启动后会下载至后台,可能会有下载失败的风险。

    在训练作业启动后,ModelArts会挂载硬盘至“/cache”目录,用户可以使用此目录来存储临时文件。“/cache”目录大小请参考训练环境中不同规格资源“/cache”目录的大小

    您需要将训练数据上传至OBS桶另外的路径,并在训练代码中需通过解析命令行参数“data_url”下载训练数据至“/cache”目录。请保证您设置的桶路径有读取权限。

  • 训练输出路径

    建议设置一个空目录为训练输出路径。在训练代码中,您需要解析命令行参数“train_url”上载训练输出至指定的训练输出路径,请保证您设置的桶路径有写入权限和读取权限。

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

图1 训练代码开发说明
  1. (可选)引入依赖

    当您使用常见框架创建训练作业的时候,如果您的模型引用了其他依赖,您需要在创建训练作业的“代码目录”下放置相应的文件或安装包。

    图2 选择常用框架并指定模型启动文件
  2. 解析必选参数“data_url”“train_url”

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

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

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

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

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

  3. “data_url”导入训练数据

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

  4. 训练代码正文和保存模型

    训练代码正文和保存模型涉及的代码与您使用的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
    
    import moxing as mox
    
    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):
        mox.file.copy_parallel(FLAGS.data_url, '/cache/data_url')
    
        # Train model
        print('Training model...')
        mnist = input_data.read_data_sets('/cache/data_url', one_hot=True)
        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('/cache/train_url', flush_secs=1)
    
        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!')
    
        builder = tf.saved_model.builder.SavedModelBuilder(os.path.join('/cache/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!')
    
        mox.file.copy_parallel('/cache/train_url', FLAGS.train_url)
    
    
    if __name__ == '__main__':
        tf.app.run(main=main)

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

    已知训练输出位置为“train_url”,ModelArts推荐采用Moxing接口实现输出结果从后台自定义目录“/cache/train_url”目录导出至“train_url”目录。

    mox.file.copy_parallel(“/cache/train_url”, args.train_url)
分享:

    相关文档

    相关产品