admin 管理员组

文章数量: 887055

不要轻易Update or Upgrate,导致NVIDIA驱动不兼容 !!!

不要安装最新的版本,版本兼容问题应该看发行时间:比如NVIDIA Driver的的发行时间应晚于Ubuntu系统发行时间

安装不成功,大概率是版本不兼容问题、硬件问题、产品太新使用方案不同以往(如A100显卡)

1、Ubuntu 22.04 镜像文件下载、制作启动盘

0. 慎重安装Ubuntu 20.04,其在服务器端经常有bug,安装完之后会黑屏!

1. 官网下载镜像文件:https://releases.ubuntu.com/jammy/ubuntu-22.04.4-desktop-amd64.iso

2. 推荐 ventoy 软件写入镜像!

3. 或者用 UltraISO 制作U盘安装Ubuntu(不推荐):
   打开iso -> 启动 -> 写入硬盘映像 -> 写入方式: RAW

2、服务器安装系统

1. 系统安装时不要插网线联网,防止在安装过程中自动更新;安装完系统后再插网线联网!!!

2. F11/F10选择U盘启动,按照步骤安装

3. 建议磁盘分区:boot 4G, swap 60G, efi 1G, 剩下给/,创建用户数据存储文件夹(e.g., /user_data)并分区挂载

4. 对于覆盖之前的系统,直接选择 Erase and reinstall,但会自动磁盘分区,可以安装完系统后再挂载

3、开启SSH、安装NVIDIA驱动、安装向日葵远程连接

1. 开启ssh: sudo apt-get install openssh-server
			sudo systemctl start ssh
			sudo systemctl enable ssh
			sudo systemctl status ssh
			sudo systemctl restart ssh (可选)
			申请静态IP,便于远程连接

2. 安装nvidia-driver(安装dkms,否则重启会自动升级内核,导致驱动不匹配):
   方式一:官网下载NVIDIA驱动: https://www.nvidia.com/download/driverResults.aspx/221949/en-us
   		   (安装g++等、禁用Nouveau等,可参考博客1)
   		   安装dkms,这个可以自动配置内核和驱动匹配
   		   sudo bash NVIDIA-Linux-x86_64-535.161.08.run
   方式二:Ubuntu系统推荐安装(慎用,可能导致驱动和网络全崩):首先查看合适的驱动程序:ubuntu-drivers devices (找到合适的版本,建议参考一下NVIDIA官网驱动版本,这种方式经常会安装显卡不支持的小版本)
   		   sudo apt install nvidia-driver-xxx (e.g., xxx为535.161.08)
   		   禁用Nouveau驱动程序防止冲突:
   		   	   sudo bash -c "echo 'blacklist nouveau' >> /etc/modprobe.d/blacklist.conf"
			   sudo bash -c "echo 'options nouveau modeset=0' >> /etc/modprobe.d/blacklist.conf"
		   更新initramfs :
		   	   sudo update-initramfs -u
		   重启系统,生效,nvidia-smi
注:(1) 如果不小心update或upgrade导致驱动损坏,建议先卸载原驱动、重启后再重新安装驱动;或重装系统
	卸载驱动命令:sudo apt-get remove --purge nvidia*
	(2) gpu-burn 做gpu算力、压力测试
	(3) 正确的安装需要:内核和驱动版本配对上
	(4) .run安装时,如果图形界面安装报错,可能命令行方式不报错
	(5) A100系列以上显卡,不使用多实例GPU模式请禁用MIG,否则不加以配置,pytorch无法正常调用GPU

3. 安装向日葵:
   官网下载ubuntu的 .deb 文件
   sudo dpkg -i xxx.deb
   设置开机自启动、验证码永不更新

博客1

4、硬盘挂载到用户文件夹

0. 如果想把多个硬盘挂载到同一个目录(e.g., /home),在装系统分区时,先把一个磁盘挂载到/home(一般系统会自动分配),
   安装完成后再把其他硬盘挂载到这个目录(可以做逻辑卷)

1. 一个硬盘挂载到一个文件夹:
  创建文件夹: sudo mkdir -p /user_folder
  格式化硬盘分区(可选):sudo mkfs.ext4 /dev/sdb1
  先卸载已有的挂载:sudo umount /old_folder
  挂载到新文件夹:sudo mount /dev/sdb1 /user_folder
  配置开机自动挂载:获取UUID:sudo blkid /dev/sdb1
  				   sudo vim /etc/fstab
  				   添加一下内容到末尾:UUID=<UUID> /mnt/new_data  ext4  defaults  0  2

2. 两块硬盘挂载到一个文件夹(使用 LVM(逻辑卷管理)):
  sudo apt install lvm2
  初始化为物理卷:sudo pvcreate /dev/sda /dev/sdb
  将物理卷合并到一个卷组中,假设卷组名为 vg0:sudo vgcreate vg0 /dev/sda /dev/sdb
  创建逻辑卷:sudo lvcreate -l 100%FREE -n lv0 vg0
  格式化逻辑卷:sudo mkfs.ext4 /dev/vg0/lv0
  挂载逻辑卷:sudo mkdir /user_folder2
             sudo mount /dev/vg0/lv0 /user_folder2
  自动挂载:获取UUID: sudo blkid /dev/vg0/lv0
  			sudo vim /etc/fstab
  			UUID=<UUID>  /user_folder2  ext4  defaults  0  2

5、Ubuntu新建用户、设置目录和权限

1. 创建存储所有用户数据的文件夹:sudo mkdir user_folder
2. 创建新用户并指定目录:sudo adduser --home /user_folder/newuser newuser (不加--home,默认在/home)
3. 设置每个用户的主目录只有该用户可以访问:sudo chmod 700 /user_folder/newuser
4. 确保新用户的主目录属于该用户:sudo chown newuser:newuser /user_folder/newuser
								sudo chown -R $(whoami):$(whoami) /user_folder/newuser
5. 删除用户:sudo userdel -r newuser

6、建议Docker管理 (权限不够用sudo docker) (使用之前先查其他资料,结合使用!)

1. Docker(容器化技术)相比于虚拟机技术(如Vmware)更加轻量化,建立在内核层之上;支持一键打包;Docker创建新容器之后,具有独立的操作系统(如ubuntu22.04),这与主操作系统(如ubuntu22.04)是相互独立的。

2. 安装Docker
	sudo apt-get install -y apt-transport-https ca-certificates curl software-properties-common  # 安装必要的软件包
	# 添加Docker的官方GPG密钥
	curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
	# 添加Docker APT源
	echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
	# 安装Docker
	sudo apt-get install -y docker-ce docker-ce-cli containerd.io
	# 启动Docker服务
	sudo systemctl start docker
	# 设置Docker开机自启动
	sudo systemctl enable docker
	
3. 设置非root用户也具有docker命令权限 (这样每个用户可以自己建立独立的docker container)
	sudo gpasswd -a newuser docker
	newgrp docker

4. 拉取镜像并创建Docker容器
	# 去 Docker Hub 上找,同样的镜像拉取一次就行
	sudo docker pull ubuntu:22.04 或 sudo docker pull pytorch/pytorch:1.10.0-cuda11.3-cudnn8-devel 等等
	# 为 newuser 创建一个容器,并将 /user_folder/newuser 挂载到容器的 /home/newuser 
	docker run -d --name newuser_container -v /user_folder/newuser:/home/newuser ubuntu:22.04
	# 为容器设置SSH服务
	docker exec -it newuser_container bash  # 进入容器
	apt-get install -y openssh-server
	service ssh start
	exit  # 退出容器

5. 进入每个容器并设置用户密码
	docker exec -it newuser_container bash  # 进入容器
	passwd  # 设置密码
	exit  # 退出容器

6. 测试容器正常运行,并且用户的数据目录正确挂载
	docker exec -it newuser_container ls /home/newuser 

7. 一些其他(必要的)操作
	# Docker容器在服务器重启后自动启动
	docker update --restart unless-stopped newuser_container 
	sudo reboot, docker ps  # 重启后,检查容器状态
	
	# 将主系统上的文件复制到容器中:
	docker cp demo.sh newuser_container:/root/demo.sh
	docker exec newuser_container chmod +x /root/demo.sh  # 设置权限

	# 连接容器SSH
	container_ip=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' newuser_container)  # 获取容器ip地址
	ssh newuser@${container_ip}

	# 手动重启容器
	docker restart newuser_container 
	docker ps  # 检查容器状态

8. pycharm调试容器中的python项目
	推荐的方法是在主系统上安装和使用PyCharm,并通过远程连接到Docker容器中的Python环境。
	 File > Settings > Project > Project Interpreter > Add > Docker > Docker中的conda/envs/myenv/bin/python

Docker参考1
Docker参考2
Docker参考3

7、CUDA、CuDNN安装 (可选,Anaconda虚拟环境下安装pytorch可自动创建CUDA和CuDNN相关依赖,但是有些包的安装和使用还是依赖于CUDA驱动和CuDNN,建议安装)

1. 参考博客1 安装CUDA、CuDNN
2. 注意:(1) CUDA添加环境变量给当前用户的步骤为(好处是:系统安装多个版本的CUDA,每个用户各自链接CUDA):
		 vim ~/.bashrc
		 # 在该文件的最后添加下面两行
		 # `注意:下面两行命令的cuda-x.x需要根据自己安装的版本号进行修改
		 export PATH=/usr/local/cuda-12.1/bin:${PATH}
		 export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64:${LD_LIBRARY_PATH}
         # 使得修改后的环境变量生效
         source ~/.bashrc
         
		 (2) 希望所有用户都能够使用CUDA的配置为:
		 sudo vim /etc/profile
		 # 在该文件的最后添加下面两行
		 # `注意:下面两行命令的cuda-x.x需要根据自己安装的版本号进行修改
		 export PATH=/usr/local/cuda-12.1/bin:${PATH}
		 export LD_LIBRARY_PATH=/usr/local/cuda-12.1/lib64:${LD_LIBRARY_PATH}
		 # 刷新配置文件:使更改立即生效
		 source /etc/profile
		 
验证:nvcc -V

8、Anaconda安装(多种安装方式)

1. 安装anaconda:
	官网下载包,安装:bash Anaconda3-2024.02-1-Linux-x86_64.sh
	
2. root用户安装,并设置其他用户也能使用
	# 将Anaconda目录权限更改为允许其他用户读取和执行
	sudo chmod -R a+rx /path/to/anaconda
	# 将Anaconda的bin目录添加到所有用户的PATH环境变量中
	# 在/etc/profile文件或/etc/profile.d目录下创建一个新的脚本文件,如anaconda.sh
	export PATH="/path/to/anaconda/bin:$PATH"

3. 建议每个用户自己安装自己的anaconda环境,避免环境误删
	如果root用户设置了所有用户的anaconda,但是用户自己也安装了anaconda,则可以去修改用户的PATH环境变量,默认用户自己安装的anaconda优先级更高

4. 直接选择Anaconda的多用户安装模式
	# 安装Anaconda时选择安装路径为公共路径(如/opt/anaconda),并配置合适的权限
	sudo bash Anaconda3-*.sh
	# 将Anaconda目录权限更改为允许其他用户读取和执行
	sudo chmod -R a+rx /opt/anaconda
	# 将Anaconda的bin目录添加到所有用户的PATH环境变量中
	export PATH="/opt/anaconda/bin:$PATH"
	

9、深度学习模型测试

1. conda create --name py39 python=3.9

2. e.g. conda install pytorch==2.1.2 torchvision==0.16.2 torchaudio==2.1.2 pytorch-cuda=12.1 -c pytorch -c nvidia

3. 测试代码:
import time
import torch
import torch.nn as nn
import torch.optim as optim
from torchvision import datasets, transforms
from torch.utils.data import DataLoader

# 超参数设置
batch_size = 64
learning_rate = 0.01
epochs = 10

# 使用CUDA(如果可用)
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
print(device)

# 数据加载和预处理
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.5,), (0.5,))
])

train_dataset = datasets.MNIST(root='./data', train=True, download=True, transform=transform)
train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)

test_dataset = datasets.MNIST(root='./data', train=False, download=True, transform=transform)
test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)

# 简单的神经网络模型
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(28 * 28, 512)
        self.fc2 = nn.Linear(512, 512)
        self.fc3 = nn.Linear(512, 512)
        self.fc4 = nn.Linear(512, 512)
        self.fc5 = nn.Linear(512, 512)
        self.fc6 = nn.Linear(512, 10)

    def forward(self, x):
        x = x.view(-1, 28 * 28)
        x = torch.relu(self.fc1(x))
        x = self.fc2(x)
        x = self.fc3(x)
        x = self.fc4(x)
        x = self.fc5(x)
        x = self.fc6(x)
        return x

# 初始化模型、损失函数和优化器
model = SimpleNN().to(device)
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=learning_rate)

# 训练函数
def train():
    model.train()

    for epoch in range(epochs):
        start_time = time.time()
        for batch_idx, (data, target) in enumerate(train_loader):
            data, target = data.to(device), target.to(device)
            optimizer.zero_grad()
            output = model(data)
            loss = criterion(output, target)
            loss.backward()
            optimizer.step()
        end_time = time.time()
        print(f"Training Time: {end_time - start_time:.2f} seconds")

# 测试函数
def test():
    model.eval()
    correct = 0
    total = 0

    with torch.no_grad():
        for epoch in range(epochs):
            start_time = time.time()
            for data, target in test_loader:
                data, target = data.to(device), target.to(device)
                output = model(data)
                _, predicted = torch.max(output.data, 1)
                total += target.size(0)
                correct += (predicted == target).sum().item()
            end_time = time.time()
            print(f"Inference Time: {end_time - start_time:.2f} seconds")
            print(f'Accuracy: {100 * correct / total:.2f}%')

# 执行训练和测试
if __name__ == "__main__":
    train()
    test()

10、一切安装就绪之后,禁用一切更新(包括系统自动更新)

1. 禁用内核更新
	查看正在使用的内核版本:uname -r
	查看正在使用的内核包(替换成上述搜索到的版本):dpkg --get-selections | grep 6.2.0-26-generic
	禁止内核更新(替换成上述搜索到的软件包):sudo apt-mark hold linux-headers-6.2.0-26-generic linux-image-6.2.0-26-generic linux-modules-6.2.0-26-generic linux-modules-extra-6.2.0-26-generic
	检查状态:dpkg --get-selections | grep 6.2.0-26-generic
	
	若要重新开启内核更新(替换成搜索到的软件包):sudo apt-mark install linux-headers-6.2.0-26-generic linux-image-6.2.0-26-generic linux-modules-6.2.0-26-generic linux-modules-extra-6.2.0-26-generic
	若自动更新了内核版本导致驱动不可用,查看博客2

2. 禁用系统自动更新等等

博客2

本文标签: 向日葵 万字 详解 深度 模型