megenginelite.utils#

class TensorBatchCollector(shape, dtype=LiteDataType.LITE_INT8, device_type=LiteDeviceType.LITE_CUDA, device_id=0, is_pinned_host=False, tensor=None)[源代码]#

张量小工具用于收集诸多单批量张量并合并成一个多批量张量,当多批量张量生成时,其结果会被用于模型输入进行前向推理

当收集单批量张量时, 这些张量必须与结果张量具有同样的设备类型和设备ID, 而且张量的数据类型和除过最高维之外的shape 也必须匹配

参数:
  • shape – 多批次张量的形状,合成后结果张量的形状

  • dtype (LiteDataType) – 单批次数据和结果张量的数据类型,默认为LiteDataType.LITE_INT8.

  • device_type (LiteDeviceType) – 结果张量分配内存的目标设备类型,默认为LiteDeviceType.LITE_CUDA

  • device_id – 结果张量待分配内存的设备ID,默认为0

  • is_pinned_host – 分配内存是否为页锁定内存,参考CUDA页锁定内存,默认为False

  • tensor (LiteTensor) – 结果张量,用户也可以先创建一个多批次张量然后再创建TensorBatchColletor, 当张量不为None 时, 诸如shape, dtype, device_type, device_id, is_pinned_host等参数都从tensor获取,当张量为None时, 结果张量用TensorBatchCollector创建,默认为None

备注

当收集张量时,单批次的张量或数组形状除过批次所在维度(最高维度)外必须和结果张量的形状匹配

实际案例

import numpy as np
batch_tensor = TensorBatchCollector([4, 8, 8])
arr = np.ones([8, 8], "int8")
for i in range(4):
    batch_tensor.collect(arr)
    arr += 1
data = batch_tensor.to_numpy()
assert data.shape[0] == 4
assert data.shape[1] == 8
assert data.shape[2] == 8
for i in range(4):
    for j in range(64):
        assert data[i][j // 8][j % 8] == i + 1
collect(array)[源代码]#

收集数组中的单批次数据并将其存储为空批次,该空批次是释放列表前面的batch id

参数:

array – LiteTensor 或 numpy ndarray类型的数组,其形状除过最高维外必须和结果张量的形状相匹配

collect_by_ctypes(data, length)[源代码]#

收集ctypes 类型的内存buffer中的单批次数据并将对应数据存储到某个空batch, 该空batch是释放列表前面的batch id

参数:

array – LiteTensor 或 numpy ndarray类型的数组,其形状除过最高维外必须和结果张量的形状相匹配

collect_id(array, batch_id)[源代码]#

收集某个数组的单批次并将数组数据存储为某个特定batch_id

参数:
  • array – LiteTensor 或 numpy ndarray的数组,该数组的形状 除过最高维外必须和结果张量的形状一致

  • batch_id – 需要存数组数据到结果tensor的索引,如果batch_id已经被收集过了,会生成一个警告

free(indexes)[源代码]#

释放 indexes里面的批次ID, 当某个批次id释放后,对应tensor 可以无警告的被再次收集

参数:

indexes – 需要释放的批次id 列表

get()[源代码]#

合成后,获取结果张量

to_numpy()[源代码]#

结果张量转换为numpy的ndarray