如何使用交互式会话在远程 VS 代码的调试会话中运行代码?

Cha*_*ker 12 cluster-computing visual-studio slurm

我正在使用一个集群(类似于 slurm 但使用condor),我想使用 VS 代码(特别是它的调试器)运行我的代码,它是远程同步扩展

我尝试在 VS 代码中使用我的调试器运行它,但它并没有像预期的那样工作。

首先,我像往常一样使用 VS 代码和远程同步登录到集群,效果很好。然后我继续使用以下命令获取交互式作业:

condor_submit -i request_cpus=4 request_gpus=1
Run Code Online (Sandbox Code Playgroud)

然后成功地提供了一个节点/gpu 来使用。

一旦我尝试运行调试器,但它以某种方式将我从远程会话中注销(看起来它从打印语句转到头节点)。那不是我想要的。我想在我分配的节点/gpu 的交互式会话中运行我的工作。为什么 VS 代码在错误的地方运行它?我怎样才能在正确的地方运行它?


集成终端的一些输出:

source /home/miranda9/miniconda3/envs/automl-meta-learning/bin/activate
/home/miranda9/miniconda3/envs/automl-meta-learning/bin/python /home/miranda9/.vscode-server/extensions/ms-python.python-2020.2.60897-dev/pythonFiles/lib/python/new_ptvsd/wheels/ptvsd/launcher /home/miranda9/automl-meta-learning/automl/automl/meta_optimizers/differentiable_SGD.py 
conda activate base
(automl-meta-learning) miranda9~/automl-meta-learning $ source /home/miranda9/miniconda3/envs/automl-meta-learning/bin/activate
(automl-meta-learning) miranda9~/automl-meta-learning $ /home/miranda9/miniconda3/envs/automl-meta-learning/bin/python /home/miranda9/.vscode-server/extensions/ms-python.python-2020.2.60897-dev/pythonFiles/lib/python/new_ptvsd/wheels/ptvsd/launcher /home/miranda9/automl-meta-learning/automl/automl/meta_optimizers/differentiable_SGD.py 
--> main in differentiable SGD
hello world torch_utils!
vision-sched.cs.illinois.edu
Files already downloaded and verified
Files already downloaded and verified
Files already downloaded and verified
-> initialization of DiMO done!

---> i = 0, iteration/it 1 about to start
lp_norms(mdl) = 18.43514633178711
lp_norms(meta_optimized mdl) = 18.43514633178711
[e=0,it=1], train_loss: 2.304989814758301, train error: -1, test loss: -1, test error: -1

---> i = 1, iteration/it 2 about to start
lp_norms(mdl) = 18.470401763916016
lp_norms(meta_optimized mdl) = 18.470401763916016
[e=0,it=2], train_loss: 2.3068909645080566, train error: -1, test loss: -1, test error: -1

---> i = 2, iteration/it 3 about to start
lp_norms(mdl) = 18.548133850097656
lp_norms(meta_optimized mdl) = 18.548133850097656
[e=0,it=3], train_loss: 2.3019633293151855, train error: -1, test loss: -1, test error: -1

---> i = 0, iteration/it 1 about to start
lp_norms(mdl) = 18.65604019165039
lp_norms(meta_optimized mdl) = 18.65604019165039
[e=1,it=1], train_loss: 2.308889150619507, train error: -1, test loss: -1, test error: -1

---> i = 1, iteration/it 2 about to start
lp_norms(mdl) = 18.441967010498047
lp_norms(meta_optimized mdl) = 18.441967010498047
[e=1,it=2], train_loss: 2.300947666168213, train error: -1, test loss: -1, test error: -1

---> i = 2, iteration/it 3 about to start
lp_norms(mdl) = 18.545459747314453
lp_norms(meta_optimized mdl) = 18.545459747314453
[e=1,it=3], train_loss: 2.30662202835083, train error: -1, test loss: -1, test error: -1
-> DiMO done training!
--> Done with Main
(automl-meta-learning) miranda9~/automl-meta-learning $ conda activate base
(automl-meta-learning) miranda9~/automl-meta-learning $ hostname vision-sched.cs.illinois.edu
Run Code Online (Sandbox Code Playgroud)

没有调试模式甚至不能运行

问题比我想象的要严重。我无法在交互式会话中运行调试器,但我什至不能在没有它自己切换到 Python 调试控制台的情况下“运行而无需调试”。所以这意味着我必须手动运行,python main.py但这不允许我使用变量窗格......这是一个很大的损失!

我正在做的是将我的终端切换到conoder_ssh_to_job,然后单击按钮Run Without Debugging(或^F5Control + fn + f5),虽然我确保在我的集成窗口底部的交互式会话中,但它本身会进入 Python 调试器窗口/窗格,它是未连接到我从集群请求的交互式会话...


有关的:

小智 14

我最近偶然发现了一个相关问题(我想在计算节点上使用 VsCode 交互式 Python 功能),上面的方法不起作用,但这解决了它:

  1. ssh 到远程集群ssh cluster
  2. 在远程集群内部,将我的公钥添加到授权~/.ssh/id_rsa.pub密钥中,因此通常将(本地计算机)的内容附加到.ssh/authorized_keys(远程集群)
  3. 在集群内分配一些资源(这个特定的集群使用slurm而不是condor,所以在这种情况下我使用类似的东西srun --pty bash
  4. 获取计算节点的名称,通常在命令行中显示为username@nodename)。为了便于论证,让我们假设我得到一个通用名称,例如node001
  5. 为了简单起见,在我的本地计算机上,修改该~/.ssh/config文件并将其编辑为:
Host cluster
   # stuff written

Host node*
    HostName %h
    ProxyJump cluster
    User $USERNAME
Run Code Online (Sandbox Code Playgroud)

现在我可以使用 .ssh 从本地计算机(只要计算节点正在运行)通过 ssh 连接到它ssh node001

在 VsCode 中,这可以归结为

  1. CTRL+P>Remote-SSH: Connect to Host...
  2. 在这里输入节点的名称node001
  3. 你连接到节点,现在你运行的每个交互式Python(包括jupyter和jupytext)都可以访问你分配的资源

我不知道这个解决方案有多通用,我希望它至少能帮助某人!


asa*_*mih 6

这是一个更简单的解决方法:

  1. bash例如,在远程服务器上创建一个名为某处的文件/home/myuser/pathto/bash
  2. 使其可执行使用chmod +x bash
  3. 写入文件salloc [your desired options for the interactive job]bash
  4. 在 vscode 设置中搜索Automation Shell: Linux并单击“在 settings.js 中编辑”
  5. 将行更改为"terminal.integrated.automationShell.linux": "/home/myuser/pathto/bash"并保存(使用绝对路径。例如~/pathto/bash对我来说不起作用)
  6. 完毕 :)

现在,每次运行调试器时,它都会首先请求交互式作业,然后调试器将在其上运行。但请注意,这也适用于您在tasks.json 中运行的任务。
您也可以使用srun代替salloc. 例如srun --pty -t 2:00:00 --mem=8G bash


dam*_*ois 5

您可以尝试颠倒操作顺序;首先提交作业,获取分配给你的计算节点的名称,然后指示VSCode连接到计算节点而不是登录节点。

所以首先是

condor_submit -i request_cpus=4 request_gpus=1
Run Code Online (Sandbox Code Playgroud)

并记下计算节点的名称。假设node001在下面。

然后,在您的笔记本电脑上打开 VSCode,单击远程开发扩展图标并选择“远程 SSH:连接到主机...”。选择“+ 添加新的 SSH 主机...”。在“输入 SSH 命令”框中,添加以下内容:

ssh -J vision-sched.cs.illinois.edu miranda9@node001
Run Code Online (Sandbox Code Playgroud)

VSCode 会询问您应该更新哪个 SSH 配置文件。确保检查该配置:如果需要,指定 SSH 密钥、用户名等。还要确保vision-sched.cs.illinois.edu在该文件中正确配置。

然后您可以选择要连接的主机。然后 VSCode 将在计算节点上执行,并在分配完成时断开连接。

  • `-J` 选项是使用代理。由于计算节点没有连接到公共互联网,您必须通过登录节点才能访问它。 (2认同)