基于LXD搭建多人共用GPU伺服器
- 一、引言
- 二、方案對比
-
- 2.1 單使用者
- 2.2 多使用者
- 2.3 KVM虛拟機
- 2.4 Docker
- 2.5 LXC
- 2.6 LXD
- 2.7 OpenPAI
- LXD最終能實作什麼
- 三、安裝與配置
-
- 3.1 安裝顯示卡驅動
- 3.2 安裝LXD、ZFS和Bridge-utils:
- 3.3 配置存儲池
- 3.4 初始化LXD
- 3.5 建立容器
- 3.6 配置容器
-
- 3.6.1 共享檔案夾
- 3.6.2 安裝顯示卡驅動
- 3.6.3 配置網絡
- 四、容器管理
-
- 4.1 zfs
- 4.2 容器參數
- 4.3 可視化界面
- 4.3 容器快照
- 4.4 容器鏡像
- 五、使用者手冊
-
- 5.1 SSH
- 5.2 X11-Forwarding
- 5.3 遠端桌面
- 六、結束撒花🎉
一、引言
随着人工智能技術的發展,越來越多的團隊開始邁入了人工智能領域。而研究人工智能技術必不可少的就是擁有一台配置較高的GPU伺服器。目前半導體價格日益趨增,顯示卡價格更是因為虛拟貨币居高不下。這就導緻了一個團隊中必然會面對多人共用一台GPU伺服器的情況,但是每個人的使用方式和操作習慣都不一樣,對于系統的軟體、環境、檔案、配置等要求也各不相同,甚至還有小白運作損害系統的指令。那麼如何讓多人井井有條的共用伺服器,還不影響伺服器性能呢?那就是通過虛拟化容器技術來隔離每個人的作業系統,并通過共享檔案夾的形式達到多人共用的資料資源。
二、方案對比
伺服器簡單來說還是一台高性能的主機而已,那伺服器上裝完作業系統後大家怎麼同時使用就成了一個問題。通常大家的做法如下:
2.1 單使用者
即大家都使用同一個使用者來使用伺服器,這樣會導緻每個使用者檔案都存放在一起,太亂且容易誤删;一個使用者更改系統環境後會影響到其他使用者使用,比如CUDA版本等;多個使用者之間不能友善的協調管理;
2.2 多使用者
多使用者管理雖然可以解決每個人的檔案存儲管理問題,但仍然會導緻每個人都有可能修改系統環境和配置影響其他使用者使用。并且如果某人将系統損壞所有人都将受到影響。
2.3 KVM虛拟機
虛拟機可以通過軟體模拟的具有完整硬體系統功能的、運作在一個完全隔離環境中的完整計算機系統。可以達到我們想要的系統隔離效果, 但使用虛拟機會浪費一定資源用于硬體虛拟化,且硬體隻能獨占,不能共享,資源使用率低。
2.4 Docker
雖然是容器化的環境,但Docker是應用級容器,他更偏向于PaaS平台,還是沒辦法做到讓每個使用者擁有一個獨立的作業系統。
2.5 LXC
系統級虛拟化方案,用在單個主機上運作多個隔離的Linux系統容器。但LXC也有缺點:如無法有效支援跨主機之間的容器遷移、管理複雜等。而LXD很好地解決了這些問題。
LXC與Docker的差別可以看這張圖,主要就是Docker是應用級,LXC是系統級:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiNx8FesU2cfdGLwczX0xiRGZkRGZ0Xy9GbvNGLwYzXlpXazxCRHFXN10GN1UVLxVTQClGVF5UMR9Fd4VGdsATNfd3bkFGazxycykFaKdkYzZUbapXNXlleSdVY2pESa9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLlFDZ2IzNhRzNmFGMmJWYhBTY4QDN0UTZjBDO2MDM0kzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
2.6 LXD
LXD底層也是使用LXC技術,并可以提供更多靈活性和功能。是以LXD可以視作LXC的更新版。LXD的管理指令和LXC的管理指令大多相同。
2.7 OpenPAI
微軟先進的任務隔離方法,主要适用于任務型隔離,比較适合叢集化部署,人數較多的使用場景。
基于上面常見的七種方法,能擁有系統級隔離、容器化成本最低、操作友善簡單的方案就是使用:LXD了。
LXD最終能實作什麼
- 每個使用者都有用了獨立的系統以及所有權限,但不被允許之間操作主控端;
- 每個容器擁有可以在區域網路内通路的獨立IP位址,使用者可以使用SSH友善地通路自己的“機器”;
- 所有使用者都可以使用所有的資源,包括CPU、GPU、硬碟、記憶體等;
- 可以建立共享檔案夾,将共用資料集、模型、安裝檔案等進行共享,減少硬碟浪費;
- 可以安裝圖形化桌面進行遠端操作;
- 容器與主控端使用同一個核心,性能損失小;
- 輕量級隔離,每個容器擁有自己的系統互不影響;
- 容器可以共享地使用主控端的所有計算資源。
LXD也有缺點:
- 顯示卡驅動不友善更新;
- 容器與主控端共同核心,一個容器核心出錯,全體爆炸。
三、安裝與配置
伺服器系統還沒裝好的的可以參考我的這篇文章:Dell伺服器配置與安裝Ubuntu Server20.04作業系統,超詳細!
先介紹一下我操作的這台伺服器環境:
顯示卡: GTX 3090
CPU: i9-10900X
主機闆: Asus Pro WS X299 SAGE II
系統版本: Ubuntu 20.04 LTS
3.1 安裝顯示卡驅動
系統安裝好後,先将顯示卡驅動做好,如果你本身裝的不是Server版的系統,則會自帶Nouveau桌面程式,它會在系統啟動的時候預設啟動,我們裝顯示卡驅動要解除安裝禁止掉所有驅動,包括Nouveau。
- 解除安裝舊驅動:
sudo apt-get purge nvidia*
sudo apt-get autoremove
sudo reboot
- 禁止Nouveau:
sudo vim /etc/modprobe.d/blacklist.conf
# 在檔案最後增加下面兩行:
blacklist nouveau
options nouveau modeset=0
- 更新重新開機
sudo update-initramfs -u
- 檢查禁止是否成功
lsmod | grep nouveau
如果沒有任何輸出則代表禁止成功。
sudo -i
systemctl isolate multi-user.target
modprobe -r nvidia-drm
取得超級權限,關閉所有NVIDIA驅動。
-
安裝顯示卡驅動
注意,這裡建議用其他電腦ssh遠端操作,因為如果你要直接顯示器操作還需要切換到指令行界面需要用到lightdm,比較麻煩。
sudo chmod a+x NVIDIA-Linux-x86_64-470.63.01.run
sudo ./NVIDIA-Linux-x86_64-470.63.01.run -no-x-check -no-nouveau-check -no-opengl-files
安裝過程中除了這個界面需要選擇Yes,其他都預設即可。
-
檢查是否安裝成功
輸入:
指令:nvidia-smi
能出來這個界面就算是安裝成功了!基于LXD搭建多人共用GPU伺服器,簡單易用,全網最詳細!一、引言二、方案對比三、安裝與配置四、容器管理五、使用者手冊六、結束撒花🎉
3.2 安裝LXD、ZFS和Bridge-utils:
sudo apt-get install lxd zfsutils-linux bridge-utils
LXD 實作虛拟化容器
ZFS 用于管理實體磁盤,支援LXD進階功能
Bridge-utils 用于搭建網橋
3.3 配置存儲池
安裝完軟體後,我們要選一塊區域來存儲LXD所使用的空間。我們可以在一個磁盤上分出一塊分區,也可以把整個磁盤作為存儲池。我們先看一下磁盤情況:
sudo fdisk -l
:
找到你想操作的磁盤,如這裡的/dev/sda,可以直接
sudo fdisk /dev/sda
來對磁盤進行分區,fdisk指令如果不記得可以輸入
m
檢視幫助說明:
主要用到的就是我下面标注出來的這幾個指令
如果已經有分區了,可以輸入
d
删除分區,然後輸入
n
建立分區,最後
w
儲存分區就可以了,我這裡選擇/dev/sda磁盤下的
/dev/sda1
分區作為我的zfs存儲池。
3.4 初始化LXD
執行:
sudo lxd init
LXD初始化腳本将詢問你存儲、網絡、容器各種配置項的預設值:
Would you like to use LXD clustering? (yes/no) [default=no]:
Do you want to configure a new storage pool? (yes/no) [default=yes]: yes
Name of the new storage pool [default=default]: default
Name of the storage backend to use (btrfs, dir, lvm, zfs) [default=zfs]: zfs
Create a new ZFS pool? (yes/no) [default=yes]: yes
Would you like to use an existing block device? (yes/no) [default=no]: yes
# 這裡輸入我們剛剛做的分區
Path to the existing block device:/dev/sda1
# 每個容器的預設大小
Size in GB of the new loop device (1GB minimum) [default=30GB]: 1024G
Would you like to connect to a MAAS server? (yes/no) [default=no]:
# 是否建立橋接網絡
Would you like to create a new local network bridge? (yes/no) [default=yes]: yes
What should the new bridge be called? [default=lxdbr0]: lxdbr0
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: auto
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: auto
Would you like the LXD server to be available over the network? (yes/no) [default=no]:
Would you like stale cached images to be updated automatically? (yes/no) [default=yes]
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]:
網絡配置那裡有兩種方式,一種是全部走一個公網,容器都是區域網路ip,通路每個容器都需要通過唯一的公網IP+端口号的形式,也就是我上面采用的方式。還有一種形式是不建立橋接網絡,直接讓所有容器都擷取上遊獨立ip,相當于每個容器都能夠擷取獨立ip。我這邊是隻有一個公網,是以采用了這種方式,你可以根據自己需求修改這裡的網絡配置。
相關配置輸入錯了也沒關系,可以通過
sudo lxc profile edit default
或者再運作一遍
sudo lxd init
來再次修改配置:
3.5 建立容器
所有準備工作準備齊全後就可以來建立容器了,和Docker的使用方式很類似,我們先選個鏡像,我這裡選擇Ubuntu 20.04,然後直接通過launch指令啟動容器(如果本機鏡像找不到則會去網上自動下載下傳并使用):
lxc launch ubuntu:20.04 tf
tf是我容器的名字,啟動成功後,我們可以通過
lxc list
指令檢視現在運作的容器:
通過
lxc image ls
檢視本機已有的鏡像:
通過
lxc exec tf bash
可以進入容器内進行操作:
exit
:退出容器
lxc stop tf
:停止容器
lxc delete tf
:删除容器
lxc restart tf
:重新開機容器
3.6 配置容器
現在容器已經建立好了,我們也可以進去了,現在還需要做三件事才可以讓其他夥伴使用:
3.6.1 共享檔案夾
想往容器裡傳輸檔案,有兩種方式,一種是你可以直接使用指令把單個檔案傳送給容器:
# 複制檔案夾需要在最後加 -r
sudo lxc file push <source path> <container>/<path> # 表示從主控端複制檔案到容器
sudo lxc file pull <container>/<path> <target path> # 表示将容器的檔案複制到主控端
還有一種方式是在主控端建立個共享檔案夾,然後共享給每個容器。這樣容器之間就可以互相存取檔案,比較适合放一些共用的軟體包和資料集:
sudo lxc config set <container> security.privileged true
sudo lxc config device add <container> <device-name> disk source=/home/xxx/share path=/home/xxx/share
其中 path 為容器路徑,source 為主控端路徑。device-name 随意取名字即可。
# 例子
sudo lxc config device add tf data disk source=/data/lxd-data path=/root/data
移除共享檔案夾:
然後我們進入容器,可以看到
/root/data
檔案夾下就是我們主控端
/data/lxd-data
檔案夾下的檔案了:
3.6.2 安裝顯示卡驅動
-
添加GPU硬體
在主控端中執行以下指令
lxc config device add tf gpu gpu
然後進入容器,安裝顯示卡驅動。驅動程式可以放到主控端的共享檔案裡,這樣進入容器就可以直接使用了。
-
安裝驅動
因為LXD是複用了Linux核心,是以在容器内安裝顯示卡驅動就不用安裝核心了:
sudo sh ./NVIDIA-Linux-x86_64-470.63.01.run --no-kernel-module
安裝過程和主控端一樣,安裝成功後,輸入:
nvidia-smi
可以輸出資訊,則容器内的驅動也裝好啦。
3.6.3 配置網絡
現在東西都有了,我們可以通過端口轉發的形式讓别的小夥伴通過主控端的ip通路到這個容器:
sudo lxc config device add tf proxy1 proxy listen=tcp:10.0.5.11:6002 connect=tcp:10.214.214.169:22 bind=host
sudo lxc config device add tf proxy0 proxy listen=tcp:10.0.5.11:6003 connect=tcp:10.214.214.169:3389 bind=host
主要需要注意的地方是:
tf
是我的容器名,
10.0.5.11
是我主控端的ip,
10.214.214.169
是我容器的ip。每個人占倆端口,分别用來映射ssh的22端口,和rdp協定的3389端口。容器的ip可以通過
lxc list
檢視,本機的ip可以通過
ifconfig
檢視。
這樣都做好後,我們就可以把10.0.5.11:6002 、10.0.5.11:6003 給到小夥伴,讓他遠端通路了。當然,root密碼你如果忘了,可以進入容器通過
passwd root
修改root密碼。如果顯示伺服器拒絕密碼,則可能是ssh預設不接受密碼登入:
vim /etc/ssh/sshd_config
#PermitRootLogin without-password改為
PermitRootLogin yes
#重新開機ssh服務
/etc/init.d/ssh restart
到這一步,其他小夥伴應該是可以遠端通路到這個容器,并開心使用了。
四、容器管理
4.1 zfs
還記得最開始我們配置zfs存儲池嘛,你可以通過
zpool list
、
zfs list -t all
來檢視存儲情況:
4.2 容器參數
通過
lxc config edit tf
配置容器的參數:
配置參數說明:
4.3 可視化界面
這個時候可能有朋友要問了,這配置好繁瑣,這麼多指令參數,有沒有現成的GUI工具可以滑鼠點點就可以操作呢?當然是有,要不然就不會有這段話,因為LXD 在 LXC 基礎上增加了 RESTful API,是以是有基于這個API操作的可視化界面:lxdui。
照着Github倉庫說明安裝就可以了,我這裡貼一下我的操作:
- 檢查Python3和pip是否安裝成功,必須。
- Clone倉庫,并進入目錄:
git clone https://github.com/AdaptiveScale/lxdui.git
cd lxdui
- python3 -m venv mytestenv,建立虛拟環境,可選。
# 激活虛拟環境
source mytestenv/bin/activate
- 安裝依賴包
- 運作程式
# 啟動:
python3 run.py start
# 或者使用CLI啟動:
lxdui start
# 背景運作
nohup python3 run.py start > python.log3 2>&1 &
-
管理界面
啟動成功後,可以浏覽器通路主控端
ip:15151
使用者名密碼預設均是:admin基于LXD搭建多人共用GPU伺服器,簡單易用,全網最詳細!一、引言二、方案對比三、安裝與配置四、容器管理五、使用者手冊六、結束撒花🎉 然後就可以看到可視化界面了,是不是很安逸~基于LXD搭建多人共用GPU伺服器,簡單易用,全網最詳細!一、引言二、方案對比三、安裝與配置四、容器管理五、使用者手冊六、結束撒花🎉 基于LXD搭建多人共用GPU伺服器,簡單易用,全網最詳細!一、引言二、方案對比三、安裝與配置四、容器管理五、使用者手冊六、結束撒花🎉
4.3 容器快照
點選建立容器後會一直轉圈圈,等待即可。建立完的容器預設是關閉的,我們需要打開它。
由于是基于快照建立,原來我們裝好的驅動應用程式都會在,是需要對該容器新增硬體、共享檔案夾、映射端口,就可以達到和快照容器一樣的效果。
配置共享檔案、網絡端口映射和之前一樣,這裡就不再做贅述了。上面使用圖形化界面,有喜歡用指令行的同學也可以使用下面指令,效果都是一樣的:
# 建立快照
sudo lxc snapshot <container> <snapshot name>
# 恢複快照
sudo lxc restore <container> <snapshot name>
# 從快照建立一個容器
sudo lxc copy <source container>/<snapshot name> <destination container>
4.4 容器鏡像
鏡像和快照的不同是,通過鏡像做出來的容器MAC 位址等關鍵資訊也會同樣被複制,并且鏡像也友善儲存與分享。
圖形化界面:進入容器,點選Export,輸入Image别名。
點選Export等待片刻就可以了,點選Images,可以看到已經有了,後面那個五千多GB别慌,是xcdui的bug,其實是MB。
不喜歡圖形化界面用指令也可以:
# 停止容器
sudo lxc stop test
# 建立并儲存image
sudo lxc publish test --alias ubuntudemo --public
# 檢視image
sudo lxc image ls
五、使用者手冊
對于使用者使用來說,每個使用者都可以操作一台幹淨的作業系統(容器),系統本身也是支援SSH、RDP協定的,使用者可以按自己的習慣一樣使用它。總體來說,遠端伺服器有以下三種形式:
5.1 SSH
最常用的遠端操作方式,可以通過指令行視窗執行各種指令及腳本任務。無論你是Windows、Mac、Linux每個作業系統終端都支援了遠端SSH協定,可以使用:
ssh -p 端口号 伺服器使用者名@ip
的格式來遠端連接配接。不過由于系統自帶的終端功能比較簡陋,沒有存儲功能,每次都需要重新輸入連接配接,比較麻煩。是以我們通常使用這些軟體:
- Putty(⭐️)
- Termius(⭐️⭐️⭐️)
- iTerm 2 (⭐️⭐️)
- SecureCRT(⭐️)
- XManager(⭐️⭐️)
當然,現在的IDE如IDEA系列都自帶了SSH連接配接功能,也可以直接使用。我平常會用Termius + VS Code,這裡示範一下VS Code,因為它免費且可以圖形化編輯,支援指令行,并可以直接使用VS Code的插件對伺服器進行管理。首先要在VS Code種安裝
Remote-SSH
插件:
依次點選如下菜單:
分别輸入别名、主機名、使用者名,可以建立多個遠端主機。
點選Connect to host就可以遠端連接配接到伺服器了,VS Code像是在遠端伺服器上運作的軟體,你在這個視窗的所有操作都是針對伺服器的,非常友善易用。
注:如果不想每次連接配接都需要密碼,你可以通過ssh将本地私鑰傳到伺服器上即可免密登陸。
5.2 X11-Forwarding
使用X11-forwarding轉發單個應用的圖形界面,可以下載下傳MobaXterm軟體來操作。
在終端直接輸入執行軟體指令
例如執行
/opt/pycharm-2018.3.4/bin/pycharm.sh
啟動pycharm
5.3 遠端桌面
雖然Linux對桌面支援相對來說都不算太好,但桌面的方式簡單易用深受大衆喜愛。遠端桌面的協定這裡使用微軟的RDP,Window使用者可以直接輸入:
mstsc
指令打開自帶的遠端桌面工具進行連接配接;Mac使用者可以使用:Microsoft Remote Desktop ;Linux使用者則可以使用Remmina。
輸入主控端ip位址+rdp協定端口:
你也可以展開菜單配置相關的選項,點選連接配接
選是即可,也可以勾選不再詢問,區域網路自家人用,沒必要配置證書
連接配接成功,預設使用者名密碼均為:ubuntu
微軟自帶的mstsc支援遠端桌面和本機電腦粘貼闆互傳,使用起來還是很友善的。
六、結束撒花🎉
如果我的文章有給你一些幫助,請給我一個點贊👍吧!如果有任何問題,可以留言互相交流。關于部署應用伺服器的搭建可以看我之前發的文章,祝搭建順利!