es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Docker permite que las GPUs Nvidia sean visibles durante el proceso de construcción de imágenes de Docker.

Quiero construir una imagen de Docker donde pueda compilar núcleos personalizados con pytorch. Por lo tanto, necesito acceder a las GPU disponibles para compilar los núcleos personalizados durante el proceso de construcción de Docker. En la máquina host todo está configurado, incluyendo nvidia-container-runtime, nvidia-docker, controladores Nvidia, Cuda, etc. El siguiente comando muestra la información del tiempo de ejecución de Docker en el sistema host:

Como se puede ver, el tiempo de ejecución predeterminado de Docker en mi caso es runc. Creo que cambiar el tiempo de ejecución predeterminado de runc a nvidia resolvería este problema, como se señaló aquí.

La solución propuesta no funciona en mi caso porque:
– No tengo permisos para cambiar el tiempo de ejecución predeterminado en el sistema que uso.
– No tengo permisos para realizar cambios en el archivo daemon.json

¿Hay alguna forma de acceder a las GPU durante el proceso de compilación en el archivo Dockerfile para compilar núcleos personalizados de pytorch para CPU y GPU (en mi caso DCNv2)?

Aquí hay un ejemplo mínimo de mi archivo Dockerfile para reproducir este problema. En esta imagen, DCNv2 solo se compila para CPU y no para GPU.

DE nvidia/cuda:10.1-cudnn7-devel-ubuntu18.04

RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y tzdata && \
apt-get install -y –no-install-recommends software-properties-common && \
add-apt-repository ppa:deadsnakes/ppa && \
apt update && \
apt install -y –no-install-recommends python3.6 && \
apt-get install -y –no-install-recommends \
build-essential \
python3.6-dev \
python3-pip \
python3.6-tk \
pkg-config \
software-properties-common \
git

RUN ln -s /usr/bin/python3 /usr/bin/python & \
ln -s /usr/bin/pip3 /usr/bin/pip

RUN python -m pip install –no-cache-dir –upgrade pip setuptools && \
python -m pip install –no-cache-dir torch==1.4.0 torchvision==0.5.0

RUN git clone https://github.com/CharlesShang/DCNv2/

#Compile DCNv2
WORKDIR /DCNv2
RUN bash ./make.sh

clean up

RUN apt-get clean && \
rm -rf /var/lib/apt/lists/*

#Build: docker build -t my_image .
#Run: docker run -it my_image

Una solución no óptima que funcionó sería la siguiente:

  • Comentario en la línea RUN bash ./make.sh en el archivo Dockerfile
  • Construir la imagen: docker build -t my_image.
  • Ejecutar la imagen en modo interactivo: docker run –gpus all -it my_image.
  • Compilar DCNv2 manualmente: root@1cd02fd62461:/DCNv2# ./make.sh

Aquí DCNv2 se compila para CPU y GPU, pero no parece ser una solución ideal, ya que debo compilar DCNv2 cada vez que inicio el contenedor.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, no hay una solución directa para tu problema debido a las restricciones que has mencionado. Sin embargo, todavía existe un método alternativo que podría ayudar en tu situación. Puedes intentar usar la función “BuildKit” de nvidia-docker 2.0, que te permite acceder a las GPUs dentro de los contenedores de Docker durante el proceso de compilación.

    Aquí te mostramos cómo puedes modificar tu Dockerfile para usar BuildKit:

    1. Añade la siguiente línea justo después de la declaración FROM:
    # syntax=docker/dockerfile:experimental
    

    Esto habilita la sintaxis de BuildKit en tu Dockerfile.

    1. Modifica tu sentencia RUN que compila DCNv2 de la siguiente manera:
    RUN --mount=type=cache,target=/root/.cache/pip \
        --mount=type=bind,source="$(pwd)",target=/DCNv2 \
        --mount=type=bind,source=/usr/local/cuda-10.1/lib64,target=/usr/local/cuda/lib64 \
        bash ./make.sh
    

    Esta modificación hace lo siguiente:

    • Monta una caché para pip para acelerar el proceso de compilación y evitar que los módulos se recompilen innecesariamente.
    • Monta el directorio de trabajo actual como un enlace para evitar copiar todos los archivos en el contenedor.
    • Monta la biblioteca Nvidia CUDA como un enlace para habilitar el acceso a la GPU durante el proceso de compilación.
    1. Compila la imagen de Docker usando el comando buildx. Esta herramienta proporciona una interfaz para la función BuildKit.
    docker buildx build --platform linux/amd64 --load -t my_image .
    

    Este comando utiliza la plataforma linux/amd64 como ejemplo. Modifícalo de acuerdo con la arquitectura de tu sistema.

    Además, la opción --load carga la imagen de Docker compilada en tu demonio local de Docker. Puedes omitirlo si no quieres cargar la imagen.

    1. Ejecuta la imagen en modo interactivo como antes:
    docker run --gpus all -it my_image
    

    Ahora, DCNv2 debería estar compilado tanto para la CPU como para la GPU durante el proceso de compilación de Docker.

    Ten en cuenta que esta es una solución alternativa, y puede que no sea la solución más óptima o segura, especialmente si estás trabajando con datos sensibles. En tales casos, es posible que debas considerar soluciones alternativas o contactar a tu administrador de sistema para que te otorgue los permisos necesarios.

Comments are closed.