使用 HPC 集群

数据挖掘 大数据 数据挖掘
2021-10-05 05:02:00

在我的大学里,我们有一个 HPC 计算集群。我使用集群来训练分类器等等。因此,通常,要将作业发送到集群(例如 python scikit-learn 脚本),我需要编写一个包含(以及其他)命令的 Bash 脚本,例如qsub script.py.

但是,我发现这个过程非常非常令人沮丧。通常发生的情况是我在笔记本电脑上编写了 python 脚本,然后我登录到服务器并更新了 SVN 存储库,所以我在那里得到了相同的 python 脚本。然后我编写或编辑那个 Bash 脚本,这样我就可以运行 bash 脚本了。

如您所见,这确实令人沮丧,因为对于 python 脚本的每一个小更新,我都需要执行许多步骤才能在计算集群上执行它。当然,当我必须将数据放在服务器上并使用服务器上的数据集路径时,任务会变得更加复杂。

我相信这里的很多人都在使用计算集群来完成他们的数据科学任务。我只想知道你们如何管理将作业发送到集群?

4个回答

请您的网格管理员将您的本地计算机添加为“提交主机”,然后安装 SGE(我们假设您正在使用,但您实际上并没有说),这样您就可以qsub从您的计算机上进行安装。

或者....

使用 emacs,然后您可以通过 emacs 的“tramp”ssh-connection 工具在您的 HPC 上进行编辑,并在另一个 emacs 窗口中打开一个 shell。你没有说你喜欢使用什么编辑器/操作系统。您甚至可以将 emacs 配置为将文件保存在两个位置,这样您就可以将文件保存到本地机器以运行测试,同时保存到 HPC 文件系统以进行大型作业。

有许多解决方案可以减轻将文件从本地机器复制到集群中的计算节点的负担。一种简单的方法是使用允许对集群中的机器进行多访问的接口,例如clusterssh (cssh)。它允许您通过一组终端屏幕一次向多台机器键入命令(每个屏幕都通过 ssh 连接到集群中的不同机器)。

由于您的集群似乎已经qsub建立,您的问题可能与沿机器复制数据有关(而不是简单地在每个节点中运行命令)。因此,为了解决这一点,您可以编写一个scp脚本,将内容复制到集群中的每个节点(这肯定是使用 SVN 更好地解决),或者您可以设置一个 NFS。这将允许对数据进行简单而透明的访问,并减少复制不必要数据的需要。

例如,您可以访问一个节点,将数据复制到该位置,然后通过网络通信远程使用数据。我不熟悉如何设置 NFS,但您已经可以访问它(如果您的主文件夹在您访问的机器上是相同的)。然后,可以将脚本和数据发送到一个地方,然后从其他地方访问。这类似于 SVN 方法,只是它更透明/更直接。

您使用源版本存储库的方法是一种很好的方法,它实际上允许您在集群上工作,然后将所有内容复制回来。

如果您发现自己在笔记本电脑上对 Python 脚本进行了小幅编辑,然后更新了集群上的 SVN 目录,为什么不直接在集群前端工作,进行所有需要的小幅编辑,然后在一天结束时提交那里的所有内容并在您的笔记本电脑上更新?

您所需要的只是熟悉那里的环境(操作系统、编辑器等)或安装自己的环境(我通常在我的主目录中安装最新版本的VimTmux等,并带有适当的点文件,所以我觉得家那里。)

此外,如果大小允许,您可以对数据进行版本控制,甚至可以对中间结果进行版本控制。我的存储库通常包含代码、数据(原始版本和清理后的版本)、文档和用于发布的纸张资源(乳胶)

最后,您可以编写作业提交脚本以避免手动修改脚本。qsub接受来自标准输入的脚本,也接受所有#$注释作为命令行参数。

根据您的问题的措辞,我假设您有一台本地计算机和一台远程计算机,您可以在其中更新两个文件——一个 Python 脚本和一个 Bash 脚本。两个文件都在 SVN 控制下,并且两台机器都可以访问同一个 SVN 服务器。

很抱歉,我没有针对您的网格系统的任何建议,但让我列出一些我认为对任何部署都很重要的一般要点。

保持生产更改仅限于配置更改您写道您必须“使用服务器上的数据集路径”;这对我来说听起来就像您将路径硬编码到您的 Python 脚本中一样。这不是一个好主意,正是因为您需要在将脚本移动到的每台其他机器上更改这些路径。如果您将这些更改提交回 SVN,那么在您的本地计算机上,您将拥有远程路径,并且不断地......(如果不仅有路径,还有密码怎么办?SVN 中不应该有生产密码服务器。)

因此,将路径和其他设置信息保存在.ini文件中并使用ConfigParser读取它,或者使用.json文件并使用json模块。在本地保存一份文件副本,在远程保存一份,都在同一路径下,都没有 SVN 控制,只需在 Python 脚本中保留该配置文件的路径(如果不能同时保留,则从命令行获取)同一路径下的配置)。

保持配置尽可能小任何配置都是应用程序的“移动部分”,任何系统的移动部分越少,系统就越健壮。属于配置的一个很好的指标就是每次移动代码时都必须对其进行编辑。不需要编辑的东西可以作为常量保留在代码中。

自动化您的部署您可以通过本地机器上的 Bash 脚本来完成;请注意,您可以通过ssh. 例如:

svn export yourprojectpath /tmp/exportedproject
tar czf /tmp/yourproject.tgz /tmp/exportedproject
scp /tmp/myproject.tgz youruser@remotemachine:~/dev

## Remote commands are in the right hand side, between ''
ssh youruser@remotemachine 'tar xzf ~/dev/yourproject.tgz'
ssh youruser@remotemachine 'qsub ~/dev/yourproject/script.py'

为此,您当然需要在本地和远程计算机之间设置基于公钥/私钥的无密码登录。

如果你需要的不止这些,你可以考虑使用 Python 的Fabric或者更高级的菜式