无法使用自定义容器在 Google AI Platform 上加载动态库 libcuda.so.1 错误

Posted

技术标签:

【中文标题】无法使用自定义容器在 Google AI Platform 上加载动态库 libcuda.so.1 错误【英文标题】:Could not load dynamic library libcuda.so.1 error on Google AI Platform with custom container 【发布时间】:2021-06-07 12:53:22 【问题描述】:

我正在尝试使用自定义容器在 Google AI Platform 上启动训练作业。由于我想使用 GPU 进行训练,因此我用于容器的基本图像是:

FROM nvidia/cuda:11.1.1-cudnn8-runtime-ubuntu18.04

有了这张图片(并在上面安装了 tensorflow 2.4.1),我以为我可以在 AI Platform 上使用 GPU,但似乎并非如此。训练开始时,日志显示如下:

W tensorflow/stream_executor/platform/default/dso_loader.cc:60] Could not load dynamic library 'libcuda.so.1'; dlerror: libcuda.so.1: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/nvidia/lib:/usr/local/nvidia/lib64
I tensorflow/stream_executor/cuda/cuda_diagnostics.cc:156] kernel driver does not appear to be running on this host (gke-cml-0309-144111--n1-highmem-8-43e-0b9fbbdc-gnq6): /proc/driver/nvidia/version does not exist
I tensorflow/compiler/jit/xla_gpu_device.cc:99] Not creating XLA devices, tf_xla_enable_xla_devices not set
WARNING:tensorflow:There are non-GPU devices in `tf.distribute.Strategy`, not using nccl allreduce.

这是构建图像以在 Google AI Platform 上使用 GPU 的好方法吗?还是我应该尝试依赖张量流图像并手动安装所有需要的驱动程序来利用 GPU?

编辑:我在这里 (https://cloud.google.com/ai-platform/training/docs/containers-overview) 读到以下内容:

For training with GPUs, your custom container needs to meet a few
special requirements. You must build a different Docker image than     
what you'd use for training with CPUs.

Pre-install the CUDA toolkit and cuDNN in your Docker image. Using the 
nvidia/cuda image as your base image is the recommended way to handle 
this. It has the matching versions of CUDA toolkit and cuDNN pre-
installed, and it helps you set up the related environment variables 
correctly.

Install your training application, along with your required ML     
framework and other dependencies in your Docker image.

他们还提供了一个 Dockerfile 示例 here 用于使用 GPU 进行训练。所以我所做的似乎还可以。不幸的是,我仍然有上面提到的这些错误,这些错误可以解释(或不解释)为什么我不能在 Google AI Platform 上使用 GPU。

EDIT2:在此处阅读 (https://www.tensorflow.org/install/gpu),我的 Dockerfile 现在是:

FROM tensorflow/tensorflow:2.4.1-gpu
RUN apt-get update && apt-get install -y \
 lsb-release \
 vim \
 curl \
 git \
 libgl1-mesa-dev \
 software-properties-common \
 wget && \
 rm -rf /var/lib/apt/lists/*

# Add NVIDIA package repositories
RUN wget -nv https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/cuda-ubuntu1804.pin
RUN mv cuda-ubuntu1804.pin /etc/apt/preferences.d/cuda-repository-pin-600
RUN apt-key adv --fetch-keys https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/7fa2af80.pub
RUN add-apt-repository "deb https://developer.download.nvidia.com/compute/cuda/repos/ubuntu1804/x86_64/ /"
RUN apt-get update

RUN wget -nv http://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb

RUN apt install ./nvidia-machine-learning-repo-ubuntu1804_1.0.0-1_amd64.deb
RUN apt-get update

# Install NVIDIA driver
RUN apt-get install -y --no-install-recommends nvidia-driver-450
# Reboot. Check that GPUs are visible using the command: nvidia-smi

RUN wget -nv https://developer.download.nvidia.com/compute/machine-learning/repos/ubuntu1804/x86_64/libnvinfer7_7.1.3-1+cuda11.0_amd64.deb
RUN apt install ./libnvinfer7_7.1.3-1+cuda11.0_amd64.deb
RUN apt-get update

# Install development and runtime libraries (~4GB)
RUN apt-get install --no-install-recommends \
    cuda-11-0 \
    libcudnn8=8.0.4.30-1+cuda11.0  \
    libcudnn8-dev=8.0.4.30-1+cuda11.0


# other stuff

问题是构建在似乎是键盘配置的阶段冻结。系统要求选择一个国家,当我输入数字时,没有任何反应

【问题讨论】:

您能补充一点信息吗?你是如何启动容器的?你安装nvidia-docker了吗? 我认为 nvidia/cuda 是要安装的平台 (hub.docker.com/r/nvidia/cuda)。 TBH 我不太了解有关 Cuda、CudaDNN、驱动程序、工具包等的所有这些微妙之处。我将尝试根据您的建议将我的图像建立在 nvidia 工具包上,看看它是否有效。关于容器,因为它是由 Google AI Platform 启动的,所以我无法确切说明它是如何启动的。 我刚刚在这里 (towardsdatascience.com/…) 发现我的基础镜像似乎对应于 NVIDIA Container Toolkit 镜像。也许我缺少的是 Dockerfile 中的 CMD nvidia-smi。我试试看。 添加了 nvidia-smi 命令后,我现在收到消息“已成功打开动态库 libcudart.so.11.0”,但下一条消息是“无法加载动态库 'libcuda.so.1';dlerror : libcuda.so.1: 无法打开共享对象文件: 没有这样的文件或目录; LD_LIBRARY_PATH: /usr/local/nvidia/lib:/usr/local/nvidia/lib64" 该库带有 NVIDIA 驱动程序。如果没有,说明你没有正确安装 GPU 驱动 【参考方案1】:

构建最可靠容器的建议方法是使用官方维护的“深度学习容器”。我建议拉“gcr.io/deeplearning-platform-release/tf2-gpu.2-4”。这应该已经安装和测试了 CUDA、CUDNN、GPU 驱动程序和 TF 2.4。您只需将代码添加到其中即可。

https://cloud.google.com/ai-platform/deep-learning-containers/docs/choosing-container https://console.cloud.google.com/gcr/images/deeplearning-platform-release?project=deeplearning-platform-release https://cloud.google.com/ai-platform/deep-learning-containers/docs/getting-started-local#create_your_container

【讨论】:

非常感谢,这就是我想要的。欢迎使用 ***!

以上是关于无法使用自定义容器在 Google AI Platform 上加载动态库 libcuda.so.1 错误的主要内容,如果未能解决你的问题,请参考以下文章

Vertex AI 自定义预测与 Google Kubernetes Engine

在 Google vertex ai 上创建自定义模型

Vertex AI 自定义容器批量预测

顶点ai中的自定义容器部署

Google Cloud Platform Vertex AI 日志未显示在自定义作业中

如何从自定义 AI 平台模型登录