Skip to content

  • 体验新版
    • 正在加载...
  • 登录
  • PaddlePaddle
  • Paddle
  • Issue
  • #2472

P
Paddle
  • 项目概览

PaddlePaddle / Paddle
大约 2 年 前同步成功

通知 2325
Star 20933
Fork 5424
  • 代码
    • 文件
    • 提交
    • 分支
    • Tags
    • 贡献者
    • 分支图
    • Diff
  • Issue 1423
    • 列表
    • 看板
    • 标记
    • 里程碑
  • 合并请求 543
  • Wiki 0
    • Wiki
  • 分析
    • 仓库
    • DevOps
  • 项目成员
  • Pages
P
Paddle
  • 项目概览
    • 项目概览
    • 详情
    • 发布
  • 仓库
    • 仓库
    • 文件
    • 提交
    • 分支
    • 标签
    • 贡献者
    • 分支图
    • 比较
  • Issue 1,423
    • Issue 1,423
    • 列表
    • 看板
    • 标记
    • 里程碑
  • 合并请求 543
    • 合并请求 543
  • Pages
  • 分析
    • 分析
    • 仓库分析
    • DevOps
  • Wiki 0
    • Wiki
  • 成员
    • 成员
  • 收起侧边栏
  • 动态
  • 分支图
  • 创建新Issue
  • 提交
  • Issue看板
已关闭
开放中
Opened 6月 15, 2017 by saxon_zh@saxon_zhGuest

`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的内存。

指派人
分配到
无
里程碑
无
分配里程碑
工时统计
无
截止日期
无
标识: paddlepaddle/Paddle#2472
渝ICP备2023009037号

京公网安备11010502055752号

网络110报警服务 Powered by GitLab CE v13.7
开源知识
Git 入门 Pro Git 电子书 在线学 Git
Markdown 基础入门 IT 技术知识开源图谱
帮助
使用手册 反馈建议 博客
《GitCode 隐私声明》 《GitCode 服务条款》 关于GitCode
Powered by GitLab CE v13.7