做华为云认证辅导和竞赛带队这几年,ModelArts 是被问得最多的模块,没有之一。华为 ICT 大赛云赛道、HCIA-AI 认证、企业上云后的 AI 场景迁移,只要是围绕华为云的人工智能方向,基本都绕不开这套“模型训练与部署”的流程。但零基础同学第一次打开 ModelArts 控制台,往往直接懵掉——数据集、OBS、训练作业、模型管理、在线服务,一长串菜单摆在面前,不知道先点哪个,也不知道它们之间是什么关系。
这篇文章就是干这个事的:我把 ModelArts 从“数据准备 → 模型训练 → 模型部署”这条主线拆开讲,每一个环节讲清楚为什么这么做、实际操作怎么点、考试和竞赛最喜欢在哪几个点上挖坑。适合两类人看:一是备战华为云相关认证和 ICT 大赛云赛道的学生,时间紧、基础弱,但需要快速把全流程跑通;二是一贯在自己电脑上用 GPU 跑模型、玩过本地部署工具的开发者,想切换上云训练部署的思路。读完不说能成为调参大师,但至少考场里遇到“训练一个模型并部署成在线服务”这种题,心里有完整的应答地图。
1. 先搞清楚ModelArts到底在考什么
1.1 ModelArts是什么,一句话说透
用一句话讲,ModelArts 是华为云的一站式 AI 开发平台。所谓“一站式”,意思是你不必再自己拼装一台 GPU 服务器、装驱动、配 Python 环境、管存储、自己写服务,而是把“数据标注、数据管理、算法选择、模型训练、模型部署、版本管理”这些环节全部搬到网页控制台上,按需付费使用。
平台内部虽然模块很多,但核心入口就是几个:开发环境(Notebook)、数据管理、自动学习、训练管理、模型管理、部署上线。我们平时说的“用 ModelArts 做训练”,绝大多数情况走的是“训练管理 → 创建训练作业”;说的“部署”,走的是“部署上线 → 在线服务”。考试和认证的考点也基本集中在这两个入口上。
对考生来说,最难的不是记住这句话,而是理解这句话背后的工程逻辑。本地开发时代,你的数据在硬盘上,模型在内存里,训练完成之后写个 Flask 接口就能给前端调用。云上多了一层“对象存储”和“容器化部署”,所有东西都要用路径和配置串起来。你只有把这个映射关系建立起来,后面看控制台才不会迷路。
1.2 为什么考试和竞赛都爱考它
以华为 ICT 大赛云赛道为例,实操题目经常是“使用 ModelArts 完成一个图像分类或目标检测模型的训练,并部署为在线服务”这类任务。评分点通常包含:数据集是否正确上传到指定 OBS 路径、训练作业是否成功运行、训练精度或损失是否达到题目要求、模型是否成功注册、在线服务是否能正常返回预测结果。
换句话说,考的不是你写模型算法的能力,而是你按照平台规则把事情做完整、做规范的能力。ModelArts 正好把 AI 工程化的全部关键环节都做成了有界面入口、有日志输出、有状态反馈的标准化流程,特别适合出操作题。这恰恰是零基础同学可以通过系统化复习短期提分的地方。算法理论短期内补不起来,但“数据传哪、作业怎么建、服务怎么部署”这些操作,反复练几遍就能形成肌肉记忆。
1.3 零基础首先要建立的三个概念
我给学生讲课,第一节课不讲任何按钮,先掰扯三个概念,因为后面所有操作都是它们的延伸。
第一个是 OBS,可以理解成云上的硬盘。所有数据、模型、日志最终都存在 OBS 桶里,训练作业和部署服务都从 OBS 读数据、写结果。你在控制台上填写的“数据位置”“输出位置”,本质上都是 OBS 路径。
第二个是训练作业,就是一个跑在云上的进程。你指定算法、数据、输出路径和算力规格,平台帮你在容器里把任务跑完,并保存日志和模型产物。训练作业是有生命周期的,跑完即释放,不占用额外费用。
第三个是部署服务,就是一个常驻的推理进程。训练产出的模型被打包成服务,通过 API 对外提供预测,考试里最常验证的就是这一步能不能调通。
这三个概念串起来就是一条链路:OBS → 训练作业 → 模型管理 → 在线服务。后续所有操作都是在这条链路上加细节。
2. 数据准备:这关过不了,后面全是白搭
2.1 先把OBS桶建明白
很多考生第一步就栽在 OBS 上。训练作业里填的数据路径、输出路径,全都是 OBS 路径,不是本地路径。你需要先在 OBS 控制台创建桶(Bucket),然后上传数据集。
创建桶时有几个参数要留意。区域必须和 ModelArts 服务所在区域保持一致,比如你在“华北-北京四”使用 ModelArts,桶也建议建在北京四。跨区域访问不是不行,但会带来额外网络延迟和流量费用,考试环境下没必要找这个麻烦。存储类别选标准存储就可以,不要选低频或归档,否则训练作业读取时会有额外等待。桶策略和 ACL 默认“私有读写”就行,ModelArts 在获得授权后可以通过内部凭据访问这些数据。
上传数据有两条路:网页控制台直接拖拽,适合小文件;或者用 obsutil 命令行,适合成百上千个文件。obsutil 的基本用法是这样的:
obsutil config -i=AK -k=SK -e=endpoint obsutil cp ./train_data obs://your-bucket-name/train_data -f -r考试时数据量一般不大,网页上传完全够用。但如果你以后真做项目,学会 obsutil 和 OBS Browser+ 能省大量时间,尤其是断点续传和批量同步这种能力,网页端体验差很多。
2.2 数据集怎么准备,目录结构很关键
ModelArts 支持多种数据导入方式,最常用的是 OBS 目录导入。以图像分类为例,推荐目录结构是这样的:
dataset/ ├── train/ │ ├── class_a/xxx.jpg │ ├── class_b/xxx.jpg └── val/ ├── class_a/xxx.jpg ├── class_b/xxx.jpg这种按类别分子目录的格式,很多预置算法可以直接读取,训练作业里把“数据来源”指到 dataset 目录,算法会自动按子目录名识别类别。这一点非常建议考试时采用,比手工写清单文件可靠得多。
如果你用的是资源中心的“数据集管理”功能,还需要注意标记类型。ModelArts 数据集管理里可以选择图像分类、物体检测、文本分类等任务类型,标注结果会生成特定格式的清单文件。物体检测通常用矩形框标注,支持导出成 Pascal VOC 或 COCO 格式,这两种格式平台都支持导入。之前有学生图省事,把标注文件和图片一股脑全丢到一个目录里,结果算法根本不认,白白浪费了一个小时。
2.3 数据校验,别让坏文件拖垮训练
数据这关最容易考到的坑是“路径错误”和“格式非法”。实操里我见过最多的报错就是训练作业启动后立刻失败,日志里写着类似 “No such file or directory” 或者 “Dataset path invalid”。排查思路很简单:先去 OBS 控制台看路径是否真实存在,再确认文件是否完整,最后看目录层级是否和算法要求一致。
另外一个常见问题是图片损坏或截断。本地下载的数据集偶尔会混入 0 字节文件或不可解码的图片,训练到一半报编码错误。建议上传前先做一次完整性检查,写个小脚本遍历目录:
from PIL import Image import os bad = [] for root, _, files in os.walk("train_data"): for f in files: if not f.lower().endswith((".jpg", ".jpeg", ".png")): continue p = os.path.join(root, f) try: img = Image.open(p) img.verify() except Exception: bad.append(p) print("损坏文件:", bad)删掉损坏文件再上传,能避免后面浪费大量排错时间。尤其是多人协作的数据集,别人拷给你的压缩包经常解压出各种问题,先校验再传是最稳的习惯。
3. 训练作业实操:核心考点全在这里
3.1 创建训练作业之前要想清楚的四件事
第一,用什么算法。ModelArts 的算法来源有三类:预置算法、自定义算法、AutoML。考试和入门阶段,优先用预置算法。比如图像分类任务,平台提供 ResNet 系列预训练模型,直接勾选即可;目标检测场景可以选 YOLO 系算法;中文 NLP 任务可以选基于 RoBERTa 中文预训练模型的文本分类算法。预置算法的好处是输入输出格式明确、文档齐全、参数项少,不容易出错。
第二,用什么算力。ModelArts 提供 CPU、GPU(如 V100、T4 等)和华为自研昇腾(Ascend)资源。考试环境通常已经开了配额,但选型仍然要注意:Ascend 和 GPU 对应的框架版本可能不同,预置算法一般会标注推荐的资源类型。选错资源和引擎组合,轻则警告,重则直接报版本不兼容。MindSpore 框架和昇腾组合是华为云的原生搭配,考试里出现概率很高,至少要认识这个名字。
第三,数据从哪里来、输出到哪里去。训练作业里要填数据路径和输出路径。输出路径一定要指向 OBS 的某个目录,训练生成的模型文件和 checkpoint 都会存在这里。很多同学只填数据路径,忘了建输出目录,导致作业一直报错。这个细节很基础但很致命。
第四,超参数怎么传。预置算法通常暴露一批可调参数:学习率(learning_rate)、批大小(batch_size)、训练轮数(epochs)等。控制台上可以直接填键值对。初次跑通流程,建议全部用默认值,跑通后再优化,不要上来就改一堆参数。有个学生第一次就把 epoch 改成 1000,训练跑了十几个小时,纯属浪费。
3.2 控制台创建训练作业的分步操作
以最常用的方式为例,流程大致如下:
- 进入 ModelArts 控制台 → “训练管理” → “训练作业” → “创建训练作业”。
- 填写作业名称,建议写成 “train_task_date_version” 这种能区分实验的名字。
- 算法来源选择“预置算法”,在列表里选对应任务类型的算法。
- 资源池选择公共资源池或专属资源池,规格按需选择。
- 填写数据来源,选择 OBS 路径;填写训练输出位置,同样是 OBS 路径。
- 设置超参数,先用默认值。
- 提交作业,等待状态变为“运行成功”。
这里我特别提醒一点:训练作业的运行状态有初始化、等待中、运行中、运行成功、运行失败。如果停留在“等待中”很久,多半是资源配额或优先级问题,不是你的配置问题。公共资源池在高峰时段排队是正常的,属于所有云平台都有的现象。考试环境一般会指定资源池,遇到排队太久时优先检查配额,不要反复删了重建。
训练开始后,可以点进作业详情看日志。日志是排错最重要的入口,平台会把容器里的标准输出实时展示出来。考试时如果作业失败,第一件事就是复制日志,根据报错关键字去定位,而不是盲目重跑。重跑一次浪费几分钟,考场里很宝贵。
3.3 训练过程看什么、怎么看
训练日志里最值得关注的是 loss 变化。以图像分类为例,预置算法每训练若干个 step 会打印一次 loss 和 accuracy。我们要做的检查是:loss 是否在稳定下降、验证集精度是否有提升趋势、有没有出现 NaN 或 Inf。
关于“模型训练报 NaN”,这个问题我碰到过非常多次。原因通常是几个:学习率过大、梯度爆炸、数据里有异常值、混合精度模式下数值溢出。处理顺序建议是:先看日志里 NaN 出现在第几个 step,如果是刚起步就出现,九成是学习率问题,把学习率调小一个数量级再试;如果训练中途出现,先排查数据,看是不是有缺失值、极大值或未归一化;如果用了混合精度,可以尝试关闭后再验证。
另一个常见情况是 loss 不降或下降极慢。这时候先确认数据划分是否合理、类别是否均衡,再考虑调整 batch size 和学习率。记住一个原则:每次只改一个变量,改完跑一小段验证,不要同时动三个参数。调参最忌讳的是“多头乱调”,最后连你自己都说不清是哪个改动起了作用。
3.4 预训练模型和checkpoint的实用技巧
预置算法里很多都用到了预训练权重。比如 ResNet 预训练模型默认会加载 ImageNet 上训练好的权重,这对小数据集特别友好,收敛快、精度高。同样,NLP 任务里的 RoBERTa 中文预训练模型也解决了标注数据不足的痛点。
如果你需要用自己的代码,也可以在训练入口里加载 OBS 上的预训练权重路径。这里有个细节:ModelArts 训练作业启动时,系统会把 OBS 里的文件同步到容器本地,预训练权重比较大时,加载时间会明显变长,日志里表现为“容器创建中”阶段拉长。这是正常现象,不是故障,耐心等待即可。
另外,训练输出目录里除了最终模型,往往还有 checkpoint。建议合理设置 checkpoint 的保存频率,既保证有断点恢复的可能,又不至于因为频繁保存拖慢训练。在大模型微调这类耗时长、算力贵的场景里,checkpoint 就是命根子,一旦断点续跑能力没了,前面所有算力都白花了。
4. 模型部署实操:从“模型文件”到“在线服务”
4.1 模型怎么“注册”到ModelArts
训练作业运行成功之后,模型产物在 OBS 输出目录里,但“训练出模型”不等于“能部署模型”。中间还差一步:模型注册。这一步在“模型管理”里完成。
进入“模型管理” → “模型” → “创建模型”,需要填写名称和版本号,选择元模型来源(“从训练作业”或“从 OBS”导入),然后配置模型包与推理代码。预置算法一般会自动生成模型配置,自定义算法需要你提供推理脚本和模型文件。
这里最关键的其实是“推理代码”。部署服务本质上是一个 HTTP 服务,你的模型要在里面被加载,并且能处理输入、返回输出。ModelArts 对推理脚本有约定,需要实现模型加载、数据预处理、预测和后处理这些逻辑。如果你完全用预置算法,平台已经帮你处理好;如果你上传的是自己训练的模型,就一定要把推理脚本和模型文件放对位置。上次一个学员把模型和脚本分开放,部署怎么都起不来,查到最后才发现是路径少了一层。
4.2 创建在线服务的配置要点
模型注册成功后,进入“部署上线” → “在线服务” → “部署”,需要配置的内容不多,但每一项都有讲究:
- 选择模型及版本,注意别选错旧版本;
- 服务名称,例如 “infer_demo_v1”,命名要可识别;
- 实例数,考试场景 1 个实例就够,多了纯属浪费;
- 资源规格,根据模型大小选 CPU 或 GPU;
- 环境变量,按需配置模型路径、超时时间等。
在线服务从创建到“运行中”通常需要几分钟,期间状态会经历“部署中”到“运行中”。如果部署失败,去服务详情看事件和日志。最常见的问题是模型启动失败、端口配置错误、推理脚本 import 报错。排查时看日志里的第一行报错栈,基本都能定位。如果你部署的是大模型,模型文件有好几个 GB 甚至更大,冷启动时间会明显变长,不要一看到“部署中”就以为卡住了,先确认镜像和模型文件大小。
4.3 调用推理接口的实测方法
部署完成后,控制台会给你一个 API 地址。这个地址就是对外预测的入口,也是考试评分的关键对象。
调用在线服务有两种方式:控制台自带的“预测”功能,适合快速测试;API 方式,适合自动化评分或真实业务。控制台预测很简单,在服务详情页找到“预测”,填入对应格式的请求体,点提交就能看到返回结果。如果报错,先检查请求体格式是否和推理脚本约定一致。
API 调用需要认证,ModelArts 在线服务的接口走华为云 IAM 认证,需要先获取 token,再在请求头里携带。大体请求格式如下:
curl -X POST \ 'https://example-modelarts-endpoint/v1/predict' \ -H 'Content-Type: application/json' \ -H 'X-Auth-Token: <IAM Token>' \ -d '{"data": {"image_base64": "..."}}'这里要强调:能调通 API 返回预期结果,才是部署真正成功。很多同学在控制台看到“运行中”就以为结束了,结果评分接口一调就失败,吃亏就吃在没做真实调用测试。控制台预测通了之后,一定再用 API 方式完整走一遍,把返回的 JSON 结构和题目要求逐字比对。
4.4 部署形态与成本控制
在线服务、批量服务、边缘服务三个概念,考试常考。在线服务是常驻服务,适合实时推理;批量服务是一次性跑完大量数据,适合离线打分场景;边缘服务是把模型部署到边缘设备上,靠近数据源推理。
成本上,在线服务只要“运行中”就会持续计费,即使没有请求,也会按实例占用计费。我见过太多同学把测试服务一直挂着,几天后发现账单吓一跳。考试虽然一般不用担心费用,但如果是自己练习,务必记住:验证完功能就停止或删除服务。训练作业运行完会自动释放算力资源,但 OBS 上的数据和模型依然会产生少量存储费用,不需要的及时清理。有些同学到处问哪里能免费训练模型,其实与其把注意力放在“白嫖”上,不如先算清楚自己测试一次要花多少时间、多少资源,把每次实验的性价比提上来。
5. 常见问题与排查实录
5.1 训练阶段问题速查表
| 现象 | 可能原因 | 处理建议 |
|---|---|---|
| 作业一直等待中 | 资源池排队、配额不足 | 检查配额,换资源池或等待 |
| 启动即失败,报路径错误 | OBS 路径填错或不存在 | 去 OBS 控制台核对路径 |
| loss 为 NaN | 学习率过大、数据异常 | 调小学习率,清洗数据 |
| loss 不降 | 数据划分、类别不均衡 | 确认数据均衡,微调 batch size |
| 日志长时间无输出 | 镜像拉取中、日志延迟 | 查看事件详情,耐心等待 |
5.2 部署阶段问题速查表
| 现象 | 可能原因 | 处理建议 |
|---|---|---|
| 部署一直“部署中” | 镜像下载慢、实例规格不足 | 查看事件,超过 10 分钟再定位 |
| 部署失败 | 推理脚本报错、端口不对 | 查看容器日志,定位报错栈 |
| 调用接口超时 | 模型加载慢、规格太小 | 换更高规格,优化推理代码 |
| 返回结果异常 | 请求格式、后处理逻辑不对 | 先控制台预测,再对比请求体 |
5.3 考前一个晚上的检查清单
- 确认数据已上传到指定 OBS 路径,且目录层级正确。
- 确认训练作业输出路径存在且可写。
- 训练成功后,检查输出目录是否生成了模型文件。
- 模型注册时,确认模型版本和推理脚本完整。
- 部署为在线服务,并等待状态变为“运行中”。
- 用控制台预测和 API 各测一次,确认返回结构与题目要求一致。
- 如果题目要求关闭资源,结束后删除或停止服务。
最后说几个我自己反复踩过的经验。第一,不要小看命名规范,考试环境里作业名、服务名、模型名最好按题目要求来,评分脚本有时会检查资源名称,别在这种地方丢分。第二,日志永远是第一排查入口,报错不要慌,复制关键字去比对,大部分问题都能定位。第三,跑通整个流程比追求高精度重要得多,先把“数据 → 训练 → 部署 → 调用”全链路打通,再去调精度,这个顺序在时间有限的赛场上尤其关键。很多人调了两小时精度,最后连部署都没做完,那才是真正的得不偿失。