从零到上线:用华为云 ModelArts 训练图像分类模型并部署为 API
【摘要】 一、背景与痛点想做一个垃圾分类的小工具,核心需求很简单:拍张照,识别出是哪种垃圾。但真正动手时发现几个拦路虎:算力贵:本地没有 GPU,买卡不划算,租云服务器配环境又麻烦环境配置繁琐:CUDA、cuDNN、PyTorch 版本一堆坑,配一天不一定跑通训练完不知道怎么用:模型训好了,但怎么让别人通过手机/网页调用?ModelArts 的思路就是把这些全托管了:训练用按需实例,推理一键部署,AP...
一、背景与痛点
想做一个垃圾分类的小工具,核心需求很简单:拍张照,识别出是哪种垃圾。
但真正动手时发现几个拦路虎:
- 算力贵:本地没有 GPU,买卡不划算,租云服务器配环境又麻烦
- 环境配置繁琐:CUDA、cuDNN、PyTorch 版本一堆坑,配一天不一定跑通
- 训练完不知道怎么用:模型训好了,但怎么让别人通过手机/网页调用?
ModelArts 的思路就是把这些全托管了:训练用按需实例,推理一键部署,API 网关直接对外暴露。
二、方案设计
整体流程:
本地标注数据集
↓
上传到 OBS
↓
ModelArts 创建数据集(自动切分训练/验证集)
↓
选择预置算法(ResNet50/ MobileNet)启动训练
↓
模型转换(Ascend 适配 / 导出)
↓
部署为在线推理服务
↓
API 网关对外暴露 HTTPS 接口
选型理由:
- OBS:数据集和模型文件的统一存储,ModelArts 直接读取
- ModelArts 训练:按需 GPU 实例,训练完即释放,不浪费钱
- ModelArts 推理:托管在线服务,自动扩缩容
- APIG:给推理服务套一层标准 RESTful API,方便前端/小程序调用
避坑点:如果数据集较小(< 1000 张/类),优先用预置算法做迁移学习,不要从头训练,否则容易过拟合且训练慢。
三、实操步骤
3.1 准备数据集
垃圾分类分 4 类:可回收物、有害垃圾、厨余垃圾、其他垃圾。
每张图片放到对应类别文件夹下,目录结构:
garbage-dataset/
├── recyclable/
│ ├── img_001.jpg
│ └── ...
├── hazardous/
├── kitchen/
└── other/
建议每类至少 200 张图片,总计 800+ 张。图片尺寸不要求统一,训练时会自动 resize。
打包上传到 OBS:
# 用 OBS Browser+ 或 obsutil 上传
obsutil cp -r ./garbage-dataset obs://my-ai-bucket/datasets/garbage/
3.2 在 ModelArts 创建数据集
- 进入 ModelArts 控制台 → 数据管理 → 数据集
- 创建数据集,类型选「图像分类」
- 数据存储位置选择 OBS 中刚上传的目录
- 标注场景选「图像分类」,标签集填:
recyclable, hazardous, kitchen, other - 创建后系统自动按 8:2 切分训练集和验证集
如果图片还没标注,可以在 ModelArts 的标注页面手动标注,支持多人协作标注。
3.3 启动训练
- ModelArts 控制台 → 训练管理 → 训练作业
- 算法来源选「预置算法」→
ResNet50 (ImageNet 预训练) - 训练输入:选择上一步创建的数据集
- 训练输出:指定 OBS 路径,如
obs://my-ai-bucket/output/garbage-resnet50/ - 规格选择:
GPU: 1 * NVIDIA-V100 (32GB)(按需,训练完即停) - 超参配置:
batch_size: 32learning_rate: 0.001epochs: 50optimizer: Adam
启动后可以在「训练作业」页面查看日志,一般 800 张图 + 50 epoch 在 V100 上约 20-30 分钟跑完。
训练完成后,验证集精度(Accuracy)达到 85%+ 即为可用水平。
3.4 模型转换与导入
- 训练作业完成后,在输出路径找到模型文件(通常是
.pth或.onnx) - 模型管理 → 导入模型
- 选择模型来源为 OBS 中的训练输出
- 推理框架选
TensorFlow或PyTorch(根据训练时用的框架) - 配置推理脚本(如果预置算法没有自带,需自己写
customize_service.py):
import torch
from PIL import Image
import torchvision.transforms as transforms
class GarbageClassifier:
def __init__(self, model_path):
self.model = torch.load(model_path)
self.model.eval()
self.labels = ['recyclable', 'hazardous', 'kitchen', 'other']
self.transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize(mean=[0.485, 0.456, 0.406],
std=[0.229, 0.224, 0.225])
])
def predict(self, image_bytes):
image = Image.open(image_bytes).convert('RGB')
input_tensor = self.transform(image).unsqueeze(0)
with torch.no_grad():
output = self.model(input_tensor)
_, predicted = torch.max(output, 1)
return self.labels[predicted.item()]
3.5 部署在线推理服务
- 模型管理 → 点击刚导入的模型 → 部署 → 在线服务
- 规格选择:
CPU: 2U8G(推理不需要 GPU,省钱) - 实例数:1(测试阶段)
- 等待状态变为「运行中」
部署完成后,ModelArts 会生成一个临时 API 地址,可以先在控制台「在线服务 → 预测」里上传图片测试。
3.6 通过 API 网关对外暴露
ModelArts 自带的 API 地址有时效限制,生产环境建议走 API 网关:
- API 网关控制台 → 创建 API
- 前端类型:HTTP/HTTPS
- 后端类型:HTTP/HTTPS,URL 填 ModelArts 推理服务的地址
- 认证方式:简单认证(AppCode)或 IAM 认证
- 发布到
RELEASE环境
调用示例(Python):
import requests
url = "https://your-apig-domain.com/v1/garbage-classify"
headers = {"X-Apig-AppCode": "your-app-code"}
files = {"images": open("test.jpg", "rb")}
response = requests.post(url, headers=headers, files=files)
print(response.json())
# 输出: {"predicted_label": "recyclable", "confidence": 0.92}
四、验证结果
|
测试图片
|
模型预测
|
置信度
|
是否正确
|
|---|---|---|---|
|
矿泉水瓶
|
recyclable
|
0.94
|
✅
|
|
电池
|
hazardous
|
0.88
|
✅
|
|
剩饭
|
kitchen
|
0.91
|
✅
|
|
烟头
|
other
|
0.76
|
✅
|
单张推理耗时约 200-400ms(CPU 实例),满足实时交互需求。
成本回顾(按需计费):
- 训练:V100 × 30 分钟 ≈ ¥15
- 推理:2U8G CPU × 24h ≈ ¥8/天(测试阶段用完可停)
- OBS 存储:几 GB,几乎可忽略
五、总结与可扩展
这次实践验证了 ModelArts 全托管 AI 开发的可行性:
- 零环境配置:开箱即用的训练环境和预置算法
- 按需付费:不用买 GPU 服务器,训练完即释放
- 一键部署:模型到 API 的链路很短,适合快速验证
后续可扩展方向:
- 数据增强:加入旋转、裁剪、色彩抖动,提升小数据集下的泛化能力
- 模型轻量化:换 MobileNetV3 或做量化,推理延迟可降到 100ms 以内
- 批量推理:用 ModelArts 批量服务处理历史图片
- 前端对接:小程序/Web 直接调 APIG 接口,做完整应用
- 自动标注:用训练好的模型对未标注图片做预标注,再人工校正,形成数据飞轮
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)