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

本文主要是介绍Dockerfile封装制作pytorch(tensorflow)深度学习框架 + jupyterlab服务 + ssh服务镜像,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

## 更新包列表并安装基本工具
apt-get update && apt-get install -y \sudo \wget \curl \vim \python3 \python3-pip \openssh-server \openssh-client && \rm -rf /var/lib/apt/lists/*

(2)要求python命令指向python3:

# 设置 python 命令指向 python3
ln -s /usr/bin/python3 /usr/bin/python

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

mkdir -p /root/.pip \&& echo "[global]" > /root/.pip/pip.conf \&& echo "index-url = https://mirrors.aliyun.com/pypi/simple/" >> /root/.pip/pip.conf \&& echo "trusted-host = mirrors.aliyun.com" >> /root/.pip/pip.con

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

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

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

ENV PYTORCH_NVML_BASED_CUDA_CHECK=1

完整的dockerfile文件内容:

vim torch1.13.1_dockerfile
# 定义基础镜像
FROM pytorch/pytorch:1.13.1-cuda11.6-cudnn8-devel# 设置非互动模式以避免一些安装过程中的对话框
ENV DEBIAN_FRONTEND=noninteractive# 删除无效的 Nvidia 存储库(如果它存在的话)
#RUN rm /etc/apt/sources.list.d/cuda.list || true
#RUN rm /etc/apt/sources.list.d/nvidia-ml.list || true# 更新包列表并安装基本工具
RUN apt-get update && apt-get install -y \sudo \wget \curl \vim \python3 \python3-pip \openssh-server \openssh-client && \rm -rf /var/lib/apt/lists/*# 添加NVIDIA存储库和公钥
#RUN distribution=$(. /etc/os-release;echo $ID$VERSION_ID) && \
#    curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | apt-key add - && \
#    curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | tee /etc/apt/sources.list.d/nvidia-docker.list && \
#    apt-get update && apt-get install -y nvidia-container-toolkit && \
#    rm -rf /var/lib/apt/lists/*# 设置 python 命令指向 python3
RUN ln -s /usr/bin/python3 /usr/bin/python# 修改 pip 源为阿里云镜像源
RUN mkdir -p /root/.pip \&& echo "[global]" > /root/.pip/pip.conf \&& echo "index-url = https://mirrors.aliyun.com/pypi/simple/" >> /root/.pip/pip.conf \&& echo "trusted-host = mirrors.aliyun.com" >> /root/.pip/pip.conf# 设置 CUDA 环境变量
#ENV CUDA_VERSION=11.6
#ENV CUDA_HOME=/usr/local/cuda-$CUDA_VERSION
#ENV PATH=$CUDA_HOME/bin:$PATH
#ENV LD_LIBRARY_PATH=$CUDA_HOME/lib64:$LD_LIBRARY_PATH# 设置 PyTorch NVML 基于 CUDA 检查环境变量
ENV PYTORCH_NVML_BASED_CUDA_CHECK=1# 声明暴露 SSH 和 Jupyter Lab 端口
EXPOSE 22
EXPOSE 8888# 将启动脚本配置在容器中
COPY setup.sh /setup.sh
RUN chmod +x /setup.sh# 使用启动脚本作为容器初始化入口
ENTRYPOINT ["/setup.sh"]

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

vim setup.sh
#!/bin/bash# 设置清华源,如果尚未设置阿里源
if ! pip config get global.index-url | grep -q "https://pypi.tuna.tsinghua.edu.cn/simple"; thenecho "设置 pip 使用清华源..."pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
fi# 检查 JupyterLab 是否已安装
if ! pip show jupyterlab > /dev/null 2>&1; thenecho "安装 JupyterLab..."pip install jupyterlab
elseecho "JupyterLab 已安装,跳过安装步骤。"
fi# 为 SSHD 创建必要的目录
echo "创建 SSHD 必要的目录..."
mkdir -p /var/run/sshd
mkdir -p /root/.ssh# 为 Jupyter Lab 创建工作目录
if [ ! -d /root/workspace ]; thenecho "创建 Jupyter Lab 工作目录..."mkdir -p /root/workspacechown -R root:root /root/workspace
fi# 如果 authorized_keys 文件不存在,则创建它
if [ ! -f /root/.ssh/authorized_keys ]; thenecho "创建 authorized_keys 文件..."touch /root/.ssh/authorized_keyschmod 600 /root/.ssh/authorized_keyschown -R root:root /root/.ssh
fi# 配置 sshd 服务,如果尚未配置
if [ ! -f /etc/ssh/sshd_config ]; thenecho "配置 SSHD 服务..."cat <<EOF > /etc/ssh/sshd_config
Port 22
PermitRootLogin yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
PasswordAuthentication yes
ChallengeResponseAuthentication no
UsePAM yes
X11Forwarding yes
PrintMotd no
AcceptEnv LANG LC_*
Subsystem sftp /usr/lib/openssh/sftp-server
EOF# 生成 sshd 主机密钥echo "生成 SSHD 主机密钥..."ssh-keygen -A
elseecho "SSHD 服务已经配置,跳过配置步骤。"
fi# 检查 SSHD 服务是否正在运行,如果不是则启动
if ! pgrep -x "sshd" > /dev/null; thenecho "启动 SSHD 服务..."/usr/sbin/sshd
elseecho "SSHD 服务已经运行,跳过启动步骤。"
fi# 检查 JupyterLab 服务是否已经启动
if ! pgrep -f "jupyter-lab" > /dev/null; thenecho "启动 JupyterLab..."nohup jupyter lab --ip=0.0.0.0 --allow-root --no-browser --notebook-dir=/root/workspace >/dev/null 2>&1 &
elseecho "JupyterLab 已在运行,跳过启动步骤。"
fi# 添加一个阻塞进程,保持容器运行
echo "容器已启动并运行,阻止脚本退出以保持容器运行..."
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:

测试脚本内容:

import torchdef test_torch_cuda():print("Checking PyTorch and CUDA installation...")# 检查 PyTorch 版本print(f"PyTorch version: {torch.__version__}")# 检查是否可以调用 CUDAif torch.cuda.is_available():print("CUDA is available.")else:print("CUDA is not available.")return# 检查 CUDA 版本cuda_version = torch.version.cudaprint(f"CUDA version: {cuda_version}")# 检查 GPU 的数量gpu_count = torch.cuda.device_count()print(f"Number of GPUs: {gpu_count}")for i in range(gpu_count):print(f"GPU {i}: {torch.cuda.get_device_name(i)}")# 获取 GPU 的计算能力capability = torch.cuda.get_device_capability(i)print(f"  Compute capability: {capability[0]}.{capability[1]}")# 获取 GPU 显存信息mem_info = torch.cuda.get_device_properties(i).total_memory / (1024 ** 3)  # 单位GBprint(f"  Total memory: {mem_info:.2f} GB")if __name__ == "__main__":test_torch_cuda()

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

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

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

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

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

这篇关于Dockerfile封装制作pytorch(tensorflow)深度学习框架 + jupyterlab服务 + ssh服务镜像的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1077688

相关文章

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

TP-Link PDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务

《TP-LinkPDDNS服将于务6月30日正式停运:用户需转向第三方DDNS服务》近期,路由器制造巨头普联(TP-Link)在用户群体中引发了一系列重要变动,上个月,公司发出了一则通知,明确要求所... 路由器厂商普联(TP-Link)上个月发布公告要求所有用户必须完成实名认证后才能继续使用普联提供的 D

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

docker如何删除悬空镜像

《docker如何删除悬空镜像》文章介绍了如何使用Docker命令删除悬空镜像,以提高服务器空间利用率,通过使用dockerimage命令结合filter和awk工具,可以过滤出没有Tag的镜像,并将... 目录docChina编程ker删除悬空镜像前言悬空镜像docker官方提供的方式自定义方式总结docker

修改若依框架Token的过期时间问题

《修改若依框架Token的过期时间问题》本文介绍了如何修改若依框架中Token的过期时间,通过修改`application.yml`文件中的配置来实现,默认单位为分钟,希望此经验对大家有所帮助,也欢迎... 目录修改若依框架Token的过期时间修改Token的过期时间关闭Token的过期时js间总结修改若依

C++实现封装的顺序表的操作与实践

《C++实现封装的顺序表的操作与实践》在程序设计中,顺序表是一种常见的线性数据结构,通常用于存储具有固定顺序的元素,与链表不同,顺序表中的元素是连续存储的,因此访问速度较快,但插入和删除操作的效率可能... 目录一、顺序表的基本概念二、顺序表类的设计1. 顺序表类的成员变量2. 构造函数和析构函数三、顺序表

Go语言利用泛型封装常见的Map操作

《Go语言利用泛型封装常见的Map操作》Go语言在1.18版本中引入了泛型,这是Go语言发展的一个重要里程碑,它极大地增强了语言的表达能力和灵活性,本文将通过泛型实现封装常见的Map操作,感... 目录什么是泛型泛型解决了什么问题Go泛型基于泛型的常见Map操作代码合集总结什么是泛型泛型是一种编程范式,允