`Tensor`是不是`Variable`的Data Member?
Created by: reyoung
一个神经网络的计算图包括两个部分组成,Op
和Variable
。Engine输入一个计算图进行计算。而Tensor是Op
在实现Kernel时候的输入输出变量。Tensor
与Variable
的相似点很多。Tensor
可否为Variable
的一个Data Member呢?
下面是论点,他们是:
Tensor和Variable具有很多相似相同属性
一个Variable可以配置的属性可以包括:
struct Variable {
string name_;
DDim dims_;
Place place_;
bool needBackward_;
};
而一个Tensor需要的属性是:
struct Tensor {
shared_ptr ptr_;
DDim dims_;
Place place_;
};
其中,dims_
和place_
是二者共有的,并且Variable和Tensor这两个字段,数值、类型都相同。
Tensor与Variable是一一对应的,Tensor需要使用Variable的名字被用户访问
在计算图中的一个Variable即对应了计算引擎中的一个Tensor数据。二者在实现上是一一对应的。并且,End-User需要使用Variable的名字来访问对应Tensor的值。例如:
- 在计算图中配置了
fc.weight
的Variable。End-User应该可以对fc.weight
的Tensor进行初始化,或使用randomize
随机,或使用load
载入。 - 用户在一个mini-batch结束后,应该可以获取这个计算图的任意一个输出。也就是,譬如
prediction.prob
这个Variable的值。这样才能做model inference。
不同神经网络框架的实现:
框架名 | 配置格式 | 实现手法 |
---|---|---|
tensorflow | proto | TBD |
caffe2 | proto | Caffe2 用户配置了protobuf描述。caffe2的C++ part将用户描述的Variable protobuf在Workspace中转换成Blob,Blob的一个DataMember是Tensor |
MxNet | C++ class | TBD |
PyTorch | - | Variable是 Tensor 的一个wrapper |
DyNet | C++ class | DyNet的Variable分为Parameter,Inputs等等,但他们都是Tensor的一个Wrapper |
问题:
我们的Variable是否是Tensor的Wrapper,即
struct Tensor {...};
struct Variable {
TensorPtr tensor_;
string name_;
bool needBackward_;
};
推论,如果Variable里面既有包含Tensor,那么Tensor的内存分配要求是Lazy的,即仅仅在mini-batch开始时,engine分配内存,或者当用户写入Variable数据的时候分配内存(randomize/load)。而不是创建一个Variable
的时候就分配了内存。因为Variable
在Engine执行时,dim_可能会变。并且Engine执行时,可能在不同设备上申请Variable
的内存。