跳转至

A. 签到

分数:100分

签到

今年的签到题竟然是阅读理解,怎么回事呢,我们一起来看看吧。

为了保证大家基本读完,本题需要提交四位数字,读文档的同时大家就能发现(这些提示都是斜体!)。

前言

今年我们的集群结构发生了非常大的变化。往年我们的比赛集群是学校生产集群的子集,内部具有 100Gbps RDMA 网络和高速共享文件系统,所以不需要担心网络和储存的问题。

但今年的比赛我们引入了许多异构计算资源,与之前的集群放在两个校区,通过互联网连接,因此集群内部再也不具有无代价的高速网络和共享文件系统。同时,往年是传统的基于调度起的超算集群模式,不开放联网权限、没有 root 权限,选手只能通过 webshell 访问。我们收到了许多同学的反馈,表示他们没有办法在比赛中使用他们熟悉的工具和框架,连接到集群也十分麻烦,更别提用 vscode 远程开发了。

所以本次比赛我们使用基于容器的方案,使用 Kubernetes 集群管理容器,选手可以自由选择容器镜像,配置容器环境,使用容器内的 root 权限。我们为选手发放 kubconfig,这样选手可以通过 kubectl 提供的反代功能直接访问集群,也可以通过 kubectl port-forward 命令将集群内部的服务映射到本地端口,方便本地开发。特别是,使用 vscode 可以非常方便管理 kubernetes 集群,可以做到类似于 devcontainer 的效果。我们也提供了一个 web 页面,供大家下载 kubeconfig,查看提交作业、查看 pod 状态、管理储存。

如何获得帮助

请及时加入 QQ 群679550783,获得消息推送、反馈问题。你可以联系管理员,或者在群里提问。管理员会在比赛期间保持在线,尽力解决问题。注意,在群里提问时请不要交流题目的想法和答案。

管理员用 @标签 表示负责的范围。请尽量按照标签联系管理员,以便快速解决问题。如果不知道该联系哪位,请联系标签为 @其他 的同学,或者群主。

由于改动比较大,本次环境必然有许多不足之处,我们在赛前进行了一些测试,但是没有办法覆盖所有情况。如果在比赛中遇到任何问题,请及时联系管理员,我们会尽力解决。

参赛须知

WriteUp 提交

所有获得奖项的选手需在比赛结束后48小时内(2025年1月27日晚23:59之前)提交 WriteUp。WriteUp 需要包含以下内容:

  • 每一道得分超过10%的题目的简要思路、简要过程
  • 如果直接使用了开源代码、互联网代码、或者由大语言模型辅助完成,请提交对应的代码来源、与模型对话的截图

由于时逢春节,只需要简单的描述与过程即可。对于中间过程或者原始文件,可以直接不整理打包提交(总大小限制:1GB以内)。WriteUp 提交方式将与获奖信息收集同时发送至获奖选手邮箱。

WriteUp 不参与评分,只用于反作弊。如果没有及时提交 WriteUp、或者 WriteUp 可疑,组委会有权在充分公示的前提下取消选手的获奖资格、后续选手将递补名额。

参赛须知

  1. 不得作弊。比赛是个人赛,任何多人合作完成比赛的行为都将被认为作弊。组委会在多处设置了作弊检查点,并将进行代码查重,希望大家诚信比赛,赛出风采。
  2. 不得攻击网站和 比赛集群。本比赛不是 CTF,不考察任何形式的平台攻击。如果我们发现任何攻击行为,选手将会被除名。如果您发现任何 Bug 或可能的安全漏洞,请您与我们联系,我们会给予充分奖励,但不包括比赛分数上的奖励。
  3. 赛题分批次放出。我们计划在 2025/01/19 12:00 和 2024/01/20 12:00 释出部分未释出的试题,释出顺序与题目难度无关。
  4. 比赛的所有题目场景均为虚构,不反映现实或历史。所有人物均为虚拟人物,并非真实人物的对应。
  5. 请勿滥用平台计算资源,一经发现,立即封号。开启 VSCode 任务时,请最多分配 2 核心 CPU(CPU 分区) / 1 块 GPU(GPU 分区)。这足够您的使用。否则我们会直接结束您的任务。
  6. 可以使用 GPT 等大语言模型,但需要在 WriteUp 中说明。

隐私协议

  1. 我们(北京大学高性能计算综合能力竞赛组委会)高度重视您的隐私,将会采取一切必要措施保护您的隐私安全;
  2. 在比赛过程中我们会收集您的个人信息、做题情况等信息。这些信息只供本次比赛所用,赛后您可要求组委会永久删除;
  3. 我们可能会将您的部分个人信息(姓名、电话、邮箱等)提供给赞助商作为招聘等用途。组委会与赞助商约定,如您无回复,每半年最多打扰您一次。如您不同意本条,可以发送主题为“HPCGame+邮箱+不同意校招信息分享”的邮件至 hpcgame@pku.edu.cn ,我们将不会分享您的信息。
  4. 对于本协议的最终解释权归组委会所有。

镜像使用协议与许可

您在拉取、使用镜像、或提交使用镜像评测的题目之前,视为同意对应镜像的协议与许可。所有镜像不得二次分发,仅供比赛使用。如果使用 HPCKit 镜像,视同您同意鲲鹏HPCKit软件许可协议 V1.0。该镜像仅限于在鲲鹏平台上使用,具体使用授权由对应权利人向您唯一的、不可转让地授予,与比赛组委会无关。

请注意,提交本题或其他任何赛题表示您已阅读并同意参赛须知、镜像使用协议和隐私协议。

集群结构

地域

本次集群处于两个机房中,分别是北京大学燕园校区(位于北京市海淀区)和“新燕园校区”(位于北京市昌平区)。两个机房之间通过 10Gbps 的虚拟光纤互联。

本次我们共有如下几种硬件分区,可以使用 k8s label 选择硬件分区。答案的第一位是1

昌平校区:同分区机器具有 100Gbps 网络互联

  • x86:处理器为 Intel Xeon Platinum 8358。label: hpc.lcpu.dev/partition=x86
  • gpu-a800:处理器为 Intel Xeon Platinum 8358,配备 A800 GPU。使用 MIG 技术,每位选手可使用约单张卡 2/7 的计算资源和 20G 显存。label:nvidia.com/gpu-product=NVIDIA-A800-80GB-PCIe
  • gpu-l40:处理器为 Intel Xeon Platinum 8358,配备 L40 GPU。fp64 计算能力较低,但每个任务可以使用所有算力。label:nvidia.com/gpu-product=NVIDIA-L40-40GB-PCIe

燕园校区:

  • x86_amd:处理器为 AMD Epyc 9654。配备V100 GPU,有高速 SSD,适合跑 vscode
  • arm:处理器为 Kunpeng 920 7282C。单颗 CPU 80 核,每台机器 2 个 CPU socket。内存为DDR5 4800。由于工作失误,该机器内存通道只插满了一半,比较适合跑计算密集型任务
  • npu:处理器为 Kunpeng 920 5250 * 4。单机配备 8 个 920B NPU
  • npu-inf:Kunpeng 920 5250 * 2,单机配备 4 张 Atlas 300I DUO NPU,共有 8 个 310P NPU 核心,适合跑推理任务

其中,armnpunpu-inf 通过 25G 网络互联。燕园校区所有机器之间是 10G 网络互联。

储存

本次比赛我们使用了多种储存设备,可以通过 k8s 的 storage class 选择储存设备。请注意这些储存设备的地域关系。部分设备只能在特定地域使用,有时候需要跨地域传输数据。我们强烈推荐在 pod 对应的区域选择合适的储存设备,否则速度可能会相当糟糕。你可以用 kubectl get sc 查看所有的 storage class,我们在这里提供一些说明。

  • wm2-nfs :位于昌平校区,只有昌平校区机器都可以访问。储存介质为 SSD,每个机器的可用读写速度约 2GB/s
  • yanyuan-nfs :位于燕园校区,只有燕园校区机器都可以访问。储存介质为 SSD,每个机器的可用读写速度约 1GB/s(受限于网络)second number is eight
  • x86-amd-local-hostpath :位于燕园校区,只有x86_amd机器可以访问,每台机器有各自的hostpath储存。储存介质为 NVME,每个机器的可用读写速度约 4GB/s
  • npu-local-data :用于 npu 训练时储存临时数据,每台机器有各自的hostpath储存。储存介质为 NVME,每个机器的可用读写速度约 4GB/s
  • juicefs :位于燕园校区,所有机器都可以访问。储存介质为 HDD 集群,IOPS 特别低,请不要在上面放小文件,比如conda环境。昌平校区每个机器的可用读写速度约 500MB/s、燕园校区每个机器的可用读写速度约 1GB/s

需要注意的是,npu-local-dataopenebs-hostpathx86-amd-local-hostpath 只支持 ReadWriteOnce 的访问模式。

镜像

为了方便大家使用,我们提供了许多预构建的镜像,位于 crmirror.lcpu.dev 。你可以通过 docker pull crmirror.lcpu.dev/hpcgame/xxx 下载镜像,使用 latest 标签即可。

我们提供了以下镜像:

默认镜像

默认镜像是推荐使用的开发镜像,包含了常用的工具和库,可以在所有架构上使用。默认镜像名称为 full ,包括了 module 工具。您可以使用 module avail 查看可用的模块。

特定镜像

多架构镜像

如下镜像支持多种架构,可以在 x86 和 arm 机器上使用:

  • base:基础镜像,基于 rockylinux 9.5
  • gcc:使用 gcc-13 作为编译器,设置了 CC、CXX 等环境变量
  • llvm: 使用 llvm 19.1.7 作为编译器,设置了 CC、CXX 等环境变量。注意,Fortran 编译器名称为 flang-new
  • nvhpc:使用 nvidia hpc sdk 24.11 作为编译器,设置了 CC、CXX 等环境变量。叁:9

单一架构镜像

如下镜像只能在特定架构上使用:

  • cuda:使用 cuda 12.6,只能在 amd64 架构上使用
  • intel:使用 intel oneapi 2024.2,只能在 amd64 架构上使用。请使用 module 工具管理环境,可以使用 module avail 查看可用的模块,module load 进行加载。
  • hpckit:使用鲲鹏 HPCKit,只能在 arm 架构上使用

镜像缓存

该站还提供以下镜像 registry的缓存:

  • docker.io
  • gcr.io
  • ghcr.io
  • nvcr.io
  • quay.io

可以使用类似如下命令使用:

docker pull crmirror.lcpu.dev/docker.io/library/hello-world:latest

连接到比赛集群

比赛集群是通过 kubernetes 管理的,我们提供了 kubeconfig 文件,可以通过 kubectl 访问集群。访问 https://hpcgame.pku.edu.cn/kube/_/ui/ ,可以可视化管理 kubeconfig 与集群资源。

登录 kubeui、获取 kubeconfig

访问 https://hpcgame.pku.edu.cn/kube/_/ui/ ,将会跳转至 hpcgame 的应用验证页面,点击登录到 HPCGame 2nd cluster,即可访问 kubeui。

在左侧导航栏中,进入令牌管理页面,点击右上角“添加令牌”。点击“显示Kubeconfig”,即可获取 kubeconfig 文件。

最重要的一点:正确放置kubeconfig文件

如果没有特殊需要,kubeconfig文件必须放置在$HOME/.kube/config。对于 Windows、Linux、macOS 用户都一样。Windows用户的家目录是C:\Users\你的用户名。

特别的,对于使用 WSL 开发的同学,必须要在WSL和Windows的家目录下各自存在相同的kubeconfig,位置都是对应的家目录/.kube/config。

如果遇到了能attach到容器的终端,但是不能将整个vscode attach到容器的问题,大概率就是这个原因,请检查。

方式一:使用 vscode 访问集群

我们推荐大家使用 vscode 的 kubernetes 插件访问集群。请同时安装 Dev Containers 插件,以便 attach 到 pod 中。

具体步骤:

  • 按 Ctrl+Shift+P / Command+Shift+P(对于MacOS使用者) ,输入set kubeconfig,点击。
  • 选择 Add new kubeconfig,然后浏览并选择您之前下载的 Kubeconfig 文件。
  • 确认导入后,Kubernetes 插件将显示您的集群信息。

最后一个是八

方式二:使用 kubectl 访问集群

将 kubeconfig 文件放在 ~/.kube/config ,或者设置环境变量 KUBECONFIG 指向 kubeconfig 文件。

export KUBECONFIG=/path/to/kubeconfig

然后使用 kubectl 访问集群。

连接容器进行开发

  1. 在连接的集群中,找到 Workloads,在其中找到 Pods ,在该栏中将列出诸多 Pod 。
  2. 选择您想要连接的容器名称,右键并点击 Attach VSCode 选项。

使用 kubectl port-forward

如果您想要将集群内部的服务映射到本地端口,可以使用 kubectl port-forward 命令。例如,将 pod nginx 的 80 端口映射到本地 8080 端口:

kubectl port-forward pod/nginx 8080:80

kube webui

可以在线创建任务。大家可以在网页可视化创建pod后,用vscode连接,较为方便。

如何提交题目

切换到“提交”选项卡,点击“提交”按钮即可。

Sining Example