ubuntu系统docker容器中的torch,使用宿主机的gpu
1. ubuntu安装docker
2. ubuntu安装NVIDIA-container-toolkit
3. 拉取镜像
4. 启动容器
启动命令,增加--gpus all
命令
示例
docker run --gpus all -p 10022:22 -it -d -v /home/app:/app --name test_cuda test_cuda:v1.0 /bin/bash
5. 测试是否能用cuda
将测试代码映射到容器中
import torch
# 检查是否有 GPU 可用
has_gpu = torch.cuda.is_available()
print("GPU 是否可用:", "是" if has_gpu else "否")
if has_gpu:
# 获取 GPU 的数量
gpu_count = torch.cuda.device_count()
print("GPU 数量:", gpu_count)
# 打印每个 GPU 的名称和设备属性
for i in range(gpu_count):
print(f"GPU {i} - 名称:", torch.cuda.get_device_name(i))
print(f"GPU {i} - 设备能力:", torch.cuda.get_device_capability(i))
print(f"GPU {i} - 已分配内存:", torch.cuda.memory_allocated(i), "字节")
print(f"GPU {i} - 已缓存内存:", torch.cuda.memory_reserved(i), "字节")
# 打印 CUDA 版本
cuda_version = torch.version.cuda
print("CUDA 版本:", cuda_version)
# 检查当前设备
current_device = torch.cuda.current_device()
print("当前设备 ID:", current_device)
print("当前设备名称:", torch.cuda.get_device_name(current_device))
else:
print("该机器没有 GPU。")
常见问题
问题1:启动容器通过-v命令挂载方式同步宿主机的文件,使用docker commit打包镜像之后,新镜像不包含该文件
直接在容器内将文件拷贝到非挂载目录,再进行提交打包,确保提交时内容在容器文件系统中。以下是具体步骤:
1. 进入容器并复制文件
进入容器的交互终端,然后把 /app 下的文件复制到容器内的其他目录(如 /opt):
bash
复制代码
docker exec -it <容器ID或容器名称> /bin/bash
cp -r /app /opt/app_backup # 将 /app 目录内容复制到 /opt/app_backup
2. 验证文件是否已复制到新目录
在容器终端中检查文件是否已复制成功:
bash
复制代码
ls /opt/app_backup # 查看新目录是否包含文件
3. 提交容器为新镜像
退出容器终端后,通过 docker commit 将容器打包为新的镜像:
bash
复制代码
docker commit <容器ID或容器名称> 新镜像名称:标签
4. 使用新镜像启动容器
使用新的镜像启动容器,不添加挂载配置,然后查看 /opt/app_backup 是否包含之前的文件:
bash
复制代码
docker run -it 新镜像名称:标签 /bin/bash
ls /opt/app_backup # 确认文件存在
这样,文件就会保存在新镜像内,即使没有挂载宿主机目录,启动的新容器也会包含这些文件。