从零开始实践大模型 - 配置环境

本文地址:blog.lucien.ink/archives/549

本文将介绍在面向深度学习时,推荐的环境配置以及一些使用 Linux 的习惯。

本文的部分内容与 Debian 下 CUDA 生产环境配置笔记 有所重叠,但也有些许的不一样,在正文中不额外注明。

前言

本文将主要分 4 部分:

  1. 配置 SSH 登陆
  2. 安装显卡驱动
  3. 安装 Docker 并配置“Docker 显卡驱动”
  4. 切换至普通用户并安装 miniconda

配置 SSH 登陆

在安装完系统并重启之后,首先看到的是一个登陆界面,在这里输入我们在安装阶段设定好的 root 用户及密码即可。请注意,在输入密码的时候,是看不见自己输了什么、输了几个字符的。

配置用户登陆

登陆进 root 之后,在这里我们先什么都不做,先配置 root 用户的 ssh 登陆权限。在大部分的教程中都会直接在 /etc/ssh/sshd_config 中添加一行 PermitRootLogin yes,在这里笔者是及其不推荐的。

对于 root 用户来说,推荐的方式是密钥登陆,在本地用 ssh-keygen 生成一个公私钥对,将本地生成的 ~/.ssh/id_rsa.pub 拷贝至服务器的 ~/.ssh/authorized_keys 中(如果服务器中提示 ~/.ssh 不存在则执行 mkdir ~/.ssh 创建一个就好)。

在这里给出简单的命令:

mkdir -p ~/.ssh
echo 'content of your id_rsa.pub' >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys

有些小伙伴会遇到如何把本地的 ~/.ssh/id_rsa.pub 弄到服务器中的问题,在这里提供 3 个解决方案:

  1. 先临时打开 PermitRootLogin yes,用 ssh 拷过去后再关掉
  2. 本地在 ~/.ssh 目录下用 python3 -m http.server 3000 起一个 HTTP 文件服务,然后去服务器上执行 wget
  3. 使用 PasteMe 来传输,在这里不赘述

基础软件

在这里使用 TUNA 的 Debian 软件源 作为 APT mirror:

cat << EOF > /etc/apt/sources.list
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware
deb https://mirrors.tuna.tsinghua.edu.cn/debian-security bookworm-security main contrib non-free non-free-firmware
EOF
apt update  # 更新索引
apt install curl wget screen git -y  # 常用软件

安装显卡驱动

软件依赖

apt update
apt install linux-headers-`uname -r` build-essential  # CUDA 驱动的依赖

禁用 Nouveau

这一步是必要的,因为 Nouveau 也是 NVIDIA GPU 的驱动程序,参考 nouveau - 维基百科。

cat << EOF > /etc/modprobe.d/blacklist-nouveau.conf
blacklist nouveau
options nouveau modeset=0
EOF
update-initramfs -u
reboot

下载驱动

前往 Official Drivers | NVIDIA 下载显卡驱动,请注意,CUDA Toolkit 不要选 Any,否则会获得一个十分旧的驱动,会影响 nvidia docker (CUDA >= 11.6) 的安装。

对于大部分服务器来说,操作系统选 Linux 64-bit,语言推荐选 English (US)。CUDA Toolkit 笔者在这里选择 12.4 版本,得到的下载链接为:NVIDIA-Linux-x86_64-550.90.07.run,下载到服务器上即可。

在这里我额外测试了一下,对于 Linux 64-bit 来说,不论是消费卡(RTX 4090、RTX 3090),还是面向数据中心的卡(H100、A100、V100、P4),驱动是一模一样的。

wget 'https://us.download.nvidia.com/tesla/550.90.07/NVIDIA-Linux-x86_64-550.90.07.run'

安装驱动

chmod +x NVIDIA-Linux-x86_64-550.90.07.run
./NVIDIA-Linux-x86_64-550.90.07.run -s --no-questions --accept-license --disable-nouveau --no-drm

在这之后,执行 nvidia-smi -L 应该能看到如下内容:

$ nvidia-smi -L
GPU 0: Tesla P4 (UUID: GPU-***)
GPU 1: Tesla P4 (UUID: GPU-***)

显卡常驻

nvidia-persistenced 常驻

默认情况下,nvidia-smi 执行起来会很慢,它的等待时长会随着显卡数量的增加而增加。这是因为常驻模式(Persistence Mode)没有打开,对于服务器来说,强烈建议打开这一选项。

可以通过添加一个 启动项来保持常驻模式打开:

cat <<EOF >> /etc/systemd/system/nvidia-persistenced.service
[Unit]
Description=NVIDIA Persistence Daemon
Before=docker.service
Wants=syslog.target[Service]
Type=forking
ExecStart=/usr/bin/nvidia-persistenced
ExecStopPost=/bin/rm -rf /var/run/nvidia-persistenced[Install]
WantedBy=multi-user.target
EOFsystemctl daemon-reload
systemctl start nvidia-persistenced
systemctl enable nvidia-persistenced

可以通过 nvidia-smi -q -i 0 | grep Persistence 来检查某张显卡该模式的状态。

安装 NVSwtich 驱动

如果读者使用的不是 SXM 的卡,请跳过这一步,如果不明白这里是在说什么,也可以先跳过

对于 H100 SXMA100 SXM 等拥有 NVSwitch 的整机来说,需要额外安装 nvidia-fabricmanager 来启用对 NVSwitch 的支持。

wget https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64/nvidia-fabricmanager-550_550.90.07-1_amd64.deb
dpkg -i nvidia-fabricmanager-550_550.90.07-1_amd64.deb

请注意,这里的 nvidia-fabricmanager 需要与 CUDA Driver 版本匹配。

通过执行 nvidia-smi -q -i 0 | grep -i -A 2 Fabric 来验证 nvidia-fabricmanager 是否安装成功,看到 Success 代表成功。(参考资料:fabric-manager-user-guide.pdf,第 11 页)

$ nvidia-smi -q -i 0 | grep -i -A 2 FabricFabricState                             : CompletedStatus                            : Success
特殊情况处理

笔者曾经遇到过下载的 CUDA 驱动版本并未被 APT 中的 nvidia-fabricmanager 支持的情况,比如通过执行 apt-cache madison nvidia-fabricmanager-550 可以发现,nvidia-fabricmanager-550 只支持 550.90.07-1550.54.15-1550.54.14-1 三个版本,这种时候可通过执行 ./NVIDIA-Linux-x86_64-550.90.07.run --uninstall 来卸载 CUDA 驱动,然后重新下载支持的驱动版本。

$ apt-cache madison nvidia-fabricmanager-550
nvidia-fabricmanager-550 | 550.90.07-1 | https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64  Packages
nvidia-fabricmanager-550 | 550.54.15-1 | https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64  Packages
nvidia-fabricmanager-550 | 550.54.14-1 | https://developer.download.nvidia.com/compute/cuda/repos/debian12/x86_64  Packages

安装 Docker

Docker CE 软件仓库

export DOWNLOAD_URL="https://mirrors.tuna.tsinghua.edu.cn/docker-ce"
wget -O- https://get.docker.com/ | sh

在这里需要给普通用户执行 docker 的权限。

# dockerd-rootless-setuptool.sh install  # rootless mode
usermod -aG docker ${your username}  # root mode

配置 Docker 可以调用显卡

Installing the NVIDIA Container Toolkit

curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \&& curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
apt update
apt install -y nvidia-container-toolkit
nvidia-ctk runtime configure --runtime=docker  # 这一步会修改 /etc/docker/daemon.json
systemctl restart docker

测试:

如果网络不通的话,在镜像名前面添加 hub.uuuadc.top 以使用代理:hub.uuuadc.top/nvidia/cuda:11.6.2-base-ubuntu20.04

docker run --rm --gpus all nvidia/cuda:11.6.2-base-ubuntu20.04 nvidia-smi

如果能看到 nvidia-smi 的内容,则代表安装成功了。

普通用户安装 conda 环境

在这里我们退出 root 用户的登录,使用密码直接 SSH 登录普通用户。

随后我们从 Miniconda 下载 Miniconda: Miniconda3 Linux 64-bit

wget 'https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh'
bash Miniconda3-latest-Linux-x86_64.sh -b -p ${HOME}/.local/miniconda3
${HOME}/.local/miniconda3/bin/conda init

配置 conda 镜像

Anaconda 镜像使用帮助

conda config --set show_channel_urls yes 
cat << EOF >> ~/.condarc
channels:- defaults
default_channels:- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2
custom_channels:conda-forge: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudmsys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudbioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudmenpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudpytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudpytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloudsimpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/clouddeepmodeling: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/
EOF

配置 pypi 镜像

PyPI 镜像使用帮助

pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple
pip3 config set global.trusted-host pypi.tuna.tsinghua.edu.cn  # 当使用 http 或自签证书时需要这个配置

验证 Python 对 CUDA 的调用

在这里笔者也不推荐直接使用 base 环境,我们新建一个环境:

conda create -n python3 python=3.12
conda config --set auto_activate_base false  # 默认不激活 base 环境
echo 'conda activate python3' >> ~/.bashrc  # 默认激活 python3 环境

重新登录后可看到 python3 已经作为默认环境了。

我们简单下载一个 torch 来验证环境安装的正确性:

pip3 install torch numpy
python3 -c 'import torch; print(torch.tensor(0).cuda())'

尾声

建议

在这里再多啰嗦几句,希望能让后辈们少走些弯路:

  1. 任何行为,不论是安装软件、配环境、写代码还是一些系统操作,都应该将影响降低至 最小范围。比如将 nvcc、gcc 装至用户、环境级别而不是直接用 root 安装。
  2. 除了本章节的内容,在任何情况下,都不建议直接使用 root 账户进行操作,除非读者是一位对 Linux 非常熟悉的专家并且明白自己在做什么,否则会面临各种潜在的权限问题、崩溃、挖矿病毒、数据丢失等风险。
  3. 在任何情况下,都不应该操作 Linux 本身的 Python 环境,请使用 venv 或 conda
  4. 在任何情况下,都不应该随意变更宿主机的 CUDA 版本,请使用 docker
  5. 不建议在宿主机中安装 nvcc、TensoRT 等内容,据笔者观察,至少 90% 的用户他们并不明白自己在做什么,所以 请使用 conda 或 docker

备忘

  1. 安装 cudnn

    conda install conda-forge::cudnn
    
  2. 安装 nvcc

    conda install nvidia::cuda-nvcc
    
  3. 安装 gcc

    conda install conda-forge::gcc
    

Reference

  • Debian 下 CUDA 生产环境配置笔记
  • Debian 软件源 - 清华大学开源软件镜像站
  • Debian 下 CUDA 生产环境配置笔记 - Lucien’s Blog
  • nouveau - 维基百科
  • Official Drivers | NVIDIA
  • fabric-manager-user-guide.pdf
  • Download Installer for Linux Debian 12 x86_64
  • nvidia-persistenced 常驻
  • Docker CE 软件仓库 - 清华大学开源软件镜像站
  • Installing the NVIDIA Container Toolkit
  • Miniconda - Anaconda document
  • Anaconda 镜像使用帮助 - 清华大学开源软件镜像站
  • PyPI 镜像使用帮助 - 清华大学开源软件镜像站

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

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

相关文章

绝缘子陶瓷绝缘子玻色绝缘子聚合物绝缘子检测数据集VOC+YOLO格式2050张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2050 标注数量(xml文件个数)&#xff1a;2050 标注数量(txt文件个数)&#xff1a;2050 标注…

Debezium系列之:支持在一个数据库connector采集中过滤某些表的删除事件

Debezium系列之:支持在一个数据库connector采集中过滤某些表的删除事件 一、需求二、相关技术三、参数设置四、消费数据一、需求 在一个数据库的connector中采集了多张表,部分表存在数据归档的业务场景,会定期从表中删除历史数据,希望能过滤掉存在数据归档这些表的删除事件…

Ubuntu 22.04远程自动登录桌面环境

如果需要远程自动登录桌面环境&#xff0c;首先需要将Ubuntu的自动登录打开&#xff0c;在【settings】-【user】下面 然后要设置【Sharing】进行桌面共享&#xff0c;Ubuntu有自带的桌面共享功能&#xff0c;不需要另外去安装xrdp或者vnc之类的工具了 点开【Remote Desktop】…

Orangepi配合IIC驱动OLED屏幕

目录 一、OLED屏幕 二、Orangepi的IIC接口及OLED屏幕硬件接线 2.1 Orangepi的IIC接口&#xff1a; 2.2 Orangepi与OLED屏幕硬件接线&#xff1a; 三、wiringPi库示例代码 3.1 wiringPi库OLED屏幕示例代码&#xff1a; 3.2 OLED显示自己想要的字符&#xff1a; 一、OLED屏…

unix高级编程系列之文件I/O

背景 作为linux 开发者&#xff0c;我们不可避免会接触到文件编程。比如通过文件记录程序配置参数&#xff0c;通过字符设备与外设进行通信。因此作为合格的linux开发者&#xff0c;一定要熟练掌握文件编程。在文件编程中&#xff0c;我们一般会有两类接口函数&#xff1a;标准…

Mysql慢日志、慢SQL

慢查询日志 查看执行慢的SQL语句&#xff0c;需要先开启慢查询日志。 MySQL 的慢查询日志&#xff0c;记录在 MySQL 中响应时间超过阀值的语句&#xff08;具体指运行时间超过 long_query_time 值的SQL。long_query_time 的默认值为10&#xff0c;意思是运行10秒以上(不含10秒…

实现基于Spring Boot的Web安全防护

实现基于Spring Boot的Web安全防护 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在当今互联网应用的开发中&#xff0c;保护用户数据和系统安全至关重要。S…

阿里云RDS云数据库库表恢复操作

最近数据库中数据被人误删了,记录一下恢复操作方便以后发生时进行恢复. 1.打开控制台&#xff0c;进入云数据库实例. 2.进入实例后 &#xff0c;点击右侧的备份恢复&#xff0c;然后看一下备份时间点&#xff0c;中间这边都是阿里云自动备份的备份集&#xff0c;基本都是7天一备…

详解「一本通 5.1 练习 1」括号配对(区间DP经典题)

一.题目 二.思路 题目的大意是说:给你一个只由[ ] ( )构成的字符串&#xff0c;请问需要增加多少个字符才能使其变为一个合法的括号序列。 因为添加若干字符使其达到匹配的目的等价于将不匹配的字符去除使得字符串达到匹配的目的 所以这题只需计算出已匹配完成的括号数,再…

中英双语介绍伦敦金融城(City of London)

中文版 伦敦金融城&#xff0c;通常称为“金融城”或“城”&#xff08;The City&#xff09;&#xff0c;是英国伦敦市中心的一个著名金融区&#xff0c;具有悠久的历史和全球性的影响力。以下是关于伦敦金融城的详细介绍&#xff0c;包括其地理位置、人口、主要公司、历史背…

机器学习原理之 -- 随机森林分类:由来及原理详解

随机森林分类器是机器学习中一种强大且灵活的集成学习方法。它通过构建多棵决策树并结合其结果来提高分类精度和稳定性。本文将详细介绍随机森林分类器的由来、基本原理、构建过程及其优缺点。 二、随机森林的由来 随机森林&#xff08;Random Forest&#xff09;由Leo Breima…

【优化论】约束优化算法

约束优化算法是一类专门处理目标函数在存在约束条件下求解最优解的方法。为了更好地理解约束优化算法&#xff0c;我们需要了解一些核心概念和基本方法。 约束优化的核心概念 可行域&#xff08;Feasible Region&#xff09;&#xff1a; 比喻&#xff1a;想象你在一个园艺场…

基于机器学习的永磁同步电机矢量控制策略-高分资源-下载可用!

基于机器学习的永磁同步电机矢量控制策略 优势 训练了RL-Agent&#xff0c;能够提高电机在非线性负载下的性能。 部分程序 仿真结果 转矩估计及dq轴电流。 代码有偿&#xff0c;50&#xff0c;需要的可以联系。

数学建模算法目标规划

在人们的生产实践中&#xff0c;经常会遇到如何利用现有资源来安排生产&#xff0c;以取得最大经济 效益的问题。此类问题构成了运筹学的一个重要分支—数学规划&#xff0c;而线性规划(Linear Programming 简记 LP)则是数学规划的一个重要分支。特别是在计算机能处理成千上万个…

底层软件 | STM32启动分析之main函数是怎样跑起来的

应届生面试&#xff0c;基本上嵌入式一般都是基于32的项目&#xff0c;记得我当年面大疆的就是有这个题目。 1、STM32启动规则 STM32根据boot0和boot1的电平决定启动位置&#xff0c;boot00时从主Flash启动&#xff0c;即0x08000000地址启动。 按照spec&#xff0c;M3核的中断…

构建工程化:多种不同的工程体系如何编写MakeFile

源码分析 核心MakeFile 这个 Makefile 是一个复杂的构建脚本&#xff0c;用于管理和构建一个大型项目。它包括多个目标、条件判断和递归调用 make 命令来处理多个子项目和子目录。让我们逐部分进行详细解析。 伪目标和变量定义 .PHONY: all clean install build test init.…

依赖注入的优点、解决的问题以及其底层原理和逻辑

依赖注入&#xff08;Dependency Injection, DI&#xff09;是一种设计模式&#xff0c;用于实现控制反转&#xff08;Inversion of Control, IoC&#xff09;。它通过将对象的依赖关系从类内部转移到外部配置或注入&#xff0c;从而提高代码的可维护性、可测试性和可扩展性。以…

使用Spring Boot和Apache Camel集成第三方服务

使用Spring Boot和Apache Camel集成第三方服务 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨如何利用Spring Boot和Apache Camel来集成第三方服…

pycharm如何使用jupyter

目录 配置jupyter新建jupyter文件别人写的方法&#xff08;在pycharm种安装&#xff0c;在网页中使用&#xff09; pycharm专业版 配置jupyter 在pycharm终端启动一个conda虚拟环境&#xff0c;输入 conda install jupyter会有很多前置包需要安装&#xff1a; 新建jupyter…

一文理清LK光流

举出几种光流方法&#xff0c;说明LK光流的建模方式&#xff1f; 光流方法是用于估计图像序列中像素点运动的技术&#xff0c;广泛应用于计算机视觉和视频处理领域。以下是几种常见的光流方法&#xff1a; Lucas-Kanade (LK) 方法&#xff1a; 一种基于局部窗口的光流估计方法…