离线服务器算法部署环境配置
本文将详细记录我如何为一台全新的离线服务器配置必要的运行环境,包括基础编译工具、NVIDIA显卡驱动以及NVIDIA-Docker,以便顺利部署深度学习算法。
前提条件:
- 目标离线服务器已安装操作系统(本文以Ubuntu 18.04为例)。
- Docker 服务已安装并运行。
- Docker-Compose 已安装。
核心思路:
利用一台有网络的服务器(与目标服务器操作系统一致或兼容)下载所有需要的软件包和驱动,然后将这些文件拷贝到离线服务器进行安装。
阶段一:在线服务器资源下载
在有网络的服务器上,我们需要下载以下几类关键文件:
- 基础编译环境和依赖库的
.deb
包。 - NVIDIA 显卡驱动的
.run
安装包。 - NVIDIA-Docker (或
nvidia-container-toolkit
) 的.deb
包。
1.1 准备基础编译环境和依赖库
为了确保离线环境的纯净与一致性,我选择使用Docker容器(基于ubuntu:18.04
)来下载基础依赖包。这样做的好处是可以模拟目标服务器的操作系统环境,减少兼容性问题。
以下是我使用的命令序列:
首先,拉取官方的Ubuntu 18.04镜像:
docker pull ubuntu:18.04
然后,运行一个容器,并将宿主机的一个目录(例如 /path/on/host/for_debs)挂载到容器的 /downloaded_debs 目录,用于存放下载的 .deb 包:
docker run -it --rm \-v /path/on/host/for_debs:/downloaded_debs \ubuntu:18.04 /bin/bash
进入容器后,执行以下命令更新apt缓存,安装一些下载工具,然后仅下载我们需要的包到本地缓存,最后再拷贝出来:
# 在容器内部执行:
apt-get update
apt-get install -y apt-utils ca-certificates # ca-certificates 用于HTTPS下载# 清理旧的缓存(可选,但推荐)
apt-get clean# 仅下载指定的依赖包及其所有依赖项,不进行安装
# 注意:这里的包列表非常详细,是根据项目需求和驱动编译可能需要的依赖梳理的
# 实际操作中,您可能需要根据自己的需求调整这个列表
apt-get --reinstall install --download-only \build-essential \gcc \g++ \g++-7 \make \dpkg-dev \libdpkg-perl=1.19.0.5ubuntu2.4 \binutils=2.30-21ubuntu1~18.04.9 \binutils-common=2.30-21ubuntu1~18.04.9 \libbinutils=2.30-21ubuntu1~18.04.9 \binutils-x86-64-linux-gnu=2.30-21ubuntu1~18.04.9 \gcc-7 \libgcc-7-dev=7.5.0-3ubuntu1~18.04 \cpp-7 \libstdc++-7-dev=7.5.0-3ubuntu1~18.04 \libitm1 \libatomic1 \libasan4 \liblsan0 \libtsan0 \libubsan0 \libcilkrts5 \libmpx2 \libquadmath0 \libc6-dev=2.27-3ubuntu1.6 \libc6=2.27-3ubuntu1.6 \libc-dev-bin=2.27-3ubuntu1.6 \linux-libc-dev \linux-headers-5.4.0-150-generic \linux-hwe-5.4-headers-5.4.0-150 \perl=5.26.1-6ubuntu0.7 \perl-base=5.26.1-6ubuntu0.7 \libperl5.26=5.26.1-6ubuntu0.7 \perl-modules-5.26# 将下载的 .deb 文件从apt缓存复制到我们挂载的目录
cp /var/cache/apt/archives/*.deb /downloaded_debs/# 退出容器
exit
执行完毕后,所有必需的 .deb 包都已保存在宿主机的 /path/on/host/for_debs 目录中。
注意:linux-headers-5.4.0-150-generic 和 linux-hwe-5.4-headers-5.4.0-150 是特定内核版本的头文件。你需要根据你离线服务器的内核版本 (uname -r) 下载对应的头文件。如果在线服务器的内核版本与离线服务器不同,你可能需要临时下载对应版本的头文件包,或者在Docker容器内通过修改源的方式尝试获取特定版本的内核头文件包。最稳妥的方式是确保在线下载环境的内核或可获取的包版本与离线目标一致。
1.2 下载 NVIDIA 显卡驱动 📦
访问 NVIDIA官方驱动下载页面,根据你服务器的显卡型号和操作系统(Linux 64-bit)选择合适的驱动版本,并下载 .run
文件。例如 NVIDIA-Linux-x86_64-xxx.xx.xx.run
。将其保存在之前准备的 /path/on/host/for_debs
目录(或者一个专门存放驱动的目录)中。
1.3 下载 NVIDIA-Docker 相关包 🐳
NVIDIA-Docker 允许 Docker 容器直接访问宿主机的 GPU。现在推荐使用 nvidia-container-toolkit
。
在有网络的Ubuntu 18.04服务器上执行以下步骤来下载 nvidia-docker2
(或 nvidia-container-toolkit
) 及其依赖:
# 添加 NVIDIA Docker 的软件源 (在有网络的机器上)
curl -s -L [https://nvidia.github.io/nvidia-docker/gpgkey](https://nvidia.github.io/nvidia-docker/gpgkey) | sudo apt-key add -
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L [https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list](https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list) | sudo tee /etc/apt/sources.list.d/nvidia-docker.listsudo apt-get update# 仅下载 nvidia-docker2 及其依赖 (旧版,但有些环境可能仍需)
# sudo apt-get install --download-only -y nvidia-docker2# 推荐下载 nvidia-container-toolkit (新版)
sudo apt-get install --download-only -y nvidia-container-toolkit
下载完成后,相关的 .deb 文件会存放在 /var/cache/apt/archives/ 目录下。将这些 nvidia-docker2 或 nvidia-container-toolkit 相关的 .deb 包也复制到你的 /path/on/host/for_debs 目录中。
至此,所有需要的离线安装包都已准备就绪。
阶段二:离线服务器安装
现在,将在线服务器上 /path/on/host/for_debs
目录(或其他你存放所有下载文件的目录)中的所有内容(包括基础依赖的 .deb
文件夹、NVIDIA驱动 .run
文件、nvidia-docker
的 .deb
包)通过U盘、移动硬盘或其他方式传输到目标离线服务器上。假设我们把所有文件都放在了离线服务器的 /opt/offline_packages
目录下。
2.1 安装基础编译环境和依赖库
进入存放 .deb
包的目录,并使用 dpkg
进行安装:
cd /opt/offline_packages/debs_from_ubuntu_container # 这是之前下载的基础依赖
sudo dpkg -i *.deb
如果在执行 dpkg -i 时遇到依赖问题,可以尝试执行以下命令,它会尝试使用当前目录下已有的包来解决这些依赖关系:
sudo apt-get -f install
由于是离线环境,apt-get -f install 只有在所有必需的依赖包都已经被 dpkg -i “知晓”(即尝试安装过或已解包)并且这些包确实存在于本地时才可能成功解决问题。如果依然报错,说明你下载的包不全,需要回到阶段一补充下载缺失的依赖。
2.2 安装 NVIDIA 显卡驱动
-
禁用 Nouveau 驱动:Nouveau 是开源的 NVIDIA 驱动,与官方驱动冲突。
创建一个文件/etc/modprobe.d/blacklist-nouveau.conf
:sudo nano /etc/modprobe.d/blacklist-nouveau.conf
添加以下内容:
blacklist nouveau options nouveau modeset=0
更新 initramfs 并重启:
sudo update-initramfs -u sudo reboot
重启后,验证 Nouveau 是否已禁用:
lsmod | grep nouveau
如果没有任何输出,则表示禁用成功。
-
安装驱动:
给驱动文件执行权限,并运行安装程序。cd /opt/offline_packages # 假设 .run 文件在此 sudo chmod +x NVIDIA-Linux-x86_64-xxx.xx.xx.run sudo ./NVIDIA-Linux-x86_64-xxx.xx.xx.run --no-x-check --no-nouveau-check --no-opengl-files
--no-x-check
: 不检查X服务状态(服务器通常没有X)。--no-nouveau-check
: 再次确认不检查nouveau(我们已经禁用了)。--no-opengl-files
: 仅安装驱动,不安装OpenGL库(服务器通常不需要,且可能与现有mesa库冲突)。
按照提示完成安装。通常需要接受许可协议,可能会询问是否注册DKMS(推荐选择是,这样内核更新后驱动会自动重新编译)。
-
验证驱动安装:
nvidia-smi
如果成功安装,此命令会显示显卡信息和驱动版本。
2.3 安装和配置 NVIDIA-Docker
-
安装
nvidia-docker2
/nvidia-container-toolkit
包:
进入存放nvidia-docker
相关.deb
包的目录:cd /opt/offline_packages/nvidia_docker_debs # 假设你把nvidia-docker的deb包放在这里 sudo dpkg -i *.deb
同样,如果遇到依赖问题,可以尝试
sudo apt-get -f install
,前提是相关依赖也已拷贝过来。 -
重启 Docker 服务:
为了让 Docker 识别新的 NVIDIA runtime,需要重启 Docker 服务。sudo systemctl restart docker
或者在没有
systemctl
的旧系统上:sudo service docker restart
-
测试 NVIDIA-Docker:
运行一个基于 CUDA 的 Docker 镜像来测试 GPU 是否能在容器内被访问:docker run --rm --gpus all nvidia/cuda:11.0.3-base-ubuntu18.04 nvidia-smi
(请根据你安装的驱动版本,选择一个兼容的
nvidia/cuda
镜像标签。例如,如果你的驱动是 470.xx,CUDA 11.4 可能是一个好选择,对应的镜像是nvidia/cuda:11.4.0-base-ubuntu18.04
等。)如果此命令在容器内成功输出了
nvidia-smi
的信息,那么恭喜你,NVIDIA-Docker 配置成功!
总结 🏁
通过以上步骤,我们成功地在一台无网络服务器上配置了基础编译环境、安装了 NVIDIA 显卡驱动,并配置好了 NVIDIA-Docker。现在,这台服务器已经准备就绪,可以开始部署和运行需要 GPU 加速的算法应用了。虽然离线环境的配置过程相对繁琐,但只要细心准备,按部就班地操作,就能顺利完成。希望这篇记录能为有类似需求的人提供一些参考。
相关文章:
离线服务器算法部署环境配置
本文将详细记录我如何为一台全新的离线服务器配置必要的运行环境,包括基础编译工具、NVIDIA显卡驱动以及NVIDIA-Docker,以便顺利部署深度学习算法。 前提条件: 目标离线服务器已安装操作系统(本文以Ubuntu 18.04为例)…...

AIGC工具平台-卡通图片2D转绘3D
本模块是一款智能化的2D转3D图像处理工具,能够将卡通风格的2D图片自动转换为高质量3D渲染模型,让平面图像焕发立体生机。借助先进的AI深度学习算法,该工具可以精准识别角色轮廓、光影关系、材质纹理等关键元素,自动生成逼真的3D形…...
docker 启动一个python环境的项目dockerfile版本
文件格式 /home/py/docker/ # 项目根目录 ├── Dockerfile # Docker 构建文件 ├── requirements.txt # Python 依赖清单 └── src/ # 项目代码目录└── api_mock.py # Flask 应用入口文件Dockerfile # 使用…...

Java虚拟机 -方法调用
方法调用 方法调用静态链接动态链接案例虚方法与非虚方法虚方法(Virtual Method)非虚方法(Non-Virtual Method) 方法返回地址 方法调用 我们编写Java程序的时候,我们自己写的类通常不仅仅是调用自己本类的方法。调用别…...
基于matlabcd7.x的无网格近似方法
无网格近似方法(Meshless Methods)是一类数值计算方法,用于解决偏微分方程(PDEs)问题,特别是在几何形状复杂或需要动态网格更新的场景中。与传统的有限元方法(FEM)相比,无…...

JMeter JDBC请求Query Type实测(金仓数据库版)
文章目的 在实际性能测试中,JMeter的JDBC Request组件常用于模拟数据库操作。但许多用户对Query Type参数的具体行为存在疑惑。 本文将以金仓数据库KingbaseES为例,通过实测验证每种Query Type的行为,帮助用户明确其使用场景和限制ÿ…...

【内部教程】ISOLAR-AB配置以太网栈|超详细实战版
目录 往期推荐 缩写与定义 关于系统描述(System Description) 1.1 EthCommunicationController 1.2 EthCommunicationConnector 1.2.1 Ports(端口) 1.3 EthPhysicalChannel(以太网物理通道) 1.3.1…...
哈希表和容器中添加元素的方法
push_back v.s. emplace_back: 两者都是在容器末尾添加元素的方法,但是push_back会创建临时对象并进行拷贝构造,而emplace_back是直接构造 //push_back std::vector<MyClass> vec1; MyClass obj1("Object1", 1);//创建一个obj1对象 ve…...

Nginx 核心功能
目录 一:正向代理 1:编译安装 Nginx (1)安装支持软件 (2)创建运行用户、组和日志目录 (3)编译安装 Nginx (4)添加 Nginx 系统服务 2:配置正…...
String.join()-高效字符串拼接
String.join-高效字符串拼接 前言一、基础用法:拼接数组或集合元素(仅分隔符)语法示例 1:拼接字符串数组示例 2:拼接集合元素注意事项 二、进阶用法:结合 Stream API 处理复杂场景示例 1:添加前…...

【Canvas与图标】圆角方块蓝星CSS图标
【成图】 120*120的png图标 大小图: 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>圆角方块蓝星CSS Draft1</…...
系统性能分析基本概念(5) : 何时开始性能分析
决定何时开始系统性能优化(Performance Optimization)需要根据系统状态、业务需求和资源可用性来判断。以下是触发性能优化的关键场景和时机,结合系统性能分析(如DRAM读取吞吐量等)的背景,保持简洁且实用&a…...
Python实现Web请求与响应
目录 一、Web 请求与响应基础 (一)Web 请求与响应的定义与组成 (二)HTTP 协议概述 (三)常见的 HTTP 状态码 二、Python 的 requests 库 (一)安装 requests 库 (二…...

机器学习 day05
文章目录 前言一、模型选择与调优1.交叉验证2.超参数搜索 前言 通过今天的学习,我掌握了机器学习中模型的选择与调优,包括交叉验证,超参数搜索的概念与基本用法。 一、模型选择与调优 模型的选择与调优有许多方法,这里主要介绍较…...
CentOS Stream安装MinIO教程
1. 下载 MinIO 二进制文件 # 进入 MinIO 安装目录 sudo cd /usr/local/bin/# 下载 MinIO 二进制文件(替换为最新版本链接) wget https://dl.min.io/server/minio/release/linux-amd64/minio chmod x minio2. 创建专用用户和存储目录 # 创建 minio 用户…...

C#新建打开文件对话框
这是Winform直接封装好的打开文件对话框 using System.Windows.Forms; public static string OpenFile(string path) {OpenFileDialog openFileDialog new OpenFileDialog();// 设置对话框属性openFileDialog.Title "选择文件";openFileDialog.InitialDirectory …...

汇川PLC通过开疆智能Profinet转ModbusTCP网关读取西门子PLC数据案例
本案例是客户通过开疆智能Profient转ModbusTCP网关连接汇川PLC的配置案例 Modbus TCP主站即Modbus TCP客户端,Modbus TCP主站最多支持同时与31个Modbus TCP从站 。(Modbus TCP服务器)进行通信。 第一步设置PLC IP地址; 默认PLC…...

零基础入门:MinerU 和 PyTorch、CUDA的关系
💡一句话总结:MinerU 是一个用 PyTorch 跑模型的程序,PyTorch 支持多种加速方式(如 CUDA、MPS),让它跑得快就需要依赖这些加速工具。 PyTorch官网安装教程(可根据系统情况选择不同版本…...

借助IEDA ,Git版本管理工具快速入门
01 引言 一直使用SVN作为版本管理工具,直到公司新来的一批同事,看到我们使用的SVN都纷纷吐槽,什么年代了,还使用SVN。聊下来,才知道人家公司早早就将SVN切成了Git工具,并吐槽SVN的各种弊端。 既然新的技术…...

三维空间,毫秒即达:RTMP|RTSP播放器在Unity中的落地实现
有人问我:在 Unity 里做超低延迟的直播播放,是什么感觉? 我说,是把一帧帧流动的时间,嵌进一个三维的空间里。 它不属于现在,也不属于过去。 它属于“实时”——属于那一秒内刚刚发生,却已被你看…...
【计算机网络】HTTP/1.0,HTTP/1.1,HTTP/2,HTTP/3汇总讲解,清晰表格整理面试重点对比
表格汇总 对比维度HTTP/1.0HTTP/1.1HTTP/2HTTP/3传输协议TCPTCPTCP/TLS(默认加密)UDP(基于 QUIC 协议)连接方式短连接(每次请求/响应后断开)引入持久连接(Persistent Connection)&a…...

ubuntu 搭建FTP服务,接收部标机历史音视频上报服务器
1.安装vsftpd 1.1.安装命令 sudo apt update sudo apt install vsftpd 1.2.备份原始配置文件 sudo cp /etc/vsftpd.conf /etc/vsftpd.conf.bak 1.3.配置 vsftpd 编辑配置文件 /etc/vsftpd.conf: sudo vim /etc/vsftpd.conf 将以下参数修改为对应值ÿ…...

一、内存调优
一、内存调优 什么是内存泄漏 监控Java内存的常用工具 内存泄露的常见场景 内存泄露的解决方案 内存泄露与内存溢出的区别 内存泄露:在Java中如果不再使用一个对象,但是该对象依然在GC ROOT的引用链上,这个对象就不会被垃圾回收器回收&…...
IDEA启动报错:Cannot invoke “org.flowable.common.engine.impl.persistence.ent
1.问题 项目启动报错信息 java.lang.NullPointerException: Cannot invoke "org.flowable.common.engine.impl.persistence.ent 2.问题解析 出现这个问题是在项目中集成了Flowable或Activiti工作流,开启自动创建工作流创建的表,因为不同环境的数据…...
从加密到信任|密码重塑车路云一体化安全生态
目录 一、密码技术的核心支撑 二、典型应用案例 三、未来发展方向 总结 车路云系统涉及海量实时数据交互,包括车辆位置、传感器信息、用户身份等敏感数据。其安全风险呈现三大特征: 开放环境威胁:V2X(车与万物互联࿰…...

Java的Filter与Spring的Interceptor的比较
一、技术规范与框架依赖 维度FilterInterceptor所属规范Servlet 规范(Java EE 标准组件)Spring MVC 框架组件(非 Java EE 标准)框架依赖不依赖 Spring,仅需 Servlet 容器(如 Tomcat)依赖 Sprin…...
多线程编程的典型使用场景
前言 在Java开发中,合理使用并发/多线程技术可以显著提升系统性能和资源利用率。本文将通过典型场景代码示例的形式,帮助开发者理解多线程的实际应用价值。 核心使用场景 2.1 高并发请求处理 场景描述: 电商秒杀、票务系统等需要同时处理大…...
grafana dashboard 单位 IEC SI a i
grafana dashboard 画图的时候在 Standard options —> Unit —> Data —> 会有各种选项其中列举以 xxxaxxx 、xxxixxx开头和(IEC) (SI) 注释的,本文进行解释 其中带 a 的基于十进制的单位,使用1000作为基数。1 MB 1000 KB 1000 *…...

WPF···
设置启动页 默认最后一个窗口关闭,程序退出,可以设置 修改窗体的icon图标 修改项目exe图标 双击项目名会看到代码 其他 在A窗体点击按钮打开B窗体,在B窗体设置WindowStartupLocation=“CenterOwner” 在A窗体的代码设置 B.Owner = this; B.Show(); B窗体生成在A窗体中间…...
Git的工作流程
1) 初始化仓库:使用 git init 命令在目录中创建新Git仓库 2) 添加文件到暂存区: - git add <文件名> 添加指定文件 - git add . 添加所有修改文件 3) 提交改动:git commit -m "提交信息"(注意commit正确拼写…...