基于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是系統級:

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命令:

能出來這個界面就算是安裝成功了!
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
移除共享檔案夾:
sudo lxc config device remove <container> <device-name>
然后我們進入容器,可以看到/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 setup.py install
- 運行程式
# 啟動:
python3 run.py start
# 或者使用CLI啟動:
lxdui start
# 后臺運行
nohup python3 run.py start > python.log3 2>&1 &
- 管理界面
啟動成功后,可以瀏覽器訪問宿主機ip:15151

用戶名密碼默認均是:admin

然后就可以看到可視化界面了,是不是很安逸~

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支持遠程桌面和本機電腦粘貼板互傳,使用起來還是很方便的,

六、結束撒花🎉
如果我的文章有給你一些幫助,請給我一個點贊👍吧!如果有任何問題,可以留言相互交流,關于部署應用服務器的搭建可以看我之前發的文章,祝搭建順利!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/299912.html
標籤:AI
