项目开发--基于docker实现模型容器化服务
背景
1、docker-compose build 和 docker-compose up -d分别是什么作用?
2、如何进入新构建的容器当中
3、模型保存的方法区别
4、如何让docker容器启动的时候能使用cuda进行模型推理加速
5、如何实现容器的迭代
解决方案
问题1
docker-compose build 和 docker-compose up -d 是 Docker Compose 命令,用于构建和管理多容器 Docker 应用程序。它们的作用如下:
docker-compose build
作用:构建 Docker 镜像。
使用场景:当你对 Dockerfile 或 docker-compose.yml 文件进行了更改(例如更新了依赖项或修改了构建指令)时,需要重新构建镜像。
详细说明:
这个命令根据 Dockerfile 文件中的指令构建 Docker 镜像,并根据 docker-compose.yml 文件中的服务定义来执行构建过程。
构建过程中 Docker 会从 Dockerfile 中读取指令,例如安装依赖、复制文件等,并生成一个新的镜像。
这个命令不会启动容器,只是创建或更新镜像。
docker-compose up -d
作用:启动或重新启动 Docker 容器。
使用场景:当你想启动定义在 docker-compose.yml 文件中的服务(容器)时,使用这个命令。
详细说明:
-d 参数表示在后台(detached mode)启动容器,这样你不会被容器的日志信息干扰。如果不使用 -d,容器会在前台运行,日志会输出到你的终端。
如果镜像尚未构建或已更改,docker-compose up 会自动调用 docker-compose build 来构建镜像,然后启动容器。
启动时,Docker Compose 会创建或启动 docker-compose.yml 文件中定义的服务容器,并将它们连接到指定的网络和卷(volumes)。
总结
docker-compose build:用于构建 Docker 镜像,通常在修改 Dockerfile 或 requirements.txt 后使用。
docker-compose up -d:用于启动或重新启动容器,并在后台运行它们。
通常,工作流程是先使用 docker-compose build 构建镜像,然后使用 docker-compose up -d 启动容器。如果只是更新了代码或配置文件而不修改 Dockerfile,直接使用 docker-compose up -d 也可以自动构建镜像并启动容器。
问题2
要进入新构建的 Docker 容器,你可以使用以下步骤:
- 查找容器 ID 或名称
首先,你需要找到你想要进入的容器的 ID 或名称。使用以下命令列出所有运行中的容器:
docker ps
这将显示一个容器列表,包括容器的 ID、名称和其他信息。
- 使用 docker exec 进入容器
一旦你找到了容器的 ID 或名称,你可以使用 docker exec 命令进入容器的交互式 shell。例如,如果你想进入一个名为 my_container 的容器,可以运行:
docker exec -it my_container /bin/bash
或,如果容器使用 sh 而不是 bash,可以运行:
docker exec -it my_container /bin/sh
- 示例
假设你有一个容器 ID 为 abc123,可以使用:
docker exec -it abc123 /bin/bash
- 在 Dockerfile 中使用非 root 用户
如果你在 Dockerfile 中创建了一个非 root 用户,并且想以该用户身份进入容器,可以指定用户:
docker exec -it --user <username> my_container /bin/bash
注意事项
-it 参数:-i 代表交互模式(interactive),-t 代表分配一个伪终端(pseudo-TTY),这两个参数通常一起使用。
Shell 类型:不同的容器可能使用不同的 shell(例如 /bin/bash、/bin/sh),你需要根据实际情况选择合适的 shell。
问题3
使用pickle和使用torch.save保存的模型有什么区别?
pickle 和 torch.save 是两种不同的序列化方法,它们在保存模型时有一些关键的区别:
库和用途:
pickle 是 Python 标准库中的一个模块,用于序列化和反序列化 Python 对象结构,它不仅限于 PyTorch 模型,可以用于任何 Python 对象。
torch.save 是 PyTorch 库提供的一个函数,专门用于保存 PyTorch 模型和张量。它不仅保存模型的参数,还可以保存模型的结构。
兼容性:
使用 pickle 保存的模型在不同版本的 Python 或 PyTorch 之间可能会遇到兼容性问题,因为 pickle 格式可能会随着 Python 版本的更新而改变。
torch.save 通常提供了更好的向后兼容性,尤其是在 PyTorch 的不同版本之间。
效率:
torch.save 通常在保存 PyTorch 模型时更加高效,因为它是专门为 PyTorch 数据类型设计的。
pickle 可能在处理大型模型或张量时不如 torch.save 高效。
安全性:
pickle 可以序列化几乎所有的 Python 对象,包括那些可能执行任意代码的对象。因此,如果从不可信任的源加载 pickle 文件,可能会有安全风险。
torch.save 只处理 PyTorch 相关的数据,相对来说更安全。
使用场景:
如果你需要在不同的 Python 环境或项目中共享模型,或者需要序列化非 PyTorch 对象,可能会选择 pickle。
对于 PyTorch 模型,通常推荐使用 torch.save,因为它提供了更好的兼容性和效率。
模型结构保存:
使用 pickle 可能无法正确保存模型的结构,特别是如果模型定义在保存和加载时不可见(例如,模型定义在某个特定的脚本中,而该脚本在加载模型时未被执行)。
torch.save 允许你保存模型的结构,这样即使模型定义在加载时不可用,也可以正确地恢复模型。
总结来说,对于 PyTorch 模型,推荐使用 torch.save,因为它提供了更好的兼容性、效率和安全性。而 pickle 更适合通用的 Python 对象序列化,但需要注意安全性和兼容性问题。
问题4
要让 Docker 容器启动时能够使用 CUDA 进行模型推理加速,您需要确保以下几个方面:
- 安装 NVIDIA Docker 支持
NVIDIA Docker(nvidia-docker)提供了对 NVIDIA GPU 的支持,并允许 Docker 容器访问主机上的 GPU。您需要安装 NVIDIA Container Toolkit。
安装 NVIDIA Container Toolkit
添加 NVIDIA 的软件包源:
sudo mkdir -p /etc/systemd/system/docker.service.d
创建文件 /etc/systemd/system/docker.service.d/override.conf,内容如下:
[Service]
ExecStart=
ExecStart=/usr/bin/dockerd --host=fd:// --add-runtime=nvidia=/usr/bin/nvidia-container-runtime
安装 NVIDIA Container Toolkit:
sudo apt-get update
sudo apt-get install -y nvidia-docker2
sudo systemctl restart docker
验证安装:
使用以下命令验证 NVIDIA 运行时是否可用:
docker run --rm --gpus all nvidia/cuda:11.0-base nvidia-smi
这应该会显示您 GPU 的信息。
- 编写 Dockerfile 使用 CUDA
确保 Dockerfile 使用了正确的 CUDA 基础镜像,并且安装了必要的 CUDA 库和驱动。以下是一个基本示例 Dockerfile:
# 使用 NVIDIA 的 CUDA 镜像作为基础镜像
FROM nvidia/cuda:11.8.0-cudnn8-runtime-ubuntu20.04# 安装 Python 和其他依赖
RUN apt-get update && apt-get install -y \python3-pip \python3-dev \&& rm -rf /var/lib/apt/lists/*# 设置工作目录
WORKDIR /opt# 复制 requirements 文件并安装 Python 包
COPY requirements.txt ./
RUN pip3 install -r requirements.txt# 复制项目文件
COPY . .# 设置容器启动命令
CMD ["python3", "main.py"]
- 配置 Docker Compose 使用 GPU
在 docker-compose.yml 文件中,配置使用 GPU 资源。以下是一个示例:
version: "3.8"services:web:build: .ports:- "8890:8890"restart: alwaysvolumes:- ".:/opt/"working_dir: "/opt/"command: uvicorn main:app --reload --host 0.0.0.0 --port 8890runtime: nvidiadeploy:resources:reservations:devices:- driver: "nvidia"count: allcapabilities: [gpu]
- 运行 Docker 容器
使用 docker-compose 启动容器:
docker-compose up -d
- 在代码中检查 GPU 可用性
确保您的模型代码中能够识别和使用 GPU。例如,如果使用 PyTorch,可以通过以下代码检查 GPU 是否可用:
import torchdevice = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
print(f'Using device: {device}')
对于 TensorFlow,可以使用:
import tensorflow as tfprint("Num GPUs Available: ", len(tf.config.list_physical_devices('GPU')))
总结
安装 NVIDIA Container Toolkit 以支持 Docker 容器使用 GPU。
编写 Dockerfile 使用 CUDA 基础镜像,并安装必要的 CUDA 库。
配置 Docker Compose 使用 GPU 资源。
验证和运行容器 确保 GPU 可以被正确识别和使用。
通过这些步骤,您应该能够在 Docker 容器中启用 CUDA 加速进行模型推理。
问题5
在使用 docker-compose 时,容器的迭代包括了容器的启动与关闭、版本控制以及持久化存储。以下是如何实现这些迭代的步骤:
docker-compose down
docker-compose build
docker-compose up -d
容器的启动与关闭
启动容器:
docker-compose up -d
这个命令会启动 docker-compose.yml 文件中定义的服务,-d 参数表示在后台运行。
停止容器:
docker-compose down
这个命令会停止所有由 docker-compose.yml 定义的服务,并可以选择性地移除网络和数据卷。
重启容器:
docker-compose restart
这个命令会重启所有服务。
关闭并移除容器:
docker-compose down --volumes
这个命令会停止容器并移除容器,–volumes 参数表示同时移除数据卷。
版本号
在 docker-compose 中,版本号通常与使用的 Docker 镜像版本相关。你可以在 docker-compose.yml 文件中指定使用特定版本的镜像:
services:your-service:image: your-image:1.0.0
当你需要更新服务到新版本时,只需更改版本号并重新部署:
docker-compose up -d
持久化存储
在 docker-compose.yml 中,你可以定义数据卷来实现持久化存储:
volumes:your-volume:services:your-service:volumes:- your-volume:/path/in/container
创建数据卷:
docker-compose up -d 时,如果数据卷不存在,docker-compose 会自动创建。
访问数据卷:
在服务中,你可以通过挂载的数据卷路径来访问持久化的数据。
备份数据卷:
你可以使用 docker-compose down -v 来备份数据卷,这会停止服务并删除容器,但保留数据卷。
迁移数据卷:
如果需要迁移数据卷,可以使用 docker-compose 的卷驱动或手动复制数据。
版本控制:
对于 docker-compose.yml 文件本身,你可以使用版本控制系统(如 Git)来管理其变更历史。每次更新配置或服务后,提交更改到版本控制系统。
相关文章:
项目开发--基于docker实现模型容器化服务
背景 1、docker-compose build 和 docker-compose up -d分别是什么作用? 2、如何进入新构建的容器当中 3、模型保存的方法区别 4、如何让docker容器启动的时候能使用cuda进行模型推理加速 5、如何实现容器的迭代 解决方案 问题1 docker-compose build 和 docker…...

C语言 | Leetcode C语言题解之第477题汉明距离总和
题目: 题解: int totalHammingDistance(int* nums, int numsSize) {int ans 0;for (int i 0; i < 30; i) {int c 0;for (int j 0; j < numsSize; j) {c (nums[j] >> i) & 1;}ans c * (numsSize - c);}return ans; }...
Bug剖析
Bug剖析 • 所有的Bug报告有以下的基本要求: • 标题。要简略。 • 指派。谁来处理这个问题。 • 重现步骤。问题再次出现的相关步骤。 • 优先级别。问题的紧迫性与重要性。 • 严重程度。问题所产生的后果。 • 解决方案。怎么解决问题。 其他很多方面对修复问题…...

HI3516DV500 相机部分架构初探
Hi3516DV500 是一颗面向视觉行业推出的高清智能 Soc。该芯片最高支持 2 路 sensor 输入,支持最高 5M30fps 的 ISP 图像处理能力,支持 2F WDR、多级降噪、六轴防 抖、多光谱融合等多种传统图像增强和处理算法,支持通过 AI 算法对输入图像进行实…...
训练yolo系列出现问题mAP, R, P等为零
1. 问题 40系列显卡训练yolo系列出现问题,loss正常,但mAP,R,P等为零。 环境:ultralytics版本为8.3.9,cuda11.8, torch2.4。 40系列显卡网上说可以使用cuda低于11.7的,自己测试了下…...

数字媒体技术基础:色度子采样(4:4:4、4:2:2 、4:2:0)
在数字视频处理中,色度子采样 Chroma Subsampling可以用于压缩视频文件的大小,同时在大多数情况下保持较高的视觉质量,它的原理基于人类视觉系统对亮度 Luminance比对色度 Chrominance更加敏感这一特点。 一、 采样格式的表示方法 色度子采样…...

tkinter库的应用小示例:文本编辑器
tkinter库的应用小示例:文本编辑器 要 求: 创建一个文本编辑器,功能包括,创建、打开、编辑、保存文件。一个Button小组件,命名为btn_open,用于打开要编辑的文件,一个Button小组件,命名为btn_s…...
信息抽取数据集处理——RAMS
引言 RAMS数据集(RAMS:Richly Annotated Multilingual Schema-guided Event Structure)由约翰斯霍普金斯大学于2020年发布,是一个以新闻为基础的事件抽取数据集。它标注了9,124个事件,涵盖了139种不同的事件类型和65种…...

SpringBoot+XXL-JOB:高效定时任务管理
前言 在现代应用程序中,定时任务是不可或缺的一部分。Spring Boot 和 XXL-Job 为你提供了一个强大的工具组合,以简化任务调度和管理。 本文将带领你探索如何将这两者集成在一起,实现高效的定时任务管理。无论你是初学者还是有经验的开发者&…...
openpyxl -- 简介
文章目录 介绍核心类 介绍 开源的python读写Excel的工具库,由志愿者在业余时间维护;安装,pip install openpyxl;官方文档地址源码地址issues列表默认openpyxl不能保证抵御大量的xml攻击,为抵御这些攻击需安装defusedxmlÿ…...
滚雪球学MySQL[8.3讲]:数据库中的JSON与全文检索详解:从数据存储到全文索引的高效使用
全文目录: 前言8.3 JSON与全文检索1. JSON数据类型的使用1.1 JSON 数据类型概述1.2 JSON 数据的插入与查询1.3 JSON 常用函数与操作1.4 JSON使用的优缺点与性能考虑 2. 全文索引与全文检索2.1 全文索引概述2.2 全文检索的使用2.3 全文检索模式2.4 全文索引优化与性能…...

position定位静态定位/绝对定位/相对定位
1.静态定位static:按照标准流进行布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>D…...
2024年09月CCF-GESP编程能力等级认证C++编程三级真题解析
本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第 1 题 下列代码中,输出结果是( ) #include<iostream> using namespace std; i...

Web自动化Demo-PHP+Selenium
1.新建工程 打开PhpStorm新建工程如下: 打开终端输入如下命令安装selenium: composer require php-webdriver/webdriver 2.编写代码 <?php require vendor/autoload.php;use Facebook\WebDriver\Remote\RemoteWebDriver; use Facebook\WebDriver…...
Python速成笔记——知识(GUI自动化处理屏幕和按键输出)
处理屏幕 获取屏幕快照 函数:pyautogui.screenshot(); 【注】该函数返回包含一个屏幕快照的Image对象; 分析屏幕快照 函数:pyautogui.pixel(); 【注】 传递一个坐标的元组,函数返回坐标对应像素点的RGB值(RGB元组) 函数:pyautogui.pixelMatchesColor() 【注】 函数第一…...

计算机是如何输入存储输出汉字、图片、音频、视频的
计算机是如何输入存储输出汉字、图片、音频、视频的 为了便于理解,先了解一下计算机的组成。 冯诺依曼计算机的五大组成部分。分别是运算器、控制器、存储器、输入设备和输出设备。参见下图: 一、运算器 运算器又称“算术逻辑单元”,是计算…...

springboot系列--web相关知识探索五
一、前言 web相关知识探索四中研究了请求中所带的参数是如何映射到接口参数中的,也即请求参数如何与接口参数绑定。主要有四种、分别是注解方式、Servlet API方式、复杂参数、以及自定义对象参数。web相关知识探索四中主要研究了复杂参数底层绑定原理。本次主要是研…...

开源商城系统crmeb phpstudy安装配置
BOSS让我最快时间部署一套开源商场系统,今天就以crmeb为例。 快速部署在linux中我会首选docker,因为我要在windows中部署,本文就选用phpstudy集成环境做了。 什么是crmeb 我从官网摘点: CRMEB产品与服务 CRMEB通过将CRM&#x…...

【论文阅读笔记】Bigtable: A Distributed Storage System for Structured Data
文章目录 1 简介2 数据模型2.1 行2.2 列族2.3 时间戳 3 API4 基础构建4.1 GFS4.2 SSTable4.3 Chubby 5 实现5.1 Tablet 位置5.2 Tablet 分配5.3 为 tablet 提供服务5.4 压缩5.4.1 小压缩5.4.2 主压缩 6 优化6.1 局部性组6.2 压缩6.3 缓存6.4 布隆过滤器6.5 Commit日志实现6.6 T…...

linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(十一)--rpm管理和计划任务
linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(十一)–rpm管理和计划任务 一、rpm管理(重点) 1、rpm管理 作用: rpm的作用类似于windows上的电脑管家中“软件管理”、安全卫士里面“…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

html-<abbr> 缩写或首字母缩略词
定义与作用 <abbr> 标签用于表示缩写或首字母缩略词,它可以帮助用户更好地理解缩写的含义,尤其是对于那些不熟悉该缩写的用户。 title 属性的内容提供了缩写的详细说明。当用户将鼠标悬停在缩写上时,会显示一个提示框。 示例&#x…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...