添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  • 使用卷积神经网络进行图像分类
  • CIFAR-100数据集上基于Vision Transformer 实现图片分类
  • GAMMA比赛多模态眼底图像数据集下基于EfficientNet和ResNet构造fundus_img和oct_img的分类模型
  • MosMedData: 新冠肺炎胸部 CT扫描数据集上基于3D-CNN实现二分类
  • 基于图片相似度的图片搜索
  • 基于U-Net卷积神经网络实现宠物图像分割
  • 通过OCR实现验证码识别
  • 通过Sub-Pixel实现图像超分辨率
  • 人脸关键点检测
  • 点云处理:实现PointNet点云分类
  • 点云处理:实现PointNet点云分割
  • 自然语言处理
  • 用N-Gram模型在莎士比亚文集中训练word embedding
  • IMDB 数据集使用BOW网络的文本分类
  • 使用预训练的词向量完成文本分类任务
  • 使用注意力机制的LSTM的机器翻译
  • 基于Transformer实现英语到西班牙语的翻译任务
  • 使用序列到序列模型完成数字加法
  • 使用协同过滤实现电影推荐
  • 强化学习——Actor Critic Method
  • 强化学习——Advantage Actor-Critic(A2C)
  • 强化学习——Deep Deterministic Policy Gradient (DDPG)
  • 强化学习——DQN玩合成大西瓜
  • 用飞桨框架2.0造一个会下五子棋的AI模型
  • 通过AutoEncoder实现时序数据异常检测
  • Jena Climate时间序列数据集上使用LSTM进行温度的预报
  • 证券数据集下使用LSTM模型预测A股走势
  • 使用动转静完成以图搜图
  • 生成式对抗网络
  • 图像风格迁移模型-CycleGAN
  • 通过DCGAN实现人脸图像生成
  • MNIST数据集下用Paddle框架的动态图模式玩耍经典对抗生成网络(GAN)
  • 城市街景分割数据集下使用对抗网络Pix2Pix根据掩码生成街景
  • API 文档
  • 代码贡献流程
  • 新增 API 开发&提交流程
  • 贡献前阅读
  • 开发 API Python 端
  • 开发 C++ 算子
  • API 设计和命名规范
  • API 文档书写规范
  • API 单测开发及验收规范
  • 算子性能优化 提交流程
  • 算子性能优化 方法介绍
  • 算子性能优化 验收规范
  • Kernel Primitive API
  • API 介绍
  • API 介绍 - IO
  • API 介绍 - Compute
  • API 介绍 - OpFunc
  • API 示例
  • 示例 - ElementwiseAdd
  • 示例 - Reduce
  • 示例 - Model
  • 算子数据类型扩展 提交流程
  • 算子数据类型扩展 验收规范
  • 低精度算子开发贡献指南
  • 低精度算子支持开发规范
  • 低精度算子单测开发规范
  • 曙光开发指南
  • 曙光智算平台-Paddle 源码编译和单测执行
  • Paddle 适配 C86 加速卡详解
  • Paddle 框架下 ROCm(HIP)算子单测修复指导
  • 硬件接入飞桨后端指南
  • 硬件接入飞桨后端方案介绍
  • 训练硬件 Custom Device 接入方案介绍
  • 自定义 Runtime
  • Device 接口
  • Memory 接口
  • Stream 接口
  • Event 接口
  • 集合通讯接口
  • Profiler 接口
  • 自定义 Kernel
  • Kernel 函数声明
  • Kernel 实现接口
  • Context API
  • Tensor API
  • Exception API
  • Kernel 注册接口
  • 新硬件接入示例
  • 文档贡献指南
  • 规范和参考信息
  • 报错信息文案书写规范
  • 代码风格检查指南
  • Paddle CI 测试详解
  • Python 文档示例代码书写规范
  • Paddle 中的类型提示与 Q&A
  • 常见问题与解答
  • 2.0 升级常见问题
  • 安装常见问题
  • 数据及其加载常见问题
  • 组网、训练、评估常见问题
  • 模型保存常见问题
  • 参数调整常见问题
  • 分布式训练常见问题
  • 其他常见问题
  • 3.0 Beta Release Note
  • 问题: stop_gradient=True 的影响范围?
  • 问题:请问 paddle.matmul paddle.multiply 有什么区别?
  • 问题:请问 paddle.gather torch.gather 有什么区别?
  • 问题:在模型组网时,inplace 参数的设置会影响梯度回传吗?经过不带参数的 op 之后,梯度是否会保留下来?
  • 问题:如何不训练某层的权重?
  • 问题:使用 CPU 进行模型训练,如何利用多处理器进行加速?
  • 问题:使用 NVIDIA 多卡运行 Paddle 时报错 Nccl error,如何解决?
  • 问题:多卡训练时启动失败, Error:Out of all 4 Trainers ,如何处理?
  • 问题:训练时报错提示显存不足,如何解决?
  • 问题:如何提升模型训练时的 GPU 利用率?
  • 问题:如何处理变长 ID 导致程序内存占用过大的问题?
  • 问题:训练过程中如果出现不收敛的情况,如何处理?
  • 问题:Loss 为 NaN,如何处理?
  • 问题:训练后的模型很大,如何压缩?
  • 问题: load_inference_model 在加载预测模型时能否用 py_reader 读取?
  • 问题:预测时如何打印模型中每一步的耗时?
  • 问题:模型训练时如何进行梯度裁剪?
  • 问题:静态图模型如何拿到某个 variable 的梯度?
  • 问题:paddle 有对应 torch.masked_fill 函数 api 吗,还是需要自己实现?
  • 问题:在 paddle 中如何实现 torch.nn.utils.rnn.pack_padded_sequence torch.nn.utils.rnn.pad_packed_sequence 这两个 API?
  • 问题:paddle 是否有爱因斯坦求和(einsum)这个 api?
  • 问题:BatchNorm在训练时加载预测时保存的模型参数时报错 AssertionError: Optimizer set error, batch_norm_1.w_0_moment_0 should in state dict.
  • 其中, paddle.gather 的参数 x index axis 分别与 torch.gather 的参数 input index dim 意义相同。

    两者在输入形状、输出形状、计算公式等方面都有区别,具体如下:

  • paddle.gather

  • 输入形状: x 可以是任意的 N 维 Tensor。但 index 必须是形状为 [M] 的一维 Tensor,或形状为 [M, 1] 的二维 Tensor。

  • 输出形状:输出 Tensor out 的形状 shape_out x 的形状 shape_x 的关系为: shape_out[i] = shape_x[i] if i != axis else M

  • 计算公式: out[i_1][i_2]...[i_axis]...[i_N] = x[i_1][i_2]...[index[i_axis]]...[i_N]

  • 举例说明:假设 x 的形状为 [N1, N2, N3] index 的形状为 [M] axis 的值为 1,那么输出 out 的形状为 [N1, M, N3] ,且 out[i_1][i_2][i_3] = x[i_1][index[i_2]][i_3]

  • torch.gather

  • 输入形状: input 可以是任意的 N 维 Tensor,且 index.rank 必须等于 input.rank

  • 输出形状:输出 Tensor out 的形状与 index 相同。

  • 计算公式: out[i_1][i_2]...[i_dim]...[i_N] = input[i_1][i_2]...[index[i_1][i_2]...[i_N]]...[i_N]

  • 举例说明:假设 x 的形状为 [N1, N2, N3] index 的形状为 [M1, M2, M3] dim 的值为 1,那么输出 out 的形状为 [M1, M2, M3] ,且 out[i_1][i_2][i_3] = input[i_1][index[i_1][i_2][i_3]][i_3]

  • 只有当 x.rank == 1 index.rank == 1 时, paddle.gather torch.gather 功能相同。其余情况两者无法直接互换使用。

  • paddle.gather 不支持 torch.gather sparse_grad 参数。

  • 使用多进程 DataLoader 加速数据读取:训练数据较多时,数据处理往往会成为训练速度的瓶颈,paddle 提供了异步数据读取接口 DataLoader,可以使用多进程进行数据加载,充分利用多处理的优势,具体使用方法及示例请参考 API 文档: paddle.io.DataLoader

  • 推荐使用支持 MKL(英特尔数学核心函数库) 的 paddle 安装包,MKL 相比 Openblas 等通用计算库在计算速度上有显著的优势,能够提升您的训练效率。

  • #一旦不再使用即释放内存垃圾,=1.0 垃圾占用内存大小达到 10G 时,释放内存垃圾
    export FLAGS_eager_delete_tensor_gb=0.0
    #启用快速垃圾回收策略,不等待 cuda kernel 结束,直接释放显存
    export FLAGS_fast_eager_deletion_mode=1
    #该环境变量设置只占用 0%的显存
    export FLAGS_fraction_of_gpu_memory_to_use=0
            

    详细请参考官方文档存储分配与优化 调整相关配置。

    此外,建议您使用AI Studio 学习与 实训社区训练,获取免费 GPU 算力,提升您的训练效率。

    问题:如何提升模型训练时的 GPU 利用率?

  • 答复:有如下两点建议:

  • 如果数据预处理耗时较长,可使用 DataLoader 加速数据读取过程,具体请参考 API 文档:paddle.io.DataLoader

  • 如果提高 GPU 计算量,可以增大batch_size,但是注意同时调节其他超参数以确保训练配置的正确性。

  • 以上两点均为比较通用的方案,其他的优化方案和模型相关,可参考官方模型库 models 中的具体示例。

    问题:如何处理变长 ID 导致程序内存占用过大的问题?

  • 答复:请先参考显存分配与优化文档 开启存储优化开关,包括显存垃圾及时回收和 Op 内部的输出复用输入等。若存储空间仍然不够,建议:

  • 降低 batch_size

  • 对 index 进行排序,减少 padding 的数量。

  • 检查数据集中训练数据的准确率,数据是否有错误,特征是否归一化;

  • 简化网络结构,先基于 benchmark 实验,确保在 baseline 网络结构和数据集上的收敛结果正确;

  • 对于复杂的网络,每次只增加一个改动,确保改动后的网络正确;

  • 检查网络在训练数据上的 Loss 是否下降;

  • 检查学习率、优化算法是否合适,学习率过大会导致不收敛;

  • 检查batch_size设置是否合适,batch_size过小会导致不收敛;

  • 检查梯度计算是否正确,是否有梯度过大的情况,是否为NaN

  • # 设置 config:
    def set_config(args):
        config = Config(args.model_file, args.params_file)
        config.disable_gpu()
        # enable_profile()打开后会统计每一步耗时
        config.enable_profile()
        config.switch_use_feed_fetch_ops(False)
        config.switch_specify_input_names(True)
        config.switch_ir_optim(False)
        return config
             
  • 使用paddle.static.Print()接口,可以打印中间变量及其梯度。

  • 将变量梯度名放到 fetch_list 里,通过Executor.run()获取,一般 variable 的梯度名是 variable 的名字加上 "@GRAD"。

  • 对于参数(不适用于中间变量和梯度),还可以通过Scope.find_var()接口,通过变量名字查找对应的 tensor。

  • 后两个方法需要使用变量名,飞桨中变量的命名规则请参见Name

    # paddlepaddle>=2.0
    import paddle
    import numpy as np
    paddle.enable_static()
    data = paddle.static.data('data', shape=[4, 2])
    out = paddle.static.nn.fc(x=data, size=1, num_flatten_dims=1, name='fc')
    loss = paddle.mean(out)
    loss = paddle.static.Print(loss)  # 通过 Print 算子打印中间变量及梯度
    opt = paddle.optimizer.SGD(learning_rate=0.01)
    opt.minimize(loss)
    exe = paddle.static.Executor()
    exe.run(paddle.static.default_startup_program())
    loss, loss_g, fc_bias_g = exe.run(
        paddle.static.default_main_program(),
        feed={'data': np.random.rand(4, 2).astype('float32')},
        fetch_list=[loss, loss.name + '@GRAD', 'fc.b_0@GRAD'])  # 通过将变量名加入到 fetch_list 获取变量
    print(loss, loss_g, fc_bias_g)
    print(paddle.static.global_scope().find_var('fc.b_0').get_tensor())  # 通过 scope.find_var 获取变量
    paddle.seed(123)
    x = paddle.rand([3, 3], dtype='float32')
    # Tensor(shape=[3, 3], dtype=float32, place=CUDAPlace(0), stop_gradient=True,
    #        [[0.00276479, 0.45899123, 0.96637046],
    #         [0.66818708, 0.05855134, 0.33184195],
    #         [0.34202638, 0.95503175, 0.33745834]])
    mask = paddle.randint(0, 2, [3, 3]).astype('bool')
    # Tensor(shape=[3, 3], dtype=bool, place=CUDAPlace(0), stop_gradient=True,
    #        [[True , True , False],
    #         [True , True , True ],
    #         [True , True , True ]])
    def masked_fill(x, mask, value):
        y = paddle.full(x.shape, value, x.dtype)
        return paddle.where(mask, y, x)
    out = masked_fill(x, mask, 2)
    # Tensor(shape=[3, 3], dtype=float32, place=CUDAPlace(0), stop_gradient=True,
    #        [[2.        , 2.        , 0.96637046],
    #         [2.        , 2.        , 2.        ],
    #         [2.        , 2.        , 2.        ]])
            

    问题:在 paddle 中如何实现torch.nn.utils.rnn.pack_padded_sequencetorch.nn.utils.rnn.pad_packed_sequence这两个 API?

  • 答复:目前 paddle 中没有和上述两个 API 完全对应的实现。关于 torch 中这两个 API 的详细介绍可以参考知乎上的文章 pack_padded_sequence 和 pad_packed_sequence : pack_padded_sequence的功能是将 mini-batch 数据进行压缩,压缩掉无效的填充值,然后输入 RNN 网络中;pad_packed_sequence则是把 RNN 网络输出的压紧的序列再填充回来,便于进行后续的处理。 在 paddle 中,大家可以在 GRU、LSTM 等 RNN 网络中输入含有填充值的 mini-batch 数据的同时传入对应的sequence_length参数实现上述等价功能,具体用法可以参考 RNN

  • 问题:BatchNorm在训练时加载预测时保存的模型参数时报错 AssertionError: Optimizer set error, batch_norm_1.w_0_moment_0 should in state dict.

  • 答复:BatchNorm 在 train 模式和 eval 模式下需要的变量有差别,在 train 模式下要求传入优化器相关的变量,在 eval 模式下不管是保存参数还是加载参数都是不需要优化器相关变量的,因此如果在 train 模式下加载 eval 模式下保存的 checkpoint,没有优化器相关的变量则会报错。如果想在 train 模式下加载 eval 模式下保存的 checkpoint 的话,用 paddle.load 加载进来参数之后,通过 set_state_dict 接口把参数赋值给模型,参考以下示例:

  • import paddle
    bn = paddle.nn.BatchNorm(3)
    bn_param = paddle.load('./bn.pdparams')
    bn.set_state_dict()