[PaddlePaddle/Paddle]源码中的部分 gflags 的手动赋值方式

2024-01-05 411 views
5

由于 issue #33208 中的原因,我需要手动为源码中的一些 gflags 赋值,如 https://github.com/PaddlePaddle/Paddle/blob/e0aa1d65b06b98be166424ec2cb1e292a1ce70ae/paddle/fluid/platform/dynload/dynamic_loader.cc#L27-L30

但我尝试过直接 export FLAGS_cudnn_dir=xxx 无效,使用 paddle.fluid.set_flags 则报错

>>> paddle.fluid.set_flags({'FLAGS_cudnn_dir': '/somewhere/anaconda3/lib'})
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/data/zhaoyao/anaconda3/envs/paddle/lib/python3.8/site-packages/paddle/fluid/framework.py", line 6159, in set_flags
    raise ValueError(
ValueError: Flag FLAGS_cudnn_dir cannot set its value through this function.

请问在使用paddlepaddle的时候如何正确赋值这些 flags ?

paddlepaddle 版本为 2.1

回答

4

Linux/Mac环境可以试下export FLAGS_cudnn_dir=/somewhere/anaconda3/lib Windows环境可以试下set FLAGS_cudnn_dir=/somewhere/anaconda3/lib

8

@heavengate 我试过这种方法,但并没有效果,从 glog debug 输出来看运行 paddle 时相关的 flags 依然是空值

1

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/somewhere/anaconda3/lib试下呢

2

修改环境变量不起作用,目前应该只有设置这个 gflags 可以解决问题...

参考 issue #33208 的讨论,简单来说,搜索动态链接库的逻辑目前存在一些问题,gflags 给出的目录是第一优先级,环境变量是第三优先级,而第二优先级是硬编码的绝对路径,在这个绝对路径下能找到 cudnn 的情况下就直接用这个 cudnn 了,尽管版本可能不对。。而这个在 /usr 下的绝对路径又需要 root 权限才能修改,所以除了修改源码重新编译之外我只能通过修改这个 gflags 的值来解决问题...

所以请问是否有办法能够设置这个 flags 的值呢...

6

@heavengate 所以这些 gflags 的值能否手动设定呢?我在源码中发现了为数不少的类似定义的 flags,如果无法手动设置那么存在的意义是什么呢。。

5

看起来好像这个commit并没有被merge进去,所以这个问题在2.1.2版本中依然存在。如果使用conda存在这个问题的话,经过我个人实测有效的方法: 1 conda activate 自己的环境 2 vim ~/.bashrc

  1. 把里面的系统cuda环境注掉
  2. source ~/.bashrc
  3. 再重新conda activate 自己的环境

然后就可以正常使用了。我这边系统里默认的是cuda11.1和cudnn8.0。conda里面装的是cuda11.2和cudnn8.1。使用了上述方法,就可以使用,不会再报cudnn mismatch的问题了。

4

所以现在还是没有办法解决cudnn的搜索路径问题吗?

4

@lytning98 通过conda install的方法,paddlepaddle-gpu 哪个版本修复了呢

8

请参考社区开发者的回复,我只是普通用户目前已不再使用 paddlepaddle