From 4f34a5235f26b7ae0ba20d55ddba648259ac6bcd Mon Sep 17 00:00:00 2001 From: lightrain-a <164860023+lightrain-a@users.noreply.github.com> Date: Thu, 25 Apr 2024 19:00:56 +0800 Subject: [PATCH 01/13] Add files via upload --- ...30\345\214\226\346\200\247\350\203\275.md" | 244 ++++++++++++++++++ 1 file changed, 244 insertions(+) create mode 100644 "rfcs/Article/\343\200\220Hackathon 6th Article No.1\343\200\221Inplace \344\274\230\345\214\226\346\200\247\350\203\275.md" diff --git "a/rfcs/Article/\343\200\220Hackathon 6th Article No.1\343\200\221Inplace \344\274\230\345\214\226\346\200\247\350\203\275.md" "b/rfcs/Article/\343\200\220Hackathon 6th Article No.1\343\200\221Inplace \344\274\230\345\214\226\346\200\247\350\203\275.md" new file mode 100644 index 000000000..001466ac0 --- /dev/null +++ "b/rfcs/Article/\343\200\220Hackathon 6th Article No.1\343\200\221Inplace \344\274\230\345\214\226\346\200\247\350\203\275.md" @@ -0,0 +1,244 @@ +# 【Paddle 】Inplace 优化运行时间和内存 +# 引言 +在深度学习领域,内存管理是一个既关键又复杂的问题,特别是在处理大规模数据和模型时,高效的内存使用可以显著提升计算性能和资源利用率。PaddlePaddle(飞桨),作为百度开发的一款深度学习框架,通过引入 Inplace 机制,为开发者提供了一种高效管理内存的方式。 + +本文将通过实际的 Paddle 代码示例来,展示如何在PaddlePaddle中使用Inplace操作,并对比其在内存优化和性能提升方面的效果,阐述其在实际应用中的好处、潜在问题以及飞桨是如何保护梯度计算过程的。 +# 1. 什么是Inplace操作? +Inplace操作允许直接在原始数据上进行修改,而无需创建数据的副本。这样不仅可以减少内存的占用,还能降低计算的复杂度,从而提升整体的执行性能。 + +# 2. 为什么需要Inplace操作? +## 内存优化 +在深度学习推理过程中,尤其是处理大规模数据集或复杂模型时,内存经常是一个限制因素。Inplace操作通过减少了额外的内存分配和数据复制,可以显著减少内存占用,使得可以在有限的硬件资源上训练更大、更复杂的模型。 + +## 性能提升 + +除了内存优化之外,Inplace 操作还能减少内存分配和释放的次数,从而减少了GPU访问显存的次数,进而提升整体的运行效率。 + +# 3. 使用 inplace 有什么好处? +## 示例应用:加法操作 + +为了直观地展示使用Inplace和不使用Inplace操作的区别,我们将通过执行连续的加法操作来进行比较。加法操作是最基本的数学运算之一,通过对其进行大量重复执行,我们可以清晰地观察到Inplace操作在内存和性能方面的优势。 + +### 实验设置 + +- **任务**:对一个初始为全1的大型Tensor(例如,1000x1000)执行100次加法操作,每次加1。 +- **对比**:分别使用Inplace操作(`add_`)和非Inplace操作(`add`)进行实验,并测量内存使用和执行时间。 + +### 环境准备 + +确保已安装PaddlePaddle,如果未安装,请运行以下命令安装: + +cpu版本安装:(如果只对比时间,可以仅安装cpu版本) +```bash +pip install paddlepaddle +``` +gpu版本安装:(对比内存空间的使用,需要安装gpu版本) +前往[官网](https://www.paddlepaddle.org.cn/),选择适合本机cuda版本的安装命令 + +```bash +conda install paddlepaddle-gpu==2.6.1 cudatoolkit=11.2 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/ -c conda-forge +``` + +### 实验代码 + +为了测量内存和时间,我们使用`time`模块来记录执行时间。 + +```python +import paddle +import time +import numpy as np +import matplotlib.pyplot as plt + +# 初始化PaddlePaddle +paddle.disable_static() + +# 创建大型Tensor +x = paddle.ones([1000, 1000], dtype='float32') +x_inplace = paddle.ones_like(x) + +# 定义执行非Inplace操作的函数 +def non_inplace_addition(x): + start_time = time.time() + for _ in range(100): + x = paddle.add(x, paddle.to_tensor(1.0)) + end_time = time.time() + return end_time - start_time + +# 定义执行Inplace操作的函数 +def inplace_addition(x): + start_time = time.time() + for _ in range(100): + x.add_(paddle.to_tensor(1.0)) + end_time = time.time() + return end_time - start_time + +# 测量执行时间 +time_non_inplace = non_inplace_addition(x) +time_inplace = inplace_addition(x_inplace) + +# 绘制结果 +plt.figure(figsize=(5, 6)) +plt.bar(['Non-Inplace', 'Inplace'], [time_non_inplace, time_inplace], color=['blue', 'green']) +plt.title('Inplace vs. Non-Inplace Operation Performance') +plt.ylabel('Execution Time (seconds)') +plt.show() + +``` + +### 结果分析 + +在执行上述代码后得到条形图,展示了执行时间的对比结果。 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5d8263a45911425d803939a9c43135a3.png) + +理论上,Inplace操作会展现出更短的执行时间和更低的内存增加量。这是因为Inplace操作减少了对额外内存的需求,并且由于减少了数据复制的需要,从而降低了执行过程中的开销。 + +## 小结 + +通过这个简单的加法操作实验,我们可以清楚地看到,在PaddlePaddle中使用Inplace操作相比于标准操作可以显著优化内存使用并提升性能。对于深度学习实践者而言,合理利用Inplace操作不仅可以提高模型训练和推理的效率,还能使得在有限的硬件资源下处理更复杂的任务成为可能。 + +请注意,虽然Inplace操作在很多场景下都非常有用,但它也可能导致原始数据被修改,因此在使用时需要特别小心,确保这种修改不会影响到其他需要使用原始数据的操作。正确和谨慎地使用Inplace操作,将有助于您在深度学习项目中实现更高效的内存和性能优化。 + + +# 4. inplace 在训练中会有哪些问题& paddle 是如何解决这些问题的? + +## 问题描述 + +Inplace 操作虽然可以优化内存使用,减少数据复制从而提高执行效率,但它也可能带来特定的挑战。主要问题是潜在的数据覆盖,这可能导致模型训练过程中出现难以发现和解决的错误。两种主要的错误原因是: + +1. 当进行 Inplace 操作时,如果不慎覆盖了还需用于后续计算的数据,将直接影响梯度的计算和模型的训练结果。 +2. Inplace 操作涉及到修改与操作相关函数的输入张量及其所有创建者的信息,即在多个张量共享相同内存(如通过索引或转置创建的张量)的情况。如果被就地修改的张量共享的内存也被其他张量引用,则可能导致错误。 + +进行 Inplace 操作时需要注意两种主要情况,以避免影响计算的准确性。这两种情况是: + +1. **对 `requires_grad=True` 的叶子张量(leaf tensor),不能使用 Inplace 操作。** +2. **对后续计算(如求梯度)中仍要需要用到的值,不能使用 Inplace 操作。** + + + + +## PaddlePaddle 的解决方案 + +为了应对这些挑战,PaddlePaddle 采取了以下措施确保 Inplace 操作的正确性和安全性: + +1. **详细的错误消息和文档**:PaddlePaddle 提供了丰富的错误消息和详细的文档说明,帮助开发者理解 Inplace 操作的使用场景和限制。这些资源使开发者能够更清晰地识别和解决因 Inplace 操作导致的问题。 + +2. **自动依赖检测机制**:从 PaddlePaddle 2.6 版本开始,引入了自动检测机制。这个机制在模型运行时自动分析前向操作和反向梯度计算之间的依赖关系。如果确认某个操作的输入数据在反向计算中不再需要,该操作就可以安全地执行 Inplace 操作。这样的自动化检测不仅减少了开发者的工作负担,也大大降低了因手动错误导致的风险。 + +3. **视图(View)策略和API支持**:从 2.1 版本起,PaddlePaddle 引入了视图策略并扩展了支持 Inplace 操作的 API 范围。视图操作允许在不复制底层数据的情况下创建变量的新视图,进一步优化了内存使用。这些 API 的扩展也为开发者提供了更多的灵活性和选择,使得在确保效率的同时也保持了代码的清晰和易于维护。 + + +## 示例:非正常Inplace 操作 + +当一个 Inplace 操作影响到了变量 `x` 的计算,PaddlePaddle 会通过其自动依赖检测机制拦截这个操作,保护梯度计算的正确性。如果开发者尝试执行一个会影响梯度计算的 Inplace 操作,PaddlePaddle 会抛出一个错误,提示操作不能被执行,因为它会破坏梯度信息。这样的指导原则有助于平衡执行效率与计算准确性之间的关系,确保模型训练的有效性。 + +下面的示例展示了当尝试进行一个可能影响计算的 Inplace 操作时,PaddlePaddle 如何处理这种情况: + +### 1. 对 `requires_grad=True` 的叶子张量不能使用 Inplace 操作 + +叶子张量是直接创建的张量,不是通过任何 Paddle 操作创建的结果。如果这样的张量设置了 `requires_grad=True`,意味着需要计算其梯度,进行 Inplace 操作可能会直接修改其数据,从而影响梯度计算。 + + +```python +import paddle + +# 创建一个叶子张量并设置requires_grad=True +x = paddle.to_tensor([1.0, 2.0, 3.0], stop_gradient=False) + +# 尝试进行Inplace操作 +try: + x[0] = 999.0 # 尝试Inplace修改 +except RuntimeError as e: + print(f"发生错误: {e}") +``` + +上述代码在执行 x[0] = 999.0 时会抛出如下错误: + +```python +ValueError: (InvalidArgument) Leaf Tensor (generated_tensor_400) that doesn't stop gradient can't use inplace strategy. + [Hint: Expected egr::EagerUtils::IsLeafTensor(tensor) && !egr::EagerUtils::autograd_meta(&tensor)->StopGradient() == false, but received egr::EagerUtils::IsLeafTensor(tensor) && !egr::EagerUtils::autograd_meta(&tensor)->StopGradient():1 != false:0.] (at ..\paddle\fluid\pybind\eager_method.cc:1586) +``` + +在这个例子中,我们尝试对叶子张量 `x` 进行Inplace修改。因为 `x` 设置了 `requires_grad=True`,这种修改会直接影响到梯度的计算。在 PaddlePaddle 中,这通常会引发错误,因为框架试图保护梯度计算的完整性。 +### 2. 对后续计算(如求梯度)中仍要需要用到的值,不能使用 Inplace 操作。 + +在反向传播(求梯度阶段)过程中,如果需要使用某个张量的值,那么对这个张量进行 Inplace 操作会破坏需要用于梯度计算的原始数据。此情况包含上一情况。 + + +```python +import paddle + +# 启用动态图模式 +paddle.disable_static() + +# 创建一个可训练的参数张量 +x = paddle.to_tensor(3.0, stop_gradient=False) + +# 对x进行操作生成y +y = x ** 2 + +x[0] = 4.0 # 这里我们模拟一个原地操作的效果 + +# 进行反向传播 +y.backward() + +# 查看x的梯度 +print(x.grad) + +``` + +上述代码在执行 x[0] = 4.0 时会抛出如下错误: + +```python +ValueError: (InvalidArgument) Leaf Tensor (generated_tensor_0) that doesn't stop gradient can't use inplace strategy. + [Hint: Expected egr::EagerUtils::IsLeafTensor(tensor) && !egr::EagerUtils::autograd_meta(&tensor)->StopGradient() == false, but received egr::EagerUtils::IsLeafTensor(tensor) && !egr::EagerUtils::autograd_meta(&tensor)->StopGradient():1 != false:0.] (at ..\paddle\fluid\pybind\eager_method.cc:1586) +``` + +### 3. (需要注意)中间变量的重新赋值、运算,会导致计算结果错误。 +需要注意函数中间变量的重新赋值、运算,会导致计算结果错误。 + +```python +import paddle + +# 创建一个张量 +x = paddle.to_tensor([1.0, 2.0, 3.0], stop_gradient=False) +y = x * x # y是x的函数 + +# 尝试对x进行Inplace操作 +try: + x *= 2 # 这会影响到y对x的梯度计算 +except RuntimeError as e: + print(f"发生错误: {e}") + +# 进行反向传播 +y.sum().backward() +``` + +在这个例子中,`y = x * x`,我们尝试对 `x` 进行Inplace操作 `x *= 2`。从数学角度来看,`y` 对 `x` 的梯度(偏导数)是 `∂y/∂x = 2x`。如果我们在计算 `y` 之后,但在执行反向传播之前修改了 `x` 的值,那么原始的 `x` 值(用于梯度计算的值)就会丢失,导致不能正确计算梯度。 + +原始梯度计算需要 `x` 的原始值: + +$$ +\frac{∂y}{∂x} = 2x +$$ + +但是,如果 `x` 被Inplace修改,那么我们实际上就在尝试用新的 `x` 值来计算梯度,这会导致梯度计算错误。 +### PaddlePaddle保护梯度计算过程 + +PaddlePaddle 的自动依赖检测机制,在实践中,如果尝试执行这些会影响梯度计算的 Inplace 操作,会被识别为潜在的风险,因此会抛出一个错误,阻止操作的执行,以保护梯度信息不被破坏,确保模型训练的准确性和稳定性。 + +- **自动依赖检测机制**:PaddlePaddle 的自动依赖检测可以在运行时自动分析变量之间的依赖关系,确保任何可能影响梯度计算正确性的 Inplace 操作都不会被执行。 +- **保护梯度计算**:通过阻止可能破坏梯度信息的操作,PaddlePaddle 确保了模型训练的稳定性和可靠性,避免了难以追踪的梯度相关错误。 +- **错误消息**:当检测到潜在的风险操作时,PaddlePaddle 会抛出一个明确的错误消息,指导开发者如何避免此类问题,从而提升开发效率和模型的可维护性。 + +这种机制使得 PaddlePaddle 在保证效率优化的同时,也极大地提升了模型训练过程中的安全性和稳定性。 + +开发者在使用 Inplace 操作时,应当谨慎,并确保这些操作不会影响到梯度计算。 +# 小结 + +PaddlePaddle的Inplace机制是一个强大的工具,可以帮助开发者有效地管理内存,提高程序运行效率。通过本指南的介绍和示例代码,希望可以帮助您更好地理解和使用这一机制。在实际应用中,合理利用Inplace操作可以使模型训练过程更加高效和节省资源。 + +# 参考文献 +1. [paddle-APl文档-PaddlePaddle深度学习平台](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/Overview_cn.html#tensor-inplace) +2. [Inplace 介绍 & 使用介绍](https://github.com/PaddlePaddle/community/blob/master/pfcc/paddle-code-reading/Inplace/inplace_introduction.md) + From cbc59f0dddc23cfa60f815e9bfd03a5885d9db6d Mon Sep 17 00:00:00 2001 From: lightrain-a <164860023+lightrain-a@users.noreply.github.com> Date: Thu, 25 Apr 2024 19:35:09 +0800 Subject: [PATCH 02/13] =?UTF-8?q?Update=20=E3=80=90Hackathon=206th=20Artic?= =?UTF-8?q?le=20No.1=E3=80=91Inplace=20=E4=BC=98=E5=8C=96=E6=80=A7?= =?UTF-8?q?=E8=83=BD.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...30\345\214\226\346\200\247\350\203\275.md" | 152 ++++++++++++++---- 1 file changed, 121 insertions(+), 31 deletions(-) diff --git "a/rfcs/Article/\343\200\220Hackathon 6th Article No.1\343\200\221Inplace \344\274\230\345\214\226\346\200\247\350\203\275.md" "b/rfcs/Article/\343\200\220Hackathon 6th Article No.1\343\200\221Inplace \344\274\230\345\214\226\346\200\247\350\203\275.md" index 001466ac0..2065d8ef3 100644 --- "a/rfcs/Article/\343\200\220Hackathon 6th Article No.1\343\200\221Inplace \344\274\230\345\214\226\346\200\247\350\203\275.md" +++ "b/rfcs/Article/\343\200\220Hackathon 6th Article No.1\343\200\221Inplace \344\274\230\345\214\226\346\200\247\350\203\275.md" @@ -142,24 +142,76 @@ Inplace 操作虽然可以优化内存使用,减少数据复制从而提高执 ```python import paddle -# 创建一个叶子张量并设置requires_grad=True +# 启用动态图模式 +paddle.set_device('cpu') # 也可以选择'gpu'如果你的系统支持 +paddle.disable_static() + +# 创建一个可计算梯度的张量 x = paddle.to_tensor([1.0, 2.0, 3.0], stop_gradient=False) -# 尝试进行Inplace操作 -try: - x[0] = 999.0 # 尝试Inplace修改 -except RuntimeError as e: - print(f"发生错误: {e}") +# 执行原地操作 +x.sin_() # 将x的值替换为sin(x)的结果 + +# 输出修改后的x值 +print("In-place modified x:", x.numpy()) + +# 定义一个简单的损失函数,例如平方和 +loss = paddle.sum(x**2) + +# 进行反向传播计算梯度 +loss.backward() + +# 输出梯度 +print("Gradient of x after backward:", x.grad.numpy()) + ``` -上述代码在执行 x[0] = 999.0 时会抛出如下错误: +错误信息明确指出了“叶子变量不应该停止梯度计算并且不能使用原地策略”,这表明当张量被用于梯度计算时,进行原地操作可能会导致前向传递的值被覆盖,从而无法在反向传播时正确地重建计算图。 +即,原地操作 sin_() 在计算图中的叶子节点上不能直接使用,因为它会影响梯度计算。 +在PaddlePaddle中,对于原地修改(in-place)操作,如果是叶子节点(leaf tensor)并且需要计算梯度,通常是不允许直接进行原地操作的,因为这会影响梯度的正确计算。 ```python -ValueError: (InvalidArgument) Leaf Tensor (generated_tensor_400) that doesn't stop gradient can't use inplace strategy. - [Hint: Expected egr::EagerUtils::IsLeafTensor(tensor) && !egr::EagerUtils::autograd_meta(&tensor)->StopGradient() == false, but received egr::EagerUtils::IsLeafTensor(tensor) && !egr::EagerUtils::autograd_meta(&tensor)->StopGradient():1 != false:0.] (at ..\paddle\fluid\pybind\eager_method.cc:1586) +ValueError: (InvalidArgument) Leaf Var (generated_tensor_0) that doesn't stop gradient can't use inplace strategy. + [Hint: Expected !autograd_meta->StopGradient() && IsLeafTensor(target) == false, but received !autograd_meta->StopGradient() && IsLeafTensor(target):1 != false:0.] (at ..\paddle\fluid\eager\utils.cc:233) +``` + +要在PaddlePaddle中正确使用原地操作且仍然可以计算梯度,可以通过非叶子节点进行。这通常意味着在原地操作前应该有其他操作产生一个非叶子节点。下面是一个修改后的示例,展示如何正确地进行这种操作: + +```python +import paddle + +# 启用动态图模式 +paddle.set_device('cpu') # 可以选择'gpu'如果你的系统支持 +paddle.disable_static() + +# 创建一个可计算梯度的张量 +x = paddle.to_tensor([1.0, 2.0, 3.0], stop_gradient=False) + +# 首先进行非原地的操作,生成非叶子节点 +y = paddle.sin(x) + +# 现在对y进行原地操作,例如原地加上一个常数 +y += 1.0 # 原地修改y的值 + +# 输出修改后的y值 +print("In-place modified y:", y.numpy()) + +# 定义一个简单的损失函数,例如y的平方和 +loss = paddle.sum(y**2) + +# 进行反向传播计算梯度 +loss.backward() + +# 输出x的梯度 +print("Gradient of x after backward:", x.grad.numpy()) + ``` -在这个例子中,我们尝试对叶子张量 `x` 进行Inplace修改。因为 `x` 设置了 `requires_grad=True`,这种修改会直接影响到梯度的计算。在 PaddlePaddle 中,这通常会引发错误,因为框架试图保护梯度计算的完整性。 +在这个例子中,我们先对 x 进行了一个非原地的 sin 操作,得到了一个新的张量 y。然后对 y 进行了原地操作,如原地加1。这样,即便进行了原地修改,x 的梯度计算也不会受到影响,因为 y 不是一个叶子节点。 + +这个例子展示了如何在需要计算梯度的场景中安全地使用原地操作。务必注意,在 PaddlePaddle 中,这通常会引发错误,因为框架试图保护梯度计算的完整性:直接在需要梯度的叶子张量上进行原地操作通常是不被允许的,因为这会破坏梯度计算的基础。 + + ### 2. 对后续计算(如求梯度)中仍要需要用到的值,不能使用 Inplace 操作。 在反向传播(求梯度阶段)过程中,如果需要使用某个张量的值,那么对这个张量进行 Inplace 操作会破坏需要用于梯度计算的原始数据。此情况包含上一情况。 @@ -194,36 +246,75 @@ ValueError: (InvalidArgument) Leaf Tensor (generated_tensor_0) that doesn't stop [Hint: Expected egr::EagerUtils::IsLeafTensor(tensor) && !egr::EagerUtils::autograd_meta(&tensor)->StopGradient() == false, but received egr::EagerUtils::IsLeafTensor(tensor) && !egr::EagerUtils::autograd_meta(&tensor)->StopGradient():1 != false:0.] (at ..\paddle\fluid\pybind\eager_method.cc:1586) ``` -### 3. (需要注意)中间变量的重新赋值、运算,会导致计算结果错误。 -需要注意函数中间变量的重新赋值、运算,会导致计算结果错误。 + +### 3. PaddlePaddle保护梯度计算过程 + +求梯度依赖前向输入的的场景是可以进行inplace操作的,例如sin_(x)这种, 反向虽然仍然需要x,但是paddle做了特殊处理,可以保证反向梯度计算是正确的 ```python +# 导入paddle模块 import paddle -# 创建一个张量 -x = paddle.to_tensor([1.0, 2.0, 3.0], stop_gradient=False) -y = x * x # y是x的函数 +# 设置PaddlePaddle的运行设备为CPU,可以通过更改参数设置为'gpu'来使用GPU(如果系统支持) +paddle.set_device('cpu') -# 尝试对x进行Inplace操作 -try: - x *= 2 # 这会影响到y对x的梯度计算 -except RuntimeError as e: - print(f"发生错误: {e}") +# 关闭PaddlePaddle的静态图模式,启用动态图模式以便更灵活地处理数据 +paddle.disable_static() -# 进行反向传播 -y.sum().backward() +# 创建一个维度为[3, 4]的张量,其元素随机初始化,并设置为可进行梯度计算 +a = paddle.randn([3, 4]) +a.stop_gradient = False + +# 计算张量a中每个元素的正弦值,并将结果存储在新的变量x中 +x = paddle.sin(a) + +# 输出计算正弦值后的张量x +print("x after sin operation:", x.numpy()) + +# 对x应用原地正弦操作,更新x的数据,并将结果引用赋给y +y = x.sin_() + +# 输出进行原地操作后的x和y的值,由于是原地操作,x和y引用相同的数据 +print("In-place modified x:", x.numpy()) +print("y:", y.numpy()) +print(y is x) # 输出True,验证y和x是否指向相同的内存地址 + +# 对x进行反向传播,计算关于a的梯度 +y.backward() + +# 输出张量a的梯度 +print("Gradient of a after backward:", a.grad) + +``` + + +```python +x after sin operation: [[-0.9797215 -0.62150306 0.150662 0.907488 ] + [-0.9947523 -0.59465826 -0.73188174 -0.98445815] + [-0.78979075 -0.38565105 0.96159416 0.9507534 ]] +In-place modified x: [[-0.8303422 -0.5822578 0.15009268 0.7879595 ] + [-0.83862406 -0.5602257 -0.66827065 -0.8329724 ] + [-0.710206 -0.37616244 0.82010484 0.8138535 ]] +y: [[-0.8303422 -0.5822578 0.15009268 0.7879595 ] + [-0.83862406 -0.5602257 -0.66827065 -0.8329724 ] + [-0.710206 -0.37616244 0.82010484 0.8138535 ]] +True +Gradient of a after backward: Tensor(shape=[3, 4], dtype=float32, place=Place(cpu), stop_gradient=False, + [[-0.11165375, 0.63691705, 0.97738659, 0.25865343], + [ 0.05573082, 0.66596758, 0.50692940, 0.09717280], + [-0.43181324, 0.85487992, 0.15705840, 0.18010177]]) ``` -在这个例子中,`y = x * x`,我们尝试对 `x` 进行Inplace操作 `x *= 2`。从数学角度来看,`y` 对 `x` 的梯度(偏导数)是 `∂y/∂x = 2x`。如果我们在计算 `y` 之后,但在执行反向传播之前修改了 `x` 的值,那么原始的 `x` 值(用于梯度计算的值)就会丢失,导致不能正确计算梯度。 +实际上,是否可以进行 inplace 操作(即原地修改数据)并且还能正确地进行梯度计算,取决于特定操作和深度学习框架的内部机制。 + +对于 PaddlePaddle 来说,像 `sin_()` 这样的 inplace 操作在某些情况下确实能正确计算梯度,这是因为 PaddlePaddle 在执行反向传播时,对于一些特定的函数,框架有能力保存必要的中间状态或者已经实现了一些策略来正确地处理这些情况。这意味着,对于这些特定操作,PaddlePaddle 确实进行了某种形式的特殊处理,允许在不损失梯度计算正确性的前提下进行原地修改。 -原始梯度计算需要 `x` 的原始值: +然而,这种特殊处理并不是所有操作都有的,而且具体实现可能因框架版本和具体操作而异。在很多情况下,原地操作可能会导致计算梯度时遇到问题,特别是如果该操作需要依赖原始值来计算梯度时。如果在反向传播之前修改了涉及梯度计算的变量,那么可能会因为丢失了原始数据而导致梯度计算错误。 -$$ -\frac{∂y}{∂x} = 2x -$$ +因此,通常建议在深度学习编程中谨慎使用 inplace 操作,除非你确信这样做不会影响梯度的计算,或者框架文档明确指出可以安全进行此类操作。如果不确定,最安全的做法是使用非 inplace 的版本,例如使用 `sin()` 替代 `sin_()`,以避免可能的问题。在实际应用中,最好是查阅最新的框架文档或进行一些实验来验证操作的效果。 -但是,如果 `x` 被Inplace修改,那么我们实际上就在尝试用新的 `x` 值来计算梯度,这会导致梯度计算错误。 -### PaddlePaddle保护梯度计算过程 + +# 小结 PaddlePaddle 的自动依赖检测机制,在实践中,如果尝试执行这些会影响梯度计算的 Inplace 操作,会被识别为潜在的风险,因此会抛出一个错误,阻止操作的执行,以保护梯度信息不被破坏,确保模型训练的准确性和稳定性。 @@ -233,8 +324,7 @@ PaddlePaddle 的自动依赖检测机制,在实践中,如果尝试执行这 这种机制使得 PaddlePaddle 在保证效率优化的同时,也极大地提升了模型训练过程中的安全性和稳定性。 -开发者在使用 Inplace 操作时,应当谨慎,并确保这些操作不会影响到梯度计算。 -# 小结 +开发者在使用 Inplace 操作时,还是尽量应当谨慎,并确保这些操作不会影响到梯度计算。 PaddlePaddle的Inplace机制是一个强大的工具,可以帮助开发者有效地管理内存,提高程序运行效率。通过本指南的介绍和示例代码,希望可以帮助您更好地理解和使用这一机制。在实际应用中,合理利用Inplace操作可以使模型训练过程更加高效和节省资源。 From 775dcf40ec4bb5779ce06a8b146b02ae457c8652 Mon Sep 17 00:00:00 2001 From: lightrain-a <164860023+lightrain-a@users.noreply.github.com> Date: Thu, 25 Apr 2024 19:40:59 +0800 Subject: [PATCH 03/13] =?UTF-8?q?Update=20=E3=80=90Hackathon=206th=20Artic?= =?UTF-8?q?le=20No.1=E3=80=91Inplace=20=E4=BC=98=E5=8C=96=E6=80=A7?= =?UTF-8?q?=E8=83=BD.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\230\345\214\226\346\200\247\350\203\275.md" | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git "a/rfcs/Article/\343\200\220Hackathon 6th Article No.1\343\200\221Inplace \344\274\230\345\214\226\346\200\247\350\203\275.md" "b/rfcs/Article/\343\200\220Hackathon 6th Article No.1\343\200\221Inplace \344\274\230\345\214\226\346\200\247\350\203\275.md" index 2065d8ef3..0c5794552 100644 --- "a/rfcs/Article/\343\200\220Hackathon 6th Article No.1\343\200\221Inplace \344\274\230\345\214\226\346\200\247\350\203\275.md" +++ "b/rfcs/Article/\343\200\220Hackathon 6th Article No.1\343\200\221Inplace \344\274\230\345\214\226\346\200\247\350\203\275.md" @@ -104,17 +104,15 @@ plt.show() ## 问题描述 -Inplace 操作虽然可以优化内存使用,减少数据复制从而提高执行效率,但它也可能带来特定的挑战。主要问题是潜在的数据覆盖,这可能导致模型训练过程中出现难以发现和解决的错误。两种主要的错误原因是: +Inplace 操作可以优化内存使用并提高执行效率,通过减少数据复制实现这一点。然而,它也可能带来一些挑战,特别是与数据覆盖相关的问题,这可能在模型训练过程中引发难以诊断和解决的错误。主要问题通常包括: -1. 当进行 Inplace 操作时,如果不慎覆盖了还需用于后续计算的数据,将直接影响梯度的计算和模型的训练结果。 -2. Inplace 操作涉及到修改与操作相关函数的输入张量及其所有创建者的信息,即在多个张量共享相同内存(如通过索引或转置创建的张量)的情况。如果被就地修改的张量共享的内存也被其他张量引用,则可能导致错误。 - -进行 Inplace 操作时需要注意两种主要情况,以避免影响计算的准确性。这两种情况是: - -1. **对 `requires_grad=True` 的叶子张量(leaf tensor),不能使用 Inplace 操作。** -2. **对后续计算(如求梯度)中仍要需要用到的值,不能使用 Inplace 操作。** +1. 当进行 Inplace 操作时,如果覆盖了仍需用于后续计算的数据,这将直接影响梯度的计算和模型的训练效果。 +2. Inplace 操作可能修改涉及的函数的输入张量及其衍生张量的信息,特别是当多个张量共享相同内存时(例如通过索引或转置创建的张量)。如果进行了 Inplace 修改的张量的内存被其他张量引用,这可能导致不可预见的错误。 +为避免影响计算的准确性,执行 Inplace 操作时需要特别注意以下情况: +1. **对设置了 `requires_grad=True` 的叶子张量(leaf tensor),应避免使用 Inplace 操作,因为这可能妨碍正确的梯度计算。** +2. **PaddlePaddle 在执行反向传播时,针对某些特定的函数,能够保存必要的中间状态,或已经实现了策略以正确处理 Inplace 操作。不过,对于不常见或复杂的操作,最好在实际使用前通过实验来验证其行为。** ## PaddlePaddle 的解决方案 @@ -249,7 +247,7 @@ ValueError: (InvalidArgument) Leaf Tensor (generated_tensor_0) that doesn't stop ### 3. PaddlePaddle保护梯度计算过程 -求梯度依赖前向输入的的场景是可以进行inplace操作的,例如sin_(x)这种, 反向虽然仍然需要x,但是paddle做了特殊处理,可以保证反向梯度计算是正确的 +求梯度依赖前向输入的的场景是可以进行inplace操作的,例如sin_(x)这种, 反向虽然仍然需要x,但是paddle做了特殊处理,可以保证反向梯度计算是正确的。 ```python # 导入paddle模块 From 2310bed9cbc6b0bdb210c41c0993cdcece94683b Mon Sep 17 00:00:00 2001 From: lightrain-a <164860023+lightrain-a@users.noreply.github.com> Date: Fri, 26 Apr 2024 15:20:06 +0800 Subject: [PATCH 04/13] =?UTF-8?q?Delete=20rfcs/Article/=E3=80=90Hackathon?= =?UTF-8?q?=206th=20Article=20No.1=E3=80=91Inplace=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=80=A7=E8=83=BD.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...30\345\214\226\346\200\247\350\203\275.md" | 332 ------------------ 1 file changed, 332 deletions(-) delete mode 100644 "rfcs/Article/\343\200\220Hackathon 6th Article No.1\343\200\221Inplace \344\274\230\345\214\226\346\200\247\350\203\275.md" diff --git "a/rfcs/Article/\343\200\220Hackathon 6th Article No.1\343\200\221Inplace \344\274\230\345\214\226\346\200\247\350\203\275.md" "b/rfcs/Article/\343\200\220Hackathon 6th Article No.1\343\200\221Inplace \344\274\230\345\214\226\346\200\247\350\203\275.md" deleted file mode 100644 index 0c5794552..000000000 --- "a/rfcs/Article/\343\200\220Hackathon 6th Article No.1\343\200\221Inplace \344\274\230\345\214\226\346\200\247\350\203\275.md" +++ /dev/null @@ -1,332 +0,0 @@ -# 【Paddle 】Inplace 优化运行时间和内存 -# 引言 -在深度学习领域,内存管理是一个既关键又复杂的问题,特别是在处理大规模数据和模型时,高效的内存使用可以显著提升计算性能和资源利用率。PaddlePaddle(飞桨),作为百度开发的一款深度学习框架,通过引入 Inplace 机制,为开发者提供了一种高效管理内存的方式。 - -本文将通过实际的 Paddle 代码示例来,展示如何在PaddlePaddle中使用Inplace操作,并对比其在内存优化和性能提升方面的效果,阐述其在实际应用中的好处、潜在问题以及飞桨是如何保护梯度计算过程的。 -# 1. 什么是Inplace操作? -Inplace操作允许直接在原始数据上进行修改,而无需创建数据的副本。这样不仅可以减少内存的占用,还能降低计算的复杂度,从而提升整体的执行性能。 - -# 2. 为什么需要Inplace操作? -## 内存优化 -在深度学习推理过程中,尤其是处理大规模数据集或复杂模型时,内存经常是一个限制因素。Inplace操作通过减少了额外的内存分配和数据复制,可以显著减少内存占用,使得可以在有限的硬件资源上训练更大、更复杂的模型。 - -## 性能提升 - -除了内存优化之外,Inplace 操作还能减少内存分配和释放的次数,从而减少了GPU访问显存的次数,进而提升整体的运行效率。 - -# 3. 使用 inplace 有什么好处? -## 示例应用:加法操作 - -为了直观地展示使用Inplace和不使用Inplace操作的区别,我们将通过执行连续的加法操作来进行比较。加法操作是最基本的数学运算之一,通过对其进行大量重复执行,我们可以清晰地观察到Inplace操作在内存和性能方面的优势。 - -### 实验设置 - -- **任务**:对一个初始为全1的大型Tensor(例如,1000x1000)执行100次加法操作,每次加1。 -- **对比**:分别使用Inplace操作(`add_`)和非Inplace操作(`add`)进行实验,并测量内存使用和执行时间。 - -### 环境准备 - -确保已安装PaddlePaddle,如果未安装,请运行以下命令安装: - -cpu版本安装:(如果只对比时间,可以仅安装cpu版本) -```bash -pip install paddlepaddle -``` -gpu版本安装:(对比内存空间的使用,需要安装gpu版本) -前往[官网](https://www.paddlepaddle.org.cn/),选择适合本机cuda版本的安装命令 - -```bash -conda install paddlepaddle-gpu==2.6.1 cudatoolkit=11.2 -c https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/ -c conda-forge -``` - -### 实验代码 - -为了测量内存和时间,我们使用`time`模块来记录执行时间。 - -```python -import paddle -import time -import numpy as np -import matplotlib.pyplot as plt - -# 初始化PaddlePaddle -paddle.disable_static() - -# 创建大型Tensor -x = paddle.ones([1000, 1000], dtype='float32') -x_inplace = paddle.ones_like(x) - -# 定义执行非Inplace操作的函数 -def non_inplace_addition(x): - start_time = time.time() - for _ in range(100): - x = paddle.add(x, paddle.to_tensor(1.0)) - end_time = time.time() - return end_time - start_time - -# 定义执行Inplace操作的函数 -def inplace_addition(x): - start_time = time.time() - for _ in range(100): - x.add_(paddle.to_tensor(1.0)) - end_time = time.time() - return end_time - start_time - -# 测量执行时间 -time_non_inplace = non_inplace_addition(x) -time_inplace = inplace_addition(x_inplace) - -# 绘制结果 -plt.figure(figsize=(5, 6)) -plt.bar(['Non-Inplace', 'Inplace'], [time_non_inplace, time_inplace], color=['blue', 'green']) -plt.title('Inplace vs. Non-Inplace Operation Performance') -plt.ylabel('Execution Time (seconds)') -plt.show() - -``` - -### 结果分析 - -在执行上述代码后得到条形图,展示了执行时间的对比结果。 - -![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5d8263a45911425d803939a9c43135a3.png) - -理论上,Inplace操作会展现出更短的执行时间和更低的内存增加量。这是因为Inplace操作减少了对额外内存的需求,并且由于减少了数据复制的需要,从而降低了执行过程中的开销。 - -## 小结 - -通过这个简单的加法操作实验,我们可以清楚地看到,在PaddlePaddle中使用Inplace操作相比于标准操作可以显著优化内存使用并提升性能。对于深度学习实践者而言,合理利用Inplace操作不仅可以提高模型训练和推理的效率,还能使得在有限的硬件资源下处理更复杂的任务成为可能。 - -请注意,虽然Inplace操作在很多场景下都非常有用,但它也可能导致原始数据被修改,因此在使用时需要特别小心,确保这种修改不会影响到其他需要使用原始数据的操作。正确和谨慎地使用Inplace操作,将有助于您在深度学习项目中实现更高效的内存和性能优化。 - - -# 4. inplace 在训练中会有哪些问题& paddle 是如何解决这些问题的? - -## 问题描述 - -Inplace 操作可以优化内存使用并提高执行效率,通过减少数据复制实现这一点。然而,它也可能带来一些挑战,特别是与数据覆盖相关的问题,这可能在模型训练过程中引发难以诊断和解决的错误。主要问题通常包括: - -1. 当进行 Inplace 操作时,如果覆盖了仍需用于后续计算的数据,这将直接影响梯度的计算和模型的训练效果。 -2. Inplace 操作可能修改涉及的函数的输入张量及其衍生张量的信息,特别是当多个张量共享相同内存时(例如通过索引或转置创建的张量)。如果进行了 Inplace 修改的张量的内存被其他张量引用,这可能导致不可预见的错误。 - -为避免影响计算的准确性,执行 Inplace 操作时需要特别注意以下情况: - -1. **对设置了 `requires_grad=True` 的叶子张量(leaf tensor),应避免使用 Inplace 操作,因为这可能妨碍正确的梯度计算。** -2. **PaddlePaddle 在执行反向传播时,针对某些特定的函数,能够保存必要的中间状态,或已经实现了策略以正确处理 Inplace 操作。不过,对于不常见或复杂的操作,最好在实际使用前通过实验来验证其行为。** - - -## PaddlePaddle 的解决方案 - -为了应对这些挑战,PaddlePaddle 采取了以下措施确保 Inplace 操作的正确性和安全性: - -1. **详细的错误消息和文档**:PaddlePaddle 提供了丰富的错误消息和详细的文档说明,帮助开发者理解 Inplace 操作的使用场景和限制。这些资源使开发者能够更清晰地识别和解决因 Inplace 操作导致的问题。 - -2. **自动依赖检测机制**:从 PaddlePaddle 2.6 版本开始,引入了自动检测机制。这个机制在模型运行时自动分析前向操作和反向梯度计算之间的依赖关系。如果确认某个操作的输入数据在反向计算中不再需要,该操作就可以安全地执行 Inplace 操作。这样的自动化检测不仅减少了开发者的工作负担,也大大降低了因手动错误导致的风险。 - -3. **视图(View)策略和API支持**:从 2.1 版本起,PaddlePaddle 引入了视图策略并扩展了支持 Inplace 操作的 API 范围。视图操作允许在不复制底层数据的情况下创建变量的新视图,进一步优化了内存使用。这些 API 的扩展也为开发者提供了更多的灵活性和选择,使得在确保效率的同时也保持了代码的清晰和易于维护。 - - -## 示例:非正常Inplace 操作 - -当一个 Inplace 操作影响到了变量 `x` 的计算,PaddlePaddle 会通过其自动依赖检测机制拦截这个操作,保护梯度计算的正确性。如果开发者尝试执行一个会影响梯度计算的 Inplace 操作,PaddlePaddle 会抛出一个错误,提示操作不能被执行,因为它会破坏梯度信息。这样的指导原则有助于平衡执行效率与计算准确性之间的关系,确保模型训练的有效性。 - -下面的示例展示了当尝试进行一个可能影响计算的 Inplace 操作时,PaddlePaddle 如何处理这种情况: - -### 1. 对 `requires_grad=True` 的叶子张量不能使用 Inplace 操作 - -叶子张量是直接创建的张量,不是通过任何 Paddle 操作创建的结果。如果这样的张量设置了 `requires_grad=True`,意味着需要计算其梯度,进行 Inplace 操作可能会直接修改其数据,从而影响梯度计算。 - - -```python -import paddle - -# 启用动态图模式 -paddle.set_device('cpu') # 也可以选择'gpu'如果你的系统支持 -paddle.disable_static() - -# 创建一个可计算梯度的张量 -x = paddle.to_tensor([1.0, 2.0, 3.0], stop_gradient=False) - -# 执行原地操作 -x.sin_() # 将x的值替换为sin(x)的结果 - -# 输出修改后的x值 -print("In-place modified x:", x.numpy()) - -# 定义一个简单的损失函数,例如平方和 -loss = paddle.sum(x**2) - -# 进行反向传播计算梯度 -loss.backward() - -# 输出梯度 -print("Gradient of x after backward:", x.grad.numpy()) - -``` - -错误信息明确指出了“叶子变量不应该停止梯度计算并且不能使用原地策略”,这表明当张量被用于梯度计算时,进行原地操作可能会导致前向传递的值被覆盖,从而无法在反向传播时正确地重建计算图。 -即,原地操作 sin_() 在计算图中的叶子节点上不能直接使用,因为它会影响梯度计算。 -在PaddlePaddle中,对于原地修改(in-place)操作,如果是叶子节点(leaf tensor)并且需要计算梯度,通常是不允许直接进行原地操作的,因为这会影响梯度的正确计算。 - -```python -ValueError: (InvalidArgument) Leaf Var (generated_tensor_0) that doesn't stop gradient can't use inplace strategy. - [Hint: Expected !autograd_meta->StopGradient() && IsLeafTensor(target) == false, but received !autograd_meta->StopGradient() && IsLeafTensor(target):1 != false:0.] (at ..\paddle\fluid\eager\utils.cc:233) -``` - -要在PaddlePaddle中正确使用原地操作且仍然可以计算梯度,可以通过非叶子节点进行。这通常意味着在原地操作前应该有其他操作产生一个非叶子节点。下面是一个修改后的示例,展示如何正确地进行这种操作: - -```python -import paddle - -# 启用动态图模式 -paddle.set_device('cpu') # 可以选择'gpu'如果你的系统支持 -paddle.disable_static() - -# 创建一个可计算梯度的张量 -x = paddle.to_tensor([1.0, 2.0, 3.0], stop_gradient=False) - -# 首先进行非原地的操作,生成非叶子节点 -y = paddle.sin(x) - -# 现在对y进行原地操作,例如原地加上一个常数 -y += 1.0 # 原地修改y的值 - -# 输出修改后的y值 -print("In-place modified y:", y.numpy()) - -# 定义一个简单的损失函数,例如y的平方和 -loss = paddle.sum(y**2) - -# 进行反向传播计算梯度 -loss.backward() - -# 输出x的梯度 -print("Gradient of x after backward:", x.grad.numpy()) - -``` - -在这个例子中,我们先对 x 进行了一个非原地的 sin 操作,得到了一个新的张量 y。然后对 y 进行了原地操作,如原地加1。这样,即便进行了原地修改,x 的梯度计算也不会受到影响,因为 y 不是一个叶子节点。 - -这个例子展示了如何在需要计算梯度的场景中安全地使用原地操作。务必注意,在 PaddlePaddle 中,这通常会引发错误,因为框架试图保护梯度计算的完整性:直接在需要梯度的叶子张量上进行原地操作通常是不被允许的,因为这会破坏梯度计算的基础。 - - -### 2. 对后续计算(如求梯度)中仍要需要用到的值,不能使用 Inplace 操作。 - -在反向传播(求梯度阶段)过程中,如果需要使用某个张量的值,那么对这个张量进行 Inplace 操作会破坏需要用于梯度计算的原始数据。此情况包含上一情况。 - - -```python -import paddle - -# 启用动态图模式 -paddle.disable_static() - -# 创建一个可训练的参数张量 -x = paddle.to_tensor(3.0, stop_gradient=False) - -# 对x进行操作生成y -y = x ** 2 - -x[0] = 4.0 # 这里我们模拟一个原地操作的效果 - -# 进行反向传播 -y.backward() - -# 查看x的梯度 -print(x.grad) - -``` - -上述代码在执行 x[0] = 4.0 时会抛出如下错误: - -```python -ValueError: (InvalidArgument) Leaf Tensor (generated_tensor_0) that doesn't stop gradient can't use inplace strategy. - [Hint: Expected egr::EagerUtils::IsLeafTensor(tensor) && !egr::EagerUtils::autograd_meta(&tensor)->StopGradient() == false, but received egr::EagerUtils::IsLeafTensor(tensor) && !egr::EagerUtils::autograd_meta(&tensor)->StopGradient():1 != false:0.] (at ..\paddle\fluid\pybind\eager_method.cc:1586) -``` - - -### 3. PaddlePaddle保护梯度计算过程 - -求梯度依赖前向输入的的场景是可以进行inplace操作的,例如sin_(x)这种, 反向虽然仍然需要x,但是paddle做了特殊处理,可以保证反向梯度计算是正确的。 - -```python -# 导入paddle模块 -import paddle - -# 设置PaddlePaddle的运行设备为CPU,可以通过更改参数设置为'gpu'来使用GPU(如果系统支持) -paddle.set_device('cpu') - -# 关闭PaddlePaddle的静态图模式,启用动态图模式以便更灵活地处理数据 -paddle.disable_static() - -# 创建一个维度为[3, 4]的张量,其元素随机初始化,并设置为可进行梯度计算 -a = paddle.randn([3, 4]) -a.stop_gradient = False - -# 计算张量a中每个元素的正弦值,并将结果存储在新的变量x中 -x = paddle.sin(a) - -# 输出计算正弦值后的张量x -print("x after sin operation:", x.numpy()) - -# 对x应用原地正弦操作,更新x的数据,并将结果引用赋给y -y = x.sin_() - -# 输出进行原地操作后的x和y的值,由于是原地操作,x和y引用相同的数据 -print("In-place modified x:", x.numpy()) -print("y:", y.numpy()) -print(y is x) # 输出True,验证y和x是否指向相同的内存地址 - -# 对x进行反向传播,计算关于a的梯度 -y.backward() - -# 输出张量a的梯度 -print("Gradient of a after backward:", a.grad) - -``` - - -```python -x after sin operation: [[-0.9797215 -0.62150306 0.150662 0.907488 ] - [-0.9947523 -0.59465826 -0.73188174 -0.98445815] - [-0.78979075 -0.38565105 0.96159416 0.9507534 ]] -In-place modified x: [[-0.8303422 -0.5822578 0.15009268 0.7879595 ] - [-0.83862406 -0.5602257 -0.66827065 -0.8329724 ] - [-0.710206 -0.37616244 0.82010484 0.8138535 ]] -y: [[-0.8303422 -0.5822578 0.15009268 0.7879595 ] - [-0.83862406 -0.5602257 -0.66827065 -0.8329724 ] - [-0.710206 -0.37616244 0.82010484 0.8138535 ]] -True -Gradient of a after backward: Tensor(shape=[3, 4], dtype=float32, place=Place(cpu), stop_gradient=False, - [[-0.11165375, 0.63691705, 0.97738659, 0.25865343], - [ 0.05573082, 0.66596758, 0.50692940, 0.09717280], - [-0.43181324, 0.85487992, 0.15705840, 0.18010177]]) -``` - -实际上,是否可以进行 inplace 操作(即原地修改数据)并且还能正确地进行梯度计算,取决于特定操作和深度学习框架的内部机制。 - -对于 PaddlePaddle 来说,像 `sin_()` 这样的 inplace 操作在某些情况下确实能正确计算梯度,这是因为 PaddlePaddle 在执行反向传播时,对于一些特定的函数,框架有能力保存必要的中间状态或者已经实现了一些策略来正确地处理这些情况。这意味着,对于这些特定操作,PaddlePaddle 确实进行了某种形式的特殊处理,允许在不损失梯度计算正确性的前提下进行原地修改。 - -然而,这种特殊处理并不是所有操作都有的,而且具体实现可能因框架版本和具体操作而异。在很多情况下,原地操作可能会导致计算梯度时遇到问题,特别是如果该操作需要依赖原始值来计算梯度时。如果在反向传播之前修改了涉及梯度计算的变量,那么可能会因为丢失了原始数据而导致梯度计算错误。 - -因此,通常建议在深度学习编程中谨慎使用 inplace 操作,除非你确信这样做不会影响梯度的计算,或者框架文档明确指出可以安全进行此类操作。如果不确定,最安全的做法是使用非 inplace 的版本,例如使用 `sin()` 替代 `sin_()`,以避免可能的问题。在实际应用中,最好是查阅最新的框架文档或进行一些实验来验证操作的效果。 - - -# 小结 - -PaddlePaddle 的自动依赖检测机制,在实践中,如果尝试执行这些会影响梯度计算的 Inplace 操作,会被识别为潜在的风险,因此会抛出一个错误,阻止操作的执行,以保护梯度信息不被破坏,确保模型训练的准确性和稳定性。 - -- **自动依赖检测机制**:PaddlePaddle 的自动依赖检测可以在运行时自动分析变量之间的依赖关系,确保任何可能影响梯度计算正确性的 Inplace 操作都不会被执行。 -- **保护梯度计算**:通过阻止可能破坏梯度信息的操作,PaddlePaddle 确保了模型训练的稳定性和可靠性,避免了难以追踪的梯度相关错误。 -- **错误消息**:当检测到潜在的风险操作时,PaddlePaddle 会抛出一个明确的错误消息,指导开发者如何避免此类问题,从而提升开发效率和模型的可维护性。 - -这种机制使得 PaddlePaddle 在保证效率优化的同时,也极大地提升了模型训练过程中的安全性和稳定性。 - -开发者在使用 Inplace 操作时,还是尽量应当谨慎,并确保这些操作不会影响到梯度计算。 - -PaddlePaddle的Inplace机制是一个强大的工具,可以帮助开发者有效地管理内存,提高程序运行效率。通过本指南的介绍和示例代码,希望可以帮助您更好地理解和使用这一机制。在实际应用中,合理利用Inplace操作可以使模型训练过程更加高效和节省资源。 - -# 参考文献 -1. [paddle-APl文档-PaddlePaddle深度学习平台](https://www.paddlepaddle.org.cn/documentation/docs/zh/api/paddle/Overview_cn.html#tensor-inplace) -2. [Inplace 介绍 & 使用介绍](https://github.com/PaddlePaddle/community/blob/master/pfcc/paddle-code-reading/Inplace/inplace_introduction.md) - From 9b2cada7ddbfe0a42d557a8c520236a3b7d1155e Mon Sep 17 00:00:00 2001 From: lightrain-a <164860023+lightrain-a@users.noreply.github.com> Date: Fri, 26 Apr 2024 15:20:30 +0800 Subject: [PATCH 05/13] Add files via upload --- ...46\344\271\240\345\277\203\345\276\227.md" | 499 ++++++++++++++++++ 1 file changed, 499 insertions(+) create mode 100644 "rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" diff --git "a/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" "b/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" new file mode 100644 index 000000000..6c545149a --- /dev/null +++ "b/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" @@ -0,0 +1,499 @@ +# 【Paddle】稀疏计算的使用指南&学习心得 +## 引言 +在现代计算框架中,为了高效地处理和存储大规模的数据集,尤其是在这些数据集中存在大量零值的情况下,采用稀疏数据结构变得尤为重要。PaddlePaddle,作为一个领先的深度学习平台,提供了强大的稀疏计算能力,支持从基本的稀疏张量操作到构建复杂的稀疏神经网络。这些工具主要通过 `paddle.sparse` 命名空间来实现,使得开发者能够高效地处理大量包含零值的数据集,从而优化内存使用和计算速度。 + +本文将详细介绍如何在 PaddlePaddle 中利用稀疏计算,包括稀疏数据格式的基础知识、如何创建和操作稀疏张量,以及如何开发和训练稀疏神经网络模型,特别是如何实现和应用稀疏 ResNet。通过这些知识,我们可以更有效地利用计算资源,加速模型训练过程,同时提高模型处理大规模稀疏数据的能力。 + +# 一、稀疏格式简介 + +稀疏格式是一种特殊的数据存储方式,旨在有效存储和处理其中大部分元素为零的矩阵或张量。这种方法可以显著减少存储空间的需求,并提高数据处理的效率。常见的稀疏格式包括 COO(坐标列表格式)、CSR(压缩稀疏行格式)等。 + +## 1. COO(Coordinate Format) +在 COO 格式中,只记录非零元素的位置和值。这种格式由三个主要组件组成:`indices`、`values` 和 `shape`。`indices` 是一个二维数组,其中的每一列代表一个非零元素的坐标;`values` 存储对应的非零元素值;`shape` 则描述了张量的维度。 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/20a1ea94840d4741997b241ee6f89948.png) + + +## 2. CSR(Compressed Sparse Row Format) +CSR 格式是一种更为紧凑的稀疏表示,专为快速的行访问和矩阵乘法运算优化。在 CSR 中,通过三个数组 `crows`、`cols` 和 `values` 来表示稀疏矩阵。`crows` 存储每一行第一个非零元素的索引,`cols` 存储非零元素的列索引,而 `values` 则直接存储这些非零元素的值。 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c5b958755ace496d95409f2ec00eb3ae.png) + + +# 二、Paddle稀疏张量支持 + + +PaddlePaddle 支持多种类型的稀疏张量,主要包括: + +1. **COO格式(Coordinate List)**: + - 这是一种常用的稀疏表示格式,其中非零元素通过其坐标列表进行存储。 + - 使用 `paddle.sparse.sparse_coo_tensor(indices, values, shape)` 可以创建 COO 格式的稀疏张量,其中 `indices` 是一个二维整数张量,指示非零元素的坐标;`values` 是一个张量,包含与 `indices` 对应的值;`shape` 是一个定义张量形状的整数列表或张量。 + +2. **转换功能**: + - 稀疏张量可以转换为密集张量,反之亦然。使用 `to_dense()` 方法可以将稀疏张量转换为标准的密集张量;使用 `to_sparse_coo()` 方法可以将密集张量转换为 COO 格式的稀疏张量。 + + + +PaddlePaddle 提供了完整的支持来创建和操作 COO 和 CSR 格式的稀疏张量。以下是使用 PaddlePaddle 创建和操作这些张量的具体方法。 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6a79578e9fbb4f98b5cc4e83cac580ff.png) + + + +## 1. 创建 COO 格式的 SparseTensor + +PaddlePaddle 使用 `sparse_coo_tensor` 函数来创建 COO 格式的稀疏张量。这个函数需要 `indices`、`values` 以及可选的 `shape` 参数来指定张量的形状。 + + +示例代码: + +```python +import paddle + +indices = [[0, 1, 2], [1, 2, 0]] +values = [1.0, 2.0, 3.0] +dense_shape = [3, 3] +coo = paddle.sparse.sparse_coo_tensor(indices, values, dense_shape) +print(coo) +``` + +## 2. 创建 CSR 格式的 SparseTensor + +为了创建 CSR 格式的稀疏张量,PaddlePaddle 提供了 `sparse_csr_tensor` 函数。此函数接受 `crows`、`cols`、`values` 和 `shape` 作为参数,以定义稀疏张量的结构。 + +示例代码: + +```python +import paddle + +crows = [0, 2, 3, 5] +cols = [1, 3, 2, 0, 1] +values = [1, 2, 3, 4, 5] +dense_shape = [3, 4] +csr = paddle.sparse.sparse_csr_tensor(crows, cols, values, dense_shape) +print(csr) +``` + +## 3. 创建稀疏张量的相关参数详解 +在 PaddlePaddle 的稀疏张量创建API中,参数的设计允许用户灵活地定义和操作稀疏数据结构。对于两种类型的稀疏张量创建函数,参数主要涉及初始化数据的类型和结构,其中: + +### 共通参数 + +对于 `sparse_coo_tensor` 和 `sparse_csr_tensor` 函数,存在一些共通的参数,这些参数允许用户指定如何构建和处理稀疏张量: + +1. **indices, crows, cols (list|tuple|ndarray|Tensor)**: + - 对于 COO 格式,`indices` 参数是一个二维数组,每列代表一个非零元素的坐标。 + - 对于 CSR 格式,`crows` 和 `cols` 分别表示行索引的开始和非零元素的列索引。 + - 这些参数可以是 Python 的 list 或 tuple,也可以是 NumPy ndarray 或 Paddle Tensor。 + +2. **values (list|tuple|ndarray|Tensor)**: + - 表示非零元素的实际数值。 + - 类似于索引参数,这可以是 list、tuple、NumPy ndarray 或 Paddle Tensor。 + +3. **shape (list|tuple, 可选)**: + - 定义稀疏张量的形状,如果未提供,则会根据 indices 或 crows 和 cols 的最大值自动推断。 + - 必须是一个整数列表或元组,指定张量在每个维度的大小。 + +4. **dtype (str|np.dtype, 可选)**: + - 指定张量元素的数据类型,如 'float32', 'int64' 等。 + - 如果未指定,则从 `values` 的数据类型自动推断。 + +5. **place (CPUPlace|CUDAPinnedPlace|CUDAPlace|str, 可选)**: + - 决定张量的存储设备,例如 CPU 或 GPU。 + - 如果未指定,则使用当前环境的默认设备。 + +6. **stop_gradient (bool, 可选)**: + - 指示是否对该张量进行梯度计算。 + - 在大多数深度学习应用中,非模型权重的张量通常设置为 `True` 以提高计算效率。 + +### 特定于格式的参数细节 + +除了上述共通参数外,COO 和 CSR 格式因其数据结构的不同而在参数应用上有所区别。 + +**COO 格式** +- `indices` 用于直接指定每个非零元素的多维坐标。 +- 主要用于数据的随机访问和转换操作,适用于那些非零元素分布相对均匀的场景。 + +**CSR 格式** +- `crows` 表示每一行的起始非零元素索引,而 `cols` 存储这些非零元素的列索引。 +- CSR 格式优化了行的连续访问,非常适合矩阵乘法和其他行优先操作。 + +--- + +通过这些参数的灵活使用,PaddlePaddle 允许开发者以高效且灵活的方式处理大规模稀疏数据集,从而在保持性能的同时减少内存消耗。 + + +## 4. 稀疏与稠密 Tensor 互转 + +PaddlePaddle 提供了一套简单易用的接口,使得稀疏张量的使用与传统的稠密张量操作体验高度一致,从而降低了学习成本并便于开发者快速上手。这种设计允许在同一个模型中灵活地使用稠密和稀疏数据结构,而且可以无缝地在它们之间转换,这对于处理大规模数据集尤其重要,例如在深度学习、图像处理和自然语言处理等领域。 + +PaddlePaddle 支持通过几个简单的 API,如 `Tensor.to_dense()`, `Tensor.to_sparse_coo()`, 和 `Tensor.to_sparse_csr()` 来实现稀疏与稠密之间的转换,这些操作保证了数据处理的灵活性和效率。 + +![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/533b7f3ce74845b5ad1c57dd44280d0a.png) + +代码示例:稠密到稀疏的转换 + +```python +import paddle + +# 创建一个稠密的 Tensor +dense = paddle.to_tensor([[0, 1, 0, 2], + [0, 0, 3, 4]], dtype='float32') + +# 将稠密 Tensor 转换为 COO 格式的稀疏 Tensor +coo = dense.to_sparse_coo(sparse_dim=2) +print(coo) +# 输出: +# Tensor(shape=[2, 4], dtype=paddle.float32, place=Place(gpu:0), stop_gradient=True, +# indices=[[0, 0, 1, 1], +# [1, 3, 2, 3]], +# values=[1., 2., 3., 4.]) + +# 将稠密 Tensor 转换为 CSR 格式的稀疏 Tensor +csr = dense.to_sparse_csr() +print(csr) +# 输出: +# Tensor(shape=[2, 4], dtype=paddle.float32, place=Place(gpu:0), stop_gradient=True, +# crows=[0, 2, 4], +# cols=[1, 3, 2, 3], +# values=[1., 2., 3., 4.]) +``` + +这些转换非常直观,仅需要简单的一步操作就可以完成,使得稀疏和稠密格式之间的交互变得无缝而高效。 + +# 三、Paddle稀疏神经网络层支持 + +## 1. 稀疏神经网络层 + +PaddlePaddle 在 `paddle.sparse.nn` 模块中提供了专门针对稀疏数据设计的神经网络层,这些层包括: + +1. **稀疏卷积层**: + - `SubmConv3D`: 用于处理3D数据的稀疏子矩阵卷积层。它可以在3D体积数据中有效地进行卷积操作,而不需要将整个数据转换为密集格式。 + - 这些层专为稀疏数据优化,减少了对零值的计算和存储,从而提高了性能和效率。 + +2. **批归一化层**: + - `BatchNorm3D`: 用于3D数据的批归一化层,支持与稀疏卷积层配合使用。 + +3. **激活函数**: + - 如 `ReLU`,支持在稀疏数据路径中使用,与常规的激活函数使用方法相同。 + +下面以稀疏 ResNet为例,说明Paddle对稀疏神经网络层的支持。 +## 2. 为什么要使用稀疏 ResNet + +在处理点云数据、图像识别或自然语言处理任务时,输入数据通常具有很高的维度和稀疏性。例如,3D点云数据往往是非结构化的,大部分体积内没有有效信息(即大部分体积是空的)。使用传统的密集(dense)卷积网络处理这类数据会带来两个主要问题: +1. **效率低下**:对于大量的空白区域依然进行计算,消耗计算资源。 +2. **存储浪费**:需要为大量的零值分配存储资源。 + +稀疏 ResNet 解决了这些问题,通过仅在非零数据点上进行操作,从而大幅提高了计算和存储效率。 + +## 3. 如何创建Paddle的稀疏 ResNet + +在 PaddlePaddle 中,稀疏 ResNet 可以通过 `paddle.sparse` 模块中的稀疏卷积层(如 `SubmConv3D`)来实现。这些层专门设计用来处理稀疏数据。稀疏卷积层接受包含非零元素坐标和值的稀疏张量,并只在这些非零元素上执行卷积运算。通过构建包含这些稀疏卷积层的网络(如 ResNet 结构中的基础块),可以高效处理稀疏数据。 + +创建稀疏 ResNet 主要涉及以下几个步骤: +1. 创建稀疏张量:首先需要从稀疏数据(即大部分值为零的数据)中创建稀疏张量。这通常涉及指定非零数据点的坐标和相应的值。 +2. 定义稀疏网络结构:设计一个网络结构,它应该包含适用于处理稀疏数据的特殊卷积层(如 Paddle 的 SubmConv3D)。这些层特别优化了内存和计算资源,只在数据非零的地方进行计算。 +3. 前向传播:将稀疏张量输入到网络中,执行前向传播,网络会在内部处理稀疏数据,并输出结果。 +4. 训练和评估:就像使用常规神经网络一样,定义损失函数和优化器,然后在训练数据上训练网络,最后在验证数据上评估网络的性能。 +## 4. 稀疏 ResNet的关键组件 +PaddlePaddle 的稀疏模块 `paddle.sparse` 提供了对稀疏数据操作的支持,这包括稀疏张量的创建、转换和计算功能。对于深度学习模型,尤其是在需要处理大量稀疏数据的应用场景(如点云处理、文本数据和推荐系统)中,使用稀疏技术可以显著提升计算效率和资源使用效率。 + +1. **稀疏张量(Sparse Tensor)**: + - 稀疏张量是一种特殊的数据结构,主要用于有效存储和处理大部分元素为零的数据。 + - 在 PaddlePaddle 中,可以使用 `paddle.sparse.sparse_coo_tensor` 来创建稀疏张量,这需要提供非零元素的坐标和值。 + +2. **稀疏卷积(Sparse Convolution)**: + - 与常规卷积操作不同,稀疏卷积专门针对稀疏数据进行优化。 + - PaddlePaddle 提供 `SubMConv` 类进行稀疏卷积,该类支持包括3D在内的多种稀疏卷积操作。可以使用如 `sparse_nn.SubmConv3D` 这样的层来实现稀疏卷积层。 + +3. **构建稀疏 ResNet 模型**: + - 基于 PaddlePaddle 的稀疏模块,可以创建类似于常规 ResNet 的模型架构,但使用的是稀疏卷积层替换传统的密集卷积层。 + - 每个稀疏卷积层后通常跟随一个批归一化层和ReLU激活函数,形成一个基础的稀疏残差块。 + + +在 PaddlePaddle 中,稀疏 ResNet 的实现和使用与传统的稠密网络相似,这得益于 PaddlePaddle 稀疏模块的设计,使得调用体验与稠密高度一致,非常容易上手。通过利用稀疏技术,可以有效处理大规模稀疏数据集,提高计算效率和降低存储需求,这在处理现代大数据应用时显得尤为重要。 + +## 5. 示例代码 + + +```python +import paddle +from paddle import sparse +from paddle.sparse import nn as sparse_nn + +# 定义3D稀疏卷积块 +def sparse_conv_block(in_channels, out_channels, stride=1, padding=1, key=None): + block = paddle.nn.Sequential( + sparse_nn.SubmConv3D(in_channels, out_channels, kernel_size=3, stride=stride, padding=padding, bias_attr=False, key=key), + sparse_nn.BatchNorm3D(out_channels), + sparse_nn.ReLU() + ) + return block + +# 定义一个简单的稀疏3D ResNet模型 +class SparseResNet(paddle.nn.Layer): + def __init__(self, in_channels): + super(SparseResNet, self).__init__() + self.layer1 = sparse_conv_block(in_channels, 16, key='layer1') + self.layer2 = sparse_conv_block(16, 32, stride=2, key='layer2') + self.layer3 = sparse_conv_block(32, 64, stride=2, key='layer3') + + def forward(self, x): + x = self.layer1(x) + x = self.layer2(x) + x = self.layer3(x) + return x + +# 假设输入数据 +batch_size = 1 +channels = 1 +depth = 100 +height = 100 +width = 100 + +# 创建稀疏张量的坐标和值 +coords = paddle.to_tensor([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 1, 2, 1, 1], [0, 2, 2, 1, 2], [0, 1, 2, 2, 0]], dtype='int64') # 5D坐标 (batch, channel, depth, height, width) +values = paddle.to_tensor([1.0, 1.5, 2.0, 3.0, 3.5], dtype='float32') # 每个值对应一个坐标 +shape = paddle.to_tensor([batch_size, channels, depth, height, width], dtype='int64') # 5D形状 + +# 创建稀疏张量 +x = sparse.sparse_coo_tensor(coords, values, shape) + +# 实例化模型 +model + +``` +输出: + +![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/9b6669da0c6f4a28bd3b7f768c62edf8.png) + + +```python +SparseResNet( + (layer1): Sequential( + (0): SubmConv3D(3, 16, kernel_size=[3, 3, 3], padding=1, data_format=NDHWC) + (1): BatchNorm(num_features=16, momentum=0.9, epsilon=1e-05, data_format=NDHWC) + (2): ReLU() + (3): SubmConv3D(16, 16, kernel_size=[3, 3, 3], padding=1, data_format=NDHWC) + (4): BatchNorm(num_features=16, momentum=0.9, epsilon=1e-05, data_format=NDHWC) + (5): ReLU() + ) + (layer2): Sequential( + (0): SubmConv3D(16, 32, kernel_size=[3, 3, 3], stride=[2, 2, 2], padding=1, data_format=NDHWC) + (1): BatchNorm(num_features=32, momentum=0.9, epsilon=1e-05, data_format=NDHWC) + (2): ReLU() + (3): SubmConv3D(32, 32, kernel_size=[3, 3, 3], padding=1, data_format=NDHWC) + (4): BatchNorm(num_features=32, momentum=0.9, epsilon=1e-05, data_format=NDHWC) + (5): ReLU() + ) + (layer3): Sequential( + (0): SubmConv3D(32, 64, kernel_size=[3, 3, 3], stride=[2, 2, 2], padding=1, data_format=NDHWC) + (1): BatchNorm(num_features=64, momentum=0.9, epsilon=1e-05, data_format=NDHWC) + (2): ReLU() + (3): SubmConv3D(64, 64, kernel_size=[3, 3, 3], padding=1, data_format=NDHWC) + (4): BatchNorm(num_features=64, momentum=0.9, epsilon=1e-05, data_format=NDHWC) + (5): ReLU() + ) +) +``` + +# 四、Paddle 的稀疏调用体验与稠密的一致性 + +PaddlePaddle 的设计目标之一是提供一致的用户体验,无论是处理稀疏数据还是稠密数据。这意味着即便是在处理包含大量零值的数据集时,开发者也可以利用熟悉的接口和模式来构建和训练模型。 + +## 1. API设计的一致性 + +PaddlePaddle 的稀疏模块提供了与常规稠密操作相似的API接口,使得开发者无需学习新的API就能处理稀疏数据。例如: + +- **稀疏卷积层**:稀疏模块中的 `SubmConv3D` 直接对应于常规卷积操作中的 `Conv3D`。它们的参数非常相似,如 `in_channels`, `out_channels`, `stride`, `padding` 等。 +- **批归一化和激活函数**:稀疏模块同样提供了批归一化和激活函数,如 `BatchNorm3D` 和 `ReLU`,其用法与常规模块中的相同。 + +## 2. 集成度:训练和推理的处理流程 + +无论是稀疏还是稠密模型,PaddlePaddle 中的训练和推理流程保持一致。稀疏操作可以与PaddlePaddle的其他特性(如自动微分和优化器)无缝集成,使得构建和训练稀疏模型与常规模型几乎无异。 + +1. **定义模型**:无论选择稀疏还是稠密模型,模型定义的方式都是相似的,使用 `paddle.nn.Layer` 类来构建网络层。 +2. **编译模型**:使用 `paddle.Model` 对象来包装定义好的网络,然后编译,包括设置优化器、损失函数和评估指标。 +3. **训练和评估**:通过调用 `.fit` 和 `.evaluate` 方法来进行训练和评估,这与处理稠密数据的流程完全一致。 + + + +# 五、Paddle3D应用实例解读:稀疏 ResNet + +代码来源:[Paddle3D的sparse_resnet.py](https://github.com/PaddlePaddle/Paddle3D/blob/develop/paddle3d/models/middle_encoders/sparse_resnet.py) + +## 代码注释 + +这段代码定义了一个基于 PaddlePaddle 的稀疏3D残差网络(SparseResNet3D),主要用于处理3D点云数据,如自动驾驶系统中的激光雷达扫描数据。它通过稀疏卷积层对体素化(voxelized)的点云数据进行特征提取和处理。 + +> """该符号内代码注释为新增""" +### 导入所需库和模块 + +```python +import numpy as np +import paddle +from paddle import sparse +from paddle.sparse import nn +from paddle3d.apis import manager +from paddle3d.models.layers import param_init +``` + +这些库包括numpy用于数学运算,paddle及其稀疏模块用于深度学习操作,以及paddle3d的API和模型层初始化。 + +### 定义卷积函数 + +```python +def conv3x3(in_out_channels, out_out_channels, stride=1, indice_key=None, bias_attr=True): + """3x3 convolution with padding, specifically for SubM sparse 3D convolution.""" + return nn.SubmConv3D( + in_out_channels, out_out_channels, kernel_size=3, stride=stride, padding=1, bias_attr=bias_attr, key=indice_key) + +def conv1x1(in_out_channels, out_out_channels, stride=1, indice_key=None, bias_attr=True): + """1x1 convolution, also for SubM sparse 3D convolution.""" + return nn.SubmConv3D( + in_out_channels, out_out_channels, kernel_size=1, stride=stride, padding=1, bias_attr=bias_attr, key=indice_key) +``` + +`conv3x3` 和 `conv1x1` 是用于创建3D稀疏卷积层的帮助函数,它们使用了PaddlePaddle的`SubmConv3D`,这是一种专门处理稀疏数据的3D卷积。 + +### 定义稀疏基础块类 + +```python +class SparseBasicBlock(paddle.nn.Layer): + """ A basic building block for constructing sparse 3D ResNet with two convolutional layers.""" + + expansion = 1 + + def __init__(self, in_channels, out_channels, stride=1, downsample=None, indice_key=None): + super(SparseBasicBlock, self).__init__() + + self.conv1 = conv3x3(in_channels, out_channels, stride, indice_key, True) + self.bn1 = nn.BatchNorm(out_channels, epsilon=1e-3, momentum=0.01) + self.relu = nn.ReLU() + self.conv2 = conv3x3(out_channels, out_channels, indice_key=indice_key, bias_attr=True) + self.bn2 = nn.BatchNorm(out_channels, epsilon=1e-3, momentum=0.01) + self.downsample = downsample + self.stride = stride + + def forward(self, x): + identity = x + + out = self.conv1(x) + out = self.bn1(out) + out = self.relu(out) + out = self.conv2(out) + out = self.bn2(out) + + if self.downsample is not None: + identity = self.downsample(x) + + out = sparse.add(out, identity) + out = self.relu(out) + return out +``` + +`SparseBasicBlock`是SparseResNet3D的核心模块,包括两个稀疏卷积层、批归一化和ReLU激活函数,以及可选的下采样,用于残差连接。 + +### 定义SparseResNet3D网络 + +```python +@manager.MIDDLE_ENCODERS.add_component +class SparseResNet3D(paddle.nn.Layer): + """ The main Sparse 3D ResNet class, designed for processing voxelized point cloud data.""" + + def __init__(self, in_channels, voxel_size, point_cloud_range): + super(SparseResNet3D, self).__init__() + + # Initial conv layer + self.conv_input = paddle.nn.Sequential( + nn.SubmConv3D(in_channels, 16, 3, bias_attr=False, key='res0'), + nn.BatchNorm(16), nn.ReLU()) + + # Subsequent layers with increasing channel depth and decreasing spatial dimensions + self.conv1 = paddle.nn.Sequential( + SparseBasicBlock(16, 16, indice_key='res0'), + SparseBasicBlock(16, 16, indice_key='res0'),) + + self.conv2 = paddle.nn.Sequential( + nn.Conv3D(16, 32, 3, 2, padding=1, bias_attr=False), # downsample + nn.BatchNorm(32), nn.ReLU(), + SparseBasicBlock(32, 32, indice_key='res1'), + SparseBasicBlock(32, 32, indice_key='res1'),) + + self.conv3 = paddle.nn.Sequential( + nn.Conv3D(32, 64, 3, 2, padding=1, bias_attr=False), # downsample + nn.BatchNorm(64), nn.ReLU(), + SparseBasicBlock(64, 64, indice_key='res2'), + SparseBasicBlock(64, 64, indice_key='res2'),) + + self.conv4 = paddle.nn.Sequential( + nn.Conv3D(64, 128, 3, 2, padding=[0, 1, 1], bias_attr=False), # downsample + nn.BatchNorm(128), nn.ReLU(), + SparseBasicBlock(128, 128, indice_key='res3'), + SparseBasicBlock(128, 128, indice_key='res3'),) + + # Extra conv layer to further process features + self.extra_conv = paddle.nn.Sequential( + nn.Conv3D(128, 128, (3, 1, 1), (2, 1, 1), bias_attr=False), # Adjust the spatial dimensions + nn.BatchNorm(128), nn.ReLU(),) + + # Calculate the grid size for the 3D data based on the provided voxel size and point cloud range + point_cloud_range = np.array(point_cloud_range, dtype=np.float32) + voxel_size = np.array(voxel_size, dtype=np.float32) + grid_size = (point_cloud_range[3:] - point_cloud_range[:3]) / voxel_size + grid_size = np.round(grid_size).astype(np.int64) + self.sparse_shape = np.array(grid_size[::-1]) + [1, 0, 0] + self.in_channels = in_channels + self.init_weight() + + def init_weight(self): + """ Initialize weights for convolutional layers and batch normalization layers.""" + for layer in self.sublayers(): + if isinstance(layer, (nn.Conv3D, nn.SubmConv3D)): + param_init.reset_parameters(layer) + if isinstance(layer, nn.BatchNorm): + param_init.constant_init(layer.weight, value=1) + param_init.constant_init(layer.bias, value=0) + + def forward(self, voxel_features, coors, batch_size): + """ The forward pass for processing input voxel features and coordinates.""" + # Setup the sparse tensor with the specified shape and input features + shape = [batch_size] + list(self.sparse_shape) + [self.in_channels] + sp_x = sparse.sparse_coo_tensor( + coors.transpose((1, 0)), + voxel_features, + shape=shape, + stop_gradient=False) + + # Pass the sparse tensor through the sequential layers + x = self.conv_input(sp_x) + x_conv1 = self.conv1(x) + x_conv2 = self.conv2(x_conv1) + x_conv3 = self.conv3(x_conv2) + x_conv4 = self.conv4(x_conv3) + + # Final extra convolutional processing + out = self.extra_conv(x_conv4) + + # Convert the output back to a dense tensor and adjust dimensions for further processing + out = out.to_dense() + out = paddle.transpose(out, perm=[0, 4, 1, 2, 3]) + N, C, D, H, W = out.shape + out = paddle.reshape(out, shape=[N, C * D, H, W]) + return out +``` + +此类中定义了一系列卷积层和残差块,用于逐步处理和提取输入点云数据的特征。网络通过逐层降采样来增加特征深度并减小空间维度,最终输出密集的特征张量,适合后续的处理或学习任务。 + + +# 六、小结 + +PaddlePaddle 不仅支持自定义稀疏神经网络结构,也可以通过提供的API轻松地实现已有的经典结构,如ResNet、VGG等。对于这些经典网络,通过替换标准的卷积层为相应的稀疏卷积层,可以使其适应稀疏数据的处理,从而拓展其应用到新的领域,如3D点云处理。 + +总的来说,PaddlePaddle 在提供稀疏计算支持的同时,确保了开发体验的一致性和直观性,使得开发者可以无缝地在稀疏和稠密数据操作之间切换,同时保证高效的数据处理。 + +# 七、参考文献 +1. [官网paddle.sparse 目录](https://www.paddlepaddle.org.cn/documentation/docs/zh/develop/api/paddle/sparse/Overview_cn.html) +2. [飞桨框架v2.3 API最新升级!对科学计算、概率分布和稀疏Tensor等提供更全面支持!](https://www.paddlepaddle.org.cn/support/news?action=detail&id=2987) + + From 38c56ec52eb650261516feb2e77752e7decb3740 Mon Sep 17 00:00:00 2001 From: lightrain-a <164860023+lightrain-a@users.noreply.github.com> Date: Fri, 10 May 2024 19:23:41 +0800 Subject: [PATCH 06/13] =?UTF-8?q?Update=20=E3=80=90Hackathon=206th=20Artic?= =?UTF-8?q?le=20No.6=E3=80=91=E7=A8=80=E7=96=8FResNet=E7=9A=84=E5=AD=A6?= =?UTF-8?q?=E4=B9=A0=E5=BF=83=E5=BE=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" "b/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" index 6c545149a..2c020bf3b 100644 --- "a/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" +++ "b/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" @@ -11,7 +11,7 @@ ## 1. COO(Coordinate Format) 在 COO 格式中,只记录非零元素的位置和值。这种格式由三个主要组件组成:`indices`、`values` 和 `shape`。`indices` 是一个二维数组,其中的每一列代表一个非零元素的坐标;`values` 存储对应的非零元素值;`shape` 则描述了张量的维度。 -![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/20a1ea94840d4741997b241ee6f89948.png) +![image](https://github.com/lightrain-a/community/assets/164860023/6ea1fbe9-9b9b-4b01-b60d-a474103212db) ## 2. CSR(Compressed Sparse Row Format) @@ -20,6 +20,7 @@ CSR 格式是一种更为紧凑的稀疏表示,专为快速的行访问和矩 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c5b958755ace496d95409f2ec00eb3ae.png) + # 二、Paddle稀疏张量支持 From 39ed97b806723d9af42d1324503da60c2e382e1f Mon Sep 17 00:00:00 2001 From: lightrain-a <164860023+lightrain-a@users.noreply.github.com> Date: Mon, 13 May 2024 15:30:09 +0800 Subject: [PATCH 07/13] =?UTF-8?q?Update=20=E3=80=90Hackathon=206th=20Artic?= =?UTF-8?q?le=20No.6=E3=80=91=E7=A8=80=E7=96=8FResNet=E7=9A=84=E5=AD=A6?= =?UTF-8?q?=E4=B9=A0=E5=BF=83=E5=BE=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...55\246\344\271\240\345\277\203\345\276\227.md" | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git "a/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" "b/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" index 2c020bf3b..f86a67775 100644 --- "a/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" +++ "b/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" @@ -11,13 +11,15 @@ ## 1. COO(Coordinate Format) 在 COO 格式中,只记录非零元素的位置和值。这种格式由三个主要组件组成:`indices`、`values` 和 `shape`。`indices` 是一个二维数组,其中的每一列代表一个非零元素的坐标;`values` 存储对应的非零元素值;`shape` 则描述了张量的维度。 -![image](https://github.com/lightrain-a/community/assets/164860023/6ea1fbe9-9b9b-4b01-b60d-a474103212db) +![image](https://github.com/lightrain-a/community/assets/164860023/ceaf67fc-be65-4ab5-84f9-a7c27cda7f52) + ## 2. CSR(Compressed Sparse Row Format) CSR 格式是一种更为紧凑的稀疏表示,专为快速的行访问和矩阵乘法运算优化。在 CSR 中,通过三个数组 `crows`、`cols` 和 `values` 来表示稀疏矩阵。`crows` 存储每一行第一个非零元素的索引,`cols` 存储非零元素的列索引,而 `values` 则直接存储这些非零元素的值。 -![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/c5b958755ace496d95409f2ec00eb3ae.png) +![image](https://github.com/lightrain-a/community/assets/164860023/1621e8b8-f776-49ba-88e5-be3dd7c8804a) + @@ -37,7 +39,8 @@ PaddlePaddle 支持多种类型的稀疏张量,主要包括: PaddlePaddle 提供了完整的支持来创建和操作 COO 和 CSR 格式的稀疏张量。以下是使用 PaddlePaddle 创建和操作这些张量的具体方法。 -![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/6a79578e9fbb4f98b5cc4e83cac580ff.png) +![image](https://github.com/lightrain-a/community/assets/164860023/d1981488-25c2-45b7-927a-2147f12415d9) + @@ -130,7 +133,8 @@ PaddlePaddle 提供了一套简单易用的接口,使得稀疏张量的使用 PaddlePaddle 支持通过几个简单的 API,如 `Tensor.to_dense()`, `Tensor.to_sparse_coo()`, 和 `Tensor.to_sparse_csr()` 来实现稀疏与稠密之间的转换,这些操作保证了数据处理的灵活性和效率。 -![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/533b7f3ce74845b5ad1c57dd44280d0a.png) +![image](https://github.com/lightrain-a/community/assets/164860023/39d01114-11f3-49d6-affa-0ad716b5c5b5) + 代码示例:稠密到稀疏的转换 @@ -266,7 +270,8 @@ model ``` 输出: -![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/9b6669da0c6f4a28bd3b7f768c62edf8.png) +![image](https://github.com/lightrain-a/community/assets/164860023/b2b9d3e8-b460-4555-b3cd-82a7bd61ef65) + ```python From 57e8a7691abf8f3e8870b1974f8618f6f6d488ca Mon Sep 17 00:00:00 2001 From: lightrain-a <164860023+lightrain-a@users.noreply.github.com> Date: Mon, 13 May 2024 15:45:39 +0800 Subject: [PATCH 08/13] Add files via upload --- rfcs/Article/images/coo.png | Bin 0 -> 171365 bytes rfcs/Article/images/csr.png | Bin 0 -> 125638 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 rfcs/Article/images/coo.png create mode 100644 rfcs/Article/images/csr.png diff --git a/rfcs/Article/images/coo.png b/rfcs/Article/images/coo.png new file mode 100644 index 0000000000000000000000000000000000000000..e687d5df5e08cf8eefa178e03038a34b63628823 GIT binary patch literal 171365 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 O)6p{2EYvu8>AwNYDK_o^ literal 0 HcmV?d00001 diff --git a/rfcs/Article/images/csr.png b/rfcs/Article/images/csr.png new file mode 100644 index 0000000000000000000000000000000000000000..6a62c2885ac19f842297e1bd4e4b85d42bb76f81 GIT binary patch literal 125638 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�J%U2P96OnQ`TmZLgk=%?!{ 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
?13&}BDAA9j8L83v}E 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 literal 0 HcmV?d00001 From f24348320e88357414cd84930bdb5010031d80d9 Mon Sep 17 00:00:00 2001 From: lightrain-a <164860023+lightrain-a@users.noreply.github.com> Date: Mon, 13 May 2024 15:48:09 +0800 Subject: [PATCH 09/13] =?UTF-8?q?Update=20=E3=80=90Hackathon=206th=20Artic?= =?UTF-8?q?le=20No.6=E3=80=91=E7=A8=80=E7=96=8FResNet=E7=9A=84=E5=AD=A6?= =?UTF-8?q?=E4=B9=A0=E5=BF=83=E5=BE=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4\345\255\246\344\271\240\345\277\203\345\276\227.md" | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git "a/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" "b/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" index f86a67775..3f28be106 100644 --- "a/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" +++ "b/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" @@ -11,14 +11,14 @@ ## 1. COO(Coordinate Format) 在 COO 格式中,只记录非零元素的位置和值。这种格式由三个主要组件组成:`indices`、`values` 和 `shape`。`indices` 是一个二维数组,其中的每一列代表一个非零元素的坐标;`values` 存储对应的非零元素值;`shape` 则描述了张量的维度。 -![image](https://github.com/lightrain-a/community/assets/164860023/ceaf67fc-be65-4ab5-84f9-a7c27cda7f52) +![image](https://github.com/lightrain-a/community/blob/resnet/rfcs/Article/images/coo.png) ## 2. CSR(Compressed Sparse Row Format) CSR 格式是一种更为紧凑的稀疏表示,专为快速的行访问和矩阵乘法运算优化。在 CSR 中,通过三个数组 `crows`、`cols` 和 `values` 来表示稀疏矩阵。`crows` 存储每一行第一个非零元素的索引,`cols` 存储非零元素的列索引,而 `values` 则直接存储这些非零元素的值。 -![image](https://github.com/lightrain-a/community/assets/164860023/1621e8b8-f776-49ba-88e5-be3dd7c8804a) +![image](https://github.com/lightrain-a/community/blob/resnet/rfcs/Article/images/csr.png) @@ -39,7 +39,7 @@ PaddlePaddle 支持多种类型的稀疏张量,主要包括: PaddlePaddle 提供了完整的支持来创建和操作 COO 和 CSR 格式的稀疏张量。以下是使用 PaddlePaddle 创建和操作这些张量的具体方法。 -![image](https://github.com/lightrain-a/community/assets/164860023/d1981488-25c2-45b7-927a-2147f12415d9) + @@ -133,7 +133,6 @@ PaddlePaddle 提供了一套简单易用的接口,使得稀疏张量的使用 PaddlePaddle 支持通过几个简单的 API,如 `Tensor.to_dense()`, `Tensor.to_sparse_coo()`, 和 `Tensor.to_sparse_csr()` 来实现稀疏与稠密之间的转换,这些操作保证了数据处理的灵活性和效率。 -![image](https://github.com/lightrain-a/community/assets/164860023/39d01114-11f3-49d6-affa-0ad716b5c5b5) 代码示例:稠密到稀疏的转换 @@ -270,8 +269,6 @@ model ``` 输出: -![image](https://github.com/lightrain-a/community/assets/164860023/b2b9d3e8-b460-4555-b3cd-82a7bd61ef65) - ```python From 13159911f7da3866bd36508ff77f881e88813c1a Mon Sep 17 00:00:00 2001 From: lightrain-a <164860023+lightrain-a@users.noreply.github.com> Date: Mon, 13 May 2024 16:11:47 +0800 Subject: [PATCH 10/13] =?UTF-8?q?Update=20=E3=80=90Hackathon=206th=20Artic?= =?UTF-8?q?le=20No.6=E3=80=91=E7=A8=80=E7=96=8FResNet=E7=9A=84=E5=AD=A6?= =?UTF-8?q?=E4=B9=A0=E5=BF=83=E5=BE=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\344\271\240\345\277\203\345\276\227.md" | 82 +++++++++++++++---- 1 file changed, 66 insertions(+), 16 deletions(-) diff --git "a/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" "b/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" index 3f28be106..4937d097f 100644 --- "a/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" +++ "b/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" @@ -31,22 +31,37 @@ PaddlePaddle 支持多种类型的稀疏张量,主要包括: 1. **COO格式(Coordinate List)**: - 这是一种常用的稀疏表示格式,其中非零元素通过其坐标列表进行存储。 - 使用 `paddle.sparse.sparse_coo_tensor(indices, values, shape)` 可以创建 COO 格式的稀疏张量,其中 `indices` 是一个二维整数张量,指示非零元素的坐标;`values` 是一个张量,包含与 `indices` 对应的值;`shape` 是一个定义张量形状的整数列表或张量。 + +2. **CSR格式(Compressed Sparse Row)**: + - 这是另一种常用的稀疏表示格式,主要用于优化行访问的性能,其中非零元素通过行的压缩方式进行存储。 + - 使用 `paddle.sparse.sparse_csr_tensor(crow_indices, col_indices, values, shape)` 可以创建 CSR 格式的稀疏张量,其中 `crow_indices` 是一个一维整数张量,指示每一行的起始非零元素在 `values` 中的位置;`col_indices` 是一个一维整数张量,指示每个非零元素的列索引;`values` 是一个张量,包含所有非零元素的值;`shape` 是一个定义张量形状的整数列表或张量。 -2. **转换功能**: - - 稀疏张量可以转换为密集张量,反之亦然。使用 `to_dense()` 方法可以将稀疏张量转换为标准的密集张量;使用 `to_sparse_coo()` 方法可以将密集张量转换为 COO 格式的稀疏张量。 +3. **转换功能**: + - 稀疏张量可以转换为密集张量,反之亦然。使用 `to_dense()` 方法可以将稀疏张量转换为标准的密集张量;使用 `to_sparse_coo()`、`to_sparse_csr()` 方法可以将密集张量转换为 COO 格式、CSR格式 的稀疏张量。 +在PaddlePaddle中,COO格式和CSR格式都是用来存储和处理稀疏张量的方法,但它们在结构和应用场景上有所不同。了解这两种格式的区别以及它们各自的适用情况可以帮助你更有效地使用稀疏数据。 +**COO格式和CSR格式的选择建议**: -PaddlePaddle 提供了完整的支持来创建和操作 COO 和 CSR 格式的稀疏张量。以下是使用 PaddlePaddle 创建和操作这些张量的具体方法。 +- 如果你的应用主要涉及稀疏矩阵的构建和逐项添加数据,COO格式会更简单且直接。 +- 如果你的应用需要高效的行操作或频繁进行矩阵乘法,特别是在稀疏矩阵较大的情况下,CSR格式是更好的选择。 +选择哪种格式应基于你的具体应用需求,如操作类型、数据规模和性能要求。在PaddlePaddle中,你可以根据需要轻松地在两种格式之间转换,以适应不同的计算需求。 +PaddlePaddle 提供了完整的支持来创建和操作 COO 和 CSR 格式的稀疏张量。以下是使用 PaddlePaddle 创建和操作这些张量的具体方法。 +## 1. 创建 COO 格式的 SparseTensor +**结构特点**: +- COO格式通过一个坐标列表存储非零元素的位置和相应的值。 +- 它使用三个数组:一个数组存储行索引,一个存储列索引,第三个存储元素值。 +**适用场景**: +- **数据添加频繁**:当稀疏矩阵需要频繁添加新的非零元素时,COO格式是较好的选择,因为它允许直接添加数据而不需重新构造整个数据结构。 +- **简单结构**:适合于那些结构简单的矩阵,特别是在非零元素分布较为随机时。 -## 1. 创建 COO 格式的 SparseTensor -PaddlePaddle 使用 `sparse_coo_tensor` 函数来创建 COO 格式的稀疏张量。这个函数需要 `indices`、`values` 以及可选的 `shape` 参数来指定张量的形状。 +PaddlePaddle 使用 `sparse_coo_tensor` 函数来创建 COO 格式的稀疏张量。这个函数需要 `indices`、`values` 以及可选的 `dense_shape` 参数来指定张量的形状。 示例代码: @@ -61,9 +76,31 @@ coo = paddle.sparse.sparse_coo_tensor(indices, values, dense_shape) print(coo) ``` +输出: +```python +Tensor(shape=[3, 3], dtype=paddle.float32, place=Place(cpu), stop_gradient=True, + indices=[[0, 1, 2], + [1, 2, 0]], + values=[1., 2., 3.]) +``` + + +在这个例子中,indices定义了非零元素的位置,其中每个子数组的两个数字分别代表行和列的坐标。这种方式直接揭示了每个值在张量中的具体位置。values提供了相应的值,与indices中的坐标一一对应。dense_shape是一个可选参数,指定了张量的整体形状,即它的行数和列数。 + +COO格式的这种表示方式适用于数据稀疏但结构简单的情况,非常适合在需要频繁添加新元素或者修改已有元素时使用。由于它简单地列出了所有非零元素的坐标和值,因此在构建和更新稀疏张量时具有高度的灵活性和效率。 + ## 2. 创建 CSR 格式的 SparseTensor -为了创建 CSR 格式的稀疏张量,PaddlePaddle 提供了 `sparse_csr_tensor` 函数。此函数接受 `crows`、`cols`、`values` 和 `shape` 作为参数,以定义稀疏张量的结构。 +**结构特点**: +- CSR格式通过行来压缩存储,使用三个数组:行指针数组、列索引数组、以及非零元素值数组。 +- 行指针数组的大小比实际行数多一个,用于表示每行的起始位置和结束位置。 + +**适用场景**: +- **行操作优化**:当需要高效地进行行相关的操作(如行切片、行求和)时,CSR格式提供更优的性能。 +- **矩阵乘法**:对于稀疏矩阵与稀疏或密集矩阵的乘法运算,CSR格式通常会提供更好的性能。 +- **大规模数据处理**:在处理大规模稀疏数据时,CSR格式因其压缩特性而节省内存。 + +为了创建 CSR 格式的稀疏张量,PaddlePaddle 提供了 `sparse_csr_tensor` 函数。此函数接受 `crows`、`cols`、`values` 和 `dense_shape` 作为参数,以定义稀疏张量的结构。 示例代码: @@ -78,6 +115,19 @@ csr = paddle.sparse.sparse_csr_tensor(crows, cols, values, dense_shape) print(csr) ``` +输出: +```python +Tensor(shape=[3, 4], dtype=paddle.int64, place=Place(cpu), stop_gradient=True, + crows=[0, 2, 3, 5], + cols=[1, 3, 2, 0, 1], + values=[1, 2, 3, 4, 5]) +``` + +在这个例子中,`crows`定义了每一行非零元素开始的位置在`values`数组中的索引,这有助于快速定位行的起始点和终点。`cols`则指示了非零元素在各自行中的列位置,`values`提供了相应的值。`dense_shape`指定了张量的整体形状,即行数和列数。 + +这种CSR格式的表示方式适用于数据稀疏且行访问频繁的场景。它通过压缩行索引来减少内存使用,优化了对稀疏矩阵行的操作,使得行级操作更加高效。在处理行密集型操作(如行切片或行求和)时特别有用,也适合于稀疏矩阵的乘法等计算密集任务。 + + ## 3. 创建稀疏张量的相关参数详解 在 PaddlePaddle 的稀疏张量创建API中,参数的设计允许用户灵活地定义和操作稀疏数据结构。对于两种类型的稀疏张量创建函数,参数主要涉及初始化数据的类型和结构,其中: @@ -85,28 +135,23 @@ print(csr) 对于 `sparse_coo_tensor` 和 `sparse_csr_tensor` 函数,存在一些共通的参数,这些参数允许用户指定如何构建和处理稀疏张量: -1. **indices, crows, cols (list|tuple|ndarray|Tensor)**: - - 对于 COO 格式,`indices` 参数是一个二维数组,每列代表一个非零元素的坐标。 - - 对于 CSR 格式,`crows` 和 `cols` 分别表示行索引的开始和非零元素的列索引。 - - 这些参数可以是 Python 的 list 或 tuple,也可以是 NumPy ndarray 或 Paddle Tensor。 - -2. **values (list|tuple|ndarray|Tensor)**: +1. **values (list|tuple|ndarray|Tensor)**: - 表示非零元素的实际数值。 - 类似于索引参数,这可以是 list、tuple、NumPy ndarray 或 Paddle Tensor。 -3. **shape (list|tuple, 可选)**: +2. **shape (list|tuple, 可选)**: - 定义稀疏张量的形状,如果未提供,则会根据 indices 或 crows 和 cols 的最大值自动推断。 - 必须是一个整数列表或元组,指定张量在每个维度的大小。 -4. **dtype (str|np.dtype, 可选)**: +3. **dtype (str|np.dtype, 可选)**: - 指定张量元素的数据类型,如 'float32', 'int64' 等。 - 如果未指定,则从 `values` 的数据类型自动推断。 -5. **place (CPUPlace|CUDAPinnedPlace|CUDAPlace|str, 可选)**: +4. **place (CPUPlace|CUDAPinnedPlace|CUDAPlace|str, 可选)**: - 决定张量的存储设备,例如 CPU 或 GPU。 - 如果未指定,则使用当前环境的默认设备。 -6. **stop_gradient (bool, 可选)**: +5. **stop_gradient (bool, 可选)**: - 指示是否对该张量进行梯度计算。 - 在大多数深度学习应用中,非模型权重的张量通常设置为 `True` 以提高计算效率。 @@ -114,6 +159,11 @@ print(csr) 除了上述共通参数外,COO 和 CSR 格式因其数据结构的不同而在参数应用上有所区别。 +**indices, crows, cols (list|tuple|ndarray|Tensor)**: + - 对于 COO 格式,`indices` 参数是一个二维数组,每列代表一个非零元素的坐标。 + - 对于 CSR 格式,`crows` 和 `cols` 分别表示行索引的开始和非零元素的列索引。 + - 这些参数可以是 Python 的 list 或 tuple,也可以是 NumPy ndarray 或 Paddle Tensor。 + **COO 格式** - `indices` 用于直接指定每个非零元素的多维坐标。 - 主要用于数据的随机访问和转换操作,适用于那些非零元素分布相对均匀的场景。 From f694f0717a1434b54d187ead315d41a2f928a032 Mon Sep 17 00:00:00 2001 From: lightrain-a <164860023+lightrain-a@users.noreply.github.com> Date: Mon, 13 May 2024 16:24:56 +0800 Subject: [PATCH 11/13] =?UTF-8?q?Update=20=E3=80=90Hackathon=206th=20Artic?= =?UTF-8?q?le=20No.6=E3=80=91=E7=A8=80=E7=96=8FResNet=E7=9A=84=E5=AD=A6?= =?UTF-8?q?=E4=B9=A0=E5=BF=83=E5=BE=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\344\271\240\345\277\203\345\276\227.md" | 22 ++++++++++++++----- 1 file changed, 16 insertions(+), 6 deletions(-) diff --git "a/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" "b/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" index 4937d097f..f2fc0f1d1 100644 --- "a/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" +++ "b/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" @@ -219,19 +219,29 @@ print(csr) ## 1. 稀疏神经网络层 -PaddlePaddle 在 `paddle.sparse.nn` 模块中提供了专门针对稀疏数据设计的神经网络层,这些层包括: +在PaddlePaddle的`paddle.sparse.nn`模块中,提供了一系列专门为稀疏数据设计的神经网络层,这些层针对稀疏数据的特点进行了优化,以减少对零值的计算和存储需求,提高处理效率。 + +这些神经网络层主要包括: 1. **稀疏卷积层**: - - `SubmConv3D`: 用于处理3D数据的稀疏子矩阵卷积层。它可以在3D体积数据中有效地进行卷积操作,而不需要将整个数据转换为密集格式。 - - 这些层专为稀疏数据优化,减少了对零值的计算和存储,从而提高了性能和效率。 + - `paddle.sparse.nn.Conv3D`:标准的三维卷积层,支持在稀疏数据上的操作,适用于处理体积大的三维数据。 + - `paddle.sparse.nn.SubmConv3D`:子流形三维卷积层,用于处理3D数据的稀疏子矩阵卷积层。该层允许在3D体积数据中有效地进行卷积操作,无需将整个数据转换为密集格式,特别适用于医学影像和三维扫描等领域。 2. **批归一化层**: - - `BatchNorm3D`: 用于3D数据的批归一化层,支持与稀疏卷积层配合使用。 + - `paddle.sparse.nn.BatchNorm3D`:批归一化层,专为三维数据设计,可以与稀疏卷积层结合使用,以优化稀疏数据的特征归一化过程。 + +3. **池化层**: + - `paddle.sparse.nn.MaxPool3D`:三维最大池化层,用于在稀疏三维数据上执行池化操作,有助于降低数据的维度和提高模型的抽象能力。 -3. **激活函数**: - - 如 `ReLU`,支持在稀疏数据路径中使用,与常规的激活函数使用方法相同。 +4. **激活层**: + - `paddle.sparse.nn.ReLU`、`paddle.sparse.nn.ReLU6`:标准ReLU和ReLU6激活函数,支持在稀疏数据路径中使用,与常规的激活函数使用方法相同,但针对稀疏数据进行了优化。 + - `paddle.sparse.nn.LeakyReLU`:LeakyReLU激活层,为包含小负斜率的ReLU变体,适用于在稀疏数据中增强模型的非线性处理能力。 + - `paddle.sparse.nn.Softmax`:Softmax激活层,适用于稀疏数据路径,使用方法与常规密集数据的Softmax相同,但特别针对稀疏数据进行了优化,常用于处理多分类问题。 +这些层的集成和应用使得PaddlePaddle在处理含有大量零值的稀疏数据集时表现出更好的性能,特别是在深度学习和神经网络的应用中,如稀疏版本的ResNet等复杂模型。 + 下面以稀疏 ResNet为例,说明Paddle对稀疏神经网络层的支持。 + ## 2. 为什么要使用稀疏 ResNet 在处理点云数据、图像识别或自然语言处理任务时,输入数据通常具有很高的维度和稀疏性。例如,3D点云数据往往是非结构化的,大部分体积内没有有效信息(即大部分体积是空的)。使用传统的密集(dense)卷积网络处理这类数据会带来两个主要问题: From ef8f92fffd5e718e2f7fbd266c1cc5d1548210fc Mon Sep 17 00:00:00 2001 From: lightrain-a <164860023+lightrain-a@users.noreply.github.com> Date: Mon, 13 May 2024 16:38:56 +0800 Subject: [PATCH 12/13] =?UTF-8?q?Update=20=E3=80=90Hackathon=206th=20Artic?= =?UTF-8?q?le=20No.6=E3=80=91=E7=A8=80=E7=96=8FResNet=E7=9A=84=E5=AD=A6?= =?UTF-8?q?=E4=B9=A0=E5=BF=83=E5=BE=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\344\271\240\345\277\203\345\276\227.md" | 75 ++++++++++++++++++- 1 file changed, 71 insertions(+), 4 deletions(-) diff --git "a/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" "b/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" index f2fc0f1d1..359187fb0 100644 --- "a/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" +++ "b/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" @@ -279,7 +279,6 @@ PaddlePaddle 的稀疏模块 `paddle.sparse` 提供了对稀疏数据操作的 ## 5. 示例代码 - ```python import paddle from paddle import sparse @@ -289,7 +288,6 @@ from paddle.sparse import nn as sparse_nn def sparse_conv_block(in_channels, out_channels, stride=1, padding=1, key=None): block = paddle.nn.Sequential( sparse_nn.SubmConv3D(in_channels, out_channels, kernel_size=3, stride=stride, padding=padding, bias_attr=False, key=key), - sparse_nn.BatchNorm3D(out_channels), sparse_nn.ReLU() ) return block @@ -324,10 +322,16 @@ shape = paddle.to_tensor([batch_size, channels, depth, height, width], dtype='in x = sparse.sparse_coo_tensor(coords, values, shape) # 实例化模型 -model +model = SparseResNet(channels) + +# 使用模型进行预测 +output = model(x) +print(output) + ``` -输出: + +模型打印结果: @@ -360,6 +364,69 @@ SparseResNet( ) ``` +输出: +```python +Tensor(shape=[1, 1, 100, 100, 64], dtype=paddle.float32, place=Place(cpu), stop_gradient=False, + indices=[[0, 0, 0, 0], + [0, 0, 0, 0], + [0, 1, 1, 2], + [0, 1, 2, 2]], + values=[[0. , 0. , 0.08977110, 0. , 0. , + 0. , 0. , 0.16325581, 0. , 0. , + 0.08592274, 0. , 0. , 0. , 0.07656589, + 0. , 0.11471142, 0.01767202, 0.09576824, 0. , + 0.06328346, 0. , 0. , 0. , 0. , + 0. , 0.11039102, 0. , 0.02612690, 0. , + 0. , 0. , 0.36811280, 0.27737468, 0.14172454, + 0.08146347, 0. , 0. , 0.00239664, 0.13383773, + 0.05405550, 0.15424284, 0. , 0.01066782, 0. , + 0. , 0. , 0. , 0.02590318, 0.08370880, + 0. , 0. , 0. , 0.24637662, 0.09807874, + 0.16659400, 0. , 0. , 0.07821499, 0. , + 0.01074675, 0.00031681, 0. , 0. ], + [0. , 0.06284240, 0.13784820, 0.20940723, 0. , + 0. , 0.05285437, 0.15515041, 0.10529537, 0. , + 0.04321828, 0. , 0. , 0.14670819, 0.26492512, + 0. , 0.14278989, 0.11353996, 0.06671846, 0.14850950, + 0.05322032, 0.03145349, 0.13015728, 0. , 0. , + 0. , 0.05160457, 0. , 0.16703124, 0.24384394, + 0.00744244, 0. , 0. , 0.04347976, 0. , + 0. , 0. , 0. , 0.22055462, 0. , + 0. , 0.22349600, 0.07226329, 0.14150156, 0. , + 0.15833184, 0.03316063, 0. , 0. , 0.02844941, + 0. , 0.31135687, 0. , 0.08106169, 0. , + 0.31946257, 0.16892034, 0. , 0. , 0. , + 0.02278935, 0.13871309, 0. , 0.04356173], + [0.07027701, 0. , 0.24222264, 0.08168820, 0.10877223, + 0.32733595, 0.05810408, 0.23713312, 0.08619954, 0. , + 0.05535959, 0. , 0.28626207, 0.20127529, 0. , + 0.21020988, 0. , 0. , 0.24150310, 0.15729634, + 0. , 0.31431541, 0.09939002, 0. , 0. , + 0. , 0. , 0. , 0. , 0. , + 0. , 0. , 0. , 0. , 0.13229422, + 0. , 0. , 0. , 0.27942199, 0. , + 0.02403279, 0.06105895, 0. , 0. , 0. , + 0. , 0. , 0.20697114, 0. , 0.12839042, + 0. , 0. , 0.15398751, 0. , 0. , + 0. , 0. , 0.21327323, 0.13392673, 0.24080001, + 0.19320847, 0. , 0.09254151, 0. ], + [0.37628198, 0. , 0. , 0. , 0. , + 0.20390727, 0. , 0. , 0.01985047, 0.09249730, + 0.26726574, 0. , 0.21078694, 0.11854289, 0.16678692, + 0.03613931, 0. , 0. , 0.27509823, 0. , + 0.22757295, 0. , 0. , 0. , 0.11123202, + 0.06420810, 0. , 0. , 0.02349779, 0. , + 0. , 0. , 0.02530795, 0.16113043, 0. , + 0.16980153, 0. , 0.02904471, 0.19772613, 0.02743972, + 0.24667305, 0.06938203, 0. , 0.24336687, 0. , + 0. , 0.08654289, 0. , 0. , 0.10054247, + 0.12824626, 0.38880903, 0. , 0. , 0.23209766, + 0. , 0. , 0. , 0.24539268, 0.17324814, + 0. , 0. , 0. , 0. ]]) +``` + + + # 四、Paddle 的稀疏调用体验与稠密的一致性 PaddlePaddle 的设计目标之一是提供一致的用户体验,无论是处理稀疏数据还是稠密数据。这意味着即便是在处理包含大量零值的数据集时,开发者也可以利用熟悉的接口和模式来构建和训练模型。 From db11bbe6acb0a31b3d81a2b020eb74132ece6e2f Mon Sep 17 00:00:00 2001 From: lightrain-a <164860023+lightrain-a@users.noreply.github.com> Date: Tue, 14 May 2024 19:44:40 +0800 Subject: [PATCH 13/13] =?UTF-8?q?Update=20=E3=80=90Hackathon=206th=20Artic?= =?UTF-8?q?le=20No.6=E3=80=91=E7=A8=80=E7=96=8FResNet=E7=9A=84=E5=AD=A6?= =?UTF-8?q?=E4=B9=A0=E5=BF=83=E5=BE=97.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...46\344\271\240\345\277\203\345\276\227.md" | 208 ++++++------------ 1 file changed, 65 insertions(+), 143 deletions(-) diff --git "a/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" "b/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" index 359187fb0..03d362b4a 100644 --- "a/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" +++ "b/rfcs/Article/\343\200\220Hackathon 6th Article No.6\343\200\221\347\250\200\347\226\217ResNet\347\232\204\345\255\246\344\271\240\345\277\203\345\276\227.md" @@ -25,33 +25,14 @@ CSR 格式是一种更为紧凑的稀疏表示,专为快速的行访问和矩 # 二、Paddle稀疏张量支持 - -PaddlePaddle 支持多种类型的稀疏张量,主要包括: - -1. **COO格式(Coordinate List)**: - - 这是一种常用的稀疏表示格式,其中非零元素通过其坐标列表进行存储。 - - 使用 `paddle.sparse.sparse_coo_tensor(indices, values, shape)` 可以创建 COO 格式的稀疏张量,其中 `indices` 是一个二维整数张量,指示非零元素的坐标;`values` 是一个张量,包含与 `indices` 对应的值;`shape` 是一个定义张量形状的整数列表或张量。 - -2. **CSR格式(Compressed Sparse Row)**: - - 这是另一种常用的稀疏表示格式,主要用于优化行访问的性能,其中非零元素通过行的压缩方式进行存储。 - - 使用 `paddle.sparse.sparse_csr_tensor(crow_indices, col_indices, values, shape)` 可以创建 CSR 格式的稀疏张量,其中 `crow_indices` 是一个一维整数张量,指示每一行的起始非零元素在 `values` 中的位置;`col_indices` 是一个一维整数张量,指示每个非零元素的列索引;`values` 是一个张量,包含所有非零元素的值;`shape` 是一个定义张量形状的整数列表或张量。 - -3. **转换功能**: - - 稀疏张量可以转换为密集张量,反之亦然。使用 `to_dense()` 方法可以将稀疏张量转换为标准的密集张量;使用 `to_sparse_coo()`、`to_sparse_csr()` 方法可以将密集张量转换为 COO 格式、CSR格式 的稀疏张量。 - -在PaddlePaddle中,COO格式和CSR格式都是用来存储和处理稀疏张量的方法,但它们在结构和应用场景上有所不同。了解这两种格式的区别以及它们各自的适用情况可以帮助你更有效地使用稀疏数据。 - -**COO格式和CSR格式的选择建议**: - -- 如果你的应用主要涉及稀疏矩阵的构建和逐项添加数据,COO格式会更简单且直接。 -- 如果你的应用需要高效的行操作或频繁进行矩阵乘法,特别是在稀疏矩阵较大的情况下,CSR格式是更好的选择。 - -选择哪种格式应基于你的具体应用需求,如操作类型、数据规模和性能要求。在PaddlePaddle中,你可以根据需要轻松地在两种格式之间转换,以适应不同的计算需求。 - PaddlePaddle 提供了完整的支持来创建和操作 COO 和 CSR 格式的稀疏张量。以下是使用 PaddlePaddle 创建和操作这些张量的具体方法。 ## 1. 创建 COO 格式的 SparseTensor +**COO格式(Coordinate List)**: +- 这是一种常用的稀疏表示格式,其中非零元素通过其坐标列表进行存储。 +- 使用 `paddle.sparse.sparse_coo_tensor(indices, values, shape)` 可以创建 COO 格式的稀疏张量,其中 `indices` 是一个二维整数张量,指示非零元素的坐标;`values` 是一个张量,包含与 `indices` 对应的值;`shape` 是一个定义张量形状的整数列表或张量。 + **结构特点**: - COO格式通过一个坐标列表存储非零元素的位置和相应的值。 - 它使用三个数组:一个数组存储行索引,一个存储列索引,第三个存储元素值。 @@ -60,11 +41,8 @@ PaddlePaddle 提供了完整的支持来创建和操作 COO 和 CSR 格式的稀 - **数据添加频繁**:当稀疏矩阵需要频繁添加新的非零元素时,COO格式是较好的选择,因为它允许直接添加数据而不需重新构造整个数据结构。 - **简单结构**:适合于那些结构简单的矩阵,特别是在非零元素分布较为随机时。 - -PaddlePaddle 使用 `sparse_coo_tensor` 函数来创建 COO 格式的稀疏张量。这个函数需要 `indices`、`values` 以及可选的 `dense_shape` 参数来指定张量的形状。 - - -示例代码: +**示例代码**: +PaddlePaddle 使用 `sparse_coo_tensor` 函数来创建 COO 格式的稀疏张量。 ```python import paddle @@ -85,12 +63,14 @@ Tensor(shape=[3, 3], dtype=paddle.float32, place=Place(cpu), stop_gradient=True, ``` -在这个例子中,indices定义了非零元素的位置,其中每个子数组的两个数字分别代表行和列的坐标。这种方式直接揭示了每个值在张量中的具体位置。values提供了相应的值,与indices中的坐标一一对应。dense_shape是一个可选参数,指定了张量的整体形状,即它的行数和列数。 - -COO格式的这种表示方式适用于数据稀疏但结构简单的情况,非常适合在需要频繁添加新元素或者修改已有元素时使用。由于它简单地列出了所有非零元素的坐标和值,因此在构建和更新稀疏张量时具有高度的灵活性和效率。 +在这个例子中,indices定义了非零元素的位置,其中每个子数组的两个数字分别代表行和列的坐标。 ## 2. 创建 CSR 格式的 SparseTensor +**CSR格式(Compressed Sparse Row)**: +- 这是另一种常用的稀疏表示格式,主要用于优化行访问的性能,其中非零元素通过行的压缩方式进行存储。 +- 使用 `paddle.sparse.sparse_csr_tensor(crows, cols, values, dense_shape)` 可以创建 CSR 格式的稀疏张量,其中`crows`定义了每一行非零元素开始的位置在`values`数组中的索引,这有助于快速定位行的起始点和终点。`cols`则指示了非零元素在各自行中的列位置,`values`提供了相应的值。`dense_shape`指定了张量的整体形状,即行数和列数。 + **结构特点**: - CSR格式通过行来压缩存储,使用三个数组:行指针数组、列索引数组、以及非零元素值数组。 - 行指针数组的大小比实际行数多一个,用于表示每行的起始位置和结束位置。 @@ -100,9 +80,8 @@ COO格式的这种表示方式适用于数据稀疏但结构简单的情况, - **矩阵乘法**:对于稀疏矩阵与稀疏或密集矩阵的乘法运算,CSR格式通常会提供更好的性能。 - **大规模数据处理**:在处理大规模稀疏数据时,CSR格式因其压缩特性而节省内存。 -为了创建 CSR 格式的稀疏张量,PaddlePaddle 提供了 `sparse_csr_tensor` 函数。此函数接受 `crows`、`cols`、`values` 和 `dense_shape` 作为参数,以定义稀疏张量的结构。 - -示例代码: +**示例代码**: +为了创建 CSR 格式的稀疏张量,PaddlePaddle 提供了 `sparse_csr_tensor` 函数。 ```python import paddle @@ -123,7 +102,7 @@ Tensor(shape=[3, 4], dtype=paddle.int64, place=Place(cpu), stop_gradient=True, values=[1, 2, 3, 4, 5]) ``` -在这个例子中,`crows`定义了每一行非零元素开始的位置在`values`数组中的索引,这有助于快速定位行的起始点和终点。`cols`则指示了非零元素在各自行中的列位置,`values`提供了相应的值。`dense_shape`指定了张量的整体形状,即行数和列数。 +在这个例子中,`crows`定义了每一行非零元素开始的位置在`values`数组中的索引,这有助于快速定位行的起始点和终点。 这种CSR格式的表示方式适用于数据稀疏且行访问频繁的场景。它通过压缩行索引来减少内存使用,优化了对稀疏矩阵行的操作,使得行级操作更加高效。在处理行密集型操作(如行切片或行求和)时特别有用,也适合于稀疏矩阵的乘法等计算密集任务。 @@ -160,30 +139,27 @@ Tensor(shape=[3, 4], dtype=paddle.int64, place=Place(cpu), stop_gradient=True, 除了上述共通参数外,COO 和 CSR 格式因其数据结构的不同而在参数应用上有所区别。 **indices, crows, cols (list|tuple|ndarray|Tensor)**: - - 对于 COO 格式,`indices` 参数是一个二维数组,每列代表一个非零元素的坐标。 - - 对于 CSR 格式,`crows` 和 `cols` 分别表示行索引的开始和非零元素的列索引。 + - 对于 COO 格式,`indices` 参数是一个二维数组,用于直接指定每个非零元素的多维坐标。主要用于数据的随机访问和转换操作,适用于那些非零元素分布相对均匀的场景。 + - 对于 CSR 格式,`crows` 表示每一行的起始非零元素索引,而 `cols` 存储这些非零元素的列索引。CSR 格式优化了行的连续访问,非常适合矩阵乘法和其他行优先操作。 - 这些参数可以是 Python 的 list 或 tuple,也可以是 NumPy ndarray 或 Paddle Tensor。 -**COO 格式** -- `indices` 用于直接指定每个非零元素的多维坐标。 -- 主要用于数据的随机访问和转换操作,适用于那些非零元素分布相对均匀的场景。 - -**CSR 格式** -- `crows` 表示每一行的起始非零元素索引,而 `cols` 存储这些非零元素的列索引。 -- CSR 格式优化了行的连续访问,非常适合矩阵乘法和其他行优先操作。 --- 通过这些参数的灵活使用,PaddlePaddle 允许开发者以高效且灵活的方式处理大规模稀疏数据集,从而在保持性能的同时减少内存消耗。 +## 4. COO格式和CSR格式的选择建议 -## 4. 稀疏与稠密 Tensor 互转 +- 如果你的应用主要涉及稀疏矩阵的构建和逐项添加数据,COO格式会更简单且直接。 +- 如果你的应用需要高效的行操作或频繁进行矩阵乘法,特别是在稀疏矩阵较大的情况下,CSR格式是更好的选择。 -PaddlePaddle 提供了一套简单易用的接口,使得稀疏张量的使用与传统的稠密张量操作体验高度一致,从而降低了学习成本并便于开发者快速上手。这种设计允许在同一个模型中灵活地使用稠密和稀疏数据结构,而且可以无缝地在它们之间转换,这对于处理大规模数据集尤其重要,例如在深度学习、图像处理和自然语言处理等领域。 +选择哪种格式应基于你的具体应用需求,如操作类型、数据规模和性能要求。在PaddlePaddle中,你可以根据需要轻松地在两种格式之间转换,以适应不同的计算需求。 -PaddlePaddle 支持通过几个简单的 API,如 `Tensor.to_dense()`, `Tensor.to_sparse_coo()`, 和 `Tensor.to_sparse_csr()` 来实现稀疏与稠密之间的转换,这些操作保证了数据处理的灵活性和效率。 +## 5. 稀疏与稠密 Tensor 互转 +PaddlePaddle 提供了一套简单易用的接口,使得稀疏张量的使用与传统的稠密张量操作体验高度一致,从而降低了学习成本并便于开发者快速上手。这种设计允许在同一个模型中灵活地使用稠密和稀疏数据结构,而且可以无缝地在它们之间转换,这对于处理大规模数据集尤其重要,例如在深度学习、图像处理和自然语言处理等领域。 +PaddlePaddle 支持通过几个简单的 API,实现稀疏与稠密之间的转换,这些操作保证了数据处理的灵活性和效率。如 `Tensor.to_dense()`可以将稀疏张量转换为标准的密集张量, `Tensor.to_sparse_coo()`, 和 `Tensor.to_sparse_csr()` 可以将密集张量转换为 COO 格式、CSR格式 的稀疏张量。 代码示例:稠密到稀疏的转换 @@ -215,34 +191,30 @@ print(csr) 这些转换非常直观,仅需要简单的一步操作就可以完成,使得稀疏和稠密格式之间的交互变得无缝而高效。 -# 三、Paddle稀疏神经网络层支持 +# 三、Paddle稀疏的设计优势 -## 1. 稀疏神经网络层 +PaddlePaddle 的设计目标之一是提供一致的用户体验,无论是处理稀疏数据还是稠密数据。这意味着即便是在处理包含大量零值的数据集时,开发者也可以利用熟悉的接口和模式来构建和训练模型。 -在PaddlePaddle的`paddle.sparse.nn`模块中,提供了一系列专门为稀疏数据设计的神经网络层,这些层针对稀疏数据的特点进行了优化,以减少对零值的计算和存储需求,提高处理效率。 +## 1. API设计的一致性 -这些神经网络层主要包括: +PaddlePaddle 的稀疏模块提供了与常规稠密操作相似的API接口,使得开发者无需学习新的API就能处理稀疏数据。例如: -1. **稀疏卷积层**: - - `paddle.sparse.nn.Conv3D`:标准的三维卷积层,支持在稀疏数据上的操作,适用于处理体积大的三维数据。 - - `paddle.sparse.nn.SubmConv3D`:子流形三维卷积层,用于处理3D数据的稀疏子矩阵卷积层。该层允许在3D体积数据中有效地进行卷积操作,无需将整个数据转换为密集格式,特别适用于医学影像和三维扫描等领域。 +- **稀疏卷积层**:稀疏模块中的 `SubmConv3D` 直接对应于常规卷积操作中的 `Conv3D`。它们的参数非常相似,如 `in_channels`, `out_channels`, `stride`, `padding` 等。 +- **批归一化和激活函数**:稀疏模块同样提供了批归一化和激活函数,如 `BatchNorm3D` 和 `ReLU`,其用法与常规模块中的相同。 -2. **批归一化层**: - - `paddle.sparse.nn.BatchNorm3D`:批归一化层,专为三维数据设计,可以与稀疏卷积层结合使用,以优化稀疏数据的特征归一化过程。 +## 2. 集成度:训练和推理的处理流程 -3. **池化层**: - - `paddle.sparse.nn.MaxPool3D`:三维最大池化层,用于在稀疏三维数据上执行池化操作,有助于降低数据的维度和提高模型的抽象能力。 +无论是稀疏还是稠密模型,PaddlePaddle 中的训练和推理流程保持一致。稀疏操作可以与PaddlePaddle的其他特性(如自动微分和优化器)无缝集成,使得构建和训练稀疏模型与常规模型几乎无异。 + +1. **定义模型**:无论选择稀疏还是稠密模型,模型定义的方式都是相似的,使用 `paddle.nn.Layer` 类来构建网络层。 +2. **编译模型**:使用 `paddle.Model` 对象来包装定义好的网络,然后编译,包括设置优化器、损失函数和评估指标。 +3. **训练和评估**:通过调用 `.fit` 和 `.evaluate` 方法来进行训练和评估,这与处理稠密数据的流程完全一致。 -4. **激活层**: - - `paddle.sparse.nn.ReLU`、`paddle.sparse.nn.ReLU6`:标准ReLU和ReLU6激活函数,支持在稀疏数据路径中使用,与常规的激活函数使用方法相同,但针对稀疏数据进行了优化。 - - `paddle.sparse.nn.LeakyReLU`:LeakyReLU激活层,为包含小负斜率的ReLU变体,适用于在稀疏数据中增强模型的非线性处理能力。 - - `paddle.sparse.nn.Softmax`:Softmax激活层,适用于稀疏数据路径,使用方法与常规密集数据的Softmax相同,但特别针对稀疏数据进行了优化,常用于处理多分类问题。 -这些层的集成和应用使得PaddlePaddle在处理含有大量零值的稀疏数据集时表现出更好的性能,特别是在深度学习和神经网络的应用中,如稀疏版本的ResNet等复杂模型。 - -下面以稀疏 ResNet为例,说明Paddle对稀疏神经网络层的支持。 -## 2. 为什么要使用稀疏 ResNet +# 四、Paddle稀疏神经网络层支持 + +## 1. 稀疏 ResNet 的应用场景 在处理点云数据、图像识别或自然语言处理任务时,输入数据通常具有很高的维度和稀疏性。例如,3D点云数据往往是非结构化的,大部分体积内没有有效信息(即大部分体积是空的)。使用传统的密集(dense)卷积网络处理这类数据会带来两个主要问题: 1. **效率低下**:对于大量的空白区域依然进行计算,消耗计算资源。 @@ -250,8 +222,8 @@ print(csr) 稀疏 ResNet 解决了这些问题,通过仅在非零数据点上进行操作,从而大幅提高了计算和存储效率。 -## 3. 如何创建Paddle的稀疏 ResNet +## 2. 构建稀疏 ResNet 模型 在 PaddlePaddle 中,稀疏 ResNet 可以通过 `paddle.sparse` 模块中的稀疏卷积层(如 `SubmConv3D`)来实现。这些层专门设计用来处理稀疏数据。稀疏卷积层接受包含非零元素坐标和值的稀疏张量,并只在这些非零元素上执行卷积运算。通过构建包含这些稀疏卷积层的网络(如 ResNet 结构中的基础块),可以高效处理稀疏数据。 创建稀疏 ResNet 主要涉及以下几个步骤: @@ -259,25 +231,36 @@ print(csr) 2. 定义稀疏网络结构:设计一个网络结构,它应该包含适用于处理稀疏数据的特殊卷积层(如 Paddle 的 SubmConv3D)。这些层特别优化了内存和计算资源,只在数据非零的地方进行计算。 3. 前向传播:将稀疏张量输入到网络中,执行前向传播,网络会在内部处理稀疏数据,并输出结果。 4. 训练和评估:就像使用常规神经网络一样,定义损失函数和优化器,然后在训练数据上训练网络,最后在验证数据上评估网络的性能。 -## 4. 稀疏 ResNet的关键组件 -PaddlePaddle 的稀疏模块 `paddle.sparse` 提供了对稀疏数据操作的支持,这包括稀疏张量的创建、转换和计算功能。对于深度学习模型,尤其是在需要处理大量稀疏数据的应用场景(如点云处理、文本数据和推荐系统)中,使用稀疏技术可以显著提升计算效率和资源使用效率。 + +## 3. 稀疏 ResNet的关键组件 + +PaddlePaddle 的 `paddle.sparse` 模块提供了对稀疏数据操作的支持,包括稀疏张量的创建、转换和计算功能。这些神经网络层针对稀疏数据的特点进行了优化,以减少对零值的计算和存储需求,提高处理效率。 1. **稀疏张量(Sparse Tensor)**: - - 稀疏张量是一种特殊的数据结构,主要用于有效存储和处理大部分元素为零的数据。 - - 在 PaddlePaddle 中,可以使用 `paddle.sparse.sparse_coo_tensor` 来创建稀疏张量,这需要提供非零元素的坐标和值。 +- 稀疏张量是一种特殊的数据结构,主要用于有效存储和处理大部分元素为零的数据。 +- 在 PaddlePaddle 中,可以使用 `paddle.sparse.sparse_coo_tensor` 来创建稀疏张量,这需要提供非零元素的坐标和值。 + +2. **稀疏卷积层(Sparse Convolution)**: +- `paddle.sparse.nn.Conv3D`:标准的三维卷积层,支持在稀疏数据上的操作,适用于处理体积大的三维数据。 +- `paddle.sparse.nn.SubmConv3D`:子流形三维卷积层,用于处理3D数据的稀疏子矩阵卷积层。该层允许在3D体积数据中有效地进行卷积操作,无需将整个数据转换为密集格式,特别适用于医学影像和三维扫描等领域。 -2. **稀疏卷积(Sparse Convolution)**: - - 与常规卷积操作不同,稀疏卷积专门针对稀疏数据进行优化。 - - PaddlePaddle 提供 `SubMConv` 类进行稀疏卷积,该类支持包括3D在内的多种稀疏卷积操作。可以使用如 `sparse_nn.SubmConv3D` 这样的层来实现稀疏卷积层。 +3. **批归一化层(Batch Normalization)** +- `paddle.sparse.nn.BatchNorm3D`:批归一化层,专为三维数据设计,可以与稀疏卷积层结合使用,以优化稀疏数据的特征归一化过程。 -3. **构建稀疏 ResNet 模型**: - - 基于 PaddlePaddle 的稀疏模块,可以创建类似于常规 ResNet 的模型架构,但使用的是稀疏卷积层替换传统的密集卷积层。 - - 每个稀疏卷积层后通常跟随一个批归一化层和ReLU激活函数,形成一个基础的稀疏残差块。 +4. **池化层(Pooling Layers)** +- `paddle.sparse.nn.MaxPool3D`:三维最大池化层,用于在稀疏三维数据上执行池化操作,有助于降低数据的维度和提高模型的抽象能力。 +5. **激活层(Activation Layers)** +- `paddle.sparse.nn.ReLU`、`paddle.sparse.nn.ReLU6`:标准ReLU和ReLU6激活函数,支持在稀疏数据路径中使用,与常规的激活函数使用方法相同,但针对稀疏数据进行了优化。 +- `paddle.sparse.nn.LeakyReLU`:LeakyReLU激活层,为包含小负斜率的ReLU变体,适用于在稀疏数据中增强模型的非线性处理能力。 +- `paddle.sparse.nn.Softmax`:Softmax激活层,适用于稀疏数据路径,使用方法与常规密集数据的Softmax相同,但特别针对稀疏数据进行了优化,常用于处理多分类问题。 + + +## 4. 构建稀疏 ResNet 模型的示例代码 在 PaddlePaddle 中,稀疏 ResNet 的实现和使用与传统的稠密网络相似,这得益于 PaddlePaddle 稀疏模块的设计,使得调用体验与稠密高度一致,非常容易上手。通过利用稀疏技术,可以有效处理大规模稀疏数据集,提高计算效率和降低存储需求,这在处理现代大数据应用时显得尤为重要。 -## 5. 示例代码 +下面以稀疏 ResNet为例,说明Paddle对稀疏神经网络层的支持: ```python import paddle @@ -374,77 +357,14 @@ Tensor(shape=[1, 1, 100, 100, 64], dtype=paddle.float32, place=Place(cpu), stop_ values=[[0. , 0. , 0.08977110, 0. , 0. , 0. , 0. , 0.16325581, 0. , 0. , 0.08592274, 0. , 0. , 0. , 0.07656589, - 0. , 0.11471142, 0.01767202, 0.09576824, 0. , - 0.06328346, 0. , 0. , 0. , 0. , - 0. , 0.11039102, 0. , 0.02612690, 0. , - 0. , 0. , 0.36811280, 0.27737468, 0.14172454, - 0.08146347, 0. , 0. , 0.00239664, 0.13383773, - 0.05405550, 0.15424284, 0. , 0.01066782, 0. , - 0. , 0. , 0. , 0.02590318, 0.08370880, - 0. , 0. , 0. , 0.24637662, 0.09807874, - 0.16659400, 0. , 0. , 0.07821499, 0. , - 0.01074675, 0.00031681, 0. , 0. ], - [0. , 0.06284240, 0.13784820, 0.20940723, 0. , - 0. , 0.05285437, 0.15515041, 0.10529537, 0. , - 0.04321828, 0. , 0. , 0.14670819, 0.26492512, - 0. , 0.14278989, 0.11353996, 0.06671846, 0.14850950, - 0.05322032, 0.03145349, 0.13015728, 0. , 0. , - 0. , 0.05160457, 0. , 0.16703124, 0.24384394, - 0.00744244, 0. , 0. , 0.04347976, 0. , - 0. , 0. , 0. , 0.22055462, 0. , - 0. , 0.22349600, 0.07226329, 0.14150156, 0. , - 0.15833184, 0.03316063, 0. , 0. , 0.02844941, - 0. , 0.31135687, 0. , 0.08106169, 0. , - 0.31946257, 0.16892034, 0. , 0. , 0. , - 0.02278935, 0.13871309, 0. , 0.04356173], - [0.07027701, 0. , 0.24222264, 0.08168820, 0.10877223, - 0.32733595, 0.05810408, 0.23713312, 0.08619954, 0. , - 0.05535959, 0. , 0.28626207, 0.20127529, 0. , - 0.21020988, 0. , 0. , 0.24150310, 0.15729634, - 0. , 0.31431541, 0.09939002, 0. , 0. , - 0. , 0. , 0. , 0. , 0. , - 0. , 0. , 0. , 0. , 0.13229422, - 0. , 0. , 0. , 0.27942199, 0. , - 0.02403279, 0.06105895, 0. , 0. , 0. , - 0. , 0. , 0.20697114, 0. , 0.12839042, - 0. , 0. , 0.15398751, 0. , 0. , - 0. , 0. , 0.21327323, 0.13392673, 0.24080001, - 0.19320847, 0. , 0.09254151, 0. ], - [0.37628198, 0. , 0. , 0. , 0. , - 0.20390727, 0. , 0. , 0.01985047, 0.09249730, - 0.26726574, 0. , 0.21078694, 0.11854289, 0.16678692, - 0.03613931, 0. , 0. , 0.27509823, 0. , - 0.22757295, 0. , 0. , 0. , 0.11123202, - 0.06420810, 0. , 0. , 0.02349779, 0. , - 0. , 0. , 0.02530795, 0.16113043, 0. , - 0.16980153, 0. , 0.02904471, 0.19772613, 0.02743972, - 0.24667305, 0.06938203, 0. , 0.24336687, 0. , - 0. , 0.08654289, 0. , 0. , 0.10054247, + …… 0.12824626, 0.38880903, 0. , 0. , 0.23209766, 0. , 0. , 0. , 0.24539268, 0.17324814, 0. , 0. , 0. , 0. ]]) ``` - -# 四、Paddle 的稀疏调用体验与稠密的一致性 - -PaddlePaddle 的设计目标之一是提供一致的用户体验,无论是处理稀疏数据还是稠密数据。这意味着即便是在处理包含大量零值的数据集时,开发者也可以利用熟悉的接口和模式来构建和训练模型。 - -## 1. API设计的一致性 - -PaddlePaddle 的稀疏模块提供了与常规稠密操作相似的API接口,使得开发者无需学习新的API就能处理稀疏数据。例如: - -- **稀疏卷积层**:稀疏模块中的 `SubmConv3D` 直接对应于常规卷积操作中的 `Conv3D`。它们的参数非常相似,如 `in_channels`, `out_channels`, `stride`, `padding` 等。 -- **批归一化和激活函数**:稀疏模块同样提供了批归一化和激活函数,如 `BatchNorm3D` 和 `ReLU`,其用法与常规模块中的相同。 - -## 2. 集成度:训练和推理的处理流程 - -无论是稀疏还是稠密模型,PaddlePaddle 中的训练和推理流程保持一致。稀疏操作可以与PaddlePaddle的其他特性(如自动微分和优化器)无缝集成,使得构建和训练稀疏模型与常规模型几乎无异。 - -1. **定义模型**:无论选择稀疏还是稠密模型,模型定义的方式都是相似的,使用 `paddle.nn.Layer` 类来构建网络层。 -2. **编译模型**:使用 `paddle.Model` 对象来包装定义好的网络,然后编译,包括设置优化器、损失函数和评估指标。 -3. **训练和评估**:通过调用 `.fit` 和 `.evaluate` 方法来进行训练和评估,这与处理稠密数据的流程完全一致。 +PaddlePaddle 的稀疏模块可以创建类似于常规 ResNet 的模型架构,但使用的是稀疏卷积层替换传统的密集卷积层。每个稀疏卷积层后通常跟随一个批归一化层和 ReLU 激活函数,形成一个基础的稀疏残差块。 @@ -457,6 +377,8 @@ PaddlePaddle 的稀疏模块提供了与常规稠密操作相似的API接口, 这段代码定义了一个基于 PaddlePaddle 的稀疏3D残差网络(SparseResNet3D),主要用于处理3D点云数据,如自动驾驶系统中的激光雷达扫描数据。它通过稀疏卷积层对体素化(voxelized)的点云数据进行特征提取和处理。 > """该符号内代码注释为新增""" + + ### 导入所需库和模块 ```python