当前位置:   article > 正文

Dockerfile封装制作pytorch(tensorflow)深度学习框架 + jupyterlab服务 + ssh服务镜像_pytorch docker镜像

pytorch docker镜像

一:docker-hub官网寻找需求镜像

1.我们在https://hub.docker.com/官网找到要封装的pytorch基础镜像,这里我们以pytorch1.13.1版本为例

2.我们找到的这个devel版本的镜像(我们需要cuda的编译工具)

pytorch版本是1.13.1,cuda版本是11.6,cudnn gpu加速库的版本是8版本(ubuntu系统已经封装在镜像里了,一会启动时候就可以去判断系统版本是多少了

3.runtime和devel版本的区别解释:

  1. 1.13.1-cuda11.6-cudnn8-devel:
  2. devel 是 "development" 的缩写,表示这是一个开发版本。
  3. 这个版本包含了开发深度学习应用所需的工具和库,比如编译器、头文件、静态库等。
  4. 适用于需要编译和开发深度学习应用的场景。
  5. 1.13.1-cuda11.6-cudnn8-runtime:
  6. runtime 表示这是一个运行时版本。
  7. 这个版本主要包含运行深度学习应用所需的库和二进制文件,但不包含开发工具和头文件。
  8. 适用于只需要运行预编译的深度学习模型或应用的场景。
  9. 为什么一个大一个小?
  10. 内容不同:
  11. devel 版本包含了更多的开发工具、头文件和静态库,这些文件在编译和开发过程中是必需的,但在运行时并不需要。
  12. runtime 版本只包含运行时所需的库和二进制文件,省去了开发工具和头文件,因此体积更小。
  13. 用途不同:
  14. devel 版本适用于开发环境,你可以在这个环境中编译和调试深度学习应用。
  15. runtime 版本适用于生产环境或部署环境,你只需要运行已经开发好的深度学习应用。
  16. 具体区别
  17. 包含的文件:
  18. devel 版本:包含 CUDA 编译器(nvcc)、开发工具(如 gdb、profiler)、头文件(如 .h 文件)、静态库(如 .a 文件)以及所有的运行时库。
  19. runtime 版本:仅包含运行时库(如 .so 文件)和必要的二进制文件。
  20. 使用场景:
  21. devel 版本:适用于需要编译和开发的场景,如开发新模型、编写自定义 CUDA 内核等。
  22. runtime 版本:适用于部署和运行已经编译好的模型和应用,如在生产环境中运行深度学习推理服务。
  23. 总结
  24. 选择哪个版本取决于你的需求:
  25. 如果你需要开发和编译深度学习应用,选择 devel 版本。
  26. 如果你只需要运行已经开发好的深度学习应用,选择 runtime 版本。

二:拉取基础镜像

1.复制拉取命令

2.服务器上拉取基础镜像

docker pull pytorch/pytorch:1.13.1-cuda11.6-cudnn8-devel

3.配置docker守护进程加速

最近dockerhub还有一些国内镜像加速源都都不好用了,这里建议走代理服务器或者给docker守护进程配置代理:

Linux服务器开启临时外网全局代理-CSDN博客

或者:

docker守护进程配置代理-CSDN博客

三:编写我们的dockerfile文件内容

需求描述:

(1)我们镜像里要求已安装好我们要用到的命令和python包等等:

  1. # 更新包列表并安装基本工具
  2. RUN apt-get update && apt-get install -y \
  3. sudo \
  4. git \
  5. wget \
  6. curl \
  7. vim \
  8. unzip \
  9. zip \
  10. tar \
  11. gzip \
  12. openssh-server \
  13. openssh-client \
  14. nodejs \
  15. npm && \
  16. rm -rf /var/lib/apt/lists/*

(2)要求修改pip源为阿里云镜像源:

  1. # 修改 pip 源为阿里云镜像源
  2. RUN mkdir -p /root/.pip \
  3. && echo "[global]" > /root/.pip/pip.conf \
  4. && echo "index-url = https://mirrors.aliyun.com/pypi/simple/" >> /root/.pip/pip.conf \
  5. && echo "trusted-host = mirrors.aliyun.com" >> /root/.pip/pip.conf

(3)要求安装并启动ssh和jupyter-lab服务,这里我们通过外挂启动脚本实现:

  1. # 将启动脚本配置在容器中
  2. COPY setup.sh /setup.sh # 本地目录拷贝启动脚本到容器内/目录下
  3. RUN chmod +x /setup.sh
  4. # 使用启动脚本作为容器初始化入口
  5. ENTRYPOINT ["/setup.sh"]

(4)防止宿主机不同型号gpu导致的cuda调用异常,需要封装PyTorch NVML 基于 CUDA 检查环境变量:

ENV PYTORCH_NVML_BASED_CUDA_CHECK=1

完整的dockerfile文件内容:

vim torch1.13.1_dockerfile
  1. # 定义基础镜像
  2. FROM pytorch/pytorch:1.13.1-cuda11.6-cudnn8-devel
  3. # 设置非互动模式以避免一些安装过程中的对话框
  4. ENV DEBIAN_FRONTEND=noninteractive
  5. # 删除无效的 Nvidia 存储库(如果它存在的话)
  6. #RUN rm /etc/apt/sources.list.d/cuda.list || true
  7. #RUN rm /etc/apt/sources.list.d/nvidia-ml.list || true
  8. # 更新包列表并安装基本工具
  9. RUN apt-get update && apt-get install -y \
  10. sudo \
  11. git \
  12. wget \
  13. curl \
  14. vim \
  15. unzip \
  16. zip \
  17. tar \
  18. gzip \
  19. openssh-server \
  20. openssh-client \
  21. nodejs \
  22. npm && \
  23. rm -rf /var/lib/apt/lists/*
  24. # 修改 pip 源为阿里云镜像源
  25. RUN mkdir -p /root/.pip \
  26. && echo "[global]" > /root/.pip/pip.conf \
  27. && echo "index-url = https://mirrors.aliyun.com/pypi/simple/" >> /root/.pip/pip.conf \
  28. && echo "trusted-host = mirrors.aliyun.com" >> /root/.pip/pip.conf
  29. RUN pip install tornado==6.1
  30. RUN pip install notebook==6.4.10
  31. # 安装指定的 Python 库
  32. RUN pip install \
  33. ipykernel==6.29.5 \
  34. jupyter_client==7.4.8 \
  35. jupyter_core==5.7.2 \
  36. jupyter_server==2.14.1 \
  37. jupyterlab==4.2.3 \
  38. nbclient==0.10.0 \
  39. nbconvert==7.16.4 \
  40. nbformat==5.10.4 \
  41. notebook==6.5.7 \
  42. traitlets==5.7.1 \
  43. jupyter-tensorboard==0.2.0 \
  44. jupyterlab-tensorboard-pro==4.0.0 \
  45. tensorboard-data-server==0.7.2 \
  46. tensorboard
  47. # 设置 PyTorch NVML 基于 CUDA 检查环境变量
  48. ENV PYTORCH_NVML_BASED_CUDA_CHECK=1
  49. # 暴露 SSH 和 Jupyter Lab 端口
  50. EXPOSE 22
  51. EXPOSE 8888
  52. # 将启动脚本配置在容器中
  53. COPY setup.sh /setup.sh
  54. RUN chmod +x /setup.sh
  55. # 使用启动脚本作为容器初始化入口
  56. ENTRYPOINT ["/setup.sh"]
  57. # 在容器中创建并修改 Jupyter Lab 的配置文件
  58. RUN echo "c.ServerApp.terminado_settings = {'shell_command': ['/bin/bash']}" > /root/.jupyter/jupyter_lab_config.py

完整的setup.sh启动脚本内容:

vim setup.sh
  1. #!/bin/bash
  2. # 设置清华源,如果尚未设置
  3. if ! pip config get global.index-url | grep -q "https://pypi.tuna.tsinghua.edu.cn/simple"; then
  4. echo "设置 pip 使用清华源..."
  5. pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
  6. fi
  7. # 检查 JupyterLab 是否已安装
  8. if ! pip show jupyterlab > /dev/null 2>&1; then
  9. echo "安装 JupyterLab..."
  10. pip install jupyterlab==4.2.3
  11. else
  12. echo "JupyterLab 已安装,跳过安装步骤。"
  13. fi
  14. # 创建SSH服务所需的目录
  15. echo "创建 SSHD 必要的目录..."
  16. mkdir -p /var/run/sshd /root/.ssh
  17. # 创建JupyterLab工作目录
  18. if [ ! -d /root/workspace ]; then
  19. echo "创建 Jupyter Lab 工作目录..."
  20. mkdir -p /root/workspace
  21. chown -R root:root /root/workspace
  22. fi
  23. # 设置环境变量到 .bashrc
  24. BASHRC_PATH="/root/.bashrc"
  25. ENV_VARS='export PATH="/usr/local/nvidia/bin:/usr/local/cuda/bin:/opt/conda/bin:/usr/local/nvidia/bin:/usr/local/cuda/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:$PATH"'
  26. if ! grep -Fxq "$ENV_VARS" "$BASHRC_PATH"; then
  27. echo "$ENV_VARS" >> "$BASHRC_PATH"
  28. fi
  29. # 确保在 .bashrc 中添加 `cd /root/workspace`
  30. if ! grep -Fxq "cd /root/workspace" "$BASHRC_PATH"; then
  31. echo "cd /root/workspace" >> "$BASHRC_PATH"
  32. fi
  33. # 如果 authorized_keys 文件不存在,则创建它
  34. AUTHORIZED_KEYS="/root/.ssh/authorized_keys"
  35. if [ ! -f "$AUTHORIZED_KEYS" ]; then
  36. echo "创建 authorized_keys 文件..."
  37. touch "$AUTHORIZED_KEYS"
  38. chmod 600 "$AUTHORIZED_KEYS"
  39. chown -R root:root /root/.ssh
  40. fi
  41. # 配置sshd服务,如果尚未配置
  42. SSHD_CONFIG="/etc/ssh/sshd_config"
  43. if [ ! -f "$SSHD_CONFIG" ]; then
  44. echo "配置 SSHD 服务..."
  45. cat <<EOF > "$SSHD_CONFIG"
  46. Port 22
  47. PermitRootLogin yes
  48. PubkeyAuthentication yes
  49. AuthorizedKeysFile .ssh/authorized_keys
  50. PasswordAuthentication yes
  51. ChallengeResponseAuthentication no
  52. UsePAM yes
  53. X11Forwarding yes
  54. PrintMotd no
  55. AcceptEnv LANG LC_*
  56. Subsystem sftp /usr/lib/openssh/sftp-server
  57. EOF
  58. # 生成 sshd 主机密钥
  59. echo "生成 SSHD 主机密钥..."
  60. ssh-keygen -A
  61. else
  62. echo "SSHD 服务已经配置,跳过配置步骤。"
  63. fi
  64. # 检查SSHD服务是否正在运行,如果没有则启动
  65. if ! pgrep -x "sshd" > /dev/null; then
  66. echo "启动 SSHD 服务..."
  67. /usr/sbin/sshd
  68. else
  69. echo "SSHD 服务已经运行,跳过启动步骤。"
  70. fi
  71. # 生成 Jupyter 配置文件(如果不存在)
  72. JUPYTER_CONFIG_DIR="/root/.jupyter"
  73. if [ ! -d "$JUPYTER_CONFIG_DIR" ]; then
  74. mkdir -p "$JUPYTER_CONFIG_DIR"
  75. fi
  76. JUPYTER_CONFIG_FILE="$JUPYTER_CONFIG_DIR/jupyter_notebook_config.py"
  77. if [ ! -f "$JUPYTER_CONFIG_FILE" ]; then
  78. echo "生成 Jupyter 配置文件..."
  79. jupyter notebook --generate-config
  80. fi
  81. # 设置 JupyterLab 默认工作目录
  82. echo "设置 JupyterLab 默认工作目录..."
  83. if ! grep -q "c.ServerApp.root_dir = '/root/workspace'" "$JUPYTER_CONFIG_FILE"; then
  84. echo "c.ServerApp.root_dir = '/root/workspace'" >> "$JUPYTER_CONFIG_FILE"
  85. fi
  86. # 设置 JupyterLab 终端命令
  87. if ! grep -q "c.ServerApp.terminado_settings = {'shell_command': ['/bin/bash']}" "$JUPYTER_CONFIG_FILE"; then
  88. echo "c.ServerApp.terminado_settings = {'shell_command': ['/bin/bash']}" >> "$JUPYTER_CONFIG_FILE"
  89. fi
  90. # 检查JupyterLab服务是否已经启动
  91. if ! pgrep -f "jupyter-lab" > /dev/null; then
  92. echo "启动 JupyterLab..."
  93. nohup jupyter lab --ip=0.0.0.0 --allow-root --no-browser --notebook-dir=/root/workspace > jupyter_lab.log 2>&1 &
  94. else
  95. echo "JupyterLab 已在运行,跳过启动步骤。"
  96. fi
  97. # 添加一个阻塞进程,以保持容器运行
  98. echo "容器已启动并运行,阻止脚本退出以保持容器运行..."
  99. tail -f /dev/null

四:构建镜像

以咱们刚才编辑好的dockerfile和setup.sh构建镜像

docker build -t ubuntu18.04_pytorch1.13.1 -f torch1.13.1_dockerfile . 

构建成功,启动镜像测试

五:测试镜像

(1)运行镜像测试:

docker run -d -p 2255:22 5858:8888 ubuntu18.04_pytorch1.13.1

(2)查看镜像是否正常启动并找到docker id 进入容器内部测试:

docker ps | grep torch

(3)进入容器内部查看python,ubuntu,cuda和gpu的版本,显卡型号等等信息:

 docker exec -it  8b80ab67bcd3 bash
cat /etc/lsb-release

nvidia-smi   ## 可以看到咱们容器内部可以读取到宿主机的显卡型号为4090,显卡驱动版本为550.54.14 

 python --version

nvcc --version  ## 验证cuda版本

(3)测试ssh和jupyterlab功能和服务是否正常:

浏览器访问宿主机ip+5885端口,并查看容器内部进程,jupyterlab是否正常安装启动

(4)使用python和pytorch测试pytorch是否正常,是否可以正常调用cuda和宿主机GPU:

测试脚本内容:

  1. import torch
  2. def test_torch_cuda():
  3. print("Checking PyTorch and CUDA installation...")
  4. # 检查 PyTorch 版本
  5. print(f"PyTorch version: {torch.__version__}")
  6. # 检查是否可以调用 CUDA
  7. if torch.cuda.is_available():
  8. print("CUDA is available.")
  9. else:
  10. print("CUDA is not available.")
  11. return
  12. # 检查 CUDA 版本
  13. cuda_version = torch.version.cuda
  14. print(f"CUDA version: {cuda_version}")
  15. # 检查 GPU 的数量
  16. gpu_count = torch.cuda.device_count()
  17. print(f"Number of GPUs: {gpu_count}")
  18. for i in range(gpu_count):
  19. print(f"GPU {i}: {torch.cuda.get_device_name(i)}")
  20. # 获取 GPU 的计算能力
  21. capability = torch.cuda.get_device_capability(i)
  22. print(f" Compute capability: {capability[0]}.{capability[1]}")
  23. # 获取 GPU 显存信息
  24. mem_info = torch.cuda.get_device_properties(i).total_memory / (1024 ** 3) # 单位GB
  25. print(f" Total memory: {mem_info:.2f} GB")
  26. if __name__ == "__main__":
  27. test_torch_cuda()

六:测试全部通过,镜像封装测试通过,推送私有docker-hub

(1)其他例如pytorch的其他版本,tensorflow等等,百度的paddlepaddle飞浆等大模型镜像的封装办法也一样,只需要修改基础镜像部分配置就可以:

剩下镜像里安装的工具包,环境变量按需配置。

(2)推送私有镜像仓库备用

  1. docker tag ubuntu18.04_pytorch1.13.1:latest harbor.prohub.net/library/ubuntu18.04_pytorch1.13.1:latest
  2. docker push harbor.prohub.net/library/ubuntu18.04_pytorch1.13.1:latest

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/867388
推荐阅读
相关标签
  

闽ICP备14008679号