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

本文地址: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
EOF

systemctl 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 Fabric
    Fabric
        State                             : Completed
        Status                            : 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/cloud
  msys2: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  bioconda: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  menpo: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  pytorch-lts: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  simpleitk: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
  deepmodeling: 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.mfbz.cn/a/778058.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot 生产实践:没有父 starter 的打包问题

文章目录 前言一、搜索引擎二、Chat GPT三、官方文档四、小结推荐阅读 前言 今天刚准备写点文章&#xff0c;需要 SpringBoot 项目来演示效果。一时心血来潮&#xff0c;没有采用传统的方式&#xff08;即通过引入 spring-boot-starter-parent 父工程的方式&#xff09;。 &l…

昇思25天学习打卡营第15天|linchenfengxue

Pix2Pix实现图像转换 Pix2Pix概述 Pix2Pix是基于条件生成对抗网络&#xff08;cGAN, Condition Generative Adversarial Networks &#xff09;实现的一种深度学习图像转换模型&#xff0c;该模型是由Phillip Isola等作者在2017年CVPR上提出的&#xff0c;可以实现语义/标签到…

16-JS封装:extend方法

目录 一、封装需求 二、实现1&#xff1a;jQuery.extend 三、实现2&#xff1a;通过原型jQuery.fn.extend 四、优化 一、封装需求 封装需求&#xff1a; $.extend&#xff1a; var obj{ name:"xxx",age:18} var obj3{ gender:"女"} var obj2{}; 将obj、…

如何注册微信公众号

如何注册微信公众号 如何注册一个微信公众号 &#x1f60a;&#x1f4f1;摘要引言正文内容1. 准备工作内容定位和受众群体公众号名称和头像 2. 网页注册流程第一步&#xff1a;访问微信公众平台第二步&#xff1a;选择账户注册类型第三步&#xff1a;填写基本信息第四步&#x…

单/多线程--协程--异步爬虫

免责声明:本文仅做技术交流与学习... 目录 了解进程和线程 单个线程(主线程)在执行 多线程 线程池 协程(爬虫多用) 假异步:(同步) 真异步: 爬虫代码模版 异步-爬虫 同步效果--19秒 异步效果--7秒 了解进程和线程 ​ # --------------------> # ------> # …

Multisim仿真-交流数字电压表

下图为整体的原理框图&#xff0c;交流电源经过整流滤波电路转换后&#xff0c;送入模数转换电路&#xff0c;经译码给到显示电路&#xff0c;由其显示交流电源的有效值。 信号发生器XFG1输出正弦波信号(峰峰值)&#xff0c;XMM1测量有效值&#xff0c;U6数码管显示有效值。仿真…

基于星火大模型的群聊对话分角色要素提取挑战赛

赛事任务与数据 2024 iFLYTEK A.I.开发者大赛-讯飞开放平台 (xfyun.cn) 从给定的<客服>与<客户>的群聊对话中, 提取出指定的字段信息&#xff0c;待提取的全部字段见下数据说明。 赛题方提供了184条真实场景的群聊对话数据以及人工标注后的字段提取结果&#xf…

eBPF 指令宏

linux 6.9.7 指令宏 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) */ /* eBPF instruction mini library */ #ifndef __BPF_INSN_H #define __BPF_INSN_Hstruct bpf_insn;/* ALU ops on registers, bpf_add|sub|...: dst_reg src_reg */ // BPF_ALU64_REG&am…

Jmeter使用JSON Extractor提取多个变量

1.当正则不好使时&#xff0c;用json extractor 2.提取多个值时&#xff0c;默认值必填&#xff0c;否则读不到变量

代码随想录算法训练营第4天|LeetCode24,19,02,07,142

24.交换链表结点 题目链接&#xff1a;24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 文章链接&#xff1a;代码随想录 (programmercarl.com) 视频链接&#xff1a;代码随想录算法公开课 | 最强算法公开课 | 代码随想录 第一想法 正常模拟&#xff0c;先画…

47.HOOK引擎优化支持CALL与JMP位置做HOOK

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 上一个内容&#xff1a;46.修复HOOK对代码造成的破坏 以 46.修复HOOK对代码造成的破坏 它的代码为基础进行修改 优化的是让引擎支持从短跳JMP&#xff08;E9&…

JUC(java.util.concurrent)中的常见类

文章目录 Callable接口ReentrantLockReentrantLock 和 synchronized 的区别:如何选择使用哪个锁? 信号量SemaphoreCountDownLatch多线程环境使用ArrayList多线程使用 哈希表相关面试题 JUC放了和多线程有关的组件 Callable接口 和Runnable一样是描述一个任务,但是有返回值,表…

leetcode-每日一题

3101. 交替子数组计数https://leetcode.cn/problems/count-alternating-subarrays/ 给你一个 二进制数组 nums 。 如果一个 子数组 中 不存在 两个 相邻 元素的值 相同 的情况&#xff0c;我们称这样的子数组为 交替子数组 。 返回数组 nums 中交替子数组的数量。 示例 …

Linux字符设备驱动

一、字符设备驱动结构 1. cdev结构体 在Linux内核中&#xff0c;使用cdev结构体来描述一个字符设备 struct cdev {struct kobject kobj; //内嵌kobject对象struct module *owner; //所属的模块const struct file_operations *ops; //该设备的文件操作结构体struct list_head…

确认下单:购物车页面点击 去结算 按钮发起两个请求trade(显示购物车的商品信息和计算商品的总金额)findUserAddressList

文章目录 1、确认下单&#xff1a;购物车页面点击去结算1.1、在OrderController类中创建 trade 方法1.2、在CartController类中创建 checkedCartInfos1.3、CartServiceImpl 实现 checkedCartInfos的业务功能1.4、在service-cart-client模块下定义远程openFeign接口1.5、在SpzxO…

Java - 程序员面试笔记记录 实现 - Part3

4.1 线程与进程 线程是程序执行的最小单元&#xff0c;一个进程可以拥有多个线程&#xff0c;各个线程之间共享程序的内存空间以及一些进程级资源&#xff0c;但拥有自己的栈空间。 4.3 Java 多线程 方法一&#xff1a;继承 Thread 类&#xff0c;重写 run 方法&#xff1b;…

qt QGridLayout 简单实验1

1.概要 2.实验 2.1 实验1 简单实验跨行 2.1.1 代码 #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~W…

Golang语法规范和风格指南(一)——简单指南

1. 前引 一个语言的规范的学习是重要的&#xff0c;直接关系到你的代码是否易于维护和理解&#xff0c;同时学习好对应的语言规范可以在前期学习阶段有效规避该语言语法和未知编程风格的冲突。 这里是 Google 提供的规范&#xff0c;有助于大家在开始学习阶段对 Golang 进行一…

如何魔改vnstat-docker项目使其支持每1分钟采样?

文章目录 一、概述二、官网参考1. 官网地址2. 查看打包过程3.打包命令 三、修改过的文件四、部署运行1. 编排文件2. 运行效果 一、概述 接前文 网络流量监控神器vnStat初探 我们已经了解了vnStat的作用、使用和docker部署。 同时也了解到官方版本支持的采样统计间隔最小为5分…

【Unity】unity学习扫盲知识点

1、建议检查下SystemInfo的引用。这个是什么 Unity的SystemInfo类提供了一种获取关于当前硬件和操作系统的信息的方法。这包括设备类型&#xff0c;操作系统&#xff0c;处理器&#xff0c;内存&#xff0c;显卡&#xff0c;支持的Unity特性等。使用SystemInfo类非常简单。它的…