华为云AI开发平台ModelArts常用框架_云淘科技
本章详细介绍ModelArts支持的常用AI框架以及使用AI框架编写创建训练作业的训练代码。
训练管理支持的AI常用框架
当前ModelArts支持的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 训练代码开发说明
(可选)引入依赖
当您使用常见框架创建训练作业的时候,如果您的模型引用了其他依赖,您需要在创建训练作业的“代码目录”下放置相应的文件或安装包。
安装python依赖包请参考模型中引用依赖包时,如何创建训练作业?
安装C++的依赖库请参考如何安装C++的依赖库?
在预训练模型中加载参数请参考如何在训练中加载部分训练好的参数?
图2 选择常用框架并指定模型启动文件
解析必选参数“data_url”、“train_url”
在使用常见框架创建训练作业时,您需要在创建训练作业页面填写作业参数配置相关信息。
“data_url”:训练数据是训练代码开发中必不可少的输入。在创建训练作业时,您需要在作业参数配置“数据来源”。训练代码中的“data_url”指代“数据来源”的路径。
“train_url”:模型训练结束后,训练模型以及相关输出信息需保存在OBS路径。在创建训练作业时,您需要在作业参数配置“训练输出位置”。训练代码中的“train_url”指代“训练输出位置”的OBS路径。
图3 作业参数配置相关信息
在训练代码中需解析“data_url”、“train_url”,ModelArts推荐以下方式实现参数解析。
从“data_url”导入训练数据
已知训练数据路径为“data_url”,ModelArts推荐采用Moxing接口实现训练数据下载到“cache”目录。
训练代码正文和保存模型
训练代码正文和保存模型涉及的代码与您使用的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)
导出训练模型至“train_url”
已知训练输出位置为“train_url”,ModelArts推荐采用Moxing接口实现输出结果从后台自定义目录“/cache/train_url”目录导出至“train_url”目录。
mox.file.copy_parallel(“/cache/train_url”, args.train_url)
父主题: 训练管理(旧版即将下线)
同意关联代理商云淘科技,购买华为云产品更优惠(QQ 78315851)
内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家