课题组一台新的服务器,希望使用esxi平台让服务器的运维更加方便。从最开始动手到成功跑通pytorch前前后后花了四天时间,在网上搜索了很多教程,每个教程都一步步来还是在显卡直通上遇到问题并且网上类似问题的解决方法都无效,最后还是误打误撞解决了显卡直通这个大麻烦,所以记录一下。
当时安装没有经验,边看教程边装,因此没有图片记录,可以参考这篇文章:ESXI安装
使用rufus制作启动盘:Rufus中文官网
服务器的显卡型号为Nvidia L40,esxi7.0u3的硬件管理识别不了,不确定是否对显卡直通有影响,但是尽可能排除所有不对劲的地方
通过shell登陆宿主机更新esxi8.0u2版本之后显卡型号正常识别(直接shell更新就好,更新完重新引导一下就ok)
在sysin下载,仅需要以depot结尾的更新包版(地址就不放了,百度可以找到)
首先进入维护模式
然后就可以进行升级操作,需要先打开宿主机的SSH服务,在通过shell登陆,这里用Xshell登陆
``
#第一步 [root@localhost:~] esxcli software sources profile list -d /vmfs/volumes/data1/ESXi-7.0U3m-21686933-standard-depot.zip Name Vendor Acceptance Level Creation Time Modification Time ----------------------------- --------- ------------------ ------------------- ----------------- ESXi-7.0U3m-21686933-standard sysin.org CommunitySupported 2023-05-03T00:00:00 2023-05-03T00:00:00 #第二步,选择版本 esxcli software profile update -d /vmfs/volumes/data1/ESXi-7.0U3m-21686933-standard-depot.zip -p ESXi-7.0U3m-21686933-standard #更新完毕后重新引导宿主机即可 如果显卡并非直通状态,需要在宿主机硬件里将显卡的直通切换为活动
选择预留内存,不然会出现问题
一定要选择EFI引导,并且取消勾选安全引导
虚拟机推荐使用带有图形化界面的版本,有些设置在图形化界面操作很简单,用命令行就很麻烦,比如后边的硬盘扩容操作。再添加PCI设备以及添加参数,pciPassthru.64bitMMIOSizeGB填多少我也没弄明白,但是填这么多能行,填小了可能出现模块“DevicePowerOn”打开电源失败错误
pciPassthru.64bitMMIOSizeGB = 144 pciPassthru.use64bitMMIO = TRUE 设置虚拟机网络:
如果在虚拟机中使用lspci | grep -i nvidia不显示显卡型号,可以试试sudo update-pciids更新显卡信息

服务器中有两张L40 GPU,我们的需求是两台虚拟机一台一块GPU,因此最开始我进行显卡直通时一直是添加一块GPU进行直通,给虚拟机装好nvidia驱动,包括各种版本的、各种安装方式都试过,有些版本低的驱动使用.run文件安装会提示内核版本不匹配,这个弄起来挺麻烦(而且也没解决问题)。新版驱动装起来没有报什么错误,不过使用nvidia-smi命令时一直提示no devices were found,百度以及reddit、nvidia论坛上找了各种方法都没有用,后来误打误撞将两块显卡都加入一台虚拟机,突然nvidia-smi就正常了,再将其中一张显卡去掉之后nvidia-smi正常输出,新建另一台虚拟机只添加一块显卡nvidia-smi依旧正常输出,算是误打误撞解决了这个问题(也不清楚是什么原理)。
使用.run文件进行nvidia驱动的安装,可以去英伟达官网下载对应驱动,在网页下方试用版和旧版驱动可以下载到稍微老点的版本英伟达官方驱动
首先需要确定nouveau已经关闭
lsmod | grep nouveau 如果无任何输出就可以跳过这步,如果有输出:
就按如下步骤禁用nouveau
#编辑blacklist.conf文件 sudo nano /etc/modprobe.d/blacklist.conf #加入下两行 blacklist nouveau options nouveau modeset=0 # #更新内核initramfs sudo update-initramfs -u #重启 sudo reboot #无输出即成功 lsmod | grep nouveau 接下来正式安装驱动,需要将驱动文件通过ssh上传至虚拟机
#更改驱动的权限,否则无法安装 sudo chmod a+x NVIDIA-Linux-x86_64-550.54.15.run #-m=kernel-open加上,一些解决方案里说这个可能会影响nvidia-smi是否能找到设备,最好加上 ./NVIDIA-Linux-x86_64-550.54.15.run -m=kernel-open 

安装gcc及make
sudo apt-get install gcc make 这里选择no,64位系统应该不需要这个,吧
选择ok就可以
安装完毕,ok
测试nvidia-smi是否有输出:
来cuda官网寻找合适的cuda版本,我选择nvidia-smi里显示的12.4版本(后续可以选择安装cuda=12.1版本的pytorch,不影响使用可以向下兼容,至少目前没出问题)
这里我选择runfile安装方式:
wget https://developer.download.nvidia.com/compute/cuda/12.4.1/local_installers/cuda_12.4.1_550.54.15_linux.runsudo sh cuda_12.4.1_550.54.15_linux.run 因为已经装过驱动,因此取消勾选Driver这一项,然后选择Install回车
等待安装完成就行
如果觉得创建虚拟机时给的系统盘过小,可以进行扩容,首先在esxi网页端添加容量(需要关闭虚拟机先)。这里原本是32GB,已经改至256GB:
添加完毕打开虚拟机进入shell输入lsblk查看分区情况,图示已扩容完毕,刚加完容量应该还会有一个sda3分区
打开虚拟机的图形化界面,安装使用图形化分区工具gparted
sudo apt-get install gparted sudo gparted 打开后unallocated这里会是刚刚添加的容量,右键/dev/sda2即原本的系统盘——resize/move——添加所有的unallocated容量,最后还是会剩1MB空间无法分配是正常现象。然后右上角打钩就完成系统盘扩容了。注意:硬盘1的容量只能添加给硬盘1的其他分区,如果在虚拟机设置里添加了一块新的硬盘如硬盘2,则硬盘2的容量不能分给硬盘1的分区。
除了系统盘之外,还可以添加新硬盘来存放数据等,后续也可以按照上一小节进行扩容:
新加入的硬盘需要分区以及格式化,否则无法使用:
#新加的硬盘分个区,硬盘1就是sda,硬盘2就是sdb,硬盘3就是sdc,应该是这样,这里是sdb fdisk /dev/sdb 
#重新搜索分区 sudo partprobe #查看分区文件系统 df -Th #格式化分区(其他文件系统格式化方法自行百度) sudo mkfs.ext4 /dev/sdb1 硬盘添加完毕,进行挂载,否则无法使用:
#新建挂载点 sudo mkdir /nfs #读写挂载 sudo mount -o rw /dev/sdb1 /nfs #格式化分区(其他文件系统格式化方法自行百度) sudo mkfs.ext4 /dev/sdb1 #更改nfs权限为所有用户可修改,否则就算读写挂载一样无法写入 sudo chmod -R 777 /nfs 自动挂载:
#查看分区uuid wzykdx@wzykdx-virtual-machine:~$ blkid /dev/sdb1 /dev/sdb1: UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="ext4" PARTUUID="xxxxxxxx-xx" #编辑fstab nano /etc/fstab #在文件结尾添加 UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx /nfs ext4 defaults 0 2 #Ctrl+O保存,回车确认文件名,Ctrl+X退出即可 Anaconda官网下载好.sh文件,如安装nvidia驱动一样更改权限,然后直接sh Anaconda3-xxx.sh安装即可,安装路径最好指定为上边挂载的nfs,不然会占用一部分系统盘空间,后期比较难清理。如果安装时跳过了初始化,需要自己设置环境变量
nano ~/.bashrc #最后一行加入安装位置 export PATH="XXX/anaconda3/bin:$PATH" conda config #清华镜像源 channels: - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/ - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ - https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ - https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/pytorch/ show_channel_urls: true envs_dirs: - /nfs/wzykdx/anaconda3/envs pkgs_dirs: - /nfs/wzykdx/anaconda3/pkgs 累死我了