MxNet系列——how_to——env_var

博客新址: http://blog.xuezhisd.top
邮箱:xuezhisd@126.com


环境变量

环境可以修改MXNet的一些设置。一般情况下,你不需要修改这些设置。本节将它们罗列出来,用于参考。

设置线程数目

  • MXNET_GPU_WORKER_NTHREADS (默认值=2)
    • 每个GPU上,进行计算的最大线程数
  • MXNET_GPU_COPY_NTHREADS (默认值=1)
    • 每个GPU上,内存复制的最大线程数
  • MXNET_CPU_WORKER_NTHREADS (默认值=1)
    • CPU上的计算任务的最大线程数
  • MXNET_CPU_PRIORITY_NTHREADS (默认值=4)
    • 优先的CPU任务的线程数

内存选项

  • MXNET_EXEC_ENABLE_INPLACE (默认值=true)
    • 在符号计算中,是否使用原地(计算)优化。
  • MXNET_EXEC_MATCH_RANGE (默认值=10)
    • 符号计算内存分配器中的粗略匹配规模
    • 如果不想使用(图的)节点间共享内存(用于调试时),可以将该环境变量设置为0。
  • MXNET_EXEC_NUM_TEMP (默认值=1)
    • 每个设备上分配的临时工作空间的最大数目
    • 将它设置成比较小的数字,可以节省GPU内存。它也可能会降低并行度,但这通常是可接受的。
  • MXNET_GPU_MEM_POOL_RESERVE (默认值=5)
    • 分配给非GPU数组的GPU内存的比例,比如内核启动器或cudnn句柄空间。
    • 如果在迭代多次之后,看到一个来自内核启动器的内存溢出错误,尝试增大该环境变量的值。

Engine Type

  • MXNET_ENGINE_TYPE (默认值=ThreadedEnginePerDevice)
    • MXNet的实质执行引擎的类型。
    • 可选值:
      • NaiveEngine: 非常简单的引擎,使用主线程来计算。
      • ThreadedEngine: 使用全局线程池来调度作业。
      • ThreadedEnginePerDevice: 每个GPU上分配线程。

控制数据通信

  • MXNET_KVSTORE_REDUCTION_NTHREADS (默认值=4)
    • 用于大数组求和的CPU线程数
  • MXNET_KVSTORE_BIGARRAY_BOUND (默认值=1e6)
    • 大数组的最小尺寸
    • 当数组的容量大于该阈值时,将使用线程 MXNET_KVSTORE_REDUCTION_NTHREADS 进行规约。
  • MXNET_ENABLE_GPU_P2P (默认值=1)
    • 如果为True,MXNet尝试使用GPU的 peer-to-peer 通信(前提是P2P可用),当 kvstore 的类型是 device 时。

Memonger

  • MXNET_BACKWARD_DO_MIRROR (默认值=0)
    • 在训练过程中,是否执行 mirror 以节省设备存储。
    • 当设置成1时,在前向传播过程中,图计算器将会对一些层的特征图进行 mirror 操作,并抛弃它们;但当需要时,会重新计算这些抛弃的特征图。MXNET_BACKWARD_DO_MIRROR=1 时,将会节省 30%~50% 的设备内存,同时保持 95% 的运行速度。
    • 在MXNet中,mirror 的一个拓展叫做 memonger technology,它可以在保持75%运行速度的同时节省 O(sqrt(N)) 内存。

其它环境变量

  • MXNET_CUDNN_AUTOTUNE_DEFAULT (默认值=0)
    • 用于卷积层的cudnn_tune的默认值。
    • Auto tuning 默认是关闭的。For benchmarking, set this to 1 to turn it on by default.

设置最小内存使用


  • 务必确保 min(MXNET_EXEC_NUM_TEMP, MXNET_GPU_WORKER_NTHREADS) = 1
    • 默认设置满足这个条件。

设置更多的GPU并行


  • MXNET_GPU_WORKER_NTHREADS设置成一个较大的数(比如 2)
    • 为了减少内存的使用,考虑设置 MXNET_EXEC_NUM_TEMP
  • 这可能不会加速,尤其是图像任务。因为GPU通常会被充分利用(甚至在序列化作业中)。
`torch gather` 和 MXNet的`F.gather_nd` 都是用来从张量中选取特定索引元素的功能,但在使用上有一些细微差别。 1. **PyTorch (torch)**: `gather`函数主要用于沿着给定维度`dim`获取指定索引处的元素。它接受两个参数,第一个参数是源张量(`input`),第二个参数是一个长度匹配源张量该维度的整数切片(`index`)。例如,如果你有一个三维张量和一维索引,你可以选择每个索引对应的列。输出的张量将与输入的形状相同,除了指定的维度会变为1。 ```python input = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) index = torch.tensor([0, 1]) output = torch.gather(input, dim=1, index=index) # 输出: tensor([[1, 4], # [5, 8]]) ``` 2. **MXNet (F.gather_nd)**: `F.gather_nd`与`torch`的`gather`类似,但它可以处理更高维度的索引,允许你通过多个索引来取出多维张量的元素。这个函数需要一个数据张量`(data)`、一个形状匹配的数据张量`(indices)`作为索引以及一个轴`(axis)`。这个函数返回的是一个由索引指定元素组成的张量,形状是 `(indices.shape[:-1] + data.shape[axis+1:])`。 ```python import mxnet as mx data = mx.nd.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) indices = mx.nd.array([[0, 1], [1, 0]]) # 二维索引 output = mx.nd.F.gather_nd(data, indices) # 输出: [[1, 3], [6, 5]] ``` **区别总结**: - PyTorch的`gather`更适用于单个或低维度索引的情况。 - MXNet的`F.gather_nd`支持高维度或多维索引,适合提取多位置的元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值