几年前,我的朋友给了我这台笔记本电脑,因为他从那时起就升级了电脑。它有一个 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 身份执行了此操作,但我可能应该切换到单用户模式:
- 应用任何错误修复,但从不进行发布升级。
apt update && apt full-upgrade
更新:可以在此处完成步骤(9-10),以将其减少为一次重启。
这不适用于我的情况,但适用于图形安装、黑名单 nouveau 和:
modprobe -r <some variant of nouveau>
下载并安装视频驱动程序390.138. 其他驱动程序版本这里,但您需要查看细则才能找到高级选项,即旧版本和测试版本。
对于较新版本的 Ubuntu,存在编译器版本不匹配的问题:DKMS、NVidia 模块、GCC 5/7,可以通过 update-alternatives 解决。其他解决方法对我来说不起作用。
使新的驱动程序在启动时加载。
update-initramfs -u
完整性检查
nvidia-smi
下载并安装 CUDA 工具包
9.18.0及其三个补丁。不要让它覆盖你的驱动程序。对于其他驱动程序版本,有一个兼容性矩阵确定所需的 SDK 版本。驱动程序下载页面帮助我们选择操作系统版本,在这种情况下,16.04或 17.04,优先选择偶数版本号。这些安装脚本需要一次运行一个,因为它们在失败时似乎无法给出合理的退出状态。
重新启动并以非 root 身份登录。程序无法正确链接,这就是我修复它的方法。我认为这与 /etc/environment 和 /etc/profile 有关,以及何时和哪些进程获取它们。
更新:也许只是注销。使用 /etc/profile.d 和 /etc/ld.so.conf.d 代替 /etc/environment
当编译我想要运行的程序时,我使用 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 容器应该更简单,所以我首先更深入地研究了这一点。
安装 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
测试docker。
docker run hello-world
安装 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
测试 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) 不起作用。
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+) 不会对我的硬件产生任何影响。
现在尝试在裸机上构建......
我安装了 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
我已安装
cuDNN 7.1.3 适用于 9.1cuDNN 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
查找并安装libnvinfer7=7.1.3-1+cuda9.1。看起来 Ubuntu 14.04 有一个。更新主机 python 包。sudo apt install python3-dev python3-pip python3-venv
获取最老的非 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 这是一个源包,所以我必须测试该命令
安装 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
安装 bazelisk
go get github.com/bazelbuild/bazelisk && sudo ln -sv $(command -v bazelisk) /usr/local/bin/bazel
编译 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
TODO 测试 TF:
python -c "import tensorflow as tf;print(tf.reduce_sum(tf.random.normal([1000, 1000])))"
答案1
更新系统
apt update && apt full-upgrade
卸载驱动程序
modprobe -r <some variant of nouveau>
下载并安装视频驱动程序。它会自动创建 /etc/modprobe.d/nvidia-installer-disable-nouveau.conf。进行健全性检查。
nvidia-smi
使其在启动时加载
update-initramfs -u
下载并安装 CUDA 工具包和补丁。不要覆盖您的驱动程序。
将 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
将 CUDA bins 添加到你的路径中
cat > /etc/profile.d/nvidia.sh << "EOF" export PATH="$PATH:/usr/local/cuda-8.0/bin" EOF . /etc/profile.d/nvidia.sh
编译时,通常有特定于项目的方法来指定 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 没有出现问题。