其他
【他山之石】保姆级教程:个人深度学习工作站配置指南
“他山之石,可以攻玉”,站在巨人的肩膀才能看得更高,走得更远。在科研的道路上,更需借助东风才能更快前行。为此,我们特别搜集整理了一些实用的代码链接,数据集,软件,编程技巧等,开辟“他山之石”专栏,助你乘风破浪,一路奋勇向前,敬请关注。
地址:https://www.zhihu.com/people/zhi-hui-64-54
0
01
1.1 工作站配置选型
CPU:i9-10920X 显卡GPU:七彩虹RTX3090 Advance 内存:芝奇幻光戟16G x 4共64G 主板:华硕X299-DELUXE PRIME 固态硬盘:1TB西数NVME SSD + 1TB三星870QVO SATA SSD 机械硬盘:希捷EXOS 12TB氦气盘 电源:海盗船AX1200i 1200W模组电源 散热器:海盗船H100X240水冷 + 若干120机箱风扇 机箱:海盗船AIR540 E-ATX机箱
1.2 电脑组装
02
2.1 安装Ubuntu 20.04系统
sudo passwd root
5. 同时为了避免每次sudo都要输入密码,这里配置一下visudo:
sudo visudo
pengzhihui ALL=(ALL) NOPASSWD: ALL
2.2 配置国内镜像软件源
cp /etc/apt/sources.list /etc/apt/sources.list.bak
2. 将源的内容设置为阿里云镜像:
sudo vim /etc/apt/sources.list
内容改为:
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
3. 更新软件列表:
sudo apt update
sudo apt upgrade
2.3 安装Python和pip
sudo apt install python3
sudo apt install python3-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
sudo rm /usr/bin/python
sudo ln -s /usr/bin/python3 /usr/bin/python
sudo ln -s /usr/bin/pip3 /usr/bin/pip
2.4 配置SSH & 远程桌面
sudo apt install ssh
sudo apt install xrdp
sudo systemctl status xrdp
sudo adduser xrdp ssl-cert
sudo systemctl restart xrdp
2.5 安装frp进行内网穿透
可以直接用类似花生壳https://hsk.oray.com/这样的DDNS服务平台做转发实现内网穿透,优点是比较简单稳定,缺点是需要持续付费,而且速度和延迟效果一般,而且每加一个端口都要额外付费。 也可以像我一样使用frp之类的软件做反向代理来实现内网穿透,这个方案也是需要你有一台带公网IP的云服务器的,优点就是完全可控,自己想配置多少个端口的穿透都可以,速度跟你的云服务器带宽有关。
为什么需要多个端口?是因为不同应用占用的端口不同,比如我们的SSH走的是22号端口,而远程桌面的rdp走的是3389号端口,如果需要自建Web服务的话则是走80/443端口、想把工作站作为上外网的代理服务器的话会需要1080端口等等...所以用上面第二个方案显然会方便很多,而且云服务器也不贵,我在腾讯云上购买一年只要200左右。
tar -zxvf frp_0.34.3_linux_amd64.tar.gz
[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
注意,可能需要去云服务器控制台配置安全组规则 开放以上涉及到的端口,否则无法访问。
[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
[Fusion]
Description=Frp Server Daemon
After=syslog.target network.target
Wants=network.target
[Service]
Type=simple
ExecStart=/usr/local/bin/frp/frpc -c /usr/local/bin/frp/frpc.ini # 修改为你的frp实际安装目录
ExecStop=/usr/bin/killall frpc
#启动失败1分钟后再次启动
RestartSec=1min
KillMode=control-group
#重启控制:总是重启
Restart=always
[Install]
WantedBy=multi-user.target
sudo systemctl enable frpc.service
sudo systemctl start frpc.service
sudo systemctl status frpc.service
这里顺便提一下,按照习惯一般把上面的frp软件解压防止在/usr/local/bin目录下。Linux 的软件安装目录是也是有讲究的,理解这一点,在对系统管理是有益的
/usr:系统级的目录,可以理解为C:/Windows/ /usr/lib:可以理解为C:/Windows/System32 /usr/local:用户级的程序目录,可以理解为C:/Progrem Files/,用户自己编译的软件默认会安装到这个目录下 /opt:用户级的程序目录,可以理解为D:/Software,opt有可选的意思,这里可以用于放置第三方大型软件(或游戏),当你不需要时,直接rm -rf掉即可。在硬盘容量不够时,也可将/opt单独挂载到其他磁盘上使用
/usr/src:系统级的源码目录 /usr/local/src:用户级的源码目录。
2.6 安装SAMBA服务
sudo apt-get install samba samba-common-bin
sudo nano /etc/samba/smb.conf
在最后一行后面加入:
# 共享文件夹显示的名称
[home]
# 说明信息
comment = Fusion WorkStation Storage
# 可以访问的用户
valid users = pengzhihui,root
# 共享文件的路径
path = /home/pengzhihui/
# 可被其他人看到资源名称(非内容)
browseable = yes
# 可写
writable = yes
# 新建文件的权限为 664
create mask = 0664
# 新建目录的权限为 775
directory mask = 0775
sudo smbpasswd -a pi
sudo /etc/init.d/samba-ad-dc restart
03
3.1 安装Nvidia显卡驱动
sudo apt update
sudo apt upgrade
3.2 安装CUDA
chmod +x cuda_11.0.2_450.51.05_linux.run
sudo sh ./cuda_11.0.2_450.51.05_linux.run
nano ~/.bashrc
export CUDA_HOME=/usr/local/cuda-11.0
export LD_LIBRARY_PATH=${CUDA_HOME}/lib64
export PATH=${CUDA_HOME}/bin:${PATH}
cd ~/Softwares/cuda/NVIDIA_CUDA-11.0_Samples/1_Utilities/deviceQuery
make
./deviceQuery
3.3 安装CuDNN
tar -xzvf cudnn-11.0-linux-x64-v8.0.5.39.tgz
sudo cp cuda/lib64/* /usr/local/cuda-11.0/lib64/
sudo cp cuda/include/* /usr/local/cuda-11.0/include/
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
3.4 安装Conda环境
chmod +x Anaconda3-2020.11-Linux-x86_64.sh
./Anaconda3-2020.11-Linux-x86_64.sh
3.5 安装Nvidia-Docker
以前为了配置nvidia-docker,需要安装完docker之后再安装单独的nvidia docker2,而现在只需要安装nvidia container toolkit即可,更加方便了。
sudo apt-get update
sudo apt-get install docker.io
systemctl start docker
systemctl enable docker
docker version
##首先要确保已经安装了nvidia driver
# 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
sudo docker run -it --name test_nvidia_docker --gpus all nvidia/cuda:11.1-base
其中最后的参数nvidia/cuda:11.1-base 是Nvidia官方的镜像,需要根据工作站主机中实际安装的cuda版本进行修改,版本可以用nvcc -V查看。
3.6 测试
以后的开发过程中一般还是使用Docker的方式来进行更为优雅。
1. 本地Conda环境方式:
conda create --name python_38-pytorch_1.7.0 python=3.8
conda activate python_38-pytorch_1.7.0
which pip
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
环境配置就完成了,下面新建一个简单的测试脚本验证功能,新建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):
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()))
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)
for epoch in range(1, 11):
train(model, device, train_loader, optimizer, epoch)
if __name__ == '__main__':
main()
2. Docker环境方式:
sudo docker run -it --name train_mnist \
-v /etc/timezone:/etc/timezone \
-v /etc/localtime:/etc/localtime \
-v /home/pengzhihui/WorkSpace/_share:/home/workspace/_share \
--gpus all nvidia/cuda:11.1-base
04
4.1 工作站系统备份还原
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的压缩文件,这个文件包含我们需要备份的系统的全部内容。
重装干净的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
以上,后面有更新的话还会继续补充,希望对大家有帮助~
本文目的在于学术交流,并不代表本公众号赞同其观点或对其内容真实性负责,版权归原作者所有,如有侵权请告知删除。
“他山之石”历史文章
整理 Deep Learning 调参 tricks
Tensorflow模型保存方式大汇总
利用Tensorflow构建CNN图像多分类模型及图像参数、数据维度变化情况实例分析
pytorch中optimizer对loss的影响
使用PyTorch 1.6 for Android
神经网络解微分方程实例:三体问题
pytorch 实现双边滤波
编译PyTorch静态库
工业界视频理解解决方案大汇总
动手造轮子-rnn
凭什么相信你,我的CNN模型?关于CNN模型可解释性的思考
c++接口libtorch介绍& vscode+cmake实践
python从零开始构建知识图谱
一文读懂 PyTorch 模型保存与载入
更多他山之石专栏文章,
请点击文章底部“阅读原文”查看
分享、点赞、在看,给个三连击呗!