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"; then
    echo "设置 pip 使用清华源..."
    pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
fi

# 检查 JupyterLab 是否已安装
if ! pip show jupyterlab > /dev/null 2>&1; then
    echo "安装 JupyterLab..."
    pip install jupyterlab
else
    echo "JupyterLab 已安装,跳过安装步骤。"
fi

# 为 SSHD 创建必要的目录
echo "创建 SSHD 必要的目录..."
mkdir -p /var/run/sshd
mkdir -p /root/.ssh

# 为 Jupyter Lab 创建工作目录
if [ ! -d /root/workspace ]; then
    echo "创建 Jupyter Lab 工作目录..."
    mkdir -p /root/workspace
    chown -R root:root /root/workspace
fi

# 如果 authorized_keys 文件不存在,则创建它
if [ ! -f /root/.ssh/authorized_keys ]; then
    echo "创建 authorized_keys 文件..."
    touch /root/.ssh/authorized_keys
    chmod 600 /root/.ssh/authorized_keys
    chown -R root:root /root/.ssh
fi

# 配置 sshd 服务,如果尚未配置
if [ ! -f /etc/ssh/sshd_config ]; then
    echo "配置 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
else
    echo "SSHD 服务已经配置,跳过配置步骤。"
fi

# 检查 SSHD 服务是否正在运行,如果不是则启动
if ! pgrep -x "sshd" > /dev/null; then
    echo "启动 SSHD 服务..."
    /usr/sbin/sshd
else
    echo "SSHD 服务已经运行,跳过启动步骤。"
fi

# 检查 JupyterLab 服务是否已经启动
if ! pgrep -f "jupyter-lab" > /dev/null; then
    echo "启动 JupyterLab..."
    nohup jupyter lab --ip=0.0.0.0 --allow-root --no-browser --notebook-dir=/root/workspace >/dev/null 2>&1 &
else
    echo "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 torch

def test_torch_cuda():
    print("Checking PyTorch and CUDA installation...")

    # 检查 PyTorch 版本
    print(f"PyTorch version: {torch.__version__}")

    # 检查是否可以调用 CUDA
    if torch.cuda.is_available():
        print("CUDA is available.")
    else:
        print("CUDA is not available.")
        return

    # 检查 CUDA 版本
    cuda_version = torch.version.cuda
    print(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)  # 单位GB
        print(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:latest


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/725637.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

气体泄露隐患多,佛山工业可燃气体报警器年检校准来帮忙

在佛山这座工业发达的城市&#xff0c;可燃气体报警器的应用日益广泛&#xff0c;涉及化工、冶金、石油等多个领域。 然而&#xff0c;长时间的使用和恶劣的工业环境可能导致报警器的性能下降&#xff0c;甚至出现误报或漏报的情况。 因此&#xff0c;定期对可燃气体报警器进…

OPenCV实现把人形轮廓画在实时视频画面中

操作系统&#xff1a;ubuntu22.04OpenCV版本&#xff1a;OpenCV4.9IDE:Visual Studio Code编程语言&#xff1a;C11 1.功能描述 当你从摄像头读取实时视频时&#xff0c;如果想在视频的画面中画一个方框&#xff0c;或者是画一个圆&#xff0c;是很简单的事情&#xff0c;可是…

VMR,支持30+种编程语言的SDK版本管理器,支持Windows/MacOS/Linux。

官方文档地址&#xff1a;documents 官方项目地址&#xff1a;github 欢迎安装使用&#xff0c;分享转发&#xff0c;前往github star。 跨平台&#xff0c;支持Windows&#xff0c;Linux&#xff0c;MacOS支持多种语言和工具&#xff0c;省心受到lazygit的启发&#xff0c;拥…

LLM漫谈(七)| 使用PyTorch从零构建LLM

LLM是最流行AI聊天机器人的核心基础&#xff0c;比如ChatGPT、Gemini、MetaAI、Mistral AI等。在每一个LLM&#xff0c;有个核心架构&#xff1a;Transformer。我们将首先根据著名的论文“Attention is all you need”-https://arxiv.org/abs/1706.03762 来构建Transformer架构…

漏洞挖掘 | 记一次src挖掘-小程序敏感信息泄露

权当是一次漏洞挖掘的思路分享 闲言 就现在的一个web漏洞挖掘强度还是非常高的&#xff0c;所以我们不妨把我们的眼光投向一个之前可能未曾涉及到的区域———小程序 是的微信小程序&#xff0c;这玩意的防范能力和过滤能力其实对比web方向是要弱小很多的 进入正题 以下就是…

详细分析Element Plus的el-pagination基本知识(附Demo)

目录 前言1. 基本知识2. Demo3. 实战 前言 需求&#xff1a;从无到有做一个分页并且附带分页的导入导出增删改查等功能 前提一定是要先有分页&#xff0c;作为全栈玩家&#xff0c;先在前端部署一个分页的列表 相关后续的功能&#xff0c;是Java&#xff0c;推荐阅读&#x…

配置环境常规操作

一、看看显卡情况 1、看显卡驱动&#xff1a; nvidia-smi 2、验证cuda是否安装成功 nvcc -V 二、conda创建环境 conda create --name PatchCore_anomaly_detection python3.9 conda activate PatchCore_anomaly_detection 三、配置虚拟环境 cd C:\BaiduNetdiskDownload…

不同表格式下的小文件治理方式(开源RC file/ORC/Text非事务表、事务表、Holodesk表格式..)

友情链接&#xff1a; 小文件治理系列之为什么会出现小文件问题&#xff0c;小文件过多问题的危害以及不同阶段下的小文件治理最佳解决手段 小文件过多的解决方法&#xff08;不同阶段下的治理手段&#xff0c;SQL端、存储端以及计算端&#xff09; 概览 在前两篇博文中&am…

OceanBase v4.2 特性解析:支持并发建表,提升OMS导入效率

背景 OceanBase 4.0版本新增了单日志流架构&#xff0c;使得OBServer单机突破了原有的分区数限制&#xff0c;支持更大数量的分区。 很多业务环境为了处理单机数据量过大的问题&#xff0c;通常采取分库分表的方法&#xff0c;这一方法会导致业务需要创建数十万乃至百万级别的…

Java安全

Java安全 Java2Sec靶场搭建 靶场地址 https://github.com/bewhale/JavaSec 查看数据库配置文件&#xff0c;mysql&#xff0c;用户名密码根据自己数据库密码更改 使用小皮面板的mysql&#xff0c;新建一个数据名为javasec的数据库 运行javasec.sql文件 下载运行jar包即可 …

【五子棋】C语言教程

Hi~&#xff01;这里是奋斗的小羊&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f4a5;&#x1f4a5;个人主页&#xff1a;奋斗的小羊 &#x1f4a5;&#x1f4a5;所属专栏&#xff1a;C语言 &#x1f680;本系列文章为个人学习…

【病毒分析】Steloj勒索病毒分析

1.背景 1.1 来源 近期&#xff0c;Solar团队收到某汽车制造公司的援助请求&#xff0c;该公司的计算机服务器受到了Steloj勒索家族的侵害&#xff0c;所有的文件被加密并且添加了.steloj后缀&#xff0c;该勒索软件的初始入侵方式是MSSQL数据库弱口令进行入侵&#xff0c;后续…

NET Core C# 中的Action委托:语法、用法和示例_2024-06-19

Action委托是一个内置的泛型委托类型。此委托使您的程序更具可读性和效率&#xff0c;因为您无需定义自定义委托&#xff0c;如以下示例所示。 它在 System 命名空间下定义。它没有输出参数&#xff0c;输入参数最少为 1 个&#xff0c;最多为 16 个。 Action委托通常用于具有…

JavaScript基础部分知识点总结(Part3)

函数的概念 1. 函数的概念 在JS 里面&#xff0c;可能会定义非常多的相同代码或者功能相似的代码&#xff0c;这些代码可能需要大量重复使用。虽然for循环语句也能实现一些简单的重复操作&#xff0c;但是比较具有局限性&#xff0c;此时我们就可以使用JS 中的函数。函数&…

Springboot整合Zookeeper分布式组件实例

一、Zookeeper概述 1.1 Zookeeper的定义 Zookeeper是一个开源的分布式协调服务&#xff0c;主要用于分布式应用程序中的协调管理。它由Apache软件基金会维护&#xff0c;是Hadoop生态系统中的重要成员。Zookeeper提供了一个高效且可靠的分布式锁服务&#xff0c;以及群集管理…

反激开关电源变压器设计1

特别注意&#xff1a;变压器计算出来的结果没有绝对的对与错 只要再全域范围内工作变压器不饱和就不能说变压器计算不对&#xff0c;&#xff08;输入全范围&#xff0c;输出全范围&#xff0c;温度度全范围&#xff09; 在变压器不饱和的情况下&#xff0c;只有优劣之分&…

自然语言处理概述

目录 1.概述 2.背景 3.作用 4.优缺点 4.1.优点 4.2.缺点 5.应用场景 5.1.十个应用场景 5.2.文本分类 5.2.1.一般流程 5.2.2.示例 6.使用示例 7.总结 1.概述 自然语言处理&#xff08;NLP&#xff09;是计算机科学、人工智能和语言学的交叉领域&#xff0c;旨在实…

【STM32-启动文件】

STM32-启动文件 ■ STM32-启动文件■ STM32-启动文件主要做了以下工作&#xff1a;■ STM32-启动文件指令■ STM32-启动文件代码详解■ 栈空间的开辟■■■ ■■■■■ ■ STM32-启动文件 STM32 启动文件由 ST 官方提供 启动文件由汇编编写&#xff0c;是系统上电复位后第一个…

Java 读取Excel导入数据库,形成树状结构

最近开发过程中遇到一个Excel的导入的功能&#xff0c;因为导入的数据结构具有层次结构&#xff0c;经过一番研究&#xff0c;最终得以实现&#xff0c;所有写下该文章&#xff0c;记录过程&#xff0c;供以后参考。 下图是导入Excel的数据结构&#xff1a; 使用POI解析Excel&…

理解 ICMP 报文:网络故障排查的重要工具

文章目录 什么是 ICMP&#xff1f;ICMP 报文类型ICMP “Destination Unreachable” 报文实例解析&#xff1a;端口不可达ICMP 报文的生成和处理解决方案结语 在网络通信中&#xff0c;ICMP&#xff08;Internet Control Message Protocol&#xff0c;互联网控制消息协议&#x…