奇技淫巧 CSF3 Computation Cluster使用指南

白嫖一时爽, 一直白嫖一直爽

Posted by R1NG on June 4, 2023 Viewed Times

奇技淫巧 CSF3 Computation Cluster使用指南

随着深度学习的发展, 在曼彻斯特大学越来越多的计算机系大三年级本科生选择与机器学习/人工智能/大语言模型/计算机视觉相关的毕业设计项目, 但是训练一个深度学习模型需要大量的计算资源, 绝大多数学生的计算机无法满足这一需求. 为了解决这一问题, 曼大计算机系为这些学生特批了使用CSF3 Computation Cluster的权限, 本文将介绍CSF3的申请流程和基本使用方法, 以及一些提升使用体验的奇技淫巧.

什么是CSF3?

根据曼大计算机系CSF3主页, CSF是曼彻斯特大学的高性能计算 (HPC )集群, 具有约8644个处理器核心和100个GPU (nVIDIA V100nVIDIA A100), 原则上仅供博士, 硕士研究生等研究人员使用, 但大三年级本科生可以申请用于毕业设计项目的计算资源.

需要注意, 大三本科生可申请的 GPU 仅限于 nVIDIA V100, 且每个学生默认只能申请一块 GPU. 但是, 在申请时可以说明自己项目的特殊性, 从而获取到更多的计算资源.

申请CSF3使用权限

大约在10月末时, Paul会在某一篇 Monday Mail 中很隐晦的地方提及CSF3开放申请的通知, 如下图所示:

20230604230718

随后, 点击链接即可被重定位到该网页:

20230604230850

向邮箱地址 its-ri-team@manchester.ac.uk 发送申请邮件有机会获得CSF3计算资源. 若需要多块 GPU, 个人建议在邮件中附上自己的 Research Proposal, 以说明额外的计算资源的必要性. 一般在几个工作日内就会收到确认邮件:

20230604231236

访问CSF3

在申请通过后, 我们即可通过 SSH 访问 CSF3.

在校内使用 SSH 访问

在校内可以直接通过

1
ssh <username>@csf3.itservices.manchester.ac.uk

访问 CSF3. 为方便使用, macOS 用户可使用 Termius. 注意, 曼大的学生邮箱可通过 Github 的学生白嫖包激活 Termius 的学生账户, 从而获得 Termius 的高级功能.

在校外使用 SSH 访问

在校外环境中, 访问 CSF3 存在两点困难. 首先需要通过 VPN 连接到曼大的内网, 其次需要使用 kilburn 作为跳板机连接到 CSF3.

配置和连接曼大VPN可参考 学校官方文档, kilburn 跳板机的连接方式如下:

1
ssh <username>@kilburn.cs.man.ac.uk 

登陆成功后终端页面如下图所示:

20230604232916

随后, 就可在跳板机上使用相同的命令连接到 CSF3.

20230604233024

使用CSF3

本科生不具有在 CSF3 上安装软件包的权限, 但是可以通过 module 加载已经安装好的软件包. 本节将介绍如何加载常用的软件包, 如 Jupyter Notebook, PyTorch, TensorFlow 等.

加载软件包

CSF3 Computation Cluster中预装了大量的软件包, 但必须使用 module 命令加载才能使用. 我们可以在 这里 获取CSF3运行环境中预装的所有软件包列表. 下面介绍数个常用的软件包的加载方法.

Jupyter Notebook

根据个人使用经验, 建议加载 2019.03 版本的 Jupyter Notebook:

1
module load apps/binapps/jupyter-notebook/5.7.8     # Uses anaconda3/2019.03

在当前运行环境加载软件包后, 需要启动 Jupyter Notebook 服务器. 在加载服务器时, 可选定处理器核心数, 是否分配GPU等参数. 例如, 我们可以在 CSF3 上启动一个使用 nVIDIA V100Jupyter Notebook 服务器:

1
jupyter-notebook-csf -p 8 -g 1    # runs a parallel 8-core job - on a GPU node using 1 GPU

启动 Jupyter Notebook 本质上是提交了一个 Batch Job, 该任务的命名规则为 jnotebook, 并会被自动分配一个 jobid, 数值越大说明任务排名越靠后. 该任务会在后台运行, 我们可以通过 qstat 命令查看任务运行状态:

1
2
3
4
[j43978yl@login1 [csf3] ~]$ qstat
job-ID  prior   name       user         state submit/start at     queue                          slots ja-task-ID 
-----------------------------------------------------------------------------------------------------------------
4379232 0.35174 jnotebook  j43978yl     r     06/03/2023 17:17:36 nvidiagpu.q@node815.pri.csf3.a     8        

在任务启动成功后, 将会在本地生成两个文件, 一个是 jnotebook.o<jobid> 文件, 一个是 jnotebook.e<jobid> 文件. 分别对应任务的标准输出和标准错误. 我们可以通过 cat 命令查看任务的输出. jnotebook.o<jobid> 文件中会包含如何通过建立 SSH Tunnel 访问 Jupyter Notebook 的说明, 以及 Jupyter Notebooktoken.

为了省事, 也可以参考 该方法 关闭 Jupyter Notebooktoken 验证, 从而无需token即可访问 Jupyter Notebook.

注意, 你自己机器上的 VSCode 可能会在本地运行一个映射端口号相同的 Jupyter Notebook 服务器, 从而导致无法访问 CSF3 上的 Jupyter Notebook 服务器. 若遇到输入 token 仍然无法访问的情况, 可以尝试通过退出 VSCode 等方式关闭本地的 Jupyter Notebook 服务器.

更详细的 Jupyter Notebook 的使用方法, 可参考官方文档: Jupyter Notebook

PyTorch

PyTorch 也是一个二进制软件包, 同样需要通过 module 加载:

1
2
# Python 3.7 for GPUS: (uses CUDA 10.1.168, Anaconda3 2019.07)
module load apps/binapps/pytorch/1.3.1-37-gpu

在加载 PyTorch 后, 是不能直接使用的, 需要进入交互模式或批处理模式调用 GPUPyTorch. 对这两个模式的描述见下文.

CSF3页面对 PyTorch 的详细使用文档见此处.

TensorFlow

Tensorflow 的调用方法和 PyTorch 类似, 详细的官方文档见此处.

文件处理

Linux 环境下的文件处理属于基本知识, 但考虑到受众文化水平参差不齐的可能性, 此处做简单介绍.

文件传输

我们使用 sftp 在本地和 CSF3 之间传输文件. 具体使用方法可参阅此处.

文件压缩

个人建议在 CSF3 上使用 tar 命令进行文件压缩, 具体使用方法可参阅此处.

文件解压

训练数据集, 机器学习代码仓库等大文件或复杂文件夹需要在压缩后使用 sftp 协议传输到 CSF3 上, 传输完成后需要解压. CSF3 内置了 unzip, 具体使用方法可参阅此处.

交互模式和 BatchJob (批处理)模式

为了减少对资源的消耗并提高效率, CSF3 的程序执行方式被分为交互模式和批处理模式. 一般地, 交互模式下若用户在约一小时内没有进行任何操作, 会被自动登出, 而批处理模式下用户提交的任务会在后台运行, 不会被自动终止.

在交互模式下, 用户会被重定向到一个 node 上, 该 node 会被分配给用户独享, 用户可以在该 node 上进行交互式的程序开发和调试. 在批处理模式下, 用户提交一个 Batch JobCSF3queue 中, CSF3 会在有空闲资源时自动分配资源给用户, 用户的程序会在后台运行, 用户可以通过 qstat 命令查看任务运行状态.

用户在批处理模式下无法直接进行交互式的程序开发和调试, 程序运行的输出会被重定向到 job_name.o<jobid> 文件中, 用户可以通过 cat 命令查看输出.

提交 Batch Job

下面以 PyTorch 为例, 介绍如何在 CSF3 上提交 Batch Job.

编写 Batch Job 脚本

为了将任务提交到 CSF3queue 中, 我们需要编写一个 Batch Job 脚本, 该脚本包含了任务的描述和运行命令. 以 PyTorch 为例, 我们可以编写如下的 Batch Job 脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash --login
#$ -cwd                   # Run job from directory where submitted

# If running on a GPU, add:
#$ -l v100=1

#$ -pe smp.pe 8          # Number of cores on a single compute node. GPU jobs can
                         # use up to 8 cores per GPU.

# We now recommend loading the modulefile in the jobscript
module load apps/binapps/pytorch/1.0.1-36-gpu

# $NSLOTS is automatically set to the number of cores requested on the pe line.
# Inform some of the python libraries how many cores we can use.
export OMP_NUM_THREADS=$NSLOTS

python my-gpu-script.py

随后需要使用 qsub 命令将该脚本提交到 CSF3queue 中:

1
qsub <script_name>

奇技淫巧

启用 Jupyter Notebook 中对 PyTorch 的支持

原则上, PyTorch 只能在交互模式下使用, 但我们可以通过 Jupyter Notebook 在批处理模式下使用 PyTorch. 这个 hack 是通过在分配了至少一个 GPU 核心的 Jupyter Notebook 实例中加载 PyTorch 的二进制文件实现的. 具体步骤如下:

首先在新创建的 Jupyter Notebook 中运行第一个代码块, 该代码块会检查本 Jupyter ServerPython 的路径:

1
2
import sys
sys.executable

输出形为

1
'/opt/apps/apps/binapps/<python_path>/python'

随后, 检查 Python 版本:

1
!/opt/apps/apps/binapps/<python_path>/python --version

然后选择合适的 PyTorch 版本, 并加载:

1
!/opt/apps/apps/binapps/<python_path>/python -m pip install --user torch

最后, 检查 PyTorch 是否成功加载:

1
2
import torch
torch.cuda.is_available()

然后, 就可以正常使用 PyTorch 了. 使用 Tensorflow 的方法类似, 只需对应替换软件包路径即可.

通过 SSH Tunnel 在校外访问 Jupyter Notebook

上文提到, CSF3Jupyter Notebook 服务在不做任何 hack 的情况下只能在校内访问, 但我们可以通过手动搭建从跳板机到本机的 SSH Tunnel 在校外访问 Jupyter Notebook.

假设我们已在 CSF3 上成功运行了 Jupyter Notebook, 已得知 CSF3Jupyter Notebook 的对应端口为 $8888$, 并已连接到了 kilburn 跳板机, 接下来我们需要首先在 kilburn 上启动一个 SSH Tunnel, 将 CSF3 上的 8888 端口通过 SSH Tunnel 映射到 kilburn跳板机的 8888 端口上, 然后再构建第二个 SSH Tunnel, 将 kilburn 跳板机的 8888 端口通过 SSH Tunnel 映射到本机的 8888 端口上. 具体步骤如下:

首先在 kilburn 上启动第一个 SSH Tunnel:

1
ssh -L 8888:node815:8888 <user_name>@csf3.itservices.manchester.ac.uk    

20230605000616

注: 上述命令中的 node815CSF3Jupyter Notebooknode 名称, 每次启动 Jupyter Notebook 时都会随机分配一个 node 给用户, 此处需要根据实际情况进行替换. 该命令可在 CSF3 根目录中的 jnotebook.o<jobid> 文件中找到.

随后在本机启动第二个 SSH Tunnel:

1
ssh -L 8888:127.0.0.1:8888 <user_name>@kilburn.cs.man.ac.uk

20230605000506

上述命令将 kilburn 跳板机的 8888 端口映射到本机的 8888 端口上, 此时我们就可以在本机的浏览器中访问 Jupyter Notebook 了.

20230605000555