项目开发--基于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上的电脑管家中“软件管理”、安全卫士里面“…...

【C++几种单例模式解读及实现方式】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、单例是什么?二、解读1.懒汉式2.饿汉式3.static变量特性4.call_once特性 总结 前言 单例模式几乎是每种语言都不可少的一种设计模式,…...

QT开发--串口通信
第十六章 串口通信 16.1 串口通信基础 串口通信主要通过DB9接口,适用于短距离(<10米)。关键参数包括: 波特率:每秒传输bit数,如9600。数据位:信息包中的有效数据位数。停止位:…...

数据库(至少还的再花两天 )
1 连接查询 左连接 右连接 2 聚合函数 SQL 统计求和 求最值 count sum avg max min 3 SQL关键字 limit 分页 group by 分组 distinct 去重 4 Select执行顺序 from where group by order by 5 数据库三范式 原子性 唯一性 直接性 6 存储引擎 MyISAM InnoDB 7 …...

网络安全公司及其主要产品介绍
以下是一些全球领先的网络安全公司及其主要产品介绍: 一、思科(Cisco) 思科是全球最大的网络设备供应商之一,其网络安全产品以企业级解决方案为主,覆盖多种安全需求。 Cisco ASA(Adaptive Security Appli…...

orjson:高性能的Python JSON库
在Python中处理JSON数据是一项常见任务,标准库的json模块虽然功能齐全,但在性能方面还有提升空间。今天我要向大家介绍一个出色的第三方JSON库 - orjson。 orjson简介 orjson是一个快速、正确的Python JSON库。它具有以下主要特点: 性能卓越 - 在序列化和反序列化方面都比标准…...

常见几大排序算法
排序算法是计算机科学中的基本算法,它们将一个无序的数组或列表按特定顺序进行排列(如升序或降序)。常见的排序算法可以根据其时间复杂度、空间复杂度和适用场景分类。以下是几种常见的排序算法: 1. 冒泡排序(Bubble …...

Linux下CMake入门
CMake的基础知识 什么是 CMake CMake 是一个跨平台的构建工具,主要用于管理构建过程。CMake 不直接构建项目,而是生成特定平台上的构建系统(如 Unix 下的 Makefile,Windows 下的 Visual Studio 工程),然后…...

网络资源模板--Android Studio 实现简易记事本App
目录 一、项目演示 二、项目测试环境 三、项目详情 四、完整的项目源码 一、项目演示 网络资源模板--基于Android studio 实现的简易记事本App 二、项目测试环境 三、项目详情 首页 创建一个空的笔记本列表 mNotebookList。使用该列表和指定的布局资源 item_notebook 创建…...

根据Vue对比来深入学习React 下 props 组件传值 插槽 样式操作 hooks 高阶组件 性能优化
文章目录 函数组件的特点props组件间的传值父传子看上例子传父兄弟组件传值祖先组件传值 插槽基础插槽具名插槽作用域插槽 样式操作**CSS Modules** 生命周期useRef常用hookuseStateuseEffectuseContextuseReduceruseMemouseCallback 高阶组件什么时候使用 react性能问题和优化…...

HTML(六)超链接
HTML讲解(一)body部分_html body-CSDN博客 <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>title</title> </head><body><a href"https://blog.csdn.net/2301_8034953…...