Ubuntu 16.04下使用Docker运行多版本CUDA及Conda环境配置问询
问题解答
多CUDA版本容器运行可行性
首先可以明确:完全可以在同一台主机上同时运行多个搭载不同CUDA版本的Docker容器,不存在单台主机只能对应单一CUDA版本的限制。
原理说明:主机侧安装的NVIDIA驱动是硬件的抽象层,自带向下兼容性,每版驱动都会明确标注支持的最高CUDA版本,只要容器内使用的CUDA版本不超过这个最高值,就可以正常运行,不同容器之间的CUDA、依赖环境完全隔离,互不影响。
比如主机驱动支持最高CUDA 12.2,你可以同时运行CUDA 10.1、CUDA 11.3、CUDA 12.0的三个容器,分别适配不同版本的TensorFlow,不会出现冲突。
前置环境配置
要实现容器调用GPU,你需要先完成以下配置:
- 确认主机驱动支持的CUDA版本:执行
nvidia-smi,输出右上角标注的CUDA Version即为当前驱动支持的最高CUDA版本,你所有要使用的容器CUDA版本都不能超过该值。 - 安装nvidia-container-toolkit:完成安装并重启Docker服务后,容器才能正常识别主机GPU资源,安装完成后可以执行
docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi测试,输出正常GPU信息即代表配置生效。
基于conda环境构建Docker镜像指引
你可以参考以下流程打包带conda环境的自定义Docker镜像:
步骤1:准备依赖导出文件
先在你本地可正常运行的conda环境中,执行以下命令导出依赖配置:conda env export --from-history > environment.yml
生成的environment.yml文件会包含你当前环境的所有conda、pip依赖。
步骤2:编写Dockerfile
在environment.yml同目录下创建Dockerfile,参考示例如下(以CUDA11.3 + conda环境为例):
# 基础镜像选择NVIDIA官方对应CUDA版本的运行时镜像,已自带适配好的CUDA、cuDNN依赖 # 你可以根据项目需要替换为其他CUDA版本的官方镜像 FROM nvidia/cuda:11.3.1-cudnn8-runtime-ubuntu18.04 # 安装系统基础依赖 RUN apt update && apt install -y bzip2 && rm -rf /var/lib/apt/lists/* # 安装Miniconda3:提前将Miniconda3安装包放到Dockerfile同目录 COPY Miniconda3-latest-Linux-x86_64.sh miniconda.sh RUN bash miniconda.sh -b -p /opt/conda && rm miniconda.sh # 将conda加入全局环境变量 ENV PATH="/opt/conda/bin:$PATH" # 复制依赖文件并创建conda环境 COPY environment.yml . RUN conda env create -f environment.yml # 配置容器启动时自动激活conda环境 RUN echo "conda activate your_env_name" >> ~/.bashrc SHELL ["/bin/bash", "--login", "-c"] # 设置容器默认工作目录 WORKDIR /workspace
注意:将上述示例中的
your_env_name替换为你environment.yml里定义的环境名称。
步骤3:构建并运行镜像
- 执行镜像构建命令:
docker build -t my-project-env . - 启动带GPU支持的容器:
docker run --gpus all -it --rm -v $(pwd):/workspace my-project-env - 容器启动后会自动激活对应的conda环境,直接运行项目代码即可,你可以通过
python -c "import tensorflow as tf; print(tf.test.is_gpu_available())"验证GPU是否正常调用。
不同的项目可以单独编写对应CUDA版本、对应依赖的Dockerfile,实现多环境完全隔离,不需要修改主机侧的任何配置。
内容的提问来源于stack exchange,提问作者maryam_hallal
相关产品推荐
相关产品推荐

