从零开始配集群

在去年十月闯祸(这又是一个故事)之后,我们把自己的几台机器从超算搬到了校园网环境下,用 JumpServer 配了跳板机,并重新配置了集群的系统环境。然而一年过去,大家关于集群搭建有了新的想法和技巧。正好招了新队员进队,接下来记录一些和新队员一起重新配集群环境的过程。

系统选择:Debian11

长期以来,超算队都使用 CentOS7 作为主要的技术栈,可以和超算中心的大部分集群共享类似的使用环境。作为 RHEL 的马甲,CentOS 有相近的稳定性,并且可以白嫖来自 Red Hat 的补丁。然而长期使用 CentOS 后也积累了很多不便:

  • CentOS 7(发布于 2009 年)自带源的软件包过少。
    • 引入了三方源之后的 CentOS 还能被称作稳定吗?
  • CentOS 7 自带源中的很多软件版本过低。
    • 例如,默认的 gcc@4.8.5 已经不能满足 cuda@11: 对 gcc@6: 的要求了。
  • 作为 CentOS 7 的继任者,CentOS 8 将在 2021-12-31 之后停止维护
    • CentOS 7 反而会支持到 2024-06-30。
  • 作为代替的 CentOS Stream 8 也只支持到 2024-05-31,并且从 RHEL 的下游转移到了 RHEL 的上游。
    • 一个不再那么稳定的 CentOS,还会有我们之前选择它的优势吗?

这使得我们将目光投向其它系统。最终选择 Debian11 作为接下来几年大家公用的系统环境,因为如下的优点:

  • 足够新。
    • 发布在本文时间线的不到一个月之前(2021-08-14),并将持续支持至 2026 年。
    • 使用 Linux 5.10 LTS 作为内核。
    • Debian11 是第一个提供支持 exFAT 文件系统的 Linux 内核的发行版本,且它默认使用该实现挂载 exFAT 文件系统。
  • 足够强。
    • Debian 使用 apt 包管理器,软件足够多,支持多版本安装,并且可以用于安装驱动。
    • CentOS 的 rpm 安装包可以转换为 deb 安装包。
  • 足够快。
    • 最小化安装的 Debian 系统占用小,优于常见 Linux 发行版。
    • Debian 是为数不多的能在轻量应用服务器上流畅运行的系统。
  • 足够轻。
    • Debian11 的联网安装包仅有约 377MB,优于常见 Linux 发行版。
  • 足够稳。
    • Debian stable 同样具有高稳定性,Google、Bytedance 等企业内部均使用 Debian。

环境配置

施工中

当前计划是,除驱动和 spack 的依赖使用 apt 安装,所有的软件使用非管理员账户 scc 通过 spack 或源码安装,并提供 module 等环境管理系统,从而保证整个系统环境的整洁。

给包管理器加上 non-free 软件源(为了 nvidia-driver)。

sudo rm /etc/apt/sources.list.d/debian.extend.list
echo 'deb http://deb.debian.org/debian bullseye contrib non-free' | sudo tee -a /etc/apt/sources.list.d/debian.extend.list
echo 'deb http://deb.debian.org/debian bullseye-updates contrib non-free' | sudo tee -a /etc/apt/sources.list.d/debian.extend.list
echo 'deb http://security.debian.org/debian-security bullseye-security contrib non-free' | sudo tee -a /etc/apt/sources.list.d/debian.extend.list
echo 'deb http://ftp.debian.org/debian bullseye-backports contrib non-free' | sudo tee -a /etc/apt/sources.list.d/debian.extend.list
sudo apt update -y
sudo apt upgrade -y

sudo apt install -y docker.io

# 显卡驱动,通过apt安装
sudo apt install -y nvidia-driver

# spack 依赖
# 使用 gcc-9 作为系统编译器,减少与spack的冲突
# python3-dev 包含 python 头文件,以便源码构建 clingo 依赖
sudo apt install -y \
    gcc-9 g++-9 \
    make patch patchelf bash \
    tar gzip unzip bzip2 xz-utils \
    file gnupg2 git curl \
    python3 python3-dev python3-distutils

spack 配置

SYSUSCC_OPT_ROOT=/mnt/data/public
default_complier=gcc@8.5.0

if [[ ! -d "${SYSUSCC_OPT_ROOT}/spack" ]]; then

    cd ${SYSUSCC_OPT_ROOT}

    git clone -c feature.manyFiles=true https://github.com/spack/spack.git spack

    (cd spack && git checkout v0.17.0)

    source ${SYSUSCC_OPT_ROOT}/spack/share/spack/setup-env.sh

    # 将一些 cache 目录调整到 spack 自己的目录下,而非 home 目录下
    # 一些用户的 home 目录在系统盘上,而 spack 在数据盘上,可节省空间
    # 同时不同的用户的目录尽量独立开,减少权限问题

    mkdir -p ${SYSUSCC_OPT_ROOT}/spack/var/spack/cache/_misc-cache
    chmod 777 ${SYSUSCC_OPT_ROOT}/spack/var/spack/cache/_misc-cache
    spack config --scope=site add "config:misc_cache:\$spack/var/spack/cache/_misc-cache/\$user"

    mkdir -p ${SYSUSCC_OPT_ROOT}/spack/var/spack/cache/_test-stage
    chmod 777 ${SYSUSCC_OPT_ROOT}/spack/var/spack/cache/_test-stage
    spack config --scope=site add "config:test_stage:\$spack/var/spack/cache/_test-stage/\$user"

    mkdir -p ${SYSUSCC_OPT_ROOT}/spack/var/spack/cache/_build-stage
    chmod 777 ${SYSUSCC_OPT_ROOT}/spack/var/spack/cache/_build-stage
    spack config --scope=site add "config:build_stage:[\$tempdir/\$user/spack-stage,\$spack/var/spack/cache/_build-stage/\$user]"

    git clone https://github.com/SYSU-SCC/sysu-scc-spack-repo
    spack repo add --scope=site sysu-scc-spack-repo

    spack compiler add --scope=site

    spack install ${default_complier} && spack gc -y

    spack compiler add --scope=site $(spack location -i ${default_complier})

    spack config --scope=site add "packages:all:compiler:[${default_complier}]"
fi
alias sccenv='source /mnt/sdb1/public/admin/softwares-all-in-one/env.sh'

另一台机器

挂载数据盘并设置开机启动

mkdir -p /mnt/sdb1
mount /dev/sdb1 /mnt/sdb1
echo '/dev/sdb1 /mnt/sdb1 ext4 defaults 0 2' | sudo tee -a /etc/fstab

新用户加组

echo 'ADD_EXTRA_GROUPS=1' | sudo tee -a /etc/adduser.conf
echo 'EXTRA_GROUPS=docker' | sudo tee -a /etc/adduser.conf
echo 'EXTRA_GROUPS=video' | sudo tee -a /etc/adduser.conf # for rocm
echo 'EXTRA_GROUPS=render' | sudo tee -a /etc/adduser.conf # for rocm

创建特权账户

adduser

创建一个账户,用于创建各自的账号。

adduser adduser
# 把下面内容加到最后
# adduser ALL=(ALL) /usr/sbin/adduser
visudo

yum

创建一个账号用于 yum。

adduser yum
# 把下面内容加到最后
# yum ALL=(ALL) /usr/bin/yum
visudo

安装必要软件

amdgpu 驱动

yum install kernel-headers-`uname -r` kernel-devel-`uname -r`
yum install wget
yum install epel-release
yum install centos-release-scl #Only for CentOS 7.9
yum install devtoolset-7
source scl_source enable devtoolset-7
echo '[amdgpu]
name=amdgpu
baseurl=https://repo.radeon.com/amdgpu/latest/rhel/7.9/main/x86_64
enabled=1
gpgcheck=1
gpgkey=https://repo.radeon.com/rocm/rocm.gpg.key' | sudo tee /etc/yum.repos.d/amdgpu.repo
yum clean all
yum install amdgpu-dkms
reboot

docker

yum -y install docker-io

spack 依赖

yum install \
    gcc gcc-c++ python3 \
    make patch patchelf bash \
    tar gzip unzip bzip2 xz \
    file gnupg2 git curl \