计算集群涉及的内容较多,建设过程也较为复杂,但在人工智能盛行的今天又尤为重要。这篇文章将从基础开始搭建计算集群(这里不涉及虚拟化和云计算内容),仅供大家参考,若有不当敬请留言。
目录
4.3.6. 使用相应的openldap 认证
5.3.2.3. partition.conf
1. 服务器规划
“凡事预则立,不预则废”,建设人工智能高性能计算集群之前,需要对现有服务器的数量、类型、架构、操作系统类型、存储等信息有所了解;其次需要规划哪些服务器作为登录节点,哪些服务器用于部署用户统一认证服务、时间服务、授权服务、数据服务、控制服务、计算服务等。
目前针对3台分布式存储服务器,10台计算服务器,进行建设计算集群。(这里的存储也可以选择任何一台服务器作为共享存储进行设置)
1.1. 规划服务器用途
ostore1 为NFS服务(ParaStor300S01),仅提供存储,不参与计算等服务。
host10 为登录节点
host1 为用户统一认证服务(OpenLDAP)
host1 为时间服务(NTP)
host1 为授权服务(Munge)
host1、host2 为控制服务(slurmctld)
host1 为数据服务和数据库服务(slurmdbd, Maraiadb)
host[1-10] 均为计算服务(slurmd)
1.2. 查看操作系统类型
cat /etc/redhat-release
由于10台计算服务器系统均基于 Red Hat 系统,所有使用上述命令。如果是其他类型的操作系统可以使用下面的命令:
cat /etc/os-release
1.3. 配置主机名与IP地址映射
设置每台服务器的hostname
hostnamectl set-hostname <主机名>, 这里以host1为例:
hostnamectl set-hostname host1
在每台服务器的/etc/hosts文件中添加主机名与IP地址映射,便于系统在进行名称解析时,直接读取该文件中设置的IP地址和主机名的对应记录。
vim /etc/hosts
1.4. 设置无密码访问
- 在host1服务器中生成密钥
输入下面的命令,一路回车。
ssh-keygen -t ed25519
在hosts的 ~/.ssh/ 目录下生成ed25519密钥对: 私钥文件id_ed25519 和 公钥文件id_ed25519.pub
将公钥添加到 ~/.ssh/authorized_keys 文件中,并设置600权限。
touch ~/.ssh/authorized_keys
cat ~/.ssh/id_ed25519.pub >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
chmod 700 ~/.ssh
这里需要注意几点:
- 为什么要使用touch ~/.ssh/authorized_keys 而不是直接cat ~/.ssh/id_ed25519.pub > ~/.ssh/authorized_keys
主要是为了避免~/.ssh/authorized_keys文件已经存在的情况下,里面的内容遭覆盖。
- 为什么要设置~/.ssh/authorized_keys权限为600 而 ~/.ssh的权限为700
这里主要从安全策略最小化原理考虑,~/.ssh/authorized_keys只需root拥有读写权限即可;而~/.ssh是目录,需要有执行权限。
- 产生~/.ssh/known_hosts
在host1中依次访问其他计算服务器host[2-10], 会提示 ... key fingerprint is ...
Are you sure you want to continue connecting (yes/no)?
输入yes
然后会将其他服务器的 fingerprint 添加到 know_host中
Warning: Permanently added 'host2' (ECDSA) to the list of known hosts.
这样会得到完整的 ~/.ssh/known_hosts
- 同步到其他服务器
将 ~/.ssh 拷贝到其他计算服务器中,并修改文件权限。
以host2计算节点为例:
scp -r ~/.ssh host2:/root/
ssh host2 "chmod 700 /root/.ssh; chmod 600 /root/.ssh/authorized_keys"
至此,无密码访问设置完成。
2. 共享存储配置
这里只介绍基于NFS的共享存储。
2.1. 基于NFS
NFS(Network File System, 网络文件系统),是FreeBSD支持的文件系统中的一种,允许用户访问远程计算机上的文件和目录,并把那些文件和目录当作本地文件和目录对待,允许网络中的计算机之间通过TCP/IP网络共享资源。它适用于Linux与Unix之间实现文件共享,不能实现Linux与Windows间的文件共享功能。
2.1.1 存储节点
-
安装NFS服务
yum install -y epel-release yum install -y nfs-utils rpcbind
-
配置共享目录
/etc/exports
文件在 Linux 系统中用于配置网络文件系统(NFS)的共享,它定义了哪些文件系统可以被远程系统挂载,以及挂载时的权限和选项。
在存储服务器ostore1上,新建目录 /mnt/GPUshare01/home2作为共享存储。
编辑 /etc/exports
vim /etc/exports
内容如下:
/mnt/GPUshare01/home2 12.12.12.1/24(rw,sync,secure,no_root_squash,no_subtree_check,fsid=2)
参数说明:
/mnt/GPUshare01/home2
: 要共享的本地文件系统路径,即将本地的该目录共享出去。
12.12.12.1/24
: 允许访问共享的客户端的网络地址范围。这里指定的是12.12.12.1
到12.12.12.255
的 IP 地址范围(因为/24
表示子网掩码是 255.255.255.0,即前 24 位是网络地址,后 8 位是主机地址),只有这个范围内的客户端才能挂载这个共享。当然如果希望所有的网络地址都可以挂载,这里直接使用*即可(为了安全起见,不建议如此设置)。
(rw,sync,secure,no_root_squash,no_subtree_check,fsid=2)
: 挂载选项,具体含义如下:
rw
: 表示客户端可以读写共享的文件系统,也可以设置为只读模式ro (read only)。sync
: 表示所有操作(包括写操作)都将同步执行,即数据写入磁盘后才认为操作完成。也可以设置为async异步操作。secure
: 表示 NFS 通信将使用安全模式。在这种模式下,NFS 通信可能会因为不支持加密而无法在某些网络配置下工作。如果需要在不安全的网络上使用,可以设置为insecure
。no_root_squash
: 通常,NFS 会将远程的 root 用户映射为 nobody,这是一种安全措施。no_root_squash
选项关闭了这个特性,允许远程的 root 用户以 root 身份访问共享。no_subtree_check
: 通常,NFS 会检查挂载点下的子目录是否也被共享。这个选项关闭了这个检查,可以提高性能,但可能会带来安全风险。fsid=2
: 这是文件系统的唯一标识符。在 NFS 客户端挂载时,可以使用这个标识符来指定挂载的文件系统。
- 启动NFS服务
systemctl start nfs-server.service
systemctl enable nfs-server.service
systemctl enable rpcbind
- 显示共享存储
showmount -e ParaStor300S01
能够看到本地共享的目录,这里的 ParaStor300S01 也就是 ostore1 。
2.1.2 存储节点
在 /etc/hosts 添加: (见 1.3节 )
12.12.12.101 ParaStor300S01
- 安装客户端
yum install -y epel-release
yum install -y nfs-utils
- 查看存储目录
showmount -e ParaStor300S01
- 启动NFS服务
systemctl start nfs-server.service
systemctl enable nfs-server.service
挂载存储并查看
mount -t nfs ParaStor300S01:/mnt/GPUshare01/home2 /home
df -h
- 将挂载命令添加到 /etc/rc.local 让系统启动的时候实现自动挂载
mount -t nfs ParaStor300S01:/mnt/GPUshare01/home2 /home
这里需要注意的是 /etc/rc.local 是/etc/rc.d/rc.local的一个软连接,需要有执行权限。
ln -s /etc/rc.d/rc.local /etc/rc.local
chmod +x /etc/rc.local
至此完成了共享存储设置。
3. 通用配置
这里主要涉及全局账号,防火墙,时间同步,数据库软件服务配置。
-
3.1. 创建全局账号
-
选择 MUNGEUSER组编号 2001
选择 SLURMUSER 组编号 2002
在管理节点和计算节点,分别执行以下命令:
export MUNGEUSER=2001 groupadd -g $MUNGEUSER munge useradd -m -c "MUNGE Uid 'N' Gid Emporium" -d /var/lib/munge -u $MUNGEUSER -g munge -s /sbin/nologin munge export SLURMUSER=2002 groupadd -g $SLURMUSER slurm useradd -m -c "SLURM workload manager" -d /var/lib/slurm -u $SLURMUSER -g slurm -s /bin/bash slurm
这里的组编号依个人习惯设置,但是为了保证每个计算服务器的账号统一,需要设置相同的组编号。
-
3.2. 换成阿里云镜像
-
mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
3.3. 安装epel-release
-
yum install -y epel-release
epel-release是一个软件仓库,为企业级Linux发行版(如CentOS、RHEL)提供额外的软件包。 EPEL(Extra Packages for Enterprise Linux)由Fedora社区维护,旨在为RHEL及其衍生发行版提供高质量的软件包。EPEL仓库包含了许多由社区维护的软件包,这些软件包通常不包含在官方仓库中。通过安装epel-release,用户可以访问到许多常用的开源软件和工具,扩展操作系统的功能和应用领域。这些软件包经过严格的审查和测试,确保其质量和稳定性。安装epel-release后,用户可以使用yum或dnf命令来安装和更新这些额外的软件包。这解决了官方仓库中软件包不足的问题,特别是对于那些在默认源中找不到的软件包。
3.4. 配置防火墙
-
为了允许其他设备通过网络访问你的 NTP 时间服务器,你需要在防火墙中打开 UDP 端口 123:
sudo firewall-cmd --permanent --add-service=ntp sudo firewall-cmd --reload
或关闭防火墙
systemctl stop firewalld systemctl status firewalld systemctl disable firewalld
3.5. 设置时间同步
- 配置CST时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
- 同步NTP服务器(以centos 7.6为例)
yum install ntp -y
3.5.1. 服务器端
1)编辑 NTP 的配置文件 /etc/ntp.conf 来设置你的 NTP 服务器
vim /etc/ntp.conf
- 确保时间服务器能够从其他可靠的 NTP 服务器获取时间,这样可以提高时间的准确度:
server pool.ntp.org iburst
(注意:这行保留了与外部 NTP 服务器的同步)
- 设置本地时钟为首选时间源:
server 127.127.1.0 prefer
fudge 127.127.1.0 stratum 10
- 如果你希望其他客户端能够通过广播方式从时间服务器获取时间,可以开启广播功能:
broadcast 12.12.12.255
broadcastclient
- 限制其他主机对时间服务器的操作权限,同时允许特定子网内的主机进行时间同步:
restrict default nomodify notrap nopeer noquery
restrict 12.12.12.0 mask 255.255.255.0 nomodify notrap
- 存储日志
driftfile /var/lib/ntp/drift
logfile /var/log/ntp.log
- 即 /etc/ntp.conf内容为(其中允许12.12.12.*其他服务器查询和同步时间):
server pool.ntp.org iburst
server 127.127.1.0 prefer
fudge 127.127.1.0 stratum 10
broadcast 12.12.12.255
broadcastclient
restrict default nomodify notrap nopeer noquery
restrict 12.12.12.0 mask 255.255.255.0 nomodify notrap
driftfile /var/lib/ntp/drift
logfile /var/log/ntp.log
2)启动 NTP 服务并设置开机启动
systemctl start ntpd
systemctl enable ntpd
systemctl status ntpd
3.5.2. 客户端
- 客户端设置
在每台需要与时间服务器同步时间的客户端上安装 NTP 客户端:
yum install ntp -y
编辑客户端的 NTP 配置文件 /etc/ntp.conf,添加指向时间服务器的记录:
vim /etc/ntp.conf
在配置文件中添加以下行(其中12.12.12.240为NTP服务端):
server 12.12.12.240 iburst
- 启动 NTP 客户端服务
重启 NTP 客户端服务以应用更改:
systemctl restart ntpd
systemctl enable ntpd
systemctl status ntpd
- 检查同步情况
在每个客户端上运行以下命令来确认是否成功同步:
ntpq -p
这将显示客户端与时间服务器的同步信息:
remote 列显示的是时间服务器的 IP 地址或主机名,
refid 列显示为 LOCAL 或者时间服务器所同步的上级 NTP 服务器的地址。
整体操作:
systemctl restart ntpd
systemctl enable ntpd
systemctl status ntpd
ntpq -p
3.6. 安装数据库
这里选择Mariadb
3.6.1. 服务端
3.6.1.1. 安装服务
yum install -y mariadb mariadb-server MySQL-python
yum install -y mysql-devel
3.6.1.2. 重启服务设置密码
systemctl restart mariadb
systemctl enable mariadb.service
systemctl stop mariadb
mysql_install_db --datadir="/var/lib/mysql" --user="mysql"
systemctl start mariadb.service
mysql_secure_installation
设置root密码 ...... (这里设置您的root密码)
3.6.1.3. 修改配置
- 停止服务
systemctl stop mariadb
- 修改配置
修改配置文件/etc/my.cnf,添加innodb_buffer_pool_size和innodb_lock_wait_timeout的大小
[mysqld]
innodb_buffer_pool_size=4096M
innodb_log_file_size=64M
innodb_lock_wait_timeout=900
max_allowed_packet=16M
- 移除日志
移除日志文件:
cd /var/lib/mysql/
rm -rf ib_logfile*
rm -rf aria_log*
- 重启服务
重启服务,并进入数据库中查看innodb_buffer_pool_size参数。
systemctl start mariadb.service
systemctl status mariadb.service
mysql -uroot -p
MariaDB[(none)]> show variables like 'innodb_buffer_pool_size';
显示:1073741824
这里设置innodb_buffer_pool_size和innodb_lock_wait_timeout的目的,是为了避免slurmdbd出现的错误:
error: Database settings not recommended values: innodb_buffer_pool_size innodb_log_file_size innodb_lock_wait_timeout max_allowed_packet
3.6.2. 计算节点
yum install -y mariadb MySQL-python
截至目前数据库安装成功。
3.7. 计算设备
这里根据计算资源情况,这里可以忽略,(主要对后期的虚拟化集群的建设有意义)
加速卡类型 | 查看插在服务器中加速卡的的PCI标识号 | 系统管理工具 |
英伟达 | lspci -nnD | grep -i nvidia | grep VGA | nvidia-smi |
海光 | 区分不同型号: lspci -nnD | grep -i disp lspci -nnD | grep -i dcu |
rocm-smi |
华为 | lspci -nnD | grep -i accelerators | npu-smi info |
百度昆仑 | lspci -nnD | grep -i accelerators | xpu_smi |
寒武纪 | lspci -nnD | grep -i accelerators | cnmon |
... |
4. LDAP统一用户认证
轻型目录访问协议(LDAP ,Lightweight Directory Access Protocol )是一个开放的,中立的工业标准的应用协议,通过IP协议提供访问控制和维护分布式信息的目录信息。它的常用用