PaddlePaddle/Paddle

【热身打卡】开发框架,从编译 paddle 开始

Ligoml opened this issue · 29 comments

各位参加飞桨开发者,大家好,欢迎大家参加飞桨社区贡献!有一些小伙伴有意愿参与,但不知道如何开始,飞桨团队特地推出了本次热身打卡活动,从编译开始,熟悉飞桨框架开发~
参与热身打卡活动并按照邮件模板格式将截图发送至 ext_paddle_oss@baidu.com,即可获得精美的飞桨黑客松周边礼品!数量有限,赶快行动起来吧!

热身打卡活动简介

在飞桨框架二次开发中,编译 paddle 是一个重要环节,也是很多任务(如API开发、算子性能优化、数据类型扩展等)的前置条件。本次热身打卡活动,要求参与者通过 github 拉取 PaddlePaddle/Paddle 仓库代码,并参考 源码编译教程 完成 paddle 编译,截图编译成功的界面后,参考如下格式向 ext_paddle_oss@baidu.com 发送邮件,打卡成功后即可获得精美的飞桨黑客松周边礼品!

注:完成全部打卡任务即可获得飞桨开源社区定制马克杯。本次热身打卡活动对硬件没有要求!CPU/GPU 均可,赶快行动起来吧~也可 申请AI Studio开发资源

编译流程

1. 增加时间戳

即在命令最开始加上time,以【Linux下从源码编译】文档的【使用Docker编译】为例,

【9.执行cmake】和【10.执行编译】增加时间戳的命令为:

  • CPU版本的cmake:time cmake .. -DPY_VERSION=3.8 -DWITH_GPU=OFF
  • GPU版本的cmake:time cmake .. -DPY_VERSION=3.8 -DWITH_GPU=ON
  • 执行编译:time make -j$(nproc),举例有4核,即time make -j4

2. 初次编译/二次编译

初次编译时间较长,二次编译因为有编译缓存的存在,时间会缩短,对日常开发来说,二次编译时间才是影响开发效率的。让我们来感受下修改不同文件的二次编译时间。

  • 修改底层的头文件:paddle/fluid/platform/enforce.h
  • 修改Op的cc文件:paddle/fluid/operators/rank_loss_op.cc
  • 修改python文件:python/paddle/tensor/math.py

二次编译方式:对应文件加一个空行/空格保存退出后,然后执行编译命令time make -j$(nproc),二次编译不再需要执行cmake。

3. 安装whl包

参考【Linux下从源码编译】文档的【使用Docker编译】【11. 寻找whl包】【12. 安装whl包】

4. 运行单元测试

不同的编译选项,能编译出不同的功能,对应的编译时间也各不相同。可以参考编译选项表,尝试打开WITH_TESTING=ON编译出单元测试,并正确运行一个单测。

  • 重新运行cmake命令:cmake .. -DPY_VERSION=3.8 -DWITH_GPU=OFF -DWITH_TESTING=ON(在原来的cmake命令后加入-DWITH_TESTING=ON
  • 执行编译命令make -j$(nproc)
  • 安装第三方依赖pip3.8 install -r ../python/requirements.txt
  • 进入build目录,运行单元测试:参考【飞桨API python端开发指南】之【运行单元测试】,执行ctest -R test_logsumexp运行logsumexp的单测。

邮件格式

标题: [Hackathon 热身打卡]

内容:

飞桨团队你好,

【GitHub ID】:XXX

【打卡内容】:初次编译/二次编译/安装whl包/运行单元测试

【打卡截图】:

如:

标题: [Hackathon 热身打卡]

内容:

飞桨团队你好,

【GitHub ID】:paddle-hack

【打卡内容】:初次编译&二次编译&安装whl包&运行单元测试

【打卡截图】:

硬件
编译方式 参考【Linux下从源码编译】文档的【使用Docker编译】(源码编译文档 有多种编译方式,请大家填写本次编译参考的文档)
cmake命令和时间 命令:time cmake .. -DPY_VERSION=3.8 -DWITH_GPU=OFF
时间:注意要将commit号截图进来哦
初次编译命令和时间 命令:time make -j20 (写一下大家用几核哦)
时间:以下时间仅作为示例,不代表真实的初次编译时间
二次编译时间 时间:以下时间仅作为示例,不代表真实的二次编译时间
paddle/fluid/platform/enforce.h

paddle/fluid/operators/rank_loss_op.cc

python/paddle/tensor/math.py
安装whl包
运行单元测试

礼品发放

  • 打卡确认后,你会收到一封回复邮件,收集你的邮寄地址,请提供准确的邮件地址,以便小礼品可以飞速送到你的手上!
  • 在编译过程中有任何的问题或建议,都可以提交 issue,注明 PaddlePaddle Hackathon,经飞桨团队确认是 bug 或有效建议后,可额外获得一个小礼品。
  • 将本次活动或活动奖品分享到社交平台(如B站、微博、小红书、朋友圈等),截图发在QQ/微信群或邮件中,也有机会获得更多周边礼品哦~

优秀作品

参与飞桨框架贡献

如果你已经顺利完成了打卡,具备了基础的框架开发知识,你就可以参与飞桨社区丰富的开发任务,为一个大型开源项目做贡献,同时收获飞桨社区开发者的认可与各种福利。传送门:

windows下 实现类似linux下 ”time 命令“ 显示命令执行时间,可使用以下脚本保存为timecmd.bat ,例如:timecmd.bat dir /a

@echo off
@setlocal
::
set start=%time%
::
:: Runs your command
cmd /c %*
::
set end=%time%
set options="tokens=1-4 delims=:.,"
for /f %options% %%a in ("%start%") do set start_h=%%a&set /a start_m=100%%b %% 100&set /a start_s=100%%c %% 100&set /a start_ms=100%%d %% 100
for /f %options% %%a in ("%end%") do set end_h=%%a&set /a end_m=100%%b %% 100&set /a end_s=100%%c %% 100&set /a end_ms=100%%d %% 100
::
set /a hours=%end_h%-%start_h%
set /a mins=%end_m%-%start_m%
set /a secs=%end_s%-%start_s%
set /a ms=%end_ms%-%start_ms%
if %ms% lss 0 set /a secs = %secs% - 1 & set /a ms = 100%ms%
if %secs% lss 0 set /a mins = %mins% - 1 & set /a secs = 60%secs%
if %mins% lss 0 set /a hours = %hours% - 1 & set /a mins = 60%mins%
if %hours% lss 0 set /a hours = 24%hours%
if 1%ms% lss 100 set ms=0%ms%
::
:: Mission accomplished
set /a totalsecs = %hours%*3600 + %mins%*60 + %secs%
echo command took %hours%:%mins%:%secs%.%ms% (%totalsecs%.%ms%s total)

请问修改了实现的代码,要跑单测的话必须二次编译吗?感觉这样还是挺影响开发效率呢

@zhengow 目前是这样的,我们也在尝试加速编译和提升开发效率的方法。

使用AI Studio编译Paddle的文档Paddle文档
中 四,安装whl库 pip install Paddle/python/dist/paddlepaddle-0.0.0-cp37-cp37m-linux_x86_64.whl
命令错误,处于Paddle/build路径下,应该使用pip3.7 install /python/dist/paddlepaddle-0.0.0-cp37-cp37m-linux_x86_64.whl命令

gitlab经常连不上,ubuntu系统毫无办法。然后AI studio我用QQ邮箱发了过了一天了还是没回复QAQ
本来bug多久麻烦,这下更雪上加霜了

编译到89%报错了,develop里面有没有定义的函数
[ 89%] Building CXX object paddle/fluid/eager/api/generated/fluid_generated/forwards/CMakeFiles/dygraph_function.dir/dygraph_forward_functions1.cc.o
/home/dhy/Paddle-develop/paddle/fluid/eager/api/generated/fluid_generated/forwards/dygraph_forward_functions1.cc: In function ‘paddle::experimental::Tensor rsqrt_dygraph_function(const paddle::experimental::Tensor&, const AttributeMap&)’:
/home/dhy/Paddle-develop/paddle/fluid/eager/api/generated/fluid_generated/forwards/dygraph_forward_functions1.cc:58:40: error: ‘rsqrtGradNodeCompat’ was not declared in this scope
58 | auto grad_node = std::shared_ptr(new rsqrtGradNodeCompat(1, 1));

编译过程由于程序使用过多内存或其他系统资源而导致系统终止
image

这个情况我在你们的热身打卡网页的评论区反应了,还附上了报错的信息

请问网页的评论区在哪儿?可以 附上链接,或者直接提一个新的issue。 @HumanityCSU

在编译过程中有任何的问题或建议,都可以提交 issue,注明 PaddlePaddle Hackathon,经飞桨团队确认是 bug 或有效建议后,可额外获得一个小礼品。

这个情况我在你们的热身打卡网页的评论区反应了,还附上了报错的信息

请问网页的评论区在哪儿?可以 附上链接,或者直接提一个新的issue。 @HumanityCSU

在编译过程中有任何的问题或建议,都可以提交 issue,注明 PaddlePaddle Hackathon,经飞桨团队确认是 bug 或有效建议后,可额外获得一个小礼品。

我已经在paddle仓库上提交了这个issue,这是地址:#51824

使用AI Studio编译Paddle的文档Paddle文档 中 四,安装whl库 pip install Paddle/python/dist/paddlepaddle-0.0.0-cp37-cp37m-linux_x86_64.whl 命令错误,处于Paddle/build路径下,应该使用pip3.7 install /python/dist/paddlepaddle-0.0.0-cp37-cp37m-linux_x86_64.whl命令

十分感谢指出问题,已修改

我记得我当时是在虚拟机linux环境下编译的报错,不是在AI Studio环境下,我也没有收到AI Studio的授权(我不是很清楚这个是不是叫授权,反正我当时没拿到,然后我就只能用自己本地新建一个Ubuntu系统的虚拟机弄了)

------------------ 原始邮件 ------------------ 发件人: @.>; 发送时间: 2023年3月20日(星期一) 下午4:25 收件人: @.>; 抄送: @.>; @.>; 主题: Re: [PaddlePaddle/Paddle] 【热身打卡】开发框架,从编译 paddle 开始 (Issue #45347) 使用AI Studio编译Paddle的文档Paddle文档 中 四,安装whl库 pip install Paddle/python/dist/paddlepaddle-0.0.0-cp37-cp37m-linux_x86_64.whl 命令错误,处于Paddle/build路径下,应该使用pip3.7 install /python/dist/paddlepaddle-0.0.0-cp37-cp37m-linux_x86_64.whl命令 十分感谢指出问题,已修改。 — Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

我已经通过AI Studio编译成功了,本地编译容易内存爆满,加油!

我也没有收到AI Studio的授权

@HumanityCSU 可以查下2023/3/6的邮件(是否进垃圾箱或者过滤了),PM有给回复信息的。

@luotao1 二次编译时为什么会触发 phi 库的重编呢,我只改了 paddle/cinn/hlir/framework/instruction.h 中的一行代码而已。
image

二次编译时为什么会触发 phi 库的重编呢,我只改了 paddle/cinn/hlir/framework/instruction.h 中的一行代码而已。

@6clc @zhhsplendid 麻烦看一下,按理说,PHI不应该依赖CINN的

6clc commented

@luotao1 二次编译时为什么会触发 phi 库的重编呢,我只改了 paddle/cinn/hlir/framework/instruction.h 中的一行代码而已。

方便提供一下你的cmake指令吗?本地测试你的PR的commit修改,二次make未复现该问题。

@luotao1 二次编译时为什么会触发 phi 库的重编呢,我只改了 paddle/cinn/hlir/framework/instruction.h 中的一行代码而已。

方便提供一下你的cmake指令吗?本地测试你的PR的commit修改,二次make未复现该问题。

@6clc cmake 命令如下:

export CCACHE_DIR=/workspace/.ccache
export CACHE_DIR=/workspace/.cache

cmake .. -DWITH_GPU=ON \
        -DPY_VERSION=3.9 \
        -DWITH_TESTING=ON \
        -DCINN_ONLY=OFF  \
        -DWITH_CINN=ON

time make -j24
6clc commented

@luotao1 二次编译时为什么会触发 phi 库的重编呢,我只改了 paddle/cinn/hlir/framework/instruction.h 中的一行代码而已。

方便提供一下你的cmake指令吗?本地测试你的PR的commit修改,二次make未复现该问题。

@6clc cmake 命令如下:

export CCACHE_DIR=/workspace/.ccache
export CACHE_DIR=/workspace/.cache

cmake .. -DWITH_GPU=ON \
        -DPY_VERSION=3.9 \
        -DWITH_TESTING=ON \
        -DCINN_ONLY=OFF  \
        -DWITH_CINN=ON

time make -j24

你在本地是稳定复现这个情况吗?我在你PR的commit前make一遍,在你的PR上再make没有触发phi的编译。要是你那里还是有这个问题,我再去看看其他人是不是也这样。

@luotao1您好, 我在编译的时候当运行到“Performing build step for 'extern_xxhash'”时会报如下错误:

[ 9%] Performing build step for 'extern_xxhash'
sed: couldn't open temporary file /paddle/third_party/xxhash/sedlZVZ0L: Permission denied
CMakeFiles/extern_xxhash.dir/build.make:112: recipe for target 'third_party/xxhash/src/extern_xxhash-stamp/extern_xxhash-build' failed

查了下是CMakeFiles/extern_xxhash.dir/build.make这个文件112行sed的时候报错:

cd /paddle/third_party/xxhash && sed -i "s/-Wstrict-prototypes -Wundef/-Wstrict-prototypes -Wundef -fPIC/g" /paddle/third_party/xxhash/Makefile && make lib

请问若要修复是手动修改build.make,使得sed后先保存为某个文件,再用此文件覆盖/paddle/third_party/xxhash/Makefile吗?
不知我这是否是个例情况T . T

@yoyoIcy 你可以网上搜一下Performing build step for的解决方案,应该和你编译环境有关系。你是使用什么环境编译的?

@luotao1 mac上面拉了docker 镜像registry.baidubce.com/paddlepaddle/paddle:latest-dev编译的,我sed后另存为再覆盖先能执行过去了。遇到了新的问题c++: fatal error: Killed signal terminated program cc1plus,docker分配4个G内存不够?

把docker desktop里的resources->memory调成5G继续执行了

xlcjz commented

@luotao1您好, 我在编译的时候当运行到“Performing build step for 'extern_xxhash'”时会报如下错误:

[ 9%] Performing build step for 'extern_xxhash'
sed: couldn't open temporary file /paddle/third_party/xxhash/sedlZVZ0L: Permission denied
CMakeFiles/extern_xxhash.dir/build.make:112: recipe for target 'third_party/xxhash/src/extern_xxhash-stamp/extern_xxhash-build' failed

查了下是CMakeFiles/extern_xxhash.dir/build.make这个文件112行sed的时候报错:

cd /paddle/third_party/xxhash && sed -i "s/-Wstrict-prototypes -Wundef/-Wstrict-prototypes -Wundef -fPIC/g" /paddle/third_party/xxhash/Makefile && make lib

请问若要修复是手动修改build.make,使得sed后先保存为某个文件,再用此文件覆盖/paddle/third_party/xxhash/Makefile吗? 不知我这是否是个例情况T . T

是docker VirtioFS的问题,将docker的file sharing配置改为gRPC Fuse可以编译通过,或者将sed升级版本到4.8以上
https://forums.docker.com/t/sed-couldnt-open-temporary-file-xyz-permission-denied-when-using-virtiofs/125473/4 https://discourse.pi-hole.net/t/sed-couldnt-open-temporary-file-etc-pihole-sed/65159

image
你好,在尝试编译的时候出现了找不到UINT64_MAX的问题(环境为Windows)
image

飞腾+麒麟v10+昆仑K100环境中编译 PaddlePaddle 报错

详见:ISSUE #64903