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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络校时服务器:铁路对时有妙招

在信息高速发展的今天&#xff0c;铁路作为国家的经济大动脉&#xff0c;与广大市民生活息息相关&#xff0c;担负着运送大流量乘客、保证交通畅通的重任&#xff0c;为了保证列车的正点运行和乘客的行程&#xff0c;对时间精准度的要求是非常严格的。随着我国铁路的发展速度和…

【CRASH】freelist异常导致的异常地址访问

freelist异常导致的异常地址访问 问题现象初步分析继续深入新的发现沙盘推演寻找元凶分析代码后记 问题现象 项目一台设备几天内出现了两次crash&#xff0c;都是异常地址访问导致。 [66005.261660] BUG: unable to handle page fault for address: ffffff8881575110初步分析…

AOSP平台开发的利器——Android Studio for Platform

Android Studio for Platform (ASfP) 是一个为使用 Soong 构建系统构建的 Android 开源项目&#xff08;AOSP&#xff09;平台开发者而设计的 Android Studio IDE 版本。与标准 Android Studio 不同&#xff0c;ASfP 具有多语言支持&#xff0c;可以在同一 IDE 中编写 C、Kotli…

分页插件bs_pagination与Bootstrap4、jQuery3.7.1不兼容的问题

问题场景&#xff1a; 开发环境&#xff1a; 项目&#xff1a;CRM IDE&#xff1a;intelij IDEA JDK: jdk21.0.2 JQuery&#xff1a;3.7.1 Bootstrap&#xff1a;4.6 项目中需要查询数据库中的数据&#xff0c;并且以分页显示的方式显示在页面上&#xff0c;前端页面用到了分页…

新书速览|Ubuntu Linux运维从零开始学

《Ubuntu Linux运维从零开始学》 本书内容 Ubuntu Linux是目前最流行的Linux操作系统之一。Ubuntu的目标在于为一般用户提供一个最新的、相当稳定的、主要由自由软件构建而成的操作系统。Ubuntu具有庞大的社区力量&#xff0c;用户可以方便地从社区获得帮助。《Ubuntu Linux运…

高效、智能、安全:小型机房EasyCVR+AI视频综合监控解决方案

一、背景需求分析 随着信息技术的迅猛发展&#xff0c;小型机房在企事业单位中扮演着越来越重要的角色。为了确保机房的安全稳定运行&#xff0c;远程监控成为了必不可少的手段。 二、视频监控 视频监控是机房远程监控的重要组成部分。通过安装IP摄像机及部署视频监控系统Ea…

11.【机器学习】十大算法之一随机森林算法原理讲解

【机器学习】十大算法之一随机森林算法原理讲解 一摘要二个人简介三什么是随机森林&#xff1f;3.1 决策树3.2 集成方法3.2.1 Bagging方法3.2.2 Boosting方法 3.3 随机森林算法3.4 随机的含义 四案例演示一4.1 利用随机森林进行特征选择&#xff0c;然后使用SVR进行训练4.2 利用…

qt事件和连接TCP协议

QT网络聊天室服务器实现 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),server(new QTcpServer(this))//给服务器指针实例化一个空间 {ui->setupUi(this); }Widget::~Widget() {d…

『Z-Weekly Feed 08』加密资产观 | FHE应用前景 | OPAL协议

一位机构投资者的加密资产观 作者&#xff1a;Hongbo 01 &#x1f4a1;TL;DR 在加密投资领域如何找到真正的“价值”&#xff1a;Crypto 作为一种新兴资产&#xff0c;应该找到一种区别于传统公司股票资产的估值方法&#xff0c;本文重点阐述了加密货币作为新的资产类型与传统资…

Artalk-CORS,跨域拦截问题

今天重新部署Artalk之后&#xff0c;遇到了CORS——跨域拦截的问题&#xff0c;卡了好一会记录一下。 起因 重新部署之后&#xff0c;浏览器一直提示CORS&#xff0c;之前在其他项目也遇到过类似的问题&#xff0c;原因就在于跨域问题。

Docker私有化仓库Harbor安装流程

1.搭建Docker私有仓库主要有以下几种方式 使用Docker官方提供的Registry镜像&#xff1a;Docker官方提供了一个用于构建私有镜像仓库的Registry镜像&#xff0c;只需将镜像下载并运行容器&#xff0c;然后暴露5000端口即可使用。可以通过修改Docker的配置文件daemon.json&#…

C# WPF入门学习主线篇(二十二)—— 样式(Styles)的定义和应用

C# WPF入门学习主线篇&#xff08;二十二&#xff09;—— 样式&#xff08;Styles&#xff09;的定义和应用 欢迎来到C# WPF入门学习系列的第二十二篇。本篇文章将详细介绍WPF中的样式&#xff08;Styles&#xff09;的定义和应用。样式在WPF中起到重要作用&#xff0c;通过样…

西木科技Westwood-Robotics人型机器人Bruce配置和真机配置

西木科技Westwood-Robotics人型机器人Bruce配置和真机配置 本文内容机器人介绍Bruce机器人Gazebo中仿真代码部署Bruce真机代码部署 本文内容 人形机器人Brcue相关介绍docker中安装Gazebo并使用Bruce机器人控制器更换环境配置 机器人介绍 公司&#xff1a;西木科技Westwood-R…

milvus元数据解析工具milvusmetagui介绍使用

简介 milvusmetagui是一款用来对milvus的元数据进行解析的工具&#xff0c;milvus的元数据存储在etcd上&#xff0c;而且经过了序列化&#xff0c;通过etcd-manager这样的工具来查看是一堆二进制乱码&#xff0c;因此开发了这个工具对value进行反序列化解析。 在这里为了方便交…

高速公路收费图片分析系统深入理解

当今社会&#xff0c;随着交通运输业的快速发展&#xff0c;高速公路已成为人们出行的重要选择。而高速公路收费系统作为保障道路可持续运营的重要组成部分&#xff0c;其效率和准确性对于保障道路畅通和交通安全至关重要。近年来&#xff0c;随着技术的不断进步&#xff0c;高…

DSP28335:定时器

1.定时器介绍 1.1 定时器工作原理 TMS320F28335的CPU Time有三个&#xff0c;分别为Timer0&#xff0c;Timer1&#xff0c;Timer2&#xff0c;其中Timer2是为操作系统DSP/BIOS保留的&#xff0c;当未移植操作系统时&#xff0c;可用来做普通的定时器。这三个定时器的中断信号分…

读AI新生:破解人机共存密码笔记06人工智能生态系统

1. 深蓝 1.1. “深蓝”的胜利虽然令人印象深刻&#xff0c;但它只是延续了几十年来显而易见的趋势 1.2. 国际象棋算法的基本设计是由克劳德香农在1950年提出的 1.2.1. 这一基本设计在20世纪60年代初实现了重大改进 1.2.2. 最优秀的国际象棋程序的等级评分稳步提高&#xff…

【漏洞复现】致远OA webmail.do 任意文件下载 (CNVD-2020-62422)

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

YOLOv10改进 | 注意力篇 | YOLOv10引入EMAttention(EMA)注意力

1. EMA介绍 1.1 摘要:在各种计算机视觉任务中说明了通道或空间注意机制在产生更可辨别的特征表示方面的显着有效性。 然而,通过通道降维来建模跨通道关系可能会给提取深度视觉表示带来副作用。 本文提出了一种新型高效的多尺度注意力(EMA)模块。 着眼于保留每个通道的信息…

【idea-jdk1.8】使用Spring Initializr 创建 Spring Boot项目没有JDK8

信息差真可怕&#xff01; 很久没创建springboot项目&#xff0c;今天使用idea的Spring Initializr 创建 Spring Boot项目时&#xff0c;发现java版本里&#xff0c;无法选择jdk1.8&#xff0c;只有17、21、22&#xff1b;前段时间也听说过&#xff0c;springboot将放弃java8&a…