离线服务器算法部署环境配置

news2025/12/17 4:09:29

本文将详细记录我如何为一台全新的离线服务器配置必要的运行环境,包括基础编译工具、NVIDIA显卡驱动以及NVIDIA-Docker,以便顺利部署深度学习算法。

前提条件:

  • 目标离线服务器已安装操作系统(本文以Ubuntu 18.04为例)。
  • Docker 服务已安装并运行。
  • Docker-Compose 已安装。

核心思路:
利用一台有网络的服务器(与目标服务器操作系统一致或兼容)下载所有需要的软件包和驱动,然后将这些文件拷贝到离线服务器进行安装。


阶段一:在线服务器资源下载

在有网络的服务器上,我们需要下载以下几类关键文件:

  1. 基础编译环境和依赖库的 .deb 包。
  2. NVIDIA 显卡驱动的 .run 安装包。
  3. 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.list

sudo 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 显卡驱动

  1. 禁用 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
    

    如果没有任何输出,则表示禁用成功。

  2. 安装驱动
    给驱动文件执行权限,并运行安装程序。

    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(推荐选择是,这样内核更新后驱动会自动重新编译)。

  3. 验证驱动安装

    nvidia-smi
    

    如果成功安装,此命令会显示显卡信息和驱动版本。

2.3 安装和配置 NVIDIA-Docker

  1. 安装 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,前提是相关依赖也已拷贝过来。

  2. 重启 Docker 服务
    为了让 Docker 识别新的 NVIDIA runtime,需要重启 Docker 服务。

    sudo systemctl restart docker
    

    或者在没有 systemctl 的旧系统上:

    sudo service docker restart
    
  3. 测试 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 加速的算法应用了。虽然离线环境的配置过程相对繁琐,但只要细心准备,按部就班地操作,就能顺利完成。希望这篇记录能为有类似需求的人提供一些参考。

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

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

相关文章

AIGC工具平台-卡通图片2D转绘3D

本模块是一款智能化的2D转3D图像处理工具,能够将卡通风格的2D图片自动转换为高质量3D渲染模型,让平面图像焕发立体生机。借助先进的AI深度学习算法,该工具可以精准识别角色轮廓、光影关系、材质纹理等关键元素,自动生成逼真的3D形…

Java虚拟机 -方法调用

方法调用 方法调用静态链接动态链接案例虚方法与非虚方法虚方法(Virtual Method)非虚方法(Non-Virtual Method) 方法返回地址 方法调用 我们编写Java程序的时候,我们自己写的类通常不仅仅是调用自己本类的方法。调用别…

JMeter JDBC请求Query Type实测(金仓数据库版)

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

【内部教程】ISOLAR-AB配置以太网栈|超详细实战版

目录 往期推荐 缩写与定义 关于系统描述(System Description) 1.1 EthCommunicationController 1.2 EthCommunicationConnector 1.2.1 Ports(端口) 1.3 EthPhysicalChannel(以太网物理通道) 1.3.1…

Nginx 核心功能

目录 一:正向代理 1:编译安装 Nginx (1)安装支持软件 (2)创建运行用户、组和日志目录 (3)编译安装 Nginx (4)添加 Nginx 系统服务 2:配置正…

【Canvas与图标】圆角方块蓝星CSS图标

【成图】 120*120的png图标 大小图&#xff1a; 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>圆角方块蓝星CSS Draft1</…

机器学习 day05

文章目录 前言一、模型选择与调优1.交叉验证2.超参数搜索 前言 通过今天的学习&#xff0c;我掌握了机器学习中模型的选择与调优&#xff0c;包括交叉验证&#xff0c;超参数搜索的概念与基本用法。 一、模型选择与调优 模型的选择与调优有许多方法&#xff0c;这里主要介绍较…

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客户端&#xff0c;Modbus TCP主站最多支持同时与31个Modbus TCP从站 。&#xff08;Modbus TCP服务器&#xff09;进行通信。 第一步设置PLC IP地址&#xff1b; 默认PLC…

零基础入门:MinerU 和 PyTorch、CUDA的关系

&#x1f4a1;一句话总结&#xff1a;MinerU 是一个用 PyTorch 跑模型的程序&#xff0c;PyTorch 支持多种加速方式&#xff08;如 CUDA、MPS&#xff09;&#xff0c;让它跑得快就需要依赖这些加速工具。 PyTorch官网安装教程&#xff08;可根据系统情况选择不同版本&#xf…

借助IEDA ,Git版本管理工具快速入门

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

三维空间,毫秒即达:RTMP|RTSP播放器在Unity中的落地实现

有人问我&#xff1a;在 Unity 里做超低延迟的直播播放&#xff0c;是什么感觉&#xff1f; 我说&#xff0c;是把一帧帧流动的时间&#xff0c;嵌进一个三维的空间里。 它不属于现在&#xff0c;也不属于过去。 它属于“实时”——属于那一秒内刚刚发生&#xff0c;却已被你看…

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&#xff1a; sudo vim /etc/vsftpd.conf 将以下参数修改为对应值&#xff…

一、内存调优

一、内存调优 什么是内存泄漏 监控Java内存的常用工具 内存泄露的常见场景 内存泄露的解决方案 内存泄露与内存溢出的区别 内存泄露&#xff1a;在Java中如果不再使用一个对象&#xff0c;但是该对象依然在GC ROOT的引用链上&#xff0c;这个对象就不会被垃圾回收器回收&…

Java的Filter与Spring的Interceptor的比较

一、技术规范与框架依赖 维度FilterInterceptor所属规范Servlet 规范&#xff08;Java EE 标准组件&#xff09;Spring MVC 框架组件&#xff08;非 Java EE 标准&#xff09;框架依赖不依赖 Spring&#xff0c;仅需 Servlet 容器&#xff08;如 Tomcat&#xff09;依赖 Sprin…

WPF···

设置启动页 默认最后一个窗口关闭,程序退出,可以设置 修改窗体的icon图标 修改项目exe图标 双击项目名会看到代码 其他 在A窗体点击按钮打开B窗体,在B窗体设置WindowStartupLocation=“CenterOwner” 在A窗体的代码设置 B.Owner = this; B.Show(); B窗体生成在A窗体中间…

微服务架构中的多进程通信--内存池、共享内存、socket

目录 1 引言 2 整体架构简介 3 疑问 3.1 我们的共享内存消息机制是用的posix还是system V 3.2 rmmt中&#xff0c;不同线程之间的比如访问同一个内存&#xff0c;用的什么锁控制的 3.3 疑问&#xff1a;假如一个进程发送给了另外两个进程&#xff0c;然后另外两个进程都同…

电脑中所有word文件图标变白怎么恢复

电脑中的word文件图标变白&#xff0c;如下图所示&#xff1a; 解决方法&#xff1a; 1.winR-->在弹出的运行窗口中输入“regedit”(如下图所示)&#xff0c;点击确定&#xff1a; 2.按照路径“计算机\HKEY_CLASSES_ROOT\Word.Document.12\DefaultIcon”去找到“&#xff0…

RK3568 OH5.1 源码编译及问题

安装编译器和二进制工具 在源码根目录下执行prebuilts脚本&#xff0c;安装编译器及二进制工具。 bash build/prebuilts_download.sh在源码根目录执行如下指令安装hb编译工具&#xff1a; python3 -m pip install --user build/hb使用build.sh脚本编译源码 进入源码根目录&…

Qt5、C++11 获取wifi列表与wifi连接

一、获取wifi列表 .h 文件内容 #include <QWidget> #include <QVBoxLayout> #include <QPushButton> #include <QCheckBox> #include <QListWidget>class Setting : public QWidget {Q_OBJECT public:explicit Setting(QWidget *parent nul…