昇思MindSpore推理支持本地推理、API 服务化、Web 可视化三种部署形态在实际生产中通常以API 接口对外提供服务并通过Web 页面进行功能验证与效果演示。本文系统介绍昇思模型推理服务化的完整流程模型导出 → API 服务封装 → Web 前端调用 → 接口验证并提供可直接运行的 Python 代码适用于 CV、NLP、小模型等常见推理场景。一、Web 与 API 推理调用核心内容1. 整体架构推理后端基于 MindSpore 原生model.predict()加载.ckpt/.mindir模型API 服务使用 FastAPI / Flask 封装 REST 接口支持 POST 请求Web 前端简单 HTML 页面实现图片上传、文本输入、结果展示调用流程Web 页面 → 发送 HTTP 请求 → API 服务 → 昇思推理 → 返回 JSON 结果 → 前端展示2. 关键能力支持图片分类、目标检测、NLP 情感分析等通用场景标准化 JSON 输入输出便于对接微服务、网关、前端支持批量推理、异步推理、结果后处理可直接部署在鲲鹏 昇腾环境实现全栈国产化3. 验证目标模型加载正常无初始化错误API 接口可正常接收请求、返回结构化数据Web 端可正常上传数据并展示推理结果推理时延、输出格式符合预期二、环境准备# 安装依赖 pip install mindspore flask pillow numpy三、步骤 1定义昇思推理模型以 MNIST 手写数字识别为例先实现一个最小可推理的昇思网络用于后续 API 服务。# model.py import mindspore as ms import mindspore.nn as nn class LeNet(nn.Cell): def __init__(self, num_classes10): super().__init__() self.conv1 nn.Conv2d(1, 6, 5) self.pool nn.MaxPool2d(2, 2) self.conv2 nn.Conv2d(6, 16, 5) self.flatten nn.Flatten() self.fc1 nn.Dense(16 * 4 * 4, 120) self.fc2 nn.Dense(120, 84) self.fc3 nn.Dense(84, num_classes) def construct(self, x): x self.pool(ms.ops.relu(self.conv1(x))) x self.pool(ms.ops.relu(self.conv2(x))) x self.flatten(x) x ms.ops.relu(self.fc1(x)) x ms.ops.relu(self.fc2(x)) x self.fc3(x) return x # 加载模型权重 net LeNet() # ms.load_checkpoint(lenet.ckpt, net) # 实际使用时加载训练好的ckpt四、步骤 2封装 API 服务Flask使用 Flask 封装/predict接口接收图片并返回分类结果。# app.py import numpy as np from flask import Flask, request, jsonify, render_template from PIL import Image import mindspore as ms from model import net app Flask(__name__) # 推理预处理 def preprocess(img: Image.Image): img img.convert(L).resize((28, 28)) img_np np.array(img).astype(np.float32) / 255.0 img_np img_np[np.newaxis, np.newaxis, :, :] # (1,1,28,28) return ms.Tensor(img_np) # 推理接口 app.route(/predict, methods[POST]) def predict(): try: file request.files[image] img Image.open(file.stream) x preprocess(img) # 昇思推理 out net(x) pred ms.ops.argmax(out, axis1).asnumpy()[0] return jsonify({ code: 0, message: success, predict: int(pred) }) except Exception as e: return jsonify({code: -1, message: str(e)}) # Web页面路由 app.route(/) def index(): return render_template(index.html) if __name__ __main__: app.run(host0.0.0.0, port5000, debugTrue)五、步骤 3Web 前端页面可视化验证在templates/index.html中实现图片上传与结果展示。!-- templates/index.html -- !DOCTYPE html html head meta charsetUTF-8 title昇思推理Web验证/title /head body h1手写数字识别MindSpore推理/h1 input typefile idimgFile acceptimage/* button onclickupload()上传并推理/button div idresult stylemargin-top:20px;/div script function upload() { const file document.getElementById(imgFile).files[0]; if (!file) return alert(请选择图片); const formData new FormData(); formData.append(image, file); fetch(/predict, { method: POST, body: formData }).then(res res.json()) .then(data { if (data.code 0) { document.getElementById(result).innerHTML 推理结果 data.predict; } else { document.getElementById(result).innerHTML 错误 data.message; } }); } /script /body /html六、步骤 4启动服务与验证python app.py打开浏览器访问http://127.0.0.1:5000上传一张手写数字图片即可看到推理结果。七、API 接口自动化验证Python 脚本用于 CI / 验证、压力测试、接口连通性检查。# test_api.py import requests url http://127.0.0.1:5000/predict files {image: open(test.png, rb)} resp requests.post(url, filesfiles) print(resp.json()) # 预期输出 # {code:0,message:success,predict:5}八、生产化扩展要点模型导出为 MindIRms.export(net, ms.Tensor(np.zeros((1,1,28,28), np.float32)), file_namelenet.mindir)使用mindspore.load()加载推理更快更稳定。使用 FastAPI 替代 Flask更高性能、自动 API 文档、异步支持。昇腾 NPU 加速ms.context.set_context(device_targetAscend)输入校验、限流、日志、异常捕获用于正式上线。批量推理、返回置信度prob ms.ops.softmax(out, axis1).asnumpy()九、总结昇思 WebAPI 推理是模型落地的标准工程化方式整体流程分为模型构建、预处理、API 封装、Web 页面、接口验证五部分。后端使用 Flask/FastAPI 提供 REST 接口接收图片 / 文本请求内部调用 MindSpore 的 model.predict 完成推理Web 前端实现可视化上传与结果展示便于测试与演示提供自动化 API 测试脚本用于接口连通性与正确性验证