(可有可无的)引言
昨天完成了对学校集群的相关鉴权以后,大致理解了如何使用SSH登入教学集群,今天则是在此基础上进一步完成相关应用的部署,包括但不限于conda以及torch等和机器学习建模相关的软件安装,由于是第一次成功在云计算平台上尝试跑通Jupyter的工作空间,比较兴奋(赶快端上来罢),所以本篇文章仅作为开通一次任务的教程,更进一步的计算容量、机时上限、核心使用上限等细节还没有试验出来,留待进一步的NN建模时再予以验证。
队列工作模式介绍
同想象中开了个号就能随便浪不同,实际的集群使用场景下,需要对每个特定的计算任务分配合适的“核心数”、“工作时长”,也就是说在这种模式下,所有的软件配套都是围绕这一个任务进行的,你拿到的系统和可视化界面里基本是一片空白,除了你被作为一个用户账户(文件夹名是学号)设置在主机目录(hostname)下,这个文件夹之下的所有文件可以在SSH的命令行里产生,但是导入的模块在任务运行(RUNNING)及结束(ENDED)的意义下都是即设即销的。
举一个具体的例子,我们想要对一个61万行的数据训练一个LSTM模型,那么整个工作流程如下。
第一步:
开VPN,ssh连接HPC上的帐号,密码及口令鉴权;
第二步:
在终端命令窗口(连接了HPC帐号的窗口),“ module avail ”查询可拉取的科学计算模块(毕竟集群不单单用于AI方向,还有生信、工程设计啥的),一般直接进行如下操作:
# 查询集群下提供的可用conda版本 [xxx@jx2-login01 ~]$module avail conda # 在本账户环境下装载该版本的conda [xxx@jx2-login01 ~]$module load conda
之后为了确定conda安装成功可以直接运行“ conda --version ”或“ which conda ”命令查看,这里的conda默认都是anaconda而非miniconda,当然如果想换也是完全没问题的,相关的命令如下,不过本人为了省事没尝试:
# 获得最新的miniconda安装包; wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh # 安装到自己的HOME目录下software/miniconda3中,这个目录在安装前不能存在; sh Miniconda3-latest-Linux-x86_64.sh -b -p ${HOME}/software/miniconda3 # 安装成功后删除安装包 rm -f Miniconda3-latest-Linux-x86_64.sh # 将环境变量写入~/.bashrc文件中; echo "export PATH=${HOME}/software/miniconda3/bin:\$PATH" >> ~/.bashrc # 退出重新登录或者执行以下命令 source ~/.bashrc conda --version
第三步:
有了conda以后先查询虚拟环境,如果没有就创建,如果有就进去蹭蹭,具体涉及以下的一些指令:
# 常规查询conda虚拟环境 conda info -e # 创建虚拟环境,-n选项意味着“指定虚拟环境”,后接自定义的环境名 conda create -n LittleBoki
可以设置很多不同名字的虚拟环境用以隔离不同的项目,装载不同的包和库(packages),可以使用不同的python版本(尽管都是些直观且老生常谈的内容,不过之前对编程和计算机还没那么熟悉的时候理解这些概念还是费劲的,现在好很多咯吼吼~);
第四步:
进入特定的conda虚拟环境,安装需要的包,这里即可以直接命令行终端运行,也可以将相应的安装命令(bash命令)写成.sh文件形式保存到自己随便整出来的文件夹里:
# 在特定文件夹生成一个叫做“install_python_packages”的.sh文件 touch ./specific_file/install_python_packages.sh # 使用vim对该.sh的空文件进行编辑,这样就会进入vim的编辑“插入”模式 cd specific_file vim install_python_packages.sh
这种文件夹不会随着某次计算任务的结束(ENDED)而消失,其内的文件只要没销户也会一直保留,对.sh文件内容进行编辑/写则可以通过vim直接操作完成:
#!/bin/bash pip install pandas torch statsmodels tqdm matplotlib sklearn scipy
值得一提的是HPC平台预装了vim,反倒是个人主机上一般得自己“ sudo apt install vim ”,vim的一些快捷键操作方式也有跟以前的windows快捷键操作习惯想冲突的地方,比如 ctrl + s 在vim里面是“锁定”,还需要 ctrl + q 才能解锁(这对不熟悉vim的人士多少带点逆天,微软你坏事做尽!),其他一些常规的vim命令行操作暂时就只需要记忆好 “ 写完文件内容 ” + “ Esc ” + “ : ” + “wq”(保存并退出) 的组合拳就好,其他内容以后现用现学即可;
第五步:
进入文档提供的scow可视化平台,由于文档中给的是mac的使用例,linux下看见的东西不完全一样,当然也有可能是后来人对这个交互页面做了些调整,反正只需要在相关栏目“创建应用”即可,初始时可以选定一些配置(计算或图形节点选择、Qos、MaxWall、MaxJobsPU、MaxTRESPA等),之后在ssh命令行中随时可以修改设置,这一步选用“ Jupyter ”就可以了,之后如果前面的几步不出错且配置没有超过管理员那边的要求,就会分配资源(状态: QUEUED),然后大概半分钟内就会分配好资源(状态: RUNNING),接下来就可以愉快地玩耍了,如果有错或者目前有其他优先级高的任务,那么就有可能触发 QUEUED / PENDING / ENDED 幸福三选一,如果看着不顺心也能命令行取消作业(作业号需要去可视化界面的作业栏目中查);
# 取消作业ID为123的作业 scancel 123
注:“图形节点”是指在计算集群中专门用于图形处理和可视化的节点或服务器,在教学二号上是没有滴,已经通过python torch.cuda.is_available()、nvidia -smi、nvcc --version三个方式予以充分的验证(悲),鼠鼠我啊,也只能选取“计算节点”(CPU核:终端命令 nproc )来搞搞训练了捏。
第六步:
如果是正在运行(状态: RUNNING)的“ Jupyter ”应用,刷新(10s一次自动刷新)完,首先在ssh命令行终端运行如下的激活指令:
# 激活虚拟环境,这里的例子是已经创建好的“LittleBoki”环境 source activate LittleBoki # 也可以使用这个命令 conda activate LittleBoki # 顺便给个“退出虚拟环境”的命令,以前用过,现在忘差不多了 deactivate LittleBoki
直接连接就可以进到普通的Jupyter Notebook交互空间中,然后就能开始 训练模型/摆烂/搞事/消耗计算资源 了,数据能上传能下载,可谓是大大的舒服。
SSH命令行、vim、bash
成功登入集群以后,在个人的云账户中,可以使用“ mkdir xxx ”创建相应的文件夹,基本可以走以下的疗程,这和前面讲的部分内容重合:
# 随便创建一个文件夹,好放乱七八糟东西
mkdir ikunBAD
# 如果嫌名字起得不好,可以修改文件夹名,该文件夹目录下的文件(如果有的话)不会被改变
mv ikunBAD ikunBEST
# 进入这个文件夹生成一些关键的可运行文件,比如.sh或.py文件,用vim进行内容编辑
cd ikunBEST
touch ikun_test.sh
vim ...
touch ikun_test.py
vim ...
接下重点要去介绍一些关于bash,sbatch的命令,.bashrc文件以及.sh文件的一些细节知识,知识点总体来说会比较细碎,想到哪写到哪。
.bashrc文件 / source命令
参考来源:ChatGPT
source ~/.bashrc
source ~/.bashrc
是一个命令,用于在当前Shell会话中重新加载用户的.bashrc
文件。解释如下:
source
: 这是一个Shell命令,用于在当前Shell环境中执行指定的脚本文件,并将其中的命令应用于当前Shell会话。~/.bashrc
: 这是要执行的脚本文件的路径。~
表示用户的主目录,/.bashrc
表示用户主目录下的.bashrc
文件。当您运行
source ~/.bashrc
命令时,Bash会重新读取并执行.bashrc
文件中的命令,以更新当前Shell会话中的配置和设置。这样,您可以在不关闭终端的情况下立即应用对.bashrc
文件所做的更改,而无需重新登录系统。常见的更改
.bashrc
文件后需要运行source ~/.bashrc
的情况包括添加新的别名、环境变量、函数定义或自定义命令等。通过运行该命令,您可以使更改生效并立即在当前Shell会话中使用。
首先在命令行也有查看隐藏文件的方法,等效于Ubuntu图形界面的 ctrl + h ,命令行使用“ ls -a ”即可;另外,使用vim进入本机(不是HPC的虚拟机)的.bashrc中进行读写的效果如下:
可谓是花花绿绿,好不热闹,但是重点在于对“.bashrc”文件和“source”命令的介绍。
参考来源:ChatGPT
.bashrc
是一个针对Bash(Bourne Again SHell)的配置文件,它位于用户的主目录下(通常是/home/username/.bashrc
)。它是一个用于存储用户自定义的Bash配置和设置的文件。
.bashrc
文件的作用如下:
- 环境变量设置:通过在
.bashrc
文件中定义PATH
、LD_LIBRARY_PATH
等环境变量,可以指定系统在执行命令时搜索可执行文件和共享库的路径。- 别名和函数定义:可以在
.bashrc
文件中创建自定义别名(例如,将alias ll='ls -alF'
定义为ll
的别名)和函数,以简化命令的输入和操作。- 提示符设置:通过修改
PS1
环境变量的值,可以自定义终端提示符的外观和内容。- 自定义命令和行为:可以在
.bashrc
文件中添加自定义的Shell命令和行为,例如设置终端启动时执行的命令、定义Shell函数和脚本等。- 导入其他配置文件:在
.bashrc
文件中可以使用source
命令或.
命令来导入其他的配置文件,以进一步定制和扩展Bash的功能。每当用户打开一个新的终端窗口或登录到系统时,Bash会自动读取并执行用户的
.bashrc
文件,以应用其中的配置和设置。这样,用户可以通过编辑.bashrc
文件来个性化和定制他们的Shell环境。
source
命令:会读取指定的脚本文件,并在当前Shell环境中执行其中的命令,这意味着脚本中的变量、函数、别名和环境变量等都将在当前Shell中生效;使用source
命令的一种常见用途是加载或激活虚拟环境,在某些虚拟环境中,为了在当前Shell中正确设置相关的环境变量和路径,需要运行相应的脚本(例如Anaconda虚拟环境)。
然后介绍一下这个命令,涉及环境变量编辑的:
# 将环境变量写入~/.bashrc文件中;
echo "export PATH=${HOME}/software/miniconda3/bin:\$PATH" >> ~/.bashrc
参考来源:ChatGPT
这个命令是将一条指令附加到用户的
.bashrc
文件中。解释如下:
echo
: 这是一个用于在终端输出内容的命令,效果如下:
"export PATH=${HOME}/software/miniconda3/bin:\$PATH"
: 这是要输出的内容。它是一个环境变量设置的命令,用于将${HOME}/software/miniconda3/bin
目录添加到当前用户的PATH
环境变量中。${HOME}
表示用户的主目录;$PATH
表示当前PATH
环境变量的值;>>~/.bashrc
: 这是将输出内容追加到用户的.bashrc
文件的命令。>>
符号表示追加操作,~/.bashrc
表示用户主目录下的.bashrc
文件。综合起来,这个命令的作用是将一条设置环境变量的命令追加到用户的
.bashrc
文件中。这样,每次用户登录时,该环境变量设置命令都会被执行,将${HOME}/software/miniconda3/bin
目录添加到PATH
环境变量中,以便可以在终端中直接运行Miniconda安装的命令和程序。
.sh文件 / sbatch命令
SBATCH(Slurm Batch)是一个用于在高性能计算(HPC)集群上提交和管理作业的作业调度系统。它提供了一种标准化的方法来提交作业、分配计算资源、管理任务并监控作业的执行,SBATCH系统的主要目的是管理集群中的计算资源,以确保作业在可用资源上高效地运行。
登录后,编写作业脚本,并通过sbatch命令将作业提交到“计算节点”上执行。假设我们的计算过程为:在计算节点上运行hostname
指令,那么就可以这么编写作业脚本:
#!/bin/bash
#SBATCH -o job.%j.out
#SBATCH --partition=C032M0128G
#SBATCH -J myFirstJob
#SBATCH --nodes=1
#SBATCH --ntasks-per-node=1hostname
假设上面作业脚本的文件名为job.sh,通过在终端以此命令提交:“ sbatch job.sh ”。在该“.sh”文件的注释行“!/bin/bash
”方面有一个细节需要予以阐释,具体内容如下,不过在.bashrc文件中就用不着这个注释了,毕竟在优先级上可以认为是.bashrc文件定义了shell命令的行为。
参考文章:「关于#!/bin/bash-CSDN博客」
#!/bin/bash 是一个比较特殊的注释行,根据ChatGPT老师的回答,即便写入这个注释的文件被放置在了~/bin以外的路径中,这一行还是得写上,因为它的作用在于“确保脚本能够在bash解释器下执行”,因此无论脚本文件(i.e. “.sh”文件)是储存在新路径下还是默认路径中,该注释行都是必须的,且需要放在第一行的位置上。
大前天做完latex简历模板,结果前天文件系统突然无法打开,着实吓到了,以为硬件、磁盘啥的出问题了,后来发现cd还是能进文件夹,命令行运行文件也没问题,排查过后发现是nautilus自己的问题,换Thanos(图标帅啊)搞定,不由感叹“操统真神奇~”
成文的今天,基本上可以在几个平台上(LCPU/openbayes/PKUHPC)创建能用的Jupyter工作站环境了,心情变得放松了不少,虽然目前暑期的下家还没着落,但是沉浸在新技术和(promising)算力海洋中的快乐也基本让我忘记了还得焦虑一下这个事儿(捂脸)。
苹果在北京时间6月6日发布的新产品 Vision Pro 效果实在惊艳,它的生态现在有点吸引我了,未来如何值得期待,也希望我能早点对那个领域进行探索,游戏和娱乐的新范式也许就藏身其间...至于目前这不上不下的日子,先凑合过着吧hhh