Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

【Hackathon 6th Article No.1】Inplace 优化性能 #857

Closed
wants to merge 0 commits into from

Conversation

lightrain-a
Copy link
Contributor

Add files via upload

Copy link

paddle-bot bot commented Apr 8, 2024

你的PR提交成功,感谢你对开源项目的贡献!
请检查PR提交格式和内容是否完备,具体请参考示例模版
Your PR has been submitted. Thanks for your contribution!
Please check its format and content. For this, you can refer to Template and Demo.

@CLAassistant
Copy link

CLAassistant commented Apr 8, 2024

CLA assistant check
All committers have signed the CLA.


# 2. 为什么需要Inplace操作?
## 内存优化
在深度学习训练过程中,尤其是处理大规模数据集或复杂模型时,内存经常是一个限制因素。Inplace操作通过减少了额外的内存分配和数据复制,可以显著减少内存占用,使得可以在有限的硬件资源上训练更大、更复杂的模型。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

训练可能不太准确,这里说推理吧,训练的时候inplace 不是一定能节省显存

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

感谢指正,已全部修改完善,麻烦老师帮忙再看看


## 性能提升

除了内存优化之外,Inplace 操作还能减少内存分配和释放的次数,从而减少了CPU与GPU之间的数据传输,进而提升整体的运行效率。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里说减少了GPU访问显存的次数吧,减少CPU与GPU数据传输这个说法不太准确


Inplace 操作虽然可以优化内存使用,减少数据复制从而提高执行效率,但它也可能带来特定的挑战。主要问题是潜在的数据覆盖,这可能导致模型训练过程中出现难以发现和解决的错误。当进行 Inplace 操作时,如果不慎覆盖了还需用于后续计算的数据,将直接影响梯度的计算和模型的训练结果。

在 PaddlePaddle 中,进行 Inplace 操作时确实需要注意两种主要情况,以避免影响梯度计算的准确性。这两种情况是:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

第一个不是因为梯度计算不准才不让使用的,https://github.com/PaddlePaddle/community/pull/839/files 可以看看这个稿件的内容

在 PaddlePaddle 中,进行 Inplace 操作时确实需要注意两种主要情况,以避免影响梯度计算的准确性。这两种情况是:

1. **对 `requires_grad=True` 的叶子张量(leaf tensor)不能使用 Inplace 操作。**
2. **对于在求梯度阶段需要用到的张量,不能使用 Inplace 操作。**
Copy link
Contributor

@GGBond8488 GGBond8488 Apr 10, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个只是针对求梯度时,如果需要用到某个op的输出,才可能导致梯度计算错误,从而不能Inplace操作


### 1. 对 `requires_grad=True` 的叶子张量不能使用 Inplace 操作

叶子张量是直接创建的张量,不是通过任何 Paddle 操作创建的结果。如果这样的张量设置了 `requires_grad=True`,意味着需要计算其梯度,进行 Inplace 操作可能会直接修改其数据,从而影响梯度计算。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

不是影响梯度计算,而是a.add_(b), a本身被修改了,就算梯度计算正确了,用a的梯度更新已经被修改的a,显然更新后的a的数值也不正确

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里还是没改,可以做个实验看看梯度是否计算错了

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

新增了实验2,有报错。麻烦老师看看是这个意思吗

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个是因为叶子节点不能被inplace修改,而不是影响梯度计算的case

# 进行反向传播
y.sum().backward()
```
在这个例子中,`y = x * x`,我们尝试对 `x` 进行Inplace操作 `x *= 2`。从数学角度来看,`y` 对 `x` 的梯度(偏导数)是 `∂y/∂x = 2x`。如果我们在计算 `y` 之后,但在执行反向传播之前修改了 `x` 的值,那么原始的 `x` 值(用于梯度计算的值)就会丢失,导致不能正确计算梯度。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里确定报错了吗,可以把报错信息也贴出来

@lightrain-a
Copy link
Contributor Author

感谢指正,已全部修改完善,麻烦老师帮忙再看看

# 尝试对x进行Inplace操作
try:
x *= 2 # 这会影响到y对x的梯度计算
except RuntimeError as e:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里确定会报错吗

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里没有报错,但是最后输出的结果是有问题的,老师您看这一部分是直接删除,还是阐述的更清楚一点更合适?


### 1. 对 `requires_grad=True` 的叶子张量不能使用 Inplace 操作

叶子张量是直接创建的张量,不是通过任何 Paddle 操作创建的结果。如果这样的张量设置了 `requires_grad=True`,意味着需要计算其梯度,进行 Inplace 操作可能会直接修改其数据,从而影响梯度计算。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里还是没改,可以做个实验看看梯度是否计算错了

Copy link
Contributor Author

@lightrain-a lightrain-a left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

新增实验2,麻烦老师再看看。谢谢!

# 尝试对x进行Inplace操作
try:
x *= 2 # 这会影响到y对x的梯度计算
except RuntimeError as e:
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这里没有报错,但是最后输出的结果是有问题的,老师您看这一部分是直接删除,还是阐述的更清楚一点更合适?


### 1. 对 `requires_grad=True` 的叶子张量不能使用 Inplace 操作

叶子张量是直接创建的张量,不是通过任何 Paddle 操作创建的结果。如果这样的张量设置了 `requires_grad=True`,意味着需要计算其梯度,进行 Inplace 操作可能会直接修改其数据,从而影响梯度计算。
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

新增了实验2,有报错。麻烦老师看看是这个意思吗

进行 Inplace 操作时需要注意两种主要情况,以避免影响计算的准确性。这两种情况是:

1. **对 `requires_grad=True` 的叶子张量(leaf tensor),不能使用 Inplace 操作。**
2. **对后续计算(如求梯度)中仍要需要用到的值,不能使用 Inplace 操作。**
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

求梯度依赖前向输入的的场景是可以进行inplace操作的,例如sin_(x)这种, 反向虽然仍然需要x,但是paddle做了特殊处理,可以保证反向梯度计算是正确的


1. **详细的错误消息和文档**:PaddlePaddle 提供了丰富的错误消息和详细的文档说明,帮助开发者理解 Inplace 操作的使用场景和限制。这些资源使开发者能够更清晰地识别和解决因 Inplace 操作导致的问题。

2. **自动依赖检测机制**:从 PaddlePaddle 2.6 版本开始,引入了自动检测机制。这个机制在模型运行时自动分析前向操作和反向梯度计算之间的依赖关系。如果确认某个操作的输入数据在反向计算中不再需要,该操作就可以安全地执行 Inplace 操作。这样的自动化检测不仅减少了开发者的工作负担,也大大降低了因手动错误导致的风险。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个说法也不正确,可以构建一下某个输入在反向计算中需要的case,看是否会报错以及梯度是否计算正确


### 1. 对 `requires_grad=True` 的叶子张量不能使用 Inplace 操作

叶子张量是直接创建的张量,不是通过任何 Paddle 操作创建的结果。如果这样的张量设置了 `requires_grad=True`,意味着需要计算其梯度,进行 Inplace 操作可能会直接修改其数据,从而影响梯度计算。
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

这个是因为叶子节点不能被inplace修改,而不是影响梯度计算的case

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants