ARTICLE DETAIL

资讯详情

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

MXNet 性能调优完全指南:算子、数据管道、压缩与分布式训练实战

MXNet 性能调优完全指南:算子、数据管道、压缩与分布式训练实战 MXNet 性能调优完全指南算子、数据管道、压缩与分布式训练实战【免费下载链接】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/mxne/mxnet本篇技术指南围绕 Apache MXNet 官方性能优化教程体系性能教程索引展开系统梳理影响训练与推理性能的四大要素算子实现与后端选择、输入数据加载与增强、计算图优化与调度性能剖析、多设备通信。读者读完本指南后将掌握 Intel CPU / NVIDIA GPU 上的环境配置与基准调优方法、使用 MXNet Profiler 定位算子级瓶颈、通过 float16 混合精度与梯度压缩降低显存与通信开销以及基于 KVStore 与launch.py搭建和启动分布式训练任务的全套实战方案。影响 MXNet 性能的四大因素即使训练或部署环境、并行化方案已经确定仍然有一系列配置项与数据处理方式会显著影响 MXNet 的性能表现。官方 FAQSome Tips for Improving MXNet Performance将性能归结为以下 4 个因素算子的实现卷积Convolution、池化Pooling等算子在 Intel CPU 与 NVIDIA GPU 上的底层实现oneDNN/MKL、cuDNN 等加速库。输入数据的加载与增强数据格式、解码线程数、存储位置与批大小选择。工作负载计算图的优化与调度借助 Profiler 找出耗时算子并针对性优化。多设备训练的通信选择正确的 KVStore 类型控制通信与计算的比例。下文按照这四条主线逐一展开并在对应小节补充仓库源码层面的实现证据。算子与硬件后端优化Intel CPU优先使用 oneDNNMKL-DNN构建在 Intel Xeon CPU 上做训练与推理时官方建议安装mxnet-mkl包基于 oneDNN/MKL-DNN 优化$ pip install mxnet-mkl [--pre]其中--pre会安装 master 分支的每日构建nightly build不加该参数则安装最新发布的修复版本。也可以从源码编译在 CMake 中开启USE_ONEDNN1对 Linux 用户而言该选项默认开启见 config/linux.cmake 与 DNNL_README.md 中的构建说明。同时设置以下环境变量通常能带来额外收益变量说明OMP_NUM_THREADS建议取值为vCPUs / 2vCPUs 为虚拟 CPU 数量控制 OpenMP 线程数KMP_AFFINITY建议取值为granularityfine,compact,1,0设置线程亲和性Linux 与 Windows 通用注意MXNet 把单机上的所有 CPU 视为单一设备。因此无论你指定cpu(0)还是cpu()MXNet 都会使用机器上的全部 CPU 核心。从源码结构看oneDNN 相关的算子实现在 src/operator/nn 与 src/operator/subgraph 中通过子图subgraph机制将多个算子融合并下派给 oneDNN 的 primitive 执行这部分与 docs/python_docs/python/tutorials/performance/backend/dnnl/dnnl_readme.md 中介绍的 oneDNN 后端用法相互印证。历史基准MXNet-1.2.0.rc1官方使用example/image-classification/benchmark_score.py风格的评分脚本在 AWS EC2 C5 系列实例上测得每秒可预测的图片数。例如 C5.18xlarge72 vCPU上不同批大小的吞吐images/secBatchAlexnetVGG 16Inception-BNInception-v3Resnet 50Resnet 1521390.5381.57124.1362.2676.2232.928921.40120.38380.82157.11167.9570.78161018.43115.30411.67168.71178.5475.13321290.31107.19483.34179.38193.4785.86可见批大小对吞吐影响显著且不同模型对批大小的敏感度不同浅层网络如 AlexNet 提升明显深层网络如 VGG16 在批大小超过 8 后趋于饱和甚至回落。官方同样在 C5.9xlarge、C5.4xlarge、C5.2xlarge、C5.xlarge 上公布了完整数据详见 perf.md。需要说明的是这些数字来自 1.2.0.rc1 时代仅供参考趋势不应视为当前版本的性能承诺。其他 CPUNNPACK如果使用非 Intel CPU包括 ARM官方提到 NNPACK 可将运行性能提升约 2x~7x。该优化面向卷积等算子的移动端/低功耗场景详细说明见 FAQ 文档中的 nnpack 小节perf.md。NVIDIA GPUcuDNN 与自动调优cuDNN通常能显著加速 MXNet 在 NVIDIA GPU 上的性能尤其是卷积层。官方建议始终使用较新的 cuDNN 版本并尝试设置环境变量export MXNET_CUDNN_AUTOTUNE_DEFAULT1该变量控制 MXNet 是否为卷积选择最快算法。从源码看cuDNN 相关算子封装在 src/operator/cudnn_ops.cc 与 src/operator/cudnn_ops.h自动调优autotune会缓存不同 shape 下的最优算法避免重复搜索。历史基准MXNet-1.2.0.rc1 cuDNN 7.0.5在 V100EC2 p3.2xlarge单卡上批大小对卷积网络推理吞吐的影响BatchAlexnetVGG 16Inception-BNInception-v3Resnet 50Resnet 1521659.51205.16157.3787.71162.1561.38165815.58654.161430.97672.54947.45398.79649486.26701.592134.89899.011168.37480.4412810177.84703.302318.32904.331233.15511.7925610990.46473.622425.28960.201155.07449.35同样使用 float16 时V100 上的推理吞吐如 Resnet 50 在 batch 128 时可达 2355 images/sec还有进一步提升详见下文“float16 混合精度训练”一节。官方还在 K80p2.2xlarge与 M60g3.4xlarge上发布了完整对照数据可在 perf.md 中查阅。输入数据管道的优化数据处理不当会直接拖慢整个训练循环。官方给出以下建议perf.md数据格式优先使用rec二进制格式RecordIO其顺序读取与预取特性对吞吐友好相关实现见 src/io 下的iter_image_recordio.cc等迭代器。解码线程数默认 MXNet 使用 4 个 CPU 线程解码图片通常足以支撑每秒 1K 张以上的解码。若 CPU 较弱或 GPU 非常强可调高线程数。存储位置本地文件系统或分布式文件系统HDFS、Amazon S3均可。若多设备同时从共享 NFS 读取可能出现性能问题。批大小一般选择 GPU 显存能容纳的最大批大小但过大会拖慢收敛。例如 CIFAR10 的安全批大小约为 200而 ImageNet-1K 的批大小可以超过 1000。经验法则确保 IO 与数据预处理不是瓶颈。当你调大批大小后发现变慢首先检查数据管道。使用 MXNet Profiler 定位瓶颈在开始优化之前先要准确测量。MXNet 的内置 Profiler 提供算子级operator level的执行时间信息是对nvprof、gprof等通用剖析工具的补充——它在算子粒度上汇总而不是函数、kernel 或指令粒度。错误的测量方式Python time 模块MXNet 的所有操作是异步执行的nd.dot(x, x)返回时矩阵乘法可能尚未完成只是被排队。而asnumpy()必须等待结果真正算完才能把数据拷回 CPU所以用time计时会得到“矩阵乘法极快、转 numpy 极慢”的荒谬结论。其他阻塞操作还包括asscalar、wait_to_read。虽然可以在操作前后调用NDArray.waitall()但这对多组操作、尤其是Sequential/hybridized 网络并不具备可扩展性。正确的测量方式MXNet Profiler在 Python 中导入并配置 profilerfrom mxnet import profiler profiler.set_config(profile_allTrue, aggregate_statsTrue, continuous_dumpTrue, filenameprofile_output.json)参数说明profile_all开启所有类型的剖析。也可单独开启profile_symbolicbool剖析符号symbolic算子profile_imperativebool剖析命令式imperative算子profile_memorybool剖析内存使用profile_apibool剖析 C API 层。aggregate_stats在内存中聚合统计之后可通过profiler.dumps()打印到控制台。continuous_dump持续将数据写入文件。对于只剖析程序某一段的典型用法见 perf.md 与 example/profilerimport mxnet as mx # 等待之前的操作完成 mx.nd.waitall() mx.profiler.set_config(profile_allTrue, aggregate_statsTrue, filenameprofile_output.json) mx.profiler.set_state(run) # 需要剖析的代码段... # 等待之前的操作完成 mx.nd.waitall() mx.profiler.set_state(stop)程序结束后用浏览器打开 tracing例如 Chrome 的chrome://tracing加载profile_output.json即可查看各算子的耗时瀑布图。注意输出文件可能极其庞大不建议在生产环境长期开启。另外默认情况下 profiler 会隐藏单个算子的细节可设置MXNET_EXEC_BULK_EXEC_INFERENCE、MXNET_EXEC_BULK_EXEC_MAX_NODE_TRAIN与MXNET_EXEC_BULK_EXEC_TRAIN为 0 来展开细节相关环境变量汇总见 env_var.md。压缩技术float16 混合精度训练混合精度训练在支持的硬件上能以较低精度运算换取更低的显存占用与更快的训练/推理速度float16 FAQ。float16 是 IEEE 754 定义的 16 位浮点表示精度动态范围从接近 0 时的最高精度 0.0000000596046 到区间 32768-65536 上的最低精度 32。模型体积减半后可以训练更大模型、使用更大批大小同时降低内存带宽压力与通信成本。前提条件NVIDIA Volta 及以上 GPU例如 AWS P3 实例其Tensor Core可高效执行 float16 计算半精度矩阵乘法并累加到半精度或单精度输出CUDA 9 或更高cuDNN v7 或更高。使用 Gluon API 进行训练或推理将模型切换到 float16 只需三件事1. 将 Block 的参数与期望输入类型转换为 float16net.cast(float16)2. 保证输入数据是 float16 类型可用 NDArray 的astype方法data data.astype(float16, copyFalse)若使用图像与DataLoader也可以使用gluon.data.vision.transforms.Cast变换。3. 训练时建议开启优化器的 multi_precision 模式它在 float16 前向/反向的同时维护一份 float32 的权重主副本提高权重更新精度某些场景下收敛更快optimizer mx.optimizer.create(sgd, multi_precisionTrue, lr0.01)完整示例命令基于官方图像分类示例可用 ResNet50V1 Caltech101 快速验证python image_classification.py --model resnet50_v1 --dataset caltech101 --gpus 0 --num-worker 30 --dtype float16微调 float32 预训练模型先从 Model Zoo 获取预训练网络并转换import numpy as np import mxnet as mx from mxnet.gluon.model_zoo.vision import get_model pretrained_net get_model(nameresnet50_v2, ctxmx.cpu(), pretrainedTrue, classes1000) pretrained_net.cast(float16)再将其特征部分赋给新网络并同样转换net get_model(nameresnet50_v2, ctxmx.cpu(), pretrainedFalse, classes101) net.collect_params().initialize(mx.init.Xavier(magnitude2.24), ctxmx.cpu()) net.features pretrained_net.features net.cast(float16)用net.summary检查模型时同样需要传入 float16 的伪数据net.summary(mx.nd.uniform(shape(1, 3, 224, 224), dtypenp.float16))实测训练结果官方数据以 ResNet50-V1 在 ImageNet 2012 上训练 90 个 epoch 为例8 张 V100AWS p3.16xlarge学习率 0.41024 批、0.82048 批在第 30/60/80 epoch 衰减 0.1Batch sizeData typeTop-1 验证准确率训练耗时加速比1024float3276.18%11.8 hrs11024float1676.34%7.3 hrs1.62x2048float1676.29%6.5 hrs1.82x准确率差异处于正常随机波动范围内float16 不仅计算更快还允许使用更大批大小从而进一步提速。性能注意事项Tensor Core 执行的本质是D A * B CA、B 为半精度矩阵C、D 可为半精度或全精度当矩阵维度是8 的倍数时效率最高。对于 Cifar10 上的 ResNet50 这类小张量场景Tensor Core 未必总能用上单卡上 float16 甚至可能比 float32 慢但多卡时由于通信量减半float16 仍然更快。调大批大小后先检查 IO 与数据预处理是否成为瓶颈。训练 float16 时尽量使用 8 的倍数、最好是 2 的幂的批大小。可用nvprof检查是否真正用上 Tensor Core名字中含有s884cudnn的算子即代表使用了 Tensor Core。显存不受限时可设置MXNET_CUDNN_AUTOTUNE_DEFAULT2让 MXNet 运行调优测试并选择最快的卷积算法允许超出 CUDA workspace 默认内存。注意float16 在 CPU 上并非所有算子都支持且多数情况下比 float32 更慢。精度注意事项多精度模式float16 训练时建议保留 float32 的权重主副本multi_precisionTrue避免梯度更新在 float16 下变为 0。分布式训练中该模式略慢于不带 multi_precision 的模式但仍远快于纯 float32。大规约运算BatchNorm 与 Softmax 这类执行大规模规约的层应保持在 float32。Gluon 与 Module API 默认让 BatchNorm 在 float32 下规约Gluon 中 Softmax 在 float16 训练时也会使用 float32而 Module API 需要在 softmax 前显式 cast 回 float32。损失缩放loss scaling某些网络如 Multibox SSD、R-CNN、bigLSTM、Seq2seq的激活梯度过小无法在 float16 范围内表示。此时可将损失放大因子S一般取 2 的幂如 64、128、256、512由链式法则放大反向传播前的梯度更新权重前再缩小回来loss gluon.loss.SoftmaxCrossEntropyLoss(weight128) optimizer mx.optimizer.create(sgd, multi_precisionTrue, rescale_grad1.0/128)除了手动 float16还可使用 AMPAutomatic Mixed Precision 自动套用混合精度策略在收益最大的地方使用 FP16在 FP16 下有风险的算子保守地保持 FP32。压缩技术梯度压缩当通信成为瓶颈时梯度压缩 可显著降低通信带宽在收敛率与精度损失很小的情况下让训练更具可扩展性。收益与适用场景加速对含大量全连接层的架构梯度压缩可带来约 2x 的训练加速模型越大、实例网络带宽越低收益越明显。精度损失小其思想是“延迟”小权重更新的同步——小的更新不会丢失而是累积到超过阈值后再传播因此精度损失很小官方分布式实验中观察到最低约 1% 的准确率损失。GPU vs CPUGPU 节点计算密度高、通信需求大收益最明显CPU 节点计算密度低收益有限。网络延迟节点间延迟高时收益明显低延迟网络下不建议使用。模型规模与架构模型越大收益越大有显著全连接组件如 AlexNet、VGG、LSTM的网络通信开销高、收益大计算密集的 CNN 通信可与计算并行收益有限。单节点多卡单机多 GPU 使用devicekvstore 压缩设备间通信大模型在老架构上约有 20% 加速但在低延迟通信的新架构上收益可能可忽略。技术原理梯度压缩基于两个观察一是小批量梯度通常稀疏只有少数权重有显著更新接近零的更新可安全延迟同步即每个权重的更新频率可不同二是只保留绝对值超过阈值的梯度元素并量化到更低位宽从而压缩通信带宽。被延迟的梯度量化误差与未达阈值的值会聚合成梯度残差gradient residual累积到阈值后再通信。2-bit 量化与 KVStore 类型当前版本支持每个梯度值 2 位的量化正且大于等于阈值 →11负且绝对值大于等于阈值 →10其余 →00。这样可以把 16 个量化梯度打包进一个 float。量化误差原值 - 量化值存入梯度残差。支持的 kvstore 类型为device以及dist_sync、dist_async、dist_sync_device等分布式类型kvstoredevice压缩 GPU 之间的通信但会增加 GPU 显存占用额外存储残差分布式 kvstore压缩worker→server通信压缩/解压发生在 CPU残差存放在 CPU 上server→worker 与设备间通信不压缩以避免多层压缩叠加。启用方式Gluon APItrainer gluon.Trainer(..., compression_params{type: 2bit, threshold: 0.5})配置细节Threshold默认0.5对多数场景足够好但可根据场景实验。若设得过大如10.0更新过于稀疏、收敛变慢。Quantization当前支持 2-bit 量化。Sparse Format官方认为数据密度需极低约 90% 为零才值得使用稀疏格式属于未来探索方向。分布式梯度压缩的量化/反量化在 CPU 上由 OpenMP 并行执行小模型在 GPU 上训练时建议各节点设置OMP_NUM_THREADS1避免 OMP 线程启动开销拖慢压缩。从源码看梯度压缩的核心实现在 src/kvstore/gradient_compression-inl.h、src/kvstore/gradient_compression.cc 与 src/kvstore/gradient_compression.cuPython 侧通过 python/mxnet/kvstore/kvstore.py 暴露给Trainer。int8 量化推理压缩专题中的 int8 教程 面向部署阶段的 int8 量化推理当前文档标注为“Contributions welcome”处于完善中oneDNN 后端的量化实践可参考 dnnl_quantization.md 与 example/quantization 下的脚本如imagenet_gen_qsym_onednn.py、imagenet_inference.py。加速后端TensorRT、TVM 与 oneDNNTensorRT使用 NVIDIA TensorRT 提升推理性能。相关 API 见 contrib/tensorrt示例可参考 example/extensions/lib_subgraph 中的 subgraph 扩展机制。TVM通过 TVM 后端教程 可将模型编译为针对特定硬件的优化代码。oneDNNCPU 上的核心加速后端教程见 dnnl_readme.md与前述USE_ONEDNN1构建选项对应。多设备与分布式训练两种并行方式数据并行data parallelism每个设备保存完整模型副本处理数据集的不同分片共同更新共享模型。设备可位于单机或多机。模型并行model parallelism模型过大放不进单设备显存时将模型的不同部分分配给不同设备。目前 MXNet 的模型并行仅支持单机参考 model_parallel_lstm FAQ。核心概念三类进程与 KVStoreMXNet 分布式训练distributed_training FAQ中有三类进程Worker实际对一批样本执行训练。每批开始前从 server 拉取权重每批结束后向 server 发送梯度。Server存储模型参数并与 worker 通信可与 worker 同机部署也可独立部署。Scheduler全集群唯一负责组建集群——等待各节点上报地址与监听端口再把集群拓扑告知所有进程。参数通信依赖KVStorekey-value store核心实现见 src/kvstore/kvstore.cc 与 python/mxnet/kvstore网络中的每个参数数组对应一个 keyworker 在每批处理后push梯度、处理新批次前pull更新后的权重也可以为 KVStore 传入优化器如 SGD来定义权重更新规则。GluonTrainer与 Module API 内部都使用 kvstore 聚合梯度。注意使用分布式训练需要用USE_DIST_KVSTORE1编译 MXNet并通过包含dist的字符串创建 kvstorekv mxnet.kvstore.create(dist_sync)分布式模式下参数会被随机分布到各 server超大参数大小超过MXNET_KVSTORE_BIGARRAY_BOUND默认 1000000会被分片shard到所有 server这一切对 worker 透明。数据切分与权重更新数据并行时需在训练开始前把数据集分成n份让每个 worker 处理不同部分单机多卡时再用mxnet.gluon.utils.split_and_load进一步切分。可通过kv.num_workers与kv.rank获取 worker 数量与当前 worker 的排名并传给迭代器mxnet.io.MNISTIterator、mxnet.io.ImageRecordIter支持该特性可参考 example/gluon/image_classification.py 的用法。Gluon 中可通过update_on_kvstore选择权重更新位置trainer gluon.Trainer(net.collect_params(), optimizersgd, optimizer_params{learning_rate: opt.lr, wd: opt.wd, momentum: opt.momentum, multi_precision: True}, kvstorekv, update_on_kvstoreTrue)分布式训练的四种模式kvstore 类型说明dist_sync同步每批结束后 server 等待所有 worker 的梯度再更新参数所有 worker 每批开始使用同一份同步参数同步有等待成本一个 worker 崩溃会拖停全部 workerdist_async异步server 收到某个 worker 的梯度立即更新并响应后续 pull无同步成本、更快但可能需要更多 epoch 收敛权重更新是原子的但顺序不保证。异步模式必须传优化器Gluon 下需设update_on_kvstoreTruedist_sync_device同dist_sync但多 GPU 时在 GPU 上聚合梯度并更新权重dist_sync在 CPU 内存上做减少 GPU-CPU 通信、更快但增加 GPU 显存dist_async_devicedist_sync_device的异步版本当计算时间与通信时间之比很低时通信成为瓶颈此时可叠加梯度压缩见上文反之小模型上分布式训练可能因通信与同步开销反而不如单机快。使用 launch.py 启动分布式训练MXNet 提供了 tools/launch.py 来简化集群启动支持ssh、mpirun、yarn、sge等多种资源管理器。以example/gluon/image_classification.pyVGG11 CIFAR10为例单机运行cd example/gluon/ python image_classification.py --dataset cifar10 --model vgg11 --epochs 1多机分布式脚本目录在所有机器可见例如挂载了网络文件系统../../tools/launch.py -n 3 -H hosts --launcher ssh python image_classification.py --dataset cifar10 --model vgg11 --epochs 1 --kvstore dist_sync若脚本目录在其他机器上不可见可让 launch.py 先把当前目录同步过去../../tools/launch.py -n 3 -H hosts --launcher ssh --sync-dst-dir /tmp/mxnet_job/ python image_classification.py --dataset cifar10 --model vgg11 --epochs 1 --kvstore dist_sync提示没有集群时可用--launcher local在单机本地模拟多进程分布式。launch.py主要选项-n启动的 worker 节点数-s启动的 server 节点数未指定时默认等于 worker 数-H主机列表文件--launcher集群资源管理器类型ssh/mpirun/sge/yarn/local等--sync-dst-dir将当前目录同步到远端机器的目标目录。手动启动与 DMLC 环境变量不使用 launch.py 时可手动设置角色环境变量启动下面的例子在单机上模拟 2 server 2 worker 1 schedulerexport COMMANDpython example/gluon/image_classification.py --dataset cifar10 --model vgg11 --epochs 1 --kvstore dist_sync DMLC_ROLEserver DMLC_PS_ROOT_URI127.0.0.1 DMLC_PS_ROOT_PORT9092 DMLC_NUM_SERVER2 DMLC_NUM_WORKER2 $COMMAND DMLC_ROLEserver DMLC_PS_ROOT_URI127.0.0.1 DMLC_PS_ROOT_PORT9092 DMLC_NUM_SERVER2 DMLC_NUM_WORKER2 $COMMAND DMLC_ROLEscheduler DMLC_PS_ROOT_URI127.0.0.1 DMLC_PS_ROOT_PORT9092 DMLC_NUM_SERVER2 DMLC_NUM_WORKER2 $COMMAND DMLC_ROLEworker DMLC_PS_ROOT_URI127.0.0.1 DMLC_PS_ROOT_PORT9092 DMLC_NUM_SERVER2 DMLC_NUM_WORKER2 $COMMAND DMLC_ROLEworker DMLC_PS_ROOT_URI127.0.0.1 DMLC_PS_ROOT_PORT9092 DMLC_NUM_SERVER2 DMLC_NUM_WORKER2 $COMMAND关键环境变量变量说明DMLC_ROLE进程角色server、worker或schedulerscheduler 只能有一个设为server/scheduler时进程会在 import mxnet 时启动DMLC_PS_ROOT_URIscheduler 的 IPDMLC_PS_ROOT_PORTscheduler 监听的端口DMLC_NUM_SERVER集群中 server 节点数DMLC_NUM_WORKER集群中 worker 节点数集群搭建方面官方建议所有实例使用同一密钥与安全组通过 ssh-agent 转发密钥以便 master 免密访问所有节点ssh-add .ssh/mxnet-key ssh -A userMASTER_IP_ADDRESS并推荐使用共享文件系统如 AWS EFS存放训练脚本与大文件。性能与环境变量分布式训练相关的调优环境变量详见 env_var.mdMXNET_KVSTORE_REDUCTION_NTHREADS单机大数组求和所用 CPU 线程数默认 4同样用于dist_sync在单机不同 context 间的数组求和不影响 server 上跨机器求和dist_sync_device在 GPU 上求和也不受影响。MXNET_KVSTORE_BIGARRAY_BOUNDbig array的最小大小默认 1000000。数组超过该阈值时用上述线程数做规约同时也作为 kvstore 负载均衡阈值小于该值的单个权重矩阵发给随机选中的一台 server否则分片给所有 server。MXNET_ENABLE_GPU_P2PGPU 点对点通信开关默认 1开启仅对含device的 kvstore 生效。DMLC_INTERFACE指定数据通信使用的网络接口如eth0适用于多网卡机器。PS_VERBOSE通信日志级别1记录各节点 IP 与端口等连接信息2记录全部数据通信信息。PS_RESEND/PS_RESEND_TIMEOUT网络不可靠时启用消息重传PS_RESEND默认 0关闭置 1 开启PS_RESEND_TIMEOUT为 ACK 超时毫秒默认 1000超时未收到 ACK 则重发消息。通信成本评估与其他框架集成官方提供 tools/bandwidth/measure.py配套测试见 tools/bandwidth/test_measure.py来测量每批次的通信成本。理想情况下通信成本应小于单批次的计算时间。若通信成本过高可探索不同的--kv-store选项增大批大小以提升计算/通信比。MXNet 还集成了其他分布式训练框架Horovod 示例见 example/distributed_training-horovod内含 MNIST 与 ImageNet 训练脚本gluon_mnist.py、resnet50_imagenet.py另有 example/distributed_training 下的cifar10_dist.py、cifar10_kvstore_hvd.py等可直接运行的分布式示例。小结与调优路线综合官方性能教程性能索引与 FAQ 文档推荐的调优路线为环境与后端Intel CPU 使用 oneDNN 构建并设置OMP_NUM_THREADS、KMP_AFFINITYGPU 使用较新的 cuDNN 并尝试MXNET_CUDNN_AUTOTUNE_DEFAULT。数据管道使用 rec 格式、合理设置解码线程、避免共享 NFS 并发读取、选择显存允许的最大批大小。剖析定位用 MXNet Profiler而非 Pythontime在算子粒度定位热点。压缩GPU 上开启 float16 混合精度castastypemulti_precision必要时 loss scaling分布式通信紧张时开启 2-bit 梯度压缩。分布式按模型规模与网络状况选择dist_sync/dist_async/dist_sync_device等 kvstore 类型用launch.py或 DMLC 环境变量启动并用 bandwidth 工具量化通信成本、用相关环境变量进一步调优。每一步都可结合仓库中的源码src/operator、src/kvstore、src/io与示例example/profiler、example/gluon/image_classification.py、tools/launch.py深入验证与二次开发。【免费下载链接】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/mxne/mxnet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表