Skip to content

Releases: PaddlePaddle/Paddle

PaddlePaddle 2.6.1 Release Note

09 Apr 11:19
fbf852d
Compare
Choose a tag to compare

发版说明

此版本在新功能方面,引入了对Fake GroupWise Quant的支持,有助于用户更好地进行模型量化。同时新增了图神经网络训练引擎PGLBox,支持超大规模图模型GPU多机多卡高效训练。此外,增加了对自定义设备的支持,进一步扩展PaddlePaddle的功能范围。在bug方面,解决了一些核心功能、数据加载以及网络通信等方面的问题。修复了多个安全问题,包括一些潜在的安全漏洞,进一步提高框架代码安全性,并更新了安全公告。

新特性

  • 支持Fake GroupWise量化(#61900:新增对一种量化方法的支持,可以提高模型的性能效率。
  • 支持图神经网络GPU训练(#60495#62111:新增图神经网络训练引擎PGLBox,支持超大规模图模型GPU多机多卡高效训练。
  • 其他改进:支持tile op int8模式推理,并添加vlog语句 (#60261),repeat_interleave支持bfloat16数据类型的Tensor输入 (#61854),自定义设备支持动态图模式的c_embedding算子 (#60774),在CINN(自定义中间网络)框架中,将IntrinsicOps添加到ir_codes_collector中。

Bug修复

  • 修复权重量化内核错误(#60184:解决了在权重量化内核中当n不能被64整除时的问题。
  • 修复量化感知测试问题(#61211:修复了量化感知训练(QAT)测试中的问题,以确保其正常运行。
  • 修复Paddle-TRT集成问题(#61806, #61605, #61966:对Paddle-TRT集成进行了多项修复,包括缓存键值(KV)量化和单元测试失败问题。
  • 禁用LLM_INT8 UT(#62282:禁用了大型语言模型(LLM)INT8精度的单元测试,以避免不必要的运行时。
  • 修复test_benchmark单测编译失败问题(#61427:修复了test_benchmark单测编译失败的问题#60092
  • 修复工具包的数据加载器(#61867:对工具包的数据加载器进行了必要的更正。
  • 修复put_along_axis系列问题(#62065:对reduce参数新增支持min/max/mean三种可选值,修复了reduce=add/mul下的反向梯度计算Bug, 修复了reduce=mul下的GPU前向计算Bug,修复了size过大时的前向计算Bug。
  • 修复Windows平台下的编译Bug(#60308:修复windows平台下的编译找不到common库的bug。
  • 修复OpenSSL-CPU编译错误(#62079:修复cpu-openblas编译场景中未正确链接 Python 库导致的编译bug。

安全修复

文档

  • 文档风格改进(#61688:改进了文档的样式和格式。
  • 安全公告更新(#60532, #60649:更新了2023年的安全公告,以通知用户潜在的安全问题。

PaddlePaddle 2.6.0 Release Note

08 Jan 06:43
e032331
Compare
Choose a tag to compare

1. 重要更新

  • 新一代中间表示 PIR:为了进一步提升飞桨框架的可扩展性,研制了新一代中间表示 PIR(Paddle Intermediate Representation)。实现系统性的抽象飞桨框架底层核心概念,如:Operation、Attribute 和 Type 等,为开发者提供了灵活、高效的基础组件。通过引入 Dialect 机制,可以全面、分层次地满足各模块对中间表示的需求,从而极大地提升了框架的扩展性。PIR 严格遵循 SSA(Static Single Assignment)原则,在实现了顶层结构的统一的同时,还确保了“算子顺序性”与“计算图语义”的和谐共存。此外,PIR 提供了更为简洁、低成本的 Pass 开发流程,内置了一系列丰富且功能完备的 Pass 优化策略,为大型模型的极致性能优化提供了技术支撑。
  • 动转静编译优化架构:为了进一步提升框架的模型开发性能,飞桨动转静训练能力全面升级,支持自适应的图构建能力,在 700 多个飞桨产业级模型上验证,一键动转静训练成功率达到 100%。同时,飞桨框架的神经网络编译器 CINN 整合入飞桨主 Repo,使得编译器与飞桨更加融为一体。CINN 完成了架构的梳理和扩展能力的完善,提升系统稳定性。基于 PIR 完成动转静、组合算子、执行器和编译器的紧密联动,为飞桨框架整体性能的提升提供了更大的空间。
  • 增强动态图分布式能力:大模型对框架的分布式训练性能提出了更高的需求。飞桨在通信库、图分析、分布式策略和任务启停等维度进行了全面优化,增强了飞桨动态图的分布式计算能力,为大型模型高效训练提供了支持。在性能方面,通过减少流水线 GPU 显存占用、采用 TensorFusion 技术、实现通信计算 overlap 以及减少非必要的数据同步拷贝等方式,进一步提升了训练性能。同时,通过环境变量控制 Optimizer 等方式提高了混合并行调试的灵活性。此外,通过相关 Bug 的修复,显著提升了系统的稳定性。
  • 动静统一自动并行架构:为了进一步降低大模型编程和优化难度,飞桨对动静统一的半自动并行(Auto Parallel)编程范式进行了全面的优化,简化了开发者的编程复杂度。开发者无需深入了解手动并行编程范式下的复杂概念和 API 接口,如行切分、列切分等,仅需通过少量的张量切分标注即可完成混合并行模型的构建,框架便能够自动推导出所有张量和算子的分布式切分状态,并添加合适的通信算子。同时支持一键动转静进行分布式训练,使开发者能够高效地实现任意混合并行策略,大幅简化了混合并行训练代码的开发过程。
  • 硬件适配方案(CustomDevice):大模型场景下新硬件并行训练需求增加,飞桨新增了对分布式高级策略、自定义算子和自定义融合策略的支持。升级了分布式通信库,新增了对 MP、GroupShared、PP、SP 和 MOE 等多项高级分布式策略的支持。同时,支持厂商灵活接入不同颗粒度的 Transformer 算子库并通过融合 Pass 修改计算图进行性能加速。
  • 安装和开发体验:采用模块化编译的方式优化了 CMake 代码的逻辑,提升了飞桨全量编译和增量编译的效率,提升了 RD 开发效率,同时支持了 Python3.12,CUDA12,Hopper 架构编译,并引入 Clang 等工具全面优化了代码格式。此外,将 C++单测从链接静态库的方式转变为链接动态库,减小编译体积。这些改进措施为用户提供更加流畅、高效的安装和开发体验。

2. 不兼容升级

  • 为了避免误用,去除了 0 维 Tensor 兼容态开关,实现 API 行为和业界主流习惯一致。在上一个版本中,我们已经支持 0 维 Tensor,但是考虑到尽量避免部分模型的报错,添加了兼容态开关。即在一些模型套件使用较多且没有修改完成的场景中还是默认使用只有 1 个元素的 1 维 Tensor 来替代 0 维 Tensor。这个版本去除了兼容态开关,在任何场景中都不会再使用只有 1 个元素的 1 维 Tensor 来替代 0 维 Tensor,应该支持 0 维 Tensor 的 376 个 API 的行为都完成了修正和统一,彻底完成对 0 维 Tensor 的支持。#57036, #54581, #54500
  • 为了提升 API 易用性,将 paddle.nn.functional.diag_embed 精简为 paddle.diag_embed,并支持 Tensor.diag_embed 方式使用。 #58223
  • 为了解决在静态图下 Tensor 索引写(如 tensor[0] = 10)导致的微分计算错误问题,并符合静态图的规范,本版本引入了 paddle.static.setitem API。在静态图环境中,更推荐使用此 API 来支持 tensor 的索引写操作,而非下标运算符。这一变化并不影响动态图环境,其中仍允许使用下标运算符进行索引写操作。#53682
  • 本版本中 paddle.fluid API 全面退出历史舞台。在本次更新中,我们彻底移除了所有 paddle.fluid API,并删除了 fluid 目录。同时,飞桨底层的少量公共组件已被整合至 paddle.base 目录中。使得飞桨用户无需再关注 fluid 相关概念和接口,进一步简化了飞桨 API 体系,提升可读性。#56576, #54424, #54829, #53992, #54806, #55754, #55986, #55345, #56099, #51717, #54152, #55522, #55757, #58521, #54936, #55007, #55661, #55970

3. 训练框架(含分布式)

Python API

升级 Tensor 索引机制

本版本全面优化了 Tensor 的基础索引、高级索引以及联合索引功能,以更好地符合业界标准与用户习惯。具体包括:在基础索引中增加了对 view 的支持,修正了高级索引中的一些错误行为,并实现了联合索引的读取功能。此外,我们还将索引解析下沉到 C++层面,改进了高级索引算子的性能,并移除了 bool 索引中的冗余计算。通过这些优化措施,Tensor 的基础索引、高级索引和联合索引性能得到了全面提升。#56893, #58643, #57986, #56272, #58856, #55211, #57023, #56613, #55602, #59281, #57737

升级 Inplace 机制

在之前的版本中,为了确保反向微分计算的正确性,当某个 API 的反向计算依赖于其前向输入数据时,飞桨会避免使用 Inplace 操作方式,因为这种方法可能会覆盖原始输入数据。虽然这种机制简化了实现过程,但也限制了许多 API 实现 Inplace 功能,从而影响了用户体验。
在本版本中,飞桨对 Inplace 机制进行了全面升级。实现自动检测反向计算对前向输入的依赖关系,并在需要时保存这些输入数据,从而支持更多的 Inplace 操作。这一改进不仅提升了内存使用效率,还增强了 API 的功能性。
此外,我们新增了 109 个支持 Inplace 操作的 API,包括 paddle.abs_、paddle.sin_/cos_/tan_、比较操作如 paddle.greater_than_/less_than_/equal_、逻辑操作如 paddle.logical_and_/logical_or_/logical_not_,以及 paddle.neg_和 paddle.log_等。在丰富飞桨的功能集同时,提升了用户在数值计算和深度学习任务中的效率与便捷性。#54683, #55078, #55576, #56888, #55509, #57093

其他新增 API

  • 新增 paddle.nn.functional.scaled_dot_product_attention,显著提升大模型中注意力(attention)机制的计算效率,更好地满足大规模深度学习模型对高性能计算的需求。。#55242
  • 新增了一系列科学计算相关 API,包括 paddle.cummax 和 paddle.cummin 用于累积最大值和最小值的计算,paddle.index_fill 和 paddle.masked_fill 用于按索引或掩码填充张量,paddle.linalg.pca_lowrank 用于低秩主成分分析,paddle.hypot 用于计算直角三角形的斜边长,以及 paddle.atleast_1d、paddle.atleast_2d 和 paddle.atleast_3d 用于确保张量至少有一维、二维或三维。同时,我们还提供了 paddle.select_scatter 和 paddle.diagonal_scatter 用于更灵活地选择和散列张量数据,以及 paddle.multigammaln 用于计算多伽马函数的自然对数。此外,本版本新增优化器相关 API,包括:paddle.optimizer.lr.LinearLR 和 paddle.optimizer.lr.CosineAnnealingWarmRestarts 学习率调度策略;引入了 paddle.io.SubsetRandomSampler 以支持从数据子集中进行随机采样。这些新增 API 将进一步提升飞桨在各类应用场景中的灵活性和高效性。。 #57416, #53546, #53743, #57295, #57726, #58764, #58323, #57720, #58209, #58214, #57792, #51395, #57724, #57355, #57744, #58244, #57599, #59343, #57879

新一代中间表示(PIR)

PIR(Paddle Intermediate Representation)对底层的核心概念如 Operation、Attribute 和 Type 等进行了系统性的抽象,为开发者构建了一套灵活且强大的基础组件。此外,通过引入 Dialect 这一概念,飞桨框架能够全面且分层次地管理各模块对中间表示(IR)的需求,并支持开发者根据特定需求定制化扩展 Dialect,从而显著提升了框架的扩展性和适应性。在设计上,PIR 严格遵循 SSA(Static Single Assignment)原则,统一了顶层结构,实现了“算子顺序性”与“计算图语义”的兼容表示,为复杂的计算流程提供了清晰且一致的视图。为了进一步优化大模型的性能,PIR 还提供了一套更加简洁、低成本的 Pass 开发流程,包括 DRR(Declarative Rewrite Rule)和模式重写器(Pattern Rewriter)。同时,内置了一系列丰富且功能完备的 Pass 优化策略,这些策略能够针对大模型的特点进行深度优化,从而为大模型的极致性能提供了强有力支撑。通过这些创新设计和优化手段,PIR 为飞桨框架的高效运行和持续扩展奠定了坚实基础。

新功能

Read more

PaddlePaddle 2.5.0 Release Note

25 Jul 11:09
feff99f
Compare
Choose a tag to compare

PaddlePaddle 2.5.0 Release Note

1. 重要更新

  • 动静统一新架构:实现基础算子组合的动转静加编译器执行新模式,在ResNet50&Bert模型上完成动转静、组合算子、神经网络编译器优化加速全流程。动转静完成整图fallback核心功能开发,支持动转静失败时回退到动态图训练执行;组合算子设计一套包含150多个基础算子的基础算子体系,实现python层前向算子拆分机制和支持动、静态图的反向算子拆分机制,实现70多个常用前、反向算子的拆分;CINN编译器修复正确性问题,开发关键Pass,添加手工Schedule规则,实现内核代码自动生成,ResNet50模型性能提升12%,Bert模型性能提升10%。
  • PHI算子库算子架构统一:将原算子体系下剩余的350+算子内核全部统一到PHI算子库中,以及原算子体系中的算子定义方式也都统一为PHI算子库的算子定义形式(基于YAML配置定义算子),提升了架构统一性,降低了框架开发的理解成本;将PHI算子库依赖的Fluid头文件全部解耦,并独立编译为动态链接库,为框架的二次开发提供更轻量的算子库复用方式;继续对飞桨框架中不规范的算子以及算子内核进行规范化调整,便于开发者理解,降低了硬件的接入成本。
  • 静态图新执行器全面上线:静态图新执行器实现多项功能和性能优化,完成对原有多套旧执行器的统一和替换,成为静态图单卡和分布式训练python端入口以及动转静、控制流、CINN等后端默认使用的执行引擎,大幅提升框架调度性能,功能架构更加清晰,二次开发能力显著增强。
  • Python API 支持0维tensor:为形状为[1,] 及形状为 [] 的张量定义了清晰的语义。
  • 新的环境适配:适配了CUDA 12,并支持使用gcc12进行编译。

2. 不兼容升级

  • 飞桨API支持0维tensor。飞桨之前用shape为[1]的1维tensor来替代0维tensor,这种替代方式和当前主流习惯有差异,增加模型的开发调试成本,有时还会导致非预期错误。本版本对需支持0维tensor的376个API进行了修正,和社区广泛使用的工具如EinOps等实现。例如,在之前的情况下,模型训练中输出的loss为1维tensor,如果要取出或打印loss,往往需要使用 loss.numpy()[0] 这样的代码。经过本次修改后,模型训练中输出的loss为0维tensor,使用 loss.numpy() 即可取出或打印loss,代码简短、易懂且符合业界使用习惯。
  • paddle.fluid API全面退场。按照上个版本已预告的计划,本次退场了1116个paddle.fluidAPI及相关内部接口,剩余少量相关内部接口会在下个版本全部清理完成。fluid API属于飞桨2.0本计划移除但考虑到兼容性等因素延缓清理的历史API,本次退场清理不会影响基于飞桨2.0开发的程序,飞桨API体系也会更加简洁易懂。
  • 旧版动态图Python端代码完成清理。至此,Python端仅使用新版动态图调用C++核心逻辑。
  • 为统一静态图模型数据并行的训练方式,废弃原有的单进程多卡训练方式,包括 paddle.static.ParallelExecutorpaddle.static.CompiledProgram().with_data_parallel() 两个接口,原因是这套接口只支持单机多卡,不支持多机多卡,且底层执行性能较差。推荐统一使用多进程多卡训练方式,即 paddle.distributed.launch 接口来进行数据并行的分布式训练。该升级只影响静态图,不影响动态图和动转静训练,如果使用了废弃接口,请参考 数据并行 的文档修改模型代码。#50351#50501#51240#51701#51616#51369#52671
  • 移除框架中原有的昇腾NPU和寒武纪MLU的适配代码,全部升级为CustomDevice插件式适配方式,并将昇腾NPU和寒武纪MLU的适配代码迁移至PaddleCustomDevice仓库。

3. 训练框架(含分布式)

Python API

API 支持0维tensor

new API

  • 新增 jacobian 和 hessian API,用于科学计算。#53331
  • 新增稀疏计算API。例如 paddle.sparse.reshapepaddle.sparse.sumpaddle.sparse.slice 等。#46694, #51513, #53794, #51406
  • 新增其它API。例如 paddle.optimizer.LBFGSpaddle.index_putpaddle.logaddexp 等。#53314, #51912, #52886, #50843, #47282, #52284

动态图

新功能

  • 新增了paddle.nn.utils...
Read more

PaddlePaddle 2.4.2 Release Note

08 May 08:33
0e92adc
Compare
Choose a tag to compare

2.4.2 Release Note

版本修复了已知问题,并新增了少量功能。

训练框架(含分布式)

  • 修复 paddle.utils.dlpack.to_dlpack 在 for 循环里 API 多次创建 dlpack 对象的报错问题,修复引用对象计数错误导致 dlpack 实际指向内容被析构的问题。 #50138

  • 修复 paddle.multiplex API 在多维 Input Tensor 场景下访存越界的问题并添加 check 机制。 #49368

  • 引入 cutlass,实现 gemm+gather+scatter 的融合;优化 sparse conv 的训练和推理性能;优化 batch_norm 在 1D 输入数据下的推理性能。 #50118

  • 修复因使用 constexpr 导致 gcc54 环境下编译失败的问题。 #50421

  • 将 sum op 的 Kernel 迁移到 PHI 算子库,并且修复 infermeta 中 SelectedRows 无法获取正确 dim 的 bug。 #49342

  • 修复 eigen 头文件错误引用导致的偶发编译错误。 #48157

  • 修复 fold 算子在大 bs 输入下访存越界的问题。 #49491

  • 通过增加类型判别,解决发送张量时,维度不统一,造成流水线并行 hang 住的问题。 #50337

  • 修复了自定义算子输出梯度的参数顺序不连续时,反向算子的输出值可能为 None 的 bug。 #48656

  • 修复 paddle.queeze_ API 在 inplace 操作时 shape 重复修改导致结果错误 bug。 #49903

  • 修复动转静模式下无参数 Layer 无法调用 backward 的问题。 #49812

  • 修复 CUDA11.8 在 windows 的编译问题。 #50205

  • 修复 FusedDropoutActBiasGrad 在 H100 上不支持的错误。 #47285

  • 新增 debug_graphviz_path 选项至 build_strategy#46531

  • 修复未关闭的 popen 物件。 #47053

部署方向(Paddle Inference)

  • 完善混合精度推理功能,提高混合精度推理稳定性。重构二阶段式 convert_to_mixed_precision 接口底层实现, enable_use_gpu 新增 precision 参数支持一阶段式。 #49077#49239#49477

  • 支持 jetson ampere 架构下编译。 #49364

  • 修复 fc kernel 低精度模式下的精度问题。 #49781

  • 修复 CAPI 下, trt workspace 参数类型的错误。 #48350

  • 修复 Paddle 1.x 版本下 arg_max arg_min 没有 flatten dtype 参数,推理时会报错的问题。 #49771

  • 修复 split infermeta 重构后关于 lod 逻辑信息缺失问题。 #49745

  • 修复常量折叠 pass 不正确设置,导致 conv2d 权重经折叠后为非 persistable 而没有进入 TensorRT engine 问题。 #50105

2.4.2 Release Note

V2.4.2 fixed known bugs, and added a tiny set of features.

Training Framework (distributed included)

  • Fix the problem while using paddle.utils.dlpack.to_dlpack API to create dlpack objects multiple times in the for loop, and fix the bug that the reference counting error causes the memory actually pointed by dlpack to be destructed unexpectedly. #50138

  • Fixed the issue of out-of-bounds memory access when the input tensor is multi-dimensional in paddle.multiplex API. #49368

  • Fix the occasional compilation error caused by incorrect referencing of the Eigen header file. #48157

  • Fixed the bug that the output value of the backward operator may be None when the output gradient parameter order of the custom operator is not continuous.#48656

  • Add cutlass and implement the fusion kernel of gather+gemm+scatter; Optimize training and inference performance of sparse convolution; Optimize inference performance of batch_norm under 1D input data.#50118

  • Fix compilation failure in gcc54 environment caused by using constexpr. #50421

  • Move sum op kernel to PHI and fix bug that can't get correct SelectedRows' dims when run infermeta.#49342

  • Fixed the issue that the fold operator accesses memory out of bounds under large bs input.#49491

  • Fix the problem that no parameter Layer cannot call backward under dynamic to static mode.#49812

  • Fix the compile problem of CUDA11.8 on windows platform.#50205

  • Fix the unsupported error for FusedDropoutActBiasGrad on H100.#47285

  • Add debug_graphviz_path option into build_strategy.#46531

  • Fix the not closed popen object.#47053

Deployment Direction (Paddle Inference)

  • Improve the functionality and stability of mixed-precision inference. Reconstruct the implementation of interface convert_to_mixed_precision and add parameter precision to interface enable_use_gpu.#49077#49239#49477

  • Support compilation under jetson ampere architecture.#49364

  • Fixed fc kernel diff.#49781

  • Fixed the error of trt workspace parameter type under CAPI. #48350

  • Fixed the error caused by arg_max/arg_min without flatten dtype parameter in Paddle 1.x version. #49771

  • Fixed the bug of missing information about lod logic after split infermeta's refactoring. #49745

  • Fixed the bug of the constant-folding pass, which causes the conv2d weight to be non-persistent after folding and not enter the TensorRT engine. #50105

PaddlePaddle 2.4.1 Release Note

13 Dec 09:22
4743cc8
Compare
Choose a tag to compare

去除飞桨对python.so的依赖,修复在包括conda在内的特定的环境下,因无法找到python.so而造成运行失败的Bug。

Remove the dependence of the Paddle on python.so, and fix the bug that fails to execute due to the inability to find python.so in specific environments, including conda.

PaddlePaddle 2.4.0 Release Note

28 Nov 01:45
3fa7a73
Compare
Choose a tag to compare

2.4.0 Release Note

1. 重要更新

  • 新动态图架构正式生效:新动态图框架调大幅提升了调度性能,超90%API的调度性能提升超过50%,超50%套件模型性能提升超过5%,功能架构更加清晰,二次开发能力和体验显著增强。

  • 全面提升了飞桨的动静统一能力: 动转静功能提供了更加丰富的Python语法支持,飞桨的Python语法覆盖率达到90%,对语法转写逻辑进行了重点地优化,完备地支持了控制流语法,提供了更加流畅的一键转静态图体验;借助全新升级的静态图执行器,让动转静训练具有更优的加速能力,重点模型测试显示接近静态图最佳水平;提升了动转静的可扩展性,新增支持多函数合并导出和推理,支持用户使用PHI算子库进行二次开发和灵活部署,有效支撑语音领域U2++特色模型的自定义解码。

  • 新增稀疏计算类API: 新增55个稀疏API paddle.sparse.*,支持稀疏计算主流场景,已应用于3D点云目标检测、Sparse Transformers等任务的稀疏训练和推理部署,高稀疏度场景下相比使用DenseTensor提速105.75%,相比同类产品稀疏计算提速4.01%~58.55%;支持多种稀疏Tensor(SparseCoo 和 SparseCsr等)的计算,极致节省显存;同时保持了一致的使用体验,和稠密Tensor的API使用方式一致。

  • 大规模图神经网络GPU训练引擎: 通过SSD、内存、显存的异构层次化存储技术,突破显存瓶颈,支持超大规模图的全GPU存储和训练;实现了游走、采样、训练的全GPU一体化解决方案,相比传统的分布式CPU解决方案,相同成本的情况下训练速度提升10+倍。

  • 环境适配: 新增了适配CUDA11.7 版本的预编译安装包,新增了支持在Ubuntu 22.04及以上版本中运行。

前瞻性预告

  • 飞桨框架将在2.5版本废弃对python 3.6的支持。
  • 飞桨框架将会逐步废弃python端的paddle.fluild命名空间下的API,在2.5版本时,部分该命名空间下的API将会被直接删除。

2. 不兼容升级

  • 取消了适配CUDA10.1 版本的预编译安装包。
  • Tensor.clear_gradient(bool set_to_zero)接口不再接收kwargs传入的值,只能通过args传入set_to_zero的bool变量。
  • 为了提高显存利用效率,动态图默认仅保留前向叶子结点变量的梯度如训练中网络参数的梯度,而不再支持默认保留非叶子结点的梯度。如果需要保留特定Tensor的梯度,可以在反向执行前调用Tensor.retain_grads()接口。
  • paddle.autograd.PyLayer将不再支持输入是tuple的情况,如果输入希望是一组Tensor的情况请传入list of Tensor。

3. 训练框架(含分布式)

(1)新增API和增强API功能

  • 新增稀疏计算类API:paddle.sparse

  • 新增语音领域API: paddle.audio

    • 新增MFCC、Spectrogram、LogMelSpectrogram等特征提取API,支持GPU计算,相比CPU实现处理性能提升 15x 倍以上,可大幅提升语音模型训练GPU利用率。#45424
    • 新增窗函数、离散余弦变换等特征提取基础API,方便用户自定义语音特征提取。#45424
    • 新增语音 IO 模块,提供2种 音频I/O backend,支持6种编解码,便捷地实现语音数据的加载。 #45939
    • 新增TESS,ESC50语音分类数据集,方便用户完成经典语音分类模型。#45939
  • 新增图学习领域API: paddle.geometric

    • 图学习逐渐成为机器学习领域的关键技术,飞桨新增paddle.geometric模块提供更好的图学习建模和训练开发体验。
      • 消息传递:图学习消息传递机制是图建模的基础,因此新增7个图学习消息传递API,更方便完成进行图学习建模。其中,新增的3个消息传递融合算子可大幅减少图模型训练显存占用,稠密图场景下GCN系列模型可节省50%+显存,训练速度可提升20%+。#44848, #44580, #43174, #44970
      • 图采样:图采样是图模型训练的性能瓶颈,此次新增了高性能图采样算子,支持高并发图采样,GraphSage的采样速度可提升32倍以上,模型训练速度可提升12倍以上。#44970
  • 新增视觉领域API

    • paddle.vision新增目标检测领域算子paddle.vision.distribute_fpn_proposals(#43736), paddle.vision.generate_proposals(#43611), paddle.vision.matrix_nms(#44357), paddle.vision.prior_box和paddle.vision.box_coder(#47282)。
  • 增强API功能

    • 增加BatchNorm1D的大batch_size计算功能 #43072
  • 完善集合通信分布式训练API

    • 完善fleet.init函数,增加log_level参数,方便用户查看运行过程中的日志 #45909
    • 新增paddle.distributed.fleet.recompute_sequential paddle.distributed.fleet.recompute_hybrid接口,方便用户使用recompute功能#45348
    • 新增paddle.distributed.fleet.layers.mpu package,方便用户使用张量并行功能 #45803
    • 新增通信API paddle.distributed.destroy_process_group paddle.distributed.isend paddle.distributed.irecv paddle.distributed.all_to_all_single,提升了通信的功能完备性和易用性 #43918
    • 新增paddle.distributed.stream 通信package,性能比基础版本提升5%到10% #46023 #45282
    • 通信API新增多种数据类型Char/Byte/Bool等的支持,提升了通信的功能完备性和易用性 #45574 #45440
    • 通信API异步参数从use_calc_stream变成sync_op,增强了接口的语义可读性 #46493
  • 增强高层API

    • 高层API中视觉模型ResNeXt实现复用ResNet代码进行重构。 #40588
    • 高层API中视觉模型Inceptionv3、MobileNetv1、MobileNetv2、ShuffleNetv2实现改进。#40431

(2)新功能及重要功能升级

  • 新动态图架构正式上线:新动态图框架调度性能大幅提升,相比原有架构大幅提升了调度性能,超90%API的调度性能提升超过50%,超50%套件模型性能提升超过5%; 新动态图架构清晰,耦合度低,基于新架构实现Hook、PyLayer等扩展模块的学习与开发成本显著降低。#37550#37574#37813#37926#39192#37599#37406#37466#37599#40945#39989

  • 高阶自动微分机制:为了更好支持科学计算等场景,飞桨框架针对高阶自动微分能力进一步完善优化。目前,已在paddle.incubate.autograd 目录下提供了支持前反向高阶自动微分相关试用功能及API(当前处于孵化状态,相关功能及API 签名可能会发生变化)。如果想自行实现相关模型、探索自动微分机制,请仔细阅读高阶自动微分使用方法及限制。具体的升级包括:

    1. 静态图高阶微分机制升级,通过基础算子体系和程序变换,支持高阶前向及反向微分,并打通编译器、分布式功能。#41919, #41201
    2. 新增前向和反向高阶自动微分API, paddle.incubate.autograd.forward_grad, paddle.incubate.autograd.grad#43354
    3. 新增18个高阶自动微分算子sin, cos, exp, erf, abs, log, cast, where, equal, not_equal, greater_than, greater_equal, elementwise_pow square, elementwise_max, gelu, reduce_mean, size#46184, #46024, #45888, #45338, #44345
    4. 修复现有elementwise_div, reduce_sum, p_norm等算子缺陷。#46514, #46184
  • 通用异构参数服务器架构

    • 参数服务器...
Read more

PaddlePaddle 2.3.2 Release Note

16 Aug 08:23
4596b9a
Compare
Choose a tag to compare

2.3.2 Release Note

2.3.2 版本修复了已知问题,并新增了少量功能。

训练框架(含分布式)

  • 性能分析器增加对静态图和动态图的算子的输入张量的input shape的采集。(#44245#44384#44654
  • 修复部分单测在CUDA 11.7环境失败的问题。(#44785#44796
  • 修复量化后训练与量化感知训练时,部分 scale 命名不统一问题。(#44903
  • 修复在外部基于paddle开放的PHI C++ API,编写C++程序并且编译为可执行文件使用的场景中,因为PHI中ContextPool没有初始化而报错的问题。(#43910
  • 修复paddle编译产出的core_(no)avx.so动态库so name与实际文件名不一致,导致外部链接的时候报错找不到 libpaddle_pybind.so的问题。(#43977
  • 修复自定义算子中调用Tensor.stream()获取的stream与实际运行时stream不一致的问题。(#44500
  • 修复在新动态图模式下执行自定义算子出现输入属性类型解析错误的问题。(#44938
  • 修复性能数据采集器因为线程局部变量被释放而丢失数据的问题。(#44384
  • 修复PACT感知量化训练中支持量化新格式的问题;增强量化新格式C++ kernel计算逻辑;支持Reduce Max算子量化。(#44876

部署方向(Paddle Inference)

  • FusedMultiTransformer 新增 normalize_before=False 功能,支持 layer_norm 计算在 attention 和 feed forward 后的 Transformer 结构。(#44931
  • 新增 NVCC_LAZY 算子按需加载选项,通过 export CUDA_MODULE_LOADING=LAZY,即可实现算子按需加载。(#44957 #44997
  • ONNX Runtime后端新增支持partial_sum、partial_concat、bilinear_interp、conv3d、pool3d、multiclass_nms convert。(#44791
  • 优化ONNX Runtime后端:支持Clone接口、支持获取输入mutable data,降低内存消耗。(#44766
  • 新增 squeeze2、unsqueeze2、cast、slice TensorRT convert 支持。(#44887#44837#44757
  • 修复skip layernorm fp16 kernel计算错误的问题。(#45041

2.3.2 Release Note

V2.3.2 fixed known bugs, and added a tiny set of features.

Training Framework (distributed included)

  • Profiler collects input tensors' shape for static graph and dynamic graph operators. (#44245, #44384, #44654)
  • Fixed failed unit tests in CUDA 11.7. (#44785, #44796)
  • Fixed scale name incosistency issue when being used in post training quantization and quantization aware training. (#44903)
  • Fixed ContextPool in PHI uninitialized issue when PHI's C++ APIs are being used to compile a standalone executable. (#43910)
  • Fixed the compiled output core_(no)avx.so's so name is not consistent with the actual file name issue, so libpaddle_pybind.so could be linked correctly. (#43977)
  • Fixed the issue that Tensor.stream() is not returning the correct stream when being used in a customized operator. (#44500)
  • Fixed iniput attribute type parsing error when customized operator is being executed in new dynamic graph mode. (#44938)
  • Fixed the issue that profiler's performence data collector is missing data caused by thread local variables not being freed correctly. (#44384)
  • Fixed issue of supporting new format of PACT context aware training; Improved quatization new format C++ kernel computation logic; support Reduce Max operator quatization. (#44876)

Deployment Direction (Paddle Inference)

  • FusedMultiTransformer added normalize_before=False, which supports layer_norm to compute the Transformer structure after attention and feed forward. (#44931)
  • Added NVCC_LAZY operators loaded by demand option, which could be enabled by setting export CUDA_MODULE_LOADING=LAZY. (#44957, #44997)
  • ONNX Runtime backends added support for partial_sum, partial_concat, bilinear_interp, conv3d, pool3d, multiclass_nms convert. (#44791)
  • Optimized ONNX Runtime backend support: support Clone interface, support getting input mutable data, reduce memory consumption. (#44766)
  • Added squeeze2, unsqueeze2, cast, slice TensorRT convert. (#44887, #44837, #44757)
  • Fixed skip layernorm fp16 kernel computation error. (#45041)

PaddlePaddle 2.3.1 Release Note

12 Jul 03:54
3cc6ae6
Compare
Choose a tag to compare

2.3.1 Release Note

1. 重要更新

  • 2.3.1 版本是在 2.3 版本的基础上修复了已知问题,并且发布了支持 CUDA 11.6 的安装包。

2. 训练框架(含分布式)

(1)功能优化

API

  • 修改paddle.nn.initializer.KaimingUniformpaddle.nn.initializer.KaimingNormal 两种初始化方式,使其支持多种类型的激活函数。(#43721, #43827)
  • 优化 paddle.io.DataLoader 的数据预读取功能,使其支持设置了 prefetch_factor 设定的预读取数据的缓存数量,避免在读取大块数据时出现 IO 阻塞。(#43674 )

新动态图执行机制

  • 修改新动态图 API 逻辑中 optional 类型 Tensor 的初始化方法,防止被提前析构导致数据异常。(#42561)

全新静态图执行器

  • 延迟初始化执行器中的线程池,避免只执行一轮的 program(如 save、load、startup_program等)创建线程池。(#43768)

混合精度训练

  • 设置 paddle.nn.Layerset_state_dict中禁用 state_dict hook。(#43407)

分布式训练

  • 使 paddle.incubate.nn.functional.fused_attentionpaddle.incubate.nn.functional.fused_feedforward支持张量模型并行。(#43505)

其他

  • 调整框架算子内核打印字符串的格式,便于进行自动化拆分解析。(#42931)
  • 更新模型量化 API,支持rounding to nearest ties to even的四舍五入方式,支持量化取值范围 [-128, 127]。(#43829)
  • 量化感知训练适配支持 AMP 混合精度训练。(#43689)
  • 量化感知训练在启动时新增 progress bar,便于查看量化初始化进度,统计 out_threshold 时跳过 scale op,加速初始化过程。(#43454)
  • 动态图量化训练支持 convbn 融合,静态图离线量化支持设置 skip_tensor_list 来跳过某些层不做量化。(#43301)

(2)性能优化

  • 优化paddle.incubate.nn.functional.fused_attentionpaddle.incubate.nn.functional.fused_feedforward算子,增加add_residual属性,用以控制最后一步是否进行加residual操作,CAE 模型性能提升 7.7%。(#43719)
  • 优化 linspace 算子,将 startstopnum三个输入 Tensor 初始化在 CPU 上,避免在算子中进行 GPU -> CPU 拷贝,SOLOv2 模型性能提升6%。(#43746)

(3)问题修复

API

  • 修复 paddle.io.DataLoaderreturn_list=True 时因多线程冲突小概率报错问题。(#43691)
  • 修复 paddle.nn.Layer的参数存在 None类型参数时 to方法报 NoneType 不存在 device 属性的错误。(#43597)
  • 修复 cumsum op 在某些 shape下计算结果出错的问题。 (#42500, #43777)
  • 修复静态图下 Tensor.__getitem__在使用 bool索引时组网阶段输出结果维度为 0 的问题。 (#43246)
  • 修复 paddle.slicepaddle.strided_slice 处理参数为负数时出现异常的问题。(#43432)
  • 修复 set_value op 在处理切片 step为负数时赋值结果异常的问题。 (#43694)
  • 修复 C++ 端 copy接口不能在多卡设备间拷贝的问题。(#43728)
  • 修改 paddle.incubate.nn.functional.fused_attentionpaddle.incubate.nn.functional.fused_feedforward 中属性命名引发的推理时的问题。(#43505)
  • 修复 ConditionalBlockGrad op 处理不需要 grad的 Tensor 时异常的问题。(#43034)
  • 解决 C++ 的 einsum op 反向速度优化引起的显存增加问题,并将反向优化默认打开。(#43397)
  • 修复单卡下 paddle.io.DataLoader多进程数据读取在固定随机种子时数据无法固定的问题。(#43702)
  • 修复 softmax op 在 Tensor 元素超过 2G 时,触发 CUDNN_STATUS_NOT_SUPPORT 的错误。(#43719)
  • 修复 trace op Event 字符串在不同算子无区分,导致性能分析不便利的问题。(#42789)

其他

  • 修复动转静多次 deepcopy 并保存导致的显存溢出问题。(#43141)
  • 修复自定义算子中使用的 PlaceType 类型升级引入的 device id 在多卡场景中出错的问题。(#43830)
  • 优化 paddle.profiler.Profiler timeline 可视化逻辑,将在 python 脚本中自定义的事件从 C++ 折叠层显示移动至 python 折叠层显示。(#42790)

3. 部署方向(Paddle Inference)

(1)新增特性

新增功能

  • CPU 上 ONNX Runtime 后端新增 PaddleSlim 量化模型支持。 (#43774, #43796)

(2)底层优化

CPU性能优化

  • EnableMkldnn 配置中移除 gpu_cpu_reshape2_matmul_fuse_pass,修复 ResNet50 性能下降的问题。 (#43750)

GPU 性能优化

  • 添加 bilinear_interp_v2 TensorRT convert 支持。 (#43618)
  • 添加 matmul_scale_fuse_passmultihead_matmul_fuse_pass_v3到 GPU pass,并添加单测。(#43765)
  • 添加 GPU handle 延迟初始化支持。 (#43661)

(3)问题修复

框架及API修复

  • 修复联编 Paddle-Lite XPU 时的编译报错问题。(#43178)
  • 修复 ERNIE 3.0 pass误触发的问题。(#43948)
  • 修复 multihead op 中 int8 量化属性读不到的问题。(#43020)

后端能力修复

  • 修复 MKLDNN 中 elementwise_mul 和 matmul 两个 op 在运行量化推理过程中崩溃的问题。 (#43725)
  • 修复同一模型在推理时 TensorRT 子图序列化文件反复生成的问题。(#42945, #42633)
  • 修复 ONNX Runtime 后端与外部使用的 protobuf 冲突问题。(#43159, #43742)
  • 修复 python 预测库 ONNX Runtime 后端在多输入情况下推理报错问题。 (#43621)

4. 环境适配

编译安装

  • 完成对 CUDA 11.6 的验证和适配,并在官网发布 CUDA 11.6 的安装包。(#43935, #44005)
  • 修复在 Windows 上使用 CUDA 11.6 编译时的 cub 报错问题。(#43935, #44005)
  • 修复 elementwise、reduce op 编译时间较长的问题。(#43202, #42779, #43205)

新硬件适配

  • 寒武纪 MLU 支持飞桨 Profiler。(#42115)
  • GraphCore IPU 支持显示编译进度。(#42078)

2.3.1 Release Note

1. Important Updates

  • V2.3.1 is built on V2.3 by fixing known issues and releasing precompiled binary that supports CUDA 11.6.

2. Training Framework (distributed included)

(1) Function Optimization

API

  • Modify two initialization modes of paddle.nn.initializer.KaimingUniform and paddle.nn.initializer.KaimingNormal, to support multiple types of activation functions. (#43721, #43827)
  • Optimize the data pre-fetching function of paddle.io.DataLoader, so that it can support the setting of the prefetch_factor to set the cache size of pre-fetched data. This can avoid IO blocking when reading large blocks of data. (#43674)

New dynamic graph execution mechanism

  • Modify the initialization method of optional type Tensor in the new dynamic graph API logic to prevent data exceptions caused by early destruction. (#42561)

New static graph executor

  • Defer initialization of the thread pools in the executor, to avoid creating thread pools for programs that execute only once (e.g.,save, load, startup_program, etc.). (#43768)

Mixed precision training

  • Disabling state_dict hook in set_state_dict in paddle.nn.Layer. (#43407)

Distributed training

  • Enabling tensor parallelism in paddle.incubate.nn.functional.fused_attention and paddle.incubate.nn.functional.fused_feedforward. (#43505)

Others

  • Adjust print format of the framework operator kernels to facilitate automated splitting and parsing. (#42931)
  • Update the model quantization API to support the round-off in rounding to nearest ties to even, and support quantization in the range [-128, 127]. (#43829)
  • Support AMP mixed precision training in quantization-aware training. (#43689)
  • Add the progress bar at the beginning of quantization-aware training, so that it is easy to check the progress of quantization initialization. Skip the scale op when counting out_threshold to speed up the initialization process. (#43454)
  • Support conv and bn fusion in the dynamic graph quantization training. Support the settings of skip_tensor_list in the static graph offline quantization, to skip some layers without quantization. (#43301)

(2) Performance Optimization

  • Optimizepaddle.incubate.nn.functional.fused_attention and paddle.incubate.nn.functional.fused_feedforwardoperators. Add add_residual property to control whether to perform add-residual operation in the last step. The performance of CAE model is improved by 7.7%. (#43719)
  • Optimize linspace operator. Initialize...
Read more

PaddlePaddle 2.3.0 Release Note

13 May 08:03
590b4db
Compare
Choose a tag to compare

我们很高兴地发布飞桨框架 2.3.0 版本,本版本包含如下重要更新。

API

  • 新增 100 多个 API,覆盖自动微分、线性代数、概率分布、稀疏张量、框架性能分析、硬件设备管理、视觉领域等方面。

  • 新增 4 个自动微分 API,11 个线性代数 API,21 个概率分布类 API,更好地支持科学计算、强化学习等场景。

  • 新增 11 个 稀疏张量计算 API,支持创建 COO、CRS 格式的 Sparse Tensor 以及与 Tensor 互相转换等基础功能。

  • 新增 9 个框架性能分析 API,以paddle.profiler.Profiler为核心,提供对训练、推理过程中性能数据的收集、导出和统计的功能。

  • 新增 7 个硬件设备管理 API,更好支持硬件相关信息获取。

  • 新增多个视觉、文本领域 API,方便复用 MobileNetV3, ResNeXt等骨干网络,实现快速组网。

飞桨高可复用算子库 PHI

  • 发布飞桨高可复用算子库 PHI (Paddle HIgh reusability operator library),支持组合式算子功能复用、Primitive算子内核复用、插件式硬件加速库复用。针对飞桨框架原算子库存在的算子接口不清晰、算子复用成本较高、调用性能不够快的问题,我们重构了飞桨框架的算子库,设计了灵活、高效的函数式算子库 Phi,可以通过对函数式算子接口组合调用的方式实现新算子。新算子库提供了 200 余个跟 python 开发接口保持一致的 C++ 运算类 API,以及近500个可供组合调用的前、反向函数式算子内核 Kernel,可大幅降低框架原生算子和自定义算子的开发成本。新算子库支持Primitive API方式开发算子内核,可支持不同硬件(比如GPU和XPU)的算子内核复用。新算子库支持以插件方式接入硬件(比如NPU)的加速库,实现低成本复用硬件加速库。

分布式训练

  • 全面升级自适应分布式训练架构,含弹性扩缩容、异步流水执行器、异构通信、自动并行等多个模块,支持了多种异构硬件下自动感知的分布式训练及分布式推理。

  • 动态图混合并行下新增MoE并行策略、GroupSharded 并行策略、Pure FP16 等,进一步支持了动态图下大模型的高效并行训练。

  • 全面升级优化了通用异构参数服务器架构,进行各模块的抽象简化,如通信、存储等,提升了参数服务器的二次开发体验;GPU 参数服务器在千亿参数百亿数据分钟级流式训练下性能提升2.38倍。

编译安装

  • 从 2.3.0-rc0 版本开始,飞桨对框架支持的 GPU 架构种类进行了调整和升级。

推理部署

  • 新增 Java API 和 ONNX Runtime CPU 后端。

  • 支持 TensorRT 8.0 / 8.2 和结构化稀疏,针对 ERNIE 类结构模型性能深度优化。

硬件适配

  • 新增自定义新硬件接入:提供一种插件式扩展 PaddlePaddle 硬件后端的方式。

  • 新增对华为昇腾910 / GraphCore IPU / 寒武纪MLU / 昆仑芯2代多种异构芯片的训练/推理支持。

框架架构

Thanks to our Contributors

This release contains contributions from the project core team as well as :

Adam Osewski, Allen Guo, arlesniak, chenenquan, chenyanlann, fengkuangxiaxia, fuqianya, fwenguang, guguguzi, helen88, houj04, Jacek Czaja, jakpiase, jianghaicheng, joanna.wozna.intel, joeqiao12, Leo Chen, Leo Guo, Li-fAngyU, lidanqing, Liyulingyue, Matsumoto GAO, maxhuiy, Ming-Xu Huang, Nyakku Shigure, piotrekobi, piotrekobiIntel, QingshuChen, qipengh, Skr Bang, Sylwester Fraczek, Sławomir Siwek, taixiurong, tanzhipeng, Tomasz Socha, TTerror, Webbley, yaozhixin, ykkk2333, yujun, Zhangjingyu06, zhangxiaoci, zhangyikun02, zhangyk0314, zlsh80826, zn, Zuza

PaddlePaddle 2.3.0-rc0 Release Note

30 Apr 12:12
5d4980c
Compare
Choose a tag to compare

我们很高兴地发布飞桨框架 2.3.0-rc0 版本,本版本包含如下重要更新。

API

  • 新增 100 多个 API,覆盖自动微分、线性代数、概率分布、稀疏张量、框架性能分析、硬件设备管理、视觉领域等方面。

  • 新增 4 个自动微分 API,11 个线性代数 API,21 个概率分布类 API,更好地支持科学计算、强化学习等场景。

  • 新增 11 个 稀疏张量计算 API,支持创建 COO、CRS 格式的 Sparse Tensor 以及与 Tensor 互相转换等基础功能。

  • 新增 9 个框架性能分析 API,以paddle.profiler.Profiler为核心,提供对训练、推理过程中性能数据的收集、导出和统计的功能。

  • 新增 7 个硬件设备管理 API,更好支持硬件相关信息获取。

  • 新增多个视觉、文本领域 API,方便复用 MobileNetV3, ResNeXt等骨干网络,实现快速组网。

飞桨高可复用算子库 PHI

  • 发布飞桨高可复用算子库 PHI (Paddle HIgh reusability operator library),支持组合式算子功能复用、Primitive算子内核复用、插件式硬件加速库复用。针对飞桨框架原算子库存在的算子接口不清晰、算子复用成本较高、调用性能不够快的问题,我们重构了飞桨框架的算子库,设计了灵活、高效的函数式算子库 Phi,可以通过对函数式算子接口组合调用的方式实现新算子。新算子库提供了 200 余个跟 python 开发接口保持一致的 C++ 运算类 API,以及近500个可供组合调用的前、反向函数式算子内核 Kernel,可大幅降低框架原生算子和自定义算子的开发成本。新算子库支持Primitive API方式开发算子内核,可支持不同硬件(比如GPU和XPU)的算子内核复用。新算子库支持以插件方式接入硬件(比如NPU)的加速库,实现低成本复用硬件加速库。

分布式训练

  • 全面升级自适应分布式训练架构,含弹性扩缩容、异步流水执行器、异构通信、自动并行等多个模块,支持了多种异构硬件下自动感知的分布式训练及分布式推理。

  • 动态图混合并行下新增MoE并行策略、GroupSharded 并行策略、Pure FP16 等,进一步支持了动态图下大模型的高效并行训练。

  • 全面升级优化了通用异构参数服务器架构,进行各模块的抽象简化,如通信、存储等,提升了参数服务器的二次开发体验;GPU 参数服务器在千亿参数百亿数据分钟级流式训练下性能提升2.38倍。

编译安装

  • 从 2.3.0-rc0 版本开始,飞桨对框架支持的 GPU 架构种类进行了调整和升级。

推理部署

  • 新增 Java API 和 ONNX Runtime CPU 后端。

  • 支持 TensorRT 8.0 / 8.2 和结构化稀疏,针对 ERNIE 类结构模型性能深度优化。

硬件适配

  • 新增自定义新硬件接入:提供一种插件式扩展 PaddlePaddle 硬件后端的方式。

  • 新增对华为昇腾910 / GraphCore IPU / 寒武纪MLU / 昆仑芯2代多种异构芯片的训练/推理支持。

框架架构

Thanks to our Contributors

This release contains contributions from the project core team as well as :

Adam Osewski, Allen Guo, arlesniak, chenenquan, chenyanlann, fengkuangxiaxia, fuqianya, fwenguang, guguguzi, helen88, houj04, Jacek Czaja, jakpiase, jianghaicheng, joanna.wozna.intel, joeqiao12, Leo Chen, Leo Guo, Li-fAngyU, lidanqing, Liyulingyue, Matsumoto GAO, maxhuiy, Ming-Xu Huang, Nyakku Shigure, piotrekobi, piotrekobiIntel, QingshuChen, qipengh, Skr Bang, Sylwester Fraczek, Sławomir Siwek, taixiurong, tanzhipeng, Tomasz Socha, TTerror, Webbley, yaozhixin, ykkk2333, yujun, Zhangjingyu06, zhangxiaoci, zhangyikun02, zhangyk0314, zlsh80826, zn, Zuza