算能RISC-V通用云编译飞桨paddlepaddle@openKylin留档

尝试一在riscv里编译飞桨。

先总结:

下载飞桨代码,参照pr修改代码

然后编译

cmake ../ -DWITH_GPU=OFF -DWITH_RISCV=ON
make -j 16 TARGET=RISCV64_GENERIC

编译好后安装:

pip install paddlepaddle-0.0.0-cp38-cp38-linux_riscv64.whl -i https://mirror.baidu.com/pypi/simple

先git下载源码

git clone https://github.com/paddlepaddle/padle

配置环境

pip3 install protobuf

还有一些库等,具体可以参考编译pytorch的文档:算能RISC-V通用云开发空间编译pytorch @openKylin留档-CSDN博客

然后进入paddle目录编译

mkdir build

cd build

cmake ../

我的天,除了protobuf,竟然一下子编译完成了!

python 复制代码
Automatic code generation for paddle/fluid/primitive succeed.
Automatic code generation for decomp interface succeed.
WITH_DLNNE:
-- Configuring done
-- Generating done
-- Build files have been written to: /root/github/paddle/build

是我肤浅了,后面还需要编译呢root@863c89a419ec:~/github/paddle/build# make

make -j 16

make -j 8 TARGET=RISCV64_GENERIC -dw

如果碰到报错,根据报错进行处理,比如哪个第三方库编译失败,就删除那个目录,然后在third_party目录执行:git submodule update --init --recursive

然后再make 即可。

困了,让它编译去吧。

报错了

通过官网issue,发现cmake指令为:

cmake ../ -DWITH_GPU=OFF -WITH_RISCV=ON

make 指令为;

make -j 16 TARGET=RISCV64_GENERIC

发现cmake指令有问题

拼写错误,应该是:

cmake ../ -DWITH_GPU=OFF -DWITH_RISCV=ON

然后再make

看MakeFile文件里面没有RISCV选项,不知道是不是cmake编译器那边支持,先执行看看。(后来知道,人家这个RISCV是对应了专门的pr的,目前这个pr还没有合并,所以需要手工改密码)

cmake结束之后提示WITH_RISCV没有生效

手工添加飞桨对riscv的支持

修改CMakeFile文件,在WITH_ARM的后面加上:

bash 复制代码
if(WITH_RISCV)
  set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
  set(WITH_XBYAK
      OFF
      CACHE STRING "Disable XBYAK when compiling WITH_RISCV=ON." FORCE)
  set(WITH_MKL
      OFF
      CACHE STRING "Disable MKL when compiling WITH_RISCV=ON." FORCE)
  set(WITH_AVX
      OFF
      CACHE STRING "Disable AVX when compiling WITH_AVX=OFF." FORCE)
  add_definitions(-DPADDLE_WITH_RISCV)
endif()

修改文件:cmake/flags.cmake

在ARM后面加上:AND NOT WITH_RISCV

同时找到了-m64的位置。因为加了这句,就不用手工删除-m64这句。

修改文件:paddle/fluid/operators/search_compute.h

一共需要修改四处,在四处加上defined(PADDLE_WITH_RISCV):

bash 复制代码
#pragma once

#if !defined(PADDLE_WITH_ARM) && !defined(PADDLE_WITH_SW) && \
    !defined(PADDLE_WITH_MIPS) && !defined(PADDLE_WITH_LOONGARCH)
    !defined(PADDLE_WITH_MIPS) && !defined(PADDLE_WITH_LOONGARCH) && \
	!defined(PADDLE_WITH_RISCV)
#include <immintrin.h>
#endif
#include <cfloat>
@@ -103,7 +104,8 @@ void call_gemm_batched(const framework::ExecutionContext& ctx,
}

#if !defined(PADDLE_WITH_ARM) && !defined(PADDLE_WITH_SW) && \
    !defined(PADDLE_WITH_MIPS) && !defined(PADDLE_WITH_LOONGARCH)
    !defined(PADDLE_WITH_MIPS) && !defined(PADDLE_WITH_LOONGARCH) && \
	!defined(PADDLE_WITH_RISCV)

#define __m256x __m256

@@ -144,7 +146,8 @@ inline void axpy(const T* x, T* y, size_t len, const T alpha) {
                      _mm256_mul_px(mm_alpha, _mm256_load_px(x + jjj))));
  }
#elif defined(PADDLE_WITH_ARM) || defined(PADDLE_WITH_SW) || \
    defined(PADDLE_WITH_MIPS) || defined(PADDLE_WITH_LOONGARCH)
    defined(PADDLE_WITH_MIPS) || defined(PADDLE_WITH_LOONGARCH) || \
	defined(PADDLE_WITH_RISCV)
  PADDLE_THROW(platform::errors::Unimplemented("axpy is not supported"));
#else
  lll = len & ~SSE_CUT_LEN_MASK;
@@ -174,7 +177,8 @@ inline void axpy_noadd(const T* x, T* y, size_t len, const T alpha) {
    _mm256_store_px(y + jjj, _mm256_mul_px(mm_alpha, _mm256_load_px(x + jjj)));
  }
#elif defined(PADDLE_WITH_ARM) || defined(PADDLE_WITH_SW) || \
    defined(PADDLE_WITH_MIPS) || defined(PADDLE_WITH_LOONGARCH)
    defined(PADDLE_WITH_MIPS) || defined(PADDLE_WITH_LOONGARCH) || \
	defined(PADDLE_WITH_RISCV)
  PADDLE_THROW(platform::errors::Unimplemented("axpy_noadd is not supported"));
#else
  lll = len & ~SSE_CUT_LEN_MASK;

修改文件:paddle/fluid/platform/denormal.cc

33行if那句后面加上RISCV,变成这样:

bash 复制代码
#if !defined(GCC_WITHOUT_INTRINSICS) && !defined(PADDLE_WITH_ARM) && \
    !defined(PADDLE_WITH_SW) && !defined(PADDLE_WITH_MIPS) &&        \
    !defined(_WIN32) && !defined(PADDLE_WITH_LOONGARCH) &&           \
        !defined(PADDLE_WITH_RISCV)
#define DENORM_USE_INTRINSICS

修改文件paddle/phi/backends/cpu/cpu_info.cc

bash 复制代码
  } else {
#if !defined(WITH_NV_JETSON) && !defined(PADDLE_WITH_ARM) &&  \
    !defined(PADDLE_WITH_SW) && !defined(PADDLE_WITH_MIPS) && \
    !defined(PADDLE_WITH_LOONGARCH) && !defined(PADDLE_WITH_RISCV)
    std::array<int, 4> reg;
    cpuid(reg.data(), 0);
    int nIds = reg[0];

修改文件paddle/phi/backends/cpu/cpu_info.h

bash 复制代码
#define cpuid(reg, x) __cpuidex(reg, x, 0)
#else
#if !defined(WITH_NV_JETSON) && !defined(PADDLE_WITH_ARM) &&  \
    !defined(PADDLE_WITH_SW) && !defined(PADDLE_WITH_MIPS) && \
    !defined(PADDLE_WITH_LOONGARCH) && !defined(PADDLE_WITH_RISCV)
#include <cpuid.h>
inline void cpuid(int reg[4], int x) {

感觉离曙光很近了。

重新cmake和make,希望不会碰到"pmmintrin.h"文件找不到的错误。

发现少修改一个文件

修改文件cmake/third_party.cmake

if(WITH_POCKETFFT)
  include(external/pocketfft)
  list(APPEND third_party_deps extern_pocketfft)
  add_definitions(-DPADDLE_WITH_POCKETFFT)
if(WITH_RISCV)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-maybe-uninitialized") # Warnings in pocketfft_hdronly.h
endif()
endif()

11点开始编译,计时开始!15:37分编译完成,耗时4小时37分钟!

哈哈,它静静的躺在那里:

root@863c89a419ec:~/github/paddle/build/python# ls dist/
paddlepaddle-0.0.0-cp38-cp38-linux_riscv64.whl
root@863c89a419ec:~/github/paddle/build/python# pip3 install dist/paddlepaddle-0.0.0-cp38-cp38-linux_riscv64.whl  -i https://mirror.baidu.com/pypi/simple
Processing ./dist/paddlepaddle-0.0.0-cp38-cp38-linux_riscv64.whl

安装:

bash 复制代码
pip install paddlepaddle-0.0.0-cp38-cp38-linux_riscv64.whl

安装后执行import paddle 报错。

总结:

目前已编译成功。

目前import paddle报错。

调试

报错:Could NOT find PY_google.protobuf (missing: PY_GOOGLE.PROTOBUF)

Could NOT find PY_google.protobuf (missing: PY_GOOGLE.PROTOBUF)

安装protobuf

pip3 install protobuf

编译时到100%报错

[ 97%] Building CXX object gloo/CMakeFiles/gloo.dir/transport/tcp/unbound_buffer.cc.o

[100%] Linking CXX static library libgloo.a

[100%] Built target gloo

[ 3%] Performing install step for 'extern_gloo'

[ 3%] Completed 'extern_gloo'

[ 3%] Built target extern_gloo

make: *** [Makefile:136: all] Error 2

再重新编译,到了protobuf这里报错:

-- Installing: /root/github/paddle/build/third_party/install/protobuf/lib/cmake/protobuf/protobuf-config.cmake

[ 4%] Completed 'extern_protobuf'

[ 4%] Built target extern_protobuf

make: *** [Makefile:136: all] Error 2

再重新编译,发现这里报错:

报错:cc1: error: '-march=loongson3a': ISA string must begin with rv32 or rv64

cc1: error: requested ABI requires '-march' to subsume the 'D' extension

cc1: error: ABI requires '-march=rv64'

make[4]: *** [Makefile:737: isamin.o] Error 1

cc1: error: '-march=loongson3a': ISA string must begin with rv32 or rv64

make[4]: *** [Makefile:611: sasum.o] Error 1

cc1: error: '-march=loongson3a': ISA string must begin with rv32 or rv64

cc1: error: '-march=loongson3a': ISA string must begin with rv32 or rv64

cc1: error: requested ABI requires '-march' to subsume the 'D' extension

cc1: error: requested ABI requires '-march' to subsume the 'D' extension

cc1: error: ABI requires '-march=rv64'

cc1: error: ABI requires '-march=rv64'

cc1: error: requested ABI requires '-march' to subsume the 'D' extension

cc1: error: ABI requires '-march=rv64'

make[4]: *** [Makefile:647: snrm2.o] Error 1

make[4]: *** [Makefile:629: ssum.o] Error 1

make[4]: *** [Makefile:701: smax.o] Error 1

make[4]: *** [Makefile:665: samax.o] Error 1

make[4]: *** [Makefile:755: ismax.o] Error 1

make[4]: *** [Makefile:773: sdsdot.o] Error 1

make[3]: *** [Makefile:164: libs] Error 1

make[2]: *** [CMakeFiles/extern_openblas.dir/build.make:86: third_party/openblas/src/extern_openblas-stamp/extern_openblas-build] Error 2

make[1]: *** [CMakeFiles/Makefile2:4001: CMakeFiles/extern_openblas.dir/all] Error 2

[ 5%] Built target eager_python_c_codegen

[ 5%] Built target op_map_codegen

[ 5%] Built target eager_codegen

make: *** [Makefile:136: all] Error 2

参考这里重新来过:

如何在RISC-V平台编译paddle - 知乎

编译报错:

Live child 0x2af978fd70 (paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen) PID 115530

Reaping winning child 0x2af978fd70 PID 115530

Removing child 0x2af978fd70 PID 115530 from chain.

Considering target file 'paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen.dir/build'.

File 'paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen.dir/build' does not exist.

Considering target file 'eager_codegen'.

File 'eager_codegen' does not exist.

Considering target file 'paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen'.

File 'paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen' was considered already.

Considering target file 'paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen.dir/build.make'.

File 'paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen.dir/build.make' was considered already.

Finished prerequisites of target file 'eager_codegen'.

Must remake target 'eager_codegen'.

Successfully remade target file 'eager_codegen'.

Finished prerequisites of target file 'paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen.dir/build'.

Must remake target 'paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen.dir/build'.

Successfully remade target file 'paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen.dir/build'.

make[2]: Leaving directory '/root/github/paddle/build'

Reaping winning child 0x2b00eb0510 PID 115266

Live child 0x2b00eb0510 (paddle/fluid/eager/auto_code_generator/generator/CMakeFiles/eager_codegen.dir/all) PID 115532

[ 4%] Built target eager_codegen

Reaping winning child 0x2b00eb0510 PID 115532

Removing child 0x2b00eb0510 PID 115532 from chain.

make[1]: Leaving directory '/root/github/paddle/build'

Reaping losing child 0x2ad05e7c50 PID 115118

make: *** [Makefile:136: all] Error 2

Removing child 0x2ad05e7c50 PID 115118 from chain.

make: Leaving directory '/root/github/paddle/build'

在paddle/build/third_party删除eigen3目录,然后执行:git submodule update --init --recursive

问题解决。

问题没有解决,还是4%这里报错:

[ 4%] Built target eager_codegen

Reaping winning child 0x2b167efa70 PID 117670

Removing child 0x2b167efa70 PID 117670 from chain.

make[1]: Leaving directory '/root/github/paddle/build'

Reaping losing child 0x2b0332dc20 PID 117206

make: *** [Makefile:136: all] Error 2

Removing child 0x2b0332dc20 PID 117206 from chain.

make: Leaving directory '/root/github/paddle/build'

重新设置make 后,cmake ../ -DWITH_GPU=OFF -WITH_RISCV=ON 编译报错

报错c++: error: unrecognized command line option '-m64'

按照文档,应该"查找makefile文件的生成逻辑,最终发现在Paddle.cmake文件中有这样一段逻辑",将该文件中的-64去掉。

但是没有找到这个文件。找到了,在这里:

cmake/flags.cmake

if(NOT WITH_NV_JETSON

AND NOT WITH_ARM

AND NOT WITH_RISCV

AND NOT WITH_SW

AND NOT WITH_MIPS

AND NOT WITH_LOONGARCH)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -m64")

endif()

后期通过修改源码,添加RISCV选项的方法,使代码支持RISCV,并同时使用-m64失效

在cmake的时候加上DWITH_RISCV提示没有生效

WITH_DLNNE:

-- Configuring done

-- Generating done

CMake Warning:

Manually-specified variables were not used by the project:

WITH_RISCV

按照飞桨官网pr,修改飞桨make相关文件。

编译报错没有 pmmintrin.h文件

[ 7%] Building CXX object paddle/fluid/platform/CMakeFiles/denormal.dir/denormal.cc.o

/root/github/paddle/paddle/fluid/platform/denormal.cc:38:10: fatal error: pmmintrin.h: No such file or directory

38 | #include <pmmintrin.h>

| ^~~~~~~~~~~~~

compilation terminated.

make[2]: *** [paddle/fluid/platform/CMakeFiles/denormal.dir/build.make:76: paddle/fluid/platform/CMakeFiles/denormal.dir/denormal.cc.o] Error 1

make[1]: *** [CMakeFiles/Makefile2:4787: paddle/fluid/platform/CMakeFiles/denormal.dir/all] Error 2

make[1]: *** Waiting for unfinished jobs....

这个对应的就是paddle/fluid/platform/denormal.cc 这个文件,已经修改。

编译安装好后,

import paddle报错

oot@863c89a419ec:~/github/paddle/build# python3

Python 3.8.2 (default, Jan 18 2024, 07:05:37)

[GCC 9.3.0] on linux

Type "help", "copyright", "credits" or "license" for more information.

>>> import paddle

Error: Can not import paddle core while this file exists: /usr/local/lib/python3.8/dist-packages/paddle/base/libpaddle.so

Traceback (most recent call last):

File "/usr/local/lib/python3.8/dist-packages/paddle/base/core.py", line 267, in <module>

from . import libpaddle

ImportError: /usr/local/lib/python3.8/dist-packages/paddle/base/libpaddle.so: undefined symbol: __atomic_exchange_1

During handling of the above exception, another exception occurred:

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

File "/usr/local/lib/python3.8/dist-packages/paddle/init.py", line 30, in <module>

from .base import core # noqa: F401

File "/usr/local/lib/python3.8/dist-packages/paddle/base/init.py", line 38, in <module>

from . import ( # noqa: F401

File "/usr/local/lib/python3.8/dist-packages/paddle/base/backward.py", line 25, in <module>

from . import core, framework, log_helper, unique_name

File "/usr/local/lib/python3.8/dist-packages/paddle/base/core.py", line 377, in <module>

if not avx_supported() and libpaddle.is_compiled_with_avx():

NameError: name 'libpaddle' is not defined

看文档,有人说是patchelf版本低的缘故,升级patchelf,再重新编译,问题依旧

https://github.com/PaddlePaddle/Paddle/issues/51536

已提issue :https://github.com/PaddlePaddle/Paddle/issues/62037

学习官网issue

risc-v芯片上编译paddle报错 · Issue #61770 · PaddlePaddle/Paddle · GitHub

学习官网改risc-v的pr

Adding a compile option to Paddle for Risc-V · PaddlePaddle/Paddle@d3db383 · GitHub

相关推荐
martian6651 小时前
【人工智能数学基础篇】——深入详解多变量微积分:在机器学习模型中优化损失函数时应用
人工智能·机器学习·微积分·数学基础
人机与认知实验室2 小时前
人、机、环境中各有其神经网络系统
人工智能·深度学习·神经网络·机器学习
黑色叉腰丶大魔王2 小时前
基于 MATLAB 的图像增强技术分享
图像处理·人工智能·计算机视觉
迅易科技5 小时前
借助腾讯云质检平台的新范式,做工业制造企业质检的“AI慧眼”
人工智能·视觉检测·制造
古希腊掌管学习的神6 小时前
[机器学习]XGBoost(3)——确定树的结构
人工智能·机器学习
ZHOU_WUYI6 小时前
4.metagpt中的软件公司智能体 (ProjectManager 角色)
人工智能·metagpt
靴子学长7 小时前
基于字节大模型的论文翻译(含免费源码)
人工智能·深度学习·nlp
AI_NEW_COME8 小时前
知识库管理系统可扩展性深度测评
人工智能
海棠AI实验室8 小时前
AI的进阶之路:从机器学习到深度学习的演变(一)
人工智能·深度学习·机器学习
hunteritself8 小时前
AI Weekly『12月16-22日』:OpenAI公布o3,谷歌发布首个推理模型,GitHub Copilot免费版上线!
人工智能·gpt·chatgpt·github·openai·copilot