jittor安装和踩坑

记录jittor的安装过程和遇到的问题。

安装

环境:

  • ubuntu 22.04 LTS x86_64
  • cuda 12.1
  • cudnn 8.9.6
  • gcc/g++ 10.5.0

使用Anaconda管理虚拟环境。

安装依赖:

sudo apt install libomp-dev

安装jittor:

pip install jittor

测试:

python -m jittor.test.test_example
python -m jittor.test.test_cudnn_op

问题

std::function问题

test_example报错:

/usr/include/c++/11/bits/std_function.h:435:145: error: parameter packs not expanded with '...':
    435 |           function(_Functor&& __f)
        |

/usr/include/c++/11/bits/std_function.h:435:145: note:      '_ArgTypes'
/usr/include/c++/11/bits/std_function.h:530:146: error: parameter packs not expanded with '...':
    530 |           function(_Functor&& __f)
        |

/usr/include/c++/11/bits/std_function.h:530:145: note:      '_ArgTypes'      

这个问题理论上出在jittor_utils尝试编译,但是引用c++11的std::function时出现了问题。原本的gcc/g++版本为11,然而这个版本的std::function可能有问题。将gcc/g++版本降级到10.5.0,问题解决。

以下是降级gcc/c++的参考方法:

  1. 查看gcc10可选版本:
sudo apt-get update
sudo apt-cache policy gcc-10
  1. 安装gcc10:
sudo apt-get install gcc-10=10.5.0-1ubuntu1~22.04
  1. 修改默认gcc版本:
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-10 40
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 50
sudo update-alternatives --config gcc

选择gcc10对应的序号并回车。

  1. 修改g++版本同理

注意保持gcc和g++版本一致,否则会出现一些难以预料的问题。

链接libstdc++.so.6问题

test_example报错:

ImportError: /home/username/anaconda3/envs/DragGAN-jt/bin/../lib/libstdc++.so.6: version 'GLIBCXX_3.4.30' not found (required by /home/username/.cache/jittor/jt1.3.8/g++10.5.0/py3.7.16/Linux-6.5.0-27x81/12thGenIntelRCxbc/default/cu11.5.119_sm_86/jittor_core.cpython-37m-x86_64-linux-gnu.so)

其实操作系统中的libstdc++.so.6版本是够的,但是Anaconda中的环境中的libstdc++.so.6版本不够。这里的解决方案是从操作系统中拷贝libstdc++.so.6到Anaconda环境中,当然也可以建立一个软链接。

  1. 查找所有libstdc++.so.6
find / -name "libstdc++.so.6*"

至少可以观察到两个libstdc++.so.6.0.*路径,一个是系统的路径,一个是Anaconda的路径。

/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30
/home/username/anaconda3/envs/DragGAN-jt/lib/libstdc++.so.6.0.29
  1. 拷贝libstdc++.so.6.0.30到Anaconda环境中并建立软链接:
cp /usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30 /home/username/anaconda3/envs/DragGAN-jt/lib/
ln -s /home/username/anaconda3/envs/DragGAN-jt/lib/libstdc++.so.6.0.30 /home/username/anaconda3/envs/DragGAN-jt/lib/libstdc++.so.6

注意sudo权限。如果操作系统中的libstdc++.so.6本身版本就不够,那么需要升级gcc/g++版本。

test_cudnn_op问题

注意cudnn是必须的,并且和cuda版本对应。

查看cudnn版本:

cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2