ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

MXNet 模型部署实战指南:ONNX 导出、Jetson 边缘推理与 AWS 云端部署

MXNet 模型部署实战指南:ONNX 导出、Jetson 边缘推理与 AWS 云端部署 MXNet 模型部署实战指南ONNX 导出、Jetson 边缘推理与 AWS 云端部署【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址: https://gitcode.com/gh_mirrors/mx/mxnet本指南以 Apache MXNet 官方部署专题文档docs/python_docs/python/tutorials/deploy/index.rst为骨架系统讲解将训练好的 MXNet 模型落地到生产环境的完整链路从 Gluon 模型导出为 symbol/params 与 ONNX 开放格式到在 Jetson 边缘模块上运行预训练 ResNet-50 完成图像分类再到借助 AWS EC2、SageMaker 与 Deep Learning AMI 在云端分配 GPU 资源训练与托管推理。读完本文你将掌握 MXNet 模型导出 API 的完整参数用法、边缘设备上的推理脚本编写、以及云上训练与部署的两种主流操作路径。部署专题结构概览MXNet 官方 Python 文档将部署相关内容组织为「Deployment」专题docs/python_docs/python/tutorials/deploy/index.rst涵盖四个方向Export模型导出把训练好的模型导出为 MXNet 原生paramsjson文件或进一步转换为 ONNX 开放格式便于在其他框架中复用。对应 export/ 目录。Inference推理部署在 C 环境与 Jetson 边缘设备等不同平台上运行推理应用对应 inference/ 目录。Cloud云端运行在 AWS EC2、SageMaker 等云平台上部署 MXNet 并进行训练对应 run-on-aws/ 目录。Security安全官方给出的一系列部署安全最佳实践。此外专题还引用了 GluonCV 生态中的相关教程如导出 GluonCV 模型、在 C 应用中加载 GluonCV YOLO 模型、在 Intel Xeon 上用量化模型推理、在 Jetson 上做目标检测等本文聚焦仓库内可完整展开的四条主线展开。模型导出从 Gluon 到标准格式MXNet 模型默认导出为一对params与json文件json描述计算图symbolparams保存权重。绝大多数模型还可以进一步导出为ONNXOpen Neural Network Exchange格式——ONNX 是一种开放源码的 AI 模型格式定义了可扩展的计算图模型、内建算子集合与标准数据类型让模型可以在不同深度学习框架之间自由迁移。第一步用 Gluon 构建并导出 MLP 模型在转换之前先用 Gluon 快速构建一个两层多层感知机MLP隐藏层含 256 个单元并使用 ReLU 激活输出层为 10 类import mxnet as mx from mxnet import initializer as init, np, onnx as mxnet_onnx from mxnet.gluon import nn import logging logging.basicConfig(levellogging.INFO) net nn.HybridSequential() net.add(nn.Dense(256, activationrelu), nn.Dense(10)) net.initialize(init.Normal(sigma0.01)) net.hybridize() input np.ones(shape(50,), dtypenp.float32) output net(input) net.export(mlp)关键点在于net.hybridize()将动态的 Gluon 网络编译为静态符号图这是export的前提net.export(mlp)会在磁盘上同时生成mlp-symbol.json计算图与mlp-0000.params权重二者共同构成可独立加载、部署的模型文件。第二步认识export_modelAPIMXNet 的 ONNX 导出入口是mxnet.onnx.export_model实际实现位于 python/mxnet/onnx/mx2onnx/_export_model.py。查看其帮助信息help(mxnet_onnx.export_model)其完整签名取自当前仓库源码比官方文档示例更完整为export_model(sym, params, in_shapesNone, in_typesnp.float32, onnx_file_pathmodel.onnx, verboseFalse, dynamicFalse, dynamic_input_shapesNone, run_shape_inferenceFalse, input_typeNone, input_shapeNone, large_modelFalse)各参数含义如下参数类型说明symstr 或 Symbol 对象json文件路径或 Symbol 对象paramsstr / dict / list参数字典路径、包含 arg_params 与 aux_params 的字典或长度为 2、依次存放 arg_params 与 aux_params 的列表in_shapesList of tuple模型输入形状例如[(1,3,224,224)]in_types数据类型或列表输入数据类型例如np.float32或[np.float32, np.int32]input_type是其旧名称为向后兼容保留onnx_file_pathstr生成的 ONNX 文件保存路径默认model.onnxverboseBoolean为True时打印转换过程的日志dynamicBoolean为True时允许模型使用动态输入形状dynamic_input_shapeslist of tuple指定动态输入形状若为None则所有维度都设为动态run_shape_inferenceBoolean为True时对导出的模型执行 ONNX shape inferencelarge_modelBoolean导出大于 2 GB 的模型时置为True参数张量会被保存到独立文件中需要 ONNX 1.8.0从源码看export_model内部会先实例化MXNetGraph()转换器再根据当前安装的 onnx 版本确定算子集版本opset——这正是文档强调「MXNet-ONNX 遵循 ONNX operator set 12 与 13」的原因当前仓库在 python/mxnet/onnx/mx2onnx/_op_translations/ 下分别维护了_op_translations_opset12.py与_op_translations_opset13.py两套算子翻译层。需要 ONNX v1.7对应 opset 12与 v1.8对应 opset 13配合使用。export_model支持两种输入方式直接传入 MXNet 的 sym、params 对象适合训练过程中训练结束时直接调用导出传入 MXNet 已导出的 json 与 params 文件路径适合已有预训练模型文件、希望转换为 ONNX 的场景本教程采用这种方式。第三步完整执行 ONNX 转换# 输入MXNet 模型文件 sym ./mlp-symbol.json params ./mlp-0000.params # 输入形状此处为文档示例的 50 维向量ImageNet 图像模型通常是 3 通道 224*224 input_shape (50,) # 输出 ONNX 文件路径 onnx_file ./mxnet_exported_mlp.onnx # 调用导出 API返回转换后的 ONNX 模型路径 converted_model_path mxnet_onnx.export_model(sym, params, [input_shape], [np.float32], onnx_file)对于常见的图像分类模型输入形状应写为[(1, 3, 224, 224)]batch、通道、高、宽若需要动态 batch 维度可追加dynamicTrue。第四步用 ONNX checker 校验导出结果转换完成后务必用 ONNX 自带的 checker 校验模型内容是否为合法的 protobuffrom onnx import checker import onnx # 加载 ONNX 模型 model_proto onnx.load_model(converted_model_path) # 校验转换后的 ONNX protobuf 是否符合规范 checker.check_graph(model_proto.graph)若 protobuf 不符合 ONNX 规范checker 会抛出异常校验通过即说明模型已可被其他框架PyTorch、TensorRT、ONNX Runtime 等导入用于推理。推理部署Jetson 边缘设备与 C 环境在 Jetson 模块上运行预训练 ResNet-50嵌入式边缘设备如 Jetson Xavier AGX、Jetson Nano适合在端侧直接执行推理。官方教程 inference/image_classification_jetson.md 以 MXNet v1.6 为例演示了完整流程。前置条件已用 NVIDIA SDK Manager 刷好Jetpack 4.4的 Jetson 模块教程在 Jetson Xavier AGX 与 Jetson Nano 上验证通过通过 SSH 连接模块或直连显示器和键盘打开终端建议配置Swapfile尤其是 Jetson Nano内存较小若推理脚本以Killed消息终止说明内存不足需要增加 swap 或内存。安装带 Jetson 支持的 MXNet依赖 官方 wheelsudo apt-get update sudo apt-get install -y git build-essential libopenblas-dev libopencv-dev python3-pip sudo pip3 install -U pip随后下载并安装官方文档提供的 MXNet v1.6 Jetson wheelCUDA 10.2、aarch64 架构wget https://mxnet-public.s3.us-east-2.amazonaws.com/install/jetson/1.6.0/mxnet_cu102-1.6.0-py2.py3-none-linux_aarch64.whl sudo pip3 install mxnet_cu102-1.6.0-py2.py3-none-linux_aarch64.whl注意官方文档特别声明此类第三方编译的 wheel 仅作便利提供其中包含的软件包并非 Apache 软件基金会提供或背书可能带有比 Apache License 更严格的许可条款正式的 Apache MXNet 发布版本仅以源码形式提供。安装完成后验证python3 -c import mxnet运行图像分类推理脚本以下脚本自动选择 GPU若存在或 CPU 设备加载 ImageNet 预训练的 ResNet-50 v1对一张猫的图片输出 Top-5 分类结果from mxnet import gluon import mxnet as mx # 设置设备优先 GPU否则回退 CPU gpus mx.test_utils.list_gpus() device mx.gpu() if gpus else mx.cpu() # 加载预训练模型hybridize 并静态分配内存与形状以提升推理性能 net gluon.model_zoo.vision.resnet50_v1(pretrainedTrue, devicedevice) net.hybridize(static_allocTrue, static_shapeTrue) # 加载 ImageNet 标签 lbl_path gluon.utils.download(http://data.mxnet.io/models/imagenet/synset.txt) with open(lbl_path, r) as f: labels [l.rstrip() for l in f] # 下载并格式化图片为 (batch, RGB, width, height) img_path gluon.utils.download(https://github.com/dmlc/web-data/blob/master/mxnet/doc/tutorials/python/predict_image/cat.jpg?rawtrue) img mx.image.imread(img_path) img mx.image.imresize(img, 224, 224) # 缩放到 224x224 img mx.image.color_normalize(img.astype(dtypefloat32)/255, meanmx.np.array([0.485, 0.456, 0.406]), stdmx.np.array([0.229, 0.224, 0.225])) # ImageNet 标准化 img img.transpose((2, 0, 1)) # 转为 channel-first img mx.np.expand_dims(img, axis0) # 增加 batch 维 img img.to_device(device) prob mx.npx.softmax(net(img)) # 预测并归一化输出 idx mx.npx.topk(prob, k5)[0] # 取 Top-5 for i in idx: i int(i.item()) print(With prob %.5f, it contains %s % (prob[0,i].item(), labels[i]))运行后得到的典型输出如下给出了模型认为图片最可能属于的五个类别及对应概率With prob 0.41940, it contains n02119789 kit fox, Vulpes macrotis With prob 0.28096, it contains n02119022 red fox, Vulpes vulpes With prob 0.06857, it contains n02124075 Egyptian cat With prob 0.03046, it contains n02120505 grey fox, gray fox, Urocyon cinereoargenteus With prob 0.02770, it contains n02441942 weasel需要说明的是脚本中的部分 API如mx.test_utils、mx.image与教程对应的 MXNet v1.6 时代接口一致当前仓库为后续演进版本新项目中建议以当前版本 python/mxnet 的实际 API 为准。C 环境中的推理部署部署专题中的 inference/cpp.rst 目前是待补充状态原文标注 Contributions welcome!。不过仓库的 C 包 cpp-package/include/mxnet-cpp 与 cpp-package/example/inference 提供了可运行的完整参考其中包含用 C 加载 symbol/params 模型、构造 NDArray 输入并执行前向推理的示例代码如alexnet.cpp、resnet.cpp等以及配套的编译运行脚本适合作为 C 端推理的入手起点。官方专题同时也推荐通过 GluonCV 的 C 推理示例加载导出的 YOLO 模型来完成更复杂的视觉任务落地。云上部署AWS 生态全路径深度学习往往需要极其强大的硬件且使用时长难以预测而 MXNet 本身又能很好地利用多 GPU、多机并行。因此 AWS 这类云计算平台天然适合深度学习训练——可以按需快速拉起多台多 GPU 机器并精确控制资源使用时长。专题 run-on-aws/cloud.md 列出了在 AWS 上运行 MXNet 的四种方式使用Amazon SageMaker托管训练与推理服务使用带Conda 的 AWS Deep Learning AMI预装各框架与 CUDA 环境的镜像使用AWS Deep Learning ContainerDocker 容器化的深度学习环境在AWS Deep Learning Base AMI上自行安装 MXNet。路径一在 EC2 实例上部署 MXNet官方教程 run-on-aws/use_ec2.rst 演示了如何在 AWS 上申请 CPU/GPU 实例并搭建深度学习环境登录 AWS 控制台并进入 EC2点击 Launch instance 开始创建实例。选择操作系统AMI与实例类型。AWS 提供的Deep Learning AMI预装了最新版本的深度学习框架、驱动与依赖包并针对 AWS 实例做了二进制优化可直接开始建模训练。教程使用 Deep Learning AMI (Ubuntu) Version 19.0并选择p2.xlarge实例内含单块 NVIDIA K80 GPU。更多实例配置与费用可参考 ec2instances.info。检查实例配额limits确保账号有足够的资源配额可以申请。若超出限制可通过界面右侧链接申请扩容通常约一个工作日处理完成。调整磁盘容量教程将磁盘从默认 8 GB 增加到 40 GB以容纳规模合理的数据集大规模数据集可 add new volume 增加卷若选择了 p3.8xlarge 这类高性能 GPU 实例卷类型建议选Provisioned IOPS以获得更好的 I/O 性能。选择 SSH 密钥启动前最后一步选择已有的 key pair没有则先生成并妥善保存。启动并连接点击 launch instances 后通过实例 ID 链接查看状态状态变绿后右键选择 connect 获取连接指令用给出的地址登录实例。切换 Conda 环境Deep Learning AMI 登录后展示一长串预装环境对应不同框架、CUDA 驱动与 Python 版本用conda activate即可切换例如切换到 MXNet Python 3.6 环境conda activate mxnet_p36之后即可开始开发训练训练过程中可用nvidia-smi查看 GPU 状态注意原文中为nividia-smi的笔误实际命令为nvidia-smi。路径二在 Amazon SageMaker 上运行 MXNetSageMaker 是 AWS 的托管机器学习平台开箱即用支持 MXNet提供 Jupyter Notebook 环境。官方教程 run-on-aws/use_sagemaker.rst 给出了高层流程Notebook 实例可在 CPU 上运行免费套餐内更强 CPU 或 GPU 实例按时间计费在 Notebook 中即可拉取、探索和准备训练数据无需手动配置和登录 EC2 实例。训练通过 SageMaker SDK 的Estimator类封装在本地 Notebook 中即可发起from sagemaker.mxnet import MXNet as MXNetEstimator estimator MXNetEstimator(entry_pointtrain.py, rolesagemaker.get_execution_role(), train_instance_count1, train_instance_typelocal, hyperparameters{batch_size: 1024, epochs: 30}) estimator.fit(inputs)需要更强大的训练平台时只需修改train_instance_type调用fit后 SageMaker 会自动创建所需 EC2 实例在 Docker 容器内完成训练并立即关停这些实例按需计费、用完即走entry_point指向的train.py描述模型与训练循环脚本需实现 SageMaker 约定的一组函数训练入口、模型保存、推理处理SageMaker 在训练与部署时会自动调用。模型就绪后用 SageMaker 的托管服务创建 HTTPS 推理端点predictor estimator.deploy(initial_instance_count1, instance_typeml.m4.xlarge)SageMaker 还支持多机分布式训练、超参调优Hyperparameter Tuning Jobs、用 SageMaker Neo 优化模型、构建 Groundtruth 数据集等进阶能力均可在 SageMaker 官方文档中找到深入教程。附用 S3 存储训练数据部署专题中还指向了「用 Amazon S3 桶中的数据训练」的相关 FAQ即把大规模数据集存放在 S3 上由训练脚本直接读取避免在实例本地磁盘上反复搬运数据是云端训练的标准做法。部署安全与最佳实践专题最后给出Securing MXNet的安全实践入口强调生产部署时应关注模型与服务的加固措施如权限最小化、密钥管理、输入校验等。对于生产环境建议结合自身基础设施将上述导出、边缘推理与云端托管能力组合为完整流水线训练 → 导出ONNX 或原生格式→ 目标平台推理 → 云端弹性伸缩并在此过程中落实安全基线。参考文档索引部署专题首页docs/python_docs/python/tutorials/deploy/index.rstONNX 导出教程docs/python_docs/python/tutorials/deploy/export/onnx.mdONNX 导出源码python/mxnet/onnx/mx2onnx/_export_model.py、python/mxnet/onnx/mx2onnx/_op_translations/Jetson 推理教程docs/python_docs/python/tutorials/deploy/inference/image_classification_jetson.mdC 推理教程待完善与 C 示例docs/python_docs/python/tutorials/deploy/inference/cpp.rst、cpp-package/example/inferenceAWS 部署教程docs/python_docs/python/tutorials/deploy/run-on-aws/use_ec2.rst、docs/python_docs/python/tutorials/deploy/run-on-aws/use_sagemaker.rst、docs/python_docs/python/tutorials/deploy/run-on-aws/cloud.md【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址: https://gitcode.com/gh_mirrors/mx/mxnet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表