MegEngine v1.6.0 Release Notes

HighLight

trace module

基于 MegEngine 的应用落地方案 Trace Module 正式开源。
Trace Module 由一个普通的 Module 通过 trace_module 方法转换得到,仅由 MegEngine 的数据结构而构成,可脱离用户源代码被训练、序列化以及反序列化、以及图手术。其优点如下。

  • graph 基于 mge.Module 和 mge.function 构建,便于与源代码相对应,且能与第三方框架的 OP 对应上。
  • 图手术直观,可直接查看 graph ,了解修改后的 graph 是否与预期一致。
  • 可基于 TracedModule 进行训练。
  • 基于动态图,调试方便,所见即所得。

Custom Op

提供可以将用户自定义的 C++/CUDA 算子快速集成入 MegEngine 的工具,以达成更好性能效果。

全局图优化

新增全局图优化支持,可以自动做 format 转换和 padding,增强易用性。您不用再关心是否需要开哪个图优化选项,例如「-- enable-nchw32」,在检测模型验证获得 5% 左右加速。本次版本增加对 cuda 平台支持,ARM/X86 等更多平台进行中,使用如下命令尝鲜使用:
load_and_run /path/to/model --layout-transform cuda

MegEngine Lite

MegEngine Lite 正式开源,请参考使用指南
MegEngine Lite 是模型直达 SDK 的解决方案,充分发挥 MegEngine 的高效,多平台的推理能力,为用户提供简洁、易用的 C++、C、python 多种模型推理接口,同时 MegEngine Lite 也可以接入其他的推理框架,便于业务集成。

Bug Fixes

Python API

  • 修复 megengine.functional.nn.dropout 在 inference 模式下输出不正确的问题。
  • 修复 megengine.functional.vision.warp_perspective 文档公式错误的问题。
  • 修复 megengine.functional.sub 的 API 接口说明。
  • 删除已经弃用的 megengine.jit.trace.trace 接口。
  • linspace/arange 修改 dtype 为 fp32 支持更多数据类型。
  • 修复 megengine.functional.nn.dropout 在 inference 模式下的返回值错误的问题。

通用组件

  • 修复训练模型时打开 fastrun 之后显存 OOM 问题。
  • 修复开启 DTR 时由于重算链过长导致递归栈溢出的问题。
  • 修复 fp16 midout 编译失败的问题。
  • 修复 python fastrun 错误,确保读取 cache 的正确性。
  • 计算图 dump的边界情况处理不完整:修复导出 json 文件时把 inf 或者 nan 直接写成 number,导致MegHair profile_analyze.py 分析无法再解析的错误。
  • 修复 tensor detach 后不能被 trace 的问题。
  • 修复异步执行错误 (async error) 报错到无关地方的问题,同时添加引导说明以帮助用户理解报错原因。
  • 修复了在系统已安装 LLVM-12-dev 的情况下引发的 Cmake 构建失败的问题。
  • 修复用户通过设置 LD_LIBRARY_PATH 环境变量指定链接库时 Cmake 编译失败的问题。
  • 修复 Tensor Interpreter 一个错误多次抛异常的问题。之前已经出错的 tensor 被当前 OP 使用时不再重复报错,直接跳过。
  • 修复 Cmake 编译 llvm 报错。

周边工具

  • 修复静态内存分析的工具中统计 GPU 静态内存分配信息的错误。
  • 缩短 cutlass 中gemm kernel 的命名长度,修复由于目录层级太多造成的 windows 编译失败的问题。
  • 修复项目上使用 SNPE Loader 时,如果初始化失败时,Megbrain 没有及时抛出异常的问题。

CUDA

  • 禁用 CUDA 平台部分 matmul 算法的 TensorCore 优化。原因是 TensorCore 优化引入的隐>式类型转换有潜在精度问题。
  • cuda10 关闭 cublas Lt 算法,因为它会对 fp32 的输入做隐式的类型转换,然后调用 fp16 的 tensorcore,可能引入精度问题。

ARM

  • 修复 ROCm 中 Pooling 计算错误的问题。

New Features

Python API

  • interpolate 支持 nearest 和 bilinear 模式。
  • 增加混合并行下的数据排布变换支持。对多机算子,可以指定 axis 表示对高维 tensor 对应维度进行切分或者合并。
  • 增加 python 侧获取 nvidia gpu 的 compute capability 的 API: megengine.get_cuda_compute_capability。

混合精度训练

  • 修改添加 weight_scaler/bias_scaler 的方式,从需要手动在模型内添加改为通过接口 get_scaled_model 实现自动添加。

通用组件

  • Conv backward fp16 精度增加支持 NHWC 格式。
  • 优化异步错误的表达方式,给予更多提示信息。

CUDA

  • 添加 tensorcore fp16 matmul 算法。
  • sass conv int8 优化后,单个 conv 性能有 5%~10% 的提升。
  • 添加 cutlass nhwc int8 imma conv kernel ,相对于 nchw4 dp4a 提升大约 10%-200% 。全局图优化功能 ready 后可开启对应 algo 获得收益。

ARM

  • 新增 NCHW88 格式的 channel wise 卷积实现,fp32 下部分场景可加速约 1.5 倍。
  • 新增 arm nchw88 fp16 的 channel wise 卷积 kernel。

Improvements

Python API

  • DTR 优化,各模型测试速度平均提升约10%,ResNet50 8 卡最大 batchsize 达500, GL 8 卡最大 batchsize 达 110, ViT 8 卡最大 batchsize 达 300 。
  • 新增 megengine.functional.nn.split ,替换之前用其他 op 拼接的实现,速度提升约 5 倍。
  • megengine.functional.split、megengine.functional.cond_take 、advance indexing、Indexing(Set)MultiAxisVec、setsubtensor、subtensor 支持空 tensor 输入。
  • 为 megengine.functional.sub 添加 docstring。
  • python API 文档转换成 google style , 详情参考这里