转载自:https://zhuanlan.zhihu.com/p/664142141

之前因为笔记本内存太小,所以购买了一台台式机,作为笔记本的一个替代,这样我就能在台式机上毫无顾忌的安装各种软件。后来看到长江存储2T固态才卖四百多,于是毫不犹豫入手一块,并替换了笔记本上500G的SSD,瞬间感觉很香。但是之前购置的台式机就没有发挥其优势的余地了,为了解决这个问题呢,我觉得把那台台式机配置成一个Linux的工作站,于是有了此长文。 1 硬件配置 CPU:Inter Core i7-13700F 16核24线程 内存:Kingston FURY 64G(32G x 2) DDR5 磁盘:SOLIDOGM NVME SSD 1TB + 500G SSD(笔记本拆卸)+ WD Purple SATA 6TB 主板:华硕 Z790 -PLUS 显卡:RTX 3060Ti 电源:CoolerMaster GX650W 关于硬盘分配:笔记本拆卸下来的500G SSD做为系统盘,1TB的SOLIDOGM NVME SSD作为数据集缓存,6TB的机械硬盘作为数据集仓库。

2 系统和软件 2.1 操作系统 我这里选择Ubuntu 22.04TLS系统作为操作系统,安装过程和其它安装操作系统的步骤一样,需要先制作启动盘,然后设置U盘启动,把原来的系统直接擦除覆盖掉,安装新的操作系统即可。

首先需要从官网下载Ubuntu22.04TLS,下载地址如下:https://ubuntu.com/download/desktop

启动盘可用baleanaEtcher等工具来制作,制作完成插入主机开机安装即可。

安装过程略,一路按照提示安装下来基本没有太大的问题,网上也有很多相关的教程。

2.2 软件工具 安装完成之后,进入系统后推荐先执行一些基本的操作,比如配置网络管理工具,更换镜像源等等。

2.2.1 基础工具安装 配置密码

<1>修改root密码

sudo passwd root

<2>避免每次输入sudo都要输入密码,可以进行如下操作

sudo visudo

<3>在文件最后添加如下内容

panghong ALL=(ALL) NOPASSWD:ALL 安装网络管理工具和vim编辑器 sudo apt install net-tools sudo apt-get install vim 这里的apt和apt-get两个工具在功能上是等价的,所要完成的任务一致。实际上,apt是apt-get的替代品,因为是新的,所以用户友好型方面做的比较好,但是在一些旧的软件上,apt无法使用,那么就需要用apt-get了。 2.2.2 更换国内镜像源 关于镜像源可以使用阿里云,清华源,中科大源,豆瓣源等等,比如我这里使用清华镜像源,操作如下:

<1>备份原来的源文件

cp /etc/apt/sources.list /etc/apt/sources.list.bak

<2>打开原来的源文件

sudo vim /etc/apt/sources.list 将文件中的内容删除,添加下面的内容

deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse 注意:对于不同版本的Ubuntu系统,源镜源中内容大致是一样的,中间和系统版本相关的是版本代号,比如我安装的是Ubuntu22.04版本的,那么镜像源中的关键词是jammy,而像是Ubuntu20.04,那么版本代号就应该是focal,这个必须和自己的系统版本匹配。 更新软件列表 sudo apt update sudo apt upgrade 小Tips:在图形桌面上,打开Software & Update软件,里面有网速测试功能,可以根据这个测速功能选择最合适的镜像源。 2.2.3 安装python和pip Ubuntu系统默认自带python工具,如果自己的应用对版本有需要的话,那么也可以安装一下。

sudo apt install python3 sudo apt install python3-pip 更换一下pip源,可以提到pip的速度。

cd ~ mkdir .pip sudo vim ~/.pip/pip.conf 更改为以下内容:

[global] index-url = https://pypi.tuna.tsinghua.edu.cn/simple/ [install] trusted-host = pypi.tuna.tsinghua.edu.cn 2.2.4 配置SSH和远程桌面 安装ssh sudo apt install ssh 配置远程桌面 远程桌面的方式目前来说有两种比较常用,一种是传统的VNC,一种是微软的XRDP,两种方式都可以。

这里采用XRDP方式来实现,原因有二,第一是XRDP方式是基于微软的远程桌面协议(RDP)来实现的,这样采用微软Windows系统自带的远程桌面软件而不需要使用第三方软件就会方便很多,第二是RDP的传输很稳定,速度很快,而且可以在主机和远程桌面之间直接进行文件拖拽和复制粘贴,就很方便。

<1>安装xrdp

sudo apt install xrdp

<2>查看安装状态

sudo systemctl status xrdp 需要注意的是xrdp在Ubuntu中使用了/etc/ssl/private/ssl-cert-snakeoil.key作为SSL证书的私钥文件,该私钥文件仅仅对ssl-certy用户组的用户有效,所以需要将xrdp用户添加到这个组中。

sudo adduser xrdp ssl-cert
sudo systemctl restart xrdp 接下来直接通过windows的远程桌面软件进行远程连接即可,需要注意的是,在进行远程链接之前需要注销服务器的桌面,否则就可能出现闪退和无法连接的问题。

注意:使用发现,系统经常自动进入休眠状态,这就导致无法通过远程访问服务器了,可以通过禁用系统休眠服务来解决这个问题,输入下面的指令即可

sudo systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target 2.2.5 配置外网访问 注意到前面的ssh和远程桌面都是在内网内进行的,如果我们在公司或者在外边,就不能随时随地访问,这就非常不nice了。这个问题根源在哪呢?首先我们要明白,我们主机和服务器都在内网中,内网中的主机访问外网的服务是非常容易的,但是外网的一台主机要访问内网的一台主机,就没那么好实现了,所以这里就需要实现一项技术叫做内网穿透,顾名思义,从外网穿透到内网,访问内网中的一台主机。

我们可以通过下面这些办法来解决这个问题。

第一种方式是采用花生壳这种DDNS软件来实现内网穿透,优点是简单快捷,缺点是有端口、带宽和流量限制,如果要提升带宽和速率或者新添加端口的话,就需要额外付费。 第二种方式是采用frp反向代理的方式实现,优点是完全自主可控,端口可任意配置,缺点是需要购买一台云服务,并且也有带宽和流量限制。 花生壳的配置方式相对比较简单,就是访问花生壳的官网,注册并登录管理平台,然后在服务器上安装花生壳的应用,在后台进行设备添加和配置。

frp反向代理的方式相对复杂一丢丢,同样需要在云服务端安装server应用,在自己的服务器端安装client应用。

在云服务器端下载frp软件 注意,这里是指在云服务器端进行下载,也就是先要购买一个云服务,我自己是在两年前趁活动购买了华为云的云耀云服务器,所以这里直接用了,大家按自己的需求来评估是否购买,毕竟花生壳也是有免费的。

下载地址:https://github.com/fatedier/frp/releases/download/v0.34.3/frp_0.34.3_linux_amd64.tar.gz

下载完成之后解压 sudo tar -zxvf frp_0.34.3_linux_amd64.tar.gz 编辑frps.ini文件 [common] bind_port = 7000 # frp服务的端口号,可以自己定义 dashboard_port = 7500 # frp的web界面的端口号 dashboard_user = user # web界面的登陆账户,可以自己修改 dashboard_pwd = pass # web界面的登陆密码,可以自己修改 authentication_method = token token = xxxxx # frp客户端连接时的密码,可以自己修改 保存配置后,使用命令启动 ./frps -c ./frps.ini 启动后,在浏览器中输入[云服务器的公网IP:7500],如果一切正常就能访问到frp的web管理界面。需要注意的是需要去云服务配置安全组策略,开放以上涉及到的端口,不然就被云服务器上的WAF给拦截了,自然就访问不到啦!

在本地服务器端下载frp软件 下载连接:https://github.com/fatedier/frp/releases

解压缩到一个零时文件夹中 sudo tar -xvzf frp_0.51.0_linux_arm64.tar.gz 修改frpc.ini配置文件 [common] server_addr = xx.xx.xx.xx # 你的云服务器的公网ip authentication_method = token token = xxxxx # 刚刚配置的frp连接密码 server_port = 7000 # 刚刚配置的frp服务端口 ​ [Fusion-ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 20022

[Fusion-rdp] type = tcp local_ip = 127.0.0.1 local_port = 3389 remote_port = 23389 通过这种方式就能够实现云服务器特定端口的访问给重定向到本地服务器的某个端口了,如果需要访问本地服务器,那么只需要通过访问[云服务器ip]:端口号就可以了。

配置自启动脚本 在云服务器端,我们不可能每次都进入云服务器中输入指令./frps -c ./frps.ini来启动frp,我们是希望其能在后台运行,可以用输入下面这个指令:

nohup ./frps -c ./frps.ini & 应该还有很多其它的方式,使用GPT查询一下,应该会提供很多方法。

比如设置开机自启动等等

2.2.6 安装SMABA服务 通过SMABA服务来实现这个类似于NAS的那种效果,直接把服务器的磁盘挂载到个人电脑上,这样就非常方便,学会这种方法,以后做文件传送什么的就方便太多啦~

安装samba和samba-common-bin sudo apt-get install samba samba-common-bin 配置/etc/samba/smb.conf sudo vim /etc/samba/smb.conf 在配置文件的最后添加如下内容

共享文件夹显示的名称

[home]

说明信息

comment = Fusion WorkStation Storage

可以访问的用户,xxx为你自己的用户名

valid users = xxx,root

共享文件的路径

path = /home/panghong/

可被其他人看到资源名称(非内容)

browseable = yes

可写

writable = yes

新建文件的权限为 664

create mask = 0664

新建目录的权限为 775

directory mask = 0775 可以配置文件中不需要分享的内容都注释掉 测试文件配置是否有误 testparm 添加登录账户 这里添加的需要是已经存在的账户!这里的xxx就是你自己的用户名。 sudo smbpasswd -a xxx 重启smaba服务 sudo /etc/init.d/samba-ad-dc restart 发现服务 按Win + R打开运行框,输入\[服务器的IP地址]即可发现服务

在windows的凭证管理器中添加账户信息 开始菜单中搜索凭据管理器,添加Windows凭据。

添加网络映射

添加完成之后的效果

真香~ 2.2.7 设置静态IP 在使用的过程中发现一个问题,就是Ubuntu在使用的过程中出现IP地址变动的问题,于是通过远程桌面查看一下系统的网络配置,是dhcp模式,那么接下来就需要设置一下静态的IP地址。

方法其实挺多的,实际上可以chatgpt一下 打开远程桌面连接服务器,打开系统设置,选择网络连接或者Wi-Fi这一项,然后就像这样:

配置完成之后重启一下网路

sudo systemctl restart NetworkManager 这样就OK啦~

3 训练环境配置 这里主要就是和GPU相关的配置,比如Nvidia显卡驱动,CUDA,cuDNN,Conda环境和Docker配置等等,他们各自的作用分别如下:

CUDA - Compute Unified Device Architecture,并行计算平台和编程模型,用于利用 NVIDIA 的 GPU(图形处理器)进行通用目的的并行计算。它是一组编程接口和工具,使开发者能够利用GPU进行高性能的并行计算任务。 cuDNN - CUDA Deep Neural Network Library,cuDNN 是 NVIDIA提供的针对深度学习任务的 GPU 加速库。它包含了一系列优化过的深度学习算法和函数,可用于加速常见的深度学习操作,如卷积、池化、归一化等。cuDNN可以与CUDA一起使用,为深度学习框架(如 TensorFlow、PyTorch、Caffe 等)提供高效的 GPU 加速支持,从而显著提高深度学习训练和推理的性能。 Conda - 一个开源的包管理器和环境管理系统。它主要用于简化在 Python 环境中安装、管理和升级软件包的过程。它的一个重要特点是能够创建虚拟环境,使不同项目可以拥有独立的依赖和库,避免版本冲突问题。 Docker - Docker 是一种容器化平台,用于构建、运行和分享应用程序的容器。容器是一种轻量级、独立于平台的软件包,包含应用程序及其所有依赖项,可以在任何支持 Docker 的环境中运行。它的另一个优势是它的可移植性,允许将应用程序和环境打包成容器,轻松地在不同的服务器或云服务上部署。 3.1 安装Nvidia显卡驱动 这里可以通过系统的软件与更新来安装

进入图形化桌面,打开Software & Updates软件,选择Additional Drivers标签。

选择第一个驱动,然后点击Apply Changes,等待安装完成,完成后按照提示重启服务器。

更新软件系统 sudo apt update sudo apt upgrade 这一步会连带Nvidia的驱动一起更新,更新完可能会使用指令nvidia-smi查看

3.2 安装CUDA 下载安装包 驱动安装完成之后,开始安装CUDA,首先去官网下载CUDA的安装包。

下载地址:https://developer.nvidia.com/cuda-11-7-1-download-archive

安装 chmod +x cuda_11.0.2_450.51.05_linux.run sudo sh ./cuda_11.0.2_450.51.05_linux.run 注意事项 在安装过程中需要注意按空格的时候慢一点,中间需要填写yes,路径选择等。特别时在安装cuda时,取消下面这个位置的选择。然后选择Install。

配置环境变量 打开.bashrc

vim ~/.bashrc 在文件结束添加以下内容并保存

export PATH=/usr/local/cuda-11.7/bin${PATH:+:${PATH}} export LD_LIBRARY_PATH=/usr/local/cuda-11.7/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} 然后使其生效

source ~/.bashrc 查看是否生效

nvcc -V 如果一切正常的话,那么会出现以下信息:

3.3 安装cuDNN 下载cuDNN 下载链接:https://developer.nvidia.com/rdp/cudnn-download

注意:这里下载的时候需要完成注册登录 下载完成后解压缩文件 tar -xzvf cudnn-linux-x86_64-8.9.3.28_cuda11-archive.tar 修改文件夹权限 cd /usr/local/cuda sudo chmod 666 include 文件配置 sudo cp cudnn--archive/include/cudnn.h /usr/local/cuda/include sudo cp cudnn--archive/lib/libcudnn /usr/local/cuda/lib64 sudo chmod a+r /usr/local/cuda/include/cudnn*.h /usr/local/cuda/lib64/libcudnn* 验证是否安装成功 sudo cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2 查看存在这些信息表明安装配置成功

版本信息为8.9.3.

3.4 安装Conda环境 不同训练框架需要不同的python版本,那么如何自由切换呢?一个比较好的方法是给每个配置建立一个虚拟的python环境,在需要的时候可以随时切换,不需要了直接删除即可。

在Anaconda官网下载Linux安装包 下载地址为:https://www.anaconda.com/download

安装 chmod +x Anaconda3-2023.07-1-Linux-x86_64.sh ./Anaconda3-2023.07-1-Linux-x86_64.sh 设置安装路径 和在Windows中的图形化安装有些许不同,在Linux中通过命令行安装.

安装完成之后,重启终端,安装成功的情况下,在前面会存在(base)标识。

3.5 安装Nvidia-Docker环境 Docker也是虚拟化环境的神器,前面说的conda虽然可以提供python的虚拟环境并方便地切换,但是有的时候我们的开发环境并不只是用到python,比如有的native库需要对应gcc版本的编译环境,或者进行交叉编译时哟啊安装很多工具链等等。如果这些操作都在服务器本地上进行,那时间久了就会让服务器的文件系统非常杂乱,而且还会遇到各种软件版本冲突问题。 Docker就可以很好地解决这些问题,它其实可以理解为就是一个非常轻量化的虚拟机,我们可以在宿主服务器上新建很多个这种被称为容器的虚拟机,然后在里面配置我们的开发环境,且这些配置好的环境是可以打包成镜像的,方便随时做分享和重用;不需要的时候,我们直接删除容器就好了,其资源是和我们的服务器宿主机完全隔离的。 docker安装 sudo apt-get update sudo apt-get install docker.io systemctl start docker systemctl enable docker 查看是否安装成功 docker version 安装NVIDIA Container Toolkit 直接执行下面指令即可

2. 添加源

distribution=$(. /etc/os-release;echo $ID$VERSION_ID) ​ curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - ​ curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list

2. 安装并重启

sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit sudo systemctl restart docker 查看在docker中是否可以调用GPU nvidia-smi

4 测试 环境都配置好了之后,可以测试一下是否配置好。

4.1 本地Conda环境 先用conda新建一个python3.8+pytorch1.7+cuda11.0的虚拟环境 conda create --name python_38-pytorch_1.7.0 python=3.8 查看当前已创建的虚拟环境 conda env list 创建完成后进入环境 conda activate python_38-pytorch_1.7.0 检查是否切换到所需环境 which pip 安装pytorch pip install torch==1.7.0+cu110 torchvision==0.8.1+cu110 torchaudio===0.7.0 -f https://download.pytorch.org/whl/torch_stable.html

环境配置就完成了,下面新建一个简单ls的测试脚本验证功能,新建mnist_train.py,内容如下:

import torch import torch.nn as nn import torch.nn.functional as F import torch.optim as optim import torch.backends.cudnn as cudnn from torchvision import datasets, transforms ​ class Net(nn.Module): def init(self): super(Net, self).init() self.conv1 = nn.Conv2d(1, 10, kernel_size=5) self.conv2 = nn.Conv2d(10, 20, kernel_size=5) self.conv2_drop = nn.Dropout2d() self.fc1 = nn.Linear(320, 50) self.fc2 = nn.Linear(50, 10) ​ def forward(self, x): x = F.relu(F.max_pool2d(self.conv1(x), 2)) x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2)) x = x.view(-1, 320) x = F.relu(self.fc1(x)) x = F.dropout(x, training=self.training) x = self.fc2(x) return F.log_softmax(x, dim=1) ​ def train(model, device, train_loader, optimizer, epoch, save_interval): model.train() for batch_idx, (data, target) in enumerate(train_loader): data, target = data.to(device), target.to(device) optimizer.zero_grad() output = model(data) loss = F.nll_loss(output, target) loss.backward() optimizer.step() if batch_idx % 10 == 0: print('Train Epoch: {} [{}/{} ({:.0f}%)]\tLoss: {:.6f}'.format( epoch, batch_idx * len(data), len(train_loader.dataset), 100. * batch_idx / len(train_loader), loss.item())) # 保存模型 if epoch % save_interval == 0: torch.save(model.state_dict(), f'model_epoch_{epoch}.pth') ​ def main(): cudnn.benchmark = True torch.manual_seed(1) device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") print("Using device: {}".format(device)) kwargs = {'num_workers': 1, 'pin_memory': True} train_loader = torch.utils.data.DataLoader( datasets.MNIST('./data', train=True, download=True, transform=transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ])), batch_size=64, shuffle=True, **kwargs) ​ model = Net().to(device) optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5) save_interval = 1 # 每隔多少个 epoch 保存一次模型 for epoch in range(1, 11): train(model, device, train_loader, optimizer, epoch, save_interval) ​ if name == 'main': main()

编写一个程序对模型进行调用和测试

import torch import torch.nn as nn import torch.nn.functional as F from torchvision import transforms from PIL import Image import os ​ device = torch.device("cuda") if torch.cuda.is_available() else torch.device("cpu") ​ class Net(nn.Module): def init(self): # 定义与训练模型相同的网络结构 # 请确保与训练时的模型结构一致 # 在这里添加与训练模型相同的层和结构 super(Net, self).init() self.conv1 = nn.Conv2d(1, 10, kernel_size=5) self.conv2 = nn.Conv2d(10, 20, kernel_size=5) self.conv2_drop = nn.Dropout2d() self.fc1 = nn.Linear(320, 50) self.fc2 = nn.Linear(50, 10) ​ def forward(self, x): x = F.relu(F.max_pool2d(self.conv1(x), 2)) x = F.relu(F.max_pool2d(self.conv2_drop(self.conv2(x)), 2)) x = x.view(-1, 320) x = F.relu(self.fc1(x)) x = F.dropout(x, training=self.training) x = self.fc2(x) return F.log_softmax(x, dim=1) ​ model = Net().to(device) ​

指定已保存模型的文件路径

model_path = 'model_final.pth' ​

加载模型权重和参数

model.load_state_dict(torch.load(model_path, map_location=device)) ​

将模型设置为评估模式(不进行梯度计算)

model.eval() ​ def predict_digit(image_path, model): # 打开图像文件并进行预处理 with Image.open(image_path) as img: transform = transforms.Compose([ transforms.Grayscale(num_output_channels=1), # 转换为灰度图像 transforms.Resize((28, 28)), # 调整图像大小为28x28像素 transforms.ToTensor(), # 转换为张量 transforms.Normalize((0.1307,), (0.3081,)) # 标准化 ]) img = transform(img).unsqueeze(0).to(device) # 添加批次维度并移动到设备 ​ # 使用模型进行推理 with torch.no_grad(): output = model(img) ​ # 获取模型的预测结果 _, predicted = torch.max(output, 1) ​ # 返回预测的数字 return predicted.item() ​ image_folder_path = './' # 替换为包含图像文件的文件夹路径 ​ for filename in os.listdir(image_folder_path): if filename.endswith('.png') or filename.endswith('.jpg'): image_path = os.path.join(image_folder_path, filename) predicted_digit = predict_digit(image_path, model) print(f'Image: {filename}, Predicted Digit: {predicted_digit}') 在当前目录下面存放几张手写的数字图片,运行上述代码之后成功之后结果如下:

4.2 Docker环境 新建一个Docker镜像。

sudo docker run -it --name train_mnist
-v /etc/timezone:/etc/timezone
-v /etc/localtime:/etc/localtime
-v /home/panghong/WorkSpace/_share:/home/workspace/_share
--gpus all nvidia/cuda:11.7-base 5 工作站维护篇 5.1 备份 由于Linux本身万物皆文件的设计理念,加上root用户对几乎全部的系统文件都有访问和更改的权限,因此Linux系统的备份和还原其实非常简单,我们直接打包整个根文件系统就可以了。

我们可以使用tar命令来打包并压缩文件系统,不过这里在打包的过程中需要排除一些不需要文件,或者与新系统文件冲突的文件,包括/tmp、/proc、/lost+found 等目录。

找一个你想保存备份文件的目录,运行下面的命令:

tar -cvpzf ubuntu_backup@date +%Y-%m+%d.tar.gz --exclude=/proc --exclude=/tmp --exclude=/boot --exclude=/lost+found --exclude=/media --exclude=/mnt --exclude=/run / 我们会得到一个名为backup.tgz的压缩文件,这个文件包含我们需要备份的系统的全部内容。

5.2 还原 如果系统没有出问题可以正常启动的话,那直接在刚刚的压缩包找找到想还原的文件替换就好了。而如果系统无法启动了,或者说想换一块硬盘克隆一样的系统,那么可以按一下步骤操作:

重装干净的Ubuntu系统。跟上面介绍的一样,使用U盘给目标磁盘重装一个干净的系统,这一步是为了省去自己分配存储空间和挂载的麻烦,如果你会自己配置的话那也可以不做这一步。 再次使用U盘进入系统,这次选择try ubuntu without installing,然后可以看到挂载好的刚刚安装了干净系统的另一个盘,我们在这里对盘里的根文件系统进行一些文件的提取: sudo su ​

在tryUbuntu根目录下有media文件夹,里面是U盘文件夹和新安装的系统文件夹,在在里分别用(U盘)和(UBUNTU)表示

cd /media/(U盘) mount -o remount rw ./

将新系统根目录下/boot/grub/grub.cfg文件备份到U盘中

sudo cp /media/(Ubuntu)/boot/grub/grub.cfg ./

将新系统根目录下/etc/fstab文件备份到U盘中,fstab是与系统开机挂载有关的文件,grub.cfg是与开机引导有关的文件,所以这一步至关重要

sudo cp /media/(UBUNTU)/etc/fstab ./

这一步删除新装ubuntu全部的系统文件,有用的fstab及grub.cfg已经备份

cd /media/(UBUNTU) sudo rm -rf ./*

将U盘中backup.tgz复制到该目录下并解压缩

cp /media/(U盘)/backup.tgz ./ sudo tar xvpfz backup.tgz ./

创建打包系统时排除的文件

sudo mkdir proc lost+found mnt sys media 这一步完成后,在用我们在新系统中备份的fatab及grub.cfg 文件去替换压缩包中解压出来的同名文件,sudo reboot重启后就发现系统已经恢复到备份时的状态,包括各种框架,环境,系统设置~

4.3 磁盘挂载 我们通过dh -hl指令来查看磁盘使用情况时,通常只会显示已经挂载的文件系统信息。因为我们的系统是安装在SSD固态硬盘上,机械硬盘是没有挂载的,因此无法显示机械硬盘的信息。我们要使用机械硬盘来存储一些比较大的数据时,就需要进行挂载操作。

查看可用的磁盘 lsblk

我这里是已经挂载好的,机械硬盘通常会以类似于/dev/saX的形式出现,其中X表示的是字母,代表不同的磁盘。

创建文件系统 使用mkfs命令来创建文件系统

sudo mkfs.ext4 /dev/sda 创建一个挂载点 需要选择一个目录作为机械硬盘的挂载点,例如挂载到/mnt目录下面的一个新目录mydhh中

sudo mkdir /mnt/myhdd 挂载机械硬盘 sudo mount /dec/sda /mnt/myhdd 自动挂载 如果希望机械硬盘在系统启动时自动挂载,需要将相关的信息添加到/etc/fstab文件中,需要在文件末尾添加如下信息

/dev/sda /mnt/myhdd ext4 defaults 0 0 添加完成之后保存退出即可。

5 总结 实际操作部分到此就结束了,下面对全文进行总结。

首先所谓的GPU深度学习服务站本质上还是一台服务器,一台经过特殊配置的专门用于支持深度学习和机器学习任务服务器。深度学习任务通常需要大量的计算资源,包括高性能的CPU和GPU、大容量的内存和存储,以及优化的软件框架来加速神经网络的训练和推理过程。这些服务器通常用于研究、开发和部署深度学习模型,以解决各种人工智能任务,如图像识别、自然语言处理、语音识别等。为了满足以上功能,那所谓服务器的需求如下所示:

强大的GPU:深度学习任务通常使用GPU来加速神经网络的训练。因此,深度学习服务器通常配备高性能的GPU,如NVIDIA的CUDA-enabled GPU,用于并行计算。那我们自己使用的话当然是需要考虑性价比,在个人承受能力范围内在性能和价位上做取舍。 大内存和存储:深度学习任务可能需要大量的内存来存储模型参数和中间数据。服务器通常具有大容量的RAM和高速的存储设备,如SSD。 高性能的CPU:虽然GPU在深度学习中扮演重要角色,但服务器通常也配备高性能的多核CPU,用于处理数据预处理、数据加载和一些计算密集型任务。 高速网络连接:服务器通常需要高速网络连接,以便从外部数据源加载数据,或者用于分布式深度学习任务的模型训练。 深度学习框架支持:深度学习服务器通常预安装和配置了流行的深度学习框架,如TensorFlow、PyTorch、Keras等,以简化开发和训练深度学习模型的过程。 远程管理和监控:深度学习服务器通常需要远程管理和监控功能,以便管理员可以远程访问服务器、监视资源利用率和性能,以及进行维护和故障排除。 因此,基于上述要求,文章介绍了硬件的选择,当然作者的能力有限,配置比较一般,同学们可根据自己的能力去选择更好的硬件配置。其次介绍了操作系统的选择,以及基本的软件工具,包括SSH,远程桌面,内网传统,SMB服务器等基础功能配置。同时介绍了用于深度学习任务的工具和环境配置,例如Nvidia的显卡驱动,Cuda ,cuDNN,Conda环境, Docker环境等等。同时还介绍了工作站的备份,还原等功能实现。最后介绍了磁盘挂载功能,总的来说有过程还是稍微有一丢丢繁琐,中间也可能遇到很多莫名其妙的问题,但拥有一台个人随时可用的机器还是很香的。

以上就是本文的全部内容啦~,见识浅薄,经供参考,希望本文对大家有帮助。

—— 2023.10.30 武汉 秋

6 参考资料 [1] https://www.zhihu.com/people/zhi-hui-64-54/posts

[2] https://zhuanlan.zhihu.com/p/581720480

[3] https://www.cnblogs.com/pipci/p/163