Docker
需求:将具有复杂依赖的程序在任意环境(服务器)上运行
- 由于服务器无法联网,且装cuda及相关驱动、工具包等对环境改动较大,容易影响到物理机本身,在Docker中运行相关程序是更好的选择。
- Nvidia提供了不同CUDA版本的基础镜像
安装Docker
从Docker官方网站获取操作系统的安装程序,并按照说明进行安装
编写Dockerfile
1
| touch Dockerfile #创建Dockerfile
|
Dockerfile是用来构建Docker镜像的指令文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| # 使用CUDA 12.3.1 开发环境的 Ubuntu 20.04 镜像作为基础镜像 FROM nvidia/cuda:12.3.1-devel-ubuntu20.04
# 设置工作目录 WORKDIR /app
# 复制CUDA程序源代码到容器中的/app目录 COPY . /app
# 安装编译工具和其他依赖项 RUN apt-get update && \ apt-get install -y \ build-essential \ g++-10 \ <其他依赖项>
# 授予run.sh执行权限 RUN chmod +x run.sh
# 运行CUDA程序的命令 CMD ["./run.sh"]
|
- devel版本的基础镜像包含了cudatoolkit等驱动及编译调试工具;runtime版本则用于直接执行编译好的cu文件
- 镜像中最好安装vim等方便编辑的基础工具
也可以使用 docker pull 命令从 Docker Hub 上拉取 nvidia/cuda:12.3.1-devel-ubuntu20.04 这个标签的镜像.这里不需要手动选择架构来拉取容器镜像。Docker会自动识别并拉取与您的主机架构匹配的镜像
1
| docker pull nvidia/cuda:12.3.1-devel-ubuntu20.04
|
构建镜像
1
| docker build -t your_image_name .
|
测试镜像
1
| docker run --gpus all -v /path/to/your/input/files:/input your_image_name
|
镜像传输至服务器并运行
1 2
| docker run --gpus all your_image_name docker run --gpus all your_image_name /bin/bash
|
若服务器无法联网:
1 2 3 4 5 6 7 8 9
| # 在本地保存镜像为一个tar文件 docker save -o your_image.tar your_image_name
# 将该tar文件复制到服务器上 scp your_image.tar user@server_ip:/path/to/destination
# 在服务器上加载镜像 ssh user@server_ip docker load -i /path/to/destination/your_image.tar
|
常见指令
1 2 3 4 5 6 7
| docker ps -a 列出所有容器 docker images 列出所有镜像 docker rm container_id 删除容器 docker rm -f container_id_or_name 强制删除容器 docker rmi image_id 删除镜像 docker commit container_id new_image_name 基于已修改的容器创建新镜像 docker cp /local/path/to/your/file_or_directory container_id:/app/ 本地文件挂载到容器中
|