2020 年如何在 GeForce GTX 460m 上使用 CUDA 工具包

2020 年如何在 GeForce GTX 460m 上使用 CUDA 工具包

几年前,我的朋友给了我这台笔记本电脑,因为他从那时起就升级了电脑。它有一个 GPU,我想开始使用 TensorFlow 或一般的 GPU。我从来没有能够在它上面安装 TensorFlow、CUDA 等。它是 GeGorce GTX 460m 和 Intel i7。我觉得它有潜力成为我的 Finux 集群中的明星,其中包括 ISKCON ppc7450 等古董,它也运行着 Ubuntu 16.04。

为了利用这个 GPU,我尝试了 VoidLinux、Linux from Scratch、Ubuntu、Kali 等,按顺序尝试过。我目前正在重新尝试安装没有图形界面的 Ubuntu 16.04 服务器。它适合我的 1GB 闪存驱动器。

我发现以下情况。我以 root 身份执行了此操作,但我可能应该切换到单用户模式:

  1. 应用任何错误修复,但从不进行发布升级。
    apt update && apt full-upgrade
    

更新:可以在此处完成步骤(9-10),以将其减少为一次重启。

  1. 这不适用于我的情况,但适用于图形安装、黑名单 nouveau 和:

    modprobe -r <some variant of nouveau>
    
  2. 下载并安装视频驱动程序390.138. 其他驱动程序版本这里,但您需要查看细则才能找到高级选项,即旧版本和测试版本。

    对于较新版本的 Ubuntu,存在编译器版本不匹配的问题:DKMS、NVidia 模块、GCC 5/7,可以通过 update-alternatives 解决。其他解决方法对我来说不起作用。

  3. 使新的驱动程序在启动时加载。

    update-initramfs -u
    
  4. 完整性检查

    nvidia-smi
    
  5. 下载并安装 CUDA 工具包9.1 8.0及其三个补丁。不要让它覆盖你的驱动程序。对于其他驱动程序版本,有一个兼容性矩阵确定所需的 SDK 版本。

    驱动程序下载页面帮助我们选择操作系统版本,在这种情况下,16.04或 17.04,优先选择偶数版本号。这些安装脚本需要一次运行一个,因为它们在失败时似乎无法给出合理的退出状态。

  6. 重新启动并以非 root 身份登录。程序无法正确链接,这就是我修复它的方法。我认为这与 /etc/environment 和 /etc/profile 有关,以及何时和哪些进程获取它们。

    更新:也许只是注销。使用 /etc/profile.d 和 /etc/ld.so.conf.d 代替 /etc/environment

  7. 当编译我想要运行的程序时,我使用 cuInit() 指定库的路径。

    CUDA_LIB=/usr/local/cuda/lib64/stubs/libcuda.so
    

    我还指定了我的体系结构,因为不指定它会导致:

    no kernel image is available for execution on the device.
    

    这是460米,所以它有计算能力2.1.

    CCAP=21
    
    CCAP=20
    CCSM=21
    

    更新:看起来我的系统需要“-gencode arch=compute_20,code=[sm_21,compute_20]”

    我们不妨指定我们的 CPU。海湾合作委员会说这是一座沙桥。

    ARCH=sandybridge
    

    接下来,使用数组传递带有空格的参数可能是最好的选择,但需要注意的是,此类变量不能被导出。

    export CFLAGS="-march=$ARCH -mtune=$ARCH"
    CMAKE_CONF=( "-DCUDA_LIB=$CUDA_LIB"
      "-DCUDA_NVCC_FLAGS=-gencode arch=compute_$CCAP,code=[sm_$CCSM,compute_$CCAP]" )
    
    mkdir build && cd build &&
    cmake .. -G Ninja "${CMAKE_CONF[@]}" && cd .. &&
    cmake --build build && cd build
    #sudo cmake --build build --target install
    # ninja: error: unknown target 'install'
    

    更新:CUDA_LIB 是项目特定的变量。相反,请执行以下操作:

    echo /usr/local/cuda/lib64/stubs |
    sudo tee -a /etc/ld.so.conf.d/nvidia.conf &&
    sudo ldconfig
    

    更新:这会导致 nvidia-smi 出现问题。有趣。

跳到 TF....

TF 文档说 docker 容器应该更简单,所以我首先更深入地研究了这一点。

  1. 安装 docker。

    sudo apt install \
      apt-transport-https \
      ca-certificates \
      curl \
      gnupg-agent \
      software-properties-common &&
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | 
    sudo apt-key add - &&
    sudo add-apt-repository \
      "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
      $(lsb_release -cs) \
      stable" &&
    sudo apt update &&
    sudo apt install docker-ce docker-ce-cli containerd.io &&
    sudo adduser $(whoami) docker &&
    sudo reboot # fixes permission problem when connecting to socket
    
  2. 测试docker。

    docker run hello-world
    
  3. 安装 nvidia-docker。

    distribution=$(. /etc/os-release;echo $ID$VERSION_ID) &&
    curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey |
    sudo apt-key add - &&
    curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list |
    sudo tee /etc/apt/sources.list.d/nvidia-docker.list &&
    sudo apt update &&
    sudo apt install -y nvidia-docker2 &&
    sudo systemctl restart docker
    
  4. 测试 nvidia-docker。

    docker run --rm --gpus all nvidia/cuda:9.1-base nvidia-smi
    
    docker run --rm --gpus all nvidia/cuda:8.0-runtime nvidia-smi
    

更新:据我所知,到目前为止一切都很成功。步骤 (13) 不起作用。

  1. TF docker build....我不确定要使用哪个图像。我正在查看它们的 Dockerfile,特别是 0.11.0-devel-gpu 和 1.12.0-devel-gpu,我看到了一个 COMPUTE_CAPABILITY 变量。与步骤 (8) 中的加密矿工相同,这似乎是一个障碍,因为它们需要 >2.1 计算兼容性。

    docker pull tensorflow/tensorflow:1.11.0-devel-gpu &&
    docker run --gpus all -it -w /tensorflow -v $PWD:/mnt \
      -e HOST_PERMS="$(id -u):$(id -g)" \
      tensorflow/tensorflow:1.11.0-devel-gpu bash
    

    我最终在他们的Dockerfile,并且 apt 安装失败:

    E: Unable to locate package libcublas-9-1
    E: Unable to locate package libcufft-9-1                                                                                                                   
    E: Unable to locate package libcurand-9-1                                                                                                                  
    E: Unable to locate package libcusolver-9-1                                                                                                                
    E: Unable to locate package libcusparse-9-1
    

    搜索这些包裹只会让我陷入下载页面对于 HPC SDK(libcu++ 很酷),但是遗憾的是,我认为没有与这个旧 GPU 兼容的版本。

更新:9.1 是错误的版本。现在正在研究 8.0。这意味着 tensorflow:0.11.0-devel-gpu 是一个很好的线索。这也意味着步骤 (14+) 不会对我的硬件产生任何影响。

现在尝试在裸机上构建......

  1. 我安装了 CUPTI。

    echo /usr/local/cuda-9.1/extras/CUPTI/lib64 |
    
    echo /usr/local/cuda-8.0/extras/CUPTI/lib64 |
    sudo tee -a /etc/ld.so.conf.d/nvidia.conf &&
    sudo ldconfig
    
  2. 已安装 cuDNN 7.1.3 适用于 9.1 cuDNN v7.1.4 适用于 8.0

    sudo dpkg -i libcudnn7_7.1.4.18-1+cuda8.0_amd64.deb \
            libcudnn7-dev_7.1.4.18-1+cuda8.0_amd64.deb
    
  3. 查找并安装libnvinfer7=7.1.3-1+cuda9.1。看起来 Ubuntu 14.04 有一个。

  4. 更新主机 python 包。

    sudo apt install python3-dev python3-pip python3-venv
    
  5. 获取最老的非 EOL 的 Python 版本。

    cd Python-3.6.12 &&
    ./configure --with-univseral-archs=intel-64 --with-hash-algorithm=siphash24 --with-threads --with-ensurepip=upgrade &&
    make -n`nproc` &&
    make DESTDIR=~/python3.6 install
    

    TODO 这是一个源包,所以我必须测试该命令

  6. 安装 GO

    wget https://golang.org/dl/go1.15.6.linux-amd64.tar.gz &&
    tar xf go1.15.6.linux-amd64.tar.gz &&
    sudo chown -R root:root go &&
    sudo mv go /opt/go &&
    sudo tee /etc/profile.d/gopath.sh << "EOF"
    export GOPATH="$HOME/go"
    export GOROOT=/opt/go
    PATH="$PATH:$GOROOT/bin:$GOPATH/bin"
    export PATH=$PATH:$(go env GOPATH)/bin
    EOF
    logout
    
  7. 安装 bazelisk

    go get github.com/bazelbuild/bazelisk &&
    sudo ln -sv $(command -v bazelisk) /usr/local/bin/bazel
    
  8. 编译 TF。过去,我遇到过奇怪的错误,提示 PyPI 上不存在 TF 包,所以我以前尝试过这个,但生成的 pip 包没有运行。在我的系统上,文档的命令会发出警告,所以我对它们做了一些修改。

    更新:由于我的硬件甚至无法支持旧版 TF,我将构建切换为仅 CPU。

    ~/python3.6/usr/local/bin/python3.6 -m venv \
      --system-site-packages tf-env &&
    . tf-env/bin/activate
    pip install -U pip &&
    pip install -U numpy wheel &&
    pip install -U keras_preprocessing --no-deps &&
    
    git clone -b r2.2 --depth=1 --recursive \
      git://github.com/tensorflow/tensorflow.git &&
    cd tensorflow &&
    python configure.py &&
    bazel build  \
      --local_ram_resources=2048 \
      --cxxopt="-D_GLIBCXX_USE_CXX11_ABI=0" \
      //tensorflow/tools/pip_package:build_pip_package &&
    ./bazel-bin/tensorflow/tools/pip_package/build_pip_package \
      /tmp/tensorflow_pkg &&
    pip install /tmp/tensorflow_pkg/tensorflow-version-tags.whl
    

    注意,环境变化似乎不会影响“&&”之后的任何内容,因此不要这样做:

    . tf-env/bin/activate && whatever
    
  9. TODO 测试 TF:

    python -c "import tensorflow as tf;print(tf.reduce_sum(tf.random.normal([1000, 1000])))"
    

答案1

  1. 更新系统

    apt update && apt full-upgrade
    
  2. 卸载驱动程序

    modprobe -r <some variant of nouveau>
    
  3. 下载并安装视频驱动程序。它会自动创建 /etc/modprobe.d/nvidia-installer-disable-nouveau.conf。进行健全性检查。

    nvidia-smi
    
  4. 使其在启动时加载

    update-initramfs -u
    
  5. 下载并安装 CUDA 工具包和补丁。不要覆盖您的驱动程序。

  6. 将 CUDA 工具包库添加到您的路径

    cat > /etc/ld.so.conf.d/nvidia.conf << "EOF"
    /usr/local/cuda-8.0/lib64
    /usr/local/cuda-8.0/extras/CUPTI/lib64
    EOF
    ldconfig
    
  7. 将 CUDA bins 添加到你的路径中

    cat > /etc/profile.d/nvidia.sh << "EOF"
    export PATH="$PATH:/usr/local/cuda-8.0/bin"
    EOF
    . /etc/profile.d/nvidia.sh
    
  8. 编译时,通常有特定于项目的方法来指定 cuda 库的路径。

    LEGACY="
      -Wno-deprecated-gpu-targets
      -gencode arch=compute_20,code=[sm_21,compute_20]"
    
    • 构建

      mkdir build && cd build &&
      cmake .. -G Ninja \
        -DCUDA_LIB=/usr/local/cuda/lib64/stubs/libcuda.so \
        -DCUDA_NVCC_FLAGS="$LEGACY" &&
      cd .. &&
      cmake --build build &&
      cmake --build build --target install
      
    • 自动工具

      ./configure \
        --with-cuda=/usr/local/cuda \
        --with-nvml=libnvidia-ml.so \
        CUDA_NVCC_FLAGS="$LEGACY"
      
      

修改了一些源代码,并得到了关于某些算法,我设法编译了一些。

事实证明,哈希率是非常低

好消息是,docker 似乎按预期工作。TensorFlow 没有出现问题。

相关内容